Fluxer: One Developer, Five Years, and the Open-Source Chat Platform Discord Should Fear

How a 23-year-old Swedish student built a polyglot Discord alternative with Erlang, TypeScript, and Rust WASM, then watched Discord's own missteps hand him 125,000 users.

fluxerapp/fluxer · 12 min read

A lone figure at a massive workbench assembling an intricate communication tower from interlocking gears and cables. On the horizon a much larger corporate tower shows cracks at its base. Small birds carry messages between the two structures.
One person's workbench. Five years of iteration. A tower that now serves 125,000 users.
Key Takeaways

The Timing Nobody Could Have Planned

Hampus Kraft started building Fluxer in 2020. He was a teenager in Sweden, stuck at home during the pandemic, fascinated by how Discord worked under the hood. What began as curiosity became a high school graduation project, then an obsession, then a company.

For four years, hardly anyone noticed. The project evolved through multiple complete rewrites, shifting tech stacks, and long stretches of solitary coding. Kraft kept going.

Then Discord announced mandatory age verification on February 9, 2026. Searches for "Discord alternatives" spiked 10,000% overnight. Stoat (formerly Revolt) crashed under the load. And Fluxer, the project nobody had heard of, sold 1,000 lifetime Visionary plans at $299 each before Kraft paused sales to catch his breath.

That is roughly $300,000 in bootstrapping capital from a single week of chaos. No venture funding. No pitch decks. Just years of invisible work meeting one very visible moment.

The Developer Behind the Curtain

Hampus Kraft is 23, studying computer engineering at KTH Royal Institute of Technology in Stockholm. He joined Discord's Testers community in 2019, earned a Bug Hunter badge, and eventually collected a $1,500 security bounty from Discord itself in 2022. That money, combined with a later $2,000 bounty, helped fund the registration of Fluxer Platform AB as a Swedish company.

The irony is thick. Discord paid Kraft to find bugs in their platform. He used the money to build a replacement.

Kraft is transparent about his use of LLMs during development. He estimates 90% of his AI usage is rubber-ducking. The contributing guidelines explicitly require developers to understand every line they submit and to disclose any LLM usage. "This kind of platform cannot be built via autonomous code generation," the CONTRIBUTING.md states bluntly.

"I know it's hard to resist, but please wait a little longer before you dive deep into the current codebase or try to set up self-hosting. I'm working on making self-hosting as straightforward as possible."

Hampus Kraft, Fluxer README
A horizontal timeline spanning from 2020 to 2026. Early years show small quiet workbench scenes. The line gradually builds in complexity with gears and wires. At 2026 a sharp upward spike erupts with birds and signals flying outward representing the explosive growth moment.
Five years of quiet building, then one week that changed everything.

Why Erlang for a Chat App in 2026?

The most striking technical decision in Fluxer is the WebSocket gateway. It is written in Erlang/OTP. Not Elixir, which would be the trendy choice. Raw Erlang.

Kraft studied at KTH, where Joe Armstrong wrote his PhD thesis on Erlang. That proximity was not lost on him. He points to the classic observation: "any sufficiently complicated concurrent program contains an ad hoc, bug-ridden implementation of half of Erlang." WhatsApp proved the model at billions of connections. Discord itself runs its gateway on Elixir, the Erlang ecosystem's friendlier face.

The gateway handles all WebSocket connections, presence tracking, typing indicators, and real-time event dispatch. Session and guild state lives in GenServer processes, keeping hot data in memory. When a client reconnects after a brief disconnect, it replays missed events from in-memory buffers rather than reconstructing state from the database. This is classic Erlang thinking: let the process tree be the source of truth.

Permissions are computed via RPCs to the gateway rather than database queries. Because the gateway already holds the full guild state in memory, permission checks become cheap function calls instead of expensive joins. This is the same optimization Discord documented in their engineering blog years ago, and Kraft implemented it deliberately.

"Sufficiently complicated concurrent programs contain ad hoc, bug-ridden implementations of half of Erlang."

Robert Virding, Erlang co-creator

The Polyglot Architecture

Fluxer is not just Erlang. The repository is a massive pnpm monorepo with 15+ packages, and the language breakdown tells the story: 22.6 million characters of TypeScript, 2 million of Erlang, 1.5 million of CSS, 583K of MDX, 85K of Go, and 39K of Rust. Each language was chosen for a specific job.

TypeScript and Hono power every HTTP service. The REST API, the background worker, the media proxy, the queue processor. Hono was chosen as the web framework across all HTTP endpoints for its performance and minimal footprint. The API layer lives in fluxer_api, while the orchestration server sits in fluxer_server.

Erlang/OTP handles the real-time WebSocket gateway in fluxer_gateway and the federation relay system in fluxer_relay. These are the services where concurrency matters most and where Erlang's supervision trees shine.

