/* ============================================================================ Writing — index list + single article reader ========================================================================== */ function PostRow({ post, onOpen }) { return ( onOpen(post)}> № {post.num}
{post.cat} · {post.tags.map((t) => "#" + t).join(" ")}

{post.title}

{post.desc}

{post.date}·{post.read}
); } function WritingIndex({ go, openPost, filter: filterProp, setFilter: setFilterProp }) { const allTags = ["all", "philosophy", "technology", "history", "politics", "science"]; const [filterLocal, setFilterLocal] = React.useState("all"); const filter = filterProp != null ? filterProp : filterLocal; const setFilter = setFilterProp || setFilterLocal; const shown = filter === "all" ? POSTS : POSTS.filter((p) => p.tags.includes(filter)); return (
Writing

Essays & notes

{`${POSTS.length} pieces · since 2024`}
{allTags.map((t) => ( setFilter(t)}> {t === "all" ? "All" : "#" + t} ))}
{shown.map((p) => )}
); } function ArticleReader({ post, go, openPost }) { const p = post || POSTS[0]; const more = POSTS.filter((x) => x.id !== p.id).slice(0, 2); return (
go("writing")}> ← All writing
{p.cat} · {p.tags.map((t) => "#" + t).join(" ")}

{p.title}

{p.desc}

{p.date}·{p.read}·~1,900 words

There's a version of this argument that's been made a thousand times, and you've already filed it under obvious: attention is finite, the feed is infinite, be careful. I want to make a slightly sharper claim1.

↳ Sharper, and therefore easier to be wrong about. That's the trade.

Attention isn't just scarce — it's the only input I have left that I can't borrow, batch, or buy back at a markup. Money compounds. Tools multiply. But the hour I spend half-here, half-scrolling doesn't return at a discount later. It's simply gone, and quietly.

The economics of being here

Treat focus as capital and the usual productivity advice inverts. The question isn't "how do I do more in this hour" but "what is this hour's principal, and am I spending it or lighting it on fire."

"Every interface encodes a theory of the person using it — and most of them are betting you won't notice."

Below is the smallest change that moved the needle for me: a single config flag that turns the day's first surface from a feed into a blank page.

# the only setting that mattered{"\n"}startup.surface = "blank"   // not "feed"{"\n"}notifications.batch = "09:00, 17:00"
Fig 1. Self-reported focus plotted against shipped work.

None of this is a system you should copy wholesale. It's an argument, and arguments are meant to be tested against your own life2. So here's the next action, which is the whole point of writing this down.

A claim I keep re-testing against history — see the printing-press note.

1 The sharper a claim, the more useful it is to be wrong about precisely.

2 If it survives contact with a real week, keep it. If not, discard without ceremony.

Your next action

Set one surface to blank tomorrow morning — then tell me what changed.

Keep reading
{more.map((m) => )}
); } Object.assign(window, { PostRow, WritingIndex, ArticleReader });