@shoalrun/cli 0.1.0-alpha.13 → 0.1.0-alpha.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/DEPLOYMENT-PROFILES.md +287 -0
  3. package/README.md +5 -2
  4. package/agent-docs/.well-known/shoalrun/navigation/project-updates-50f26fe22670.txt +5 -1
  5. package/agent-docs/SNAPSHOT.json +5 -5
  6. package/agent-docs/changelog/2026-10-30.md +43 -0
  7. package/agent-docs/changelog/2026-11-03.md +56 -0
  8. package/agent-docs/changelog.md +17 -1
  9. package/agent-docs/documents.json +419 -61
  10. package/agent-docs/index.md +73 -103
  11. package/agent-docs/provenance.json +4 -4
  12. package/agent-docs/publish/content-export.md +1 -1
  13. package/agent-docs/publish/content-export.sections/prerequisites.md +11 -0
  14. package/agent-docs/publish/deployment-profiles.md +273 -0
  15. package/agent-docs/publish/deployment-profiles.sections/before-you-begin.md +44 -0
  16. package/agent-docs/publish/deployment-profiles.sections/build-and-inspect-the-edition.md +69 -0
  17. package/agent-docs/publish/deployment-profiles.sections/check-the-result.md +46 -0
  18. package/agent-docs/publish/deployment-profiles.sections/choose-navigation-labels.md +53 -0
  19. package/agent-docs/publish/deployment-profiles.sections/current-limits.md +46 -0
  20. package/agent-docs/publish/deployment-profiles.sections/define-the-shared-sku-manifest.md +70 -0
  21. package/agent-docs/publish/deployment-profiles.sections/html-markdown-and-agents.md +44 -0
  22. package/agent-docs/publish/deployment-profiles.sections/mark-pages-and-shared-sections.md +135 -0
  23. package/agent-docs/publish/deployment-profiles.sections/related-reading.md +42 -0
  24. package/agent-docs/publish/deployment-profiles.sections/supply-the-profile-from-the-deployment.md +68 -0
  25. package/agent-docs/search-index.json +1 -1
  26. package/agent-docs/start.md +2 -2
  27. package/agent-docs/start.sections/add-the-page-to-navigation.md +1 -1
  28. package/agent-docs/start.sections/build-and-check-both-outputs.md +1 -1
  29. package/agent-docs/start.sections/build-this-site.md +1 -1
  30. package/agent-docs/start.sections/check-writing-style.md +1 -1
  31. package/agent-docs/start.sections/create-a-page.md +1 -1
  32. package/agent-docs/start.sections/make-it-yours.md +1 -1
  33. package/agent-docs/start.sections/migrating-from-github-packages.md +1 -1
  34. package/agent-docs/start.sections/prerequisites.md +1 -1
  35. package/agent-docs/start.sections/related-reading.md +1 -1
  36. package/agent-docs/start.sections/start-your-own-project.md +2 -2
  37. package/dist/api-publication-plan.d.ts +3 -0
  38. package/dist/api-publication-plan.js +30 -3
  39. package/dist/artifact-bundle.d.ts +1 -0
  40. package/dist/artifact-bundle.js +1 -1
  41. package/dist/authoring-api.d.ts +1 -1
  42. package/dist/authoring-api.js +1 -1
  43. package/dist/authoring-project-command.js +4 -2
  44. package/dist/authoring-project.d.ts +2 -0
  45. package/dist/authoring-project.js +4 -4
  46. package/dist/authoring-snapshot.d.ts +23 -4
  47. package/dist/authoring-snapshot.js +84 -12
  48. package/dist/authoring-validation-command.js +5 -3
  49. package/dist/authoring-validation.d.ts +2 -0
  50. package/dist/authoring-validation.js +38 -11
  51. package/dist/cli-discovery.d.ts +2 -2
  52. package/dist/cli-discovery.js +9 -9
  53. package/dist/cli.js +8 -6
  54. package/dist/compiler.d.ts +13 -0
  55. package/dist/compiler.js +25 -74
  56. package/dist/component-names.js +1 -1
  57. package/dist/component-transform.js +7 -1
  58. package/dist/config.d.ts +4 -1
  59. package/dist/config.js +19 -5
  60. package/dist/content-export-command.d.ts +13 -1
  61. package/dist/content-export-command.js +3 -2
  62. package/dist/content-export.d.ts +13 -0
  63. package/dist/content-export.js +5 -4
  64. package/dist/content-source.d.ts +1 -0
  65. package/dist/content-workspace.d.ts +13 -0
  66. package/dist/content-workspace.js +18 -1
  67. package/dist/deployment-profile.d.ts +52 -0
  68. package/dist/deployment-profile.js +277 -0
  69. package/dist/frontmatter.js +11 -4
  70. package/dist/page-materialization.js +2 -0
  71. package/dist/page-renderer.d.ts +1 -0
  72. package/dist/page-renderer.js +3 -1
  73. package/dist/palettes.d.ts +1 -1
  74. package/dist/project-navigation.d.ts +5 -0
  75. package/dist/project-navigation.js +19 -0
  76. package/dist/publication-plan.d.ts +3 -1
  77. package/dist/publication-plan.js +23 -4
  78. package/dist/publication-render.d.ts +2 -1
  79. package/dist/publication-render.js +2 -2
  80. package/dist/site-identity.d.ts +3 -0
  81. package/dist/site-identity.js +69 -0
  82. package/dist/vercel.d.ts +1 -0
  83. package/dist/vercel.js +3 -1
  84. package/package.json +2 -1
  85. package/skills/shoalrun-author/SKILL.md +5 -1
  86. package/skills/shoalrun-author/references/customer-editions.md +164 -0
  87. package/skills/shoalrun-recipes/SKILL.md +2 -0
  88. package/skills/shoalrun-setup/SKILL.md +2 -0
  89. package/styles/site.css +7 -3
  90. package/agent-docs/publish/content-export.sections/upgrade-an-existing-integration.md +0 -34
@@ -12,121 +12,72 @@ canonical: /
12
12
 
13
13
  > Documentation index: [llms.min.txt](https://www.shoalrun.com/llms.min.txt) · Document manifest: [documents.json](https://www.shoalrun.com/documents.json)
14
14
 
15
- **Updated: 2026-10-27.**
15
+ **Updated: 2026-10-30.**
16
16
 
17
17
  **Docs for people. Context for agents.**
18
18
 
19
- One source, with control over how each audience reads it. Build interactive docs for people and readable content for agents, with checks before you publish.
19
+ One source, two audiences. Build interactive docs for people and readable content for agents, with checks before you publish.
20
20
 
21
+ - [Use your docs in your app](https://www.shoalrun.com/content-delivery.md)
21
22
  - [See what an agent gets](https://www.shoalrun.com/publish/agent-friendliness.md)
22
23
  - [See what works today](https://www.shoalrun.com/status.md)
23
24
 
24
- > **Try the alpha:** Install `@shoalrun/cli` from npm and build your own site. No account or package token is needed. Pin an exact version while the alpha evolves.
25
+ > **Try the alpha:** Install `@shoalrun/cli` from npm. No account or token is needed, and the normal build makes no model calls or network requests. Pin an exact version while the alpha evolves.
25
26
  >
26
27
  > [Install Shoalrun →](https://www.shoalrun.com/start.md)
27
28
 
28
- ## Readable output, with checks you can inspect
29
-
30
- Write Markdown, MDX, and OpenAPI once. People get tabs, disclosures, navigation, and reader views. Agents get the supported content in reading order, with stable page identities and machine-readable contracts.
31
-
32
- | What you can inspect | What it gives you |
33
- | ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
34
- | A manifest with byte digests | Stable page IDs and publication variants, with SHA-256 digests for checking the exact Markdown bytes. |
35
- | Compact discovery and incremental sync | Find a page without the full search index; compare saved snapshots when a build changes. |
36
- | Focused per-operation OpenAPI contracts | One small contract containing an operation and the local schemas it needs, when enabled. |
37
- | Explicit component representations | Tabs and disclosures become labeled sections. Snippets expand into their resolved content. Unsupported components fail the build. |
38
- | Reader views and format-specific content | Choose what people see in the browser and write different explanations for HTML and Markdown when needed. |
39
-
40
- ### A tabbed page, without missing panels
41
-
42
- This example has two client choices and a closed disclosure. The Markdown includes both clients and the troubleshooting detail.
43
-
44
- ### You write
45
-
46
- ````mdx title="content/check-service.mdx"
47
- <Tabs label="Client">
48
- <Tab label="curl">
49
-
50
- ```sh
51
- curl -fsS https://api.example.com/health
52
- ```
53
-
54
- </Tab>
55
- <Tab label="JavaScript">
56
-
57
- ```js
58
- const response = await fetch('https://api.example.com/health');
59
- console.log(response.status);
60
- ```
29
+ ## Put your docs inside your product
61
30
 
62
- </Tab>
63
- </Tabs>
31
+ Export pages, single sections, and named snippets from the source that builds your site. Read them as HTML or Markdown in a help drawer, an onboarding screen, or an agent. Static files are enough; no content server or model provider is needed.
64
32
 
65
- <Collapsible title="If the request fails">
66
- Check the service URL and your network connection.
67
- </Collapsible>
68
- ````
33
+ ```ts
34
+ import { openManifestContentSource } from '@shoalrun/cli/content';
69
35
 
70
- ### People get HTML
71
-
72
- ### curl
73
-
74
- ```sh
75
- curl -fsS https://api.example.com/health
36
+ const snapshot = await openManifestContentSource({
37
+ manifestUrl: '/content/revisions/r1/manifest.json',
38
+ });
39
+ const result = await snapshot.get(
40
+ { kind: 'section', documentId: 'guide.billing', sectionId: 'refunds' },
41
+ { format: 'html' },
42
+ );
76
43
  ```
77
44
 
78
- ### JavaScript
45
+ The client checks each representation against the manifest's digest. A REST adapter serves the same snapshots over HTTP.
79
46
 
80
- ```js
81
- const response = await fetch('https://api.example.com/health');
82
- console.log(response.status);
83
- ```
47
+ - [Content delivery](https://www.shoalrun.com/content-delivery.md)
84
48
 
85
- ### If the request fails
49
+ Deliver pages, sections, and snippet instances to applications from one reviewed content bundle.
86
50
 
87
- Check the service URL and your network connection.
51
+ - [Read content with a client](https://www.shoalrun.com/content-delivery/client.md)
88
52
 
89
- ### Agents get Markdown
53
+ Open a content revision and read typed resources without depending on generated filenames.
90
54
 
91
- ````md title="/check-service.md (body excerpt)"
92
- ### curl
93
-
94
- ```sh
95
- curl -fsS https://api.example.com/health
96
- ```
55
+ - [Serve content through REST](https://www.shoalrun.com/content-delivery/rest.md)
97
56
 
98
- ### JavaScript
57
+ Expose reviewed content snapshots over HTTP and read them through the content client.
99
58
 
100
- ```js
101
- const response = await fetch('https://api.example.com/health');
102
- console.log(response.status);
103
- ```
104
-
105
- ### If the request fails
59
+ ## Readable output, with checks you can inspect
106
60
 
107
- Check the service URL and your network connection.
108
- ````
61
+ Write Markdown, MDX, and OpenAPI once. People get tabs, navigation, and reader views. Agents get the supported content in reading order, with stable page IDs and machine-readable contracts.
109
62
 
110
- ### Fetch the published output
63
+ | What you can inspect | What it gives you |
64
+ | ---------------------------------------- | ---------------------------------------------------------------------------------------------------------- |
65
+ | A manifest with byte digests | Stable page IDs and publication variants, with SHA-256 digests for the exact Markdown bytes. |
66
+ | Compact discovery and incremental sync | Find a page without the full search index; compare snapshots when a build changes. |
67
+ | Focused per-operation OpenAPI contracts | One small contract with an operation and the local schemas it needs, when enabled. |
68
+ | Explicit component representations | Tabs and disclosures become labeled sections. Snippets expand. Unsupported components fail the build. |
69
+ | Reader views and format-specific content | Choose what people see in the browser, and write different explanations for HTML and Markdown when needed. |
111
70
 
112
- Start with the compact page list, choose a page, and fetch its Markdown. The full manifest supplies byte digests when you need verification; build information and sync snapshots let returning clients detect changes. [Try the example on the agent-friendly guide](https://www.shoalrun.com/publish/agent-friendliness.md) to compare live components with tested Markdown output.
71
+ Start with the compact page list, then fetch a page as Markdown. Hosts that support [content negotiation](https://www.shoalrun.com/publish/agent-friendliness.md) also serve it at the HTML route when the request sends `Accept: text/markdown`.
113
72
 
114
73
  ```sh
115
74
  curl -fsSL https://www.shoalrun.com/llms.min.txt
116
75
  curl -fsSL https://www.shoalrun.com/publish/agent-friendliness.md
117
76
  ```
118
77
 
119
- Hosts that support [content negotiation](https://www.shoalrun.com/publish/agent-friendliness.md) can serve the same Markdown at the HTML route when the request sends `Accept: text/markdown`:
120
-
121
- ```sh
122
- curl -fsSL -H 'Accept: text/markdown' https://www.shoalrun.com/author/search
123
- ```
124
-
125
78
  ## Check both audiences before you publish
126
79
 
127
- Shoalrun builds static files for your host. Its audit builds HTML and Markdown, checks links and API contracts, and runs configured project tests. An unsupported component stops the build instead of disappearing from the agent's document.
128
-
129
- For example, adding `<UnknownWidget />` to a page makes `shoalrun check` fail with the source path:
80
+ The audit builds HTML and Markdown, checks links and API contracts, and runs your project tests. An unsupported component stops the build instead of disappearing from the agent's document. Adding `<UnknownWidget />` to a page, for example, makes `shoalrun check` fail with the source path:
130
81
 
131
82
  ```text
132
83
  FAIL build
@@ -134,9 +85,9 @@ FAIL build
134
85
  Checks failed. Fix the findings above and rerun shoalrun check.
135
86
  ```
136
87
 
137
- This is illustrative output, not a failure on the current site. The check catches unsupported representations; it does not establish that every sentence is correct.
88
+ This output is illustrative, not a failure on the current site. The check catches unsupported representations; it does not establish that every sentence is correct.
138
89
 
139
- [Eval reports](https://www.shoalrun.com/publish/evals.md) let you add reviewed task results to the publishing gate. Required failures and reports from an older build fail the audit. You supply the agent run and answer review. Shoalrun's five example tasks are a self-reviewed demonstration, with prior context; they are not an independent measure of agent accuracy or a comparison with other platforms.
90
+ [Eval reports](https://www.shoalrun.com/publish/evals.md) add reviewed agent-task results to the gate. You supply the agent run and the review. Shoalrun's five example tasks are a self-reviewed demonstration, not an independent measure of agent accuracy.
140
91
 
141
92
  - [Audit a docs project](https://www.shoalrun.com/publish/audit.md)
142
93
 
@@ -150,13 +101,31 @@ This is illustrative output, not a failure on the current site. The check catche
150
101
 
151
102
  Import a local OpenAPI file, author an operation page, review its public content, and build HTML and Markdown.
152
103
 
153
- ## Control the reading experience
104
+ ## Let agents read your docs, and help write them
105
+
106
+ Agents search and read built docs through the CLI or a read-only MCP server with four tools: `search_docs`, `get_page`, `get_outline`, and `get_section`. MCP cannot edit files or deploy. Writing and checking use your agent's own file tools, CLI commands such as `docs validate` and `audit`, and five bundled skills.
107
+
108
+ ```sh
109
+ shoalrun docs mcp --site docs/dist
110
+ ```
111
+
112
+ This site's live endpoint is `https://www.shoalrun.com/mcp`.
113
+
114
+ - [Connect an MCP client](https://www.shoalrun.com/publish/mcp.md)
115
+
116
+ Connect read-only MCP clients over stdio or HTTP to search and read built documentation.
117
+
118
+ - [Use your coding agent](https://www.shoalrun.com/author/coding-agent.md)
119
+
120
+ Give your agent project guidance and draft a new documentation page.
121
+
122
+ - [Use the bundled agent skills](https://www.shoalrun.com/contribute/agent-skills.md)
154
123
 
155
- [Reader views](https://www.shoalrun.com/author/reader-views.md) use the `readerFilters` configuration to shape browser navigation, search, cards, and marked sections. A UI reader can follow screen actions while a developer sees request examples. The published Markdown retains every reader-marked section with a label.
124
+ Give an agent the setup and authoring workflows that ship with Shoalrun.
156
125
 
157
- Reader views are visibility controls, not access controls. Hidden browser content remains in published files. Use `access.policy` to exclude pages from a public build and host authorization to protect private content.
126
+ ## Control the reading experience
158
127
 
159
- [Format-specific content](https://www.shoalrun.com/author/components/only.md) lets you replace an interactive instruction with a useful written explanation. [Markdown metadata settings](https://www.shoalrun.com/author/markdown-metadata.md) choose which frontmatter fields are published for agents. These are authoring and publication choices; discovery files do not protect private data.
128
+ [Reader views](https://www.shoalrun.com/author/reader-views.md) shape navigation, search, cards, and marked sections in the browser. A UI reader can follow screen actions while a developer sees request examples. The Markdown keeps every marked section, with a label. [Format-specific content](https://www.shoalrun.com/author/components/only.md) swaps an interactive instruction for a written explanation.
160
129
 
161
130
  - [Reader views](https://www.shoalrun.com/author/reader-views.md)
162
131
 
@@ -170,9 +139,21 @@ Reader views are visibility controls, not access controls. Hidden browser conten
170
139
 
171
140
  Public field projection, source paths, profiles, precedence, and required values.
172
141
 
142
+ ## Build more than one site from one source
143
+
144
+ Keep one content directory and give each site its own config, origin, theme, and navigation. `site.contentFilter` selects pages by audience, product, or region at build time. Versions and languages can share unchanged pages.
145
+
146
+ - [Build separate sites from shared content](https://www.shoalrun.com/publish/single-source-sites.md)
147
+
148
+ Publish separate sites from shared content using optional facet selection.
149
+
150
+ - [Share pages across documentation versions](https://www.shoalrun.com/publish/publications.md)
151
+
152
+ Versioning one docs site without copying every page: share unchanged pages, vary sections, and publish changed pages separately.
153
+
173
154
  ## Make it look like yours
174
155
 
175
- Choose a theme and palette, follow the reader's light or dark setting, and customize brand colors or CSS. The build checks configured palette colors for contrast.
156
+ Pick a theme and palette, follow the reader's light or dark setting, and add brand colors or CSS. The build checks palette contrast.
176
157
 
177
158
  ```yaml title="docs.config.yaml"
178
159
  theme:
@@ -218,23 +199,12 @@ Customize these parts through config, local modules, or a host adapter.
218
199
  | ----------------- | --------------------------- | ---------------------------------------------------------------------- |
219
200
  | Search | `outputs.html.search` | Use the built-in index, supply a provider, or turn browser search off. |
220
201
  | Code highlighting | `outputs.html.highlighting` | Choose a Shiki theme or supply a highlighter. |
221
- | Page metadata | `metadata.provider` | Define the fields your build can read, with values you supply. |
222
- | Reader views | `readerFilters` | Define reader choices and mark pages and sections for those choices. |
202
+ | Page metadata | `metadata.provider` | Define the fields your build can read. |
203
+ | Reader views | `readerFilters` | Define reader choices and mark pages and sections. |
223
204
  | Share images | `outputs.html.shareImages` | Customize the link-preview design and fonts. |
224
205
  | Hosting | Build adapters | Configure HTTP behavior for Vercel, Node, or your own host. |
225
206
 
226
- Split config across files with `$include`, share a base with `extends`, and ask `shoalrun config explain` which file set a value.
227
-
228
- ### Give your coding agent the docs
229
-
230
- The prototype bundles four authoring skills: setup, authoring, recipes, and code walkthroughs. It also includes Shoalrun's generated documentation for offline lookup:
231
-
232
- ```sh
233
- shoalrun docs search "custom search provider"
234
- shoalrun docs read guide.search
235
- ```
236
-
237
- [Use the bundled skills](https://www.shoalrun.com/contribute/agent-skills.md) or consult the [command reference](https://www.shoalrun.com/reference/agent-skills.md). Shoalrun does not generate reader-side skills for each site it builds. Skills need human expertise to create and maintain; see the [non-goals](https://www.shoalrun.com/non-goals.md).
207
+ Split config across files with `$include`, share a base with `extends`, and run `shoalrun config explain` to see which file set a value.
238
208
 
239
209
  - [Organize project configuration](https://www.shoalrun.com/configuration.md)
240
210
 
@@ -2,9 +2,9 @@
2
2
  "schemaVersion": 1,
3
3
  "siteBuild": {
4
4
  "schemaVersion": 1,
5
- "configDigest": "31d33ea2d00a4333e120d37f58251238c0698e62f7320dccdaf1c2ace8df78fd",
6
- "buildId": "38aac8472fa1fad778acd5b5bdc30067474eca35755706d09f916914326ed2f0"
5
+ "configDigest": "e6facf6d76a90c838fde73e4bc4a253bc30f7fa0eb67547b4f89386abd3a0378",
6
+ "buildId": "c8c2a551d388148cf830e85bea3a58118a3a935dc91fa043ab2cd2a178ff9c6c"
7
7
  },
8
- "packageIntegrity": "sha512-Qs6yv+QFvt6L5huiKFQfIT5FYexxbSokwUVUnxIrXUx2TtY/VTdG0EKAJJuCLLi6FcrYVbnI/mC9uWqJ9nflsw==",
9
- "manifestDigest": "c99f0684ea93c4add58ddee1fd19dc82fa1acd9099d6cc2b4b226a0ef85302fe"
8
+ "packageIntegrity": "sha512-2Of7hhwylA4zWfoWIISM+0E63RzMhK9yI/NErSoNaUhquYQSD8iED1AWiUzqabnE0hg9rdtxCt82ws5+R9D3bQ==",
9
+ "manifestDigest": "3c6af9a8161232cd4e824e72a427fb2b2a21963939a761a5f0f3557415dba580"
10
10
  }
@@ -26,7 +26,7 @@ Install Shoalrun `0.1.0-alpha.13` or newer in the documentation project. This gu
26
26
 
27
27
  Start with a Shoalrun project and public pages assigned to an enabled publication. Navigation, facets, a site title, and a previous website build are optional. A site origin is needed only when links must fall back to pages on the documentation website. The export does not generate embeddings or run documentation chat.
28
28
 
29
- ## Upgrade an existing integration
29
+ ### Upgrade an existing integration
30
30
 
31
31
  If an existing bundle contains `manifest.documents`, upgrade the CLI and rebuild the export before using this guide's loader. Update custom consumers to the resource contract:
32
32
 
@@ -27,3 +27,14 @@ Keep application help and your documentation website in one content source. `sho
27
27
  Install Shoalrun `0.1.0-alpha.13` or newer in the documentation project. This guide uses the resource-based export manifest described in the [manifest reference](https://www.shoalrun.com/content-delivery/manifest.md).
28
28
 
29
29
  Start with a Shoalrun project and public pages assigned to an enabled publication. Navigation, facets, a site title, and a previous website build are optional. A site origin is needed only when links must fall back to pages on the documentation website. The export does not generate embeddings or run documentation chat.
30
+
31
+ ### Upgrade an existing integration
32
+
33
+ If an existing bundle contains `manifest.documents`, upgrade the CLI and rebuild the export before using this guide's loader. Update custom consumers to the resource contract:
34
+
35
+ - Read `manifest.resources` instead of `manifest.documents`.
36
+ - Select page resources with `ref.kind === 'page'` and `ref.documentId` instead of a document's `id`.
37
+ - Route links with `kind: resource` through their typed `ref`, rather than `kind: document` and `documentId`.
38
+ - Read file paths from the rebuilt manifest; do not retain paths from the old bundle.
39
+
40
+ The `documents` configuration selector remains shorthand for whole pages. Use [resource selectors](https://www.shoalrun.com/content-delivery/select.md) when selecting approved sections or named snippet instances.
@@ -0,0 +1,273 @@
1
+ ---
2
+ id: guide.deployment-profiles
3
+ title: Build customer documentation editions
4
+ summary: Select purchased and grandfathered features with a deployment-owned
5
+ profile and apply customer branding.
6
+ type: how-to
7
+ area: publishing
8
+ subarea: publishing-configuration
9
+ canonical: /publish/deployment-profiles
10
+ ---
11
+
12
+ # Build customer documentation editions
13
+
14
+ > Documentation index: [llms.min.txt](https://www.shoalrun.com/llms.min.txt) · Document manifest: [documents.json](https://www.shoalrun.com/documents.json)
15
+
16
+ Navigation section: [Docs](https://www.shoalrun.com/.well-known/shoalrun/navigation/docs-50f26fe22670.txt) (ID: docs). [All sections and pages](https://www.shoalrun.com/llms.min.txt)
17
+
18
+ Breadcrumbs: [Docs](https://www.shoalrun.com/what-is-shoalrun.md) > Publish and maintain > Customer editions
19
+
20
+ **Updated: 2026-11-03.**
21
+
22
+ Build a documentation edition for each customer from one shared content project. Keep product definitions in the shared repository and supply each customer's purchases, additional features, and branding through that deployment's own profile file. Customer profiles do not need to share a repository.
23
+
24
+ By default, you do not need to mark every page. Pages without feature requirements are shared across customer editions. For customer deployments that need a deliberate decision on each page, enable explicit classification. In either mode, add requirements to pages or sections that depend on specific features.
25
+
26
+ Available since `0.1.0-alpha.15`.
27
+
28
+ ## Before you begin
29
+
30
+ Start with a [configured documentation project](https://www.shoalrun.com/configuration.md), its authored pages, and CLI `0.1.0-alpha.15` or later. Your deployment must be able to supply one local profile file and any declared branding assets. The fictional names and products below illustrate the format; replace them with your own catalog.
31
+
32
+ A stock keeping unit (SKU) identifies a product or bundle you sell. A feature ID identifies functionality that documentation describes. A SKU revision grants a set of features; a profile can also grant features directly for standalone purchases or grandfathered agreements.
33
+
34
+ ## Define the shared SKU manifest
35
+
36
+ Create `sku-manifest.yaml` beside `docs.config.yaml`:
37
+
38
+ ```yaml title="sku-manifest.yaml"
39
+ schemaVersion: 1
40
+ features:
41
+ analytics: { description: Analytics reports }
42
+ connectors: { description: External data connectors }
43
+ reports.classic: { lifecycle: deprecated }
44
+ skus:
45
+ professional:
46
+ revisions:
47
+ "2025-04":
48
+ features: [analytics, reports.classic]
49
+ "2026-10":
50
+ features: [analytics, connectors]
51
+ ```
52
+
53
+ Retain historical revisions unchanged when packaging changes. An existing customer can continue using the original revision, or receive an explicit feature grant. Marking a feature `deprecated` or `retired` does not remove its documentation grant.
54
+
55
+ Enable profile selection in the shared configuration:
56
+
57
+ ```yaml title="docs.config.yaml (fragment)"
58
+ profiles:
59
+ manifest: ./sku-manifest.yaml
60
+ required: true
61
+ pruneNavigation: true
62
+ ```
63
+
64
+ `required` defaults to `true`. A missing profile fails the build. `pruneNavigation` defaults to `false`; enabling it removes known excluded destinations and empty groups. Misspelled navigation targets remain errors.
65
+
66
+ ## Mark pages and shared sections
67
+
68
+ Pages declare feature requirements with `requires`. They do not name SKU IDs. The profile's SKU mappings and direct grants determine which features are available.
69
+
70
+ ### Unmarked pages are shared by default
71
+
72
+ With `profiles.requireClassification` omitted or `false`, a page with no authored or inherited `requires` is included in every eligible customer edition. Common setup, introductions, and shared troubleshooting can remain unmarked.
73
+
74
+ Shared content still has to pass the project's access, publication, language, and facet rules. A draft stays excluded from normal builds, and a page for an older version still needs that publication enabled.
75
+
76
+ The following table shows feature selection after those other rules pass. Grants can come from SKUs or direct feature entries:
77
+
78
+ | Page requirements | No granted features | Analytics only | Analytics and Connectors |
79
+ | ------------------------------------- | ------------------- | -------------- | ------------------------ |
80
+ | No authored or inherited requirements | Included | Included | Included |
81
+ | `allOf: [analytics]` | Omitted | Included | Included |
82
+ | `allOf: [analytics, connectors]` | Omitted | Omitted | Included |
83
+ | `anyOf: [analytics, connectors]` | Omitted | Included | Included |
84
+
85
+ **Forgetting a requirement makes a feature-specific page shared.** Shoalrun does not infer requirements from its folder, title, product metadata, or navigation label. Enable explicit classification to catch missing page declarations, and review feature-specific content before distributing an edition.
86
+
87
+ ### Require a deliberate page classification
88
+
89
+ Enable strict classification in the shared project configuration:
90
+
91
+ ```yaml title="docs.config.yaml (fragment)"
92
+ profiles:
93
+ manifest: ./sku-manifest.yaml
94
+ required: true
95
+ pruneNavigation: true
96
+ requireClassification: true
97
+ ```
98
+
99
+ Every public page in the shared project's enabled publications must now explicitly declare `shared: true` or `requires` in its own source frontmatter. An unclassified page fails the build with its source filename; it does not silently disappear. The check runs before customer feature and publication selection, so a later purchase or publication change cannot expose a previously unchecked page. Drafts and pages outside the shared project's enabled publications do not need classification for that build.
100
+
101
+ For common instructions, add this page-level declaration:
102
+
103
+ ```yaml title="Shared page frontmatter (fragment)"
104
+ shared: true
105
+ ```
106
+
107
+ For a product-specific page, use `requires` as shown below. Do not combine `shared: true` and `requires` on the same page. `shared: false` is invalid. `shared` must stay page-specific and cannot appear in frontmatter defaults or enforced settings. Inherited feature requirements still restrict content, but do not satisfy strict classification: each page needs its own declaration.
108
+
109
+ To migrate, enable the policy locally and classify the pages named in build errors after reviewing their content. Put the declaration in page templates to make the choice part of creating a page; avoid marking an entire collection shared without reviewing it.
110
+
111
+ This policy catches missing declarations. It cannot tell whether a declaration is correct or detect an ungated product-specific paragraph inside a shared page. It does not authenticate readers; the deployment still controls access to the resulting edition.
112
+
113
+ ### Restrict a feature-specific page
114
+
115
+ Add a requirement to each page that depends on specific functionality. This integration guide needs both features:
116
+
117
+ ```yaml title="Integration guide frontmatter (fragment)"
118
+ requires:
119
+ allOf: [analytics, connectors]
120
+ ```
121
+
122
+ Use `anyOf` when either feature is sufficient. If a requirement contains both clauses, both must pass. When the resolved requirements do not match the profile's grants, the whole page is omitted.
123
+
124
+ ### Restrict part of a shared page
125
+
126
+ A page classified `shared: true` can still contain product-specific sections. Use `<ForFeature>` around each section that depends on features. Its attributes contain whitespace-separated feature IDs:
127
+
128
+ ```mdx
129
+ These setup instructions apply to every customer.
130
+
131
+ <ForFeature allOf="analytics connectors">
132
+
133
+ ## Connect your reports <Anchor id="connect-reports" />
134
+
135
+ Import a dataset through a connector, then select it in your analytics report.
136
+
137
+ </ForFeature>
138
+
139
+ These troubleshooting tips apply to every customer.
140
+ ```
141
+
142
+ The page's content outside `<ForFeature>` stays shared. A block appears only when its requirements match; excluding a block does not exclude the rest of the page. If a page-level requirement excludes the whole page, a matching block inside it cannot restore that page.
143
+
144
+ Excluded blocks contribute no text, links, snippet expansions, API embeds, or images to the edition. Put links to optional pages inside matching conditions. A link remaining in selected prose must point to a selected destination.
145
+
146
+ ### Classify generated API references
147
+
148
+ Generated pages take an explicit classification from their API definition or OpenAPI operation. For an API whose generated references are shared, add `shared: true` beside `generateReferences`:
149
+
150
+ ```yaml title="Shared API definition (fragment)"
151
+ apis:
152
+ example:
153
+ shared: true
154
+ source:
155
+ kind: file
156
+ path: ./openapi.yaml
157
+ focused: true
158
+ generateReferences: true
159
+ ```
160
+
161
+ For a feature-specific API, use `requires` instead of `shared`. An individual OpenAPI operation can declare `x-shoalrun-shared: true` or `x-shoalrun-requires: { allOf: [analytics] }`. Its declaration satisfies classification for that generated page; API-level feature requirements still apply. Operations with differing requirements need their own declarations. General frontmatter defaults do not satisfy generated-page classification. Authored API reference pages follow the ordinary page rule.
162
+
163
+ ## Supply the profile from the deployment
164
+
165
+ Mount or generate the customer profile outside the shared docs repository. For example, a deployment could provide `/run/config/docs-profile.yaml` and a `brand` directory beside it:
166
+
167
+ ```yaml title="Deployment-owned docs-profile.yaml"
168
+ schemaVersion: 1
169
+ skus:
170
+ - { id: professional, revision: "2026-10" }
171
+ features:
172
+ - reports.classic
173
+ site:
174
+ title: Example Partner documentation
175
+ origin: https://docs.partner.example
176
+ logo: ./brand/logo.svg
177
+ favicon: ./brand/icon.png
178
+ theme:
179
+ palette: kelp
180
+ publications:
181
+ enabled:
182
+ - { channel: production, version: current, language: en }
183
+ ```
184
+
185
+ This profile grants Analytics and Connectors through the SKU, plus Classic Reports through a direct grant. A customer with only grandfathered functionality can omit `skus` and declare `features: [reports.classic]`. No synthetic SKU is needed.
186
+
187
+ SKU and direct grants combine into a set. Unknown IDs and revisions fail validation. Declare `features: []` with no SKU grants for a shared-content-only edition; `null` is invalid. That edition still includes eligible shared pages and text outside feature blocks, while pages and blocks requiring a feature are omitted. A missing required profile fails the build rather than selecting this shared-only behavior.
188
+
189
+ Profile logo and favicon paths resolve from the profile directory and must stay inside it. Shared configuration paths retain their own origins. Shoalrun reads the chosen profile and declared assets without discovering other customers' files in that deployment directory.
190
+
191
+ Profiles accept selected `site`, `theme`, and existing snippet `variables` settings. They can narrow `publications.enabled` to combinations already enabled by the shared project. They cannot replace content sources, register plugins, change access policy, or override navigation. Profile CSS, custom fonts, and file-backed palettes are not supported.
192
+
193
+ ## Build and inspect the edition
194
+
195
+ From the shared documentation project directory, build into a deployment-specific output:
196
+
197
+ ```sh
198
+ shoalrun build docs.config.yaml dist/customer \
199
+ --profile /run/config/docs-profile.yaml
200
+ ```
201
+
202
+ To export application content, pass the same profile to `shoalrun export`:
203
+
204
+ ```sh
205
+ shoalrun export docs.config.yaml --out dist/customer-content \
206
+ --profile /run/config/docs-profile.yaml
207
+ ```
208
+
209
+ If several publications are enabled, an export still needs its normal explicit publication selection. Grandfathered features and older instructions are independent: the feature grant selects functionality, while the [publication version](https://www.shoalrun.com/publish/publications.md) selects the release's instructions.
210
+
211
+ Use the profile when [validating documentation edits](https://www.shoalrun.com/author/workspace.md):
212
+
213
+ ```sh
214
+ shoalrun docs baseline --config docs.config.yaml \
215
+ --out .shoalrun/baseline.json --profile /run/config/docs-profile.yaml
216
+
217
+ # Edit your documentation, then validate the same edition.
218
+ shoalrun docs validate --config docs.config.yaml \
219
+ --baseline .shoalrun/baseline.json --profile /run/config/docs-profile.yaml
220
+ ```
221
+
222
+ Review and preview use the returned report. The snapshot captures the external profile and declared assets; later changes make the report stale. Treat reports and captured project directories as private build artifacts.
223
+
224
+ ## Choose navigation labels
225
+
226
+ Navigation headings come from the shared project's ordinary navigation configuration. For example:
227
+
228
+ ```yaml title="Shared navigation (fragment)"
229
+ navigation:
230
+ - id: product-guides
231
+ label: Product guides
232
+ items:
233
+ - { id: analytics, doc: guide.analytics }
234
+ - { id: connectors, doc: guide.connectors }
235
+ ```
236
+
237
+ `Product guides` is authored text. You can name this group `Your products`, `Reference`, or another label that suits your readers. The framework does not supply the words “Your products.” Profile selection removes ineligible destinations from the group; it does not rename the group or infer purchases from navigation labels.
238
+
239
+ ## Check the result
240
+
241
+ Inspect the edition's sidebar, selected pages, and shared sections. Then inspect its Markdown, search indexes, `documents.json`, and exports for the same selections. An excluded feature's content should be absent from the output files, rather than hidden by browser controls.
242
+
243
+ A normal site build writes a private selection report at `.shoalrun/profile-selection.json`. It lists resolved features, grant sources, and inclusion decisions. Match its `buildId` to the output before treating it as a receipt for that output. The profile itself, its source filenames, and the report are not served as public metadata.
244
+
245
+ Affected pages excluded from the selected profile remain listed in validation coverage with a warning that their rendered content was not checked. Validate another profile that includes those pages before accepting their content changes.
246
+
247
+ ## HTML, Markdown, and agents
248
+
249
+ HTML displays the selected documentation with the deployment's title, logo, favicon, theme, and configured links. The masthead keeps the title as its accessible label. Markdown retains the selected instructions and links, without the site's branding controls. Feature selection happens during compilation and does not need browser JavaScript.
250
+
251
+ Agents reading search, discovery, or exported content receive the selected edition. They cannot retrieve excluded instructions from that edition's Markdown twin. Existing browser reader views still affect visibility only; use feature requirements for build-time omission.
252
+
253
+ ## Current limits
254
+
255
+ Profiled API builds reject full OpenAPI source publication. Set `source.publish: false` and `source.focused: true` for focused operation downloads. Generated operations can declare `x-shoalrun-requires`; API definitions and explicit bindings also accept `requires`. Generated references respect inherited frontmatter requirements.
256
+
257
+ Operation embeds respect the selection. Standalone `<ApiSchema api="..." schema="..." />` embeds are not supported in profiled builds. Static `vercel build --profile FILE` is supported; profiled chat-function builds are not.
258
+
259
+ `dev` and checked-plan authoring do not yet accept deployment profiles. Use build/serve or captured validation/preview. Your deployment supplies the declared purchases and grants; Shoalrun does not query billing systems or expire entitlements. Protect private editions through host authentication.
260
+
261
+ ## Related reading
262
+
263
+ ### Read first
264
+
265
+ - [Build separate sites from shared content](https://www.shoalrun.com/publish/single-source-sites.md) — Understand how separate sites share authored content and configuration.
266
+
267
+ ### Next steps
268
+
269
+ - [Check working-tree documentation edits](https://www.shoalrun.com/author/workspace.md) — Review the selected edition using captured HTML and Markdown. (Status: experimental.)
270
+
271
+ ### Reference while working
272
+
273
+ - [Share pages across documentation versions](https://www.shoalrun.com/publish/publications.md) — Select older product instructions independently of feature grants.
@@ -0,0 +1,44 @@
1
+ ---
2
+ id: guide.deployment-profiles
3
+ title: Build customer documentation editions
4
+ summary: Select purchased and grandfathered features with a deployment-owned
5
+ profile and apply customer branding.
6
+ type: how-to
7
+ area: publishing
8
+ subarea: publishing-configuration
9
+ canonical: /publish/deployment-profiles
10
+ ---
11
+
12
+ # Build customer documentation editions
13
+
14
+ > Documentation index: [llms.min.txt](https://www.shoalrun.com/llms.min.txt) · Document manifest: [documents.json](https://www.shoalrun.com/documents.json)
15
+
16
+ Navigation section: [Docs](https://www.shoalrun.com/.well-known/shoalrun/navigation/docs-50f26fe22670.txt) (ID: docs). [All sections and pages](https://www.shoalrun.com/llms.min.txt)
17
+
18
+ Breadcrumbs: [Docs](https://www.shoalrun.com/what-is-shoalrun.md) > Publish and maintain > Customer editions
19
+
20
+ **Updated: 2026-11-03.**
21
+
22
+ Parent page: [Full Markdown page](/publish/deployment-profiles.md)
23
+
24
+ **Page reading path** — these links apply to the full page.
25
+
26
+ **Read first**
27
+
28
+ - [Build separate sites from shared content](https://www.shoalrun.com/publish/single-source-sites.md) — Understand how separate sites share authored content and configuration.
29
+
30
+ **Next steps**
31
+
32
+ - [Check working-tree documentation edits](https://www.shoalrun.com/author/workspace.md) — Review the selected edition using captured HTML and Markdown. (Status: experimental.)
33
+
34
+ Build a documentation edition for each customer from one shared content project. Keep product definitions in the shared repository and supply each customer's purchases, additional features, and branding through that deployment's own profile file. Customer profiles do not need to share a repository.
35
+
36
+ By default, you do not need to mark every page. Pages without feature requirements are shared across customer editions. For customer deployments that need a deliberate decision on each page, enable explicit classification. In either mode, add requirements to pages or sections that depend on specific features.
37
+
38
+ Available since `0.1.0-alpha.15`.
39
+
40
+ ## Before you begin
41
+
42
+ Start with a [configured documentation project](https://www.shoalrun.com/configuration.md), its authored pages, and CLI `0.1.0-alpha.15` or later. Your deployment must be able to supply one local profile file and any declared branding assets. The fictional names and products below illustrate the format; replace them with your own catalog.
43
+
44
+ A stock keeping unit (SKU) identifies a product or bundle you sell. A feature ID identifies functionality that documentation describes. A SKU revision grants a set of features; a profile can also grant features directly for standalone purchases or grandfathered agreements.