Omarchy plugin · io.github.ayandexyz.glance
Face unlock.
For
Omarchy.
Arch · Hyprland · PAM · MIT licensed
Recorded on Omarchy. The capsule is the lock screen's own indicator; the sphere is the success beat.
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 pairs a five-cue liveness model with a Linux-native unlock path.
And Linux is the right platform for this: 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 input-injection rightsNothing types into a password field on your behalf, so there is no stored login password to protect.
- →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.
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
One command to face unlock.
Step by step, or one command — either way you click Enroll in the panel yourself, since enrolling needs your face and a passphrase you choose, and that is not something a command should do for you. Read the script before you pipe it into a shell.
- 01Add the plugin
omarchy plugin add https://github.com/ayandexyz/omarchy-glance.git --enableOmarchy clones it and asks you to confirm before it does.
- 02Create the venv
python3 -m venv ~/.local/share/glanceThe one place the panel looks for the daemon on its own.
- 03Install the daemon
~/.local/share/glance/bin/pip install --require-hashes \ -r ~/.config/omarchy/plugins/io.github.ayandexyz.glance/glanced-*.lockThe glob picks up whatever version the plugin ships — every package in it pinned to an exact version and SHA-256, so a substituted or tampered download fails the install instead of running.
- 04Set up
~/.local/share/glance/bin/glancectl setupModels, user service, PAM and the lock-screen indicator, behind one sudo prompt.
- 05Restart the shell
omarchy-restart-shellLoads the lock-screen indicator — only needed once, right after setup.
- 06Enroll
Glance panel → EnrollYour face and a passphrase you choose
Keep a root TTY open.
When wiring
pam_glance, a broken PAM
stack locks you out of your own machine.
Uninstall. Takes Glance out of PAM before deleting anything, restores the stock lock screen, and removes the service, the plugin and your enrollment. Read the script.
curl -fsSL https://www.glancelinux.website/uninstall.sh | bash 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. Face recognition uses the ArcFace model from InsightFace.
io.github.ayandexyz.glance · Arch · Hyprland · PAM