Repository navigation
Log Format
Source of truth: this wiki page.
Settings → Export review log saves a profile's history as one UTF-8 text
file, fluenough-<profile>-reviews.jsonl. Import review log reads such a
file back. The format is JSON Lines: one JSON object
per line, \n between them.
The file holds what happened, and of scheduling state only what cannot be
worked out again from it: FSRS's parameters as fitted to the learner, per
language and skill (parameters lines). Intervals, stabilities and due
dates are recomputed from the grades on import, with those parameters, so a
restored phone schedules exactly as before, and a backup stays valid
whatever the scheduler becomes.
{"format":"fluenough-review-log","version":1}
{"type":"review","ts":"2026-09-28T13:34:05.678Z","deck":"hi-en-market","card":"hi-0231","mode":"production","grade":4,"elapsed_ms":3120,"answer":"बाज़ार"}
{"type":"review","ts":"2026-09-29T02:10:00.000Z","deck":"hi-en-market","card":"hi-0231","mode":"recognition","grade":3,"elapsed_ms":2400}
{"type":"leech","ts":"2026-10-02T11:00:00.000Z","card":"hi-0231","mode":"production","kind":"setAside"}
{"type":"parameters","ts":"2026-10-03T08:15:00.000Z","language":"hi","mode":"production","w":[0.212,1.2931,2.3065,8.2956,6.4133,0.8334,3.0194,0.001,1.8722,0.1666,0.796,1.4835,0.0614,0.2629,1.6483,0.6014,1.8729,0.5425,0.0912,0.0658,0.1542],"reviews":1480,"loss_before":0.3412,"loss_after":0.3297}The first non-blank line. A file without it is not a review log.
| Field | Notes |
|---|---|
format |
Always fluenough-review-log. |
version |
1. An app refuses a file whose version is newer than it reads. |
One per answered card, oldest first: a row of the reviews table
(Architecture).
| Field | Required | Notes |
|---|---|---|
type |
yes |
review. |
ts |
yes | When it was answered: ISO 8601, in UTC. Read back in local time. |
deck |
yes | The deck it was answered in. Not part of the pair: a card listed in several decks has one schedule (ADR-0018). |
card |
yes | Card id, permanent (AGENTS.md rule 1). |
mode |
yes |
recognition, production, listening, grammar or speaking. |
grade |
yes | The grade, a whole number 0–5, read by FSRS as a rating (ADR-0033): 0–2 Again, 3 Hard, 4 Good, and 5 Easy when there is no answer (the learner rated it), Good when there is (typed exactly). |
elapsed_ms |
yes | How long the answer took, in milliseconds. |
answer |
no | What was typed, or for speaking what the recogniser heard. Absent for a self-graded review, and only then: its absence makes a grade of 5 Easy. |
script |
no | The script the card was shown in, or the answer typed in, when the learner learns it, such as devanagari (#653). Absent for transliteration, a script not learned, and reviews from before it was kept. What the script skills are worked out from. |
asked |
no | How the card was asked: own (typed, rated or said), chooseMeaning, chooseWord, hearAndChoose, hearMeaning, matchPairs, rearrange, chooseFormMeaning or chooseForm (#653). Absent for reviews from before it was kept. |
One per action taken on a leech, oldest first: a row of leech_actions.
| Field | Required | Notes |
|---|---|---|
type |
yes |
leech. |
ts, card, mode
|
yes | As for a review. An action is on the pair, in whichever deck; a deck from an older file is ignored. |
kind |
yes |
reset, undoReset, setAside or bringBack. |
One per language and skill that has been fitted (Settings → Adjust to me,
or the automatic refit; ADR-0035), after the reviews and
leech actions, by language and then mode: a row of fsrs_parameters.
A fit starts from the one before it, so these cannot be worked out again from the reviews; they are the one piece of scheduling state a backup keeps. A language with none for a skill is scheduled with that skill's set from the language most recently studied, else FSRS-6's defaults.
| Field | Required | Notes |
|---|---|---|
type |
yes |
parameters. |
ts |
yes | When the fit ran: ISO 8601, in UTC. |
language |
yes | The language learned, as card ids name it: hi for hi-0231. |
mode |
yes | The skill, as for a review. |
w |
yes | FSRS-6's 21 parameters, w0 to w20, in use for the skill from that fit on. Each must lie within the range fitting clips it to (FsrsFit.isPlausible): w20 from 0.1 to 0.8, for example. A set outside them refuses the file. |
reviews |
yes | The skill's reviews in the language when it was fitted. The automatic refit waits for 10% more. |
loss_before, loss_after
|
no | The log loss, on the fit's window, of the set in use before and of the set the fit gave. The fitted set was kept when loss_after is lower; otherwise w is the set that was already in use. |
A backup from before fitting has no parameters lines, and restores as it
always did: every skill on the defaults until it is fitted.
- Blank lines are skipped.
- A line whose
typethis version does not know is skipped, so an older app still reads a newer backup's reviews. A new kind of line never needs a new version; a change to an existing line's meaning does. - Any other malformed line refuses the whole file, naming the line.
Import never replaces or deletes. It adds each review the profile does not
already hold, and each parameters line unless the profile has a later fit
of that language and skill, then rebuilds every scheduling state from the
whole log in time order. A review is the same review when its card, mode
and ts, to the millisecond, match; a leech action when those and its
kind match. So:
- importing the same file twice adds nothing the second time;
- a backup from an old phone, imported on a new one that has been used since, slots its older reviews in before the new ones.
See also: Contributing · Home
1. Learner guides
- Learner Guide
- Getting Started
- Today and Daily Lessons
- Drills and Skills
- Courses and Paths
- Proficiency Levels
- Scripts and Readings
- Readings ISO 15919
- Speaking and Listening
- Progress and Stats
- Profiles and Settings
- Backup and Restore
- Reporting a Problem
2. Deck building guides
- Deck Building Guide
- Deck Format
- Romanising Indic Languages
- Deck Licences and Quoted Books
- Deck Tools
3. Review guides
4. Translation guide
5. Building on iOS
6. Roadmap
7. Sources and attributions
8. Contribution and agentic coding