AJ23 downloadsWrite flashcards in your notes and review them in Anki. Incremental sync over AnkiConnect, card templates as commands, maths that never breaks, and nothing ever deleted.
Write flashcards in your notes; review them in Anki.
anki-deck: in their frontmatter. The vault is never scanned, and progress is saved after
every batch, so a large vault costs the same as its card files.$…$ and $$…$$ become Anki's \(…\) and \[…\] with a real
tokenizer: dollars in code are never maths, and $p = $ can't swallow the rest of the card.bridge::orphan in Anki, not
deleted.START/END block syntax and
<!--ID: …--> markers. Existing notes are adopted with their review history intact.Open it from the ribbon (layers icon) or the command Open study dashboard.
Languages) appear in their own
section and are never added to the day's total.The dashboard only talks to Anki while it is visible.
TARGET DECK: Biology::Cells
START
Bridge Basic
Front: What sets the resting membrane potential?
Back: Mostly K⁺ leak through open channels, with the Na⁺/K⁺-ATPase keeping gradients.
Tags: physiology
END
Note types (named "Bridge" because each one bridges a card and its note): Bridge Basic (Front, Back), Bridge Cloze (Text, Back Extra), Bridge Type
(Front, typed Back). The legacy names Basic, Cloze and Basic (type in the answer) are read as
these. Every Bridge note type also carries Context (a breadcrumb, shown small above the
question) and Source (a link back to the note, shown under the answer). Both are generated.
Put fenced blocks in the note named in settings (default Anki Desk Templates.md):
```anki-template
id: drug
label: Drug card
type: Bridge Basic
Front: {{selection.firstLine}}: mechanism, key adverse effects, one interaction?
Back: {{selection.rest}}
tags: pharm
```
Placeholders: {{selection}}, {{selection.firstLine}}, {{selection.rest}}, {{heading}},
{{note}}, {{deck}}. A template with a built-in id replaces the built-in.
Other plugins can read today's study load and open Anki Desk's card draft through a small,
versioned API. Copy src/api-types.ts into your plugin:
import { getAnkiDeskApi } from "./anki-desk-api";
const desk = getAnkiDeskApi(this.app); // null if missing, disabled or another major version
const today = await desk?.dueToday(); // { decks: [{ deck, label, minutes, … }], totalMinutes } or null if Anki is closed
desk?.draftCard({ templateId: "cloze", selection: text, note: file.basename, deck: "Biology::Cells" }, (block) => editor.replaceSelection(block));
apiVersion follows semver: minor versions only add.
http://127.0.0.1:8765 by default). Nothing is sent anywhere else. No telemetry.<!--ID: …--> markers into card blocks it has just created
in Anki, and only if the file hasn't changed since it was read.npm install
npm test # pure core, including a synthetic 8,640-note vault performance test
npm run build # main.js
npm run cli -- --vault "/path/to/vault" # preview sync outside Obsidian
npm run cli -- --vault "/path/to/vault" --apply # sync outside Obsidian
MIT licence.