-
-
Spark's notification page when your location detects a potential spark (friend)..
-
Spark's details page showing compatibility rate, common interest, and a conversation starter.
-
Spark's user profile page where you can customize your interests as tags and an "about you" section where you can specify your interests.
Inspiration
Loneliness is a major public health crisis with incredibly high mortality risks causing over approximately 870,000 deaths annually (which affects about 1 in 6 people worldwide). According to the Trellis Strategies Spotlight Report in February 2026, from about 46,000 college students, 57% of college students often feel lonely. Spark was created to target this population, who often experience this adversity. It is often the case that students are surrounded by other people, yet they feel isolated. Especially in a dense crowd, it's very probable to find someone with similar interests and tastes, however, talking to everyone in that crowd is simply infeasible and unrealistic. Spark will provide a real time notification when you pass by a potential friend, so that moment of connection doesn’t pass by. Making friends on the fly, one spark at a time.
What it does
Spark finds people you can relate to and are likely to become friends with just by walking past them. You make a profile with your interests (or let Spark pull them from your connections, like Spotify, Strava and other potential integrations), flip the switch, and put your phone away. In the background, Spark checks who's nearby, and when someone within about 30 meters shares enough of what you're into, both your phones buzz. You can then see the interests you both matched on, and, if both parties agree, they can message each other to meet up since they are close already.
How we built it
- React Native (Expo) — the cross-platform mobile app, with background location tracking and push notifications so Spark can keep working with your phone in your pocket
- Rust (Axum) — the backend web server that handles location pings, runs the matching pipeline, and manages waves and sparks
- Google Gemini — we used gemini's embedding model to calculate a quick similarity score as a prefilter (cosine similarity > 0.5), then use gemini (the LLM) as a final similarity score calculator. Gemini also generates the shared interests and icebreaker.
- TimescaleDB + PostGIS — stores location pings as a time-series hypertable and answers "who's within 30 meters in the last 2 minutes" fast enough to run on every ping
- Supabase (PostgreSQL) — holds user profiles, waves, sparks, and chat messages, with row-level security keeping users' data isolated
Challenges we ran into
Getting Spark onto a physical iPhone was the biggest time sink of the hackathon. Because Spark needs background location and push notifications, we couldn't use Expo Go — our project had expo-dev-client installed, which breaks the normal QR code flow. Scanning kept bouncing us into Safari instead of the app, and when we forced Expo Go mode we hit a wall of auth errors: the CLI and the phone each needed to be signed into the same account, and the browser login kept failing on Windows because the OAuth URL contained characters that broke cmd.exe. We burned hours bouncing between "logged in on phone, not on CLI" and localhost redirect errors before we could reliably get a build onto the device.
Accomplishments that we're proud of
We're most proud of getting real-time interest matching working end-to-end. Every location ping runs through a full pipeline — find who's nearby in the last two minutes, prefilter candidates with Gemini embeddings to cut out obvious mismatches, then send the promising pairs to Gemini for a structured verdict with a score, shared interests, a reason you'd click, and an icebreaker — and it all happens fast enough that both phones buzz within seconds of two compatible people walking past each other. Making that cheap enough to run on every ping (instead of calling the LLM on every pair of users in the city) is what makes Spark actually feel like magic instead of a 10-second loading screen.
What we learned
- How to design a two-stage matching pipeline that keeps LLM costs sane by prefiltering with embeddings before calling Gemini
- How to work with time-series geospatial data using TimescaleDB hypertables and PostGIS ST_DWithin queries
- How to build a Rust + Axum backend with compile-time-checked SQL via sqlx
- How to wire up background location and push notifications in Expo without draining the battery
- How brutal iOS dev builds and Expo auth can be on Windows, and how to work around them
- How to design for privacy from the start — keeping coordinates server-side and gating profile reveals behind mutual opt-in
- How to use structured output (response schemas) in Gemini to get reliable, parseable match verdicts
What's next for Spark
We want Spark to be the first proximity social app that works just as well for people who are often left out of "go meet strangers in public" apps. That means full VoiceOver and TalkBack support with icebreakers read aloud through our ElevenLabs integration, distinct haptic patterns so Deaf users can feel the difference between a friend spark and a dating one, pre-written and text-to-speech-friendly replies for non-verbal users, sensory-preference flags for neurodivergent users (quiet spaces, async-only chat), and a "stationary mode" so people with limited mobility aren't missing matches just because they can't walk past someone. The goal is for Spark to make real-world connection easier for the people who need it most, not just the people apps are usually built for.
Built With
- axum
- expo.io
- gemini
- javascript
- postgresql
- reactnative
- rust
- sql
- sqlite
- supabase
- typescript
- vultr
Log in or sign up for Devpost to join the conversation.