# Plan: public website and documentation site **Date:** 2026-06-04 · **Status:** ready to build Decisions for this work are recorded in [ADR-website-001](../adr/20260604-adr-website-001.md): Astro 6 + Starlight + Tailwind v4; asciinema demos reusable in docs; the in-page WASM playground deferred behind a stable demo seam; portable static hosting (Vercel target); monorepo (`website/`); website is the canonical docs home; full-feature-set docs with "planned" callouts; install docs cover prebuilt binaries + package managers. This plan is the *how*. ## Repository layout The site lives under `website/` in this repo; the crate stays at the root. ``` website/ ├── package.json # pnpm; astro, @astrojs/starlight, tailwind v4 ├── astro.config.mjs # Starlight integration + sidebar nav ├── src/ │ ├── pages/index.astro # marketing landing (custom, not Starlight) │ ├── components/ │ │ ├── Demo.astro # demo SLOT — the WASM-playground seam │ │ └── Cast.astro # asciinema-player island wrapper │ ├── content/docs/ # Starlight MDX docs (the bulk of the work) │ └── styles/ # shared Tailwind + Starlight theme tokens ├── public/casts/ # recorded *.cast asciinema files ├── README.md # local dev + recording recipe └── STYLE.md # living documentation style guide ``` Root `.gitignore` gains `website/node_modules`, `website/dist`, `website/.astro`. ## Documentation inventory (grounded — drives Phase D scope) Built from `docs/handoff/55–59`, `docs/adr/*`, the command REGISTRY (`src/dsl/grammar/mod.rs:603`, which also auto-assembles in-app `help`), the `Command` enum (`src/dsl/command.rs:149`), and `src/friendly/strings/en-US.yaml` — **not** the coarse `requirements.md` checkboxes (handoff-59 found those ~46% mis-marked; they now use a `[/]` "partial" legend — trust the code, not the marker). Refreshed **2026-06-09 after merging `main`**, which added the show-list/detail, `help `, and compound-PK FK surface (see the dedicated bullet below). Test state: **2193 passing, 0 failing, 1 ignored.** **SHIPPED — document as-is (the doc core):** - Input modes: simple, advanced (SQL), `:` one-shot escape, `mode` command, per-project mode restore (ADR-0003/0015/0037). - Full simple-mode command surface: create/drop table; add/drop/rename/ change column; add/drop 1:n relationship (named, ON DELETE/UPDATE CASCADE/SET NULL/RESTRICT, `--create-fk`); add/drop index; insert/update/ delete (required WHERE + `--all-rows`; complex WHERE: AND/OR/NOT, LIKE, IS NULL, IN, BETWEEN); show table/data (where/limit); add/drop constraint; explain (ADR-0009/0013/0014/0025/0026/0028/0029). - Full advanced-mode SQL: CREATE/DROP/ALTER TABLE (cols, constraints, inline + table FKs, rename, alter-column-type), CREATE [UNIQUE]/DROP INDEX; SELECT (joins, GROUP BY/HAVING, ORDER BY, LIMIT/OFFSET, UNION/INTERSECT/EXCEPT, WITH [RECURSIVE] CTEs); INSERT (multi-row, ON CONFLICT, RETURNING)/UPDATE/ DELETE; full expression grammar incl. CASE, CAST, curated functions; EXPLAIN over SQL (ADR-0030–0039). - Types: all ten, advanced-mode SQL aliases, serial/shortid auto-fill (ADR-0005/0011/0017/0018). Constraints: PK incl. compound, NOT NULL, UNIQUE, CHECK, DEFAULT, FK (ADR-0029/0013/0035). - Undo/redo, history.log journal, replay, `--resume`, `--no-undo` (ADR-0006/0034). Projects & storage: project.yaml + CSV + history.log, save/save as/load/new/rebuild, temp projects, `--data-dir` (ADR-0004/0015). Export/import (zip), clipboard copy/copy all/copy last (ADR-0007/0041). - Friendly errors (all five categories) + validity indicator (ADR-0019/0027), DSL→SQL teaching echo (ADR-0038), EXPLAIN plan tree (ADR-0028), box-drawing tables (ADR-0016), tab completion + syntax highlighting + in-line editing (ADR-0022). - **Added by the `main` merge (2026-06-09):** schema-inspection commands `show tables` / `show relationships` / `show indexes` and the singular `show relationship ` / `show index ` detail views (V5/V5a); `help []` per-command detail + `help types` + general reference (H3); **compound-primary-key foreign-key references** — DSL `from

