A lightweight pack-coordination layer for live event attendees, built as a focused companion to the official Web Summit app. Form a pack with a join code, curate a shared event wishlist, broadcast quick status pings, see your friends on a live floor plan, and let AI surface the talks your whole pack should attend together.
Built as a hackathon MVP for Web Summit Vancouver 2026.
A mobile-first, mockup-driven web app:
- Vite + React 18 + TypeScript
- Tailwind CSS for the dark + purple visual language
- No backend — all pack state is mock data + localStorage, so the demo runs offline and deploys as static files anywhere
- Real data: all 515 sessions from
events.json(scraped from the Web Summit Vancouver site) drive the wishlist, AI match recommendations, search, and event detail expansions
On desktop, the app renders inside a centered mobile-shaped viewport with black gutters on either side (it's meant to demo a phone feature). On real mobile, it fills the screen.
The bottom navigation has 5 tabs; only the Pack tab is active in this MVP — the others (Home, Schedule, Scan, Profile) are rendered disabled to keep the demo focused on the new feature.
Inside the Pack tab there are four sub-tabs:
| Tab | What it shows |
|---|---|
| Events | "Event Overlap" — events the pack wants to attend, sorted by going-count. Filter by day & format. Tap Open day timeline for the calendar view, or Browse all events to search across 515 sessions. |
| Status | Live pack activity feed with relative timestamps and online dots, plus a 5-preset Quick Status grid for one-tap broadcasts. |
| Map | Stylised top-down floor plan of the venue with member pins, status captions, a tap-to-pin mode, and a "Pick zone" sheet for named-zone shortcuts. |
| AI Match | Pre-computed top-3 recommendations with "Why this match?" reasoning. "Refresh Matches" rotates between two pre-baked candidate sets. |
The "Open day timeline" tile at the top of the Events tab opens a vertical 8 AM → 10 PM calendar for the selected day.
- Wishlist events with ≥ 3/4 pack overlap are pre-slotted as filled purple blocks (solid for unanimous, lighter for majority). Lower-attendance picks stay in the Event Overlap list to keep the timeline readable as "the shared day plan".
- Tap any empty slot to drop a 30-minute purple selection snapped to 10-minute increments. Drag the grip handle at the bottom of the selection to extend it.
- The purple arrow button on the right of the selection scrolls down to a Slot Picker that ranks candidate events by time fit and lightweight keyword similarity to the pack's existing picks — so the events it suggests feel related to what the pack has already chosen.
- Bookmarking a candidate from the Slot Picker uses the same wishlist toggle as the rest of the app.
A demo join code (WSV7XK) is pre-filled on the landing screen — tap Join Pack to enter. Leave Pack resets state.
npm install
npm run devOpen http://localhost:5173/.
npm run build
npm run preview # quick smoke-test of the built bundleThe build emits to dist/. It's a fully static SPA — no runtime backend required.
- Push this repo to GitHub.
- Import the project on Vercel.
- Defaults are correct (framework: Vite, build command:
npm run build, output:dist). vercel.jsonalready declares an SPA fallback so any path resolves toindex.html.
The app also works on GitHub Pages because vite.config.ts sets base: "./" and there's no client-side router that depends on path-based URLs.
npm run build
# publish the dist/ folder to your gh-pages branch (e.g. via gh-pages package or an Action)src/
data/
events.json all 515 scraped sessions
mockPack.ts members, statuses, wishlist, AI matches, map positions
hooks/
usePackState.ts central reducer with localStorage persistence
utils/
events.ts typed event helpers, format/colour lookups
time.ts clock formatting, day labels, relative times
calendar.ts minute math, 10-min snap, keyword similarity for the Day Timeline
layout/
MobileFrame.tsx mobile-aspect frame for desktop
BottomNav.tsx 5-tab nav, only "Pack" enabled
screens/
JoinScreen.tsx landing with pre-filled join code
PackScreen.tsx header + tab content + bottom nav
features/pack/
PackHeader.tsx join code card, packmates row
TabBar.tsx Events | Status | Map | AI Match
EventsTab.tsx overlap list + Day Timeline + browse-all-events modes
CalendarView.tsx Day Timeline screen (day chips + timeline + slot picker)
TimelineCanvas.tsx scrollable 8AM–10PM grid, wishlist blocks, selection handle
CandidateSheet.tsx ranked slot-picker list (overlap fit + keyword similarity)
StatusTab.tsx live status panel + activity feed
MapTab.tsx floor plan + pins + zone picker
AIMatchTab.tsx ranked picks with "Why this match?"
EventCard.tsx shared card with overlap pill + bookmark
FilterSheet.tsx format filter bottom sheet
QuickStatusBar.tsx 5 preset pills
FloorPlan.tsx stylised SVG of the venue
These are explicit non-goals for the hackathon MVP (the design leaves room for them to slot in later):
- Real-time sync.
usePackStateis a single hook backed by localStorage. Replacing the reducer with a Supabase channel would make this multiplayer without changing any UI. - Claude API for AI Match. Reasoning text is pre-computed. The shape is set up so
currentAiMatchescould be replaced with a live API call. - Vision-based location. The map supports tap-to-pin and named-zone selection. Auto-detection from a photo (Claude Vision on the venue's signage) is the natural next layer.
- Other bottom-nav tabs. Home, Schedule, Scan and Profile are disabled in the nav so the demo focus stays on the new pack feature.
- Event data scraped from https://vancouver.websummit.com/sessions/van26/
- Avatar placeholders served by https://pravatar.cc/
- Icons by Lucide