Repository navigation
Conversation
Add the November 2-6 launch, with a canvas hero in three concepts, so it can be reviewed from the debug menu or ?event=init-nov-2026 while Init 4 stays the production event. Co-authored-by: Cursor <cursoragent@cursor.com>
New ConsoleProject ID: Tip Each function runs in its own isolated container with custom environment variables |
🟡 Tier B · Needs changes before merging
Adds a browsable Init 5 preview with its event schedule, prizes, ticket rules, and hero while keeping Init 4 featured by default. Adds URL and debug-menu controls for the event and hero concepts, plus Hebrew and Japanese strings for the new browse and hero UI. 10 of 37 changed files were too large to include in full.
Fix with agent prompt### Issue 1
apps/console/src/lib/init/events.ts:213
**Init 5 never leaves the upcoming state**
`getLaunchEventDerivedStatus` returns `upcoming` unchanged, so this event never becomes active or past. As a result, `resolveInitBrowseDisplayCurrentDay` keeps treating it as future and resets day values of 6 or more to 0, preventing Init 5's recap from being shown after the event; the browse badge also remains Upcoming.
### Issue 2
apps/console/src/components/pages/init/View.tsx:298
**Reset the scrollable main region, not the window**
The page scrolls inside `#main-content` (`ConsoleLayout` gives that element `overflow-y-auto`), so `window.scrollTo` does not reset the page when a browse link changes events. Switching events from the browse list therefore leaves the user at the old scroll position instead of returning to the hero.
### Issue 3
apps/console/src/lib/init/org-promo-banner.ts:103-105
**The debug event override still hides the Init 5 promo**
The selected event is passed through here, but `resolveInitOrgPromoBanner` returns `null` for any event without `featured`. Init 5 is intentionally not featured, so selecting it in the debug menu does not make the org promo use that event, despite the event panel saying it overrides the promo.
---
For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.📂 Walkthrough · 8
Reviewed |
There was a problem hiding this comment.
Adds the "Init 5" launch-event hero (three.js scenes, countdown, browse/debug surfaces) to the console, plus i18n additions and debug-menu event tooling.
Key findings
- 🟠 Nov event stuck in
upcomingstate forever — events.ts:383 - 🟡 Context restore never restarts the render loop — scene-runtime.ts:258
- 🟡 Init 5 hero drops jool interaction callbacks — Init5HeroBackground.tsx:374
- 🟡 Live clock times the wrong event's schedule — use-init-live-clock.ts:19
| const handleContextRestored = () => { | ||
| variant.onPalette?.(runtime) | ||
| runtime.requestRender() | ||
| } |
There was a problem hiding this comment.
🟡 bug · medium
Context restore never restarts the render loop
On webglcontextlost, handleContextLost calls stop() (scene-runtime.ts:254-257), cancelling the rAF loop while the desired-active state stays true. On webglcontextrestored, handleContextRestored (scene-runtime.ts:258-261) only re-applies the palette and renders one frame via requestRender(); it never calls start() again. After a GPU context loss/restore while the hero is active and visible, the scene renders a single restored frame and then stays frozen until an unrelated active/visibility/intersection change re-triggers setActive(true).
📋 Prompt for AI Agents
In apps/console/src/lib/init/init5-hero/scene-runtime.ts lines 258-261, handleContextRestored currently calls only variant.onPalette?.(runtime) and runtime.requestRender(), so the rAF loop stopped by handleContextLost (lines 254-257) never resumes and the hero scene stays frozen after a webglcontextlost/webglcontextrestored cycle. Change the handler to restart the loop when the scene was active before the loss: after variant.onPalette?.(runtime), call if (wantsActive) start() (falling back to runtime.requestRender() for reduced-motion/frozen states, mirroring the guard in setActive). The wantsActive flag already tracks the last setActive value and start() guards on running/disposed.
| @@ -240,16 +396,76 @@ function deriveStatus(event: LaunchEvent, now = new Date()): LaunchEventStatus { | |||
| return event.status | |||
| } | |||
There was a problem hiding this comment.
🟠 bug · high
Nov event stuck in upcoming state forever
init-nov-2026 is authored with status: 'upcoming' (events.ts:213), but getLaunchEventDerivedStatus returns the static value unchanged for 'upcoming'/'past' events instead of deriving from startDate/endDate (events.ts:387). The event therefore reports 'upcoming' forever: browsing /init?event=init-nov-2026 keeps current day forced to the pre-event state (init-event-browse.ts:69-71), so during Nov 2-6 all day cards stay locked with no live banner, and after Nov 6 the recap state is unreachable. listBrowsableInitEvents shows the stale status badge indefinitely.
📋 Prompt for AI Agents
In apps/console/src/lib/init/events.ts, change getLaunchEventDerivedStatus (lines 383-397) so events with a hardcoded status: 'upcoming' but real startDate/endDate (e.g. init-nov-2026 at line 213) have their status derived from the current date instead of returning the static value. Also, in apps/console/src/lib/init/init-event-browse.ts resolveInitBrowseDisplayCurrentDay (lines 60-74), handle browsed events whose derived status is 'active' (not only 'upcoming') so the global post-event default current day does not force recap mode during a live event. Verify /init?event=init-nov-2026 shows unlocked days/live state during Nov 2-6, 2026 and recap after Nov 6.
| export function Init5HeroBackground({ | ||
| containerRef, | ||
| compact = false, | ||
| active = true, | ||
| }: Init5HeroBackgroundProps) { |
There was a problem hiding this comment.
🟡 bug · medium
Init 5 hero drops jool interaction callbacks
EventHero passes onInteractionStart/onInteractionEnd, which drive the transient "playing with jool" presence activity via useInitPresenceActivity, into the pluggable HeroBackground (EventHero.tsx:465-466). The Init 5 implementation accepts the props in its type but never destructures or calls them (Init5HeroBackground.tsx:374-378); its scene handles pointer input internally without invoking the callbacks. On the Init 5 hero layout, the presence activity therefore never starts or clears, silently dropping that feature for the new event while the prop contract suggests it is wired up.
📋 Prompt for AI Agents
In apps/console/src/components/pages/init/_components/Init5HeroBackground.tsx, the Init 5 hero background silently ignores the onInteractionStart/onInteractionEnd props that EventHero passes (EventHero.tsx lines 465-466) to drive the "playing with jool" presence activity. Destructure both props, thread them into Init5HeroScene (which owns the container pointer listeners), and invoke onInteractionStart on a non-interactive pointerdown (alongside the controller pulse) and onInteractionEnd on pointerup/leave/cancel/unmount, matching the default InitHeroBackground behavior.
| const event = getActiveLaunchEvent(new Date(), { | ||
| activeEventId: mockInitActiveEventId, | ||
| }) |
There was a problem hiding this comment.
🟡 bug · medium
Live clock times the wrong event's schedule
useInitLiveClock resolves the active event internally with getActiveLaunchEvent(new Date(), { activeEventId }) and no browseEventSlug (use-init-live-clock.ts:19-21), while the View applies visibility to the browsed event using that clock's nowMs and the raw mock day. When browsing /init?event=init-nov-2026, the live/starting-soon boundaries are taken from the featured July event's schedule, whose session instants differ from the November one. The browsed event's Live now / Starting soon states then fail to flip at the authored times of its own sessions.
📋 Prompt for AI Agents
In apps/console/src/lib/init/use-init-live-clock.ts (lines 14-21) and apps/console/src/components/pages/init/View.tsx, thread the browse selection into the clock: accept an optional event or browseEventSlug parameter on useInitLiveClock and pass the same browseEventSlug used by getActiveLaunchEvent in View.tsx (or resolve the active event once in View and pass it down), so the tick boundaries are computed from the displayed event's schedule for the current day rather than the featured event's. Also pass the same displayCurrentDay used by applyInitEventVisibility instead of the raw mockInitCurrentDay.
There was a problem hiding this comment.
🟡 Tier B · 1 blocking finding to address. Summary
| 'Init returns November 2 - 6. Five days of launches including Appwrite Videos, Appwrite Analytics, TablesDB upgrades, and Appwrite Distribution.', | ||
| startDate: '2026-11-02', | ||
| endDate: '2026-11-06', | ||
| status: 'upcoming', |
There was a problem hiding this comment.
Init 5 never leaves the upcoming state
getLaunchEventDerivedStatus returns upcoming unchanged, so this event never becomes active or past. As a result, resolveInitBrowseDisplayCurrentDay keeps treating it as future and resets day values of 6 or more to 0, preventing Init 5's recap from being shown after the event; the browse badge also remains Upcoming.
Prompt To Fix With AI
This is a comment left during a code review.
Path: apps/console/src/lib/init/events.ts
Line: 213
Comment:
**Init 5 never leaves the upcoming state**
`getLaunchEventDerivedStatus` returns `upcoming` unchanged, so this event never becomes active or past. As a result, `resolveInitBrowseDisplayCurrentDay` keeps treating it as future and resets day values of 6 or more to 0, preventing Init 5's recap from being shown after the event; the browse badge also remains Upcoming.
---
For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.🟠 Major · bug · Reply if this doesn't apply.
| } | ||
| if (browseKeyRef.current === browseKey) return | ||
| browseKeyRef.current = browseKey | ||
| window.scrollTo({ top: 0, behavior: 'auto' }) |
There was a problem hiding this comment.
Reset the scrollable main region, not the window
The page scrolls inside #main-content (ConsoleLayout gives that element overflow-y-auto), so window.scrollTo does not reset the page when a browse link changes events. Switching events from the browse list therefore leaves the user at the old scroll position instead of returning to the hero.
Prompt To Fix With AI
This is a comment left during a code review.
Path: apps/console/src/components/pages/init/View.tsx
Line: 298
Comment:
**Reset the scrollable main region, not the window**
The page scrolls inside `#main-content` (`ConsoleLayout` gives that element `overflow-y-auto`), so `window.scrollTo` does not reset the page when a browse link changes events. Switching events from the browse list therefore leaves the user at the old scroll position instead of returning to the hero.
---
For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.🟡 Minor · bug · Reply if this doesn't apply.
There was a problem hiding this comment.
The debug event override still hides the Init 5 promo
The selected event is passed through here, but resolveInitOrgPromoBanner returns null for any event without featured. Init 5 is intentionally not featured, so selecting it in the debug menu does not make the org promo use that event, despite the event panel saying it overrides the promo.
Prompt To Fix With AI
This is a comment left during a code review.
Path: apps/console/src/lib/init/org-promo-banner.ts
Line: 103-105
Comment:
**The debug event override still hides the Init 5 promo**
The selected event is passed through here, but `resolveInitOrgPromoBanner` returns `null` for any event without `featured`. Init 5 is intentionally not featured, so selecting it in the debug menu does not make the org promo use that event, despite the event panel saying it overrides the promo.
---
For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.🟡 Minor · bug · Reply if this doesn't apply.


Summary
/init.?event=init-nov-2026or the debug menu. The hero has three canvas concepts (particles, light trails, glass), switchable from the debug menu or?hero=.Test plan
/initstill shows the featured Init 4 recap/init?event=init-nov-2026shows the Init 5 hero, countdown, locked days, prizes, and the browse list?hero=particles,?hero=trails, and?hero=glassswitch the coverMade with Cursor