Plant Tracker

Case study · Tech & fun

Photograph a plant, and a care plan grows back

What
A camera-first houseplant tracker: photo in — species ID, health score, and a care schedule out, with a daily digest of what needs you today.
Stack
Flask + Supabase behind a vanilla-JS PWA; photo analysis runs out-of-band through Claude Code against a sourced species database.
Status
Active
Dates
Built July 2026 · Updated August 2026
Links
Local-only — runs on the home network, no public deploy or repo

Background

Can a phone camera keep a houseplant collection alive?

Plant Tracker bets that the camera is the only interface a plant app needs. Photograph a plant, and the system identifies the species, reads its condition, and generates a watering, light, feeding, and repotting schedule from a species database where every care claim has a source. A daily digest then triages the collection into what needs you today.

The twist: the backend never calls an AI API. Photos land in a pending queue, and a Claude Code session, run by hand or as a daily routine, does the vision analysis and writes care profiles back. No API keys, no per-request bill, and the Flask app stays a dumb, reliable CRUD server.

A Look Inside

Each view shown on mobile and desktop — captured from the app running locally. Personal tool, no public deploy.

The Today digest triages the whole collection into what actually needs you (mobile) The Today digest triages the whole collection into what actually needs you (desktop)
The Today digest triages the whole collection into what actually needs you — species-specific tasks with overdue states, then the watering schedule coming up.
Every plant gets a dossier: care cadences from a sourced species database (mobile) Every plant gets a dossier: care cadences from a sourced species database (desktop)
Every plant gets a dossier: care cadences from a sourced species database, one-tap Watered / Fed / Repotted logging, and an AI read of the latest photo.

How It Works

A small Flask + Supabase backend serves an installable vanilla-JS PWA; everything intelligent happens out-of-band:


← Back to Homepage