$git clone https://github.com/jdevalk/specification.websiteThe website specification — from <title> to /.well-known/security.txt, from WCAG contrast to llms.txt. Platform-agnostic, sourced on every page, written for humans and agents. MIT licensed, open for pull requests.
| 1 | # The Website Specification |
| 2 | |
| 3 | [](https://github.com/jdevalk/specification.website/actions/workflows/ci.yml) |
| 4 | [](https://github.com/jdevalk/specification.website/actions/workflows/lint.yml) |
| 5 | [](https://github.com/jdevalk/specification.website/actions/workflows/format.yml) |
| 6 | [](https://github.com/jdevalk/specification.website/actions/workflows/links.yml) |
| 7 | [](https://github.com/jdevalk/specification.website/actions/workflows/security.yml) |
| 8 | [](LICENSE) |
| 9 | [](https://creativecommons.org/licenses/by/4.0/) |
| 10 | [](https://specification.website) |
| 11 | |
| 12 | The website specification — from `<title>` to `/.well-known/security.txt`, from WCAG contrast to `llms.txt`. Platform-agnostic, sourced on every page, written for humans and agents. MIT licensed, open for pull requests. |
| 13 | |
| 14 | **Live site:** <https://specification.website> |
| 15 | **MCP server:** <https://mcp.specification.website/mcp> |
| 16 | |
| 17 | ## What this is |
| 18 | |
| 19 | The web is a layer cake of standards: WHATWG defines HTML, W3C ratifies WCAG, the IETF publishes the RFCs behind security headers and `/.well-known/` URIs, IANA registers the namespaces, search engines publish their own rules, browsers add quirks. Almost nobody carries the whole picture. |
| 20 | |
| 21 | This site collects the slices into one platform-agnostic specification — sources cited on every page. |
| 22 | |
| 23 | It is _not_ a framework. It is _not_ a tutorial. It is a spec, in the same way the HTML Living Standard is a spec: outcomes, requirements, references. |
| 24 | |
| 25 | ## What this is not |
| 26 | |
| 27 | - Not platform-specific. No "use this Next.js plugin" advice — the spec describes the outcome, you choose the implementation. |
| 28 | - Not opinion. Where there is no settled standard, the spec says so. |
| 29 | - Not a marketing site. No newsletter capture. No cookies. Aggregate Plausible analytics; that's it. |
| 30 | |
| 31 | ## Categories |
| 32 | |
| 33 | - **Foundations** — HTML, head, document basics. |
| 34 | - **SEO** — search visibility. |
| 35 | - **Accessibility** — WCAG-aligned rules. |
| 36 | - **Security** — headers, transport, policies. |
| 37 | - **Well-Known URIs** — agreed paths under `/.well-known/`. |
| 38 | - **Agent Readiness** — making a site legible to AI agents. |
| 39 | - **Performance** — Core Web Vitals, caching, fonts. |
| 40 | - **Privacy** — consent, signals, respecting choice. |
| 41 | - **Resilience** — graceful failure. |
| 42 | - **Internationalisation** — language, locale, direction. |
| 43 | |
| 44 | ## Development |
| 45 | |
| 46 | Requirements: Node.js 22.12+, npm. |
| 47 | |
| 48 | ```bash |
| 49 | npm install |
| 50 | npm run dev # http://localhost:31337 |
| 51 | npm run build # static output in ./dist |
| 52 | npm run preview # serve ./dist on port 31337 |
| 53 | ``` |
| 54 | |
| 55 | The dev server runs on port `31337` by convention (because of course it does). |
| 56 | |
| 57 | ## Adding or changing a spec page |
| 58 | |
| 59 | 1. Find the right category under `src/content/spec/<category>/`. |
| 60 | 2. Copy an existing `.md` file — for example, `src/content/spec/foundations/title.md`. |
| 61 | 3. Fill in the front matter (see schema in [`src/content.config.ts`](src/content.config.ts)). At minimum: `title`, `summary`, `category`, `status`, `order`, and `sources`. |
| 62 | 4. Write the body. Sections: `## What it is`, `## Why it matters`, `## How to implement`, `## Common mistakes`, `## Verification`. |
| 63 | 5. Open a PR. |
| 64 | |
| 65 | The build will fail if the schema is invalid — that is intentional. |
| 66 | |
| 67 | Everything derived from the spec content updates automatically: `/spec/`, `/checklist/`, `/llms.txt`, `/llms-full.txt`, `/sitemap-index.xml`, `/rss.xml`, per-pag |