All work

PlantPal

A smart plant pot and companion app! Powered by a linear regression model and k-nearest neighbours classifier.

SENSORS
4
LEARNS
NIGHTLY
FORECAST
6 DAYS
POWER
SOLAR + USB-C

01 / Problem

Houseplants mostly die from watering mistakes

More people are growing plants in apartments with no outdoor space, and keeping them alive is the hard part. Our early secondary research showed that too much or too little water is the main reason that houseplants die, usually because people aren’t sure what the plant really needs.

02 / How it evolved

We put sensors in a pot and showed the numbers, like most plant gadgets do. However, we realized that alerts would consistently come in only after the soil had dried. Since we also noticed the impact weather has on the rate a pot dries, we hypothesized if the pot could "check" the forecast, it could proactively warn plant owners days before their plant required water.

AspectWhere we startedWhere it ended up
ReactingAn alert once the soil was already dryA watering window days ahead, built from the forecast
ShowingCharts and stats inside the appOne face and one line of text on the pot itself
KnowingOne rule per species: water every 2–3 daysLearns how fast this pot dries, right where it sits
ExplainingThe face changed at fixed cut-offs, no reason givenEach mood comes with the past days it’s based on
Decisions we owned
  1. Giving a time range. Our first version had a vague time range (eg. “water at 2 PM”). Having a less granular time range is easier, but it can also be too general or straight up incorrect, and that erodes user trust. So to balance efficiency and usability, we decided to start PlantPal with a range (Thursday afternoon), and get more specific as the day gets closer, with a suggested best time.
  2. Showing similar days. When you ask why Frosty looks thirsty, PlantPal pulls up past days similar to today so observing historic patterns is easy.
  3. Everything runs on the pot. Both models retrain overnight right on the pot, which takes about a second. It keeps working even when Wi-Fi is down, and user data stays secure. Because small models are occasionally prone to errors, the process for fixing mistakes is super efficient (one tap!).
  4. Text with every face. Having a short blurb on the pot and a longer explanation on the app complements the faces nicely!

03 / The pot

The pot is the main screen

We started by having most of the UX on the app itself, but by the end you could glance at the pot from the couch and know whether Frosty is fine.

01 02 03 04 05 06
  1. 01

    Light and humidity sensor

    SAMPLES EVERY 10 MIN

    Sits on the rim, where it sees what the leaves see.

  2. 02

    Pixel display

    10 × 6 FACE + 1 LINE

    Readable from across the room. Every face also has words.

  3. 03

    Glazed ceramic shell

    DRAINAGE HOLE

    The window in front keeps the display flush with the glaze.

  4. 04

    Logic board

    RELEARNS OVERNIGHT IN ~1 S

    Temperature sensor on board. All the learning happens here (not in the cloud!)

  5. 05

    Moisture probe

    CAPACITIVE · NO BARE METAL

    Measures water in the soil without corroding.

  6. 06

    Solar base

    SOLAR + USB-C

    Charges from indoor light, with USB-C for dark winters (super common in Toronto!)

  • Every similar past day looked happy

  • The soil gets too dry after 11 AM

  • It drops to 6°C at 9 PM

  • 4 of the 5 most similar days looked soggy

The faces grew out of a screensaver in the first style guide.

04 / Where it shows up

A lot of PlantPal's features are outside of the app

A plant app is probably not one of the more exciting apps on your phone 🪴 I designed it knowing that most users rely on quick updates and notifications, and app is always there when users need more detail.

LOCK SCREENTwo alerts a week, tops. Each one says when, and why.
WIDGETSThe small one is the pot’s face. The medium one is the week.
WATCHA ring for the soil, and the next window in one line.
STANDBYOn the nightstand, it’s a second pot screen.
IN THE APPTap “why” and you get past days that looked like today.
INSIGHTSWhat this pot has learned about drying.

05 / The two models

The ML behind PlantPal

The watering forecast guesses how much the soil dries each hour from temperature, humidity, sunlight and wind, then runs that over the real six-day forecast. The watering window is where its range of likely outcomes dips below Frosty’s threshold.

Happy18°C · 68% soil

Frosty looks happy. Every past moment most like right now looked the same.

Fetching forecast…

Next watering

…

