` with NO chrome.
+ There is no header, nav, footer, or reading column to inherit: design the
+ app's own from what the app IS. Decide from scratch whether it needs a
+ header at all, a nav (or none), a footer, a sidebar, a centered reading
+ column, or a full-bleed canvas. `LAYOUT-REFERENCE.md` at the project root is
+ a complete worked layout (fixed header, brand, nav, theme toggle, reading
+ column, footer) to learn the patterns from, then build your own. Keep the
+ design tokens and theme apparatus, those are infrastructure.
6. **Use a unique design, and redesign means more than recolor (UI apps).**
Give the app a design of its own (palette, typography, LAYOUT, spacing,
- and chrome) chosen from what the app IS. Recoloring the scaffold and
- swapping the logo while keeping its skeleton (a fixed top header with a
- Home link and a theme toggle, the centered ~760px reading column, the
- "Built with webjs" footer) is NOT a unique design. Decide from scratch
- whether this app even needs a header or footer, what nav (if any), and
- what layout fits (a centered board, a full-bleed dashboard, a split, a
- single card). The scaffold ships a `webjs-scaffold-placeholder` marker on
- its footer, so `webjs check` fails until you remove or replace the
- "Built with webjs" branding. Self-audit before finishing: nothing should
- read as the scaffold example (no "Built with webjs" footer, no leftover
- example nav, no default reading column unless it truly fits). The design
- tokens and theme wiring in `app/layout.ts` are infrastructure to keep and
- restyle on top of, not the example look to preserve. Style with Tailwind
- utilities wherever they reach, and use custom CSS only for what utilities
- cannot express (@theme tokens, @keyframes, scrollbar, complex color-mix
- or gradients). The `api` template has no UI, so this does not apply there.
+ and chrome) chosen from what the app IS. The layout ships MINIMAL (see item
+ 5), so there is no scaffold skeleton to inherit: build the chrome the app
+ actually needs. Two things are gated by a `webjs-scaffold-placeholder`
+ marker, so `webjs check` fails until each is addressed: the minimal shell
+ carries a "design your layout from scratch" marker (delete it once you have
+ built a real layout), and the palette block carries its own marker (the
+ starter orange looks finished on purpose). The design token NAMES and theme
+ wiring (`--background`, `--primary`, `--card`, ... in `app/layout.ts`) are
+ infrastructure to keep, but their COLOR VALUES are yours: set a distinctive
+ palette that fits the app, in both the light and dark blocks. Keeping the
+ scaffold's token colors (or a light warm recolor of them) is NOT owning the
+ palette. To keep the starter palette deliberately, run
+ `webjs check --clear-placeholders`. Style with Tailwind utilities wherever
+ they reach, and use custom CSS only for what utilities cannot express (@theme
+ tokens, @keyframes, scrollbar, complex color-mix or gradients). The `api`
+ template has no UI, so this does not apply there.
+ **Size the component HOST, not just an inner wrapper.** A component's host
+ custom element is the box its parent lays out. Hosts default to
+ `display: block`, but a host that is a flex/grid item in a centering parent
+ (`flex justify-center`, `grid place-items-center`) is still sized to its
+ content unless it carries width itself. Put `w-full max-w-[...]` on the host,
+ not only on an inner `` (an inner `w-full` resolves against a collapsed
+ host and the whole component renders tiny). If a board or card renders small
+ despite `w-full max-w-[400px]` on its inner grid, move that sizing to the host.
+ **Definition of done (design gate):** a UI app is NOT finished until you
+ have (a) given it a design of its own (layout AND palette) and removed the
+ scaffold shell, and (b) run it and PLAYED THROUGH every state in a browser
+ (fill the board, win, draw, reload), confirming nothing resizes or shifts as
+ it fills (even, stable squares) and it does not resemble the scaffold. A
+ glance at the empty first paint is not enough; the layout bugs show up
+ mid-interaction.
+ `webjs doctor` emits an advisory when `app/layout` still reproduces scaffold
+ design (the exact 760px reading column, the "Built with webjs" attribution, or
+ the unmodified starter palette values); the kept theme apparatus (theme-toggle,
+ `--header-h`) is infrastructure and does NOT trip it. Treat the advisory as a
+ to-do, not noise.
7. **Keep:** the Drizzle setup, the test config, the agent config files
(`AGENTS.md`, `CONVENTIONS.md`, `CLAUDE.md`, `.cursorrules`, etc.),
`db/connection.server.ts` + `db/columns.server.ts`, the directory
@@ -406,7 +428,9 @@ freshly scaffolded app fails `webjs check` until you address each
placeholder. The marker is acknowledge-and-remove: replace the example
content, or deliberately keep it, and in either case delete the marker
line. So the delivered app contains only what the user asked for, never
-leftover scaffold code.
+leftover scaffold code. To keep the gallery and clear every marker in one
+step (instead of one edit per file), run `webjs check --clear-placeholders`,
+then delete whichever demo routes/modules you do not want.
The scaffold exists so the agent doesn't reinvent the directory layout,
the Drizzle wiring, the test runner config, or the convention files. It
diff --git a/packages/cli/templates/LAYOUT-REFERENCE.md b/packages/cli/templates/LAYOUT-REFERENCE.md
new file mode 100644
index 000000000..eece77e71
--- /dev/null
+++ b/packages/cli/templates/LAYOUT-REFERENCE.md
@@ -0,0 +1,94 @@
+# Layout reference
+
+`app/layout.ts` ships as a **minimal shell**: it wires the theme, design tokens,
+and the Tailwind runtime, then renders `${children}` in a bare full-height
+container with no chrome. That is on purpose. A delivered app should design its
+own layout from what the app IS, not inherit a generic header and footer.
+
+This file is the **reference** for how to build a real layout: read it to learn
+the patterns (a fixed header, a brand mark, a nav, a theme toggle, a reading
+column, a footer), then write the layout your app actually needs in
+`app/layout.ts`. Decide from scratch: does a tic-tac-toe game want a header at
+all? Does a dashboard want a sidebar instead? Does a landing page want a
+full-bleed hero? Keep only what fits.
+
+> **This is ONE example, not a template to reproduce.** Reproducing this exact
+> header (a slim bar with a mark on the left and a theme toggle on the right)
+> just recreates the old scaffold look under a new name. It is here to show the
+> mechanics (how a header, nav, theme toggle, or footer are wired), not the
+> design. Design a layout that fits what THIS app is: a game might be a
+> full-bleed centered stage with no header; a tool might have a compact command
+> bar; a reader might have a wide sidebar. Take the mechanics, invent the form.
+
+You do not import from this file. Copy the mechanics you want into
+`app/layout.ts`'s returned template, inside the `` (or replacing it), and
+restyle them into your own design.
+
+## A complete worked layout
+
+This is the chrome the scaffold used to ship inline. It goes in the body of
+`RootLayout`, after the `