Guide
From download to first session in two minutes
Hoply needs no account and no daemon. Connecting an agent writes one small block of config, with a backup, and only ever touches Hoply's own entries.
- 1
Install it
Download the universal DMG and drag Hoply to Applications, or install it with Homebrew. Open it once. No daemon, no Python, no Node — the listener is inside the app.
brew install --cask milos5611/hoply/hoplyRelease builds are signed with a Developer ID and notarized by Apple. The first open shows macOS’s usual one-time confirmation for an app downloaded from the internet; choose Open. A Homebrew install updates itself through Sparkle, like the DMG.
- 2
Connect your agents
Open Settings → Agents. Each card shows what Hoply found and whether it is connected, and one press writes the config. Re-running is safe: Hoply only touches its own entries and backs the file up first.
Claude Code → ~/.claude/settings.json Codex CLI → ~/.codex/hooks.json Copilot CLI → ~/.copilot/hooks/hoply.jsonRestart any session that was already running, so it picks up the hooks. Codex asks once more: open it, run /hooks, trust Hoply’s hooks.
- 3
Check events arrive
The panel footer says “Listening on 127.0.0.1:4318”, or why it isn’t. Start an agent and a row appears within a second.
curl -s http://127.0.0.1:4318/healthIf the port is taken by an OpenTelemetry collector, change it in Settings, then press Update on each agent card.
- 4
Copilot in JetBrains
Copilot’s agent in JetBrains runs the Copilot CLI hooks, so connecting Copilot CLI covers it and its sessions show up as Copilot CLI. Where its agent doesn’t run those hooks, Hoply reads it over OpenTelemetry: turn the export on and point it at Hoply.
Settings → Tools → GitHub Copilot → Chat → OpenTelemetry, endpoint http://127.0.0.1:4318 over HTTP. JSON and protobuf both work.
- 5
Qwen Code
Qwen is not connected automatically — its OpenTelemetry is its only history, so Hoply stores it as it arrives.
"telemetry": { "enabled": true, "otlpEndpoint": "http://127.0.0.1:4318", "otlpProtocol": "http" }To file usage under the right project, start Qwen with OTEL_RESOURCE_ATTRIBUTES=hoply.cwd=$PWD. Without it Hoply asks the process for its working directory, and anything it cannot place shows as Unassigned.
- 6
Your local model server
Add any number of servers — local or remote, vLLM, tensorfold, llama.cpp, SGLang, TGI, Ollama, LM Studio. Hoply polls each one every five seconds while you are looking at it.
Server URL: http://192.168.1.20:8888 (no /metrics)Private-range addresses are allowed through App Transport Security in the app’s own Info.plist; macOS asks once for Local Network access. Tokens go to your Keychain.
- 7
Plan limits
Press Connect on the Claude limits card. Hoply reads the same “Claude Code-credentials” Keychain item Claude Code wrote, then asks Anthropic for your windows. Codex’s limits need no setup: Codex writes them into its session files with each response, and they appear on the Limits page once you use Codex.
macOS asks once whether it may read that Keychain item — choose Always Allow. If the login has expired, open Claude Code once and it refreshes. Codex’s limits move only while Codex runs on this Mac.
- 8
Approve from Hoply
Off by default. Turn it on and a Claude Code permission prompt gets Allow and Deny in the panel and on its notification, with the exact command.
The terminal prompt stays up and whichever answers first wins. Needs an up-to-date Claude Code hook: if the Agents card says Update, press it once.
- 9
Correct a price
Costs come from a table bundled in the app. A model Hoply does not know is listed as unpriced, never as free. Add or fix one by dropping a file next to the database.
{ "models": { "claude-opus-4-5": { "input": 5, "output": 25 } } }Per million tokens, USD. Cache prices default to 0.1× input for a read, 1.25× for a 5-minute write and 2× for an hour write.
Coverage
What each source gives you
State comes from hooks where the agent has them, usage from the agent's own records, so nothing is counted twice.
| Source | How it reports | What you see |
|---|---|---|
| Claude Code | Hooks for state, its own transcripts for tokens (OpenTelemetry adds live counts) | Working, needs permission, your turn · task title · last tool · tokens · cost |
| Codex CLI | Hooks for state, its own session files for tokens | Working, needs permission, your turn · last tool · tokens · API-equivalent cost · subagents · context window |
| Copilot CLI (and Copilot’s agent in JetBrains) | Hooks for state, its own session store and session files for tokens | Working, needs permission, your turn · task title · model · last tool · AI units · premium requests |
| Copilot in JetBrains | OpenTelemetry, when its agent doesn’t run the Copilot CLI hooks | Working, idle · tokens |
| Qwen Code | OpenTelemetry, stored by Hoply | Working, idle · prompt title · tokens |
| Local model server | Prometheus /metrics or the OpenAI-compatible model list | Model · running and queued · tokens/s · KV cache |
| Claude plan | Your own Claude Code login, read from the Keychain | 5-hour and weekly usage, pace, burn rate, reset time |
| Codex plan | The rate limits Codex writes into its session files with each response | 5-hour and weekly usage (30 days on the free plan), plan, pace, burn rate, reset time |
Agent names are their owners’ trademarks and are used here only to say what Hoply works with.
Something not arriving?
The panel footer is the first thing to read: it says which address Hoply is listening on, or why it is not. A port taken by an OpenTelemetry collector is the usual cause — change it in Settings, then press Update on each agent card so the hooks point at the new port.
Write to coolcraftcoders@gmail.com with the footer text and the agent, and you get an answer from the person who wrote it.
Two minutes, then it is in your menu bar
Follow the steps above with the DMG open, and your first session shows up before the coffee is done.
macOS 14 Sonoma or newer · Apple silicon and Intel · Free during early access