Inspiration

I was inspired by Thumbtack, which connects people with local professionals for services. But I noticed there wasn't a simple, community-focused app for neighbors to help each other out with everyday tasks. Thumbtack is great for hiring pros, but what if you just need a college student to tutor your kid, someone to walk your dog, or a neighbor with a truck to help you move a couch. EduMe fills that gap by connecting people who need help with locals who can provide it, all within a chosen radius so you're only seeing posts from your actual community. EduMe helps skillful people who don't know where to start make a name for themselves while making a bit of extra cash on the side.

What I Learned

This project taught me a ton about real-time data handling with Firebase. I learned how Firestore snapshot listeners work for live updates, how to properly encode timestamps (turns out Firestore was encoding my timestamps as strings instead of actual Timestamp objects, which broke my sorting), and how to structure NoSQL data for efficient queries (Chatgpt helped a lot :-)). I also got way more comfortable with SwiftUI's state management using the new Observable macro and learned how to integrate third-party APIs like OpenAI for content moderation. CoreLocation was new to me too, specifically calculating distances between coordinates to filter posts by proximity.

How I Built It

I built EduMe using SwiftUI for the frontend and Firebase for the backend (Authentication, Firestore). The app uses a clean MVVM architecture with separate ViewModels for authentication, posts, and chat functionality. For real-time features, I implemented Firestore snapshot listeners so posts and messages update instantly across all devices. Location filtering uses CoreLocation to calculate distances client-side, comparing each post's coordinates against the user's location and radius preference. Content moderation combines OpenAI's Moderation API with a custom keyword filter to catch inappropriate or illegal content before it gets posted. I also added Google Sign-In for easy authentication alongside traditional email/password.

Challenges I Faced

The real-time stuff gave me the most trouble. Getting messages to show up instantly for the sender was tricky because Firestore was encoding my timestamps wrong, so the listener wasn't picking them up in the right order. I ended up adding optimistic UI updates so your message appears immediately while it syncs in the background. Firestore permissions were another headache. I kept getting "missing or insufficient permissions" errors until I got the security rules dialed in for posts, chats, and messages. Every time I changed a filter on my queries, I'd get a "query requires an index" error and had to create composite indexes. The location filtering took some figuring out too. I had to store latitude and longitude on every post and then calculate distances client-side using CoreLocation to make sure someone in the UK doesn't see posts from California. For content moderation, I integrated OpenAI's API but realized it doesn't catch everything (like someone posting about illegal activities), so I added my own keyword filter on top. Overall, lots of debugging Firestore decoding errors, learning how Swift handles Firebase data types the hard way, and watching a lot of YouTube videos to figure out SwiftUI and Firebase integration.

Built With

Share this project:

Updates