Frequently asked questions

Where does Mochi store data on my computer?

The location varies depending on your operating system:

  • Windows: %APPDATA%\Mochi
  • MacOS: ~/Library/Application Support/Mochi
  • Linux: $XDG_CONFIG_HOME/mochi or ~/.config/mochi

Within this directory there is a SQLite database called mochi.db that contains all of the local data for the app.

Does Mochi store backups and how can I restore from a backup?

Mochi will create a backup of your local data whenever the app auto-updates. The backup folder is stored in the directory above and named mochi.db.bak. To restore from backup you can follow these steps:

  1. Close Mochi
  2. Rename mochi.db to something else like mochi.db.original
  3. Rename mochi.db.bak to mochi.db
  4. Restart Mochi

Where is the log file stored?

The location varies depending on your operating system:

  • Linux: ~/.config/mochi/logs/Log.log
  • MacOS: ~/Library/Logs/mochi/Log.log
  • Windows: %USERPROFILE%\AppData\Roaming\mochi\logs\Log.log

Does Mochi have regional pricing or student discounts?

No; there is only one pricing plan for everyone.

Is there a one-time lifetime payment option?

No. All of the features unlocked in the Pro subscription plan require ongoing costs (servers, access to paid APIs, etc.), so it would not be sustainable to offer a one-time lifetime payment option.

How can I add colors to my card, or other formatting not supported by markdown?

While markdown itself does not support coloring, you can colorize your text by adding HTML to your documents. For example:

This word is `<span style="color:yellow">yellow</span>

In addition to supporting most HTML, you can even use markdown within HTML tags.

Does Mochi have an API?

Yes, an API is available for Pro subscribers. You can find the full API documentation here.

Which spaced repetition algorithim does Mochi use?

Mochi uses a simple spacing algorithim where the interval for a card is multiplied by a "remembering multiplier" (defined by the user, defaults to 1.8) when remembered, and multiplied by the "forgetting multiplier" (also defined by the user, defaults to 0.5) when forgotten.

Why doesn't Mochi have "easy" and "hard" buttons (Like in Anki)?

The ease system in Anki is actually quite flawed. See this article for why. There is also an additional unnecessary cognitive price that the user pays durring each review in trying to determine how difficult a card was to remember. This could maybe be solved by selecting the ease automatically through a timer, but that has its own problems.

Why does my Anki deck look weird when I import it into Mochi?

Imported Anki decks will look somewhat different in Mochi than they do in Anki due to the fact that Anki uses HTML, CSS and Javascript(!), while Mochi uses Markdown and a subset of HTML. How different they look will depend on the Anki decks themselves and how much javascript and CSS they use.

If you've imported a deck from Anki and it doesn't look right, try opening it in Anki first to confirm that it looks the way it should. Next, edit the template for that deck to remove any unnecessary HTML, CSS and Javascript. A good test is to remove all CSS and Javascript (they will be discarded when impoted to Mochi, anyway) and make sure the cards still look and work as expected. For best results, remember to use the special {{FrontSide}} tag on the back instead of repeating what's on the front.

Why do I only see a black screen on Android?

This usually means you need to update the system WebView for Android. Detailed instructions can be found here

How can I create my own .mochi files?

In Mochi, imports use the format .mochi. These are zip files that contain the following files:

  • data.edn or data.json
  • Any number of media files

The data.edn or data.json file contains information about the decks and cards to be imported. If using JSON, the file should be encoded with Transit semantics. For EDN, more information can be found here: Extensible Data Notation. The JSON format is recommended for large data sets due to the improved speed when importing. A sample data file might look like this:

{:version 2
 :decks [{:name "Sample deck"
          :cards [{:content "Sample card"}]}]
                  {:content "Another sample card"}]}]}

For a more complete example, you can export one of your own decks from your collection.

The top level data structure is a map with the following format:

Top level map


  • :version - The number 2.




  • :name - A string.


  • :id - A keyword. (0-9A-Za-z) Should be globally unique, at least 8 characters.
  • :cards - A vector of Cards.
  • :parent-id - An :id of another Deck. If provided, this deck will be nested under the parent deck in the sidebar.



  • :id - A keyword. (0-9A-Za-z) Should be globally unique, at least 8 characters.
  • :name - A string.


  • :id - A keyword. (0-9A-Za-z) Should be globally unique, at least 8 characters.
  • :content - A string. The actual mustache-enabled content of the template.
  • :fields - A map of Fields. At least one field needs to have a an ID of :name, which will act as the primary field for cards using this template and is used to represent them in parts of the UI.
  • :pos - A string. /[0-9A-Za-z]+/ The order that this template will be displayed in the template window. Templates are sorted lexicographically.



  • :id - A keyword. (0-9A-Za-z) Should be unique within a template, at least 8 characters.
  • :name - A string.


  • :type - A keyword. One of :text, :boolean, :speech, :image, :translate, :dictionary
  • :pos - A string. /[0-9A-Za-z]+/ The order that this field will be displayed. Fields are sorted lexicographically.
  • :options - A map of keywords to values. This field is only applicable for certain values of :type.
  • :lang - A string; language code; used for the :speech type. See Custom Components.
  • :from - A string; language code; used for the :translate and :dictionary field types.
  • :to - A string; language code; used for the :translate and :dictionary field types.
  • :boolean-default - A boolean. Used as a default value for the :boolean field type (checkbox).



  • :content - A string. The contents of the card.


  • :id - A keyword. (0-9A-Za-z) Should be globally unique, at least 8 characters.
  • :name - A string. The name will show up when linking to this Card from markdown, as well as in other parts of the UI.
  • :pos - A string. /[0-9A-Za-z]+/ The order that this card will be displayed, relative to others in the deck page, as well as during learning. The cards will be sorted lexicographically.
  • :reviews - A vector of Reviews.
  • :fields - A map of field ids to values. Values are usually strings, but if the field is of type :boolean, then the value should be a boolean.


Required: - :date - The date the review happened. - :due - The date when this card is due next. - :interval - An integer. The time between the last review and the next due date - :remembered? - Whether the card was remembered or not