@@ -10,6 +10,13 @@ passive reward track that refills on a timer, one offline-only archival job
1010Tapes tree paid for with the tab's own currency - all of it, including
1111progress and purchased upgrades, survives Migrate and Singularity resets.
1212
13+ As of v1.4, Live Events layer time-boxed config overlays and goal ladders on
14+ top of the regular economy - only one runs at a time. Four seasonal events
15+ (Summer Surge, Spooky Packets, Black Frame Friday, Frost Uptime) come and go
16+ automatically on their own annual windows via an hourly scheduler, and a
17+ coordinator can author, schedule, and run additional ones from the admin
18+ dashboard's Events tab. See [ Live Events] ( #live-events ) below for details.
19+
1320## Architecture
1421
1522- ` shared/ ` - a package used by both server and client (via a ` @shared ` Vite
@@ -69,7 +76,10 @@ shown in Discord's own "Copy User ID" (enable Developer Mode) or visible in
6976the server's ` users ` table after your first login. DB-stored ` admin ` /
7077` event_coordinator ` roles (grantable from the dashboard once you're in) are
7178for everyone else - ` SUPER_ADMIN_IDS ` is only for the owner(s) who should
72- always have full access no matter what's in the database.
79+ always have full access no matter what's in the database. ` event_coordinator `
80+ only unlocks the Events tab (author/schedule/activate/end Live Events, see
81+ below); ` admin ` implies it and additionally unlocks Balancing, Roles, and
82+ Users.
7383
7484## 3. Run with Docker Compose
7585
@@ -159,6 +169,39 @@ npm run dev
159169
160170Visit the client dev server's printed URL (usually ` http://localhost:5173 ` ).
161171
172+ ## Live Events
173+
174+ At most one event is active globally at a time. Each is a set of tunable
175+ modifiers (the same ` production ` /` heat ` /` minigames ` /` offline ` /` batchQueue `
176+ tunables the Balancing tab edits) applied read-time on top of the admin
177+ baseline config, plus a goal ladder of rungs a player claims for wafers/
178+ tapes/FLOPS as they clear metric targets.
179+
180+ - ** Seasonal events ship pre-seeded** (` server/data/seasonalEvents.js ` ):
181+ Summer Surge (July), Spooky Packets (late October), Black Frame Friday
182+ (late November), Frost Uptime (December-January). Each starts as a
183+ windowless draft and gets its concrete ` starts_at ` /` ends_at ` materialized
184+ automatically, every year, by the scheduler below - no admin action
185+ needed for them to run on schedule.
186+ - ** Hourly scheduler** (` server/eventService.js ` 's ` runScheduler ` , invoked
187+ once at boot and every hour after): materializes seasonal recurrences into
188+ a scheduled window, ends any active event whose window has closed, and
189+ activates any scheduled event whose window has opened.
190+ - ** Personal per-player windows** : a player's own run starts at their first
191+ login while an event is active and lasts the event's full duration, capped
192+ at 24h past the event's global end - two players who join at different
193+ times see different countdowns. A 48h grace period afterward still lets
194+ them claim any rung they'd already earned before their window closed.
195+ - ** Leaderboard + opt-out** : ranked by rungs claimed, visible from the
196+ in-game Event tab. Opting out (a per-user toggle, not per-event) removes
197+ you from it immediately, not just on your next join.
198+ - ** Coordinator authoring** (Profile > Settings > Events, ` event_coordinator `
199+ role or ` admin ` ): create/edit a draft with a TUNABLES-driven modifier
200+ builder and ladder builder, schedule a window, activate/end it, delete
201+ unscheduled drafts, and view per-event participation. Activating a second
202+ event while one is already active is rejected outright (409) - end the
203+ running one first.
204+
162205## Notes / things worth knowing
163206
164207- ** SQLite, not Postgres** : chosen for zero-config, single-file persistence
0 commit comments