Skip to content

Latest commit

 

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 

Repository files navigation

LezFindr Logo

LezFindr

A community-centric dating and social app for lesbian, queer, and trans individuals.

Download on the App Store Get it on Google Play

lezfindr.com


📱 Project Overview

Note: The source code for this application is proprietary and closed-source. This repository serves as an architectural overview and portfolio showcase.

LezFindr is a fully realized, production-grade dating and social platform for sapphic women — live on both app stores, serving a global user base in 16 languages, processing real payments, and moderated daily by a trust & safety pipeline built from scratch. I managed the entire product lifecycle — design, architecture, implementation, deployment, and ongoing operations — using a collaborative AI engineering workflow to execute the complete system as a solo engineer.

It's an indie alternative to the big dating apps: a "verified or gone" identity policy, location-based discovery, real-time chat with voice messages, in-app video & voice calling, a regional community board, events, and a business platform for LGBTQ+-friendly venues.

📸 Screenshots

Discovery Verification Filters Video Calls
Discovery Verification Filters Video calls
New Members Online Now Flares Premium
New members Online now Flares Premium

Full app walkthrough →

🏗️ System Architecture

Four deployed applications sharing one edge-first backend:

flowchart LR
    subgraph Clients
        A["📱 Flutter app<br/>iOS + Android"]
        B["🖥️ Admin panel<br/>React + Vite"]
        C["🌐 Marketing site<br/>Next.js"]
    end

    subgraph Cloudflare["☁️ Cloudflare edge"]
        W["Workers API<br/>Hono + TypeScript"]
        DO["Durable Objects<br/>WebSocket chat + call signaling"]
        R2["R2 object storage<br/>photos · audio · backups"]
        KV["KV cache<br/>JWKS · rate limits"]
        CRON["Cron triggers<br/>notifications · cleanup · retention"]
    end

    subgraph Data
        PG[("Neon Postgres<br/>+ PostGIS")]
    end

    subgraph Services
        FB["Firebase Auth + FCM"]
        PAY["Stripe + RevenueCat"]
        ML["Self-hosted ML moderation<br/>(GPU workstation)"]
    end

    A & B & C --> W
    A <--> DO
    W --> PG
    W --> R2
    W --> KV
    CRON --> W
    W <--> FB & PAY
    ML <--> W
Loading
Component Stack Role
Mobile app Flutter · Dart · BLoC · go_router · get_it iOS + Android — 26 feature modules, ~250k lines of Dart
API Cloudflare Workers · Hono · TypeScript 28 route modules, WebSocket chat via Durable Objects, WebRTC call signaling, scheduled jobs
Database Neon Serverless Postgres · PostGIS Geospatial discovery (ST_DWithin on geography columns), 54 versioned SQL migrations
Media Cloudflare R2 Photos, voice messages, DB backups — served from a custom CDN domain; a separate restricted sandbox bucket for moderation evidence preservation
Admin panel React 18 · Vite · shadcn/ui · Capacitor 25-page moderation & operations console, also builds as a native mobile app
Website Next.js 16 · React 19 · Tailwind 4 Marketing site + business onboarding on Vercel
Auth Firebase Auth JWTs verified at the edge via jose against Firebase JWKS (cached in KV); role claims for admin/business
Payments RevenueCat + Stripe App-store subscriptions, day passes, business billing, webhook-driven entitlements
ML moderation Python · ArcFace · Whisper · ViT classifiers Self-hosted trust & safety pipeline — deep-dive

✨ Engineering Highlights

  • 🌍 Geospatial discovery at the edge — distance-ranked profile feeds powered by PostGIS geography queries, served from Cloudflare's global edge network. → backend
  • 📞 P2P video & voice calling — WebRTC 1:1 calls with a Durable Object signaling channel, a full call-state machine (ring, answer, decline, busy-lockout), and native incoming-call UX on both platforms. Voice calls reuse the same stack as an audio-only mode. → mobile app
  • 💬 Real-time chat on Durable Objects — one stateful WebSocket room per conversation, with typing indicators, read receipts, in-app voice messages stored in R2, and message-level moderation hooks. → backend
  • 🛡️ A trust & safety system that actually works — liveness-checked photo verification with face matching (ArcFace, 0.991 AUC on production data), tiered spam filtering, scam-corridor friction, human-in-the-loop review queues, and a self-hosted multi-model moderation engine. Measured finding: small specialized models beat general-purpose VLMs on both accuracy and cost. → trust & safety
  • 🔄 A live Firebase → Postgres migration — the platform started Firebase-everything and was migrated to Neon + Cloudflare Workers while in production, with ETL for Firestore→Postgres and Storage→R2, keeping Firebase only for auth and push. → architecture
  • 🌐 16-language internationalization — 2,100+ localized strings across 16 locales, RTL support included.
  • 💰 Full monetization stack — one premium tier, buyable day passes, rewarded ads, trial-expiry lifecycle, win-back offers — all entitlements resolved server-side so clients can never self-grant premium.
  • 🧯 Operational maturity — 3-2-1 database backups (PITR + nightly pg_dump to R2 + offsite), force-update gates via Remote Config, crash-driven release trains, structured log anomaly detection, and fleet version telemetry.

🔢 By the Numbers

Lines of Dart (app) ~250,000
Lines of TypeScript (API) ~23,500
API route modules 28
Flutter feature modules 26
SQL migrations 54
Admin panel pages 25
Languages 16
Deployed applications 4
Engineers 1

🧑‍💻 Code Samples

Hand-picked, sanitized excerpts of production code — real style, real decisions, annotated inline:

  • chat-room.ts — the Durable Object powering chat and WebRTC call signaling, with hibernation-safe broadcasting
  • auth-middleware.ts — edge JWT verification against Firebase JWKS (jose), zero network I/O in the warm path
  • discovery-nearby.ts — the PostGIS discovery query: composable SQL filters and safety gates in the WHERE clause
  • nearby_bloc.dart — a production Flutter BLoC: user-keyed caching, cursor pagination with dedupe, optimistic swipes

Browse all samples →

📚 Documentation

Doc What's inside
Architecture System design, the Firebase→Cloudflare migration story, key decisions, deployment topology
Backend Workers API design, PostGIS discovery, Durable Objects chat & call signaling, cron jobs, payments, backups
Mobile app Flutter architecture, state management, WebRTC calling, i18n, release engineering
Trust & safety Verification pipeline, ML moderation engine, anti-scam systems, admin operations
App walkthrough Screen-by-screen tour of the product

Built and operated by Joshua Miller · lezfindr.com

About

Production dating & social platform for sapphic women — live on both app stores, 4,700+ users, 16 languages. Solo-built architecture showcase: Cloudflare Workers, PostGIS, Durable Objects, self-hosted trust & safety ML.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages