<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Aven</title>
    <description>The latest articles on DEV Community by Aven (@johnraivenolazo).</description>
    <link>https://dev.to/johnraivenolazo</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3955109%2F54398aa9-d1f9-4339-889a-7f7942a53437.png</url>
      <title>DEV Community: Aven</title>
      <link>https://dev.to/johnraivenolazo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/johnraivenolazo"/>
    <language>en</language>
    <item>
      <title>Facenox: Offline-first Face Recognition for Real-Time Attendance Tracking. Got Stuck for Months. This Challenge Finally Made Me Ship.</title>
      <dc:creator>Aven</dc:creator>
      <pubDate>Sun, 07 Jun 2026 11:04:49 +0000</pubDate>
      <link>https://dev.to/johnraivenolazo/facenox-offline-first-face-recognition-for-real-time-attendance-tracking-got-stuck-for-months-3omg</link>
      <guid>https://dev.to/johnraivenolazo/facenox-offline-first-face-recognition-for-real-time-attendance-tracking-got-stuck-for-months-3omg</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/github-2026-05-21"&gt;GitHub Finish-Up-A-Thon Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Around June 2025, I built a face recognition attendance system in my terminal. It worked with just python command to draw janky bounding boxes. It was laggy and unusable.&lt;br&gt;
  &lt;iframe src="https://www.youtube.com/embed/k8tUIOfIFI8"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;I knew no one would ever run a Python script in the real world. So I rewrote it. Then rewrote it again. Then spent 8 months telling myself "one more refactor" before showing it to anyone. I experimented with everything: Haar Cascade, YOLOv8n, then SCRFD. YuNet and EdgeFace replaced the old stack... A custom ONNX anti-spoofing model replaced MediaPipe. Electron + React replaced the terminal. AES-256-GCM replaced pickle files. The architecture grew from 200 lines to 50,000+ lines of code over the span of a year!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0hod4usw0h8na9k6frig.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0hod4usw0h8na9k6frig.png" alt="Meme pic" width="671" height="712"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;p&gt;Me telling myself "it's just one tiny architectural change" for the 14th consecutive month.&lt;/p&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I know what you're thinking: &lt;strong&gt;"Classic case of severe over-engineering."&lt;/strong&gt; And you're 100% right. I got so caught up in making the local AI architecture "flawless" that I completely froze.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqhcvaoejw7xaowzcmpy4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqhcvaoejw7xaowzcmpy4.png" alt="Commit History" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I never shipped. Perfectionism had me stuck at 80% for months.&lt;br&gt;
The GitHub Finish-Up-A-Thon deadline finally broke the loop. Today I'm pushing Facenox Desktop v1.0.0-beta.1. My first ever beta release after a year of building in silence.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8mokk9643ffqd2vn9s5x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8mokk9643ffqd2vn9s5x.png" alt="Release pic" width="800" height="403"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa7174di6ze99n9bjn6oq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa7174di6ze99n9bjn6oq.png" alt="Release pic 2" width="800" height="357"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;



&lt;p&gt;Offline-first face recognition for real-time attendance tracking. No cloud biometric matching. No vendor hardware. No internet required. No raw photos stored. Only encrypted face codes that cannot be reversed.&lt;/p&gt;

&lt;p&gt;Most traditional systems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❌ &lt;strong&gt;Cloud-Dependent:&lt;/strong&gt; Store your biometric data on someone else's servers.&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;Proprietary:&lt;/strong&gt; Require expensive, vendor-locked hardware or scanners.&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;Fragile:&lt;/strong&gt; Stop working entirely the moment the internet goes down.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Facenox flips the script.&lt;/strong&gt; All AI inference and biometric matching stays 100% local. It's encrypted at rest with AES-256-GCM and runs flawlessly on any standard webcam (built-in, USB, or capture card).&lt;/p&gt;

&lt;p&gt;Just Download. Install. Point a camera at people. That's it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🏢 &lt;strong&gt;Note:&lt;/strong&gt; Unlike typical consumer desktop utilities, Facenox is architected as a local-first B2B solution. It’s designed to run on-premise for businesses, environments, or organizations that need enterprise-grade biometric tracking without leaking data to third-party cloud vendors.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Facenox Desktop is fully open-source under the AGPL-3.0 license. You can download the installer, grab the latest release, or build it directly from source.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🌐 &lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="https://facenox.com" rel="noopener noreferrer"&gt;facenox.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🐙 &lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/facenox" rel="noopener noreferrer"&gt;
        facenox
      &lt;/a&gt; / &lt;a href="https://github.com/facenox/facenox" rel="noopener noreferrer"&gt;
        facenox
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Offline-first face recognition for real-time attendance tracking.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/facenox/facenox/docs/assets/header.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Ffacenox%2Ffacenox%2FHEAD%2Fdocs%2Fassets%2Fheader.png" alt="Facenox - Offline-first Face Recognition Software" width="100%"&gt;&lt;/a&gt;
&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;
  &lt;a href="https://github.com/facenox/facenox/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/8e5928ae8e4b3e3689154aa7eaa21e845a82d0d12579cc9865bcfea13187a3e4/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4147504c2d2d332e302d6135616462373f7374796c653d666c6174266c6f676f3d676974266c6f676f436f6c6f723d663266356637266c6162656c436f6c6f723d306431313137" alt="License"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/facenox/facenox/releases" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/152fd65aba7c1df5d0fb6e5ce6b2677783dcd98bc25cd3d018162bf4d1543892/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f666163656e6f782f666163656e6f783f7374796c653d666c6174266c6f676f3d676974266c6f676f436f6c6f723d663266356637266c6162656c436f6c6f723d30643131313726636f6c6f723d303839316232" alt="Version"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/facenox/facenox/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/b6192fab4c94888eeba5954ce1599077466001db4c97915ff05656ce7717676b/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f666163656e6f782f666163656e6f783f7374796c653d666c6174266c6f676f3d676974687562266c6f676f436f6c6f723d663266356637266c6162656c436f6c6f723d30643131313726636f6c6f723d323264336565" alt="Stars"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/sponsors/facenox" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/5cf6ae5fad793eef0c946af586a8d6061b4fa547f4e101471a6656fc0006a220/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f73706f6e736f722d2545322539442541342d6666386138613f7374796c653d666c6174266c6f676f3d6769746875622d73706f6e736f7273266c6f676f436f6c6f723d663266356637266c6162656c436f6c6f723d306431313137" alt="Sponsor"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
  &lt;strong&gt;Facenox is offline-first face recognition software for real-time attendance tracking.&lt;/strong&gt;&lt;br&gt;
  Built for privacy: Biometric templates are end-to-end encrypted (E2EE)
