Accros: Real Time Chat App
An in-house chat platform that replaced the company's paid Slack subscription — servers and channels, presence, read receipts, file sharing on our own storage, and one-to-one audio and video written directly on the browser's WebRTC API with no third-party SDK. One codebase, 380 commits, sole engineer.





Overview
An in-house communication platform built to replace the company's paid Slack subscription. Servers and channels, presence and typing indicators, read receipts, file sharing kept on our own machines rather than a vendor's, social login, and one-to-one audio and video calling. One codebase, 380 commits between September 2021 and January 2023, sole engineer on all of it.
Why build it at all
Two reasons that were easy to defend to the people paying for it. Slack bills per person per month and hides message history past a limit, so the archive we most wanted was the part we could not see. And every file anyone shared internally was sitting on someone else's infrastructure. Running our own fixed both, on an EC2 instance the company already had.
The calling feature, and exactly how far it went
The calls are hand-written on the browser's raw WebRTC API — no Twilio, no Agora, no wrapper library. A single 179-line class does the whole dance: capture the local stream, create the offer, create the answer, relay ICE candidates over Socket.IO, attach the remote track to a video element, toggle microphone and camera, and tear down by stopping every track on leave. It shipped on its own deployment and colleagues used it to call each other.
And why it only ever worked in the office
There is a precise reason, and I only found it reading my own code back for this page. The single ICE server is stun:stun.1.google.com — Google's is stun.l.google.com, with a lowercase L. That hostname does not resolve, so the connection never gets a server-reflexive candidate and falls back to host candidates alone, which means one network. There is no TURN server either, so a genuinely remote peer would not have connected at all. Everyone using it was on the same office LAN, so a one-character bug sat there and nothing ever revealed it. The protocol work is real and it is mine; the deployment was narrow enough to hide the gap.
Where it stands, and what I would do differently
The main line stopped in January 2023, and a NestJS rewrite got twenty-two commits before it stalled. The calling code lived and shipped on its own branch and was never merged back. Three things separate what I built from something that survives the open internet: a TURN relay for peers behind symmetric NAT, ICE restart so a connection can recover instead of dying, and buffering candidates that arrive before the remote description is set. Knowing which three is most of the value of having built the first version by hand.