Guide

Station dashboard

The dashboard is the control surface included with station-kit. In standalone mode it shows one process. In a Station Network it gives Headquarters one fleet-wide view of queued work, workers, schedules, beacons, broadcasts, and environment configuration.

New here? Follow the four-minute setup below, then use Overview → Signals → Run detail. Operating a fleet? Start with Stations, Schedules, Environment, and the v1 API panels shown at the bottom of each screen.


Quick start

pnpm add station-kit station-adapter-sqlite
// station.config.tsimport { defineConfig } from "station-kit";import { SqliteAdapter } from "station-adapter-sqlite";import { BroadcastSqliteAdapter } from "station-adapter-sqlite/broadcast";import { BeaconSqliteAdapter } from "station-adapter-sqlite/beacon";import { ScheduleSqliteAdapter } from "station-adapter-sqlite/schedules";import { EnvSqliteAdapter } from "station-adapter-sqlite/env"; const dbPath = "./station.db"; export default defineConfig({  port: 4400,  signalsDir: "./signals",  broadcastsDir: "./broadcasts",  beaconsDir: "./beacons",  adapter: new SqliteAdapter({ dbPath }),  broadcastAdapter: new BroadcastSqliteAdapter({ dbPath }),  beaconAdapter: new BeaconSqliteAdapter({ dbPath }),  scheduleAdapter: new ScheduleSqliteAdapter({ dbPath }),  envStorage: new EnvSqliteAdapter({ dbPath }),  auth: { username: "admin", password: process.env.STATION_PASSWORD! },});
STATION_PASSWORD=change-me npx station

Open http://localhost:4400. The configured Station port is the single public address for both UI and API; Station handles the dashboard process internally.

Authentication is optional for localhost, but do not expose an unauthenticated dashboard. In production, use environment-backed credentials, TLS, and scoped API keys for automation.

Station login with username and password fields

A map of the dashboard

ScreenUse it for
OverviewFleet-wide status totals, recent failures, and live lifecycle events.
SignalsDiscover definitions, validate input, trigger work, and inspect run history.
BroadcastsTrigger and observe multi-signal DAG workflows.
BeaconsSupervise long-running processes and their runtime instances.
SchedulesCreate, pause, preview, and inspect interval or timezone-aware cron schedules.
StationsSee network membership, capacity, definitions, heartbeats, and drain state.
EnvironmentManage global or target-scoped runtime variables and redacted secrets.
ExpressionsParse and test broadcast expressions before saving a workflow.
SettingsCreate scoped API keys and inspect server configuration.

Overview and live activity

Overview with run totals, recent failures, and live activity

Status cards and failure rows come from durable adapters. Live Activity arrives over the dashboard connection, so the green header dot confirms that new events can arrive without a refresh. Click a failed run to see its validated input, output, attempts, steps, and captured logs.

Signals and broadcasts

Signals catalog with trigger controls and execution limits

A signal page is the quickest way to test a definition: Station renders its Zod schema as a form, also offers raw JSON, and records the resulting run. The configuration panel distinguishes station-local and fleet-wide concurrency and shows placement labels. Broadcast pages render the DAG, then color nodes as their underlying signal runs change state.

Broadcast catalog with release-pipeline and trigger action

Schedules

Runtime schedules showing an interval signal and timezone cron broadcast

Schedules can target a signal or broadcast. Use an interval for elapsed cadence, or five-field cron plus an IANA timezone for wall-clock time. Preview before saving. In a network, durable occurrence claims make one Headquarters instance enqueue each occurrence once. The displayed time is when work becomes eligible; queue pressure can delay handler start.

Station Network

Headquarters with CPU and GPU execution stations

Every row shows the stable station identity, role, lease-backed status, active/max capacity, advertised definitions, and last heartbeat. Drain a worker before deployment: current runs may finish, while new claims stop. An offline row means its lease expired, not merely that a browser lost its dashboard connection.

On a phone, navigation collapses to its icons and wide operational tables scroll horizontally.

Responsive Station Network dashboard on a phone

Beacons

Fleet beacon catalog showing a running heartbeat poller

Beacons are supervised long-running services or pollers. Headquarters receives their definition metadata from workers, while shared state tracks which station owns each instance. Start mode controls whether an instance is seeded automatically, seeded stopped, or created only by an API request. Restart counts and events help distinguish clean exits from crash loops or heartbeat stalls.

Environment and secrets

Environment page with a redacted global ASSET_BUCKET value

Variables can be global or scoped to named signals and beacons. Secrets are write-only in the API and stay redacted in the UI. A definition that declares .env("ASSET_BUCKET") will not start until a matching value exists; a scoped value overrides a global value with the same key.


Configuration reference

OptionWhat it controls
port / hostSingle public UI and API listener. Defaults to 4400 / localhost.
rolestandalone, headquarters, or execution station.
networkFleet ID, stable station ID/name, durable membership adapter, labels, endpoint, heartbeat, and lease timing.
signalsDir, broadcastsDir, beaconsDirDefinition discovery roots.
adapter and specialized adaptersDurable signal, broadcast, beacon, schedule, environment, key, and log state.
runner.maxConcurrentTotal signal processes allowed on this Station. Signal declarations can apply narrower local/fleet caps.
runRunnersWhether this process executes work; defaults to false for Headquarters and true otherwise.
authDashboard credentials, session lifetime, and optional API-key storage.

Operator checklist

Next: design a Station Network, run the local three-process example, or use the complete StationKit API reference.