Getting started
Project structure
Where things live and which parts belong to which surface.Routes are grouped by surface. A route group in parentheses does not appear
in the URL, so (landing)/about/page.tsx serves /about.
src/app/layout.tsx, src/components/Providers.tsx, the token config in
src/resources/once-ui.config.js and the error contract in
src/lib/errors.ts are always present. Every surface renders inside them.
Each route group is a surface: a self-contained feature area that can be
included or left out. Surfaces declare which capability slices they need —
(product) needs auth, (landing) and (docs) need nothing.
src/content mirrors the surfaces. Blog posts and legal pages belong to
the landing surface, documentation pages to the docs surface, and brand and
navigation data to the shell because the root layout reads them.
Read Surfaces and slices for the
rules that keep this separation honest.
Last updated August 27, 2026The shell
Surfaces
Content
Edit this page on GitHub