vibe-kanban

vibe-kanban

Docker app from rorar's Repository

Overview

Vibe Kanban is an AI-first software development project management tool. It uses AI agents to help manage and track software development tasks. This container includes GitHub CLI, Docker CLI, and OpenAI Codex for a complete development environment. Always available: Codex, SVGO, imagemagick, libvips, librsvg, ripgrep, jq, tree, bat, fd, tmux, nano, python3, pip, pipx. For detailed setup instructions, see: https://vibekanban.com/docs

Vibe Kanban in Docker

Node.js Docker Compose GitHub CLI OpenAI Codex

Containerized developer environment for Vibe Kanban with GitHub CLI, Docker CLI, and OpenAI Codex baked in. Designed for WSL2 + Docker Desktop, but works on any host that can mount the Docker socket and your credentials.


✨ Highlights

  • One-command spin-up via Docker Compose with reproducible dependencies.
  • Codex-ready: @openai/codex installed globally, config persisted through ~/.codex.
  • GitHub workflow: GitHub CLI and optional token/env wiring already configured.
  • Docker-in-Docker tooling: Container includes docker + compose plugin and mounts the host socket.
  • Workspace mounts: Your repo, SSH keys, git config, and CLI auth all ride along.
  • Vibe coding tools: tmux, nano, ripgrep, jq, tree, bat, fd-find, man, tldr.
  • Image processing: imagemagick, libvips, librsvg, pngquant.
  • Python ready: python3, pip, pipx with isolated environments.
  • SVG optimization: SVGO for minifying SVG files.

🚀 Quick Start

# 1. Pick up optional env overrides
cp examples/.env.example .env  # then edit as needed
echo "LOCAL_UID=$(id -u)" >> .env
echo "LOCAL_GID=$(id -g)" >> .env

# 2. Prepare persistent volumes
mkdir -p data/vibe data/work

# 3. Build and start the stack
docker compose build
docker compose up -d

### Persisting Runtime Tool Caches

Runtime-installed tools (agents, browsers, Python packages) are downloaded at container startup. Cache mounts speed up subsequent starts and preserve downloads across rebuilds.

**Default behavior** (caches stored in `./data/`):
```bash
docker compose up -d

External caches (persists across project rebuilds):

# Add to .env file
NPM_CACHE_DIR=${HOME}/.docker-npm-cache
NPM_MODULES_DIR=${HOME}/.docker-npm-modules
PLAYWRIGHT_CACHE_DIR=${HOME}/.docker-playwright-cache
PIPX_CACHE_DIR=${HOME}/.docker-pipx-cache
CURSOR_CACHE_DIR=${HOME}/.docker-cursor-cache

docker compose up -d

What gets cached:

Cache Location Contents
NPM_CACHE_DIR /home/node/.npm Downloaded npm packages
NPM_MODULES_DIR /home/node/npm-modules Installed npm modules
PLAYWRIGHT_CACHE_DIR /home/node/.cache/ms-playwright Browser binaries
PIPX_CACHE_DIR /home/node/.local/share/pipx Python tools
CURSOR_CACHE_DIR /home/node/.cursor Cursor CLI config

4. Visit the app

open http://localhost:8085 # or use your browser


The service runs as `vibe` inside the Compose file and exposes port `8085` by default. Adjust in `docker-compose.yml` if you prefer another port.

---

## 🔧 Always Available Tools

These tools are pre-installed in the container at build time:

### Development Tools

| Tool | Command | Description |
|------|---------|-------------|
| tmux | `tmux` | Terminal multiplexer |
| nano | `nano` | Simple text editor |
| ripgrep | `rg` | Fast code search |
| jq | `jq` | JSON processor |
| tree | `tree` | Directory tree view |
| bat | `bat` | Pretty file viewing |
| fd | `fd` | Fast find alternative |
| man | `man` | Manual pages |
| tldr | `tldr` | Simplified documentation |

### Image Processing

| Tool | Command | Description |
|------|---------|-------------|
| imagemagick | `convert`, `identify`, `mogrify`, `display` | Image manipulation |
| libvips | `vips` | Fast image processing |
| librsvg | `rsvg-convert` | SVG rendering (SVG → PNG/PDF) |
| pngquant | `pngquant` | PNG color optimization |
| webp | `cwebp`, `dwebp` | WebP conversion |

### Python & Scripts

| Tool | Command | Description |
|------|---------|-------------|
| python3 | `python3` | Python interpreter |
| pip | `pip3` | Python package installer |
| pipx | `pipx` | Isolated Python environments |
| svgo | `npx svgo` | SVG optimizer/minifier |

### Available at Runtime

Install additional tools at container startup via environment variables:

- **Coding Agents**: Claude, Gemini, Copilot, Amp, Cursor, OpenCode, Droid, CCR, Qwen
- **Testing Tools**: Vitest, Jest, MSW
- **Python Tools**: httpie, black, ruff, mypy, pytest (via pipx)

---

### Local Docker overlays

Need extra packages or different dev settings without touching git-tracked files? Copy the provided templates and opt in locally:

```bash
cp examples/Dockerfile.local.example Dockerfile.local
cp examples/docker-compose.local.yml.example docker-compose.local.yml

