Skip to content
Closed
33 changes: 32 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,27 @@ npm i -g codedash-app
codedash run
```

## Docker

Docker files live under `docker/`. Use `./in-docker.sh` to select which host agent data sources should be mounted into the container.

```bash
./in-docker.sh --claude --codex
./in-docker.sh --cursor -- up -d
./in-docker.sh --all -- up --build
```

Supported flags:
- `--claude` mounts `~/.claude` to `/root/.claude`
- `--codex` mounts `~/.codex` to `/root/.codex`
- `--cursor` mounts `~/.cursor` to `/root/.cursor`
- `--opencode` mounts `~/.local/share/opencode/opencode.db`
- `--kiro` mounts `~/Library/Application Support/kiro-cli/data.sqlite3`
- `--all` enables every supported mount

The base container always listens on `0.0.0.0:3847`, so it can be reached via the host machine LAN IP when Docker publishes that port.
Mounted agent data sources are writable inside the container so CodeDash actions like delete, convert, and settings updates work the same way as a host run.

## Supported Agents

| Agent | Sessions | Preview | Search | Live Status | Convert | Handoff | Launch |
Expand Down Expand Up @@ -72,6 +93,16 @@ codedash restart
codedash stop
```

Bind host can be configured with `--host=ADDR` or `CODEDASH_HOST`:

```bash
codedash run
codedash run --host=0.0.0.0
CODEDASH_HOST=0.0.0.0 codedash run
```

If both are set, `--host` takes precedence.

**Keyboard Shortcuts**: `/` search, `j/k` navigate, `Enter` open, `x` star, `d` delete, `s` select, `g` group, `r` refresh, `Esc` close

## Data Sources
Expand All @@ -84,7 +115,7 @@ codedash stop
~/Library/Application Support/kiro-cli/ Kiro CLI (SQLite)
```

Zero dependencies. Everything runs on `localhost`.
Zero dependencies. By default everything runs on `localhost`. Set `--host=0.0.0.0` or `CODEDASH_HOST=0.0.0.0` to listen on all interfaces, including your host machine LAN IP.

## Install Agents

Expand Down
13 changes: 13 additions & 0 deletions docker/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
FROM node:20-alpine

RUN apk add --no-cache sqlite

WORKDIR /app

COPY package.json ./
COPY bin ./bin
COPY src ./src

EXPOSE 3847

CMD ["node", "bin/cli.js", "run", "--no-browser", "--port=3847"]
6 changes: 6 additions & 0 deletions docker/docker-compose.claude.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
services:
codedash:
volumes:
- type: bind
source: ${HOST_CLAUDE_DIR}
target: /root/.claude
6 changes: 6 additions & 0 deletions docker/docker-compose.codex.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
services:
codedash:
volumes:
- type: bind
source: ${HOST_CODEX_DIR}
target: /root/.codex
6 changes: 6 additions & 0 deletions docker/docker-compose.cursor.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
services:
codedash:
volumes:
- type: bind
source: ${HOST_CURSOR_DIR}
target: /root/.cursor
6 changes: 6 additions & 0 deletions docker/docker-compose.kiro.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
services:
codedash:
volumes:
- type: bind
source: ${HOST_KIRO_DB}
target: /root/Library/Application Support/kiro-cli/data.sqlite3
6 changes: 6 additions & 0 deletions docker/docker-compose.opencode.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
services:
codedash:
volumes:
- type: bind
source: ${HOST_OPENCODE_DB}
target: /root/.local/share/opencode/opencode.db
14 changes: 14 additions & 0 deletions docker/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
services:
codedash:
image: ghcr.io/vakovalskii/codedash
build:
context: ..
dockerfile: docker/Dockerfile
container_name: codedash
restart: unless-stopped
environment:
HOME: /root
CODEDASH_HOST: 0.0.0.0
CODEDASH_LOG: "1"
ports:
- "3847:3847"
2 changes: 1 addition & 1 deletion docs/ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

## Overview

CodeDash is a zero-dependency Node.js dashboard for AI coding agent sessions. Supports 6 agents: Claude Code, Claude Extension, Codex, Cursor, OpenCode, Kiro. Single process serves a web UI at `localhost:3847`.
CodeDash is a zero-dependency Node.js dashboard for AI coding agent sessions. Supports 6 agents: Claude Code, Claude Extension, Codex, Cursor, OpenCode, Kiro. Single process serves a web UI at `localhost:3847` by default, or another bind host via `--host=ADDR` / `CODEDASH_HOST`.

```
Browser (localhost:3847) Node.js Server
Expand Down
134 changes: 134 additions & 0 deletions in-docker.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
#!/usr/bin/env bash

