Projects I've built — professional, personal, and everything in between.
MobileIn Development
Spindare
2025–2026
Daily challenge social app. Spin a wheel, get a challenge from 200+ curated picks, share it with friends. TikTok-style feed meets real-world accountability.
UI/UX lead on a 3-person team. 300+ components, 150k+ lines of code. iOS launch September 2026.
Architecture decisions, technical depth, and what it actually took to build these.
SpindareReact Native · Supabase · 150k+ LOC
A social gamification platform where users spin for daily challenges, complete them, and share with friends. Built for iOS and Android with React Native, TypeScript, and Supabase Realtime.
Real-time social feed with reactions
Daily challenge spin system — 200+ curated picks
Streak tracking and gamification
AI-powered challenge generation via Gemini
In-app messaging via Stream Chat
Auth via Clerk with custom Supabase ban system
300+Components
150k+Lines of code
3Person team
Sep '26iOS launch
Architecture decisions
Why Supabase over Firebase
Real-time scaleSupabase Realtime handled 10K+ concurrent reactions with lower latency than Firebase's WebSocket implementation.
Data integrityPostgreSQL RLS let me enforce privacy rules at the DB layer — no bloated middleware needed.
Dev velocityGoTrue Auth let me ship the full V2 authentication flow in under 48 hours.
Why Expo over bare React Native
OTA updatesShip bug fixes without waiting for App Store review cycles.
Build pipelineEAS Build replaced a complex native build setup with a single command — critical for a small team.
TravelMeReact Native · OpenAI · Solo project
Describe your trip in plain language — TravelMe generates a full itinerary: flights, hotels, local experiences, day-by-day plan. No more juggling 10 apps.
Natural language trip planning via OpenAI
Full itinerary generation — flights, hotels, activities
Payments via Stripe
Offline itinerary access
Architecture decisions
Why TypeScript everywhere
Bug preventionTypeScript's type checker prevents entire classes of runtime errors before they reach users.
RefactoringRenaming a prop instantly surfaces every affected usage — essential when working fast and solo.