What inspired Sidequest I'm in London, and my weekends are never empty on paper — they're overfull. I sign up for hackathons on Luma, say yes to friends, bookmark a swim at Hampstead Heath, tell myself I'll finally check out that popup or meetup… and then Saturday arrives and I'm still in bed scrolling.

The problem isn't boredom. It's decision fatigue. There are too many listings, too many tabs, and almost no signal about what actually fits my life: Can I afford it? Am I free that afternoon? Does it match what I eat? Is it even real, or just something an AI made up?

I've watched "AI planners" confidently recommend venues that don't exist. I didn't want another chatbot that sounds helpful. I wanted an agent that does real work on the open web, applies hard constraints, and only then asks an LLM to format the answer — with citations I can open and verify.

That's Sidequest — your weekend, verified.

Sometimes I want a hackathon. Sometimes I want to go out with friends. Sometimes I just want to swim. Sidequest doesn't pretend to know me better than I do. It cuts the scroll, surfaces options that pass my rules, and helps me commit to a plan I can trust.

What I learned

  1. Search and verification should be separate jobs.

Tavily is great at pulling live data from the web — but the web is messy. Letting an LLM decide what's "valid" felt wrong for a product about trust. Moving the filter gate to Prometheux / Vadalog was the biggest mindset shift: constraints become explicit logic, not prompt engineering.

  1. Users care about why something showed up.

Showing filter stats (12 → 4 candidates) and per-event rule badges (Budget, Diet, free Saturday afternoon) made the app feel honest. People don't want magic — they want receipts.

  1. Calendar context changes everything.

A great event you can't attend is worse than no recommendation. Wiring Google Calendar free/busy into the pipeline turned Sidequest from a generic event browser into something that respects how weekends actually work.

  1. Hackathon scope is a feature.

I didn't try to boil the ocean. Friends' calendars, group overlap, Luma API ingestion — that's the vision. v1 ships what I needed this weekend: my constraints, my calendar, verified options, cited output.

How I built it Sidequest is a map-first web app with a Python agent backend.

Frontend (Next.js + TypeScript)

Google sign-in via Firebase (with a mock mode for demos without keys) One-time profile: home city, budget, diet, activities, accessibility Leaflet map + event cards with Prometheux verification badges Google Calendar freeBusy → morning / afternoon / evening free slots on Sat/Sun Backend (FastAPI) The agent pipeline:

Tavily (live search) → Prometheux/Vadalog (deterministic filter) → Gemini (format only) → cited.md Tavily — parallel searches for weekend events and restaurants Fact injection — each result becomes a Vadalog candidate(...) fact plus user constraints (max_budget, diet tokens, free_slot, etc.) Prometheux — runs the matches concept via prometheux_chain; only passing rows continue Gemini — formats a human-readable itinerary from verified rows only (prompt forbids invented venues) cited.md — published audit trail: filter stats, verified candidate table, itinerary, source URLs Observability — Langfuse traces every step (search-weekend-options → filter-with-prometheux → build-itinerary).

Sponsor integrations

Tool Role Tavily Live web retrieval Prometheux Deterministic constraint gate (core differentiator) Gemini Itinerary formatting from verified data only Langfuse Full agent trace Firebase Auth + Firestore profiles MPP Payment rail scaffolded on /api/plan (SKIP_MPP=true for demo) I also built a SwiftUI iOS companion that talks to the same /discover and /plan APIs.

Challenges I faced Prometheux as a hard gate, not a nice-to-have. Early on I was tempted to fall back to Python filtering when the SDK was slow or misconfigured. For the Prometheux track that would've missed the point. I committed to SDK-only filtering and clear errors when PMTX_TOKEN isn't set — the whole story depends on deterministic verification.

Gemini wants to be helpful — too helpful. Even with a strict prompt, models drift toward inventing venues. The fix wasn't better prompting alone; it was never sending unfiltered Tavily results to Gemini. Prometheux is the anti-hallucination wall.

Calendar OAuth is fiddly. I split basic Google sign-in from calendar scope re-auth so sign-in wouldn't break on consent screens. Free-slot derivation (morning / afternoon / evening across two weekends) took more edge-case handling than I expected.

Making "verified" visible. A backend filter stat isn't enough for users. I spent time on UI: Prometheux ✓ badges, rule chips on cards, filter counts in the sidebar, and a cited.md file judges (and I) can open cold.

Scope vs. story. I want friend calendar overlap and Luma-aware busy blocks next. For the hackathon I shipped the loop I actually use: discover on a map → pick something → plan the weekend → read the citations.

Why it matters Weekends shouldn't feel like a second job of tab-hunting. Sidequest is for people who are already motivated — hackathons, friends, a swim, a gig — but need help turning "there's so much on" into "here's what fits my life, with proof."

Your main quest might be the build. Sidequest is everything else — verified.

Built With

  • cloud
  • fastapi
  • firebase-(auth-&-firestore)
  • firebase-app-hosting
  • google-calendar-api
  • google-gemini
  • langfuse
  • leaflet.js
  • mpp
  • next.js
  • prometheux-(vadalog)
  • python
  • react
  • swiftui
  • tailwind-css
  • tavily-api
  • typescript
Share this project:

Updates

Submission history