Windows Hello-style face authentication for Linux, built for KDE Plasma.
⚠️ Work in progress. Linux Hello is under active development and not yet ready for daily use. Expect breaking changes, missing features and rough edges.
Linux Hello unlocks your screen, authenticates sudo and polkit prompts with your face, no terminal configuration required. It is a fork of Howdy by boltgolt, rebuilt as a zero-config alternative: install it, open the GUI, enroll your face, done.
- Zero configuration: cameras are auto-detected (IR first), the darkness threshold adapts to your lighting automatically, and sane defaults are used everywhere.
- "Linux Hello" GUI app: a Qt desktop app that looks and feels native on KDE Plasma. Setup wizard, model management, settings and a live camera test, all without touching a terminal.
- PAM integration: face authentication for KDE lock screen, login, sudo, su and polkit. Toggle per-service from the GUI.
- Pluggable recognition backends: dlib on CPU, optional Intel OpenVINO acceleration on iGPU, behind a common interface.
- WebAuthn (experimental): a virtual FIDO2 platform authenticator that lets your face unlock passkey logins in the browser.
- GPL-3.0 licensed, forever free and open source.
| Area | State |
|---|---|
| PAM face authentication | Working (requires dlib + models) |
| Camera auto-detection | Working |
| Qt GUI (setup, settings, models, test) | Working, UI polish ongoing |
| KDE integration | PAM services wired; lock-screen UI integration planned |
| WebAuthn authenticator | Experimental, off by default |
| Packaging | Debian + Arch (unofficial), untested on real systems |
Python dependencies (OpenCV, dlib, PySide6) can be shipped inside a self-contained runtime, see Building from source. There are no release tarballs yet, so for now this repository is for development, testing and review.
There are two ways to build. The bundled runtime ships its own CPython plus every Python dependency; the system Python build uses your distro's interpreter and packages. Both produce the same PAM module, CLI and GUI.
All builds need: a C++20 compiler, meson (>= 0.60), ninja, pkg-config,
gettext (translations) and the headers for libpam, libevdev and
inih/INIReader.
The bundled runtime additionally needs curl (or wget), tar, python3,
cmake and network access: dlib is compiled from source against the bundled
interpreter (no CUDA, no GUI layer), and every download is SHA256-pinned in
tools/runtime-manifest.json.
Arch / CachyOS:
sudo pacman -S --needed base-devel meson ninja gettext pkgconf \
libevdev libinih cmake curl ccacheDebian / Ubuntu:
sudo apt install build-essential meson ninja-build gettext pkg-config \
libpam0g-dev libevdev-dev libinih-dev cmake curl python3Fedora:
sudo dnf install gcc-c++ meson ninja-build gettext pkgconf-pkg-config \
pam-devel libevdev-devel inih-devel cmake curl python3Bundled runtime: none from your repositories. No python3-opencv, no
python3-dlib, no python3-pyside6, no pip. The cost is ~400 MB of installed
size and immunity to interpreter upgrades on the target machine. The GUI still
uses the system X11/Wayland client libraries, which any desktop install already
has (libxcb, libxcb-cursor, libxkbcommon, libwayland-client, mesa).
System Python build needs distro packages instead:
# Debian / Ubuntu
sudo apt install python3-opencv python3-dlib python3-numpy \
python3-pyside6 python3-fido2 python3-cryptography
# Arch / CachyOS
sudo pacman -S --needed python-opencv python-dlib python-numpy \
python-pyside6 python-fido2 python-cryptographypython3-pyside6 is only needed for the GUI, python3-fido2 +
python3-cryptography only for WebAuthn.
Bundled runtime (recommended):
tools/build_runtime.sh --outdir build-runtime
meson setup build -Dbundled_python_dir="$(pwd)/build-runtime/linux-hello-runtime"
ninja -C build
sudo ninja -C build installSystem Python:
meson setup build
ninja -C build
sudo ninja -C build installOther build options (see meson.options for the full list):
meson configure build -Dwith_webauthn=false -Dinstall_config=falseHandy follow-ups:
ninja -C build && sudo ninja -C build install # rebuild after editing
sudo ninja -C build uninstall # remove again
sudo systemctl daemon-reload # see the Polkit note belowAfter installing, run the GUI app Linux Hello (or linux-hello-cli from a
terminal) to enroll your face, then enable the PAM services you want from the
settings page.
- ASUS laptops with Sonix IR cameras (USB ID
3277:0018): the IR emitter is controlled by the laptop's proximity sensor, not a UVC control. The feed looks black until a person approaches. Do not runlinux-enable-ir-emitter configureon these; it can wedge the USB bus and require a hard reboot (boltgolt/howdy#1109). The IR LED sits in the RGB camera cutout, so a privacy shutter can dim the IR feed. - ThinkPad X1 Nano: IR camera reports Y800 grayscale at 640x360 on
/dev/video2; auto dark-threshold detection handles the high baseline (boltgolt/howdy#1113). - ThinkPad X1 Yoga / Carbon (Chicony): if the emitter never lights up,
the
chicony-ir-toggletool orlinux-enable-ir-emittercan enable it persistently. - SELinux-enforcing systems (Fedora): the display manager domain
(
xdm_t) needsmappermission on/dev/video*or camera open fails only in GDM/lock-screen contexts (boltgolt/howdy#1117). - Polkit >= 127: the agent helper is sandboxed without device access; we
ship a systemd drop-in that re-enables camera access. If prompts still
fail, make sure the drop-in
/usr/lib/systemd/system/polkit-agent-helper@.service.d/10-linux-hello.confis installed and runsystemctl daemon-reload. - Hardware camera kill switches are detected as a missing camera and fail gracefully back to password auth.
Linux Hello is a fork of Howdy by boltgolt (MIT-licensed; see NOTICE).