World JSON format
Every world is stored as a single JSON document, editable through the Show/edit raw JSON tool in Misc Advanced Features. Raw JSON editing is unsupported and undocumented by the platform; this page is a community reference for authors who already know the world editor and want to know which JSON key each control writes, and where the two do not line up. It is accurate to the best of my knowledge as of 08/07/2026 but obviously subject to change.
The sections below follow the editor's accordion from top to bottom. Each names the JSON keys its controls produce; keys with no control of their own are listed at the end.
Three things worth knowing before editing the raw JSON:
- Extra instruction blocks and keyword instruction blocks are different arrays. The Extra instruction blocks under Main instructions write
instructionBlocks; Keyword Instruction Blocks writeloreBookEntries. They look alike in the editor but are stored separately. - "Enable" and "Use custom" checkboxes map to object-versus-null, not a boolean. Victory, defeat and the specialist instructions are written as objects (or omitted) rather than as a
true/falseflag. - Dropdowns and radio buttons store enum strings, not their labels. For example the tracked-item Visibility option "Visible to player and AI" is stored as
everyone. The exact strings are given per section.
Introducing the story[edit]
Main article: Introducing the Story.
All top-level keys. Unchecking Track version number removes version rather than zeroing it.
| Editor field | JSON key | Notes |
|---|---|---|
| Title | title |
|
| Track version number (checkbox) | version present/absent |
Unchecking removes the field |
| Version | version |
String, e.g. "0.01" |
| Automatically increase version number each edit | autoAdvanceVersion |
Default true |
| Description | description |
The world-select blurb; does not affect gameplay |
| Show some additional text on the character selection screen | charSelectText |
null when unchecked |
| Preview image (Make alternative images / Upload image) | previewImage, fullSizePreviewImage, previewImageOptions, fullSizePreviewImageOptions, currentPreviewImageIndex |
|
| Background story | background |
|
| First action | firstInput |
|
| Objective | objective |
Supports <<variable>> substitution |
Main instructions[edit]
Main article: Main instructions.
Extra instruction blocks here write instructionBlocks (always sent), a different array from the keyword blocks below.
| Editor field | JSON key | Notes |
|---|---|---|
| Detail and instructions | instructions |
|
| Extra instruction blocks (Add extra instruction block) | instructionBlocks[] |
Each block: Name to name (cosmetic), Content to content
|
| Author style | authorStyle |
|
| Design notes (Record design notes) | designNotes |
null unless the checkbox is ticked |
| Mature content (Indicate mature content) | mature, nsfw |
|
| Content warnings | contentWarnings |
Image style[edit]
Main article: Image style.
The two Prompt beginning / Prompt ending pairs are the Pre/Post keys. The named style chosen inside Change image model is a separate key from the model itself.
| Editor field | JSON key | Notes |
|---|---|---|
| Current image model / Change image model | imageModel |
e.g. "manticore" |
| Named style (inside Change image model) | imageStyle |
e.g. "photo_1" |
| Illustration guidance for characters: Prompt beginning | imageStyleCharacterPre |
|
| Illustration guidance for characters: Prompt ending | imageStyleCharacterPost |
|
| Illustration guidance for objects and scenery: Prompt beginning | imageStyleNonCharacterPre |
|
| Illustration guidance for objects and scenery: Prompt ending | imageStyleNonCharacterPost |
Tag-based models (e.g. sd_1_5) surface the four illustrationStyle{Character,NonCharacter}{High,Low}Priority fields instead of the Pre/Post pairs. Separately, the cover image is generated from imagePromptDetails - the genre, subject, appearance, clothes, setting and expression boxes in the cover-image generation dialog, distinct from the style fields above.
Player character options[edit]
Main article: Player character options.
The Customization settings checkboxes are the six allowChangeCharacter* booleans; Skills is a flat string array. Skill scores clamp 0-5.
| Editor field | JSON key | Notes |
|---|---|---|
| Skills | skills[] |
|
| Customization settings | allowChangeCharacterName / Description / Skills / ItemValues / Portrait / NewPortrait |
|
| Characters (Add character / Generate character with AI) | possibleCharacters[] |
Per character: Name to name, description to description, short id to characterId, per-skill scores to the skills dict (0-5), portraits to portrait*, the portrait-generation boxes (genre, subject, appearance, clothes, setting, expression) to portraitPromptDetails, and any per-character starting values to initialTrackedItemValues - this is where a "depends on which character" tracked item stores its values, not on the item.
Victory and defeat[edit]
Main article: Victory and defeat.
Each Enable checkbox toggles the whole object against null.
| Editor field | JSON key | Notes |
|---|---|---|
| Enable victory condition | victoryCondition object vs null |
|
| Victory condition | victoryCondition.condition |
|
| Text shown on victory | victoryCondition.text |
|
| Enable defeat condition | defeatCondition object vs null |
|
| Defeat condition | defeatCondition.condition |
|
| Text shown on defeat | defeatCondition.text |
Both objects also carry "alreadyFired": false on export.
Other characters[edit]
Main article: Other characters.
Writes NPCs. Note Brief summary is one_liner (not summary), and several JSON fields have no control on the form.
| Editor field | JSON key | Notes |
|---|---|---|
| Name | name |
|
| Brief summary | one_liner |
Only info visible to the AI until the NPC or location is mentioned |
| Character detail | detail |
|
| Appearance | appearance |
|
| Location | location |
No form control: secret_info, names[] (aliases), img_appearance, img_clothing. NPCs cannot be referenced by <<variables>>.
Keyword instruction blocks[edit]
Main article: Keyword Instruction Blocks.
Writes loreBookEntries (keyword-gated) - the counterpart to the always-on instructionBlocks under Main instructions. The comma-separated Keywords box becomes a JSON array.
| Editor field | JSON key | Notes |
|---|---|---|
| Name | name |
Cosmetic |
| Keywords | keywords[] |
Comma-separated string in the editor; array in JSON |
| Content | content |
Tracked items[edit]
Main article: Items to track.
Writes trackedItems. The dropdowns and radios store enum strings, not their labels.
| Editor field | JSON key | Notes |
|---|---|---|
| Name | name |
Referenced elsewhere as <<name_lowercased>> |
| Data type (dropdown) | dataType |
Text to text, Number to number, XML to xml |
| Description of what this item signifies | description |
|
| Visibility (dropdown) | visibility |
Label to enum; six values (below) |
| Automatically update tracked item (checkbox) | autoUpdate |
|
| Update instructions | updateInstructions |
|
| Initial value at start of game (radios) | initialValueBasedOnPC |
see mapping below |
| Initial value for all characters | initialValue |
Literal, or a phrase the AI resolves |
Initial value radios to initialValueBasedOnPC:
| Radio label | Enum value |
|---|---|
| Initial value is always the same | same
|
| Initial value depends on which character the player chooses | character
|
| Initial value can be entered by player | player
|
| (no radio; JSON-only) | world
|
visibility takes one of six enum strings: everyone, ai_only, ai_only_boring, player_only, hidden, hidden_boring.
The _boring variants (ai_only_boring, hidden_boring) are the same as ai_only and hidden - no mechanical difference except to potentially flag the content as "not worth paying attention to" for the AI.
Trigger events[edit]
Main article: Trigger events.
Writes triggerEvents. The condition and effect pickers are arrays of typed objects; the flags at the bottom of a trigger are three separate keys.
| Editor concept | JSON key |
|---|---|
| Trigger event (name + description) | triggerEvents[].name, .description
|
| Situation when the trigger fires | triggerConditions[] (7 condition types)
|
| What it does | triggerEffects[] (22 effect types)
|
| Fire more than once / evaluate at game start / nested AND-OR | canTriggerMoreThanOnce, triggerOnStartOfGame, advancedLogic
|
Specialist instructions[edit]
Main article: Specialist Instructions.
Each Use custom... checkbox gates whether its key is written at all. The Hide skills from player checkbox also lives here, beside the evaluation instructions.
| Editor field | JSON key | Notes |
|---|---|---|
| Use custom evaluation instructions | evaluationRequest |
Omitted when unchecked |
| Hide skills from player (checkbox, with the evaluation instructions) | hideSkillSystem |
Hides native skills from the chooser, customiser and character sheet. Not in the base schema, and not preserved on export/import - hand-carry it through JSON fix chains. Side effect: also hides character-select tracked items that use character-specific values and are not a list of options |
| Use custom description instructions | descriptionRequest |
Omitted when unchecked |
| Use custom summarisation instructions | summaryRequest |
Omitted when unchecked |
Misc advanced features[edit]
Main article: Misc Advanced Features.
| Editor field | Maps to | Notes |
|---|---|---|
| Using variables / View variable names and equation options | the variables and equations system | Not a stored key; affects how <<...>> tokens resolve everywhere |
| Enable AI-specific instruction blocks | enableAISpecificInstructionBlocks |
Unlocks per-block selectedAIProfiles
|
| Show/edit raw JSON | the whole document | Unsupported and undocumented |
Raw-JSON gotchas: edits in the JSON pane save only when you press Import JSON to world; edits made elsewhere in the editor do not appear in the pane until you press Refresh raw JSON.
Permissions[edit]
The Permissions section is documented on World editing.
| Editor field | JSON key | Notes |
|---|---|---|
| Allow others to edit this adventure | permissionsOnceShared.editing |
Default true |
| Allow others to share this adventure | permissionsOnceShared.sharing |
Default true |
Order and generated fields[edit]
positionInList on each tracked item, NPC, trigger, instruction block and character records its order in its list - the up/down arrows beside each entry in the editor move it. The illustration prompt objects imagePromptDetails (cover image) and each character's portraitPromptDetails are the genre/subject/appearance/clothes/setting/expression boxes in the cover- and portrait-generation dialogs.
These keys really have no editor control - set automatically or reachable only from the raw JSON:
| JSON key | Where it comes from |
|---|---|
schemaVersion |
Set by the platform |
favorite |
The star toggle on the world card, not the editor |
recommendedAIModel |
Largely vestigial |
See Also[edit]
- World editing - the index of all editor sections
- Misc Advanced Features - the raw JSON editor, exporter and importer
- Variable names - the <<variable>> and equation system
- Trigger events
- Items to track