Marcus Configuration Reference#
π See Also:
Local Development β first-time setup and directory structure
Development Workflow β daily development workflows
This is the comprehensive reference for all Marcus configuration options. For setup guides and workflows, see the linked documents above.
Marcus runs locally via
./marcus start. Docker is required only if you choose Planka as your kanban provider β it runs Planka + Postgres as infrastructure. Marcus itself does not run inside Docker in the current default workflow.
Quick Start#
Basic Configuration#
# 1. Copy the example config and edit it
cp config_marcus.example.json config_marcus.json
# 2. Set your LLM API key in .env
cp .env.example .env
echo "CLAUDE_API_KEY=sk-ant-..." >> .env
# 3. Start Marcus (SQLite kanban β zero external dependencies)
./marcus start
To use a non-default config file:
MARCUS_CONFIG=config_marcus.json.planka ./marcus start
To switch transports or ports:
./marcus start --port 5000 # custom HTTP port
./marcus start --stdio # stdio transport
./marcus start --multi # multi-endpoint mode
All Environment Variables#
Core Configuration#
Variable |
Description |
Default |
|---|---|---|
|
Path to configuration JSON file |
|
|
HTTP server port |
|
|
Enable debug logging |
|
|
Transport type ( |
|
|
Task decomposition strategy ( |
|
Kanban Integration#
Variable |
Description |
Default |
|---|---|---|
|
Provider: |
|
Marcus uses SQLite by default. No environment variable is required for the default setup. The
KANBAN_PROVIDER(without prefix) is also accepted as a legacy fallback.
SQLite Provider (default)#
Field (config_marcus.json) |
Description |
Default |
|---|---|---|
|
Path to SQLite database |
|
|
Path for task attachments |
|
SQLite has no environment variables β itβs configured via
config_marcus.jsononly. Marcus creates the file on first project creation.
Planka Provider#
Variable |
Description |
Required |
|---|---|---|
|
Planka server URL |
Yes |
|
Planka login email |
Yes |
|
Planka password |
Yes |
|
Project UUID |
Optional (auto-discovered if omitted) |
|
Board UUID |
Optional (auto-discovered if omitted) |
GitHub Provider (alpha β provider exists, end-to-end testing pending)#
Variable |
Description |
Required |
|---|---|---|
|
GitHub personal access token |
Yes |
|
GitHub username/org |
Yes |
|
Repository name |
Yes |
Linear Provider (alpha β provider exists, end-to-end testing pending)#
Variable |
Description |
Required |
|---|---|---|
|
Linear API key |
Yes |
|
Linear team ID |
Yes |
AI Configuration#
Variable |
Description |
Default |
|---|---|---|
|
Enable/disable AI features |
|
|
Provider: |
|
|
Model name |
|
Anthropic (Claude)#
Variable |
Description |
Required |
|---|---|---|
|
Anthropic API key (canonical) |
Yes if using Claude |
|
Alternative key name. Marcus prefers this so it doesnβt collide with Claude Codeβs subscription auth ( |
Fallback |
OpenAI#
Variable |
Description |
Required |
|---|---|---|
|
OpenAI API key |
Yes if using GPT |
Local LLM (Ollama)#
Variable |
Description |
Required |
|---|---|---|
|
Model name (e.g., |
Yes if using local |
|
Ollama server URL (e.g., |
Optional |
|
API key for the local server β maps to |
Optional |
Communication#
Variable |
Description |
Default |
|---|---|---|
|
Enable Slack notifications |
|
|
Slack webhook URL |
β |
|
Enable email notifications |
|
Monitoring#
Variable |
Description |
Default |
|---|---|---|
|
Monitoring interval (seconds) |
|
Configuration Priority#
Marcus loads configuration in this order (later overrides earlier):
Default values (built into code)
Config file (path resolved by
MARCUS_CONFIGenv var, then current dir, then project root, then~/.marcus/)Environment variables (highest priority)
Example:
# Config file has: "ai.model": "claude-haiku-4-5-20251001"
# Environment variable overrides it:
MARCUS_AI_MODEL=claude-sonnet-4-6 ./marcus start
# Result: Uses claude-sonnet-4-6
Configuration File Format#
The actual schema uses flat keys with prefixes under each section (matches config_marcus.example.json):
{
"kanban": {
"provider": "sqlite",
"sqlite_db_path": "./data/kanban.db",
"sqlite_attachments_dir": "./data/attachments",
"planka_base_url": "http://localhost:3333",
"planka_email": "demo@demo.demo",
"planka_password": "demo", // pragma: allowlist secret
"github_token": "${GITHUB_TOKEN}",
"github_owner": "${GITHUB_OWNER}",
"github_repo": "${GITHUB_REPO}",
"linear_api_key": "${LINEAR_API_KEY}",
"linear_team_id": "${LINEAR_TEAM_ID}"
},
"ai": {
"provider": "anthropic",
"anthropic_api_key": "${CLAUDE_API_KEY}",
"openai_api_key": "${OPENAI_API_KEY}",
"local_model": "qwen2.5-coder:7b",
"local_url": "http://localhost:11434/v1",
"local_key": "none",
"model": "claude-haiku-4-5-20251001",
"temperature": 0.1,
"max_tokens": 4096,
"enabled": true
},
"features": {
"events": true,
"context": true,
"memory": false,
"visibility": false
},
"monitoring": {
"interval": 900,
"stall_threshold_hours": 24
},
"communication": {
"slack_enabled": false,
"email_enabled": false
}
}
Provider-specific keys live alongside
provider(flat), not nested.${VAR}references are interpolated from the environment at load time.
Common Configuration Patterns#
Switching between providers#
# Default β SQLite, zero setup
./marcus start
# Use Planka instead (requires Docker for Planka + Postgres)
MARCUS_KANBAN_PROVIDER=planka ./marcus start
Or maintain multiple config files:
MARCUS_CONFIG=config_marcus.json.planka ./marcus start
MARCUS_CONFIG=config_marcus.json.github ./marcus start
Using different AI models#
# Higher-tier Claude
MARCUS_AI_MODEL=claude-sonnet-4-6 ./marcus start
MARCUS_AI_MODEL=claude-opus-4-7 ./marcus start
# Free local Ollama model
MARCUS_LLM_PROVIDER=local \
MARCUS_LOCAL_LLM_PATH=qwen2.5-coder:7b \
./marcus start
Multiple Marcus Instances (parallel experiments)#
As of v0.4.0-dev (parallel experiment platform), multiple Marcus instances can run side by side, each with its own SQLite kanban DB:
# Instance 1 on port 4298 (default), DB ./data/kanban-A.db
MARCUS_CONFIG=config_a.json ./marcus start
# Instance 2 on port 5000, DB ./data/kanban-B.db
MARCUS_CONFIG=config_b.json ./marcus start --port 5000
Each agent connects via the MARCUS_URL environment variable (http://localhost:4298/mcp or http://localhost:5000/mcp). Posidonius automates this for batch experiments.
Selecting the decomposer#
# Default: contract_first (works on tightly-coupled and loosely-coupled projects)
./marcus start
# Legacy feature-based decomposition
MARCUS_DECOMPOSER=feature_based ./marcus start
# Per-call override (passed to create_project as options["decomposer"])
See Contract-First Decomposition for the trade-offs.
Configuration Best Practices#
Use environment variables for secrets (API keys, tokens). Reference them in
config_marcus.jsonvia${VAR_NAME}.Use config files for structure (board IDs, model names, feature flags).
Create a
.envfile for persistent local settings β Marcus reads it automatically.Keep multiple config files per environment (
config_marcus.json.dev,config_marcus.json.prod).Never commit API keys to version control.
.envis gitignored by default.
See Also#
Local Development β setup and troubleshooting
Development Workflow β daily workflows
Quickstart β five-minute setup