{"slug": "i-kept-forgetting-about-my-cactus", "title": "I kept forgetting about my cactus…", "summary": "A developer built SlothPlant, an open-source plant caretaker that pairs an Arduino UNO R4 WiFi soil-moisture sensor with a locally run open-weight model (gemma3:1b via Ollama) to send a two-line notification through ntfy only when a plant needs water. The pipeline runs soil readings through a Flask server on the developer's laptop, keeping data local with no API keys or usage fees, and is MIT licensed with setup steps in the README. The developer reports the first automatic \"thirsty\" alert arrived unprompted and is now tuning thresholds, since placeholder values make the cactus request water more often than it should.", "body_md": "*This is a submission for the [Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady](https://dev.to/challenges/hacktoberfest-week3-2026-10-19)*\n\nSlothPlant is a plant caretaker for people who forget their plants. An Arduino UNO R4 WiFi watches the soil moisture of my cactus, and a small open-weight model running on my laptop reads the readings and writes a sleepy two-line message to my phone, but only when the plant actually needs me.\n\nIt saves me the chore of remembering to check on the plant. I never look at it; it quietly checks itself and speaks up when it matters. A cactus is also the ultimate sloth plant, since it barely needs anything.\n\nHere's SlothPlant watching my cactus, with the soil sensor in the pot and wired to the Arduino's `A0` pin:\n\nAnd here's the notification that arrived on my phone when the soil read dry:\n\nA plant caretaker for people who forget their plants. An Arduino watches the soil all day, a small open-weight model running **locally** reads the readings, and your phone gets a sleepy two-line message only when the plant actually needs you.\n\nBuilt for the Hacktoberfest Open-Source AI Challenge (Week 3: Sloth Day). It grew out of a class assignment on Arduino, and the open-source AI part was built this week.\n\n``` php\nSoil sensor -> Arduino UNO R4 WiFi -> Flask server (laptop) -> Ollama (gemma3:1b) -> ntfy -> your phone\n```\n\n`readings.csv`.` gemma3:1b` through Ollama) writes the plant's message and judges borderline cases.\nMIT licensed, with setup steps in the README.\n\nThe pipeline: soil sensor → Arduino UNO R4 WiFi → Flask server on my laptop → Ollama running `gemma3:1b` → ntfy → my phone.\n\n`pip` path on Windows and got around it by calling `python -m pip`.\nBecause the model runs on my own laptop, my data never leaves it. There are no API keys, no usage fees, and nothing that stops working if a service changes its pricing. A project like this is tiny, a $30 board and a free model sending a few messages a day, and a closed API would turn it into a recurring cost for almost no work. Open weights also let me pick a model small enough for a student laptop and swap it later without rewriting anything.\n\nDuring testing, my first \"thirsty\" notification arrived without me checking on anything, which was the whole point. I'm still tuning it: my thresholds are placeholders from class testing, and a cactus likes dry soil, so it can ask for water more than it should. Next steps are per-plant tuning, or telling the model the plant is a cactus so it asks far less often.", "url": "https://wpnews.pro/news/i-kept-forgetting-about-my-cactus", "canonical_source": "https://dev.to/gurinayat_kaurmangat_27d/i-kept-forgetting-about-my-cactus-1866", "published_at": "2026-10-23 17:29:01+00:00", "updated_at": "2026-10-23 17:40:02.892989+00:00", "lang": "en", "topics": ["artificial-intelligence", "ai-tools", "large-language-models", "ai-agents"], "entities": ["Arduino", "Ollama", "gemma3:1b", "Flask", "ntfy", "Hacktoberfest"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/i-kept-forgetting-about-my-cactus", "markdown": "https://wpnews.pro/news/i-kept-forgetting-about-my-cactus.md", "text": "https://wpnews.pro/news/i-kept-forgetting-about-my-cactus.txt", "jsonld": "https://wpnews.pro/news/i-kept-forgetting-about-my-cactus.jsonld"}}