services: api: build: context: . dockerfile: Dockerfile.dev command: ["bun", "--watch", "packages/api/src/index.ts"] network_mode: host volumes: - .:/app - ${HOME}/.claude:/home/${HOST_USER:-dispatch}/.claude - ${HOME}/.local/share/dispatch:/home/${HOST_USER:-dispatch}/.local/share/dispatch - ${HOME}/.skills:/home/${HOST_USER:-dispatch}/.skills - ${HOME}/.config/dispatch:/home/${HOST_USER:-dispatch}/.config/dispatch # Surface LLM debug logs on the host so they're inspectable without # `docker exec`. The container path is fixed to the same default the # debug-logger uses (DISPATCH_DEBUG_LLM_DIR), so on the host you can # `tail -F /tmp/dispatch/llm-debug/*.json` while running. - /tmp/dispatch/llm-debug:/tmp/dispatch/llm-debug env_file: - .env.dispatch environment: HOST_UID: ${HOST_UID:-1000} HOST_GID: ${HOST_GID:-1000} HOST_USER: ${HOST_USER:-dispatch} DISPATCH_WORKING_DIR: /app # Debug logger — forwarded from host via bin/up. When unset, the logger # is a no-op (early-return on the !ENABLED guard in debug-logger.ts). DISPATCH_DEBUG_LLM: ${DISPATCH_DEBUG_LLM:-} DISPATCH_DEBUG_LLM_VERBOSITY: ${DISPATCH_DEBUG_LLM_VERBOSITY:-} DISPATCH_DEBUG_USAGE: ${DISPATCH_DEBUG_USAGE:-} # Where the debug logger writes its JSON files INSIDE the container. # `DEBUG=1 bin/up` sets this to /app/logging, which maps to the # gitignored `logging/` dir on the host via the `.:/app` bind mount. # Empty ⇒ the logger falls back to /tmp/dispatch/llm-debug. DISPATCH_DEBUG_LLM_DIR: ${DISPATCH_DEBUG_LLM_DIR:-} frontend: build: context: . dockerfile: Dockerfile.dev command: ["bun", "run", "--cwd", "packages/frontend", "dev", "--", "--host"] network_mode: host volumes: - .:/app depends_on: api: condition: service_started environment: HOST_UID: ${HOST_UID:-1000} HOST_GID: ${HOST_GID:-1000} HOST_USER: ${HOST_USER:-dispatch} SKIP_INSTALL: "1"