--- title: Be Civic — Website Rendering type: spec status: v0.5.1 — post-2026-05-12 tag-resolution reconciliation date: 2026-05-12 parent_spec: ./README.md sibling_specs: - architecture.md - protocol.md - schemas.md - privacy.md - lifecycle.md - skills.md tags: ["be-civic", "bc-internal", "architecture"] --- # Be Civic — Website Rendering This sub-spec covers the rendering substrate for `becivic.be`: the Cloudflare Workers Static Assets renderer (§20), its build-time and runtime mechanics, the brand decisions, the pages in scope at launch, and the multi-site monorepo layout (§22). The MCP server at `mcp.becivic.be` is in `protocol.md` §23. For the MDX tag schema (``, ``, ``) that the renderer resolves at build time, see `schemas.md` §6.10. For the agent-facing surfaces (`/agents`, `/agents/manifest.json`, per-endpoint pages) referenced throughout this doc, see `architecture.md` §13.1. ## 20. Website rendering §13 covers the **agent-facing** surface — capability tiers, per-ecosystem capable-mode recommendations, the `becivic.be/agents` page, pre-flight validation. This section covers the **rendering substrate** that serves both human and agent surfaces under `becivic.be`: the self-rendered Cloudflare Worker site at `bc-infra/site/renderer/` (S50). The full design brief (light/dark mockups, brand spec, accessibility baseline, pre-launch posture detail) lives at `docs/website/requirements.md`; this section is the architectural summary. ### 20.1 Hosting model — bare apex, Worker-rendered Three Workers share the `becivic.be` namespace, path-routed at Cloudflare: - `becivic.be/` → **renderer Worker** (Cloudflare Workers Static Assets binding, source in `bc-infra/site/renderer/`); serves marketing landing, `/agents`, `/skills/*`, `/docs/*`, `/llms.txt`, `/llms-full.txt`, `/sitemap.xml`, `/robots.txt` - `becivic.be/api/*` → **staging Worker** (source in `bc-infra/api/`, per §4 (see architecture.md) and §10 (see lifecycle.md)); unchanged in URL surface - `mcp.becivic.be` → **MCP Worker** (source per §23 (see protocol.md), `createMcpHandler`); independent subdomain, no apex routing **Routing rule.** The router Worker (`bc-infra/site/router-worker.js`) at the apex path-routes between the renderer (default) and the staging Worker (`/api/*` namespace). Per S50, the former Mintlify proxy is removed. The MCP Worker is reached via DNS at its own subdomain; it does not transit the apex router. Bare apex only — `www.becivic.be` is removed entirely (S56). **Why this shape.** Every URL the spec already cites (`becivic.be/agents`, `becivic.be/skills/`, `becivic.be/llms.txt`) stays exactly as written. Agent discovery (llms.txt, content-negotiated markdown) lives on the apex where AI consumers expect it. MCP moves to its own subdomain so agents can discover it without colliding with HTTP-content paths. ### 20.2 Renderer architecture The renderer is built on Cloudflare Workers Static Assets with a custom Worker entry (`worker.ts`) for runtime concerns. The build pipeline (Node, run at deploy time) walks the bc-docs source tree, renders markdown to HTML against a shared template, computes the navigation graph from `docs.json`, generates the Pagefind static search index, and emits a `dist/` directory of static assets. The Worker serves `dist/` via the Static Assets binding and intercepts request lifecycle for the runtime hooks below. `docs.json` (in `bc-docs`) is the navigation source-of-truth read by `bc-infra/site/renderer/src/nav.ts`. Skill bodies (`bc-docs/skills//canonical.md`) are rendered to `/skills/` and `/skills//canonical`; the `status` frontmatter field drives the in-page banner (§6.1 (see schemas.md)) when status is not `stable`. There is no separate proposal route — one canonical URL per skill. ### 20.3 Runtime hooks (S57) Three runtime/build-time mechanics beyond plain markdown rendering: **HTMLRewriter beacon injection.** Cloudflare Web Analytics token is held as a Worker Secret (`BECIVIC_CF_ANALYTICS_TOKEN`), not as a Plaintext variable in `wrangler.toml [vars]`. The Worker injects a `