Self-Hosting
Tandemu is fully self-hostable via Docker Compose. The open-source version has complete feature parity with the cloud offering — there are no gated features, no usage limits, and no license restrictions.
Why self-host?
Self-hosting Tandemu gives you full control over your data and infrastructure. All telemetry, developer metrics, AI memory, and team configuration stay on machines you own. This matters for organizations with strict compliance requirements, air-gapped environments, or teams that simply prefer data sovereignty.
The self-hosted stack runs nine services: a NestJS backend API, a Next.js dashboard frontend, PostgreSQL for application data, ClickHouse for high-throughput telemetry analytics, Redis for caching and sessions, an OpenTelemetry Collector for ingesting developer telemetry, a Mem0-powered MCP memory server for persistent AI context, a Qdrant vector store for memory search, and Watchtower for automatic container updates.
Updates are automatic — when a new GitHub Release is published, Watchtower pulls the latest container images and restarts the affected services. You can also trigger updates from the dashboard with one click.
What you need
- Docker and Docker Compose — The entire stack runs as a single
docker-compose.ymlfile - 4GB RAM minimum for small teams (1-5 developers), 8GB recommended — ClickHouse, PostgreSQL, and Qdrant are the heaviest services
- 10GB disk space — Telemetry data grows with team size and activity; ClickHouse handles compression automatically
Quick start
git clone https://github.com/sebastiangrebe/tandemu.git
cd tandemu
cp .env.example .envEdit .env and set the following:
| Variable | Required | Why |
|---|---|---|
OPENAI_API_KEY | Yes | Powers AI memory embeddings and semantic search |
JWT_SECRET | Production | Any random string. The default is insecure — change it before exposing to the internet |
ENCRYPTION_KEY | Production | Encrypts integration API tokens at rest. Generate with node -e "console.log(require('crypto').randomBytes(32).toString('hex'))" |
Everything else — database URLs, Redis, ClickHouse, OTEL — has working defaults in docker-compose.yml that point to the internal Docker services. You don’t need to change them.
Then start the stack:
docker compose up -dThe dashboard is now running at http://localhost:3000 and the API at http://localhost:3001 .
Next steps
- Open the dashboard and create your account
- Set up your organization and connect your ticket system (Jira, Linear, GitHub Issues, etc.)
- Have each developer run
/tandemu:setupin Claude Code to connect to your instance
See the Configuration Reference for all available environment variables.