Fluxer.app has passed half a million registered users. The Fluxer apps work with self-hosted instances, and the Operator Pass waitlist is open.

Read the post
How I built Fluxer

How I built Fluxer

The story behind Fluxer, from a high school project to an open source chat app that hundreds of thousands of people have signed up for.

Found a bug or have an idea? Tell us on Fluxer Feedback. If you want to join the discussion with the team and other users, come to Fluxer Labs.

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.

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

Five years of that fascination turned into Fluxer, a community chat app that feels familiar. Fluxer is free and open source (AGPLv3), and anyone can run, study, change and share the code. If you change it and offer it to others over a network, you have to share your source code under the same license. Running your own copy of Fluxer on your own server is called self-hosting, and each copy is called an instance.

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 was reported in January to have filed for an IPO, you may not need Fluxer.

Fluxer is for people who want something different, and it has two parts.

  • The Fluxer software is free and open source, and anyone can self-host it.
  • Fluxer.app is the service my company, Fluxer Platform AB, runs on that software. It's free to use, and the money from its optional purchases 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 every day. Fluxer works the way you'd expect from a modern community chat app.

Fluxer doesn't need Discord to get worse to succeed. Discord's network effect is hard to beat head-on, and I'm starting with the people who already have a good reason to switch. These are the technical users and communities who value control and openness, and who want software they can run on their own terms.

You don't need to be technical to use Fluxer, though. Anyone can sign up on Fluxer.app and use it for free, without having to set up a server of their own.

No community should have to depend on one company surviving. The public code should be useful to every Fluxer instance, and Fluxer.app is just one of them.

Fluxer is funded in three ways.

  • Fluxer.app is free to use. Plutonium is an optional paid subscription on Fluxer.app that gives you higher limits. It helps us pay for hosting, support and open source development. Early supporters could also buy Visionary, a one-time lifetime plan, and all 1,000 copies of Visionary sold out in February 2026.
  • The Operator Pass is an optional one-time purchase for anyone who wants to support Fluxer, whether you self-host, build bots or just use it. Sales open on November 1, 2026, and until then you can join the waitlist.
  • Anyone can donate, including people and organizations who run their own Fluxer instance. Donations help pay for hosting and development.

The Fluxer software will stay free of feature paywalls, license key checks, limits you have to pay us to raise and SSO tax. Plutonium only applies to Fluxer.app. On your own instance, every account gets the Plutonium perks by default, and if you want to sell a premium plan there, you can do that through your own Stripe account.

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 program. By April 2019, I'd earned enough XP there to unlock the Bug Hunter badge on my profile.

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 was about what I'd learned from Discord's engineering blog posts and architecture, and how I applied those ideas in my prototype. When I graduated in summer 2022, the school gave me a small $200 scholarship along with 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 was putting more time into Fluxer, but only in bursts around my studies.

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

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

2023 to 2024

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

After lots of trial and error, and because I really wanted to understand how these systems work, I ended up using 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 cares a lot about applying what you learn. In a project course in spring 2024, my team built an internal tool for Giesecke+Devrient, a security tech 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 started using it, Discord kept changing the process and eventually restricted it. One change blocked deleting your own messages in DMs this way, because you can still delete those by hand in the app, one message at a time.

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. To register the company, I had to deposit at least $2,000 in share capital.

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 its first public release. Getting the backend architecture, the features and the web app ready for real users on my own was the hardest work I had ever done.

On October 25, 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 finished the features.

2026

On January 2, 2026, I opened Fluxer.app to everyone. Visionary sales picked up, which kept me going, and I started preparing Fluxer for self-hosting.

There was almost no marketing. After Discord's IPO plans leaked, a Bluesky post spread much further than expected and changed the scale of the project overnight.

By September 15, 2026, Fluxer.app had nearly half a million registered users. I still write almost all of the code for the backend, web app and desktop app, and the rest comes from community pull requests. Getting here hasn't been easy.

There have been spam waves, DDoS attacks and Reddit trolls, and a long list of interesting problems to solve. Fluxer got through all of them. The next goals are releasing the mobile apps on the App Store and Google Play, shipping the new voice and video system and starting on federation and end-to-end encryption.

