How I built Fluxer

How I built Fluxer

The story behind Fluxer, from a high school project to an open source chat app used by hundreds of thousands of people.

I'm Hampus Kraft, a 23-year-old software developer from Sweden. I'm close to finishing my BSc in Computer Engineering at KTH Royal Institute of Technology. You can find my LinkedIn page here. In Sweden, records of residents and companies are public.

Since the pandemic hit in 2020, when I was in senior high school, I've been fascinated by the engineering behind Discord, the chat and voice app that became the default home for so many online communities.

Five years of that fascination turned into Fluxer, a community chat app that feels familiar. Fluxer is free and open source (AGPLv3), which means anyone can read, change and share the code. Anyone can also run Fluxer on their own server. This is called self-hosting.

Fluxer in 60 seconds

flux /flŭks/
noun
  1. A continuing movement, especially in large numbers of things.
  2. Constant or frequent change, fluctuation.

"Flux capacitor ... fluxing!" (Back to the Future)

Why use Fluxer when Discord is free and works well?

If Discord does what you need, and you're fine relying on a closed, investor-backed app that has reportedly filed confidential IPO paperwork, you may not need Fluxer.

Discord's IPO could happen in March | TechCrunch
Discord reportedly filed confidential IPO paperwork and has pinned its hopes on a debut in March.

Fluxer is for people who want something different. It has two parts.

  • The Fluxer software is free and open source. Anyone can run it on their own server.
  • Fluxer.app is the service my company, Fluxer Platform AB, runs on that software. It's free to use, and it helps fund the open source work. Fluxer Platform AB is an independent company based in Sweden.

Leaving Discord shouldn't mean giving up the features you rely on. Fluxer works the way you'd expect a modern community chat app to work.

Fluxer doesn't need Discord to get worse to succeed. Discord's network effect is hard to beat head-on, so I'm starting where switching already makes sense. That means technical users and communities who value control and openness and want software they can run on their own terms. You don't need to be technical to use Fluxer, though. You can sign up on Fluxer.app, and many people prefer a service run by an independent European company, which has clearer reasons to treat users well.

No community should have to depend on one company surviving. The public code should be useful to anyone who runs their own Fluxer server, not only to Fluxer.app.

This is how the work is funded.

  • Fluxer.app is free to use. Plutonium is an optional paid subscription on Fluxer.app that gives higher limits. It helps pay for hosting, support and open source development. Early supporters could also buy Visionary, a one-time lifetime plan. Visionary sales were closed after around 1,000 copies.
  • Donations are open to anyone who wants the open source project to keep improving, including people and organisations who self-host Fluxer.
  • The Operator Pass will be an optional one-time purchase of $199 or €199 for people who run their own Fluxer server. It unlocks nothing in the software. It will help pay for infrastructure and developer costs, and it will come with a private #operators channel in Fluxer Labs, a direct line to the team for help and feedback, and the Operator role there.

The Fluxer software will stay free of feature paywalls, licence key checks, paid upgrades for higher quotas and SSO tax. Plutonium only applies to Fluxer.app. It doesn't limit anything in the software you run yourself.

Now, my backstory

2017 to 2020

I started using Discord in 2017, and my interest only grew. By January 2019, I'd joined Discord Testers, Discord's crowdsourced bug reporting programme. By April 2019, I'd earned enough XP there to unlock the Bug Hunter badge.

2020 to 2022

In senior high school, I built early prototypes of what is now Fluxer. My graduation project was one of those prototypes plus a technical report. The report covered what I'd learned from Discord's engineering blog posts and architecture, and how I applied those ideas. When I graduated in summer 2022, the school gave me a small $200 scholarship and the title "Web Guru of the Year".

2022 to 2023

I've studied at KTH Royal Institute of Technology since autumn 2022. By summer 2023, I'd decided to put more time into Fluxer, but my studies still took up much of my time, so progress came in bursts.

In October 2022, I co-authored a medium-severity bug bounty report to Discord's security team about a permission bypass vulnerability. My co-author and I shared an award of $1,500.

While studying, I also led web development for a popular Minecraft: Bedrock Edition server with nearly 6 million registered players. I built and ran its web systems, including API design, security, billing and reliability.

2023 to 2024

In July 2023, I released the first private alpha of Fluxer to a few dozen testers. Over the next few years, alongside my studies at KTH, I rewrote the tech stack many times before settling on what runs today.

