Skip to content

v0.2.0-beta — Command Templates, One Design System & a Rebuilt Admin Console

Pre-release
Pre-release

Choose a tag to compare

@AdamOusmer AdamOusmer released this 10 Sep 08:09
· 757 commits to main since this release
96b87b5

Custom 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 if token.
  • 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-face set 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

  • UserStats collapses 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_found only.
  • 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.