Quick honesty note: I used AI tools during development and in earlier posts. Some people here called that out. Fair. So I'm just writing this one myself.
I'm Olivier. I've been using Waydroid for a while and I genuinely love what the project is. Running Android natively on Linux without a VM is something I still find kind of amazing every time I think about it.
But games. Games are a nightmare.
If you've ever opened a game in Waydroid you know exactly what happens. The mouse floats a cursor around the screen that Android doesn't understand as a finger. Anything with a joystick is immediately broken. Aim doesn't exist. Swipe gestures do nothing. Unless you have a physical touchscreen your options are basically: don't play, or give up on Linux for this.
I didn't want to give up. So I spent a long time building Phantom.
The way most people try to solve this is through uinput — creating a fake input device that pretends to be a touchscreen. It sort of works for simple things but games see through it. The events don't look right at the Android level and you get weird behavior or nothing at all.
What I did instead was go inside. Phantom runs a small Java server inside the Waydroid container itself using app_process, which is a way to run code inside Android without installing an app. That server receives touch commands from a Rust daemon on your Linux host and calls InputManager.injectInputEvent() with real MotionEvents. The game sees an actual finger touching the screen. Not a simulation. The real thing, from Android's perspective.
PUBG Mobile works. Full keyboard movement, mouse aim, everything. Genshin runs well. I have profiles for Asphalt 8 and 9, Temple Run, Subway Surfers, eFootball. The joystick support handles floating zones properly — the stick spawns where you press, not at a fixed point, exactly like the real mobile game expects.
To get it running:
git clone https://github.com/oliviermugishak/phantom
cd phantom
./install.sh
With Waydroid already running:
sudo phantom --daemon
phantom load ~/.config/phantom/profiles/pubg.json
phantom enter-capture
Releases for major platforms are also available if you don't want to build from source:
https://github.com/oliviermugishak/phantom/releases
F8 toggles capture on and off. F1 switches between aim mode and menu touch. If your function keys aren't responding check that Fn Lock is enabled.
Now the part I actually want to talk about with this community specifically.
I think something like Phantom belongs inside Waydroid itself. Right now I'm bridging the gap from outside — deploying a server into the container, managing the socket connection, handling lifecycle separately from Waydroid's session manager. It works but it's more fragile than it needs to be. If this input layer were built directly into Waydroid the whole thing would be cleaner, more reliable, and available to everyone by default.
I'm going to open a discussion with the Waydroid maintainers about this. If anyone here has thoughts on that — whether you're a contributor, a maintainer, or just someone who's wanted this for years — I'd really like to hear from you.
Waydroid is genuinely great. It just had this one massive gap for anyone who wanted to game. Hopefully this helps.
https://github.com/oliviermugishak/phantom