One account, four things
Koula Chat started as a Minecraft mod. The idea was simple enough: put a speaker block, a microphone block and a screen block into the game so players could actually talk to each other and share things in-world instead of alt-tabbing to another app.
The mod needed somewhere to send that audio and those messages, so a companion web service went up next to it. Then the web service needed accounts, then the accounts needed somewhere to hang out while nobody was in Minecraft — and that is how an arcade ended up bolted to a voice chat platform. It sounds like an accident because it is one, but the parts fit together better than they have any right to.
Play before you register
Ten games open with no account. Sign-up exists to save your scores, not to unlock the door. If the games are not good enough to make you want an account, that is a problem with the games.
Collect as little as possible
No email at sign-up. No analytics. No ad scripts. Passwords are salted hashes and messages are encrypted at rest. Data that is never collected cannot leak.
Boring protocols win
The bridge is line-delimited JSON over TCP because that is implementable in an afternoon in any language and debuggable with netcat. Clever formats create support tickets.
The stack
| Layer | What it is |
|---|---|
| Web server | Flask with Flask-SocketIO, threading async mode |
| Core data | SQLite for users, servers, messages and the KAL ledger |
| Arcade data | Atomic JSON files for scores, profiles and tickets |
| Realtime | Socket.IO for presence, signalling and ringing |
| Calls | Browser-native WebRTC, peer to peer, public STUN |
| Games | Plain canvas and JavaScript. No framework, no build step |
| Bridge | Threaded TCP server speaking line-delimited JSON |
| Mod | Fabric for Minecraft 26.1.2, Java 25, Fabric Loom |
Where it is going
Core mod working
Blocks, items and registration all running on Minecraft 26.1.2 after the API migration.
Website and bridge
Accounts, servers, DMs, calls and a live bridge status monitor.
Arcade
Ten games, guest play, XP, achievements and leaderboards.
Embedded browser on the screen block
MCEF via Keksuccino's fork, with right-click passthrough and an input lock for typing.
Multiblock screens
Adjacent screen blocks merging into one larger display.
In-game VoIP
Device enumeration and audio I/O through javax.sound.sampled, relayed over the existing
server connection rather than peer to peer.
Custom 3D block models
Proper Blockbench models so the blocks stop being cubes.
Built by KOULA
A hobby project that got out of hand, in the best way. Found a bug or want something added? Open a ticket — they get read.