# Serein: a native Rust Discord client built on egui and wgpu

> Serein is an unofficial Discord desktop client written in Rust, shipped as a workspace of crates around egui and wgpu. It has nightly-only releases, a Flatpak-first Linux story, and a Terms of Service warning that matters more than any benchmark table.

**ViceVerse-cz/Serein** — Tiny, Performant & 100% Native client for Discord made in Rust

- Repository: https://github.com/ViceVerse-cz/Serein
- Website: https://discord.gg/UqTDGCENaN
- Stars: 637 · Forks: 26
- Language: Rust
- License: Apache-2.0
- Published: 2026-09-17 · Updated: 2026-09-17 · Language: en
- Canonical page: https://hysenlabs.com/projects/viceverse-cz-serein

## What Serein is, and the warning that comes before the feature list

Serein is a desktop client for Discord written in Rust and rendered with egui on top of wgpu. The README places a warning block above everything else: the project is unofficial, not endorsed by Discord, and talks directly to Discord's public gateway and REST endpoints using your existing account. The README states that automating normal accounts outside the official OAuth2 and bot API violates Discord's Terms of Service and carries a risk of account termination. That sentence is the whole adoption decision in miniature. Everything below it, the installers, the package repositories, the architecture, describes a client that is technically interoperable with Discord without being approved by Discord.

So the audience is narrow and specific. It is people who want a native desktop client rather than a browser wrapper, who are willing to run something the platform owner has not sanctioned, and who understand that a client speaking the gateway protocol directly is a different risk category from a bot token. If you are looking for a supported way to build on Discord, this is the wrong project and the README says so itself.

## How the workspace is split: gateway, API, protocol, cache and UI as separate crates

