# UHPPOTE Desk
Web application (Node.js + React) to manage **UHPPOTE UT0311-L0x** access controllers (in particular the 4-door UT0311-L04), replacing the Windows "Access Control" software (N3000).
## Acknowledgements
This project would not exist without **[uhppoted](https://codeberg.org/uhppoted)**, the open-source project that reverse-engineered and documented the UHPPOTE controller protocol and built a complete set of tools around it. Many thanks to its author and contributors for their work and for publishing it under the MIT licence.
What UHPPOTE Desk owes to uhppoted:
| uhppoted component | How it was used here |
|---|---|
| [uhppoted-core](https://codeberg.org/uhppoted/uhppoted-core) | Reference implementation and the main source of knowledge about the protocol: packet layout, encodings, the 34 commands, event and reason codes, firmware quirks |
| [uhppoted-codegen](https://codeberg.org/uhppoted/uhppoted-codegen) | The protocol model (`models.json`) behind our codec, and the official **test vectors** included in [packages/protocol/test/fixtures](packages/protocol/test/fixtures) (MIT, see [NOTICE](packages/protocol/test/fixtures/NOTICE.md)) |
| [uhppoted-lib-nodejs](https://codeberg.org/uhppoted/uhppoted-lib-nodejs) (npm `uhppoted`) | Studied while designing our TypeScript implementation, and used in the differential tests as an independent reference |
| [uhppoted-simulator](https://codeberg.org/uhppoted/uhppoted-simulator) | Integration tests against an independent controller implementation before the hardware was available |
| [uhppoted-cli](https://codeberg.org/uhppoted/uhppoted-cli) | Cross-check of packets during hardware commissioning (`npm run hw -- --cli …`) |
| [node-red-contrib-uhppoted](https://flows.nodered.org/node/node-red-contrib-uhppoted) / [uhppoted-lib-node-red](https://codeberg.org/uhppoted/uhppoted-lib-node-red) | The starting point that showed the protocol can be driven from Node.js |
UHPPOTE Desk is an independent project and is not affiliated with uhppoted or with the controller manufacturer. It also builds on many other open-source projects, including Node.js, Fastify, React, Mantine, TanStack Query, i18next, zod, Vite, Vitest and Playwright.
## Features
Controller discovery and configuration, people/cards/permissions with automatic synchronisation, time profiles, scheduled tasks, interlock, anti-passback, keypads and door passcodes, first card, remote door opening, live monitor with photos, event history, attendance (shifts, holidays, leave, manual punches, reports), operators with roles and an audit log.
**Home Assistant** integration over MQTT with automatic discovery: door, lock and controller states, access events for automations, and *Open* buttons — see [docs/HOME-ASSISTANT.md](docs/HOME-ASSISTANT.md).
**Outgoing webhooks**: signed JSON requests to n8n, Node-RED or any HTTP service on access events, alarms, door state changes and controllers going offline, with filters per door, retries and a delivery log — see [docs/WEBHOOKS.md](docs/WEBHOOKS.md).
**Notifications** on Telegram (with an *Open door* button for authorised users), email, ntfy and Gotify, plus a daily report of who came in and the anomalies — see [docs/NOTIFICATIONS.md](docs/NOTIFICATIONS.md).
**Anomaly detection** on the history: accesses at unusual times for each person, repeated denied attempts, and cards unused for months (with bulk revocation) — also as real-time events and in the daily report; see [docs/ANOMALIES.md](docs/ANOMALIES.md).
**Automation rules**: when an event or a door left open matches the conditions (doors, people or cards, time window, days), send notifications, call webhooks or open doors — see [docs/RULES.md](docs/RULES.md).
**Mobile app** (PWA at `/m`, installable on the home screen): doors with live state, opening with *hold to open* or fingerprint/Face ID, push notifications with an *Open* action, remembered devices revocable by the administrator — see [docs/MOBILE.md](docs/MOBILE.md).
**API tokens** for machine-to-machine access (`Authorization: Bearer`): read-only, door opening only (optionally limited to specific doors), operator or administrator, with zone restrictions, expiry and audit — see [docs/API-TOKENS.md](docs/API-TOKENS.md).
The user interface is available in **English** (base language), **Italian**, **Spanish**, **French** and **German** — see [Languages](#languages).
**User manual** (PDF, with screenshots of every page): [docs/UHPPOTE-Desk-Manual.pdf](docs/UHPPOTE-Desk-Manual.pdf). It is generated from [docs/manual](docs/manual) with `npm run manual`.
The full technical analysis (protocol, design decisions, risks) is in [ANALYSIS.md](ANALYSIS.md).
## Screenshots
| | |
|---|---|
|  |  |
| **Live monitor**: the last swipe with the person's photo, events as the controller sends them | **People**: details, cards and permissions of each person |
|  |  |
| **Attendance**: hours worked, overtime, late arrivals and absences, exportable to CSV | **Controller diagnostics**: network, firmware, stored cards and door states |
Mobile app: doors with live state, hold to open or fingerprint/Face ID