What's Changed
- fix(cli): prevent self-spawn fork bomb in which fallback by @shunkakinoki in #585
- fix(tui): align tab mouse hitboxes with rendered labels by @jeongjin0 in #573
- fix(claude): normalize anthropic model variants by @IvGolovach in #578
- fix(pricing): map opus-4-7 ids to claude-opus-4-7 instead of legacy claude-opus-4 by @xczllgit in #580
- Pricing support for composer 2.5 by @RawToast in #581
- fix(tui): use compatible colors in Apple Terminal by @IvGolovach in #577
- perf(tui): cache minutely sort order by @IvGolovach in #575
- fix(tui): preserve minutely aggregation in background loads by @xczllgit in #570
- feat(leaderboard): show search on all periods and match displayName by @leecoder in #582
- fix(pricing): require exact matches for provider-scoped models by @IvGolovach in #550
- fix(submit): reject implausible submitted totals by @IvGolovach in #557
- fix(auth): serialize device auth polling by @AsaZhou923 in #546
- feat(pricing): add custom pricing overrides by @ben-vargas in #549
- fix(claude): price inline MCP sub-provider usage by @IvGolovach in #519
- fix(gemini): detect Gemini CLI usage with configurable path and new token formats by @cantalupo555 in #540
- feat: add time period filters and URL sync to leaderboard by @leecoder in #522
- feat(trae): add Trae client support by @itling in #555
- feat(embed): add card templates with color, theme, format, and graph options by @Bae-ChangHyun in #584
- fix(cli): avoid stale PATH launcher fallback by @IvGolovach in #576
- feat(core,cli): add session and client+session group-by by @carlosflorencio in #543
- fix(submit): make usage merges device-aware by @IvGolovach in #517
- Show subscription usage in Tokscale by @shidevil in #493
- feat(cli): add 'qr' command for transferring API token to mobile apps by @eugenn in #545
- feat(models): add token timing and Claude Code stream dedupe by @PekingSpades in #563
- feat: add session time metrics (active time tracking per contribution) by @leecoder in #528
- feat(groups): add scoped leaderboards with invites by @IvGolovach in #524
- chore(followups): post-batch cleanup from 2026-05-24 review by @junhoyeo in #592
- feat(devices): add per-device read+rename APIs and fix submit_count drift by @junhoyeo in #593
- chore(db): drop dead columns + redundant indexes + unique constraint by @junhoyeo in #598
- refactor(leaderboard): fold Groups into Leaderboard view selector by @junhoyeo in #599
- chore(ui): audit pass on Leaderboard ViewSelector + GroupsBrowser by @junhoyeo in #600
- fix(cli): restore strict verification and Trae aggregation by @junhoyeo (a05496f)
- fix(groups): reject malformed invite payloads by @junhoyeo (7c443b0)
- fix(leaderboard): preserve filters and paginate groups by @junhoyeo (14c17b6)
- docs(readme): correct Trae sync and client filters by @junhoyeo (d8ede56)
- fix(leaderboard): avoid swallowing dynamic route detection by @junhoyeo (e683f62)
- docs(cli): clarify Trae credential variants by @junhoyeo (c9e051a)
- fix(leaderboard): preserve filters across view toggles by @junhoyeo (013552e)
- fix(groups): reject non-object invite payloads by @junhoyeo (6d0fe74)
- refactor(leaderboard): remove duplicate date validation by @junhoyeo (1a1efd8)
- fix(cli): write Trae sync artifacts only when referenced by @junhoyeo (8e5778d)
- ci: update coverage badge [skip ci] by @github-actions[bot] (9228a8a)
- docs(cli): document local active-time day buckets by @junhoyeo (1ac617e)
- test(frontend): add CI coverage for tests and migrations by @IvGolovach in #605
- fix(groups): enforce invite role hierarchy by @IvGolovach in #604
- fix(submit): allow consistent high-volume token reports by @IvGolovach in #602
- fix(submit): adopt legacy rows for first device submit by @IvGolovach in #609
- fix(submit): preserve same-device totals on parser regressions by @IvGolovach in #607
- fix(release): commit release provenance before npm publish by @IvGolovach in #603
- fix(cli): honor explicit home diagnostics by @IvGolovach in #606
- fix(scanner): scan Hermes profile databases from extra paths by @IvGolovach in #590
- docs: require maintainer identity for agent commits by @junhoyeo (7ce8728)
- fix(cursor): surface setup diagnostics for explicit reports by @IvGolovach in #591
- fix(submit): bypass cost-without-tokens check for Cursor legacy
premium-tool-callby @junhoyeo in #612 - fix: invite privilege escalation, submit savepoint race, leaderboard pagination drift, CSRF origin gate, CI coverage floors by @junhoyeo in #611
- fix(tui): anchor warm-cache writer and TUI reader on a shared group_by constant by @junhoyeo in #613
- fix(submit): exclude tokenless-cost rows instead of failing the whole submission by @junhoyeo (5ed5895)
- style: rustfmt wrap in tokenless-cost exclusion test by @junhoyeo (cf4b931)
- chore(release): reset manifests to 2.1.3 to re-publish 3.0.0 by @junhoyeo (70060c3)
New Contributors
- @PekingSpades made their first contribution in #563
- @eugenn made their first contribution in #545
- @shidevil made their first contribution in #493
- @carlosflorencio made their first contribution in #543
- @Bae-ChangHyun made their first contribution in #584
- @itling made their first contribution in #555
- @ben-vargas made their first contribution in #549
- @AsaZhou923 made their first contribution in #546
- @jeongjin0 made their first contribution in #573
- @shunkakinoki made their first contribution in #585
Full Changelog: v2.1.3...v3.0.0
