Rebase Capital

Distill: a shared inbox that writes a wiki

What I know about a customer is scattered across emails, chats and screenshots. Distill is the internal tool I built to read them and keep the notes I never would.

In the last post I mentioned Distill, an internal tool I said I’d tell you more about. This is that post.

I forward an email to it, paste in a WhatsApp chat, or drop in a screenshot or a contract. It reads what I gave it, works out who and what it is about, and writes what it learned onto pages about the people, companies and projects I deal with.

The notes I never write

Everything I know about a customer already exists somewhere. It’s in an email thread from March, a chat on my phone, a photo of a whiteboard, a PDF somebody sent once. What doesn’t exist is the page that says who this person is, what their company grows, what software they run, and what we agreed last time.

Every CRM I’ve used assumes I’ll type that page myself after each call. I don’t. Nobody does for long. But I will forward an email, because forwarding an email takes four seconds. So Distill asks for nothing more than that, and does the writing itself. It’s a shared inbox that writes a wiki.

What a page looks like

A page is a markdown file. It opens with a sentence or two saying who this is, and then it’s a list of facts:

Runs procurement at Acme Cloud, where she has been our
main contact since the 2026 renewal.

## Facts

- Runs procurement at [companies/acme-cloud.md] [src:412 2026-08-14]
- ~~Based in Rotterdam~~ [src:120 2026-03-02]
- Based in Amsterdam since June [src:412 2026-08-14]

The thing at the end of each line is what makes this useful. It’s a link to the source that said so: the email, the chat, the transcript of the screenshot. When an AI writes your notes, the question you’ll ask of every sentence is “says who?”, and the answer has to be one click away.

The struck-through line is a fact that stopped being true. It stays on the page with its own source, so I can see what changed and when without digging through history.

What stays out of the wiki

“I’ll send the quote on Friday” is not a fact about anybody. Once Friday has passed it’s either done or missed, and in six months it’s worth nothing. So it goes on a calendar, not on a page. If it won’t be useful in six months, it doesn’t belong on the page.

A reminder can simply be deleted. A sourced fact shouldn’t disappear without leaving its history behind.

When it doesn’t know, it asks

The most expensive mistake a tool like this can make is merging two people into one. So an email address or a domain is treated as evidence, and a similar name is treated as a coincidence. If a new “Mike” could plausibly be either of two Mikes I already know, Distill doesn’t guess. It asks me, and only the facts about that Mike wait for the answer. Everything else in the email is written straight away.

It does the same when a new fact contradicts an old one: it asks me rather than deciding which one is right. If I ignore a question for a week, it takes the conservative option: create a new page that I can merge later, or keep both facts.

Plain files in a Git repository

The wiki is a Git repository of markdown. If I clone it, I can read all of it in any markdown viewer with no application running, and the source links still work, because the text of every source is in the repository too. If Distill disappeared tomorrow I would still have the notes. After eighteen years of running software, that’s the property I trust most.

The attachments themselves live in a database, not in Git. Git is deliberately bad at forgetting things, and deleting somebody’s data needs to actually delete it.

How it’s put together

email, chat, screenshot, PDF
      |
   intake    strip quoted replies and signatures,
      |      transcribe images, drop tracking pixels
      v
   extract   who and what is this about?      (Claude Sonnet)
   decide    what was actually agreed?        (Claude Sonnet)
   resolve   which page is that?              (search, then Haiku)
   write     one page at a time               (Claude Sonnet)
      |
      v
   one Git commit per source

It’s one Rails app. Each step is a small, separate call to Claude. There’s a reason for each one. Decisions used to be one more field in the extraction step. The model then returned no decisions at all from a thread whose whole subject was two people agreeing terms, and the rest of the extraction got worse too. What was actually agreed is a different question from what was mentioned, so it gets its own pass.

Extraction runs on the larger model for a similar reason. The small one filed companies under people/ without hesitating, and every later step inherits that mistake.

Nothing in processing a source grows with the wiki. Search picks a shortlist of pages, and those are the only ones the model sees, so a source touches two to six pages whether the wiki has a hundred of them or ten thousand. That keeps the bill flat, but the real reason is correctness: a model handed everything reads all of it badly.

Where the model isn’t trusted

A model rewriting a whole page will occasionally drop a source link, and a page that lost its provenance is worse than a page that missed an update. So every rewrite is compared before and after, and refused if a link went missing.

That check once passed a rewrite it shouldn’t have. A company’s logo vanished from its page: the model had kept the line and its source, and replaced the image with the words “their wordmark”. The same comparison now runs over images as well.

There’s also a nightly pass that tidies up contradictions which built up over months. It’s never given a page to rewrite. It quotes lines back, and ordinary code finds those lines and does the editing. A line quoted inexactly matches nothing, and nothing happens.

The general rule is simple: let the model interpret things, but don’t let it silently rewrite state.

Where it stands

Distill is an internal tool, and I use it every day at Trackberry. A prospect’s page opens with the handful of things I always want to know before a call: what they grow, how much, who matters there, and what systems they use. It shows the unanswered questions as plainly as the answered ones, which tells me what to ask next.

It isn’t a product and I don’t know whether it should be one. There are still rough edges, and a few things I’d like it to do that it doesn’t yet. But for now it’s the colleague who reads everything and writes it down, which is the colleague I’ve been missing since 2008.

Málaga, 19 September 2026.