File formats
The exact CSV and JSON shapes Show Clock imports and exports — with complete examples, so a spreadsheet, a script or an AI assistant can build a rundown file that imports cleanly.
On this page
Show Clock reads three things: pasted text (see Paste schedule), CSV files and JSON files. This page is the reference for the two file formats. Everything below is taken from the importer itself, not from memory; if a rule here and the app ever disagree, the app is right and we fix this page.
For AI assistants
To generate a Show Clock rundown, produce either the CSV or the JSON
shape below exactly as shown. Times are 24-hour HH:MM. CSV durations
are human units (45m, 1:30:00); JSON durations are seconds. The
day is 1-based in CSV (day) and 0-based in JSON (dayOffset).
Slot fields
Every slot, whichever format carries it, has these fields:
| Field | Meaning | Values |
|---|---|---|
| time | Start time of the slot, 24-hour | HH:MM, 00:00–23:59. 7:00 PM works only in the paste dialog, not in files. |
| type | What kind of slot it is | One of the canonical types below; any listed alias is accepted in CSV |
| label | What the crew reads | Free text |
| notes | Optional note shown under the label | Free text |
| mode | How the clock behaves in this slot | clock (wall clock, the default), countdown, countup |
| duration | Length of a countdown or count-up slot | CSV: 45m, 1h30, 90, 45:00, 1:30:00. JSON: seconds |
| alert | Flash the clock when a timed slot ends | true / false, default false |
| autoAdvance | Jump to the next slot when a timed slot ends | true / false, default true |
| day | Which day of a multi-day show | CSV day: 1, 2, 3 … JSON dayOffset: 0, 1, 2 … |
Canonical slot types
| Canonical type | Aliases accepted in CSV and paste |
|---|---|
Load-in / Get-in |
loadin, getin, aufbau |
Soundcheck |
check, sc, rehearsal, probe |
Line Check |
linecheck, line |
Doors |
door, einlass |
Set |
act, show, headliner, support — and anything unknown |
Changeover |
chg, change, umbau, turnaround |
Break |
pause, intermission, interval |
Curfew |
hardout, sperrstunde |
Load-out / Get-out |
loadout, getout, abbau |
Other |
misc |
Matching ignores case, spaces, hyphens and slashes, so Load-In,
load in and LOADIN all work. An unknown type becomes Set.
Modes
| Canonical mode | Aliases accepted in CSV |
|---|---|
clock |
wall, time, or leave the cell empty |
countdown |
down, cd |
countup |
up, cu, elapsed |
CSV
One header row, then one row per slot. Cells may be quoted; a quoted
cell may contain commas and doubled quotes (""). Encoding UTF-8.
time,type,label,notes,mode,duration,alert,autoAdvance
15:00,Load-in,Load-in,,clock,,false,true
17:00,Soundcheck,Soundcheck headliner,"Drums first, then vocals",countdown,45m,false,true
19:00,Doors,Doors,,clock,,false,true
20:00,Set,Support Act,,countup,45m,false,true
20:45,Changeover,Changeover,,countdown,15:00,true,true
21:00,Set,Headliner,Encore is planned,countdown,1h30,true,true
23:00,Curfew,Curfew,Hard out — no encore after this,clock,,false,true
Rules the importer applies:
- Columns are positional in this order:
time,type,label,notes,mode,duration,alert,autoAdvance, and optionallydayas the ninth column. The header row is recognised when it contains the wordtime,labelortype; without a header the first row is treated as data. - A four-column file (
time,type,label,notes) is valid: the missing columns take their defaults (clock, no duration, no alert, auto-advance on). - A row needs a time and a label; rows without either are skipped
silently. A row whose time is not
HH:MMwithin00:00–23:59is skipped and counted in the import message. durationfor aclockslot is ignored on import. On export it shows the gap to the next slot, so exported files round-trip.alertistrueonly when the cell saystrue;autoAdvanceisfalseonly when the cell saysfalse.
Multi-day CSV
Put the show's first day on a comment line before the header and add
the day column, 1-based:
# Show start date: 2026-10-02
time,type,label,notes,mode,duration,alert,autoAdvance,day
10:00,Load-in,Load-in,,clock,,false,true,1
19:00,Doors,Doors day 1,,clock,,false,true,1
22:30,Curfew,Curfew,,clock,,false,true,1
12:00,Soundcheck,Soundcheck,,countdown,60m,false,true,2
19:00,Doors,Doors day 2,,clock,,false,true,2
The date must be YYYY-MM-DD and a real calendar date. A missing or
invalid day cell means day 1.
JSON
Either a bare array of slot objects, or an object with startDate and
slots for a multi-day show. The only required field is targetTime;
every other field is optional and takes the default shown.
{
"startDate": "2026-10-02",
"slots": [
{ "targetTime": "15:00", "type": "Load-in / Get-in", "label": "Load-in" },
{ "targetTime": "17:00", "type": "Soundcheck", "label": "Soundcheck headliner",
"notes": "Drums first, then vocals", "mode": "countdown", "duration": 2700 },
{ "targetTime": "19:00", "type": "Doors", "label": "Doors" },
{ "targetTime": "20:00", "type": "Set", "label": "Support Act", "mode": "countup", "duration": 2700 },
{ "targetTime": "20:45", "type": "Changeover", "label": "Changeover",
"mode": "countdown", "duration": 900, "alert": true },
{ "targetTime": "21:00", "type": "Set", "label": "Headliner",
"notes": "Encore is planned", "mode": "countdown", "duration": 5400, "alert": true },
{ "targetTime": "23:00", "type": "Curfew", "label": "Curfew", "notes": "Hard out" },
{ "targetTime": "12:00", "type": "Soundcheck", "label": "Soundcheck day 2",
"mode": "countdown", "duration": 3600, "dayOffset": 1 }
]
}
| Key | Type | Default | Notes |
|---|---|---|---|
targetTime |
string | required | HH:MM, 24-hour. Slots without a valid one are dropped and counted. |
type |
string | "Set" |
Use the canonical spelling; JSON is not alias-normalised. |
label |
string | "" |
|
notes |
string | "" |
|
mode |
string or null | null |
"clock", "countdown", "countup"; null behaves like clock. |
duration |
number or null | null |
Seconds. Only meaningful with countdown / countup. |
alert |
boolean | false |
|
autoAdvance |
boolean | true |
|
dayOffset |
integer | 0 |
0 = the startDate day, 1 = the next day … |
slotOffset |
integer | 0 |
Per-slot minute offset; leave at 0 when generating. |
id |
string | generated | Omit it; the app assigns fresh ids on import. |
attachment |
object or null | null |
Only produced by the app's own export (embedded base64 file). Omit when generating. |
A bare array works for a single-day show:
[
{ "targetTime": "19:00", "type": "Doors", "label": "Doors" },
{ "targetTime": "20:00", "type": "Set", "label": "Headliner", "mode": "countdown", "duration": 5400, "alert": true }
]
Which format to use
- From a spreadsheet or a call sheet: CSV. Aliases and human durations
are accepted, so
Umbauand45mare fine. - From a script or an assistant: JSON. Canonical values, seconds, no parsing surprises, and the file round-trips through the app's own export.
- Just typing: the paste dialog, one line per slot, with the
#tagsfrom Getting started.
Importing replaces the current rundown; Show Clock asks first when the rundown is not empty, and undo brings the old one back.
Thanks for the feedback.