Anki: Suspend Manager
Automatically suspend or unsuspend the right cards to keep your Anki review
workload under control.
Each policy is one simple, ordered action: choose when it runs, which cards it
can change, and which matching cards should go first.
Features
- Release a chosen number of suspended cards automatically each Anki day.
- Suspend a chosen number of active cards automatically each Anki day.
- Suspend or unsuspend a bounded batch at most once per Anki day.
- Suspend cards when estimated long-term workload is too high, or unsuspend them
when it is low.
- Select cards with any Anki search and rank them randomly or by interval,
lapses, repetitions, difficulty, retrievability, card ID, or a numeric note
field.
- Get an automatic, editable name for each policy.
- Run one policy or all enabled policies, and preview selections in Browse.
- Review past runs, open their cards in Browse, and safely revert suspension
changes.
- Optionally reset lapse counters without changing repetitions or review history.
- Apply each run as one undoable Anki action.
Install for development
Synchronize the current source into the local Anki installation with:
./copy_to_anki.sh
The script preserves Anki-owned add-on configuration and user_files. Fully
quit and reopen Anki afterward so it loads the updated Python modules.
Build a locally installable package with:
./package.sh
The script creates matching archives at dist/anki-suspend-manager.ankiaddon
and anki-suspend-manager.ankiaddon.
Configure in Anki
Open Tools > Suspend Manager > Configure Policiesβ¦, or select the add-on
under Tools > Add-ons and choose Config. Select a policy on the left,
then edit its trigger, card filter, ranking, and single action on the right.
Use the checkbox beside a policy in the list to enable or disable it. The checkbox
and the Use this policy control stay synchronized; changes are applied when
you save the configuration.
New policies receive a suggested name based on those settings. The suggestion
keeps up with configuration changes until you edit it; choose Use suggestion
to replace an override with the current generated name.
Right-click a policy for:
- Run Policy Now: validate and save the current configuration, then evaluate
only that policy. It can run a disabled policy, but its trigger, daily quota,
and once-daily marker still apply.
- Test Selection Filter: open Browse with the policy's effective search,
including the required suspended/active state and workload scope. Testing is
read-only and does not save the configuration.
Choose Run All Now beside Save to validate and save the configuration,
then run all enabled policies in order. Tools > Suspend Manager > Run All Now
does the same execution using the last saved configuration.
On profile open and Anki day rollover, Suspend Manager automatically evaluates
daily-release, daily-suspend, once-daily, and workload policies. Daily releases
and suspensions share a stored per-policy quota across repeated evaluations. A
once-daily policy is marked as evaluated even when no cards match, so reopening
the profile cannot process another batch that day. Workload policies can run
repeatedly because their target provides the stopping condition. Unconditional
policies run only when started manually.
Policy model
Policy
βββ Trigger
βββ Selector and ranking
βββ Action, limits, and post-action
Policies run in configuration order. Each policy is evaluated after earlier
policies finish, so its trigger sees their changes. A card that changed once is
not changed again in the same run.
Workload policy example
{
"id": "cap-french-high-lapses",
"name": "Suspend high-lapse French cards",
"enabled": true,
"trigger": {
"type": "inverse_interval_sum",
"search": "deck:French",
"operator": ">",
"threshold": 200,
"target": 200
},
"selector": {
"search": "tag:low-priority",
"order_by": {
"value": "prop:lapses",
"direction": "desc"
}
},
"action": {
"type": "suspend",
"max_cards": 0,
"daily_limit": 0,
"post_actions": {
"reset_lapses": false
}
}
}
The workload search automatically includes only active cards. The selector is
intersected with that scope and with the state required by the action. Each
selected card changes workload by 1 / max(interval, 1), and selection stops as
soon as the target is crossed.
For workload policies, max_cards may be 0 so the workload target is the sole
stopping condition. Daily-release and daily-suspend policies use max_cards: 0
and a positive daily_limit. Once-daily and manual-only policies require a
positive max_cards because they have no workload target. For a once-daily
policy, max_cards is the daily cap and daily_limit must be 0.
Value selectors
random (the direction is ignored)
card:id
card:difficulty or prop:d
card:interval or prop:ivl
card:lapses, prop:lapse, or prop:lapses
card:reps or prop:reps
card:retrievability or prop:r
field:<field name>, such as field:Frequency
Note fields are parsed as numbers after HTML is stripped. Missing, non-numeric,
NaN, and infinite values sort last. Ties use card ID for stable ordering.
History, daily state, and migration
Choose History to inspect runs by local date. Open in Browse searches for
the run's cards. Revert run⦠reverses only suspension states that still match
the original run's result, skips deleted or already-reversed cards, and creates
one Anki undo entry. Revert does not restore lapse counters, daily quota, or
once-daily markers.
History, daily quota, and once-daily markers are stored per profile in the
add-on's local user_files/state.json. They are not stored in the collection,
do not sync, and are not changed by Anki undo.
Version 2 and 3 configurations are migrated in memory. Every version 2 step
becomes one policy. For version 3 configurations, unconditional policies become
once-daily when the old global automatic-running option was enabled; otherwise
they become manual-only. Daily-release and workload policies keep their trigger
settings. Saving writes the version 4 format without a global automatic switch.