I love houseplants, but I often forget to water them or don’t always know how to care for them properly. The product manager in me wanted to validate that this wasn’t just a personal problem, so I did some light user research by browsing Reddit communities like r/gardening, where threads discuss how confusing it can be to care for different plant types. To solve this problem, I built a smart garden app that tells me exactly when my plants need water based on plant type and real-time soil moisture data.
As a user, I need an easy way to know when my plant needs water without memorizing care instructions. The solution should account for the specific type of plant and rely on real sensor data rather than guesswork or rigid schedules.
I started on the hardware side by building a circuit using an ESP32 microcontroller and a soil moisture sensor, writing the firmware in C/C++. To validate the setup, I ran a series of experiments measuring soil moisture in completely dry conditions and in water-saturated environments. After a few iterations, the readings became consistent and reliable.
Once the sensor was placed directly into a plant, the system worked as intended, continuously capturing real-time soil moisture data that could be sent to the application layer.
With the hardware working, I moved on to the software. Using Cursor, I built a mobile app with React and TypeScript that receives soil moisture readings from the soil moisture sensor and alerts me when those readings fall below a configurable threshold.
Within about an hour, I had a working MVP that displayed live moisture data and triggered alerts when a plant needed water. The app automatically calculates each plant’s status as “Thirsty,” “Happy,” or “Too Soon” based on moisture readings and watering history, turning raw sensor data into an actionable signal.
To go beyond basic alerts, I integrated the OpenAI API, using GPT-4o for image-based plant identification and GPT-3.5 for plant-specific care tips. Users can upload a photo of their plant to automatically identify the species, after which the app surfaces guidance on watering and general care, tailored to that plant.
After the MVP was functional, I focused on improving the user experience. I added the ability to name plants, attach photos, and fine-tune moisture thresholds per plant. I also refined the AI prompts so the app could inject a bit of personality like occasionally delivering plant-related puns along with useful advice.
These optimizations helped transform the app from a simple monitoring tool into something more personal and engaging, while still grounded in real sensor data and practical plant care guidance.
- Scrappy user research goes a long way: While I didn’t interview users directly, browsing Reddit communities like r/gardening surfaced recurring pain points quickly and helped validate that this problem was widely shared.
- Building is dramatically faster than it used to be: Tools like Cursor made it surprisingly fast to go from idea to MVP. What would have taken weeks to scaffold and iterate on in the past was achievable in hours.
- Iteration becomes natural once something works: After the MVP was functional, improvements emerged organically. Instead of asking “what should I build next?”, I found myself reacting to real usage and continuously refining the experience.
This website is open-source on GitHub