This guide shows how to run Pulse locally for development.
From the repo root:
docker compose -f deploy/docker-compose.yml up -d clickhouseClickHouse endpoints:
- HTTP:
http://localhost:8123 - Native:
localhost:9000
To stop:
docker compose downIn a new terminal:
cd pulse
export PULSE_CLICKHOUSE_PASSWORD=pulse # compose starts ClickHouse with this password
go run ./cmd/pulseWithout the export, go run defaults to an empty ClickHouse password and fails to connect to the compose-started container.
Pulse listens on http://localhost:4321 and serves:
- OTLP ingest:
POST /v1/traces,/v1/logs,/v1/metrics(protobuf + JSON) - Query API:
GET /traces,/logs,/metrics,/services,/exceptions,/databases,/external,/alerts,/search,/usage,/dashboard/summary,POST /query/sql - Auth:
/auth/setup,/auth/login - Health:
GET /healthz(liveness),GET /readyz(ClickHouse readiness)
Useful env vars while developing: PULSE_JWT_SECRET (compose defaults this to change-me-in-production, override before real use), PULSE_PIPELINE_CAP, PULSE_INGEST_RPS, PULSE_ALERT_EVAL_INTERVAL_SECONDS, PULSE_RETENTION_{TRACES,LOGS,METRICS,EXCEPTIONS}_DAYS — see architecture.md.
cd dashboard
npm install
npm run devThe dashboard app runs on http://localhost:8080 by default.
cd frontend
npm install
npm run devThe public app runs on http://localhost:8080 by default too — if dashboard's dev server is already running on 8080, Vite auto-picks the next free port (check the terminal output for the actual URL).
OTel SDK (any language) → your app → Pulse (Go, OTLP/HTTP on :4321) → ClickHouse → Pulse query API → dashboard UI (dashboard/).
The in-process pipeline (replacing Kafka/Redpanda) uses a buffered Go channel. Buffered events are lost on crash. This is acceptable for v1 — a WAL can be added later if needed.