Configuration¶
One file configures a brain: client.config.json at the repository root. It's
validated against schemas/client.config.schema.json on every make verify,
so a typo fails the check instead of reaching readers.
Identity¶
{
"client": {
"name": "Acme Handbook",
"shortName": "ACME",
"slug": "acme-handbook",
"engagement": "Team handbook"
}
}
nameis shown to readers.shortNameis used where space is tight.slugnames the brain in URLs and tooling. The Worker name inwrangler.tomlusually follows it, as<slug>-portal.
Branding¶
Everything visual lives under branding:
{
"branding": {
"portalTitle": "Acme Handbook",
"owner": {
"name": "Acme",
"mark": "/assets/brand/acme-light.svg",
"markDark": "/assets/brand/acme-dark.svg"
},
"heroMark": "/assets/brand/acme-light.svg",
"heroMarkDark": "/assets/brand/acme-dark.svg",
"heroMarkWidth": 96,
"colors": {
"primary": "#3B6FD4",
"link": "#4A86E8",
"accent": "#E0A030",
"bg": "#0F1117",
"text": "#E6E8EE"
},
"fonts": {
"heading": "'Fraunces', Georgia, serif",
"body": "'Inter', system-ui, sans-serif",
"mono": "'JetBrains Mono', monospace"
},
"greeting": "Ask about anything in the handbook.",
"inputPlaceholder": "Ask the handbook…"
}
}
owneris the party running the brain, shown in the topbar and page footers. Give it anameand optionalmark/markDarkartwork. With no mark, the name is shown as a text wordmark. The default is the placeholderACME; set"owner": ""to drop the owner brand entirely.heroMarkandheroMarkDarkset the home page artwork for light and dark themes.colorsandfontsoverride the default Mimwell palette and type. The color keys areprimary,link,accent,bg,bgDeep,surface,border,borderLight,text,textMutedandtextFaint.greetingandinputPlaceholderset the chat agent's opening text.
Put your artwork under assets/brand/. Mimwell's own marks live there too;
point the fields above at your files to replace them.
Theme¶
light or dark. Readers can switch, and their choice is remembered.
Portal¶
templatepicks the home page for the brain's purpose:auto,engagement,company,topic,personal,wiki,catalog,federationorconsole.view.defaultiseasyoradvanced. See Easy and Advanced views.
Profile¶
The profile decides which record kinds the brain composes. The available
overlays are the files in profiles/. Add sensemaking to turn on the
sensemaking workbench.
Knowledge sources¶
sources lists the folders the build reads documents from.
Assistant¶
{
"assistant": {
"provider": "anthropic",
"model": "claude-sonnet-5",
"maxAgentTurns": 8,
"identity": "Answer questions using the current portal knowledge and cite the available sources.",
"audience": "The people authorized to use this brain."
}
}
provider is anthropic (the default) or openai. The chat agent, the edit
agent and the authoring agent all use the same provider.
- Anthropic needs an
ANTHROPIC_API_KEYsecret on the Worker. With nomodelset, it usesclaude-sonnet-5. - OpenAI needs an
OPENAI_API_KEYsecret, andmodelmust be set to an OpenAI model id; there is no guessed default.baseUrlis optional and must behttps, so you can point it at any OpenAI-compatible endpoint:
{
"assistant": {
"provider": "openai",
"model": "<your OpenAI model id>",
"baseUrl": "https://api.openai.com/v1"
}
}
A missing model, a Claude model id with openai, or an unknown provider fails
config validation, and chat answers with a clear 503 instead of guessing. See
Deploying for setting the secret.
Access¶
Access control is optional and off by default. It needs the portal served behind Cloudflare Access, which authenticates readers and tells the Worker who they are.
{
"access": {
"owners": ["[email protected]"],
"restricted": [
"knowledge/docs/finance/",
{ "path": "knowledge/docs/hr/**", "owners": ["[email protected]"] }
]
}
}
ownerscan read everything. Use full email addresses.restrictedlists path globs only owners may read. The object form also grants that entry to the extraownersit names. A rule for a folder covers everything beneath it;*stays within one path segment and**crosses segments.- Rules only narrow. A reader must be allowed by every rule that matches a path.
- The rules are enforced on static files, search results, the graph, the
agent's answers and the served config. The
accessblock itself is never sent to a browser. - It fails closed. If the block can't be parsed, everything is restricted and nobody is an owner.