Spokes.wiki Search About

Log

Append-only history. Each entry: ## [YYYY-MM-DD] <op> | <title> where <op> is ingest, query, lint, or split. Query with grep "^## \[" log.md | tail -5.

[2026-06-25] ingest | Strapi (open-source headless CMS)

Routed in by the hub router (Telegram msg 594, github.com/strapi/strapi). T2 (vendor/primary repo, volatile traction numbers). First concrete headless-cms product paged — prior coverage was the generic concept page. Created strapi (SoftwareApplication); sharpened headless-cms's SaaS-vs-git split into a three-way (API-SaaS / API-self-hosted / git) since Strapi is API-based and self-hosted, breaking the old binary; folded the "third hosting position / own-your-stack ≠ own-your-plain-files" point into synthesis. +1 page.

[2026-05-30] split | spoke created from hub _inbox cluster (5 sources)

Spun out by the hub router (../HUB.md) when five Telegram-delivered sources formed a clear static-site-generator cluster, past the ≥3 threshold and fitting no existing spoke (../webperf-wiki was the logged runner-up — adjacent at Core Web Vitals but narrower). Scaffolded from ../CLAUDE.template.md.

[2026-05-30] ingest | five static-site / web-publishing sources

Ingested together as the founding cohort:

[2026-05-30] ingest | Core Web Vitals: WordPress and Astro vs everyone else

Routed in by the hub. Added source core-web-vitals-wordpress-astro (SEJ, CrUX field data). Updated core-web-vitals (7-platform ranking + "page weight is not destiny"), astro (67%, 4th — independently corroborated, behind hosted builders), wordpress (49%, last of 7). Synthesis: partially resolved the neutral-benchmark question, refined the "Astro leads" claim, and flagged a cross-wiki contradiction with ../webperf-wiki (architecture vs. byte-budget minimalism).

[2026-05-31] lint | health check (URL-ingested sources, 11 pages)

Part of a hub-wide lint. Clean: no orphans, no broken links, ~7.3 links/page; @types good (ItemList for the awesome-lists, DefinedTerm/SoftwareApplication/WebPage elsewhere). Findings: (1) self-identified concept gap stands — Hugo, Next.js, Gatsby, Jekyll, Docusaurus live only in the static-site-generator table and deserve their own pages (the meta-framework-vs-SSG boundary question hangs on this); (2) Eleventy's build-speed numbers are still self-reported — a neutral build benchmark would close that open question; (3) the page-weight vs. architecture contradiction with ../webperf-wiki is correctly flagged on both sides and needs a neutral tie-breaker, not a silent resolution; (4) note core-web-vitals is duplicated as a page in both this spoke and ../webperf-wiki — intentional (separate wikis) but keep the two consistent on re-ingest. No fixes applied.

[2026-05-31] ingest | 5 generator pages — Hugo, Next.js, Gatsby, Jekyll, Docusaurus

Follow-up to today's lint, which flagged these as mentioned-but-pageless. Created hugo, Next.js, Gatsby, jekyll, docusaurus as Thing pages (SoftwareApplication, not source: true — the tools are referenced by our sources, not ingested). Each is grounded in jamstack-generators-list (star ranks), awesome-static-generators (use-case descriptions), and the static-site-generator table; background framing (GraphQL layer, single Go binary, GitHub Pages history, MDX/versioning) is explicitly marked as general knowledge, and Gatsby's perceived decline is flagged as unsourced here (sources rank by cumulative stars, not trajectory). Wired inbound links by converting the bare names in the static-site-generator table, jamstack-generators-list, and awesome-static-generators into [[links]]. Updated index (SoftwareApplication group) and synthesis (resolved the "missing big names" open question; sharpened the build-only vs. React-meta-framework split — hugo/eleventy/jekyll vs. Next.js/Gatsby/docusaurus).

[2026-05-31] lint | re-check after 5-page add (11 → 16 pages)

Verified post-add health: no orphans, no broken links, full coverage. The new pages each have ≥1 inbound link (from the linked tables/lists) and link back into the concept/source graph. Remaining open items unchanged: trajectory/trend source (rising vs. declining tools), neutral Eleventy-vs-Hugo build benchmark, and the cross-wiki page-weight-vs-architecture tie-breaker.