.(a, b) to .(x, y)` and SQL `FOREIGN KEY (a, b) REFERENCES P(x, y)` (single-column form unchanged) (ADR-0043, T3); friendlier parse-error near-miss messaging (H1a, ADR-0042). These need coverage: a schema-inspection page (the `show` family) and compound-FK examples on the Relationships page. **DOCUMENT WITH CAVEAT:** `add unique index` is advanced-only; simple-mode table rename is intentionally absent (rename is `ALTER TABLE … RENAME TO`); `hint` (H2) is still partial; a compound-FK *violation* message names only the first column pair (enforcement is correct — a messaging-only residual). **OMIT or MARK "planned":** multi-line input (I1), readline shortcuts (I1b), in-flight cancellation / query timeout (I5/B3), `seed` (SD1), `m:n` convenience (C4), one-step modify relationship (C3a), relationship line-art (V1), ER-diagram export (V3), session-log + Markdown export (V4). **Mine verbatim for docs:** `en-US.yaml` `help.app.*`, `help.ddl.*`, `help.data.*`, `help.types_reference`, `parse.usage.*` (one-line syntax templates), `hint.*` — keeps docs and in-app help consistent. ## Phases ### A — Scaffold `pnpm create astro@latest` (Starlight template) in `website/`; `astro add tailwind` (Tailwind v4 via `@tailwindcss/vite`); add `@astrojs/starlight-tailwind`. Confirm `pnpm dev` serves and `pnpm build` emits a static `dist/`. Echo build steps for traceability. ### B — Landing page Custom `src/pages/index.astro` (Starlight owns `/docs/*`). Hero + value prop ("learn relational databases by doing"), feature highlights from the inventory, an embedded demo cast above the fold. Use the `frontend-design` skill to avoid generic AI aesthetics; honour NFR-4/5/7 (distinctive design, meaningful colour, light/dark). ### C — asciinema recording workflow Record real `rdbms-playground` sessions to `public/casts/*.cast` using a **scripted-input driver** (e.g. `asciinema-automation`/autocast, or an expect/doitlive script) for paced, re-recordable demos. Record at a fixed sensible cols×rows; provide light + dark player themes. `Cast.astro` wraps `asciinema-player` as a `client:visible` island; the same component embeds casts inline in docs. Document the recipe in `website/README.md`. (`asciinema` 2.4.0 is installed.) ### D — Documentation (the bulk) **Five** top-level sidebar sections (autogenerated per directory). The key split: *Using the playground* = the application you drive; *Reference* = the database language you build with. - **Getting started** — install (prebuilt binaries + package managers), first project, simple vs. advanced mode, the example library. - **Using the playground** — command-line options; the assistive editor (completion, syntax highlighting, the `[ERR]`/`[WRN]` validity indicator, hints, in-line editing); the output pane (PageUp/PageDown scrolling — the fuller V4 session-log / Markdown export is *planned*, mark it); projects (save / load / new / rebuild); undo, redo & history (+ replay); export & import (E2 recipes); copy to clipboard; getting help (`help` / `help ` / `hint`). (ADR-0003 "app-level commands" + ADR-0022/0027 typing assistance + the CLI.) - **Guides** — task walkthroughs. - **Reference** — the database language: Tables, Columns, Relationships, Indexes, Constraints, Inserting & editing data, Querying & inspecting (`show` / `select`), Types, Query plans (EXPLAIN), Errors explained, the simple-command → SQL teaching echo. - **Concepts** — the *why*: projects & storage model, the derived database, how undo works. **Surface the assistive editor prominently** — it is a differentiator and most helps beginners: a landing-page card + a Getting-started mention, both linking into *Using the playground*. It is prime asciinema-cast material (completion / validity indicator are motion a still code block can't show). Build order: Tier 1 simple-mode reference + types + constraints + input modes + mined help/usage strings → Tier 2 advanced SQL + relationships + project lifecycle + undo/history → Tier 3 teaching echo + EXPLAIN + errors + completion/highlighting → Tier 4 clipboard + hints + editing. Conventions live in the **living style guide** `website/STYLE.md` (binding rules from ADR-website-001 §7 — no engine name, **no "DSL"**, "planned" callouts — plus finer conventions and an open-decisions log for depth/splitting/example dataset/etc. as they settle). Sources to mine: `src/dsl/command.rs`, `src/dsl/grammar/*`, the REGISTRY, `en-US.yaml`, `docs/adr/*`, `docs/simple-mode-limitations.md`. ### E — Hosting & portability Keep the default static build (no adapter); `dist/` deploys to Vercel or any static host. `website/README.md` notes the Vercel preset (root dir `website/`) and the one-line `@astrojs/vercel` switch if SSR is ever needed. ## Demo seam (WASM hook) `Demo.astro` exposes a stable contract (`{ src, title, height, autoplay }`). At launch it renders `Cast.astro`; later a `Playground.astro` WASM island swaps in behind the same props on the landing page and in docs, with zero call-site changes. Boundary details are in ADR-website-001 §3. ## Verification - `pnpm dev` renders landing + docs; `pnpm build` emits a clean static `dist/` with no errors/warnings. - Landing shows at least one playing `.cast`; the same component renders a cast inline in a docs page (proves reuse). - Starlight link-check passes (broken internal links fail the build). - Docs grep clean of forbidden terms: **no "DSL"**, no engine name. - A `dist/` static deploy works on Vercel (manual import) — confirms portability. (No CI gate yet, per ADR-website-001 §4.) ## Notes / recommendations (non-blocking) - **Doc drift:** consider generating the command reference from source (the `help` REGISTRY / `en-US.yaml`) rather than hand-writing all of it. - **Accessibility/SEO:** pair each hero `.cast` with a text transcript or the equivalent docs snippet. - **Branding/domain & analytics** unspecified — assume none until decided; no third-party trackers without consent. - Tailwind v4 + Starlight have occasional theme-token friction; the `@astrojs/starlight-tailwind` plugin is the supported bridge. - Starlight ships local search (Pagefind) by default. - No `README.md` exists at the repo root yet — wanted for the destination repo; out of this plan's core scope but flagged.