Blog
Thoughts on technology, engineering, and building products
ActionCable is fine. But when you need to handle 10,000+ concurrent connections, you need a different beast.
Your stack shouldn't be a religion. It should be a toolbox.
Rails isn't dead. It's just not trying to be trendy anymore.
In Parts 1 and 2, we built the WebView shell with tabs and auto-updates. Now we tackle the three things that separate a working prototype from a production app: camera/microphone permissions for video calls, the scroll conflict that plagues every WebView app, and the distribution polish that makes it feel professional.
In Part 1, we built the WebView shell with bottom tabs, session persistence, and server-side detection. Now we add something the Play Store gives you for free — but we'll do it ourselves, with more control.
In Part 1, we built the models, JWT service, and Jitsi embed. Now we'll make it feel alive — when someone starts a meeting, participants see it instantly.
In Parts 1 and 2, we built the Rails integration — models, JWT auth, iframe embedding, and real-time notifications with ActionCable. Everything works with the free `meet.jit.si` servers, but with a 5-minute embed limit and no branding control. Now we deploy our own Jitsi server.
We took a full-featured school management portal — serving 2,500+ students and 150+ staff across admin, teacher, student, and parent portals — and wrapped it in a native Android shell. Bottom tab navigation, branded splash screen, persistent sessions. The entire Android app is under 200 lines of Kotlin.
We built a real-time PIN-based attendance kiosk for a Nigerian secondary school that does more than track clock-ins — it cracks jokes, blocks early leavers, guards against incomplete diaries, and automatically deducts salaries for habitual latecomers. All running on a single school laptop in the staff room.