AI agents on your Karoo

Monitor your background coding agents at a glance on your Hammerhead Karoo 3 bike computer. No phone required.

Working
Claude Code72%
implementing
Editing main.ts
Waiting
Claude Code? x 2
WAITING
Permission needed
Offline
Bridge Offline
Last seen: 14:32

What it does

Three native Karoo data fields that update in real time over WiFi.

Agent Progress

Numeric 0-100% completion estimate based on tool call count and inferred phase. Shows at a glance how far along your agent is.

Agent Questions

Count of pending permission prompts. When this goes above zero, you know your agent is blocked and waiting for input.

Agent Status

Graphical field showing agent name, current phase, and status line. Color-coded: amber background when waiting, dimmed when offline.

Multi-Agent

Track any number of concurrent sessions. Cycle between agents with the "Next Agent" bonus action during your ride.

Local & Secure

Everything runs on your local network. No cloud, no accounts. Pairing code + bearer token over LAN.

Extensible

Adapter architecture supports future agents (Cursor, Aider, Codex). The bridge accepts events from any source.

How it works

Three components connected by HTTP. Agents push, the Karoo polls.

  Workstation                                              Karoo 3
+-----------------+    HTTP POST       +-----------+     HTTP GET      +---------------+
| Claude Code     |---- hooks -------->|  Bridge   |<---- poll (3s) ---| Karoo         |
| (agent session) |   (curl, 5s max)   |  Server   |                  | Extension     |
+-----------------+                    |  :7420    |                  |               |
                                       |           |                  | Data Fields:  |
+-----------------+    HTTP POST       | In-memory |                  |  progress %   |
| Future agents   |---- adapter ------>| agent     |                  |  questions #  |
| (Cursor, Aider) |                    | store     |                  |  status (gfx) |
+-----------------+                    +-----------+                  +---------------+
ComponentTechnologyRole
Bridge Server Node.js TypeScript Fastify Aggregates agent state, serves REST API on port 7420
Karoo Extension Kotlin karoo-ext SDK Jetpack Glance Renders native data fields on the Karoo 3 display
Agent Adapter Claude Code hooks curl Pushes lifecycle events (tool use, notifications, stop) to bridge

Agent lifecycle

How the bridge tracks your agent's state as it works.

EventStatusPhaseWhat happens
Session starts working starting Agent created, progress set to 5%
Read/Glob/Grep working thinking Agent is exploring the codebase
Edit/Write working implementing Agent is writing code, progress jumps to 30%+
Bash (test/lint) working testing Agent is running tests, progress jumps to 70%+
Permission prompt waiting - Pending questions incremented, display turns amber
Stop idle reviewing Progress set to 100%, task complete
Session ends stopped - Agent marked as stopped

Setup

Get running in three steps. Detailed guide in docs/setup.md.

Start the Bridge Server

Install dependencies and run the bridge. It prints a pairing code on startup.

cd bridge
pnpm install
pnpm dev

Configure Claude Code Hooks

Pair to get a token, set it as an environment variable, and merge the hooks config.

# Get a token
curl -X POST http://localhost:7420/api/v1/pair \
  -H 'Content-Type: application/json' \
  -d '{"pairingCode": "YOUR_CODE"}'

# Set the token in your shell
export AGENT_HUD_TOKEN="ahud_..."

# Merge hooks/claude-hooks.json into ~/.claude/settings.json

Install the Karoo Extension

Build the APK and sideload it to your Karoo 3. Open Agent HUD, enter the bridge URL and pairing code.

cd karoo-app
./gradlew assembleDebug

# Sideload via ADB or Hammerhead Companion App
adb install -r app/build/outputs/apk/debug/app-debug.apk

Prerequisites

ComponentRequirements
BridgeNode.js 20+, pnpm
Karoo ExtensionAndroid SDK, JDK 17+, GitHub token with read:packages scope
Claude CodeClaude Code CLI, curl

API at a glance

Full reference in docs/api.md. Base URL: http://<host>:7420/api/v1

EndpointAuthDescription
GET /healthNoServer status and uptime
POST /pairNoExchange pairing code for bearer token
GET /agentsYesList all agents with active agent ID
GET /agents/:id/summaryYesDetailed agent state, phase, progress
POST /agents/:id/actionYesSend action (e.g., approve) to agent
POST /agents/:id/activeYesSet active agent
POST /hooks/*Yes6 hook endpoints for agent lifecycle events