Dashcam
Deployment

Docker

Run Dashcam in a container.

Docker Deployment

Run Dashcam in a Docker container with your Claude Code data and captures mounted as volumes. This isolates the daemon from your host system while still providing full access to session data.

Quick Start

Terminal
docker run -d \
  --name dashcam \
  -v ~/.claude:/root/.claude:ro \
  -v ~/.dashcam:/root/.dashcam \
  -p 57580:57580 \
  dashcam-dev/dashcam

Open http://localhost:57580 in your browser.

Volume mounts explained:

MountPurposeMode
~/.claude:/root/.claudeClaude Code config and JSONL session filesRead-only
~/.dashcam:/root/.dashcamDashcam database, captures, and configRead-write

The ~/.claude mount is read-only because Dashcam only reads JSONL files and settings — it never writes to your Claude Code directory. The ~/.dashcam mount is read-write because the daemon writes to the SQLite database and captures directory.

Docker Compose

For a more maintainable setup, use Docker Compose:

docker-compose.yml
services:
  dashcam:
    image: dashcam-dev/dashcam
    container_name: dashcam
    restart: unless-stopped
    ports:
      - "57580:57580"
    volumes:
      - ~/.claude:/root/.claude:ro
      - dashcam-data:/root/.dashcam
    environment:
      - DASHCAM_PORT=57580
      - DASHCAM_HOST=0.0.0.0

volumes:
  dashcam-data:
Terminal
docker compose up -d

Using a named volume (dashcam-data) instead of a bind mount for ~/.dashcam lets Docker manage the data directory. This is cleaner on systems where you do not need direct host access to the SQLite database.

Environment Variables

Configure the daemon via environment variables instead of (or in addition to) the config file:

VariableDescriptionDefault
DASHCAM_PORTHTTP and WebSocket port57580
DASHCAM_HOSTBind address0.0.0.0
DASHCAM_DBDatabase path/root/.dashcam/dashcam.db
DASHCAM_CAPTURES_DIRCaptures directory/root/.dashcam/captures
DASHCAM_LOKIEnable Loki Mode bridge (true/false)false
DASHCAM_SQUADEnable Claude Squad bridge (true/false)false
Example with environment variables
docker run -d \
  --name dashcam \
  -e DASHCAM_PORT=8080 \
  -e DASHCAM_LOKI=true \
  -v ~/.claude:/root/.claude:ro \
  -v ~/.dashcam:/root/.dashcam \
  -p 8080:8080 \
  dashcam-dev/dashcam

Connecting Hooks from the Host

When running Dashcam in Docker, the daemon listens inside the container. If Claude Code runs on the host machine, its hooks need to reach the containerized daemon. Since port 57580 is forwarded to the host, the default hook commands (curl -sf -X POST http://localhost:57580/hook/...) work without modification.

If you change the port mapping (e.g., -p 8080:57580), update your Claude Code hooks to POST to the host-side port (http://localhost:8080/hook/...) by running dashcam init --port 8080.

Playwright for Screenshots

The Docker image includes a headless Chromium installation for Playwright-based screenshot capture. If your dev server runs on the host, Dashcam inside the container needs to reach it. Use Docker's host networking or explicit host address:

With host networking
docker run -d \
  --name dashcam \
  --network host \
  -v ~/.claude:/root/.claude:ro \
  -v ~/.dashcam:/root/.dashcam \
  dashcam-dev/dashcam

With --network host, the container shares the host's network stack. The daemon can reach localhost:3000 (your dev server) directly, and no port mapping is needed.

Alternatively, configure a custom capture URL pointing to the host:

~/.dashcam/config.json
{
  "capture": {
    "customUrl": "http://host.docker.internal:3000"
  }
}

On this page