We Spent Months Building a Virtual Home for Couples. Here's the Honest Story.
You can be online all day and still feel completely alone.
Texts. Calls. Notifications. A green dot next to someone's name.
None of it makes you feel like you're actually with them.
That gap — between being connected and feeling present — is what led us to build TogetherUs.
What Is It?
TogetherUs is a shared 2D pixel-art virtual world built specifically for couples in long-distance relationships.
Think of it as your own private digital apartment — a cozy space where you and your partner can hang out, watch movies, listen to music, study together, or simply sit in a garden and talk face to face.
No tasks. No agenda. No performance. Just presence.
You create a private room, share a code with your partner, and step into a charming pixel world together. As your customizable avatars explore the space, a Picture-in-Picture video call keeps you visually connected the whole time.
The Zones Inside
This isn't just a chat room. Every area of the world serves a different kind of togetherness:
🎥 Movie Zone — Watch YouTube videos in perfect sync. Shared play/pause, seek, speed control, and quality selection up to 4K. An elastic sync system with heartbeat keeps both of you on the exact same frame even across different network speeds.
🎵 Music Zone — A synchronized jukebox powered by YouTube Music. Search any song, get real-time autocomplete, browse recommendations, and like tracks. No account needed.
🎮 Game Zone — Play multiplayer games together via an integrated arcade. Smash Karts, Mini Golf, Chess, and more — no extra installs.
📚 Study Zone — A co-working space with a synchronized Pomodoro timer, a collaborative whiteboard (Excalidraw), and a shared PDF viewer. For the couples who grind together.
🌿 Garden Area — Step in here and the PiP video expands to full screen. Just you two, face to face. Built for the conversations that matter.
The Tech Behind It
Here's what's actually running under the hood:
Frontend: React 18 + Vite, Phaser 3 for the 2D pixel world, Zustand for state, Framer Motion for animations, Socket.IO client, WebRTC via Simple-Peer for video, Excalidraw for the whiteboard, TailwindCSS
Backend: Node.js + Express, Socket.IO for real-time events, PostgreSQL 16, Redis 7 for sessions and pub/sub, Firebase Admin for Google Sign-In, Cloudinary for media uploads
Infrastructure: Docker Compose for local dev, Vercel for frontend, Render/Railway for backend, npm Workspaces as a monorepo
One architectural detail we're proud of: end-to-end encrypted chat using ECDH P-256 key exchange. Your conversations are genuinely yours — including stickers, GIFs, and file attachments up to 10MB.
The Hard Parts (Honest Take)
Real-time sync is deceptively brutal.
Here's what actually went wrong:
- Video sync drift — even 200ms of lag breaks the illusion of watching together. We had to build a heartbeat-based elastic sync system to keep both users on the same frame continuously.
- State inconsistencies on reconnect — when a user drops and rejoins, the world needs to feel seamless. Getting that right took far more edge-case handling than we expected.
- Proximity-based video activation — making the PiP video call trigger naturally based on avatar closeness sounds simple. It introduced a whole class of race conditions.
- WebRTC in the wild — peer-to-peer connections behave very differently across network types. NAT traversal, STUN/TURN fallbacks, and mobile networks all needed specific handling.
The hardest bugs weren't technical. They were experiential. When does lag stop feeling like lag and start feeling like distance? That question shaped most of our debugging sessions.
What We Learned
1. "Simple" is the most expensive feature.
We cut a lot. Every removal felt like a loss. But every cut made the core experience sharper and more emotionally coherent.
2. Emotional UX is an underexplored field.
Most UI/UX writing focuses on task completion rates and conversion funnels. We were building for feeling. There's very little playbook for that. We had to figure a lot of it out from first principles.
3. Phaser 3 + React is a genuinely powerful combination — with real gotchas.
Keeping the game engine and the React UI in sync without stepping on each other required careful boundary design. Zustand as the shared state layer helped enormously.
4. Real-time is never truly real-time.
There's always latency. The question is whether your sync system hides it well enough to preserve the illusion. We spent a surprising amount of time on perception, not performance.
Why We Built This
We're at a strange moment. We've never been more digitally connected. Loneliness has never been more of an epidemic.
Every existing platform treats togetherness as a side effect of something else — productivity, gaming, entertainment. We wanted a space that existed just to make two people feel less apart.
TogetherUs won't fix long-distance. We know.
But maybe it makes one couple's Sunday feel a little less lonely. Maybe it gives someone the feeling of sharing a couch they're 5,000 miles away from.
That was worth building.
Try It / Star the Repo
👉 Live: https://www.togetherus.in
👉 GitHub: https://github.com/Deepak0yadav/TogetherUs
It's open source under GPL-3.0. Contributions welcome — whether that's code, pixel art, bug reports, or just feedback on what togetherness should feel like.
Drop a comment if you've built anything in the real-time or presence space — we'd love to compare notes.
💼 Also shared this on LinkedIn — check out the post here if you'd like to connect or follow along.
The Team
Six of us built this. The irony of building a togetherness app as a distributed team was not lost on us.
Distance means so little when someone means so much.
#buildinpublic #showdev #webdev #opensource #javascript #react #realtimeapps #webrtc #ux #indiedev

Top comments (0)