Local development setup
Last Updated: 2026-05-23 Status: Alpha This is the end-to-end walkthrough for getting Poindexter running on your own machine. If you only want “one command to a working pipeline,” runpoindexter setup --auto — read
Quick Start in the README first.
This document covers the longer form: what the setup wizard does
under the hood, how to verify each layer, and how to troubleshoot
when something doesn’t come up.
Minimum hardware
RAM: 32 GB minimum, 64 GB recommended (the full stack including Langfuse, ClickHouse, and Grafana
uses 8–12 GB resident at idle).
Disk: 100 GB free for model weights, Docker images, and generated media.
1. Prerequisites
Windows note. Run all commands from Git Bash or WSL. Native
cmd.exe and PowerShell do not work with the start scripts.
Docker Desktop must be configured to use WSL2 backend.
Linux note. Stock Docker Engine on Linux does not automatically
resolve host.docker.internal — this is a Docker Desktop feature.
The compose files add extra_hosts: ["host.docker.internal:host-gateway"]
to every service that calls a host-side endpoint (Ollama, image-gen, voice
bridge). host-gateway is a Docker built-in alias that resolves to the
host’s IP and is supported on Docker Engine 20.10+. No manual
configuration is needed; the extra_hosts entries are already present in
both docker-compose.yml and docker-compose.local.yml.
GPU note. You can run Poindexter on CPU, but content generation
that takes 30 seconds on an RTX 4090 can take 10+ minutes on CPU.
Not practical for daily use.
2. Clone and setup
- Prompts for a database URL (or auto-provisions a local Docker
Postgres with
--auto). - Tests the database connection and reports success/failure.
- Runs migrations against the target database. Safe to re-run — migrations are idempotent.
- Generates secrets — creates random
local_postgres_password,grafana_password, andpgadmin_password. - Writes
~/.poindexter/bootstrap.tomlwith the database URL + generated secrets. This is the only config file on disk. - Provisions the initial CLI OAuth client — registers a row in
oauth_clients, encrypts the credentials intoapp_settings.cli_oauth_client_id/cli_oauth_client_secret, and prints the plaintext secret once for capture. (Worker auth uses OAuth 2.1 only as of Glad-Labs/poindexter#249.)
.env file is created. All secrets live in bootstrap.toml
(safe permissions, never committed to git).
3. Pull AI models
4. Bring up the full stack
~/.poindexter/bootstrap.toml, exports the values as env
vars, and runs docker compose -f docker-compose.local.yml up -d.
No .env file needed.
This starts the core containers (cross-referenced against the CLAUDE.md Quick-Links table for ports + purposes):
Stop optional containers if you don’t need them:
5. Verify
pending → in_progress → awaiting_approval
within a few minutes. Follow along via:
6. Frontend (optional for backend dev)
If you’re only iterating on the backend, skip the frontend — the worker’s API and the Grafana dashboards are all you need. If you do want the Next.js public site running locally:7. Run the tests
The unit suite runs lean — the cross-encoder reranker (Expected: the full unit suite passes (several thousand cases). Some tests that depend on thesentence-transformers
torch) is an opt-inrerankextra that CI deliberately skips, and the tests that touch itimportorskip. Addpoetry install --extras rerankonly if you want to exercise the reranker locally.
brain module or sentry-sdk are skipped when running
inside Docker (these pass on the host where all modules are available).
8. What to do when something breaks
See troubleshooting.md.Configuration
All runtime configuration lives in theapp_settings Postgres
table, not env vars. After setup, change settings with: