Recursive Structure
Folders contain children. Children can be folders. Infinite nesting.
For developers
One recursive JSON structure for everything. Pages, tables, content, and files.
Protocol
A strict, human-readable JSON schema. Every object follows the same Node interface.
Folders contain children. Children can be folders. Infinite nesting.
Every node has a defined type and predictable data schema.
Built-in primitives to construct any content model without complex migrations.
{ children: [...] }{ data: { content: "..." } }{ data: { url: "...", size: 1024 } }{ data: { fields: [...] }, children: [row] }{ data: { [slug]: value } }{ data: { content: "# Markdown..." } }Whether it's a Landing Page (folders & blocks) or a Knowledge Base (tables & rows), it's all just a tree of nodes.
folder (landing) ├─ folder (hero) │ ├─ text (title) │ └─ image (cover) └─ folder (about)
folder (docs) ├─ table (categories) └─ table (articles) └─ row (article_1)
Since the entire structure is just a JSON tree, you can export your entire project state to a file, commit it to Git, or import it into a new environment instantly.
npm package
TypeScript / JavaScript library on npm. Wraps the same HTTP API; use it anywhere from static HTML to Next.js App Router. React is optional.
HttpContentFetcher calls GET /content/{projectSlug}/{path}. Coreless.getPage() returns a ContentClient with path-based helpers.
CorelessProvider + HttpContentFetcher at the app root; useContent(pageSlug) exposes the same methods plus loading, error, and refresh().
API
Same idea as Project → API docs: one JSON tree per page, then typed helpers for each field path.
Example only: project slug acme-studio, page home — paths match folder/block slugs in the tree.
Public content endpoint returns the full page tree. Matches GET used by the dashboard (see api.nodes.getContent).
After cms.getPage(pageSlug), use .text(), .image(), .table()… with paths like hero/title — the same shape auto-generated in project API docs.
Direct fetch with the same URL and auth headers as in lib/api.ts.
Request access to start building, or try the demo to see editing in action.