This site against Stripe, Linear, Column and Increase
Lighthouse 13.4.1, mobile preset, homepage of each, one machine, one afternoon. Single runs: performance is noisy, the other three are not.
| Site | Perf | A11y | Best pr. | SEO | TBT ms |
|---|---|---|---|---|---|
| hi-daniel.com | 84 | 100 | 100 | 100 | 289 |
| increase.com | 65 | 94 | 58 | 92 | 170 |
| stripe.com | 54 | 96 | 58 | 92 | 1028 |
| column.com | 45 | 77 | 73 | 85 | 484 |
| linear.app | 40 | 82 | 88 | 100 | 1033 |
column.com is the site this one’s design language comes from. Competitor scores change. If a row overtakes mine, the next run says so.
Run it yourself on PageSpeed Insights →Moto G Power, Slow 4G
Emulated Moto G Power, Slow 4G, 4x CPU throttle. Google’s hardware, not mine.
Mobile · categories
Mobile · metrics
Three runs: 70, 83, 97
Emulated desktop, custom throttling, no CPU slowdown. Same run, same day. Identical code each time. Performance moved 27 points; the other four categories did not move at all. The spread is the number, not the best of the three.
Desktop · categories
Desktop · metrics
Six decisions, each with a before and after
The hero background is a full-viewport WebGL shader. It now reads WEBGL_debug_renderer_info and falls back to the static gradient on SwiftShader, llvmpipe and Microsoft Basic Render. Software rasterisation costs 65 ms a frame on the CPU, so a GPU-less machine got 15fps and a pegged core. Six of the desktop run’s seven long tasks were this one file.
687 ms of script time removedThe 50 scripts sit before </body> and carry no defer, deliberately. defer pushed their execution past First Contentful Paint, which is where blocking time is counted. A/B on production: with defer, 300 ms and 83; without, 100 ms and 90. It cost 0.3 s of FCP. TBT weighs 30 in the score, FCP weighs 10.
measured both directionsTab panels are on <section>, not <article>: ARIA in HTML allows an article six roles and tabpanel is not one. Touch targets reach 24 px through a pseudo-element, not a transform, which grows a button past its own box and overlaps its neighbour. Inactive slides are inert, not aria-hidden, so they leave the tab order instead of staying focusable while unannounced.
0 axe violations, 70 pagesThe halftone engine samples Rec.601 luminance and nothing else, so every colour channel in its source images was decoded and thrown away. Re-encoded as 8-bit greyscale, reproducing the engine’s own alpha-threshold rule, verified byte-identical on the luminance it reads. 111 files, 7.87 → 2.81 MB. Vendor logos draw at 16–20 px; one was a 204 KB multi-resolution .ico.
zero pixel deviationFonts came from two external origins whose stylesheets pointed at a third, so first paint waited on a four-hop chain: 258 ms to the CSS, 813 ms to the last font. All seven faces are self-hosted and subset. Newsreader is used by one rule at italic 500 and was shipping as a variable font with weight and optical-size axes.
Newsreader 143.6 → 24.2 KBTitles, descriptions, canonicals, Open Graph cards and JSON-LD are generated from the filesystem, not written by hand, so they cannot drift from the pages they describe. Six deterministic gates run before every deploy and fail it on a regression.
2,855 internal links, 0 broken