Repository navigation
v0.2.0-beta — Command Templates, One Design System & a Rebuilt Admin Console
Pre-releaseCustom commands stop being static text and become a small language, the whole product moves onto one shared design system, and the admin console is rebuilt on it.
Commands
Templates are lexed into tokens with a scope chain and a fallback pipe, so a token that has no answer degrades instead of breaking the message.
- Identity and positional arguments, with documented fallbacks.
- Viewer facts: followage, account age, loyalty points.
- Stream facts: uptime, title, game, viewer count, chatter count, random chatter.
- Channel data: read-only counters, quotes, local time, now playing.
- Emote list and random emote.
- Per-command usage count.
- Utilities: math, URL escaping, repeat, countdown.
- A conditional
iftoken. - The console editor reads the same lexer the server does, so the preview and the live message agree.
Design system
The web surfaces moved into one web/ workspace, @bagel/shared became @bagel/kit, and the presentational layer was extracted into a standalone @bagel/ui consumed by the marketing site, the dashboard and the admin console.
- One
@font-faceset and one token set across all three surfaces. - Shared button and card contracts, fields, toggles, badges, navigation links, nav, footer and the console shell.
- Shared motion primitives: cursor, mote field, reveal, copy flash, tags, orbs and the accessibility floor.
- The dashboard mocks in the guides are now built from the real elements, so a guide screenshot cannot drift from the product.
Admin console
- Overview, users, staff and the operations pages rebuilt on the shared deck and inspector.
- Mounted on the shared rail, nav registry and i18n; fully translated.
- The admin role ladder is enforced server-side.
Imports and lookups
- Config import routes through a strategy registry.
- Fossabot and Wizebot custom command imports.
- Streamers can restrict stat lookups to their linked account.
Discord
- The gateway keeps sessions resumable across reconnects and detects a missed heartbeat acknowledgement.
- Close reason and session mode are logged when a socket ends.
- The connect budget window is merged across restarts rather than replaced.
- A first install no longer trips over an unbound config read.
- Chat-banned bots are told apart from revoked grants.
- Embed colours parse at their real 24-bit width.
Performance and data
UserStatscollapses into one aggregate query.- The database pool jitters connection lifetime and keeps a warm floor alive.
- The connection gate is taken per flush chunk, raised to 16 on loyalty and users, and its wait and connect time are reported to New Relic.
Fixes
- Reserved loyalty stats counters are hidden and guarded.
- Dashboard ghost sessions clear on
not_foundonly. - The outgress token sweep stops retrying dead grants.
- Live version TTL reads the right script argument.
- Every data-tier refusal answers with a code, on one shared vocabulary.
Housekeeping
A large deduplication sweep landed underneath all of this: one service boot lifecycle, one RPC wiring, shared Valkey lock and claim primitives, shared console action/format/load/mutate helpers, one guide skeleton per locale, and rate limiting gated on the transport instead of on every method.