{"id":52051533,"url":"https://github.com/GunduLabs/gaze","last_synced_at":"2026-08-03T21:00:31.716Z","repository":{"id":341707753,"uuid":"1165080329","full_name":"GunduLabs/gaze","owner":"GunduLabs","description":"Facial authentication for Linux","archived":false,"fork":false,"pushed_at":"2026-07-28T00:54:13.000Z","size":1838,"stargazers_count":279,"open_issues_count":9,"forks_count":10,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-28T02:12:29.986Z","etag":null,"topics":["authentication","biometrics","face-recognition","linux","pam"],"latest_commit_sha":null,"homepage":"https://gaze.gundulabs.com","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/GunduLabs.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-02-23T20:00:17.000Z","updated_at":"2026-07-28T02:10:10.000Z","dependencies_parsed_at":null,"dependency_job_id":"4e4b91f7-5275-4366-9d9c-92bfa50bb4e6","html_url":"https://github.com/GunduLabs/gaze","commit_stats":null,"previous_names":["gundulabs/gaze"],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/GunduLabs/gaze","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GunduLabs%2Fgaze","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GunduLabs%2Fgaze/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GunduLabs%2Fgaze/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GunduLabs%2Fgaze/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/GunduLabs","download_url":"https://codeload.github.com/GunduLabs/gaze/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GunduLabs%2Fgaze/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":36251377,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-07-20T02:08:10.276Z","status":"online","status_checked_at":"2026-08-03T02:00:06.975Z","response_time":56,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["authentication","biometrics","face-recognition","linux","pam"],"created_at":"2026-08-02T14:00:24.589Z","updated_at":"2026-08-03T21:00:31.708Z","avatar_url":"https://github.com/GunduLabs.png","language":"Rust","funding_links":[],"categories":["Rust","Libraries"],"sub_categories":["Authentication"],"readme":"\u003cdiv align=\"center\"\u003e\n\n\u003cimg src=\"packaging/gui/com.gundulabs.Gaze.svg\" alt=\"Gaze icon\" width=\"120\" /\u003e\n\n# Gaze\n\n**Facial authentication for Linux**\n\n[![CI](https://github.com/gundulabs/gaze/actions/workflows/ci.yml/badge.svg)](https://github.com/gundulabs/gaze/actions/workflows/ci.yml)\n[![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](LICENSE)\n\n[Documentation](https://gaze.gundulabs.com) · [Install](https://gaze.gundulabs.com/guide/installation) · [Development](https://gaze.gundulabs.com/guide/development)\n\n\u003c/div\u003e\n\n---\n\n\u003e [!NOTE]\n\u003e Gaze includes local liveness anti-spoofing and support for infrared (IR) cameras to secure authentication against spoofing attacks. For high-security environments, it is recommended to keep standard system authentication active as a fallback.\n\nFacial authentication for Linux with on-device face recognition, PAM integration, and tools for login, lock screen, sudo, and desktop management.\n\n## Install\n\n```bash\ncurl -fsSL https://gaze.gundulabs.com/install.sh | sh\n```\n\nThe installer installs the Gaze daemon, CLI, and GUI. It installs the GNOME Shell extension only when it detects a GNOME desktop session; on KDE Plasma and other non-GNOME desktops it skips GNOME-specific packages so it does not pull in GNOME Shell. If you installed the GNOME extension manually or automatic enablement was not possible, reboot (so GNOME Shell scans the new extension) and then run from GNOME:\n\n```bash\ngnome-extensions enable gaze@gundulabs.com\ngsettings set org.gnome.shell.extensions.gaze enable-face-authentication true\n```\n\n\u003e Running `gnome-extensions enable` before rebooting will return `Extension \"gaze@gundulabs.com\" does not exist`. Shell only rescans extension directories at session start.\n\n\u003cdetails\u003e\n\u003csummary\u003eManual install (Debian/Ubuntu, Fedora and compatible DNF systems, Arch/Manjaro/CachyOS)\u003c/summary\u003e\n\n**Debian / Ubuntu**\n\nEach apt suite carries only the builds for that release: `noble` (Ubuntu 24.04), `questing` (Ubuntu 25.10), `resolute` (Ubuntu 26.04), `trixie` (Debian 13).\n\n```bash\nsudo mkdir -p --mode=0755 /usr/share/keyrings\ncurl -fsSL https://packages.gundulabs.com/keys/gundulabs-repo.gpg \\\n  | sudo tee /usr/share/keyrings/gundulabs-archive-keyring.gpg \u003e/dev/null\nsuite=\"$(. /etc/os-release \u0026\u0026 echo \"${VERSION_CODENAME:-$UBUNTU_CODENAME}\")\"\necho \"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/gundulabs-archive-keyring.gpg] https://packages.gundulabs.com/deb $suite main\" \\\n  | sudo tee /etc/apt/sources.list.d/gundulabs.list \u003e/dev/null\nsudo apt update\nsudo apt install gaze gaze-gui\n```\n\n**Fedora and compatible DNF systems**\n\n```bash\nsudo rpm --import https://packages.gundulabs.com/keys/gundulabs-repo.asc\nsudo tee /etc/yum.repos.d/gundulabs.repo \u003e/dev/null \u003c\u003c'EOF'\n[gundulabs]\nname=Gundu Labs\nbaseurl=https://packages.gundulabs.com/rpm/fedora/$releasever/$basearch\nenabled=1\ngpgcheck=1\nrepo_gpgcheck=1\ngpgkey=https://packages.gundulabs.com/keys/gundulabs-repo.asc\nEOF\nsudo dnf makecache\nsudo dnf install gaze gaze-gui\n```\n\n**Fedora via Copr** (alternative to the repository above; do not enable both)\n\n```bash\nsudo dnf install dnf-plugins-core\nsudo dnf copr enable @gundulabs/gaze\nsudo dnf install gaze gaze-gui\n```\n\n**Arch / Manjaro / CachyOS**\n\n```bash\n# Requires an AUR helper such as yay or paru. yay shown here.\nyay -S --needed gaze-bin gaze-gui-bin\n```\n\n**Flatpak (GUI only; also install one of the system packages above for the `gazed` daemon)**\n\n```bash\nflatpak install --from https://packages.gundulabs.com/flatpak/com.gundulabs.Gaze.flatpakref\n```\n\nFor GNOME lock screen face unlock after manual package installation, also install `gaze-gnome-extension` (`gaze-gnome-extension-bin` on Arch), reboot, then from your GNOME session run `gnome-extensions enable gaze@gundulabs.com` and `gsettings set org.gnome.shell.extensions.gaze enable-face-authentication true`. On KDE Plasma, use the base packages and follow the PAM guide for login/lock integration.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eNix / NixOS (flake)\u003c/summary\u003e\n\nThe repo is a Nix flake with packages (`gaze`, `gaze-gui`, `gaze-gnome-extension`) and a NixOS module that configures the daemon, D-Bus/polkit, and PAM declaratively:\n\n```nix\n# flake.nix inputs\ninputs.gaze.url = \"github:GunduLabs/gaze\";\n\n# NixOS configuration\nimports = [ inputs.gaze.nixosModules.default ];\nservices.gaze = {\n  enable = true;\n  gui.enable = true;\n};\n```\n\nSee the [Nix \u0026 NixOS guide](https://gaze.gundulabs.com/guide/nixos) for module options, GNOME lock screen setup, hyprlock, and home-manager usage.\n\n\u003c/details\u003e\n\nAfter installation (any method), reboot once to ensure all system-level changes are fully applied.\n\n```bash\nsudo reboot\n```\n\n## Quick start\n\n```bash\n# Enroll your face\ngaze add-face default\n\n# Test authentication\ngaze auth\n\n# Or use the GUI\ngaze-gui\n```\n\n## How it works\n\nGaze runs a daemon (`gazed`) that communicates over DBus. When authentication is requested (by PAM at login, the GNOME extension on the lock screen, or the CLI), the daemon captures a frame from your webcam, detects and aligns the face, computes an embedding using an ONNX model, and compares it against stored enrollments.\n\nAll processing happens locally. Face embeddings are stored on disk, not transmitted anywhere.\n\n```\nCamera → Face Detection (SCRFD) → Alignment → Embedding (ArcFace) → Match → Liveness (MiniFASNet-V2)\n```\n\n## Components\n\n| Component | Description |\n|-----------|-------------|\n| `gazed` | System daemon exposing `com.gundulabs.Gaze` on DBus |\n| `gaze` | CLI for enrollment and authentication (crate: `gaze-cli`) |\n| `gaze-gui` | GTK4/Adwaita graphical application |\n| `pam-gaze` | PAM module for login/lock screen integration |\n| `gaze-gnome-extension` | GNOME Shell extension for lock screen auth |\n| `gaze-hyprlock` | PAM service for hyprlock face unlock on Hyprland |\n\n## Configuration\n\n```toml\n# /etc/gaze/config.toml\n[inference]\nexecution_provider = \"cpu\" # cpu | openvino (requires an OpenVINO build)\ndevice = \"cpu\"             # cpu | gpu | npu\n\n[security]\nlevel = \"medium\"    # low | medium | high | maximum | custom\n\n[cameras]\nrgb = \"primary\"\ndark_luma_threshold = 20\n\n[auth]\nabort_if_ssh = true\nabort_if_lid_closed = true\n\n[enrollment]\nmax_templates = 2\nmin_face_size_ratio = 0.25\n\n[liveness]\nenabled = true\nthreshold = 0.8\n```\n\nOpenVINO selects its device at run time. An OpenVINO-enabled installation\nshould use `execution_provider = \"openvino\"` and `device = \"npu\"` to select the\nIntel NPU. The same binary can select the Intel GPU by changing `device` to\n`\"gpu\"`. The released packages are CPU-only; OpenVINO requires building from\nsource with `just build-rust-openvino`.\n\nSee the [configuration guide](https://gaze.gundulabs.com/guide/configuration) for all options.\n\n## CLI usage\n\n```\ngaze add-face \u003cname\u003e         Enroll a new face\ngaze refine-face \u003cname\u003e      Add samples to an existing enrollment\ngaze auth                    Authenticate\ngaze auth --verbose          Authenticate with detailed metrics\ngaze auth --silent           Authenticate silently (exit code only)\ngaze list-faces              List enrolled faces\ngaze rename-face \u003cold\u003e \u003cnew\u003e Rename a face\ngaze remove-face \u003cname\u003e      Remove a face\ngaze clear-user              Remove all face data for current user\ngaze config                  Interactive configuration editor\ngaze config --show           Print current config and exit\ngaze doctor                  Check config, daemon, cameras, enrollments, PAM, and TPM\ngaze doctor --benchmark      Also measure detector/recognizer/liveness inference speed\ngaze uninstall               Completely remove Gaze (packages, PAM, config, models, data)\ngaze uninstall -y            Skip confirmation prompt\n```\n\nEnrollment first captures a straight-on reference, then asks for small up, down,\nleft, and right movements relative to that reference.\n\n## Building from source\n\n**Dependencies:** Rust 1.85+, [`just` 1.51+](https://github.com/casey/just), [`nfpm`](https://nfpm.goreleaser.com)\n\n```bash\n# Ubuntu/Debian\nsudo apt install build-essential pkg-config clang libclang-dev \\\n  libopencv-dev libv4l-dev libpam0g-dev \\\n  libgtk-4-dev libadwaita-1-dev \\\n  libcairo2-dev libglib2.0-dev libgdk-pixbuf-2.0-dev libpango1.0-dev libgraphene-1.0-dev \\\n  libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev\n\n# Build\njust build-rust\n\n# Build with OpenVINO support (requires an OpenVINO-enabled system ONNX Runtime)\njust build-rust-openvino\n\n# Package\njust package \u003cdeb | rpm | archlinux\u003e\n```\n\nSee the [development guide](https://gaze.gundulabs.com/guide/development) for more.\n\n## License\n\nGaze is free software licensed under the [GNU General Public License, version 3 or later](LICENSE) (`GPL-3.0-or-later`).\n\n```\nGaze - Facial authentication for Linux\nCopyright (C) 2026 Gundu Labs \u003cmaintainers@gundulabs.com\u003e\n\nThis program is free software: you can redistribute it and/or modify it under\nthe terms of the GNU General Public License as published by the Free Software\nFoundation, either version 3 of the License, or (at your option) any later\nversion.\n\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY\nWARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A\nPARTICULAR PURPOSE. See the GNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License along with\nthis program. If not, see \u003chttps://www.gnu.org/licenses/\u003e.\n```\n\nContributions are accepted under the same license.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FGunduLabs%2Fgaze","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FGunduLabs%2Fgaze","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FGunduLabs%2Fgaze/lists"}