Essays / The agent team

We swapped Slack for a chat server we run ourselves. Plenty broke.

Slack was fine. That is the part nobody admits in posts like this. It worked. The team knew every corner of it. It cost less than a round of coffees. We left anyway.

Here is the reason, and it is boring. The agents live in chat now. Twenty-seven AI agents run my businesses. They read the inbox, chase the tickets, keep the books, write the content, watch the servers. Every message they send me lands in a channel. Every approval I give goes back through one.

Somewhere in the last year, chat stopped being where we talk. It became the surface the company runs on. And I was renting it. A landlord can raise the rent. A landlord can change the locks. A landlord can decide my agents are against the terms of service. When the room your company thinks in belongs to someone else, that is a risk you are choosing every day.

So we moved. The replacement is Buzz, an open-source Slack alternative from Block. We stood it up on a small server in Sydney. Migration day went embarrassingly well. The channels came across. The agents kept posting. I went to bed smug.

Then the messages started dragging. Most of a second to deliver, every single one. From a server one state away. Chat has a rhythm, and at 700 milliseconds the rhythm dies. Typing felt like talking on a delayed phone line.

The traffic was going through Singapore. Our network provider’s free tier routes Australian requests to whichever data centre suits it, and offshore suited it. Sydney to Singapore and back, on every keystroke.

The fix was not clever. We told our router to resolve the chat address straight to the local network instead of asking the wider internet. Round trips fell from about 720 milliseconds to about 40. One config line, most of a day to find, and a lesson I keep relearning. Measure first. The slow part is never where you think it is.

The second thing broke quieter. The server decides which community you belong to from a header your browser sends silently, not from the address you typed. Nothing in the documentation says this. We found out by watching one address return a 404, and the same address with one header changed return a login page. Half a day, gone, staring at two requests that should have been identical.

That is the honest price of self-hosting. The documentation is the source code. When something behaves strangely, nobody is coming. You read the code, or you stay stuck. We read the code. It has become the fastest way we learn how the thing we now own actually works.

The third thing was not a bug. The mobile app simply shipped without push notifications. Not broken push. No push. The code to receive a notification does not exist in the client. For a chat platform in 2026, that is a remarkable thing to discover after you have moved your company in.

So I forked the app. That story is worse, and it is next week’s essay.

Would I do it again. Yes, and I would do it sooner. Here is the ledger after the first fortnight. We gave up polish. We gave up apps that just work. We gave up having someone else to blame. We got back a chat platform whose database I back up every night to storage I control. We got a server that idles at under 200 megabytes while serving the whole company. We got the source code, which means the platform annoying me is now a to-do item instead of a feedback form. And the agents that run my businesses now do it on rails I own.

Slack was fine. Fine was the trap. The room my company thinks in has my name on the lease now, and I am done renting.