The Story

Why flebop exists, what it's built on, and what it's trying to be.

It started with Discord

Like a lot of people, I used Discord for everything. Servers for gaming, servers for dev communities, servers for keeping in touch with friends. It was genuinely good for a while. Then it slowly wasn't.

Discord was finished in 2019, give or take. Everything since has been bloat and monetisation. The data collection got worse. Features got paywalled. They updated the ToS in ways that made me uncomfortable. The app got heavier and heavier. It's an Electron shell around a React app and it uses a frankly embarrassing amount of RAM. (Credit where it's due, they have done some optimisation recently that's nice to see — but it doesn't justify the data collection.) And the thing that bothered me most: all of it, every message, every voice call, every server, lives on their infrastructure. They can close your account. They can delete a community. They can disappear tomorrow and take everything with them.

I wanted out. I looked at the alternatives. There were some that could have worked, and the ones I saw I never really took an interest in anyway. So I went off on my own descent into madness and built my own platform.

Wanting to prove I could

Honestly? Part of the motivation was just that. I graduated around 2020/2021 (it's a repressed memory, covid era) and have been working in the industry since. flebop has been evenings, weekends, and late nights for about a year. I wanted to prove I could build something this complex outside of work and have it actually work. Real-time chat. Voice and video via WebRTC. Federation across independent servers. A desktop client. The whole thing.

It's a big project for one person and there's a real chance I'm in over my head, but so far it works, and that's kind of a nice feeling. The private repo has commits at 2am with messages like "aaaaaaa" and "normalise ti all" — you'll never see those, but the open source repo going forward might be something to look forward to.

I couldn't care less if you love it, hate it, or never hear about it at all. There are plenty of Discord-like things popping up these days. A lot of them are much more polished and cooler than felbop but, I built this for me so it has a special place in my heart (stockholm syndrome).

The stack: boring on purpose

flebop is built on Django and jQuery. No React, no Vue, no Next.js, no Vite, no TypeScript, no build step.

That's not an accident or a limitation. It's a deliberate choice. I have a real problem with how the modern JS ecosystem works. Every framework pulls in hundreds of transitive dependencies, and you end up with a node_modules folder that's several gigabytes of code you've never read and don't control. The leftpad incident happened in 2016 and the ecosystem learned basically nothing from it. You're still one npm unpublish away from your build breaking.

With Django and jQuery, there's no build step. There's no node_modules. You clone the repo, install the Python dependencies, and it runs. The frontend is just files that a browser can read directly. If something breaks you can actually go and read what's happening. If you want to change something you just change it.

That's what I mean when I say the codebase is hackable. Not that it has security holes. Just that a person can sit down with it and understand it. You don't need to know how Webpack resolves module graphs or what Babel plugin is transforming your JSX. It's Django views, Django templates, and JavaScript files. You already know how those work.

flebop.js

There's one bit of custom JS worth calling out: flebop.js. It's a ~900-line IIFE that provides the coordination layer for the frontend: CSRF handling, API helpers, modals, toast notifications, async dialogs, WebSocket management with reconnect logic, an event bus, and a few other bits the app needs.

I didn't set out to write a mini-framework. It evolved from the alternative, which was a bunch of scattered globals and helper functions copy-pasted into different files. At some point it made sense to put them in one place with a consistent interface. It's not a framework in any real sense. No component model, no virtual DOM. Just jQuery plus the glue this specific app needs, wrapped up so you don't have to think about it.

No new dependencies were added. It's still just jQuery underneath. If you read through the codebase you'll probably spot places where I haven't refactored yet or just missed a spot. Oopsies :S

Federation

The other big piece is federation. The idea is that you can run your own flebop node (on a VPS, on a home server, whatever) and users on your node can see and join servers on other nodes. No central auth, no shared secrets. Each node has an ECDSA P-256 keypair and every event it sends to another node is signed. If the signature doesn't check out, the receiving node rejects it.

This means no one can impersonate your node, and no one can impersonate another node's users when talking to you. Trust is established manually. You approve a node, you're choosing to trust its keypair. That's the whole model.

Federation is still the roughest part of the project. The code is there and it works in theory (signed envelopes, node approval, cross-node browsing) but it hasn't been properly tested node-to-node yet. If you're running your own node and want to help shake that out, I'd love to hear from you.

Where it's at

flebop is real and usable. The main node at flebop.online is running. Voice and video calls work. Text chat works. Federation works (mostly). There's a desktop client for Linux and Windows.

It's also very much a work in progress. It's one person's side project. There are rough edges. There are features that aren't implemented yet. There are probably bugs you'll find before I do.

If you find one, open an issue.

AGPL

The server code is licensed under AGPL-3.0. If you run it as a service and make modifications, you have to share those modifications. That felt like the right license for a project that's explicitly about decentralisation and not having one company own everything.

You can find the server code on GitHub.