Skip to content

v0.3.0 — settings, and a phone that tells you

Choose a tag to compare

@lntvan166 lntvan166 released this 18 Aug 14:54
· 156 commits to main since this release

paddock could show you a blocked agent, but only while you were looking at it. This release closes that: your phone now tells you.

Telegram notifications

A message when an agent becomes blocked or done, carrying its name, its state, and a link straight to that agent.

Telegram rather than Web Push, decided deliberately. Web Push needs a service worker, a VAPID keypair, a permission prompt and — on iOS — a Home Screen install before a single notification can arrive. Telegram needs a bot token and one HTTPS POST, works on any device already running it, and is unaffected by an expired Cloudflare Access session.

The cost is recorded rather than glossed: bot messages are not end-to-end encrypted. So the message carries a name, a state and a link, and never terminal output or the agent's task line — the task line is live agent-authored text that can carry pasted secrets. That last point was a real defect caught in final review, after surviving every per-task review because the implementation plan itself contradicted the design.

Notification policy is deliberate about the failures that make an alert channel worth ignoring:

  • keyed on the transition, not the state, so an agent that stays blocked does not repeat
  • first sight after boot is silent, or restarting paddock would ping once per already-blocked agent
  • quiet hours drop rather than queue — a pile delivered at 08:00 describes agents unblocked five hours earlier
  • a failed send does not consume the transition, so the next update retries; the per-agent cooldown is what bounds that, and it is floored at 1s so it cannot be disarmed

Settings, at #/settings

Reachable from a ⚙ button in the header, and split into two clearly-labelled scopes, because conflating them misleads:

This device Theme, refresh rate (Live / Balanced / Frugal), terminal font size, line wrap
All devices Telegram token and chat, notifications on/off, triggers, quiet hours, cooldown, public URL

Sending happens on the server, so a switch tapped on your phone also silences your laptop. The view says so in words rather than leaving you to find out.

The bot token is write-only. paddock has no authentication of its own — Cloudflare Access is the only gate — so anything an endpoint returns is readable by whatever passes that gate. The token goes in and never comes back: the API reports only configured and a four-character hint, and it is stored at ~/.config/paddock/settings.json, written atomically at mode 0600 with an fsync before the rename.

Also

  • The header now shows the mark and paddock instead of local, the default host id. A real host id still shows, dimmed.
  • Terminal font size defaults to Automatic, restoring the responsive clamp a fixed default had been silently overriding — worth roughly 14 columns on a 390px phone.
  • Theme changes apply immediately instead of on the next page load.

Notes

Behind an authenticating tunnel this needs no extra configuration — see docs/deploy-cloudflare.md, which also now records the ordering that matters: create the Access application before publishing the hostname.

418 tests. One known gap is recorded in docs/roadmap.md: no test guards the composition root's fan-out call site, so an edit bypassing it would pass the suite while silently disabling notifications.