Skip to content

FM Consulting

Community Event Coordination Platform

A private, invite-only event coordination platform for a closed group — poll-first event planning with real-time collaborative voting, a venue leaderboard, and an installable mobile experience.

Gallery

Case study

The problem

Coordinating a recurring group meetup entirely over group chat breaks down in the same ways every time: picking a date turns into scrolling back through dozens of messages, nobody can say with confidence which venue was actually good last time versus just memorable, and there's no single place holding reviews, photos, or a record of who still hasn't voted. The group had no shared source of truth for where they'd been, whether it was worth going back, or who was actually free this week.

The solution

Built for I Pizzoni, an Italian social group based in Amsterdam that meets regularly for group pizza nights, this platform is an invite-only app organized around a poll-first planning flow: a vote is opened against a candidate venue and a note, then members collaboratively propose and vote on dates through a shared availability calendar (a dual-month view on desktop, single-month on mobile) — any member can propose a new date, not just the organizer. Vote counts, new date proposals, and venue changes update live for every connected member via real-time subscriptions, with a dedicated "hasn't voted yet" panel so it's obvious who to nudge. An owner or admin finalizes an open poll into a real event, pre-populating attendees from the votes already cast, or can correct the venue mid-vote without recreating the whole poll. Once an event has happened, members log category-by-category reviews (with half-point scoring), upload photos — one of which gets tagged "photo of the night" and syncs as the venue's new cover image — leave multi-author notes, and export the event to their own calendar as an .ics file. A leaderboard ranks every venue by average score with a city filter, a stats page renders a hand-drawn horizontal-bar comparison of every member across selectable metrics (reviews, events, photos, venues proposed, feedback submitted) alongside group-record cards, and a feedback page lets any member submit and track suggestions with admin triage. The whole app installs as a PWA with an offline fallback page and a native-style bottom navigation bar on mobile.

How it was built

Access is gated by invite-only Google OAuth through Supabase Auth, with every table protected by Postgres Row Level Security rather than relying on application-layer checks that a bug could bypass. Poll finalization and the "photo of the night" tagging logic are implemented as Postgres functions/RPCs rather than a sequence of client-side writes, so turning a vote into a real event with pre-populated attendees is one atomic server-side operation instead of a race-prone multi-step client flow. Live poll updates run on Supabase Realtime's postgres_changes subscriptions. Every venue card resolves its cover image through a strict fallback chain — a Google Places photo, then the most recent event's tagged "photo of the night," then a manually uploaded custom image, then a deterministic placeholder — so no venue ever shows a broken image. Google avatar images are proxied through a server-side route specifically to route around the browser's ORB blocking of direct hotlinked Google avatar URLs. Theming is dark-mode-only with no manual toggle, driven entirely by CSS custom properties, including an RGB-triplet token pattern (e.g. --terracotta-rgb) so any component can build a theme-following translucent tint via rgba(var(--terracotta-rgb), 0.12) instead of a hardcoded color that would break under the dark palette. A Vercel Cron job pings the database every five days specifically to prevent Supabase's free-tier automatic pause from silently taking the app offline between uses.

More projects