Table of Contents

I'm building and using a space repetition system (like Anki ). It started as a web application but I'm merging more and more of it into Emacs.

For the documentation of the emacs version, see Emacs Flashcards .


A card has a front and a back side, usually with a question and its answer. Both can be styled using markdown .

Some types of cards can have a plain-text answer, too.

Each card an ease flashcards_673da146f37b573244cebaca15d4119aa0461ae8.svg value (default 2.5) assigned to it that determines how often it needs to be repeated.

The first few intervals (one minute, ten minutes, one day) are pretty short and meant for learning the card, after that the next review intervals flashcards_05d0964221c26d00a646b6e9eb624d15b99283a0.svg depend on the cards ease.


Type: Front / Back

Equivalent to writing stuff on a 3x5 card, useful to learn translations and definitions of things.

Type: Question / Answer

Has a third field, 'Answer'. When reviewing it, you'll need to type it in as text that is compared to the stored answer. The "Back / Explaination" field is optional and can be used to write down some more datails about the answer.

After submitting, you can compare your answer with the stored one. If they are the same, the "Again" button is hidden, but you can rate how easy it was to recall the answer.

Otherwise the bottom of the card shows a visualisation of the difference between the two answers and you can determine yourself if was minor ( s instead of str ) or if you need to repeat that card.

Compound Cards / Deletions

A way to create and edit multiple cards that belong together at the same time, e.g. for Cloze Tests .

Cards must have at least one deletion, surrounded by flashcards_529b1f2fec3f877446ef14df44866e2a438768b9.svg and flashcards_7709f0edf9d3c92cf77f36d2fa51c1e51e27a306.svg in the card front field.

Let's say you want to learn the first few digits of flashcards_5fa4fe81f22b28c414b6940ef9e28061bea6096e.svg . A deletion might look like this:


Type: Cloze Deletion

Removes just one of the marked deletions at a time, creating a "hole" in the card.

Type: Enumeration

Removes one of the marked deletions and all the ones after it, useful for learning lists of things.


Right now editing deletions in a way that keeps the overall count the same seems to work, adding or removing them might break stuff.

Hotkeys outdated


  • p h => Open Page "Home"
  • p r => Open Page "Review"
  • p d => Open Page "Decks"
  • p s => Open Page "Settings"
  • p ? => Open Page "Search"

Deck List / Card List

Each deck / card is marked with a unique combination of one or more letters, use c $combination to open one of them.

Deck List

  • a => Create a new deck

Card List

  • a c => Add a new card
  • a d => Add a new deletion
  • a t => Add a new translation


  • enter => Flip a card
  • a => Rate as "Again"
  • h => Rate as "Hard"
  • g => Rate as "Good"
  • e => Rate as "Easy"

Text Formatting

Cards fronts and back are formatted using org-mode markup, for better integration with Emacs.

Export / Import outdated

The import feature (Deck -> Import) uses a pretty simple JSON based format:

  "cards": ["<card>"],
  "generator_cards": ["<generator_card>"]

Both cards and cloze_deletions are optional and can be empty arrays, too.

Cards need to look like this:

  "front": "front ...",
  "back": "back ...",
  "answer": "answer ...",
  "type": "<card_type>",
  "suspended": true | false,

answer , back and suspended are optional. Valid types are:

  1. "simple" for Front / Back cards
  2. "text_input" for Question / Answer cards
  3. "keys" for Keystroke cards

Generator cards need to look like this:

  "front": "front ...",
  "type": "<card_type>"

Valid types are:

  1. "cloze" for Cloze Deletions (holes in the text)
  2. "enum" for Enumerations

Import from Anki

Anki import has been deprecated in favor of an internal JSON based format, so it is necessary to convert between the two formats first.

  1. Inside Anki, select a deck and export it as .txt
  2. Use the ruby script below (our your own) to convert it to JSON
  3. On the flashcards site, select a deck, "Import" and upload the generated file
require "json"

if ARGV.size != 2
  puts "USAGE: convert input.txt output.json"
  cards = []

  File.open(ARGV[0]).each do |line|
    tokens = line.chomp.split("\t")
    cards << {front: tokens[0], back: tokens[1], type: "simple"}

  File.open(ARGV[1], "w") do |file|
    payload = { cards: cards }


Time Format (in card headers)

  • Y , years
  • M , months
  • D , days
  • h , hours
  • m , minutes
  • s , seconds


If you have an idea how this page could be improved or a comment send me a mail.