The Setup
A self-hosted command center for growers who run more than one kind of garden.
CultiVue is a general-purpose garden management platform for hobbyists who juggle hydroponics, raised beds, containers, and aquaponics side by side. Built through AI-assisted iteration, it ships as a one-command Docker deploy with IoT sensor integration, multi-user auth, and zero external dependencies.
One platform for every growing method in the backyard.
Most garden trackers pick a lane — hydro or soil, indoor or outdoor. CultiVue treats the 15+ garden types as first-class citizens, with dynamic metrics that adapt to each system so growers stop stitching together three different apps to manage one backyard.
Your data stays on your hardware.
Self-hosted by design. Docker + SQLite means growers own the database, the sensor integrations, and the audit trail — without a subscription, a cloud dependency, or a vendor who can decide to sunset the product tomorrow.
The Landscape
Hobbyist growers don't run one kind of garden — they run all of them.
CultiVue started life as HydroMate — a focused Flutter mobile app for hydroponic nutrient tracking, built in three days by adapting Printory's architecture. It worked, but feedback surfaced a bigger pattern almost immediately: the same people running DWC and NFT systems also tended raised beds, containers, and the occasional aquaponics loop.
A narrow mobile app couldn't hold that scope. Every serious grower was stitching together two or three tools to track what should have been one coherent operation — and none of the tools let them keep their own data or plug in their own sensors.
Gardens list with type badges, location tags, and live pH/PPM readings per system.
The Mission
Rebuild HydroMate as a general-purpose, self-hosted platform for every garden type.
Write a new PRD defining a full-stack web app that handled 15+ garden types with dynamic per-system metrics, IoT sensor ingestion, multi-user auth, and Docker deployment — then build it through AI-assisted iteration without shipping a bloated frontend or giving up data ownership.
The Moves
Four bets, each testing a different risk.
A data model that adapts to every growing method
The hardest call early on was whether one schema could represent DWC, Kratky, NFT, drip, ebb & flow, raised beds, containers, and aquaponics without collapsing into mush. We landed on dynamic metrics per garden type — each system defines its own relevant measurements — so a hydroponic loop tracks pH and PPM while a raised bed tracks soil moisture, all from the same core tables.
A zero-dependency frontend, on purpose
Vanilla JavaScript and CSS custom properties instead of React or Tailwind. That sounds like masochism until you remember the target user is someone running Docker on a Raspberry Pi — small image, simple deployment, no build toolchain for contributors to wrestle with. The tradeoff made the UI cycle slower, but kept the ship small enough to actually run on the hardware hobbyists already own.
IoT ingestion that a hobbyist could actually wire up
Sensors only matter if people can connect them. Built a REST API with per-device API keys, rate limiting, and HMAC-signed webhooks for external integrations — enough security to trust on a home network, simple enough that an ESP32 project can POST a reading in a few lines of Arduino. The pH trend charts came free once the ingestion side worked.
PRD-first, AI-assisted iteration as the build loop
Every feature cycle followed the same pattern: sharpen the PRD, let Claude Code scaffold the implementation, test against real garden data, then refine. The first session produced the full API layer, database migrations, and routing. Later cycles added the OOBE setup wizard, admin management, audit logging, WCAG 2.1 AA pass, and the seed inventory with supplier and germination tracking — each landing in hours instead of days.
The Payoff
A full-stack garden platform shipped in three months.
In three months, CultiVue went from a three-day Flutter prototype to a Node.js + SQLite web app supporting 15+ garden types, IoT sensor ingestion, multi-user auth with admin management, audit logging, WCAG 2.1 AA accessibility, and a one-command Docker deploy. The AI-assisted, PRD-first loop made the scope tractable for a solo builder without sacrificing the parts that matter on self-hosted hardware.
Garden types supported
Frontend dependencies
One-command deploy
Looking Back
The scope wasn't the risk — pretending it was smaller than it was would have been.
HydroMate was the right first step because it proved the core loop was worth something, but the feedback that pushed it toward a full platform was the real signal. Trusting the PRD-first, AI-assisted workflow let the scope grow without the timeline exploding — and kept the thing honest as a self-hosted tool instead of drifting into yet another SaaS.