This page explains exactly how the paper is made. We publish our math because our readers can smell a black box, and because a ranking you can't audit is an opinion wearing a lab coat.
Where the signal comes from
Workers poll public sources every 30 minutes: the Hacker News front page and every story crossing 50 points (via the official Algolia and Firebase APIs), four launch boards (Product Hunt over its official GraphQL API; Fazier, BetaList and Uneed from their public pages), GitHub's trending page, TrustMRR's public verified-revenue feeds, a curated set of builder newsletters over RSS, seven subreddits where small software businesses trade, and package and app-store download counts. Every poll records score, rank, and comment count - that time series, not any single number, is what the paper reads.
X, and how Reddit is read. The section called The Timeline is fed by X's official v2 search API, on the metered per-read tier, under a developer account we pay for. It is not scraped and it is not a $200/month firehose: once a day, an hour before the edition is written, we run four narrow queries and read at most a hundred posts - about fifty cents a day, fifteen dollars a month. Every other source we poll every thirty minutes; this one is metered, so it gets one pass and the Timeline reads a 24-hour window to match. Reddit is read over the two access paths Reddit itself opens: the public per-subreddit RSS endpoint, which needs no credentials and carries no score or comment count, or its official OAuth API under a free script-app registration, which carries both. Neither is scraped and neither is the paid data licence this page previously said we would not buy - that sentence was written when those were thought to be the only options, and it stayed on the page after seven subreddits joined the 30-minute cycle. A post read over RSS is discovery only: it is stored with no snapshot and reaches the desk on recency, because we know it was posted and not whether anyone cared.
A page describing the pipeline is only true on the day it is checked against the pipeline, so it is checked whenever a source is added or removed. This paragraph has been wrong in both directions before now: once claiming X was absent while the Timeline underneath was full of posts from it, and once claiming we would not read Reddit while seven subreddits were on the thirty-minute cycle. Both were caught in drafts, and neither reached a reader.
Treat anything sourced from X as the weakest material in the paper. Self-reported revenue on that platform is the most gamed genre on the internet, we cannot audit a screenshot, and we label those posts as claims rather than facts wherever they appear. The colophon at the foot of the front page lists the sources that edition was actually read from - the same reading, over the same window, that the Sweep Report above it counts - so the two cannot disagree and neither can drift away from this page.
The Rising
The Rising ranks names gaining cross-platform momentum before they peak. For each tracked entity we compare the last 48 hours against the five days before them - seven days of history in total:
current_rate = weighted mentions in last 48h ÷ 2 days
baseline_rate = weighted mentions in prior 5 days ÷ 5 days
rising_score = (current_rate / max(baseline_rate, 0.5))
× (1 + 0.25 × (distinct_sources − 1))
Source weights: HN 1.0, GitHub 0.9, TrustMRR 0.9, Product Hunt 0.8. Exclusions, so the list stays honest: entities within 72 hours of a Product Hunt launch (everything spikes on launch day), entities with fewer than 5 weighted mentions or fewer than 2 distinct sources in the current window, and every name in the Toolchain Index catalogue - a tool we already track by name is not a discovery. The ▲ percentage shown is (current_rate ÷ baseline_rate − 1) × 100, capped at 999%.
Three rules, and the faults they came from. This box is on the front page from edition one, and it very nearly went out broken. Across the test editions built while the pipeline was being written, it produced names like China, Microsoft, MCP and NeXT beneath a caption promising that megacaps were excluded. They were not. None of those editions was ever published - catching this is what the draft stage is for - but a method page that only lists the rules a box passes today tells you nothing about how much to trust it, so here is what was wrong.
First, a name must have a baseline to have risen from. The score divides by max(baseline_rate, 0.5), and that floor is meant as smoothing for thin history. Applied to a name with no history it invented one: every entity we had never seen before entered at roughly 700%, and the box sorted by little more than raw mention count. When we checked, every qualifying row had a baseline of exactly zero, because the entity table was younger than the five-day window the method compares against. Every percentage the box had produced up to that point was that same constant. A name with no measured baseline is now excluded from The Rising entirely and appears under New to the Wire instead, which claims only that the name is new and that posts are linking to it.
Second, a discovery must have an address. Some entities are created by a language model reading a headline and naming what it is about, which produces no domain. Those are words, not products. If the name is real, we attach a domain the first time anyone links to it, and it becomes eligible then.
Third, a published list of exclusions must be code, not a prompt. The only megacap defence we had was a sentence in the extraction prompt asking a model to skip big-tech names, which it ignored. There is now a list - public companies and household brands, countries and institutions, protocols, file formats and programming languages - enforced both when an entity is created and again when the box is built, matched on whole words so that Chinatown and Metabase survive it. It is a list, so it is incomplete, and we would rather drop a real name than print a country.
Every name in the box links to its clipping page - every item we ever saw it in, so the ranking can be checked against the evidence rather than taken on trust. The mention and source counts printed under each name are the same numbers the query thresholded on.
The Wikipedia line. Where a name in the box has an English Wikipedia article, we also print how its pageviews moved - the last 7 days against the daily average of the 23 before them, from Wikimedia's official pageviews API. This is the paper's substitute for Google Trends, whose per-keyword API is unofficial and rate-blocked; Wikipedia's is public, free and documented, so you can reproduce the number. It is not part of the score and changes no ranking. It is there because two independent measurements agreeing - builders talking, and the public looking a name up - is worth more than either alone, and averaging them into one figure would destroy the only interesting thing about having both. We suppress it below a 25% rise, and on articles averaging under 20 views a day, because a page going from three views to nine is "+200%" and means nothing. Most rows carry no such line, because most indie products have no Wikipedia article. That is the signal being sparse. It is not a name failing a test, and no absence here should be read as disagreement.
Expect the unranked version of this box at first. Ranking by acceleration needs five days of history sitting behind the 48-hour window, and on the day a paper starts it has none. Until the archive is deep enough to measure against, the names appear under the heading Names Appearing Across Sources - unordered, with no percentages - or the space goes to New to the Wire, which claims only that a name is new and being talked about. That is the method working rather than failing. A rank we cannot compute is a rank we do not print, and we will not backfill a score we never measured.
Yesterday's Launches
Four boards feed this box: Product Hunt, Fazier, BetaList and Uneed. They are not the same size, and their vote counts are not on the same scale - a strong day on Fazier is around forty upvotes and a strong day on Product Hunt is several hundred. We do not convert between them. There is no honest constant relating an upvote on a board with a million visitors to one on a board with two thousand, and a converted figure would be a number no reader could check against anything. Each board is ranked against itself, the shortlist takes the top few from each, and every row on the page prints the board its figure came from so the figure keeps the only frame in which it means something.
Two boards publish no vote count at all. Those rows are ranked by recency within their own board and printed with no number, rather than with a zero: not knowing whether anyone voted is a different fact from knowing that nobody did. Boards give us the launch, not the verdict - we have not used any of these products, and the blurb says what a thing is rather than whether it is good.
The Toolchain Index
A count of positive signals for each tool across every platform we read, over 7 days. Deliberately not a percentage: a share is only meaningful between things that compete for the same slot. "Claude 31%, ChatGPT 24%" is a real statistic because you pick one of them; once Stripe and Postgres are in the same list, a percentage is a precise-looking number that means nothing. So we count, and we show what we counted.
Two kinds of signal, because "positive" means different things depending on whether a platform carries opinions or behaviour:
said a story, comment or excerpt whose language scored positive
on our word list (negation-aware: "not great" is not praise)
backed an upvote, star, download or rating that actually GREW in
the window - nobody stars a repo they hate
What this is not. It is a word list and a set of counters. It cannot read sarcasm, it cannot read tone, and it does not know that "this is sick" is a compliment. So the box never claims anyone loves a tool - only that the language around a mention scored positive, or that a number went up. backed is the stronger of the two, and the mix is printed under every row so you can see which kind of evidence a tool is standing on.
Opinions live in comments, not headlines - "Postgres 17 released" carries no verdict. So top-level Hacker News comments are stored as first-class items and scored like anything else. Tool names are matched with tightened patterns because the plain words are ordinary English: grokked, a llama, render the template, off the rails, cursor-based pagination and fit a GLM must not register as tool mentions. That costs us some real mentions, and we prefer that to inventing them.
Tool names link to that tool's clipping page where we hold one.
The Timeline
We run four standing searches on X's official API - build-in-public posts, launch-and-revenue posts, indie-hacker and bootstrapper talk - and keep posts clearing a small engagement floor. The box does not rank by popularity. It ranks by how far a post outran its author's own audience - engagement (likes plus double-weighted replies, because a post people argue with tells you more than one people liked) divided by follower count plus a damping constant of 500. A 340-like post from a 200,000-follower account is an ordinary day; 40 likes from a 480-follower builder who just crossed $2k MRR is news, and this paper is about the second one. The damping stops a 30-follower account with a fluke from taking the column, an absolute floor of 15 engagement drops posts that are simply too quiet to print regardless of ratio, and we show one post per author so nobody takes every slot. Follower counts are printed next to each post so the ranking can be checked. Capped at five. Posts are quoted verbatim and always linked; we do not edit them, and we store the minimum needed to print and attribute. X is paid per read, so the volume is deliberately small.
A post has to carry a figure or it does not run. That single rule is what separates this from a list of links. "What kills most SaaS: bad product, no distribution, bad pricing" is four abstractions and a reader cannot do anything with it; "we raised from $9 to $49 a month over twelve months and churn went down" is a finding somebody can test against their own numbers. The rule is enforced in code and not asked for in a prompt - there is no model in this section at all - and the figure has to be a shape that means something was measured: money, a percentage, a revenue figure, a count of customers, a span of time. A bare year or a version number does not qualify.
Nothing in the column is written by us. Each line is the poster's own sentence, selected and cut on a word boundary with the cut marked, and the author is named on every row - a claim made by one person in one post is that person's claim, and that matters more here than anywhere else on the page, because these rows are advice about money. We print no figure of our own beside them: the number is inside their sentence where they put it. Each row is tagged with which part of the trade it is about, so a reader looking for what a price change did to churn does not have to read six posts to find the one about churn. Sources are ranked against themselves - an X post on how far it outran its author's own following, a Hacker News or Reddit post on its own score - because a single ranking across the three would hand every row to whichever produces the largest integers.
Launch listings are excluded by construction. A launch is a product announcement and has Yesterday's Launches built to rank it against its own board; this desk is about what running one taught somebody. Tooling and agent releases are also absent, and deliberately - they are already covered in three other places on the page.
How articles get written
A clustering model groups collected items into stories and scores newsworthiness against a fixed rubric (builder impact weighs most; big numbers alone weigh least). A writing model then drafts each article under a strict rule we call the firewall: it receives numbered source items and may not use any knowledge outside them. Every paragraph must cite its sources; every number must appear verbatim in a source. Code - not the model - verifies both, plus length limits and a banned-phrase list, and rejects articles that fail. An article that still carries an invented figure after three corrected attempts is not printed at all; the lead is the one exception, and a flagged lead is held for a human instead. Stories move both ways after that: an article that fails keeps its place as a brief rather than vanishing, and a brief the editor under-called - several sources pointing at one thing, or a thread with a real argument in it - is written up as an article when the page has room for it.
The briefs in From the Desks take a shorter path. Through the test editions they took no path at all: they were the clustering model's own internal one-line note about each cluster, reproduced verbatim, which is why half the column restated its own headline and the other half carried a scraped repository path. A briefs desk now writes that column - one batched pass over the whole block, working from the same numbered sources and under the same firewall as the articles, asked for the one thing the headline does not already say, and asked to write nothing at all rather than pad. Where it has nothing to add you get a headline and a link, which is an honest brief. For a long stretch of those drafts nothing checked any of it, which is how a test front page came to carry "age_hours of 123 suggests this is a resurfaced discussion": our own database column names, in copy, describing why an item was selected. Brief copy - the headline as well as the sentence under it - is now scrubbed by the same code before it can reach the page: any clause naming an internal field or metric is removed, any figure the brief's own sources do not carry is removed, and a line left as a fragment prints as no line at all. A headline that fails falls back to the source's own title. We would rather show you less than show you the machine talking to itself.
A launch board listing is not a brief. On one draft this column came back nine-twelfths Product Hunt, with Yesterday's Launches a few inches further down doing the same job from the same four boards - so a reader met the same kind of thing twice in two formats, and the second telling was a list of names and links with no news in it. Launch rows are now excluded from the column before it is cut to length rather than after, so the space goes to another story instead of being lost. A launch can still be written up as a full article where it earns one.
The confidence rating
Every article carries a self-assessed rating printed in the byline: high (3+ independent sources, consistent), medium (2 sources or minor inconsistencies), low (single source or gaps). Low-confidence leads are never published without human review.
The Sweep Report
Every edition prints what it was made from: how many items were ingested from each source in the window, how many reached the shortlist, and how many were printed. Most publications in this space sell "signal over noise", which is sampling described flatteringly - you are never told the denominator. Ours is at the bottom of every edition.
Read it precisely. It is a count of what our ingestion workers saw in the window, not a claim that every item on every platform was seen. A source outage, a rate limit or a story that never surfaced on a tracked platform will not appear in it. That honest limit is why it is a report and not a guarantee.
The human
Every edition is offered to one human editor before publication with a 20-minute window to amend, hold, or kill it. That window is not universal: editions containing revenue and funding claims, allegations against a named party, an article that failed source validation, or a low-confidence lead are never auto-published - they wait for a person, however long that takes. A late edition costs little; an unread claim about a real business costs the paper.
Corrections are printed at /corrections with the original claim left intact rather than quietly edited away. The paper is written by machines; what it prints is a person's responsibility.
Our own numbers
We ask every company we cover for its real figures, so ours are published too: circulation, editions, articles, sources read, and the paper's revenue and costs in full - including the months the net is negative. They are at /books, rebuilt with every edition.
The reader counts there are worth being exact about, and none of them is ours. Cloudflare runs a beacon in the page and reports two things. A view is a page loaded in a browser. A visit is a pageload that arrived from somewhere off this site, so a reader who opens three stories in one sitting is three views and one visit. Neither is a count of people: Cloudflare does not identify anyone across two arrivals, and the same reader coming back tomorrow is counted again. Every figure carries the name of whoever counted it, and where one cannot be read it prints a dash saying so rather than a zero.
Both are a floor. The beacon is a file the browser fetches from Cloudflare, and a reader who blocks that file is not counted at all - which, given who reads this paper, is a good many of you. Under-counting is the direction we would rather err in when the subject is our own circulation, because it is the direction that cannot be talked up.
There is no all-time figure, because Cloudflare keeps a rolling window and refuses to answer about anything older. The second pair of boxes says how many days it covers. We are not going to carry a lifetime number forward from somewhere else and print it under the same heading.
We used to count these ourselves, and stopped on 30 August 2026. The paper ran its own counter, built so that it could not identify anybody: a random number the server invented, deleted after five minutes, and running totals kept as sixteen integers. That was the whole of it, and it is exactly why it had to go. A figure out of sixteen integers cannot be broken down by page, by day, or by anything else, so nobody could check it - not a reader, and not us. It read 987 views for the paper's life where Cloudflare read 421 for the same days, and we had no way to tell you which was nearer the truth. This page exists to describe things you can verify. Between a number that flatters us and one that can be argued with, the second is the one worth printing.
Notices, and who pays for them
The paper carries paid notices. There are four positions in the renderer and the story columns are not among them: two boxes flanking the nameplate, a banner across the foot, and - when it is built - one box at the bottom of the right-hand rail. Every one of them is boxed in a heavy rule and set on a yellow used nowhere else on the sheet, because news here is set in ruled columns and notices are set in boxes. That contrast is the whole system. A notice that could be mistaken for a story would be worth less, not more.
Copy is set in the paper's own type. We are not hosting anyone's artwork, tracking pixel or script - there is nowhere in the renderer for one to go, which is a fact about how the page is built rather than an undertaking about the future.
One thing it sells is not a box at all: the Tool Review, which is coverage, and the terms it is sold on are in the disclosure rule below. The whole rate card, including the positions that are drawn but not built and the ones we are choosing not to sell, is at /bid. Space is bid for by the day: the highest rate per day takes a position for that day, a tie goes to whichever bid arrived first, and the clearing prices are printed - including the days nothing sells at all. Same argument as /books: we ask the companies we cover for their real numbers, so ours go up too.
The disclosure rule
An advertiser is somebody the paper might also end up writing about. That is not a hypothetical for a publication in this market: the tools indie builders buy are the tools indie builders talk about, so the overlap between "would take a notice" and "could be a story" is close to total. The rule, written down before it was needed rather than after the first argument:
Where a story concerns a company that has bought space in the paper within the last 90 days, the disclosure is printed in that story - in the article, next to the claim, where somebody reading the story will actually see it. Not only on this page, and not only in a rate card nobody clicks through to. A reader who never visits /bid must still be told.
Two consequences worth stating, because they are the reason the rule exists in this form:
First, buying a notice buys a box, and the box is the whole of what it buys. Whether a story runs, what it says and where it sits are not on the rate card, and the pipeline that selects and writes stories has no input for one. That is checkable rather than promised: the clustering and writing stages read items from the signal store, and the notice data never enters that path.
One thing on the rate card is coverage, and it is the hardest case this rule has. The Tool Review: a week with your tool, and the desk writes what it found. Three terms, printed on /bid and repeated here because a reader has as much interest in them as a buyer. The desk writes it, and there is no round of notes on the verdict. The subject reads it before anybody else and decides whether it runs. And a review that runs carries a line saying it was paid for and that the subject saw it first, in the piece, next to the verdict.
The middle term is why the disclosure has to be fuller than a notice's. A subject who can stop a review can stop an unfavourable one, so a paid review a reader sees is one its subject was content with. That is a real limit on what it is worth as evidence, it is not something a reader can work out for themselves, and a line at the foot of a rate card is not where they would find it. It goes in the piece. A review the paper writes off its own wire carries no such line, and none of this constrains it.
Second, there is one placement we are deliberately not selling yet, and this rule is why. The Underwrite would put a line under the Sweep Report naming who paid for the machine time that read the day's sources - sponsoring the method rather than any story, which is how public radio has always done it. It is listed on the rate card as not for sale. Selling a position that attaches a name to the paper's own process needs more thought about disclosure than a box at the foot of the page does, and a rule written afterwards is a rule written to fit a payment.
If you spot a story that should have carried a disclosure and did not, that is a correction like any other, and it goes to /corrections with the original left intact.
What we don't do
No paywall, and no padding on thin news days. A four-item edition is honest; a padded one is slop.

