Light Lynx

Turn Zigbee2MQTT into a polished light automation solution.
Faster than the Hue app and fully open source.

Features

Very Fast

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.

  • Installable on your mobile home screen. Always loads from cache, making it faster than just about any native app. (Try it!)
  • Your light states are cached too. The app renders your setup instantly on launch.
  • Lights, buttons, and motion sensors form groups that can be easily controlled together, preferably by creating scenes that set the lights just right for a given activity.
  • The main page shows you (hopefully) all groups and scenes for your home at a glance.
  • Uses native Zigbee groups and scenes, so that lights transition all at once instead of one at a time (looking at you Home Assistant).
  • Changes you make are visible in the UI directly, syncing with the server in the background.
🤖

Automation Included

Connect scenes to buttons, motion sensors, schedules, and timers. Everything configured in the app, running locally with no cloud required.

  • Triggers scenes by motion sensor events, button presses, double presses, triple presses, etc. Optionally conditional on the time of day.
  • Pressing a button once while some lights in the connected group are on will always just turn them off. Much enhanced the spouse-acceptance-factor!
  • Trigger scenes based on the time of day, or relative to sunrise/sunset.
  • Set auto-off timers for groups. Great for bathrooms, laundry rooms, etc. And for your children's rooms. Lights fade out smoothly when the timer expires.
  • Everything runs locally inside Zigbee2MQTT. No cloud, no latency.
🌍

Offline & Online

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.

  • Works without internet. The app loads from cache and connects directly to your server over the local network. (Though an occasional internet connection is needed for DNS.)
  • When enabled, remote access allows you to control your lights from anywhere, even when the server is behind a NAT gateway. This works by using UPnP to punch a hole in your router.
  • If your internet connection has a dynamic IP it will be tracked automatically. (Though perhaps with some delay.)
  • When remote access is enabled, clients will try to connect to the internal address and the external address in parallel, and use whichever connects first.
  • Direct connection to your server. No cloud relay, no third-party in the data path.
👥

Secure & Multi-User

Individual logins with per-group permissions. TLS encryption by default. Passwords are hashed client-side and never leave your device.

  • Each user has their own login and permissions to control or manage certain groups (rooms). Great for house guests or children! Or for the office.
  • Connections to your server are TLS encrypted by default. This is set up automatically (using Let's Encrypt).
  • Passwords are only stored in hashed form.
  • Even admin users are not allowed to install Zigbee2MQTT extensions through the API, to prevent arbitrary code execution vulnerabilities. (Unlike the official Zigbee2MQTT frontend.)
  • Generate shareable URLs with embedded credentials for easy onboarding (of house guests).
🔧

Batteries Included

The only interface you need for lighting control. Pair devices, manage groups and scenes, handle users and automations — all from the app.

  • Pair and remove devices, manage groups, manage scenes, rename things, manage users, manage automations — all from the app.
  • Low-battery indicator for buttons and sensors, with warning badges in the header and a dedicated status page.
  • Beautiful color control: interactive color wheel, brightness slider, and color temperature picker. Per-bulb markers show each light's position within a group.
  • Groups can mix color and temperature-only bulbs — each receives the right command.
  • Save any lighting state as a named scene (Bright, Dim, Cozy, Movie…). The active scene is highlighted so you always know what's on.
  • No separate servers or database to set up and maintain: just Zigbee2MQTT and the Light Lynx extension and an MQTT server (that's not actually used but is required by Zigbee2MQTT). You can of course still connect other home automation software.

Get Started in 3 Steps

1

Install the Extension

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.

2

Open the App

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).

3

Configure

Tap the wrench icon to enter manage mode. Organize lights into groups, create scenes, link buttons and sensors, set up user accounts.

Frontend PWA

A static web app hosted on app.lightlynx.eu. Loads from browser cache, connects directly to your server over WebSocket, and works offline.

Cached & Installable

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.

Direct WebSocket Connection

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.

Optimistic Updates

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.

Color Conversion

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.

Zigbee2MQTT Extension

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.

State Tracking

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.

User Management

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.

Automation Engine

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.

Zigbee-native Commands

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.

Networking

Encrypted by default on the local network. Optional remote access with automatic SSL and port forwarding — no cloud relay in between.

Automatic SSL

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.

Local Discovery

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).

Remote Access

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.

Privacy

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.