On this page: What EDCO is for · Specifications · How it is built · Light and runtime · Using the light · Electronics · Cost · Drawings and animations · What has been checked · Open points before the first order · Files
EDCO is LuxLibre reference design #2: a round, sealed everyday-carry light. The body is a Ø20 × 93.5 mm aluminium tube with a closed tail, and it runs on one 14500 Li-ion cell. There is no laser and no radio. Charging, firmware updates and settings all go through one sealed USB-C socket in the tail. The light inside is the 1000 lm power stage of FlashKa Keychain v0.7: an SST-20 Gen 2 LED behind a LEDiL TIR optic and a 4 A driver.

Render made from the design files.
Status: concept (v0.1). The housing is modelled in CadQuery and checked for fits and walls. The firmware board header exists, and the light output is simulated with the LuxLibre simulator. The circuit boards are not drawn yet, and nothing has been built or measured. Every light figure on this page is simulated. The light holds a lithium cell: read SAFETY.md first.
These are the owner’s requirements for this design:
| Item | Value |
|---|---|
| Size and mass | Ø20.0 × 93.5 mm. Aluminium parts weigh 37.9 g (tube 33.1, head 3.6, bezel ring 1.2; calculated from the CAD solids). About 65 g complete with the cell (estimate, not weighed) |
| Body | 6061-T6 tube with a closed tail, turned and milled, bead-blasted and anodised black or clear (clear gives a titanium look). It has a Ø15.2 mm bore for the cell and the electronics, a scalloped button pocket, a label flat with a laser-marked “EDCO”, and two lanyard holes through the tail corners |
| Front | The bezel ring screws onto the tube’s external M18 × 0.75 thread and is locked with thread-locker. It clamps the head (the LED holder) onto the tube’s front face. The head seals in the bore with a 13 × 1 O-ring, and the TIR optic is glued into the head |
| LED and optic | Same as FlashKa v0.7: Luminus SST-20 Gen 2, 6500 K, G1 bin, on a 10 mm copper DTP board, under a LEDiL LISA3-RS-PIN TIR optic (20° beam). The head and the tube are the heat sink |
| Light output | Simulated with the LuxLibre simulator and the LED at 85 °C. Turbo gives 966 lm out of the front (about 1,045 lm in the first seconds with a cool LED, as for v0.7). It holds full turbo for 74 s if the 60 s turbo timer is off. High gives 592 lm for about 4 minutes (237 s). After that it settles at about 290 lm with the body at 47.4 °C. Runtime from turbo to the ANSI end point is about 141 minutes. Throw is 6,605 cd / 162.5 m at switch-on, the same LED and optic as v0.7. More in Light and runtime |
| Battery | One Vapcell INR14500 F15 (1,500 mAh typical, 3 A, 14.0 × 49.0 mm), as on v0.7. Nickel strips are spot-welded to both ends. The cell is protected on the main board by a DW01A IC and an SE8830A dual MOSFET |
| Charging and USB | One USB-C socket in the centre of the tail face. It is a waterproof vertical socket whose seal ring seals inside the obround hole of the tail wall. TP4057 linear charger at about 500 mA (about 3.5 h). USB 2.0 data goes to the chip’s built-in USB serial/JTAG port: firmware updates and settings |
| Button | One stainless cap on a clamped silicone membrane (a static seal), held by a stainless collar in a counterbore of the pocket. A POM pin carries the press through the wall to an Alps SKRK tactile switch on the main board |
| Indicator | One RGB LED on the main board shines up a Ø1.45 mm PMMA light pipe that is glued into the pocket below the button. It shows charging and battery state |
| Electronics | ESP32-C3FH4 chip (QFN-32, 4 MB flash, rated to 105 °C) with a 40 MHz crystal and no antenna: the radio is never started. TPS62095 4 A buck in the TLV333 current loop (as v0.7), TP4057, DW01A + SE8830A, RT9080 LDO, NTC. One main board (12 × 22 mm, 4 layers, 0.8 mm) in a black POM sled, a round tail board (Ø12.2 mm) with the socket, and a 4-wire flex between them |
| Water | IPX8 is the target (not tested). There are five seals: head O-ring, glued optic, button membrane, the socket’s own seal ring, glued light pipe |
| Firmware | The LuxLibre firmware on its ESP32-C3 port, board firmware/boards/edco-v01: one-button user interface, thermal regulator, low-voltage protection, a text console over USB for settings |
| Cost | About 710 USD for one light and about 235 USD per light when five are made, all fees, shipping and VAT included. This is a rough estimate scaled from the v0.7 workbook (Cost) |
![]() |
![]() |
|---|---|
| Tail. The USB-C socket in the centre, a lanyard hole through each corner. | Front. The bezel ring, the head with two spanner holes, the TIR optic. |
![]() |
![]() |
| Button. Stainless cap and collar, indicator light pipe, laser-marked label. | Clear anodised. The same light in bead-blasted natural aluminium. |

From the front to the tail:

The LuxLibre simulator was run on both board headers: firmware/boards/edco-v01 and
firmware/boards/flashka-keychain-v07. The settings were 25 °C still air, a full cell and the
default profile. Lumens are out of the front with the LED at 85 °C, the datasheet’s reference. In
the first seconds a cool LED gives about 8 % more.
| EDCO v0.1 | FlashKa v0.7 (same simulator) | |
|---|---|---|
| Turbo | 966 lm | 966 lm |
| Full turbo with the 60 s timer off | 74 s | 56 s |
| High (1.5 A) at full output | 592 lm for 237 s | 592 lm for 184 s |
| Sustained (temperature regulator) | about 290 lm, body 47.4 °C | about 290-300 lm, body 46.8 °C |
Temperature limit (THM_LIMIT) |
49 °C | 50 °C |
| Turbo from a half-full cell, at 30 s | 774 lm | 774 lm |
| Runtime from turbo to the ANSI end point | 141 min | 138 min |
| Throw at switch-on | 6,605 cd, 162.5 m (same LED and optic) | 6,605 cd, 162.5 m |
The round tube couples the head to the body more tightly than the octagon. That spreads the heat
better, but it also lets the body get closer to the sensor temperature. EDCO therefore uses
THM_LIMIT 49 (v0.7: 50), which keeps the held surface below the 48 °C of
THM-1. On a 35 °C day the body reaches 48.3 °C in the
simulation, at about 180 lm. Reproduce the runs with:
cd firmware
make sim BOARD=edco-v01
build/luxsim-edco-v01 --preset board --csv turbo.csv "2C W900000"
build/luxsim-edco-v01 --preset board --set TURBO_S=0 "2C W900000"
build/luxsim-edco-v01 --preset board --set UI_STYLE=0 --set MEMORY=0 --set MEM_LEVEL=138 "1C W900000"
build/luxsim-edco-v01 --preset board --csv run.csv "2C W16000000"
The default is the LuxLibre “modes” layout (full table).
| Light is | Do | Result |
|---|---|---|
| off | click | on at the last mode |
| off | hold | moonlight (3 mA) |
| off | 2 clicks | turbo (60 s, then High) |
| off | 3 clicks | battery check (blinks) |
| off | 4 clicks | lockout on or off |
| on | click | off |
| on | hold | next mode: Low 19 lm, Medium 119 lm, High 592 lm |
| on | 2 clicks | turbo, and back |
Settings and updates over USB-C. Plug the light into a computer. The LuxLibre console answers
on the USB serial port: status, list, set NAME VALUE, save, and so on
(console). Firmware is written with idf.py flash or
a Web Serial installer page like the FlashKa one. A single EDCO page that does both (settings and
installer) is on the to-do list.
| v0.7 part | EDCO |
|---|---|
| ESP32-C3-MINI-1 module (U4) | ESP32-C3FH4 chip, LCSC C2858491, plus a 40 MHz ±10 ppm crystal (Murata XRCGB40M000F1S1DR0, C1870453), its load capacitors and the decoupling from Espressif’s checklist. No antenna and no matching network, and the RF pin is left open. Pads for 22 Ω series resistors on D+ and D− |
| Laser: Q1 AO3401A, S2 slide switch, R19, J5, the laser module | removed |
| Key board: three switches, two ring LEDs, six pogo pins | one SKRKAEE020 switch (C115357) and one RGB LED (NH-B1010RGBT, C2874113) on the top side of the main board; the button ladder becomes one digital input |
| USB-C TYPE-C-31-M-12 on the main board | a tail board with a waterproof vertical socket, SHOU HAN TYPE-C 16PFS LTH7.45 IPX8 (C3020055, JLCPCB can assemble it), the two 5.1 kΩ CC resistors and ESD protection. Alternative: Same Sky UJ20-C-V-SMT-TR-68 (IP68, silicone O-ring) |
| — | a 4-wire flex (VBUS, D+, D−, GND, about 62 mm) between the tail board and the main board |
| power stage, protection, charger, LDO, NTC | unchanged |
Planned pin map (the v0.7 map with a digital button): GPIO0 cell voltage, GPIO1 NTC, GPIO2 / 8 / 21 indicator blue / green / red, GPIO3 button (a deep-sleep wake-up pin), GPIO4 / 5 charger status, GPIO6 LED current set point, GPIO7 driver enable, GPIO18 / 19 USB D− / D+, GPIO20 charge current, GPIO9 boot strap (test pad only).
There is no EDCO workbook yet. These numbers are scaled from the v0.7 workbook (FlashKa_Parts_List_v0.7.xlsx), with the same scenarios, Lithuania, all fees, shipping and VAT.
| One light (USD) | Five lights, per light (USD) | |
|---|---|---|
| FlashKa v0.7 (workbook) | 859 | 299 |
| no rubber-key casting supplies and mould | −89 | −18 |
| no laser module | −24 | −24 |
| no pogo pins | −25 | −11 |
| three turned parts instead of the milled octagon tray and lid (estimate) | −20 | −15 |
| stainless cap and collar, POM sled and pin instead of the PMMA and POM-C kits (estimate) | 0 | 0 |
| flex PCB and the tail board in the panel (estimate) | +25 | +6 |
| waterproof socket, O-ring, membrane, light pipe | +6 | +5 |
| less VAT on smaller orders | −22 | −8 |
| EDCO v0.1, about | 710 | 235 |
![]() |
![]() |
|---|---|
| Turning. The button, the label flat and the sealed USB-C socket in the tail. | Coming apart. Bezel ring, optic, LED board, head, button parts, main board, cell, tail board, body. |
Body drawing: PDF, DXF. The drawings are A3 sheets at 2:1, made from the same parameters as the STEP files by hardware/tools/edco_drawings.py. Each has the outline, a section, the end views and a feature table with tolerances, and every dimension on it is checked against the solid (check report). The animations are made by hardware/tools/edco_anim.py. All of them are renders and drawings of the design: nothing has been built yet.
All numbers are in cad/edco_interface.json, written by tools/housing/edco_housing.py.
Thread engagement (MEC-4). The ring engages about 2.8 mm (3.7 turns of 0.75 mm). That is enough for a ring that only clamps and is locked, but lengthening it costs only body length.
| Path | What |
|---|---|
| cad/EDCO_body.step, EDCO_bezel_ring.step, EDCO_head.step | the three aluminium parts, plain thread diameters (threads and marking go on the drawings) |
| cad/EDCO_v0.1_assembly.step | every part in place (with stand-ins for the boards and the socket) |
| cad/edco_interface.json | sizes, walls, fits, masses and the interference check |
| cad/EDCO_body_drawing.pdf, .dxf, .png | the body drawing (A3, 2:1) |
| tools/housing/edco_housing.py | the CadQuery model (all dimensions in class P): python3 edco_housing.py ../../cad |
| tools/housing/edco_render.py | the renders: xvfb-run -a python3 edco_render.py ../../assets (uses the v0.7 renderer) |
| ../tools/edco_drawings.py, ../tools/edco_anim.py | the drawings and the animations of all EDCO designs: python3 hardware/tools/edco_drawings.py, xvfb-run -a python3 hardware/tools/edco_anim.py (from the repository root) |
| ../../firmware/boards/edco-v01/board.h | firmware board header, with the thermal model for the simulator |
Licences as for the rest of LuxLibre: hardware CERN-OHL-W-2.0, firmware and tools GPL-3.0-or-later, this page CC-BY-SA-4.0 (LICENSING.md).