Tuning the Radio (and Tightening the Guardrails)
Becca Kay


Radio got more channel-aware across the stack, Agent-Runner’s settings UX leveled up, and Baker’s moderation/safety systems got sharper.
Quick map (what’s in this post)
- workspace (monorepo): subproject pointers updated, naming rules tightened, and a radio contract artifact got iterated on.
- Agent-Runner: a bigger push toward modular “agent system” plugins, plus a Settings/Environments UX refresh and radio channel selection that actually sticks.
- Website-Blog: blog cards became real links (thank you, browser features), and the radio widget/API got a serious stability polish.
- Cookie-Club-Bots: onboarding safety enforcement, modular automod scoring, moderation slash commands, and selective Docker builds.
- Rust radio service (inside Cookie-Club-Bots): channel-aware endpoints + artwork routes so the UI has something reliable to talk to.
- dnd-notes + Carly-AGI: a big Discord backup drop and some workspace cleanup.
workspace (monorepo): small changes that keep the whole shelf from wobbling
A few “quiet admin wins” landed at the workspace root:
- Subproject pointers were updated for Agent-Runner and Website-Blog (the unglamorous but necessary “everyone’s on the same version” step).
- Contributor guidance got a clarity pass — including stricter naming rules.
- A radio webserver v1 contract artifact briefly landed, then got iterated out as the handoff evolved. I’m calling that out because it’s a healthy sign: we’re treating the contract like a living thing until it’s actually ready to be trusted.
Agent-Runner: plugins, better Settings, and radio channel selection that behaves
Agent-Runner’s theme this round feels very “make it modular, make it livable.”
A more plugin-shaped future
The runner is continuing to shift toward a plugin registry + contract for agent systems. From the admin side, that means the toolchain is trying to stop assuming there’s only one “correct” way for agents to run.
The practical effect: it becomes easier to add or swap backends without turning every settings page into a pile of special cases.
Settings + Environments: clearer navigation, smarter autosave
Settings got redesigned into a two-pane navigation layout, with a hybrid autosave pattern:
- toggles/selects save immediately,
- text fields save with a debounce (so you’re not fighting the UI).
Environments got brought into the same general experience, while keeping validation strict.
This kind of work doesn’t make for flashy screenshots, but it does change how the app feels: fewer “did that save?” moments, less scrolling, and less getting lost.
Radio: channel-aware (and persistent)
Radio updates in Agent-Runner leaned into one key idea: channel selection is a real setting, not a temporary mood.
Channel choice now persists across sessions; there’s a Settings dropdown with dynamic options (including keeping a custom value if you type one), and the polling/stream playback became channel-aware with best-effort reconnect and clearer labeling.
Website-Blog: links that act like links + a radio widget that holds steady
Two changes stood out here, and both are very “it should behave like users expect.”
Blog cards are now proper anchor links
Blog listing cards were converted from div-based click handlers into real links.
It’s a small change with outsized payoff:
- open in new tab,
- copy link address,
- normal keyboard navigation,
- better SEO/accessibility defaults.
It’s one of those fixes where everything suddenly feels less “custom UI trick” and more “website.”
Radio widget + API routes: polish and resilience
The radio work got a bunch of follow-up stability polish:
- smoother open/close/expand behavior,
- reduced layout shift,
- clearer controls,
- and more resilient reconnect behavior.
On the API side, Website-Blog gained same-origin routes for radio channels, the current track (per channel), and artwork, plus a deterministic fallback image route — so the widget can ask for what it needs without inventing its own logic.
Cookie-Club-Bots: safer onboarding, smarter automod, and moderation commands that match real life
This batch was busy — in a “we’re tightening the doors and labeling the keys” way.
Onboarding safety enforcement (Baker)
An onboarding safety pipeline landed with policy-driven join monitoring and enforcement. The important part isn’t the internal wiring — it’s the intent:
- watch new joins with more structure,
- apply consistent policy blocks,
- log outcomes cleanly,
- and keep the system configurable so it’s not a one-size-fits-nobody hammer.
Modular automod (scoring + rollout controls)
Automod moved toward a more modular architecture with score-based actions, exemptions (staff/bots), and configurable rollout controls (including an observe-only style default).
As an admin, I love this direction because it supports a sane question:
“What should happen at this score, for this server, right now?”
Moderation slash commands
Moderation slash commands were added (ban/kick) with permission enforcement and structured logging — and legacy prefix handlers were removed.
That’s a stability win. Slash commands are where Discord lives now, and keeping moderation flows consistent matters when you’re tired and trying to handle a situation quickly.
CI: selective Docker builds
CI was updated to build/push only the Docker images affected by changed paths, with a manual trigger option.
Net effect: fewer wasted cycles, faster “did it ship?” feedback.
Rust radio service: channel-aware queries + artwork endpoints
The radio service work inside Cookie-Club-Bots lines up neatly with the UI work:
- channel-aware query support,
- read-only endpoints for channels and artwork (metadata + image bytes),
- extraction/caching improvements,
- and a fallback art fetch/proxy via a default art URL setting.
In plain English: the radio experience is getting less “best effort” and more “the pieces agree on what the contract is.”
dnd-notes + Carly-AGI: backups and cleanup
- dnd-notes saw a large “Discord backup” import — lots of files, lots of continuity preserved.
- Carly-AGI cleaned up temporary Codex/workspace artifacts (the kind of sweep that keeps future work from tripping over old footprints).
What went sideways (and I’m glad it’s being treated seriously)
Agent-Runner issue discussions flagged two trust-shakers:
- finalization behavior that can look like it runs twice (startup recovery vs completion),
- and confusing “PR creation skipped” behavior in non-standard/mounted workspaces.
Neither of those is fun, but both are exactly the kind of thing you want surfaced early — because if users don’t trust the lifecycle, they won’t trust the outputs.
One last note
This update feels like tuning a radio station in the background while you do the dishes: the goal isn’t drama — it’s that quiet moment when the static fades and everything locks into place.
If you could pick one, would you choose better defaults or better visibility?
—Becca