The CLI routes the work. The desktop app shows you what it did, which head answered, how long it took, what it cost, how confident it was, and which files changed. It reads the same local logs hyctl writes, so there is nothing to connect and nothing to sign in to.
| Model | Tier | Reachable now | Measured |
|---|---|---|---|
| claude-opus | 1 | yes | 1.42 · 62 outcomes |
| claude-sonnet | 3 | yes | 0.91 · 38 outcomes |
| gemini-flash | 6 | no API key for google | not measured |
| qwen2.5-coder:7b | 10 | start ollama serve | 0.34 · 77 outcomes |
| Model | Tier | Calls | Cost |
|---|---|---|---|
| claude-sonnet | 2 | 14 | $0.31 |
| gemini-flash | 6 | 37 | $0.11 |
| qwen2.5-coder:7b | 10 | 77 | free |
A live rendering of the app's views, built from its own design tokens. Not a screenshot, the numbers are sample data.
The app is a reader, not a second brain. Everything it shows comes from the JSONL files hyctl already writes to ~/.hydra, so the numbers on screen are the same ones hyctl cost and hyctl stats print, by construction.
The window opens here. Ask for work and the reply names the model, the tier and the cost, with the run narrating itself as it goes rather than after. The model picker groups by shared quota, so it shows when choosing one model spends the budget another will need.
Every head this machine found, grouped by the token pool it spends, each marked with whether anything can drive it right now and, when it cannot, why, no API key, or a local server that is not running. Beside it, the accuracy each model has actually earned, never shown without the number of outcomes behind it.
Spend grouped by model, by tier and by day, with call counts beside each, alongside the governor's context pressure and your trust record, so cost and confidence sit on one screen.
Every request, grouped by who has to act rather than by time alone: waiting on you, running now, something failed, done. A flat newest-first list gave a parked request, a live one and a month-old success the same weight, so nothing read as needing attention.
Opened from a request in Activity, not from the rail.
One run's timeline in order: which head was selected, which candidates failed and why it fell through, how long each step took, where it handed off, and a layered graph when the run fanned out, so a swarm reads as a shape rather than a list. Its Code tab carries the diffs for the same run, marking what changed within a modified line, not just which lines moved, and lets you accept or undo the change on disk. Clicking a file in the graph opens it there.
Every tool call an agent made, whether the guardrails allowed it, and what got blocked or flagged, over an append-only, hash-chained audit log, mapped against the OWASP LLM Top 10. Its MCP servers tab carries a trust verdict for each server installed on this machine, and says plainly when nothing has been compared against the official registry yet.
There is no Hydra backend to sign in to, because there is no Hydra backend. The app opens the same files on your disk that the CLI writes, and that is the whole data path. Close it and the CLI keeps working exactly as before, it is a window onto the control plane, not a dependency of it.
Both read cost.jsonl. A figure that differed between them would be a bug, and there is a test that says so.
Claude, Gemini, Codex, an API key, a local Ollama model, the app shows whichever heads your machine actually has, and marks the ones it cannot drive.
Where a provider reports real token usage it says so; where Hydra estimated it, it says that instead. A guess is never shown as a measurement.
Frontend and backend are in the same repo as the CLI. If you want to know what it does with your data, the answer is in desktop/.
It resolves the newest release, checks the download against the SHA-256 published beside it, and refuses to install on a mismatch. Nothing runs as root and nothing is written outside your applications directory.
Pin a version with HYDRA_VERSION=v1.4.1, or change where it lands with HYDRA_APP_DIR=~/Applications. Read the script before you pipe it to a shell, it is under 200 lines and you should.
links pinned to v1.4.1 · all releases · the command above always takes the newest