Skip to content

YAML Schemas

All content entities are defined in YAML files placed in the appropriate content/ subdirectory.

Directory: content/locations/

id: tavern
name: '@location.tavern.name'
description: '@location.tavern.description'
banner: tavern.png
music: tavern_ambience.ogg
ambient: fire_crackling.ogg
FieldTypeDescription
idstringUnique identifier
namestringDisplay name (supports @key)
descriptionstringText shown at this location
bannerstringBanner image filename
musicstringBackground music track
ambientstringAmbient sound loop

Directory: content/characters/

id: bartender
name: '@character.bartender.name'
biography: '@character.bartender.bio'
portrait: bartender.png
location: tavern
dialogue: bartender_greeting
stats: {}
FieldTypeDescription
idstringUnique identifier
namestringDisplay name (supports @key)
biographystringCharacter background text
portraitstringPortrait image filename
locationstringStarting location ID
dialoguestringDialogue ID for conversations
statsRecord<string, unknown>Extensible stats object

Directory: content/items/

id: old_coin
name: '@item.old_coin.name'
description: '@item.old_coin.description'
icon: old_coin_icon.png
image: old_coin.png
location: inventory
stats: {}
FieldTypeDescription
idstringUnique identifier
namestringDisplay name (supports @key)
descriptionstringFull description
iconstringSmall icon for inventory grid
imagestringLarge image for detail view
locationstringStarting location: location ID, "inventory", or character ID
statsRecord<string, unknown>Extensible stats object

Directory: content/maps/

id: town
name: '@map.town.name'
image: town_map.png
scale: 1
locations:
- id: tavern
x: 200
y: 350
- id: market
x: 500
y: 200
FieldTypeDescription
idstringUnique identifier
namestringDisplay name (supports @key)
imagestringMap background image
scalenumberDistance-to-travel-time multiplier
locationsMapLocation[]Location markers
FieldTypeDescription
idstringLocation ID (must match a location entity)
xnumberX coordinate on the map image
ynumberY coordinate on the map image

Directory: content/quests/

id: odd_jobs
name: '@quest.odd_jobs.name'
description: '@quest.odd_jobs.description'
stages:
- id: started
description: '@quest.odd_jobs.stage.started'
- id: talked_to_merchant
description: '@quest.odd_jobs.stage.talked_to_merchant'
- id: complete
description: '@quest.odd_jobs.stage.complete'
FieldTypeDescription
idstringUnique identifier
namestringDisplay name (supports @key)
descriptionstringQuest description
stagesQuestStage[]Ordered list of quest stages
FieldTypeDescription
idstringStage identifier (used with SET questStage)
descriptionstringText shown in journal for this stage

Directory: content/journal/

id: tavern_discovery
title: '@journal.tavern_discovery.title'
text: '@journal.tavern_discovery.text'
category: places
FieldTypeDescription
idstringUnique identifier
titlestringDisplay title (supports @key)
textstringEntry content
categorystringCategory for grouping (e.g., "lore", "people", "places", "quest")

Directory: content/interludes/

id: chapter_one
background: /assets/images/banners/dusk_road.jpg
text: |
Chapter One: A New Beginning
The road behind you stretches long and empty.
Ahead, the lights of town flicker through the evening mist.
FieldTypeRequiredDescription
idstringYesUnique identifier
backgroundstringYesBackground image path
textstringYesNarrative text (supports @key)
bannerstringNoOptional decorative frame/border image
musicstringNoMusic track to play
voicestringNoNarration audio file
soundsstring[]NoAmbient sounds to play
scrollbooleanNoAuto-scroll text (default: true)
scrollSpeednumberNoAuto-scroll speed in px/s (default: 30)
triggerLocationstringNoLocation ID where this auto-triggers on enter
triggerConditionsCondition[]NoConditions that must pass for auto-trigger
effectsEffect[]NoEffects applied when the interlude triggers (e.g. set a “seen” flag)

Triggered via the INTERLUDE <id> DSL effect, or automatically when traveling to triggerLocation if all triggerConditions pass. See the Interludes guide.

File: content/game.yaml

id: game
startLocation: tavern
startTime:
day: 1
hour: 8
startFlags: {}
startVariables:
gold: 100
reputation: 0
_drinksBought: 0
startInventory: []
FieldTypeDescription
idstringMust be "game"
startLocationstringStarting location ID
startTime{ day: number, hour: number }Starting time
startFlagsRecord<string, boolean>Initial flags
startVariablesRecord<string, number | string>Initial variables
startInventorystring[]Item IDs the player starts with

Directory: content/locales/

Locale files are flat key-value dictionaries (not entities). They’re loaded by filename.

content/locales/en.yaml
location.tavern.name: 'The Rusty Tankard'
location.tavern.description: 'A cozy tavern with worn wooden tables.'
character.bartender.name: 'Greta'
bartender.greeting: 'Welcome! What can I do for you?'
KeyValue
Any stringTranslated text

Referenced with @key syntax in other content files. See Localization.