[2026-06-03] curate | Removed React meta-frameworks (Next.js, Gatsby) — human directive "Remove React meta-frameworks" (scope: a)

Deleted the product pages wiki/nextjs.md and wiki/gatsby.md: React meta-frameworks are full-stack web frameworks, the web-framework side of the SSG-vs-framework boundary — out of scope for this SSG/Jamstack spoke. Confirmed scope with the human (a = Next.js + Gatsby only; Docusaurus kept as a React-based docs SSG). Rewired: removed both index entries; reworked the synthesis open question into a "Scope cut" note; de-linked all remaining [[nextjs]]/[[gatsby]] wikilinks to plain text across wiki pages + this log's prior entries (they're comparison mentions now, and log links are verifier-checked). Updated the CLAUDE.md domain header + scope note and the wikis.md registry (dropped Next.js/Gatsby; added an out-of-scope routing note). No raw/ touched. Clean rebuild + verify.

[2026-06-09] ingest | +3 SSGs broadening the genre (VitePress, Zola, MkDocs) — daily-loop cron test

Daily loop picked this spoke (least-recently-grown: last ingest/split 2026-05-31). Added three in-scope, official-source build-time SSGs that extend the genre across language ecosystems and map it better for the standing "is SSG still one category?" question:

  • vitepress (SoftwareApplication, source, url) — Vue + Vite docs SSG, VuePress 1 successor; Markdown + Vue components, hybrid static→SPA model.
  • zola (SoftwareApplication, source, url) — Rust single-binary engine (Tera), batteries-included (Sass/search/images), sub-second builds; the Rust counterpart to hugo on the build-speed axis.
  • mkdocs (SoftwareApplication, source, url) — Python docs SSG, single-YAML config, Material theme; Sphinx alternative. Folded into synthesis: documented a documentation-SSG sub-genre (docusaurus/vitepress/ mkdocs across React/Vue/Python) and extended the build-speed axis with zola; advanced the "is SSG coherent?" open question with partial evidence (the category coheres on build-time HTML, splits on SPA-hydration vs near-zero-JS). Index updated. All url-only (no raw/ touched). Respected scope: no React meta-framework product pages. static-site-wiki 14 → 17 pages. Site rebuilt + verified.

[2026-06-10] ingest | Netlify + headless CMS — all-spokes pass (the deploy substrate + content layer)

Two new pages completing the displacement pipeline from its missing sides. netlify (Organization/SoftwareApplication, url, Wikipedia) — the platform that coined jamstack (founded 2014; runs Jamstack Conf/Survey; $2B valuation 2021): git-based CD → SSG build → global CDN, deploy previews, serverless/edge functions. The "where SSG output runs" answer (vercel is the React-leaning ../cloud-wiki sibling; Netlify is framework-agnostic + named the architecture). headless-cms (DefinedTerm, url, Wikipedia) — back-end-only content-as-API (REST/GraphQL), decoupling content from presentation; pairs with SSGs at build time (git-based Decap/TinaCMS vs SaaS Contentful/Sanity). Together: the wordpress monolith → headless content + SSG build + Netlify CDN (each layer one job). Folded into synthesis (new 2026-06-10 section) + index (DefinedTerm + Organization/Platform). Border with ../cloud-wiki (Netlify/Vercel as hosts) noted, kept here as the Jamstack originator. No contradictions. 17 → 19 pages.

[2026-06-12] ingest | Astro Server Islands — docs.astro.build

All-spokes daily expansion. Added astro-server-islands (@type TechArticle) — Astro's server:defer directive: a static, CDN-cacheable shell ships immediately, then personalized/dynamic server islands fetch on demand as HTML (little/no client JS), loading in parallel. The server-side complement to islands-architecture, directly engaging the "how much client JS rides along / where does dynamic content go" open question. Refines Astro's spectrum: static shell → server islands (no-JS dynamic) → client islands (hydrated); evidence that static-first extends into per-request rendering without becoming a full SSR meta-framework. Wired to astro / islands-architecture; synthesis note added; index gains a TechArticle group. Caveat noted (needs a runtime adapter). 1 new page. Authoritative (official Astro docs).

[2026-06-16] ingest | static-site-publishing (umbrella node) — kind-coverage gap

