/blog/2026-07-03_elgato-facecam.md
Elgato Facecam on Arch Linux
I've had an Elgato Facecam for a couple of years now, mainly using it with a MacBook Pro. Elgato's Camera Hub app is the expected way to tune things like field of view, brightness, color balance, ISO and shutter speed and it's officially supported on Windows and macOS, but not Linux. Here's how I got full control of the camera on my Arch Linux (GNOME/Wayland) system.
The hardware
The Facecam shows up as a fairly unassuming UVC (USB Video Class) device:
Bus 004 Device 002: ID 0fd9:0078 Elgato Facecam
Out of the box it works fine as a plain webcam. uvcvideo binds to it,
video streams, and any app that just wants a camera is happy. The problem
is controlling it. FOV, brightness, ISO, color balance, and other
settings live behind Elgato's proprietary UVC extension unit, which isn't
exposed through the standard v4l2 controls. It's a fixed-focus camera,
so at least autofocus tuning isn't something I need to worry about.
udev permissions
The first step was making sure userspace could actually talk to the raw USB device, not just the video stream node. I added a udev rule:
# /etc/udev/rules.d/99-elgato-facecam.rules
SUBSYSTEM=="usb", ATTR{idVendor}=="0fd9", ATTR{idProduct}=="0078", MODE="0666"
This grants world read/write on the device node whenever the Facecam is plugged in. I originally added it so that Windows apps running under Proton could get raw USB access to the device, which turned out to be necessary but not sufficient.
Camera Hub under Proton
My first real attempt at controlling the camera was to run Elgato's Windows app through Proton. I set it up as a non-Steam shortcut using GE-Proton11-1, with Camera Hub.exe as the app.
This almost worked. The raw USB device was accessible to the Wine process thanks to the udev rule above, but Camera Hub never actually found the physical Facecam. The reason turned out to be a driver-model mismatch rather than a permissions problem. On Windows, Camera Hub expects the OS to auto-bind a WinUSB-class driver to the camera's control interface, separate from the video streaming interface, and Wine has no real equivalent of that auto-binding mechanism. The only thing that installed successfully was Camera Hub's own virtual camera driver, which was irrelevant since I already had a real camera and just wanted to configure it.
So Proton could see the USB device, but the app itself could never enumerate it as a controllable Facecam, and I abandoned this path.
cameractrls
The real fix was to stop trying to emulate Windows and use a native
Linux tool built specifically for UVC extension-unit controls,
cameractrls
(hu.irl.cameractrls).
$ sudo pacman -S cameractrls
It talks to the Facecam's vendor-specific UVC extension unit directly,
through the normal uvcvideo driver. No Wine, no Proton, no virtual
driver layer, just the Elgato-specific controls exposed through a CLI and
a GUI.
The settings it writes are saved to the camera's onboard flash memory, the same as Camera Hub does on Windows, so this isn't a runtime workaround that needs to be reapplied on every boot. Set it once, and the camera remembers.
If you're trying to do the same thing, skip the Proton detour and go straight to cameractrls. It does everything Camera Hub does, natively, with no compatibility layer required.