The location varies depending on your operating system:
%APPDATA%\Mochi
~/Library/Application Support/Mochi
$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.
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:
mochi.db
to something else like mochi.db.original
mochi.db.bak
to mochi.db
The location varies depending on your operating system:
~/.config/mochi/logs/Log.log
~/Library/Logs/mochi/Log.log
%USERPROFILE%\AppData\Roaming\mochi\logs\Log.log
No; there is only one pricing plan for everyone.
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.
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.
Yes, an API is available for Pro subscribers. You can find the full API documentation here.
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.
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.
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.
This usually means you need to update the system WebView for Android. Detailed instructions can be found here
Unfortunately, due to App Store policies, I am not allowed to offer subscription services within the app unless they are integrated with Apple's own billing service ("in-app purchase").
Because Mochi uses Stripe to manage payment processing and billing, I cannot include any mechanism for managing subscriptions within the app. This issue affects many apps on the App store including Spotify, Netflix, Fortnite, and many more.
That said, you can subscribe or unsubscribe from the web app (app.mochi.cards), or through any of the desktop apps by going to your account settings.
.mochi
files?In Mochi, imports use the format .mochi. These are zip files that contain the following 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:
Required:
:version
- The number 2.Optional:
:decks
- A vector of Decks.:cards
- A vector of Decks. WARNING: Cards added to this field must contain a valid :deck-id
.:templates
- A vector of Templates.:notes
- A vector of Notes. (Deprecated)Required:
:name
- A string.Optional:
: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.Required:
:id
- A keyword. (0-9A-Za-z) Should be globally unique, at least 8 characters.:name
- A string.Optional:
: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.:attachments
- A map of attachment file names to Attachments.Required:
:id
- A keyword. (0-9A-Za-z) Should be unique within a template, at least 8 characters.:name
- A string.Optional:
: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).Required:
:content
- A string. The contents of the card.Optional:
: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.:attachments
- A map of attachment file names to Attachments.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 notRequired:
:size
- The size of the attachment in bytes.:type
- The MIME type of the attachment.