Skip to content

Hana

App Store

Photograph a plant, get its species and a care routine, and keep the reminders that follow.

OpenPrivate repository

Overview

Hana chains two services into one flow: a vision API reads the photo and returns the scientific name, and a language model turns that name into the seven fields of a care sheet — water, sun, soil, pot, climate, toxicity, pet safety. The result is what the reminders are then scheduled from.

Problem

Care advice is only useful if it is advice for the plant you actually own, and most people cannot name theirs. Identifying the species first is what makes everything downstream specific instead of generic.

Trade-off

Both services are called straight from the client, with no backend in between. That left nothing to operate and nothing to keep running, and it made the editable species field double as a human correction inside the pipeline — the user fixing a name costs no extra code, because the field the vision API writes into is the same field the prompt reads from.

What it does

Species identification from a photo, through the plant.id vision API
Care sheet generated per species by a language model via aiXplain
Species field stays editable, so a correction flows through the rest
Local dataset of 209 species behind the autocomplete
Watering and sunbathing reminders scheduled per plant
Home screen widget and an animated mascot that follows time and season

Stack

iOSSwiftSwiftUIUIKitaiXplainKitPhotosUIWidgetKitStoreKit 2UserNotificationsRiveRuntimePostHog

What I took from it

The interesting part of a two-model pipeline is the seam between them. Here the join is a field the user can see and edit, which is what keeps a wrong identification from silently poisoning the care sheet that comes after it.

More iOS work

Work

Set in Uncut Sans and Commit Mono. Built to the iOS metrics: 8pt grid, 17px body, 44px targets, spring physics.

© 2026 Lucas Santhiago. All rights reserved.