Skip to content
NOBA235Public

Latest commit

Β 

History

45 Commits

Folders and files

Repository files navigation

Blink

License: MIT β€” see LICENSE.

Find your perfect match. Connect with people who match your vibe.
Real-time rooms. AI-powered compatibility. Meaningful connections.

Expo SDK React Native React Supabase TypeScript Gemini


What is Blink?

Blink is a next-generation mobile app for finding people who truly match your vibe. Instead of endless swiping through profiles, Blink puts you in live rooms where real connections happen in real time.

Host a room and let people come to you β€” or join someone's room and compete to be their perfect match. An AI-powered Whisper Engine analyzes compatibility behind the scenes, helping hosts make better decisions based on shared interests, food preferences, and lifestyle alignment.

The result? Faster, more intentional connections with people you'll actually vibe with.


How It Works

🎀 Host a Room

Create a live room, set the vibe (Casual, Romantic, Adventurous...), and wait for participants to join. You're in control.

🎯 Join a Room

Browse live rooms, see the host's vibe and profile, and jump in. Compete across three rounds to be their pick.

πŸ€– AI Whisper Engine

As participants join, Blink's AI analyzes their profile against yours β€” shared interests, food & drink preferences, activity alignment β€” and whispers compatibility insights only you can see: "She shares 4 interests with you", "His food preferences align 90%".

πŸ”„ Three Rounds

  1. First Impressions β€” Host sees participants with AI compatibility scores. Eliminate who doesn't fit.
  2. Icebreakers β€” AI suggests personalized questions. Participants answer live. Host narrows down.
  3. The Reveal β€” Full profiles unlocked. AI shows detailed compatibility breakdown. Host picks their match.

πŸ’¬ Real Chat

Matched? Enter real-time private messaging powered by Supabase Realtime. No bots, no delays β€” just real conversation.


Key Features

Feature Description
Live Rooms Real-time multiplayer rooms with WebSocket sync via Supabase Realtime
Host & Participant Roles Choose to host (you pick) or compete (get picked)
AI Compatibility Engine Gemini 3.5 Flash analyzes profiles and generates whisper insights
Date Preferences Curate your ideal date β€” activities, cuisines, drinks β€” powered by a Hinge-inspired UI
Real-Time Chat Instant messaging with your matches via Supabase Realtime
Tactile Audio & Haptics Native sound effects and device vibrations for immersive feedback
Warm Editorial Design Hinge-grade aesthetics with deep plum branding and serif typography

Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                        BLINK CLIENT (EXPO / RN)                        β”‚
β”‚                                                                        β”‚
β”‚   Expo Router (Stack + Tabs)                                           β”‚
β”‚   β”œβ”€β”€ (tabs)/home ──── Host a Room / Join a Room / Date Preferences    β”‚
β”‚   β”œβ”€β”€ (tabs)/rooms ─── Browse Live Rooms (real-time from Supabase)     β”‚
β”‚   β”œβ”€β”€ (tabs)/matches ─ Your Matches & Real-Time Chat                   β”‚
β”‚   β”œβ”€β”€ create-room ──── Room Setup (title, vibe, max participants)       β”‚
β”‚   β”œβ”€β”€ room ──────────── Host Room View / Participant Room View          β”‚
β”‚   β”œβ”€β”€ date-special ─── Date Concierge Onboarding                       β”‚
β”‚   └── date-preferences Activities, Foods, Drinks & Summary Card        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                      β”‚
         WebSockets (Realtime)        β”‚        PostgREST API
                                      β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                          SUPABASE CLUSTER                              β”‚
β”‚                                                                        β”‚
β”‚   β”œβ”€β”€ Postgres: profiles, rooms, room_participants, room_events,       β”‚
β”‚   β”‚             compatibility_scores, matches, messages                 β”‚
β”‚   β”œβ”€β”€ RPCs: create_hosted_room, join_room, eliminate_participant,       β”‚
β”‚   β”‚         pick_match, advance_hosted_room, get_open_rooms            β”‚
β”‚   β”œβ”€β”€ Realtime Channels: room state, participant joins, chat messages  β”‚
β”‚   └── Edge Functions: analyze-compatibility, generate-host-line        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                      β”‚
                                      β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                         GEMINI 3.5 FLASH ENGINE                        β”‚
