Anki 25.08 Beta 3+

Version ⁨25.08b5 (d4862e99)⁩
Python 3.13.5 Qt 6.9.1 Chromium 122

Where did the hints from Deck Options go?

2 Likes

This will be fixed in the next release.

4 Likes

It is still difficult to update in China

Although I chose China image, the success rate of accessing GitHub when downloading Python components is very low.

Are help tips not working for anyone else?
When you click on settings like “Desired retention” (or anything else in deck options), for example
EDIT: I downgraded to 25.07.5, help tips work there. Upgraded back to 25.08b5, they don’t work

:sweat_smile: my bad

1 Like

I strongly suggest disabling the cache by default in the launcher. The app takes the double of the size with it enabled on a single install. 578mb x 2 on Windows (was the app that big before? 578mb is a lot)

And I honestly believe that most people don’t care about its small benefits in the speed of downgrading the app.

1 Like

Regarding cache:

The previous version (25.02) was 507 MB.

25.08 takes 686 MB on my Windows computer (AnkiProgramFiles = 634 MB and launcher + uv = 52 MB). So, there is definitely a significant increase in the app size.

Speaking of the app size, quite a large fraction of the total size is occupied by the qt-webengine. So, the following suggestion will help:

[Sometimes, I am just astonished as to how AnkiDroid is able to pack most of Anki’s functionality in such a small app. AnkiDroid’s installer (APK) is just 38 MB.]

2 Likes

Switching between SM2 and FSRS in the beta version of Anki seems to cause Anki to crash. (Win11, Anki 25.08b5) This problem does not occur in Anki 25.07.5.

Reproduce steps

  1. Create a new profile
  2. Enable FSRS and save
  3. Disable FSRS and save
  4. A fatal error occurs and Anki is forced to close
Debug info
Anki 25.08b5 (d4862e99) (ao)
Python 3.13.5 Qt 6.9.1 PyQt 6.9.1
Platform: Windows-11-10.0.26100-SP0

Traceback (most recent call last):
  File "C:\Users\shigg\AppData\Local\AnkiProgramFiles\.venv\Lib\site-packages\aqt\progress.py", line 121, in handler
    func()
    ~~~~^^
  File "C:\Users\shigg\AppData\Local\AnkiProgramFiles\.venv\Lib\site-packages\aqt\taskman.py", line 135, in <lambda>
    100, lambda: on_done(fut), requires_collection=False
                 ~~~~~~~^^^^^
  File "C:\Users\shigg\AppData\Local\AnkiProgramFiles\.venv\Lib\site-packages\aqt\operations\__init__.py", line 123, in wrapped_done
    future.result()
    ~~~~~~~~~~~~~^^
  File "C:\Users\shigg\AppData\Roaming\uv\python\cpython-3.13.5-windows-x86_64-none\Lib\concurrent\futures\_base.py", line 449, in result
    return self.__get_result()
           ~~~~~~~~~~~~~~~~~^^
  File "C:\Users\shigg\AppData\Roaming\uv\python\cpython-3.13.5-windows-x86_64-none\Lib\concurrent\futures\_base.py", line 401, in __get_result
    raise self._exception
  File "C:\Users\shigg\AppData\Roaming\uv\python\cpython-3.13.5-windows-x86_64-none\Lib\concurrent\futures\thread.py", line 59, in run
    result = self.fn(*self.args, **self.kwargs)
  File "C:\Users\shigg\AppData\Local\AnkiProgramFiles\.venv\Lib\site-packages\aqt\operations\__init__.py", line 108, in wrapped_op
    return self._op(mw.col)
           ~~~~~~~~^^^^^^^^
  File "C:\Users\shigg\AppData\Local\AnkiProgramFiles\.venv\Lib\site-packages\aqt\operations\deck.py", line 99, in <lambda>
    return CollectionOp(parent, lambda col: col.decks.update_deck_configs(input))
                                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^
  File "C:\Users\shigg\AppData\Local\AnkiProgramFiles\.venv\Lib\site-packages\anki\decks.py", line 298, in update_deck_configs
    op_bytes = self.col._backend.update_deck_configs_raw(input.SerializeToString())
  File "C:\Users\shigg\AppData\Local\AnkiProgramFiles\.venv\Lib\site-packages\anki\_backend_generated.py", line 751, in update_deck_configs_raw
    return self._run_command(11, 7, message)
           ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^
  File "C:\Users\shigg\AppData\Local\AnkiProgramFiles\.venv\Lib\site-packages\anki\_backend.py", line 160, in _run_command
    return self._backend.command(service, method, input)
           ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^
