Test bed
next.jsseo.dev is the research test surface. Not human-readable content — a research instrument used to measure how bots and LLM fetchers see different JavaScript content patterns.
Architecture
The test bed is a Next.js 15 application deployed on Cloudflare Pages. Every URL maps to one cell in the experimental matrix:
/{mode}/{js_content_pattern}/{page_type}
For example, /ssr/js-fetched/article is an article page using Server-Side
Rendering for the page shell but fetching the main body client-side after mount.
A crawler without JS execution gets the shell with a "Loading content…" placeholder
and no body text.
- 3 rendering modes:
ssr(primary baseline),csr(negative control),ssg(sanity check) - 8 JS content patterns: see methodology for details
- 5 page types: homepage, article, category, product, search
- 55 cells total (40 SSR + 10 CSR + 5 SSG)
Try it yourself
Open these URLs in a browser, then view the HTML source (Ctrl+U / Cmd+Option+U). The contrast between server-rendered HTML and what the browser eventually displays after JS execution is the experimental signal.
Pattern axis — 8 patterns, same page type (homepage)
- /ssr/clean/homepage — baseline. All content in initial HTML.
-
/ssr/js-images/homepage
— view source:
<img>has nosrcattribute. React 19 omits the empty value entirely. Bot without JS sees the tag but no image source. -
/ssr/js-links/homepage
— navigation is
<button onclick>not<a href>. Bots can't follow the link target. - /ssr/click-reveal/homepage — view source: main body absent. Server sends a "Show featured content" button. Body only renders after user click.
- /ssr/js-fetched/homepage — view source: main body says "Loading content…". Real body fetched from /api/content after mount.
-
/ssr/hash-routing/homepage
— navigation uses
#/pathfragments. Each fragment route is not crawlable as a separate page. - /ssr/late-loaded/homepage — methodology section gated by IntersectionObserver. Bots don't scroll, so they don't trigger it.
- /ssr/mixed/homepage — 4 patterns composed: js-fetched featured + js-images hero + js-links nav + late-loaded methodology.
Page type axis — 5 page types, same pattern (clean)
Rendering mode axis — clean pattern across modes
- SSR / clean — primary baseline
- CSR / clean — negative control. View source: empty shell, no main content. Content only after JS hydrates.
- SSG / clean — sanity check vs SSR baseline (hypothesis H1).
- CSR / mixed — realistic worst case combining CSR mode with 4 antipatterns.
Full 55-cell list: next.jsseo.dev/sitemap.xml. Project root with curated link list: next.jsseo.dev.
Why the test bed is hidden from search
next.jsseo.dev/ root carries robots: noindex so it doesn't
compete with this landing for "JS SEO Lab" queries. Cells themselves are crawlable
(sitemap submitted to GSC and Bing WMT) — they need to be discoverable by bots for
the experiment to work. Only the root project index is noindexed.
Content on every cell is auto-generated for research purposes and is not authoritative on any topic. The content strategy doc explains the production workflow.
What gets recorded
Every request to a cell is captured by the three-layer tracker. The aggregated view lives at /dashboard; the raw data is open in the repo under data/.