A desktop UI for managing OPNsense static and dynamic DHCP leases with validation, conflict checks, and guided apply flows.
- This project is licensed under PolyForm Noncommercial License 1.0.0.
- Commercial use, commercial modification, and use in commercial applications are not permitted without a separate commercial license from the author.
- See
LICENSEfor the full terms.
- Base URL-driven configuration (
loginanddashboardURLs are derived automatically, port:81enforced) - Static Gruen lease workflow: CSV import/validation, diffing, add/update/delete review for the
lan(Gruen) interface - Static WLANBYOD lease workflow: identical workflow for the
opt4(WLANBYOD) interface — separate panel, separate CSV state - Dynamic lease workflow: load dynamic leases; move eligible leases to static and update conflicting static entries
- Supported source interfaces for move/update:
Gruen→lan,WLANBYOD→opt4
- Supported source interfaces for move/update:
- Conflict helpers with suggested free IP/hostname and field-level update selection (IP/MAC)
- Lease views:
Static Gruen,Static WLANBYOD,Dynamic,Review, andRun Log - Collapsible review sections (Add, Conflicts, Deletes) per interface panel
- Static lease export fetches both Gruen (
export_static.csv) and WLANBYOD (export_static_wlanbyod.csv) in a single API call - Settings persistence, run history, and in-app updater support
- Install Rust and Tauri prerequisites (Windows):
- Install dependencies:
- npm install
- Create a Python environment and install deps:
- cd backend
- python -m venv .venv
- .venv\Scripts\activate
- pip install -r requirements.txt
Only requests is required for backend dependencies. Playwright and selector configuration are no longer needed.
The backend authenticates against OPNsense, captures session cookies, and calls
the /api/tfk/dhcp/* endpoints directly.
| Mode | Description |
|---|---|
export |
Fetch /api/tfk/dhcp/static_leases once; write export_static.csv (Gruen/lan) and export_static_wlanbyod.csv (WLANBYOD/opt4) |
dynamic |
Fetch dynamic leases from /api/tfk/dhcp/leases |
move_dynamic |
Move a dynamic lease to static — interface mapped via TFK_IFACE (Gruen→lan, WLANBYOD→opt4) |
update_dynamic_conflict |
Update an existing static lease from dynamic values — same interface mapping as above |
| UI name | OPNsense API if value |
|---|---|
| Gruen | lan |
| WLANBYOD | opt4 |
- npm run tauri dev
Running npm run build automatically copies backend/ into src-tauri/resources/backend/ via scripts/copy-backend.mjs before compiling — no manual sync needed for production or CI builds.
- Dynamic lease backend slice tests:
python -m unittest -v backend/src/test_dynamic_leases_slice.py
Compiled binaries are available on the GitHub releases page:
- The app checks GitHub releases on startup and prompts to install when a new version is available.
- Update packages are signed; configure signing secrets for the release workflow:
TAURI_SIGNING_PRIVATE_KEYTAURI_SIGNING_PRIVATE_KEY_PASSWORD
- The updater expects
latest.jsonin the GitHub release assets.
- CSV format expects semicolon separators.
- Backend script path is resolved automatically from the app; keep the
backendfolder next to the app. - Configure
Python pathin Settings if you use a non-default Python install. loginUrlanddashboardUrlare read-only in the UI and derived from the Base URL.
- If you need commercial use rights, request a separate commercial license from the project owner.