ONE WRITER, TWO READERS
Tramoya writes it. Pregonero reads all of it, and Muralista reads the part it needs, which is the repertoire.
the gig, and its running order
Alleen in het Engels
One gig, one file: what is played, in what order, and what the wall says at the end. gigVersion 1.
Its folder is an opaque id, minted when the gig is created and never changed. A name made from the date and the venue is a name that has to change when they do.
Tramoya writes it. Pregonero reads all of it, and Muralista reads the part it needs, which is the repertoire.
| key | type | what it holds |
|---|---|---|
gigVersion | number | |
id | string | Born at creation, never rewritten |
date | string | ISO YYYY-MM-DD. Absent until known |
venue | object | Name and city |
visuals | string | A relative pointer, conventionally ./visuals.json |
songs | array | The repertoire: id, title, and a path relative to this file |
setlist | array | The running order, as song ids |
setup | object | The setup confirmation. Absent until setup has been confirmed once |
messageHome | object | logo, url, handle, message. Every field optional |
A gig is identified from the moment it exists. Only three things are refused: not valid JSON, no gigVersion, no id. A gig with no setlist parses. Valid is not the same as ready, and readiness is a separate gate.
songs and setlist are deliberately two fields. One is the repertoire, the other is the order it is played in, and Muralista reads the first and ignores the second.
A setlist keeps its ids and reports what it cannot resolve. Deleting a song does not rewrite the record of a gig that happened.
A real gig's file, with the venue's own name in it. Only the camera's hardware identifier is removed, because that is a property of my laptop rather than of the format.
{
"gigVersion": 1,
"id": "frrw98jj8s",
"date": "2026-09-23",
"venue": {
"name": "PC Deinze",
"city": "Deinze"
},
"visuals": "./visuals.json",
"songs": [
{
"id": "hasta-calmar-el-alma",
"title": "Hasta calmar el alma",
"file": "../../../../songs/song-performance/hasta-calmar-el-alma.json"
},
{
"id": "libertad",
"title": "Libertad",
"file": "../../../../songs/song-performance/libertad.json"
},
{
"id": "tragedia-de-cerdo-asado",
"title": "Tragedia de cerdo asado",
"file": "../../../../songs/song-performance/tragedia-de-cerdo-asado.json"
}
],
"setlist": [
"hasta-calmar-el-alma",
"libertad",
"tragedia-de-cerdo-asado"
],
"setup": {
"confirmedAt": "2026-09-06T15:58:43.826Z",
"against": {
"songs": {
"hasta-calmar-el-alma": "1d316bc8",
"libertad": "f2dfcefc",
"tragedia-de-cerdo-asado": "41ca4834"
},
"visuals": "c904e535",
"display": "1920x1080@2* + 1280x800@1"
}
},
"messageHome": {
"logo": "Logo Chango Pepper - black.png",
"url": "changopepper.com",
"handle": "@changopepper",
"message": "If one person here writes, that's the night."
}
}DOWNLOAD THIS EXAMPLE →This is a snapshot of one real gig file, taken on 6 September 2026. It is a copy kept here to illustrate the format, not a live mirror — the working file goes on changing, and this one stays as it was.
Same as the song format: the page CC BY 4.0, the format itself unlicensed, reference code MIT.
CC BY 4.0 →