Shaded: when the soil could dip below 40%. The band is PlantPal’s honest range.

    How this prediction is made
    1. Every forecast hour gets four numbers: temperature, humidity, sunlight and wind. Indoors, they’re swapped for indoor conditions (about 20°C, little sun, no wind).
    2. It learned from 24 days of this pot’s readings how fast the soil dries in different weather, then got tested on 6 days it hadn’t seen, where it was off by about 0.020 points an hour. It’s a linear regression, which means one weight per condition, added up.
    3. Take away the predicted loss hour by hour and add rain back outdoors. The shaded band is how wrong it could reasonably be, mixing the model’s own misses (about ±6% over a whole day) with a forecast that gets about 4% shakier every day out.
    4. A real pot would retrain every night on its own readings.

    Live weather from Open-Meteo. Try your own city (or move Frosty indoors)!.

    The mood reader looks at the soil and temperature right now, finds the past moments most like it, and checks how Frosty looked back then. If most of them were thirsty, Frosty is probably thirsty now.

    0%25%50%75%100%0°10°20°30°40°soil moisture →HappyThirstyOverwateredToo coldToo hot
    • Happy
    • Thirsty
    • Overwatered
    • Too cold
    • Too hot

    Frosty looks

    Happy

    Every similar past moment looked like this

    Nothing to do. Frosty is comfortable.

    Compare withpast moments (k)

    Five is the middle ground. The regions stay steady and still follow the data.

    Why it thinks so: the 5 past moments most like right now

    • Sep 1159% · 15°CHappy
    • Sep 1065% · 19°CHappy
    • Sep 3064% · 16°CHappy
    • Sep 2249% · 17°CHappy
    • Sep 667% · 21°CHappy

    Click the map or drag the sliders. Arrow keys work on the map too.

    More detail: how the models work and how we checked them

    The watering forecast is a linear regression: each condition gets a weight and the weights are added up, and least squares picks the weights that miss past readings by the least. We kept it fairly simple because drying mostly adds up, and the weights are readable enough to power the app’s “What dries it out” card.

    We trained it on the first 24 days and tested on the last 6 then compared it with always guessing the average. Untick a condition below to see how much worse it gets.

    Train · 24 days · 576 hours
    Test · 6 days

    Split by time, not at random, so the model is graded on days it has never seen. That’s how it will be used.

    What it pays attention to · untick one to retrain without it

    • +0.009
    • −0.012
    • +0.059
    • +0.019
    • −0.004

    Longer bars matter more. Orange speeds drying up and blue slows it down. (These are the model’s weights, with every feature put on the same scale first.)

    Its guesses vs what happened · test days

    what happenedits guess
    0.020Average miss per hour on days it never saw (MAE)
    0.083Miss if you just guessed the average every hour
    0.94How much of the ups and downs it explains (R², 1 is perfect)
    1.0×As good as with every feature

    The mood reader is k-nearest neighbours (k-NN). “Neighbours” are the most similar past moments and k is how many it asks. With only about 140 tagged moments, a neural net would memorize noise and couldn’t say why it decided anything, while k-NN’s reason is a list you can check. Both inputs get put on the same 0–1 scale first, or moisture would drown out temperature.

    System map

    From sensor readings to a line on the pot

    How PlantPal decides what to tell you Pot sensors and the hourly forecast become per-hour features. A species profile gives both models a starting point before the pot has its own data. The watering forecast, a linear regression, predicts how fast the soil dries and produces a watering window. The mood reader, k-nearest neighbours, compares right now with similar past days to pick the pot's face and alerts. What you do (waterings and "looks droopy" taps) is collected and both models are refit each night on the pot. both models run on the pot updates both Input Pot sensors soil · light · humidity · temp Input Hourly forecast Open-Meteo · 6 days Input Species profile starting point on day one Input You waterings · “looks droopy” Features Per-hour conditions temp · humidity · sun · wind Watering forecast Predicts drying linear regression Mood reader Matches past days k-nearest neighbours You see Watering window “Thu 11 AM–3 PM, ≈95%” You see Pot face + alerts “Happy, like your best days” Nightly, on the pot Refit + add labels about a second, no cloud
    Dashed lines are what the pot learns from overnight.
    More detail: learning over time

    Feedback

    Four everyday signals

    Feedback loop Every hour, automatically: Sensor measures the real moisture drop; PlantPal learns One more example of how this weather dried this pot (Model A). You water early or late: Soil was 52% (early) or 31% (late) when you watered; PlantPal learns Your personal threshold shifts toward when you actually water (Window). You move the pot: Light and temperature change at the same moment; PlantPal learns It asks if Frosty moved inside, then stops using outdoor weather (Model A). You correct the mood: You tap “Droopy” or “Looks fine”, which tags this moment; PlantPal learns One more tagged moment. When you disagree, it counts extra. (Model B). All of it is applied in a nightly refit on the pot. Trigger What PlantPal sees What it learns 1 Every hour, automatically Teaches the watering forecast

    Sensor measures the real moisture drop

    One more example of how this weather dried this pot

    2 You water early or late Shifts the watering window

    Soil was 52% (early) or 31% (late) when you watered

    Your personal threshold shifts toward when you actually water

    3 You move the pot Teaches the watering forecast

    Light and temperature change at the same moment

    It asks if Frosty moved inside, then stops using outdoor weather

    4 You correct the mood Teaches the mood reader

    You tap “Droopy” or “Looks fine”, which tags this moment

    One more tagged moment. When you disagree, it counts extra.

    Nightly refit ~1 sec
    Day one
    A new pot starts from species defaults (Frosty: water every 2–3 days, 15–20°C) and calls its advice an estimate for about a week.
    No internet
    It projects from the sensor trend alone and labels the window an offline estimate.
    Sudden jump
    A reading far off the prediction isn’t learned automatically. User confirmation is required (eg. an answer to “Did you just water Frosty?)”
    You disagree
    If you tap Droopy, the face changes right away and your tag counts "extra".

    06 / First prototypes

    Where the pot came from

    Handmade physical prototype of the pot with a felt tree.
    Physical mock-up (for scale in a real room)
    3D render of the original pot and its screen.
    Blender model, for form and screen placement

    Open the first Figma prototype

    More detail: heuristics and palette
    Recognition > Recall
    Visual cues and to-do lists, so nobody has to remember when they last watered.
    Error prevention
    Alerts before the plant declines.
    Visibility of system status
    Live readings make the plant’s state clear at a glance.
    Flexibility and efficiency
    Even when you're out, you can monitor the pot's status.
    Primary#6D7340
    Secondary#A0A677
    Text#5B6237
    Surface#ECE7D5