Inspiration

I wanted to make meeting people feel more intentional and interactive than endlessly swiping through profiles. Blink puts people into live dating rooms where they can show their personality, make choices, and connect through a shared experience.

What it does

Blink lets people create a profile, set dating preferences, and join or host a room. Participants move through rounds with first impressions, questions, and profile reveals before a host makes a final choice. When two people match, they can continue the conversation in chat. The app also includes AI-generated host commentary and premium features.

How we built it

I built Blink as a solo project using Expo, React Native, and TypeScript. I organized the code into screens, reusable components, hooks, service modules, and shared app state with claude code . Supabase provides authentication, Postgres data, RPC actions, and realtime updates for rooms and messages. AsyncStorage persists the signed-in session and local app data. The app can also request host commentary from a Supabase Edge Function, with a local fallback if the request fails

Challenges we ran into

One challenge was coordinating room state across multiple users. I used Supabase Realtime subscriptions to keep room phases, participant decisions, and events in sync. Another challenge was handling matchmaking when no live room was available, so I added a timeout that moves the user into a local simulation instead of leaving them waiting indefinitely. I also added fallback host lines so the experience can continue if the AI service is unavailable.

Accomplishments that we're proud of

I’m proud that I built the complete experience end to end as a solo developer, from the profile and preferences flows to the live room UI and match experience. I’m also proud of the separation between the real Supabase room flow and the local simulation, which lets the app demonstrate the interaction even when matchmaking doesn’t produce a live room.

What we learned

I learned how to structure a React Native app around reusable components, shared state, and focused service hooks. I also gained practical experience with Supabase Auth, database RPCs, realtime subscriptions, and persistent storage. Building the fallback paths taught me to design around network services failing or being unavailable.

What's next for Blink

Next, I’d improve reconnect and room-transition behavior, add more automated checks for the live multiplayer flows, and make it easier to tell when a user is in a live room versus a local simulation. I’d also continue developing compatibility insights and the post-match conversation experience.

Below are some technical achievements i made

What technologies I used:

I used Expo, React Native, and TypeScript for the mobile app. Supabase handles authentication, Postgres data, RPC calls, and realtime updates. AsyncStorage handles local persistence. The project also includes RevenueCat integration for premium features and an optional Supabase Edge Function integration for AI-generated host commentary.

How i implemented a realtime room state :

When a user enters a real room, the app loads the room, participant roster, and event history from Supabase. A custom React hook then subscribes to database changes for the room, participants, and event feed. The hook removes its realtime channel when it’s no longer needed.

How did I structure the app:

I separated screens, reusable UI components, hooks, and service code. Room screens handle presentation and interactions, room action functions wrap Supabase operations, and realtime hooks manage subscriptions. Shared app state connects authentication, profile data, matchmaking, and app flows.

The matchmaking work:

The app first tries to join a Supabase matchmaking queue. If a room forms immediately, it opens that room; otherwise, the app listens for a room assignment. If matchmaking hasn’t resolved after about 12 seconds, the current flow falls back to a local room simulation.

How I handle AI features:

The app requests host commentary from a Supabase Edge Function. If the request fails or returns no usable line, it falls back to a local bank of lines so the room experience can continue.” How I handled persistence and authentication: I use Supabase Auth with AsyncStorage configured as the session storage adapter, so sessions can persist across app restarts. I also save app state such as profile details, preferences, and local matches to local storage. Profile edits can sync to Supabase. How did I handle chat? The project has a Supabase-backed path that loads and subscribes to messages for a match, and a separate local mock-message flow for simulated matches. That lets the app support real-time chat while also demonstrating the experience in the local flow.

What would I improve next: I’d strengthen validation of the live flows, especially reconnect behavior and room transitions. I’d also make the distinction between a live room and a local simulation clearer and expand automated checks around the backend and client.Add real time video and audio.

Built With

Share this project:

Updates

Submission history