Big camera-vision day on the boat stack, almost all of it in maracaibo-camtank — 30 commits and thousands of lines churned on the diesel sight-tube reader.
The morning started as damage control: the snapshot path was re-encoding video per frame and eating half a core on the little onboard computer, so I slowed the poll to compensate. By midday I killed that whole dependency — the camera can serve a JPEG directly, so now camtank asks it for one and nothing transcodes anything. From there the pipeline got smarter in layers: a silhouette mode for backlit tubes, printed ArUco tags on the tank wall that auto-calibrate the region of interest every poll, and a Kalman filter that fuses what the camera sees with each engine’s burn rate. The honest lesson of the day was that the human stays in the loop — a “Set level” tool anchors the filter, and after trying to pair the two tanks purely on image geometry, I ripped that out and let the pairing learn from human anchors instead. The evening was one long tracing arc: the calibration box went from being the answer, to a seed, to just a search region, with the tracer following the tube’s actual texture. Plus a task-first mobile UI and adding cameras from the browser instead of SSH.
maracaibo-dashboard got weather teeth — area warnings, wind-threshold alerts, a red alarm when live gusts breach limits — and little history sparklines behind the sensor cards. maracaibo-sonoff swapped a hand-made cloud token for proper OAuth with auto-refresh, and now clears stale power readings instead of lying. Maracaibo itself got a small fix that kills an hourly CPU spike by baking a dependency into the image. A Wine App barely moved; The Cloudy Brain saw a heavy automated reshuffle of content and scripts, judging by the churn.
Tonight: the fuel gauge follows the tube on its own, and a human tap keeps it honest.