Architecture
| Service | Port | Role |
|---|---|---|
apps/ingest | 4000 | API-key-authed span intake; prices and writes spans. Scales independently. |
apps/server | 3000 | tRPC dashboard API, auth, and the alert evaluator cron. |
apps/web | 3001 | Next.js dashboard UI. |
| ClickHouse | 8123 | Span store and materialized rollups. |
| Postgres | 5432 | Orgs, projects, API keys, alerts. |
REDIS_URL is set, ingest rate
limiting is shared across replicas; unset, each instance limits in memory
(fine for a single replica). The default compose includes a Redis service.
Which ports reach the host depends on the compose files in play. The base
docker-compose.yml keeps ClickHouse’s 8123 internal-only — reachable from
the other services but not published on the host. A plain docker compose up
also loads docker-compose.override.yml, which publishes 8123 (plus
Postgres 5432 and Redis 6379) to localhost for local development. For a
production self-host, run without the override —
docker compose -f docker-compose.yml up --build — and set
CLICKHOUSE_PASSWORD before the network is reachable; an open passwordless
ClickHouse leaks every span.Quickstart
migrate service).
The seed prints an admin login and an API key once — copy them. If you missed
them, search the migrate service logs for Save these now
(docker compose logs migrate).
There are no static default credentials. If
ADMIN_EMAIL / ADMIN_PASSWORD
are unset, the seed generates a random password and prints it a single time.http://localhost:3001 and log in with the seeded
email + password. Email (magic-link) and Google OAuth are optional — login works
out of the box without them.
Pointing the SDK at your deployment
Set the ingest URL in your instrumented app:Operations
- Retention — span retention is plan-driven: each span is stamped with a
retention_daysvalue at ingest (from the org’s plan) and a per-row TTL expires it automatically. Hosts running with billing off keep spans effectively forever. - Pricing — model prices come from the OpenRouter models API, cached and
refreshed every 24h. For air-gapped hosts, supply a local JSON file with
FOGLAMP_PRICING_FILE. - Email — set
RESEND_API_KEYto enable magic-link login and alert notifications. Without it, the platform still works via password login.

