A Tinder/Anki-style flashcard view for Obsidian. Point it at a folder of notes — each note becomes a flashcard — and swipe or tap through them with SM-2-style spaced repetition scheduling.
A card counts as not-yet-learned until you rate it something other than Again — being failed doesn't get it out of that budget. Those cards are taken oldest-failure-first, and only once they run out are never-seen notes added, in the order they were created. So the backlog is worked through in stable batches; when you have time for more, reopen the view for the next one.
Each note in the quizz directory is one flashcard:
Front: the note's front frontmatter field. Write it as a list when the question needs more than one line — one entry per line, an empty entry for a blank line:
---
front:
- Fill in the blank:
-
- I ____ to the station every morning
---
Back: one row per back-<label> frontmatter key, shown in the order they're written in the file, e.g.:
---
tags: [vocab]
front: example
back-meaning: "a thing characteristic of its kind, or illustrating a rule"
back-synonyms: "instance / illustration / case"
---
Repeated labels need unique key names (e.g. back-meaning①/ back-meaning②).
Scheduling: the plugin manages sw-due, sw-interval, sw-ease frontmatter automatically once you rate a card for the first time — don't edit these by hand.
The front value and any back-* value can mark a phrase as speakable with
!tts[<text>](<lang>[, auto]). The bracketed text is what the card displays —
tapping it (or the 🔊 next to it) reads it aloud in the given language:
---
front: '!tts[decision](en-US, auto)'
back-意味: '!tts[決断](ja-JP) (けつだん)'
back-例文: 'A conclusion reached after consideration. !tts[It was a hard decision.](en-US)'
---
<lang> is a BCP-47 tag (en-US, en-GB, ja-JP, …) and is required. A
matching system voice is used when one is installed, otherwise the speech
engine picks its own fallback for that language.auto makes the phrase read itself as soon as its side becomes visible —
the question when the card reaches the top of the stack, the answer when you
flip it. Without it, the phrase only speaks when tapped. Write it bare and
lower-case, like the language: "auto" and AUTO aren't recognised.auto phrases only the first one plays; tap the rest.! as a tag indicator, wrap the value in
quotes ('…') whenever it starts with !tts.bun install — install dependenciesbun run dev — watch build (writes to dist/)bun run dev:web — browser-only dev environment (LocalRepository/
LocalUI, no real Obsidian needed) at http://localhost:3000bun run build — one-off build (TS bundle + Tailwind CSS)bun test — run the test suite (bun test <file> for a single file)Bump version in manifest.json, then run ./release.bash: it tags the
commit with that version and pushes the tag, which triggers the Release
GitHub Actions workflow. The workflow builds with bun run build:release and
creates a draft GitHub Release with manifest.json, dist/main.js and
dist/styles.css attached as loose files.
ReviewLog (an ease/interval/due diff per review, src/core/log.ts) exists but nothing writes it anywhere yet.