pyo3_runtime.PanicException: called `Option::unwrap()` on a `None` value
1 Like
  • Statistics “Reviews” graph, make the color of “New” and “Learning” cards consistent with the color of card count by @thomasrixen in #4245

I am sad to see Beta 5 reverted the colors in Statistics Review graph. I understand the desire for consistent coloring though. Perhaps something can be adjusted or compromised in the future. New and relearning cards are hard to differentiate again. (original comment about this The color-coding in the stats is hard to see ). I noticed someone is working on a colorblind mode, maybe that will help. Just sharing my thoughts. Thank you.

2 Likes

Recently TB storage has become easily available and there are several popular decks in Anki that are over 1 GB, so I think general Anki users may not be too concerned about storage.

And there is probably a difference of 10 to 100 times in UV speed between having cache and not having cache, if users are using low spec environments I think communication may be more costly. (e.g., communication costs are high, speed is slow, or unstable and disconnects)

Anki is gradually moving from PyQt to Svelte so it is possible that PyQt will eventually be completely discontinued and replaced by Svelte. (I don’t know when that will happen.)

2 Likes

Fatal error when changing desired retention (25.08b5)

  • Yes, I’ve tried rebuilding the database first
  • Yes, I’ve also tried without add-ons
  • This error does not happen on AnkiDroid 2.22.3 (Anki 25.07.5)
    • I have not tried using 25.07.5 on desktop
Anki 25.08b5 (d4862e99) 
Python 3.12.3 Qt 6.9.1 PyQt 6.9.1
Platform: Linux-6.14.0-27-generic-x86_64-with-glibc2.39

