Pearling is the software that runs this aquarium. It runs the light through the day, switches the CO₂ and the light's power, reads every device on the tank, learns what normal looks like for this tank from its own record, and flags anything that drifts out of line. The rest of this site is drawn from that record.
What It Is Watching
Aquarium
UNS 90P · Dutch-inspired planted layout · ADA Amazonia Ver.2 · rescape started July 3, 2026
Light
Chihiros WRGB II Pro 90, installed September 17, 2026 · R125 G95 B130 W0 · ramp up from 9am, full 9:30am – 3:30pm, off 4pm (schedule copied from the fixture’s app, checked November 1, 2026). The original ADA Solar RGB is out of service and kept as the baseline.
CO₂
Regulator and solenoid into an inline diffuser · a fixed daily window that follows the light, switched by Pearling on a Kasa HS300 smart strip: on two hours before the light, off when it starts to fade. Off below pH 4.50 and during water changes, and a timer on the strip shuts it off within ten minutes if the Pi stops · not closed-loop on pH; the logged pH drop is used to review and tune the schedule
Fertilizer
2Hr Aquarist APT 3 · 4 mL/day in one dose, dosed automatically by the Red Sea ReefDose 2
Water
RODI remineralized with 2Hr Aquarist APT SKY, 9 g per 20 US gal (11.25 g for a 25 gal batch) · practice, not a measurement: KH kept near zero on purpose; GH generally around 5–6 dGH
Temperature, pH and conductivity logged continuously · PAR measured by hand · water chemistry hand-tested
Background
Clear rear glass, no illuminated background; the room wall is visible behind the tank. The DET panel failed in October 2026 and is out of the tank; it is repairable.
A tablet mounted beside the aquarium showing Pearling · A private dashboard · This public site
The Screens
These are the screens Pearling is run from, captured on the live tank. The same views rotate on the display beside the aquarium.
The control room. Every reading with its source and age; the green band behind the pH trace is what is normal for this tank at each time of day, learned from its own last two weeks.Normal. Each day is described by a set of behaviours (the CO₂ drop, pH at dawn and midday, the lows and highs, temperature, conductivity) and each one is scored against its own normal range from the last 30 days.One day of pH and temperature against their normal bands, with yesterday faintly behind and the CO₂ window shaded.The light. Four channels held to the fixture's own 110 W limit, scenes, and the day as points that can be dragged. Shown here as a preview of the peak mix.The weekly report, also emailed every Sunday: what needs doing this week, pH day by day on one scale, each behaviour against its normal, and what happened.The wall display beside the tank. It rotates through its views and keeps two buttons: water-change mode and the guided degassed pH check.
Recorded Data
These are counted from the database when the page loads. If the logger stalls, the date below goes stale and you can see that it has.
39,018tank readingsover 141 days
277readings per dayroughly one every five minutes
77PAR readingsmeasured by hand
Continuously logged
Temperature, pH, conductivity, the light's power draw, CO₂ on and off, the heater's power, the Nero's flow and the doser's container level
Recorded by hand
Water tests (38 logged, last on October 11, 2026) and PAR readings at each plant position
First reading
June 14, 2026
Most recent reading
November 2, 2026
Events logged
/Filter flow profile switched: 220, last on November 2, 2026
/Water change: 46, last on October 28, 2026
/Fertilizer dose: 17, last on June 26, 2026
/Note: 6, last on September 19, 2026
/pH probe calibration: 4, last on September 20, 2026
/pH probe replacement: 3, last on September 20, 2026
/cleanup: 1, last on October 4, 2026
/trim: 1, last on September 18, 2026
/plant: 1, last on September 18, 2026
These are counts of what was logged, which is not the same as what was done. Fertilizer went in by hand for a period during this scape and did not get an entry every time; it is now dosed automatically by the ReefDose, which keeps its own record rather than writing a journal entry per dose.
Control Architecture
The light and the CO₂ are run by Pearling. The light’s day (ramp up from 9am, full 9:30am – 3:30pm, off 4pm) is a set of points with straight-line fades between them; during a ramp the Pi checks every three seconds and sends each step as it falls due, the finest the fixture can take. Every mix is held to the fixture’s own power rule, each channel 0–140 and 110 W in total, and checked again on the Pi before it is sent.
CO₂ and the light’s power are on a TP-Link Kasa HS300 smart strip that the Pi controls over the local network. CO₂ is on from two hours before the light until the light starts to fade; it goes off below pH 4.50 and comes back at 4.60, and it stays off while water-change mode is on. Change the light day and the CO₂ and power windows move with it.
The safety limits do not depend on the software. A countdown timer on the strip itself turns CO₂ off within ten minutes if the Pi stops refreshing it. The strip stores its own backup schedule: the light’s power window, and CO₂’s off time only, so a dead Pi can never turn CO₂ on. The Pi also keeps the strip’s clock right, so a wrong clock after a power cut cannot fire that backup at the wrong hour. The Apex keeps the probes, the leak and water-level sensors, the pumps and the heater’s high-temperature cutoff.
Every one of these is watched from outside as well: if the Pi goes quiet for ten minutes, a check that runs in the database rather than on the Pi sends the alert.
Learning What Normal Is
Fixed thresholds miss the slow problems: a CO₂ drop that is a little smaller every day, or a tank that runs warmer than it used to. So each day is described by a set of behaviours (the CO₂ drop from dawn to midday, pH at dawn and midday, the daily low, high and swing, temperature, conductivity, the light’s energy, and how long CO₂ and the heater ran) and each behaviour’s normal range is learned from the tank’s own last 30 days.
A day is scored by how far it sits from its usual value, in that behaviour’s own spread. Water-change days are only compared with other water-change days, because a change moves pH and conductivity on its own. When the pH probe is replaced, pH levels start learning again. Anything well outside its range goes on the timeline and to a phone, with the likely cause and what to check.
Two more checks guard the record itself. Devices are cross-checked against each other (two thermometers, the doser’s schedule against what it actually dosed, the pump’s setting against its speed). And while a deliberate test is running, any change to the light, CO₂, dosing, heater or flow is flagged, so a result is not muddied by a tweak made halfway through.
Doser Telemetry
The Red Sea ReefDose is read directly over the local network rather than through Red Sea’s cloud. Both heads are picked up individually: what each one doses, the schedule it runs, the milliliters it has put in today against what it was supposed to, the actual volume dosed on each of the last seven days, and how much is left in the container.
Head 1
Unassigned
Head 2
2Hr Aquarist APT 3, 4 mL/day, one dose a day
Read from the doser when this page loads.
APT 3 is a single-bottle fertilizer, so one head carries it and the second head is unassigned. Fertilizer went in by hand for a period during this scape, while the doser was not dosing, and the record from that period says so. Automatic dosing of APT 3 began in October 2026. Dosing is now automatic and the same every day, which removes one variable going forward. It does not reach back and clean up the results taken before it.
Operational Limits
/It does not hold CO₂ against a pH target. That loop was built and run, and it worked. A fixed window that follows the light is steadier on water with no carbonate buffer, and the pH record is used to judge it.
/It does not set the heater. The heater keeps its own thermostat; Pearling reads its temperature and power and checks it against the Apex probe.
/It does not drive the doser or the Nero. It reads them and checks them. Each runs its own schedule.
/It does not publish anything that would signal whether anyone is home. Outlet detail and host addresses stay on the private side.
System Architecture
Runs on
A Raspberry Pi beside the aquarium, on the local network
Runs
The Chihiros light (Bluetooth), and CO₂ and the light's power on a Kasa HS300 smart strip
Reads
A Neptune Apex and its probes, the EHEIM filter and the Red Sea ReefDose over their local interfaces, and the heater and the AI Nero over Bluetooth
Application
Next.js on Vercel, with a Postgres record behind it; alerts by push to a phone and a weekly report by email
Displays
A tablet mounted beside the aquarium showing Pearling, A private dashboard, This public site
The chain, left to right, with the return path underneath. Device addresses and control endpoints are not published.