Skip to content

Configuration

Abbado is configured through environment variables. There is no configuration file.

VariableDefaultDescription
IA_IDE_DATA_DIR./dataDirectory for SQLite database, worktrees, and run state
IA_IDE_BIND127.0.0.1:3000Address and port the server binds to
IA_IDE_FRONTEND_DIR./frontend/distPath to the built frontend (production mode only)
RUST_LOGabbado=debugLog level using the tracing crate filter syntax

Run on a different port:

Terminal window
IA_IDE_BIND=0.0.0.0:8080 cargo run

Custom data directory:

Terminal window
IA_IDE_DATA_DIR=/opt/abbado/data cargo run

Verbose logging:

Terminal window
RUST_LOG=abbado=trace cargo run

Quiet logging (errors only):

Terminal window
RUST_LOG=abbado=error cargo run

The data directory (IA_IDE_DATA_DIR) contains all persistent state:

$IA_IDE_DATA_DIR/
├── abbado.db # SQLite database
└── runs/
└── <run-uuid>/
├── worktree/
│ └── <repo-name>/ # Git worktree
├── cli-state/ # CLI session state (for resume)
├── hook.sh # Hook script for this run
└── claude-hooks.json # Hook configuration

The data directory is created automatically on first run. It is gitignored in the Abbado repository.

Abbado uses a single SQLite database (abbado.db) for all persistent data:

  • projects — project records
  • project_repos — repos linked to projects
  • agents — agent configurations
  • runs — run metadata and status
  • events — immutable event log
  • settings — key-value configuration store

Migrations run automatically on startup. The database is created if it doesn’t exist.

Each run gets its own directory under $IA_IDE_DATA_DIR/runs/<run-uuid>/. This includes:

  • worktree/ — git worktrees for each repo (where the agent works)
  • cli-state/ — CLI session state for pause/resume
  • hook.sh — the hook script that posts events to Abbado
  • claude-hooks.json — hook configuration passed to the CLI via --settings

Deleting a run via the API cleans up all of these.

Runtime configuration is stored in the SQLite settings table as key-value pairs. These are managed through the API:

GET /api/settings/models
PUT /api/settings/models

Controls which providers and models appear in the agent creation form.

Schema:

{
"providers": [
{
"id": "claude-code",
"name": "Claude",
"models": [
{
"id": "claude-sonnet-4-6",
"name": "Sonnet 4.6",
"description": "Fast, balanced"
}
]
}
]
}

Defaults:

ProviderModels
Claude (claude-code)Sonnet 4.6, Opus 4.6, Haiku 4.5
ChatGPT (codex)o3, o4-mini, GPT-4.1
GET /api/settings/notifications
PUT /api/settings/notifications

Schema:

{
"discord_webhook_url": "https://discord.com/api/webhooks/...",
"notify_on_pipeline_complete": true,
"notify_on_run_failed": true
}
FieldTypeDefaultDescription
discord_webhook_urlstring""Discord webhook URL. Empty disables notifications.
notify_on_pipeline_completebooltrueNotify when sessions complete or go idle
notify_on_run_failedbooltrueNotify when runs fail

The frontend dev server (Vite) proxies API requests to http://localhost:3000. This is configured in the Vite config and requires no manual setup.

For production, build the frontend with npm run build and set IA_IDE_FRONTEND_DIR to point to the dist directory. The Rust server serves the static files directly.

Terminal window
cd frontend && npm run build
IA_IDE_FRONTEND_DIR=./frontend/dist cargo run --release

Abbado binds to 127.0.0.1:3000 by default — localhost only. To expose it on the network:

Terminal window
IA_IDE_BIND=0.0.0.0:3000 cargo run

The server uses:

  • HTTP for REST API and SSE
  • WebSocket for terminal connections (upgrades from HTTP)
  • No TLS — use a reverse proxy (nginx, Caddy) if you need HTTPS