What's Changed
New Installer
This release replaces the UV-based launcher introduced in 25.07 with a more standard installation process using Briefcase for packaging:
- Anki no longer shows a terminal on install/update.
- Installation no longer requires network access.
- You can install updates using Tools>Check For Updates.
- A standard MSI installer is provided for Windows.
- A native Windows ARM64 build is now available. Audio playback/recording doesn't work, but this will be fixed in the next release.
- The minimum supported Python version is now 3.10 (The official builds still ship Python 3.13).
- Anki now ships with Qt 6.11
- The Linux aarch64 build should work on glibc 2.35 or later.
FSRS/Scheduling changes
- Remove broken retention rate help link in stats by @Hannanilsenn in #4329
- Improve performance of
reviews_for_fsrsfunction by @L-M-Sherlock in #4339 - Export last_interval to Python by @user1823 in #4365
- Fix/first and latest review dates should only consider entries with a rating. by @L-M-Sherlock in #4360
- Fix/Ensure fuzz doesn't go backward during rescheduling by @user1823 in #4364
- Improve FSRS invalid parameters error message with FAQ link by @AmandaSternberg-creator in #4342
- Fix/Per deck retention not used when card is moved to filtered deck by @Luc-Mcgrady in #4413
- Restore retrievability SQL fix that was accidentally reverted by @Luc-Mcgrady in #4424
- Fix/rounded corners on FSRS Simulator modal by @Luc-Mcgrady in #4535
- Require three left-clicks to unlock FSRS parameter editing by @Luc-Mcgrady in #4372
- Fix FSRS short-term schedule being ignored when using default parameters by @L-M-Sherlock in #4412
- Use quantiles for FSRS retrievability stat ranges by @Luc-Mcgrady in #4425
- Make descending retrievability a pure R sort by @user1823 in #4400
- Don't reschedule suspended cards by @L-M-Sherlock in #4453
- Speed up FSRS memory state updates by batching calculations by @DanielPechersky in #4335
- Apply deck-specific load balancer settings to filtered deck study by @MoamenAbdelsattar in #4574
- Prioritize previously-attempted cards in the intraday learning queue by @user1823 in #4393
- Improve sibling dispersal in the load balancer, including across presets by @jakeprobst in #4640
- Rework the efficiency ratio graph in FSRS Help Me Decide by @Luc-Mcgrady in #4452
- Fix desired retention not refreshing when switching deck option presets by @barisayyildiz in #4610
- Clarify ambiguous "this value" wording in desired retention tooltip by @Expertium in #4647
- Drop QDialog argument from grade_now() to make it add-on friendly by @abdnh in #4459
Other Notable Changes
- Briefcase Installer by @andrewsanchez in #4629
- Show saved custom colours in the image-occlusion fill tool colour picker on mobile by @iamllama in #4348
- Add support for
tag:nc:...(case-insensitive) tag searches by @iamllama in #4344 - Treat newlines as term breaks in search queries by @eliasjlara in #4336
- Add syntax for multi-card cloze deletions by @tfpgh in #4333
- Remember image-occlusion translucency toggle between sessions by @dspilleb in #4366
- Fix "Restore to Default" picking the wrong template for basic notetype variants by @arold0 in #4382
- Let the "Limit to" spin box grow with its content in the filtered deck dialog by @jcznk in #4398
- Fix unescaped HTML in correct type-in answers by @Eltaurus-Lt in #4407
- Always show text boxes on image-occlusion cards during review by @jariji in #4387
- Fix FindDuplicates dialog size exceeding screen bounds by @Nechaiter in #4426
- Fall back to Apple Samantha for TTS on macOS when no requested voice matches by @leedoughty in #4420
- Allow variable field counts per row when CSV import uses a notetype column by @iamllama in #4421
- fix(Import): case-fold media filenames when checking uniqueness by @iamllama in #4435
- Keep non-breaking spaces outside cloze deletions when wrapping text by @leedoughty in #4446
- Start decoding images immediately by @SelfishPig in #4471
- Revert ForceDarkMode change that interfered with Anki's native dark theme by @GithubAnon0000 in #4483
- Apply the nightMode class to the editor in dark mode so custom HTML styles correctly by @leedoughty in #4473
- Auto-select the relevant note type in the Manage Note Types dialog after add/rename by @Arthur-Milchior in #4479
- Fix field rename by matching on the old name rather than field position by @Arthur-Milchior in #4488
- Allow horizontal scrolling on the deck options screen so AnkiDroid handles large font sizes by @defkorean in #4501
- Fix
{{#Tags}}conditional not triggering card generation by @Yuukidiv in #4533 - Silence console spam from image decoding errors during preload by @SelfishPig in #4534
- Add note type and GUID column headers to deleted.txt for easier reimport by @hnvy in #4454
- Apply Ctrl/Cmd+W window-closing shortcut globally to all dialogs by @beyondcompute in #4475
- Fix overlapping date ranges in graphs when "all history" is selected by @JMannervik in #4430
- Add a preference to disable the startup add-on update check by @SecretX33 in #4478
- Add
dir="auto"to cards so text direction no longer depends on the UI language by @MoamenAbdelsattar in #4428 - Accept images with capitalized extensions in the Browse "Attach" dialog by @miggazElquez in #4474
- Re-enable WindowsRT TTS file player on Windows 11 by @abdnh in #4512
- Fix HTML editor collapsing after toggling sticky fields and adding a note by @Yuukidiv in #4566
- Fix image occlusion editor layout for right-to-left languages by @MoamenAbdelsattar in #4594
- Speed up tag autocomplete by using the Rust backend's complete_tag() by @user1823 in #4626
- Detect cloze fields nested inside conditionals during card generation by @maskady in #4651
- Prompt to save unsaved changes when closing or switching debug console scripts by @Arthur-Milchior in #4625
- Roll back the sidebar tag name when the backend rejects a rename by @chrislongros in #4718
- Improve word wrapping on the Deck Options screen for narrow viewports by @defkorean in #4558
Developer Improvements
- The release build process is now fully automated using GitHub Actions.
- Migrate CI from BuildKite to GitHub Actions. by @andrewsanchez in #4593
- Build and publish dev docs by @andrewsanchez in #4579
- Update to Rust 1.92 by @abdnh in #4461
- Add Dependabot config with monthly grouped updates by @fernandolins in #4726
- Update PyCharm docs by @abdnh in #4389
- Update VS Code config by @abdnh in #4397
- Treat proto/i18n's implicit outputs as inputs by @iamllama in #4439
- Respect .python-version when generating pyenv by @iamllama in #4436
- Add more required packages to Linux build guide by @user1823 in #4432
- Only run cargo-deny if there are dependency changes by @abdnh in #4644
- Remove old GPG public key by @dae in #4707
- Raise dependabot open-pull-requests-limit to 3 by @fernandolins in #4746
- Add release-age controls for uv and Yarn dependencies by @fernandolins in #4761
- docs: add contributing guidelines for add-ons, linked issues, and AI-assisted PRs by @fernandolins in #4782
- Add pre-commit for automated pre-push checks by @fernandolins in #4660
- Add a standardized pull request template by @fernandolins in #4655
- Exclude BackendFrontendService from write_python_interface by @Luc-Mcgrady in #4410
- Add regression test for #1909 (media check long filenames) by @bds124 in #4476
- Update docker build command for syncserver by @CYPHER0041 in #4562
- Render GH Markdown alerts in Sphinx docs by @abdnh in #4663
- Exclude more folders from build actions by @abdnh in #4561
- Add Windows quick start guide for new contributors by @DaniSilvaCodes in #4466
- Update Windows developer docs by @user1823 in #4662
- Ignore Fluent message errors in TypeScript by @abdnh in #4494
- Wrap previewer type field syntax replacement in separate method by @DaedalusIndigo in #4563
Other Improvements
- Fix progress bar overflow crash when one-way uploads exceed 2 GB by @matbe766 in #4354
- Fix fatal error from rapidly double-clicking the Add button by @arold0 in #4377
- Use the native
crypto.randomUUID()instead of a custom UUID implementation by @leedoughty in #4384 - Credit Arabic translation contributor in the About window by @hnvy in #4720
- Tighten
Collection.add_notestype annotation so single-pass iterables aren't accepted by @jfly in #4758 - Document that
add_deckrequires refetching the deck to see its new ID by @jfly in #4760 - Set a friendly process job name for mpv on Windows by @abdnh in #4438
- Add Rust unit tests for the card-generation logic by @Yuukidiv in #4551
- Add punctuation, convert raw URLs to markdown links in READMEs by @oliolioli in #4570
- Reorder and comment .ftl files in UI order to help translators by @RolfMaster in #4514
- Show tooltips for truncated sidebar items in the Browse window by @nav1s in #4385
- Stop showing an error toast when saving an image-occlusion note twice on mobile by @iamllama in #4458
- Render
<br>as a line break in card template error messages instead of literal text by @leedoughty in #4451 - Use a true minus sign instead of a hyphen in the deck browser by @GithubAnon0000 in #4437
- Fix sync login dialog ignoring a freshly-set custom sync server URL by @ranjitodedra in #4396
- Add plural forms to unit labels next to spin boxes in the Custom Study dialog by @RolfMaster in #4520
- Don't expose collection.media.db2 over the API by @dae in #4653
- Update media sync progress dialog correctly after an error occurs in #4486
- Disable the Custom Study OK button when the selected deck is empty by @tunamayo04 in #4463
- Warn the user when renaming a profile would exceed the OS path length limit in #4552
Launcher Improvements
Note: listed for documentation/crediting purposes. Launcher builds are not provided in this release
- Add i18n to launcher by @iamllama in #4361
- Replace more strings in launcher with translations by @iamllama in #4368
- Change launcher strings to clarify installing for novices by @GithubAnon0000 in #4327
- Fix launcher strings by @user1823 in #4375
- Show launcher if different version was installed by @iamllama in #4381
- Exclude pre-release if a newer major_minor exists by @user1823 in #4388
- Apply cache settings to all uv invocations by @iamllama in #4404
- Add build dependencies and instructions for building / running the launcher by @GithubAnon0000 in #4380
- Make uv use system certstore by @iamllama in #4386
New Contributors
- @Hannanilsenn made their first contribution in #4329
- @eliasjlara made their first contribution in #4336
- @tfpgh made their first contribution in #4333
- @dspilleb made their first contribution in #4366
- @matbe766 made their first contribution in #4354
- @AmandaSternberg-creator made their first contribution in #4342
- @arold0 made their first contribution in #4377
- @nav1s made their first contribution in #4385
- @ranjitodedra made their first contribution in #4396
- @Eltaurus-Lt made their first contribution in #4407
- @jariji made their first contribution in #4387
- @Nechaiter made their first contribution in #4426
- @SelfishPig made their first contribution in #4471
- @bds124 made their first contribution in #4476
- @tunamayo04 made their first contribution in #4463
- @defkorean made their first contribution in #4501
- @RolfMaster made their first contribution in #4514
- @Yuukidiv made their first contribution in #4533
- @JMannervik made their first contribution in #4430
- @SecretX33 made their first contribution in #4478
- @DanielPechersky made their first contribution in #4335
- @MoamenAbdelsattar made their first contribution in #4428
- @DaedalusIndigo made their first contribution in #4563
- @miggazElquez made their first contribution in #4474
- @oliolioli made their first contribution in #4570
- @DaniSilvaCodes made their first contribution in #4466
- @chrislongros made their first contribution in #4668
- @CYPHER0041 made their first contribution in #4562
- @maskady made their first contribution in #4651
- @jfly made their first contribution in #4758
- @barisayyildiz made their first contribution in #4610
Full Changelog: 25.09.4...26.05b1