Changelog
Every change to the model, the data behind it, or what this site claims about a number — dated, in plain language, newest first. Entries are append-only: if one turns out to be wrong the correction is a new entry, never a quiet edit. Where a fix changed a published figure, the entry says so, because the useful question is whether it changed YOURS.
- Site
Company pages now say what kind of story a headline is, and who decided that
Under the headline list on a company page there is a second panel: up to three of the same headlines, each with one sentence saying what that KIND of story does to a valuation — what a rate decision does to a discount rate, what a quarter changes and what it does not. Two things about it are worth stating plainly. Every one of those sentences was written by a person and reviewed before it shipped; there are seven of them, they are the same every time, and nothing generates new ones. And the panel says who sorted the headlines into those seven kinds: it currently reads “Grouped by topic”, because that sorting is done by matching the headline against a fixed list of phrases, with no AI involved. If a headline does not clearly match one of the seven — or matches two — it is shown with no sentence at all rather than the nearest one, and the panel prints how many of the stories it could place. A panel of three headlines with one explanation is the normal case, not a fault.
- Data
A company page could show another company's headline as the reason its price moved
The “Why did it move?” section names the most recent headline it can see, as context for a day's price move. It was reading the raw feed our news provider returns for a ticker, and that feed answers a different question from the one we were asking it: it returns everything TAGGED with a symbol, which includes sector round-ups, multi-company comparison pieces and stories about competitors. Taking the newest of those hands a reader another company's story under this one's name. Measured on Uranium Energy (UEC) on 23 August: the page said the most recent headline it could see was “Energy Fuels: The Largest Combined Uranium And Rare Earth Company In North America” — Energy Fuels is a different, competing company — printed beside Uranium Energy's 14.4% move. The headline panel on the same page, on the same request, had already filtered that story out as not being about this company; the two surfaces disagreed because only one of them applied the check. Anyone who read that line and took it as a hint about why the price moved was reading about the wrong business. Now every surface that attributes a headline to a company — the move explanation, the tone read across recent coverage, the research memo's calendar, and the headlines shown under your own watched names — goes through one function that fetches and filters in a single step, so the check cannot be skipped by a caller that forgets it. Where nothing in the recent window actually names the company, we now show no headline at all rather than the closest one, which is the same rule the rest of the site follows: no answer beats a confident wrong one.
- Site
The free Apple page was locking the two sections we promise are open on it
One company — Apple — has every paid section open to everybody, permanently, so the paid product can be checked before it is paid for. That promise is on /pricing, on /about and on the page itself. The app was not keeping it. Logged out on Apple, thirteen of the fourteen paid sections opened as promised and two did not: the year-by-year DCF showed a lock card, and the downloadable workbook showed a locked button — over a file that a logged-out request could in fact download, because the server had been honouring the promise the whole time. The compact "Go deeper with Pro" strip was also being drawn on that page, which is the one page a reader is sent to INSTEAD of upgrading. The two locked sections are the year-by-year cash-flow model and the workbook, which are precisely the two the "check our work" argument rests on, so the failure landed on the exact reader who had come to check. Anyone who looked at the free Apple analysis and concluded the site would not show its model without payment saw a real lock and drew a fair conclusion from it; it was wrong, and it is fixed. Every other company gates exactly as before — verified on both, before and after. Also corrected on the same day: the marketing pages for the portfolio and for pricing described a free tier thinner than the one that exists, and the portfolio page implied the portfolio-wide fair-value gap was free when it is not. Both now state the split as it is, including the ten-holding free cap and the guarantee that going over it never deletes a holding.
- Model
The stocks list stops calling a deliberate through-cycle valuation a mistake
Correcting the memory and storage caveat left the two surfaces explaining the same number two different ways. The company page now says these are cyclical businesses valued on mid-cycle economics, where the gap to today's price is mostly a disagreement about where in the cycle we are. The /stocks list still said 'our model understates this one' beside the same figure — which implies our number came out too low by accident, when for these companies it is deliberately through-cycle. Micron's own assumption note calls today's margin 'a once-in-history peak. Faded HARD to ~22% through-cycle.' The list now says 'our model values this mid-cycle' for those rows, and keeps the understatement wording for the genuinely fast-growing companies it was written for, where it is accurate. Same predicate, same explanation, both places.
- Model
The memory and storage companies now say why their fair value sits so far below the market — and the reason we were giving was the wrong one
Nine of the fifteen hand-researched companies are memory or storage makers, and every one of them models out at 84–95% below its market price. That number has always been flagged as a limit of the lens rather than a verdict, but the explanation printed beside it described a different model from the one used. It said our model 'holds margins flat while fading growth toward a long-run rate' — true of the automatic lens it was written for, and the exact opposite of these forecasts, which fade margin hard and model an outright down-cycle. Micron's forecast takes operating margin from 45% to 22% and carries a year where revenue falls 30%; its own assumption note reads 'a once-in-history peak. Faded HARD to ~22% through-cycle.' A reader checking that against the assumptions table printed directly below found the two contradicting each other. It also called a 245% year-one revenue figure 'growing revenue at about 245% a year', when that is a trough-to-peak base year on a memory cycle and not a growth rate at all. These pages now say what the forecast actually does: a cyclical business trading near a cyclical peak, valued on mid-cycle economics, where the distance to today's price is mostly a disagreement about where in the cycle we are rather than a measurement of how overvalued the shares are. The same correction fixed a second case in the other direction — Spacecraft's margins RISE across its forecast, 26% to 40%, and it was being told they were held flat by an 'automatic' model that never touched it. Separately, the caveat that /stocks prints beside these numbers had been shipped but was not appearing: the index read that flag only from a six-hourly cached snapshot, and a snapshot written before the flag existed made every row look fine. It now reads the live figure for researched companies, so the list cannot lag the company page.
- Site
The pricing page and every upgrade prompt now describe the wall that exists
Four things came down off the paywall over the past fortnight — the screener's advanced filters, the macro calendar, watchlists and the basic portfolio tracker — and the sales copy did not move with them. That produced errors in both directions and both are corrected here. The OVERCLAIM: /pricing listed "advanced filters" as a Pro unlock, and the screener's own upsell strip read "Advanced filters + CSV export are Pro", for a feature every account already had. Worse, the app still drew those filter inputs greyed out and disabled, so a free account was being refused a filter the server would have run for it. The UNDERCLAIM: "what stays free" never mentioned the screener, a watchlist, a ten-holding portfolio, the market calendar, ten years of filed financials or the live discount-rate slider that every public company page carries — so the free tier read as far thinner than it is. What Pro is SOLD as changed too: the line repeated at every locked section promised "the full DCF, every number, the memo and all models", which is the reasoning, and the reasoning is free on every company page. It now names what Pro actually does — edit the model, run the whole screen, stress-test a portfolio, download the workbook. Two smaller corrections: "unlimited company pages, no meter" now says which meter does exist (a ticker we have not modelled yet is valued live, five a day), and a free screen that returns more matches than it shows now says so — ten rows used to appear under a count reading "247 matches" with no explanation of the other 237.
- Site
The About page now leads with independence and standards, not its author
The old /about opened with "one person, no funding" — true, and framed as an apology, which invited a reader to discount every number on the site before checking one. The rewrite changes emphasis and order, not facts. The page now opens with what the site is, the independence argument (nothing for sale but a subscription — no advertisers, sponsors, order flow, affiliate links or distribution deals), and the editorial rules every page can be held to. The ownership disclosure survives in full under its own heading, "Ownership and funding": one person, named; self-funded, no outside capital, no financial-industry credentials; and the costs of that structure — narrower coverage, one person's pace, no compliance department. Nothing was added that was not already true, and nothing true was removed.
- Data
Seven dead non-US listings retired from search and from the nightly warm
TATAMOTORS.NS, ZOMATO.NS, CRH.L, ROO.L, ROG.SW, ELET3.SA and JBSS3.SA no longer resolve at our market-data source — every request for them returns "quote not found", so the best page any of them could produce was a refusal, and searching for one handed a reader a link to a dead end. They are retired: no longer offered in search, no longer in the sitemap, and no longer re-attempted by the nightly job that pre-computes valuations (which retried them every night indefinitely, because a failure is deliberately left unrecorded so that a temporary outage gets another try). Each entry is a statement about the SYMBOL, not the company: all seven businesses still exist, and where our directory already carries the live listing, searching the company name now finds it — "CRH" and "JBS" return their US listings, "Tata Motors" returns the two post-demerger NSE lines. Anyone already tracking a retired ticker keeps it, with its company name and currency intact.
- Data
A cached company page could outlive the freshness it promises, and a database blip could hide a page from Google for six hours
Two follow-ons to the 14 August caching fix, both found while investigating a report that the Apple page was serving a five-day-old render. (1) The lifetime of a cached page was decided when the page was BUILT and then trusted for that whole window. A page built overnight is a closed-market page and gets six hours; served unchanged, it was still on screen well into the next trading session, where the stated lifetime is ten minutes. The age is now re-checked against the clock that is running at the moment the page is served, so a render that has outlived the current session's lifetime is dropped and rebuilt rather than handed over. (2) Whether a page asks Google to index it depends on coverage metadata read from the database. When that read fails the page correctly errs toward `noindex` — but it was then cached with that guess for the full six hours, so one momentary database blip could take a filing-sourced page out of the index for a working day. A page whose indexing decision was made without the evidence is now held for one minute instead. Every public page also now reports how old the served render is (`X-Render-Age`), so 'this page is stale' can be checked rather than inferred. No page's numbers change as a result; the numbers arrive sooner, and a page hidden from search by a blip recovers in a minute.
- Model
A company our cash-flow model doesn't fit can no longer be graded A
Follow-on to the confidence change below. Once the DCF stopped dragging the blend, NVIDIA's score rose to 63 and its grade to A — at MEDIUM confidence, under a headline saying our cash-flow model doesn't fit the business. Awarding our top grade off the remaining lenses, one line below telling the reader our preferred lens is out, is the same overclaim in a different place. So a model flagged as understating its company now holds the grade at B, the way low confidence already held it, and the card, the share card and the methodology page all say which of the two caps applied and why. NVIDIA reads B, 63/100, "Grade held at B: our cash-flow model doesn't fit this business, so we won't award our top grade off the remaining lenses." Also: the /stocks table no longer labels a company whose fair value we deliberately withheld as "Not modeled yet" — it says "No single fair value" and counts it as a decision; and the interactive page's "Live data unavailable / Backup data source" banner now follows the price actually on screen, appearing and clearing as the feed does rather than being decided once at first paint.
- Model
Confidence labels now follow the evidence, and an understated DCF no longer drags the fair value it sits beside
Found on the NVIDIA page: a fair-value range of $60 to $278 — the top 4.6x the bottom — captioned HIGH CONFIDENCE, above a headline calling the stock expensive against our estimate, above a note saying the low DCF figure was a limit of our model rather than a finding. Three things were wrong and each is changed. (1) The score's confidence tier could not fall below HIGH on lens disagreement alone: any disagreement past 60% of the midpoint cost the same flat deduction, and complete data covered it. The deduction now grows with the disagreement, a range wider than its own midpoint is at most MEDIUM, and one spanning twice its midpoint is LOW (a band, not a point). GOOGL and KO move from HIGH to MEDIUM under this rule; AAPL and MSFT do not move. (2) When our automatic DCF is known to understate a company — the fast-grower case the page already caveats — that DCF is now shown beside the range as a labelled reference and is no longer blended into it, so the fair value, the score's price-vs-worth pillar, the forward estimate and the memo all lean on the multiples lenses the caveat told readers to lean on. NVIDIA's published fair value moves from $163 (27% above) to $208 (8% above) as a result; the caveat text was rewritten to say what is now actually done. The same fit verdict caps score confidence, forward-estimate confidence and memo conviction at MEDIUM and is listed as the reason. (3) The score's headline for such a company no longer says it "isn't cheap against our estimate of what it's worth"; it says it is priced richly against peers and that we don't call it overvalued, because our cash-flow model doesn't fit it. Also in this change: the public company page and the FAQ answer Google shows now print a range and a range verdict when the lenses are too far apart to state one number (they used to print the midpoint anyway); the head-to-head compare pages now use the same published number and the same refusal gate as each company's own page (they printed the raw DCF, and published DCF verdicts for bank pairs whose own pages decline to); the share card and the undervalued screens no longer call the blended fair value "the DCF"; the memo's conviction no longer reads high when an input is missing; the forward estimate's label is capped at MEDIUM when its own bear-to-bull band spans more than 2.5x; and the home page's S&P 500 coverage sentence now states every tier, so the counts add up to the total.
- Data
The public company pages could show yesterday's closing price all day
Each /stocks/<TICKER>/intrinsic-value page is rendered once and then cached. The cache held the whole page for six hours regardless of the time of day, and the page was sent with a header that let a browser keep its copy for another hour on top — so a page built before the opening bell could still be showing the previous close nearly seven hours into the trading session, with the gap to fair value and the verdict computed from it. On 14 August the Apple page read $305.26, exactly the previous close, while the site's own quote endpoint returned $306.24 for the same second. Nothing on the page could correct it: these pages carry no code that re-reads the price. Three changes: the cached copy now lives ten minutes while the New York market is open (thirty in pre/post-market, six hours when it is closed, which is when nothing moves); the browser is no longer told to hold a copy for an hour, and never across the opening bell; and the price cells now refresh themselves from the same delayed quote feed the interactive app uses, once a minute while the tab is open. The pages stay fully server-rendered — the price is still in the HTML for anyone, or anything, that does not run JavaScript. Non-US listings are unaffected by the refresh, because the free quote feed behind it only covers US-listed symbols, and a price in the wrong currency is worse than one a few minutes old.
- Data
The market calendar was a day ahead every evening
The forward calendar dated itself in UTC while every date on it is a US federal release date published in Eastern time. The UTC date rolls over at 8pm Eastern, so for four hours of every day the page was a day ahead: on the evening of 11 August it announced the July CPI print as happening "today at 08:30 ET", eleven and a half hours before it existed, and events that really were that day's dropped out of "What matters today" at 8pm rather than at midnight. Anyone reading the calendar after dinner saw tomorrow labelled as today. It now dates itself in New York, with the daylight-saving rules, so it is right in both EST and EDT. Separately, "What matters today" could not tell a print that had already happened from one still to come — it read identically at 6am and at 4pm — and now says when a number is out. It still does not say what the number WAS: actuals and consensus sit behind a paid feed this site doesn't buy.
- Model
The reverse-DCF stops quoting a figure it can't support
The reverse-DCF solves for a single variable — one flat revenue growth rate — holding margins, capital intensity and the horizon fixed. When a price sits far above our fair value the solver has nowhere to put the difference except growth, so pages printed things like "the market is implying roughly 31.9% annual revenue growth". That was an artifact of the solve, not a measurement of the market, and the one-decimal precision claimed an accuracy the method doesn't have. Above about 25% a year we now say the price implies growth the model can't reconcile, and explain why, instead of quoting a number. The underlying solve is unchanged and still available in the Pro read-out.
- Site
Only pages with reported work behind them ask to be indexed
Every one of ~1,300 company pages previously asked search engines to index it, including the auto-modeled tail — the same template around figures a market-data feed supplied, with no filing read. Those pages are now "noindex, follow": still reachable, still linked, no longer submitted. The sitemap was filtered to match, since advertising a page that asks not to be indexed is a contradiction. Hand-researched and filing-sourced pages are unaffected. Nothing was removed from the site — this changes what we ask of search engines, not what a reader can open.
- Data
A market-data outage now shows dated values instead of blanks
Every price, beta, market cap and share count came from one library that fails by returning nothing rather than by raising. The site's rule against inventing numbers then turned that into blank cells across whole pages. Fetches are now retried, the last good values are kept and served WITH THEIR AGE behind a visible "live data unavailable" notice, and a backup price source sits behind the primary one. Valuations are built from filings and were never affected by this; only the current-price line was.
- Site
Coverage depth is published on every row
A model whose base year was read out of a company's own SEC filing and one built from a data vendor's figures because there was no filing to read are not the same claim, and the site was presenting them identically. The /stocks index now states the tier — hand-researched, filing-sourced, auto-modeled, or not modeled yet — on every row, and the refusals carry their reason. Nearly every non-US listing sits in the thinner tier, which is now visible rather than something a reader had to infer.
- Site
Real pricing and about pages
What the site costs and who runs it were not answerable anywhere a search visitor would land. Both now exist as their own pages and are linked from every footer.
- Model
A pence quote can no longer land on a pounds model
The London Stock Exchange quotes in pence while company financials are reported in pounds. The site was reading the quote without converting it, so a 3,302p price was compared against a model built in pounds — a 100x error. Shell's modelled upside inverted and BP's fair value cleared an implausibility check it should have failed. Sub-unit currencies (GBp, ZAc, ILA) are now normalised once, field by field, before any number is read off them. If you saw a UK, South African or Israeli listing's valuation before this date, it was wrong and is now corrected.
- Model
The reasons we decline to value a company were corrected
When the model refuses to publish a fair value — a bank, a REIT, a rate-regulated utility, or a result too far outside a plausible range — the page states why. Several of those stated reasons did not match the check that actually fired, which is a worse failure than a bare refusal: it invites a reader to argue with reasoning that was never applied. The reasons now name the check that ran.
- Model
One current price per page, with the time it was taken
A single company page could print four different "current" prices at once, each individually defensible and the combination indefensible — the hero, the chart header, the fair-value gap and the model's own comparison all read from different caches. Every surface now resolves one price, and the page carries the timestamp it was taken at. The over- and under-valued wording was corrected in the same pass, and the assumptions table now labels each input with where it actually came from rather than crediting a live market feed for our own house constants.
This log begins on 10 August 2026, the day the site's first external audit was worked through. It deliberately does not reach further back: a changelog reconstructed after the fact from memory is the kind of artefact this page exists to be the opposite of. Changes from here are recorded as they ship.
Educational DCF estimates from public filings and market data — not investment advice.