Omarchy plugin · io.github.ayandexyz.glance

Face unlock.
For Omarchy logo Omarchy.

Arch · Hyprland · PAM · MIT licensed

Lock screen · scan · unlock

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 anywhere
    Embeddings are encrypted at rest with AES-256-GCM. The unlock path never sees your login password.
  • →
    Injects no keystrokes
    Authorizes the session through PAM, not by typing into a password field.
  • →
    Needs no input-injection rights
    Nothing types into a password field on your behalf, so there is no stored login password to protect.
  • →
    Works without the shell
    Unlock 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.

Bar widget

Live status — armed, disarmed, scanning, locked — rendered in the top bar alongside the rest of your shell.

Control panel

Arm, disarm, run a test scan. Tells you which of enroll and setup-pam is still missing.

Lock screen capsule

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

Deny

One big flat specular blob (glass) rather than the small scattered shine of skin.

Device detected

Deny

A device-shaped rectangle overlaps the face.

Flat vs 3D

Confirm

Held-out nose points miss the best-fit homography — the face has depth.

Depth / pose

Confirm

Nose offset tracks head yaw at a magnitude only a real nose produces.

Blink

Confirm

Eye aspect ratio dipped and recovered during the scan.

Light mode

Runs the deny cues only. "Confirmed unless proven wrong" — never blocks a user who happens to sit still.

Heavy mode

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.

  1. 01
    Add the plugin
    omarchy plugin add https://github.com/ayandexyz/omarchy-glance.git --enable

    Omarchy clones it and asks you to confirm before it does.

  2. 02
    Create the venv
    python3 -m venv ~/.local/share/glance

    The one place the panel looks for the daemon on its own.

  3. 03
    Install the daemon
    ~/.local/share/glance/bin/pip install --require-hashes \
        -r ~/.config/omarchy/plugins/io.github.ayandexyz.glance/glanced-*.lock

    The 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.

  4. 04
    Set up
    ~/.local/share/glance/bin/glancectl setup

    Models, user service, PAM and the lock-screen indicator, behind one sudo prompt.

  5. 05
    Restart the shell
    omarchy-restart-shell

    Loads the lock-screen indicator — only needed once, right after setup.

  6. 06
    Enroll
    Glance panel → Enroll

    Your 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