&lt;/p&gt;

&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/facenox/facenox/docs/assets/screenshots/02-face-recognition-live.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Ffacenox%2Ffacenox%2FHEAD%2Fdocs%2Fassets%2Fscreenshots%2F02-face-recognition-live.png" alt="Facenox Desktop UI - Active Scan" width="100%"&gt;&lt;/a&gt;
&lt;/p&gt;




&lt;div class="markdown-alert markdown-alert-caution"&gt;
&lt;p class="markdown-alert-title"&gt;Caution&lt;/p&gt;
&lt;p&gt;This is the official open source repository for Facenox. Treat other repositories, installers, and downloads as unverified unless they come from official sources.&lt;/p&gt;
&lt;/div&gt;

&lt;div class="markdown-alert markdown-alert-note"&gt;
&lt;p class="markdown-alert-title"&gt;Note&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Privacy First:&lt;/strong&gt; Facenox processes face detection, tracking, and template matching locally. Encrypted face templates can optionally sync between your devices, with decryption keys stored exclusively on your paired hardware.&lt;/p&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why Facenox&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;Most face recognition systems rely on cloud-based biometrics. Facenox doesn't. Biometric matching stays local on the desktop.&lt;/p&gt;

&lt;p&gt;&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;br&gt;
&lt;thead&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;br&gt;
&lt;th&gt;Facenox&lt;/th&gt;
&lt;br&gt;
&lt;th&gt;Cloud-Based Systems&lt;/th&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;/thead&gt;
&lt;br&gt;
&lt;tbody&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;&lt;strong&gt;Data Residency&lt;/strong&gt;&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;Encrypted End-to-End with Optional Cross-Device Sync&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;Remote Cloud&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;&lt;strong&gt;Internet Dependency&lt;/strong&gt;&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;Mandatory&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;&lt;strong&gt;Latency&lt;/strong&gt;&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;Real-time&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;Network Dependent&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;&lt;strong&gt;Privacy Risk&lt;/strong&gt;&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;Minimized&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;/tbody&gt;
&lt;br&gt;
&lt;/table&gt;&lt;/div&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local Biometrics:&lt;/strong&gt; Face detection, ByteTrack subject tracking, and ONNX liveness verification.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-Platform:&lt;/strong&gt; Native support for Windows, macOS, and Linux.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consent-Aware:&lt;/strong&gt; Built-in support for biometric enrollment and deletion consent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subject Management:&lt;/strong&gt; Full…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/facenox/facenox" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/WW_a35yNA7A"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Desktop App Screenshots &amp;amp; Features
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Main Panel
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh7mov7ctq70s2ihdcof7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh7mov7ctq70s2ihdcof7.png" alt="Main Panel" width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Live Panel View (Demo)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff3g2gpbivvojhfjub6dn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff3g2gpbivvojhfjub6dn.png" alt="Live Panel View" width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Overview
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcb5l9xqafz99ft2dp1d6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcb5l9xqafz99ft2dp1d6.png" alt="Overview" width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Reports Management &amp;amp; Export
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhmb43ek3p4qt3uzgz7qv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhmb43ek3p4qt3uzgz7qv.png" alt="Reports" width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Adding Member &amp;amp; Enrollment
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1weyj2oxfdvn62z43wpo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1weyj2oxfdvn62z43wpo.png" alt="Members" width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  General
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fguis1kyvzyojr02x4qrd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fguis1kyvzyojr02x4qrd.png" alt="General" width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Security
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyemg99az3qton359lr68.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyemg99az3qton359lr68.png" alt="Security" width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Database
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5xnt8zwl457wgvea4hyv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5xnt8zwl457wgvea4hyv.png" alt="Database" width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Backup &amp;amp; Restore
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F93c07wdo3v8h4k7m68yu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F93c07wdo3v8h4k7m68yu.png" alt="Backup &amp;amp; Restore" width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Comeback Story
&lt;/h2&gt;

