A lightweight web management interface for Infix network devices, built with Go and htmx.
The WebUI communicates with the device over RESTCONF (RFC 8040), presenting the same operational data available through the Infix CLI in a browser-friendly format.
- Dashboard -- system info, hardware, sensors, and interface summary with bridge member grouping
- Interfaces -- list with status, addresses, and per-type detail; click through to a detail page with live-updating counters, WiFi station table, scan results, WireGuard peers, and ethernet frame statistics
- Firewall -- zone-to-zone policy matrix
- Keystore -- symmetric and asymmetric key display
- Firmware -- slot overview, install from URL with live progress
- Reboot -- two-phase status polling (wait down, wait up)
- Config download -- startup datastore as JSON
Requires Go 1.22 or later.
make buildProduces a statically linked infix-webui binary with all templates,
CSS, and JS embedded.
Cross-compile for the target:
GOOS=linux GOARCH=arm64 make build./infix-webui -restconf https://192.168.0.1/restconf -listen :8080| Flag | Default | Description |
|---|---|---|
-listen |
:8080 |
Address to listen on |
-restconf |
http://localhost:8080/restconf |
RESTCONF base URL of the device |
-session-key |
/var/lib/misc/webui-session.key |
Path to persistent session encryption key |
The RESTCONF URL can also be set via the RESTCONF_URL environment
variable.
Point RESTCONF_URL at a running Infix device and start the dev
server:
export RESTCONF_URL=https://192.168.0.1/restconf
sudo -E make devThis runs go run . on port 8080 with live recompilation on each
request. sudo -E is needed to bind port 8080 and to inherit the
environment variable.
Browser ──htmx──▶ Go server ──RESTCONF──▶ Infix device (rousette/sysrepo)
- Single binary -- templates, CSS, JS, and images are embedded via
go:embed - Server-side rendering -- Go
html/templatewith per-page parsing to avoid{{define "content"}}collisions - htmx SPA navigation -- sidebar links use
hx-get/hx-targetfor partial page updates withhx-push-urlfor browser history - Stateless sessions -- AES-256-GCM encrypted cookies carry credentials (needed for every RESTCONF call); no server-side session store
- Live polling -- counters update every 5s, firmware progress every 3s, all via htmx triggers
main.go Entry point, flags, embedded FS
internal/
auth/ Login, logout, session (AES-GCM cookies)
restconf/ HTTP client (Get, GetRaw, Post, PostJSON)
handlers/ Page handlers
dashboard.go Dashboard, hardware, sensors
interfaces.go Interface list, detail, counters
firewall.go Zone matrix
keystore.go Key display
system.go Firmware, reboot, config download
server/
server.go Route registration, template wiring, middleware
templates/
layouts/ base.html (shell), sidebar.html
pages/ Per-page templates (one per route)
fragments/ htmx partial fragments
static/
css/style.css All styles
js/htmx.min.js htmx library
img/ Logo, favicon
See LICENSE.