Deployment
Talon is a Node.js daemon. The recommended production setup is a systemd service on a Linux host. A wake-only timer mode is available for low-traffic deployments.
Prerequisites
Section titled “Prerequisites”- Node.js 24+
- npm
- A Linux host with systemd
# buildnpm installnpm run build
# apply migrationsnpx talonctl migrate
# verify the setupnpx talonctl doctorsystemd service
Section titled “systemd service”The deploy/install-service.sh script installs Talon as a systemd service:
sudo bash deploy/install-service.shThis creates /etc/systemd/system/talond.service and enables it. The unit includes security hardening:
[Service]NoNewPrivileges=truePrivateTmp=trueSystemCallFilter=@system-serviceProtectSystem=strictReadWritePaths=/path/to/talon/dataTo manage the service:
sudo systemctl start talondsudo systemctl stop talondsudo systemctl status talond
# view logsjournalctl -u talond -fAuto-restart and watchdog
Section titled “Auto-restart and watchdog”The service unit configures Restart=on-failure and RestartSec=5s. If the daemon crashes it restarts automatically. The daemon integrates with systemd’s watchdog heartbeat — if the process hangs without sending a heartbeat, systemd kills and restarts it.
Graceful shutdown
Section titled “Graceful shutdown”The daemon listens for SIGTERM and SIGINT. On receipt it stops accepting new messages, waits for in-flight agent runs to complete (up to a configurable drain timeout), then exits cleanly.
Wake-only timer mode
Section titled “Wake-only timer mode”For low-traffic deployments where you don’t want the daemon running 24/7, use a systemd timer:
# talond-timer.timer[Unit]Description=Run Talon daemon periodically
[Timer]OnBootSec=1minOnUnitActiveSec=5minUnit=talond-oneshot.service
[Install]WantedBy=timers.target# talond-oneshot.service[Unit]Description=Talon daemon (one-shot)
[Service]Type=oneshotExecStart=/usr/bin/node /path/to/talon/dist/index.js --wake-modeUser=talonIn wake mode the daemon starts, processes the queue until it’s empty, then exits. The timer fires it every 5 minutes (configurable). Total idle resource usage is near zero between runs.
Docker
Section titled “Docker”Docker v2 is now production-ready. See the Docker deployment guide for the complete setup.
| File | Purpose |
|---|---|
deploy/Dockerfile | Multi-stage daemon image with baked CLIs, tini init, and health checks |
deploy/docker-compose.yaml | Production compose setup with security hardening and resource limits |
# Quick start with docker composecp config/talond.example.yaml config/talond.yaml# Edit with your API keys and channelscp deploy/.env.example .env# Fill in your secretsdocker compose -f deploy/docker-compose.yaml up -dThe image runs as non-root (1000:1000), drops all Linux capabilities, and comes with Codex CLI and Gemini CLI pre-installed — no host CLI setup needed.
Configuration
Section titled “Configuration”All runtime config lives in talond.yaml. Point the daemon at it:
node dist/index.js --config /path/to/talond.yamlOr set TALON_CONFIG in the environment. The daemon resolves all ${ENV_VAR} references at startup from the environment and from a .env file in the working directory.
Use talonctl doctor to verify your deployment before starting:
npx talonctl doctorThis checks Node version, required directories, config validity, database connectivity, and external references.