← James Edwards
← James Edwards

Jump

A gamified dating app with location-based discovery and real-time chat.

Role
Co-founder, sole engineer
Year
February 2023 to January 2024
Platform
iOS
Status
Sunset
Stack
Swift · UIKit · Go · PostgreSQL · PostGIS · Redis · WebSockets · APNs
Meet real people, on campus, in your area, or globally: a profile card
Vote on polls: a poll with four profiles to choose from
Post a status: a temporary note on a profile, with a 24 hour limit
Fun messaging: a conversation with a GIF and emoji reactions
Take the leap: swiping right on a profile
Jump into something new: the match screen

Drag for more · click a screen to open it

Jump was a dating app. I co-founded it with friends who handled design and marketing, and I was the only engineer on it, building the iOS client and the Go backend. It shipped to the App Store in 2023.

01Matching

Someone was not eligible to appear just because they fit your settings. Both people's preferences had to hold in both directions, on gender and on age, before either of them was shown to the other. On top of that sat a set of exclusions: anyone already liked or passed on, anyone blocked in either direction, and accounts without photos or hidden from browsing.

The remaining candidates were ranked by a score that favoured recent activity, weighted double for anyone active in the last day, along with having more than one photo and being verified. Results were then ordered by distance band first, using PostGIS over geographic coordinates, and by score inside each band.

Reference implementation of reciprocal matching

02Messaging

A message was saved before the system decided how to deliver it. Connection state only changed the delivery path.

Match state can change while a socket is still open. Someone can unmatch mid-conversation. So sending, typing, reactions, unsends and read receipts all check the current match before they run. Being authorized when the connection opened is not enough.

Delivery itself was the simple part. If the recipient was connected, the message went over their WebSocket. If not, it went out as a push notification, provided they had notifications turned on.

03Coins and purchases

Jump had a small economy of its own: coins and shots, bought in the app and spent inside it.

Receipts were verified on the server against Apple's production endpoint, falling back to the sandbox when a receipt came from there, with RevenueCat as a second source of truth. Each purchase moved the balance together with the entitlement it granted.

The catalogue lived in the database: the products, their coin costs and quantities, and whether each was active. Prices and inventory could change without shipping a new build.