Quick start
With Docker
Section titled “With Docker”cp .env.example .env# set a strong SESSION_SECRET and your AI_PROVIDER/AI_MODEL (+ keys)docker compose up --build # timescaledb, keycloak, migrate, app, seedThis brings up TimescaleDB, Keycloak, a one-shot migration job, the app, and the
seeder. The seed service continuously inserts demo metrics and, once, creates
the demo demo workspace sources and dashboards.
Open http://localhost:3000. See Demo data for
what gets created and how to tune it.
Locally
Section titled “Locally”Requirements: Node 22+ and a TimescaleDB instance.
npm installcp .env.example .env # edit DATABASE_URL, TIMESCALEDB_URL, secrets, AI_*psql "$DATABASE_URL" -f timescaledb/init/001_schema.sqlnpm run migrate # apply Postgres migrationsnpm run seed # looping metrics seeder (+ demo source/dashboard)npm run dev # http://localhost:3000Before you can generate anything
Section titled “Before you can generate anything”Three things must be true, and each has its own failure mode:
- An AI provider is configured.
AI_MODELmust be set; there is no default model. See AI provider. - A data source is registered with a table catalog. Generation sends the model that catalog as metadata — it designs against a schema, not against data.
- The source’s
secret_refis granted to its workspace and has credentials.SOURCE_SECRET_REFSdeclares which workspace may use which ref (the Docker Compose stack grantsTS_METRICStodemo), and the server needs<REF>_USERNAME/<REF>_PASSWORD. A source whose ref has no credentials saves fine but fails on Test. See Source secret references.
Scripts
Section titled “Scripts”npm run dev # dev servernpm run build # production buildnpm run start # run the production buildnpm run lint # lintnpm test # node --test (schema, auth, SQL safety, poller)npm run migrate # apply Postgres migrationsnpm run seed # looping metrics seeder| Path | Purpose | Min role |
|---|---|---|
/dashboards |
List dashboards in a workspace | viewer |
/dashboards/new |
Prompt → preview → save, with starter prompts built from the selected source’s catalog | editor |
/dashboards/[id] |
Live viewer (SSE) with Live/Pause and a read-only chat assistant | viewer |
/dashboards/[id]/edit |
Panel CRUD/layout, single-panel NL edits, version save | editor |
/explore |
Ad-hoc NL questions against editable sources | editor |
/data-sources |
Source CRUD / test / refresh, a structured form with table discovery, plus a natural-language drafter | source-admin |
Roles come from Keycloak group membership — see Authorization model.