GrowsChat: I rebuilt my failed random chat app (web + Android)
My first random chat app failed. I open sourced it, had no rate limiting, no monetization and no SEO, and costs grew faster than users. GrowsChat is the closed source rebuild. This is what changed, and the problem I stil
My first random chat app failed. I open sourced it, had no rate limiting, no monetization and no SEO, and costs grew faster than users. GrowsChat is the closed source rebuild. This is what changed, and the problem I still have.
What it is
Random text, voice and video chat with strangers. No account needed to start. Web app plus a native Android app (React Native with Expo, currently in preview, not on the Play Store yet). Available in English, Spanish and Russian.
Stack
- Web: Next.js (App Router), TypeScript, MUI
- Realtime: Node.js with Socket.IO, MongoDB, Redis
- Calls: WebRTC peer to peer, STUN first, TURN as fallback, signaling over sockets
- Mobile: Expo, React Native, same backend as web
- One monorepo shared between web, backend and mobile
Decisions that came from V1 failing
1. Storage stays bounded.
Messages are saved in MongoDB with a TTL index, so they delete themselves after 30 days. Reports store their own snapshot, so evidence survives even after the message is gone. Free tier storage cannot silently fill up.
2. Calls cost me almost no bandwidth.
Video goes peer to peer. The server only does signaling.
3. Video moderation runs during the call.
The browser samples one frame every 5 seconds and sends it to the server. A worker pool runs an NSFW model on it. If a frame is flagged, the call ends immediately with no warning, and only the flagged user is told why. The other person just sees a normal call end. If the worker pool fails or times out, it fails open, so a moderation outage never ends someone's call.
4. Text moderation handles evasion.
Messages are normalized (accents, leetspeak, repeated letters, spaced out letters like "k i l l") before matching against word lists in English, Spanish and Russian, plus a blocklist of adult domains.
5. Images are controlled, not open.
You cannot upload your own photos into a chat. Chat uses a built in image gallery with filters and a daily limit. Profile photos (max 5) are converted to WebP, checked by an AI model before saving, and stored on Cloudflare R2.
6. AI is never hidden.
If nobody is online, you get a popup: wait with an AI companion or wait in a small virtual cinema hall. The AI is always labeled. No bot pretends to be human.
7. One tap block and report, reviewed by me.
Other features
- Watch Together: synced YouTube watching with a stranger in a private cinema
- Dream Together: overnight voice matching
- Interest based groups (max 30 members)
- Scheduled matches
- Discover: opt in public profiles to send friend requests
The problem I still have
Cold start. Random chat needs two people online at the same moment. On a small user base that rarely happens. I added the waiting cinema, the AI companion, scheduled matches and alerts, and each helped a little. None fixed the real issue: people are not online together.
My next test is fixed daily sessions with one shared time, plus a real counter of people who set a reminder. No fake numbers.
Question for you
If you built a realtime product with a small audience, how did you get enough people online together? Any honest feedback is welcome.
Site: https://growschat.com
Originally published by Dev.to WebDev. Aggregated on AIWithGhost for educational purposes — full credit and traffic to the original publisher.