UVM is a modern, touch-friendly web application for managing WiFi vouchers on UniFi controllers. Perfect for businesses, cafes, hotels, and home networks that need to provide guest WiFi access.

The kiosk page (/kiosk) provides a guest-friendly interface displaying:
bash
# Download the compose file
curl -o compose.yaml https://raw.githubusercontent.com/etiennecollin/unifi-voucher-manager/main/compose.yamlcompose.yaml file.bash
docker compose up -d --force-recreatehttp://localhost:3000.rust >= 1.88.0nodejs >= 24.3.0npm >= 11.4.2bash
git clone https://github.com/etiennecollin/unifi-voucher-manager.env file at the root of the repository and use the dotenv feature of the rust backend.```bash # Backend (without using a .env file) cd backend && cargo run --release
# Backend (using a .env file) cd backend && cargo run --release --features dotenv
# Frontend (development) cd frontend && npm install && npm run dev
# Frontend (release) cd frontend && npm ci && npm run build && npm run start ```
http://localhost:3000.Rolling vouchers provide a seamless way to automatically generate guest network access codes. When one voucher is used, a new one is automatically created for the next guest.
[!IMPORTANT] Setup Required
For rolling vouchers to work properly, you must configure your UniFi Hotspot:
- Go to your UniFi Controller -> Insights -> Hotspot
- Set the Success Landing Page to:
https://your-uvm-domain.com/welcome, the/welcomepage of UVMWithout this configuration, vouchers will not automatically roll when guests connect.
[!CAUTION] To restrict UVM access to the guest subnetwork users while still allowing access to
/welcomepage, set theGUEST_SUBNETWORKenvironment variable. This makes sure guests do not have access to other UVM pages, such as the voucher management interface (the root/page).Without this configuration, guests will be able to access the voucher management interface of UVM. This means they will be able to both create and delete vouchers by themselves.
/welcome pageTIMEZONE in Environment Variables)Make sure to configure the required variables. The optional variables generally have default values that you should not have to change.
[!TIP]
- To configure the WiFi QR code, you are required to configure the
WIFI_SSIDandWIFI_PASSWORDvariables.- For proper timezone, make sure to set the
TIMEZONEvariable.[!IMPORTANT] Make sure to expand this section and read what the environment variables are doing. Some variables are required, they are placed at the top of the list.
UNIFI_CONTROLLER_URL: string (Required)http:// or https://).https://unifi.example.com or https://192.168.8.1:443UNIFI_API_KEY: string (Required)abc123...[!WARNING] Improperly setting the
UNIFI_HAS_VALID_CERTvariable will prevent UVM from communicating with the UniFi controller.
UNIFI_HAS_VALID_CERT: bool (Optional)true, especially if you access the controller through a reverse proxy or another setup that provides trusted certificates (e.g., Let's Encrypt). If you connect directly to the controller’s IP address (which usually serves a self-signed certificate), you may need to set this to false.true (default)UNIFI_SITE_ID: string (Optional)default, the backend will try to fetch the ID of the default site.default (default)[!CAUTION] To restrict UVM access to the guest subnetwork users while still allowing access to
/welcomepage, set theGUEST_SUBNETWORKvariable. This makes sure guests do not have access to other UVM pages, such as the voucher management interface (the root/page).Without this configuration, guests will be able to access the voucher management interface of UVM. This means they will be able to both create and delete vouchers by themselves.
GUEST_SUBNETWORK: IPv4 CIDR (Optional)/welcome page, which users are redirected to from the UniFi captive portal. For more details, see Rolling Vouchers and Kiosk Page.10.0.5.0/24FRONTEND_BIND_HOST: IPv4 (Optional)0.0.0.0 (default)FRONTEND_BIND_PORT: u16 (Optional)3000 (default)FRONTEND_TO_BACKEND_URL: URL (Optional)http://127.0.0.1 (default)BACKEND_BIND_HOST: IPv4 (Optional)127.0.0.1 (default)BACKEND_BIND_PORT: u16 (Optional)8080 (default)BACKEND_LOG_LEVEL: trace|debug|info|warn|error (Optional)info(default)TIMEZONE: timezone identifier (Optional)UTC (default)ROLLING_VOUCHER_DURATION_MINUTES: minutes (Optional)480 (default)WIFI_SSID: string (Optional)My WiFi SSIDWIFI_PASSWORD: string (Optional)"". (required for QR code to be generated)My WiFi PasswordWIFI_TYPE: WPA|WEP|nopass (Optional)WPA if a password is provided and nopass otherwise.WPAWIFI_HIDDEN: bool (Optional)false (default)UNIFI_CONTROLLER_URL is correct and accessibleUNIFI_SITE_ID matches your controller's siteUNIFI_HAS_VALID_CERT is correct (depending on whether your UNIFI_CONTROLLER_URL has a valid SSL certificate or not)docker logs unifi-voucher-managerF12 and going to the 'console' tab)BACKEND_LOG_LEVEL="debug"docker logs unifi-voucher-managerF12 and going to the 'console' tab of your browser⭐ If this project helped you, please consider giving it a star!
$ claude mcp add unifi-voucher-manager \
-- python -m otcore.mcp_server <graph>