Inspiration

As college students, we're always hunting for the next deal: boba, a nice dinner, the gym, a haircut. But the best local deals don't live in deal apps. A café posts a one-day BOGO on its Instagram, a salon puts a sign in its window, a gym drops a student promo on TikTok. Unless you happen to follow that exact shop or walk past at the right time, you miss it.

Today's deal apps don't fix this. Some only cover one store type (groceries, restaurants, cafes). Others, like Groupon or inKind, only show businesses that pay or partner with them. The data backs it up: only 14% of college students search for a deal before buying, and 66.5% have never used a discount app. Students want deals. They just can't go looking.

So we built dibs: AI agents that watch every store around you 24/7 and ping you the second a deal drops. So you never miss anything.

What it does

  • Pick what you care about. Choose from 72 store types (boba, cafés, gyms, barbershops, nails, grocery, nightlife and more) and how far you'll go.
  • Agents scan 24/7. dibs reads each nearby store's Instagram, TikTok, Facebook posts, Google results and website, plus creator posts about the area.
  • Get pinged instantly. When a matching deal appears, you get a push alert with the store, the deal and when it ends, with Directions, Save and Remind Me buttons.
  • Browse everything nearby. A live feed and map of every current deal, plus upcoming pop-ups found days early from future-dated posts.
  • Ask dibs. Ask in plain language ("cheap boba open late near me") in any language, and the agent answers with deal cards. It can also set up a watch for you.
  • Community features. Line check (people at the store report the wait), Earn credits (snap a deal on a poster or menu we missed and earn credits once it's verified), and friends with Westwood and UCLA savings leaderboards.
  • Unbiased. No store can pay to appear in your feed. Every deal links back to the post it came from.

How we built it

Pipeline: scrape → Claude extracts deals → Python rules verify → Convex stores → app shows and alerts.

  • Web data (Bright Data + Apify): Apify's Google Maps Actor finds the shops in an area along with their social links. Apify's Instagram, Instagram hashtag, TikTok, Facebook and website-crawler Actors read their posts and pages. Bright Data's SERP API finds accounts we're missing and recent deal posts on Google, and its Instagram scraper fetches public posts by URL. We only collect what a logged-out visitor can see.
  • AI extraction (Claude via the Anthropic API): Claude reads every page, post and photo and records deals as structured JSON through a record_deals tool. It also powers web-search extraction and reads user photos of in-store signs for Earn credits.
  • Verification (no AI): verify.py checks every deal with fixed rules. Each deal needs a quote that actually appears in the source. Promo codes that aren't in the quote get dropped. Status is set to live, upcoming, needs check, stale or expired. Duplicates seen across several posts are merged. This keeps hallucinated deals out of the feed.
  • Deal API (Python 3.13, FastAPI, Pydantic, httpx), hosted on Render: long scans run as background jobs that Convex polls.
  • Backend (Convex): 33 tables covering users, preferences, stores, deals and their evidence, photo submissions and the credit ledger, votes, line reports, notifications, friends and leaderboards. Geospatial indexes power "deals near me" and decide who to alert. Hourly crons scan saved areas, update deal statuses and rebuild leaderboards.
  • Search and agent (Elastic): every verified deal is indexed in Elastic Cloud Serverless. Hybrid search combines Jina v5 embeddings with keywords (merged with RRF), so a Spanish query finds an English deal. Agent Builder runs the Ask dibs agent with ES|QL tools (search deals, deals near, ending soon, deals at a shop). Kibana Workflows save deal watches and check them hourly.
  • App (Expo SDK 58, React Native, TypeScript, Expo Router): built screen by screen from our Figma design, with React Native Maps, Expo Notifications and Expo Push for alerts, Reanimated for motion, and Clerk for sign-in (email, phone, Google, Apple, with .edu student status).
  • Quality: 241 pytest tests with fake Claude, Bright Data, Apify and Elastic (no keys or credits needed), Convex tests with Vitest, and GitHub Actions CI that tests and deploys on every merge.

Challenges we ran into

  • Hallucinated deals. Early runs sometimes invented promo codes or details. We added the verbatim-quote rule: if the quote isn't in the fetched source, the deal is rejected.
  • Tool calling. The model rejects a forced tool choice, so every call uses tool_choice: auto, names the tool in the prompt and nudges once if needed.
  • Scraping limits. Apify's free plan caps memory at 16 GB across running Actors, so the API requests less memory per run and queues runs instead of failing.
  • Time. Deals end at specific local times, and "20% off before 10 AM" means something different in every timezone. All end times are stored with the store's timezone.

Accomplishments that we're proud of

  • A working end-to-end pipeline, from a store's Instagram post to a verified deal on your phone, with no store having to sign up or pay.
  • Cross-language deal search and a conversational agent that can answer questions and set up watches.
  • Ultimately, building something that real people, from students to working adults, can use with the sole goal of providing them deals that save money.

What we learned

  • Deterministic checks on top of an LLM made the data dependable. The scheduler (Convex), the scrapers (Apify and Bright Data) and the reasoning (Claude) work best as separate pieces with clear jobs.
  • Designing every screen in Figma first made the app much faster to build.

What's next for dibs

  • Launch at UCLA first, then Berkeley and more schools before expanding to further regions.
  • TestFlight and Play Store builds, an always-on server, and production Convex and Clerk.
  • Smarter scheduling: scan busy stores daily and quiet ones less often, with extra runs for move-in week and game days.
  • Perks that credits can unlock with local shops. Any sponsored placements will stay in their own clearly labeled section, never in the organic feed.

Built With

Share this project:

Updates

Submission history