LINKUPGO · FULL-STACK AI · SOLO BUILD
LinkUpGo
AI-driven social planning that turns "I don't care, you pick" into a locked calendar invite.
Visit the live app ↗Outcomes
Research
Budgets, vibes, location, and energy get negotiated through endless messages until the group defaults to indecision. The field-testing insight: convergence beats discovery — the real competitor is Maps plus three group chats.
six friction→fix cycles · nyc field testing · logged in the repo
01 · No-results crash
Suggestion engine crashing on empty results
→ graceful empty state that routes back to filters
02 · Stale membership
New members didn't appear live; refresh threw 'session not found'
→ real-time join broadcast + session re-fetch
03 · Blind proximity
Distance filtering ignored how people travel
→ per-user mode (car / walk / transit) feeds travel-time thresholds
04 · Wrong hierarchy
Plan cards led with the member's name, not the plan
→ plan title primary, people secondary
05 · Dead-end details
'Details' opened the venue website
→ routes straight to Google Maps
06 · Unused dependency
Ticketmaster integration didn't earn its keep
→ removed — venues only, simpler pipeline
Design
Five steps, each one tap: Onboarding → New Plan → Voting → Lock → Calendar. The AI Planner does the work between taps, and a post-outing rating feeds the next plan.
Five steps, each one tap: Onboarding → New Plan → Voting → Lock → Calendar. Click through the real flow below — every screen is the shipped product's design, down to the black-on-lime contrast and the post-lock vote lockout.
Hey, Kunal
New York
Ready to LinkUpGo?
Start a new planning session with your groups.
Active plans
New Plan
Building your shortlist
Generating the brief, grounding candidates in Google Places, then 4 judges scoring in parallel.
Friday Night
VotingLock this plan?
Voting closes for everyone once locked.
Locked in
Skyline Rooftop Bar
Friday · 7:30 PM · Midtown
Rate this event
Your feedback helps improve recommendations.
Architecture
A 3-phase orchestrator: ① generate a Zod-validated plan brief, ② hydrate candidates through Perplexity and Google Places (geo via Mapbox + H3), ③ score with a weighted panel of four parallel LLM judges, then diversify with an MMR post-pass (λ = 0.7, hard quota backstop). React 19 + Vite 7 · Express + Drizzle · Postgres (Neon) · TanStack Query.
judges run in Promise.all — p99 is the slowest judge, not the sum
why this design — the rejected alternatives
single-LLM picks venues end-to-end
→ decomposed, testable phases
one judge, one bias
→ weighted panel of four
"5 cocktail bars in a row"
→ MMR diversity + hard quotas
hallucinated addresses
→ everything grounded in Google Places
Observability: a devLog channel, an eval harness (golden set + replay + judge calibration), shadow-compare running v1 and v2 side-by-side on the same input, and friend reports from the field.
Shipped
A working full-stack app (public repo), field-tested with friends in NYC across six logged friction→fix cycles.
- What exists — a working full-stack app in a public repo: auth, squads, real-time updates, and the full plan→lock→calendar loop.
- The practice — a friend takes the app to a real bar → friction gets logged → smallest viable spec → ship with an eval → validate on the next outing.
- Next experiments — vote-grounded preference learning, reservation booking, native iOS + push. Ordered by leverage, framed as experiments, not promises.
next case study
