Content stores only what a collection's schema declares, so this is the complete
list — an undeclared field is dropped silently, before the sidebar or the search
ever sees it.

## What you write

| Field          | Type       | What it does                                                    |
| :------------- | :--------- | :-------------------------------------------------------------- |
| `title`        | `string`   | Rendered as the page's `<h1>`, and its SEO and social title      |
| `description`  | `string`   | The page's summary — sidebar, cards, OG image, `llms.txt`         |
| `icon`         | `string`   | Shown beside the entry in the sidebar, the section row and cards |
| `navigation`   | `boolean`  | `false` hides the page from the navigation                       |
| `layout`       | `string`   | `landing` renders the page without the docs layout               |
| `redirectFrom` | `string[]` | Old URLs for this page — see [Move a page](/guides/move-a-page)  |
| `date`         | `string`   | When this page is dated, for the feed                            |

`title` and `description` are the two the build warns about when they are
missing. Neither breaks a page, and both quietly degrade the table of contents,
the social card and `llms.txt`.

::callout{type="tip" title="No H1 in the body"}
`title` is rendered as the heading. A `#` heading at the top of the file is the
second `<h1>` on the page.
::

## The page controls

Eight more fields, each turning off one piece of what duxt draws around a
page. They are how a page says what it is *for*: an API reference that wants the
full width, a legal page with no "was this helpful?", a stub that should not turn
up in search.

| Field        | Type                      | Default           | What it controls                            |
| :----------- | :------------------------ | :---------------- | :------------------------------------------ |
| `toc`        | `false` \| `{ maxDepth }` | on, down to `h3`  | The table of contents, and how deep it goes |
| `breadcrumb` | `boolean`                 | `duxt.breadcrumb` | The trail above the title                   |
| `prevNext`   | `boolean`                 | `true`            | The previous/next pair under the article    |
| `feedback`   | `boolean`                 | `true`            | The "was this helpful?" row                 |
| `pageInfo`   | `boolean`                 | `true`            | Edit link, last updated, contributors       |
| `copyPage`   | `boolean`                 | `true`            | Copy page, and the hand-to-a-model menu     |
| `fullWidth`  | `boolean`                 | `false`           | `true` removes the reading-width cap        |
| `search`     | `boolean`                 | `true`            | `false` removes the page from search        |

```md
---
title: Terms of service
feedback: false
prevNext: false
search: false
---
```

They **compose, and none of them implies another**. `fullWidth: true` removes the
reading measure and nothing else — the contents column and the provenance block
stay unless those are turned off too — and `copyPage: false` leaves the
provenance block alone. A page that sets none of them looks exactly as it always
did.

`breadcrumb` is the one with a site-wide switch behind it, `duxt.breadcrumb`. The
page wins wherever it speaks, so a site that hid the trail everywhere can put it
back on the one page whose trail is the point.

### How deep the contents go

`toc: false` drops the column. The object form sets the deepest heading it
lists, written as a heading level — the list always starts at `h2`, and `h3` is
the default.

```md
---
title: Configuration
toc:
  maxDepth: 4
---
```

`maxDepth` takes `2` through `6`. Anything else falls back to the default rather
than emptying the column: there is no `h7`, and `h1` is the title.

### What `search: false` does, and what it does not

It removes the page from every surface duxt offers for *finding* something: the
search dialog, its fuzzy fallback, the MCP `search_docs` tool, and both
`llms.txt` and `llms-full.txt`.

It changes **nothing about the page's address**. The URL, the canonical, the
sitemap entry and the robots metadata are untouched, the page renders as it
always did, and MCP's `read_page` still answers for it. The page becomes
un-findable, not unpublished. To keep a page out of the navigation tree instead,
that is `navigation: false`; to keep it out of a search engine, that is the
crawler's business rather than this field's.

::callout{type="info" title="A page cannot hide the sidebar"}
There is deliberately no field for it. `fullWidth` keeps the header and the left
navigation, because a page that removed the way out is a page the reader is stuck
on. `layout: landing` remains the one explicit escape from the whole docs shell.
::

## What the build fills in

| Field          | Filled by                     | Holds                                     |
| :------------- | :---------------------------- | :---------------------------------------- |
| `lastUpdated`  | the git-meta module            | The last commit that touched the file      |
| `contributors` | the git-meta module            | Name, commit count and username, per author |
| `rawbody`      | the collection schema          | The Markdown as written                    |
| `sitemap`      | the sitemap integration        | What puts the page in `/sitemap.xml` at all |

Writing any of these by hand is pointless: the build overwrites them. Both git
fields need a real history, so a remote source needs `history: true` — see the
[sources reference](/reference/sources).

## The file name carries two more things

- **A numeric prefix orders the tree** and is stripped from the URL:
  `3.guides/2.deploy.md` is served at `/guides/deploy`. Reordering never moves a
  URL.
- **`.draft.md` is a draft.** It is served in the dev server and absent from the
  build. There is no `draft: true`, because a collection's contents are declared
  before any file has been read — see [Collections](/concepts/collections).