← All posts

Shipping the v1 feature set

featurelaunch

The first usable version of outing.social is live. Here's what's in it and why we made the choices we did.

The map

The map is the heart of the app. It's the first thing you see, and it answers the most basic question: what's happening near me? We're using Leaflet with OpenStreetMap tiles — free, open, and good enough for our purposes. Events show up as markers with sport-specific colors, and tapping one gives you the details without leaving the map.

We also added a geolocation button so the map can center on your current position. Simple, but essential for a "near me" experience.

Events and RSVPs

Events are the core record type. You pick a sport, set a date and time, choose a location (or attach a route), and publish. The event goes to your PDS, our indexer picks it up from the firehose, and it appears on the map and in listings.

RSVPs work the same way — they're their own record type, linked to an event. One RSVP per person per event, enforced at the database level. You can see who's going before you commit, and un-RSVP if plans change.

Getting identity resolution right was one of the trickier parts. When someone RSVPs, we have their DID but need to display their handle. That means resolving the DID document to find their handle — an extra network call, but it means we always show current handles even if someone has changed theirs.

Routes

Routes are shareable, reusable paths that you can attach to events. The route builder lets you plot points on a map, and we use OSRM for snap-to-road routing so your route follows actual roads and trails instead of cutting through buildings.

Each route stores its polyline, distance, and elevation data. When you're creating an event, you can pick from existing routes to pre-fill the location and distance — no need to describe "meet at the parking lot on Oak Street" when you can just link the route.

Clubs

Clubs give local groups a home. A running club, a weekly cycling group, a hiking meetup — they can have members, host events, and eventually coordinate regular schedules. For now it's the basics: create a club, pick your sports, and start building a community around it.

What's next

The foundation is there but it needs polish. The UI is functional-but-plain, loading states are nonexistent, and there's no feedback when you perform actions. We'll be tackling that next.