Color mode

Content selection

content.directory selects the default filesystem location. Use content.source to provide a different ContentSource; do not configure two competing readers. exclude removes matching material before it becomes content. filters.publishStrategy controls the default publishing policy, and frontmatter can override the resolved publishing state.

Excluding files

exclude takes glob patterns matched against logical paths. * matches within one path segment, ** matches across segments, and ? matches one character.

ts
content: {
  directory: "content",
  exclude: ["drafts/**", "**/private/**", ".obsidian/**"],
}

Excluded files never enter the content pipeline, so they are unavailable for links, graph analysis, and diagnostics. This differs from draft and unlisted, which stay in the content system but are hidden from routes or discovery. exclude runs before publishing is resolved:

Diagram source
text
flowchart LR
    Files["Files"]
    Exclude{"exclude ?"}
    Content["Content"]
    Publish{"Published ?"}
    Public["Public Content"]
    Private["Not Published"]
 
    Files --> Exclude
    Exclude -->|Yes| Skip["Not loaded"]
    Exclude -->|No| Content
    Content --> Publish
    Publish -->|Yes| Public
    Publish -->|No| Private

ContentSource

content.directory selects the default filesystem reader. Set content.source to replace that reader with another implementation, such as a remote store:

text
content.directory  →  default filesystem ContentSource
 
content.source     →  custom ContentSource

Use one or the other. content.source is not a second reader for the same content; it stands in for the filesystem reader. The ContentSource contract is listed in the Configuration reference.

Publishing state

Publishing is resolved once in Core and exposed to plugins as two manifest views:

View Contains Use for
manifest.publicEntries Routable entries: public and unlisted page rendering and SSG paths
manifest.discoverableEntries Public entries only docs navigation, search, feeds, sitemap, taxonomy, graphs, backlinks, related/recent lists

The default publishStrategy still applies when no explicit visibility is set.

Frontmatter Result
visibility: public routable and discoverable
visibility: unlisted routable by direct URL, but excluded from discovery surfaces
visibility: draft not routable and not discoverable
publishAt: 2026-01-01T00:00:00.000Z hidden before the build time, public on the first build after that time
no visibility / publishAt falls back to publishStrategy (explicit requires publish: true; selective excludes private: true and draft: true)

Malformed visibility or publishAt values fail the build instead of being guessed. Scheduled publishing is build-time only: Riebeckite does not start a runtime timer.

exclude is different from publishing. Excluded files never enter the content pipeline, so they are unavailable for links, metadata, graph analysis, and diagnostics. Draft, unlisted, and scheduled-before entries remain in the raw manifest for internal processing, but Core keeps them out of the route or discovery views according to the table above.

History

1 changesCollapseExpand
1 + ---
2 + title: Content selection
3 + sidebar:
4 + label: Content selection and ContentSource
5 + order: 20
6 + ---
7 +
8 + # Content selection
9 +
10 + `content.directory` selects the default filesystem location. Use `content.source` to provide a different `ContentSource`; do not configure two competing readers. `exclude` removes matching material before it becomes content. `filters.publishStrategy` controls the default publishing policy, and frontmatter can override the resolved publishing state.
11 +
12 + ## Excluding files
13 +
14 + `exclude` takes glob patterns matched against logical paths. `*` matches within
15 + one path segment, `**` matches across segments, and `?` matches one character.
16 +
17 + ```ts
18 + content: {
19 + directory: "content",
20 + exclude: ["drafts/**", "**/private/**", ".obsidian/**"],
21 + }
22 + ```
23 +
24 + Excluded files never enter the content pipeline, so they are unavailable for
25 + links, graph analysis, and diagnostics. This differs from `draft` and `unlisted`,
26 + which stay in the content system but are hidden from routes or discovery.
27 + `exclude` runs before publishing is resolved:
28 +
29 + ```mermaid
30 + flowchart LR
31 + Files["Files"]
32 + Exclude{"exclude ?"}
33 + Content["Content"]
34 + Publish{"Published ?"}
35 + Public["Public Content"]
36 + Private["Not Published"]
37 +
38 + Files --> Exclude
39 + Exclude -->|Yes| Skip["Not loaded"]
40 + Exclude -->|No| Content
41 + Content --> Publish
42 + Publish -->|Yes| Public
43 + Publish -->|No| Private
44 + ```
45 +
46 + ## ContentSource
47 +
48 + `content.directory` selects the default filesystem reader. Set `content.source`
49 + to replace that reader with another implementation, such as a remote store:
50 +
51 + ```text
52 + content.directory → default filesystem ContentSource
53 +
54 + content.source → custom ContentSource
55 + ```
56 +
57 + Use one or the other. `content.source` is not a second reader for the same
58 + content; it stands in for the filesystem reader. The `ContentSource` contract is
59 + listed in the [Configuration reference](../configuration-reference.md#contentsource).
60 +
61 + ## Publishing state
62 +
63 + Publishing is resolved once in Core and exposed to plugins as two manifest views:
64 +
65 + | View | Contains | Use for |
66 + | --- | --- | --- |
67 + | `manifest.publicEntries` | Routable entries: public and unlisted | page rendering and SSG paths |
68 + | `manifest.discoverableEntries` | Public entries only | docs navigation, search, feeds, sitemap, taxonomy, graphs, backlinks, related/recent lists |
69 +
70 + The default `publishStrategy` still applies when no explicit visibility is set.
71 +
72 + | Frontmatter | Result |
73 + | --- | --- |
74 + | `visibility: public` | routable and discoverable |
75 + | `visibility: unlisted` | routable by direct URL, but excluded from discovery surfaces |
76 + | `visibility: draft` | not routable and not discoverable |
77 + | `publishAt: 2026-01-01T00:00:00.000Z` | hidden before the build time, public on the first build after that time |
78 + | no `visibility` / `publishAt` | falls back to `publishStrategy` (`explicit` requires `publish: true`; `selective` excludes `private: true` and `draft: true`) |
79 +
80 + Malformed `visibility` or `publishAt` values fail the build instead of being guessed. Scheduled publishing is build-time only: Riebeckite does not start a runtime timer.
81 +
82 + `exclude` is different from publishing. Excluded files never enter the content pipeline, so they are unavailable for links, metadata, graph analysis, and diagnostics. Draft, unlisted, and scheduled-before entries remain in the raw manifest for internal processing, but Core keeps them out of the route or discovery views according to the table above.
83 +