Rust compiled to WebAssembly runs inside the client for performance-critical operations. The fluxer_app/crates directory contains Rust code that gets compiled to WASM and loaded by the React frontend. This handles computationally expensive tasks like permission bit calculations and markdown parsing at near-native speed in the browser.

React and Electron provide the desktop and web frontend in fluxer_app, bundled with rspack rather than webpack for faster builds. A PWA variant serves as the current mobile experience, with a native Flutter app on the roadmap.

Four interlocking gears of different sizes each labeled with a language. The largest gear labeled TypeScript meshes with a medium gear labeled Erlang which connects to a small precise gear labeled Rust and a tiny gear labeled Go. Each gear has distinct crosshatching patterns to show different materials and purposes.
Four languages, four jobs. The polyglot stack is deliberate, not accidental.

Storage: SQLite for You, Cassandra for Scale

The storage story is one of the smartest decisions in the entire project. Self-hosted instances default to SQLite. Zero config, single file, dead simple. You do not need to run a database cluster to chat with your friends.

But the production fluxer.app instance runs Cassandra. Kraft chose Cassandra because its constraints force thoughtful data modeling and make it nearly impossible to write accidentally inefficient queries. Message storage uses rich column types (maps, sets, user-defined types) to avoid extra table joins for metadata like unfurled links and attachments.

The decision was sealed when ScyllaDB dropped its open-source license in December 2024. Cassandra remained the credible, truly open option for write-heavy workloads at scale.

Valkey (a Redis-compatible fork) handles caching, rate limiting, and ephemeral coordination. Meilisearch provides full-text search. The backing store choices share a theme: genuinely open-source software with no license traps.

The Monorepo Tour

The repository structure reveals just how much surface area "building a Discord alternative" actually covers. This is not a toy project.

Directory Language Purpose
fluxer_gateway Erlang WebSocket gateway, presence, real-time events
fluxer_api TypeScript REST API (Hono framework)
fluxer_server TypeScript Core server, worker, media proxy, queue
fluxer_app TypeScript + Rust React web/desktop client with WASM modules
fluxer_desktop TypeScript Electron shell for desktop builds
fluxer_relay Erlang Federation relay for inter-instance communication
fluxer_relay_directory Erlang Discovery directory for federated instances
fluxer_admin TypeScript Admin dashboard for instance operators
fluxer_docs MDX Documentation site (docs.fluxer.app)
fluxer_marketing TypeScript Marketing site (fluxer.app)
fluxer_media_proxy TypeScript Proxied media delivery and link unfurling
fluxer_devops Shell + Go Deployment tools, LiveKit bootstrap (livekitctl)
packages/ TypeScript 30+ shared packages: auth, cache, permissions, i18n, markdown parser, etc.

The packages/ directory alone contains over 30 shared modules, covering everything from a custom Discord-compatible markdown parser to internationalization, geo-IP lookup, captcha integration, and CQL schema definitions. Turborepo orchestrates builds across the monorepo, and Biome handles linting and formatting in a single tool.

The Competitive Landscape

Fluxer enters a field that has gotten crowded fast. Every Discord misstep sends another wave of users searching for alternatives, and each wave finds more options than the last.

Stoat (formerly Revolt) is the most direct competitor. It offers a very similar UI to Discord, strong self-hosting via Docker, and a passionate community. But the forced rebrand after a cease-and-desist hurt momentum, and its servers crashed during the February 2026 exodus.

Element/Matrix takes the federation-first approach. Built on the decentralized Matrix protocol with end-to-end encryption by default, it targets privacy-conscious users and organizations. The UX has improved dramatically but still feels more like Slack than Discord.

Guilded added superior voice quality and built-in scheduling, but Roblox's ownership means it is neither open-source nor independent. For users fleeing corporate control, Guilded is not the answer.

Fluxer differentiates on three fronts: it is genuinely open-source under AGPLv3, it is built by an independent European company, and it aims for exact Discord feature parity rather than reinventing the interaction model. The bet is that most users do not want something different. They want what they have, minus the parts they hate.

A wide harbor scene with several ships of different sizes. One large corporate vessel labeled with a trident symbol shows cracks in its hull. Several smaller independent vessels of varying designs sail nearby some with open source flags. One vessel flies a Swedish flag and appears newly reinforced with fresh timber.
The open-source fleet is growing. The question is which ships can sustain the voyage.

Self-Hosting Without the Tax

Fluxer's self-hosting promise is unusually clean. Every feature is unlocked. No Plutonium subscription required. No "SSO tax" (the SaaS industry's favorite way to extract money from enterprises). You configure your own tiers and limits in the admin panel.

The development environment runs through devenv, a Nix-based tool that provides reproducible environments. One command (devenv shell) sets up every dependency. One command (devenv up) starts every service. Emails during development go to a local Mailpit instance rather than requiring an SMTP server.

For voice and video, Fluxer ships a livekitctl bootstrap tool that automatically configures a LiveKit SFU based on your domain. If you develop behind Cloudflare Tunnels, the README documents exactly which ports to open for WebRTC media transport. This level of operational detail signals that someone has actually deployed this thing in the real world, not just in a demo.

