Spaced repetition that never leaves your device

Donki is a flashcard app for the browser. Cards are written in Markdown, can speak out loud, and are scheduled by the algorithm that has been carrying spaced repetition since the eighties. There is no account to make, because there is nowhere for your decks to go.

Free, installable, and it keeps working with the network off.

What you get

Everything below runs in the page you are one click away from. Nothing to install first, nothing to sign up for.

Local-first, genuinely

Decks, cards and your review history live in your browser's own database. No server holds a copy, because no server is ever sent one.

SM-2 scheduling, by session

Cards come back on the classic SuperMemo-2 curve, counted in study sessions rather than calendar days -- so a week away doesn't bury you under a backlog the moment you return.

Three ways to be asked

Self-rated recall, typed answers checked case- and accent-insensitively, and multiple choice whose wrong answers are drawn from the rest of your deck.

Cards that speak

A @tts(...) widget reads text aloud in any voice your device has, with optional pitch and rate -- and can hide the text entirely for listening practice.

Decks are one portable file

Export a deck and you get a single .donki JSON file with the images and audio embedded in it. Import it anywhere, or share a link that points at one.

Reminders that know nothing

Opt in and a nudge arrives at the hour you pick. The push carries no payload: your device counts what is due and writes the notification itself.

A card is just Markdown

Write the face the way you would write a note. GitHub-flavoured Markdown, images and audio, plus a couple of extras Donki adds for studying.

  • Bold, lists, tables and code, on the face and the answer alike.
  • Images and audio referenced by filename and carried inside the deck.
  • @tts(...) for pronunciation, dictation and listening drills.
  • A face that is nothing but audio plays itself when the card comes up.

See every option in the docs โ†’

Card face
How do you say **hello** in Japanese?

@tts(ใ“ใ‚“ใซใกใฏ){"lang": "ja-JP"}

![street sign](sign.png)
deck.donki
{
  "type": "deck",
  "name": "Japanese Basics",
  "urn": "urn:donki:anon:user123:deck456",
  "cards": [
    {
      "urn": "urn:donki:anon:user123:card789",
      "face": "How do you say 'Hello'?",
      "prompts": [
        { "type": "typed", "answer": "Konnichiwa" }
      ],
      "updatedAt": 1718000000000
    }
  ]
}

Your decks are yours to move

Export writes plain JSON -- readable, diffable, and simple enough to generate from a script or a spreadsheet. Import merges by URN and settles conflicts by last write, so re-importing an updated deck edits it in place instead of duplicating it.

Study progress is deliberately left out of the file. A deck you hand someone carries the cards, not your schedule.

Read the full format specification โ†’

Decks an agent can write

This is what the format is shaped for. A deck is one JSON document with a handful of required fields, the cards are Markdown, and every identifier is a string a model can invent โ€” so "make me a deck for the JLPT N5 verb list" is one response, not an integration.

  • Nothing to encode: a deck of text cards carries no attachments at all.
  • A text-only model still writes speaking cards โ€” @tts(...) is rendered on your device, not shipped as audio.
  • Multiple choice needs no wrong answers; Donki draws those from the rest of the deck.
  • Re-running the agent corrects the deck in place instead of duplicating it, and your review history survives.
  • Long decks can be written in parts โ€” each part uploads, and is regenerated, on its own.

The rules, and a prompt to start from โ†’

Ask for a deck
Read https://donki.3sln.com/docs/ and write me
a .donki deck of 20 Japanese greetings.

Typed answers for the readings, @tts on every
face so I can hear them, and multiple choice
for the ones that look alike.

Where your data actually is

In your browser. Decks and reviews are stored in IndexedDB on the device you study on, and the app works with the network unplugged.

The one thing that ever reaches a server is a push subscription, and only if you switch reminders on: an anonymous endpoint your browser hands out, your time zone, and the hour you picked. Nothing about what you study. Turning reminders off deletes it.

Make your first deck

It opens straight into an empty dashboard. Add a deck, add a card, and you are studying -- or import a .donki file you already have.