Anki Flashcards Sync
pendingby Olof Haglund
Pushes flashcards from notes to Anki. The flashcards are bashed on code blocks annotated with flashcard.
Obsidian Anki
NOTE: This is an early version and released early to catch hiccups in the distribution flow.
Obsidian plugin that renders flashcard code blocks as card previews and syncs them to Anki through AnkiConnect.
What it does
- Renders
flashcardcode blocks in Reading view and Live Preview. - Loads note type/card template definitions from markdown files in
Anki/. - Uses note frontmatter as card field values.
- Renders one preview card per card template with a front/back toggle.
- Replaces
{{Audio}}in preview with a play button that plays the referenced vault audio file. - Syncs flashcards to Anki (create/update) using a deterministic source tag per block.
- Auto-creates missing decks and missing note types in Anki.
Requirements
- Obsidian desktop.
- Anki desktop.
- AnkiConnect enabled in Anki (default endpoint:
http://127.0.0.1:8765).
Note type definitions (Anki/ folder)
Create one markdown file per note type under Anki/.
Only frontmatter is used.
Example: Anki/French Sentence.md
---
name: French Sentence
cards:
- name: With Sound Cue
front_template: |
{{french}}
<br>
{{Audio}}
back_template: |
{{FrontSide}}
<hr>
{{english}}
- name: Without Sound Cue
front_template: "{{french}}"
back_template: |
{{FrontSide}}
<br>
{{Audio}}
<hr>
{{english}}
style: |
.card {
font-family: Arial;
font-size: 20px;
text-align: center;
}
---
# French Sentence
This text is not read and can be used a comment to the note .
Notes:
- Quote single-line template values when using
{{...}}on one line. styleandstylingare both accepted.- If
fieldsis omitted, fields are inferred from template placeholders.
Flashcard block format
Put flashcards in normal notes using fenced code blocks:
deck: French::Sentences
note_type: French Sentence
fields:
- french
- english
- Audio
Meaning:
deck: target Anki deck (::supports subdecks).note_type: note type name matchingAnki/*.mdname.fields: frontmatter keys for this note. If omitted, inferred from the note type templates.
Field values from frontmatter
Values are read from the note's frontmatter.
Example note:
---
french: Ça va
english: How are you?
Audio: [[ca-va.wav]]
---
Audio supports:
[[file.wav]]![[file.wav]][label](file.wav)- direct vault path (
French/Sound Files/file.wav)
Sync behavior
Command: Sync flashcards to Anki
Per flashcard block:
- Resolves note type from
Anki/*.md. - Validates required fields exist in note frontmatter.
- Ensures deck exists.
- Ensures note type exists (creates if missing).
- Finds existing note by deterministic source tag.
- Creates or updates note fields and tags.
Settings
AnkiConnect URLDefault deckDefault note typeDefault tagsAuto sync(currently config only)Sync scope(active-file,vault,folder)Sync folder(when scope isfolder)
Troubleshooting
Missing frontmatter key: add the key to the source note frontmatter or adjustfields.- Audio button says
Audio not found: verify the file exists in the vault and link/path is valid. - If sync fails, the popup shows the first error and console logs detailed failures.
Security and privacy
- Preview HTML is sanitized before rendering.
- Network calls are only made to the configured AnkiConnect URL.
- Data sent to Anki is limited to resolved card fields, deck/model names, and tags for sync.
Development
npm install
npm run dev
npm run build
For plugin developers
Search results and similarity scores are powered by semantic analysis of your plugin's README. If your plugin isn't appearing for searches you'd expect, try updating your README to clearly describe your plugin's purpose, features, and use cases.