My family video calling system

For the past three months, I’ve been working on a small side project that quietly became much more important to me than I expected.

It started when Cloudflare added end-to-end encryption to Orange Meets, their demo video-conferencing app built on Cloudflare Calls. That update caught my attention immediately. I wanted to test how well encrypted calls would work in practice, especially for long, real conversations, not just demos.

At the same time, I had a very practical problem: the language barrier. Most video-calling tools assume a level of English proficiency that simply isn’t there for everyone. For my parents, that friction alone was enough to make calls uncomfortable.

So I forked Orange Meets and turned it into something we could actually use. I called it Family Meetings, because that’s exactly what it became.

Orange Meets is a great demo and a solid foundation, but it’s still a demo. Once I started relying on it for real family calls, two issues stood out immediately: UX issues and call stability after encryption was enabled. This project is mostly the result of fixing the things that kept interrupting or complicating our conversations.

End-to-end encryption stability

While end-to-end encryption was the feature that drew me to Orange Meets in the first place, it also turned out to be the biggest technical problem in day-to-day use.

In the original demo, encrypted calls often broke after a client reconnected due to an unstable network. Key synchronization would fail, leaving the room in a broken state. The only workaround was for participants to leave and rejoin one by one until encryption recovered.

That kind of failure is annoying in general, but it’s especially frustrating when you’re talking to non-technical family members who just want the call to work.

I rewrote the key synchronization logic so reconnects are handled properly. Now, encrypted calls survive temporary disconnects without manual intervention or awkward instructions like “leave and rejoin again.”

Layout improvements

Daily use also made it clear that the default layouts weren’t ideal. I adjusted them based on how we actually use the app:

  • 1-on-1 calls - videos expand to fill the available space instead of feeling oddly constrained
  • 3–5 participants - cleaner grid layouts that make better use of screen real estate
  • Mobile devices - layouts tuned specifically for smaller screens

Password protection

Originally, anyone with the link could join. That’s reasonable for a demo, but not for something you use with family.

I added simple, site-wide password protection so only people with the password can access the app. The password is saved in the browser for 30 days, so returning users don’t have to re-enter it every time.

Password protection page

Usernames are also saved automatically, which turned out to be surprisingly helpful.

Multi-language support

The biggest motivation behind this project was language support. I wanted full Belarusian translation so my parents could use the app comfortably, without guessing what buttons do or asking for help mid-call.

Once the internationalization groundwork was in place, it made sense to extend it further, so I added Ukrainian and Polish as well.

Currently supported languages:

  • Belarusian
  • Ukrainian
  • Polish
  • English

Users can switch languages using the selector in the top-right corner.

Home page in English Home page in Belarusian

The language preference persists across sessions, and all UI elements including the video room interface are fully translated.

Video room in English Video room in Belarusian

Cost

The app requires a paid Cloudflare Workers subscription ($5/month). It relies on Workers, Durable Objects, and the serverless SFU (part of ‘Cloudflare Calls’ services).

In practice, a one-hour 1-on-1 call uses roughly 6K Worker requests, 2K GB-seconds of Durable Objects execution time, and ~6 GB of combined ingress and egress traffic. This comfortably fits within Cloudflare’s paid tier limits for Calls, Workers, and Durable Objects even for daily calls.

Open source

I’ve open-sourced all my changes. The repository is available at github.com/kariedo/family-meetings.