Building an interracial-only dating app with React Native and Node.js
This was my fourth production cross-platform React Native app. Under the terms of my employer I can't name it, so I'll talk about the stack and how I implemented it instead. Social networks have always pulled at my interest, and dating apps sit in a sub-category of that.
I won't go on a rant about why I'm wary of social networks, except to say that faking your way into the top 10–20% of a category is easy, while the people actually creating get drowned out by whoever pays their way up. A dating app is no different: some users can buy their way to the top of the deck. It's not my place to second-guess what the client wants — they were clear that no two people of the same race should match — but I'd have liked more focus on the broader goals for the app than on that one rule.
Starting with a Node backend
I leaned hard on Docker here. At work I'd settled into a monolithic way of doing things, so using Docker felt freeing. All my ICE and TURN servers were just config curated for the backend, hosted in Portainer. I wasn't comfortable with Kubernetes yet, so I didn't reach for it. The other goal was honestly to cut down the neck pain from staring at the screen too long — running containers on the VPS took a lot of that load off.
Backend — Node.js
- Express + Socket.IO for the signalling server
- Prisma on MySQL (I disliked doing it in Prisma again, and I mean to go back to Drizzle soon)
- An S3 bucket (it's a dating app, so it's all about images)
I had an Ubuntu VPS for the Node process and used Nginx Proxy Manager again for the reverse proxy. TypeScript sped things up — it only took me a month to build everything and still focus on the application itself.
The React Native client
Jotai, MMKV, and React Query saved me on server state and local state management.
A dating app isn't really what it looks like — it's a place where, by luck or chance, you match with someone you wanted to. So I tuned the matching algorithm to be somewhat lenient, but not more lenient than Tinder or Bumble.
The hardest part was that it had to be a copy of a copy of a copy. Every dating app is the same, and the client wanted the familiar swipe-left, swipe-right — which is the norm now. Building it sat uneasily with me, and I hope the client's idea pans out without the app picking up a bad reputation.
I'll end on some optimism: the mega social networks run on luck and influence, and a dating app alone isn't enough to scale to a million users and hold their retention. After that it's a matter of fading away like the other dating apps in the stores. With that done, I think it's time to learn Go, C, or Rust backends and come back with a better mindset on building scalable backends.