Finding an event is only useful if its date, venue and registration link are trustworthy. I built Party Crashers around that practical job: discover local events, understand the details, save a plan, and let organisers contribute without requiring every field to be retyped by hand.
ROLE
Product concept · Brand & product design · Full-stack development
Public event cataloguePublic listings make the information accessible before sign-in and link directly to event detail pages.
01 / THE PROBLEM
The events exist. The details are scattered.
Lagos events are spread across flyers, organiser websites and social feeds. The information is inconsistent, and a discovery feed becomes expensive to maintain if every listing needs manual transcription and map coordinates.
Who it’s for
People planning what to do in Lagos, campus and community groups, and organisers who need a route into local discovery.
What shaped the build
Freshness, missing venues and duplicate listings matter as much as visual design. Public browsing should work without an account, while personal data, uploads and publishing actions require verified ownership.
02 / The decisionsWhat changed, and why
01
Discover first. Sign in for personal actions.
Visitors should be able to inspect real events before committing to an account.
Public event pages and a server-readable catalogue sit alongside a Clerk-authenticated application for saved plans, preferences and submissions.
02
Treat the venue as data, not decoration.
An approximate city-centre pin can make a listing look complete while sending someone to the wrong place.
Reuse reviewed venues, then attempt an exact named OpenStreetMap POI match inside Lagos bounds. Ambiguous matches remain unresolved. Successful and failed lookups use different cache lifetimes.
03
Keep expensive and intrusive work opt-in.
OCR, browser permissions and paid search should not start just because a screen mounts.
Flyer OCR runs in a lazy device worker after a tap. Push permission has an explicit profile action. Paid extraction requires global and source-level configuration.
Event detailDate, venue, organiser context and external registration are the decision-making information.03 / THE HARD PART
Automate the repetitive work without inventing the missing facts.
A page can mention Lagos and an event name while omitting its year, venue or price. Blind auto-publication would turn incomplete source material into confident misinformation.
I separated discovery leads, conservative drafts and publishable events. Network checks bound public crawling; source policies and complete-event validation control publication. Venue reuse removes repeated work where evidence exists.
Inside the build.
Implementation details from the existing portfolio case study. Expand the parts you want to explore.
Event pipelineSource facts become a canonical event.+
Collect
Scheduled adapters read approved organiser feeds. A separate bounded discovery worker checks permitted websites and queues relevant event links.
supabase/functions/pc-discover/index.ts
Extract
Read schema.org/Event JSON-LD first. A conservative text fallback produces drafts; optional Firecrawl JSON extraction is enabled separately and never fills missing facts by guessing.
supabase/functions/pc-discover/extract.ts
Resolve & reconcile
Normalise dates to the Lagos context, classify the event and resolve venues. Source records and canonical events are reconciled to reduce duplicate listings and preserve provenance.
supabase/functions/pc-collect/adapters.ts
Publish
Source policy and complete-record validation decide automatic publication or review. Explicit source cancellation can archive a canonical event when no active source remains.
docs/WEB-DISCOVERY-SETUP.md
NotificationsPublish once. Deliver only with consent.+
Subscribe
A signed-in user chooses interests and enables notifications. The authenticated API stores explicit consent and the current device subscription.
A database trigger queues a delivery when an event first becomes publicly published. Catalogue backfill and subsequent edits do not create fresh alerts.
database/push-notifications.sql
Recheck
The minute dispatcher checks current consent, event status, expiry, interests and coarse area before sending encrypted Web Push with bounded retries.
supabase/functions/pc-push/index.ts
Open the plan
A service worker opens same-origin event links. The separate Android widget reads the public feed and uses local preferences without account credentials or GPS.
docs/notifications-and-widgets.md
Tools & connectionsWhat connects to what+
Clerk + jose
Account sessions, verified JWTs and remote signing keys.
Mutations derive ownership from the verified subject; client-supplied IDs are not the authority.
Supabase
Event catalogue, source records, review queues, quotas and scheduled workers.
Private ingestion and delivery tables have restricted access; privileged workers enforce application ownership.
Firecrawl API
Rotating Lagos searches and optional structured page extraction.
Key-dependent and bounded. Source approval and extraction switches still apply; configured code is not proof of an active paid connection.
Photon / OpenStreetMap
Named-venue lookup, attribution and caching.
Only unambiguous named POIs in the Lagos bounding box are accepted; street and city centroids are rejected.
Tesseract.js
On-device flyer text recognition.
Worker/WASM assets are served by the app; English model data downloads on first use. A person confirms missing or corrected details.
Web Push + Android
Opt-in browser alerts and a native Java home-screen widget.
Push delivery depends on device conditions. Android requests a 30-minute refresh, subject to JobScheduler; it is independent of push.
Quality & limitsWhat was checked, and what remains+
Ingestion has adversarial checks.
Repository regression suites cover private/reserved URLs, DNS and redirect escapes, robots denials, incomplete or expired events, taxonomy, venue ambiguity and user confirmation.
Auth and notification boundaries are tested separately.
The repository contains auth, consent, push and recommendation regressions. Its documentation distinguishes provider acceptance from a notification actually displayed on a phone.
Social integrations have honest limits.
Public indexed social links can be search leads. The X collector requires credentials and an explicit paid-search switch; Instagram/Facebook account OAuth is not implemented in the audited version.
The public site exposes real event listings and organiser registration links. The repository includes collectors, venue resolution, review tooling, saved preferences, opt-in push and an Android widget companion. Listing coverage, attendance impact and real-device delivery are separate from implementation completeness.
What comes next
Validate first-time event selection with Lagos users, test browser push on real Android devices, and complete signed widget distribution and launcher QA. Measure freshness and unresolved-venue rates before expanding sources.
Adapted from Miracle’s portfolio case study. The source audit describes the build at commit 9780504; it is not a claim that every integration is currently enabled.