Repository navigation
Releases: shbernal/leitner
Release list
v0.1.3
Notes are the headline. A thought about a card — this back conflates two rules,
this front gives the answer away — now has somewhere to go, and it goes beside
the deck rather than under XDG_DATA_HOME, so it travels with the cards through
git or syncthing where a review schedule deliberately does not.
nin a session opens a composer on the card in front of you. A practice pass
can write one; nothing is scheduled by a remark.leitner note <ref> [text]files one from the shell, lists a card's notes with
the text left off, and drops one with--rm.leitner notesprints the whole
collection's andstatscounts them.- Every card has a readable reference now, shortenable while it stays
unambiguous, andleitner listprints them. - An edit through
ethat renames a card carries its notes across. A note
arriving at an occupied reference is kept, not dropped — two schedules cannot
merge, but two remarks about what is now one card are both still true.
Also in this release:
ppractises a whole deck outside the schedule, from the picker or the
completion screen. It writes no review state..hides a deck from the picker and reveals the hidden ones again;
hiddenDecksin the config is what it toggles.- Finishing a deck returns you to the picker instead of ending the session.
editorin the config names the editoreopens, ahead of$EDITOR.
Under the hood: the deck format follows Flashcard Markdown to 1.1, which is a
clarification release — the conformance corpus passes unchanged, and nothing
about what leitner parses has moved. The toolchain moves to vitest 5 and
oxlint 1.81.
v0.1.2
Added
- First-run onboarding. With no config file,
leitnernow asks where your flashcards are instead of failing. Non-interactive runs still refuse rather than guess. - Collections spread over several directories. A collection can be assembled from more than one source directory. Card ids stay relative to the root each file was found under, so adding a second directory never renames cards in the first. Nested roots are refused; a collision between two roots is warned about.
Changed
- Workflow actions pinned to their current majors.
Full changelog: v0.1.1...v0.1.2
leitner 0.1.1
First release published by CI. Install with pnpm add -g leitner.
Added
.github/workflows/publish.yml— publishes to npm on a GitHub release, using
trusted publishing (OIDC), so no npm token exists in this repository. It
re-runs the full check suite, refuses a tag that disagrees with
package.json, refuses a version already on the registry, and verifies the
built entrypoint is in the tarball before publishing.
Fixed
- The README's wrapper snippet hardcoded one machine's checkout path, so copying
it produced a script that could not run anywhere else. docs/format.mdpresented one particular.images/layout as "the"
convention; the format requires nothing of the sort.
No behaviour changes — 0.1.1 is identical to 0.1.0 at runtime.
leitner 0.1.0
First release.
leitner reviews markdown flashcards from the terminal. Every ## heading in a
file is one card — the heading is the question, everything up to the next ##
is the answer, and a *** splits a longer front from the back. Scheduling
follows the Leitner system: cards move forward when you get them right and back
when you don't.
It reads the deck format, Flashcard Markdown
1.0, as a consumer. It parses anything the format calls valid and never
refuses a file over one bad card. Nothing in it writes to your notes — review
state lives in ~/.local/share/leitner/review-state.json, never in the
markdown. The one exception is pressing e during a session, which hands the
file to $EDITOR.
Install
Not on npm yet, so install from the tag:
git clone --branch v0.1.0 https://github.com/shbernal/leitner
cd leitner
pnpm install
pnpm buildNeeds Node 24 or newer. The binary is dist/index.js; bin/leitner is the
development launcher.
Commands
leitner list [dir] # decks and card counts
leitner stats [dir] # totals, due/new/suspended, parse warnings
leitner review [dir] # interactive review session
leitner export [dir] # review state as a portable JSON bundle
leitner import <file> # merge a bundle into local state
dir defaults to sourceDir from ~/.config/leitner/config.json, falling back
to ~/notes/flashcards.
Documentation
README.md— the manual: flags, review keys, image previewsdocs/format.md— conformance class, and the card-identity scheme that decides when an edit costs you review historydocs/scheduling.md— grade transitions, queue order, the state file, config keys