diff --git a/lib/rdoc/generator/template/aliki/DESIGN.md b/lib/rdoc/generator/template/aliki/DESIGN.md
new file mode 100644
index 0000000000..b4ca6b945b
--- /dev/null
+++ b/lib/rdoc/generator/template/aliki/DESIGN.md
@@ -0,0 +1,536 @@
+# DESIGN.md
+
+Single source of truth for the **Aliki** theme's visual language. The generated
+HTML documentation — served from `localhost` (`rdoc --server`),
+[docs.ruby-lang.org](https://docs.ruby-lang.org), and static GitHub Pages —
+implements what's specified here. The implementation lives in one stylesheet,
+[`css/rdoc.css`](css/rdoc.css). When a value here drifts from that file, **the
+stylesheet is wrong** and should be brought back in line.
+
+This document follows the
+[Stitch DESIGN.md format](https://github.com/VoltAgent/awesome-design-md) —
+nine sections covering theme, color, type, components, layout, elevation,
+guardrails, responsive behavior, and an agent quick reference.
+
+> Scope: this is the **visual** contract only. It does not cover the generator
+> pipeline, templates, or JS architecture.
+
+---
+
+## 1. Visual Theme & Atmosphere
+
+**Personality.** Modern, light, content-first. Aliki is a quiet reading surface
+for Ruby API docs — the documentation is the product, and the chrome recedes.
+It should feel like a well-made developer-docs site, not a framework's default
+output.
+
+**Context of use.** Developers read reference docs while coding — scanning for a
+method, a signature, a constant. The job is to find the thing and read it
+comfortably. Reading measure and code legibility matter more than decoration.
+
+**Mood.** Calm and neutral with a single decisive accent. Warm "stone" grays
+carry the text hierarchy; one red accent carries identity and wayfinding
+(headings, links-on-hover, active TOC, signature cards). Dark mode is a
+first-class, hand-tuned surface — not an inverted afterthought.
+
+**Density.** Comfortable, not cramped. A capped 800 px reading measure, generous
+`--space-12` page padding, and a token-driven spacing rhythm. Every element
+earns its space; there is no decorative chrome.
+
+**Anti-references.** What Aliki must **not** look or feel like:
+
+- **Not Darkfish** — the predecessor theme it deliberately departs from.
+- **Not corporate** — no heavy, dense doc-portal styling.
+- **Not cluttered** — sidebars and chrome stay quiet; content leads.
+
+**References (inferred from the implementation, not externally specified).** The
+system-font stack, GitHub-style heading anchors, and a flat token system place
+Aliki in the family of modern, lightweight developer-doc themes. Treat positive
+references as open — the brand is currently defined by its principles and
+anti-references, not a named lookalike.
+
+**Surface contexts.**
+
+| Surface | Theme | Atmosphere |
+|----------------------------|----------------------------------------|-------------------------------------------------------------------|
+| Generated docs (static) | Light default · Dark via `data-theme` | The primary reading surface; must work offline / from static hosts |
+| Live server (`--server`) | Same light/dark | Servlet pages (root, 404) use lighter chrome — no header/TOC/footer |
+
+Aliki ships a **single brand palette** (red) with explicit **light and dark**
+variants — not a multi-theme system.
+
+## 2. Color Palette & Roles
+
+All color is defined as CSS custom properties in
+[`css/rdoc.css`](css/rdoc.css): light tokens in `:root`, dark tokens in a
+`[data-theme="dark"]` override block that re-declares **only** what differs.
+Components reference semantic tokens, never raw hex.
+
+### Semantic roles
+
+| Role | Token (`--color-…`) | Meaning |
+|--------------------|----------------------------|--------------------------------------------------|
+| Brand accent | `accent-primary` | Identity + wayfinding (headings, active TOC, sig border) |
+| Accent hover | `accent-hover` | Hover/darker accent |
+| Accent subtle | `accent-subtle` | Tinted accent fills (buttons, focus ring) |
+| Primary text | `text-primary` | Body copy, method names |
+| Secondary text | `text-secondary` | Meta, secondary labels, branch |
+| Tertiary text | `text-tertiary` | Placeholders, snippets, signatures, footer-bottom |
+| Page background | `background-primary` | Main surface |
+| Raised/sunk bg | `background-secondary` / `-tertiary` | Footer, modal close, hover fills |
+| Borders | `border-subtle` / `-default` / `-emphasis` | Hairlines from quiet → strong |
+| Link | `link-default` / `link-hover` | Body links (default = text color; hover = accent) |
+| Code surface | `code-bg` / `code-border` | `
` / inline `code` |
+| Signature card | `sig-bg` / `sig-border` | Method/attribute header card |
+| Page title kind | `title-kind-border` | Border for the class/module kind badge |
+| Nav | `nav-bg` / `nav-text` | Left sidebar surface + text |
+| Table | `th-background` / `td-background` | Header row + zebra rows |
+
+### Brand palette — red ramp (identity, **fixed**)
+
+| Step | Hex | | Step | Hex |
+|------|-----------|-|------|-----------|
+| 50 | `#fdeae9` | | 500 | `#eb544f` |
+| 100 | `#fadad3` | | 600 | `#e62923` ← light accent |
+| 200 | `#f8bfbd` | | 700 | `#b8211c` |
+| 300 | `#f5a9a7` | | 800 | `#8a1915` |
+| 400 | `#f07f7b` | | 900 | `#5c100e` |
+
+Light accent = `primary-600` (`#e62923`); dark accent = `primary-500`
+(`#eb544f`). **The hue is a fixed brand identity — do not retune it without
+approval** (see §7).
+
+### Neutral palette — warm "stone" ramp
+
+`50 #fafaf9 · 100 #f5f5f4 · 200 #e7e5e4 · 300 #d6d3d1 · 400 #a8a29e · 500 #78716c · 600 #57534e · 700 #44403c · 800 #292524 · 900 #1c1917`
+
+### Semantic tokens — resolved values
+
+| Role | Light | Dark |
+|-----------------------|---------------------------|---------------------------|
+| `text-primary` | `#1c1917` (neutral-900) | `#fafaf9` (neutral-50) |
+| `text-secondary` | `#57534e` (neutral-600) | `#e7e5e4` (neutral-200) |
+| `text-tertiary` | `#78716c` (neutral-500) | `#a8a29e` (neutral-400) |
+| `background-primary` | `#ffffff` | `#1c1917` (neutral-900) |
+| `background-secondary`| `#fafaf9` (neutral-50) | `#292524` (neutral-800) |
+| `background-tertiary` | `#f5f5f4` (neutral-100) | `#44403c` (neutral-700) |
+| `border-subtle` | `#e7e5e4` (neutral-200) | `#44403c` (neutral-700) |
+| `border-default` | `#d6d3d1` (neutral-300) | `#57534e` (neutral-600) |
+| `border-emphasis` | `#a8a29e` (neutral-400) | `#d6d3d1` (neutral-300) |
+| `link-default` | `#1c1917` | `#fafaf9` |
+| `link-hover` | `#e62923` (primary-600) | `#eb544f` (primary-500) |
+| `accent-primary` | `#e62923` (primary-600) | `#eb544f` (primary-500) |
+| `accent-hover` | `#b8211c` (primary-700) | `#f07f7b` (primary-400) |
+| `accent-subtle` | `#fdeae9` (primary-50) | `rgb(235 84 79 / 10%)` |
+| `title-kind-border` | `#f8bfbd` (primary-200) | `rgb(235 84 79 / 35%)` |
+| `code-bg` | `#f6f8fa` | `#292524` (neutral-800) |
+| `code-border` | `#d6d3d1` | `#44403c` (neutral-700) |
+| `sig-bg` | `#f5f5f4` (neutral-100) | `#211f1e` (hand-picked) |
+| `sig-border` | `#d6d3d1` (neutral-300) | `#44403c` (neutral-700) |
+| `nav-bg` / `nav-text` | `#ffffff` / `#44403c` | `#1c1917` / `#fafaf9` |
+
+### Syntax-highlight palette (`--code-*`)
+
+One palette shared across **Ruby, C, and Shell** highlighting. Brighter in dark
+mode so tokens stay legible on the dark code surface.
+
+| Token | Light | Dark |
+|---------|-----------|-----------|
+| blue | `#1d4ed8` | `#93c5fd` |
+| green | `#047857` | `#34d399` |
+| orange | `#d97706` | `#fbbf24` |
+| purple | `#7e22ce` | `#c084fc` |
+| red | `#dc2626` | `#f87171` |
+| cyan | `#0891b2` | `#22d3ee` |
+| gray | `#78716c` | `#a8a29e` |
+
+### Search-type badge colors
+
+| Type | Light bg / text | Dark bg / text |
+|----------|-----------------------|-----------------------|
+| class | `#e6f0ff` / `#0050a0` | `#1e3a5f` / `#93c5fd` |
+| module | `#e6ffe6` / `#006600` | `#14532d` / `#86efac` |
+| constant | `#fff0e6` / `#995200` | `#451a03` / `#fcd34d` |
+| method | `#f0e6ff` / `#5200a0` | `#3b0764` / `#d8b4fe` |
+
+### Theme-agnostic tokens (not overridden in dark)
+
+| Token | Value | Use |
+|------------------------|--------------------------|----------------------------------|
+| `overlay` | `rgb(0 0 0 / 50%)` | Modal / mobile-nav backdrop |
+| `emphasis-bg` | `rgb(255 111 97 / 10%)` | `strong` / `em` highlight |
+| `emphasis-decoration` | `rgb(52 48 64 / 25%)` | `em` dotted underline |
+| `search-highlight-bg` | `rgb(224 108 117 / 10%)` | Matched-term highlight |
+| `success-bg` | `rgb(34 197 94 / 10%)` | Copy-button "copied" state |
+
+### Success palette
+`green-400 #4ade80 · green-500 #22c55e · green-600 #16a34a` — copy-button feedback only.
+
+## 3. Typography Rules
+
+### Font stacks
+
+| Family | Stack |
+|--------|------------------------------------------------------------------------------------------------|
+| Sans (base + headings) | `-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif` |
+| Mono | `ui-monospace, 'SFMono-Regular', 'SF Mono', Menlo, Consolas, 'Liberation Mono', monospace` |
+
+System fonts only — **no web fonts are shipped** (keeps output lightweight; see
+§7). Headings reuse the base sans; mono is used for code, method headings, and
+type signatures.
+
+### Type scale
+
+| Token | rem | px | Token | rem | px |
+|---------|----------|----|---------|----------|----|
+| `xs` | 0.75 | 12 | `2xl` | 1.5 | 24 |
+| `sm` | 0.875 | 14 | `3xl` | 1.875 | 30 |
+| `base` | 1 | 16 | `4xl` | 2.25 | 36 |
+| `lg` | 1.125 | 18 | `5xl` | 3 | 48 |
+| `xl` | 1.25 | 20 | | | |
+
+Weights: `normal 400 · medium 500 · semibold 600 · bold 700`.
+Line heights: `tight 1.25 · normal 1.5 · relaxed 1.625` (body is relaxed).
+
+### Heading ladder (`main`)
+
+| Element | Size | Weight | Notes |
+|---------|------------|-----------|-----------------------------------------|
+| `h1.page-title` | kind badge: `sm` / name: `3xl` (30) | semibold / bold | Type kind renders as an accent badge above the class/module name; long names may wrap |
+| `h1` | `3xl` (30) | bold | tight line-height |
+| `h2` | `2xl` (24) | semibold | `margin-top: space-8`; section headers add a 1 px top rule + `space-3` padding |
+| `h3` | `xl` (20) | semibold | `margin-top: space-8`; section headers add a 1 px top rule + `space-3` padding |
+| `h4` | `lg` (18) | medium | |
+| `h5`/`h6` | `base` (16) | medium | |
+
+All headings render in `accent-primary` and carry
+`scroll-margin-top: calc(header-height + 2rem)` so anchored links clear the
+sticky header.
+
+### Color × text pairing
+
+- Body links default to **text color**, not accent — only hover reveals accent
+ (`link-hover`). Keeps prose calm.
+- Status/role meaning in search badges is carried by **both** a tinted
+ background and a text color, never color alone.
+- `strong` and `em` share the accent color + `emphasis-bg` tint; `em` adds a
+ dotted underline so emphasis survives in monochrome.
+
+## 4. Component Stylings
+
+Spacing/radius tokens referenced below resolve in §5/§6.
+
+### Header bar (`header.top-navbar`)
+
+| Property | Value |
+|------------|-------------------------------------------------------------|
+| Layout | Sticky top, `z-fixed` (300), `height: 64px`; desktop grid mirrors the page shell so search aligns to the main content rail |
+| Background | `background-primary` + `border-bottom` hairline + `shadow-sm` |
+| Padding | Desktop columns are unpadded; brand/toggle use `space-6` side offsets, search rail uses main content `space-8` inset (mobile header: `space-4`) |
+| Brand | `xl` (20) semibold; hover → accent |
+| Search | content-rail aligned desktop field, `width: 400px` within the main rail (see Search below) |
+
+### Theme toggle (`.theme-toggle`)
+
+| Property | Value |
+|----------|------------------------------------------------------------------|
+| Box | `2.5rem` square · `radius-md` · 1px `border-default` |
+| Hover | `background-secondary`, accent border + text, `scale(1.05)` |
+| Active | `scale(0.95)` |
+| Focus | accent border + `0 0 0 3px accent-subtle` ring |
+| Icon | rotates `15deg` + `scale(1.1)` on hover, `--ease-out-smooth` |
+
+### Left navigation (`#sidebar-navigation` + `.nav-section`)
+
+| Property | Value |
+|-----------------|--------------------------------------------------------------|
+| Surface | `nav-bg`, `border-right` hairline, sticky under header, full-height scroll; rules are scoped to `#sidebar-navigation` so the right TOC can use its own `