Inspiration

It started with a TikTok. A South African woman posted a video saying she was craving a best friend — just one, no third party, no sharing — and the comments section exploded. Over 2,500 women dropped their city names. Soweto. Midrand. Tembisa. East Rand. Pretoria. Cape Town. All of them saying the same thing: I am here, I am lonely, and no app exists for me.

That comment section broke our hearts a little. These women weren't looking for dating apps. They weren't looking for group chats. They wanted one real person nearby who gets them. And there was nothing built for that — nothing safe, nothing local, nothing that actually understood the South African experience of friendship.

NixFOMO is our answer to that comment section. The name says it all — nix your fear of missing out on real friendship.

What it does

NixFOMO is a women-only friendship matching app built specifically for South African women. You open the app, verify who you are, tell it what you are into, and it shows you real women nearby who share your energy — not a random list, but an interest-sorted queue that puts the most compatible people first.

The core loop is simple. You swipe through profiles. If you both like each other, a match is created and the chat unlocks. Not before. There are no one-sided messages, no unsolicited contact, no way to reach someone who hasn't said yes back. The messaging gate is enforced at the database level, not just the frontend, so it cannot be bypassed.

Beyond one-on-one matching, NixFOMO has a Hangouts layer — women can post IRL group plans and others can RSVP. A sunrise hike in Hennops. A Sunday brunch at Eastgate. A business accountability session in Sandton. Small groups, real plans, actual connection.

Every profile goes through a verification flow — email confirmation and a mandatory selfie — before appearing in anyone's discovery queue. A trust score is visible on every profile so you know exactly how verified someone is before you swipe. The result is a space that feels safer than a comment section, more intentional than a Facebook group, and more culturally specific than anything else currently available to South African women.

There are three tiers — Sis (free), Bestie (R49/month), and Day One (R99/month) — so women can start for free and upgrade when they are ready to unlock unlimited matches, profile boosts, and advanced filters. Payments run through Paystack in ZAR, the right choice for a South African product.

How we built it

NixFOMO is a full-stack mobile-first web application. The frontend is built with Next.js 14 App Router, TypeScript, and Tailwind CSS, prompted and deployed on Vercel. The entire UI is designed as a mobile shell — it renders as a centered phone frame on desktop and fills the screen on mobile, because the women we built this for live on their phones.

The backend runs entirely through Next.js Route Handlers under /api/*. There is no separate backend server. Every route — profiles, swipes, matches, messages, hangouts, subscriptions, selfie uploads — lives in the same codebase and deploys as Vercel Serverless Functions.

Identity and sessions work through an httpOnly session cookie that holds the database user ID. Every single API request resolves the current user from that cookie and scopes all queries by that user ID. There is no client-supplied user ID anywhere in the system — users can only ever read and write their own data. This was a deliberate security decision and one we are proud of.

The database is Amazon Aurora PostgreSQL, queried with node-postgres over TLS. The connection authenticates using AWS IAM database auth — Vercel's OIDC token is exchanged for a short-lived database credential, so there is no long-lived password sitting in environment variables. The schema stores vibes and bestie types as PostgreSQL arrays with GIN indexes, which makes the interest-based discovery query fast even as the user base grows.

The matching logic is the part we cared most about getting right. The discovery queue is not random. It is sorted by a score calculated in SQL from overlapping vibes, bestie type preferences, and location. A woman looking for a God-fearing gym buddy in Midrand sees other God-fearing gym buddies in Midrand first. Messaging is locked until both women swipe yes on each other — no one-sided contact, no unsolicited messages, no pressure. This is enforced at the database level, not just the UI.

Selfie verification uploads directly from the client to Amazon S3 via short-lived presigned URLs, bypassing the server entirely. The server never touches the image — it just issues the URL and records the S3 key once the upload confirms.

Challenges we ran into

The hardest challenge was the database connection. Aurora PostgreSQL on Vercel uses OIDC federation for authentication — short-lived tokens instead of static passwords — and getting that to work with Next.js serverless functions required understanding the full IAM trust chain. The connection pool also had to be lazy-loaded because serverless functions import modules before environment variables are confirmed available, and an eager pool creation was crashing the server silently and falling back to demo data without us realising for longer than we would like to admit.

The session architecture took several iterations. We started with localStorage for user identity which worked locally but broke in important ways — it was client-only, it couldn't be trusted on API routes, and it meant any client could pass any user ID they wanted. Switching to httpOnly session cookies and resolving the current user server-side on every request was the right call but it meant rewriting how every API route identified its caller.

The selfie requirement was a UX challenge. Making something feel safe and not invasive when you're asking someone to take a photo of their face is genuinely hard. We went through several versions before landing on the current flow — the dashed zone, the immediate local preview, the background S3 upload so the UI never blocks. The key insight was that the selfie needed to feel like a warm community norm, not a surveillance checkpoint.

Time was the third challenge. Building a production-quality social app as a two-person team in hackathon time means making hard calls about what to finish properly and what to stub. The Paystack backend is fully wired but the UI checkout runs simulated for the demo — the frontend redirect to Paystack's hosted checkout broke during a late-stage refactor and there was not enough time to restore it cleanly without risking other parts of the app. The hangout creation flow works but the real-time attendee count update is not yet live. We made peace with shipping something real and honest rather than something that looked complete but was hollow underneath.

Accomplishments that we're proud of

Getting the AWS IAM database authentication working properly is the thing we are most technically proud of. Aurora PostgreSQL on Vercel authenticates using OIDC federation — Vercel's token is exchanged for a short-lived database credential, so there is no long-lived password anywhere in the system. That is production-grade security architecture and getting it working as a two-person team, under hackathon time pressure, in a Next.js serverless environment where connection pools have to be lazy-loaded — that was genuinely hard and we are proud it is in the final product.

The interest-based discovery query is something we are proud of too. It looks simple from the outside — you see profiles that share your vibe. But underneath, it is a SQL query with GIN indexes on PostgreSQL array columns, computing overlap scores between two women's interest arrays and location in a single round trip to Aurora. It scales. It is not a loop in JavaScript. It is the database doing what databases are built to do.

The session architecture took us several painful iterations to get right. Every API route resolves the current user from an httpOnly session cookie — there is no client-supplied user ID anywhere. Users can only ever read and write their own data. That sounds like table stakes but it is not something every hackathon project gets right, and we did.

The UI passing for a native app on mobile is something we are proud of in a different way. The swipe card physics, the drag thresholds, the fling animations, the keyboard fallbacks — all built from scratch without a swipe library because we wanted the interaction to feel like the app understood what it was. The lime and dark colour system, the Bebas Neue headings, the verified badges and trust scores — it looks like a real product because it was designed like one from the start, not styled at the end.

Most of all we are proud that the 12 demo profiles in the live database are not just placeholder text. They are women with real bios, real locations, real vibes — Siyanda from Midrand who doesn't want to share her bestie, Yolanda from Soweto who's married and tired of fake friendships, Nomsa from Tembisa who just wants someone to hike with. They feel real because the problem they represent is real. That grounding shows in every product decision NixFOMO makes.

What we learned

We learned that building for a specific community forces you to make better product decisions. Because we were building for South African women specifically we had to think about things a generic app would never consider — that Joburg means something different depending on whether you're in Soweto, Sandton, or Tembisa. That the friendship dynamic here is different. That safety is not a feature you add at the end, it has to be the foundation.

We learned a lot about Aurora PostgreSQL specifically — particularly the power of GIN indexes on array columns. The vibes and bestie_type fields are stored as PostgreSQL arrays and querying overlap between two arrays using ANY() with a GIN index is significantly faster than anything we would have built with a traditional relational join table. It was one of those moments where choosing the right database feature made the core product feature actually viable at scale.

We learned that AWS IAM authentication for databases is genuinely elegant once you understand it. The fact that Vercel's OIDC token can be exchanged for a short-lived database credential with no long-lived secrets anywhere in the system is the kind of security architecture that used to require a dedicated DevOps team to set up. The Vercel and AWS integration made it accessible to a two-person team building under time pressure.

We also learned how brutal it is to build swipe card mechanics from scratch without a library. The drag-to-swipe implementation with pointer events, threshold detection, fling animations, and keyboard fallbacks took longer than almost anything else in the project. But it was worth it because the card physics feel natural in a way that copied solutions never quite do.

What's next for nixFOMO

The first thing on the roadmap after the hackathon is fixing the Paystack checkout redirect. The backend is fully built — the initialise route creates a transaction, the verify route confirms payment against the real Paystack API, and the webhook handles the full subscription lifecycle. The one missing piece is the frontend redirect to Paystack's hosted checkout page. That is a 30-minute fix, not a rebuild, and it is first on the list.

The second priority is proper identity verification. The gender gate currently works at the UI level but there is no backend document check. The architecture already supports it — the selfie is already in S3, the verified column is already in the database. Plugging in Onfido or AWS Rekognition for face-liveness and ID document matching is a well-defined integration, not a rebuild. That goes in immediately after payments because the safety promise of NixFOMO has to be backed by something real.

The third priority is real-time updates. The chat works and messages persist, but attendee counts on hangouts and new message notifications currently require a refresh. Wiring AWS AppSync WebSocket subscriptions properly — so your chat lights up the moment someone sends a message — is the next infrastructure piece.

The fourth is expanding the Hangouts layer into something bigger. Right now hangouts are simple RSVP events. The vision is NixFOMO IRL — curated branded events in Johannesburg, Pretoria, Durban, and Cape Town. A breakfast in Sandton. A hike in the Cape Peninsula. A business networking morning in Tembisa. Ticketed through Paystack, organised by NixFOMO, attended by verified members. That is a real revenue stream and a real community moment that no other friendship app is building.

The fifth is the brand partnership layer. SA lifestyle brands — the ones that already market to young Black South African women — want to reach this audience in a space they trust. NixFOMO's model keeps that clean. Brands sponsor hangout categories, not the swipe stack. A God-fearing breakfast hangout presented by a local coffee brand. A gym buddy matching week in partnership with a fitness brand. The advertising never touches the core matching experience.

After South Africa is solid, the expansion path is clear. Nigeria. Kenya. Zimbabwe. The same loneliness exists in Lagos and Nairobi. The same TikTok comment sections exist. Aurora Global Database means geographic expansion is an infrastructure decision, not a rebuild. The product travels because the problem travels.

The long-term vision is for NixFOMO to be the trust layer for women's friendship in Africa. Not just a matching app. A verified community where a woman in Midrand knows that the person she is meeting for breakfast on Saturday is who she says she is, wants what she says she wants, and has been vouched for by the same system that connected them. That is the app we are building. The hackathon was the beginning.

Built With

Share this project:

Updates