Sidequests - Project Description
Inspiration
How often do you walk past something incredible without noticing? A hidden laneway covered in street art, a rooftop with an unreal sunset view, a tiny ramen shop that changes your life. The best experiences aren't on billboards. They're found through friends, through wandering, through saying yes to something unexpected.
We grew up on video games where the best moments weren't in the main quest. They were the sidequests: the detours, the hidden areas, the "what's over there?" moments. Real life works the same way. The problem is that there's no good way to track those experiences, share them with friends, or discover what's around you.
Letterboxd solved this for movies. It turned film watching from a passive solo activity into something social and trackable. You log what you've seen, rate it, see what your friends loved, and build a watchlist. We wanted that same energy for real-world experiences.
Existing tools don't cut it. Google Maps is for navigation, not discovery. Instagram buries experiences in an algorithmic feed. TripAdvisor is for tourists. None of them answer the question: "What have my friends actually done and loved near me?"
What it does
Sidequests is a social experience-tracking app. Open it up and you see a map centered on your location, dotted with pins representing nearby experiences — we call them sidequests. A hidden waterfall, the best brunch spot in town, a cliff you can abseil down, a night market with killer street food.
Each pin is color-coded to your personal relationship with it. Gray means you haven't been. Green means you've completed it. Gold means it's on your bucket list. Tap a pin and a detail panel slides up showing the sidequest's name, category, average rating, and — most importantly — which of your friends have done it and what they thought.
When you complete a sidequest, you log it with up to three photos, a star rating, and an optional review. If it was on your bucket list, it automatically moves to your logbook. Your logbook is your personal record of every experience you've had, and your bucket list keeps track of everything you still want to do.
The social layer ties it all together. Follow your friends and their activity shows up on every sidequest they've completed. "4 friends completed this" is more convincing than any review from a stranger. You can browse friends' profiles, see their logbooks, and steal ideas for your own bucket list.
Category filters (Adventure, Food, Nature, Culture, Nightlife) and search let you find exactly what you're after, whether that's a hike for Saturday morning or somewhere new to eat tonight.
How we built it
We run a React Native mobile app built with Expo, talking to a FastAPI backend with PostgreSQL.
On the backend, we used SQLAlchemy as our ORM with Alembic for migrations. Authentication supports both email/password (JWT-based) and Google OAuth. Image uploads are stored on the local filesystem and served as static files through FastAPI. The API is fully RESTful with 18 endpoints covering auth, sidequests, logging, bucket lists, social follows, and user profiles.
On the mobile side, we used react-native-maps for the map experience, @gorhom/bottom-sheet for the draggable detail panel, and expo-image-picker for photo capture and gallery selection. Navigation uses @react-navigation/bottom-tabs for the four-tab structure. Axios handles all API communication with automatic JWT injection via AsyncStorage.
We followed test-driven development on the backend, writing pytest tests before implementations. The database was seeded with 25 real locations across Melbourne to have meaningful demo data from day one.
We built it in phases optimized for demo-ability at any stopping point: foundation and auth first, then the core map experience, then logging and bucket lists, then the list screens, then social features, and finally polish.
Challenges we ran into
Getting the map interaction right was the biggest design challenge. We wanted the pin-tap-to-bottom-sheet flow to feel native and responsive, not clunky. Balancing how much information to show in the half-state versus the full-state of the bottom sheet required several iterations.
Denormalized rating calculations were trickier than expected. Keeping average_rating and total_logs in sync across create, update, and delete operations without race conditions or double-counting required careful arithmetic rather than naive re-querying.
Image uploads through React Native with multipart form data to FastAPI had quirks around how the form data gets constructed on the mobile side versus what FastAPI expects. Getting the content type headers right took some debugging.
Geo-filtering without PostGIS meant implementing Haversine distance calculations in Python. It works for our demo data size but wouldn't scale to millions of sidequests without a proper spatial index.
Accomplishments that we're proud of
The map experience feels genuinely good. Seeing your pins turn from gray to green as you complete sidequests around your city is surprisingly satisfying. The color-coded pins give you an instant visual sense of your progress.
The social integration is seamless. Seeing "3 friends completed this" on a sidequest pin changes how you think about it. It's social proof that actually means something because these are people you know and trust.
The bucket list to logbook flow is smooth. Adding something to your bucket list, then later logging it and watching it automatically migrate to your logbook feels like a complete loop. The photos you attach when logging become part of the sidequest's visual story for your friends.
The whole app is demo-able at every phase of development. We designed the build order so that each phase produces a working product, not just incremental code.
What we learned
Building a map-first mobile app is fundamentally different from building a feed-first app. The map is both the primary navigation and the primary content display, which means every interaction has to feel spatial and contextual.
Denormalized data is a trade-off, not a shortcut. It makes reads fast but writes complex. Every mutation to a log has to update the parent sidequest's stats atomically.
For hackathon-scoped work, the right level of testing is backend TDD and manual frontend testing. Writing React Native component tests would have eaten hours we needed for features, but having solid API tests caught real bugs early.
Designing for demo-ability from the start saves you at the end. We never had a "it doesn't work yet" phase because each build phase produced something you could pick up and use.
What's next for Sidequests
User-generated sidequests. Right now the database is pre-seeded. Opening it up for anyone to add sidequests would turn this into a community-driven platform where every city gets its own living map of experiences.
Activity feed. A chronological feed showing what your friends have been up to: new logs, new bucket list additions, new follows. Right now you only see friend activity per sidequest; a feed would surface it proactively.
Achievements and streaks. Log 5 sidequests in a category, earn a badge. Complete 3 sidequests in a week, maintain a streak. Gamification that encourages exploration without being obnoxious.
Push notifications. Your friend just completed a sidequest near you. A new sidequest was added in your area. Gentle nudges to get out and explore.
Photo improvements. Better image handling with cloud storage, image compression, and a proper gallery view with full-screen photos.
Built With
• Expo • React Native • TypeScript • FastAPI • PostgreSQL • SQLAlchemy • Alembic • Python
Log in or sign up for Devpost to join the conversation.