agent/prompts/ folder in your context repo - no code changes or forking required.
Because the files live in your context repo, prompt changes are versioned with the rest of your context and stay reviewable in pull requests. nao init scaffolds the agent/prompts/ folder for you with a README.md and an example slack.md.
Per-surface files
Place any of these files inagent/prompts/:
| File | Applies to |
|---|---|
system.md | Every surface (nao web Bot, Slack, Teams, Telegram, WhatsApp, automations) |
slack.md | Slack Bot only |
teams.md | Teams Bot only |
telegram.md | Telegram Bot only |
whatsapp.md | WhatsApp Bot only |
automation.md | Automation runs only |
- The surface-specific file (e.g.
slack.md), if present. - Otherwise
system.md, if present. - Otherwise nao’s built-in default prompt.
system.md when present, otherwise the built-in default.
Replace vs. extend: {{ nao_prompt }}
By default, a prompt file fully replaces the built-in prompt for that surface.
To keep the default and only add to it, include the {{ nao_prompt }} placeholder. At runtime it expands to nao’s default prompt for that surface (in slack.md it expands to the default Slack prompt, in system.md to the web prompt, and so on). The placeholder tolerates whitespace variations ({{nao_prompt}} or {{ nao_prompt }}) and can appear more than once.
Extend the default Slack prompt - agent/prompts/slack.md:
agent/prompts/system.md:
{{ nao_prompt }}, the file content becomes the entire prompt.
Internal runs that pass an explicit system prompt (for example, context recommendations) are not affected by these overrides.
Rules
Shape per-message behavior with RULES.md
Custom Context
Organize your context repo however works best