Alerts with a face.
Any tool that can curl can pop her speech bubble. Click to jump back to the terminal, URL, or file that needs you.
A tiny axolotl that lives in the corner of your screen, surfaces alerts from any tool that can POST JSON, and cheers you on.
Any tool that can curl can pop her speech bubble. Click to jump back to the terminal, URL, or file that needs you.
Drags anywhere on screen. Nudges you to breathe, hydrate, stretch. Fidgets and naps when things go quiet.
One 350 KB Swift binary. No Electron, no helpers, no telemetry. Idles at 0 % CPU and ~40 MB RAM.
macOS only, for now. You'll need the Xcode command-line tools — if xcode-select -p returns a path, you're good; otherwise run xcode-select --install first.
git clone https://github.com/Roach/axol.git
cd axol/axol
./build.sh
./axol
build.sh compiles the Swift sources into a single ~350 KB stripped binary — no Xcode project, no package manager, no code signing. Run NO_STRIP=1 ./build.sh for a debuggable build with symbols, or ./test.sh for the 71-assertion adapter test suite.
Open System Settings → General → Login Items and drag the axol binary into "Open at Login". That's it — no launchctl dance, no helper process. Her window position, size mode, and alert history persist to ~/Library/Application Support/Axol/ across reboots.
Pick a thread:
curl one-liner.⌘-click her to cycle through three sizes: full → mini → micro → full. The current mode persists across launches.
Default. Bubble above her head; worry bubbles for unresolved alerts.
Side bubble on her left; blue count badge on her gill.
Static character + count badge.
Axol listens on 127.0.0.1:47329. Anything you can curl can talk to her — post an envelope from a script, a Makefile, a CI step:
curl -s -X POST http://127.0.0.1:47329/ \
-H 'Content-Type: application/json' \
-d '{
"title": "ci-bot",
"body": "build passed on main",
"priority": "normal",
"source": "github-actions",
"actions": [{ "type": "open-url", "url": "https://github.com/.../runs/1" }]
}'
Required field: title. Priority high / urgent floats worry bubbles above her head; urgent also pins the speech bubble open until you handle it. Actions are a closed set — focus-pid, open-url, reveal-file, noop — so there's no shell execution path.
Axol's receiver is loopback-only. For services that live on the wider internet — GitHub, Stripe, Sentry — she picks up alerts through a two-part bridge: a signed webhook endpoint in the cloud (the neuromast) and a local 60-line bash forwarder (the lateral line) that drains its queue into the loopback port every 15 seconds.
Adapters are JSON files that translate a third-party payload into Axol's envelope. Drop one into ~/Library/Application Support/Axol/adapters/ and anything that POSTs JSON to localhost:47329 can talk to her — no code required.