Knowledge Islands content website standard
You are applying the Knowledge Islands content website standard — the shared way every static website in this work is built: Eleventy 3, Nunjucks and Markdown; TypeScript run natively on Bun; Tailwind 4 config-less with design tokens, compiling to a portable dist/. A new site is scaffolded to it; an existing one is audited and conformed against it. This skill carries that standard and the procedure.
This is a base-agnostic governance skill. It hard-codes no single repo; it applies to any repo carrying a [skills.ki-repo-website-content] table in its .ki.toml. How it sits beside the other skills, and where it must not overlap them, is documented once in the ki-agentic-harness README.md.
ki-repo owns that repository declaration. Detected Eleventy files are coverage evidence only; hosted conform never infers or adds the opt-in.
This skill owns the content implementation delta. The neutral lifecycle and dist/ seam belong to ki-repo-website; the generic toolchain belongs to ki-engineering; Markdown/TOML style belongs to ki-authoring; and serving dist/ belongs to the independently selected hosting adapter.
The full, quotable standard is the Eleventy site standard; the line-by-line pass/fail items are in the audit rubric; the tracked provenance is the source list. ki repo audit --skill ki-repo-website-content runs the mechanical checks. Read those for detail; this file is the operating procedure.
The stack at a glance
<repo>/ # monorepo — root package.json workspaces: ["apps/*"] from day one
├── package.json # workspaces: ["apps/*"] — the site is its own application workspace
└── apps/
└── site/ # conventional site root; selected by [skills.ki-repo-website].site-root
├── eleventy.config.ts # export default (eleventyConfig) ⇒ { dir, htmlTemplateEngine: 'njk', … }
├── src/
│ ├── _data/ # global data: *.ts (default export, called if a function) + *.json5
│ ├── _includes/
│ │ ├── layouts/ # base.njk (the <html> shell) + page layouts
│ │ └── partials/ # nav, footer, seo-meta — reusable fragments
│ ├── assets/css/ # main.css → @import "tailwindcss" + tokens.css (@theme inline) + page partials
│ ├── assets/{js,images,fonts}/
│ └── <content>/ # Markdown pages + *.11tydata.json cascade (layout, section)
└── dist/ # BUILD OUTPUT — portable (relative URLs), gitignored. The seam to hosting.
A companion deployable (a bot, an ingress Worker — out of this skill's scope) is a pure addition to apps/ (apps/ingress beside apps/site). Each application workspace owns its own dist/; the site selected by [skills.ki-repo-website].site-root emits to ./dist. apps/site is the conventional value, while the website core permits an explicit alternative repository-relative root.
Four invariants define the standard — most findings are a breach of one:
- Config-less Tailwind 4. No
tailwind.config.*;main.cssis@import "tailwindcss"thentokens.css, whose semantic CSS vars are exposed to utilities via@theme inline. - The build emits a portable
dist/. AnaddTransformrewrites absolute internal URLs to relative ones, sodist/serves from any root. This is the contractki-repo-website-cloudflareconsumes. - TypeScript runner is declared, not proven. Package scripts select Bun or modern Node for TypeScript;
tsxis not used..ts+.json5data extensions are registered in the config.tscis type-check only (engineering's layer); actual execution belongs to explicit runtime evidence. - Tailwind compiles inside the Eleventy lifecycle. An
eleventy.beforehook runs the Tailwind CLI in build mode; dev runs a parallel--watchand anaddWatchTargeton the compiled CSS.
The selected site must be an application workspace. Its exact local build and clean lifecycle names plus capability-owned ki:site:dev, ki:site:dev:css, and ki:site:dev:serve family are owned by this content implementation and need no root script_exclusions; the repository root exposes only the public ki:site:build, ki:site:dev, and ki:site:clean seam.
Layering — how a site repo gets fully audited
The checker is the site-build layer; the independently applicable toolchain and hosting layers each audit their own concern. The unscoped host runs every declared layer:
ki repo audit --repo <repo> --skill ki-engineering → common toolchain
then ki repo audit --repo <repo> --skill ki-repo-website-content → site-build delta (THIS skill)
then ki repo audit --repo <repo> --skill ki-repo-website-cloudflare → serving the dist/ (if deployed to Cloudflare)
A repo is "clean" only when every applicable skill's audit passes. The .ki.toml tables are the selector: [skills.ki-repo-website] marks the common website seam; [skills.ki-repo-website-content] marks this implementation; [skills.ki-repo-website-cloudflare] marks optional Cloudflare hosting.
The dist/ contract (the seam to hosting)
This skill's output, and the only thing the hosting skill needs: a dist/ of static files with relative internal links (the URL transform), Tailwind compiled to dist/assets/css/main.css, passthrough assets, and — for a public site — sitemap.xml + robots.txt. dist/ is gitignored and regenerated by the build. It lives inside the core-selected site root (<site-root>/dist; conventionally apps/site/dist/) — the path the selected hosting adapter consumes.
Operating modes
Carries the universal four AUDIT · CONFORM · EDUCATE · REFRESH — EDUCATE scaffolds a new site. Invoked as help / -h / ?, it explains itself and stops — the generated HELP block (name, purpose, invocation, modes, off-ramps), taking no action. With no mode it does the same, then, in an interactive session only, offers the mode choice via AskUserQuestion, prompting for any argument-hint target the chosen mode shows. The mode shape itself is defined in ki-skills' enforcement framework.
The four procedures remain on demand because each coordinates work outside the hosted rubric: AUDIT and CONFORM sequence adjacent skills and explicit build checks, EDUCATE scaffolds application source, and REFRESH reconciles moving external sources. Each file owns one mode so invoking one never loads an unrelated procedure.
Mode AUDIT
→ Read references/mode-audit.md
Mode CONFORM
→ Read references/mode-conform.md
Mode EDUCATE
→ Read references/mode-educate.md
Mode REFRESH
→ Read references/mode-refresh.md
REFRESH writes only in ki-agentic-harness; when invoked from an installed copy, stop and redirect the work to the harness.
Boundaries (out of scope, with their homes)
Reciprocal off-ramps — each names this skill back for the site-build layer:
- The Bun mandate, aggregate/scoped audit wiring, direct code-tool execution,
tsconfig/biome, and type-check →ki-engineering. This skill owns the site-build delta on top of that common layer; it references it, never restates it. - Markdown / TOML formatting style (including content prose) →
ki-authoring. - A single interactive React/Vite application →
ki-repo-website-app; do not select both implementation skills. - Serving the built
dist/— thewrangler.jsonc, Workers Static Assets, custom domains, deploy scripts →ki-repo-website-cloudflare. Thedist/is the seam between the two. - Any Worker that is not a static site (bots, ingress receivers, APIs, Durable Objects), and general Cloudflare/Workers usage → the generic
cloudflare/wranglerskills. - A repo's GitHub settings, security, and the universal local files →
ki-repo.
Notes
- Hosted conform is intentionally narrow: only the contained, physical
.ki.tomlcontribution is eligible for this skill's proposals.ki-repocentrally composes the root.gitignore; application scaffolding, builds, deployment, and external commands remain explicit. - The exemplars remain separate because they carry complete reusable
eleventy.config.ts, Tailwind token, package-script, and layout shapes that would make the normative standard unwieldy. They illustrate the contract but do not define it.