sandbox.gf.cx — canonical subdomain template (parked 2026-05-23)
DARE.CO.UK · PARKED SKETCH · 2026-05-23
Mirrored from ~/.claude/.../memory/parked_sketch_sandbox_gfcx_subdomain_template.md. This is a design sketch parked for future build — read for context, not as a current deliverable.
Build a reusable subdomain template that ships ALL the affordances every new gf.cx subdomain should inherit — landing page, 404 catch-all, redirect rules scaffolding, thumbnail-pipeline on card URLs, media.css import, etc. First instance: sandbox.gf.cx. Future subdomains (payload, io, ask-opus, new ones) clone from this baseline.
Dan 2026-05-23: “https://payload.gf.cx/evernote/ gives a 404 — the entire payload.gf.cx needs a catch-all for 404, that’s similar to pa.gf.cx, are you lost? you were searching for
The motivating gap
Today each subdomain accumulates affordances ad-hoc:
- pa.gf.cx has a 404 page, has a landing, has thumbnail pipeline on cards
- payload.gf.cx got a landing in this session, has no 404 catch-all (hit at /evernote/)
- assets.gf.cx has a landing, has a 404.html
- io.gf.cx is still on Notion; nothing wired
When a new subdomain stands up, someone has to remember the full affordance list. Easy to ship without one or two. sandbox.gf.cx becomes the reference implementation that has ALL of them, so future subdomains clone from it.
Affordance checklist (the template content)
| Affordance | What it does | Lives in |
|---|---|---|
Declarative / landing |
Explains what the subdomain is, what lives here, what doesn’t, where to look instead | index.html |
| 404 catch-all | “Are you lost? You were searching for <path> — try X or Y” with friendly tone, links back to landing |
404.html + project config (CDN, security layer, and DNS provider sitting in front of dare.co.uk.">CF Pages: automatic; R2-custom-domain: needs Worker or transform) |
| media.css import | <link rel="stylesheet" href="https://assets.gf.cx/media/media.css"> in any page that embeds video/img |
every HTML file |
| Thumbnail pipeline on cards | Any card-grid surface that links to another URL gets an OG-image-style thumbnail (the dare.co.uk pattern) | thumbnailer.py / pa thumbnail service |
| Redirect rules scaffolding | A reusable CDN, security layer, and DNS provider sitting in front of dare.co.uk.">CF Transform Rule pattern: /index → /, trailing-slash normalisation, www. → apex, etc. |
CDN, security layer, and DNS provider sitting in front of dare.co.uk.">CF Rules (deployed via API) |
| Grayscale-thumb hover | Card thumbnails default grayscale + restore color on hover (feedback_grayscale_thumb_hover_pattern.md) |
shared CSS (candidate for assets.gf.cx/cards/cards.css primitive) |
| Robots/sitemap | robots.txt + sitemap.xml (auto-generated or hand) |
project root |
| Favicon + apple-touch-icon | Tiny set consistent with portfolio brand | project root |
| CDN, security layer, and DNS provider sitting in front of dare.co.uk.">CF Access posture | Public OR Access-gated declaration in a .cf-access-policy.md file (operator-facing) |
project root |
| Last-touched date | Footer freshness stamp per feedback_last_touched_freshness_pattern.md |
every HTML file |
Repo shape
xlab-co/toolkit/subdomain-template/
README.md — what this is, how to clone
index.html — declarative landing skeleton
404.html — friendly catch-all
robots.txt
sitemap.xml.tmpl
wrangler.toml — CF Pages project config
scripts/
deploy.sh — wrangler pages deploy
apply-rules.sh — fires CF API to deploy Transform Rules
.cf-access-policy.md.tmpl
README-affordances.md — the checklist above as a runbook
First instance: sandbox.gf.cx
Stand it up as the test bed. Build the template by extracting affordances from pa.gf.cx (most mature), then verify they all work on sandbox.gf.cx before cloning to fix payload.gf.cx’s missing 404 catch-all and seeding io.gf.cx.
What this also fixes
- payload.gf.cx 404 on
/evernote/— once the template ships, payload gets the same 404.html catch-all routing (probably via a Worker now in front of R2, since R2-custom-domain can’t serve a 404 page from a missing key). - Future subdomains — io.gf.cx, ask-opus.gf.cx, new ones — clone the template instead of inventing.
Cross-references
feedback_declarative_pages_for_infra_subdomains.md— the landing rule (template formalises it)feedback_payload_gfcx_public_only_policy.md— sibling subdomain currently missing 404 catch-allfeedback_grayscale_thumb_hover_pattern.md— one affordance to fold infeedback_last_touched_freshness_pattern.md— another affordancefeedback_xlab_co_toolkit_web_assets_home.md— where the template livesproject_io_gfcx_public_access_subdomain.md— first consumer once template exists
Resume conditions
- Dan asks to start building the template
- A new subdomain is about to stand up (io.gf.cx, others) and would benefit from cloning
- A 404 incident on payload.gf.cx prompts a hot-fix (build template’s 404 path immediately, retrofit payload)