Inspiration

We kept planning in group chats and it always devolved into “where are we meeting?” + “who’s actually coming?”. Instagram shows moments after they happen; BeReal is time-bound. We wanted place-centric, now-or-soon posts that make it obvious where to go and who’s down.

What it does

Map-first composer: drag a pin or use current location; reverse-geocoded place label (e.g., “McKeldin Library”). Smart images: auto-generates a relevant photo from the caption keywords (Pexels API fallback when no upload). [Not implemented yet] Social + planning: likes, comments, and simple RSVP (“I’m in”) on each post. [Not implemented yet] My Posts vs Discover: your own feed with delete/shuffle image; public feed for everyone. Auth & profiles: session-based auth with user handles/avatars; row-level security (RLS) so you only modify your content.

Challenges we ran into

Map api confusion where Google Maps “ApiProjectMapError” (billing/keys) Swapped to Leaflet + OSM for a free, frictionless dev experience. etc Supabase RLS & SQL pitfalls create policy if not exists is not valid → created policies with unique names once.

Accomplishments that we're proud of

Shipped a true map-first feed: every post is anchored to a pin with a clean mini-map under the photo. From “Google Maps billing error” to “free & fast”: migrated to Leaflet + OpenStreetMap and fixed SSR issues with dynamic imports. Secure by default: Supabase Auth + RLS so users can only insert/update/delete their own posts; public read works without leaking PII. Profiles that actually show names/handles: added a profiles table and joined it in queries so feeds don’t say “User.”

What we learned

SSR gotchas for browser-only libs: Leaflet must be dynamically imported (ssr:false), and marker icons need manual asset URLs. APIs fail in the real world: adding graceful fallbacks (placeholder images, reverse-geocode throttling) keeps UX smooth. Clear data contracts reduce churn: mapping DB rows → UI Post type (and back) kept page code simple and testable.

What's next for LinkUp

Real image uploads to Supabase Storage (with signed URLs + transformations). Full RSVP model (rsvps table) with attendee list and capacity. Push/Realtime updates for comments/likes/RSVPs. Search/Discover by place, time, and tags. Private groups and invite-only posts. Moderation: profanity/NSFW filters on captions and images.

Built With

Share this project:

Updates