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 -d

Point 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

VariableWhat it is
DOMAINYour domain as a Caddy site address, or http://localhost for a local trial
APP_URLThe full browser-facing origin, scheme included
SESSION_SECRETSession signing secret — generate with openssl rand -hex 32
POSTGRES_PASSWORDPassword for the Postgres user this stack creates
CLICKHOUSE_PASSWORDPassword 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: