ScrollDate
A live dating app backend and admin system for nearby discovery, matching, chat, moderation, analytics, and paid features.
Audience: Dating app users, moderators, administrators, and business operators.
On this page
Problem
ScrollDate is a live Android dating app for meeting nearby people, matching around interests, and sharing moments. The product is public on Google Play and includes in-app purchases.
My work focused on the backend and admin systems: profile data, location-based discovery, swipes and matches, posts, chat support, moderation, analytics, credits, subscriptions, and purchase handling.
Context
- My role
- Software engineer at Techsfera working on backend and admin systems
- Product
- Live dating app on Google Play
- Backend
- Bun, Hono, TypeScript, Drizzle, PostgreSQL/PostGIS, and Better Auth
- Admin app
- Next.js, React, Tailwind CSS, TanStack Query, and Recharts
- Core workflows
- Location-based discovery, swipes, matches, posts, chat, moderation, and analytics
- Monetization
- Credit packs, Plus subscriptions, RevenueCat webhooks, and premium-feature limits
- Realtime operations
- Socket.IO chat, Redis-backed sessions, and event delivery paths through Kafka and NATS
My contribution
At Techsfera, I worked on ScrollDate's backend and admin systems from June 2025 to April 2026. The work covered location-based social workflows, realtime messaging, moderation, analytics, and monetization logic.
The project shaped how I think about product engineering: keep business rules on the server, make state changes explicit, protect paid actions from duplicate processing, and give operators the tools they need to run the product.
The challenge
A dating app has several product rules running at the same time. Users need nearby profiles, safe content, fair matching behavior, private conversations, and paid features that behave consistently across sessions.
The admin side has to make those workflows visible: who is joining, how users are matching, what content is being posted, how subscriptions and credits are changing, and where moderation is needed.
ScrollDate connects those areas through a backend API, realtime chat infrastructure, and a Next.js admin console.
What I worked on
My work covered backend and admin workflows used after launch: user and profile data, trait configuration, location-based profile discovery, swipes, match creation, post management, realtime messaging support, paid feature accounting, and analytics.
I also worked on admin screens for inspecting users and posts, applying restrictions, managing profile options, and reading acquisition, retention, matching, monetization, and content dashboards.
Product rules such as matching, credits, subscriptions, profile visibility, and moderation are enforced on the server with database constraints, transactions, and permission checks.
Location-based discovery and matching
Profile discovery uses the user's location, preferences, age range, interests, and radius to return nearby candidates while excluding blocked, banned, already-swiped, and already-matched users.
PostgreSQL/PostGIS handles geospatial filtering and distance ordering, keeping discovery rules close to the data.
Swipes use uniqueness rules so the same user pair is not processed repeatedly. Mutual likes create matches and conversations. Super likes follow premium-feature rules before they are accepted.
Realtime chat and messaging
Chat uses authenticated Socket.IO connections. A user connects with a one-time token, the gateway verifies the session, registers the connection in Redis, and routes events to the recipient.
Messages are saved before realtime delivery. The REST API supports attachments, replies, read status, and unread counts. Participant checks make sure users can access only the conversations they belong to.
The message dispatcher uses Redis for active-session delivery and has Kafka/NATS publishing paths for downstream processing. That keeps message storage, delivery, and follow-up processing separated.
Credits, subscriptions and purchase handling
ScrollDate includes credits, Plus subscriptions, and paid features such as super likes and seeing who liked you.
The backend checks feature usage against plan limits, deducts credits when needed, and records credit transactions so paid actions can be audited.
RevenueCat webhooks process credit purchases and subscription lifecycle events. Events are marked as processed before balance or subscription updates are applied, which helps retries avoid duplicate credits or repeated subscription changes.
Admin and moderation systems
The admin console lets operators inspect profile details, block or unblock accounts, review posts, hide or restore content, and manage profile traits such as activities, feelings, personalities, and professions.
User and post tables support search, sorting, and product-specific filters such as plan, gender, preferred gender, age band, profession, profile completeness, photo presence, location presence, post visibility, and account state.
The admin API enforces role checks on the server. The Next.js admin app uses credentialed API requests, TanStack Query mutations, and confirmation dialogs for moderation actions.
Analytics and operations
ScrollDate's admin analytics help operators understand product activity without reading raw database tables. The dashboard includes overview KPIs and separate views for acquisition, retention, matching, monetization, and content.
Analytics filters cover plan, gender, preferred gender, age band, profession, profile completion, location/photo presence, subscription state, swipe action, super likes, transaction type, post privacy, and content state.
The frontend presents trend charts, KPI cards, and drill-down tables with Recharts and TanStack Query. The backend builds the aggregated data through typed Hono routes and PostgreSQL queries.
How it works
The mobile app talks to a Hono API running on Bun. Better Auth handles user sessions and admin access, Drizzle maps the PostgreSQL schema, and PostGIS supports location-based discovery.
AWS S3 stores uploaded media, Expo push notifications support interaction updates, RevenueCat handles in-app purchase events, and Redis stores realtime chat session state.
The admin console is a separate Next.js app. It connects to protected admin APIs for user management, post moderation, profile configuration, analytics, and monetization operations.
Engineering highlights
The matching workflow uses database constraints, canonical user pairs, and transaction boundaries so swipes, matches, and conversations stay consistent when users act quickly.
Credits and subscription limits are backend rules, not client-side assumptions. That keeps billing, retries, and entitlement checks tied to server state.
The admin system answers practical operations questions: which users are active, which posts need attention, how users are matching, how credits and subscriptions are behaving, and where moderators need to act.
Technologies
TypeScript · Bun · Hono · PostgreSQL/PostGIS · Drizzle · Better Auth · Socket.IO · Redis · Kafka · NATS · AWS S3 · RevenueCat · Expo Push · Next.js · React · Tailwind CSS · TanStack Query · Recharts