Open Source ยท Self-Hosted ยท Docker

Real-Time Attendance
Powered by UniFi Access

Know exactly who badged in, when they arrived, and whether they were on time โ€” all from a clean live dashboard backed by your own infrastructure.

See the Dashboard Quick Install
~5 min
Setup Time
0 ms
Cloud Dependency
6 hr
Auto User Sync
100%
Self-Hosted & Private
Live Preview
Your dashboard, today
Real names resolved from your UniFi Access controller, attendance status applied automatically against your custom cutoff time.
# Name First Badge In Latest Badge In Actor ID Status
1Alex Rivera08:47 AMโ€” samea3f9c21bON TIME
2Jordan Lee08:53 AM02:14 PMb72e4d09ON TIME
3Morgan Chen09:12 AMโ€” samec8a1f355LATE
4Taylor Brooks08:58 AM01:07 PMd04b9e77ON TIME
5Casey Nguyen09:31 AMโ€” samee19d2c88LATE
6Riley Thompson08:41 AM03:22 PMf5c0a3b2ON TIME
7Drew Martinez08:59 AMโ€” same60e7f14cON TIME
8Sam Patel09:48 AMโ€” same71ba3d6fLATE
Everything you need, nothing you don't
Built specifically for UniFi Access environments that want local, fast, and transparent attendance tracking.
โšก

Real-Time Webhook Events

Receives access.door.unlock events from UniFi Access the moment a badge is tapped โ€” no polling, no delays.

๐Ÿ‘ค

Automatic Name Resolution

Translates raw UniFi actor UUIDs into real display names by syncing your user roster directly from the Access controller.

๐ŸŸข

ON TIME / LATE Status

Set any daily cutoff time. The dashboard automatically marks each person's first badge as ON TIME (green) or LATE (red).

๐Ÿ“…

Historical Date Browsing

All badge events are persisted in a local SQLite database. Browse any past date with the date picker โ€” your history, your server.

๐Ÿ”’

HMAC-Secured Webhooks

Every incoming event is verified with HMAC-SHA256 using your unique webhook secret, blocking spoofed or unauthorized payloads.

๐Ÿณ

Single Docker Container

One docker compose up -d command deploys Flask + SQLite. Runs on Unraid or any Linux host with Docker installed.

Get Started
Up and running in minutes
Requires a UniFi OS console running Access 1.9.1+, Docker, and a local network connection to your controller.
1

Open Firewall Port 12445

Add a LAN IN firewall rule in UniFi Network โ†’ Settings โ†’ Firewall & Security allowing TCP 12445 from your subnet to your controller IP.

2

Generate a Developer API Token

In the UniFi Access app go to Settings โ†’ General โ†’ Advanced โ†’ API Token. Create a new token with all permission scopes and copy it immediately โ€” it's shown only once.

3

Clone & Configure

Clone the repo to your Unraid server, copy .env.example to .env, and fill in your controller IP, API token, and timezone.

4

Build & Start the Container

Run docker compose up -d --build. The container launches Flask on port 8000, creates the SQLite database, and immediately syncs your user roster.

5

Register the Webhook

From the container console, run the provided Python snippet to register your dashboard URL with UniFi Access for access.door.unlock events. Copy the returned secret into .env and rebuild.

6

Open the Dashboard

Navigate to http://<UNRAID-IP>:8000/. Pick a date, set your cutoff time, and watch attendance populate in real time as badges are tapped.