Highlights
- Keyring unlock after biometric login. Save your login password once in the app; it is checked against
/etc/shadow, sealed with the TPM, and used to unlock GNOME Keyring / KWallet after a face or fingerprint login on the login screen. Opt-in via the PAMauthtokoption. See docs/Keyring.md. (#241, refs #87) - Camera profiles with stable paths. Cameras are saved as
/dev/v4l/by-id/by-pathlinks instead of/dev/videoN, and you can define an ordered list of{camera, IR camera}profiles — the first one present is used, so docking/undocking no longer breaks face unlock. Cameras are labelled by USB interface, maker and port. (#240, closes #177) - More cameras supported.
- Direct V4L2 fallback for devices libcamera does not list (custom DKMS drivers like gc2607, v4l2loopback). (#237, closes #142)
- NV12 / NV21 / YUV420 decoding, and the IR sensor can be used as the main camera. (#236, closes #109)
- SoftISP cameras (IPU6/MIPI) via packed RGB and the simple pipeline. (#185, #169)
- PAM prompts: scanner-active prompt and a covered-camera message. (#184, #82)
Security & reliability
- PAM: the helper runs under a fixed deadline below the PAM timeout and is killed through a pidfd if stuck; fails closed on argument or auth errors; exits
PAM_IGNOREwhen no method could run. (#202, #203, #207) - The helper reads config, models and enrolled faces, and writes logs and debug images, as the user, not root. (#196, #200)
- Config is parsed atomically and validated; out-of-range retry, delay, timeout and threshold values are clamped or rejected. (#204, #205)
- Fingerprint: bounded fprintd calls, VerifyStatus pinned to fprintd's unique name, no C++ exceptions across FFI. (#201, #211)
- Face/camera: bounds-checked image and MJPEG sizes, safer libcamera buffer handling, fail closed on invalid anti-spoof output. (#198, #206, #208)
- App: strict CSP, webview permission requests denied, HTTPS-only and hash-pinned model downloads, private data directory. (#209, #212, #213)
- ONNX Runtime telemetry disabled.
Improvements
- Camera prefers MJPEG, caps RGB size, picks the brightest of N IR frames. (#183, #168, #116)
- MiniFASv2 gets the context crop it was trained on; AI anti-spoofing is off by default. (#186, #182)
- The colour camera and anti-spoofing model are opened once per auth session. (#225)
- Face preview runs off the main thread and starts/stops once per state. (#210, #214)
- Bundled libcamera no longer links libcrypto/gnutls. (#181, #176)
Packaging
- Bundled libraries are found through RUNPATH instead of
ld.so.conf.d. (#226) - The PAM profile is refreshed on deb upgrade and removed from
common-authon uninstall. (#226, #228) - Dropped
curlfrom deb depends.
Internal
- Config types and Tauri bindings generated from Rust with specta. (#227)
- Large refactors of face auth, camera capture and app settings; new C++ (ctest), Rust and TS (bun test) unit tests. (#195, #215–#219, #223, #224, #229)
- Dependency updates. (#234)
Full Changelog: 1.4.2...1.5.0