ATI Straton Flex Rewrite

An independent replacement for the fixture's web and dimming application — what it does, how it is deployed, and how it measured against the original.

Technical overview · 10 October 2026 · Gerd Rooselaers · rooselaers.be/Acropora

Scope

This replaces one layer and one layer only: the Node.js application that serves the fixture's web interface and drives its LED dimming. The hardware, the Onion Omega2+ board, OpenWrt, the init system, SSH, networking, and the LED driver board underneath are all untouched and unmodified.

It runs as a drop-in substitute for the original application's own process — same init script, same restart mechanism, same node --expose_gc invocation the device already used. It speaks the same serial protocol to the LED driver, reverse-engineered from the original application's observed behaviour rather than guessed, and it keeps the same bearer-token HTTP API, so existing automation continues to work without changes.

Built for two specific fixtures. This is not a general-purpose release and is not published as source. It was written against the author's own two out-of-warranty units and is documented here because the reliability notes it follows from are public.

Architecture

The original application is a single file of roughly 23 KB plus a bundled dependency tree. The rewrite is a set of small single-responsibility modules with no runtime dependencies at all — nothing outside the Node standard library, which is what lets it drop the bundled tree entirely.

AreaResponsibility
orchestrator, schedulerResolving the lighting schedule for the current moment and driving output
hardware, protocol, dimmerSerial framing to the LED driver board, per-channel value computation
fixture_runtimeSchedule, spots and colour state; the single place that writes schedule files
web_server, templates, sessions, authHTTP routing, pages, login state, password and token handling
temperature, par_powerLive sensor sampling, smoothing, derating and shutoff
peer_syncOptional schedule replication to a second fixture
memwatch, event_logMemory ceiling enforcement, in-process event history
system_backup, support_bundleConfig export and diagnostics archive, with secrets redacted
setup_wizard, wifi_setup, timezone_setup, ssh_setupFirst-boot and settings flows that previously needed shell access

It carries its own automated test suite — several hundred tests — run both on a current Node release and specifically on the Node 8.10.0 the fixture itself runs. That second target matters: a test passing on a modern engine proves nothing about a nine-year-old one on a 124 MB board with no swap, and more than one real incompatibility was caught that way before reaching hardware.

What it adds

Deployment

Deployment is a single supervised script, run by hand — nothing deploys automatically. It is deliberately conservative, because the fixtures light a live reef tank:

An off-device backup is taken independently before each rollout and verified restorable — not merely created — by test-extracting it and comparing a checksum against the running version.

Side-by-side trial

One fixture ran the rewrite while the other stayed on the original application, on the same tank, same schedule and same automation, for six days of direct comparison before the second unit was switched over on 10 October 2026.

Original applicationRewrite
Availability checks1614 / 16141614 / 1614
Failures00
Automatic recoveries00
Memory, mean119.2 MB114.3 MB
Memory, range114.4 – 122.1 MB112.4 – 115.5 MB
Drift over the window−1.4 MB+1.6 MB

Neither showed any sign of a memory leak: both drifted by under 2 MB over 135 samples, and not consistently in one direction. The rewrite averaged about 5 MB lower with less than half the variance. Switching the second unit freed roughly 20 MB of RAM and some flash on it, since the bundled dependency tree goes away.

What this does and does not show. It shows the rewrite introduces no regressions. It does not show that the rewrite fixes the original crash described in the reliability notes — because the original application did not crash during the window either. A memory-limit correction had already addressed that, and the unit still running the original passed thirteen days of uptime against roughly six-day failures beforehand. The case for the rewrite is that it is leaner and maintainable by its owner, not that it rescued a crash.

Verification after rollout

A fixture answering HTTP does not prove it is lighting anything. Each rollout is therefore confirmed on three independent signals: the fixture's own PAR sensor reading compared against the other unit's (they tracked within 1.5%), a successful scheduled push from the external automation after the swap, and the preserved schedule data read back through the API.

Limitations

This hardware is out of warranty. The author considers inspecting, patching and rewriting equipment he has paid for and runs himself to be entirely his own call and his own risk to carry. If any of this is useful background for your own out-of-warranty unit, the same applies to you.

Companion writeups: ATI Straton Flex Reliability Notes and ATI Straton Flex Firmware Rewrite at rooselaers.be/Acropora.