# Caged: Real-time subscription app for couples

A private, real-time app for two. Subscription SaaS for couples, from landing page to live product in two months.

*Andrei · Caged · United Kingdom · 2026 - present · 2 months, then ongoing*

## The brief

Andrei came to us with a niche consumer idea: a private, invite-only app for couples practicing consensual chastity dynamics, built around anticipation, ritual and accountability rather than explicit content. Nothing on the market treated the niche with polish or discretion.

He needed the full package: brand and landing page, the product itself, real-time sync between partners, and a subscription business model with a free trial. It had to ship fast, and it had to be built so a native mobile app could follow later.

## What we built

- **Couple pairing.** invite codes, two roles, one shared account
- **Live shared timer.** always accurate, on every device
- **Permission flow.** request, grant or deny, synced instantly
- **Roulette countdowns.** set by hand or by customizable chance
- **Statistics dashboard.** streaks, ratios and trends
- **Installable PWA.** offline-capable, with push notifications
- **Stripe billing.** two tiers, free trial, customer portal
- **Marketing site.** brand, landing page and onboarding

## How it works

One monorepo, three deployables: the app, the marketing site, and a NestJS API that owns all business logic across 52 endpoints, so a future native app can reuse it wholesale. Real-time sync runs through a couple-scoped WebSocket gateway with 24 typed events, Redis-backed for scale, and Stripe webhooks are the single source of truth for subscription state.

## Stack

- **App:** Next.js, React, Tailwind CSS, TanStack Query, Framer Motion, Recharts, Serwist PWA, Web Push
- **API:** NestJS, PostgreSQL, Prisma, Socket.IO, Redis, BetterAuth, Stripe
- **Infra:** Turborepo, pnpm, Docker, Railway, Vercel, GitHub Actions
- **Comms & telemetry:** Resend, React Email, Sentry, Microsoft Clarity

## Numbers

- **250+** members joined
- **100M+** seconds tracked between partners
- **1,000+** activity events logged
- **52** REST endpoints behind the app
- **24** typed real-time events
- **28k** lines of TypeScript across the monorepo

## The hardest part

Time itself. The entire product is a timer shared by two people who may be in different timezones, on different devices, sometimes offline, and the numbers have to agree everywhere, always. We solved it by never storing a running counter: the server holds only timestamps, and every client derives elapsed time from them, so the timer survives reconnects, sleep and device switches without drifting.

The statistics engine was the deepest rabbit hole. A streak spanning a month boundary would get bucketed into the wrong month and show impossible results, like 32 days locked inside a 30-day filter. The fix slices every streak into per-calendar-month segments aligned to the couple's timezone, with the active streak contributing live from the wall clock, and re-segments history whenever a user changes timezone.

## What the client said

> "Working with Roberto has been a true pleasure, from beginning to end. I needed someone to understand my peculiar niche and this turned out to be the perfect choice for me. Very smooth and quick process, respected the timeline with precision and delivered a top quality product."
> Andrei, United Kingdom, rated 5/5

More work: https://dock30.com/work

## Contact

- Email: crew@dock30.com
- Book a call: https://dock30.com/contact