Lots of trial and error, and a real wish to understand how these systems work, led me to proven technologies. Erlang/OTP powers WhatsApp and Discord. Cassandra is a database Discord relied on for years. Every time I tried something simpler, I ended up rebuilding what these tools already do well.

KTH also puts a lot of weight on applying what you learn. In spring 2024, I took a project course where my team built an internal tool for Giesecke+Devrient, an international security technology company.

2025

In January 2025, I grew wary of how Discord handled my personal data and where the app was heading. I built Discorch, a tool that guides you through Discord's undocumented privacy request process to bulk delete your messages. It produces a CSV file and instructions for asking Discord's privacy team to delete them.

As more people used it, Discord kept changing the process and eventually restricted it. One change blocked deleting your own DM messages this way, because you can still delete those by hand.

In spring 2025, I reported a security vulnerability to Discord and was awarded $2,000. Later that summer, I registered Fluxer Platform AB, a Swedish private limited company. Registering it needed a minimum deposit of $2,000.

Maeby from Arrested Development: "Well, that was a freebie."

By summer 2025, I'd finished most of my university courses. I spent that summer writing my bachelor's thesis with a fellow student for the supportive and welcoming Intelligent Heart Technology Lab at KTH. The thesis was published in September 2025.

Between September and December 2025, I worked day and night to get Fluxer ready for a public release. Getting the architecture, the features and the web app ready for real users on my own was the hardest work I'd ever done.

On 25 October 2025, I opened the first private beta because I needed funding to keep going. It was a small group of around 30 testers who could invite people they knew. A handful of them bought Visionary at $299 each while I worked towards feature completion.

2026

On 2 January 2026, I opened Fluxer.app to everyone. A few more people bought Visionary, which was enough to keep me going, and I started preparing Fluxer for self-hosting.

There was effectively no marketing. Then, after Discord's IPO plans leaked, a Bluesky post travelled much further than expected and changed the scale of the project overnight.

Today, Fluxer.app has nearly half a million registered users (as of 15 September 2026), and the backend has held up under real load. I'm still the only developer on the backend, the web app and the desktop apps for Windows, Linux and macOS. As of recently, the team also has a mobile app developer.

Getting here hasn't been easy. There have been spam waves, DDoS attacks and Reddit trolls, along with a long list of interesting problems to solve. Fluxer made it through all of them. The next goals are releasing the mobile apps on the App Store and Google Play, and making voice, video and screen sharing work reliably on every platform.

Visionary sales were closed after around 1,000 copies at $299 each. Visionaries have a numbered badge in the app that shows how early they supported Fluxer.

GitHub - fluxerapp/fluxer: A free and open source instant messaging and VoIP chat app built for friends, groups, and communities.
A free and open source instant messaging and VoIP chat app built for friends, groups, and communities. - fluxerapp/fluxer

Fluxer's backend

Discord's work on scaling its backend is unusually well documented, and its engineering posts have been a big reference point for me. These are good places to start.

I've spent years learning Discord's architecture in depth. I've read Hacker News and Reddit threads, postmortems and blog posts, taken relevant courses at KTH, and picked things up through work. I've also been active for years in communities that discuss Discord itself, alongside fellow enthusiasts, security researchers and bug hunters, and I've spoken with Discord engineers directly a few times.

What the backend looks like now

Fluxer.app runs as a set of small services, each with its own job. The API and its background worker are written in TypeScript on Node, using Hono. TypeScript is productive and the language I know best, so the parts of Fluxer that change most often are written in it.

The gateway is written in Erlang/OTP. It keeps a live WebSocket connection open to each app and handles sessions, online status (presence), sending events to everyone who needs them, and push notifications.

Rust handles work that needs a lot of processing power or very low delay. That includes a media proxy for uploads, thumbnails and media conversion, and services for users, messages, link previews, GIF search and Snowflake IDs (unique IDs that also record when something was created).

Fluxer.app stores its data in Cassandra, and people who self-host can use Postgres instead. Valkey handles caching, NATS handles messages between services, Elasticsearch or Meilisearch handles search, and LiveKit handles voice and video.

Why choose Erlang/OTP?

The Erlang runtime is designed for distributed, fault-tolerant, soft real-time systems that have to stay up without stopping. It supports hot swapping, which means changing code while the system keeps running.

Erlang was created at Ericsson, a Swedish telecom company, in 1986 by Joe Armstrong, Robert Virding and Mike Williams. It started as proprietary software. Joe Armstrong wrote his PhD thesis at my university, KTH, in the year I was born. Erlang was released as open source in 1998, and the OTP unit at Ericsson maintains it.

