Inspiration

Every weekend our group chat starts the same way: "what should we do?" Forty messages later we end up at the same three places, or nowhere. The good spots aren't on the top of Google, they're buried in r/AskSF threads and in TikToks from people who live there. And whoever lives farthest away always gets the worst trip. We wanted an app that knows the city like a local and plans like the one friend who actually makes plans happen.

What it does

A community of locals. People on Faves rank the spots they go to, post moments from them, save their favorites and share their best days. That becomes each spot's Locals Score, shown as a postcard, and places locals love that tourists haven't found get a hidden gem flag. There are about 11,000 spots across 10 cities: New York, Los Angeles, San Francisco, Chicago, Seattle, Boston, Austin, Miami, Washington DC and San Diego.

A planner that's fair. "Me and 3 friends, pickleball then hot pot, Saturday 2 to 9 PM" becomes a full day: stops picked by Locals Score and opening hours, a route that keeps moving forward instead of zigzagging, a view timed to sunset, and a reason for every pick. Each friend sets a starting point, and the first stop keeps the longest trip short. The plan shows everyone's own travel time.

Plans live in group chats. A plan arrives as a ticket with In / Maybe / Out. Every group has its own AI agent ("@fave", and you can rename it). It plans the day, or posts two options, runs the vote and locks the winner. It books, with reservation links or walk-in and phone-booking notes. It schedules reminders: the evening before, plus a leave-now nudge with each person's own travel time. It handles "running late" by shifting the times and the reminders. It sums up a long chat with "tl;dr", and it finds a spot by vibe ("cozy rainy day bookstore").

Talk to it hands-free. The agent can read its replies aloud with Cartesia's voice, and voice notes become text it acts on ("we're running 15 minutes late"), so you can plan while you're out.

It works in ASI:One too. Our Fetch.ai Faves Agent runs the whole flow inside an ASI:One conversation: plan a fair day for a group, swap a stop, book, and create a Faves group chat with an invite link.

Spot Moments. Photos and clips people post at a spot show up on its postcard wall for everyone.

How we built it

App: Expo SDK 58 / React Native with expo-router. One TypeScript codebase for the iPhone (Expo Go) and the web, with OpenStreetMap tiles.

Seeding 10 cities on day one (Apify): a community app starts empty, so we seeded about 11,000 spots from what locals already share publicly, using Apify Actors for Google Maps, Yelp, TripAdvisor, Reddit and TikTok search, plus OpenStreetMap, merged per city. A "locals pass" separates what locals say from tourist ratings to set each spot's starting Locals Score; rankings, moments and saves from people on Faves build on it from there.

Our own Apify Actor, faves-local-spots: it turns plain words into OpenStreetMap places, ranks them by what locals say on the city's subreddit, and flags hidden gems. The Scout agent and the group's agent call it for asks our data doesn't cover yet.

Convex is the realtime backbone. We use live queries for chats, RSVPs, votes and the pinned plan; the Agent component for the agent's threads and tool calls; the Workflow component for a durable plan, vote, lock, book, remind flow that survives restarts; the scheduler and crons for reminders; vector search for "find a spot by vibe"; file storage for Spot Moments; and presence ("3 here now").

Fetch.ai: four uAgents with distinct jobs: the Faves Agent (orchestrator), Scout (spots and live Apify runs), Planner (Locals Score, fair routing, hours, sunset) and Booker (reservation links and walk-ins). They use the Agent Chat Protocol, Agentverse mailboxes, a booking fee through the Payment Protocol, and ASI:One (asi1-mini) as the reasoning model.

Cartesia: Sonic reads the agent's replies aloud and Ink turns voice notes into text, so the group can plan hands-free.

Reliability: every external call has a fallback. Live scouting falls back to our data, booking falls back to links, and the LLM falls back to a built-in rules planner, so the app runs even with no API keys.

Tests: 149 Jest unit tests (planner, fairness, routes, chat rules, hours), 26 Playwright end-to-end tests (two friends chatting live, the vote, running late, sharing a plan, shared moments), plus the agent flow and Actor tests.

Challenges we ran into

Fair routes are hard. Our first planner checked fixed stops against the start of the day, so a 5 PM hot pot got ruled out and the day crossed town twice. We now check each fixed stop at its own hour, penalize backtracking, and run an untangle pass over the free stops.

The cold start. A community app is empty on day one. Seeding it meant matching a Reddit comment or a TikTok to the right place and telling locals' favorites apart from tourist traps, which took several passes over the data.

Blank maps. In the iOS simulator, Apple's map tiles timed out silently and the map library never reported an error, so we switched to OpenStreetMap tiles.

Scraping limits. Reddit blocks direct reads, so our Actor falls back to an Apify Reddit scraper. Some Actors also have a minimum charge per run that we had to budget for.

Accomplishments that we're proud of

We built a real group chat where the plan is a ticket everyone answers live, and the agent takes it from "what should we do?" to booked and reminded. Fairness is something you can see: every person's travel time is right on the plan. We have about 11,000 scored spots in 10 cities. And the community Locals Score is seeded so 10 cities work on day one, so the plan goes where locals go, not to a tourist top-ten list.

What we learned

Durable workflows beat hand-rolled timers. Reminders and bookings have to survive restarts and edits.

The best LLM setup was a narrow one. The model reads the chat and picks a tool, and a deterministic planner does the routing, so the results are exact and testable.

"Fair" is a feature people feel. Showing each friend's travel time changes how a group picks.

What's next for Faves

We want to grow the community city by city, so locals' own rankings, moments and saves take over from the seed data. Next come real Spot Moments from users to replace our seed clips, more cities, booking partners so more stops book in one tap, and Faves Plus for groups that plan every weekend.

Built With

Share this project:

Updates

Submission history