Build the base image once (docker build -t vibe-kanban:base -f Dockerfile .), then rebuild with your overrides (docker compose -f docker-compose.yml -f docker-compose.local.yml up). Both .local files are ignored by git.


🔑 Integrations & Credentials

Coding Agents

This image includes OpenAI Codex by default. Additional coding agents can be installed at runtime via environment variables.

Supports both space-separated (claude gemini) and comma-separated (claude,gemini) values.

Available Agents

Agent Package Command Config Path
Codex @openai/codex codex ~/.codex
claude @anthropic-ai/claude-code claude ~/.claude
gemini @google/gemini-cli gemini ~/.gemini
copilot @githubnext/copilot-cli gh copilot ~/.copilot
amp amp-code amp ~/.amp
cursor @cursor/cli cursor ~/.cursor
opencode @opencode-ai/cli opencode ~/.config/opencode
droid droid-cli droid ~/.droid
clauderouter claude-code-router ccr ~/.claude-code-router
qwen @qwen-code/qwen-code qwen ~/.qwen

Docker Run

docker run -e "RUNTIME_AGENTS=claude gemini" ghcr.io/rorar/vibe-kanban-docker:latest

Docker Compose

services:
  vibe:
    image: ghcr.io/rorar/vibe-kanban-docker:latest
    environment:
      - RUNTIME_AGENTS=claude gemini

UnRAID Template

Use the template inputs for RUNTIME_AGENTS field.

Each agent requires its own authentication. After building, authenticate on the host and the credentials will be mounted into the container.

Playwright E2E Testing

Playwright is available for E2E testing. Install browsers at runtime (supports space or comma-separated values):

docker run -e "RUNTIME_PLAYWRIGHT_BROWSERS=chromium firefox" ghcr.io/rorar/vibe-kanban-docker:latest
# or
docker run -e "RUNTIME_PLAYWRIGHT_BROWSERS=chromium,firefox,webkit" ghcr.io/rorar/vibe-kanban-docker:latest

Run tests:

npx playwright test              # Run all configured browsers
npx playwright test --project=chromium  # Single browser
npx playwright show-report       # View HTML report

Unit & Integration Testing

Install testing frameworks at runtime (supports space or comma-separated values):

docker run -e "RUNTIME_TESTING_TOOLS=vitest jest msw" ghcr.io/rorar/vibe-kanban-docker:latest
# or
docker run -e "RUNTIME_TESTING_TOOLS=vitest,jest,msw" ghcr.io/rorar/vibe-kanban-docker:latest

Available tools:

  • vitest - Fast Vite-native unit testing framework
  • jest - Classic unit testing framework
  • msw - Mock Service Worker for API mocking

