← projects

typeset

Live 2025–2026

A minimal reader for long-form content. Strips away everything — ads, sidebars, distractions — and gives you the text, beautifully set.

typeset interface showing a long-form article
The original prototype — a single-column layout with no controls. Ugly, but it worked.

typeset started as a question: what if reading on the web felt like reading a book? Not the content, but the experience — quiet, focused, deliberately paced. The project became an exploration of what you can build when distraction is your enemy.

The problem with settings

Every reading app I tried had the same problem: before you could read, you had to configure. Font size. Line height. Background color. Column width. It felt like buying a chair and being handed a bag of bolts.

I made a decision early on: typeset would have no settings panel. One typeface. One measure. One background. If you don’t like it, that’s probably fine — you’re not the user. This sounds arrogant. It might be. But it also meant every design decision became a craft decision, not a preference default.

Early typography explorations testing measure at different viewport widths
Early type explorations — testing measure at different viewport widths.

Typography

The measure — the width of a line of text — turns out to be the variable that matters most. Too wide and your eyes lose the line. Too narrow and your brain can’t build momentum. The sweet spot is somewhere between 55 and 75 characters.

I spent two weeks just adjusting this. Two weeks on a number. At the end of it I understood, viscerally, why typographers talk about measure the way musicians talk about tuning. It’s not optional. It’s the thing.

The best typography is invisible. It disappears into the act of reading. You feel it only when it’s wrong.

Parser output comparison showing raw DOM versus extracted prose
Parser output comparison: raw DOM (left) vs. extracted prose (right).

Building the extractor

The technical challenge wasn’t the reader — it was the parser. Getting clean text from arbitrary web pages is an unsolved problem, and every site is a different kind of broken. Tables of contents masquerading as body text. Embedded tweets inside paragraphs. Comment sections that start before the article ends.

I settled on a layered approach — a chain of heuristics that passes content through progressively more aggressive filters. Most articles get clean enough on the first pass. Edge cases get a second opinion from a readability scoring function.

What I learned

Building typeset taught me more about typography than any book or course. The constraints were strict enough to force real understanding, and the immediate feedback — open a page, see if it reads well — kept theory grounded in practice.

The most useful lesson was about opinions. Not having them is a design failure. Every tool that tries to please everyone ends up serving no one. typeset knows what it is. That’s the design.

Final typeset app icon
Final icon. Took longer than the entire parser.