Added the missing domain umbrella static-site-publishing (DefinedTerm, kind:domain) — flagged by the entity-gaps kind-coverage audit (5 kinded concepts, no domain node). Frames build-time pre-rendering as a publishing model across generator (static-site-generator) → architecture (jamstack/headless-cms) → delivery, vs the wordpress request-time CMS; links synthesis. No new sources (synthesis node). +1 page.

Hub-routed from Telegram (astro.build/themes/1/). Clean single-spoke route — Astro is this spoke's core. Added astro-themes (CollectionPage, source:true, T3 — Astro's own marketing gallery, volatile counts; ~900 themes read off the 46-page pagination). New facet: the theme/template marketplace layer (free+paid, community-submitted, blog/portfolio/e-commerce/SaaS/docs/education, mostly on Astro 6). Gap-relevance: speaks to the displacement thesis from a new angle — the turnkey "pick-a-theme-and-go" path that bare SSGs lacked is filling in, an ecosystem-maturity signal (not a perf/architecture claim). Folded into astro (new Ecosystem section) and synthesis (turnkey-template-layer paragraph under the pipeline thread). Entity discovery: no new node — publisher is the Astro project, already anchored by astro (SoftwareApplication); the ~900 individual theme authors are low-signal, recorded as a community pool inline. Ran avoid-ai-writing (trimmed "ecosystem" density). +1 page.

[2026-06-17] ingest | Zen (Secd0g/zen) — folded into astro-themes as a worked example

Telegram source: an individual Astro blog theme on GitHub (1★, 47 commits, hobby project; Inter 17px/1.9, 700px measure, dark mode, sidebar TOC, Pagefind search; demo on Vercel; open source, personal use). Dedup/gap-relevance call: it's a single instance of the turnkey-template layer already paged as astro-themes, advancing no new open question — so folded in as a concrete example (illustrating the typography-first blog corner + the "long tail of small opinionated themes" texture) rather than a standalone thin node for a 1★ repo. Added also: ref to the gallery page. No new page (static-site stays 22). Told the human, who can ask for a dedicated page if they want one. Ran avoid-ai-writing over the added prose.

[2026-06-22] ingest | Astro 7.0 release announcement

