We grow a lot of vegetables. Fourteen raised beds of carrots, cauliflower, potatoes, tomatoes, kale, and more, all in a Pacific Northwest garden where the variables never sit still. I wanted something that could tell us when to water and when blight risk was climbing. I wanted to build it. So I am.
Ceres is a multi-agent assistant for our raised-bed garden in Graham, Washington. The whole thing runs on my homelab with the exception of farming some queries to the Anthropic API.

What It Does
Ceres turns a garden full of guesswork into something you can talk to. You can hold a mic button and say “aphids on the kale,” and it transcribes, tags, and logs it to a permanent history. You can snap a photo of a sick leaf and get back a health assessment. You can ask “when do I harvest the broccoli in bed J?” and get an answer grounded in what is actually planted, the soil moisture, the weather, and that plant’s care profile, not generic advice off the internet.
Every morning it produces a briefing: per-bed watering recommendations with rationale and confidence. Planned are anticipatory alerts for things like bolting or pest pressure, and a todo list. Urgent items like frost warnings will push to the phone. Everything Ceres has ever done with you lives in a single reverse-chronological history feed.



How It Thinks
Ceres is not one model. It is a set of specialist agents coordinated by an orchestrator, with a model router deciding which brain handles each task. Cheap, high-volume work like parsing a voice note runs on a local Ollama model. Judgment-heavy work routes to Claude. Flipping a task from local to cloud is a one-row change, and every call logs its cost.
The first live specialist is the watering agent. It gathers the live garden state cell by cell and decides what needs water today, with a confidence level on each call. More specialists are on the way.
The Rules It Is Built On
A few things had to be true from the start.
Every recommendation shows its rationale and a confidence level. Low-confidence items surface in a “Needs Your Judgment” view instead of blending silently into the main list. If a sensor is offline or a profile is missing, Ceres says so. Hidden failures are worse than obvious ones.
Kim should never have to ask me to change anything. Anything she should be able to edit lives in the database, not in code or YAML. That is a hard architectural rule, not a preference.
Overrides are signal, not noise. When Kim ignores a recommendation, that gets logged with context and feeds future evaluation. The system should get smarter from disagreement, not just from compliance.
Nothing gets deleted. Multi-year history matters because Kim should be able to ask “how did the kale do last May?” three years from now and get a real answer.
The Stack
Compute runs on Nova: RTX 4070 and 2080Ti, Ollama, TimescaleDB, Qdrant, NGINX Unit. Orchestration runs on n8n. The backend is FastAPI with server-rendered HTML forms that work without JavaScript, because we use this from our phones out in the dirt.
Sensing comes from a Reolink RLC-510WA camera, Ecowitt WH51 soil moisture sensors, and a Tempest weather station, all flowing through Home Assistant. Home Assistant owns the raw telemetry. Ceres owns the calibrated, bed-tagged, aggregated copy. One ingest job, one curated set of tables.
Speech-to-text is faster-whisper. Vision uses YOLO for detection plus the camera feed. The repo lives in Gitea, managed with Claude Code.
Where It Stands Today
Ceres went from a bare scaffold to something we genuinely use. We can talk to it, show it a sick leaf, ask it questions, and get a real watering plan, with a full history of all of it.
There is plenty left: more specialist agents, the year-over-year intelligence, and a lot of hardening. But it has crossed the line from plumbing to assistant.