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. It writes CSV, JSON and iCal (.ics, for a
calendar — iCal is export only). This page is the reference for the two
file formats it reads. 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 |
Broadcast |
bcast, onair, übertragung |
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.
Doors, Broadcast and Curfew are fixed times — they never move when
the show runs late (see Running late).
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.
A file where every slot is on day 1 gets its days worked out on import, so an evening that runs past midnight (… 23:00, 00:30) puts the late slots on the next day of the same show night. A file that already has days keeps them.
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 … |
hard |
boolean | by type | true = a fixed time that never moves when running late. Without it, Doors, Broadcast and Curfew are fixed and the rest are not. |
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. |
The app's own export adds "timeZone" (for example "Europe/Berlin") next
to startDate. The import does not read it: the timetable keeps the time
zone set under This timetable.
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.