Omarchy plugin · ayande.glance
Face unlock.
For
Omarchy.
Arch · Hyprland · PAM · MIT licensed
Why
The gap Howdy left open.
Howdy already does face unlock on Arch. Its well-known weakness is that it has essentially no liveness detection — a printed photo can unlock it. Glance ports the five-cue liveness model from upstream Glance into a Linux-native unlock path.
And Linux is a better platform for this than macOS: PAM lets the
unlock authorize the session directly, the same interface
sudo and
hyprlock use.
- →Stores no password anywhereEmbeddings are encrypted at rest with AES-256-GCM. The unlock path never sees your login password.
- →Injects no keystrokesAuthorizes the session through PAM, not by typing into a password field.
- →Needs no accessibility permissionThe macOS version requires input-injection rights to type the stored password. Glance Linux doesn't.
- →Works without the shellUnlock lives in PAM and hyprlock's stack. The plugin is presentation only — it can never influence an unlock.
Omarchy integration
A plugin that knows what it can do.
The Omarchy plugin is QML, runs inside the shell, and ships a bar
widget plus a control panel. It can show state and run commands as
you. It cannot install a PAM module, edit
/etc/pam.d, or ship a
Python daemon.
So a plugin alone can't deliver face unlock. The intended shape is
a package plus one enroll, one
setup-pam, and the plugin
that ties them together.
Live status — armed, disarmed, scanning, locked — rendered in the top bar alongside the rest of your shell.
Arm, disarm, run a test scan. Tells you which of
enroll and
setup-pam is still missing.
Face ID-style pill drawn into the lock plugin, with a live camera view while it scans.
Liveness
Five cues.
No overall score.
Upstream arrived at this after real-device testing killed an earlier design that averaged ~11 signals into a weighted score: most were noise-limited at webcam resolution, several actively rewarded the smooth motion of a hand holding up a phone, and the resulting number wandered 30–80% on a live face while a phone photo scored about the same.
Only five cues separate a real face from a phone, and each is individually decisive. Averaging them is exactly the wrong combination rule.
Gloss / glare
DenyOne big flat specular blob (glass) rather than the small scattered shine of skin.
Device detected
DenyA device-shaped rectangle overlaps the face.
Flat vs 3D
ConfirmHeld-out nose points miss the best-fit homography — the face has depth.
Depth / pose
ConfirmNose offset tracks head yaw at a magnitude only a real nose produces.
Blink
ConfirmEye aspect ratio dipped and recovered during the scan.
Runs the deny cues only. "Confirmed unless proven wrong" — never blocks a user who happens to sit still.
Also requires a confirm cue. Can fail to unlock a motionless, unblinking live user. That cost is pinned in a test so it is never mistaken for a regression.
Setup
Four commands to face unlock.
Run
packaging/install.sh first
to lay down the user service and the plugin symlink, then enroll,
wire PAM, and enable the plugin.
- 01Install
packaging/install.shUser service + plugin symlink
- 02Enroll
glancectl enroll --name "$USER" --remember5 captures, sets the passphrase
- 03Wire PAM
glancectl setup-pamsudo step — keep a root TTY open
- 04Enable plugin
omarchy plugin enable ayande.glanceBar widget + control panel
Keep a root TTY open.
When wiring
pam_glance, a broken PAM
stack locks you out of your own machine.
Caveat
Still not Face ID.
A webcam sees a flat 2D image; an iPhone builds a 3D depth map. The liveness cues here defeat a printed photo and a photo on a phone screen with reasonable confidence. They do not reliably defeat a video of you. Glance is a convenience feature, not a security upgrade.
glancectl selftest drives
the real decision logic against synthetic faces and prints every
cue's reading with no camera involved.
glancectl live does the
same against real frames.
Open source
Completely open-source.
MIT licensed. Built on top of the liveness model from Glance (macOS, MIT © Jonathan Zhou) and the ArcFace recognition model from InsightFace.
ayande.glance · Arch · Hyprland · PAM