Announcement
30 days, 105 pages, one thesis
A complete recap of the WebVitals.tools launch month: every section we shipped, every benchmark we ran, every milestone we hit -- and where we are taking the project next.
Thirty days ago, on April 4, 2026, we shipped a five-page proof of concept: a homepage, the Largest Contentful Paint guide, one Next.js LCP fix page, a blog index, and a single launch post. The original plan called for 80 pages by the end of the month. Today, with the publication of this recap, the site stands at 105 published pages, organized into 16 sections, with no thin content, no missing analytics, no broken canonicals, and no JSON-LD gaps.
This post is the official wrap-up of the 30-day plan. We will walk through what shipped, what we measured, what we learned, and what month two looks like. If you only have a minute, jump to the what comes next section -- otherwise, read on.
The thesis we tested
Web performance content on the open web is dominated by two extremes. On one end: shallow listicles that recycle the same ten tips and never link to first-party data. On the other: deep but narrow vendor blogs that stay inside one stack. The thesis behind WebVitals.tools is that there is room for a third option -- a single, comprehensively cross-linked reference site that takes the data seriously, names specific frameworks and hosting providers, and gets refreshed on a published cadence.
To test that thesis, we set ourselves a constraint: ship one substantial improvement every day for thirty days, and never publish a page that fell below the per-page checklist in our public contribution guide. Every page had to clear: 500-plus words of original body copy, full Open Graph and Twitter Card metadata, JSON-LD schema appropriate to its type, breadcrumb navigation, three or more internal links, the canonical URL on the production domain, and the Vercel Web Analytics snippet. Anything less did not ship.
What shipped, by section
The site grew along five tracks: deep guides, programmatic fix pages, long-form blog posts, hands-on tutorials, and tools. Below is the final tally, with links into each hub.
Guides (8 pages)
Four metric guides plus four best-practices guides form the conceptual backbone of the site. Every other page on WebVitals.tools links into at least one of them.
- Largest Contentful Paint guide -- 2,400 words, sticky table of contents, six-step optimization playbook.
- Cumulative Layout Shift guide -- root causes, identification tooling, and per-cause remediation patterns.
- Interaction to Next Paint guide -- the metric that replaced FID, with detailed long-task and main-thread guidance.
- Time to First Byte guide -- TTFB targets, measurement methodology, and origin-side fixes.
- CSS performance, JavaScript performance, Image optimization, and Font loading -- the four cross-cutting best-practices guides.
Fix pages (57 pages)
The fix hub is the largest single section on the site. Each fix page targets one combination of metric and stack, and follows the same shape: symptom, root cause, identification steps, the fix in code, regression prevention, related reading.
- Framework fixes (38): LCP, CLS, INP, and TTFB recipes for Next.js, React, Vue, Angular, Gatsby, Nuxt, SvelteKit, Astro, and Remix. Browse the full fixes index.
- Hosting fixes (7): Vercel, Netlify, Cloudflare, AWS, Fly.io, Railway, and shared-hosting playbooks for TTFB and edge cache misses.
- Issue fixes (6): targeted patterns for render-blocking resources, third-party tags, hero images, web fonts, layout shift culprits, and long input handlers.
- CSS-specific fixes (6): critical CSS, content-visibility, composited animations, container queries, scroll-driven animations, and view transitions.
Blog (19 posts)
The blog covers analysis, comparisons, case studies, and roundups. Standouts include the April 2026 CWV snapshot, the CDN comparison, the static vs SSR analysis, the 60% LCP reduction case study, and yesterday's Best of Q1 2026 roundup. Browse the complete blog index.
Tutorials (5 pages)
Hands-on, screenshot-rich walkthroughs that take a reader from zero to a working setup: Lighthouse audit walkthrough, Chrome DevTools Performance panel, WebPageTest guide, and real user monitoring setup.
Tools, glossary, FAQ, and resources
Three interactive utilities live under /tools/: a Core Web Vitals checker, a performance budget calculator, and a one-shot CrUX lookup. The glossary defines 46 web performance terms with rich-result-eligible DefinedTerm schema, and the FAQ hub answers the questions teams ask before they start optimizing.
Benchmarks dashboard and the credibility set
Two of our latest sections close the loop on transparency. The benchmarks dashboard publishes monthly Core Web Vitals pass rates by framework, CMS, hosting platform, and device, sourced from CrUX BigQuery, with inline SVG charts and a complete methodology section. Alongside it, four credibility pages -- About, Methodology, Changelog, and Contribute -- explain who builds the site, how we test, and how to push back on anything you read here.
Newsletter
The most recent addition is the monthly digest signup at /newsletter/. Plain-text email, no tracking, no rented lists. The first issue ships at the end of May.
The numbers
One reason we audit the site every day is that "what shipped" and "what is genuinely useful" are not the same number. Here is where things land at the close of day 30, measured against the per-page checklist:
- Total published pages: 105 (target was 80).
- Pages below 500 words: 0.
- Pages missing canonical, JSON-LD, or analytics snippet: 0.
- Pages with vercel.app references in canonical or Open Graph tags: 0.
- Pages with emoji: 0.
- Sitemap entries: 105, with last-modified timestamps current to today.
- Internal links across the site: roughly 2,300, with no orphan pages.
- JSON-LD types in use: Article, BlogPosting, HowTo, FAQPage, DefinedTermSet, Dataset, ItemList, BreadcrumbList, WebPage, Organization, Product (tools), and Event-type schemas where appropriate.
Three meta descriptions came in slightly over Google's typical truncation window during the audit and were trimmed today as part of the day-30 pass. Eighteen pages do not yet expose a FAQPage block; that is the most concrete improvement target on the month-two list.
What we learned shipping daily
Five takeaways from the month, in case you are running a similar program:
- A daily cadence forces the system to stay shippable. If the build is broken or the deploy script flaky, you find out the same day, not three weeks in. Every fix-page template change, every JSON-LD schema tweak, and every CSS regression got caught by the next-day cron rather than by a reader.
- Programmatic pages still need editorial care. The fix-page template is the same for every framework, but the actual code, the actual gotchas, and the actual benchmarks are not. Reusing structure is fine; reusing copy is not. We rejected three drafts for being too template-shaped.
- Internal linking compounds quickly. The first ten pages had to manually link into each other. By page sixty, every new page had at least four obvious neighbors -- a fix linked to the metric guide, the framework comparison, the relevant tutorial, and the tool. The site reads like a network now, not a ladder.
- Schema markup is non-negotiable. Search Console rich-result coverage was the single clearest leading indicator of search visibility in the second half of the month. Every page ships with the schema appropriate to its type, validated locally before deploy.
- Open data beats opinions. The benchmarks dashboard, the CrUX snapshot, and the framework comparisons drove the most external traffic. Posts that stated a strong opinion without numbers landed in the middle of the pack.
What comes next
The 30-day plan is now closed. The next 30 days lean into depth rather than breadth. Highlights from the public changelog and the month-two plan:
- Accessibility and performance crossover guides. Five new long-form pieces on how a11y patterns interact with INP, CLS, and font loading.
- Service workers and PWAs. A new tutorial track on offline-first patterns, navigation preload, and Workbox 8 defaults.
- Hundred more programmatic fix pages. Headless CMS fixes (Sanity, Contentful, Storyblok), e-commerce platform fixes (Shopify Hydrogen, Magento, BigCommerce), and meta-framework specifics (Astro islands, Qwik resumability).
- Weekly blog cadence. Slowing the blog from daily to weekly, with deeper data work behind each post.
- Backlink and partnership outreach. The site has the breadth to be useful as a citation; we will spend May making sure it gets cited.
- Benchmarks dashboard refresh. Monthly CrUX pulls automated end-to-end, plus a comparative track for frameworks shipped in 2026 (we will be watching Qwik and Solid Start closely).
- Newsletter launch. The first monthly digest ships May 31. Subscribe here.
You can follow along in real time via the changelog, and you can browse the complete human-readable sitemap for a full inventory of the 105 pages. Pull requests, corrections, and benchmark suggestions are welcome at the contribute page.
Thanks for reading
The single best thing about working in public is the email. We have already received methodology pushback (rightly), benchmark corrections (rightly), and a few wonderful "this saved my INP" notes (welcome). Keep them coming. The plan for month two is to keep doing the thing that worked: ship something useful every week, name specifics, link generously, and never publish a page that we ourselves would not bookmark.
If you have not already, the two best places to start exploring the site are the Best of Q1 2026 roundup and the benchmarks dashboard. From there, every page links to its neighbors. Thanks for reading -- see you in month two.
Related reading: Best of Q1 2026 · Benchmarks dashboard · Methodology · Changelog · Monthly digest
Frequently asked questions
How was WebVitals.tools built in 30 days?
We shipped one or more pages every day for 30 days using a single static HTML template, a shared design system (Cabinet Grotesk + Satoshi + JetBrains Mono on a navy and green palette), and a daily cron that audits, builds, deploys to Vercel, and submits URLs to Google. By Day 30 we had 105 pages live.
What was the most important lesson from the launch?
Cadence beats batch. Shipping one well-formed page a day with full schema, internal linking, and analytics outperformed any attempt to ship 5-10 pages at once. Google indexed our daily drops faster, and we caught regressions in the daily on-disk audit before they cost us impressions.
Did the daily audit catch real regressions?
Yes. The audit script flagged missing canonical tags, JSON-LD parse errors, descriptions over 160 characters, missing breadcrumbs, and broken internal links across the 30-day run. We fixed every flagged regression within the same day, which kept our zero-error audit streak intact.
What is the plan after Month 1?
Month 2 (May 5 to June 4, 2026) is metrics-driven: we read GSC search analytics daily and prioritize fixes based on impressions trends, CTR opportunities, rank-uplift candidates in positions 8-20, and content gaps from newly ranking queries. The shipping cadence drops to one to three pages per weekday, with Friday long-form posts and Saturday surgical fixes.