# Cloudhal

> Agent-native site platform: sites are typed graphs, agents change them through an MCP server behind a policy engine, and every change is a snapshot you can diff, preview and roll back. Runs on Cloudflare or self-hosted. Open source, TypeScript.

Every page below is Markdown. The full text is in /llms-full.txt; each section also has its own llms.txt and llms-full.txt.

## Start

- [Cloudhal for developers](https://cloudhal.dev/.md): Cloudhal is an open-source, agent-native site platform. Install it, read the docs, use the JSON Schemas.
- [Documentation](https://cloudhal.dev/docs.md): Guides, architecture decisions and proposals for Cloudhal.
- [Cloudhal-Fetch](https://cloudhal.dev/fetch.md): What the Cloudhal-Fetch/1 user agent requests from your server, and how to reach the people running it.

## Start

- [Installation](https://cloudhal.dev/docs/start/installation.md): Create a Cloudhal project with your package manager. The project is an Astro site with a local Cloudhal store; it runs offline and deploys to Cloudflare when you are ready.
- [Quickstart](https://cloudhal.dev/docs/start/quickstart.md): From an empty folder to a published site with an agent, in about ten minutes. You need Node.js 24 or later; see Installation for pnpm, Yarn and Bun.

## Agents and MCP

- [Agents and MCP](https://cloudhal.dev/docs/agents.md): Cloudhal is built for agents to work on sites, with people in charge. Agents connect over the Model Context Protocol (MCP), call semantic tools instead of editing files, and work inside a policy engine: each agent has a…
- [Connect an agent](https://cloudhal.dev/docs/agents/clients.md): Every MCP client connects to Cloudhal in one of two ways (which one?):
- [Docs for agents](https://cloudhal.dev/docs/agents/docs-for-agents.md): These docs are published for agents as well as for people. Point your agent at them when it works on a Cloudhal project.

## Reference

- [CLI reference](https://cloudhal.dev/docs/reference/cli.md): Every command and flag of the cloudhal CLI, generated from `cloudhal --help`.

## Guides

- [Site analytics and privacy: a guide for site owners](https://cloudhal.dev/docs/guides/analytics-privacy.md): Every Cloudhal site can count its visits with its own analytics. They have no cookies, no third party and no API token.
- [Hardening a Cloudflare deployment](https://cloudhal.dev/docs/guides/cloudflare-hardening.md): What cloudhal deploy already does for security and operations, and the optional steps to take on your own account.
- [Reader comments: a guide for site owners](https://cloudhal.dev/docs/guides/comments.md): Cloudhal sites can take comments from readers on their articles. They are first-party: there is no third-party service or embed, and by default no third-party script.
- [Deploy to Cloudflare button](https://cloudhal.dev/docs/guides/deploy-button.md): Cloudflare's Deploy to Cloudflare button copies a public repository into your GitHub account, creates the resources its root wrangler.jsonc declares and connects the repository to Workers Builds, which then runs the…
- [Several sites in one installation (RFC-0034)](https://cloudhal.dev/docs/guides/multi-site.md): One installation is one Studio, one D1 database and one R2 bucket. It can hold any number of sites. Each site is isolated: it has its own content, settings, members' roles, keys, analytics and comments.
- [Schedules: a guide for site owners and agent builders](https://cloudhal.dev/docs/guides/schedules.md): Cloudhal can publish later, keep content under embargo, take it down on a date, and run recurring work: built-in checks and tasks that your own agents perform on a schedule.
- [Site search: a guide for site owners and operators](https://cloudhal.dev/docs/guides/search.md): Readers search a Cloudhal site in two ways: - the search modal: the header field, ⌘K / Ctrl+K or / open it, and it shows grouped results as the reader types; - the /search page, which works without JavaScript.
- [Translations on Hosted Weblate: the owner's steps](https://cloudhal.dev/docs/guides/translations-weblate.md): Studio's translations move to Hosted Weblate on the Libre plan (ADR-0034, decisions of 2026-10-18). Agents prepare everything in the repo but never create accounts or apply on your behalf.

## Contributing and internals

- [Contributor docs](https://cloudhal.dev/docs/contributing.md): Architecture guide and package-by-package walkthrough will be added as packages land (Sprint 2+).
- [Cloudhal Studio design system](https://cloudhal.dev/docs/design/design.md): Verified sources: kumo-ui.com (installation, components-vs-blocks, blocks, component docs, registry), the Kumo repository (sidebar.tsx, blocks, the docs app shell), the kumo-design skill, Cloudflare dashboard…
- [Agent-built sites: gap analysis](https://cloudhal.dev/docs/design/agent-built-sites-gap-analysis.md): What stops Claude, Codex or any MCP agent from building a modern, interactive, well-structured site end to end on Cloudhal, and what to build next. Collected 2026-10-15.
- [Focus mode for the body editor — research and decision](https://cloudhal.dev/docs/design/body-focus-mode.md): The owner asked for a focus button in Studio's body editor (2026-10-17). Sources at the end.
- [Carousels and sliders: research and decisions](https://cloudhal.dev/docs/design/carousels.md): Research for RFC-0027 (a carousel for generated UI and theme hero areas). Sources at the end.
- [Icons on public sites: research and decisions](https://cloudhal.dev/docs/design/icons.md): Research for the next RFC (icons in themes and surfaces). Studio already uses Phosphor through Kumo; public sites have almost none: hand-drawn SVGs for the menu, caret and close buttons, and social links as text.
- [Image presentation: placeholders and fit — research and decisions](https://cloudhal.dev/docs/design/images.md): Research for the next RFC (images that load gracefully and fit any frame). Sources at the end.
- [Kumo upstream notes (not filed)](https://cloudhal.dev/docs/design/kumo-upstream-notes.md): Issue texts for gaps Cloudhal found in Kumo 2.14.0 (the latest release on 2026-10-12) while making Studio speak Turkish. Nothing here has been filed: the maintainer decides what to send, and when.
- [Site chrome and overlays: R&D report](https://cloudhal.dev/docs/design/site-chrome-and-overlays.md): Where we are.
- [Starter themes: references and gaps](https://cloudhal.dev/docs/design/starter-references.md): Research for strengthening starters/blog (and a possible newsroom starter) before the first public demo. Collected 2026-10-15. Visitor-facing sites use the theme system, not Kumo; DESIGN.md does not apply here.
- [Code structure and size rules](https://cloudhal.dev/docs/engineering/code-structure.md): Status: binding for new code from 2026-10-17. Enforced by pnpm size:check (part of pnpm check and CI), Biome complexity warnings and the clippy lints in Cargo.toml.
- [Cloudhal threat model (alpha)](https://cloudhal.dev/docs/security/threat-model.md): Cloudhal lets AI agents change websites. The central security promise: an agent can only do what its scopes allow, every change is recorded and reversible, and nothing goes live without a person.

## Architecture decisions

- [ADR-0001: JSON Schema is the contract source; TypeScript and Rust are generated](https://cloudhal.dev/docs/adr/0001-contract-pipeline.md): Cloudhal ships in TypeScript first and moves the core to Rust later. Both must agree on Project/Site/Page/Section/ContentEntry/Snapshot/SkillManifest without hand-maintained duplicates.
- [ADR-0002: Thin SQL/blob driver interface, batch-only, two backends](https://cloudhal.dev/docs/adr/0002-storage-interface.md): The self-host promise is real only if the same code runs on Cloudflare (D1/R2/KV) and on a laptop (SQLite + filesystem).
- [ADR-0003: Studio is a Vite React SPA on Kumo; Astro only renders sites](https://cloudhal.dev/docs/adr/0003-studio-architecture.md): The initial plan proposed Astro + React islands for Studio with Kumo UI. Verified today: React context does not cross Astro islands (Kumo's portal/toast/command-palette providers cannot be shared), children from .astro…
- [ADR-0004: Stateless MCP server (spec 2026-07-28) with layered approval](https://cloudhal.dev/docs/adr/0004-mcp-server.md): MCP spec 2026-07-28 removed sessions and initialize; every request is self-describing, elicitation became multi-round-trip (inputrequired + retry with inputResponses), SSE is deprecated, Dynamic Client Registration is…
- [ADR-0005: Skills follow the Agent Skills spec; Cloudhal data lives in metadata](https://cloudhal.dev/docs/adr/0005-skills-format.md): The Agent Skills specification (agentskills.io) defines exactly six frontmatter fields (name, description, license, compatibility, metadata, allowed-tools); metadata is a string-to-string map.
- [ADR-0006: Node-first toolchain and runtime; Bun supported, not primary](https://cloudhal.dev/docs/adr/0006-toolchain-and-runtime.md): Cloudhal must run on Cloudflare (workerd) and self-hosted. Wrangler, miniflare and the Vite plugin are officially Node-only and have open Bun hangs; Bun 1.4 is a weeks-old Rust rewrite that mis-reports its Node ABI.
- [ADR-0007: Apache-2.0 open core, DCO, Contributor Covenant 3.0](https://cloudhal.dev/docs/adr/0007-license-and-community.md): An open-source launch needs the license, contribution terms and conduct policy settled before the first external PR; changing them later breaks trust.
- [ADR-0008: Precompiled schema validators; D1 tested through Miniflare](https://cloudhal.dev/docs/adr/0008-runtime-validation-and-d1-testing.md): Agent mutations must be validated against the contracts at the write boundary, in Node and on Cloudflare Workers. Ajv compiles schemas with new Function, which Workers forbid.
- [ADR-0009: Renderer reads live nodes in dev and a snapshot in builds; starters own routes](https://cloudhal.dev/docs/adr/0009-renderer-sources-and-local-dev.md): The renderer must serve two situations with one code path: an author previewing drafts locally, and a production build that must be reproducible from an approved snapshot.
- [ADR-0010: Better Auth for human identity, tenants and (later) MCP authorization](https://cloudhal.dev/docs/adr/0010-auth-better-auth.md): Cloudhal needs user authentication for Studio, a tenant/role model, non-interactive credentials for agents, and — per MCP 2026-07-28 — an OAuth 2.1 authorization server whose tokens the MCP server verifies.
- [ADR-0011: Agent layer — policy engine, audit, skills and the MCP server](https://cloudhal.dev/docs/adr/0011-agent-layer.md): Sprint 5 makes Cloudhal usable by agents: an MCP client must be able to create content, see a preview, and ask to publish — with publishing stopping at a human.
- [ADR-0012: Cloudflare deployment — two Workers, pointer-flip publishing, Workers Cache](https://cloudhal.dev/docs/adr/0012-cloudflare-deployment.md): Sprint 6 puts a Cloudhal site on Cloudflare. Publishing and rollback must be instant and must not need a build server: agents publish through MCP, and an approved publish should be live on the next request.
- [ADR-0013: Publishing to npm — sources in the monorepo, dist in the tarball](https://cloudhal.dev/docs/adr/0013-npm-packaging.md): Every package exports its TypeScript sources so the monorepo needs no build step (Node 24 strips types, Vite/wrangler/Vitest read TS).
- [ADR-0014: Approvals happen in Studio, once, for the state the person saw](https://cloudhal.dev/docs/adr/0014-out-of-band-approvals.md): ADR-0004/0011 approved gated calls (publish, rollback, delete) through MCP elicitation, with a signed confirmToken for clients that cannot elicit. The review confirmed two flaws.
- [ADR-0015: Agent modes — how independently an agent works](https://cloudhal.dev/docs/adr/0015-agent-modes.md): Owners chose raw scopes when creating an agent key. Scopes say what an agent may touch, not how independently it works — the question an owner actually has, and the one IDE agents answer with permission modes (plan,…
- [ADR-0016: Time-boxed elevation — a more autonomous mode, for a while](https://cloudhal.dev/docs/adr/0016-time-boxed-elevation.md): Owners pick a mode per key (ADR-0015). Often they want more autonomy only for a while: "let the newsroom agent publish small updates on its own during launch day", "let it edit freely for the next hour while I watch".
- [ADR-0017: Taxonomy and redirects are graph nodes; content references terms by id](https://cloudhal.dev/docs/adr/0017-taxonomy-and-redirects.md): Taxonomy was one field: ContentEntry.tags, up to 50 free slugs. Tags had no name, description or archive; there were no categories, no hierarchy and no primary term.
- [ADR-0018: Staff roles are scope sets; agent keys never exceed their creator; invites are one-time links](https://cloudhal.dev/docs/adr/0018-roles-and-invites.md): Every signed-in person had scopes, and sign-up closed after the owner, so a team could not be added safely. The scopes model already treats people and agents alike, and agent keys, modes, elevations and approvals…
- [ADR-0019: Menus are Menu nodes holding a tree of id-referenced items](https://cloudhal.dev/docs/adr/0019-navigation-menus.md): The header was derived from top-level pages. There was no editor, no footer menu, and no tree that a docs sidebar could reuse. Links typed as URLs break when slugs change.
- [ADR-0020: Assets are content-addressed nodes with SHA-256; uploads are SSRF-safe; scopes asset:upload / asset:manage](https://cloudhal.dev/docs/adr/0020-assets-and-media.md): Images were URLs typed by hand. There was no upload, no library, and no way to serve responsive images. Scholarly and data sites (the third vertical) need checksums and external storage for large files.
- [ADR-0021: Site analytics — first-party cookie-less script, Workers Analytics Engine via bindings, D1 rollups, analytics:read](https://cloudhal.dev/docs/adr/0021-site-analytics.md): Editors and agents cannot see what readers read. Most page views on a deployed site are served from Workers Cache, where the site Worker does not run, so counting in the Worker sees only cache misses.
- [ADR-0022: Reader comments — guest comments held for moderation, D1 outside the graph, first-party proof of work, agents label and hide while people approve](https://cloudhal.dev/docs/adr/0022-reader-comments.md): Sites have no way for readers to respond. Comments are the first free-form visitor text Cloudhal stores and the first that reaches agents, so they bring spam, privacy and prompt-injection risk.
- [ADR-0023: Schedules — content releases pinned to exact versions, render-time time gates, one every-minute tick, deterministic jobs plus MCP agent tasks](https://cloudhal.dev/docs/adr/0023-schedules.md): Editors need to publish at a set time, keep content under embargo, take campaigns down on a date and run recurring checks; agents need a safe way to propose these and to do recurring work unattended.
- [ADR-0024: Snapshot bundles — the site Worker loads a published snapshot from a few shard objects](https://cloudhal.dev/docs/adr/0024-snapshot-bundles.md): The site Worker renders a published snapshot. Its node bodies live in R2 as nodes/<hash>.json, and SnapshotSource read them one get each on the first render of a snapshot in an isolate: after every cold start and after…
- [ADR-0025: Email delivery — one MailSender on the Cloudflare Email Service binding](https://cloudhal.dev/docs/adr/0025-email-delivery.md): MailSender has existed since RFC-0005 without an implementation, so invites were copied by hand and only an Administrator could reset a password; an Owner who forgot theirs had nobody to ask.
- [ADR-0026: HTML bodies are sanitized at render time](https://cloudhal.dev/docs/adr/0026-html-body-sanitizer.md): Content bodies and rich-text sections can be markdown or html. Markdown has always been rendered as data. HTML was published exactly as stored, on the assumption that only humans write it.
- [ADR-0027: cloudhal.json settings for observability and placement](https://cloudhal.dev/docs/adr/0027-observability-and-placement.md): Both Workers logged every request, with no way to sample short of editing generated files that the next deploy overwrites. Traces could not be turned on. The admin Worker makes several D1 round trips per request.
- [ADR-0028: Body blocks and body operations](https://cloudhal.dev/docs/adr/0028-body-blocks-and-operations.md): People. Bodies were edited in a monospace textarea. Studio now has a rich editor that keeps markdown canonical (phase 1).
- [ADR-0029: In-editor AI on Workers AI, model chosen per site](https://cloudhal.dev/docs/adr/0029-ai-commands-and-model-choice.md): What editors lack. Since RFC-0014 they have a real editor, block ids and proposals, but no help with the text itself.
- [ADR-0030: One block registry for page sections and bodies](https://cloudhal.dev/docs/adr/0030-block-registry.md): Page sections are a closed set of four kinds, and markdown bodies have no typed parts. Editors want callouts, buttons, videos and FAQs, and agents can only describe them in prose.
- [ADR-0031: A generator that writes data — theme settings, draft plans, Kumo catalog panels](https://cloudhal.dev/docs/adr/0031-theme-and-ui-generator.md): Starting a site and giving it a look is still manual, and agents have no typed handle on design. Changing the look means editing CSS, which is code.
- [ADR-0032: Studio messages are an ICU MessageFormat 1 subset, compiled to data at build time](https://cloudhal.dev/docs/adr/0032-icu-messages.md): Studio's catalogs knew only {name} substitution. English's two plural forms were coded by hand (46 …One key pairs, 26 count ternaries), and grammar was handled by passing several forms of a word.
- [ADR-0033: Right-to-left Studio — logical properties, dir from the registry, a Kumo patch until upstream](https://cloudhal.dev/docs/adr/0033-rtl-layout.md): No right-to-left language (Arabic, Hebrew, Persian, Urdu) can be added to Studio yet. DESIGN.md §1 lists RTL as a prerequisite. Measured on main at 7b1ec23 with node scripts/i18n-audit.ts:
- [ADR-0034: Translation workflow — catalogs stay in the repo, ICU JSON exchange, Weblate self-hosted (or Tolgee), AI drafts reviewed by people](https://cloudhal.dev/docs/adr/0034-translation-platform.md): Studio's catalogs are TypeScript modules: apps/studio/src/i18n/<locale>.ts and lazy/<ns>.<locale>.ts. - English is the source and the type.
- [ADR-0035: Published content in several languages — one node per locale in translation groups, locale in the URL, gated agent translation, Site = publication](https://cloudhal.dev/docs/adr/0035-multilingual-publishing.md): Pages, entries, terms, menus and assets already carry a locale or per-locale labels, but only the default locale is served and nothing links translations.
- [ADR-0036: Multi-site installations — one Studio, one D1/R2, many isolated sites served by hostname](https://cloudhal.dev/docs/adr/0036-multi-site-installations.md): Every Cloudhal site is a whole installation today: a site Worker, an admin Worker (Studio), a D1 and an R2 for one CLOUDHALSITEID. A second site means a second Studio, login, team and deploy.
- [ADR-0037: Domain strategy: cloudhal.com and cloudhal.dev](https://cloudhal.dev/docs/adr/0037-domain-strategy.md): Cloudhal owns exactly two domains, cloudhal.com and cloudhal.dev, and will not buy a third. The repo already uses https://cloudhal.dev/schemas/v1/ as JSON Schema $id, https://cloudhal.dev/docs, the bot User-Agent page…
- [ADR-0038: Public playground: one SQLite Durable Object per visitor, store and renderer inside it, deny-list guard with a route walk](https://cloudhal.dev/docs/adr/0038-public-playground.md): Trying Cloudhal needs Node, wrangler and a Cloudflare account. RFC-0036 proposes try.cloudhal.com (ADR-0037): every visitor gets a private, disposable Cloudhal (Studio, API and rendered site) with no account.
- [ADR-0039: cloudhal.dev: Starlight over the repo's docs, a link contract checked in CI, docs for agents](https://cloudhal.dev/docs/adr/0039-cloudhal-dev-docs-site.md): ADR-0037 makes cloudhal.dev the developer domain and the only copy of the docs. Packages, cloudhal.com, the schemas' $ids and the fetcher's User-Agent already link there.
- [Architecture Decision Records](https://cloudhal.dev/docs/adr.md): One file per decision, numbered, immutable once accepted (write a new ADR to supersede). Template:

## Proposals

- [Proposals (RFCs)](https://cloudhal.dev/docs/rfcs.md): Every proposals (rfcs) in Cloudhal's repository, with its status.
- [RFC-0001: Site Graph contracts v1](https://cloudhal.dev/docs/rfcs/0001-site-graph.md): A site is a graph of typed, individually versioned nodes. Version 1 defines seven contracts — Project, Site, Page, Section, ContentEntry, Snapshot, SkillManifest — as JSON Schema with generated TypeScript and Rust…
- [RFC-0002: Taxonomy (categories, tags) and redirects](https://cloudhal.dev/docs/rfcs/0002-taxonomy-and-redirects.md): Categories, tags and custom taxonomies become graph nodes: a Taxonomy holds the rules (hierarchy, who may add terms, archive and feed settings), a Term is one concept with per-locale names and synonyms, and content…
- [RFC-0003: Navigation (menus)](https://cloudhal.dev/docs/rfcs/0003-navigation.md): A site gets named menus (primary, footer, later sidebar for docs), each a Menu node with rev, CAS and snapshots, holding an ordered tree of items.
- [RFC-0004: Assets and the media library](https://cloudhal.dev/docs/rfcs/0004-assets-and-media.md): Media files become Asset graph nodes (asset): typed (image, video, audio, document, data, other), identified by the SHA-256 of their bytes, stored once per site under a content-addressed blob key, or linked to external…
- [RFC-0005: Staff roles and invites](https://cloudhal.dev/docs/rfcs/0005-roles-and-invites.md): Every signed-in person gets today, so a deployment cannot safely have a second person. This RFC adds five Ghost-like staff roles (Owner, Administrator, Editor, Author, Contributor) that are named sets of the scopes the…
- [RFC-0006: Site analytics](https://cloudhal.dev/docs/rfcs/0006-site-analytics.md): Every Cloudhal site gets cookie-less, first-party analytics that work on Workers Free, on workers.dev and on custom domains, and need no Cloudflare API token.
- [RFC-0007: Reader comments](https://cloudhal.dev/docs/rfcs/0007-reader-comments.md): Cloudhal sites get first-party reader comments that work on Workers Free, on workers.dev and on custom domains, without a third-party script by default.
- [RFC-0008: Schedules — releases, embargoes, scheduled publishing and automations](https://cloudhal.dev/docs/rfcs/0008-schedules.md): Cloudhal gets one scheduling model for content and one for automations, both with D1 as the source of truth and nothing trusted to a timer.
- [RFC-0010: Snapshot bundles — one read to load a published site](https://cloudhal.dev/docs/rfcs/0010-snapshot-bundles.md): A published site is rendered from an immutable snapshot whose node bodies live in R2 as one object per node (nodes/<hash>.json).
- [RFC-0011: Email delivery with Cloudflare Email Service](https://cloudhal.dev/docs/rfcs/0011-email-delivery.md): Cloudhal has had a MailSender interface since RFC-0005 but ships no sender, so invites are copied by hand and a forgotten password needs an Administrator.
- [RFC-0012: Sanitize HTML bodies before they reach a page](https://cloudhal.dev/docs/rfcs/0012-html-body-sanitizer.md): A content body or rich-text section can be markdown or html. Markdown is rendered as data: raw HTML is escaped and URLs are checked. HTML is published exactly as stored.
- [RFC-0013: cloudhal.json settings for observability and placement](https://cloudhal.dev/docs/rfcs/0013-deployment-observability-and-placement.md): Two optional cloudhal.json keys are added. observability sets the log sampling rate and turns on Workers Traces for both Workers. placement: "smart" turns on Smart Placement for the admin Worker.
- [RFC-0014: Body blocks and body operations](https://cloudhal.dev/docs/rfcs/0014-body-blocks-and-operations.md): Bodies stay markdown. Markdown is written by people, agents and cloudhal push alike. Cloudhal adds two things: - a versioned profile, "Cloudhal Markdown v1"; - a block index the store maintains: a stable id, content…
- [RFC-0015: Block registry — typed blocks for page sections and bodies](https://cloudhal.dev/docs/rfcs/0015-block-registry.md): What: one registry of block types, a callout or an embedded video for example. Each type has a name, a props schema, an Astro component and an editor form.
- [RFC-0016: In-editor AI commands and model choice](https://cloudhal.dev/docs/rfcs/0016-ai-commands-and-model-choice.md): Editors get an AI menu on selected blocks: improve, shorten, expand, fix spelling and grammar, change tone, translate, or a short instruction of their own.
- [RFC-0017: Theme and UI generator — design settings, generated pages and Kumo catalog panels](https://cloudhal.dev/docs/rfcs/0017-theme-and-ui-generator.md): What. A generator that writes a site's design and structure as data, from a prompt or by an agent: design settings (colors, type, spacing) in Site.theme.config, pages made of registry blocks, and Studio panels described…
- [RFC-0018: Theme packages and the theme kit — many themes, one engine, generator-ready](https://cloudhal.dev/docs/rfcs/0018-theme-packages-and-theme-kit.md): Where this fits. RFC-0020 makes building a live, streamed conversation that writes generative UI surfaces. This RFC defines what a theme gives that loop: a catalog of components with their renderers, settings, styles,…
- [RFC-0019: Newsroom features — bylines, corrections and search](https://cloudhal.dev/docs/rfcs/0019-newsroom-authors-corrections-search.md): Bylines are an author taxonomy. An author is a term with a bio, a portrait and profile links, and gets the archive, feed, sitemap entry, redirects and Studio screens that categories already have.
- [RFC-0020: Agentic build — generative UI surfaces, streamed build sessions and interactive components](https://cloudhal.dev/docs/rfcs/0020-agentic-build-and-generative-ui.md): Pages and articles can hold generative UI surfaces. A surface is a flat list of catalog components with ids, children and props, plus a data model.
- [RFC-0021: DESIGN.md and the agent design loop](https://cloudhal.dev/docs/rfcs/0021-design-md-and-the-agent-design-loop.md): Agents building Cloudhal sites have no taste to follow and no eyes. They get no design guidance, and previewpage returns HTML with a neutral stylesheet, not the theme.
- [RFC-0022: Surface tools — computed values, inputs, charts and tables](https://cloudhal.dev/docs/rfcs/0022-surface-tools-computed-values-inputs-charts-tables.md): Surfaces can show, switch and reveal, but they cannot compute, take a typed value or draw data. This RFC adds four things to the catalog: - Computed values: arithmetic, choice and aggregate functions in the existing…
- [RFC-0023: Design tokens v2 and surface styles](https://cloudhal.dev/docs/rfcs/0023-design-tokens-v2-and-surface-styles.md): Sites built from the same structure look alike, because a theme exposes four colors, four font stacks and three corner styles, and its CSS hard-codes about a hundred greys.
- [RFC-0024: Motion, scroll and ambient effects](https://cloudhal.dev/docs/rfcs/0024-motion-scroll-and-ambient-effects.md): Cloudhal pages cannot move: there is no transition, animation or reduced-motion rule anywhere in the theme or the renderer.
- [RFC-0025: Site chrome and overlays](https://cloudhal.dev/docs/rfcs/0025-site-chrome-and-overlays.md): Every Cloudhal site has the same top and bottom. The blog theme's Base.astro hard-codes: - a text site name, a menu and a search box; - a "Built with Cloudhal" footer;
- [RFC-0026: Icons](https://cloudhal.dev/docs/rfcs/0026-icons.md): Public sites get one curated icon set: about 90 semantic names (menu, close, arrow-right, mail, github, …) drawn from Phosphor (the family Studio already uses), rendered as inline SVG strings by @cloudhal/core-ts/icons.
- [RFC-0027: Carousel](https://cloudhal.dev/docs/rfcs/0027-carousel.md): A Carousel catalog component: its children are slides, in four variants (hero, rail, gallery, testimonials). It works without JavaScript (a scroll-snap track, markers as real links) and a small first-party module adds…
- [RFC-0028: Image placeholders and fit](https://cloudhal.dev/docs/rfcs/0028-image-placeholders-and-fit.md): Images get a calm placeholder that needs no JavaScript (a tiny blurred LQIP over the image's dominant colour), painted on a wrapper rather than on the <img>.
- [RFC-0029: Search providers and the search UI](https://cloudhal.dev/docs/rfcs/0029-search-providers-and-search-ui.md): Site search gets a provider interface in @cloudhal/core-ts. Today's FTS5 index becomes the default fts5 provider.
- [RFC-0032: ICU plurals and select in Studio messages, compiled at build time](https://cloudhal.dev/docs/rfcs/0032-icu-messages.md): Studio's messages gain the ICU MessageFormat 1 constructs a translation needs and English hides: plural (CLDR categories, exact =n, #), select, selectordinal and number arguments.
- [RFC-0033: Multilingual publishing, language editions and publications](https://cloudhal.dev/docs/rfcs/0033-multilingual-publishing.md): One-language sites stay the default and cost nothing. A site may publish in several languages, and a project may run several publications (sites), each with its own theme, domain, languages and editorial policy.
- [RFC-0034: Multi-site installations: one Studio, many isolated sites](https://cloudhal.dev/docs/rfcs/0034-multi-site-serving-and-projects.md): One self-hosted Cloudhal installation (one Studio, one D1, one R2 in one Cloudflare account) manages any number of sites.
- [RFC-0035: Publishing one page without a release](https://cloudhal.dev/docs/rfcs/0035-page-status-without-a-release.md): A page's own status can be changed directly, like an article's: Studio shows Publish as a draft page's next step and Publish / Unpublish in the Pages list's row menu, and the MCP tool updatepage takes an optional…
- [RFC-0036: Public playground: a disposable Cloudhal per visitor on a SQLite Durable Object](https://cloudhal.dev/docs/rfcs/0036-public-playground.md): try.cloudhal.com gives every visitor their own Cloudhal, with no account: Studio, the API and the rendered site.
- [RFC-0037: cloudhal.dev, the developer site: docs from the repo, a link contract, docs for agents](https://cloudhal.dev/docs/rfcs/0037-cloudhal-dev-docs-site.md): cloudhal.dev becomes an Astro Starlight site in apps/docs, built from the Markdown in the monorepo's docs/ folder and deployed as the cloudhal-dev Worker that already serves the schemas.

## JSON Schemas (v1)

- [AnalyticsBeacon](https://cloudhal.dev/schemas/v1/analytics-beacon.schema.json)
- [AnalyticsEvent](https://cloudhal.dev/schemas/v1/analytics-event.schema.json)
- [Asset](https://cloudhal.dev/schemas/v1/asset.schema.json)
- [Automation](https://cloudhal.dev/schemas/v1/automation.schema.json)
- [CommentSubmission](https://cloudhal.dev/schemas/v1/comment-submission.schema.json)
- [Comment](https://cloudhal.dev/schemas/v1/comment.schema.json)
- [Common](https://cloudhal.dev/schemas/v1/common.schema.json)
- [ContentEntry](https://cloudhal.dev/schemas/v1/content-entry.schema.json)
- [Glossary](https://cloudhal.dev/schemas/v1/glossary.schema.json)
- [Menu](https://cloudhal.dev/schemas/v1/menu.schema.json)
- [Page](https://cloudhal.dev/schemas/v1/page.schema.json)
- [Project](https://cloudhal.dev/schemas/v1/project.schema.json)
- [Redirect](https://cloudhal.dev/schemas/v1/redirect.schema.json)
- [Release](https://cloudhal.dev/schemas/v1/release.schema.json)
- [ScheduleRun](https://cloudhal.dev/schemas/v1/schedule-run.schema.json)
- [Section](https://cloudhal.dev/schemas/v1/section.schema.json)
- [Site](https://cloudhal.dev/schemas/v1/site.schema.json)
- [SkillManifest](https://cloudhal.dev/schemas/v1/skill-manifest.schema.json)
- [Snapshot](https://cloudhal.dev/schemas/v1/snapshot.schema.json)
- [Taxonomy](https://cloudhal.dev/schemas/v1/taxonomy.schema.json)
- [Term](https://cloudhal.dev/schemas/v1/term.schema.json)