set -euo pipefail

SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
DOCKER_DIR="$SCRIPT_DIR/docker"

BASE_COMPOSE="$DOCKER_DIR/docker-compose.yml"

USE_CLAUDE=0
USE_CODEX=0
USE_CURSOR=0
USE_KIRO=0
USE_OPENCODE=0

print_usage() {
cat <<'EOF'
Usage: ./in-docker.sh [options] [-- docker-compose-args...]

Options:
--claude Mount ~/.claude
--codex Mount ~/.codex
--cursor Mount ~/.cursor
--kiro Mount ~/Library/Application Support/kiro-cli/data.sqlite3
--opencode Mount ~/.local/share/opencode/opencode.db
--all Enable all supported mounts
-h, --help Show this help

Examples:
./in-docker.sh --claude --codex
./in-docker.sh --all -- up --build
./in-docker.sh --cursor -- up -d

If no docker-compose args are provided, the script runs:
docker compose ... up --build
EOF
}

require_path() {
label=$1
path_value=$2
if [ ! -e "$path_value" ]; then
printf '%s\n' "Missing $label path: $path_value" >&2
exit 1
fi
}

while [ $# -gt 0 ]; do
case "$1" in
--claude)
USE_CLAUDE=1
shift
;;
--codex)
USE_CODEX=1
shift
;;
--cursor)
USE_CURSOR=1
shift
;;
--kiro)
USE_KIRO=1
shift
;;
--opencode)
USE_OPENCODE=1
shift
;;
--all)
USE_CLAUDE=1
USE_CODEX=1
USE_CURSOR=1
USE_KIRO=1
USE_OPENCODE=1
shift
;;
-h|--help)
print_usage
exit 0
;;
--)
shift
break
;;
*)
break
;;
esac
done

compose_files=(-f "$BASE_COMPOSE")
compose_args=("$@")

if [ "${#compose_args[@]}" -eq 0 ]; then
compose_args=(up --build)
fi

if [ "$USE_CLAUDE" -eq 1 ]; then
HOST_CLAUDE_DIR="${HOST_CLAUDE_DIR:-$HOME/.claude}"
require_path "Claude" "$HOST_CLAUDE_DIR"
export HOST_CLAUDE_DIR
compose_files+=(-f "$DOCKER_DIR/docker-compose.claude.yml")
fi

if [ "$USE_CODEX" -eq 1 ]; then
HOST_CODEX_DIR="${HOST_CODEX_DIR:-$HOME/.codex}"
require_path "Codex" "$HOST_CODEX_DIR"
export HOST_CODEX_DIR
compose_files+=(-f "$DOCKER_DIR/docker-compose.codex.yml")
fi

if [ "$USE_CURSOR" -eq 1 ]; then
HOST_CURSOR_DIR="${HOST_CURSOR_DIR:-$HOME/.cursor}"
require_path "Cursor" "$HOST_CURSOR_DIR"
export HOST_CURSOR_DIR
compose_files+=(-f "$DOCKER_DIR/docker-compose.cursor.yml")
fi

if [ "$USE_KIRO" -eq 1 ]; then
HOST_KIRO_DB="${HOST_KIRO_DB:-$HOME/Library/Application Support/kiro-cli/data.sqlite3}"
require_path "Kiro" "$HOST_KIRO_DB"
export HOST_KIRO_DB
compose_files+=(-f "$DOCKER_DIR/docker-compose.kiro.yml")
fi

if [ "$USE_OPENCODE" -eq 1 ]; then
HOST_OPENCODE_DB="${HOST_OPENCODE_DB:-$HOME/.local/share/opencode/opencode.db}"
require_path "OpenCode" "$HOST_OPENCODE_DB"
export HOST_OPENCODE_DB
compose_files+=(-f "$DOCKER_DIR/docker-compose.opencode.yml")
fi

exec docker compose "${compose_files[@]}" "${compose_args[@]}"
Loading
Loading