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/folders-and-tags.md.
Skip to main content

Folder and tag records

Review folders organize decks; tags label cards and saved searches. Both are optional unless another record references them. SRS sets use a separate SRS folder hierarchy.

Review folders

Purpose and location

Review folders organize decks. Save records in content/review_folders/*.jsonl, for example content/review_folders/folders.jsonl. Any direct-child filename ending in .jsonl works; one complete object per line, with no enclosing array. Omit the directory if no deck needs a folder.

Basic example

A complete record for content/review_folders/folders.jsonl:

{"id":"folder-languages","name":"Languages"}

Full example

Copy the runnable content/review_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 folder-languages is in the same linked file. Keep it when copying this child, or remove parentId to make the folder a root.

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

Root folder

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

Nested folder

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

Fields

FieldTypeRequired / omission / nullMeaning
idstringOptional; nonempty when suppliedUnique folder key, such as folder-languages. Omission creates a temporary source identity and always imports as a new folder. null, "", and non-strings are invalid.
parentIdstring or nullOptional; omission/null means rootID of another review folder in this package.
namestringRequired; null rejectedNonblank display name. Default package-validation limit: 40 UTF-16 code units after trimming; see app limits.
createdAttimestamp string or nullOptional; omission and null mean unavailableCreation instant. A new record uses import time when omitted; an override keeps its existing creation date.
updatedAttimestamp string or nullOptional; omission and null mean unavailableLast update instant. Import persists commit time when omitted.

Use the timestamp format. Extra properties are ignored.

Relationships and nesting

A deck selects this folder with folderId: "folder-languages". To nest a folder, give the parent an explicit ID and set parentId to that ID. Parents may appear in another file; folder order does not matter. Self-parenting and cycles are rejected. SRS folders form a separate hierarchy and cannot be parents here. A folder that omitted its own id cannot be a parentId or deck folderId target.

App imports allow six nested folder levels: the collection root is level 0, folders occupy levels 1–6, and a deck may occupy level 7. A seventh folder is rejected even without a deck inside it. The JSON Schema does not impose this folder-depth maximum; passing that check alone does not establish app compatibility.

Anonymous root folder, which cannot be referenced by another record:

{"name":"Inbox"}

Nested example, in addition to the basic parent above:

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

JSON Schema

Tags

Purpose and location

Tags are labels that cards and saved searches can reference. Save content/tags/*.jsonl, for example content/tags/tags.jsonl. Any direct-child filename ending in .jsonl is accepted. Put one object per line, with no enclosing array; omit the directory if nothing references a tag.

Basic example

A complete record for content/tags/tags.jsonl:

{"id":"tag-beginner","label":"beginner"}

Full example

Copy the runnable content/tags/00000.jsonl, or read its expanded records below. Each object occupies one physical line in the file; the formatting here is for reading.

The full package cards refer to this tag by tag-travel. The linked file also contains the other tags used by those cards.

{
  "id": "tag-travel",
  "label": "travel",
  "createdAt": "2026-03-01T09:00:00.000000Z",
  "updatedAt": "2026-03-02T09:00:00.000000Z"
}

Fields

FieldTypeRequired / omission / nullMeaning
idstringOptional; nonempty when suppliedUnique tag key used by tagIds and selectedTagIds. Omission creates a temporary source identity. Ordinary imports may reuse an existing tag by label. An anonymous tag cannot be a reference target.
labelstringRequired; null rejectedNonblank display label. Default package-validation limit: 20 UTF-16 code units after trimming; see app limits.
createdAttimestamp string or nullOptional; omission and null mean unavailableCreation instant. For Home/SRS collection imports, a new record uses import time when omitted; an override keeps its existing creation date. Ordinary label reuse keeps the existing dates.
updatedAttimestamp string or nullOptional; omission and null mean unavailableLast update instant. For Home/SRS collection imports, import time is used when omitted; reusing an existing tag by label keeps its dates.

label remains required. Extra properties are ignored. Tags do not use color, folder, or parent properties. See timestamp rules.

Add Card uses tag labels rather than restoring tag timestamps: it reuses existing catalog tags without changing their dates or creates new tags with creation and update dates set to import time.

Anonymous tag, which cannot appear in tagIds or selectedTagIds:

{"label":"draft"}

Relationships

A card selects tags with "tagIds":["tag-beginner"]; a search preset selects them with "selectedTagIds":["tag-beginner"]. These are object-property fragments, not complete records. The referenced tag must exist in this package and must supply its own id. The default schema limit is five tags on a card. App import keeps the first five distinct tags; author at most five to retain every selection.

JSON Schema