A Bloomberg-terminal-style desktop dashboard for Cardano stake pool operators. It connects to your own node and surfaces the operational data that's otherwise locked away in logs, databases, Prometheus endpoints and cardano-cli.
PoolTerminal is early software and has mainly been exercised on one operator's setup. It is read-only by design and holds no key material, but it does hold SSH access to your block producer, and that limit is not a guarantee. It has had an AI-assisted code review, not an independent security audit. Provided as-is under Apache 2.0 with no warranty of any kind - you use it at your own risk. See SECURITY.md.
Linux · AppImage or .deb. This is beta software running daily against a live block producer — expect rough edges, and tell me what breaks.
Running a Cardano stake pool produces a torrent of operational data. Existing tools surface a fraction of it. PoolTerminal pulls it all together, visualises it properly, and stores history locally so you can see trends over weeks and months - not just snapshots.
Op-cert counter health, sub-second block propagation, real transaction-demand flow, delegator loyalty rankings, per-epoch reward splits down to your own SPO earnings.
No transaction signing. No key access. No node control from the GUI. PoolTerminal observes and reports - it does not act. It stores nothing on anyone else's servers.
A desktop app that connects to your node over SSH, or runs on the node itself. History is cached locally. Optionally enriched by your own db-sync, Koios, or Blockfrost.
If you run a Cardano stake pool and want to see what's really happening - beyond gLiveView and generic chain explorers - this is for you. Whether you're chasing a missed block, watching a delegation shift, or just keeping an eye on KES and mempool, it's the operational view SPOs have been missing.
db-sync on another machine now keeps working after a restart, and PoolTerminal writes far less to disk.
The connection test passed, but after restarting PoolTerminal quietly used Koios instead. The setup wizard now keeps your saved db-sync settings, asks for the database password at startup if it is not remembered, and the "Remember" option sits right under the password field.
If db-sync is set up but cannot connect - a wrong password, a missing key file, an SSH problem - Delegators, the Data tab and History now say so, with the real reason and a Retry button, instead of silently falling back to Koios.
"~" in a key path now works, and key files are checked when you enter them: a missing or unreadable file, or a key that needs a passphrase, is reported with its path.
SSH connections use keepalives, so a dropped link is noticed instead of hanging, and a dropped db-sync tunnel reconnects once by itself.
A few values were rewritten many times a minute, growing a local storage file to around 1 GB on some installs. They are now smaller and saved about once a minute; the large file is cleared the next time PoolTerminal starts.
Setup help recommends a read-only database role with a password, and the SSH port is no longer assumed to be 22. "Remember" stores the password unencrypted on this computer; a system keyring is planned for 0.5.0.
Support for cardano-node 11.1.2, and Ideal and Luck figures you can rely on.
This release needs cardano-node 11.1.2 or later with cardano-cli 11.2.3.0 or later, as a matched pair from the same node release, and cncli 6.8.0 or later if you use cncli. Older versions are not supported. If your updated Guild scripts refuse an older node, PoolTerminal now shows their message when you connect, instead of connecting with no pool ID.
Ideal was worked out from the stake snapshot used for rewards, not the one that decides this epoch's leader slots, so Ideal and Luck were off by however much your stake had changed between the two - 0.82 instead of 0.98, for example. They now match cncli's leaderlog and gLiveView, and History rows saved with the old figure are corrected automatically.
The queue is shown as blocks waiting ("3.7 blk") on the dashboard, its chart and the relay tabs. The line that matters is 2 blocks: most pools run the default 2-block mempool, so from there new transactions may be rejected across the network. Figures turn amber approaching 2 and red at 2 or more. Your own node's capacity fill appears as a small secondary line.
On a busy block producer the presets only saw the last twenty minutes or so. They now filter first, so "Restarts & startup" and "Errors & warnings" really cover their time windows, and they work on nodes that log JSON.
A Guild env that fails is reported at connect. Every cardano-cli query has a time limit, so a mismatched cli and node can no longer freeze the dashboard. Key and certificate file paths are no longer written to logs or error messages.
Tested with db-sync 13.7.2.1 (schema 15.50.6), and the delegator deep-dive is about 2 seconds faster on it. A schema PoolTerminal hasn't been tested against is flagged "verify" on the Data tab and in History.
PoolTerminal no longer pins a CPU core while it is open. Same display, a fraction of the CPU.
Three animation loops rewrote the page on every frame whether or not anything had changed, and the heartbeat's glow was re-blurred on each one. The web process sat at 100-135% CPU for as long as the app was open: fan noise and battery on a laptop, and on a desktop that also runs a node, CPU the node does not get. Motion now runs at 1 Hz, a write is skipped when nothing changed, the glow is applied once to the trace rather than to every moving beat, and the gauges, flashes and bars step instead of gliding, so a value changing every second no longer keeps the page repainting every frame. Measured on the release build on the same machine: from an average of 135% of a core to a few percent.
Minimise PoolTerminal or cover it and the ticker and every animation stop. Nothing is spent painting a window nobody can see; it repaints the moment you come back.
It was treating the node's late-leader-check counter as missed blocks. Every block producer accrues those, and the node was almost never leader for them. The card now escalates only when the node was scheduled and could not mint.
Node Health reads "leader N · forged M", so a forged count of zero is seen against how often the node was actually scheduled. Live detail adds leader slots, cannot-forge errors and late leader checks as "n of total (%)".
Demo mode now fills every view with one consistent synthetic pool, so you can see the whole app before you point it at a node.
One deterministic synthetic pool across every tab: 211 epochs of history, 107 delegators, two pending joiners, realistic luck, lost blocks and blockless epochs. The same numbers wherever you look. Stake addresses and transaction hashes are well-formed but resolve to nothing on chain.
Three view-level caches could carry live values across a mode flip: the delegator list, the dashboard snapshot including upcoming leader slots, and the metadata feed. Logs kept real captured values, and About and Alerts rendered host and bot credentials. All cleared now, and background collectors stop when you switch.
It was still geolocating your own IP and fetching a basemap from a CDN. The basemap is bundled now, which also means the map works offline in live mode.
Disconnecting returns you to the connect screen, prefilled from your saved configuration, so reconnecting is a single action. The wizard stays one click away in Settings for genuinely changing node or settings.
New delegators are visible the moment they delegate, and a stack of honesty fixes.
A new delegation shows in the DELEGATORS list as soon as its certificate lands on-chain: dulled, marked with the epoch it activates, sorted with everyone else, and excluded from the pool's active totals until the snapshot makes it real.
The live balance shown for a not-yet-active delegator overcounted badly on db-sync installs, treating long-spent outputs as unspent. A 200k account read as 12M. It now matches the chain.
The UI now reads its version from the packaged app at runtime instead of hardcoded strings, which had drifted in three different places. What About says is now, by construction, what you are running.
Re-running the wizard from Settings now offers a close control, and Esc does the same. Cancelling writes nothing: your existing configuration is left exactly as it was.
One fix, shipped on its own because of what it could have hidden.
After a KES rotation the dashboard kept showing the op-cert counters read at connect time, next to KES fields that refreshed correctly. An operator could rotate, see the timer reset and two matching counters, and wrongly conclude the rotation was clean. Both counters now come from the same 60-second query as the KES fields, the panel shows when the reading was taken, and a failed query shows an explicit unknown instead of a stale number. The health rule also now accepts disk ahead of chain by any margin, which is the normal state for a pool that rotates more often than it mints.
A correctness release for delegator figures rather than new surface area.
A stake account's movements now show the ADA actually moved in and out per transaction. Previously only rewards and withdrawals were listed, so a plain transfer appeared nowhere.
The per-epoch active-stake table no longer presents the next epoch's already-taken snapshot as though it were the current one.
Two new workspaces, a redesigned KES gauge, and delegator figures that now reconcile against live account state.
Journal queries, your full minted-block history from CNCLI or db-sync, a persisted propagation record that catches slow blocks long after they scroll away, and an epoch-transition view that renders a fork boundary as something you can actually see.
Six alerts to your phone with nothing installed on your block producer. Guided three-step setup, a Test button on every alert, per-alert thresholds, cooldown and quiet hours.
Key expiry as a volume-correct hourglass whose sand drains as the key ages, warming toward red as expiry nears, with the on-disk vs on-chain op-cert counter beneath it.
Per-epoch active stake and live balance are both shown and labelled, so a figure that reads a little under Cardanoscan is explained. Includes a real db-sync bug: rewards live in two tables, and summing only one drove totals negative after a treasury payout.
A genuine payment landing in the same window as the epoch reward roll no longer gets swallowed - it fires, labelled excl. epoch reward.
The old "secrets are never persisted" claim wasn't true. What's stored, where, and what each key can actually reach is now spelled out in the README, in SECURITY.md, and at the point you type the token.
Each tab is a focused, live operational view. Everything repaints instantly from cache when you return to it, refreshing live behind.
Chain pulse, tip/sync, KES expiry as an hourglass whose sand drains as the key ages, the on-disk vs on-chain op-cert counter, a mempool panel that counts the queue in blocks against the 2-block line where default-size mempools fill up, with real KB/min flow, sub-second block propagation, upcoming leader slots with countdowns, and a live CIP-20 metadata feed.
Blocks, ideal, luck, delegators, active stake, and a six-way reward split - including your own SPO earnings per epoch. Charts for blocks and luck over time.
Every delegator in one sortable table with a computed loyalty ranking. Deep-dive any delegator: balance, rewards, a stake-history graph, and a pool-movement journey showing every pool they've ever delegated to. Figures are reconciled against live account state, so a number that reads under an explorer is explained rather than left looking like a bug.
Delegators joining, leaving, returning or moving stake - detected on-chain within minutes, colour-coded with from→to flows, amounts, and one-click transaction links. Epoch-boundary reward bumps are netted out precisely on db-sync, so only genuine activity surfaces.
CPU, memory, peers and node-process resources with historical samples, so you can see how your machine trends over time.
A read-only workspace over your node's journal and CNCLI data - every query bounded and run at low priority so it never competes with block production. Errors, restarts, rollbacks and KES status in one click; your full minted-block history; and a propagation record that keeps the slowest blocks long after they scroll off the dashboard, with an epoch-transition view that tells a real chain gap apart from PoolTerminal simply being closed.
Every other SPO alerting setup wants an agent, a cron job or a monitoring stack beside your node. PoolTerminal already receives this data every poll, so it just sends it on. Six alerts - KES expiry, node stall, block minted, slow propagation, mempool full (2+ blocks queued), low peers - each with its own threshold, a Test button, a global cooldown and optional quiet hours.
A transparency screen showing exactly which source is answering each feature - your node, db-sync, Koios or Blockfrost - and what each optional source would unlock if you added it.
A full-size world map plotting your node and live peers, geo-located, with latency-coloured connections and geographic distribution. Cached offline after first load.
Each relay monitored independently, straight from its own cardano-node over its own connection - a stalling relay flatlines only its own heartbeat, never affecting the others.
A step-by-step walkthrough: connect to your node, optionally add db-sync and Blockfrost. The db-sync path is a guided decision tree that can even generate and authorise an SSH key for you.
Built-in synthetic pool data so you can explore the full interface before connecting anything real - the same data driving the live terminal at the top of this page.
Planned next: REWARDS and GOVERNANCE (DRep).
PoolTerminal touches your block producer, so its trust model is simple: the code is open, licensed Apache 2.0, and you're encouraged to read it before you run it. It's built with a security-focused approach, but the real safeguard is that you can check the code yourself.
# clone the source git clone \ github.com/GNP1-dev/PoolTerminal # build the desktop app cd PoolTerminal npm install cargo tauri build # or grab the v0.4.1 release # (AppImage or .deb, Linux) ↗ github.com/GNP1-dev/ PoolTerminal/releases
Grab v0.4.1 for Linux, or browse the screenshots first and follow the setup guide to get it running against your own node.
Beta software, no warranty - see the notice at the top of this page and SECURITY.md.