New source page astro-7 (T1 — Astro's first-party release post, astro.build/blog; released 2026-06-22). Two substantive threads: (1) Rust speed overhaul — .astro compiler Go→Rust + new MD/MDX engine + queue rendering + Vite 8/Rolldown = 15–61% faster builds, which narrows the wiki's "two distinct fasts" split (astro now reaches for the same Rust lever as zola/hugo); (2) full-stack features — src/fetch.ts request pipeline (Hono-compatible), stable Astro.cache route caching + experimental edge-CDN providers (Netlify/Vercel/Cloudflare), agent-aware astro dev --background — direct evidence on the open SSG-vs-meta-framework question, with the release explicitly framing Astro as moving "from SSG toward a full-stack framework." Breaking: Rust compiler drops silent HTML repair (JSX-style strictness). Refreshed the astro Thing page (current major 7.0, Rust compiler) and folded both threads into synthesis (build-speed note + SSG-vs-meta-framework open question). Index updated (TechArticle group; astro line bumped). Fetched live via WebFetch. No new org node (the astro product page is the canonical node, consistent with spoke practice). +1 page (static-site 22→23). Ran avoid-ai-writing over new prose.

[2026-08-22] quality | Cycle: freshness pass, and a version bump that changed nothing

Both of the spoke's past-window pages worked. astro re-verified against the live homepage at 61 days: 7.0 → 7.2, and nothing else moved — tagline, islands and Content Collections framing, adapter list, and the 66% Core Web Vitals figure all unchanged. Recorded on the page, because "we checked and it still says this" is a result.

astro-7 regraded volatile → stable: it summarises a dated release post, so re-reading the URL returns the same text, which ../QUALITY.md grades stable. The moving quantity is the current major version, and that lives on astro, which stays volatile.

[2026-09-01] ingest | Pagefind — the feature a static site cannot have, and its price

github.com/Pagefind/pagefind — MIT, Rust, 5,434★ / 205 forks / 115 open issues / 16 watchers, created 2022-05-03, last pushed 2026-08-26, 1,507 commits, v1.5.2 (2026-04-12). Routed here by the hub; runner-up ../webperf-wiki. T1. New page pagefind.

Coverage edge 5 closes for Pagefind, with both halves. The edge asked for project docs plus one implementation report with an index-size figure. The docs are first-party, and the implementation report is this wiki's own build — 2,585 indexed pages, measured today rather than quoted:

  • 153 index chunks, 4.8 MB total, median 31.0 KB (min 21.7, max 88.6)
  • 2,589 fragments, one per page, 5.3 MB total, avg 2,149 bytes
  • metadata 24 KB · WASM 70.5 KB · pagefind.js 44.5 KB · entry file 174 bytes
  • so a cold first search is ~170 KB, plus ~2 KB per displayed result, against a ~10 MB index nobody downloads

The vendor's claim is "under 300kB" on a 10,000-page site, typically "closer to 100kB". At a quarter of that scale the shape holds. Stated with its limits: artifact sizes on disk, not a network capture, and nothing here establishes how many chunks a real query pulls.

Two costs the documentation does not mention, both found by operating it. Every artifact is named by a content hash and nothing prunes the old ones, so incremental builds accumulate: 1,191 index chunks of which 152 live, 9 .pf_meta of which 1, and 6,654 files / 132 MB against 5,378 / 95 MB cold — which showed up on deploy as 2,162 files uploaded in 48s against 561 in 9s. And the operative unit downstream is file count, not bytes: 2,589 fragments averaging 2,149 bytes occupy 12 MB on disk at a 4 KB block size, and publish cost scales with objects.

It also sharpens the spoke's oldest tension. eleventy sells build speed, astro sells runtime core-web-vitals, and Pagefind sells a payload ceiling for one feature — three tools, three units, and "faster" comparing nothing across them. That is ../webperf-wiki's performance-budget frame arriving inside a static-site tool, which is why that spoke was the runner-up rather than a bystander.

Maintainer. Liam Bigelow (bglw) has 968 of 1,507 commits and is "platform @ fly.io // tending to pagefind & truncate"; cloudcannon-oss[bot] is third with 116, the trace of the project's origin at CloudCannon, and it has had its own GitHub org since 2025-05-07. No entity pages created — one source names them.

synthesis.md gains a section on the one feature build-time HTML cannot give you; coverage edge 5 rewritten to ask for the alternatives (Lunr's whole-index model, hosted Algolia) so the entry becomes a trade-off rather than a description.

[2026-09-02] ingest | MDX — hunted for the content-pipeline edge, and the spec does not exist

Hunted at the curator's request ("hunt MDX specification for ssg wiki"), against growth edge 6. mdx (T1) from mdxjs.com, mdxjs.com/docs/what-is-mdx/, the packages page, the GitHub API, and the micromark readme as a cross-check.

The edge asked for a specification and there is none. Checked today: mdxjs.com/spec and mdxjs.com/docs/spec both 404, mdx-js/mdx holds no grammar or spec document, a code search for "specification" across its Markdown returns 0, and there is no conformance suite. MDX is defined by @mdx-js/mdx — the pre-CommonMark position, one layer above the format CommonMark fixed. Recorded as the finding rather than as a failed hunt.

Half of it is specified by inheritance. The compiler depends on remark-parse; remark sits on micromark, which claims "100% to CommonMark" and passes ~650 CommonMark tests plus 1.2k of its own. So the prose layer is conformant and the JSX layer is whatever acorn and the compiler do.

MDX is not a superset of Markdown, and this spoke had never said so. It removes indented code blocks, autolinks, HTML syntax and HTML comments, and needs \\< and \\{ escapes. Generators here present MDX as the richer option (docusaurus, astro-7); the subtraction was invisible in the corpus. Sharpest instance: CommonMark spends 90 of 652 examples on links, its second-biggest section, and MDX deletes autolinks at that exact spot because angle brackets belong to JSX.

Also recorded: MIT, 19,768★, 1,180 forks, created 2017-12-24, pushed 2026-08-31; 3.1.1 (2025-08-29), 3.0.0 (2023-10-24); no runtime, build-time only; the package set is a compiler + three framework contexts + four bundler integrations, which is why MDX appears in JS-toolchain generators and not in hugo or jekyll.

New: mdx. Updated: index.md, synthesis.md (new section; edge 6 narrowed twice — the spec half is answered, the remaining need is GFM's extension set and one generator's content-collection docs). No entity pages: Titus Wormer (micromark, remark) is named once here and deferred under ../ENTITIES.md; he is the obvious node if a second source touches the unified ecosystem.

Not fetched: the guides, the playground, and per-generator MDX configuration.

[2026-09-02] ingest | Pelican, Bridgetown, Hexo, Publii — growth edge 7, hunted

Hunted at the curator's request ("hunt Pelican, Bridgetown, Hexo and Publii for ssg wiki"), closing growth edge 7. Four T1 pages from project documentation plus the GitHub API, checked today:

Language Licence Stars Forks Created Latest
pelican Python AGPL-3.0 13,338 1,823 2010-10-16 4.12.0 (2026-04-20)
hexo Node/TS MIT 41,768 39 2012-09-23 8.1.2 (2026-05-06)
publii Electron GPL-3.0 7,296 469 2018-06-18 0.47.9 (2026-07-23)
bridgetown Ruby MIT 1,365 132 2020-04-07 2.2.2 (2026-07-06)

The edge misdiagnosed itself three ways, and that is the finding. It was not recency — Pelican (2010) and Hexo (2012) predate everything here but jekyll. It was not obscurity — Hexo's 41,768 stars beat astro, hugo and jekyll, and it had never appeared in the corpus. And the real gap was who is at the keyboard: publii is a desktop GUI app with no terminal anywhere in the workflow, where every other generator paged here is a CLI. That lands on a live thread — this spoke describes the WordPress exodus while holding no tool aimed at the person leaving, who is overwhelmingly not a terminal user. Publii names what it removes in WordPress's own terms ("without a database, PHP, or a public admin panel"); pelican's WordPress importer is the other half, the first migration mechanism in the corpus rather than another account of the trend.

Second finding, on this spoke's own boundary. bridgetown ships Roda and advertises PostgreSQL, asking "Static Sites? Fullstack Applications? Both?" — the exact move that put Next.js, Remix and Gatsby out of scope in June 2026. Every out-of-scope example in the corpus is a React framework, so that exclusion has read as a JavaScript phenomenon; it is not. A Jekyll descendant in Ruby grew a server too. Bridgetown stays in scope (static generation is still the product, Roda is an option) but the page flags it for revisiting.

Two smaller records. Copyleft is over-represented outside the roster — AGPL-3.0 and GPL-3.0 against an otherwise MIT/Apache corpus, with no source on what either means for a commercial site. And Hexo reports 39 forks against 41,768 stars (network_count agrees; the other three run 7–16 stars per fork). No explanation found and none offered — recorded because fork counts are one of the few contribution proxies used here.

New: pelican, hexo, bridgetown, publii. Updated: index.md, synthesis.md (new section; edge 7 CLOSED with a successor — the roster is still CLI-only apart from Publii, and nothing describes a non-technical author's real workflow). No entity pages; no maintainer is named by more than one fetched page.

Not fetched: Bridgetown's Roda/dynamic-routing docs, Publii's theme and plugin ecosystem, Hexo's plugin API, Pelican's plugin list. Each is the obvious next pull if the curator wants one developed.

[2026-09-02] ingest | Core Web Vitals on Eleventy — hunted, and the answer is "by default"

Hunted at the curator's request ("hunt improving Core Web Vitals on eleventy for ssg wiki"). Two sources: eleventy-performance-docs (T1, 11ty.dev /docs/performance/ + the Image plugin docs) and speedlify (T2, the Eleventy community leaderboard). A web search first returned only generic CWV listicles with nothing Eleventy-specific, all below the T1/T2 hunt bar — and that absence turned out to be the story.

Eleventy's own performance page never mentions Core Web Vitals, LCP, CLS or INP. "Performance" there means build performance, and all eight recommendations are build-side (memoize shortcodes, --incremental, the Fetch cache, profiling). The runtime claim is one sentence about a default: "by-default we do not include any costly runtime JavaScript bundles." The Image plugin does the actual metric work — width/height "to reduce layout shift", AVIF/WebP with srcset — and documents it under build cost ("+1 Build Cost" for AVIF), with caching pitched as faster builds. So Eleventy moves these metrics by default rather than by instruction, which is why no first-party guide exists to find. The cost is that its docs give a developer no way to check.

speedlify is what the community measures instead: 1,145 of 1,232 sites, weekly, median Lighthouse 98 / 100 / 100 / 100, 150 clean sweeps. The strongest quantitative support this spoke holds for pre-rendered-is-fast-by-default.

And only 118 of those 1,145 sites have CrUX field data — one in ten. That is the finding, and it is about our scoreboard, not about Eleventy. core-web-vitals ranks platforms by field pass rate (Astro 66–67%, WordPress 48–49%, Duda 85%). CrUX only reports a site with enough real traffic, so Eleventy gets no entry — not a poor one, none — and a median Lighthouse of 98 is a lab number that is not the same quantity. The platform scoreboard is only defined for platforms whose sites are big enough to be measured, which excludes personal sites, docs and blogs: the small-site end where Eleventy, jekyll, zola, pelican and publii live, and the case the static-generation argument is usually made about. The corpus had been reading that ranking as neutral about site size.

New: eleventy-performance-docs, speedlify. Updated: eleventy (new section), core-web-vitals (Eleventy added to "In our sources" as the entry that cannot have a number, with the reason), index.md, synthesis.md (new section + growth edge 8: field data for the small-site end). No entity pages.

Not fetched: the <is-land> partial-hydration docs, and Speedlify's own methodology repo.

Hunted at the curator's request ("research more about zola in ssg"). No new page: zola existed at T1 from the homepage (June 2026) and was refreshed in place. Sources: the getzola/zola GitHub API, /documentation/getting-started/overview/, /documentation/content/search/. Freshness corrected stable → volatile (the page carries version and repo figures).

The finding is a comparison the spoke could not make yesterday. Zola's built-in search generates an index in four formats (elasticlunr JS/JSON, fuse JS/JSON, for elasticlunr, fuse.js and tinysearch) and then stops: "Zola makes no assumptions about your search function and doesn't provide the JavaScript/CSS code to do an actual search and display results." pagefind does the opposite — chunked index plus a UI component. Both ends of the how much of the search does the tool own axis are now paged, which is what growth edge 5 asked for.

But the number is still missing, and that is what the edge now says. Pagefind's design is measured from this wiki's own build (2,585 pages, 153 chunks, ~170 KB cold first search, ~10 MB total index). Zola's docs give no index size, no page-count guidance and no growth warning for a feature built into a binary whose headline is "blazing fast." Whether an elasticlunr or fuse index must load whole is not stated by Zola and not established anywhere in this corpus — so the chunking argument remains an assertion with one worked example.

Repository facts the homepage does not carry: 17,391★, 1,178 forks, 192 open issues, created 2016-12-06, pushed 2026-08-31. v0.23.4 (2026-08-20) — still 0.x after nearly ten years, and the cadence is lumpy: v0.22.1 in January 2026, then five releases between 5 and 20 August 2026. Templating is Tera; the docs make a point of "Zola makes no assumptions regarding the structure of your site." The overview says nothing about plugins — an absence on one page, not a proven absence.

Licence: EUPL-1.2, the European Union Public Licence. With pelican (AGPL-3.0) and publii (GPL-3.0), four of the six generators paged or re-read in two days are non-permissive — so the MIT/Apache monoculture this corpus appeared to show was a property of which generators had been paged. Nothing fetched says what any of these licences means for a commercial site.

Also recorded as a pattern to watch: three of today's subjects are still 0.x — Zola at ten years, Publii at eight, CommonMark at twelve. No source on what that communicates.

Updated: zola (two new sections, freshness corrected), index.md, synthesis.md (new section; growth edge 5 advanced and re-specified to ask for a measured Lunr-family index size). No new pages, no entity pages — no maintainer is named by anything fetched.

[2026-10-07] quality | edge-queue blind-spot pick — re-read fresh, no open edge otherwise

Picked this cycle specifically because it carried zero entries on the hub ## Most wanted list despite being healthy and having a well-developed local edge (new rule added to the quality-cycle prompt the same day). Read CLAUDE.md, synthesis.md and index.md fresh. Integrity clean (0 stale, 0 orphans, 0 dupes). Action: promoted growth edge 1 ("is SSG still a coherent category?") to the hub Most-wanted list as #54, so the Research Pass can draw on it going forward. No new pages.