New Features
- mark bot restarts in the shard history and skip their warm-up (#48) (b1b161c)
New Features
- refresh linked profiles on demand (#47) (86b8c86)
Bug Fixes
- handle gateway latency before the first heartbeat ACK (#46) (7150056)
Bug Fixes
- offer Premium in /premium only to members who do not have it (#45) (78d551c)
New Features
- leave the owner's servers out of the supporters list (#42) (47acdfc)
Bug Fixes
- keep the premium start date when the owner relabels a target (#43) (a5d3f79)
- name the repo when a GitHub releases fetch fails (#41) (b6b2af2)
New Features
- expose each supporter's premium type (#40) (62d7f69)
Bug Fixes
- align competitive divisions with the OverFast ladder (ecb8e62)
- run CI on nightly instead of the nonexistent next branch (2b51664)
- raise cryptography and lxml ceilings to clear remaining advisories (57f762b)
- upgrade dependencies to clear 32 security advisories (0d2a8bb)
New Features
- record when premium started and when it renews (5a6eedb)
- track subscription renewals and cancellations (6ad01d0)
- reconcile premium state with Discord entitlements (37ca4b4)
Bug Fixes
- mount the migrations directory for the upgrade container (abf15c6)
- resolve premium renewal dates per subscription (9378cb8)
- clear stale loading card when a deferred command errors (4d2eaf0)
New Features
- exclude private profiles from name-based linking and explain public requirement (3e1b3de)
- add open queue role icon and rank coverage (bb5d986)
New Features
- dockerize bot and migrate CI/CD from Supervisor to Docker (7370ca0)
Bug Fixes
- ensure db upgrade uses configured database uri (8199bb3)
- prevent repeated re-sending of overwatch news (eddf5fa)
- restore asyncio import removed during pygit2 cleanup (eaf5d4b)
Bug Fixes
- update terms and privacy URL paths (bb64dc5)
New Features
- add shard history endpoint for latency trends (6902f0a)
Bug Fixes
- only count true failures in command success rate (0eec3d7)
- use type 2 subscription SKUs for test entitlements (d399971)
New Features
- add loading text indicator in StatsView (665121c)
- add observability stack with Grafana, Loki, and Promtail (7408855)
- add GitHub releases and beta changelog API endpoints (636c6e7)
- expose bot creation date in stats endpoint (ea960b2)
- track user-install context in commands and interactions (af827a9)
- add API timeout retry flow for stats commands (6b08b7d)
- add shard snapshot telemetry (b8642e3)
- track command execution duration (183720a)
- add guild-scoped esports channel and subscriptions (65ba16e)
- improve esports team subscription UX (c1ab754)
- add rank display and filtering to LFG listings (345004d)
- cycle bot presence through multiple activities (34c5312)
- add endorsement level emoji icons (c402cb5)
- add team nickname and esports notification tracking (61a7330)
- add notification delivery tracking for news (15c2d1f)
- add profile switching to stats view (4c3b5bf)
- add premium event history API and starts_at tracking (635e759)
- expose subscription dates and cancellation info in premium status (63580a3)
- enhance esports subscriptions with team metadata and dashboard API (d5852ea)
- add personal newsboard slots and premium gating (70794e4)
- add migrations for newsboard source, esports teams, and guild tracking (3f0d390)
- add purge-emojis CLI command (5175a79)
- show loading view during async operations (6c394c0)
- refresh app emoji icons and replace link/plus with log_out (9600f43)
- improve live matches display and subscription notifications (49ad7bc)
- improve esports round scores and role display (f4cd544)
- add period filtering and user rank to trivia leaderboard (cc3722f)
- enhance esports match details and add subscription prompt (ce3d925)
- add View Stats and Compare Stats context menus (17224df)
- add premium-aware dynamic cooldowns (eec07ac)
- unify esports into tabbed championship view (ecd30f6)
- unify stats subcommands into a single tabbed view (a6072e2)
- add championship filter and pagination to results command (66937b1)
- add hero selection to career stats view (e8cc030)
- support blizzard_id disambiguation in profile linking (072340e)
- add 6 new trivia question categories (5b4ee2a)
- add in-memory TTL response cache to OverFast API client (df368ea)
- manage premium role on entitlement and member join (834930a)
- add hit/miss tracking to ExpiringCache (f69c0b5)
- rewrite standings as interactive StandingsView with lazy loading (d67f5f7)
- add message_view helpers and remove cooldown refresh (7acc09f)
- rewrite dashboard sessions and harden API layer (55d9761)
- add interactions tab to analytics dashboard (48fa253)
- track component interactions across all cogs (eb85783)
- add interaction tracking infrastructure (69a63e0)
- update player data on stats fetch (c0e6724)
- add unlink confirmation and inline OAuth result handling (9b284c3)
- add pending links future for OAuth callback communication (6db71f7)
- add player identity table and service (e8410af)
- redesign profile list with per-profile pages and inline actions (6b18b20)
- add player search endpoint and pre-resolved profile linking (319b66c)
- add avatar, namecard, and title columns to profile (2ce536f)
- replace static meta view with interactive MetaView (4155ecd)
- show bot creation date in info command (b6171dc)
- redesign hero meta views with progress bars (ffb5313)
- add progress bar emojis and helper method (23780d5)
- consolidate /profile link into single /profile command (5854f8d)
- register search application emoji (9d46931)
- show season peak ranks in competitive stats (436ff0c)
- register faceit_points application emoji (111c1e3)
- add hint text to loading view (9580a9f)
- prefer exact name match in player search results (dc48186)
- add upcoming tournaments command (aa5b0f9)
- add hero portrait emojis to meta and stats views (1f5addc)
- store distributed news articles in DB (f6b0f7f)
- remember and apply preferred platform selection (2c60bde)
- track error messages in command analytics (7d3e949)
- replace info subcommands with unified /info browser (4f29064)
- add rounds column and update_match_rounds to EsportsService (6976b86)
- show warning when profile is not found on Blizzard's systems (5d68635)
- add go-to-page modal for paginated views (119f234)
- improve profile list buttons with emojis and refresh (eda9fc6)
- add plus icon asset and download script (0997d8a)
- add security headers and improve CORS middleware (f28676d)
- add separate rate limiting for trivia routes (855a0bc)
- add session indicator cookie (ff6b7c4)
- add web trivia API endpoints (76c2b96)
- add cooldown system to random command (cc8db81)
- add inline profile linking to profile list view (4df4ec5)
- add newsboard and channels dashboard endpoints (dfa1b2b)
- add player_id backfill mode to verify_profiles script (3ec1ce3)
- add player_id columns to profile and stats tables (e82bbc4)
- add premium application emoji to help command (e1d5c56)
- add comparison arrows to stats and per-platform compare (651fa83)
- add platform parameter to summary fetch (a8eee69)
- register arrow and action app emojis (9cbc226)
- relax LFG to accept any linked profile (afe39ba)
- add stale profile detection and auto-removal (571e5cf)
- apply BattletagTransformer to stats commands (5770c92)
- verify battletag exists before linking or updating (ae567fa)
- expose stat_namecard in profile query and API response (de42462)
- add guild-aware premium to dashboard routes (1142ae7)
- integrate token manager and harden API middleware (2d152d5)
- add encrypted Discord OAuth token persistence (723162e)
- improve API middleware and OAuth redirect for dashboard (e8c6e1b)
- support guild-aware profile limits in dashboard (caa9059)
- add web-origin OAuth verification flow (c0a3211)
- add guilds endpoint and persist Discord OAuth tokens (e1dd210)
- add web dashboard with Discord OAuth2 auth (179c688)
- add season select menu for ratings view (7df5302)
- add OverFast API attribution to bot info (c1e0d6e)
- validate OAuth settings coherence (d70dfd5)
- add color preset autocomplete and ephemeral responses (54d454a)
- add is_closed field to shard stats (735e477)
- show loading state during profile selection (011bf1b)
- add Battle.net verified profile indicator (44076b1)
- add env emoji to about/webhook and make about work in DMs (4daa39d)
- add confirmation checkbox to profile unlink modal (5362993)
- add group selection to LFG leave and simplify listings (774b665)
- refactor event logging and add shard lifecycle events (22a961d)
- freeze interactive views on timeout instead of deleting (01951bb)
- add error handling and nullable team IDs for esports matches (7b67936)
- persist esports match results (393f1de)
- add stats snapshots and background tasks (ba2b859)
- wrap newsboard setup in container (9ff4051)
- add terms and privacy links to about command (40cba62)
- enrich profile list with stats metadata (c42aa8b)
- enforce verified profiles in LFG (083659c)
- add verified profile check (76ec13f)
- add subscription management view to esports notify command (9cbfeaf)
- add release CLI command (b327306)
- rewrite esports cog with interactive match and player views (bc9a4cb)
- add FACEIT API methods for search, history, and championships (3b0f377)
- add version bump CLI command (32ad218)
- add news article excerpts and improve news display (72a376a)
- add SKIP_SYNC env var and sync logging (9ee493a)
- enhance stats with rank emojis and compare autocomplete (e4594ec)
- add rank emoji cache for competitive ratings (e0a28af)
- add trivia answer tracking and stats reset (7def1e0)
- add season history to competitive ratings (4f4f0ed)
- add cog file watcher for dev mode (cd9805e)
- redesign help command with pagination and navigation (cd44a50)
- add cog display names and expose in commands API (a712957)
- add analytics top owner command (fa317e0)
- add test entitlement management commands (97a2df4)
- enrich supporters endpoint with subscription metadata (749663b)
- consolidate OAuth and tasks cogs into unified API cog (5bac2f9)
- display first command timestamp in about and stats (5272cea)
- add schema cleanup migration (282682e)
- add GitHub Actions CI/CD workflows (6811dae)
- make OAuth server bind host configurable (104d64a)
- add Battle.net OAuth profile verification (41bd75b)
- add /random meme command (162f55d)
- add one-off script to verify and prune stale profiles (d3bedbc)
- add migration to clean up and constrain profile battletags (d631e81)
- validate battletag format on link and update commands (8c537c9)
- support author icons and title URLs in paginator layout (0e62c98)
- add match detail buttons to esports schedule and results (3d1a2aa)
- remove /info status command (ff30194)
- overhaul owner cog with analytics and premium subgroups (1384e5e)
- rewrite help command with interactive category browser (bfb7c61)
- add OWCS esports integration via FACEIT API (1f676d1)
- add hero background image and stadium powers (40f859e)
- add LFG (looking for group) system (4ca28dc)
- add profile compare command (4c7ce84)
- add premium type distinction (legacy vs subscription) (616593e)
- add health diagnostics command (dad5618)
- log premium subscription events (20e0edc)
- soft-delete servers instead of hard-deleting (8bc4a4c)
- track error types in command logging (31ee6d6)
- track member activity timestamps (daed3d2)
- add V8 database migration (e9c91dd)
- add hero meta command with pick and win rate stats (5ab62d2)
- add page counter to paginator (150d850)
- migrate views to Components v2 layout (b8ebcc6)
- track per-question trivia statistics (f1a0d90)
- persist summary data alongside player stats (eee166b)
- track failed command invocations (e1fa1a2)
- migrate trivia questions from JSON file to database (2a41522)
- handle 429, 502, 503 API response codes (b8ff528)
- configure allowed contexts and install types (d147220)
Bug Fixes
- evict stale command start times in refresh_caches (e085526)
- drop batch records after consecutive insert failures (7e9bcb5)
- cap shared guild cache at 2048 entries (cdd8531)
- clean up pending OAuth link on timeout (3c96530)
- mark trivia token as used before processing answer (fe1a761)
- guard against missing "offense" key in emoji assets (f26f4b8)
- include battletag in OAuth callback error responses (74f978f)
- re-send view on cooldown to reset button states (150efe7)
- guard guild.me access against None in dashboard routes (d8e79a3)
- narrow JSON parse exception to ValueError in dashboard routes (3fcadf7)
- skip heroes and categories with empty stat data (c69d1ea)
- sort stat keys consistently when comparing with counterpart (382426f)
- return loading state instead of 503 for guilds endpoint (20e3e32)
- cap command/interaction batch requeue size (e7393f7)
- address inspection findings and add resolve_player tests (ed8cf2e)
- prevent data loss in command/interaction bulk insert (bf31e5a)
- rename OAuth profile route to match frontend endpoint (ad5b55b)
- use SameSite=None for cookies in cross-origin deployments (fd31bf5)
- cap rate limiter tracked IPs to prevent unbounded memory growth (c2edc61)
- redact secrets and sensitive params from error logs (94d8e80)
- fall back to profile fields when stat fields are null (fe16770)
- handle errors gracefully in MetaView (6ad2ccc)
- fallback to player table columns for profile avatar/namecard/title (f59b25d)
- use EXCLUDED in player upsert COALESCE (b2e3f68)
- register retry mocks for all attempts in overfast tests (1533829)
- strip discriminator before exact match comparison (138a086)
- add static.playoverwatch.com to allowed emoji hosts (ba10b9e)
- unquote blizzard_id in player search results (1a8178f)
- decode pre-encoded player_id values in profile table (2985d54)
- update region values and remove map filter from meta command (a061c81)
- sync commands to test guild in non-dev environments (b2d0017)
- add PATH export and remove verbose flag in deploy workflow (e9aa36a)
- move OverBot import after env var setup in test conftest (d8b5e2c)
- use separate deploy user secrets for beta and production (eda1d5e)
- enforce permission checks on guild dashboard routes (663da4f)
- handle empty X-Forwarded-For header safely (b0078fa)
- correct deploy directories for beta and production (0f5996f)
- update stale test assertions to match current exception messages (2b97991)
- handle non-JSON responses in OverFast client (1a59ffe)
- resolve premium unlock button race condition (6d332fc)
- restrict premium unlock button to invoking user (5c23535)
- improve user-facing error messages (33218e3)
- use null-safe dict access for API response data (436974c)
- validate battletag and use case-insensitive duplicate check (b4f7802)
- case-insensitive battletag matching in OAuth callback (03cb6bf)
- clear loading message content when replacing with view (7cbaae1)
- return user_id as string in auth/me response (6a87cd5)
- add migration gap detection (239836e)
- add response size limits to news scraper (412031d)
- cast interval parameter in stats snapshot query (b50999f)
- prevent KeyError on embed color reset (3208ea7)
- move LFG deactivation inside transaction (6065cfb)
- improve user-facing messages across commands (7abc383)
- improve overwatch command UX and remove newsboard restriction (1412d48)
- replace Tailscale ping gate with ssh-keyscan retry loop (060a175)
- accept DERP relay as successful Tailscale route check (42e25b6)
- wait for Tailscale route before ssh-keyscan in deploy workflow (314d260)
- improve snapshot error handling and add rate limiting (1092e25)
- move usage stats command to top-level group (85f01dd)
- add defensive data access in Profile service (723062a)
- harden external API clients (e208294)
- improve error handling and sanitize user input (1985da5)
- enforce ownership on profile mutations (89d1041)
- check cache before DB write on embed color reset (c9a2889)
- prevent race condition in LFG join with transaction (914536a)
- add null-safety guards and correct profile limit check (dc26701)
- harden bot startup tasks and shutdown sequence (7247f5e)
- patch faceit_api_key in test client factory (5132c03)
- use correct FACEIT leaderboard API for standings and stats (de63887)
- tests (baa81f1)
- await async build_news_view in owner news command (70ec055)
- sort supporters by subscription date descending (d92d054)
- wrap hero info default view in Container (d32768d)
- remove SQL string interpolation in premium commands (d33e174)
- rename caller job keys to avoid repetitive GitHub Actions display (f83ab0f)
- use sudo for supervisorctl in deploy workflow (47f8b78)
- log response body before raising on token exchange failure (e3b933b)
- escape LIKE pattern in V12 migration (23cf496)
- improve error handling for expired interactions and handler detection (9a470d1)
- only send online log on first ready event (7740ced)
- resolve N+1 query in /trivia best with asyncio.gather (1149774)
- correct news ID extraction and harden news broadcast task (06e9a6b)
- disable powers button when stadium powers data is missing (2132977)
- unpack value from ExpiringCache tuple in getitem (6628381)
- handle missing time_played in most played hero lookup (ef1dac8)
- flush command batch on shutdown (3de4444)
- add missing command parameter to app_command_completion listener (25c2bdb)
- add type annotation for Commands cog reference (8cfa670)
- exclude venv and cache directories from SLOC count (128c103)
- target root logger for handler cleanup (71991ed)
- handle request timeout in OverFast API client (88739c8)
- strip timezone from interaction created_at (f0475d2)
- include exc_info in command batch insert error log (58e1dfb)
- handle private API request failures gracefully (f39c1a8)
- handle missing guild icon in usage embed (11c1d25)
- assign view.message from interaction response (ca74c12)
- start enumerate indices at 1 in stats commands (5cdaf3c)
- correct typos and misspellings (49eec2f)
- resolve SecretStr in database URI property (fde886d)
- use append mode for log rotation and close migration connection (8426122)
- skip stats posting when API URL is not configured (eebbd18)
- handle pg_dump subprocess errors (b1fdb36)
- use correct interaction timestamp for command logging (aa2032a)
- improve hero name formatting in stats display (47540ea)
- remove premium from cache on entitlement deletion (b69ef76)
- correct null handling and data access in Profile (247a03e)
Performance
- batch-evict rate limit store entries (4adfc79)
- reduce database connection pool size (0028142)
- increase connection pool and cache limits (7725c3e)
- increase connection pool and per-host limits (7e37b06)
- increase connection pool limits (fe2ea52)
- batch LFG member count queries (44c3f15)
- batch member count query in LFG expiry check (a3b389c)
- optimize bot startup with connection tuning and parallel caching (7022d79)
- parallelize API cache refresh with asyncio.gather (49f0138)
- parallelize profile and summary data fetching (a6b5a77)
- parallelize command usage DB queries with asyncio.gather (a8ba99b)
- optimize command tracking with COPY and in-memory count (4541c54)
- add database indexes for query performance (15a3b5b)
- load trivia questions at init and prefer cached user lookup (8648bdf)
- use executemany for bulk command inserts (4f6e5ee)
- cache normalized battletag and update account API URL (a165f4e)