Skip to main content
Each bot surface (nao web Bot, Slack, Teams, Telegram, WhatsApp, and automations) ships with a built-in system prompt. You can customize or fully replace that prompt per surface by adding markdown files to an 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 in agent/prompts/:
FileApplies to
system.mdEvery surface (nao web Bot, Slack, Teams, Telegram, WhatsApp, automations)
slack.mdSlack Bot only
teams.mdTeams Bot only
telegram.mdTelegram Bot only
whatsapp.mdWhatsApp Bot only
automation.mdAutomation runs only
Resolution order for a given surface:
  1. The surface-specific file (e.g. slack.md), if present.
  2. Otherwise system.md, if present.
  3. Otherwise nao’s built-in default prompt.
The nao web Bot has no surface-specific file - it uses system.md when present, otherwise the built-in default.
Prompt files are read fresh on every run, just like RULES.md. You can edit a prompt and see the change on the next message without restarting nao.

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:
{{ nao_prompt }}

## Extra Slack guidance
- Always start the answer with a one-line TL;DR.
- Link the source dashboard when one exists.
Fully replace the default for every surface - agent/prompts/system.md:
You are the ACME analytics assistant. Answer only with figures sourced
from the `prod_finance` schema, and never speculate beyond the data.
Without {{ 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.
Next Steps

Rules

Shape per-message behavior with RULES.md

Custom Context

Organize your context repo however works best