Run tests:

npx vitest run          # Run tests once
npx vitest              # Watch mode
npx vitest --coverage   # With coverage

Python Tools

Install Python tools at runtime via pipx (supports space or comma-separated values):

docker run -e "RUNTIME_PYTHON_TOOLS=httpie black ruff" ghcr.io/rorar/vibe-kanban-docker:latest
# or
docker run -e "RUNTIME_PYTHON_TOOLS=httpie,black,ruff,mypy" ghcr.io/rorar/vibe-kanban-docker:latest

Available tools:

  • httpie - User-friendly HTTP client
  • black - Python code formatter
  • ruff - Fast Python linter
  • mypy - Static type checker
  • pytest - Unit testing framework
  • isort - Import sorter
  • autoflake - Remove unused imports
  • pip-audit - Audit pip dependencies

Run commands:

http get https://api.example.com     # HTTPie example
black .                             # Format Python
ruff check .                        # Lint Python
mypy module_name                    # Type check

All Tools at Once

Combine multiple runtime installations:

docker run \
  -e "RUNTIME_AGENTS=claude gemini" \
  -e "RUNTIME_PLAYWRIGHT_BROWSERS=chromium firefox" \
  -e "RUNTIME_TESTING_TOOLS=vitest jest" \
  -e "RUNTIME_PYTHON_TOOLS=black ruff mypy" \
  ghcr.io/rorar/vibe-kanban-docker:latest

OpenAI Codex

  1. Authenticate on the host (once):
    npm install -g @openai/codex
    codex
    
    This creates ~/.codex/config.toml.
  2. The container mounts ~/.codex/root/.codex, so the Codex CLI and Vibe can use the same credentials.
  3. Prefer API keys? Uncomment OPENAI_API_KEY in .env and restart Compose.

GitHub CLI

  • Mounts ~/.config/gh so existing gh auth login sessions carry through.
  • Run inside the container:
    docker compose exec -e BROWSER=false vibe gh auth status
    
    to confirm, or trigger a new device flow without a browser.
  • PAT tokens work too—set GH_TOKEN or GITHUB_TOKEN in .env.

Docker CLI

  • The container includes docker-ce-cli and the compose plugin.
  • The host socket is mounted at /var/run/docker.sock, so you can run Docker commands from inside:
    docker compose exec vibe docker ps
    

🧱 Project Layout

Path Purpose
Dockerfile Node 22 LTS image with Codex, gh CLI, Docker CLI, build tools, and vibe coding utilities.
docker-compose.yml Wires up the Vibe service, volumes, and ports.
startup.sh Runtime tool installation script for agents, browsers, and Python tools.
examples/.env.example Optional environment overrides (tokens, git identity).
examples/Dockerfile.local.example Template for local-only Dockerfile overlay (copy → Dockerfile.local).
examples/docker-compose.local.yml.example Template for local Docker Compose overrides (copy → docker-compose.local.yml).
data/vibe Persisted Vibe state (config.json, db.sqlite).
data/work Workspace mounted to /work inside the container.
data/npm-cache NPM package cache (downloads).
data/npm-modules NPM installed modules (persistent installs).
data/playwright-cache Playwright browser binaries.
data/pipx-cache pipx Python tools.
data/cursor-cache Cursor CLI configuration.

Need multiple repos? Add extra mounts under volumes: in docker-compose.yml.


⚙️ Configuration Notes

  • The container runs as root. To match host file ownership add user: "${UID}:${GID}" under the vibe service.
  • Git author defaults can be overridden through .env or Compose environment entries.
  • The Vibe app binds to the port in PORT; defaults to 8085 here.
  • .dockerignore allows this Dockerfile while excluding other generated artifacts.
  • Vibe state lives in data/vibe; back it up if you rotate containers.
  • Set LOCAL_UID/LOCAL_GID in .env so container processes match host ownership (avoids git repo ownership warnings).

🧪 Health Checks

