Skip to content

Venue mode

Some events run on a venue server: a machine at the event, on a local network we set up, instead of in the cloud. Your booth calls the same routes at the same address either way. On the venue network, api.theloungebooth.com answers from the venue server. The venue server copies everything to the cloud as the event goes, and the cloud sends the gallery links.

venueMode on GET /events tells you which kind of event you’re working. GET /health answers "venue": true from the venue server and false from the cloud, so you can tell which one your booth is talking to right now.

Nothing in the routes. Register, upload and complete as on the booth page. Upload URLs point at the venue server rather than cloud storage; use the url you’re given, as always.

Three things behave differently:

  • Links go out after sync, not at complete. complete answers as usual, and the venue server’s gallery is live at once for guests on the venue Wi-Fi. The email or text reaches each guest once that session has synced.
  • The cloud gallery waits for sync. Until a session arrives, its link opened off the venue Wi-Fi says the photos aren’t online yet.
  • Sync is yours to watch. The two routes below show where the event stands and start a sync by hand.

We do this, online, before the event starts. In cloud admin, staff tick Venue mode on the event while it has no sessions. On the venue server they run bun run venue:pull, which copies the event, its sets, our staff accounts and every API key from the cloud. Your key works on the venue server unchanged.

A key made or revoked after the pull isn’t known there. Pulling again brings it across, any time before the event’s first session.

Both routes take your API key, like every other route. Every completion starts a sync. A run sends the photos the cloud doesn’t have yet, then the whole event’s sessions and guests. The cloud sends the links still owed. Repeating a run changes nothing and sends nothing twice, so a failed run just waits for the next one. Nothing is deleted from the venue server.

Where the event stands. Venue server only. No parameters.

{
"event": { "id": "7Kq2mZ0aBx91Tc", "name": "City Launch" },
"pulledAt": 1758499200000,
"triedAt": 1758501902000,
"syncedAt": 1758501902000,
"error": null,
"sent": { "sessions": 12, "photos": 187 },
"pending": { "sessions": 0, "photos": 0 },
"running": false
}
Field Type What it is
event.id, event.name id, string The event this venue server holds. It holds one at a time.
pulledAt time When the event was pulled from the cloud.
triedAt time or null When the last run started, good or not. null before the first.
syncedAt time or null When the last good run started. Everything written before then is in the cloud.
error string or null Why the last run failed, in full. null after a good run.
sent.sessions, sent.photos whole numbers What the last good run sent: the whole event so far.
pending.sessions, pending.photos whole numbers Sessions registered or completed, and photos added, since the last good run.
running boolean A run is going now.
Status Body When
404 { "error": "Nothing pulled yet." } The venue server holds no event.
409 { "error": "Sync runs on the venue server." } You reached the cloud, not the venue server, for example from off the venue Wi-Fi.

Starts a run, or queues one behind a run already going. No request body. Answers 202 Accepted with { "ok": true } at once, because pushing an event’s photos can outlast your HTTP timeout. Read GET /venue/sync to see how it went. Any number of requests during a run make one more run, not one each.

Status Body When
409 { "error": "Sync runs on the venue server." } As for GET.

The venue server syncs as the event goes, so the cloud normally has everything by the time the booth packs up. Keep the booth’s own copy of the photos until pending reads zero and error is null.

For the next event, staff run bun run venue:pull again. It syncs the old event one last time and wipes it from the venue server only if the cloud takes it all. If that sync fails, nothing is deleted. Point your booth at the new event’s set: ids change from event to event, keys don’t.