Traceback (most recent call last):
  File "/home/eivind/.local/share/uv/tools/aqt/lib/python3.12/site-packages/aqt/progress.py", line 121, in handler
    func()
  File "/home/eivind/.local/share/uv/tools/aqt/lib/python3.12/site-packages/aqt/taskman.py", line 135, in <lambda>
    100, lambda: on_done(fut), requires_collection=False
                 ^^^^^^^^^^^^
  File "/home/eivind/.local/share/uv/tools/aqt/lib/python3.12/site-packages/aqt/operations/__init__.py", line 123, in wrapped_done
    future.result()
  File "/usr/lib/python3.12/concurrent/futures/_base.py", line 449, in result
    return self.__get_result()
           ^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/concurrent/futures/_base.py", line 401, in __get_result
    raise self._exception
  File "/usr/lib/python3.12/concurrent/futures/thread.py", line 58, in run
    result = self.fn(*self.args, **self.kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/eivind/.local/share/uv/tools/aqt/lib/python3.12/site-packages/aqt/operations/__init__.py", line 108, in wrapped_op
    return self._op(mw.col)
           ^^^^^^^^^^^^^^^^
  File "/home/eivind/.local/share/uv/tools/aqt/lib/python3.12/site-packages/aqt/operations/deck.py", line 99, in <lambda>
    return CollectionOp(parent, lambda col: col.decks.update_deck_configs(input))
                                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/eivind/.local/share/uv/tools/aqt/lib/python3.12/site-packages/anki/decks.py", line 298, in update_deck_configs
    op_bytes = self.col._backend.update_deck_configs_raw(input.SerializeToString())
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/eivind/.local/share/uv/tools/aqt/lib/python3.12/site-packages/anki/_backend_generated.py", line 751, in update_deck_configs_raw
    return self._run_command(11, 7, message)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/eivind/.local/share/uv/tools/aqt/lib/python3.12/site-packages/anki/_backend.py", line 160, in _run_command
    return self._backend.command(service, method, input)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pyo3_runtime.PanicException: called `Result::unwrap()` on an `Err` value: PoisonError { .. }
3 Likes

I installed the 25.08b5 launcher, and installed the beta, then close Anki. Then I tried the following ten times:

  • Open Anki
  • Tools>Upgrade/Downgrade

Each time, the launcher appeared correctly. There’s no other step you’re taking that I’m missing? Could you record a short video for me?

You might keep getting it if you’re using an older client, or you don’t do a one way sync to your other clients after the fix.

Can you provide some screenshots/extra info on where it’s failing/what it’s saying?

Because the browser engine is already installed on the device, as are the GUI libraries. The desktop Anki is shipping those all separately as part of Qt.

Thanks, fix coming.

I can’t reproduce this, and suspect the fix above also addressed this.

2 Likes

If you mean 37f7872, then no, it doesn’t.

I can reproduce this reliably on my end. Is there a way to get you a proper rust stacktrace? The run script still only shows the Python stack, but at least it has some more info:

thread '<unnamed>' panicked at rslib/src/backend/mod.rs:122:18:
called `Result::unwrap()` on an `Err` value: PoisonError { .. }
2025-08-19 20:56:29,092:ERROR:waitress: Exception when servicing <waitress.channel.HTTPChannel connected 127.0.0.1:36556 at 0x76a3681596a0>
Traceback (most recent call last):
  File "/home/eivind/source/anki/out/pyenv/lib/python3.12/site-packages/waitress/task.py", line 83, in handler_thread
    task.service()
  File "/home/eivind/source/anki/out/pyenv/lib/python3.12/site-packages/waitress/channel.py", line 430, in service
    task.service()
  File "/home/eivind/source/anki/out/pyenv/lib/python3.12/site-packages/waitress/task.py", line 167, in service
    self.execute()
  File "/home/eivind/source/anki/out/pyenv/lib/python3.12/site-packages/waitress/task.py", line 435, in execute
    app_iter = self.channel.server.application(environ, start_response)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/eivind/source/anki/out/pyenv/lib/python3.12/site-packages/waitress/proxy_headers.py", line 64, in translate_proxy_headers
    return app(environ, start_response)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/eivind/.local/share/Anki2/addons21/111623432/external/sentry_sdk/integrations/flask.py", line 112, in sentry_patched_wsgi_app
    return middleware(environ, start_response)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/eivind/.local/share/Anki2/addons21/111623432/external/sentry_sdk/integrations/wsgi.py", line 138, in __call__
    reraise(*_capture_exception())
  File "/home/eivind/.local/share/Anki2/addons21/111623432/external/sentry_sdk/utils.py", line 1746, in reraise
    raise value
  File "/home/eivind/.local/share/Anki2/addons21/111623432/external/sentry_sdk/integrations/wsgi.py", line 131, in __call__
    response = self.app(
               ^^^^^^^^^
  File "/home/eivind/.local/share/Anki2/addons21/111623432/external/sentry_sdk/integrations/flask.py", line 104, in <lambda>
    lambda *a, **kw: old_app(self, *a, **kw),
                     ^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/eivind/source/anki/out/pyenv/lib/python3.12/site-packages/flask/app.py", line 1536, in __call__
    return self.wsgi_app(environ, start_response)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/eivind/source/anki/out/pyenv/lib/python3.12/site-packages/flask/app.py", line 1511, in wsgi_app
    response = self.full_dispatch_request()
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/eivind/source/anki/out/pyenv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request
    rv = self.dispatch_request()
         ^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/eivind/source/anki/out/pyenv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)  # type: ignore[no-any-return]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/eivind/source/anki/qt/aqt/mediasrv.py", line 316, in handle_request
    return _handle_dynamic_request(req)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/eivind/source/anki/qt/aqt/mediasrv.py", line 740, in _handle_dynamic_request
    return req()
           ^^^^^
  File "/home/eivind/source/anki/qt/aqt/mediasrv.py", line 689, in wrapped
    if data := handler():
               ^^^^^^^^^
  File "/home/eivind/source/anki/qt/aqt/mediasrv.py", line 670, in <lambda>
    return lambda: getattr(aqt.mw.col._backend, f"{endpoint}_raw")(request.data)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/eivind/source/anki/out/pylib/anki/_backend_generated.py", line 771, in get_retention_workload_raw
    return self._run_command(11, 9, message)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/eivind/source/anki/pylib/anki/_backend.py", line 160, in _run_command
    return self._backend.command(service, method, input)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pyo3_runtime.PanicException: attempt to subtract with overflow
Traceback (most recent call last):
  File "/home/eivind/source/anki/qt/aqt/progress.py", line 121, in handler
    func()
  File "/home/eivind/source/anki/qt/aqt/taskman.py", line 135, in <lambda>
    100, lambda: on_done(fut), requires_collection=False
                 ^^^^^^^^^^^^
  File "/home/eivind/source/anki/qt/aqt/operations/__init__.py", line 123, in wrapped_done
    future.result()
  File "/usr/lib/python3.12/concurrent/futures/_base.py", line 449, in result
    return self.__get_result()
           ^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/concurrent/futures/_base.py", line 401, in __get_result
    raise self._exception
  File "/usr/lib/python3.12/concurrent/futures/thread.py", line 58, in run
    result = self.fn(*self.args, **self.kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/eivind/source/anki/qt/aqt/operations/__init__.py", line 108, in wrapped_op
    return self._op(mw.col)
           ^^^^^^^^^^^^^^^^
  File "/home/eivind/source/anki/qt/aqt/operations/deck.py", line 99, in <lambda>
    return CollectionOp(parent, lambda col: col.decks.update_deck_configs(input))
                                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/eivind/source/anki/pylib/anki/decks.py", line 298, in update_deck_configs
    op_bytes = self.col._backend.update_deck_configs_raw(input.SerializeToString())
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/eivind/source/anki/out/pylib/anki/_backend_generated.py", line 751, in update_deck_configs_raw
    return self._run_command(11, 7, message)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/eivind/source/anki/pylib/anki/_backend.py", line 160, in _run_command
    return self._backend.command(service, method, input)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pyo3_runtime.PanicException: called `Result::unwrap()` on an `Err` value: PoisonError { .. }

Or maybe you’d like a reproducible collection file?

1 Like

Ok, some more info. I was able to bisect the first bad commit to 4020089.

Now, the subtract with overflow happens in FSRS:

thread '<unnamed>' panicked at /home/eivind/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/fsrs-5.1.0/src/simulation.rs:577:32:
attempt to subtract with overflow

Which is here.

So obviously I have a situation where config.deck_size < cards.len(). I have reported to FSRS.

1 Like

I get the message Added last review time to <U+2068>633<U+2069> cards every time I do a database check, even if I perform multiple consecutive checks with no sync in between.

After some debugging, I found 636 cards that have no FSRS memory state (e.g., they have 250% ease), are not new, and have 0 repetitions. I’m not sure why they are not new yet still have 0 reviews, maybe due to a past database error, or something caused by an add-on.

Deleting these cards seems to fix the issue. If I instead reset or rate them, I’m left with 1 lingering affected card (most likely a sibling).

I also have 4 other cards that are not new with 0 repetitions, but they do have FSRS’s DSR, and are not affected.

Could you check that this fixes it?

1 Like

Yes it does. Thanks.

1 Like

The code in Fix Cards with Missing Last Review Time During Database Check by L-M-Sherlock · Pull Request #4237 · ankitects/anki · GitHub starts by fetching the revlogs. If these cards don’t have any revlogs, they shouldn’t be processed further. So, something looks wrong. Can you share an export of the affected cards?

These cards actually do have a revlog.

On further thought, it looks like they might be cards that were introduced (or re-introduced, after being reset to new) by means of rescheduling, but were never actually reviewed after that.

Here are a couple of examples: