Lighthouse 13.4.1 · 2026-08-18

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.

SitePerfA11y Best pr.SEOTBT ms
hi-daniel.com84100100100289
increase.com65945892170
stripe.com549658921028
column.com45777385484
linear.app4082881001033

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
PageSpeed Insights · mobile

Moto G Power, Slow 4G

Emulated Moto G Power, Slow 4G, 4x CPU throttle. Google’s hardware, not mine.

Mobile · categories

Performance89
Accessibility100
Best Practices100
SEO100
Agentic Browsing2/2

Mobile · metrics

First Contentful Paint2.6 s
Largest Contentful Paint2.8 s
Total Blocking Time80 ms
Cumulative Layout Shift0
Speed Index4.6 s
PageSpeed Insights · desktop

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

Performance70–97 across 3 runs97
Accessibility100
Best Practices100
SEO100
Agentic Browsing2/2

Desktop · metrics

First Contentful Paint0.4 s
Largest Contentful Paint0.5 s
Total Blocking Time140 ms
Cumulative Layout Shift0.001
Speed Index1.0 s
What produced each number

Six decisions, each with a before and after

Total Blocking Time 80 ms, mobile

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 removed
Total Blocking Time 300 ms → 100 ms

The 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 directions
Accessibility 100, both form factors

Tab 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 pages
Homepage weight 2,350 → 1,053 KB

The 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 deviation
Third-party requests 0

Fonts 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 KB
Crawl 0 defects, 70 pages

Titles, 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