Inspiration

Every time I travel with friends, the same thing happens: someone drops five hotel options and a dozen restaurant links into WhatsApp, everyone votes with thumbs-up reactions scattered across different messages, and a day later nobody can remember what actually won. The votes get buried under new messages, there's no single place to look back at what was decided, and by the time we land, half the group doesn't even have a day-by-day plan — just a chat log full of half-finished decisions.

I wanted a place built specifically for that moment: drop in the options, let everyone vote, lock in a winner, and have it turn into an itinerary automatically — instead of relying on a chat app never designed for decision-making in the first place

What it does

PackedUp is group trip planning built around three boards — Stay, Eat, and Visit. Anyone with a 7-character invite code joins as a guest and drops in a suggestion — a hotel, a restaurant, a hike — for the group to vote on, up or down, in real time. The trip's creator finalizes a winner on each board, and those winners flow straight into a day-by-day itinerary — no re-typing, no digging through chat history to remember what won.

No sign-up is required to participate. A guest is identified by a session token stored locally, so joining a trip takes a name and a code, not a password — the whole reason WhatsApp felt easier than "download an app" in the first place, minus the part where votes get lost.

The newest layer is agent support: PackedUp exposes create_trip, get_trip_board_info, and add_recommended_suggestion as WebMCP tools — an emerging browser standard (document.modelContext) that lets an AI agent fill in the trip form or drop a recommended restaurant onto a board on a user's behalf, the same way a person would from the UI.

How we built it

Next.js 14 (App Router) for both the UI and the API — Route Handlers sit between the client and Supabase.

  • Supabase (Postgres) for data, with row-level security enabled on every table. Guest writes go through a service-role client scoped strictly to server-side route handlers, since a guest has no auth.uid() for RLS to key off of.
  • Zustand, persisted to localStorage, holds the guest session (member_id, trip_id, session_token) across visits.
  • TanStack Query manages server state — trip details, suggestions, members — with short polling intervals standing in for full realtime where it wasn't worth the complexity yet.
  • Framer Motion for the transitions between states (voting, finalizing, empty boards).
  • WebMCP, via the use-webmcp-tool React hook, registers tools directly on the page components where the corresponding UI action lives — create_trip on the landing and create pages, the suggestion tools on the board page — so a tool only exists while its page is actually mounted.

Accomplishments that we're proud of

Getting from "WhatsApp thread full of forgotten votes" to an actual finalized itinerary in three clicks — join with a code, vote, finalize — without ever asking a single friend to make an account. Getting real-time-feeling voting working with plain polling instead of reaching for a heavier realtime setup before it was needed. And shipping WebMCP support early enough to be one of the first trip-planning tools an AI agent can actually operate, not just read.

What we learned

That an emerging standard is still an emerging standard — WebMCP is real, shipping behind flags and origin trials, but building against it means designing for graceful absence: useWebMCP reports supported: false in any browser without the API, and the app has to be just as usable without an agent in the loop as with one. We also learned, the hard way, that the fastest debugging step for a "healthy app, broken deploy" is checking whether the database itself is still awake.

What's next for Packedup

Real Supabase Realtime subscriptions in place of polling, an actual MCP server (not just WebMCP) so agents like Codex or Claude Desktop can drive trip creation without a browser tab open, and per-day budget estimates rolled into the itinerary so the group knows the damage before they land.

Built With

Share this project:

Updates

Submission history