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/presets.md.
Skip to main content

Presets in Flashnerd files

Presets save reusable structures or options. Include only the catalogs the user wants to import; generating cards does not require any preset catalog. Full examples demonstrate the format and do not select or apply every preset automatically.

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.

Supplied record IDs must be nonempty strings unique within their collection. Omit an ID when a preset should be new and nothing references it; explicit null, empty strings, and non-string IDs are invalid. See identity and dependency rules.

Card-template presets

Save reusable field layouts, such as a question-and-answer template. Importing a preset adds a saved template; it does not create a deck or change an existing deck.

Card-template preset location

preferences/card_template_presets/*.jsonl, for example preferences/card_template_presets/basic.jsonl.

The filename is your choice. Each file contains one complete JSON object per line, with no surrounding array. You may put several presets in one file or split them across files. Omit this directory when you have no templates to import.

Card-template preset basic example

Save this line in preferences/card_template_presets/basic.jsonl:

{"id":"template-basic","name":"Basic front and back","fields":[{"name":"Front","side":"front","type":"text","generalSettings":{"isHidden":false},"settings":{}},{"name":"Back","side":"back","type":"text","generalSettings":{"isHidden":false},"settings":{}}]}

This preset is self-contained; it needs no deck, card, tag, or media file. Both field IDs are omitted and generated during import. The preset's own id is also optional.

Card-template preset full example

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

This layout includes every field type with explicit visibility and type settings. Its TTS source refers to the Japanese field in this same preset, so that target must keep its explicit id: "field-ja-word". Other unreferenced fields may omit their IDs. Cards do not reference preset IDs; copying a preset into a deck creates that deck’s field layout.

{
  "id": "preset-template-ja",
  "name": "Every field type",
  "createdAt": "2026-03-01T09:00:00.000000Z",
  "updatedAt": "2026-03-02T09:00:00.000000Z",
  "fields": [
    {
      "id": "field-ja-word",
      "name": "Word",
      "side": "front",
      "type": "japanese",
      "generalSettings": {
        "isHidden": false
      },
      "settings": {
        "showPitchAccent": true,
        "showFurigana": true,
        "showRomaji": true,
        "annotationSetting": "hint",
        "furiganaOverrides": [
          {
            "sourceIndex": 0,
            "expectedKanji": "駅",
            "rubyOverride": "えき"
          }
        ],
        "romajiOverride": "eki",
        "romajiType": "ascii",
        "pitchOverridePattern": [
          "H",
          "L"
        ]
      }
    },
    {
      "id": "field-ja-meaning",
      "name": "Meaning",
      "side": "back",
      "type": "text",
      "generalSettings": {
        "isHidden": false
      },
      "settings": {}
    },
    {
      "id": "field-ja-audio",
      "name": "Audio",
      "side": "note",
      "type": "audio",
      "generalSettings": {
        "isHidden": false
      },
      "settings": {
        "autoplay": true
      }
    },
    {
      "id": "field-ja-photo",
      "name": "Photo",
      "side": "note",
      "type": "image",
      "generalSettings": {
        "isHidden": false
      },
      "settings": {}
    },
    {
      "id": "field-ja-speak",
      "name": "Speak",
      "side": "note",
      "type": "tts",
      "generalSettings": {
        "isHidden": false
      },
      "settings": {
        "autoplay": true,
        "sourceType": "field_reference",
        "contentSourceId": "field-ja-word",
        "locale": "ja-JP"
      }
    },
    {
      "id": "field-zh-word",
      "name": "Chinese",
      "side": "front",
      "type": "chinese",
      "generalSettings": {
        "isHidden": false
      },
      "settings": {
        "chineseType": "simplified",
        "showPinyin": true,
        "annotationSetting": "hint",
        "pinyinOverrides": [
          {
            "tokenIndex": 0,
            "pinyin": "zhan4"
          }
        ]
      }
    },
    {
      "id": "field-ja-map",
      "name": "Map",
      "side": "both",
      "type": "image_occlusion",
      "generalSettings": {
        "isHidden": false
      },
      "settings": {}
    },
    {
      "id": "field-dart-code",
      "name": "Code",
      "side": "note",
      "type": "code",
      "generalSettings": {
        "isHidden": false
      },
      "settings": {
        "selectedLanguage": "dart",
        "showLineNumbers": true,
        "wrapLines": true,
        "forceDarkMode": true,
        "showLanguageHeader": true,
        "fitToContent": false,
        "minLines": 3,
        "maxLines": 12
      }
    },
    {
      "id": "field-dart-cloze",
      "name": "Cloze",
      "side": "both",
      "type": "cloze",
      "generalSettings": {
        "isHidden": false
      },
      "settings": {}
    },
    {
      "id": "field-dart-notes",
      "name": "Notes",
      "side": "back",
      "type": "rich_text",
      "generalSettings": {
        "isHidden": false
      },
      "settings": {}
    },
    {
      "id": "field-dart-formula",
      "name": "Formula",
      "side": "note",
      "type": "tex",
      "generalSettings": {
        "isHidden": true
      },
      "settings": {
        "autoSize": false
      }
    }
  ]
}

Card-template preset fields

KeyRequired?Value and behavior
idNoNonempty string when supplied, unique among card-template presets. Omission creates a temporary source identity and always imports as a new preset. Nested field IDs are optional unless referenced by another field. Under Override Existing, an anonymous preset still receives new IDs for every field.
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.
fieldsYesOrdered array of field definitions. Maximum 20 fields under the default schema limits.

Extra properties are ignored; null for these required fields is rejected. Timestamps follow the format's timestamp rules.

Each field requires name, side, and type. Its id may be omitted unless another field references it. Supplied field IDs must be nonempty strings; null is invalid. generalSettings controls visibility; settings contains options for that field's type. Parsing supplies defaults when either settings object is omitted; the basic example includes both to show their shape. See field definitions, values, and settings for every option and its defaults.

Card-template preset relationships and layout rules

  • Supplied field IDs are local to this template and must be unique within fields. Field names must also be unique after trimming and ignoring case, even when IDs are omitted. Default package validation allows 30 UTF-16 code units per trimmed field name; the schema allows 30 Unicode code points without trimming. The app stores up to 100 UTF-16 code units. See package limits.
  • Include at least one front-capable and one back-capable field. side: "both" satisfies both requirements; note satisfies neither.
  • cloze and image_occlusion fields must use side: "both".
  • A TTS field using sourceType: "field_reference" must name an explicitly identified text, Chinese, Japanese, or cloze field in this same template. Field names, positions, and generated source IDs cannot be used as reference targets.
  • The record has no deckId, card values, or setting that automatically applies the preset. A deck carries its own field definitions.

The app gives omitted field IDs fresh UUIDs on every import, including with Override Existing. When overriding an explicitly identified preset, supplied field IDs are preserved and omitted ones are regenerated. Without override, or when the preset itself is anonymous, all fields receive fresh UUIDs. Updating a preset replaces its saved layout and does not change existing decks. App exports include every stored field ID.

Anonymous template with anonymous fields:

{"name":"Scratch template","fields":[{"name":"Front","side":"front","type":"text"},{"name":"Back","side":"back","type":"text"}]}

Card-template preset additional example: an explicit TTS target

Only the referenced Word field needs an explicit ID. Meaning and Speak receive generated IDs:

{"name":"Japanese pronunciation","fields":[{"id":"word","name":"Word","side":"front","type":"japanese"},{"name":"Meaning","side":"back","type":"text"},{"name":"Speak","side":"note","type":"tts","settings":{"sourceType":"field_reference","contentSourceId":"word","locale":"ja-JP"}}]}

Card-template preset additional example: a cloze template

This is another complete preset record. It can be the next line in the same file:

{"id":"template-cloze","name":"Cloze sentence","createdAt":"2026-01-01T00:00:00Z","updatedAt":"2026-01-01T00:00:00Z","fields":[{"id":"sentence","name":"Sentence","side":"both","type":"cloze","generalSettings":{"isHidden":false},"settings":{}}]}

The preset defines the field layout. Actual sentence text and cloze ranges belong in card values.

Card-template preset schema

Card-template preset schema, field-definition schema, and complete package layout.

SRS presets

Save a named set of study settings for reuse. Importing an SRS preset adds saved settings; it does not create a study set or automatically apply the preset to one.

SRS preset location

preferences/srs_presets/*.jsonl, for example preferences/srs_presets/daily.jsonl. A preset-only package needs only this directory. srs_presets/test.json at the archive root, pretty-printed multi-line JSON, and enclosing arrays are not read.

Choose any filename ending in .jsonl. Write one complete JSON object per physical line, without a surrounding array. Several presets may share a file. createdAt and updatedAt are optional. Omit the directory when you have no SRS presets.

SRS preset basic example

Save this line in preferences/srs_presets/daily.jsonl:

{"name":"New Cards / Day (10)","settings":{"dailyLimits":{"newCardsPerDay":10}}}

This preset needs no other package records. It specifies the new-card limit; Flashnerd supplies app defaults for unspecified settings when importing it.

SRS preset full example

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

Every settings section and property is present. The shared settings reference repeats this settings object with its option tables. These illustrative choices are not defaults that every author must include.

{
  "id": "preset-srs-custom",
  "name": "Focused weekday study",
  "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": 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"
    }
  }
}

SRS preset fields

KeyRequired?Value and behavior
idNoNonempty string when supplied, unique among SRS presets. Omission creates a temporary source identity and always imports as a new preset.
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.
settingsNoObject described in the complete SRS settings reference. Omission uses the defaults in the settings tables; explicit null is rejected.

The properties listed above are recognized; extra properties are ignored. Required properties cannot be null. Timestamps use the shared timestamp rules.

settings supports version, cardDisplay, reviewBehavior, dailyLimits, displayOrder, schedulingAlgorithm, and advanced. The SRS settings reference lists every nested key, allowed enum, unit, and default.

SRS preset relationships and defaults

There is no setId or presetId relationship in this record. To give an imported study set specific settings immediately, include its settings directly in the SRS set record.

Omitting the entire settings property is different from supplying settings: {} or partial settings. Complete defaults are filled only for an omitted property. An empty object keeps the six sections empty, while a partial object preserves only the supplied section entries. Flashnerd fills missing values when converting those maps to app settings. Explicit null values in supported settings properties are rejected.

Anonymous preset:

{"name":"Default daily","settings":{"dailyLimits":{"newCardsPerDay":10}}}

SRS preset additional example: review controls

This complete record changes grading buttons, the daily review limit, and the target retention percentage:

{"id":"srs-short-sessions","name":"Short review sessions","createdAt":"2026-01-01T00:00:00Z","updatedAt":"2026-01-01T00:00:00Z","settings":{"reviewBehavior":{"reviewButtonDisplay":"twoButtons","noAnswerRating":1},"dailyLimits":{"maximumReviewsPerDay":50,"newCardsPerDay":5},"schedulingAlgorithm":{"desiredRetentionPercent":90}}}

Settings use the same values as Flashnerd's persisted settings: twoButtons or fourButtons for the layout and integer 1 (Again), 2 (Hard), 3 (Good), or 4 (Easy) for noAnswerRating. Review-history ratings retain their string names.

SRS preset schema

SRS preset schema, SRS settings schema, and file reference.

Search presets

Save named advanced-search filters. These records store filters such as field types, deck selections, or date bounds. Search query text is not part of a preset record.

Search preset location

preferences/search_presets/*.jsonl, for example preferences/search_presets/text.jsonl.

Choose any .jsonl filename. Write one complete JSON object per line with no surrounding array. A file can contain several presets, and the directory may be omitted entirely.

Search preset basic example

Save this line in preferences/search_presets/text.jsonl:

{"id":"search-text","name":"Text fields","fieldTypes":["text"]}

This preset needs no other package records. It restricts searches to text fields and leaves other filters unrestricted.

Search preset full example

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

All filter properties are populated, including both ends of the creation and due-date ranges. Deck and tag IDs refer to companions in the full package. Available enum alternatives are listed in the tables below; a full example does not mean selecting every alternative at once.

{
  "id": "preset-search-travel",
  "name": "Travel due",
  "createdAt": "2026-03-01T09:00:00.000000Z",
  "updatedAt": "2026-03-02T09:00:00.000000Z",
  "selectedDeckIds": [
    "deck-japanese-travel"
  ],
  "selectedTagIds": [
    "tag-travel"
  ],
  "cardSides": [
    "front",
    "back",
    "both"
  ],
  "fieldTypes": [
    "japanese",
    "chinese"
  ],
  "createdFrom": "2026-01-01",
  "createdTo": "2026-03-31",
  "srsStates": [
    "new",
    "learn",
    "review",
    "relearn",
    "suspended",
    "disabled",
    "struggle"
  ],
  "srsDueFrom": "2026-03-01",
  "srsDueTo": "2026-03-15"
}

Search preset fields

KeyRequired?Value and omission behavior
idNoNonempty string when supplied, unique among search presets. Omission creates a temporary source identity and always imports as a new preset.
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.
selectedDeckIdsNoArray of exact, explicit deck IDs defined in this archive under content/decks/. Omitted or [] means all decks. Explicit null is rejected.
selectedTagIdsNoArray of exact, explicit tag IDs defined in this archive under content/tags/. Omitted or [] means no tag restriction. Explicit null is rejected.
cardSidesNoArray of front, back, both, or note. Omitted or [] means all sides.
fieldTypesNoArray of field-type strings listed below. Omitted or [] means all types.
createdFromNoInclusive lower created-date bound as YYYY-MM-DD. Omitted means unbounded.
createdToNoInclusive upper created-date bound as YYYY-MM-DD. Omitted means unbounded.
srsStatesNoArray of SRS state strings listed below. Omitted or [] means no SRS-state restriction.
srsDueFromNoInclusive lower SRS due-date bound as YYYY-MM-DD. Omitted means unbounded.
srsDueToNoInclusive upper SRS due-date bound as YYYY-MM-DD. Omitted means unbounded.

Allowed fieldTypes: text, rich_text, image, cloze, tts, audio, image_occlusion, chinese, japanese, code, tex. See fields for the meaning of each type.

Allowed srsStates: new, learn, review, relearn, suspended, disabled, struggle. The final three are search filters for availability/status flags, not additional scheduler phases.

Use real calendar dates in years 0001–9999, such as 2026-01-31; year zero, timestamps, and impossible dates are rejected for all four date bounds. Bounds are inclusive and independent of timezones. Keep each lower bound no later than its upper bound. Each date is validated, but reversed ranges are not rejected.

The reader treats null for cardSides, fieldTypes, and srsStates as an empty array, and null for the four date bounds as no bound. Omission is also sufficient for unused filters. Required keys cannot be null. Extra properties are ignored: query and searchText do not perform a text search or add a filter.

Search preset relationships and matching

  • Every selectedDeckIds entry must exactly match an explicit deck ID in this archive, and every selectedTagIds entry must exactly match an explicit tag ID. Matching is case-sensitive. Deck names and tag labels are not substituted for IDs.
  • Records already in the destination collection do not resolve archive references, even if their names, labels, or IDs match. Include the selected companions in the archive itself.
  • A preset may omit its own id, including when it selects decks or tags. Each selected companion must supply an explicit id; generated identities for companions whose IDs were omitted cannot be referenced.
  • Missing selected deck or tag IDs produce a blocking error in the app's import Step 1. Next stays disabled until a corrected archive is selected. Missing selections are never silently removed; doing so could broaden the search.

Anonymous filter preset, with no selected decks or tags:

{"name":"Text fields","fieldTypes":["text"]}
  • Selected tags use OR matching: a card may match any selected tag.
  • front, back, and both are distinct side filters. A front filter does not implicitly include a field declared as both.
  • With search text present, side/type filters scope which fields are searched. With no search text, they select cards whose templates contain matching fields.
  • Presets without deck or tag selections are self-contained. Presets do not create decks, tags, or cards.

Search preset additional example: a tag selection

Save this preset in preferences/search_presets/test.jsonl:

{"name":"Test tag","selectedTagIds":["test"]}

Also include this companion in content/tags/tags.jsonl:

{"id":"test","label":"test"}

The filter points to the tag's id, not its label. These values happen to be the same in this example; the label may differ. Both files are needed even if the destination collection already has a tag called test. If the preset should have no tag restriction, omit selectedTagIds or use []; an empty selection does not select zero cards.

Search preset additional example: a deck and date range

The following line requires the package to contain a deck with explicit ID deck-tokyo. Include this companion in content/decks/tokyo.jsonl:

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

Then add the search preset to preferences/search_presets/text.jsonl:

{"id":"search-tokyo-review","name":"Tokyo reviews this month","createdAt":"2026-01-01T00:00:00Z","updatedAt":"2026-01-01T00:00:00Z","selectedDeckIds":["deck-tokyo"],"srsStates":["review"],"srsDueFrom":"2026-01-01","srsDueTo":"2026-01-31"}

A preset with only a name is also valid and leaves every filter unrestricted.

Search preset schema

Search preset schema, wire enum reference, and file reference.

AI instruction presets

Save reusable plain-text instructions for AI card generation. Importing the catalog alone does not select a preset for a deck.

AI instruction preset location

preferences/ai_instruction_presets/*.jsonl, for example preferences/ai_instruction_presets/basic.jsonl. Omit the directory when unused. Each physical line is one complete JSON record.

AI instruction preset basic example

Write this record in the location above:

{"name":"Japanese vocabulary","instruction":"Use dictionary form.\nInclude one example per meaning."}

This standalone preset needs no decks or other companions. Its omitted ID receives a generated source identity.

AI instruction preset full example

Copy the full JSONL record:

{
  "id": "preset-ai-japanese",
  "name": "Japanese vocabulary",
  "instruction": "Use dictionary form.\n\nInclude Japanese examples with English translations.",
  "createdAt": "2026-03-01T09:00:00.000000Z",
  "updatedAt": "2026-03-02T09:00:00.000000Z"
}

AI instruction preset fields

KeyRequired?Behavior
idNoSupplied values must be nonempty strings, unique within this collection. Omission generates an identity; null is invalid. Referenced presets require explicit IDs.
nameYesNonblank name, at most 40 UTF-16 code units after trimming with default package-validation limits.
instructionYesNonblank plain text, at most 10,000 raw UTF-16 code units with default package-validation limits. Preserve paragraphs using escaped \n in JSONL; import does not trim or rewrite text.
createdAtNoTimestamp with a timezone; omitted or null means unavailable metadata.
updatedAtNoTimestamp with a timezone; omitted or null means unavailable metadata.

Unknown properties are ignored. Required properties cannot be null. JSON Schema character lengths count Unicode code points without trimming; package validation uses UTF-16 code units, so supplementary characters count twice. It trims names before checking their length and measures instruction text without trimming. The current app uses the same 10,000-unit instruction bound.

AI instruction preset deck selection and compatibility

An optional aiInstructionPresetId on a deck record selects an explicitly identified companion preset in this archive. Omission leaves an existing deck selection unchanged during override; null explicitly selects None. New decks with no selection use None. Preset names and generated IDs cannot resolve this reference.

AI instruction preset schema

Instruction-preset schema and file reference.