Youl Vat for the Fest-noz Vras Kalanna
Kalanna is the big New Year’s Eve fest-noz in Quimper: one night in the Pavillon of the Parc des Expositions, dancing from 8 pm to 4 am, with a bar and crêpes all night. It runs on volunteers, and Youl Vat was written to place them.
- 5
- days to staff, from setting up on 29 December to clearing out on 2 January
- 24
- stands and jobs: bar, crêpes, entrance, set-up…
- 56
- shifts in the first planning, several of them past midnight
- 3
- languages: brezhoneg, français, English
The volunteer rota used to live in a Google Sheet. Youl Vat replaces it with one address, youlvat.kalanna.bzh: anyone can read the planning on a phone, volunteers sign up for a free shift without creating an account, and the organisers run the whole event from the same screens, down to checking people in on the night.
It began as a prototype built in a conversation with Claude. The team liked the interface, so it stayed; only the data layer changed, ported to PHP and SQLite so the tool runs on any cheap shared host and moves by copying one folder. The code is open on GitHub.
How the data flows
-
In the browser
- Planning,
index.php: public, reloads the whole event every 15 seconds. - Sign-up,
inscription.php: first name, name, phone and e-mail, no account. - Organisers: one shared password, then every screen becomes editable.
- Planning,
-
One door:
api.phpGET action=all: the whole event in one JSON answer.POST signup: public, with a CSRF token, a hidden trap field and 20 sign-ups an hour per device.POST create · update · delete: organisers only, on a whitelist of tables and columns.- For the public a volunteer is “Marie D.”, phone and e-mail masked: full details never leave the server.
-
One file: SQLite
data/regie.sqlite, closed to the web.- events → stands → shifts → assignments ← volunteers, with cascading deletes.
- WAL journal, a 5-second wait, and the write lock taken first.
export.php: CSV for the spreadsheet, full JSON for backups or a change of host.
Two volunteers, one last place
Two people press “Sign up” for the last free place at the same second. The first request takes the write lock and inserts only if the shift still has room; the second waits a millisecond or two, finds it full and gets a clear answer instead of a double booking. The rule is written in the SQL itself, so no path through the PHP code can get around it.
Made for a night of fest-noz
- A shift that starts before 6 am belongs to the night before: 00:00–05:00 on 31 December is New Year’s night.
- Overlaps are flagged, and candidates are sorted by hours already planned, to share the load.
- Check-in on the night: planned, present or absent.
- Leads for each stand sign up on their own page.
- A permanent link for every shift, stand and volunteer, to send by text message.
The code on GitHubSchema and concurrency notesThe Kalanna planningFest-noz Vras Kalanna
