Come and talk to us on Discord for help getting it running and what is being worked on. Bugs and feature requests go on GitHub, not in chat, so they don't get lost.
Roblox DOORS, unmodified, on Cordial β Fedora, GNOME, no Android device involved.
This clip at full size,
and more in docs/media β including an hour of Rivals cut down to its eliminations.
A hobby project, not a commercial one. Please don't DMCA it.
flatpak remote-add --if-not-exists cordial https://luohoa97.github.io/cordial/cordial.flatpakrepo
flatpak install cordial io.github.luohoa97.Cordial
flatpak run io.github.luohoa97.CordialOr take the AppImage from the releases
page, which installs nothing and
runs anywhere: chmod +x Cordial-x86_64.AppImage && ./Cordial-x86_64.AppImage.
Install compares the two and says what is less proven about the
newer one.
You also need Roblox's Android build, which Cordial does not ship and never will. First run has one button β Download Roblox β and that is the whole procedure. Cordial fetches the build from APKPure, a third-party mirror, and refuses to install anything that is not signed by Roblox's own signing certificate, so a mirror that alters a byte is caught rather than trusted. It waits for your press before downloading, since this is a few hundred megabytes and somebody may be paying for it by the megabyte.
You never have to press it if a build is already on the machine:
- Already have Sober? Then there is nothing to press. Cordial finds the APK Sober downloaded and uses it where it lies β no copy, no modification, and Sober keeps working.
- Supply your own APK and point Cordial at it in Settings, or see What you need. It gets the same signature check.
Two things worth knowing before you type that, rather than after: the remote
is not signed, so flatpak install proves the download matches the
repository's checksums and nothing about who built it β the
full explanation is in
docs/install.md and you should read it. And Cordial is experimental:
sign-in, gameplay, mouse and keyboard, text entry and audio all work; the
status page says exactly what does not.
Cordial loads Roblox's official Android x86-64 engine directly on Linux through a purpose-built runtime: the AOSP bionic linker, a bionic/glibc shim, a JNI VM in place of Android's, and a framework layer that answers the client's calls. No emulator, no container, no virtual machine. It talks to your GPU through Vulkan or GLES2 the way any native application does.
It is also, as far as we know, the first user-extensible Roblox client β not in the sense of replacing files or setting flags, which other launchers already do, but in the sense that you can write code that runs as part of the client. Plugins are ordinary programs in their own processes with named capabilities rather than access, and Cordial's own default features are built as plugins too, so the API has to be good enough for them. Browser extensions only reach Roblox's website, launcher mods replace assets, and FastFlag managers change settings Roblox already reads β none load user-written code into the client itself; if one already does, we would genuinely like to know.
What this is not is a way to modify Roblox itself. There is no script execution, no hooking, and no memory access β absent from the API rather than disabled. Plugins extend Cordial.
- Join the Discord π¬
- Read the documentation π
- Start here β what works and what is blocking π§
- Install it π½
- How it actually works π¬
- Why there is no script execution, ever π
- Report a bug or suggest a feature π
- Contribute π οΈ
New here? Read the warning below first, then
docs/NEXT.md β it is written for someone picking the project
up cold and says plainly what is broken and what has already been ruled out.
GitHub Issues is
where a bug, a broken Roblox feature, a failed update, a feature suggestion,
or a finding goes β not Discord, which is faster for a quick question but does
not get triaged and is not searchable later. Blank issues are off; pick the
template that matches and it asks for the right things β see
.github/SUPPORT.md for the full list. Security issues
go through a private advisory
instead of a public one; see SECURITY.md.
Every template requires a Diagnostics block. Get it from Settings β Report a Problem, which has a copy button, or from a terminal:
cordial --diagnostics # .deb / .rpm / Arch
flatpak run io.github.luohoa97.Cordial --diagnostics # Flatpak
./Cordial-*.AppImage --diagnostics # AppImageIt carries the Cordial and Roblox build, uname -a, your distribution and
package format β the things a report here is usually missing. It does not
carry your account, any token, your profile name, or any path under your home
directory, though it does carry your machine's hostname, shown on screen
before it is copied so you can edit it out.
This is NOT an official Roblox client, and it is not endorsed or sponsored by Roblox Corporation, which has not approved this project and has not been asked to. Roblox does not support third-party clients and operates automated systems that ban accounts for using them, up to permanent termination β including false positives against innocent players, in waves, associating accounts that share an IP address.
Cordial does not modify the Roblox client or exploit it β no script executor, no hooking, no memory access to the Roblox process, absent from the API rather than disabled (ADR-001, ADR-003) β but it necessarily presents a synthesised Android environment, and a heuristic detector does not owe you that distinction. Alternate accounts are not a shield.
If your account matters to you, do not use it here. If you use Cordial and get banned, that is on you, and the maintainers cannot get it reversed. See CONTRIBUTING.md for testing with a throwaway account on its own IP.
The full feature table, what changed recently in this fork, and three of the
harder bugs it took to get here β the content store, the keyboard, and running
two accounts at once β are in docs/status.md. Read it
before installing.
Cordial is experimental.
docs/status.mdsays what works today β read it before installing.
x86-64 Linux, Wayland. X11 still starts via Flatpak's fallback socket but
is not developed further (ADR-011).
You also need Roblox's Android build, which the Download Roblox button on
first run fetches for you β see docs/install.md for the
Sober and custom-APK routes.
Flatpak, sandboxed and self-updating β pick this unless you have a reason not to:
flatpak remote-add --if-not-exists cordial \
https://luohoa97.github.io/cordial/cordial.flatpakrepo
flatpak install cordial io.github.luohoa97.Cordial
flatpak run io.github.luohoa97.CordialAppImage, one file, no install, updates manually β newer and less proven,
see docs/install.md:
chmod +x Cordial-x86_64.AppImage && ./Cordial-x86_64.AppImageAPT (Debian/Ubuntu):
sudo apt install ./cordial_*_amd64.deb # from the releases pagednf (Fedora 44 today, RHEL and derivatives):
sudo dnf install ./cordial-*.x86_64.rpm # from the releases pagepacman (Arch and derivatives):
sudo pacman -U cordial-*-x86_64.pkg.tar.zst # from the releases pageAll four release artefacts are cosign-signed; the Flatpak/APT/dnf/pacman
repositories are not, yet, and the AUR is blocked on account sign-ups being
closed. Verifying a signature, repository status and key fingerprints:
docs/install.md.
Building from source:
git clone --recursive https://github.com/luohoa97/cordial
cd cordial
cargo build --releaseNeeds Clang (AOSP bionic uses C11 _Atomic in C++ headers; GCC rejects it)
and GTK4 β₯ 4.10 / libadwaita β₯ 1.4 development packages. Full dependency
list and the Flatpak build: docs/install.md.
Running a source build:
cargo run --release --bin cordial-run -- \
--lib-dir /path/to/lib/x86_64 --apk /path/to/base.apk \
--host-libc --game-activity --run 30--run is how many seconds to stay up; cordial-run --help lists the rest.
CORDIAL_MONITOR=<n> |
open on the nth monitor instead of the primary one |
CORDIAL_FULLSCREEN=1 |
cover that monitor |
CORDIAL_RESOLUTION=<w>x<h> |
render resolution, default 1280x720 |
CORDIAL_DPI_SCALE=<f> |
UI density Roblox lays out against; 1.0 is a low-density phone |
CORDIAL_NO_POINTER_LOCK=1 |
never capture the cursor at all |
CORDIAL_COMPOSITOR_BYPASS=1 |
X11 only: set _NET_WM_BYPASS_COMPOSITOR while fullscreen, a hint an Xorg compositor may use to unredirect the window; off by default and unmeasured |
CORDIAL_PRESENT_MODE=<m> |
frame pacing: mailbox (default), fifo, immediate, uncapped, off β Settings has a row for this |
CORDIAL_GAMEPAD_TYPE=<n> |
which controller brand Roblox draws glyphs for β see docs/controllers.md |
CORDIAL_ANDROID_TRACE=1 |
log Android API calls |
CORDIAL_COUNT_GL=1 |
report graphics calls on exit |
FastFlag overrides live in
~/.local/share/cordial/profiles/<profile>/flags.json β syntax, layering and
gotchas are in docs/fastflags.md.
Read the engine's own log first. Roblox writes it to
<files>/appData/logs/*.log and it names subsystems, stages, paths and
exceptions in its own words β most questions are answered by the newest file
there. To check whether input is reaching the engine, run with
CORDIAL_ANDROID_TRACE=1 and look for onTouchEventNative(...) -> true. If
none of that explains it, file an issue.
Is this an official Roblox client? No. Not affiliated with, endorsed by, or sponsored by Roblox Corporation. It runs Roblox's own Android build under a runtime this project wrote.
Will my account get banned? Possibly β read the warning under Reporting a problem. Use a throwaway account on its own IP if you are testing.
Why isn't Cordial on Flathub? Flathub's generative-AI policy excludes it β
Cordial's commit history is honest about being AI-assisted, and that puts it on
the wrong side of the policy. Detail: docs/install.md.
Why isn't there an AUR package yet? The PKGBUILDs are ready; AUR account
sign-ups are currently closed. Install the release .pkg.tar.zst instead.
Can two accounts run at once? Yes β two profiles, two instances, side by
side, each about 1.5 GB. docs/status.md.
Can browser Play choose the matching account? Yes, through whichever saved sign-in backend Cordial selected β see browser account routing.
How do I change FastFlags or the graphics backend?
docs/fastflags.md.
Can I hide the game title bar without fullscreen? Yes β choose Hidden in the title-bar settings.
My controller shows the wrong button icons. A known, unsolved mapping
problem β every button still works. docs/controllers.md.
Can I install a plugin someone sent me? Yes, from a .tar.zst archive via
Settings β Get Plugins β there is no plugin store yet.
docs/plugins.md.
Something's broken. Read the engine's log first (see When something goes wrong), then file an issue with a Diagnostics block.
Three ship with Cordial and you already have them. Open Settings and go to Plugins; they are listed there whether or not you have ever installed anything.
| What it does | On by default | |
|---|---|---|
| FPS Flex | Stops drawing being pinned to your display's refresh β the same lever as Frame pacing in Settings, not a second one. Off by default: uncapping presentation makes your GPU draw frames nobody asked for, which on a laptop is heat and battery. | No |
| Discord Presence | Shows on your Discord profile what you are playing. Ships but is not yet wired to a running client β docs/rich-presence.md. |
No |
| Flag Inspector | Logs which FastFlags are in effect and where each came from. A diagnostic, not a feature. | No |
Nothing runs until you enable it, and a plugin only gets the permissions you approve, per profile β approving something in a test profile does not approve it in the one you actually play on.
Plugins run on Deno
(ADR-008); Cordial offers
to fetch a pinned copy if none is on PATH. Installing one you were sent, and
writing your own: docs/plugins.md,
plugins/README.md; the capability model is
ADR-007.
Start with docs/NEXT.md β written for someone picking the
project up cold, and plain about what is broken. The full index of design
notes, ADRs and analyses is docs/README.md;
CHANGELOG.md and the
releases page have what
changed between versions.
Sober, VinegarHQ's client, is the reason anyone believes a Roblox client
can run natively on Linux, and Cordial owes it three specific debts: its
issue tracker is a research corpus read before
investigating any user-facing bug (ADR-017);
watching it run corrected a claim made here about text input
(docs/analysis/sober-input-stack.md);
and it was how everybody here got a Roblox build before Cordial could fetch
its own. Sober's code was never read β it is not source-available, and
what was used is a public issue tracker and the observable behaviour of a
running program, the same class of evidence as watching any program work.
mocktail, komaruworld's client, is Apache-2.0; where its ideas are adapted
they are credited in NOTICE and named at the point of use β the web
view's security rules are theirs. AGDK GameActivity is also Apache-2.0,
which is why the activity, surface, input and IME contract could be read
rather than guessed at.
- Roblox ships a complete x86-64 Android build β
split_config.x86_64.apkcarries 116 MB of x86-64 machine code (NDK r28c), so Cordial needs no CPU architecture translation, only feature emulation. - The runtime surface is bounded: 13 Android libraries linked, 644 undefined
symbols, GLES2 + EGL mandatory with Vulkan
dlopened as an optional upgrade. - Roblox's game surface is AGDK
GameActivity, Apache-2.0, so it could be read rather than inferred.
Full analysis: docs/findings.md.
No in-process code execution against the Roblox process: no hooking, no memory patching, no injected script environment. Not "disabled by default" β absent from the API vocabulary, so there is no injection primitive in the binary to extract. Reasoning in ADR-001.
Also out: client-side integrity flags or watermarks, and obfuscation-as-security.
GPL-3.0-or-later. See LICENSE.
Third-party components keep their own licences and notices, reproduced in
THIRD-PARTY-NOTICES.md and installed alongside the
binary by the Flatpak:
third_party/libbadcpuβ MIT, vendored from Sober OSSmcpelauncher-linkerβ MIT, ChristopherHX and MCMrARM- AOSP bionic, carried within it β Apache-2.0 and BSD
libjnivmβ MIT, ChristopherHX
MIT and Apache-2.0 are satisfied while the combined work is offered under the GPL, provided those notices travel with it. That is a condition, not a courtesy.
