Releases: AdamOusmer/ItsBagelBot
Release list
v0.1.6-beta — Interactive Guides, Search-Ready Site & Linked Minecraft Accounts
The guides grow up into interactive tools, the site learns to speak search, and a round of polish lands everywhere from buttons to the terms.
Guides
The guide library is rewritten from static pages into interactive tools on the typed content model. The hub is calmer: laid out on the shared banded Card, builder first, a real button on every row, and mock annotations driven by the legend instead of badges. Every guide can deep-link into the builder pre-filled, and the registry enforces slug and locale parity so English and French can never drift apart.
Web & SEO
- Long-tail landing pages and head-to-head comparison pages.
- A dedicated song-requests landing page.
- Per-release changelog URLs, so this release has a page of its own.
- An IndexNow key is hosted for faster indexing.
- Spotify copy is BYOC-only end to end, with card rail links to match.
- The home page's encryption act is shorter and the page rebalanced around it.
Games
- Minecraft: linked uuids persist, so ranked boards keep recognizing an account after it is linked once.
- Valorant: rank and match TTLs align with the upstream provider's five-minute cache, keeping data as fresh as the source allows without extra load.
- Stream age reporting clamps its seconds with the max builtin.
Discord fixes and hardening
- Ticket panels are gated and desk actions scoped to the guild, and every ticket verb is scoped to its guild with the open count locked.
- Ticket RPC deadlines are paired and the close path hardened; ticket channels are named from the row id, embeds render with transcripts capped on a rune boundary.
- The guild config version is a real optimistic lock, and the guild binding surface is authoritative-or-cached.
- The dashboard RPCs closed their correctness gaps on the outgress side of the wire contract.
- The gateway persists its connect window across restarts, surfaces the connect budget on the status RPC, and a codeless read waits for the writer's close code.
Design system
Every button now sits on the Mark system, and border radii unify on one 4px concentric scale.
Legal
Game trademark notices move into the terms.
Platform
- NATS cross-account RPC requests are gated on their imports, and the stream-info and urlfetch RPCs got their account imports granted.
- Dependency refresh: bun 1.4.2, Go dependencies, container images, and the twitch ingress mix.lock.
v0.1.5-beta
BagelBot comes to Discord, the status page learns to say something useful, and beta features become a premium perk.
Discord
One bot replaces the whole community stack. A full server template ships with real roles, grants and tiers; ticket, voice and rank panels are driven by buttons; link protection runs on the engine; and go-live posts follow your stream. On premium servers the bot takes your identity — nickname and avatar — and it asks for re-authorization rather than failing silently when a rename is refused. Its presence shows how many streams it is watching.
Discord gets its own dashboard section, and the console now says plainly that no Twitch role sync exists rather than implying one.
Under the hood Discord is three services: a singleton gateway session, a decision engine that never talks to Discord, and an acting half that owns every outbound call. The engine is sealed off from Discord entirely, and each half holds only the grants its job needs.
Status
The status surface collapses to six verticals instead of a wall of individual services. Each vertical is judged by the service that actually terminates it, and a degraded verdict now travels on the wire, so a partially healthy piece reads as degraded rather than down.
Beta as a premium perk
Early access is listed on pricing as a premium perk. Modules still in beta — AutoMod and the Discord companion among them — stay with premium channels until they ship, gated by a single beta flag on the module rather than per-feature checks.
Fixes and hardening
- Song requests: Spotify's deprecated artist top-tracks route is handled, and rate limiting now respects Retry-After.
- The MCSR board reports draws, so wins plus losses match the match count again, and account matching is ASCII-only once more.
- Dashboard data ownership and delegation got a security pass.
- Three data-integrity holes in the projection settings hash are closed, and the cleared-config write is atomic.
- gossip bounds Retry-After and scopes its pin to throttles.
- Hot-path re-parses and linear scans are gone from the command path.
Platform
KEDA is back as plain manifests, running highly available with its NATS grant scoped to the operator. The messaging tier runs stock NATS 2.14.6 across hubs and leaves after the patched-server experiment was measured and dropped, and the publish queue is bounded with the commit wait exposed as a knob.
Console fixes in this build
Discord was rendering twice: a tile in the modules grid and its own sidebar entry, reading as two features that share a name. It is now one section, with Discord's official mark, its own locked panel explaining the beta, and even spacing between blocks.
The Beta chip was small enough to miss. It is now filled, larger, and reads Beta · Premium, so it answers "why can I not turn this on" without a click.
The billing plan comparison was showing a raw billing.premiumFeat5 key instead of the early-access perk. Fixing it turned up 24 more missing strings across Song Requests, Quotes and Import, all rendering raw keys — every one now written in English and French. A new guard scans every translation call and fails the build on a key with no string behind it, which nothing did before: the generated key type looks like it enforces this, but the lookup takes a plain string and quietly falls back to printing the key.
v0.1.4-beta — New Dashboard, Chat-Side Producers & Nightbot Imports
The dashboard got rebuilt around live stream panels, a ranked command deck and per-section rails. Lead mods run the whole stream from chat, the import wizard speaks Nightbot, and the song queue drives the real Spotify player instead of its own list.
Highlights
- Dashboard redesign (#736, #737, #740, #742, #747, #748, #759, #760): overview opens on live stream panels, commands rank into a deck, settings and modules each get their own rail, the topbar adapts to narrow screens and the user switcher lives in the rail foot
- Stream editor from chat (#731): lead mods set title, category, tags, ads and markers by command; Twitch login now asks for the grants those Helix calls need
- Nightbot import (#749, #762): Nightbot as a config-import source, now connecting over OAuth, with legal slugs for synthesized fetch definitions
- Song queue (#719, #721): requests drive the real Spotify player with per-tier quotas, positions reconcile with what is actually playing,
!srlistand a queue panel - Automod (#733): strict static thresholds are honored
- Web & edge (#750, #751, #755, #756, #757): performance pass, custom cursor, stats odometer stays in its tile, per-host robots.txt and real sitemaps, and Cloudflare cache rules no longer assume first-match
- Console fixes (#761): the sidebar entry reads Commands again in both locales, the settings identity avatar animates, and the overview's live panels keep their SSE feed
Go services run the single build main-1788224508-1f3688f9b8be; the consoles run main-1788253134-35adb77fd4ee (dashboard) and main-1788251013-00d2654a3778 (admin).
Changelog: https://itsbagelbot.com/changelog
v0.1.3-beta — BYO Spotify Apps & Modules Directory
Each broadcaster registers their own Spotify app and connects against it, and !current reads the live player instead of the queue. The modules page is a searchable directory, Add to Twitch jumps straight into dashboard OAuth, and marketing cards match the header orbs.
Highlights
- Spotify (#710): broadcaster-owned apps, sealed client secret custody, live
!current/!song/!np - Modules directory (#707): searchable index with category rail; gamble/duel stay nested under Loyalty
- Add to Twitch (#709): marketing CTAs hop through dashboard OAuth with no
/logininterstitial - Web (#711, #712): cards match header orbs; encryption geometry stays on the init turn
Changelog: https://itsbagelbot.com/changelog
v0.1.2-beta — Loyalty Leaderboards & Song Requests
Loyalty gains a per-channel leaderboard page, granular moderator grants, and viewer-to-viewer point transfers. Song requests get their own console page alongside standalone !song and !skip. AutoMod adds a dynamic link-safety checker and an opt-in clips-only filter, and the console boots faster behind a rebuilt login.
Highlights
- Loyalty (#696): per-channel leaderboard page, granular mod grants, viewer transfers
- Song Requests (#700, #702): console page layout, standalone
!song/!skip - AutoMod (#690, #699): dynamic link-safety checker, opt-in Twitch clips-only filter
- Console (#694, #692, #682, #688): data sources in the command editor, faster boot, AutoMod/Song Requests surfaced, catalog/nav single sources of truth
- Web / login (#691, #698): editorial hero, starfield, rebuilt console login
v0.1.1-beta
New systems:
- Valorant: Added a chat module featuring rank, matches, leaderboard, account, and shop commands.
- Spotify: Added a Song Requests (!sr) system with live requests, secure token custody, and music provider support.
- Clash Royale: Introduced an end-to-end provider for complete Clash Royale integrations.
- BETA - Automod: Added new moderation layers, including learned false-positive protections, juror corrections, and reputation-based cohorts.
Security fixes:
- Included red-team follow-ups, module authorization hardening, dependency patches, and CSRF/CSP fixes.
Beta Launch
Beta launch as of 2026-08-14, 3:54 AM
What's Changed
- feat(notifications): add notifications service + admin/dashboard UI by @AdamOusmer in #143
- feat(web): credit Hypixel API account in notice by @AdamOusmer in #505
- chore: retire node2/node3/worker1 and co-locate CP operators on node1 by @AdamOusmer in #504
- feat(ansible): move the pod mesh onto the private VLAN by @AdamOusmer in #506
- feat(keda): reach NATS by tailnet name so node1 needs no subnet route by @AdamOusmer in #507
- fix(coredns): resolve MagicDNS names so KEDA can reach NATS off the pod network by @AdamOusmer in #508
- feat(net): retire the VLAN subnet route; node1 rides WireGuard roaming by @AdamOusmer in #509
- fix(registry): add the mandatory uploadpurging dryrun key by @AdamOusmer in #510
- fix(gateway): pace urchin bucket, split 429 origins by @AdamOusmer in #511
- fix(registry): probe /debug/health, not the debug listener's 404 root by @AdamOusmer in #512
- chore(deps): update container images by @renovate[bot] in #502
- chore(deps): pin dependencies by @renovate[bot] in #501
- feat(deploy): move NATS and Valkey to hostNetwork by @AdamOusmer in #514
- fix(nats): suppress hub route gossip under hostNetwork by @AdamOusmer in #515
- fix(dns): enforce node-local kube-dns with internalTrafficPolicy by @AdamOusmer in #516
- fix: survive OCI MySQL endpoint CA rotation by @AdamOusmer in #517
- fix(alerts): dedupe follow alerts over a 72h window by @AdamOusmer in #520
- chore(deploy): retire the mysql-ca-sync CronJob by @AdamOusmer in #521
- fix(console): fix memory leak in SSE endpoint by @AdamOusmer in #525
- deploy: enforce DoNotSchedule spread, reduce sesame/outgress to 3 by @AdamOusmer in #526
- chore(deps): update container images by @renovate[bot] in #522
- chore(deps): update elixir dependencies by @renovate[bot] in #523
- fix(ingress): stop NatsFailback from recycling healthy local NATS connections by @AdamOusmer in #527
- fix(sesame): make alloc ceiling race-detector-aware by @AdamOusmer in #532
- fix(deploy): topology spread and restore sesame engine allocations fix by @AdamOusmer in #533
- chore(deps): update dependency @types/node to v26 by @renovate[bot] in #531
- fix(deps): update go dependencies by @renovate[bot] in #529
- fix(deps): update bun dependencies by @renovate[bot] in #530
- chore(deps): update elixir dependencies by @renovate[bot] in #528
- fix(bus): retry stream provisioning during initial startup quorum elections by @AdamOusmer in #534
- perf(gateway): zero-alloc fortnite stats parser and overlapped resolution by @AdamOusmer in #535
Full Changelog: v0.1.0-alpha...v0.1.0-beta
Alpha Release
Alpha Release from June
Full Changelog: https://github.com/AdamOusmer/ItsBagelBot/commits/v0.1.0-alpha