Dashboard
The dashboard is the visual way to watch and operate your pipelines, and to build new ones. The engine serves it at /ui on its gateway. It's static files talking to the engine's REST API and event stream, so everything it does is also available from the CLI and the API.
pipo ui # starts the engine if needed, prints the URL and opens it
pipo ui --no-open # only print the URL
pipo ui --workspace ~/pipes # where the builder saves new pipelines (when it starts the engine)
pipo ui --json prints {url, started, pid, workspace}. An open dashboard keeps the engine awake: the idle clock only starts once the last tab closes.
The top bar has ๐ Pipelines, ๐งฎ Tasks, ๐ ๏ธ Builder, ๐ Agents, ๐ค Bots and โ๏ธ Settings, the engine's status, the live event stream's status, ๐ค with the owner's name (it opens Settings), and ๐ to switch between the light and dark themes (it follows your system until you pick one). Animations respect your system's reduced-motion setting.
Pipelines#
The home page (#/) lists every pipeline the engine knows as a card: its state, its version, packets accepted, delivered and pending, the dead-letter count, throughput per minute, CPU and memory, and the lifetime remaining, counting down live when the pipeline has a TTL.
Below them, ๐งฐ Ready to run lists the .pipo files in the workspace that aren't running, each with โถ๏ธ Run and โ๏ธ Edit. โจ New pipeline opens the builder on a fresh draft.
A pipeline's page#
Click a card to open the pipeline (#/p/<name>). Its header has the controls, the counters and โ๏ธ Edit, which opens the file in the builder. Edit works even before the pipeline has a journal (it never started, or failed to start).
| Control | Effect |
|---|---|
| โธ๏ธ Pause / โถ๏ธ Resume | Pause processing (inputs keep journaling) or resume it. |
| ๐ฐ Drain | Stop taking input, finish what's in flight, then stop. Asks first. |
| โน๏ธ Stop | Stop the pipeline. Packets in flight stay in the journal and resume on the next start. Asks first. |
| ๐ Restart | Stop, then start the same file again. Asks first. |
| ๐ฑ Start | Start a stopped or failed pipeline (in place of Stop). |
The page has five tabs. A tab that can't load shows its error in place of its content.
๐บ๏ธ Overview#
- The live graph. The pipeline drawn from its definition, with counters on each node (in, ok, failed, filtered) and error badges. Packets travel along the edges as they flow. Click a node to see its counters.
- ๐ Graph | ๐๏ธ City. The same pipeline as a small isometric town: each node is a building whose shape says what it does, and each wire is a coloured data lane. Live events send a van down each lane a packet takes, and show retries (๐), dead letters (๐ฅ), filtered packets (๐งน) and deliveries (โ ) at their building. Click a building for its counters. Buildings can be moved, and the town is read-only otherwise. Your choice of view is remembered per browser.
- ๐งช Send a test packet. Type JSON and push it into the running pipeline (
POST โฆ/push). It runs for real: taps fire and the output is written. - ๐ฆ Recent packets, with ๐ Follow the last one. Click a packet to open it in the inspector.
๐ Logs#
The tail of the runner's log (<home>/logs/<name>.log), followed live: the same lines as pipo logs -f.
๐ค Agent#
- ๐ Proposals: each change proposal with its status, author (๐ง human or ๐ค agent), reason, size of the change and the version it became. Proposals come from the builder's Apply live,
pipo proposals โฆ proposeand agents. - ๐ค Agent activity: packets handed to the agent (
then: agent, stalls withon_stall: handle) and why, how each was resolved and by whom, and every applied version.
See Agents as operators and Live changes and proposals.
๐ DLQ#
The dead-letter queue: each packet, the step it failed at, its attempts and error. ๐ Replay puts one packet back in flight at the step it failed on; ๐ Replay all replays them all. Click a packet to inspect it. See Recovering packets.
๐ฐ๏ธ Versions#
Every version with its author, reason, creation time and pending packets, the current one marked โญ current. ๐ diff vs vN shows a version's diff against the current one, and โช Roll back runs an earlier version again, as a new version, after a confirmation. See Versions and rollback.
Packet inspector#
#/p/<name>/<packet_id> traces one packet through every step, like pipo inspect: its version, source, receive time, key and total time, then one entry per step with its event, duration, attempts and time.
- The first step shows the data the packet came in with.
- Each later step shows only what it changed: the top-level keys it set or changed (โ๏ธ changed), or data unchanged. Keys a step dropped show as
removed: โ key, never asnull, sincenullis a value a step can really write. - Errors show on the step that failed.
On a delivered or filtered packet, each node step has ๐ Rerun from here. It shows the rerun plan (the steps that will run again, flagged when they call an agent again, reach outside again or write again) and runs it after you confirm. See Recovering packets.
๐งฎ Tasks#
The task manager (#/top) lists every pipeline with its state, runner pid, CPU, memory, process count, throughput and pending count. It refreshes every 2 seconds and sorts by CPU. CPU and memory cover the runner's whole process tree, including agent CLIs it runs: CPU is a percentage of one core, summed, so it can pass 100. Each row has the pipeline's controls. Stop, drain and restart ask first.
๐ Agents#
What agents do on this engine (#/agents), and what waits for you:
- Waiting for your approval: pipelines agents wrote with
create_pipeline. Each shows the agent, its reason, what the pipeline reaches outside its folder (runs programs, sends data out, spends on agents, listens for requests, reads or writes files), and every file it wrote, the.piposource open. โ Approve, โถ๏ธ Approve & start or โ Reject (with a reason the agent sees). See Agents that build pipelines. - Changes waiting for you: proposals agents made to pipelines agents wrote, which are held for you. ๐ Apply or reject them.
- Connected agents: OAuth grants, with their scope, pipelines and when each was last used, and ๐ Disconnect to revoke one. Static tokens from
config.yamlare listed too. - Pipelines agents wrote: the ones you already approved or rejected.
- Auto-approve agent pipelines: a toggle for
engine.mcp.auto_approve, saved toconfig.yaml.
Connecting an agent#
When an MCP client connects over OAuth (see Agents as operators), your browser opens Connect an agent (#/connect/<id>). It shows the client's name (its own claim, which Pipo can't check) and where the token goes, a program on this machine or a website. You choose the scope (the one the client asked for is preselected; author is flagged), all pipelines or a list, and the name its actions are recorded under. โ
Approve sends your browser back to the client with a one-time code; ๐ซ Deny tells the client no. A request waits 10 minutes.
๐ค Bots#
The Telegram bots of this Pipo home (#/bots): add, edit, rename, test, make one the default, and remove. A token is typed into a password field and never shown again. A token can also be a reference (op://โฆ or env:โฆ). Bots are stored in <home>/bots.json, and a change applies from a pipeline's next start. See Telegram bots.
โ๏ธ Settings#
- ๐ Engine: its pid, address and start time, with ๐ Restart engine and โป Stop engine.
- ๐ค Owner: the owner's email, with ๐จ Send test email once
engine.mailis set; ๐ Change password; ๐ Log out and ๐ช Log out everywhere. Withengine.auth: openit says there is no login. See Owner and remote access. - ๐ Workspace: the folder the builder saves new pipelines in, and where ๐งฐ Ready to run looks for files. Pick one by walking folders from the current one, or type a path. A missing folder can be created. The choice applies at once and is saved as
engine.workspaceinconfig.yaml, so the next engine uses it too. Pipelines already saved stay where they are.
The workspace defaults to the folder the engine was started from. pipo ui --workspace <dir> or pipod --workspace <dir> set it for one engine, and a choice made here wins over both.
When the engine is down or out of date#
- Offline. When the engine can't be reached (it went to sleep, or was stopped), the dashboard shows The engine is napping ๐ด with the command to wake it, and reconnects by itself once it's back.
- Stopping the engine. โป Stop engine (on ๐งฎ Tasks and โ๏ธ Settings) asks first, then stops it as
pipo engine stopdoes: pipelines drain, detached runners keep running, crashed pipelines are remembered. The page then shows the stopped screen with the command to start it again. - Out of date. After you update Pipo, the engine still runs the old code. The dashboard notices and shows a banner with ๐ Restart now: the old engine finishes what's in flight and stops, a fresh one starts at the same address (reattaching detached runners and starting the handed-over pipelines again), and the page reloads by itself.
pipo uiprints the same warning. Per-start options (--listen,--ttl) aren't carried over, and a paused pipeline starts again active.
Security#
The dashboard needs the owner's login. The first visit creates the owner with a setup code (#/setup; pipo ui fills it in), and after that a 401 sends you to Log in (#/login) and back. Forgot your password? (#/forgot) emails a reset link when engine.mail is set, and otherwise names pipo owner reset. See Owner and remote access. It answers only on 127.0.0.1 unless you expose the engine, and only to requests whose Host is a loopback name or engine.public_url's host. Pages from other origins are refused, the session cookie is SameSite=Strict, and every API POST must be JSON. A web page you visit can't drive your engine. Data from pipelines is always rendered as text.