Configuration
Fased reads an optional config from~/.fased/fased.json.
If the file is missing, Fased uses safe defaults. In most setups, fased onboard should write the first version for you.
Common reasons to add a config:
- Connect channels and control who can message the bot
- Set models, tools, sandboxing, or automation (cron, hooks)
- Tune sessions, media, networking, or UI
Local profile vs hosting profile
The onboarding profile sets the baseline runtime shape:-
Local profile
- personal machine
- loopback-first gateway bind
- easiest path for private browser access and direct local operation
- add Tailscale Serve only when you want access from other devices
-
Hosting profile
- VPS or always-on machine
- supervised service install is expected
- still loopback-first by default
- remote access should normally come from Tailscale Serve, a direct tailnet bind, a trusted reverse proxy, or SSH
Minimal config
Editing config
- Interactive wizard
- CLI (one-liners)
- Control UI
- Direct edit
Strict validation
When validation fails:- The Gateway does not boot
- Only diagnostic commands work (
fased doctor,fased logs,fased health,fased status) - Run
fased doctorto see exact issues - Run
fased doctor --fix(or--yes) to apply repairs
Common tasks
Set up a channel (WhatsApp, Telegram, Discord, etc.)
Set up a channel (WhatsApp, Telegram, Discord, etc.)
Use Agent > Channels for normal setup. Each channel still has an
underlying config section under
channels.<provider>, and dedicated channel
pages document the exact account flow:- WhatsApp —
channels.whatsapp - Telegram —
channels.telegram - Discord —
channels.discord - Slack —
channels.slack - Signal —
channels.signal - iMessage —
channels.imessage - Google Chat —
channels.googlechat - Mattermost —
channels.mattermost - MS Teams —
channels.msteams
Choose and configure models
Choose and configure models
Use Agent > Models for normal setup. Raw config can still set the
primary model and optional fallbacks:Set the primary model and optional fallbacks:
agents.defaults.modelsdefines the model catalog and acts as the allowlist for/model.- Model refs use
provider/modelformat (e.g.anthropic/claude-opus-4-6). agents.defaults.imageMaxDimensionPxcontrols transcript/tool image downscaling (default1200); lower values usually reduce vision-token usage on screenshot-heavy runs.- See Models CLI for switching models in chat and Model Failover for auth rotation and fallback behavior.
- For custom/self-hosted providers, see Custom providers in the reference.
Control who can message the bot
Control who can message the bot
DM access is controlled per channel via
dmPolicy:"pairing"(default): unknown senders get a one-time pairing code to approve"allowlist": only senders inallowFrom(or the paired allow store)"open": allow all inbound DMs (requiresallowFrom: ["*"])"disabled": ignore all DMs
groupPolicy + groupAllowFrom or channel-specific allowlists.See the full reference for per-channel details.Set up group chat mention gating
Set up group chat mention gating
Group messages default to require mention. Configure patterns per agent:
- Metadata mentions: native @-mentions (WhatsApp tap-to-mention, Telegram @bot, etc.)
- Text patterns: regex patterns in
mentionPatterns - See full reference for per-channel overrides and self-chat mode.
Configure sessions and resets
Configure sessions and resets
Sessions control conversation continuity and isolation:
dmScope:main(shared) |per-peer|per-channel-peer|per-account-channel-peerthreadBindings: global defaults for thread-bound session routing (Discord supports/focus,/unfocus,/agents,/session idle, and/session max-age).- See Session Management for scoping, identity links, and send policy.
- See full reference for all fields.
Enable sandboxing
Enable sandboxing
Run agent sessions in isolated Docker containers:Build the image first:
scripts/sandbox-setup.shSee Sandboxing for the full guide and full reference for all options.Set up heartbeat (periodic check-ins)
Set up heartbeat (periodic check-ins)
every: duration string (30m,2h). Set0mto disable.target:last|whatsapp|telegram|discord|nonedirectPolicy:allow(default) orblockfor DM-style heartbeat targets- See Heartbeat for the full guide.
Configure scheduled tasks
Configure scheduled tasks
Use Agent > Tasks for normal recurring work. The raw
cron block below
controls scheduler-wide retention and concurrency.sessionRetention: prune completed isolated run sessions fromsessions.json(default24h; setfalseto disable).runLog: prunecron/runs/<jobId>.jsonlby size and retained lines.- See Scheduled Tasks for feature overview and CLI examples.
Set up webhooks (hooks)
Set up webhooks (hooks)
Enable HTTP webhook endpoints on the Gateway:See full reference for all mapping options and Gmail integration.
Configure multi-agent routing
Configure multi-agent routing
Run multiple isolated agents with separate workspaces and sessions:See Multi-Agent and full reference for binding rules and per-agent access profiles.
Split config into multiple files ($include)
Split config into multiple files ($include)
Use
$include to organize large configs:- Single file: replaces the containing object
- Array of files: deep-merged in order (later wins)
- Sibling keys: merged after includes (override included values)
- Nested includes: supported up to 10 levels deep
- Relative paths: resolved relative to the including file
- Error handling: clear errors for missing files, parse errors, and circular includes
Choose network exposure safely
Choose network exposure safely
Recommended baseline:Then layer remote access on top with:
- Tailscale Serve for tailnet-only browser and WebSocket access
- SSH tunnels for operator-only access
- direct tailnet bind only when you intentionally want tailnet clients to talk to the gateway without Serve
Config hot reload
The Gateway watches~/.fased/fased.json and applies changes automatically — no manual restart needed for most settings.
Reload modes
| Mode | Behavior |
|---|---|
hybrid (default) | Hot-applies safe changes instantly. Automatically restarts for critical ones. |
hot | Hot-applies safe changes only. Logs a warning when a restart is needed — you handle it. |
restart | Restarts the Gateway on any config change, safe or not. |
off | Disables file watching. Changes take effect on the next manual restart. |
What hot-applies vs what needs a restart
Most fields hot-apply without downtime. Inhybrid mode, restart-required changes are handled automatically.
| Category | Fields | Restart needed? |
|---|---|---|
| Channels | channels.*, web — all built-in and extension channels | No |
| Agent & models | agents, models, bindings | No |
| Automation | hooks, cron, agents.list[].heartbeat, agents.defaults.heartbeat | No |
| Sessions & messages | session, messages | No |
| Tools & media | tools, browser, skills, audio, talk | No |
| UI & misc | ui, logging | No |
| Gateway server | gateway.* (port, bind, auth, tailscale, TLS, HTTP) | Yes |
| Infrastructure | discovery, canvasHost, plugins | Yes |
gateway.reload and gateway.remote are exceptions — changing them does not trigger a restart.Config RPC (programmatic updates)
Control-plane write RPCs (
config.apply, config.patch, update.run) are rate-limited to 3 requests per 60 seconds per deviceId+clientIp. When limited, the RPC returns UNAVAILABLE with retryAfterMs.config.apply (full replace)
config.apply (full replace)
Validates + writes the full config and restarts the Gateway in one step.Params:
raw(string) — JSON5 payload for the entire configbaseHash(optional) — config hash fromconfig.get(required when config exists)sessionKey(optional) — session key for the post-restart wake-up pingnote(optional) — note for the restart sentinelrestartDelayMs(optional) — delay before restart (default 2000)
config.patch (partial update)
config.patch (partial update)
Merges a partial update into the existing config (JSON merge patch semantics):
- Objects merge recursively
nulldeletes a key- Arrays replace
raw(string) — JSON5 with just the keys to changebaseHash(required) — config hash fromconfig.getsessionKey,note,restartDelayMs— same asconfig.apply
config.apply: coalesced pending restarts plus a 30-second cooldown between restart cycles.Environment variables
Fased reads env vars from the parent process plus:.envfrom the current working directory (if present)~/.fased/.env(global fallback)
Shell env import (optional)
Shell env import (optional)
If enabled and expected keys aren’t set, Fased runs your login shell and imports only the missing keys:Env var equivalent:
FASED_LOAD_SHELL_ENV=1Env var substitution in config values
Env var substitution in config values
Reference env vars in any config string value with Rules:
${VAR_NAME}:- Only uppercase names matched:
[A-Z_][A-Z0-9_]* - Missing/empty vars throw an error at load time
- Escape with
$${VAR}for literal output - Works inside
$includefiles - Inline substitution:
"${BASE}/v1"→"https://api.example.com/v1"
Secret refs (env, file, exec)
Secret refs (env, file, exec)
For fields that support SecretRef objects, you can use:SecretRef details (including
secrets.providers for env/file/exec) are in Secrets Management.Full reference
For the complete field-by-field reference, see Configuration Reference.Related: Configuration Examples · Configuration Reference · Doctor