All 1,000 Visionary copies sold out at $299 each. Visionaries have a numbered badge in the app that shows how early on 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 directly with Discord engineers on a few occasions.

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 use TypeScript on Node with Hono. TypeScript is productive and the language I know best, so I use it for the parts that change most often.

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 deciding who should get a push notification.

Most of the other services are written in Rust, and each one does one job. There's a media proxy for uploads, thumbnails and media conversion. There are also services for users, messages, push notification delivery, link previews, GIF search and Snowflake IDs, which are unique IDs that also record when something was created.

Because Rust has no garbage collector, these services use memory predictably and don't pause to clean it up. That helps most for CPU-heavy media conversion and for the users and messages services, which handle every account and message.

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. I'm replacing LiveKit with my own voice and video system, as the roadmap says.

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 that you can change the code of a running system without having to restart it.

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 still maintains it.

WhatsApp and Discord are two well-known apps that use it at a large scale. 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?

Discord moved from Cassandra to ScyllaDB, which was my database of choice for a long time. Since December 2024, it's no longer open source, so I ruled it out.

Cassandra handles sharding and replication for you. It splits data across machines and keeps copies of it, and 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. Working with it feels a lot like working with a relational database. But Cassandra is built to spread large amounts of data across many machines, and to do that, it gives up multi-row transactions and locks.

Because Cassandra is optimized for fast writes, Fluxer is designed to query it as little as possible. Sending a message needs very little database work. The server checks your session, usually from a cache, and then writes the message.

Permission checks skip the database and go to the Erlang gateway, which keeps what it needs to work out each community's permissions in memory. Internally, a community is called a "guild". The apps mostly need the database when they start a session and load their initial state. After that, gateway events keep them in sync.

Frequently asked questions

Is Fluxer vibe-coded?

No. Our stance on AI and vibe coding explains how Fluxer is built and why its line counts look so large. Most of the lines that change in the repository are translations.

What about the open web?

Chat apps have swallowed useful knowledge that used to be on the public web. That knowledge is invisible to search engines, archives and anyone not signed 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."

I disagree with Discord's starting point here. LLMs shouldn't turn people's "meandering conversations" into web content. If something becomes public on the web, it should only be because a person or a community decided to publish it there.

Fluxer's forum channels will get an optional public web mode. When a community turns it on, posts in that forum 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. DMs and other channels don't get public pages.

Publishing is meant for communities that would 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 community where public answers should be searchable and useful later.

Will self-hosting cost money?

No. Running Fluxer on your own server needs no license key, paid tier or special enterprise unlock. You're responsible for updates, server administration, uptime, moderation and safety. You're also the data controller for your instance and have your own legal duties, as we say in section 1 of our privacy policy. The software itself is free to run, and the self-hosting docs take you through every step of the setup.

I've written a separate post about running your own instance and about the Operator Pass, an optional one-time purchase for anyone who wants to back Fluxer.

Self-hosting and the Operator Pass
How to run your own Fluxer instance, how the desktop and mobile apps connect to it, and what the Operator Pass is.

What about federation?

Federation lets separate Fluxer instances, run by different people, connect to each other so their users can talk across instances. It will always be optional, and every instance can keep running on its own. I've decided to base Fluxer's federation on polyproto-core, with Fluxer's own extensions for its features. The plan is an experimental draft in 2026, followed by a stable release in 2027.

The desktop and mobile apps can already sign in to several Fluxer instances at the same time, and that's a separate feature from federation. The roadmap explains how federation is going to work and why I chose polyproto over Matrix.

What about end-to-end encryption?

Fluxer will add end-to-end encryption with MLS (Messaging Layer Security) to personal notes, DMs and group DMs, with no setting to turn it off. Calls come first, and in 2026 every call on the new voice system will be end-to-end encrypted with DAVE, Discord's protocol for encrypted calls. For messages, the plan is an experimental draft in 2026 and a stable release in 2027. The roadmap explains how it will work.

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, joining the waitlist for the Operator Pass, donating and reporting bugs or requesting features on Fluxer Feedback. Donations pay for hosting and development.

Fluxer should stay independent and self-funded. Fluxer.app pays for building the open source app, and everything we build is free for anyone who self-hosts.

See you in the Fluxerverse!

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

Found a bug or have an idea? Tell us on Fluxer Feedback. If you want to join the discussion with the team and other users, come to Fluxer Labs.