For AI agents: the complete documentation index is available at https://docs.flashnerd.com/llms.txt, the full documentation bundle is available at https://docs.flashnerd.com/llms-full.txt, and this page is available as Markdown at https://docs.flashnerd.com/reference/flashnerd-format/srs.md.
Skip to main content

SRS folders, sets, and settings

Use these records when a file should create study sets as well as decks. For new learning material, include the content and any wanted sets; omit schedules and review history so newly imported linked cards start as New. Full examples are illustrative settings, not recommended values for every learner.

The downloadable schemas count name lengths in Unicode code points without trimming; package validation uses UTF-16 code units after trimming. The current app accepts longer names and shortens names to 200 UTF-16 code units and field/tag labels to 100. See package limits for the separate schema, default package, and app limits.

SRS folders

Organize SRS study sets into folders. These folders belong to the SRS hierarchy; Home/review folders are a separate collection.

Folder location

srs/srs_folders/*.jsonl, for example srs/srs_folders/folders.jsonl.

Choose any .jsonl filename. Each physical line is one complete folder object; do not wrap the records in an array. You may split folders across several files. Omit this directory if all study sets belong at the SRS root.

Folder basic example

Save this line in srs/srs_folders/folders.jsonl:

{"id":"srs-folder-study","name":"Daily Study"}

Omitting parentId places this folder at the root of the SRS hierarchy.

Folder full example

Download the comprehensive example’s srs/srs_folders/00000.jsonl, or read its expanded records below. Each object occupies one physical line in the file; the formatting here is for reading.

The parent srs-folder-study is in the same linked file. The full set links to this child folder.

The root uses parentId: null; the child supplies the root’s explicit ID. Both preserve their creation and update timestamps.

Root folder

{
  "id": "srs-folder-study",
  "parentId": null,
  "name": "Study",
  "createdAt": "2026-03-01T09:00:00.000000Z",
  "updatedAt": "2026-03-02T09:00:00.000000Z"
}

Nested folder

{
  "id": "srs-folder-languages",
  "parentId": "srs-folder-study",
  "name": "Language study",
  "createdAt": "2026-03-01T09:00:00.000000Z",
  "updatedAt": "2026-03-02T09:00:00.000000Z"
}

Folder fields

KeyRequired?Value and behavior
idNoNonempty string when supplied, unique among SRS folders. Omission creates a temporary source identity and always imports as a new folder. null, "", and non-strings are invalid.
parentIdNoID of another SRS folder in this package. Omitted or null means an SRS root folder.
nameYesNonblank display name. Default package validation allows 40 UTF-16 code units after trimming. Schema maxLength allows 40 Unicode code points without trimming.
createdAtNoTimestamp with a timezone when supplied. Omission and null mean unavailable metadata.
updatedAtNoTimestamp with a timezone when supplied. Omission and null mean unavailable metadata.

Extra properties are ignored; null for required fields is rejected. Timestamps use the shared timestamp rules. An empty parentId is not a root marker; use omission or null.

Folder relationships

parentId links to another explicitly identified record in this collection, never a Home/review folder. A study set joins a folder by setting its folderId to this folder's explicit id.

Every referenced parent must exist in this package and must supply its own id. A folder cannot be its own parent, and longer parent cycles are rejected. Parent records may appear before or after their children: package validation checks the complete folder collection.

Flashnerd imports allow six nested folder levels: the SRS root is level 0, folders occupy levels 1–6, and an SRS set may occupy level 7. A seventh folder is rejected even without a set inside it. This app limit is separate from the JSON Schema, which does not impose a folder-depth maximum.

Creating a folder does not create any study sets, decks, or cards.

Folder additional example: a nested folder

Add this line alongside the basic folder above:

{"id":"srs-folder-japanese","parentId":"srs-folder-study","name":"Japanese","createdAt":"2026-01-01T00:00:00Z","updatedAt":"2026-01-01T00:00:00Z"}

An anonymous folder at the SRS root, which cannot be a parentId or set folderId target:

{"name":"Inbox"}

The resulting hierarchy is:

SRS root
└── Daily Study
    └── Japanese

Folder schema

SRS-folder schema and complete package layout.

SRS sets

Create SRS study sets and link them to decks. A set stores its study settings and an ordered list of decks; the cards themselves remain in the content collection.

Set location

srs/srs_sets/*.jsonl, for example srs/srs_sets/daily.jsonl.

Use any .jsonl filename, with one complete set object per physical line and no surrounding array. Several sets may share a file. Omit this directory when importing content without SRS sets.

Set basic example

Save this line in srs/srs_sets/daily.jsonl:

{"id":"set-daily","folderId":"srs-folder-study","name":"Daily Tokyo","settings":{"dailyLimits":{"newCardsPerDay":10}},"deckIds":["deck-tokyo"]}

This example requires the srs-folder-study record from SRS folders above and a deck-tokyo record in the same package. A minimal companion in content/decks/tokyo.jsonl is:

{"id":"deck-tokyo","name":"Tokyo vocabulary","fields":[{"id":"term","name":"Term","side":"front","type":"text"},{"id":"definition","name":"Definition","side":"back","type":"text"}]}

This creates an empty linked deck until you also add cards.

Set full example

Download the comprehensive example’s srs/srs_sets/00000.jsonl, or read its expanded records below. Each object occupies one physical line in the file; the formatting here is for reading.

This set links to the language deck and nested SRS folder in the full package. Its settings include every supported property. The linked file also contains set-dart, with custom weekday scheduling enabled. See complete shared settings for that variant.

{
  "id": "set-travel",
  "folderId": "srs-folder-languages",
  "name": "Travel review",
  "createdAt": "2026-03-01T09:00:00.000000Z",
  "updatedAt": "2026-03-02T09:00:00.000000Z",
  "settings": {
    "version": 1,
    "cardDisplay": {
      "showTag": false,
      "showSrsState": true,
      "showStruggleStatus": true,
      "struggleThreshold": 6,
      "recoveryThreshold": 3
    },
    "reviewBehavior": {
      "maximumLoggedTime": 90,
      "reviewButtonDisplay": "twoButtons",
      "showElapsedTime": true,
      "autoAdvance": true,
      "timeBeforeShowingAnswer": 4,
      "timeBeforeNextCard": 2,
      "noAnswerRating": 2
    },
    "dailyLimits": {
      "maximumReviewsPerDay": 80,
      "newCardsPerDay": 8,
      "suspendedCardsPerDay": 2,
      "maximumReviewsCustomScheduling": false,
      "newCardsCustomScheduling": false,
      "newCardsIgnoreReviewLimit": true,
      "suspendedCardsCustomScheduling": false,
      "suspendedCardsIgnoreReviewLimit": true,
      "maximumReviewsPerWeekday": [
        80,
        80,
        80,
        80,
        80,
        120,
        120
      ],
      "newCardsPerWeekday": [
        8,
        8,
        8,
        8,
        8,
        12,
        12
      ],
      "suspendedCardsPerWeekday": [
        2,
        2,
        2,
        2,
        2,
        4,
        4
      ]
    },
    "displayOrder": {
      "cardPriorityGroups": [
        [
          "learning",
          "relearning"
        ],
        [
          "new",
          "review",
          "suspended"
        ]
      ],
      "deckOrderMode": "random"
    },
    "schedulingAlgorithm": {
      "desiredRetentionPercent": 92,
      "maximumIntervalDays": 365,
      "learningSteps": [
        {
          "value": 1,
          "unit": "min"
        },
        {
          "value": 1,
          "unit": "hour"
        },
        {
          "value": 1,
          "unit": "day"
        }
      ],
      "relearningSteps": [
        {
          "value": 10,
          "unit": "min"
        },
        {
          "value": 1,
          "unit": "hour"
        }
      ]
    },
    "advanced": {
      "parametersCsv": "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"
    }
  },
  "deckIds": [
    "deck-japanese-travel"
  ]
}

Set fields

KeyRequired?Value and behavior
idNoNonempty string when supplied, unique among SRS sets. Omission creates a temporary source identity and always imports as a new set. null, "", and non-strings are invalid.
folderIdNoSRS folder ID. Omitted or null places the set at the SRS root.
nameYesNonblank display name. Default package validation allows 40 UTF-16 code units after trimming. Schema maxLength allows 40 Unicode code points without trimming.
createdAtNoTimestamp with a timezone when supplied. Omission and null mean unavailable metadata.
updatedAtNoTimestamp with a timezone when supplied. Omission and null mean unavailable metadata.
settingsNoSRS settings object. Omission uses the defaults in the settings tables; null is rejected.
deckIdsNoOrdered array of deck IDs present in this package. Omission uses []; null is rejected.

Extra properties are ignored; null for required fields is rejected. Timestamps follow the shared timestamp rules.

Omitting the entire settings property uses the full defaults in the tables below. settings: {} and partial maps preserve empty or omitted sections; Flashnerd fills missing values when converting them to app settings. See all SRS settings and defaults.

Set relationships

  • folderId refers to an explicitly identified SRS folder, not a Home/review folder. An empty string is not a root marker.
  • Each deckIds entry must identify an explicit deck in this package. A deck can be listed only once across all SRS sets, including within one list.
  • deckIds order is the stored linked-deck order. settings.displayOrder.deckOrderMode controls how new-card selection uses this order.
  • Schedules refer to this set through setId. Each scheduled card must belong to one of the set's linked decks and must have an explicit card ID.
  • SRS presets are separate reusable settings. There is no presetId field; put settings directly in this record to configure the imported set.

When importing new cards without schedules, the app initializes their linked SRS entries as New. Overriding existing records can retain existing progress; omitting progress is not a request to reset it. Including a set alone does not restore a review history.

Set additional example: an empty set at the SRS root

An anonymous empty set at the SRS root, which cannot be a schedule setId target:

{"name":"Unfiled","settings":{},"deckIds":[]}

This self-contained record needs no folders or decks:

{"id":"set-empty","name":"Future study","createdAt":"2026-01-01T00:00:00Z","updatedAt":"2026-01-01T00:00:00Z","settings":{},"deckIds":[]}

To customize review buttons, daily limits, or learning steps, add the corresponding sections from the SRS settings reference inside settings.

Set schema

SRS-set schema, SRS settings schema, and complete package layout.

SRS settings

Configure the behavior of an SRS set or save reusable settings in an SRS preset. Both records use the same structured settings object.

Settings location and basic example

This is a nested object, not a separate archive file. Put it in the settings property of a set or preset:

{
  "dailyLimits": {
    "newCardsPerDay": 10
  }
}

The surrounding set or preset remains one JSON object per physical line in its .jsonl file. The set and preset pages contain complete, compact record examples.

Settings full example

This complete settings object comes from the full SRS preset. It shows every supported section and nested property, including all weekday arrays, every review category, and learning steps in minutes, hours, and days. Use it as the nested settings object of a set or preset; it is not a separate archive member.

{
  "version": 1,
  "cardDisplay": {
    "showTag": false,
    "showSrsState": true,
    "showStruggleStatus": true,
    "struggleThreshold": 6,
    "recoveryThreshold": 3
  },
  "reviewBehavior": {
    "maximumLoggedTime": 90,
    "reviewButtonDisplay": "twoButtons",
    "showElapsedTime": true,
    "autoAdvance": true,
    "timeBeforeShowingAnswer": 4,
    "timeBeforeNextCard": 2,
    "noAnswerRating": 2
  },
  "dailyLimits": {
    "maximumReviewsPerDay": 80,
    "newCardsPerDay": 8,
    "suspendedCardsPerDay": 2,
    "maximumReviewsCustomScheduling": true,
    "newCardsCustomScheduling": true,
    "newCardsIgnoreReviewLimit": true,
    "suspendedCardsCustomScheduling": true,
    "suspendedCardsIgnoreReviewLimit": true,
    "maximumReviewsPerWeekday": [
      80,
      80,
      80,
      80,
      80,
      120,
      120
    ],
    "newCardsPerWeekday": [
      8,
      8,
      8,
      8,
      8,
      12,
      12
    ],
    "suspendedCardsPerWeekday": [
      2,
      2,
      2,
      2,
      2,
      4,
      4
    ]
  },
  "displayOrder": {
    "cardPriorityGroups": [
      [
        "learning",
        "relearning"
      ],
      [
        "new",
        "review",
        "suspended"
      ]
    ],
    "deckOrderMode": "random"
  },
  "schedulingAlgorithm": {
    "desiredRetentionPercent": 92,
    "maximumIntervalDays": 365,
    "learningSteps": [
      {
        "value": 1,
        "unit": "min"
      },
      {
        "value": 1,
        "unit": "hour"
      },
      {
        "value": 1,
        "unit": "day"
      }
    ],
    "relearningSteps": [
      {
        "value": 10,
        "unit": "min"
      },
      {
        "value": 1,
        "unit": "hour"
      }
    ]
  },
  "advanced": {
    "parametersCsv": "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"
  }
}

Settings omission, defaults, and nulls

All keys within settings are optional. The supported top-level keys are version and the six section names below.

InputResult
Entire settings property omitted from a set/presetCreates settings with all defaults shown in the tables below.
"settings": {}Uses version: 1 and six empty section maps.
A partial objectKeeps the supplied entries; missing sections stay empty and missing nested keys are not filled.
null for settings, a supported section, or a supported nested valueRejected.

Flashnerd fills missing values when converting partial maps into its app settings. The tables below identify defaults for an entirely omitted settings property, matching the app's defaults; they are not instructions to copy every default into a hand-authored file. Specify a value when its exact behavior matters.

Extra properties are ignored at every settings level, including inside learning/relearning steps. Recognized properties retain their validation: numeric strings such as "10" are not numbers, and booleans must be true/false.

Settings fields and options

version

Integer, default 1. Use 1 for this settings format. A missing version uses 1; explicit null is rejected. The format checks the integer type rather than enforcing a particular version value.

cardDisplay

KeyTypeDefaultMeaning
showTagBooleantrueShow tags during review, subject to the session's tag visibility.
showSrsStateBooleantrueShow the learning-state badge.
showStruggleStatusBooleantrueShow the struggle-status badge.
struggleThresholdInteger8Failures before a card is marked as Struggle.
recoveryThresholdInteger5Consecutive Review successes needed to recover from Struggle.

Flashnerd's card-display settings use thresholds from 1 through 9999. The format checks their integer types; use values in the app's range when authoring for Flashnerd.

reviewBehavior

KeyType / allowed valuesDefaultMeaning
maximumLoggedTimeInteger60Maximum logged review duration, in seconds.
reviewButtonDisplaytwoButtons, fourButtonsfourButtonsNumber of grading buttons shown.
showElapsedTimeBooleanfalseDisplay the elapsed review time.
autoAdvanceBooleanfalseReveal/advance automatically.
timeBeforeShowingAnswerInteger5Seconds before revealing an answer when auto-advance is enabled.
timeBeforeNextCardInteger5Seconds before moving to the next card when auto-advance is enabled.
noAnswerRatingInteger 1, 2, 3, 41Rating when auto-advance occurs without an answer: Again, Hard, Good, Easy.

These values match Flashnerd's persisted settings: camelCase button layouts and integer no-answer ratings. Import rejects the former snake_case layouts and rating names in settings; correct or regenerate archives that use them. Review-history rating continues to use again, hard, good, and easy. The two-button interface displays Again/Good; Flashnerd displays a configured 2 (Hard) as Again and 4 (Easy) as Good, while all four ratings are preserved under either layout.

dailyLimits

KeyTypeDefaultMeaning
maximumReviewsPerDayInteger150Daily review limit when weekday customization is off.
maximumReviewsCustomSchedulingBooleanfalseUse maximumReviewsPerWeekday instead of a single daily limit.
maximumReviewsPerWeekdaySeven integers[150,150,150,150,150,150,150]Review limits from Monday through Sunday.
newCardsPerDayInteger15New-card limit when weekday customization is off.
newCardsCustomSchedulingBooleanfalseUse newCardsPerWeekday.
newCardsPerWeekdaySeven integers[15,15,15,15,15,15,15]New-card limits from Monday through Sunday.
newCardsIgnoreReviewLimitBooleanfalseAllow new cards after the review limit is reached.
suspendedCardsPerDayInteger0Suspended-card allowance when weekday customization is off.
suspendedCardsCustomSchedulingBooleanfalseUse suspendedCardsPerWeekday.
suspendedCardsPerWeekdaySeven integers[0,0,0,0,0,0,0]Suspended-card allowances from Monday through Sunday.
suspendedCardsIgnoreReviewLimitBooleanfalseAllow suspended cards after the review limit is reached.

Every supplied weekday array must contain exactly seven integers, with Monday at index 0 and Sunday at index 6. Use nonnegative counts; the format checks the integer types and array length without imposing additional numeric ranges.

displayOrder

KeyType / allowed valuesDefaultMeaning
cardPriorityGroupsArray of arrays of category strings[["new","learning","relearning","review","suspended"]]Earlier groups have higher review priority.
deckOrderModesequential, randomsequentialNew-card selection follows linked-deck order or mixes across decks.

Categories are new, learning, relearning, review, and suspended. These use learning and relearning; schedule/search state strings use learn and relearn instead.

Put each category in exactly one group when authoring. Group order expresses priority; order inside a group does not prescribe the live review sequence. The format checks nested-array shape and enum values. Flashnerd normalizes duplicates, missing categories, and empty groups when loading app settings.

schedulingAlgorithm

KeyTypeDefaultMeaning
desiredRetentionPercentInteger90Target recall percentage; use 90 for 90%, not 0.9.
maximumIntervalDaysInteger36500Maximum review interval in days.
learningStepsArray of step objects[{"value":10,"unit":"min"}]Ordered learning delays.
relearningStepsArray of step objects[{"value":10,"unit":"min"}]Ordered relearning delays.

Each step requires value (integer) and unit (min, hour, or day). Additional properties are ignored:

{"value":10,"unit":"min"}

For Flashnerd, author whole retention percentages from 70 to 99, maximum intervals from 1 to 36500 days, one to five learning steps, and zero to five relearning steps. Step values should be positive. The format checks types and units without enforcing those app-level ranges or step-count limits. An empty relearning array is useful when no intermediate relearning step is wanted.

advanced

KeyTypeDefaultMeaning
parametersCsvString""Scheduler weights as comma-separated text. Empty selects the app's default weights.

The format checks only that parametersCsv is a string; a successful schema check does not establish that custom weights are usable by the scheduler. Leave it empty unless supplying a known valid set of scheduler parameters. Extra advanced properties such as autoOptimize are ignored and have no effect.

Settings relationships

Settings contain no deck, card, folder, or preset IDs. For an SRS set, linked decks are declared in the set's sibling deckIds property. For an SRS preset, the settings remain reusable until applied by the app. Settings do not supply a card's schedule or review history.

Settings additional example: weekday limits and two priority groups

Use this as the value of a set or preset's settings property:

{
  "dailyLimits": {
    "newCardsCustomScheduling": true,
    "newCardsPerWeekday": [10, 10, 10, 10, 10, 5, 5]
  },
  "displayOrder": {
    "cardPriorityGroups": [
      ["relearning", "review"],
      ["new", "learning", "suspended"]
    ],
    "deckOrderMode": "sequential"
  },
  "schedulingAlgorithm": {
    "desiredRetentionPercent": 90,
    "learningSteps": [{"value": 10, "unit": "min"}],
    "relearningSteps": []
  }
}

Compact the surrounding record onto one physical line before saving it in a .jsonl file. This formatted fragment is not a standalone package member.

Settings schema

SRS settings schema, wire enum reference, and file reference.