Project Info
This project did not submit a demo video on Devpost.
Inspiration
We were sitting in the Bay Area with free time and zero motivation. Even though there was stuff to do, nothing felt exciting. Most apps give you the same list of restaurants and landmarks with no context or personalization. We wanted something that would take the pressure off decision-making and make going out feel a little more like a mission. Otherwise, we would just spend time scrolling on our phones, wasting our time. That’s how EXPLR started, as an app that makes everyday plans feel like quests and to bring adults out to explore the real world.
What it does
EXPLR gives you a daily, AI-generated quest based on your location, past activities, and personal preferences. These quests can be anything from trying a new cafe to checking out a nearby trail. You complete the quest by uploading a photo, and you can see your friends’ completed quests too. You build streaks, give feedback, and discover new places together. It considers whether you prefer museums to hiking, restaurants to camping, etc so it is part discovery tool, part daily motivator, and part social feed. Theres a leaderboard to build a competitive spirit amongst your friends to see who can explore the most days too.
How we built it
Frontend: Built with Next.js, React, and TypeScript. Styled using Tailwind CSS and shadcn/ui. Backend & Database: Supabase handles PostgreSQL, authentication, and image storage. Supabase RLS policies enforce security. AI & Geolocation: Gemini AI generates quests based on user context. Google Maps API confirms the location is real and plots points on the global map. State Management: A custom global store keeps user quests in sync across components without re-fetching.
Challenges we ran into
Authentication on the server: Supabase’s client didn’t carry user context server-side, causing row-level security issues. Fixed using a secure admin client with a SERVICE_ROLE_KEY. Duplicate AI results: Gemini occasionally repeated quest suggestions. We fixed it by passing full user quest history in the prompt and logging prompt data for debugging. Efficient social feed queries: We had to restructure our database joins to cleanly pull user, friend, and quest data together.
Accomplishments we're proud of
We got a full AI-powered experience working from end to end, including user login, quest generation, image uploads, and a live social feed. And most importantly, it actually made us want to explore again. We plan to deploy this webapp after the hackathon and use it amongst our friends back at the University of Michigan.
What we learned
How to use Supabase RLS and secure backend clients effectively How to debug AI prompt pipelines by logging intermediate data How to organize user-to-user relationships and content in relational databases
What's next
Add IOS and Android full functionality Let users reroll quests or fine-tune preferences Build out ELO-style quest scoring and improve the leaderboard Add reactions, comments, and real-time friend updates Eventually partner with local businesses for sponsored quests
EXPLR - Location-Based Quest Generation App
EXPLR is a full-stack web application that generates personalized real-world quests based on user interests, location, weather, and quest history using Google's Agent Development Kit (ADK). It combines AI-powered activity generation with social features to help users explore their surroundings and share experiences with friends.
TL;DR
EXPLR helps users discover new places and experiences by generating personalized quests using AI, location data, and weather. Users complete quests by submitting photos and track their progress through a social feed and leaderboard. Built with Next.js, FastAPI, Supabase, and Google Maps.
Project Links
- Live Demo: quest-production-a5ff.up.railway.app
- Devpost: devpost.com/software/explr-mlcpig
What This Project Does
- Personalized quest generation using multi-agent AI workflows
- Quest suggestions factor in user interests, real-time weather, and location
- Interactive quest map with Google Maps pinning and location validation
- Social feed to share completed quests with friends
- Leaderboard tracking user activity and streaks
Multi-Agent Quest Generation Pipeline
- Summarizer Agent – Analyzes user interests and quest history
- Weather-Time Agent – Uses coordinates and weather API to suggest viable activities
- Search Agent – Finds nearby places that fit the activity
- Reformatter Agent – Finalizes quest object and metadata
Tech Stack
Frontend:
- Next.js 15.2.4 (App Router)
- Tailwind CSS, shadcn/ui, Radix UI
- Supabase Auth
- Google Maps API
Backend:
- FastAPI (Python 3.11)
- Google ADK (multi-agent)
- Supabase (PostgreSQL)
- Weather API
DevOps:
- Docker
- Railway (deployment)
Quick Start
Frontend
cd app/
npm install
npm run dev
Visit: http://localhost:3000
Backend
pip install -r requirements.txt
uvicorn lib.fastapi_server:app --host 0.0.0.0 --port 8000 --reload
Visit: http://localhost:8000
Full Stack with Docker
docker-compose up --build
Sample Quest Output
{
"final_quest": {
"title": "Visit Local Art Museum",
"description": "Philadelphia Museum of Art: See world-class exhibits...",
"locationName": "Philadelphia Museum of Art",
"address": "2600 Benjamin Franklin Pkwy, Philadelphia, PA 19130",
"coords": { "lat": 39.9656, "lng": -75.1809 },
"validated": true,
"location": { "name": "...", "rating": 4.5, "placeId": "..." }
}
}
API Reference
POST /quests
Generates a new quest for a user
GET /admin
Health check for backend / DB status
Docs available at:
- Swagger: http://localhost:8000/docs
- OpenAPI: http://localhost:8000/openapi.json
Development Notes
- Use TypeScript and functional components in frontend
- Backend agents follow a consistent four-step pipeline
- Quests are stored as validated JSON objects
- Add CORS middleware for frontend-backend integration
Troubleshooting
| Problem | Solution |
|---|---|
| Ports 3000/8000 taken | Free ports or change config |
| .env missing vars | Define all required keys |
| CORS errors | Add proper middleware in FastAPI |
| Map not rendering | Enable Google Maps billing and key |
Analysis
View
Metric
- 11
Figures cover GitHub contributors during the hackathon window. A co-authored commit counts in full for each author, so per-member totals add up to more than the whole-team figures.
Technology
- CSSIn code
- FastAPIIn code
- Google GeminiIn code
- JavaScriptIn code
- Next.jsIn code
- PythonIn code
- ReactIn code
- SQLIn code
- SupabaseIn code
- Tailwind CSSIn code
- TypeScriptIn code
11 of 11 appear in the indexed code.
AI coding agents
No AI coding agent signals were found in this repository.
Detected from committed agent config files and commit authorship. Absence of a signal is not proof an agent was unused.
Codebase size
Source size
398 KB
Source files
106
Counts recognized source files only; vendored directories, binaries and lockfiles are excluded, so this is smaller than the repository on disk.
Repository
abouvel/quest
132 files · 941 KB · @ 5a36a70
Structure
Interface
62 files · 47%Screens, components and styles rendered to the user.
+4 moreAPI & routing
2 files · 2%Request entry points: routes, handlers and controllers.
Application logic
30 files · 23%Domain rules, services and shared utilities.
Data & schema
9 files · 7%Schema definitions, migrations and data access.
Supporting
Layers are inferred from where files sit in the tree, not from reading the code. A project that names its directories unconventionally will read oddly here — open the file browser to check anything the diagram implies.
Languages
- TypeScript70%
- JavaScript16%
- Python5%
- SQL4%
- Markdown3%
- CSS1%
- Other (2)0%
Share of indexed source by file size. Binary and vendored files are excluded.
Dependencies
package.json
npm · 61- @google/generative-ai
- @googlemaps/js-api-loader
- @hookform/resolvers
- @radix-ui/react-accordion
- @radix-ui/react-alert-dialog
- @radix-ui/react-aspect-ratio
- @radix-ui/react-avatar
- @radix-ui/react-checkbox
- @radix-ui/react-collapsible
- @radix-ui/react-context-menu
- @radix-ui/react-dialog
- @radix-ui/react-dropdown-menu
- @radix-ui/react-hover-card
- @radix-ui/react-label
- @radix-ui/react-menubar
- @radix-ui/react-navigation-menu
- @radix-ui/react-popover
- @radix-ui/react-progress
- +43 more
requirements.txt
pypi · 8- asyncio
- backports.zoneinfo
- fastapi
- google-adk
- google-genai
- requests
- supabase
- uvicorn
Declared in the repository’s manifests at the indexed commit. A declared package is not proof it is used, and runtime dependencies are listed first.
This project’s features have not been analysed yet.
Export this project's context (description, README, evidence, key source files) to chat with an AI agent elsewhere.