The Cargo.toml shows a workspace with members under apps/desktop, crates/* and tools/*, and default-members set to apps/desktop. The dependency list names the seams of the architecture: discord-gateway for the realtime connection, discord-api for REST, discord-protocol for the wire types, client-core for orchestration, session-cache for local state, model for shared data structures, ui for the egui layer, and discord-voice as a separate crate. There is also local-store, which depends on rusqlite pinned to 0.40.2 with default features disabled.

That layout tells you where things can go wrong. The gateway crate uses tokio-tungstenite pinned at 0.30.0 with rustls and webpki roots, so TLS trust is compiled in rather than taken from the host. HTTP goes through reqwest pinned at 0.13.5 with rustls, json, stream and gzip. Both pins are exact versions, not ranges, which is a deliberate choice: a Discord client breaks when the wire format moves, and exact pins keep a rebuild from silently picking up a different TLS or HTTP stack. The cost is that dependency updates have to be done by hand rather than by a resolver.

The UI layer is pinned to a specific egui and eframe revision from the emilk/egui repository, with wgpu, accesskit, wayland and x11 features enabled. Pinning a git revision rather than a crates.io version means the rendering stack is reproducible but also that security fixes in egui arrive only when the maintainers bump that revision. The README badge pins Rust at 1.98.1, and Cargo.toml sets rust-version to 1.98 with edition 2024, so you need a recent toolchain to build from source at all.

## Installing Serein on Linux with Flatpak, apt, dnf, zypper or pacman

Pre-compiled releases are published on GitHub Releases for macOS, Linux and Windows. On Linux the README calls Flatpak the recommended format, describing sandbox isolation, bundled GNOME and WebKit runtimes, and automatic background updates. The one-click repository install adds a remote and installs in one step:

```sh
flatpak install --user https://viceverse-cz.github.io/Serein/flatpak/serein.flatpakref
```

After that, GNOME Software, KDE Discover or flatpak update will pick up new versions. If you prefer a local file, download Serein-linux.flatpak from Releases and install it the same way, then launch it by application ID:

```sh
flatpak install --user ./Serein-linux.flatpak
flatpak run cz.viceverse.serein
```

For native packages, the project provides a setup script that detects your distribution, verifies a GPG signing key and configures a signed repository. The README shows it as a single piped command:

```sh
curl -fsSL https://viceverse-cz.github.io/Serein/setup.sh | sh
```

Piping a remote script into a shell is the kind of thing you should inspect first, and the repository does keep the manual GPG verification steps in packaging/repositories/README.md. Once the repository is configured, the README lists the per-distribution installs as sudo apt install serein, sudo dnf install serein, sudo zypper install serein and sudo pacman -S serein, after which your normal system upgrade commands keep it current. There is also a portable AppImage: download the file, make it executable, run it. The README notes the AppImage relies on host GTK4 and WebKitGTK 6.0 libraries and points to packaging/appimage/README.md for the runtime requirements, so on a minimal system the AppImage is the format most likely to fail at launch.

## Windows and macOS: per-user installer, PowerShell setup, and the notification script

On Windows the recommended path is the NSIS setup executable. According to the README it installs per-user to %LOCALAPPDATA%\Programs\Serein without administrator elevation, registers Start Menu shortcuts, sets AppUserModelID cz.viceverse.serein for native toast notifications, and appears in Installed Apps with uninstall support. It also cooperates with in-app self-updates so the registered version stays in sync.

If you would rather not run an installer, the zip contains a PowerShell script. The README gives these two commands:

```powershell
powershell -ExecutionPolicy Bypass -File .\setup.ps1
powershell -ExecutionPolicy Bypass -File .\setup.ps1 -Uninstall
```

The portable route is to extract the archive anywhere and run serein.exe directly. Notifications need one extra step, and the script must sit beside the binary:

```powershell
powershell -File .\install-notifications.ps1
```

The README warns that if the RemoteSigned execution policy blocks the downloaded script, you should review it and run Unblock-File -LiteralPath .\install-notifications.ps1 in that folder before retrying. Installed builds skip this because the installer registers the shortcut itself. The macOS section of the README is truncated in the repository, but it lists a Homebrew Cask and a signed, notarized .app bundle for Apple Silicon only, with no Intel build shown in the platform table. If you are on an Intel Mac, the table gives you nothing.

## Nightly versioning and the maintenance question

The three most recent releases are all pre-releases: v1.0.0-nightly.20260916.27, v1.0.0-nightly.20260915.23 and v1.0.0-nightly.20260915.22. The version scheme encodes the date and a build counter, and the repository's last push was on 2026-09-16. So development is current, but there is no stable 1.0.0 tag in the release list, only nightlies. For a client that speaks a live protocol, that cuts both ways: you get fixes quickly, and you also get whatever changed between build 22 and build 27 of the same day.

The workspace version in Cargo.toml is 0.1.0, which does not match the release naming at all, so do not read the manifest as a release signal. What the README does not document is a rollback path. It describes automatic updates through Flatpak, through the native package managers, and through in-app self-updates, but it never explains how to pin or revert to an earlier build if a nightly regresses. On Flatpak you could hold a specific commit with the usual flatpak tooling, and with apt or dnf you could pin a version, but none of that is written down in the README. If you need a documented downgrade procedure, this project does not provide one.

## Licence, extensions and what the repository does not answer

The licence is dual: Cargo.toml declares MIT OR Apache-2.0, and the repository carries LICENSE-MIT and LICENSE-APACHE as separate files, with a badge matching. The GitHub metadata lists Apache-2.0, which is one half of that pair. For most users the practical effect is that you can use, modify and redistribute the client under either licence, and if you contribute you should expect the same dual grant. The repository also carries THIRD_PARTY_NOTICES.md and a deny.toml, which suggests cargo-deny is used to check licence and advisory policy in CI. That is a signal about process, not a guarantee about any particular dependency.

There is an extensions directory at the top level and an examples/extensions directory, plus a crates/extensions member in the workspace, so an extension mechanism exists in the layout. The README as provided does not describe how to write one, what API it exposes, or what it is allowed to touch. If extensions are the reason you are interested, the answer is not in the README and you would be reading the crate source instead. The same applies to voice: discord-voice is a workspace member and there is a fuzz directory and a tests directory, but the README does not state which voice features are implemented or how they behave. Treat any claim about voice support as unverified until you read the crate.

## How Serein differs from the official client and from wrapper clients

The obvious alternative is the official Discord client, which is a Chromium-based application. Serein takes the opposite approach at every layer: egui draws the interface, wgpu issues the GPU work, and Rust owns the process. There is no embedded browser and no web bundle. The README presents measured performance against the official client as one of its headline sections, and that framing is the project's own pitch rather than an independent result.

The more instructive comparison is with clients that wrap the Discord web app in a native shell. Those inherit Discord's own rendering path and its update cadence, and they generally stay on the right side of the Terms of Service because they are still the web client. Serein does not: it implements the gateway and REST calls itself, which is exactly why the README carries the account-termination warning. The trade is real in both directions. A wrapper gives you lower risk and less control. Serein gives you a native renderer and a Rust codebase you can read, at the cost of platform approval you do not have. If your reason for leaving the official client is memory usage alone, a wrapper is the lower-risk answer. If your reason is that you want a client you can build and inspect down to the TLS stack, Serein is the one that offers that.

## Conclusion

Adopt Serein only if you accept the account risk the README states outright, you are comfortable running a client whose newest releases are all nightlies, and you want a Rust and egui build rather than a wrapper around the web app. Do not adopt it if you need a stable version number, a documented rollback path, or a client that Discord endorses. Before installing, read docs/discord-compatibility.md and docs/authentication.md in the repository, and check that the release you are about to install is the one you actually want.

## FAQ

### What is Serein?

Serein is an unofficial desktop client for Discord written in Rust, using egui for the interface and wgpu for rendering. The README describes it as lightweight and native, and states that it communicates directly with Discord's public gateway and REST endpoints.

### Is Serein legit to use with my Discord account?

The README states plainly that Serein is unofficial and not endorsed by Discord, and that automating normal accounts outside the official OAuth2 and bot API violates Discord's Terms of Service and carries a risk of account termination. The project's own warning block is the answer.

### What does serein mean?

The README uses Serein only as the product name and does not discuss the word's origin or definition.

### What does "serein" mean in English?

The README does not give a definition of the word. It appears only as the name of the Rust Discord client.

### How do you pronounce serein in English?

The README does not cover pronunciation. It uses Serein as a project name and gives no guidance on how to say it.

## Sources

- [License: Apache-2.0](https://github.com/ViceVerse-cz/Serein/blob/main/LICENSE)
- [Project website](https://discord.gg/UqTDGCENaN)
- [README](https://github.com/ViceVerse-cz/Serein/blob/main/README.md)
- [Releases](https://github.com/ViceVerse-cz/Serein/releases)
- [ViceVerse-cz/Serein on GitHub](https://github.com/ViceVerse-cz/Serein)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/viceverse-cz-serein
