All notable changes to Dota Keeper will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Android Build: Test release to verify automated Android CI pipeline.
- Hero Percentile on Match Detail: The match detail page now shows your hero-specific performance percentile, letting you see at a glance how your stats rank relative to other players on that hero.
- Performance Journal: New Journal page for logging reflections and notes on your sessions, accessible from the bottom navigation.
- Skeleton Loaders: Loading skeleton placeholders are shown while match and goal data is fetching, reducing perceived load time.
- Goal History Trend: Goal detail pages now show a history trend chart to visualise your improvement over time.
- Automated Android Release: Android builds are now published automatically via CI on release.
- Last Hit Graph on Match Detail: The last-hits/denies chart is now correctly displayed on the match detail page (was previously hidden).
- Benchmark Table on Mobile: Hero benchmark comparison table now renders correctly on small screens with proper column sizing and data display.
- Mobile Match Detail Accessibility: Match detail page was unreachable on mobile; navigation has been corrected.
- Mobile Match Filter Overflow: Filter chips on the matches page no longer overflow the screen on narrow displays.
- No-Matches Refresh on First Run: App now correctly triggers a match refresh prompt when the match list is empty on first launch.
- Stratz Last Hit Minute Offset: Fixed an off-by-one error in Stratz API last-hit data that caused per-minute values to appear one minute early.
- Create Goal from Suggestion: Creating a goal directly from a suggestion card now works correctly.
- Hero Benchmarks: Compare your hero stats against bracket averages (Herald through Immortal). Shown on the hero analysis detail page with medal badges, z-scores, percentiles, and color-coded interpretation labels.
- Match Comparison: Compare any two matches side-by-side from the match detail page — pick a previous/next game on the same hero, or enter a match ID manually.
- Performance Charts: New gold/XP advantage charts on the match detail page (requires parsed replay data).
- Item Timings Comparison: Side-by-side item timing comparison when comparing two matches.
- Reparse Match: Request a replay parse from OpenDota directly from the match detail page.
- Benchmark Bracket Overlays: Toggle bracket reference lines on hero analysis charts to see where you stand relative to each rank.
- UI Readability Overhaul: Increased font sizes across the entire app to meet accessibility guidelines — 16px body text baseline, 12px minimum for labels, 24px+ for headings. All text is now significantly easier to read.
- Improved Text Contrast: Brightened
--text-mutedand--text-secondarycolors for better contrast against dark backgrounds. Removed compoundingopacityon muted text elements. - Benchmark Interpretation Labels: Tightened z-score thresholds so labels like "Above average" and "Slightly above average" align more accurately with their percentile. Interpretation text is now color-coded (green/teal for good, red for below average).
- Deaths Goal Type: New goal metric to track deaths — set a maximum death count target (e.g. "at most 4 deaths by 30 min").
- Android Bottom Nav: Buttons on the bottom navigation bar were unclickable on Android because the system navigation bar covered them. Safe area insets are now injected at multiple intervals on app start to ensure they apply after the page has loaded.
- Android Build: Resolved Gradle build failures caused by conflicting product flavor dimensions when building with
cargo tauri android dev.
- Patch Version Tracking: Dota 2 patch version (e.g., "7.40e") is now stored on each match and shown as a badge in the match list. Use Settings → Sync Patches to fetch patch data from OpenDota and back-fill existing matches.
- Patch Filter on Matches Page: Filter chips for recent major patches (e.g., "7.40") appear in the match filter bar. Selecting a major patch shows all sub-versions (7.40, 7.40b … 7.40e).
- Goal Frequency Type: Goals now have a "How often?" field — choose from Just once, On average, 50% / 75% / 90% of games. The goal detail page adapts its achievement status display accordingly. Default remains 75%.
- What's New Dialog: A "What's New" modal is shown once after each app upgrade, displaying the release notes for the installed version.
- App Version Display: App version is now shown in the top-left brand area of the sidebar.
- Performance Range Card: Stat order changed to Worst → Avg → Best (left to right).
- Clear All Matches: Now correctly clears all match-related tables (
goal_progress,player_networth,item_timings,mood_checkins) before deleting matches. Previously, orphaned records in these tables caused re-sync and re-parsing issues.
- Pull to Refresh: Pull-to-refresh gesture support on mobile.
- Tasks: Task tracking feature added.
- Android UI: Fixed buttons being overlaid by Android system UI elements.
- Canonical Names: Added canonical names for improved data consistency.
- Android Bundle ID: Changed Android application ID to
com.dotakeeper.dotakeeper(production) andcom.dotakeeper.dotakeeper_beta(beta) for Google Play Store listing. Added Android product flavors — build withbundleProductionReleaseorbundleBetaReleaseaccordingly.
- macOS / Linux builds: Bundle targets were set to
["msi"](Windows-only), causing macOS and Linux CI builds to compile successfully but produce no artifacts. Changed to"all"so each platform builds its native bundle formats (DMG/app on macOS, AppImage/deb on Linux, MSI on Windows).
- Stratz API: Alternative data source to OpenDota. If OpenDota is unavailable or rate-limited, Dota Keeper can now fetch match data via the Stratz API.
- Screenshots: In-app screenshots added to support onboarding and store listings.
- Rate Limit Handling: Improved rate limit tracking and backoff logic to avoid hitting API limits during match syncs.
- Mobile Cosmetics: Numerous visual polish improvements across the mobile layout — spacing, typography, and component alignment.
- Locales: Expanded and corrected translations; Steam ID is no longer exposed in visible UI text.
- Installer: Removed
setup.exeartifact — Windows installer is now exclusively the.msi.
- Sentry: Fixed error reporting integration that was silently failing in production builds.
PUBLIC_SENTRY_DSNis now correctly forwarded to the Vite build in all CI workflows. - Android Beta CI: Beta Android builds no longer fail with a missing package directory — the Android project is now re-initialised with the correct beta identifier before building.
- Translations: Corrected several mistranslated or missing strings in non-English locales.
- Privacy Policy: Updated privacy policy content.
- A11y: Fixed accessibility warnings in
FeedbackModal— section headings for button/radio groups changed from<label>to<p>to correctly reflect their role.
- Landing Page HTML Entities:
&was rendering literally in the "Free & Open Source" badge and Linux platform description due to HTML entities being used inside JavaScript translation strings assigned viatextContent. - Duplicate Refresh Icons: The refresh button on the Matches page showed two
↻arrows, and the dashboard refresh button showed two🔄icons. The icon was present in both the template and the translation string.
- Russian Language Support: Full Russian translation of the landing page and app UI.
- FAQ Section: Added a Frequently Asked Questions section to the landing page.
- Google Analytics: Added analytics to the landing page.
- Net Worth Goals: Net Worth goals now correctly evaluate and display match history. The backend was returning no data for this metric despite per-minute gold data being available in the database. The player's own networth at the target minute is now correctly queried from the
player_networthtable using their matchplayer_slot.
- Feedback Button: Send feedback directly from within the app without leaving. Tap the chat icon above the bottom navigation bar to report a bug, request a missing feature, or share what you like. Feedback is submitted instantly and includes the current screen, app version, and platform automatically — no extra steps needed.
- Android build format: Switched from APK to AAB (Android App Bundle) for smaller installs and better Play Store compatibility.
- Separate beta app: The beta build now installs as a distinct app (
Dota Keeper Beta) alongside the production app, so you can run both without conflict.
- Feedback Button: New persistent feedback button in the sidebar (desktop) and as a floating icon above the bottom nav (mobile). Opens a compact modal to report bugs, request features, or share what's working well. Feedback is submitted to Supabase and includes auto-captured context (current page, app version, platform).
- Android CI Build: Fixed Android build workflow — restored required
--apk truevalue and added acargo-tauriwrapper script so the Tauri CLI resolves correctly in CI.
- Background Parse: Match data is now parsed in the background, so the app remains responsive while fetching and processing new matches.
- First Run Experience: New users are guided through an onboarding flow on first launch to set up their Steam ID and initial preferences.
- Factory Reset: New option in Settings to completely reset the app — clears all data and returns to the first-run state.
- Hero Pick on Startup: Hero pool data is refreshed automatically on startup so the hero list is always up to date.
- Database Locking: Eliminated intermittent "database is locked" errors on startup by replacing per-command
Connectioncreation with a single sharedMutex<Connection>for the app lifetime. Also enabled WAL journal mode and a 5-second busy timeout as additional hardening. - Android CI Build: Fixed
tauri android build --apkargument syntax for the updated Tauri CLI. Android builds now also trigger on thebetabranch. - Bug Fixes: Various stability and correctness improvements.
- Mental Health / Mind Tab: New "Mind" section for tracking tilt and emotional state after games
- Post-game mood check-in prompt appears after matches with a mood slider and optional notes
- Tilt assessment based on recent check-in history (calm / watch yourself / tilted / on tilt)
- Full check-in history with mood trend visualisation and personalised suggestions
- Check-in frequency setting (after every game, every 3 games, or every 5 games)
- Steam Login: Authenticate via Steam OpenID directly in the app as an alternative login path
- Toast Notifications: Global toast notification system for in-app feedback messages
- OpenDota Parsing: Resolved parsing edge cases that could cause match data to be incorrectly marked as parsed
- Goal Sparklines: Fixed sparkline charts on the dashboard not rendering correctly for goals
- Custom Title Bar: Native window frame replaced with a custom in-app title bar. Includes drag-to-move, minimise, maximise/restore, and close buttons. Close button turns red on hover.
- Window Resize Handles: Invisible resize handles at all window edges and corners restore the ability to resize the window after removing native decorations.
- Goal Hero Group Filters: When creating or editing a goal, you can now scope it to "Any Hero", "Any Core (pos 1–3)", "Any Carry (pos 1)", or "Any Support (pos 4–5)" in addition to a specific hero. Goals evaluate correctly based on the detected lane role of each match.
- Role Detection: Each match now stores the detected lane role (1–5) from OpenDota parsed data, enabling role-aware goal evaluation.
- Denies Goal Metric: New goal metric to track denies at a given game minute.
- Partner Networth Goal Metric: New goal metric to track your lane partner's networth, useful for support players measuring their impact on the carry.
- Font Weight: Barlow font weights 600 and 700 are now properly loaded from Google Fonts (previously only 300–500 were included, causing browser-synthesised bold that appeared too heavy).
- Weekly Challenge UI: After completing a weekly challenge, the challenges page now correctly shows the completed challenge and its progress instead of showing the option-selection screen again.
- Hero Icons in Dropdowns: Hero selection dropdowns across Goals, Analysis, and Goal Details pages now display hero portrait icons alongside hero names for easier selection
- Item Icons: Item icons are now displayed on the Goals page and Goal Details page for item timing goals
- New Heroes: Added Kez and Lara (Largo) to the hero roster
- Default Window Size: Increased default window size to 1280x800 for a better out-of-the-box experience
- Weekly Goals Display: Fixed name and display of weekly goals on the dashboard
- Goal Distribution Enhancements: Significant improvements to the goal detail page
- Average line on histogram: dashed yellow vertical line showing your mean performance
- Achievement rate card: shows pass rate % with colour-coded status (Too Easy / Excellent / Good / Low / Critical) and a progress bar with a 75% target marker
- Warning banner: appears when recent pass rate drops below 75%, with severity levels (critical/warning/info) and a one-click "Lower to X" button to adjust the goal
- Last N games scatter chart: chronological dot chart below the histogram showing pass/fail per recent game, with hover tooltips and click-to-match navigation
- Item Timing Goal Description: Fixed incorrect description text for item timing goals
- Match Details Redesign: Enhanced match details page with improved layout and visual presentation
- Goal Details Redesign: Refreshed goal details page for better readability and user experience
- Challenges Redesign: Updated challenges page with new design and improved navigation
- UI Updates: Various user interface improvements across multiple pages
- Logout in Settings: Added logout functionality in settings page
- Enhanced Analytics: Improved PostHog tracking for better insights
- New Icons: Updated iconography throughout the application
- Contributing Guidelines: Added contribution documentation for developers
- Auto-update URLs: Fixed repository name in auto-update URLs (changed from
dota-goalstodota-keeper) - Windows installer URL: Removed incorrect
.zipextension from Windows MSI download URL
- Anonymous Analytics Tracking: Optional usage analytics via PostHog to help improve Dota Keeper
- User consent modal on first launch
- Opt-in/opt-out in Settings page
- No personal information collected
- Analytics disabled in development builds (only active in production)
- Development Build Configuration: Analytics tracking is now completely disabled in debug builds for cleaner local development
- Complete UI Redesign: New tactical dark theme with refined color palette (dark blue-grey base, gold accents, teal highlights)
- New Typography: Upgraded to Google Fonts — Rajdhani (headings), Barlow Condensed (labels/buttons), Barlow (body text)
- Redesigned Layout: 220px sidebar with streamlined navigation, new topbar with page titles and quick actions, fixed-height layout with scrollable content area
- Dashboard Overhaul: Added quick stats strip (Win Rate 7d, Avg CS @ 10min, Goals Hit 7d, Active Goals), goal cards with 7-dot hit/miss indicators, clickable goal rows
- Matches Page: Added filter chips (All/Wins/Losses/Ranked/Turbo/per-hero), mode tags, goals achievement chips, streamlined table layout
- Analysis Page: 2-column card grid layout, horizontal filters, contextual insights based on goals, decorative sparkline visualizations
- Goals Page: Inline horizontal create form, goal cards with inline Edit/Delete buttons, contextual warnings when player average exceeds goal target
- Sidebar Updates: Rank pill display at bottom, gold active state indicators, refreshed navigation icons
- Svelte 5
{@const}placement errors in analysis and matches pages
- Weekly Challenges: New Challenges page (🏆 nav item) shows three weekly challenge options (easy/medium/hard). Accept one to track progress, reroll up to twice, or skip the week. Dashboard shows active challenge progress at a glance.
- Challenge History:
/challenges/historypage lists all completed and failed challenges (daily + weekly) with filter tabs and grouped by date. - Difficulty Levels for Goal Suggestions: Settings now has an Easy/Medium/Hard/Custom difficulty selector that controls how aggressively suggestions push beyond current baseline.
- Edit Goal from Details Page: Inline edit form on the goal details page — change hero, metric, target, or game mode without leaving the page.
- Favourite Heroes in Filters: Hero dropdowns across Analysis, Goals, and goal edit forms now group favourited heroes at the top under a ⭐ Favourites section.
- View on OpenDota: Button now correctly opens the system browser (was silently failing due to incorrect import name)
- Updater permission: Auto-update check was failing with a permissions error;
updater:defaultcapability now included - Hero dropdown pre-selection in goal edit: Opening the edit form now correctly pre-selects the goal's hero
- Game mode shown in goal description: Goal details page now shows
(Ranked)/(Turbo)in the goal description - Refresh Matches error handling: OpenDota API errors now show a friendly message and fall back to displaying cached local matches
- Release workflow: sig files now correctly classified and inserted into latest.json
- Match Details View: New per-match page with hero stats, KDA, GPM/XPM, damage, and a last-hits/denies chart showing progress against goal target lines
- Daily Challenges: Personalized daily challenges generated from recent performance with a progress bar, streak counter, and dashboard widget
- Item Timing Goal Display: Goal details page now correctly shows item name and M:SS formatted times for item timing goals
- Suggested goal panel now hides automatically once the matching goal has been created
- Dev/prod database separation: dev builds (
tauri dev) usedota_keeper_dev.db; release builds usedota_keeper.db— no more risk of polluting production data during development - Fresh database crash: app no longer crashes on first launch with a new database (cleanup query was running before tables were created)
- Fixed autoupdate signature generation by enabling
createUpdaterArtifactsin bundle configuration - Fixed version placeholder substitution in release workflow (was using
v__VERSION__instead of actual version) - Enhanced release workflow debugging for better signature verification
- Fixed release workflow to handle missing signature files gracefully
- Ensured latest.json is always generated and uploaded to releases
- Fixed goal evaluation showing incorrect results for unparsed matches
- Fixed last-hit goals using inaccurate linear estimation instead of actual per-minute data
- Parse process now requires per-minute data from OpenDota before marking match as "Parsed"
- Added clear error messages when OpenDota hasn't finished parsing a match yet
- Improved release workflow signature detection for more reliable multi-platform builds
- Enhanced signature file discovery to support different platform naming conventions
- Weekly Challenges: New challenge system to track weekly improvement goals
- Goal Suggestions: Intelligent goal recommendations based on play patterns
- Hero Favourites: Mark and track favorite heroes for quick access
- Tasks System: Set and track personal Dota 2 improvement tasks
- Charting Library: Visual charts for performance metrics and trends
- Last Hit Analysis: Detailed last-hitting performance statistics
- Per-Hero Detail Pages: Dedicated pages for in-depth hero performance
- Match Backfilling: Automatic backfill of historical match data
- Real-time Events: Live updates for match data and statistics
- Clear Matches: Option to clear match history
- Auto-update System: Automatic application updates
- Analysis Range: Increased number of games that can be analyzed at once
- Font Rendering: Improved font rendering for better readability
- Documentation: Enhanced README with comprehensive usage guidelines
- Backfilling reliability issues that could cause incomplete data retrieval
- Real-time event handling stability improvements