ChatPilot
For developers

The config file (config.yaml)

What config.yaml is still for (server installs and developers), what wins over it, and the settings that only it holds.

Everything you set yourself is in the app, and the app keeps your choices in your settings file, settings.json. You never need config.yaml for that. It stays for the install itself (server installs, Docker, a copy built from the source code) and for developers: ports, paths, ChatPilot's own servers, and the internal defaults nobody needs to change.

Where it is

Mac and Linux: ~/.config/chatpilot/config.yaml; Windows: %APPDATA%\chatpilot\config.yaml; in Docker: the config volume. chatpilot --config PATH run uses another file.

  • A first start without the file (chatpilot run, the service, the installer, Docker) writes a short one: the owner's Telegram id (filled in by the first-start page in the browser), the quiet hours to start with, and a commented list of the install settings below.
  • uv run chatpilot init (developers) copies the full config.example.yaml instead, with every setting explained line by line.

After you change it: uv run chatpilot service restart (Docker: restart the container).

What wins

  1. The panel and settings.json. A setting that has a card in the app is read from settings.json first. A key there that is null follows config.yaml; Back to config.yaml's choice on a card sets it back to null.
  2. config.yaml. Everything else: the install settings below, and the internal defaults.
  3. The built-in default for anything neither file names.

So a line in config.yaml for a setting that has a card is only the starting value of a new install; once someone changes it on the card, the card's value counts.

Install settings

These have no card in the app on purpose: they describe the install, not how you work. The list is generated from src/chatpilot/settingsmap.py (uv run python -m chatpilot.settingsmap --manual); a section ending in … means every setting in it.

SettingWhat it is
data_dirWhere the data lives; a move to another computer goes through a backup
admin.…Panel port, bind address, hosts, proxies, sign-in mode of the install
email[].oauth_client_idAn own OAuth client (developers)
google_oauth_clientAn own Google OAuth client instead of ChatPilot's (developers)
llm.claude_pathPath of the claude program
llm.codex_pathPath of the codex program
llm.gemini_pathPath of the gemini program
voice.whisper_binPath of whisper.cpp
voice.modelPath of the whisper model
voice.ffmpegPath of ffmpeg
tickets.app_repoChatPilot's own repository for app reports
profiles.packsFolders with extra profile packs
support.urlChatPilot's support server
licence.urlChatPilot's licence server
github.…ChatPilot's GitHub app for reports (developers)
github_questions.tracker_urlThe tracker's MCP server
update.releases_urlChatPilot's release feed
cleanup.ollama_urlThe local model server cleanup uses

config.example.yaml explains each one with the lines to copy in.

Internal defaults

Timeouts, poll intervals, size limits, the model and effort per step and the like have a default that suits every install and no card. A developer can still set them in config.yaml (the example has them all). The full list of settings, with where each one is set in the app or that it is internal, is docs/settings_inventory.md in the repository.

A new setting

Every setting in Config (src/chatpilot/config.py) needs a line in settingsmap.WHERE: panel with where the app sets it, internal, or install. tests/test_settingsmap.py fails for a setting without one, so nothing new lands in config.yaml without saying where a user sets it. A new install setting appears in the table above once you regenerate it.

Checked against ChatPilot 0.1.0b1. Report a problem with this page