On publishing emails
← Back to Kevin's homepagePublished: 2018 December 31Why publish emails?
It takes me forever to write articles: My pace is around 200 words/hour, so a typical article takes several days to compose and publish (not counting the time spent to explore the underlying ideas).
Somehow, I find emails much easier to write.
I don’t know if it’s the shared context of a specific correspondent, the intellectual prompting of a back-and-forth dialog, or just that it feels more casual. But whatever the reason, I find myself sitting on email threads filled with interesting, useful ideas.
While I don’t have the energy to distill all such threads into articles, the next best thing is to just publish them as-is. (With the permission of my correspondents of course!)
Other rationales
Ideas are inventory: Ideas only provide value when they’re out in the world, and on the margin publishing emails makes ideas more accessible, sooner.
Leading by example: There are people whose emails I’d love to read, and I don’t want to have to wait for them to die for their biographers to publish ‘em.
Critique framing: I’ve never published critiques, since unsolicited critique can feel abrasive (“who asked you, anyway?”). But sometimes people do ask me about someone else’s work, and that turns into a productive, idea-filled discussion.
Medium-form Twitter: Projects and articles are high-effort, long-timescale, while Twitter tends to be low-effort, transient-timescale. Publishing email threads may provide a useful middle-ground.
Technical HOWTO
I use Gmail for emails and use slim templates on this website. To publish an email thread, I:
popout the thread in its own browser tab
click the “expand all” to make every message visible
open up Chrome Devtools and paste in the following JavaScript, which extracts the messages, generates a template string, and copies it to the clipboard so I can paste into my website source code:
const get_nodes = ($el, selector) => Array.from($el.querySelectorAll(selector));
//Remove collapsed thread button
get_nodes(document, ".ajU").forEach($n => $n.remove())
var messages = get_nodes(document, ".adn").map($msg => {
return {
from_address: $msg.querySelector(".gD").getAttribute("email"),
from_name: $msg.querySelector(".gD").getAttribute("name"),
date: $msg.querySelector(".g3").innerText.replace(/\(.*\)/, "").trim(),
body: $msg.querySelector(".a3s div[dir='ltr']").outerHTML
};
});
var slim_markup = messages.map(({from_name, from_address, date, body}) => {
return `
.email
.metadata
.name
| ${from_name}
.address
| ${from_address}
.date
| ${date}
.body
| ${body}
`
}).join("\n")
//Chrome Devtools has a built-in copy-to-clipboard function
copy(slim_markup)