18 views
we named our publishing tool after the Tamil word for "word"
The first slide of the deck we pitch with. Every mark on it is a component in a file.
I like writing long memos. I have never much enjoyed making decks.
It's awkward, because the deck is the thing people actually read. The argument is the part I enjoy and the slides are what it takes to get it in front of someone.
"Write code that generates slides" was always going to appeal to me. I'd tried before and it never quite worked. What changed this year is that iterating on graphics got fast: between Fable 5.1 and tools like Runway, an idea becomes a slide I'd actually show someone in minutes, and it has been far too much fun.
So I built Sol. Decks and memos as code, sent to one person at a time.
சொல், sol, is Tamil for "word". The bit I liked is that the same form means "a word" and "speak", with nothing between them.
That is the product, really. A deck is the document and the thing you present from, one file, five ways to read it.
A Sol deck is not boxes on a canvas. Each slide is an MDX file, markdown with React components in it.
It also makes a deck something an AI can actually write well. I don't describe a slide and hope for a picture, I hand it a component library and it writes source against it, same as any other API.
Somewhere around the halfway mark the commit log stopped reading like a commit log:
decks: speaker notes stop being shipped to whoever holds the linkdecks: a phone reads one slide at a time, not a scrolled PDFAbout 270 components are usable from MDX: slide templates, charts, diagrams, tables, and a pile of narrative blocks that each started as one hand-designed slide and got promoted the second time I needed it.
A roadmap from the diagram set. Dates go in as props, nothing here was dragged into position.
Diagrams take Mermaid directly, so there's no exporting a PNG and watching it go stale the first time the architecture changes.
An architecture slide written as a Mermaid graph. The boxes are text in the file, the layout is computed.
Tables are components too, so a next-steps slide is rows of data rather than a grid of text boxes lined up by hand.
A table type. Four rows, three columns, one type scale, and alignment nobody had to nudge.
The charts are a mix of Chart.js and hand-built SVG, depending on what the slide needs.
A market slide. The bubbles and the mosaic are both drawn from numbers in the file.
The theme follows the Kloop app, light slides with dark editorial bands. It's all Tailwind config, so the whole look can change whenever I want it to.

No viewer accounts and no sign up. The link is what identifies the reader.
Each one carries a recipient name, an optional password, an expiry and a kill switch. The same deck can have /sales-acme and /sales-globex live at once, tracked separately, neither aware of the other. Sessions belong to the link rather than the browser, so revoking one signs out whoever is reading it right now.
The password screen itself is a simple page. It gates the content and records the open.
The gate, before the password. Addressed to one person.
You create a link, send it out, and Sol tracks the opens, the views and the reads.
The index. Status, links and views, per memo.
Slides are still files, but I stopped wanting to write every one of them by hand. So there's an editor now: three panes, a storyboard down the side, drag to reorder, speaker notes, and version history with diffs.
Storyboard, editor, live preview.
Decks are what most people prefer to read. The memos run 12 or 14 pages and that turned out to be too long, too often, unless it was going to someone who specifically wanted that.
<TwoColumn split="55/45">
<Left>
<Eyebrow>Problem</Eyebrow>
<Title>The CRM is not the system of record</Title>
<Body>The founder is.</Body>
</Left>
<Right>
<FounderLedger />
</Right>
</TwoColumn>