My school runs on Google Workspace, and for a while that meant we had a chat built into Gmail. We used it in lessons, as you would expect. Sometimes we just emailed each other.
The school noticed, and switched it off.
That left two options. You could turn on a VPN to reach something else, which was fiddly and which a teacher walking past would spot immediately. Or you could stop talking. Neither appealed, so I built a third.
It was a small chat app. There was a global room everyone landed in, rooms you could create for a group, and private messages. The interface was the part I spent most time on, because if it was going to be used under a desk in the middle of a lesson it needed to be fast and quiet and obvious.
The interesting decision was where to put it.
School networks filter traffic largely by looking at where it is going. A blocked domain is a blocked domain. So I did not give it one. The app ran on the school's own network, reachable at a local address, and there was simply no name for the filter to recognise. It is hard to block something that never leaves the building.
The detail I liked most, though, had nothing to do with the network. Every time a break started, the chats reset. Whatever had been said during the lesson was gone by the time the bell went. Nobody asked for that. I added it because it felt right: the conversation belonged to the lesson it happened in, and there was no reason for it to outlive that.
I have built far bigger things since, but I still like this one, and I think I know why. It was the first time the constraint was the interesting part. The code was not difficult. The difficult part was a question: if the obvious route is closed, what is the route nobody thought to close?
It was also, I can admit now, a project built mostly for fun, against a rule that had a reasonable purpose. The school did not switch the chat off to annoy anyone. It switched it off because we were chatting instead of listening, and the app I built was a better way of doing exactly that.
When it was finished I enjoyed it for a while, and then asked myself the question that seems to end most of my small projects: fine, that was good, so what now? I wanted to build something bigger. The obvious first step was to take the chat app out of the school and release it properly.
That step became something else entirely.