DecksMD 1.12.3
Released 24 May 2026
Changes
Spatial canvas cards
Canvas decks now do more than parse text nodes — they also turn the edges between nodes into flashcards. Connect two text nodes with an arrow and the from-node becomes the front, the to-node becomes the back, and the edge label becomes a hint shown on the card. Authoring flashcards now feels like sketching a small graph.
Authoring
- Draw an edge between any two text nodes in Obsidian's canvas. That edge becomes one flashcard.
- The from-node is the question, the to-node is the answer. The edge label (optional) renders as a hint on the card.
- Tags written into the from-node text (
#tag) are stripped from the front and stored as card tags. - File, link, and group nodes are ignored. Edges that touch a non-text node are dropped.
Graph patterns that just work
- Chains:
A → B → Cproduces two cards (A→B and B→C). The middle node is a pure graph endpoint — it is not also rule-parsed. - One-to-many:
A → B,A → C→ two cards with the same front and different backs. - Many-to-one:
A → C,B → C→ two cards with the same back and different fronts. - Cycles and self-loops are allowed; each edge produces a card.
Cloze on the back
- If the to-node contains
==highlight==markup and the deck's cloze setting is on, the edge expands into one cloze card per highlight, each sharing the same edge id, hint, and tags. Standard cloze rendering applies on the back.
Connected vs standalone
- A text node touched by any text-to-text edge is treated as a spatial endpoint only — its content is taken as-is (no header parsing).
- Nodes with no edges keep working exactly as before, parsed with the four standard formats (header-paragraph, table, cloze, image-occlusion).
Stable identity
- Card ids are derived deterministically from the canvas edge id, deck-scoped. Moving nodes around, relabeling an edge, or editing the from/to text all preserve the card's id (and its review history).
- Spatial cards skip reverse-expansion and the fuzzy rename-detection path — the edge id already gives them a stable identity.
Hint displayed on the edge
- The hint renders as a chip sitting on a horizontal divider between the front and the back of the card — visually mirroring the edge label on the canvas itself.
- Visible whenever the card has a hint (before and after reveal), so it can aid recall.
- Long hints wrap onto a second line and truncate with
…. Hover the chip to see the full text.
Getting-started canvas
- The shipped
Decks — Canvas getting started.canvasnow includes a small spatial subgraph (Photosynthesis → Sunlight "needs", Photosynthesis → Glucose "produces") so the feature is discoverable on first install.
See docs/CANVAS_DECKS.md for full details and graph-authoring tips.
Under the hood
- Schema bumped to v20: adds
edge_id TEXTandhint TEXT NOT NULL DEFAULT ''columns, and'spatial'to the flashcard type CHECK constraint. The migration adds the columns; existing markdown decks are unaffected. - New
generateSpatialFlashcardIdandgenerateSpatialClozeFlashcardIdhelpers insrc/utils/hash.tsgive spatial cards their stable ids. - The flashcard manager gains a sortable Hint column. Localized into all 13 supported languages.
Also on GitHub.