Compose Quickstart (Recommended)
- Host port:
3100 - Data directory:
./data/docker-paperclip
PAPERCLIP_DATA_DIR is resolved relative to the compose file (docker/), so ../data/pc maps to data/pc in the project root.
Manual Docker Build
Data Persistence
All data is persisted under the bind mount (./data/docker-paperclip):
- Embedded PostgreSQL data
- Uploaded assets
- Local secrets key
- Agent workspace data
Local Adapter CLIs in Docker
The Docker image pre-installs these agent CLIs so their*_local adapters can run inside the container:
claude(Anthropic Claude Code CLI) —claude_localcodex(OpenAI Codex CLI) —codex_localopencode(OpenCode multi-provider CLI) —opencode_localgemini(Google Gemini CLI) —gemini_local(experimental)
ANTHROPIC_API_KEY (Claude), OPENAI_API_KEY (Codex), and GEMINI_API_KEY or GOOGLE_API_KEY (Gemini). OpenCode is multi-provider and uses whichever provider key you supply.
Gemini key restrictions: Google requires Gemini API keys to be restricted to the Gemini API (scoped in the Google Cloud console); unrestricted keys are blocked andThe image setsgemini_localruns will fail with an auth error. Create a restricted key, or authenticate withgemini auth login(OAuth) and persist~/.geminivia the data volume so the credential survives container restarts.
GEMINI_SANDBOX=false so the Gemini CLI does not try to launch its own (Docker-in-Docker) sandbox inside the container. The gemini_local adapter already passes --sandbox=none per run, so this env var only matters if you invoke gemini manually inside the container; override it if you have nested-container support and want CLI-level sandboxing.
Without API keys, the app runs normally — adapter environment checks will surface missing prerequisites.