Schema Reference

Complete specification for simulation JSON files.

Simulation Root

A simulation is a single JSON object with these top-level fields:

FieldTypeDescription
idstringrequiredUnique identifier, e.g. "my-demo-1"
titlestringrequiredDisplay name shown in the simulation picker
descriptionstringrequiredShort description (can be empty string)
productTypestringrequired"claude-code", "claude-code-gui", "claude-chat", "claude-cowork", or "chatgpt"
createdAtstringrequiredISO 8601 timestamp
updatedAtstringrequiredISO 8601 timestamp
metadataobjectrequiredContains exactly one config matching productType
eventsarrayrequiredOrdered list of event objects

Metadata Configs

The metadata object must contain exactly one config field matching the productType:

productTypemetadata field
"claude-code"metadata.codeConfig
"claude-code-gui"metadata.guiConfig (plus metadata.codeConfig for the embedded terminal)
"claude-chat"metadata.chatConfig
"claude-cowork"metadata.coworkConfig
"chatgpt"metadata.gptConfig

CodeConfig

FieldTypeExample
modelNamestringrequired"claude-opus-4-6"
gitBranchstringrequired"main"
workingDirectorystringrequired"/Users/dev/myproject"
initialCoststringrequired"$0.00"
initialContextnumberrequired0–100, e.g. 3

ChatConfig

FieldTypeDescription
modelNamestringrequirede.g. "Claude Opus 4"
themestringrequired"light" or "dark"
conversationTitlestringrequiredTitle shown in the header
sidebarConversationsarrayrequiredList of SidebarConversation objects
projectsarrayrequiredList of SidebarProject objects

SidebarConversation:

FieldTypeDescription
idstringrequiredUnique identifier
titlestringrequiredConversation title
timestampstringrequirede.g. "Just now", "2h ago"
isActivebooleanrequiredtrue for the current conversation

SidebarProject:

FieldTypeDescription
idstringrequiredUnique identifier
namestringrequiredProject name
conversationCountnumberrequiredNumber of conversations

CoworkConfig

FieldTypeExample
taskTitlestringrequiredTitle of the task
folderPathstringrequired"/Users/dev/project"
suggestionsarrayrequiredList of suggestion strings

Event Base Fields

Every event has these base fields:

FieldTypeDescription
idstringrequiredUnique within the simulation
typestringrequiredEvent type name
delayMsnumberrequiredMilliseconds to wait before starting
durationMsnumberoptionalOverride calculated duration

user-message

All product types · Default duration: typingEffect ? (content.length / 30) * 1000 : 0

FieldTypeDescription
contentstringrequiredThe message text
typingEffectbooleanrequiredtrue = animate typing

assistant-message

All product types · Default duration: (content.length / cps) * 1000 — slow=8, normal=20, fast=45 cps

FieldTypeDescription
contentstringrequiredMarkdown-supported message text
streamingSpeedstringrequired"slow", "normal", or "fast"

thinking

All product types · Default duration: 3500ms

FieldTypeDescription
labelstringoptionalText shown during thinking, e.g. "Analyzing codebase..."

tool-call

Code, Cowork · Default duration: 600ms

FieldTypeDescription
toolNamestringrequirede.g. "Read", "Edit", "Bash"
toolInputobjectrequiredParameter object (any shape)
descriptionstringoptionalHuman-readable label in UI
expandedByDefaultbooleanrequiredtrue = card starts open

tool-result

Code, Cowork · Default duration: 400ms

FieldTypeDescription
toolCallIdstringrequiredMust match id of a preceding tool-call
outputstringrequiredResult text
isErrorbooleanrequiredtrue if error result
isCollapsedbooleanrequiredtrue = collapsed initially

permission-prompt

Code only · Default duration: 0 (waits for response)

FieldTypeDescription
toolNamestringrequiredTool requesting permission
descriptionstringrequiredWhat permission is requested
commandstringoptionalActual command/action

permission-response

Code only · Default duration: 200ms

FieldTypeDescription
promptIdstringrequiredMust match id of a preceding permission-prompt
responsestringrequired"allow", "deny", or "allow-always"

artifact

Chat, Cowork · Default duration: 2500ms

FieldTypeDescription
artifactTypestringrequired"code", "html", "react", "markdown", "svg", "word", "pdf"
titlestringrequiredTitle on the artifact card
contentstringrequiredFull source/HTML/markdown content
languagestringoptionalSyntax hint for "code" type

Routing: "word" / "pdf" open in document viewer; all others open in simulated Chrome.

status-bar-update

Code only · Default duration: 0 (instant)

FieldTypeDescription
updatesobjectrequiredPartial update (see below)

updates object fields (all optional):

FieldTypeDescription
coststringe.g. "$0.03"
contextPercentnumber0–100
modelNamestringe.g. "claude-opus-4-6"
gitBranchstringe.g. "feature/auth"

cowork-progress

Cowork only · Default duration: 500ms

FieldTypeDescription
stepIndexnumberrequired0-based step number
stepLabelstringrequirede.g. "Scanning project"
statusstringrequired"pending", "running", "complete", "error"
detailstringoptionalAdditional status text

Events with the same stepIndex update the same step in the sidebar.

cowork-notification

Cowork only · Default duration: 300ms

FieldTypeDescription
notificationTypestringrequired"finished", "needs-input", "error"
messagestringrequiredNotification text

pause

All product types · Default duration: 2000ms

No additional fields beyond base. Use durationMs to control the pause length. Creates a deliberate break between conversation turns.

Timing Rules

The effective delay before an event starts:

effective_delay = max(event.delayMs, MIN_DELAY[event.type]) / playback_speed

MIN_DELAY values

Event typeMIN_DELAY (ms)
thinking800
assistant-message600
tool-call500
tool-result400
artifact1500
cowork-progress400
cowork-notification600
all others0

Recommended timing patterns

PatterndelayMsDuration / speed
First user message0typingEffect: true or false
Thinking after user message300–500800–1500
Assistant after thinking200–300streamingSpeed: "normal"
Tool call after assistant200–400(default 600)
Tool result after tool call100(default 400)
Artifact after assistant400–600(default 2500)
Status bar update0(instant)
Gap between turns500–1500use pause or delayMs

Conventions

Page breaks in documents

For "word" and "pdf" artifacts, split content into pages with ---PAGE--- on its own line.

Event cross-references

tool-result.toolCallId must match a preceding tool-call.id. permission-response.promptId must match a preceding permission-prompt.id.

Event IDs

Must be unique within the simulation. Convention: "e1", "msg-1", "tool-read-1".

Markdown in content

assistant-message supports markdown (bold, italic, lists, code blocks). Word/PDF artifacts support GFM tables.

Validation Checklist