Starting the server
substrate with no subcommand is an alias for serve. The server binds to 127.0.0.1 on port 7475 by default. If that port is taken, Substrate scans upward through 7475–7499 and binds to the first free port, printing the URL it actually used. The bound port is recorded in .substrate/serve.json.
What you see
Overview
Every board in the project rendered as a wall you can scan at once — useful for a quick status check across multiple workflows.
Board
A live kanban with one column per workflow group. Switch to List view with a single click.
Task
Full description, custom fields, comments, and event history for a single task. A task blocked on a human gate carries a “pending approval” pill.
Markdown rendering
Author-supplied markdown in descriptions and comments is rendered through a single sanitized path.
Auto-refresh
The board view polls continuously. When an agent moves a task, the UI reflects it within seconds. Leave the browser open beside your editor and watch work land without refreshing manually.Read-only by design
The UI observes. It never writes: no drag-and-drop, no inline editing, no buttons that change state.
1
Truthful event log
Every write in Substrate is attributed to an actor — an agent name or a
human:<os-user> stamp. A UI that could write anonymously would corrupt that record.2
Deliberate human write channel
The one write path reserved for people —
substrate approve — is a CLI command precisely so it cannot be clicked by accident. Keeping the UI read-only preserves that asymmetry.One owner per directory
substrate serve takes a single-owner lock via .substrate/substrate.pid. A second serve in the same project refuses to start while the first is alive. A stale PID file left by a crashed process is reclaimed automatically.