β”‚   Analyzes profile compatibility & generates whisper insights          β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Project Structure

blink/
β”œβ”€β”€ app/                              # Expo Router file-based navigation
β”‚   β”œβ”€β”€ _layout.tsx                   # Root navigation, theme & audio providers
β”‚   β”œβ”€β”€ (tabs)/                       # Tab navigator: Home, Rooms, Matches, Profile
β”‚   β”œβ”€β”€ create-room.tsx               # Host room setup screen
β”‚   β”œβ”€β”€ room.tsx                      # Live room dispatcher (Host/Participant views)
β”‚   β”œβ”€β”€ date-special.tsx              # Date Concierge onboarding
β”‚   β”œβ”€β”€ date-preferences.tsx          # Date Preferences editor
β”‚   β”œβ”€β”€ chat.tsx                      # Real-time 1:1 messaging
β”‚   └── auth.tsx                      # Authentication flow
β”œβ”€β”€ src/
β”‚   β”œβ”€β”€ screens/
β”‚   β”‚   β”œβ”€β”€ CreateRoomScreen.tsx      # Room creation with vibe & participant settings
β”‚   β”‚   β”œβ”€β”€ HostLobbyScreen.tsx       # Host waiting room with AI compatibility badges
β”‚   β”‚   β”œβ”€β”€ HostRoomScreen.tsx        # 3-round game from host's perspective
β”‚   β”‚   β”œβ”€β”€ ParticipantRoomScreen.tsx # Participant view with live question answering
β”‚   β”‚   β”œβ”€β”€ HomeScreen.tsx            # Host/Join CTAs & Date Preferences banner
β”‚   β”‚   β”œβ”€β”€ RoomsScreen.tsx           # Browse real live rooms from Supabase
β”‚   β”‚   β”œβ”€β”€ ChatScreen.tsx            # Real-time chat with matches
β”‚   β”‚   └── ProfileScreen.tsx         # User profile & preferences showcase
β”‚   β”œβ”€β”€ components/
β”‚   β”‚   β”œβ”€β”€ dating/                   # Hinge-inspired dating UI components
β”‚   β”‚   └── ui.tsx                    # Shared atomic UI primitives
β”‚   β”œβ”€β”€ hooks/
β”‚   β”‚   └── useAppState.tsx           # Global state with host/participant room flows
β”‚   β”œβ”€β”€ lib/
β”‚   β”‚   β”œβ”€β”€ roomActions.ts            # Supabase RPCs for room management
β”‚   β”‚   β”œβ”€β”€ useRealtimeRoom.ts        # Real-time hooks for rooms, browsing & chat
β”‚   β”‚   β”œβ”€β”€ supabase.ts               # Supabase client initialization
β”‚   β”‚   └── sound.tsx                 # Audio & haptic feedback system
β”‚   β”œβ”€β”€ types/
β”‚   β”‚   └── dating.ts                 # Domain models for dating preferences
β”‚   └── theme.ts                      # Design tokens, color palette & typography
└── supabase/
    β”œβ”€β”€ functions/
    β”‚   β”œβ”€β”€ analyze-compatibility/     # AI compatibility scoring (Gemini 3.5 Flash)
    β”‚   └── generate-host-line/        # AI host commentary
    └── migrations/
        β”œβ”€β”€ 0001_init.sql              # Core schema: profiles, rooms, messages, RLS
        β”œβ”€β”€ 0002_phase_engine.sql      # Room phase state machine
        β”œβ”€β”€ 0003_host_trigger.sql      # Event notifications for AI
        β”œβ”€β”€ 0004_hosted_rooms.sql      # Hosted rooms, compatibility scores, new RPCs
        β”œβ”€β”€ 0007_hosted_room_join_leave.sql # Hosted-room join and leave RPCs
        β”œβ”€β”€ 0008_room_rls_no_recursion.sql # Room policies without recursive RLS
        β”œβ”€β”€ 0009_hosted_room_gameplay.sql # Like/pass, icebreakers, match pick, safe leave
        β”œβ”€β”€ 0010_chat_access.sql         # Match-scoped chat reads and writes
        └── 0011_match_chat_rpc.sql     # Authenticated read/send functions for chat

Design System

