Roadmap
What we built, and what we cut.
The commits start on 23 June 2026, but the work began about a year before. Here is what it built, what it took back out, and what is written down for next.
- Before the first commit
- About a year
- Of commits, 23 Jun – 28 Oct
- 127 days
- built
- 68
- taken out
- 9
- planned
- 5
Updated
| Chapter | Model | Data | Peers | Product | Craft | Readers |
|---|---|---|---|---|---|---|
| Work no commit showsUndated | 1 built | 1 built | 1 built | |||
| Groundwork23–29 Jun | 1 built | 2 built | 1 built | 2 built | ||
| A first screener3–17 Jul | 1 built | 2 built | 3 built | 2 built, 1 taken out | ||
| Earnings season29 Jul – 8 Oct | 2 built, 1 taken out | 1 built | 4 built | |||
| Peers, in the lab15–16 Oct | 5 built | |||||
| Three tools17 Oct | 2 built | 1 built | 2 built, 1 taken out | 1 built | ||
| One app19–23 Oct | 1 built | 3 built, 4 taken out | 1 built | |||
| Open to the public24 Oct | 5 built | |||||
| For investors25 Oct | 1 built | 1 built | 3 built | 1 built | ||
| Ask it26 Oct | 1 built | 3 built, 2 taken out | 1 built | |||
| Compare27 Oct | 1 built | 3 built | 1 built | |||
| Polish27–28 Oct | 6 built | 1 built | ||||
| NextPlanned | 2 planned | 1 planned | 2 planned |
- Built
- Taken out
- Planned
- One square is one entry
The tracks
- Model
- What a company is worth
- Data
- What the numbers stand on
- Peers
- Who a company is like
- Product
- What a reader uses
- Craft
- What holds it up
- Readers
- Who follows along
Work no commit shows
No dates, no commits
The year before the first commit, and the work that runs beside the code.
A year before the first commit
Daily work on the idea began about a year before the first commit on 23 June, and none of it is in the list of commits.
Regulatory work
Regulatory work ran beside the code as part of the daily work, and no commit records it.
A newsletter that found its readers
Old Money Investing, our Substack newsletter, began with no outside following. On 8 September it had 100 paid subscribers and bestseller status, 41 days after its first post and 16 after its first paid post. It has about 5,000 subscribers.
Groundwork
23–29 Jun
A web app, a pipeline and a first idea of what a company is worth.
The first commit
A web app on Cloudflare with a database, file storage and a rate limit already wired in. Development and production were separate sites from the start.
A pipeline to feed it
A job that fetches prices and company statements, cleans them and writes the files the site reads. By the end of the second day it held 212 files. The first fixes were for crashes and leaks.
Every field written down
One document lists every table and every field, and the quality rules each must meet.
A roadmap you could vote on
A public board with columns from idea to shipped. Anyone could vote on an item without signing in, once for each item.
A first model of value
Price set against a computed value for each company, stored in a fixed format the web app reads.
Guards at the edges
Loaders refuse any path that climbs out of the data folder, and every quality gate checks its own settings before it runs.
A first screener
3–17 Jul
A table of companies, live prices, the first checks on the data and the legal pages.
A table of companies
Sort and scan every company in one table. By 8 July it paged, showed live prices and opened a row into its details.
The pipeline tests itself
Checks for scale errors, price gaps, implausible prices, thin history and extreme returns, each finding with a severity. A night spent silencing some of them was undone the same morning.
The gap is measured from value
A gap is measured against the value the model computes, not against the market price. That is still how every gap on the site is measured.
A missing number stays missing
A zero market cap is rebuilt from shares outstanding where that is possible. Where it is not, the page shows nothing instead of a guess.
Prices that move
A price cell flashes when its price changes, so the market can be seen to move without a reload.
The legal pages
Terms of use, a privacy notice and a financial disclaimer went up on 10 July, five days before production opened.
A floor for every color pair
A color brief and a script that measures the contrast of every text and background pair. A pair below its floor fails the check.
The MVP opens production
The same day as a redesign: sign-in gates, an admin site for development, and production opened.
The first cleanups
Eleven unused packages went on 4 July. On 17 July a cleanup took out archive routes, dead screens, copied reference docs and an orphaned pipeline stage: 162 files in one commit.
Earnings season
29 Jul – 8 Oct
A newsletter opens and the earnings desk goes live. Checks tighten. Market indicators leave.
A newsletter opens
Earnings Intel published its welcome on 29 July: how thousands of earnings releases, market expectations, competitor results and options prices become a short list of the reports that matter.
The week's twenty
A report ranked each week's earnings by an attention score and kept up to 20. The first issue to name its twenty went out on 2 August.
An issue every Sunday
From 2 August an issue went out on every Sunday, 13 in a row by 25 October.
An earnings desk
A weekly view of who reports, and a page of five sections for each company's report. Work began on 31 July, and it went live on 13 August.
Issues for paid readers
The first issue written for paid readers went out on 23 August, beside a free one.
Checks that run anywhere
A secret scanner, a pinned code checker and the repo's gates now run in CI as they run on a laptop. Tests no longer depend on what was published locally.
A new name
Earnings Intel became Old Money Investing on 27 September, and its issues began to set stocks against the fair value model.
Three indicators retire
Three market indicators, first drawn in July, were taken out on 8 October. They are archived, with notes on how to restore them.
Peers, in the lab
15–16 Oct
Two days to learn whether peers can price a company, with every test written before its result.
Peers with weights
Companies are ranked against weighted peers instead of industry and size tiers. Every peer set is dated and never rewritten.
A group for every company
A company with no peers of its own is ranked against a daily comparison group, rebuilt and graded every night.
The new way runs in shadow
Every night the new way prices each company beside the old way, and both results are kept. Pages keep the old way until the new one proves itself.
Tests written before results
Each design for companies with no usable peers was registered in writing, with its pass mark, before it was scored.
A final test, read once
The last twelve month ends were held back while the design was built. It beat the old estimate on every multiple tested, and the ledger refuses a second read. It is research code, not yet in production.
Three tools
17 Oct
Valuation, Peers and Universe in one day: 74 commits, one fair value and a rule of no number.
Valuation
Price against fair value, month by month: a ledger of the past and a cone for the next three years.
Peers
A company set against its peers by similarity and by value, on a map that zooms by pinch, wheel, keys and buttons.
Universe
Every company in one table, with its filters and its sort in the address, so any view can be shared by link. Prices are live.
One fair value
All three tools read the same number, so a company has one fair value wherever it appears. The old name for it is gone from every page.
No number, no guess
Where the model does not apply, no page shows a fair value, and the page says so.
Contrast and focus, every state
The contrast list grew to cover the core pages, and every control got a focus frame. What the check caught was fixed the same day.
The first table retires
The July finance table was archived. So was the shelves pipeline, built earlier the same day for a design that did not last.
One app
19–23 Oct
A dozen pages cut, a market clock fixed, a portrait of each company, and the marketing site folded in.
Twelve pages retired
The calendars, the command center, the index, two archives, a team page and the weekly report went in one day. Each old address now answers 404.
A market clock that stays right
A holiday table that stopped in 2027 gave way to the exchange's own rules: observed days, Good Friday, early closes and a day of mourning the table missed.
A portrait of each company
How a company earns, where its cash goes, how much strain it can take and which companies it resembles. A missing input stays missing.
The dossiers retire
The earnings dossiers came out of the pages, the pipeline and storage, after a copy was archived and checked. One question from them returned three days later as a panel.
What a company sells
Each company's revenue is sorted into about 800 kinds of business, using a dictionary of about 12,000 labels. Two companies are alike when their money sits in nearby kinds.
The home page moves in
The marketing site became the home page of the app, and was compared with the old one pixel by pixel at fifteen widths.
Sign-in removed
Sign-in was removed, so every page is open to read. The admin screens run only in development.
The empty roadmap retires
The old roadmap page showed a title and a blank body, and nothing linked to it. It went into the archive, and this page takes its place.
An engraving, drawn live
The footer's engraving is drawn live in WebGL, in the manner of security printing, with no image and no graphics library. A fixture pins every frame it can draw.
Open to the public
24 Oct
A shield, a notice of rights, a keyboard check and a scan for secrets, all on one day.
A shield at the door
Before the app runs, a shield asks a program to prove it is a browser, slows a client that reads too much and turns away one that is plainly collecting the data. A reader who opens companies one at a time never sees it.
A shield that was attacked
Planted bugs in its code had to fail a test, and all 164 did. A red-team script then ran 18 scenarios against a built Worker, and none of its 59 checks failed.
Rules that cannot drift apart
The robots file and the notice reserving data-mining rights are written from the list the shield decides with, and a test holds them to each other, path by path.
Every control shows focus
A script tabs through the product's pages on a desktop and a phone, and names each control that takes focus without a visible frame.
No secret in the bundle
A check before every deploy fails the deploy if the script the Worker uploads carries a secret.
For investors
25 Oct
How long a company has stood at its gap, eight gates, a card to post and what a stock did after earnings.
How long it has stood there
A line through a company's last twelve months of gap, and how many of those months it has stood where it is now. The Universe filters and sorts by it.
Eight gates
Model, size, value, confidence, growth, cushion, cash and books. Each gate answers pass, fail or not tested, and a missing reading is never a pass.
The gates matched a real screen
On a frozen snapshot, the gates reproduced a published weekly screen: the same count at every stage and the same survivors, with no differences. Of its 25 picks, 24 clear, and the 25th fails one gate, as that screen said.
Peers, through the gates
A matrix puts a company and its peers through the gates. The peers that clear come first, then those that fail by the fewest gates.
What happened after earnings
A Valuation section shows what a stock did after each of its last five reports, and whether earnings per share beat the estimate.
Ask it
26 Oct
The home page becomes a question box, and every page learns to open at the answer.
The Prompt
Type a company and get one sentence about it, and three pictures that show it. No language model writes it: every sentence is built from numbers that a file holds.
Three depths
Every page opens at the answer and the numbers that make it. Two more stops add the work behind it, then every element. The choice follows the reader from page to page.
A ridgeline for the gap
A company's gap history is drawn on a log scale, so a price at twice fair value and a price at half sit the same distance either side.
One file per answer
The nightly run writes a small file for each valued company, so the Prompt answers by reading a file instead of computing. Python and TypeScript each check its format.
Words are tested too
A script holds every word a reader sees to rules of voice: no talk of where a number was read, no disclaimers, one name for the model. It scans the code and the pages as they render.
The Gates page folds in
Gates stopped being a page of their own and became a section of Valuation. Peers and Universe lead there, and the old addresses redirect.
The first chart is gone
The first chart page, built in July on a charting library, was removed with the library. Its addresses redirect to Valuation, and every chart on the site is now plain SVG.
Compare
27 Oct
Who is a company really like, and is it cheaper than they are?
Four lenses
Business, words, numbers and motion each rank the twenty companies closest to a company, and each votes for its first ten.
A twin needs three votes
A company is a twin when three lenses vote for it. Where no three agree, the page says so and picks none.
One against one
Any two companies side by side: how many points apart their gaps are, how alike they are, and what each lens says of the other.
One rule, two languages
The twin rule is written in Python and in TypeScript. One shared test file makes either fail until the other agrees.
A faster build, the same output
Parallel reads, a pool of processes for pricing and two caches made a test build faster, and uploads now use 64 threads. The whole build was compared file by file with the old one, and every output was identical.
Polish
27–28 Oct
Details, narrow screens and two written plans.
A bar that becomes the header
Leaving the home page, the Prompt's dark bar moves up and becomes the company picker of the header, and nothing else moves. A reader who asks for less motion gets the change at once.
Two plans, written to be checked
Peers v2 and Fair Value v2 are written as numbered units. Each has its tests, its pass mark and its way back, and each finding names its script and says whether it was measured, inferred or guessed.
A month on nearly every ring
On a company's capital map, nearly every ring among its peers carries its month, written beside the ring or on a short line that crosses nothing. Where no place is clear, the month is left out.
Three doors, no Enter key
The Prompt lost its on-screen Enter key, since the keyboard's own still asks. Three small doors under its panes lead to Valuation, Peers and Universe.
Fits a 320-pixel phone
Labels in the Valuation answer no longer print over each other between 768 and 939 pixels. Pairs and twins were redrawn to fit the narrowest phone.
A preview with no number
The image that previews the site is captured from the real home page with the Prompt emptied, so it names no company and shows no figure.
This page
The roadmap returns, as a record of what was built, what was taken out and what is planned. It is data, and tests hold it to its order, its length, its words and its links.
Next
Planned, with no date
Planned in writing, each with its tests and its way back. None has a date.
Peers v2 in shadow
The design that passed its final test starts running every night beside the old way. It prices nothing on the site until its live days pass tests written before they began.
Peers, graded every month
Each month the peer lists are scored against the industry's lists on three tests, so that 'better than the industry' is a claim that can fail.
A base rate that is measured
Today the odds that a company keeps a growth rate up come from a hand table. The plan counts them from the histories of comparable companies and gives the size of the group behind each count.
A record of how gaps ended
Each night the gaps the site published are kept, so that later the page can say how gaps like this one turned out.
A longer memory
The model is given quarterly statements back to 1997, including those of companies that have since stopped reporting, so it learns from the ones that ended as well as the ones that lasted.