There is also experimental devcontainer support for VS Code and GitHub Codespaces, though Bluesky OAuth is disabled in that environment because it requires HTTPS.

The Message Scroller Problem

Kraft calls the message scroller "surprisingly difficult," and anyone who has tried to build one knows he is right. Infinite scrolling sounds simple until you account for: messages loading above the viewport without jumping the scroll position, bounded caches that evict old messages without losing your place, unread markers that update in real-time, and temporal jumps that let you click "jump to message" and land in the right spot with messages loading in both directions.

Discord's own message scroller took years of iteration. Fluxer's custom implementation, built from scratch in React, has to match those expectations from users who have internalized Discord's behavior as the default.

The client also includes a custom Discord-compatible markdown parser with extensive test coverage. This is the kind of detail that separates "alternative" from "clone." Users expect their bold text, code blocks, spoiler tags, and custom emoji to render identically.

Regulatory Compliance as a Feature

The hosted fluxer.app instance takes regulatory compliance seriously in ways that reveal genuine operational maturity. Mississippi is blocked entirely because of the state's age-verification law. NSFW content is disabled in the UK. The platform integrates Project Arachnid for CSAM detection.

Kraft chose Bunny.net as the CDN specifically because it is European-owned, keeping infrastructure under European jurisdiction where possible. This is a deliberate contrast to Discord's US-centric infrastructure and the privacy concerns that come with it.

For a platform built by two full-time employees, this regulatory awareness is remarkable. It also creates a meaningful differentiator for European organizations evaluating self-hosted alternatives.

What the Roadmap Promises

The 2026 roadmap is ambitious but focused. Native mobile apps (Flutter-based) are the top priority because the current PWA, while functional, does not match native performance expectations. Threads and forums are next, followed by federation support that would let separate Fluxer instances communicate.

Further out: community discovery directories, slash commands with a UI kit, emoji and sticker packs, opt-in end-to-end encrypted "secret chats," and creator monetization with role-based subscriptions and event tickets (5-10% platform fee).

Federation is the feature that could change everything. If Fluxer instances can talk to each other while each remains independently operated, it would combine Discord's UX familiarity with Matrix's decentralization promise. That is a compelling pitch.

The Business Model Question

Sustainability is the existential question for every open-source project that reaches real scale. Fluxer's model has several revenue streams: the Plutonium subscription for higher limits on the hosted instance, the Visionary lifetime plan (currently paused after the initial 1,000 sales), donations, and a future Operator Pass for self-hosted support.

The $300K from Visionary sales provides meaningful runway, but runway is finite. Two full-time employees, 125,000 users, trust and safety obligations, billing infrastructure, and an accelerating feature roadmap create real burn. Creator monetization could provide a scalable revenue stream, but it requires the platform to reach critical mass in content-creating communities first.

Kraft is refreshingly honest about the tension. The README acknowledges he cannot offer competitive salaries yet. The team is growing slowly. The project's survival depends on community contributions and the continued willingness of users to pay for a hosted version of something they could self-host for free.

A small but sturdy bridge under construction spanning a deep gorge. On one side a foundation labeled open source community. On the other side a foundation labeled sustainable business. Workers carefully place planks across the gap. Some planks are labeled donations and subscriptions.
The hardest engineering problem: building a bridge between open source and sustainability.

What Could Go Wrong

The risks are real and worth naming. Network effects are the moat that Discord built over a decade. Your friends are on Discord. Your gaming communities are on Discord. Moving to Fluxer means convincing everyone else to move too, and that is a coordination problem no amount of good engineering solves.

The codebase is also in transition. Kraft warns in the README that the current stack "isn't very lightweight" and that a major refactor is underway. PRs are not yet enabled for external contributors. The repository's git history reflects a closed-to-open transition rather than a project that has always developed in public. Until the refactor lands and community development truly opens up, Fluxer depends heavily on one person's bandwidth.

Registration friction is already a reported issue. At least one Hacker News commenter could not get past the captcha on Firefox/Linux. For a project trying to attract the exact demographic that values open source and runs Linux, that is a problem.

The Bigger Picture

Fluxer matters beyond its own success or failure. It represents a pattern: solo developers with modern tools, deep understanding of existing systems, and enough patience to iterate for years can now build platforms that previously required venture-backed teams of dozens.

Kraft did not invent new technology. He studied Discord's architecture through blog posts, bug bounties, and years of daily use. He picked proven tools (Erlang for concurrency, Cassandra for writes, React for UI) and assembled them into something that works at meaningful scale. The polyglot choices were not resume-driven development. Each language sits exactly where its strengths matter most.

Whether Fluxer becomes the dominant open-source Discord alternative or one of several viable options, its existence proves the model. The tools for building real-time communication platforms are now accessible to individuals. The question is whether the community, funding, and operational muscle will follow the code.

For now, 125,000 users are finding out.