After the stack is up, verify integrations:

docker compose exec vibe codex --version
docker compose exec vibe gh auth status
docker compose exec vibe docker version

These commands confirm the Codex CLI, GitHub CLI, and Docker CLI are ready inside the container.


🛠️ Development Tips

  • Use docker compose logs -f vibe to watch the Vibe server output.
  • Restart quickly with docker compose restart vibe.
  • For a fresh Codex or GitHub login, clear the corresponding volume on the host (~/.codex, ~/.config/gh).
  • To run other local repos through the same container, mount them into /work or symlink inside the container.

❓ Troubleshooting

  • Port already in use – change the host port mapping in docker-compose.yml.
  • Codex login prompts – ensure ~/.codex isn't empty and permissions are readable.
  • GitHub CLI says unauthenticated – run gh auth login inside the container or set GH_TOKEN.
  • Docker commands fail – confirm Docker Desktop (or dockerd) is running on the host and the socket mount exists.

🔄 Auto-Update (GitHub Actions)

This repository uses GitHub Actions to automatically rebuild the Docker image when a new version of vibe-kanban is released on npm:

  • Scheduled checks: Every 6 hours
  • Manual trigger: Use "Sync with Upstream" workflow with force_rebuild: true
  • Update detection: Compares npm version with the latest git tag

Available Docker Tags

Tag Description
latest Always points to the most recent version
0.x.x Specific semver version (e.g., 0.1.44)
0.x Major.minor alias (e.g., 0.1)
0 Major version alias
sha-<hash> Git commit SHA
master Current master branch

UnRAID

Use the template with:

ghcr.io/rorar/vibe-kanban-docker:latest

The image digest changes on every update, enabling UnRAID's "Update Available" detection.

UnRAID Template

A full UnRAID template is available at: https://raw.githubusercontent.com/rorar/unraid-templates/main/templates/vibe-kanban.xml

Features:

  • Web UI on port 8085
  • Minimal path configuration (7 paths total):
    • Project Data, Cache, Worktrees, Workspace
    • SSH Keys, GitConfig, Docker Socket
  • All agent configs stored in /mnt/user/appdata/vibe-kanban/data
  • Docker-in-Docker support via socket mount
  • Configurable git author identity
  • All runtime tools pre-configured with defaults:
    • Agents: claude, gemini, copilot, amp, cursor, opencode, droid, clauderouter, qwen
    • Browsers: chromium, firefox, webkit
    • Testing: vitest, jest, msw
    • Python: httpie, black, ruff, mypy, pytest

See the unraid-templates repository for the latest version.


📚 References

Core

Coding Agents

Development Tools

Image Processing

Python

Install vibe-kanban on Unraid in a few clicks.

Find vibe-kanban in Community Apps on your Unraid server, review the template, and click Install. Unraid handles the Docker app or plugin setup from the published template.

Open the Apps tab on your Unraid server Search Community Apps for vibe-kanban Review the template variables and paths Click Install

Requirements

This container requires Docker socket mounting for Docker-in-Docker support and persistent storage for project data.

Related apps

Details

Repository
ghcr.io/rorar/vibe-kanban-docker:latest
Last Updated2026-07-17
First Seen2026-05-27

Runtime arguments

Web UI
http://[IP]:[PORT:8085]
Network
bridge
Shell
bash
Extra Params
--shm-size=1g --hostname=vibe-kanban

Template configuration

Port: Web UIPorttcp

HTTP port for the Vibe Kanban web interface.

Target
8085
Default
8085
Path: Project DataPathrw

Persistent storage for Vibe Kanban data (config, database).

Target
/home/node/.local/share/vibe-kanban
Default
/mnt/user/appdata/vibe-kanban/data
Path: CachePathrw

Cache directory for Vibe Kanban and agent tools.

Target
/home/node/.cache
Default
/mnt/user/appdata/vibe-kanban/cache
Path: WorktreesPathrw

Temporary git worktree storage.

