Commit Graph

252 Commits

Author SHA1 Message Date
llama
3e4a0a60da chore(deps): bump ammonia and spin for cargo deny check (#5192)
Ref:
https://github.com/ankitects/anki/actions/runs/30075323226/job/89424683867#step:21:42

This pr bumps ammonia from 4.1.3 to v4.1.4 for RUSTSEC-2026-0213 and
spin from 0.9.8 to 0.9.9 as it was yanked
2026-07-24 12:22:19 +03:00
Abdo
48c8e10452 chore: Fix advisory RUSTSEC-2026-0204 (#5129)
This bumps the `crossbeam-epoch` crate to address
[RUSTSEC-2026-0204](https://rustsec.org/advisories/RUSTSEC-2026-0204).

CI failure:
https://github.com/ankitects/anki/actions/runs/28952247163/job/85901791834
2026-07-09 13:04:37 +03:00
Asuka Minato
fd65f20fcd chore: bump fsrs version (#4956)
<!--
Title (for the Pull Request title field at the top):
Use a short prefix so the change type is obvious. You do not need to
repeat it in the body below.

Examples:
- fix: — bugfix
- feat: — feature
- refactor: — internal change without user-facing feature
- docs: — documentation only
- chore: — tooling, CI, deps, build housekeeping
- test: — tests only
-->

## Linked issue (required)

<!-- Fixes #123 / Closes #123 / Refs #123 -->
Refs #4080

## Summary / motivation (required)

<!-- What this PR does and why. For larger changes, add enough context
for reviewers. -->

bump fsrs version

## Steps to reproduce (required, use N/A if not applicable)

<!-- Steps to reproduce: how to trigger the bug in the broken state (the
"before").
 - Mainly for bugfixes;
    - For bugs: numbered steps before the fix. For non-bugs: write N/A.
 - use N/A for features, refactors, docs, chore, etc.
-->

N/A

## How to test (required)

<!--- How to test: how you verified the change (checks, unit tests,
manual steps, edge cases — the "after" or general validation). --->

### Checklist (minimum)

- [x] I ran `./ninja check` or an equivalent relevant check locally.
- [x] I added or updated tests when the change is non-trivial or
behavior changed.

### Details

<!-- Commands, manual steps, edge cases, and what you observed -->

## Before / after behavior (optional)

<!-- For bugfixes: behavior before vs after. For other types: N/A or a
short note. -->

## Risk / compatibility / migration (optional)

<!-- Breaking changes, rollout notes, or N/A for small / low-risk PRs
-->

## UI evidence (required for visual changes; otherwise N/A)

<!-- Screenshot or short video -->

## Scope

- [x] This PR is focused on one change (no unrelated edits).
2026-07-03 10:45:00 +01:00
Fernando Lins
de2b3a8b69 chore(deps): Bump Rust dependencies for advisories (#5090)
Updates `ammonia` and `anyhow` in `Cargo.lock` to resolve cargo-deny
advisories reported by CI:

- RUSTSEC-2026-0193 for `ammonia`
- RUSTSEC-2026-0190 for `anyhow`

Validation:

- `cargo deny check`
- `just test-rust`

Please see:
https://github.com/ankitects/anki/actions/runs/28544202005/job/84625290416#step:20:42
2026-07-02 11:29:56 +03:00
Abdo
0d7b3fdd96 feat: Remove the uv launcher and old packaging code (#5019)
## Linked issue

Closes #4556
Closes #4557
Closes #4144
Closes #4151
Closes #4152
Closes #4153
Closes #4229
Closes #4356
Closes #4401
Closes #4403
Closes #4519
Closes #4523
Closes #4390
Closes #4414
Closes #4484



## Summary / motivation

After 4 months of exploring Briefcase for packaging, we're confident it
solves most problems with the uv launcher with less complexity and at a
lower maintenance cost, especially with the parallel work on the release
CI, which we already used to make 5 releases.

This also removes platform-specific packaging/signing code used to
produce macOS dmg files and Windows NSIS installers, which is now
largely handled by Briefcase and the release CI.
The custom install scripts for Linux are mostly preserved under
qt/installer/linux-template and used in the Briefcase build.

## How to test

- [ ] No build problems.
- [ ] The `tools/build-installer` scripts still work.
- [ ] No CI/release workflow issues.
- [ ] No user-visible changes in dev environment and Briefcase build.
2026-06-17 03:02:52 +03:00
dependabot[bot]
b53d0a4169 chore(deps): bump pyo3 from 0.25.1 to 0.29.0 (#5002)
Bumps [pyo3](https://github.com/pyo3/pyo3) from 0.25.1 to 0.29.0.

Closes #4999

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Abdo <abdo@abdnh.net>
2026-06-15 18:42:48 +03:00
Fernando Lins
da64f03307 chore(deps): consolidated security updates (Dependabot batch) (#4934)
## Summary

Consolidates 8 open Dependabot PRs into a single security-focused batch.

### Addressed advisories

- GHSA: tar (Cargo)
[#296](https://github.com/ankitects/anki/security/dependabot/296)
- @tootallnate/once
[#295](https://github.com/ankitects/anki/security/dependabot/295)
- ws [#293](https://github.com/ankitects/anki/security/dependabot/293)
- openssl
[#292](https://github.com/ankitects/anki/security/dependabot/292)
- idna [#291](https://github.com/ankitects/anki/security/dependabot/291)
- devalue
[#287](https://github.com/ankitects/anki/security/dependabot/287)/[#239](https://github.com/ankitects/anki/security/dependabot/239)/[#217](https://github.com/ankitects/anki/security/dependabot/217)/[#216](https://github.com/ankitects/anki/security/dependabot/216)
- postcss
[#275](https://github.com/ankitects/anki/security/dependabot/275)
- svelte
[#286](https://github.com/ankitects/anki/security/dependabot/286)/[#288](https://github.com/ankitects/anki/security/dependabot/288)/[#289](https://github.com/ankitects/anki/security/dependabot/289)
- lodash-es
[#258](https://github.com/ankitects/anki/security/dependabot/258)/[#259](https://github.com/ankitects/anki/security/dependabot/259)
- @sveltejs/kit
[#294](https://github.com/ankitects/anki/security/dependabot/294)

### Sources

Merged from PRs: #4914, #4887, #4867, #4866, #4865, #4846, #4744, #4892.

### Not addressed — rand (Cargo)
[#268](https://github.com/ankitects/anki/security/dependabot/268)

PR #4741 (rand 0.9.4 → 0.10.1) was excluded because `fsrs 5.2.0` still
depends on `rand 0.9.4`. The rand 0.10 API changes (`Rng` → `RngExt`)
cause a compile error at the `PostSchedulingFn` boundary. This will be
unblocked when fsrs is upgraded.

### Not addressed (transitive — follow-up)

- urllib3
[#284](https://github.com/ankitects/anki/security/dependabot/284)/[#283](https://github.com/ankitects/anki/security/dependabot/283)
- GitPython
[#282](https://github.com/ankitects/anki/security/dependabot/282)
- ip-address
[#276](https://github.com/ankitects/anki/security/dependabot/276)
- pytest
[#266](https://github.com/ankitects/anki/security/dependabot/266)
- Pygments
[#256](https://github.com/ankitects/anki/security/dependabot/256)
- brace-expansion
[#255](https://github.com/ankitects/anki/security/dependabot/255)/[#158](https://github.com/ankitects/anki/security/dependabot/158)
- picomatch
[#253](https://github.com/ankitects/anki/security/dependabot/253)/[#252](https://github.com/ankitects/anki/security/dependabot/252)
- tar (npm)
[#238](https://github.com/ankitects/anki/security/dependabot/238)/[#235](https://github.com/ankitects/anki/security/dependabot/235)/[#209](https://github.com/ankitects/anki/security/dependabot/209)
- immutable
[#231](https://github.com/ankitects/anki/security/dependabot/231)
- minimatch
[#227](https://github.com/ankitects/anki/security/dependabot/227)/[#226](https://github.com/ankitects/anki/security/dependabot/226)/[#221](https://github.com/ankitects/anki/security/dependabot/221)
- fabric
[#211](https://github.com/ankitects/anki/security/dependabot/211)

These need manual `yarn.lock` resolutions / `uv.lock` overrides.

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-03 15:10:39 -03:00
llama
e9830169b7 feat(check-media): case-insensitively dedupe media filenames (#4852)
<!--
Title (for the Pull Request title field at the top):
Use a short prefix so the change type is obvious. You do not need to
repeat it in the body below.

Examples:
- fix: — bugfix
- feat: — feature
- refactor: — internal change without user-facing feature
- docs: — documentation only
- chore: — tooling, CI, deps, build housekeeping
- test: — tests only
-->

## Linked issue (required)

- #4433
- #4716 

## Summary / motivation (required)

This PR modifies `Check Media` to dedupe filenames case-insensitively so
as to avoid files that were added on case-sensitive filesystems
potentially being overwritten on case-insensitive ones

## Steps to reproduce (required, use N/A if not applicable)

N/A

## How to test (required)

Given a.jpg (hash 1), A.JPG (hash 2) and a.JPG (hash 1) as existing
media files on a case-sensitive fs, see that `Check Media` renames A.JPG
to a-2.jpg and a.JPG to a.jpg

### Checklist (minimum)

- [x] I ran `./ninja check` or an equivalent relevant check locally.
- [ ] I added or updated tests when the change is non-trivial or
behavior changed.

## Scope

- [x] This PR is focused on one change (no unrelated edits).
2026-05-25 14:05:34 +03:00
llama
57e67f8408 fix(check-media): case-sensitivity in unused/missing check (#4861)
<!--
Title (for the Pull Request title field at the top):
Use a short prefix so the change type is obvious. You do not need to
repeat it in the body below.

Examples:
- fix: — bugfix
- feat: — feature
- refactor: — internal change without user-facing feature
- docs: — documentation only
- chore: — tooling, CI, deps, build housekeeping
- test: — tests only
-->

## Linked issue (required)

- #4716

## Summary / motivation (required)

Currently, on filesystems where the media folder is treated as
case-insensitive, `[sound:BLAH.mp3]` and `[sound:blah.mp3]` point to the
same file on disk (if any), but one of the two would be considered as a
ref pointing to a missing file by the media checker which assumes
case-sensitivity

## Steps to reproduce (required, use N/A if not applicable)

See linked pr

## How to test (required)

On windows/macos, add `blah.mp3`, rename `blah.mp3` to `Blah.mp3` in the
ref, run `Check Media` and see that `Blah.mp3` isn't considered missing

### Checklist (minimum)

- [x] I ran `./ninja check` or an equivalent relevant check locally.
- [ ] I added or updated tests when the change is non-trivial or
behavior changed.

## Scope

- [x] This PR is focused on one change (no unrelated edits).
2026-05-25 12:09:14 +03:00
Abdo
4b01f78aa3 fix: Prevent Windows elevation errors when running ninja_gen's update binaries (#4848)
## Linked issue

Closes #4847

## Summary

Prevent Windows elevation errors when running ninja_gen's update
binaries by embedding a manifest with `asInvoker`.


## How to test

Run `./tools/ninja check` or `cargo run --bin update_node` and confirm
no elevation errors.
2026-05-16 11:55:11 +03:00
dependabot[bot]
fc88f58524 chore(deps): bump openssl from 0.10.73 to 0.10.79 (#4781)
Bumps [openssl](https://github.com/rust-openssl/rust-openssl) from
0.10.73 to 0.10.79.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/rust-openssl/rust-openssl/releases">openssl's
releases</a>.</em></p>
<blockquote>
<h2>openssl-v0.10.79</h2>
<h2>What's Changed</h2>
<ul>
<li>Bump actions/cache from 5.0.4 to 5.0.5 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/rust-openssl/rust-openssl/pull/2610">rust-openssl/rust-openssl#2610</a></li>
<li>Try to fix OpenSSL 1.1.0l download by <a
href="https://github.com/botovq"><code>@​botovq</code></a> in <a
href="https://redirect.github.com/rust-openssl/rust-openssl/pull/2614">rust-openssl/rust-openssl#2614</a></li>
<li>Require &amp;mut BigNumContextRef for EcPointRef mul/invert by <a
href="https://github.com/alex"><code>@​alex</code></a> in <a
href="https://redirect.github.com/rust-openssl/rust-openssl/pull/2615">rust-openssl/rust-openssl#2615</a></li>
<li>Fix UB in EcGroupRef::generator on groups without a generator by <a
href="https://github.com/alex"><code>@​alex</code></a> in <a
href="https://redirect.github.com/rust-openssl/rust-openssl/pull/2617">rust-openssl/rust-openssl#2617</a></li>
<li>Replace <code>use libc::*;</code> with targeted imports in
openssl-sys by <a href="https://github.com/alex"><code>@​alex</code></a>
in <a
href="https://redirect.github.com/rust-openssl/rust-openssl/pull/2618">rust-openssl/rust-openssl#2618</a></li>
<li>Add PKeyRef::is_a and KeyType for name-based key identification by
<a href="https://github.com/reaperhulk"><code>@​reaperhulk</code></a> in
<a
href="https://redirect.github.com/rust-openssl/rust-openssl/pull/2619">rust-openssl/rust-openssl#2619</a></li>
<li>Add PKey::{public,private}_key_from_raw_bytes_ex by <a
href="https://github.com/reaperhulk"><code>@​reaperhulk</code></a> in <a
href="https://redirect.github.com/rust-openssl/rust-openssl/pull/2620">rust-openssl/rust-openssl#2620</a></li>
<li>Bump MSRV to 1.80 by <a
href="https://github.com/reaperhulk"><code>@​reaperhulk</code></a> in <a
href="https://redirect.github.com/rust-openssl/rust-openssl/pull/2622">rust-openssl/rust-openssl#2622</a></li>
<li>Drop once_cell in favor of std::sync::{LazyLock, OnceLock} by <a
href="https://github.com/reaperhulk"><code>@​reaperhulk</code></a> in <a
href="https://redirect.github.com/rust-openssl/rust-openssl/pull/2623">rust-openssl/rust-openssl#2623</a></li>
<li>Add PKey::private_key_from_seed for ML-DSA/ML-KEM key import by <a
href="https://github.com/reaperhulk"><code>@​reaperhulk</code></a> in <a
href="https://redirect.github.com/rust-openssl/rust-openssl/pull/2621">rust-openssl/rust-openssl#2621</a></li>
<li>parallelize more builds in CI for cold caches by <a
href="https://github.com/reaperhulk"><code>@​reaperhulk</code></a> in <a
href="https://redirect.github.com/rust-openssl/rust-openssl/pull/2625">rust-openssl/rust-openssl#2625</a></li>
<li>Add PKeyRef::seed_into for ML-DSA/ML-KEM seed extraction by <a
href="https://github.com/reaperhulk"><code>@​reaperhulk</code></a> in <a
href="https://redirect.github.com/rust-openssl/rust-openssl/pull/2626">rust-openssl/rust-openssl#2626</a></li>
<li>Fix process abort when verify/PSK callbacks fire after SSL_CTX swap
by <a href="https://github.com/alex"><code>@​alex</code></a> in <a
href="https://redirect.github.com/rust-openssl/rust-openssl/pull/2624">rust-openssl/rust-openssl#2624</a></li>
<li>Bind OSSL_PARAM_modified and use it for seed_into by <a
href="https://github.com/reaperhulk"><code>@​reaperhulk</code></a> in <a
href="https://redirect.github.com/rust-openssl/rust-openssl/pull/2628">rust-openssl/rust-openssl#2628</a></li>
<li>Add PkeyCtxRef::set_context_string for ML-DSA by <a
href="https://github.com/reaperhulk"><code>@​reaperhulk</code></a> in <a
href="https://redirect.github.com/rust-openssl/rust-openssl/pull/2629">rust-openssl/rust-openssl#2629</a></li>
<li>Reject non-UTF-8 OCSP responder URLs in X509Ref::ocsp_responders by
<a href="https://github.com/alex"><code>@​alex</code></a> in <a
href="https://redirect.github.com/rust-openssl/rust-openssl/pull/2631">rust-openssl/rust-openssl#2631</a></li>
<li>Fix output buffer overflow for AES key-wrap-with-padding ciphers by
<a href="https://github.com/alex"><code>@​alex</code></a> in <a
href="https://redirect.github.com/rust-openssl/rust-openssl/pull/2630">rust-openssl/rust-openssl#2630</a></li>
<li>Release openssl 0.10.79 and openssl-sys 0.9.115 by <a
href="https://github.com/reaperhulk"><code>@​reaperhulk</code></a> in <a
href="https://redirect.github.com/rust-openssl/rust-openssl/pull/2632">rust-openssl/rust-openssl#2632</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/rust-openssl/rust-openssl/compare/openssl-v0.10.78...openssl-v0.10.79">https://github.com/rust-openssl/rust-openssl/compare/openssl-v0.10.78...openssl-v0.10.79</a></p>
<h2>openssl-v0.10.78</h2>
<h2>What's Changed</h2>
<ul>
<li>Fix Suite B flag assignments in verify.rs by <a
href="https://github.com/alex"><code>@​alex</code></a> in <a
href="https://redirect.github.com/rust-openssl/rust-openssl/pull/2592">rust-openssl/rust-openssl#2592</a></li>
<li>Use cvt_p for OPENSSL_malloc error handling by <a
href="https://github.com/alex"><code>@​alex</code></a> in <a
href="https://redirect.github.com/rust-openssl/rust-openssl/pull/2593">rust-openssl/rust-openssl#2593</a></li>
<li>Mark BIO_get_mem_data on AWS-LC to be unsafe by <a
href="https://github.com/alex"><code>@​alex</code></a> in <a
href="https://redirect.github.com/rust-openssl/rust-openssl/pull/2594">rust-openssl/rust-openssl#2594</a></li>
<li>Set timeout for package installation step by <a
href="https://github.com/alex"><code>@​alex</code></a> in <a
href="https://redirect.github.com/rust-openssl/rust-openssl/pull/2595">rust-openssl/rust-openssl#2595</a></li>
<li>Panic in Crypter::new when IV is required but not provided by <a
href="https://github.com/alex"><code>@​alex</code></a> in <a
href="https://redirect.github.com/rust-openssl/rust-openssl/pull/2596">rust-openssl/rust-openssl#2596</a></li>
<li>openssl 4 support by <a
href="https://github.com/reaperhulk"><code>@​reaperhulk</code></a> in <a
href="https://redirect.github.com/rust-openssl/rust-openssl/pull/2591">rust-openssl/rust-openssl#2591</a></li>
<li>Avoid panic for overlong OIDs by <a
href="https://github.com/botovq"><code>@​botovq</code></a> in <a
href="https://redirect.github.com/rust-openssl/rust-openssl/pull/2598">rust-openssl/rust-openssl#2598</a></li>
<li>Fix dangling stack pointer in custom extension add callback by <a
href="https://github.com/alex"><code>@​alex</code></a> in <a
href="https://redirect.github.com/rust-openssl/rust-openssl/pull/2599">rust-openssl/rust-openssl#2599</a></li>
<li>Add support for LibreSSL 4.3.x by <a
href="https://github.com/botovq"><code>@​botovq</code></a> in <a
href="https://redirect.github.com/rust-openssl/rust-openssl/pull/2603">rust-openssl/rust-openssl#2603</a></li>
<li>fix inverted bounds assertion in AES key unwrap by <a
href="https://github.com/reaperhulk"><code>@​reaperhulk</code></a> in <a
href="https://redirect.github.com/rust-openssl/rust-openssl/pull/2604">rust-openssl/rust-openssl#2604</a></li>
<li>Reject oversized length returns from password callback trampoline by
<a href="https://github.com/alex"><code>@​alex</code></a> in <a
href="https://redirect.github.com/rust-openssl/rust-openssl/pull/2605">rust-openssl/rust-openssl#2605</a></li>
<li>Validate callback-returned lengths in PSK and cookie trampolines by
<a href="https://github.com/alex"><code>@​alex</code></a> in <a
href="https://redirect.github.com/rust-openssl/rust-openssl/pull/2607">rust-openssl/rust-openssl#2607</a></li>
<li>Error for short out in MdCtxRef::digest_final() by <a
href="https://github.com/botovq"><code>@​botovq</code></a> in <a
href="https://redirect.github.com/rust-openssl/rust-openssl/pull/2608">rust-openssl/rust-openssl#2608</a></li>
<li>Check derive output buffer length on OpenSSL 1.1.x by <a
href="https://github.com/alex"><code>@​alex</code></a> in <a
href="https://redirect.github.com/rust-openssl/rust-openssl/pull/2606">rust-openssl/rust-openssl#2606</a></li>
<li>Release openssl v0.10.78 and openssl-sys v0.9.114 by <a
href="https://github.com/alex"><code>@​alex</code></a> in <a
href="https://redirect.github.com/rust-openssl/rust-openssl/pull/2609">rust-openssl/rust-openssl#2609</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/rust-openssl/rust-openssl/compare/openssl-v0.10.77...openssl-v0.10.78">https://github.com/rust-openssl/rust-openssl/compare/openssl-v0.10.77...openssl-v0.10.78</a></p>
<h2>openssl-v0.10.77</h2>
<h2>What's Changed</h2>
<ul>
<li>CI: Hash-pin all action usage, avoid credential persistence in
actions/checkout by <a
href="https://github.com/woodruffw"><code>@​woodruffw</code></a> in <a
href="https://redirect.github.com/rust-openssl/rust-openssl/pull/2587">rust-openssl/rust-openssl#2587</a></li>
<li>Bump aws-lc-sys to 0.39 by <a
href="https://github.com/goffrie"><code>@​goffrie</code></a> in <a
href="https://redirect.github.com/rust-openssl/rust-openssl/pull/2588">rust-openssl/rust-openssl#2588</a></li>
<li>md_ctx: enable sign/verify/reset on BoringSSL, LibreSSL, and AWS-LC
by <a href="https://github.com/alex"><code>@​alex</code></a> in <a
href="https://redirect.github.com/rust-openssl/rust-openssl/pull/2589">rust-openssl/rust-openssl#2589</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="649f2d9e37"><code>649f2d9</code></a>
Release openssl 0.10.79 and openssl-sys 0.9.115 (<a
href="https://redirect.github.com/rust-openssl/rust-openssl/issues/2632">#2632</a>)</li>
<li><a
href="257f9b20c0"><code>257f9b2</code></a>
Fix output buffer overflow for AES key-wrap-with-padding ciphers (<a
href="https://redirect.github.com/rust-openssl/rust-openssl/issues/2630">#2630</a>)</li>
<li><a
href="d43e9179b1"><code>d43e917</code></a>
Reject non-UTF-8 OCSP responder URLs in X509Ref::ocsp_responders (<a
href="https://redirect.github.com/rust-openssl/rust-openssl/issues/2631">#2631</a>)</li>
<li><a
href="f46519c869"><code>f46519c</code></a>
Add PkeyCtxRef::set_context_string for ML-DSA (<a
href="https://redirect.github.com/rust-openssl/rust-openssl/issues/2629">#2629</a>)</li>
<li><a
href="ad9ae31277"><code>ad9ae31</code></a>
Bind OSSL_PARAM_modified and use it for seed_into (<a
href="https://redirect.github.com/rust-openssl/rust-openssl/issues/2628">#2628</a>)</li>
<li><a
href="4e25c9be20"><code>4e25c9b</code></a>
Fix process abort when verify/PSK callbacks fire after SSL_CTX swap (<a
href="https://redirect.github.com/rust-openssl/rust-openssl/issues/2624">#2624</a>)</li>
<li><a
href="3dd8f425ef"><code>3dd8f42</code></a>
Add PKeyRef::seed_into for ML-DSA/ML-KEM seed extraction (<a
href="https://redirect.github.com/rust-openssl/rust-openssl/issues/2626">#2626</a>)</li>
<li><a
href="2c5e5a8f14"><code>2c5e5a8</code></a>
parallelize more builds in CI for cold caches (<a
href="https://redirect.github.com/rust-openssl/rust-openssl/issues/2625">#2625</a>)</li>
<li><a
href="6685591711"><code>6685591</code></a>
Add PKey::private_key_from_seed for ML-DSA/ML-KEM key import (<a
href="https://redirect.github.com/rust-openssl/rust-openssl/issues/2621">#2621</a>)</li>
<li><a
href="8f8fdce627"><code>8f8fdce</code></a>
Drop once_cell in favor of std::sync::{LazyLock, OnceLock} (<a
href="https://redirect.github.com/rust-openssl/rust-openssl/issues/2623">#2623</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/rust-openssl/rust-openssl/compare/openssl-v0.10.73...openssl-v0.10.79">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=openssl&package-manager=cargo&previous-version=0.10.73&new-version=0.10.79)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/ankitects/anki/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-08 13:29:12 -03:00
Andrew Sanchez
5a9b54e938 Briefcase Installer (#4629)
migrates Anki Desktop packaging from the legacy
NSIS/uv-based installer to [BeeWare
Briefcase](https://briefcase.readthedocs.io/). This branch integrates
work from many related issues and PRs to deliver cross-platform native
installers (MSI on Windows, .app on macOS, PyInstaller on Linux) with
code signing, notarization, and file association support.

## Integrated PRs

- #4585 — Set up Briefcase
- #4596 — Add Briefcase icons
- #4598 — Handle Briefcase file associations
- #4601 — Add Briefcase app permissions
- #4609 — Customize Briefcase's MSI installer
- #4616 — Set up Briefcase code signing and notarization
- #4618 — Fix Briefcase packaging for x86 Macs
- #4623 — Customize Briefcase's Linux template
- #4627 — List required Debian packages for Briefcase installer
- #4630 — Update Briefcase's Windows template
- #4631 — Rewrite Linux install/uninstall scripts for PyInstaller
- #4638 — Use PyInstaller on Linux
- #4645 — Update installer docs
- #4654 — Disable Briefcase's universal builds for macOS
- #4672 — Deal with existing NSIS installations in MSI installer
- #4676 — Remove duplicate Briefcase icons
- #4677 — Tweak Linux scripts for new installer
- #4709 — Add anki-console.bat to Briefcase's Windows package

## Related Issues

- #4557 — Evaluate BeeWare Briefcase for Anki packaging and distribution
- #4678 — Support native Windows ARM64 builds for Briefcase
- #4688 — Linux installer: migrate to PyInstaller and rewrite install
scripts
- #4689 — Investigate startup performance with Briefcase
- #4690 — Specify required Linux system packages for Briefcase
- #4691 — Investigate Windows ARM64 support with Briefcase
- #4692 — Test on Linux ARM with Briefcase
- #4693 — Separate ARM and Intel macOS releases
- #4694 — Update developer documentation for Briefcase installer
- #4695 — Support upgrade/downgrade with the Briefcase installer
- #4696 — Update user documentation for new installer
- #4702 — Update Briefcase's Windows template with upstream security fix
and OS version check
- #4703 — Follow-up tweaks to Linux install/uninstall scripts

## Related PRs

- #4619 — Enable Windows ARM64 support
- #4632 — Release action

---------

Co-authored-by: Abdo <abdo@abdnh.net>
Co-authored-by: Andrew Sanchez <andrewsanchez@users.noreply.github.com>
Co-authored-by: Fernando Lins <1887601+fernandolins@users.noreply.github.com>
2026-05-05 17:29:18 -04:00
Fernando Lins
35b727acea chore(deps): update sha2 to 0.11 and fix digest hex output (#4745)
## Summary
- Bumps `sha2` to 0.11.x (digest stack uses types that no longer
implement `LowerHex` for `format!`).
- Replaces `format!(…, finalize())` with `hex::encode(finalize())` in
`build/runner` and `ninja_gen`.
- Adds the workspace `hex` dependency where those crates need it.

## Test plan
- [ ] `cargo check -p runner -p ninja_gen`
2026-04-24 15:12:23 -03:00
dependabot[bot]
23c0e5def8 chore(deps): bump sha2 from 0.10.9 to 0.11.0 (#4743)
Bumps [sha2](https://github.com/RustCrypto/hashes) from 0.10.9 to
0.11.0.
<details>
<summary>Commits</summary>
<ul>
<li><a
href="ffe093984c"><code>ffe0939</code></a>
Release sha2 0.11.0 (<a
href="https://redirect.github.com/RustCrypto/hashes/issues/806">#806</a>)</li>
<li><a
href="8991b65fe4"><code>8991b65</code></a>
Use the standard order of the <code>[package]</code> section fields (<a
href="https://redirect.github.com/RustCrypto/hashes/issues/807">#807</a>)</li>
<li><a
href="3d2bc57db4"><code>3d2bc57</code></a>
sha2: refactor backends (<a
href="https://redirect.github.com/RustCrypto/hashes/issues/802">#802</a>)</li>
<li><a
href="faa55fb836"><code>faa55fb</code></a>
sha3: bump <code>keccak</code> to v0.2 (<a
href="https://redirect.github.com/RustCrypto/hashes/issues/803">#803</a>)</li>
<li><a
href="d3e6489e56"><code>d3e6489</code></a>
sha3 v0.11.0-rc.9 (<a
href="https://redirect.github.com/RustCrypto/hashes/issues/801">#801</a>)</li>
<li><a
href="bbf6f51ff9"><code>bbf6f51</code></a>
sha2: tweak backend docs (<a
href="https://redirect.github.com/RustCrypto/hashes/issues/800">#800</a>)</li>
<li><a
href="155dbbf295"><code>155dbbf</code></a>
sha3: add default value for the <code>DS</code> generic parameter on
<code>TurboShake128/256</code>...</li>
<li><a
href="ed514f2b34"><code>ed514f2</code></a>
Use published version of <code>keccak</code> v0.2 (<a
href="https://redirect.github.com/RustCrypto/hashes/issues/799">#799</a>)</li>
<li><a
href="702bcd8373"><code>702bcd8</code></a>
Migrate to closure-based <code>keccak</code> (<a
href="https://redirect.github.com/RustCrypto/hashes/issues/796">#796</a>)</li>
<li><a
href="827c043f82"><code>827c043</code></a>
sha3 v0.11.0-rc.8 (<a
href="https://redirect.github.com/RustCrypto/hashes/issues/794">#794</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/RustCrypto/hashes/compare/sha2-v0.10.9...sha2-v0.11.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=sha2&package-manager=cargo&previous-version=0.10.9&new-version=0.11.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-24 14:47:12 -03:00
Fernando Lins
aa06883784 fix(deps): bump rustls-webpki to 0.103.13 (RUSTSEC-2026-0104) (#4727)
## Summary

Updates `rustls-webpki` in `Cargo.lock` from 0.103.12 to 0.103.13 so
`cargo-deny` passes the advisories check.

## Context

[RUSTSEC-2026-0104](https://rustsec.org/advisories/RUSTSEC-2026-0104)
reports a reachable panic when parsing certain certificate revocation
lists (CRL). The fixed release is `>= 0.103.13` (see advisory).

`rustls-webpki` is pulled in transitively via `reqwest` / `rustls` (e.g.
`ninja_gen`, `runner`, `linkchecker`, `anki` dev deps).

## Change

- `cargo update -p rustls-webpki`

No `Cargo.toml` edits required.
2026-04-24 18:17:33 +03:00
Abdo
702fbbf70f chore: Fix cargo-deny advisories (#4711)
Fixes CI failures.
2026-04-15 17:17:03 +03:00
Andrew Sanchez
6b61393d87 Build and publish dev docs (#4579) 2026-03-31 08:26:59 -04:00
Fernando Lins
561a2066cf chore(deps): bump quinn-proto from 0.11.13 to 0.11.14 (#4605) 2026-03-11 21:33:24 +03:00
Daniel Pechersky
9679923046 Speed up update_memory_state by batching FSRS memory state calculation (#4335)
* Speed up update_memory_state by batching FSRS memory state calculation

* Replace [].as_slice() with &[]

* Improve test to test fsrs param clearing behaviour

* Rename test

* Fix bug introduced during resolving merge conflict

* Update rslib/src/scheduler/fsrs/memory_state.rs

Fix comment

Co-authored-by: user1823 <92206575+user1823@users.noreply.github.com>

---------

Co-authored-by: user1823 <92206575+user1823@users.noreply.github.com>
2026-03-04 18:23:40 +03:00
Abdo
d09401f18d Bump time crate (#4549)
* Bump time crate

* Update dependent packages
2026-02-09 20:54:50 +03:00
Abdo
47ae5abb44 Bump bytes crate (#4539) 2026-02-07 00:58:15 +03:00
llama
e0b0d0d19b feat: add i18n to launcher (#4361)
* add anki_i18n and locale_config crates to launcher

* add launcher.ftl

* add tr to state

* replace most hardcoded strings with translations

* add support for `launcher` rustcfg to trim translations

* use marker structs to denote type of translations

* move underscores into generated code

* Update cargo-license, which may fix the license order issue (dae)
2025-09-27 16:58:46 +10:00
dependabot[bot]
99c67d39cb Bump ammonia from 4.1.1 to 4.1.2 (#4355)
Bumps [ammonia](https://github.com/rust-ammonia/ammonia) from 4.1.1 to 4.1.2.
- [Release notes](https://github.com/rust-ammonia/ammonia/releases)
- [Changelog](https://github.com/rust-ammonia/ammonia/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rust-ammonia/ammonia/compare/v4.1.1...v4.1.2)

---
updated-dependencies:
- dependency-name: ammonia
  dependency-version: 4.1.2
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-23 18:14:05 +10:00
Damien Elmes
ca60911e19 Update to Rust 1.89 + latest deps 2025-09-01 14:55:49 +10:00
Damien Elmes
71ec878780 Fixes for Rust 1.89
Closes #4287
2025-09-01 14:55:49 +10:00
dependabot[bot]
6fa33777db Bump tracing-subscriber from 0.3.19 to 0.3.20 (#4296)
Bumps [tracing-subscriber](https://github.com/tokio-rs/tracing) from 0.3.19 to 0.3.20.
- [Release notes](https://github.com/tokio-rs/tracing/releases)
- [Commits](https://github.com/tokio-rs/tracing/compare/tracing-subscriber-0.3.19...tracing-subscriber-0.3.20)

---
updated-dependencies:
- dependency-name: tracing-subscriber
  dependency-version: 0.3.20
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-01 13:35:46 +10:00
Damien Elmes
e676e1a484 Exclude version numbers from cargo/licenses.json
Version numbers are not required by the license, and keeping them in means
the build breaks after merging in a dependabot update.
2025-08-19 23:48:04 +10:00
dependabot[bot]
5c07c899ec Bump slab from 0.4.10 to 0.4.11 (#4265)
Bumps [slab](https://github.com/tokio-rs/slab) from 0.4.10 to 0.4.11.
- [Release notes](https://github.com/tokio-rs/slab/releases)
- [Changelog](https://github.com/tokio-rs/slab/blob/master/CHANGELOG.md)
- [Commits](https://github.com/tokio-rs/slab/compare/v0.4.10...v0.4.11)

---
updated-dependencies:
- dependency-name: slab
  dependency-version: 0.4.11
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Damien Elmes <dae@users.noreply.github.com>
2025-08-19 19:59:48 +10:00
Luc Mcgrady
402008950c Feat/expected_workload_with_existing_cards implementation (#4243)
* https://github.com/open-spaced-repetition/fsrs-rs/pull/355

* add is_included card

* bump version

* ./check

* update package.lock

* parallellify

* bump fsrs
2025-08-06 18:01:06 +10:00
Jarrett Ye
2b55882cce Fix/use real step count to simulate (#4240)
* Fix/use real step count to simulate

* Update licenses.json
2025-08-04 16:01:26 +10:00
Luc Mcgrady
c947690aeb Feat/Use cached workload values (#4208)
* Feat/Use cached workload values

* Fix: Calculation when unchanged

* Modify constants

* Cache clearing logic

* Use function params

* use https://github.com/open-spaced-repetition/fsrs-rs/pull/352

* Revert "use https://github.com/open-spaced-repetition/fsrs-rs/pull/352"

This reverts commit 72efcf230c.

* Reapply "use https://github.com/open-spaced-repetition/fsrs-rs/pull/352"

This reverts commit 49eab2969f.

* ./check

* bump fsrs
2025-07-28 19:00:16 +10:00
Luc Mcgrady
1af3c58d40 Feat/Desired retention info graphs (#4199)
* backend part

* split memorised and cost

* slapdash frontend

* extract some simulator logic

* Add zoomed version of graph

* ./check

* Fix: Tooltip

* Fix: Simulator/workload transition

* remove "time"

* Update ts/routes/graphs/simulator.ts

Co-authored-by: user1823 <92206575+user1823@users.noreply.github.com>

* Added: Mode toggle

* Disable Dr in workload mode

* keep button order consistant between modes

* dont clear points on mode swap

* add review count graph

* Revert "dont clear points on mode swap"

This reverts commit fc89efb1d9.

* "Help me pick" button

* unrelated title case change

* Add translation strings

* fix: missing translation string

* Fix: Layout shift

* Add: Experimental

* Fix Time / Memorized

* per day values

* set review limit to 9999 on open

* keep default at currently set value

* Do DR calculation in parallel (dae)

Approx 5x faster on my machine

---------

Co-authored-by: user1823 <92206575+user1823@users.noreply.github.com>
Co-authored-by: Damien Elmes <gpg@ankiweb.net>
2025-07-28 18:55:08 +10:00
Damien Elmes
2e74101ca4 Show recent versions in launcher
Did it with Python to avoid bloating the launcher binary with
network code
2025-07-07 23:46:33 +07:00
llama
b6c70f7b75 Add search keyword to strip clozes beforehand (#4145)
* add strip_clozes fn

* add test

* replace without_combining with process_text

* update write_unqualified

* update write_regex

* add `sc:...` search option

* add test

* strip clozes before stripping combining characters

find_notes_sc           time:   [1.0398 s 1.0405 s 1.0412 s]
                        change: [-6.1276% -6.0323% -5.9401%] (p = 0.00 < 0.05)
                        Performance has improved.

* add bitflags crate

* add and use ProcessTextFlags

* update sqlwriter.rs to use bitflags
2025-07-01 16:35:21 +07:00
Damien Elmes
469fd763c7 Fix taskbar pinning on Windows
Closes #4107
2025-06-29 20:53:43 +07:00
Damien Elmes
6eb1db0f5d Switch to the windows crate 2025-06-29 16:49:20 +07:00
Damien Elmes
de7de82f76 Refactor launcher + various tweaks
- Launcher can now be accessed via Tools>Upgrade/Downgrade
- Anki closes automatically on update
- When launcher not available, show update link like in the past
- It appears that access to the modern console host requires an app
to be built with the windows console subsystem, so we introduce an
extra anki-console.exe binary to relaunch ourselves with. Solves
https://forums.ankiweb.net/t/new-online-installer-launcher/62745/50
- Windows now requires you to close the terminal like on a Mac,
as I couldn't figure out how to have it automatically close. Suggestions
welcome!
- Reduce the amount of duplicate/near-duplicate code in the various
platform files, and improve readability
- Add a helper to install the current code into the launcher env
- Fix cargo test failing to build on ARM64 Windows
2025-06-27 16:10:12 +07:00
llama
cc395f7c44 Upgrade to nom 8.0.0 (#4105)
* bump nom to 8.0.0

* update cloze.rs

* update template.rs

* update imageocclusion.rs

* update search/parser.rs

* update card_rendering/parser.rs

* replace use of fold_many0 with many0

in nom 8, `many0` doesn't accumulate when used within `recognize`
2025-06-21 19:15:19 +07:00
Damien Elmes
04996c77f3 Migrate build system to uv (#4074)
* Migrate build system to uv

Closes #3787, and is a step towards #3081 and #4022

This change breaks our PyOxidizer bundling process. While we probably
could update it to work with the new venvs & lockfile, my intention
is to use this as a base to try out a uv-based packager/installer.

Some notes about the changes:

- Use uv for python download + venv installation
- Drop python/requirements* in favour of pyproject files / uv.lock
- Bumped to latest Python 3.9 version. The move to 3.13 should be
a fairly trivial change when we're ready.
- Dropped the old write_wheel.py in favour of uv/hatchling. This has
the unfortunate side-effect of dropping leading zeros in our wheels,
which we could try hack around in the future.
- Switch to Qt 6.7 for the dev repo, as it's the first PyQt version
with a Linux/ARM WebEngine wheel.
- Unified our macOS deployment target with minimum required for ARM.
- Dropped unused fluent python files
- Dropped unused python license generation
- Dropped helpers to run under Qt 5, as our wheels were already
requiring Qt 6 to install.

* Build action to create universal uv binary

* Drop some PyOxidizer-related files

* Use Windows ARM64 cargo/node binaries during build

We can't provide ARM64 wheels to users yet due to #4079, but we can
at least speed up the build.

The rustls -> native-tls change on Windows is because ring requires
clang to compile for ARM64, and I figured it's best to keep our Windows
deps consistent. We already built the wheels with native-tls.

* Make libankihelper a universal library

We were shipping a single arch library in a purelib, leading to
breakages when running on a different platform.

* Use Python wheel for mpv/lame on Windows/Mac

This is convenient, but suboptimal on a Mac at the moment. The first
run of mpv will take a number of seconds for security checks to run,
and our mpv code ends up timing out, repeating the process each time.
Our installer stub will need to invoke mpv once first to get it validated.

We could address this by distributing the audio with the installer/stub,
or perhaps by putting the binaries in a .pkg file that's notarized+stapled
and then included in the wheel.

* Add some helper scripts to build a fully-locked wheel

* Initial macOS launcher prototype

* Add a hidden env var to preload our libs and audio helpers on macOS

* qt/bundle -> qt/launcher

- remove more of the old bundling code
- handle app icon

* Fat binary, notarization & dmg

* Publish wheels on testpypi for testing

* Use our Python pin for the launcher too

* Python cleanups

* Extend launcher to other platforms + more

- Switch to Qt 6.8 for repo default, as 6.7 depends on an older
libwebp/tiff which is unavailable on newer installs
- Drop tools/mac-x86, as we no longer need to test against Qt 5
- Add flags to cross compile wheels on Mac and Linux
- Bump glibc target to 2_36, building on Debian Stable
- Increase mpv timeout on macOS to allow for initial gatekeeper checks
- Ship both arm64 and amd64 uv on Linux, with a bash stub to pick
the appropriate arch.

* Fix pylint on Linux

* Fix failure to run from /usr/local/bin

* Remove remaining pyoxidizer refs, and clean up duplicate release folder

* Rust dep updates

- Rust 1.87 for now (1.88 due out in around a week)
- Nom looks involved, so I left it for now
- prost-reflect depends on a new prost version that got yanked

* Python 3.13 + dep updates

Updated protoc binaries + add helper in order to try fix build breakage.
Ended up being due to an AI-generated update to pip-system-certs that
was not reviewed carefully enough:
https://gitlab.com/alelec/pip-system-certs/-/issues/36

The updated mypy/black needed some tweaks to our files.

* Windows compilation fixes

* Automatically run Anki after installing on Windows

* Touch pyproject.toml upon install, so we check for updates

* Update Python deps

- urllib3 for CVE
- pip-system-certs got fixed
- markdown/pytest also updated
2025-06-19 14:03:16 +07:00
Jarrett Ye
615bbf95a1 update to fsrs-rs 4.0.0 (#4080)
* update to fsrs-rs 4.0.0

* fix ci

* update test
2025-06-14 12:48:33 +07:00
Jarrett Ye
8add993fca improve the accuracy of the expected workload calculation (#4056)
* improve the accuracy of the expected workload calculation

* ./ninja fix:minilints

* implement smoothing & a separate struct for return value

* set TERMINATION_PROB to 0.001
2025-06-04 18:20:12 +07:00
Jarrett Ye
dfee38898d calculate accurate retrievability in card info (#4034) 2025-05-26 23:25:27 +10:00
Damien Elmes
1e2f11a271 Latest FSRS 2025-04-27 19:48:43 +10:00
Jarrett Ye
90f2e06b17 Fix/missing-simulator-decay-for-FSRS-5 (#3956) 2025-04-27 17:20:13 +10:00
Jarrett Ye
7556f71b96 Update to FSRS-rs v3.0.0 (fix historic memory state) (#3946)
* Update to FSRS-rs v3.0.0 (fix historic memory state)

* format
2025-04-25 20:09:19 +10:00
Jarrett Ye
e096c462fa Feat/FSRS-6 (#3929)
* Feat/FSRS-6

* update comment

* add decay to Card

* ./ninja fix:minilints

* pass check

* fix NaN in evaluation

* remove console

* decay should fallback to 0.5 when it's None.

* Update SimulatorModal.svelte

* Update a few comments

* Update FSRS decay defaults to use constants for better maintainability and clarity

* Update rslib/src/storage/card/data.rs
2025-04-25 16:44:34 +10:00
Damien Elmes
ffbc9a77b7 Update tokio, crossbeam-channel and cargo-deny 2025-04-10 15:18:55 +10:00
Damien Elmes
475fdf04a4 Latest Rust CVEs 2025-04-10 15:03:02 +10:00
Jarrett Ye
d52889f45c Feat/simplified relearning steps logic with updated FSRS training API (#3867)
* Feat/simplified relearning steps logic with updated FSRS training API

* Update params.rs

* use ComputeParametersInput

* update fsrs-rs dependency

* update cargo/format/rust-toolchain
2025-03-20 14:04:38 +07:00
Luc Mcgrady
79b6f658c3 Feat: Simulator suspend after lapse count (#3837)
* Added: Leech suspend to simulator

* Added: leech threshold spin box

* Update git rev

* Added: Save to preset options

* ./check

* Added: "Advanced settings" dropdown

* Removed: Indent

* Added: Easy days

* Added: Sticky header

* Removed: Easy Day updating without saving

* un-nest disclosure

* bump fsrs

* Update a VSCode setting to match recent releases

* Move Easy Days above the Advanced settings

I think it's a bit more logical to have Advanced come last.

* Ensure graph fits inside screen height

* Bump fsrs version
2025-03-15 17:28:15 +07:00