Notable large-scale users include WhatsApp and Discord. Discord uses Elixir, a language that runs on the same BEAM virtual machine as Erlang. WhatsApp is far larger than Discord, with more than 3 billion monthly active users. It's largely built on Erlang and famously run by a small engineering team.

"Any sufficiently complicated concurrent program in another language contains an ad hoc informally-specified bug-ridden slow implementation of half of Erlang."

Robert Virding, co-creator of Erlang

Why choose Cassandra?

For a long time, ScyllaDB was my database of choice. Discord also moved to it from Cassandra. Since December 2024, though, ScyllaDB is no longer open source software, which rules it out for me.

Cassandra handles sharding and replication for you. It splits data across machines and keeps copies of it, so you don't have to build that yourself. To add redundancy or handle more reads and writes, you add more machines, called nodes. It's a NoSQL database, but it uses a key-key-value model with a typed schema and a SQL-like query language called CQL, so working with it feels much like working with a relational database. The difference is that Cassandra is built to spread large amounts of data across many machines. To do that, it doesn't support multi-row transactions or locks.

Cassandra is optimised for fast writes, so Fluxer is designed to read from it as little as possible. Sending a message needs very little database work. The server checks your session, usually from a cache, and writes the message. Permission checks skip the database entirely. They go to the Erlang gateway, which keeps everything needed to work out permissions for each community in memory. Internally, a community is called a "guild". The apps mostly read from the database when they start a new session and load their initial state. After that, events from the gateway keep them in sync.

Frequently asked questions

What about the open web?

Chat apps have swallowed useful knowledge that used to live on the public web. That knowledge is now invisible to search engines, archives and anyone who isn't logged in.

Discord seeks to solve a problem that it created | TechCrunch
Conversations on Discord can be hard to follow. Discord SVP Peter Sellis proposes making forum-like features, or using AI summaries.

With LLMs, Sellis said, Discord could take a long, meandering conversation and turn it into "something that could be more sharable and syndicated across the web." However, he said that he and his team hadn't "seen a solution that we feel great about yet."

Fluxer disagrees with Discord's starting point here. LLMs shouldn't turn people's "meandering conversations" into web content. If something becomes public, it should be because a person or community chose to publish it.

Fluxer's planned forum channels will have an optional public web mode that works the way the web already does. Posts get public pages with stable links and clear titles that anyone can read without an account. Search engines can index them, archives can save them, RSS and Atom feeds can follow them, and people can share the links anywhere. People's posts stay their posts.

Publishing is opt-in. It's for communities that benefit from putting parts of their forums on the open web, such as open source projects, developer communities, modding groups, creators, research groups, support forums and any other space where public answers should be searchable and useful later. Private chat stays private.

Will self-hosting cost money?

No. Running Fluxer on your own server needs no licence key, paid tier or special enterprise unlock. You're responsible for hosting, uptime, moderation, safety and legal duties, but the software itself is free to run. The self-hosting docs are public.

The Operator Pass will be an optional one-time purchase of $199 or €199 for people who self-host. It unlocks nothing in the software. It will help pay for Fluxer's infrastructure and developer costs, and it will come with these perks.

  • A private #operators channel in Fluxer Labs, with a direct line to the team for help and feedback.
  • The Operator role in Fluxer Labs, listed separately in the member list with its own colour and icon.
  • Your Fluxer avatar and name on this website, if you want them there.

You pay once and keep the perks for life. If you want to give more, you'll be able to set up a recurring donation at the same time.

Federation?

Federation would let separate Fluxer servers, run by different people, connect to each other so their users can talk across servers. There is no plan or date for federation. It's hard to get right, and we're discussing how it could work in the Fluxer Labs community. You're welcome to join us.

We're also working on letting the desktop and mobile apps sign in to several Fluxer servers at once. For most people, that may cover what they want from federation. One possible next step is client-side federation, where the app brings your accounts on different servers together in a single workspace.

Where's the roadmap?

Roadmap 2026
Where Fluxer is headed in 2026 and what we're working on next.

Closing thoughts

The best ways to help are using Fluxer, buying Plutonium if you use Fluxer.app and like it, donating to support the open source work, reporting bugs clearly and giving feedback in the community.

Fluxer should stay independent and self-funded. Fluxer.app should pay for the systems and people that keep the open source app moving, and people who self-host should benefit from that work too.

See you in the Fluxerverse!

A DeLorean time machine lifts off, heading for new adventures.