Inspiration

We’ve both been in group plans where one person lives farther away, has a different budget, or wants to do something completely different. It’s easy to default to whatever works for most people, especially when bringing up your own constraints feels like making things harder for everyone else.

At the same time, our own group chats are full of “where should we go?” conversations that never actually turn into plans. Everyone has their own preferences, schedules, budgets, and starting points, but coordinating all of that feels like more work than just giving up.

We built Huddle to handle that coordination automatically, from figuring out where everyone can reasonably meet to navigating each person there. Instead of making everyone compromise on the same thing, Huddle finds options that work across the group, figures out how each person can get there, and turns the conversation into an actual plan.

What it does

Huddle is an iMessage agent that keeps in touch with the individual needs of everyone in the group chat. By surveying each member on their current location, desired budget, and individual plan preferences, it uses a weighted scoring system to recommend several plans at locations that are then voted on by the participating members. Through a Nessie API, it also takes into account the finances of each member upon authorization to best advise the plan with financial feasibility in mind.

Huddle is an iMessage agent that turns a group's "where should we go?" into one plan everyone can afford and reach, and gets everyone there at the same time.

  1. Start a plan. Text Huddle "plan" and get a 4-character join code to send your friends.
  2. Everyone answers privately. Each person says how they're getting there (car, bike, walk, or rideshare), where they're starting from (typed or live location), and what they want: "I'm starving," "no sushi," "I want to play pickleball," "back by 9."
  3. Huddle finds real options. Once most of the group says go, Huddle searches real places on Google, filters them by everyone's budget, opening hours, and travel limits, and ranks them for fairness, so no one person carries the plan.
  4. Vote. Everyone replies A, B, or C, and the majority wins.
  5. Everyone gets their own route. Each person gets a private itinerary with when to leave, turn-by-turn directions from their own starting point in their own travel mode, a Google Maps link to visualize their route, and their approximate cost. Leave times differ, but everyone arrives at the same time.
  6. Day-of. A "leave in 5" nudge goes out, and if someone texts "running 10 min late," Huddle tells everyone else.

If people want very different things, like pickleball and boba, Huddle builds combo plans with a stop for each, within walking distance of each other. Budgets come from a linked Capital One (Nessie) sandbox account and stay private: nobody else in the group ever sees your budget or location.

Why It’s Original

"Meet in the middle" apps find a fair midpoint, but Huddle plans the whole hangout around every person in it. Our optimizer protects the worst-off person, like the friend who lives far away or is on a tighter budget, instead of just the group average. Budgets come from banking data and stay private, so no one has to say "I can't afford that" out loud. When people want different things, Huddle combines them into one plan instead of letting whoever spoke first decide. And unlike Google Maps, which routes one person, Huddle routes everyone: each friend gets their own directions and travel mode, with leave times set so the whole group arrives together, all inside iMessage with no app to download. Each of these pieces exists on its own somewhere. Bringing them together is what makes Huddle new.

How we built it

Technologies

Photon Photon is what lets Huddle live inside the messaging experience. It handles the entire iMessage interface, while a TypeScript/Bun bridge forwards messages and events to our Python/FastAPI backend. The backend manages conversation state, onboarding, planning sessions, voting, typing indicators, effects, Maps link cards, Find My location sharing, and personalized itineraries. We built a virtual group system on top of individual DMs. When someone starts a plan, Huddle generates a short join code that friends text to the bot.

Gemini We use Google Gemini to turn natural-language messages like “I want to play pickleball,” “no sushi,” or “I need to be back by 9” into structured preferences that Huddle can reason about. Gemini outputs structured JSON rather than making the final planning decision. Each extracted preference must be traceable back to the message and person it came from; otherwise, Huddle drops it rather than treating an unsupported inference as fact.

Google Places & Routes Google Places provides the real-world venues Huddle considers. We use both Nearby Search and Text Search to find restaurants, activities, cafes, sports venues, and other places based on the group's requests. Google Routes then calculates how each individual can actually reach each candidate. Different people can have different travel modes and routes, and driving routes can account for live traffic.

We use route data to calculate individual travel times and leave-by times, rather than asking an LLM to guess how long a journey takes. OpenRouteService provides a fallback when Google cannot route a particular mode.

Python Optimizer The core of Huddle is our own Python optimizer (pure Python with no I/O). It filters out plans that violate hard constraints like budgets, travel limits, opening hours, or vetoes, then scores the remaining plans based on each person's cost, travel burden, and how well the option matches what they asked for. Our fairness objective balances the worst-off person with the group average, so a plan that is perfect for everyone except one person doesn't win.

Capital One Nessie API The Capital One Nessie API gives Huddle a way to incorporate financial constraints without asking someone to publicly announce their budget in the group chat. Each user connects to a Capital One Nessie sandbox account upon initialization. Huddle uses the account's balance and spending information to suggest a comfortable per-outing budget, which becomes a private planning constraint. We built a private vault as the only module allowed to read bank links and budgets. Budgets never reach Gemini or other group members, and a privacy guard scans outgoing messages for leaked information.

Challenges we ran into

  • Locating people: Our first approach used a hand-built list of Ithaca locations, but small businesses were missed and ambiguous names were often resolved incorrectly. We switched to Google Places Text Search and made Huddle ask for clarification instead of just guessing.
  • Natural language created unexpected edge cases: “@plan” was interpreted as a place called Plan, while messages like “ya” triggered place searches. “I want to play sports” could also return restaurants or sporting goods stores. We added explicit activity fields, cuisine families, vetoes, and better separation between conversation and place search.
  • Fairness: One person's request could crowd out everyone else's, and cheap-and-close beat what people actually wanted. We tried to mitigate that by incorporating combo plans and a fairness score.

What we learned

  • AI needs structure around it. Getting Gemini to understand a sentence is only the beginning. Real messages are ambiguous, so we needed schemas, validation, citations back to the original messages, and fallbacks rather than letting the model make unchecked decisions.
  • Small details matter! Things like recognizing “ya,” responding to messages with appropriate tapbacks, and showing typing indicators made a surprisingly big difference in making Huddle feel natural.

What's next for Huddle

  • Huddle lives in the group chat: Move to a Photon dedicated line so Huddle can join group chats directly, instead of using join codes and DMs.
  • Ratings: Use venue ratings and reviews in ranking, and learn what each group liked after past hangouts.
  • Public transit: Add bus routes (Google already returns TCAT routes for Ithaca specifically).
  • Smarter running-late updates: Re-time everyone's routes when someone is late, not just notify them.

Built With

Share this project:

Updates

Submission history