Self-Hosting
Emit Vision is self-hostable-first: run the whole stack — Postgres, Redis, ClickHouse, the ingest API, the worker, and the dashboard — on your own infrastructure, with no account with us required.
Community edition is free and unlimited on events. Six features are Commercial-only — see Community vs. Commercial below.
Quick start
git clone https://github.com/develemit/emit-vision.git
cd emit-vision/self-host
cp .env.example .env
# fill in DOMAIN, APP_URL, SESSION_SECRET, POSTGRES_PASSWORD, CLICKHOUSE_PASSWORD
docker compose up -dPoint DNS at this host first if you're using a real domain — the bundled reverse proxy requests a Let's Encrypt certificate automatically on first boot. For a local trial with no domain, set DOMAIN=http://localhost and APP_URL=http://localhost.
Migrations run automatically before the api and worker start. Once every service reports healthy (docker compose ps), visit your domain — the first visitor to arrive claims the instance and becomes its owner. There's no invite token to enter; this is only reachable on a freshly-migrated, zero-user instance.
Requirements
- Docker Engine 24+ with Docker Compose v2+
- 2 vCPU / 4 GB RAM minimum — ClickHouse is the memory-hungry component
- A full clone of the repository, not just the
self-host/directory
The five required variables
| Variable | What it is |
|---|---|
DOMAIN | Your domain as a Caddy site address, or http://localhost for a local trial |
APP_URL | The full browser-facing origin, scheme included |
SESSION_SECRET | Session signing secret — generate with openssl rand -hex 32 |
POSTGRES_PASSWORD | Password for the Postgres user this stack creates |
CLICKHOUSE_PASSWORD | Password for the ClickHouse user this stack creates |
Every other variable already has a working default baked into the compose file.
Wiring up an SDK
Once you have your ingest key (Setup page, or the claim response), point any SDK at your own origin instead of the hosted default:
import { init } from "@emit-vision/sdk-js";
init({
apiKey: "evk_your_ingest_key",
endpoint: "https://your-domain/v1", // self-hosted: your own origin
environment: "production",
release: "[email protected]",
});See the Installation guide for every SDK's setup — the ingest contract is identical for self-hosted and hosted instances.
Community vs. Commercial
Community includes everything except six features, all gated the same way and all reporting as disabled until a license is activated:
- SSO — OIDC login via Google, Microsoft, Okta, or Auth0
- Audit log — who did what, when
- Advanced RBAC — custom roles beyond owner/admin/member
- Retention governance — per-project retention policies
- Dashboard sharing — public, unauthenticated share links
- Operator console — cross-org administration
There's no event cap on Community — the only limit is your own hardware. Activate a license from Settings → License once your instance is running; features unlock immediately, no restart required.
Backups, upgrades, and sizing
The full self-hosting guide covers a tested backup-and-restore procedure, the upgrade path between versions, resource sizing by volume tier, and troubleshooting for common failure modes — it lives in the repository so it stays versioned alongside the code it documents: