Ember · a light two people share
One glass block for you, one for someone far away — a partner in another city, a parent back home, a friend who moved. Touch yours and theirs quietly changes with it, wherever they are. Nothing to open, nothing to send. Just glass, and the fact that you were thinking of them.
Not a notification. Not a message you have to write. Just a colour, arriving.
Touch the base of your lamp and it settles on a new colour. The other lamp — wherever it is, whoever has it — catches up in a slow crossfade. It's the kid who moved out for university, letting a parent back home know they're up and thinking of them at midnight. It's two best friends who used to see each other every day and now live cities apart. No app to open, no message to write — just glass, changing, because someone touched theirs.
Simulated here, with a realistic delay built in. On the real lamps it's one message over your own WiFi, documented in full in the repository for anyone who wants to build on it.
Send a colour to just one lamp and the pair uncouples for half an hour, so it isn't quietly undone by the next sync. Send to both and they relink straight away.
Once a minute the lamps quietly check in with each other, so the two never have the chance to drift apart.
Next room or another timezone, the crossfade takes the same few seconds either way. The relay in between doesn't care how far apart the two of you are.
However you begin, the sync is included — always.
Two lamps are the actual idea — that's the Pair. Or start with a Single, or build one yourself with the Kit.
One lamp
Start with one, or extend a connection you already have — buy a Single and give it to someone new. It syncs with the lamp you kept, no different from the pair.
Buy SingleTwo lamps, synced
Two lamps that already know each other, out of the box. This is what Ember is for: touch yours, theirs changes.
Buy the PairSelf-assembly · one lamp
The board arrives already built and tested — the ESP32 and fifteen LEDs are reflow-soldered at the factory, not by you. You do the rest: board into the base, base under the glass, plug in the USB‑C cable. No soldering, no electronics kit.
Buy the KitEvery tier: full colour across three zones, touch control, sunrise and bedtime alarms, over-the-air updates, and the complete open-source design files. Sync works between any two Ember lamps, whichever tiers they came from.
Off, it is a block of glass someone left on a shelf.
A solid glass block, 190 mm square, on a low dark base. The light lives underneath, out of sight — no lens, no screen, nothing to look at until you switch it on. Then the glass itself seems to hold the colour — and its other half, wherever that is, is holding the same one.
Set it once. It runs with your phone off and the app closed.
Colour deepens from ember red to warm white over half an hour, brightening as it goes — a real sunrise, not a light switching on. Bedtime runs the same fade in reverse, and settles quietly to off. It runs on the lamp's own clock, so it still arrives on schedule even if the person it's timed for is asleep in a different timezone.
Firmware, app, schematic, board files, bill of materials — all public.
If this page disappears, or I do, the lamps on your shelf keep working, and every file needed to keep them running — or build more — is already yours.
Answered properly, including the awkward ones.
The lamp itself is identical — same board, same fifteen LEDs, same firmware, same sync. Single and Pair ship fully assembled, ready to plug in; the difference between them is just how many lamps arrive, and Pair is priced below two Singles because sync is what the product is for. Kit is one lamp for less, with the glass block and base shipped loose — you snap it together yourself, no soldering involved.
No. The EM-15 board — the ESP32-C3 module, all fifteen LEDs, every fine-pitch part — is reflow-soldered and tested at the factory before it ships. What arrives loose is the glass block and the printed base; what you do is entirely mechanical: board into the base, base under the block, plug in the USB‑C cable. No iron, no flux, nothing electronic to assemble.
Yes — touch, colour groups, alarms, the web app, all of it works on a single lamp. But sync is why the Pair exists: one lamp is a nice light, two are a lamp that answers when someone touches theirs. Buying a Single later is also how you add a lamp for someone new, synced to one you already own.
Single and Pair: one or two complete lamps, each a 190 × 190 × 80 mm glass block on a printed base, with an assembled and tested EM-15 rev I board fitted inside and firmware already on it. Kit: the same board, already assembled and tested, plus a glass block and a printed base as separate parts you assemble yourself. Every tier takes power over USB-C.
Setup is joining a lamp to your WiFi and giving synced lamps the same name. If you have a question about what ships in your country before you order, ask through the repository first.
The lamp keeps doing what it was doing. It holds its colour and brightness, the touch sensor still works, and any sunrise or bedtime alarm still fires, because the schedule and the clock live on the board rather than on your phone.
What it cannot do while offline is sync with the other lamp. If it can't reach the server that keeps the pair in sync for ten minutes, it reboots to try again, and the two lamps re-agree automatically once both are back.
There is no server of mine in the path, so there's nothing of mine to disappear. The lamps talk to each other over a public relay you can swap out any time — even run your own. If this page and the repository both vanished tomorrow, the lamps on your shelf would carry on exactly as they are.
Only someone who knows your lamps' private address, which is generated at random and never shown anywhere public. If that isn't reassuring enough, you can point both lamps at a sync server of your own, with a password — one setting, changeable any time. Either way, the only thing that ever travels is a colour. No cameras, no microphones, no telemetry.
USB-C, 5 V, into the base. No barrel jack, no proprietary connector, no batteries. Worst case the electronics draw about 1.69 A, which sits inside the board's 2 A resettable fuse and inside a 2.4 A supply budget, so it runs cool and well within its protection rather than on the edge of it.
Yes to both. The firmware is fully published and meant to be changed — updates go out over the air, and a failed update rolls itself back automatically, so it's quite hard to brick. Separately, the lamp speaks a simple, fully documented message format, so anything that can publish a message — Home Assistant, your own script — can drive it. The protocol is in the repository.
No. There's about 80 mm of glass between the LEDs and the surface you see — roughly seven times more than the fifteen sources need to disappear into one even glow. The optics-nerd version, with the actual diffusion maths, is in the technical details below.
Colour changes fade smoothly rather than snapping, so a change set to take one second really does take one second.
No to all three. Control is a free web page — no sign-up, no login, no recurring fee, ever. You can also just touch the lamp, which needs no device at all.
Fifteen LEDs sit behind the glass at an 11.13 mm pitch. Left bare, an eye resolves them as individual points. The board's own hardware notes call for a diffuser standing off by 0.7–1.0× that pitch, or about 7.8–11.1 mm, before the eye stops seeing dots. The glass block gives roughly 80 mm of scattering path — about seven times more than the rule asks for. Drag the slider to see where the dot-to-glow transition actually happens, and how far past it 80 mm sits.
Rule from the repo's hardware notes, §7.3: 0.7–1.0 × pitch. At 11.13333 mm pitch that's 7.8–11.1 mm. Ember: ~80 mm.
The fourth LED channel is a dedicated warm-white die, not red, green and blue mixed together — in code, BASE_WARM_WHITE = (0, 0, 0, 200). The exact part fitted, SKC6812RGBW-WS (LCSC C5378724), was chosen specifically to match that base colour, so every tint on the palette blends outward from a true warm white rather than an approximation of one.
Every item below is live in the firmware today, and the tests that exercise it are in the repository.
A hung board resets itself and comes back within seconds.
Three bad boots and it restores the last version that worked.
A dropped connection mid-update can't leave it half-installed.
A power cut can't corrupt the firmware or the saved state.
Every incoming message is checked and clamped before it's used.
Ten minutes offline and it reboots to reconnect on its own.
Colour and brightness are restored exactly after any power cut.
A failed clock sync retries hourly, so alarms don't quietly die.
The MicroPython firmware, the control app, the KiCad project, the fabrication files and the costed bill of materials are all published, including the full manufacturing cost breakdown. The protocol the two lamps use to talk to each other — every topic, every field, every accepted range — is documented in the repository README, so anything that can publish a message can drive them: another web page, a script, Home Assistant. Firmware updates pull from a GitHub branch, so forking the repository and pointing a board at your fork is all it takes to run your own code, with the same rollback protecting you from mistakes.
| Block | Standard glass block, 190 × 190 × 80 mm, one per lamp |
| Light source | 15 × SK6812 RGBW in one unbroken row, in the base beneath the glass |
| LED part | SKC6812RGBW-WS — the warm-white variant (LCSC C5378724), chosen to match the firmware's warm-white base |
| Geometry | Pitch 11.13333 mm; lit zone exactly 167.00 mm; 11.5 mm of glass beyond it at each side |
| Board | EM-15 rev I, integrated lamp board |
| Radio | ESP32-C3-MINI-1, a pre-certified radio module. 2.4 GHz WiFi |
| Touch | TTP223 capacitive sensor in the base — touch the lamp to change it |
| Power | USB-C, 5 V. Worst-case draw ~1.69 A — inside the board's 2 A resettable protection and inside the 2.4 A supply budget |
| Colour groups | 3 per lamp, 1–8 LEDs each, independently addressable and independently faded |
| Palette | 30 hue stops blended out of warm white; per-group warm-white level; smoothstep crossfades; a ±4% breathing oscillation with staggered phase per group |
| Alarms | Sunrise and bedtime, held on the board's own flash and run against its own NTP-synced clock |
| Firmware | MicroPython, updated over the air from GitHub |
| Control | Web app in any browser, installable to a phone home screen. No account. MQTT over WiFi, with a topic prefix you choose |
| Source | Firmware, web app, KiCad project, Gerbers, BOM and cost breakdown — all public |