Turn Zigbee2MQTT into a polished light automation solution.
Faster than the Hue app and fully open source.
The PWA (installable web app) loads instantly from cache. Common tasks -toggling groups and activating scenes- take just a single tap from the main screen.
Connect scenes to buttons, motion sensors, schedules, and timers. Everything configured in the app, running locally with no cloud required.
Works without internet over your local network. Optional remote access lets you control lights from anywhere, still without a cloud in the middle, and with automatic setup.
Individual logins with per-group permissions. TLS encryption by default. Passwords are hashed client-side and never leave your device.
The only interface you need for lighting control. Pair devices, manage groups and scenes, handle users and automations — all from the app.
Download lightlynx.js and add it to your Zigbee2MQTT data/extension folder. Alternatively, paste the file contents as an External Extension in the Z2M web UI (Settings → External Extensions). Restart Zigbee2MQTT.
Go to app.lightlynx.eu. It will try to auto-detect your server on the local network. Enter your server's IP if needed. Log in as admin (no password initially).
Tap the wrench icon to enter manage mode. Organize lights into groups, create scenes, link buttons and sensors, set up user accounts.
A static web app hosted on app.lightlynx.eu. Loads from browser cache, connects directly to your server over WebSocket, and works offline.
The app is cached by a service worker and loads from disk instantly. It can be installed to your home screen as a PWA. When a new version is available, a reload icon appears in the header — one tap to update.
The app connects directly to your Zigbee2MQTT server over WebSocket — no cloud relay. It receives the full light state on connect, then only compact deltas as things change. Your light state is also cached in localStorage for instant startup.
When you drag a slider or tap a button, the UI updates immediately. The command is sent to the server in the background, and the UI reconciles when the server confirms. This makes everything feel instant, even on slow connections.
Full color pipeline: HSV ↔ RGB ↔ XY (CIE 1931) ↔ Mireds. When a group mixes full-color and temperature-only bulbs, each light receives a command adapted to its capabilities — including warm-white fallbacks.
A single JavaScript file that drops into your Zigbee2MQTT data/extension folder. It handles the WebSocket API, user management, automation, and device state — all without any external dependencies.
The extension listens to MQTT messages from Zigbee2MQTT to build a live state of all devices, groups, and scenes. When a client connects, it receives the full state; after that, only changes are pushed. Config is stored in data/lightlynx.json.
Supports multiple user accounts with per-group permission levels (hidden, control, manage). Passwords are hashed client-side (PBKDF2, 100K iterations) — the server only stores and verifies hashes. Shareable URLs let you onboard family members in seconds.
Buttons and sensors are linked to groups and scenes directly in the app. Multi-press detection, motion triggers, time-of-day schedules, and sunrise/sunset offsets all run locally inside Z2M. Auto-off timers fade lights out after configurable inactivity.
Scene recalls and group commands use Zigbee's native group/scene addressing for fast execution. The extension sends a single group command plus tailored per-bulb commands for mixed-capability groups, keeping the Zigbee mesh efficient.
Encrypted by default on the local network. Optional remote access with automatic SSL and port forwarding — no cloud relay in between.
The extension obtains a Let's Encrypt certificate automatically via DNS-01 challenge through the lightlynx.eu infrastructure. Certificates renew before expiry. Your WebSocket connection is always TLS-encrypted, even locally.
The app auto-detects your server on the local network. Once connected, the server address and credentials are saved in the browser. The WebSocket connection runs on port 43597 (configurable via LIGHTLYNX_PORT environment variable).
When enabled, the extension uses UPnP to forward a random port on your router. DNS maps ext-<id>.lightlynx.eu to your external IP. The app races local vs. remote connections and picks whichever responds first — transitions between Wi-Fi and mobile data are seamless.
All data flows directly between the app and your server. No cloud account, no tracking, no intermediary. Location coordinates for sunrise/sunset are stored locally and rounded to ~1 km. Passwords are hashed in the browser and never transmitted in plain text.