Measured 2026-09-08 · one URL, four tools
Three readers returned the words. None returned the design.
We ran the same page, https://stripe.com, through three web-to-markdown tools and our
own decoder on one day, and counted what came back. Every cell below carries the method that produced
it and the date it was run, because a comparison table without those is just an advert.
What came back from one page
| Tool | Words | Colours | Custom properties | Font stacks | Radii |
|---|---|---|---|---|---|
| Jina Reader | 856 | 0 | 0 | 0 | 0 |
| Firecrawl | 2,743 | 1 | 0 | 0 | 0 |
| Neo Reader | not measured | not measured | not measured | not measured | not measured |
| CSS Crèmeus | 1,965 | 12 | 330 | 6 | 8 |
- Jina Reader
curl https://r.jina.ai/https://stripe.com
Returned clean article markdown with a title and source header. No stylesheet is parsed, so no design value appears in the output. - Firecrawl
POST https://api.firecrawl.dev/v1/scrape, no key, formats:["markdown"]
Answered without an API key and returned more of the page than Jina, including navigation. The single colour is a literal inside the page text, not a measured token. - Neo Reader
GET https://api.neoreader.dev/https://stripe.com
Could not be measured. The API answers HTTP 401 with "Authentication required" to every request without an account, so no comparable output was obtainable. Recorded as not measured rather than guessed. - CSS Crème
GET https://csscreme.com/api/decode-url?url=https://stripe.com
Reads the served HTML and every stylesheet it links to. The word figure is every visible word served, not a cleaned article, which is why it sits between the two readers rather than beating them.
The word column is not a ranking. Each tool makes a different and defensible choice about navigation, footers and boilerplate, and ours counts every visible word served rather than a cleaned article. The four columns to its right are the comparison.
Counted in full, that page declared 366 design decisions: 330 named design tokens, 12 distinct colours, 6 font stacks, 8 corner radii, 10 spacing steps. Every markdown tool above returned none of them. See the Drop Report for this page.
Capabilities, each with its check
| Jina Reader | Firecrawl | Neo Reader | CSS Crème | How and when | |
|---|---|---|---|---|---|
| Returns the page's text | Yes | Yes | Yes, per its docs | Yes, counted not cleaned | Called each public endpoint on the same URL 2026-09-08 |
| Returns declared design tokens | No | No | No | Yes, 330 on this page | Counted custom properties in each tool's output 2026-09-08 |
| Returns measured colour, type, radii, spacing | No | No | No | Yes | Counted in each tool's output 2026-09-08 |
| Works with no account | Yes | Yes, unauthenticated scrape answered | No, HTTP 401 | Yes | Called each endpoint with no credential 2026-09-08 |
| Executes JavaScript | Partly, per its docs | Yes, per its docs | Yes, per its docs | No, and it says so | Vendor documentation for the first three; ours is stated on every result 2026-09-08 |
| Says when a page is a JavaScript shell | Not in output | Not in output | Not in output | Yes, with the evidence | Inspected each tool's response fields 2026-09-08 |
| Fingerprints the result so drift is detectable | No | No | No | Yes | Inspected response fields; ours is the Fingerprint line 2026-09-08 |
| Verifies a saved copy against the live site | No | No | No | Yes, verify_design_md | DESIGN.md set teardown, five sources checked 2026-09-03 |
| Free MCP server, no key | No | No | Server yes, calls need a key | Yes | tools/list and tools/call against each server 2026-09-08 |
| Price for 100,000 pages a month | Not measured | $83, per its own pricing page | $79, per its own pricing page | Free | Read each vendor's published pricing page 2026-09-08 |
Rows marked "per its docs" were read from the vendor's own documentation rather than measured by us, and say so. We do not execute JavaScript, so we cannot verify another tool's rendering claim by running it, and we will not assert what we did not test.
One correction, in a rival's favour
Neo Reader's homepage bills Firecrawl at a "5x credit multiplier for JS rendering", taking a $83 plan to $415.
Firecrawl's own pricing page states "1 credit = 1 page on a basic scrape, crawl, or map." No JS-rendering multiplier appears on it. Checked 2026-09-08.
We have no stake in defending Firecrawl. We have a stake in not repeating a number we did not check, which is the only reason this table is worth reading.
Why this matters if you are building with an agent
Markdown is the right format for reading a page and the wrong one for rebuilding it. An agent handed only reader output has the prose and none of the system, so when you ask it to build something that matches, it invents a visual system: colours that were never on the page, a type scale that does not exist, spacing off any grid. The failure looks like the agent being bad at design. It is the agent being given a document with the design removed.
The fix is not to stop using readers. It is to hand over both layers: the text from whatever reader you like, and the design as a DESIGN.md the agent can follow. Ours is free, needs no account, and is callable over MCP.
Questions
Is this table fair to the other tools?
It is accurate, which is a stronger claim. A markdown reader is not trying to return design tokens and is not bad at it; it was built for a different job. The table exists because people feed reader output to agents that then write UI, and at that moment the missing design layer becomes the buyer's problem rather than the reader's.
Why is the word count not a ranking?
Because each tool makes a different, defensible decision about navigation, footers and boilerplate. Jina returned a cleaned article, Firecrawl returned more of the page including navigation, and ours counts every visible word the server sent. Comparing those as if higher were better would be the kind of unsourced claim this page exists to avoid.
Why is one column marked not measured?
Neo Reader's API answers HTTP 401 to any request without an account, so no comparable output could be obtained. Recording that as "not measured" is the honest cell. Filling it in from their marketing page would break the rule that makes the rest of the table worth reading.
How do I reproduce these numbers?
Every row prints the command or method that produced it and the date it was run. All four calls were made against https://stripe.com on 2026-09-08. Ours is GET https://csscreme.com/api/decode-url?url=https://stripe.com, which is free and needs no key, so you can check our column right now.
Will these numbers go stale?
Yes, and that is why each row carries its own date rather than the page carrying one. Prices change, endpoints gain and lose authentication, and a site redesign moves our own token count. A dated row can be re-checked; an undated table cannot.
Next: measure your own page · scan a whole site · DESIGN.md vs tokens vs Figma vs registry