Target
/var/tmp/vibe-kanban
Default
/mnt/user/appdata/vibe-kanban/worktrees
Path: WorkspacePathrw

Main workspace directory for your projects.

Target
/work
Default
/mnt/user/appdata/vibe-kanban/work
Path: SSH KeysPathrw

SSH keys for git operations.

Target
/home/node/.ssh
Default
/mnt/user/appdata/vibe-kanban/ssh
Path: GitConfigPathrw

Git configuration file.

Target
/home/node/.gitconfig
Default
/mnt/user/appdata/vibe-kanban/gitconfig
Path: Docker SocketPathrw

Docker socket for Docker-in-Docker support.

Target
/var/run/docker.sock
Default
/var/run/docker.sock
Variable: TZVariable

Timezone for the container. See: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List

Target
TZ
Default
UTC
--- Server Configuration ---Variable
Variable: PORTVariable

Port for Vibe Kanban to listen on (should match Container Port above).

Target
PORT
Default
8085
Variable: HOSTVariable

Host address to bind to (0.0.0.0 for all interfaces).

Target
HOST
Default
0.0.0.0
--- Git Configuration ---Variable

Git author information used for commits. Docs: https://vibekanban.com/docs

Variable: GIT_AUTHOR_NAMEVariable

Git author name for commits.

Target
GIT_AUTHOR_NAME
Default
Vibe Kanban User
Variable: GIT_AUTHOR_EMAILVariable

Git author email for commits.

Target
GIT_AUTHOR_EMAIL
Default
vibe@example.com
Variable: GIT_COMMITTER_NAMEVariable

Git committer name for commits.

Target
GIT_COMMITTER_NAME
Default
Vibe Kanban User
Variable: GIT_COMMITTER_EMAILVariable

Git committer email for commits.

Target
GIT_COMMITTER_EMAIL
Default
vibe@example.com
--- API Keys (Advanced) ---Variable

Optional API keys. For security, use secrets or environment files in production. Docs: https://vibekanban.com/docs/self-hosting/environment-variables

Variable: GH_TOKENVariable

GitHub personal access token (alternative to GitHub CLI auth).

Target
GH_TOKEN
Variable: OPENAI_API_KEYVariable

OpenAI API key for Codex and AI features.

Target
OPENAI_API_KEY
--- Runtime Tools ---Variable

Install additional tools at container startup. Always available: Codex, SVGO, imagemagick, libvips, librsvg, ripgrep, jq, tree, bat, fd, tmux, nano, python3, pip, pipx

Variable: RUNTIME_AGENTSVariable

Coding agents to install (space-separated). Options: claude, gemini, copilot, amp, cursor, opencode, droid, clauderouter, qwen

Target
RUNTIME_AGENTS
Default
claude gemini copilot amp cursor opencode droid clauderouter qwen
Variable: RUNTIME_PLAYWRIGHT_BROWSERSVariable

Playwright browsers to install (space-separated). Options: chromium, firefox, webkit

Target
RUNTIME_PLAYWRIGHT_BROWSERS
Default
chromium firefox webkit
Variable: RUNTIME_TESTING_TOOLSVariable

Testing tools to install (space-separated). Options: vitest, jest, msw

Target
RUNTIME_TESTING_TOOLS
Default
vitest jest msw
Variable: RUNTIME_PYTHON_TOOLSVariable

Python tools to install via pipx (space-separated). Options: httpie, black, ruff, mypy, pytest, isort, autoflake, pip-audit, safety

Target
RUNTIME_PYTHON_TOOLS
Default
httpie black ruff mypy pytest
--- User &amp; Permissions (Advanced) ---Variable

Advanced user and permission settings.

Variable: LOCAL_UIDVariable

UID to run the container process as (default: 99 for nobody user).

Target
LOCAL_UID
Default
99
Variable: LOCAL_GIDVariable

GID to run the container process as (default: 100 for users group).

Target
LOCAL_GID
Default
100