This is a technology spike — nothing here is a committed HDC deployment. Learn more →

Spike evaluation: Eleventy + Pagefind + Decap CMS

Third and final SSG iteration through SPECIFICATION.md's open questions, built to the same bar as the Astro and Next.js spikes (spikes/astro/content-pages/evaluation.md, spikes/nextjs/content-pages/evaluation.md), reading the same shared /data + /schema. Pagefind was reused as-is, same reasoning as the Next.js spike.

What this spike proves works

Friction encountered (and fixed)

Second layout, images, and environment rendering (SPECIFICATION.md, "Demonstrate alternative layouts and images" / "Individual environments/rendering")

Search-index-driven listing and pagination (SPECIFICATION.md, "Search-index-driven listings with pagination")

CMS future-requirements read-through (SPECIFICATION.md, "CMS gui like options")

Same as both prior spikes' reads — Decap CMS's capabilities don't change per SSG, only the config.yml paths do:

What was actually run (for reproducibility)

npm init -y   # then set "type": "module", scripts, dependencies by hand
npm install @11ty/eleventy yaml
npm install -D pagefind decap-server serve
npm run build          # eleventy && pagefind --site _site
npm run preview         # serve _site — verified via curl
npm run cms             # decap-server from repo root; queried its API directly for entries/pages/banner

Also run directly against the built output, not inferred from code:

Post-spike code review (senior developer/architect pass)

An independent review of this spike's code, conducted after completion, from the perspective of a senior developer/architect deciding what carries into the next stage of development. Since Eleventy is REPORT.md's recommended engine, this spike got the most scrutiny — its patterns are the likely production foundation. The review also covers the repo-root scripts/build-site.mjs and scripts/deploy-gcs.sh, which would ship with it.

AI declaration: original implementation by Claude Sonnet 5 (claude-sonnet-5); this review by Claude Fable 5 (claude-fable-5), based on a full read of every source file in this spike, the shared build/deploy scripts, the spec, the report, and the canonical schema. Every finding below was verified against the actual code, not inferred.

Code-level improvements

Architectural concerns

Security considerations

Spec-fit gaps

Questions for the next stage

  1. What is the single source of truth for the data model, and what generates the CMS config, entryFields, and filter facets from it — schema-first codegen, or manual sync plus a CI drift check?
  2. Testing strategy: unit tests for filters.js and the data loaders are extractable today; what end-to-end harness (Playwright against _site)? And do we reintroduce TypeScript/esbuild deliberately, as this report already hints, accepting the bundler Eleventy avoided?
  3. Content governance for the shared /markdown, /images, /data folders: once the multi-spike scaffolding is gone, do these move inside the Eleventy input tree (eliminating the articles.js bridge entirely), and who owns the image-sync problem until then?
  4. CI/CD: the GitHub Actions + Workload Identity Federation deploy in REPORT.md is documented, not built — including ajv schema validation as a merge gate for CMS-generated PRs, and the still-untested per-environment Decap backends.
  5. Is /admin/ meant to exist on the production domain, and what serves Decap's GitHub OAuth flow (the HDRUK/hdc_v2 repo in config.yml is a placeholder) given a GCS bucket + CDN can't host the OAuth proxy?