Content Model

In Dune, content is files. There is no database. Pages live on the filesystem — either as named folders or as plain files in a directory.

content/
├── 01.home/
│   └── default.md          ← a folder-based page
├── 02.blog/
│   ├── blog.md             ← a listing page
│   └── 01.hello-world/
│       ├── post.md         ← a child page
│       └── cover.jpg       ← co-located media
├── 03.landing/
│   └── page.tsx            ← a TSX content page
└── articles/
    ├── default.md          ← the /articles listing page
    ├── my-first-post.md    ← flat file → /articles/my-first-post
    └── deep-dive.md        ← flat file → /articles/deep-dive

Two content layouts

Folder-based pages

A folder in content/ with a numeric prefix (01., 02., …) is a page folder. The content file inside selects the theme template — post.md renders with post.tsx, default.md uses default.tsx. Co-located media lives in the same folder.

Flat content files

A plain folder (no numeric prefix) is a content directory. .md or .tsx files placed directly inside it each become their own page, routed by filename stem:

articles/my-first-post.md    →  /articles/my-first-post
articles/deep-dive.md        →  /articles/deep-dive
articles/default.md          →  /articles  (reserved stem — the listing page)

Reserved stems (default, index) still belong to the containing folder's page. Everything else becomes an independent page.

Flat files work well for articles, changelog entries, or any content that doesn't need co-located media or nested sub-pages.

Core ideas

Frontmatter = metadata. The YAML block at the top of each file controls title, date, taxonomies, collections, visibility, caching, and more.

Filename = template (folder-based pages). post.md renders with the post.tsx theme template. default.md uses default.tsx. This is convention over configuration.

Formats are interchangeable. Markdown for prose. TSX for interactive pages. They share the same folder conventions, frontmatter fields, collection system, and taxonomy system.

Content formats at a glance

Format Frontmatter Body Rendering Best for
.md YAML between --- Markdown → HTML Injected into theme template Blog posts, docs, articles
.tsx export const frontmatter = {} or sidecar YAML JSX component Self-rendering, optional layout Landing pages, interactive content
.mdx YAML between --- Markdown + JSX Compiled, injected into template Tutorials with live examples (v0.2)

Read on for details on each format, frontmatter fields, media handling, collections, and taxonomies.