Introducing ArchJoyHide: HidHide for Linux
Why
If you've ever played Elden Ring with a set of rudder pedals plugged in, you know the pain. The game picks up your HOTAS as a controller, menus start scrolling on their own, and your only option has been to crawl under your desk and unplug things.
On Windows, a tool called HidHide solved this years ago. It lets you hide specific USB input devices from games while keeping them visible to the ones that actually need them — your flight sims, your space sims, whatever. On Linux, nothing like it existed.
So I built one.
What It Does
ArchJoyHide hides USB input devices at the kernel level using eBPF. You pick a device — say, your rudder pedals — and set rules for which games can see it. Two modes:
- Whitelist: The device is invisible to everything except the games you specify. Your rudder only shows up in DCS and Star Citizen, and nowhere else.
- Blacklist: The device works everywhere except specific games. Hide your HOTAS from Elden Ring but leave it alone for everything else.
Rules persist across reboots. Set it once and forget about it.
How It Works Under the Hood
The core is an eBPF LSM program that hooks into the kernel's file_open path. When any process tries to open a device node like /dev/input/event5, the BPF program checks: is this device restricted? Is this process allowed? If not, it gets back ENODEV — as far as the game is concerned, the device doesn't exist.
A background process watcher handles Wine and Proton games automatically. This was the tricky part. When DCS runs through Proton, the process that actually reads your joystick isn't DCS.exe — it's winedevice.exe, a shared Wine service process that's a sibling in the process tree, not a child. The watcher detects your game launching, walks up the process tree to find the Wine/Proton root, then grants or denies access to the entire tree. The BPF fork tracepoint handles any new child processes that spawn after that.
No kernel module. No DKMS. Just eBPF, which means it works across kernel updates without rebuilding anything.
The GUI
I wanted this to be something you could hand to someone who doesn't want to touch a terminal. The app shows your connected devices with a dropdown for each — Off, Whitelist, or Blacklist. Click "+ Add App", browse to the game's .exe file on disk, apply, done. It sits in your system tray and watches for game launches in the background.
There's a CLI too if that's your thing. archjh whitelist 231d:011f /path/to/DCS.exe and you're set.
Requirements
Any recent Linux kernel with BPF LSM enabled. CachyOS and most Arch-based distros have this out of the box. You can check with:
cat /sys/kernel/security/lsm
If bpf is in the list, you're good.
Install
If you're on Arch or CachyOS:
yay -S archjh
sudo systemctl enable --now archjh
archjh
Or clone it and build from source:
git clone https://github.com/defconxt/ArchJoyHide.git
cd ArchJoyHide
sudo ./install.sh
The systemd service loads the BPF programs at boot and applies your saved rules automatically. The GUI is just for configuration.
What's Next
This is v1.0. It works, I've been using it daily with my VKB stick, throttle, and rudder pedals. There are things I want to improve — better handling of devices that get plugged in after rules are applied, maybe a way to auto-detect Steam game libraries for easier setup. But the core functionality is solid and it solves the problem I built it for.
If you're a sim player on Linux dealing with input device conflicts, give it a try. Bug reports and contributions welcome on GitHub.
The Repo
It's public: github.com/defconxt/ArchJoyHide
AUR: archjh