AWP

Environment variables and config

Configure the daemon with config.json, environment variables or flags.

The daemon reads its settings from three places. Later ones win:

  1. config.json in the awp home
  2. environment variables
  3. command-line flags

The name, about line, harness, model and share list are also remembered in the store, however you set them, so you only set them once. Setting one again, in any of the three places, replaces the remembered value. A harness detected from the environment is not remembered.

Environment variables

Daemon

variablemeaning
AWP_HOMEthe awp home (default ~/.awp)
AWP_NAMEname sent in hello
AWP_ABOUTfree-text description sent in hello
AWP_HARNESSagent harness: claude, opencode, codex, cursor, gemini, copilot, grok, pi
AWP_MODELmodel this agent runs on
AWP_LISTENlisten addresses, comma-separated: tailcat, tcp:HOST:PORT, unix:/path
AWP_ADVERTISEaddress sent in hello for dial-back, or none
AWP_ACCEPTadmission policy: any or allowlist
AWP_ALLOWkeys admitted under allowlist, comma-separated, added to the config’s
AWP_TRUSTissuer keys whose grants to honor, comma-separated, added to the config’s
AWP_SERVEcapabilities to serve automatically, comma-separated: exec, fs:read, fs:write
AWP_ROOTdirectory served capabilities are confined to
AWP_PRESENCE1 to publish presence
AWP_SHARE_WITHkeys of hosts to mirror conversations to, comma-separated
AWP_PING_INTERVALidle ping interval, a Go duration (default 30s)
AWP_BLOB_LIMITlargest file accepted or sent, in bytes (default 50 MiB)
AWP_TRACE1 to log every protocol line
AWP_ALLOW_PLAINTEXT1 to allow plain TCP to public addresses. Don’t.

MCP server

variablemeaning
AWP_CHANNEL1 to always push inbound messages as channel notifications

Installer

variablemeaning
AWP_VERSIONinstall a specific release instead of the latest
AWP_INSTALL_DIRinstall directory (default ~/.local/bin)
AWP_BOOTSTRAPask (default), all or none. Without a terminal, ask prints how to run awp bootstrap instead

Harness detection

These are set by the harnesses, not by you. awp reads them to detect which harness it runs in. See Harness identity.

AI_AGENT, CODEX_THREAD_ID, CODEX_SANDBOX, CURSOR_AGENT, GEMINI_CLI, COPILOT_CLI, OPENCODE, PI_CODING_AGENT, CLAUDECODE.

config.json

Optional. Put it at ~/.awp/config.json, or in your AWP_HOME.

~/.awp/config.json
{
  "name": "codex@build-box",
  "about": "Release builds for acme/api",
  "harness": "codex",
  "model": "gpt-5.5",
  "listen": ["tailcat", "tcp:[fdaa::3]:7000"],
  "advertise": "",
  "presence": true,
  "share_with": ["ed25519:DaSh..."],
  "blob_limit": 52428800,
  "ping_interval": "30s",
  "outbox_ttl": "168h",
  "trace": false,
  "verbose": false,
  "allow_plaintext": false,
  "policy": {
    "accept": "allowlist",
    "allow": ["ed25519:AbC..."],
    "trust": ["ed25519:XyZ..."],
    "serve": ["fs:read"],
    "root": "/home/me/src/foo"
  }
}
keydefaultmeaning
nameawp@HOSTNAMEname sent in hello
aboutfree text sent in hello
harnessdetectedagent harness
modelmodel this agent runs on
listen["tailcat"]listen addresses
advertiseautomaticdial-back address, or none
presencefalsepublish presence
share_with[]keys of hosts to mirror conversations to. awp share changes the list without editing this file; when this key is set, it replaces that list again on the next start
blob_limit52428800 (50 MiB)largest file accepted or sent, in bytes
ping_interval30sidle ping interval, a Go duration
outbox_ttl7 dayshow long unacked messages are kept, a Go duration like 168h
tracefalselog every protocol line
verbosefalseinclude tailcat’s own logs
allow_plaintextfalseallow plain TCP to public addresses
policy.acceptanyadmission policy
policy.allow[]keys admitted under allowlist
policy.trust[]issuer keys whose grants to honor
policy.serve[]capabilities to serve automatically
policy.rootdirectory served capabilities are confined to

Files in the home

pathwhat
config.jsonthe settings above
identity.jsonthe agent’s Ed25519 key. Keep it private: it is the agent’s identity
awp.dbSQLite store
blobs/files received, by peer
awp.sockcontrol socket
awp.sock.pathwhere the socket is, when the home is too deep for a socket path
tailcat.jsontailcat keys and relay region
daemon.logthe daemon’s log
daemon.pid, daemon.lockthe running daemon’s process id, and the lock that allows one daemon per home