Token Value Purpose
Background #FAF4F8 Warm blush lavender-gray canvas
Surface #FFFFFF Crisp white cards and containers
Primary #4E214E Deep plum brand accent
Active Selection #F4EBF4 Selected chip & tab background
Border #EFE8EF Subtle card and control borders
Editorial Serif Georgia / serif High-impact editorial headlines
Touch Targets β‰₯ 44 Γ— 44 dp Accessible touch geometry on all controls

Quickstart

Prerequisites

  • Node.js β‰₯ 18
  • Expo CLI (npm install -g expo-cli)
  • Expo Go on your phone, or iOS/Android emulator

1. Clone & Install

git clone https://github.com/NOBA235/Blink.git
cd Blink/blink
npm install --legacy-peer-deps

2. Configure Environment

cp .env.example .env

Fill in your Supabase credentials:

EXPO_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
EXPO_PUBLIC_SUPABASE_PUBLISHABLE_KEY=your-supabase-anon-key

3. Launch Development Server

Option A: Local Network (Same Wi-Fi)

npx expo start

Option B: Tunnel Mode (Recommended for Expo Go)

npx expo start --tunnel
  • @expo/ngrok is pre-configured in devDependencies for seamless tunnel connections.
  • Scan the QR code with Expo Go to test on your phone.
  • Press w for Web, i for iOS Simulator, a for Android Emulator.

RevenueCat Setup

  1. Create a project named Blink at https://app.revenuecat.com and add the iOS and/or Android app.

  2. Create an entitlement with identifier premium.

  3. Create store products blink_premium_monthly ($4.99/month) and blink_premium_annual ($29.99/year).

  4. Attach both products to the entitlement and add monthly and annual packages to the default offering.

  5. In RevenueCat, open Project settings β†’ API keys. Copy the public SDK key for each platform into src/lib/revenuecat.ts, replacing the placeholders:

    const RC_API_KEY_IOS = "appl_your_public_ios_sdk_key";
    const RC_API_KEY_ANDROID = "goog_your_public_android_sdk_key";

    Use the platform-specific key. Do not use a RevenueCat secret API key in the app.

  6. Rebuild and reinstall the native development app after adding the SDK and keys. RevenueCat purchases are not available in Expo Go or web.

  7. For the hackathon demo, open Settings and use [DEV] Simulate Premium in a development build to exercise premium screens without a store purchase.

The free tier includes five completed room visits per local calendar day and three saved matches. Room visit counts persist under blink_room_visits in AsyncStorage. Expo autolinks the native module; rebuild the native development client after adding the SDK.

Backend Setup

1. Apply Migrations

Run the SQL scripts in supabase/migrations/ sequentially in your Supabase SQL editor:

  • 0001_init.sql β€” Core schema, profiles, rooms, RLS policies
  • 0002_phase_engine.sql β€” Room phase state machine
  • 0003_host_trigger.sql β€” Event notifications for AI host
  • 0004_hosted_rooms.sql β€” Hosted rooms, compatibility scores, new RPCs
  • 0005_repair_host_profile.sql β€” Ensure existing users have profiles before hosting
  • 0006_close_hosted_room.sql β€” Allow hosts to close cancelled rooms
  • 0007_hosted_room_join_leave.sql β€” Guard hosted-room joins and participant exits
  • 0008_room_rls_no_recursion.sql β€” Fix recursive room visibility policies

2. Deploy Edge Functions

supabase functions deploy analyze-compatibility
supabase functions deploy generate-host-line
supabase secrets set GEMINI_API_KEY=your_gemini_api_key

Code Quality

# Type check all routes, components, and hooks
npx tsc --noEmit

Engineering Standards

  • Real-Time First: All room interactions, chat, and browsing powered by Supabase Realtime WebSockets.
  • AI-Assisted, Human-Decided: AI provides compatibility insights; the host makes the final call.
  • No Fake Data: Every room, participant, match, and message is real.
  • Strict TypeScript: Zero any types. Full type safety across the codebase.
  • Offline-First Persistence: Profile and preferences sync to AsyncStorage for instant app launches.
  • Responsive Design: Flex-based layouts ensure flawless rendering across all screen sizes.

Made with care by the Noba;

Releases

Packages

Contributors

Languages