Postdate is a dating app where your first message arrives as a real letter. Users match in the app, write their first message digitally, and Postdate prints and mails it to their match while keeping both mailing addresses private; once the letter arrives, the connection continues in-app.
Technically, Postdate combines mobile dating UX with a real-world mail workflow. I built the product around privacy-safe address handling, credit-based purchases for physical sends, and a paired-send exchange system that coordinates both users’ first letters, manages state transitions and expirations, and integrates with a third-party mail API to turn in-app actions into physical delivery.
Tech Stack
Mobile (iOS + Android)
React Native with Expo (SDK 54) + React Navigation (native stack, bottom tabs)
Supabase JS client for data fetching, realtime channels, and PKCE auth (Google OAuth + Apple Sign-In)
Stripe React Native SDKs for payments, subscriptions, and identity verification
Amplitude for analytics; Expo Push Notifications for engagement
Web (Marketing Site)
Next.js 16 (App Router) with Tailwind CSS v4 + shadcn/ui (Radix primitives)
React Hook Form + Zod for form validation
Vercel Analytics for traffic insights
Backend / API
Vercel Serverless Functions (@vercel/node)
Supabase (Postgres) for data storage, auth, and realtime
Stripe API for payment intents, subscriptions, webhooks, and Identity verification sessions
Handwrytten API for physical letter fulfillment
Smarty API for address verification
OpenAI Moderations API (omni-moderation-latest) for image content moderation
Vercel Cron Jobs for scheduled tasks (exchange expiry, Handwrytten order polling)
Shared
TypeScript across mobile, web, and server
Supabase Auth (PKCE flow) as the single authentication layer
Fuse.js for fuzzy search/matching (mobile + server)
Geolib for distance-based matching
URL |
postdate.app |