📖 See Also:
- Configuration Reference — all configuration options
- Development Workflow — daily development workflows
- Quickstart — five-minute install
This guide covers first-time setup for developing Marcus itself locally. If you just want to use Marcus to run agents on a project, follow the Quickstart instead.
Marcus runs locally in all paths. The difference is which kanban backend you use during development.
| Path | When to choose | External dependencies |
|---|---|---|
| A: SQLite (default) | Default. Recommended for nearly all development. | None. |
| B: Planka | When you specifically need to test the drag-and-drop kanban UI or the Planka integration. | Docker (Planka + Postgres + kanban-mcp). |
Path A is what you want unless you're touching the Planka integration code or kanban-mcp itself.
cd ~/projects # or wherever you keep code
git clone https://github.com/lwgray/marcus.git
cd marcuspip install -e .
pip install -r requirements-dev.txtRequires Python 3.11+.
cp .env.example .env
cp config_marcus.example.json config_marcus.json
echo "CLAUDE_API_KEY=sk-ant-..." >> .envconfig_marcus.example.json already defaults to SQLite — no kanban edits needed.
./marcus start
./marcus status
./marcus logs --tail 50Marcus runs at http://localhost:4298/mcp. SQLite database is created automatically at ./data/kanban.db on first project creation.
# Edit Marcus code
./marcus stop
./marcus startThat's the whole loop. Tests:
pytest tests/unit -m unitInspect the board from the terminal:
sqlite3 data/kanban.db "SELECT name, status, assigned_to FROM tasks"Use this path when you're working on the Planka integration itself, the kanban-mcp client, or you want a visual UI during development.
Docker is infrastructure only — runs Planka + Postgres + kanban-mcp. Marcus itself still runs locally via
./marcus start.
cd ~/projects
git clone https://github.com/lwgray/marcus.git
git clone https://github.com/lwgray/kanban-mcp.git
# Structure:
# ~/projects/
# ├── marcus/
# └── kanban-mcp/Marcus auto-detects kanban-mcp as a sibling. If you can't use sibling directories, set KANBAN_MCP_PATH:
export KANBAN_MCP_PATH="/custom/path/to/kanban-mcp/dist/index.js"cd ~/projects/kanban-mcp
npm install
npm run buildThis builds kanban-mcp only. Postgres and Planka run via Docker.
cd ~/projects/marcus
pip install -e .
pip install -r requirements-dev.txt
cp .env.example .env
cp config_marcus.example.json config_marcus.json
echo "CLAUDE_API_KEY=sk-ant-..." >> .envEdit config_marcus.json:
{
"kanban": {
"provider": "planka",
"planka_base_url": "http://localhost:3333",
"planka_email": "demo@demo.demo",
"planka_password": "demo" // pragma: allowlist secret
}
}cd ~/projects/marcus
docker compose up -d postgres planka
# Wait ~10–15 seconds, then open http://localhost:3333
# Login: demo@demo.demo / demo
# Create at least one list (Backlog / In Progress / Done) before creating projects./marcus start
./marcus statuscd ~/projects/kanban-mcp
# Edit operations/projects.ts (or wherever)
npm run build
cd ~/projects/marcus
./marcus stop && ./marcus start./marcus stop
docker compose down # stops Planka + Postgres
docker compose down -v # also wipes Planka dataMarcus detects environment + kanban-mcp path automatically. Useful when something breaks.
Marcus checks if it's running inside Docker by inspecting:
/.dockerenvfile presence/proc/1/cgroupfordockerorcontainerd- Hostname pattern (12-char hex string)
Priority order:
KANBAN_MCP_PATHenvironment variable (supports~expansion)- Docker-internal path:
/app/kanban-mcp/dist/index.js - Sibling directory:
../kanban-mcp/dist/index.jsrelative to Marcus root
The same config_marcus.json works inside Docker and locally:
| Config value | Inside Docker | Running locally |
|---|---|---|
http://planka:1337 |
http://planka:1337 |
http://localhost:3333 |
http://planka |
unchanged | http://localhost:3333 |
http://localhost:3333 |
unchanged | unchanged |
| Custom IP/domain | unchanged | unchanged |
./marcus status # is Marcus already running?
./marcus stop
./marcus start --port 5000 # use a different portpip install -e .
pip install -r requirements-dev.txt
python --version # must be 3.11+Confirm the directory exists and is writable:
ls -la ./data
mkdir -p ./data && chmod u+w ./datals ~/projects/ # marcus/ and kanban-mcp/ both present?
ls ~/projects/kanban-mcp/dist/index.js # built?
cd ~/projects/kanban-mcp && npm run build # if not, build
# Or set explicit path:
export KANBAN_MCP_PATH="/custom/path/kanban-mcp/dist/index.js"Open http://localhost:3333 and create at least one list (Backlog / In Progress / Done) before creating projects.
See Configuration Reference for the full schema.
# Use these
./marcus start
./marcus stop
./marcus status
./marcus logs --tail 50
# Avoid
python -m src.marcus_mcp.server
kill -9 $(ps aux | grep marcus)Faster restarts, no Docker overhead, no external dependencies. Switch to Planka only when testing kanban-mcp or Planka integration.
Stable, persistent data, easy to reset (docker compose down -v). Don't try to install Planka natively.
pytest -m unit # fast unit tests (always run these)
pytest tests/integration # if your change touches integration paths~/projects/
├── marcus/
└── kanban-mcp/
No environment variable needed.
# Edit src/integrations/kanban_factory.py (or wherever)
./marcus stop && ./marcus start
pytest tests/unit -m unit -k kanban_factory
git commit -am "fix: short reason"cd ~/projects/marcus
docker compose up -d postgres planka
# Edit code that uses the Planka client
./marcus stop && ./marcus start
# Verify against Planka UI at http://localhost:3333cd ~/projects/kanban-mcp
# Edit operations/*.ts
npm run build
cd ~/projects/marcus
./marcus stop && ./marcus start
# Test, commit both repos# SQLite (default, recommended)
git clone https://github.com/lwgray/marcus.git
cd marcus && pip install -e . && pip install -r requirements-dev.txt
cp .env.example .env && cp config_marcus.example.json config_marcus.json
echo "CLAUDE_API_KEY=sk-ant-..." >> .env
./marcus start
# Planka (only if you need the UI or are touching kanban-mcp)
# (clone kanban-mcp as a sibling, npm run build,
# docker compose up -d postgres planka,
# edit config_marcus.json to provider=planka,
# ./marcus start)Key commands:
./marcus start— start Marcus./marcus stop— stop Marcus./marcus status— is it running?./marcus logs --tail 50— recent logs./marcus board— terminal view of the kanban boardpytest -m unit— unit tests