Case Study
GrowWise
From frustration to the App Store —
a solo-built garden intelligence app
A companion planting and square foot gardening planner designed, built, and shipped independently — from first sketch to live deployment on iOS and Android.
01 — The Problem
New to gardening.
Short on time, space, and energy.
Like most people who start a garden, I came in with enthusiasm and left the first season confused. What went wrong? What should have gone next to what? When was I supposed to start those seeds inside? I looked for an app that could answer these questions and found nothing that actually worked — tools that were either too simple to be useful or too complex to bother with.
Then I discovered two methodologies that changed how I thought about the problem: companion planting (which plants support or suppress each other) and square foot gardening (how to maximize yield in a small space through density and planning). Together they formed a system — and systems, I know how to design.
"Most gardening apps show you information. None of them helped me make decisions."
The gap wasn't data — there's plenty of gardening data online. The gap was decision support: given my specific space, my growing zone, my time constraints, and what I want to eat — what should I plant, where should I put it, when do I need to act, and what do I do when things go wrong?
No existing app answered that question. So I built one.
in the database
per planting instance
built before writing code
02 — The Systems Challenge
One plant, thirteen states.
Two user realities. Infinite timing variables.
The hardest design problem wasn't the visual layout. It was the underlying state model — what it means for a planting to exist, progress, fail, or succeed, and how that maps to a user's actual experience in the garden.
Key Insight
There are two fundamentally different user realities: someone starting a seed indoors 8–10 weeks before last frost, and someone direct-sowing outside. These aren't just different steps — they're different timelines, different tracking needs, different failure modes, and different harvest expectations. The app had to hold both realities simultaneously without confusing users who only lived in one of them.
The 13-state lifecycle I designed maps a planting instance from first intention through final harvest or failure — accounting for every branching path a real plant takes:
Plant Lifecycle State Machine — 13 States
Placed in grid. Seeds needed calculated. Not yet started.
Seed sown in tray. Indoor timer begins relative to last frost.
Seedling visible. Transplant window begins.
Dead end. Prompts resow or replace with nursery plant.
Alternate path. Skips indoor states entirely.
In ground. From started-inside or nursery purchase.
Third path. Bypasses seeding entirely.
Established. Harvest window approaching.
Visual cues shown. What to look for at this stage.
Ongoing harvest. Some plants yield repeatedly.
End of cycle. Seeds returned to inventory.
Season complete. Removed from active view.
Failure state. Prompts diagnosis and replant decision.
The companion planting logic, which initially seemed like the complex part, turned out to be more elegant once I realized it operates at the plant family level — alliums, asteraceae, solanaceae — rather than requiring custom rules for every individual plant pair. That insight collapsed what could have been thousands of relationship rules into a manageable taxonomy.
Two views, three tabs
The planning interface needed to serve two mental models simultaneously: spatial thinkers who plan by grid and sequential thinkers who plan by timing. I designed both — a visual grid view and a list view sortable by timing or alphabetically — unified by the same three-tab structure: Active (in the ground now), Planned (placed but not yet started), and Done (completed, failed, or saved).
The three-tab structure did something important beyond organization: it defined the seed inventory. A planting only counts toward seeds needed once it's in the Planned tab — giving users a clear, accurate picture of what to buy before the season starts.
03 — The Build
From personal tool to
App Store product.
GrowWise began as a tool I was building for myself in Lovable.ai — a prototype that worked well enough to use in my own garden. The moment it became a real product was when I realized the underlying system I'd built had value for anyone who gardened the same way I was trying to learn.
Prototype in Lovable.ai
Started as a personal tool. Built the core planning logic and grid view. Validated the concept by using it in my own garden every weekend.
Connected GitHub + Supabase
Once the scope expanded beyond personal use, connected to version control and built out the Supabase backend — user authentication, plant database, planting instances, growing zone data.
Extracted from Lovable → Cursor
Moved the codebase out of Lovable and into Cursor for full development control. Used Claude Code for specific problem-solving — complex state transitions, timing logic, edge cases.
Native app deployment via Xcode + Android Studio
Deployed to both platforms independently. Handled App Store and Google Play review processes, metadata, screenshots, and all technical requirements.
Visual design system in Adobe Illustrator
Designed all icons in Illustrator. Created the intro animation in Premiere. Established a visual language that carried through the app and into the physical world.
The 3D printed side-quest
Designed and 3D printed physical garden labels with swappable icon-chips. The physical design system became the foundation for the app's plant categorization icons — the digital and physical systems informing each other.
Lovable.ai
Rapid prototyping — concept validation before committing to full build
Supabase
Backend database — plants, users, planting instances, growing zones
Cursor
Primary development environment — full codebase control and iteration
Claude Code
Complex problem-solving — state machine logic, timing calculations, edge cases
Adobe Illustrator
Icon design system — all plant category and UI icons
GitHub + Xcode / Android Studio
Version control and native deployment to both app stores
04 — Testing & Iteration
Every weekend in the garden
was a usability test.
Testing was 20 beta testers — roughly 10 on iOS, 10 on Android, all friends and family — and me, using the app every time I worked in my garden. That second part mattered most.
"A new build shipped every other weekend. The garden told me what to fix."
The iteration cycle was simple and direct: spend Saturday in the garden using the app, notice what was confusing or missing, build the fix, ship Sunday. Repeat. Over two growing seasons this produced a cadence of continuous real-world usability testing — not in a lab, not with a script, but under actual conditions with actual stakes.
Key features that emerged from this process: the timing relative to last frost (I needed to know how many weeks I had, not a calendar date that meant nothing to me), the seed quantity calculator (I kept buying too many or too few), and the harvest guidance per plant (I kept harvesting too early or missing the window entirely).
What this demonstrates
The willingness to be your own most critical user — and to treat every friction point as a design failure rather than a user error — is the same discipline that produces good UX in any domain. The garden was just an unusually honest feedback environment.
05 — Reflection
What I'd do differently.
Honest retrospective
The database I built over two years before writing code is both the app's greatest asset and its greatest constraint. The plant data is rich and accurate — but it's opinionated toward my own growing experience. A more rigorous approach would have involved structured interviews with gardeners at different experience levels and in different growing zones before I finalized the data model.
The 3D printing side-quest was genuinely one of the best design decisions I made — the physical labels forced me to think about the icon system with a discipline that a purely digital design process wouldn't have demanded. I'd do it again, earlier.
And the state machine, which I'm most proud of, could be surfaced more explicitly to users. Right now the complexity is hidden — which is correct from a UX standpoint — but experienced gardeners have asked for more visibility into the logic. A "power user" mode is on the roadmap.
