> 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.

# 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](https://docs.flashnerd.com/reference/flashnerd-format/srs.md#srs-folders).

## 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`:

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

### Full example

Copy the runnable <a href="https://docs.flashnerd.com/examples/flashnerd-format/full/content/review_folders/00000.jsonl" download>content/review_folders/00000.jsonl</a>, 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

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

#### Nested folder

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

### Fields

| Field       | Type                     | Required / omission / null                   | Meaning                                                                                                                                                                                  |
| ----------- | ------------------------ | -------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `id`        | string                   | Optional; nonempty when supplied             | Unique 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.               |
| `parentId`  | string or null           | Optional; omission/null means root           | ID of another review folder in this package.                                                                                                                                             |
| `name`      | string                   | Required; null rejected                      | Nonblank display name. Default package-validation limit: 40 UTF-16 code units after trimming; see [app limits](https://docs.flashnerd.com/reference/flashnerd-format/package.md#limits). |
| `createdAt` | timestamp string or null | Optional; omission and null mean unavailable | Creation instant. A new record uses import time when omitted; an override keeps its existing creation date.                                                                              |
| `updatedAt` | timestamp string or null | Optional; omission and null mean unavailable | Last update instant. Import persists commit time when omitted.                                                                                                                           |

Use [the timestamp format](https://docs.flashnerd.com/reference/flashnerd-format/package.md#timestamps-and-calendar-dates). Extra properties are ignored.

### Relationships and nesting

A [deck](https://docs.flashnerd.com/reference/flashnerd-format/decks.md) 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:

```jsonl
{"name":"Inbox"}
```

Nested example, in addition to the basic parent above:

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

<a href="https://docs.flashnerd.com/examples/flashnerd-format/schemas/review_folder.schema.json" download>JSON Schema</a>

## 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`:

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

### Full example

Copy the runnable <a href="https://docs.flashnerd.com/examples/flashnerd-format/full/content/tags/00000.jsonl" download>content/tags/00000.jsonl</a>, 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.

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

### Fields

| Field       | Type                     | Required / omission / null                   | Meaning                                                                                                                                                                                                 |
| ----------- | ------------------------ | -------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `id`        | string                   | Optional; nonempty when supplied             | Unique 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. |
| `label`     | string                   | Required; null rejected                      | Nonblank display label. Default package-validation limit: 20 UTF-16 code units after trimming; see [app limits](https://docs.flashnerd.com/reference/flashnerd-format/package.md#limits).               |
| `createdAt` | timestamp string or null | Optional; omission and null mean unavailable | Creation 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.             |
| `updatedAt` | timestamp string or null | Optional; omission and null mean unavailable | Last 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](https://docs.flashnerd.com/reference/flashnerd-format/package.md#timestamps-and-calendar-dates).

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`:

```jsonl
{"label":"draft"}
```

### Relationships

A [card](https://docs.flashnerd.com/reference/flashnerd-format/cards.md) selects tags with `"tagIds":["tag-beginner"]`; a [search preset](https://docs.flashnerd.com/reference/flashnerd-format/presets.md#search-presets) 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.

<a href="https://docs.flashnerd.com/examples/flashnerd-format/schemas/tag.schema.json" download>JSON Schema</a>