&lt;p&gt;The original prototype was 200 lines of Python that technically worked but fell apart the moment you tried to use it in a real room — bad lighting, side profiles, someone holding a photo of the person they're impersonating. It wasn't a product. It was a proof of concept I was too afraid to show to anyone.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Prototype (2025)&lt;/th&gt;
&lt;th&gt;Now&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Interface&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CLI / Terminal (&lt;code&gt;python main.py&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Electron + React Desktop App&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Face Detection&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Haar Cascade / YOLOv8n&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Yunet&lt;/strong&gt; (Optimized for edge detection)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Recognition Model&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;DeepFace&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;EdgeFace&lt;/strong&gt; (Optimized for local CPU/GPU)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Anti-Spoofing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;MediaPipe (Lacked depth check)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Custom ONNX Model&lt;/strong&gt; (Liveness detection)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data Storage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Python &lt;code&gt;.pickle&lt;/code&gt; files (Unsecure)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;AES-256-GCM&lt;/strong&gt; Encrypted Local DB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Codebase Size&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~200 lines&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;50,000+ lines&lt;/strong&gt; (1,700+ commits)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I spent months buried in rabbit holes. Optimizing my AI implementation architecture. Replacing DeepFace with EdgeFace for better accuracy. Building a custom ONNX anti-spoofing model &lt;a href="https://github.com/facenox/face-antispoof-onnx" rel="noopener noreferrer"&gt;face-antispoof-onnx&lt;/a&gt; because MediaPipe couldn't handle real-world spoofing, phones, printed photos, screen reflections. That liveness problem alone took weeks of pre-processing datas, ONNX export debugging, and temporal fusion tuning to get right.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I shared a raw demo of this custom liveness detection mechanism on LinkedIn, and the post completely blew up!!!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6njmmhcpskq3c4xjsfns.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6njmmhcpskq3c4xjsfns.png" alt="LinkedIn Video" width="683" height="812"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyrxv80id7we24wam9v1y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyrxv80id7we24wam9v1y.png" alt="LinkedIn Video Analytics" width="710" height="759"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Seeing hundreds of developers validate the architecture and obsess over the local edge performance was the exact spark I needed. It made me realize that people actually wanted this technology.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://www.linkedin.com/posts/johnraivenolazo_machinelearning-computervision-opensource-ugcPost-7410731871363317760-C7Mu/?utm_source=share&amp;amp;amp%3Butm_medium=member_desktop&amp;amp;amp%3Brcm=ACoAAEReCoUBpHFGCFuXrJTv5mUYHqlFs0FPHDg" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdms.licdn.com%2Fplaylist%2Fvid%2Fv2%2FD5605AQEfhbakq3t91g%2Fthumbnail-with-play-button-overlay-high%2FB56Ztg1q.eGwDM-%2F0%2F1766856246290%3Fe%3D2147483647%26v%3Dbeta%26t%3DgD_NxpbX8JgZUpM3Y1qQjvVSgLczEzL_w_CHzwXmKw0" height="720" class="m-0" width="720"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://www.linkedin.com/posts/johnraivenolazo_machinelearning-computervision-opensource-ugcPost-7410731871363317760-C7Mu/?utm_source=share&amp;amp;amp%3Butm_medium=member_desktop&amp;amp;amp%3Brcm=ACoAAEReCoUBpHFGCFuXrJTv5mUYHqlFs0FPHDg" rel="noopener noreferrer" class="c-link"&gt;
            Improving Face Anti-Spoofing with Miniface | John Raiven Olazo posted on the topic | LinkedIn
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            I thought fixing this would be a quick weekend task. 𝗜 𝘄𝗮𝘀 𝘄𝗿𝗼𝗻𝗴.

While building an AI-powered attendance system, I ran into a 𝗺𝗮𝘀𝘀𝗶𝘃𝗲 𝘀𝗲𝗰𝘂𝗿𝗶𝘁𝘆 𝗵𝗼𝗹𝗲: it was way too easy to trick the camera just by holding up a photo or a phone screen.

I quickly realized that generic models like MobileNetV4 aren't built for security, they're built for recognition. To solve this, I had to dive deep into face anti-spoofing and eventually ditched the "all-rounders" for 𝗠𝗶𝗻𝗶𝗙𝗔𝗦.

This is a specialized architecture that actually understands the difference between a human face and a piece of paper.

The breakdown:

Tiny but accurate: The model is only 𝟲𝟬𝟬𝗞𝗕. Despite the size, it hits ~𝟵𝟴% 𝗮𝗰𝗰𝘂𝗿𝗮𝗰𝘆 on the CelebA benchmark (70k+ samples).
Texture-based logic: Instead of just looking at facial features, it uses 𝗙𝗼𝘂𝗿𝗶𝗲𝗿 𝗧𝗿𝗮𝗻𝘀𝗳𝗼𝗿𝗺 𝗹𝗼𝘀𝘀 to detect the microscopic texture patterns of real skin versus printed paper or digital pixels.
Runs on a "literal potato": I used INT8 quantization so it can run anywhere. No GPU or expensive cloud server is needed. and as a proof, I tested it on a 2011 laptop. Even on a 𝟭𝟰-𝘆𝗲𝗮𝗿-𝗼𝗹𝗱 𝗖𝗣𝗨, it handles inference in 𝘂𝗻𝗱𝗲𝗿 𝟮𝟬𝗺𝘀 thanks to INT8 quantization. No expensive cloud server required.

I’ve decoupled this from my main project, train it from scratch and 𝗼𝗽𝗲𝗻-𝘀𝗼𝘂𝗿𝗰𝗲𝗱 it as a standalone security layer. If you're building an app that uses a camera and needs lightweight liveness detection, feel free to use it.

𝗖𝗼𝗻𝘁𝗿𝗶𝗯𝘂𝘁𝗶𝗼𝗻𝘀 𝗮𝗿𝗲 𝘄𝗲𝗹𝗰𝗼𝗺𝗲! If you’re a CV researcher, or just someone who knows a better way to handle liveness detection, I’d love to see your input.

𝗿𝗲𝗽𝗼: https://lnkd.in/gPZSrMbT

#MachineLearning #ComputerVision #OpenSource #Python #CyberSecurity #AI | 47 comments on LinkedIn
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fstatic.licdn.com%2Faero-v1%2Fsc%2Fh%2Fal2o9zrvru7aqj8e1x2rzsrca" width="64" height="64"&gt;
          linkedin.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;But the hardest part wasn't the ML. It was realizing that no matter how accurate the model was, people weren't going to run python inference.py in a terminal anyway. So I scrapped everything and started over with Electron + React. Then scrapped that architecture and rewrote it again. And again.&lt;/p&gt;

&lt;p&gt;1700+ commits. 50,000+ lines. One year of building in silence.&lt;br&gt;
The Finish-Up-A-Thon didn't make me build Facenox. It made me stop hiding it.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Experience with GitHub Copilot
&lt;/h2&gt;

&lt;p&gt;Copilot handled the grunt work.&lt;br&gt;
Whenever I needed to write schemas for the sync contract between the desktop app and dashboard, Copilot would infer the types from my existing interfaces and generate the validation layer in seconds. Same with Pydantic models. I just described what I wanted, and it wrote the boilerplate.&lt;/p&gt;

&lt;p&gt;The Tailwind classes? I'd type the layout intent, Copilot would autocomplete the utility chain. Framer Motion animations? It remembered the exact spring configs I always forget. Writing test files for the FastAPI endpoints and the WebSocket pipeline went from tedious to fast! Copilot saw the pattern after two examples and filled in the rest. It caught inconsistencies I would have missed.&lt;/p&gt;

&lt;p&gt;Copilot kept me in flow state by destroying the boilerplate, while I focused entirely on the high-level architecture. The pipeline orchestration, system integrations, encryption layer, and WebSocket frame protocol—those required human architectural decisions. Copilot made sure I spent my engineering cycles there instead of reading Electron IPC docs or debugging Tailwind layouts for the 50th time.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>githubchallenge</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Facenox: Offline-first Face Recognition for Real-Time Attendance Tracking. Got Stuck for Months. This Challenge Finally Made Me Ship.</title>
      <dc:creator>Aven</dc:creator>
      <pubDate>Sun, 07 Jun 2026 10:18:42 +0000</pubDate>
      <link>https://dev.to/johnraivenolazo/facenox-offline-first-face-recognition-for-real-time-attendance-tracking-got-stuck-for-months-409c</link>
      <guid>https://dev.to/johnraivenolazo/facenox-offline-first-face-recognition-for-real-time-attendance-tracking-got-stuck-for-months-409c</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/github-2026-05-21"&gt;GitHub Finish-Up-A-Thon Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Around June 2025, I built a face recognition attendance system in my terminal. It worked with just python command to draw janky bounding boxes. It was laggy and unusable.&lt;br&gt;
  &lt;iframe src="https://www.youtube.com/embed/k8tUIOfIFI8"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;I knew no one would ever run a Python script in the real world. So I rewrote it. Then rewrote it again. Then spent 8 months telling myself "one more refactor" before showing it to anyone. I experimented with everything: Haar Cascade, YOLOv8n, then SCRFD. YuNet and EdgeFace replaced the old stack... A custom ONNX anti-spoofing model replaced MediaPipe. Electron + React replaced the terminal. AES-256-GCM replaced pickle files. The architecture grew from 200 lines to 50,000+ lines of code over the span of a year!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0kilchncnz1d2pok7c9t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0kilchncnz1d2pok7c9t.png" alt=" " width="671" height="712"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;p&gt;Me telling myself "it's just one tiny architectural change" for the 14th consecutive month.&lt;/p&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I know what you're thinking: &lt;strong&gt;"Classic case of severe over-engineering."&lt;/strong&gt; And you're 100% right. I got so caught up in making the local AI architecture "flawless" that I completely froze.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6lpxdyy1y5gltk979f5i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6lpxdyy1y5gltk979f5i.png" alt=" " width="800" height="287"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I never shipped. Perfectionism had me stuck at 80% for months.&lt;br&gt;
The GitHub Finish-Up-A-Thon deadline finally broke the loop. Today I'm pushing Facenox Desktop v1.0.0-beta.1. My first ever beta release after a year of building in silence.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frxl6nt1dtmelksrxk7sm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frxl6nt1dtmelksrxk7sm.png" alt=" " width="800" height="572"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;Offline-first face recognition for real-time attendance tracking. No cloud biometric matching. No vendor hardware. No internet required. No raw photos stored. Only encrypted face codes that cannot be reversed.&lt;/p&gt;

&lt;p&gt;Most traditional systems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❌ &lt;strong&gt;Cloud-Dependent:&lt;/strong&gt; Store your biometric data on someone else's servers.&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;Proprietary:&lt;/strong&gt; Require expensive, vendor-locked hardware or scanners.&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;Fragile:&lt;/strong&gt; Stop working entirely the moment the internet goes down.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Facenox flips the script.&lt;/strong&gt; All AI inference and biometric matching stays 100% local. It's encrypted at rest with AES-256-GCM and runs flawlessly on any standard webcam (built-in, USB, or capture card).&lt;/p&gt;

&lt;p&gt;Just Download. Install. Point a camera at people. That's it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🏢 &lt;strong&gt;Note:&lt;/strong&gt; Unlike typical consumer desktop utilities, Facenox is architected as a local-first B2B solution. It’s designed to run on-premise for businesses, environments, or organizations that need enterprise-grade biometric tracking without leaking data to third-party cloud vendors.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Facenox Desktop is fully open-source under the AGPL-3.0 license. You can download the installer, grab the latest release, or build it directly from source.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🌐 &lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="https://facenox.com" rel="noopener noreferrer"&gt;facenox.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🐙 &lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/facenox" rel="noopener noreferrer"&gt;
        facenox
      &lt;/a&gt; / &lt;a href="https://github.com/facenox/facenox" rel="noopener noreferrer"&gt;
        facenox
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Offline-first face recognition for real-time attendance tracking.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/facenox/facenox/docs/assets/header.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Ffacenox%2Ffacenox%2FHEAD%2Fdocs%2Fassets%2Fheader.png" alt="Facenox - Offline-first Face Recognition Software" width="100%"&gt;&lt;/a&gt;
&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;
  &lt;a href="https://github.com/facenox/facenox/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/8e5928ae8e4b3e3689154aa7eaa21e845a82d0d12579cc9865bcfea13187a3e4/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4147504c2d2d332e302d6135616462373f7374796c653d666c6174266c6f676f3d676974266c6f676f436f6c6f723d663266356637266c6162656c436f6c6f723d306431313137" alt="License"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/facenox/facenox/releases" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/152fd65aba7c1df5d0fb6e5ce6b2677783dcd98bc25cd3d018162bf4d1543892/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f666163656e6f782f666163656e6f783f7374796c653d666c6174266c6f676f3d676974266c6f676f436f6c6f723d663266356637266c6162656c436f6c6f723d30643131313726636f6c6f723d303839316232" alt="Version"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/facenox/facenox/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/b6192fab4c94888eeba5954ce1599077466001db4c97915ff05656ce7717676b/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f666163656e6f782f666163656e6f783f7374796c653d666c6174266c6f676f3d676974687562266c6f676f436f6c6f723d663266356637266c6162656c436f6c6f723d30643131313726636f6c6f723d323264336565" alt="Stars"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/sponsors/facenox" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/5cf6ae5fad793eef0c946af586a8d6061b4fa547f4e101471a6656fc0006a220/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f73706f6e736f722d2545322539442541342d6666386138613f7374796c653d666c6174266c6f676f3d6769746875622d73706f6e736f7273266c6f676f436f6c6f723d663266356637266c6162656c436f6c6f723d306431313137" alt="Sponsor"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
  &lt;strong&gt;Facenox is offline-first face recognition software for real-time attendance tracking.&lt;/strong&gt;&lt;br&gt;
  Built for privacy: Biometric templates are end-to-end encrypted (E2EE)
&lt;/p&gt;

&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/facenox/facenox/docs/assets/screenshots/02-face-recognition-live.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Ffacenox%2Ffacenox%2FHEAD%2Fdocs%2Fassets%2Fscreenshots%2F02-face-recognition-live.png" alt="Facenox Desktop UI - Active Scan" width="100%"&gt;&lt;/a&gt;
&lt;/p&gt;




&lt;div class="markdown-alert markdown-alert-caution"&gt;
&lt;p class="markdown-alert-title"&gt;Caution&lt;/p&gt;
&lt;p&gt;This is the official open source repository for Facenox. Treat other repositories, installers, and downloads as unverified unless they come from official sources.&lt;/p&gt;
&lt;/div&gt;

&lt;div class="markdown-alert markdown-alert-note"&gt;
&lt;p class="markdown-alert-title"&gt;Note&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Privacy First:&lt;/strong&gt; Facenox processes face detection, tracking, and template matching locally. Encrypted face templates can optionally sync between your devices, with decryption keys stored exclusively on your paired hardware.&lt;/p&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why Facenox&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;Most face recognition systems rely on cloud-based biometrics. Facenox doesn't. Biometric matching stays local on the desktop.&lt;/p&gt;

&lt;p&gt;&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;br&gt;
&lt;thead&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;br&gt;
&lt;th&gt;Facenox&lt;/th&gt;
&lt;br&gt;
&lt;th&gt;Cloud-Based Systems&lt;/th&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;/thead&gt;
&lt;br&gt;
&lt;tbody&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;&lt;strong&gt;Data Residency&lt;/strong&gt;&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;Encrypted End-to-End with Optional Cross-Device Sync&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;Remote Cloud&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;&lt;strong&gt;Internet Dependency&lt;/strong&gt;&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;Mandatory&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;&lt;strong&gt;Latency&lt;/strong&gt;&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;Real-time&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;Network Dependent&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;&lt;strong&gt;Privacy Risk&lt;/strong&gt;&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;Minimized&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;/tbody&gt;
&lt;br&gt;
&lt;/table&gt;&lt;/div&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local Biometrics:&lt;/strong&gt; Face detection, ByteTrack subject tracking, and ONNX liveness verification.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-Platform:&lt;/strong&gt; Native support for Windows, macOS, and Linux.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consent-Aware:&lt;/strong&gt; Built-in support for biometric enrollment and deletion consent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subject Management:&lt;/strong&gt; Full…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/facenox/facenox" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/WW_a35yNA7A"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;📸 &lt;b&gt;View Desktop App Screenshots &amp;amp; Features&lt;/b&gt;&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Main panel
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvqdvzwu2b03co9wkpqq2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvqdvzwu2b03co9wkpqq2.png" alt=" " width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Live View (Demo)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxbn0n3aotv08uwq1dquw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxbn0n3aotv08uwq1dquw.png" alt=" " width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Overview
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdthh29p7cqxgqmbagidb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdthh29p7cqxgqmbagidb.png" alt=" " width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Reports Management &amp;amp; Export
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fct3pf8zqebci4fw5xhx4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fct3pf8zqebci4fw5xhx4.png" alt=" " width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Adding Member &amp;amp; Enrollment
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6dgpu3pd609aqgn4dag5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6dgpu3pd609aqgn4dag5.png" alt=" " width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  General Settings
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbvwh1v9yz83gv8dabjma.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbvwh1v9yz83gv8dabjma.png" alt=" " width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Security &amp;amp; Encryption
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6380zvechrc85swek46g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6380zvechrc85swek46g.png" alt=" " width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Local Database
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiy3kepr5m4o4wqbcpw3s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiy3kepr5m4o4wqbcpw3s.png" alt=" " width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Comeback Story
&lt;/h2&gt;

&lt;p&gt;The original prototype was 200 lines of Python that technically worked but fell apart the moment you tried to use it in a real room — bad lighting, side profiles, someone holding a photo of the person they're impersonating. It wasn't a product. It was a proof of concept I was too afraid to show to anyone.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Prototype (2025)&lt;/th&gt;
&lt;th&gt;Facenox Desktop v1.0.0-beta&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Interface&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CLI / Terminal (&lt;code&gt;python main.py&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Electron + React Desktop App&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Face Detection&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Haar Cascade / YOLOv8n&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Yunet&lt;/strong&gt; (Optimized for edge detection)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Recognition Model&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;DeepFace&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;EdgeFace&lt;/strong&gt; (Optimized for local CPU/GPU)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Anti-Spoofing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;MediaPipe (Lacked depth check)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Custom ONNX Model&lt;/strong&gt; (Liveness detection)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data Storage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Python &lt;code&gt;.pickle&lt;/code&gt; files (Unsecure)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;AES-256-GCM&lt;/strong&gt; Encrypted Local DB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Codebase Size&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~200 lines&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;50,000+ lines&lt;/strong&gt; (1,700+ commits)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I spent months buried in rabbit holes. Optimizing my AI implementation architecture. Replacing DeepFace with EdgeFace for better accuracy. Building a custom ONNX anti-spoofing model &lt;a href="https://github.com/facenox/face-antispoof-onnx" rel="noopener noreferrer"&gt;face-antispoof-onnx&lt;/a&gt; because MediaPipe couldn't handle real-world spoofing, phones, printed photos, screen reflections. That liveness problem alone took weeks of pre-processing datas, ONNX export debugging, and temporal fusion tuning to get right.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I actually shared a raw demo of this custom liveness detection mechanism on LinkedIn, and the post completely blew up!!!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F35vygmyv9b3fepdd6tjx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F35vygmyv9b3fepdd6tjx.png" alt=" " width="681" height="808"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhpji1pcm17293gsw0wos.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhpji1pcm17293gsw0wos.png" alt=" " width="678" height="732"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Seeing hundreds of developers validate the architecture and obsess over the local edge performance was the exact spark I needed. It made me realize that people actually wanted this technology.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://www.linkedin.com/embed/feed/update/urn:li:ugcPost:7410731871363317760?compact=1" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdms.licdn.com%2Fplaylist%2Fvid%2Fv2%2FD5605AQEfhbakq3t91g%2Fthumbnail-with-play-button-overlay-high%2FB56Ztg1q.eGwDM-%2F0%2F1766856246290%3Fe%3D2147483647%26v%3Dbeta%26t%3DgD_NxpbX8JgZUpM3Y1qQjvVSgLczEzL_w_CHzwXmKw0" height="720" class="m-0" width="720"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://www.linkedin.com/embed/feed/update/urn:li:ugcPost:7410731871363317760?compact=1" rel="noopener noreferrer" class="c-link"&gt;
            Improving Face Anti-Spoofing with Miniface | John Raiven Olazo posted on the topic | LinkedIn
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            I thought fixing this would be a quick weekend task. 𝗜 𝘄𝗮𝘀 𝘄𝗿𝗼𝗻𝗴.

While building an AI-powered attendance system, I ran into a 𝗺𝗮𝘀𝘀𝗶𝘃𝗲 𝘀𝗲𝗰𝘂𝗿𝗶𝘁𝘆 𝗵𝗼𝗹𝗲: it was way too easy to trick the camera just by holding up a photo or a phone screen.

I quickly realized that generic models like MobileNetV4 aren't built for security, they're built for recognition. To solve this, I had to dive deep into face anti-spoofing and eventually ditched the "all-rounders" for 𝗠𝗶𝗻𝗶𝗙𝗔𝗦.

This is a specialized architecture that actually understands the difference between a human face and a piece of paper.

The breakdown:

Tiny but accurate: The model is only 𝟲𝟬𝟬𝗞𝗕. Despite the size, it hits ~𝟵𝟴% 𝗮𝗰𝗰𝘂𝗿𝗮𝗰𝘆 on the CelebA benchmark (70k+ samples).
Texture-based logic: Instead of just looking at facial features, it uses 𝗙𝗼𝘂𝗿𝗶𝗲𝗿 𝗧𝗿𝗮𝗻𝘀𝗳𝗼𝗿𝗺 𝗹𝗼𝘀𝘀 to detect the microscopic texture patterns of real skin versus printed paper or digital pixels.
Runs on a "literal potato": I used INT8 quantization so it can run anywhere. No GPU or expensive cloud server is needed. and as a proof, I tested it on a 2011 laptop. Even on a 𝟭𝟰-𝘆𝗲𝗮𝗿-𝗼𝗹𝗱 𝗖𝗣𝗨, it handles inference in 𝘂𝗻𝗱𝗲𝗿 𝟮𝟬𝗺𝘀 thanks to INT8 quantization. No expensive cloud server required.

I’ve decoupled this from my main project, train it from scratch and 𝗼𝗽𝗲𝗻-𝘀𝗼𝘂𝗿𝗰𝗲𝗱 it as a standalone security layer. If you're building an app that uses a camera and needs lightweight liveness detection, feel free to use it.

𝗖𝗼𝗻𝘁𝗿𝗶𝗯𝘂𝘁𝗶𝗼𝗻𝘀 𝗮𝗿𝗲 𝘄𝗲𝗹𝗰𝗼𝗺𝗲! If you’re a CV researcher, or just someone who knows a better way to handle liveness detection, I’d love to see your input.

𝗿𝗲𝗽𝗼: https://lnkd.in/gPZSrMbT

#MachineLearning #ComputerVision #OpenSource #Python #CyberSecurity #AI | 47 comments on LinkedIn
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fstatic.licdn.com%2Faero-v1%2Fsc%2Fh%2Fal2o9zrvru7aqj8e1x2rzsrca" width="64" height="64"&gt;
          linkedin.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;But the hardest part wasn't the ML. It was realizing that no matter how accurate the model was, people weren't going to run python inference.py in a terminal anyway. So I scrapped everything and started over with Electron + React. Then scrapped that architecture and rewrote it again. And again.&lt;/p&gt;

&lt;p&gt;1700+ commits. 50,000+ lines. One year of building in silence.&lt;br&gt;
The Finish-Up-A-Thon didn't make me build Facenox. It made me stop hiding it.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Experience with GitHub Copilot
&lt;/h2&gt;

&lt;p&gt;Copilot handled the grunt work.&lt;br&gt;
Whenever I needed to write schemas for the sync contract between the desktop app and dashboard, Copilot would infer the types from my existing interfaces and generate the validation layer in seconds. Same with Pydantic models. I just described what I wanted, and it wrote the boilerplate.&lt;/p&gt;

&lt;p&gt;The Tailwind classes? I'd type the layout intent, Copilot would autocomplete the utility chain. Framer Motion animations? It remembered the exact spring configs I always forget. Writing test files for the FastAPI endpoints and the WebSocket pipeline went from tedious to fast! Copilot saw the pattern after two examples and filled in the rest. It caught inconsistencies I would have missed.&lt;/p&gt;

&lt;p&gt;Copilot kept me in flow state by destroying the boilerplate, while I focused entirely on the high-level architecture. The pipeline orchestration, system integrations, encryption layer, and WebSocket frame protocol—those required human architectural decisions. Copilot made sure I spent my engineering cycles there instead of reading Electron IPC docs or debugging Tailwind layouts for the 50th time.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>githubchallenge</category>
      <category>ai</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Facenox: Offline-first Face Recognition for Real-Time Attendance Tracking. Got Stuck at 80% for Months. This Challenge Finally Made Me Ship.</title>
      <dc:creator>Aven</dc:creator>
      <pubDate>Sat, 06 Jun 2026 20:33:29 +0000</pubDate>
      <link>https://dev.to/johnraivenolazo/i-built-an-offline-first-face-recognition-for-real-time-attendance-tracking-then-got-stuck-at-80-3dob</link>
      <guid>https://dev.to/johnraivenolazo/i-built-an-offline-first-face-recognition-for-real-time-attendance-tracking-then-got-stuck-at-80-3dob</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/github-2026-05-21"&gt;GitHub Finish-Up-A-Thon Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Around June 2025, I built a face recognition attendance system in my terminal. It worked with just python command to draw janky bounding boxes. It was laggy and unusable.&lt;br&gt;
  &lt;iframe src="https://www.youtube.com/embed/k8tUIOfIFI8"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;I knew no one would ever run a Python script in the real world. So I rewrote it. Then rewrote it again. Then spent 8 months telling myself "one more refactor" before showing it to anyone. I experimented with everything: Haar Cascade, YOLOv8n, then SCRFD. YuNet and EdgeFace replaced the old stack... A custom ONNX anti-spoofing model replaced MediaPipe. Electron + React replaced the terminal. AES-256-GCM replaced pickle files. The architecture grew from 200 lines to 50,000+ lines of code over the span of a year!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0kilchncnz1d2pok7c9t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0kilchncnz1d2pok7c9t.png" alt=" " width="671" height="712"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;p&gt;Me telling myself "it's just one tiny architectural change" for the 14th consecutive month.&lt;/p&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I know what you're thinking: &lt;strong&gt;"Classic case of severe over-engineering."&lt;/strong&gt; And you're 100% right. I got so caught up in making the local AI architecture "flawless" that I completely froze.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6lpxdyy1y5gltk979f5i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6lpxdyy1y5gltk979f5i.png" alt=" " width="800" height="287"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I never shipped. Perfectionism had me stuck at 80% for months.&lt;br&gt;
The GitHub Finish-Up-A-Thon deadline finally broke the loop. Today I'm pushing Facenox Desktop v1.0.0-beta.1. My first ever beta release after a year of building in silence.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frxl6nt1dtmelksrxk7sm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frxl6nt1dtmelksrxk7sm.png" alt=" " width="800" height="572"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;Offline-first face recognition for real-time attendance tracking. No cloud biometric matching. No vendor hardware. No internet required. No raw photos stored. Only encrypted face codes that cannot be reversed.&lt;/p&gt;

&lt;p&gt;Most traditional systems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❌ &lt;strong&gt;Cloud-Dependent:&lt;/strong&gt; Store your biometric data on someone else's servers.&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;Proprietary:&lt;/strong&gt; Require expensive, vendor-locked hardware or scanners.&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;Fragile:&lt;/strong&gt; Stop working entirely the moment the internet goes down.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Facenox flips the script.&lt;/strong&gt; All AI inference and biometric matching stays 100% local. It's encrypted at rest with AES-256-GCM and runs flawlessly on any standard webcam (built-in, USB, or capture card).&lt;/p&gt;

&lt;p&gt;Just Download. Install. Point a camera at people. That's it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🏢 &lt;strong&gt;Note:&lt;/strong&gt; Unlike typical consumer desktop utilities, Facenox is architected as a local-first B2B solution. It’s designed to run on-premise for businesses, environments, or organizations that need enterprise-grade biometric tracking without leaking data to third-party cloud vendors.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Facenox Desktop is fully open-source under the AGPL-3.0 license. You can download the installer, grab the latest release, or build it directly from source.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🌐 &lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="https://facenox.com" rel="noopener noreferrer"&gt;facenox.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🐙 &lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/facenox" rel="noopener noreferrer"&gt;
        facenox
      &lt;/a&gt; / &lt;a href="https://github.com/facenox/facenox" rel="noopener noreferrer"&gt;
        facenox
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Offline-first face recognition for real-time attendance tracking.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/facenox/facenox/docs/assets/header.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Ffacenox%2Ffacenox%2FHEAD%2Fdocs%2Fassets%2Fheader.png" alt="Facenox - Offline-first Face Recognition Software" width="100%"&gt;&lt;/a&gt;
&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;
  &lt;a href="https://github.com/facenox/facenox/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/8e5928ae8e4b3e3689154aa7eaa21e845a82d0d12579cc9865bcfea13187a3e4/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4147504c2d2d332e302d6135616462373f7374796c653d666c6174266c6f676f3d676974266c6f676f436f6c6f723d663266356637266c6162656c436f6c6f723d306431313137" alt="License"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/facenox/facenox/releases" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/152fd65aba7c1df5d0fb6e5ce6b2677783dcd98bc25cd3d018162bf4d1543892/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f666163656e6f782f666163656e6f783f7374796c653d666c6174266c6f676f3d676974266c6f676f436f6c6f723d663266356637266c6162656c436f6c6f723d30643131313726636f6c6f723d303839316232" alt="Version"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/facenox/facenox/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/b6192fab4c94888eeba5954ce1599077466001db4c97915ff05656ce7717676b/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f666163656e6f782f666163656e6f783f7374796c653d666c6174266c6f676f3d676974687562266c6f676f436f6c6f723d663266356637266c6162656c436f6c6f723d30643131313726636f6c6f723d323264336565" alt="Stars"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/sponsors/facenox" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/5cf6ae5fad793eef0c946af586a8d6061b4fa547f4e101471a6656fc0006a220/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f73706f6e736f722d2545322539442541342d6666386138613f7374796c653d666c6174266c6f676f3d6769746875622d73706f6e736f7273266c6f676f436f6c6f723d663266356637266c6162656c436f6c6f723d306431313137" alt="Sponsor"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
  &lt;strong&gt;Facenox is offline-first face recognition software for real-time attendance tracking.&lt;/strong&gt;&lt;br&gt;
  Built for privacy: Biometric templates are end-to-end encrypted (E2EE)
&lt;/p&gt;

&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/facenox/facenox/docs/assets/screenshots/02-face-recognition-live.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Ffacenox%2Ffacenox%2FHEAD%2Fdocs%2Fassets%2Fscreenshots%2F02-face-recognition-live.png" alt="Facenox Desktop UI - Active Scan" width="100%"&gt;&lt;/a&gt;
&lt;/p&gt;




&lt;div class="markdown-alert markdown-alert-caution"&gt;
&lt;p class="markdown-alert-title"&gt;Caution&lt;/p&gt;
&lt;p&gt;This is the official open source repository for Facenox. Treat other repositories, installers, and downloads as unverified unless they come from official sources.&lt;/p&gt;
&lt;/div&gt;

&lt;div class="markdown-alert markdown-alert-note"&gt;
&lt;p class="markdown-alert-title"&gt;Note&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Privacy First:&lt;/strong&gt; Facenox processes face detection, tracking, and template matching locally. Encrypted face templates can optionally sync between your devices, with decryption keys stored exclusively on your paired hardware.&lt;/p&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why Facenox&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;Most face recognition systems rely on cloud-based biometrics. Facenox doesn't. Biometric matching stays local on the desktop.&lt;/p&gt;

&lt;p&gt;&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;br&gt;
&lt;thead&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;br&gt;
&lt;th&gt;Facenox&lt;/th&gt;
&lt;br&gt;
&lt;th&gt;Cloud-Based Systems&lt;/th&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;/thead&gt;
&lt;br&gt;
&lt;tbody&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;&lt;strong&gt;Data Residency&lt;/strong&gt;&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;Encrypted End-to-End with Optional Cross-Device Sync&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;Remote Cloud&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;&lt;strong&gt;Internet Dependency&lt;/strong&gt;&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;Mandatory&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;&lt;strong&gt;Latency&lt;/strong&gt;&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;Real-time&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;Network Dependent&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;&lt;strong&gt;Privacy Risk&lt;/strong&gt;&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;Minimized&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;/tbody&gt;
&lt;br&gt;
&lt;/table&gt;&lt;/div&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local Biometrics:&lt;/strong&gt; Face detection, ByteTrack subject tracking, and ONNX liveness verification.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-Platform:&lt;/strong&gt; Native support for Windows, macOS, and Linux.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consent-Aware:&lt;/strong&gt; Built-in support for biometric enrollment and deletion consent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subject Management:&lt;/strong&gt; Full…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/facenox/facenox" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/WW_a35yNA7A"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;📸 &lt;b&gt;View Desktop App Screenshots &amp;amp; Features&lt;/b&gt;&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Main panel
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvqdvzwu2b03co9wkpqq2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvqdvzwu2b03co9wkpqq2.png" alt=" " width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Live View (Demo)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxbn0n3aotv08uwq1dquw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxbn0n3aotv08uwq1dquw.png" alt=" " width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Overview
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdthh29p7cqxgqmbagidb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdthh29p7cqxgqmbagidb.png" alt=" " width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Reports Management &amp;amp; Export
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fct3pf8zqebci4fw5xhx4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fct3pf8zqebci4fw5xhx4.png" alt=" " width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Adding Member &amp;amp; Enrollment
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6dgpu3pd609aqgn4dag5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6dgpu3pd609aqgn4dag5.png" alt=" " width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  General Settings
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbvwh1v9yz83gv8dabjma.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbvwh1v9yz83gv8dabjma.png" alt=" " width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Security &amp;amp; Encryption
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6380zvechrc85swek46g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6380zvechrc85swek46g.png" alt=" " width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Local Database
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiy3kepr5m4o4wqbcpw3s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiy3kepr5m4o4wqbcpw3s.png" alt=" " width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Comeback Story
&lt;/h2&gt;

&lt;p&gt;The original prototype was 200 lines of Python that technically worked but fell apart the moment you tried to use it in a real room — bad lighting, side profiles, someone holding a photo of the person they're impersonating. It wasn't a product. It was a proof of concept I was too afraid to show to anyone.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Prototype (2025)&lt;/th&gt;
&lt;th&gt;Facenox Desktop v1.0.0-beta&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Interface&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CLI / Terminal (&lt;code&gt;python main.py&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Electron + React Desktop App&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Face Detection&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Haar Cascade / YOLOv8n&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Yunet&lt;/strong&gt; (Optimized for edge detection)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Recognition Model&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;DeepFace&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;EdgeFace&lt;/strong&gt; (Optimized for local CPU/GPU)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Anti-Spoofing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;MediaPipe (Lacked depth check)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Custom ONNX Model&lt;/strong&gt; (Liveness detection)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data Storage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Python &lt;code&gt;.pickle&lt;/code&gt; files (Unsecure)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;AES-256-GCM&lt;/strong&gt; Encrypted Local DB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Codebase Size&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~200 lines&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;50,000+ lines&lt;/strong&gt; (1,700+ commits)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I spent months buried in rabbit holes. Optimizing my AI implementation architecture. Replacing DeepFace with EdgeFace for better accuracy. Building a custom ONNX anti-spoofing model &lt;a href="https://github.com/facenox/face-antispoof-onnx" rel="noopener noreferrer"&gt;face-antispoof-onnx&lt;/a&gt; because MediaPipe couldn't handle real-world spoofing, phones, printed photos, screen reflections. That liveness problem alone took weeks of pre-processing datas, ONNX export debugging, and temporal fusion tuning to get right.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I actually shared a raw demo of this custom liveness detection mechanism on LinkedIn, and the post completely blew up!!!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F35vygmyv9b3fepdd6tjx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F35vygmyv9b3fepdd6tjx.png" alt=" " width="681" height="808"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhpji1pcm17293gsw0wos.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhpji1pcm17293gsw0wos.png" alt=" " width="678" height="732"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Seeing hundreds of developers validate the architecture and obsess over the local edge performance was the exact spark I needed. It made me realize that people actually wanted this technology.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://www.linkedin.com/embed/feed/update/urn:li:ugcPost:7410731871363317760?compact=1" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdms.licdn.com%2Fplaylist%2Fvid%2Fv2%2FD5605AQEfhbakq3t91g%2Fthumbnail-with-play-button-overlay-high%2FB56Ztg1q.eGwDM-%2F0%2F1766856246290%3Fe%3D2147483647%26v%3Dbeta%26t%3DgD_NxpbX8JgZUpM3Y1qQjvVSgLczEzL_w_CHzwXmKw0" height="720" class="m-0" width="720"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://www.linkedin.com/embed/feed/update/urn:li:ugcPost:7410731871363317760?compact=1" rel="noopener noreferrer" class="c-link"&gt;
            Improving Face Anti-Spoofing with Miniface | John Raiven Olazo posted on the topic | LinkedIn
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            I thought fixing this would be a quick weekend task. 𝗜 𝘄𝗮𝘀 𝘄𝗿𝗼𝗻𝗴.

While building an AI-powered attendance system, I ran into a 𝗺𝗮𝘀𝘀𝗶𝘃𝗲 𝘀𝗲𝗰𝘂𝗿𝗶𝘁𝘆 𝗵𝗼𝗹𝗲: it was way too easy to trick the camera just by holding up a photo or a phone screen.

I quickly realized that generic models like MobileNetV4 aren't built for security, they're built for recognition. To solve this, I had to dive deep into face anti-spoofing and eventually ditched the "all-rounders" for 𝗠𝗶𝗻𝗶𝗙𝗔𝗦.

This is a specialized architecture that actually understands the difference between a human face and a piece of paper.

The breakdown:

Tiny but accurate: The model is only 𝟲𝟬𝟬𝗞𝗕. Despite the size, it hits ~𝟵𝟴% 𝗮𝗰𝗰𝘂𝗿𝗮𝗰𝘆 on the CelebA benchmark (70k+ samples).
Texture-based logic: Instead of just looking at facial features, it uses 𝗙𝗼𝘂𝗿𝗶𝗲𝗿 𝗧𝗿𝗮𝗻𝘀𝗳𝗼𝗿𝗺 𝗹𝗼𝘀𝘀 to detect the microscopic texture patterns of real skin versus printed paper or digital pixels.
Runs on a "literal potato": I used INT8 quantization so it can run anywhere. No GPU or expensive cloud server is needed. and as a proof, I tested it on a 2011 laptop. Even on a 𝟭𝟰-𝘆𝗲𝗮𝗿-𝗼𝗹𝗱 𝗖𝗣𝗨, it handles inference in 𝘂𝗻𝗱𝗲𝗿 𝟮𝟬𝗺𝘀 thanks to INT8 quantization. No expensive cloud server required.

I’ve decoupled this from my main project, train it from scratch and 𝗼𝗽𝗲𝗻-𝘀𝗼𝘂𝗿𝗰𝗲𝗱 it as a standalone security layer. If you're building an app that uses a camera and needs lightweight liveness detection, feel free to use it.

𝗖𝗼𝗻𝘁𝗿𝗶𝗯𝘂𝘁𝗶𝗼𝗻𝘀 𝗮𝗿𝗲 𝘄𝗲𝗹𝗰𝗼𝗺𝗲! If you’re a CV researcher, or just someone who knows a better way to handle liveness detection, I’d love to see your input.

𝗿𝗲𝗽𝗼: https://lnkd.in/gPZSrMbT

#MachineLearning #ComputerVision #OpenSource #Python #CyberSecurity #AI | 47 comments on LinkedIn
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fstatic.licdn.com%2Faero-v1%2Fsc%2Fh%2Fal2o9zrvru7aqj8e1x2rzsrca" width="64" height="64"&gt;
          linkedin.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;But the hardest part wasn't the ML. It was realizing that no matter how accurate the model was, people weren't going to run python inference.py in a terminal anyway. So I scrapped everything and started over with Electron + React. Then scrapped that architecture and rewrote it again. And again.&lt;/p&gt;

&lt;p&gt;1700+ commits. 50,000+ lines. One year of building in silence.&lt;br&gt;
The Finish-Up-A-Thon didn't make me build Facenox. It made me stop hiding it.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Experience with GitHub Copilot
&lt;/h2&gt;

&lt;p&gt;Copilot handled the grunt work.&lt;br&gt;
Whenever I needed to write schemas for the sync contract between the desktop app and dashboard, Copilot would infer the types from my existing interfaces and generate the validation layer in seconds. Same with Pydantic models. I just described what I wanted, and it wrote the boilerplate.&lt;/p&gt;

&lt;p&gt;The Tailwind classes? I'd type the layout intent, Copilot would autocomplete the utility chain. Framer Motion animations? It remembered the exact spring configs I always forget. Writing test files for the FastAPI endpoints and the WebSocket pipeline went from tedious to fast! Copilot saw the pattern after two examples and filled in the rest. It caught inconsistencies I would have missed.&lt;/p&gt;

&lt;p&gt;Copilot kept me in flow state by destroying the boilerplate, while I focused entirely on the high-level architecture. The pipeline orchestration, system integrations, encryption layer, and WebSocket frame protocol—those required human architectural decisions. Copilot made sure I spent my engineering cycles there instead of reading Electron IPC docs or debugging Tailwind layouts for the 50th time.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>githubchallenge</category>
    </item>
  </channel>
</rss>
