Download the AppImage · Install · Distro support · Steam Deck · Changelog
Unofficial Linux build of the Kyber mod launcher for Star Wars: Battlefront II (2017). The upstream launcher is Windows only, so this just packages the existing source from ArmchairDevelopers/Kyber and ArmchairDevelopers/Maxima into an AppImage that runs on Linux.
This is a community fork. Not endorsed by the Kyber team, ArmchairDevelopers, EA, Lucasfilm, or Disney. If you're on Windows, use the official launcher. Bugs in this Linux build go here, not to upstream Kyber.
Important
The build needs glibc 2.39 or newer. Ubuntu 22.04, Debian 12 and SteamOS 3.6 cannot run it. See Install for the supported systems and the Distrobox workaround.
v0.1.0-beta.6.4.13 is the current build, and the in-app updater offers it.
Update if game launches stopped working on Debian or Ubuntu. 6.4.12 gave the game its own hostname on every launch where the machine name resolves to something other than 127.0.0.1, which is what those installers write by default. The game then started, never connected back to the launcher and never exited, so "Starting Game..." stayed on screen until the launcher was killed. Only a hosted server ever needed that, so only hosting uses it now.
Your Proton build is accepted again. 6.4.12 narrowed detection to GE-Proton10-34 alone, so anyone carrying GE-Proton11, proton-cachyos or Valve's own Proton was sent through a roughly 516 MB download for a Proton that already worked. GE-Proton10-34 stays the build Kyber prefers and installs by default, but any working Proton is used now, including Valve's.
Mods kept outside your home directory work. The game runs inside the Steam runtime container, which only shows it a fixed set of locations, so a mod folder on a second drive was not there at all once the game started, and Battlefront II quietly loaded none of them. Mod downloads started in the browser reach the launcher again as well.
A launch that never reports back now gives up after five minutes and says so, instead of leaving the dialog spinning with nothing in the log.
If you are still on 6.4.10 or older, update by hand once: the broken updater shipped in every build before 6.4.11, so those versions cannot fetch the fix themselves. After that the in-app updater works.
Older releases are listed in CHANGELOG.md.
Warning
This is a beta and a one-person port, so expect rough edges. The inject works on the common setups now, but voice chat is not fully proven yet, Nexus mod downloads can still fail, and some distro or GPU combinations do not work at all (a VM without GPU passthrough will not run BF2, for example).
It assumes a healthy system underneath. A working Steam-Proton or Lutris install of BF2, a real GPU with proper Vulkan drivers, and a normal desktop audio stack. The launcher cannot fix a broken Proton prefix or missing graphics drivers. A well set up system is the baseline here, not something the AppImage brings along.
The AppImage bundles most of its libraries but still needs the system GTK stack plus FUSE. A missing one of these is the most common reason a fresh install misbehaves, so pull them in up front.
Debian, Ubuntu, Mint:
sudo apt install libgtk-3-0 libfuse2 librsvg2-2 libnotify4 gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav zenity gamemodeArch, CachyOS:
sudo pacman -S --needed gtk3 fuse2 librsvg libnotify gst-plugins-bad gst-plugins-ugly gst-libav zenity gamemode nettle3Fedora: the equivalent gtk3, fuse, librsvg2, libnotify and gstreamer1 plugin packages.
| Package | What it does | Needed |
|---|---|---|
| gtk3, librsvg, libnotify, fuse2 | The launcher window itself | Required, will not start without them |
| gstreamer plugins (bad, ugly, libav) | Plays the EA login splash video | Optional, silent without them |
| zenity | First-start dialog that offers the desktop entry | Recommended, preinstalled on most distros |
| gamemode | Keeps the CPU governor on performance | Optional, smoother frames |
| nettle3 | Provides libnettle.so.8 | Rolling Arch/CachyOS only, see below |
webkit2gtk is no longer needed: the in-app webview is unused on Linux, so it was dropped to fix startup on systems without a system webkit such as the Steam Deck. libmpv is bundled inside the AppImage, you do not install it yourself. nettle3 matters because rolling Arch and CachyOS now ship nettle 4.0 (libnettle.so.9); without the libnettle.so.8 that nettle3 provides the launcher will not start, and it shows a dialog telling you so.
You need BF2 already installed via Steam-Proton (or Lutris). The launcher doesn't bootstrap Wine itself.
mkdir -p ~/Applications
mv ~/Downloads/KyberLinuxPort-x86_64.AppImage ~/Applications/
chmod +x ~/Applications/KyberLinuxPort-x86_64.AppImage
~/Applications/KyberLinuxPort-x86_64.AppImageOn first start a small zenity dialog asks if you want a desktop entry. Say yes if you want the launcher in your app menu. Most distros have zenity preinstalled. If the dialog doesn't show up, install it via your package manager.
Tested on Ubuntu 24.04 with an Nvidia RTX 3060. Other distros should work
since the AppImage bundles its own runtime, but I haven't verified every
one personally. The build needs glibc 2.39 or newer, so older releases
(Ubuntu 22.04, Debian 12, SteamOS 3.6) cannot run it; use 24.04+, Fedora,
SteamOS 3.7+ or Bazzite. To keep an old host as-is, run the AppImage inside
an Ubuntu 24.04 Distrobox container (glibc 2.39); see
docs/running-in-distrobox.md.
On Arch or CachyOS you can install from the AUR instead:
yay -S kyber-launcher-unofficial-appimage # or: paru -S kyber-launcher-unofficial-appimageThe AUR package is a native binary build (contributed by Yilmaz4), not the
AppImage, and pulls in its own dependencies. The manual pacman step above is
only needed if you run the downloaded AppImage directly. The package keeps the
-appimage name for now and will be renamed to kyber-launcher-bin at beta 10.
It is built separately from the AppImage release and can trail it by a version,
so check pkgver if you need the newest build.
No guarantees. This is what reports and testing actually showed, not a compatibility promise.
| Distro | Status |
|---|---|
| ✅ Ubuntu 24.04+ | primary dev platform, every release is tested here |
| ✅ Fedora, Nobara | community-tested, no open reports |
runs, but nettle3 has to be installed first, see Dependencies |
|
| starts without extra packages; one report of AMD instability during play | |
| launcher runs; the first game start can stall while umu fetches its runtime | |
| ❌ SteamOS 3.6, Ubuntu 22.04, Debian 12 | glibc too old, the launcher refuses to start |
A few notes on the entries that changed:
- Arch and CachyOS are the only systems that need a manual step. Rolling
Arch ships
libnettle.so.9, the build needslibnettle.so.8. Withoutnettle3the launcher does not start, and it will tell you so. - Bazzite no longer needs a FUSE2 layer. The AppImage carries the type-2 runtime, which speaks FUSE3, falls back to FUSE2 and extracts itself when neither is there. The remaining question mark is a report of GPU instability on AMD during play. One cause on our side, a process scan that ran forty times a second, is fixed in this release; whether that settles it is unknown.
- Steam Deck was measured on SteamOS 3.7.7: glibc 2.41, the launcher starts. A Deck that has never run a Proton game has no Steam runtime to reuse, so the first game start pulls one down and can take a long time.
Test rig: Ubuntu 24.04, Ryzen 7 5800X, RTX 3060, 32 GB DDR4, BF2 through Steam-Proton with GE-Proton. DX12 does not work on it, DX11 gives 60 to 80 FPS on Ultra.
Tip
If BF2 runs rough, the FPS Booster mod on Nexus is worth adding to your collection.
Use Desktop Mode. The AppImage runs on SteamOS like on any other distro; the webkit dependency was dropped, so it starts without extra packages.
The catch is the EA login. The launcher opens EA sign-in in your browser,
and on the Deck that is usually a Flatpak browser, which does not hand the
qrc:// callback back to the launcher, so the automatic login never
completes. To finish login manually:
- Press "Login with EA" and sign in in the browser that opens.
- After signing in, the browser tries to open a
qrc://...link and shows an error or blank page. Copy that link (or just thecode=...value from it). - Back in the launcher, paste it into the field under "Browser did not return to the launcher?" on the login screen and submit.
On a detected Steam Deck that paste field is shown expanded by default.
Alternative: run the launcher inside a Distrobox container that has a normal (non-Flatpak) browser, where the callback can work automatically.
The default flow downloads GE-Proton10-34 into
~/.local/share/maxima/wine/proton/ and runs BF2 from there. That version
is pinned, so a new GE release neither changes what you run nor triggers a
re-download. It is the only tested-stable path and the recommended default
for most users.
Advanced users can override the Proton build used for BF2. Settings -> Mod Configuration -> "Custom Proton Path (Experimental)" opens a dialog that browses for or scans the standard Steam compatibility-tools folders. Verified to work in testing: GE-Proton 10.x family, Proton-EM Latest, proton-cachyos 11.x. Newer builds with Wine 10 + DXVK 2.x can give noticeably smoother frame times than the bundled default, at the cost of losing the tested-stable safety net.
Tip
To get those builds onto your system, ProtonPlus is the easiest route. It downloads GE-Proton, Proton-EM and others into the folders the scan already looks at, so they show up in the dialog right after.
Equivalent power-user env var:
KYBER_PROTON_PATH="$HOME/.steam/steam/compatibilitytools.d/Proton-EM Latest" \
~/Applications/KyberLinuxPort-x86_64.AppImageResolution order is env var first, then a sidecar file at
~/.local/share/maxima/custom_proton_path (written by the UI), then the
auto-managed default.
Implementation: when a custom path is active, the launcher transparently
swaps ~/.local/share/maxima/wine/proton for a symlink to the chosen
build (originals are moved aside to proton.maxima-backup). The Wine
prefix itself stays the shared BF2 Steam compat-prefix, so save games and
EA App login survive switching between default and custom. "Reset to
default" in the dialog restores the symlink instantly without re-download.
Switching Proton also clears BF2's vkd3d-proton.cache automatically, so the first match after a switch will recompile shaders for one or two minutes and then settle smooth. A manual Clear shader cache button is in the dialog for cases where the auto-purge cannot find your BF2 install (Custom Game Path setups).
Close BF2 fully before switching Proton. The dialog detects a stale wineserver from a previous BF2 session and offers a one-click "Kill wineserver and retry" action, but cleanly exited beats forced-kill.
The launcher runs on X11 (XWayland) by default, which is the stable path. On a Wayland session you can switch to the native backend under Settings -> Mods / Proton / Wayland ("Native Wayland", experimental). It applies after a restart. The toggle only appears on a Wayland session; on X11 there is no Wayland display to use, so it is hidden.
If the native backend glitches or crashes, turn the toggle back off (or remove
~/.config/kyber-linuxport/backend) and it falls back to X11. The manual
override still works too:
GDK_BACKEND=wayland ~/Applications/KyberLinuxPort-x86_64.AppImageFlutter (master channel), Rust stable, GTK 3 dev packages, patchelf, librsvg dev tooling.
git clone --recurse-submodules https://github.com/simonlinuxcraft/kyber-linuxport-unofficial.git
cd kyber-linuxport-unofficial/Kyber/Launcher
flutter build linux --release
cd ../..
tools/build-appimage.shOutput ends up in tools/KyberLinuxPort-x86_64.AppImage. First build
takes a few minutes (cargo fetch, Rust compile, Flutter bundle).
Subsequent builds are usually around 30 seconds. AppImage packaging
itself adds about a minute.
The master channel moves fast and engine defaults change with it, so the
tested SDK revision is recorded in tools/flutter-revision. The build
script warns when your checkout differs; to match it exactly:
git -C "$(dirname "$(dirname "$(readlink -f "$(command -v flutter)")")")" checkout "$(cat tools/flutter-revision)"GPLv3, see LICENSE. This is a derivative work of the
upstream Kyber and Maxima codebases, both GPLv3. Linux-port changes are
GPLv3-only.
For binary distributions, the corresponding source is this repo at the
release tag. The AppImage embeds a source-url.txt pointing back here.
The bundled wine-helper.exe from ACowAdonis has its own source offer
in Kyber/CLI/cli_payload/README.md.
See NOTICE.md for the full list of third-party components
shipped in the AppImage.
Small one-person project. If you hit a Linux-specific bug, open an issue here. Don't report Linux-specific bugs to the upstream Kyber team, they didn't write this part. If you're not sure whether something is Linux-specific, file it here anyway and I'll redirect if it turns out to be upstream.




