## lichess-org/mobile — v0.28.4…v0.29.1

_139 commits._

### Features
- **Add wakelock to learn and practice** (67bc2d9)
- **Generate new lila translations** (6af5bed)
- **New Crowdin lila sources and translations (#3772)** (caa9ebb)
- **Generate new translations** (8bccb43)
- **New Crowdin translations by GitHub Action (#3773)** (35d6baa)
- **Add date range selection to opening explorer (#3764)** (b6bc9d5)
- **Add more missing translations** (e57fcb4)
- **Gen new translations** (103d518)
- **New Crowdin lila sources and translations (#3752)** (d603ebc)
- **New Crowdin translations by GitHub Action (#3751)** (8aee083)
- **Address review: fill empty l10n comments, add maxLength hints** (658f4c5)
- **Use new mobile translations for hardcoded UI strings** (39f598c)
- **Add missing mobile translation source strings** (9210c16)
- **New translations** (18b3ae4)
- **New Crowdin translations by GitHub Action (#3685)** (1ab1d9a)
- **New Crowdin translations by GitHub Action (#3703)** (9022cbf)
- **feat: button to add PGN to study in analysis screen (#3698)** (320c6a2)
- **feat: add button to create a new study (#3533)** (17d7a3c)

### Fixes
- **Fix test** (52bacac)
- **fix: dismiss promotion selector on analysis board navigation (#3777)** (c4fc04c)
- **Fix label** (e560403)
- **fix: keep perf stats title within app bar bounds on long translations** (1c5a323)
- **Fix retro refusal test to match the server text the view now shows** (bbef941)
- **fix engine button popup bug (#3696)** (00bcfd8)
- **fix: blink next mistake button in retro review (#2953) (#3759)** (fd4b528)
- **Merge branch 'slick-daddy-fix/auth-code-post-body'** (bd198b2)
- **fix(analysis): show why a server analysis was refused** (0878778)
- **fix(analysis): report why an analysis request was refused** (39a33f7)
- **Merge branch 'main' into fix/auth-code-post-body** (49a42b4)
- **fix: await openings database cleanup (#3736)** (498ce10)
- **fix: sync swipe unfollow following list (#3734)** (7ccd429)
- **Fix formatting** (ab9db95)
- **fix(analysis): keep the retro screen usable when analysis is refused** (c852776)
- **fix(analysis): keep listening only when this game's analysis exists** (eb6ef62)
- **fix(analysis): disambiguate server analysis request refusals** (439a7ff)
- **Revert "fix: sync swipe unfollow following list"** (086b773)
- **fix: sync swipe unfollow following list** (769288c)
- **fix: refresh following list after unfollow from profile (#3720)** (56eddc2)
- **fix(app-links): use exact host check in onLinkifyOpen (#3725)** (60309eb)
- **fix: guard controller entry points against state without value (#3730)** (b87e54c)
- **fix(engine): compare Maia weight file claims by URI, not path (#3723)** (7fc986d)
- **Fix: Remove perfShortChess960 from mobile.xml and ensure hardcoded fallbacks in engine_settings_screen.dart** (80eb055)
- **Fix test** (04fa8c3)
- **fix-custom-background-selection (#3701)** (a26cb32)

### Backend
- **Bump version** (c65c31f)
- **Remove confirmation dialog before exiting streak screen** (420c784)
- **Persist time controls (#3774)** (70bf282)
- **Only rebuild app theme on theme-relevant preference changes (#3767)** (a884a72)
- **remove unused ignores (#3776)** (25c3641)
- **Update fastlane** (f7f71d1)
- **Merge branch 'slick-daddy-todo-2'** (9f06be1)
- **Simplify code and tests** (a4c081b)
- **Merge branch 'main' into todo-2** (6910f6e)
- **Upgrade more dependencies** (36cf034)
- **Bump version** (b1d872c)
- **Upgrade dependencies** (ed565ce)
- **Merge branch 'raylillywhite-claude/ios-ui-layout-jumping-yd246n'** (02a723a)
- **Use a constant** (0483c82)
- **Wait for both providers in AccountPerfCards with a record switch** (4716806)
- **Lay out shimmer skeletons at full size on their first frame** (4537c8b)
- **Keep home sections at a stable height while their data loads** (9e51a6b)
- **Merge branch 'jkartiwa-fm/lichess-stats-title-align'** (d511b46)
- **Remove test** (154484a)
- **no-mistakes(document): No documentation or lint changes needed** (eb77f29)
- **Merge remote-tracking branch 'fork/main' into todo-2** (e499c0c)
- **Show server refusal text instead of hardcoded enum messages** (55ac05a)
- **Trim verbose comments flagged in review** (e84e557)
- **Learn section tweaks** (64866f1)
- **Remove unrequired abiFilters in build.gradle.kts because Flutter (#3750)** (ed3dbea)
- **remove comment** (36e8e59)
- **Remove tests for ServerAnalysisRequestException** (5263bd1)
- **Make it easier to find saved themes when offline (#3756)** (f6a6435)
- **Translate practice** (656d59e)
- **Update chessground** (54f7eee)
- **Include practice translations** (5f5f2d3)
- **Update package sources with published versions** (db80c5a)
- **Upgrade dependencies** (1ead785)
- **Bump rubyzip from 2.4.1 to 3.4.0 in /ios (#3745)** (44b341d)
- **Bump rubyzip from 2.4.1 to 3.4.0 in /android (#3760)** (2c45d97)
- **Persist friend sort (#3733)** (37ddbff)
- **Bump the ci-dependencies group across 1 directory with 2 updates (#3707)** (966d55c)
- **Bump protobufjs from 7.6.0 to 7.6.6 in /scripts/firebase (#3709)** (989364b)
- **Remove comments** (f2f7595)
- **oops** (217c8d6)
- **remove comment** (c85b749)
- **Remove comment on server analysis timeout** (5e6ecc4)
- **Move Speed, Perf and Variant icons out of the model layer (#3739)** (8f94080)
- **Merge branch 'slick-daddy-i18n'** (c655528)
- **Remove unused translations** (2b8b15d)
- **Apply more translations** (6cac2d1)
- **Remove more unwanted translations** (0795df5)
- **Remove date range perf localizations** (cd2c205)
- **Sort translations and remove unwanted ones** (8bf1689)
- **Merge branch 'i18n' of https://github.com/slick-daddy/mobile into slick-daddy-i18n** (9ba66b0)
- **Practice feature (#3689)** (e0bbd09)
- **Send email login code request params in POST body** (214bb03)
- **Send email login code in POST body instead of query string** (a99dad8)
- **Rebase withClientCacheFor/withAggregatorCacheFor on RefExtension.cacheFor (#3727)** (bc02137)
- **grey out most of about page when offline (#3708)** (4d038b9)
- **Refactor FCM open handling and foreground display (#3732)** (b51f499)
- **Don't restart the move-expiration timer on unrelated rebuilds (#3664)** (4d9cb3c)
- **Accept FENs with illegal positions in the board editor (#3687)** (25cf0fa)
- **Log swallowed catch failures (#3726)** (c5f7a80)
- **Restore dateRangeThreeMonths and use it for the 3M range button** (9784674)
- **Use the 15 timespan and date range translations** (83309ff)
- **Use the 9 email login translations in EmailLoginScreen** (834a9f2)
- **Use settingsSettings for the home tip card button** (df10b8b)
- **Remove 11 unused mobile translation entries** (0028a4f)
- **Remove 10 unused mobile translation entries** (6a59bac)
- **Restore perfShort entries to their original state** (3e9fa48)
- **Unify duplicated NAG annotation tables (#3728)** (4d19138)
- **Clean up blank line after removing perfShortChess960** (fd2a2f0)
- **Restore mobilePerfShortChess960 from l10n (was removed in PR #3712) and update engine_settings_screen.dart to use hardcoded strings instead of removed getter methods** (aa663b2)
- **Regenerate l10n files after mobile.xml string removals** (0df050c)
- **Remove download NNUE file string from mobile.xml** (0cde939)
- **Remove 'downloadingNnueFile' string from mobile.xml** (eb355de)
- **Remove Chess960 short label from mobile translations** (e7f4b21)
- **Remove unused downloadFiles and deprecated appThemeSeed (#3721)** (e0952d5)
- **Index openings.epd for per-position lookup (#3713)** (c60a0ed)
- **Share one JSON row helper across storages (#3714)** (f8f919d)
- **Cancel the eval stream subscription of a replaced eval request (#3718)** (1a3a4dd)
- **Build Android CI targets on ubuntu instead of macOS (#3715)** (31fe0c5)
- **Remove changesWillBeLost, chess960Position, filterBroadcasts from mobile.xml** (812259f)
- **Remove dateRangeThreeMonths, deleteAllLogs, deleteConversation from mobile.xml** (3023b17)
- **Restore downloadNnueFile per rethink of r4070261365 - string is live in engine settings** (6415d0d)
- **Remove untranslatable strings per veloce review on PR 3712** (cfd2563)
- **Upgrade flutter** (1e0baf1)
- **Team updates (#3700)** (0c41bb4)
- **don't throw unnecessary Exceptions (#3702)** (426cae5)
- **migrate markdown package to material_ui (#3705)** (fbea416)
- **Implement learn feature (#3681)** (0345429)

### Tests
- **test: assert selection state instead of nonexistent keys (#3740)** (9a6c4c6)
- **test: make the phone width explicit in the title overflow regression test** (89f6a00)
- **test: exercise the actual reported perf/locale in the title overflow regression test** (33c39d1)

### Chore
- **ci: cancel superseded PR runs so only latest commit is tested (#3763)** (cd25cd5)
- **style: make the refusal pattern binding final** (3cd4771)
- **ci: improve workflow triggers and enable Flutter cache in build/deploy (#3731)** (1e66ebe)
- **refactor: move view contracts to model (#3724)** (f24cfee)
- **refactor: extract EngineToggleButton to dedup toggle guard across bottom bars (#3716)** (8ded3a6)

_Recap by [Repo Wrapped](https://repowrapped.com/gh/lichess-org/mobile?utm_source=github-action)._