feat(console): preview Init 5 without replacing the featured event by eldadfux · Pull Request #14684 · appwrite/appwrite · GitHub
Skip to content

feat(console): preview Init 5 without replacing the featured event - #14684

Open
eldadfux wants to merge 1 commit into
mainfrom
feat/init-5
Open

eldadfux wants to merge 1 commit into
mainfrom
feat/init-5

Conversation

@eldadfux

Copy link
Copy Markdown
Member

Summary

  • Ports appwrite/vibes#477 onto the current console Init page.
  • Adds Init 5 (November 2-6, 2026) with days, schedule, prizes, and ticket rules. Init 4 stays the featured event on /init.
  • Preview Init 5 with ?event=init-nov-2026 or the debug menu. The hero has three canvas concepts (particles, light trails, glass), switchable from the debug menu or ?hero=.

Test plan

  • /init still shows the featured Init 4 recap
  • /init?event=init-nov-2026 shows the Init 5 hero, countdown, locked days, prizes, and the browse list
  • ?hero=particles, ?hero=trails, and ?hero=glass switch the cover
  • Debug menu → Init → Event forces the active event in this browser
  • Hebrew and Japanese include the new Init 5 strings

Made with Cursor

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>
@tenki-reviewer

tenki-reviewer Bot commented Oct 19, 2026 •

Copy link
Copy Markdown

@appwrite

appwrite Bot commented Oct 19, 2026 •

Copy link
Copy Markdown

New Console

Project ID: new-console

Sites (1)
Site Status Logs Preview QR
 New Console
new-console
Ready Ready View Logs Preview URL QR Code

Tip

Each function runs in its own isolated container with custom environment variables

@hansi-codes

hansi-codes Bot commented Oct 19, 2026 •

Copy link
Copy Markdown
Contributor

🟡 Tier B · Needs changes before merging

Init 5 is permanently treated as upcoming, which prevents its recap from being reached after the event.

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.

Verdict New comments Fixed Still open
🛑 Changes requested 3 0 0
Finding Where
🟠 Init 5 never leaves the upcoming state apps/console/src/lib/init/events.ts:213
🟡 Reset the scrollable main region, not the window apps/console/src/components/pages/init/View.tsx:298
🟡 The debug event override still hides the Init 5 promo apps/console/src/lib/init/org-promo-banner.ts:103
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
File Change
apps/console/src/components/global/providers/DebugMenu.tsx, apps/console/src/components/global/providers/DebugMenuInitEventPanel.tsx Adds debug-menu controls for selecting the Init event and hero concept.
apps/console/src/components/pages/home/InitSection.tsx, apps/console/src/components/pages/init/View.tsx, apps/console/src/routes/_public/init.tsx Connects event previews to the Init page and home section, and adds event/hero search parameters.
apps/console/src/components/pages/init/_components/EventHero.tsx, apps/console/src/components/pages/init/_components/Init5EventHero.tsx, apps/console/src/components/pages/init/_components/Init5HeroBackground.tsx, apps/console/src/components/pages/init/_components/init5/ Adds the Init 5 hero layout, canvas background, countdown, concept switcher, and static fallback.
apps/console/src/components/pages/init/_components/InitEventsBrowse.tsx, apps/console/src/lib/init/active-event-debug.ts, apps/console/src/lib/init/events.ts, apps/console/src/lib/init/init-event-browse.ts, apps/console/src/lib/init/init-event-catalog.ts, apps/console/src/lib/init/init-nov-2026-content.ts Adds Init 5 event data, browse metadata, and event selection/resolution logic.
apps/console/src/lib/debug-overrides.ts, apps/console/src/lib/init/org-promo-banner.ts, apps/console/src/lib/init/ticket-config.ts, apps/console/src/lib/init/use-init-live-clock.ts Adds persisted event and hero overrides, and wires event selection into promo, ticket, and clock behavior.
apps/console/src/lib/init/init5-hero/ Adds glyph geometry, WebGL scene runtime, and the particles, trails, and glass concepts.
apps/console/src/lib/init/init5-hero-sampling.ts, apps/console/src/components/pages/init/_components/InitWordmark.tsx, apps/console/src/styles.css Adds hero sampling helpers, wordmark caret support, and its animation styles.
apps/console/src/lib/i18n/dictionaries/he/shared-ui.ts, apps/console/src/lib/i18n/dictionaries/ja/shared-ui.ts Adds Hebrew and Japanese translations for the new browse and hero controls.

Reviewed 03e0e1c · Details · Comment @hansi-codes review to re-run, or mention @hansi-codes with a question.

@tenki-reviewer tenki-reviewer Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

Comment on lines +258 to +261
const handleContextRestored = () => {
variant.onPalette?.(runtime)
runtime.requestRender()
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 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.

Comment on lines 383 to 397
@@ -240,16 +396,76 @@ function deriveStatus(event: LaunchEvent, now = new Date()): LaunchEventStatus {
return event.status
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟠 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.

Comment on lines +374 to +378
export function Init5HeroBackground({
containerRef,
compact = false,
active = true,
}: Init5HeroBackgroundProps) {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 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.

Comment on lines +19 to +21
const event = getActiveLaunchEvent(new Date(), {
activeEventId: mockInitActiveEventId,
})

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 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.

@hansi-codes hansi-codes Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 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',

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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' })

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Comment on lines +103 to +105

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant