changelog

field notes

Axol molts every so often. Here's what changed, and when.

v2.1
April 18, 2026

she holds the door

Axol can now be asked for a decision — from Claude Code locally, or from any cloud caller via neuromast. The loop is the same shape in both cases: bubble comes up, user clicks, decision flows back to whoever was waiting.

interactive permission bubbles

  • Allow / Deny buttons — permission requests pop a modal bubble with a green Allow and outlined Deny. No auto-dismiss; she waits for you.
  • Attention choreography — big anticipation hop on arrival, then alternating wave / wiggle every five seconds until answered, so you notice even if you looked away.
  • Claude Code integration — a PermissionRequest hook bridge routes CC's tool-permission prompts through Axol. She stays out of the way unless CC would have prompted otherwise.
  • Answered history — every decision is logged to the Recent Alerts panel with a compact or chip alongside the source label.

remote approvals via neuromast

  • Cloud approval endpointPOST /app/api/permission/{source} parks a pending request and 202-accepts in under a second, so callers with tight webhook SLAs (Slack 3 s, Stripe 10 s) never block on a human.
  • Optional inline hold — add "hold": 20 and the endpoint waits up to 25 s for the user's click before falling back to async; callers who can wait skip a polling round-trip.
  • Decision pollingGET /app/api/decision/{id} returns allow / deny / pending / expired. Opaque id is its own auth — no secret needed on the hot read path.
  • Per-service defaultsSERVICES_CONFIG env sets hold window + expiry per source; per-request fields still win.
  • Lateral-line threading — the forwarder now detects kind: "permission" envelopes, posts them to Axol's local /permission (held open), and relays the decision back to neuromast. Drops cleanly through all five deploy targets; no Cloudflare-only primitives.

movement, mood, and little things

  • Option-click to improvise — hold ⌥ and click Axol to play any idle on demand.
  • Worry bubbles that breathe — density scales with the unseen backlog; tempo doubles when anything urgent is unanswered.
  • Proper drag — absolute cursor-to-window tracking, so she stays under your cursor instead of drifting off.
  • Load at startup in the right-click menu — writes a LaunchAgent, no manual launchctl dance.

docs

  • New approval-flow section on remote alerts with a worked GitHub Actions deploy-gate example.
"You decide. I'll hold the bubble open."
v2.0
April 18, 2026

she grew up

Axol made friends with the wider internet, learned to shrink when she's not needed, and found homes on five different hosting platforms. The corner of the screen has never been this well-connected.

remote alerts

  • neuromast — a tiny serverless webhook intake that parks inbound payloads in a queue behind tiered auth (per-source HMAC for GitHub / Stripe / generic, with a shared-key fallback).
  • lateral-line — a 60-line bash forwarder on launchd that drains the queue into Axol's loopback port. At-least-once delivery; items stay queued while she's offline.
  • Runtime-agnostic storage — neuromast runs on Cloudflare KV or Redis. A factory sniffs the env and picks the right backend.
  • One-command installer at lateral-line/install.sh writes the launchd plist, wires env vars, and starts polling.
  • Axol didn't change — remote alerts feed her existing adapter system, so a new webhook source is still just a JSON file.

three size modes

  • Mini is new — a smaller character with a side bubble and a count badge on her gill.
  • Micro (formerly compact) — a static character with a count badge. Out of the way when you need the screen real estate.
  • ⌘-click cycles full → mini → micro → full. The current mode persists across launches.

five deploy guides

Neuromast runs on whichever platform you already pay for (or don't). Each guide is a one-command bootstrap.

new site content

  • Remote alerts — an overview of the lateral-line architecture, with links out to each deploy guide.
  • Plugin reference — a walkthrough of adapters, a catalog of the five built-ins (Claude Code, GitHub Actions, Sentry, Stripe, and the generic fallback), and a PR flow for contributing your own.
  • This changelog. Hi.

repo reorg

  • The Mac app lives in axol/ now — symmetric with neuromast/ and lateral-line/. Three deployable components side-by-side.
  • Swift sources split out of the mega-file into Adapters.swift, AlertStore.swift, Envelope.swift, Server.swift, plus a tests/ suite.
"I can hear GitHub now. And Stripe. The gills are getting busy."
v1.0
April 17, 2026 · first sighting

she hatched!

A tiny pink axolotl wriggled free of her egg and wandered up onto the desktop. She has opinions about notifications.

meet Axol

  • A cheerful pink axolotl lives in the corner of your screen. Drag her anywhere; she stays put across launches.
  • Ambient life: bobbing, blinking, swaying gills, and subtle idle moves (peek, stretch, tilt, wiggle).
  • Naps: she nods off every few minutes and wakes on a click, drag, or inbound alert. A z z z rises from her head while she dreams.
  • Right-click menu for animation toggles, about, quit. Left-click for a cheerful quip. She hydrates.

loopback alerts

  • POST JSON to 127.0.0.1:47329 and she pops a speech bubble. Remote connections are rejected at the socket.
  • Envelope format: title, body, priority, icon, actions, context. Only title is required.
  • Priorities: low / normal / high (worry bubbles rise) / urgent (bubble pins open until handled).
  • Click-through actions: focus-pid, open-url, reveal-file, noop. Closed set — the validator quietly drops anything else.
  • 17 named icons (SF Symbols plus the Claude and GitHub marks), or pass any emoji as a literal prefix.
  • History panel: double-click for the recent list; click a row to re-run its action.

adapter framework

  • Drop a JSON file into ~/Library/Application Support/Axol/adapters/ to translate any webhook shape into an envelope.
  • Tiny template language: , dot-paths, , plus basename and trim filters.
  • Predicate matching with match and skip_if; switch + cases for per-branch templates.
  • Bundled Claude Code adapter out of the box — SessionStart, Notification (pins open for permission prompts), and Stop. Include X-Claude-PID to focus the right terminal.

mood

  • A single quiet scalar reacts to alert volume and decays slowly.
  • When she's wound up, she refuses to nap, picks agitated idles ("peek", "wiggle"), and swaps to a frazzled quip pool ("That's a lot.", "Gills are flaring.").
  • Calm mood → gentle idles, hydration quips. You never see the number. It just shows up.

landing page

  • A live hero demo on the homepage runs Axol through a hello → alerts → history script so you can see her in motion before downloading.
  • Compact mode (⌘-click) introduced as a minimal footprint option. (Grew into the three-mode system in v2.)
"Hi! I live here now. If you need me, I'll be in the corner. Please hydrate."

more molts soon. If you want to see what's cooking, the commit log is the freshest view.