Installation
Talon runs as a native Node.js daemon. The current first-run checks also expect Docker to be installed and the daemon to be running.
Recommended: Starter Stack (Docker)
Section titled “Recommended: Starter Stack (Docker)”The fastest way to a running agent is the Talon + Postgram Starter Stack — a self-contained Docker Compose bundle with persistent memory pre-wired. No build step, no Node install.
# 1. Download and extractcurl -fsSL https://github.com/ivo-toby/talon/releases/latest/download/talon-postgram-stack.tar.gz | tar xzcd talon-postgram-stack
# 2. Configure secretscp .env.example .env# Edit .env: POSTGRES_PASSWORD, OPENAI_API_KEY, ANTHROPIC_API_KEY, TELEGRAM_BOT_TOKEN
cp config/talond.example.yaml config/talond.yaml# Edit config/talond.yaml: set allowedChatIds for Telegram
# 3. Start everything./bootstrap.shThe bootstrap.sh script handles ordering, mints a Postgram API key, and wires Talon to the knowledge store. See the Starter Stack guide for full details.
Alternative: Build from source
Section titled “Alternative: Build from source”If you prefer to run Talon natively or want to develop on it, follow the steps below.
Prerequisites
Section titled “Prerequisites”- Node.js 24+ — Talon uses
process.loadEnvFile, which requires Node 24 - Docker —
talonctl setupandtalonctl doctorcheck Docker availability - Claude Code — the default agent provider. Install and authenticate it:
npm install -g @anthropic-ai/claude-code - SQLite — ships with
better-sqlite3, no separate install needed - Git — to clone the repo
Check your Node version:
node --version # must be v24.0.0 or higherClone and build
Section titled “Clone and build”git clone https://github.com/ivo-toby/talon.gitcd talonnpm installnpm run buildThe build step compiles TypeScript to dist/ and copies SQL migrations. Both dist/index.js (daemon) and dist/cli/index.js (talonctl) are produced.
Verify the build
Section titled “Verify the build”node dist/cli/index.js --versionYou should see the talonctl version string. If you get a module error, confirm Node 24 is active.
Guided setup with Claude Code (recommended)
Section titled “Guided setup with Claude Code (recommended)”The fastest way to go from a fresh clone to a running daemon is the talon.setup skill — an interactive wizard built into Claude Code that walks you through the entire setup conversationally.
Prerequisites: Claude Code installed and authenticated (npm install -g @anthropic-ai/claude-code, then claude auth login).
Open the Talon repository in Claude Code and run:
/talon.setupThe skill detects what is already configured and picks up from where you are. On a fresh clone it walks through:
- Prerequisites — Node version, dependencies, build, AI provider binaries
- Bootstrap — data directories,
talond.yaml, database migrations - Provider configuration — Claude Code, Gemini CLI, or both; default provider per context
- Channel configuration — Telegram, Slack, Discord, WhatsApp, email, or terminal
- Persona configuration — name, purpose, tone, system prompt authoring, channel bindings
- Capability configuration — review and adjust per-persona capability grants
- Scheduled tasks — memory grooming, morning briefings, weekly reviews, custom crons
- Validation —
talonctl doctor,talonctl env-check,talonctl test-provider - Systemd service — optional Linux service installation
The skill asks one question at a time, runs talonctl commands on your behalf, and shows you the output at every step. It never writes secrets — only ${ENV_VAR} placeholders.
If setup is already partially complete, /talon.setup presents a menu to add channels, personas, skills, schedules, or providers without repeating what is already done.
Initial setup (manual)
Section titled “Initial setup (manual)”If you prefer to configure everything by hand, run the bootstrap command first. It checks your environment, creates the data/ directory structure, generates a starter talond.yaml, runs migrations, and validates the result:
npx talonctl setupThe setup command runs these steps:
- OS detection
- Node version check
- Docker availability check
- Data directory creation
- Config generation
- Database migrations
- Config validation
After setup, run talonctl doctor to validate everything:
npx talonctl doctor --config talond.yamltalonctl doctor checks Node.js, Docker, config validity, database access, and data directories. Fix any failures before starting the daemon.
Apply database migrations
Section titled “Apply database migrations”npx talonctl migrate --config talond.yamlThis creates the SQLite database at data/talond.sqlite and applies all schema migrations.
Start the daemon
Section titled “Start the daemon”node dist/index.js --config talond.yamlOr via npm:
npm run talondThe daemon logs to stdout in structured JSON. Set logLevel: info in your config for normal operation; use debug when debugging connector issues.
Systemd service (Linux servers)
Section titled “Systemd service (Linux servers)”For production, run Talon as a systemd service:
sudo ./deploy/install-service.shThe install script detects your username, home directory, and Node path, then generates /etc/systemd/system/talond.service. It reads environment variables from .env in the project root.
# Start and enable on bootsudo systemctl enable --now talond
# Follow logsjournalctl -u talond -f
# Reload config without restartingnpx talonctl reloadThe service unit includes security hardening: NoNewPrivileges, PrivateTmp, ProtectKernelTunables, and SystemCallFilter=@system-service.
Custom install options
Section titled “Custom install options”sudo ./deploy/install-service.sh --user talon --dir /home/talon/talonWake-only mode (timer)
Section titled “Wake-only mode (timer)”For low-traffic deployments, use the systemd timer to wake the daemon periodically instead of running it continuously:
sudo cp deploy/talond-wake.service /etc/systemd/system/sudo cp deploy/talond.timer /etc/systemd/system/sudo systemctl daemon-reloadsudo systemctl enable --now talond.timerDefault wake interval is 5 minutes. Adjust OnUnitActiveSec in deploy/talond.timer to change it.
Secrets and environment variables
Section titled “Secrets and environment variables”Never hardcode credentials in talond.yaml. Use ${ENV_VAR} placeholders and load them from .env:
TELEGRAM_BOT_TOKEN=your-token-hereSLACK_BOT_TOKEN=xoxb-...SLACK_APP_TOKEN=xapp-...Talon loads .env automatically at startup via process.loadEnvFile. Check for missing variables any time with:
npx talonctl env-check --config talond.yaml