Cacti Companion — I Built an App for My Cactus Collection
I'll be honest — this started as something completely different. And if you told me a year ago that I'd be standing in my greenhouse scanning QR codes on cactus pots with a custom app I built myself, I would have told you that you'd been out in the sun too long.
It actually started with two problems I wanted to solve at the same time. The first was finding a better way to brainstorm and draft blog post ideas — I'm always juggling topics in my head and wanted something that could help me think them through. The second was keeping a proper record of my cactus and succulent collection. I'd been growing cacti for years, and as the collection grew, so did the chaos. Which one did I water last week? When did that one bloom? Did I already repot that guy or did I just think about it? I needed a system, and I couldn't find one that did what I wanted. So I decided to build one.
So I started working with Claude — Anthropic's AI — to build something simple. A little web app. Nothing fancy.
That was then.
What Cacti Companion is today is something I never could have predicted when I started. It's a full-featured Progressive Web App (PWA) that I use every single day. It manages my entire collection of over 260 cacti and succulents across 15+ genera, tracks watering schedules, logs blooms, repottings and treatments, stores photos, generates QR labels for every plant, and yes — it still helps me with blog ideas. It just does a whole lot more now. Like, a lot more. My wife thinks I've lost my mind. She may be right. No, I know she’s right.
I built it all with Claude's help. Every single line of it. A lot of my ideas, and a lot of Claude’s.
First, What Is a PWA?
A Progressive Web App is essentially a website that behaves like a native app on your phone or computer. You can add it to your home screen, it works offline in some cases, and it feels like a real app — not just another browser tab fighting for your attention. I can pull it up instantly from my iPhone while I'm standing in the greenhouse, or amongst my cacti, QR scanner and all. No App Store, no downloads, no waiting. No explaining to Apple why a cactus app needs to exist.
Because it's a personal app built for my own use, it’s not publicly accessible. I can lead you in the right direction if you want to do something similar, or even if you want to piggyback on some of the existing code. There are quite a few steps involved, but Claude is good at helping with this. More about the setup below.
The Stack — The Tech Behind It
For those curious about how it's built, here's the plain English version. I'll try not to make your eyes glaze over.
Claude (by Anthropic) is the AI I used to write every line of code. I'd describe what I wanted, Claude would build it, I'd test it, and we'd refine it together. I'm not a developer by trade — I have an IT background in server administration and networking — but Claude made it possible for me to build something genuinely sophisticated without having to know React or JavaScript inside and out. It also powers the AI features inside the app itself, like the plant inspection tool and blog idea generator.
Netlify hosts the app. It's where the files live and where the app is served from. It also handles a serverless function that proxies calls to the Claude API securely. Think of it as the landlord — keeps everything running, doesn't bother you much, sends you a bill at the end of the month. I’ll admit, I had never heard of Netlify before building the app, but it’s actually a really cool service.
Supabase handles the database and photo storage. Every plant, every watering log, every photo — it all lives in Supabase. It also handles authentication so the app stays completely private. Think of it as the filing cabinet — organized, reliable, and quietly doing its job in the background.
What It Does — A Tour
Buckle up. There's a lot of ground to cover here.
PLANTS TAB — REMINDERS, ACTION, FILTERS, STATUS
The top of the Plants tab is where everything starts. Reminders keep me on top of things that need attention — in this case, checking on a plant that's recovering from some root issues. The Actions panel is where most of the work happens: logging care events, adding seedling batches, moving plants between locations, printing QR labels, and scanning QR codes directly inside the app. Below that, the Status section gives a quick snapshot of the whole collection — right now sitting at 268 plants across 15 genera, with the majority Thriving or Stable. The Export/Backup section lets me pull the entire database as a PDF, JSON, or CSV at any time, and even export all my Supabase photos as an organized zip file. The green checkmark tells me the database was backed up today. That one always makes me feel better.
PLANTS TAB — STATUS SECTION AND COLLECTION GENERA LIST
Scrolling down reveals the full collection organized by genus. Each genus is collapsible — tap to expand and see all the plants inside. You can see the variety here: Aloe, Anacampseros, Aporocactus, Astrophytum, and that's just the beginning of the alphabet. The Next CIDs section at the top automatically tracks the next available ID for each genus, so when I add a new plant I'm never guessing what number comes next. Tap any CID to copy it to the clipboard instantly.
PLANTS TAB — REST OF GENERA LIST AND SEEDLINGS SECTION
Further down the collection you can see some of the heavier hitters — Lophophora with 17, Trichocereus with 73, and a dedicated Seedlings section at the bottom tracking 149 seedlings across 2 genera. The Seedlings section is completely separate from the main collection and has its own tracking, watering logs, and tray photo documentation. When seedlings eventually graduate and get their own CIDs, they move into the main collection where they'll live forever. Back to Top button included, because nobody wants to scroll all the way back up through 268 plants.
Now Let's Look Under the Hood
Every plant in the collection has its own card, and each card is basically a complete history of that plant's life in my care.
PLANT CARD — FULL HISTORY VIEW
The top of a plant card for CAC-0009, an Astrophytum Asterias Ooibo. At a glance you can see the CID, when it was added to the collection, genus, species, variety, last watered date, last bloom, location, and the most recent note — in this case a reminder I left myself that it was getting close to flowering again. Every card has quick action buttons for adding a blog idea or setting a reminder directly from the plant. The yellow left border indicates its current status.
PLANT CARD — FULL HISTORY VIEW (CONTINUED)
Scroll down the same card and you get into the logs — watering history with notes (Mosquito Bits added to water, in this case), bloom tracking showing the last bloom date and total bloom count, repottings, treatments, status selector, and the photo log. Everything is right here in one place. No spreadsheets. No sticky notes. No trying to remember if you watered it last Tuesday or the Tuesday before that.
Watering 268 Plants Without Losing Your Mind
This is the feature that probably saves me the most time. Watering Intelligence tracks every plant's history and tells me exactly who needs attention and who can wait.
WATERING INTELLIGENCE
The Watering Intelligence section inside the Stats page. At the top you get the big numbers — 268 total plants, 15 genera, 149 seedlings. Below that is where things get serious. Watering Intelligence organizes every plant in the collection into Overdue, Due Soon, and Recently Watered, calculating each one based on its individual watering history and average frequency. You can filter by location — Greenhouse, Grow Shelf #1, Grow Tent — so if I'm heading into the greenhouse specifically, I can pull up just those plants. The Pause button lets me temporarily skip a plant from the list, which comes in handy during recovery or dormancy. And yes, 75 plants due soon. It's always something.
The Stats Page — Numbers Don't Lie
If Watering Intelligence is the practical side of the Stats page, the rest of it is where the collector in me really comes out.
WATERING & CARE, NEEDS ATTENTION
The Watering & Care section tracks fertilizer applications, repottings, and treatments both for the current year and all time. Below that, Needs Attention flags any plants currently sitting at Watch or Struggling status so nothing slips through the cracks. CAC-0013, a Euphorbia Obesa that's been through a rough patch, is sitting at Struggling right now — this section makes sure I don't forget about it.
COLLECTION GROWTH AND STATUS BREAKDOWN
The Stats page starts with the big picture. Collection Growth shows how many plants were added each month — you can see the jump from 118 in June to 150 in July, which tells its own story. Below that, the Status Breakdown breaks the collection down into Thriving, Stable, Watch, and Struggling, and the By Genus section shows where the numbers really live. Trichocereus leads the pack at 184, with Lophophora coming in second at 55. The collection didn't start this way — it just kind of happened. Slowly, and then all at once.
BY LOCATION, GRAFTED PLANTS, AND ROOTSTOCK BREAKDOWN
Scrolling further reveals how the collection is distributed by location — 105 in the Grow Tent, 103 in the Greenhouse, and 60 on Grow Shelf #1. Below that is one of my favorite recent additions to the app: Grafted Plants tracking. Of the 268 total, 18 are grafted onto rootstock, with the breakdown showing 11 on T. Pachanoi, 5 on T. Peruvianus, and 1 on Myrtillocactus. For anyone who grows grafted cacti, having this information organized and at a glance is genuinely useful.
BLOOMS AND PHOTO DOCUMENTATION
The Blooms section tracks every bloom event across the entire collection — 27 total blooms from 12 different plants, with a Bloom Calendar showing activity over the last 12 months. July has been a good month. The Most Prolific Bloomers leaderboard is a nice touch — CAC-0001 and LOP-0001 are tied at the top with 4 each. Below that, Photo Documentation tracks which plants have photos, which don't, and which only have one — a gentle nudge to get the camera out more often.
RECENT ACTIVITY
The Recent Activity feed is exactly what it sounds like — a running timeline of everything that's happened across the collection in the last 30 days. Blooms, notes, repottings, all in one place. You can see bloom entries for several plants, a batch of notes about some chopped and re-rooted Pachanoi, and a round of repottings from July 19th. It's the kind of thing that's easy to forget you even logged until you scroll back and realize just how much actually happens in a month.
Growing From Scratch — The Seedlings Section
Not everything in the collection started with a CID and a label. A big part of what I do is grow from seed, and that side of things needed its own dedicated space in the app.
SEEDLINGS ORGANIZED BY GENUS & BATCH
The Seedlings section sits at the bottom of the Plants tab, completely separate from the main collection. Everything is organized by genus first, then by species, then by individual batch with the sow date right in the name so there's never any guessing. You can see the Trichocereus section expanded here showing multiple Bridgesii batches — SS02 x Eileen, SS02 x LumberJack, Wowie x SS02 — all sown on the same date but tracked completely independently. Each batch row shows the last watered date, location, and how many are still active. The camera icon on each batch is for logging tray photos, which keeps the photographic record separate from the individual plant cards.
INSIDE A SEEDLING BATCH
Open any batch and you get the individual seedlings inside, each with their own watering history, average frequency, fertilizer log, notes, and status. These little Trichocereus Bridgesii seedlings are sitting at Stable, watered 4 days ago on an every 9 day average — right on schedule. When they eventually get big enough to earn their own CID and QR label, they'll graduate out of the Seedlings section and into the main collection, but their batch history stays right here. Nothing gets lost.
Every Plant Gets a Label — The QR Code System
One of the more practical problems with a large collection is knowing what you're looking at. When you have 268 plants and a lot of them look similar, especially the lophs, labels matter. Every plant in Cacti Companion gets a unique CID and a printed QR code label that goes right on the pot.
QR CODES — BECAUSE 268 PLANTS ALL START TO LOOK ALIKE
I'll be honest — before I had a proper labeling system, I mixed up more than a few plants. Now every pot has a QR code label printed on Avery label sheets, and scanning one takes me straight to that plant's full history in the app. The QR Labels overlay lets me choose the label format, filter by CID or genus, select which plants need fresh labels, and even set a starting position on a partially used sheet so nothing goes to waste. I've intentionally blurred the URL and the QR codes themselves in this screenshot since the app is private — but you get the idea. The labels point to a permanent custom domain I own, so even if the app moves to a new server someday, every label ever printed will still work. No reprinting 268 labels. Ever.
Finding Any Plant, Instantly
With lots of plants across multiple locations, finding the right one fast matters. That's where the built-in QR scanner comes in.
SCAN QR LABEL — INSTANT ACCESS TO ANY PLANT
This is what the QR scanning window looks like inside the app itself — no external camera app, no new browser tab, just a clean fullscreen camera view built right into Cacti Companion. With labels on every pot, getting to any plant's full history is just a scan away. Tap Scan QR Label in the Actions panel, point the camera at a pot, and the app jumps straight to that plant. When you're moving from plant to plant logging care events, that kind of speed makes a real difference. I've smudged out the QR code in the screenshot for privacy reasons — the labels encode a URL that points directly to my private app.
A Second Opinion That Never Gets Tired of Your Questions
One of the more unique features of the app is the ability to submit a photo of any plant directly to Claude for an AI-powered analysis. Health assessment, potential issues, care recommendations — all from a photo. Is it always right? No. Is it still extremely helpful? Absolutely.
AI PLANT INSPECTION — CLAUDE TAKES A LOOK
Point, shoot, submit. The Inspect tab lets me photograph any plant and get an instant AI analysis covering overall health, what looks good, what to watch for, and specific care recommendations. Like any AI tool it's not infallible — it can misidentify an issue or miss something an experienced grower would catch immediately — but as a starting point or a second opinion it's genuinely useful, especially for plants that are behaving strangely or showing signs I don't immediately recognize.
Keeping a Running Record — The Journal
Not everything worth noting fits neatly into a plant card. Sometimes you just need a place to write things down.
THE JOURNAL TAB — NOTES, OBSERVATIONS, AND PHOTOS
The Journal tab is a running log of anything worth remembering that doesn't belong on a specific plant card. Observations from a particular day, general notes about the collection, photos from around the growing area — it all goes here. I've blurred out some of the entries because a grower's notes are personal, and some things are better kept between me and the cacti. Entries are organized by month, searchable, and photos are stored privately alongside everything else. Think of it as the catch-all notebook that every serious grower probably already keeps somewhere, just in a much more organized form.
Where It All Started — And Still Lives
Remember when I said this whole thing began as a blog idea generator? Well, it still does that too.
THE BLOG TAB — THE ORIGINAL FEATURE
The Blog tab uses Claude to help brainstorm post ideas and draft some general content based on what's happening in the collection. It's come a long way from being the only feature — now it's just one of many quietly doing its job while the rest of the app gets all the attention. I've left one idea visible and blurred the rest — because some of those might just end up as future posts, and I'm not giving anything away that easily. Consider it a teaser.
The Record-Keeping Side of Things
I want to come back to something I mentioned at the start, because I think it's the heart of what makes Cacti Companion worth building in the first place.
Keeping records on a large collection is genuinely hard. Not in a complicated way, but in a "there are 260 of them and they all look slightly different and I watered some of them two weeks ago and some of them yesterday and I can't remember which is which" kind of way. Before Cacti Companion, I was doing what most collectors do — making mental notes, maybe scribbling something down, hoping I'd remember. Spoiler: I didn't always remember.
Now every plant has a complete history. Every watering. Every bloom. Every repotting. Every treatment. Photos organized by date. Notes I can search. A stats page that tells me things I didn't even think to track. It sounds like a lot, but because it's all right there in the app — especially with the QR scanner making it a two-second operation to pull up the right plant — it's become second nature. Walk up to a plant, scan it, log what you did, move on. That's the workflow. And it works.
Where It's Going
Right now Cacti Companion runs on Netlify with Supabase handling data and photo storage. It works great, but Supabase's free tier has storage limits that I'll eventually bump into as my photo library grows. The plan is to migrate everything over to DigitalOcean — a proper VPS where the app, database, and photo storage all live together under one roof with no free tier limitations and no surprise emails about storage quotas.
It's the kind of thing you think about when a collection has over 250 plants and counting. And climbing. Always climbing.
The app itself is the same way. There's always something to tweak, something to improve, a feature that would make the daily workflow just a little smoother. New sections get added, old ones get refined, and every time I think it's done something else comes to mind. At this point I've accepted that Cacti Companion is never really finished — it just gets better. Kind of like the collection itself.
Could You Build Something Like This?
Honestly? Yes. I say that not to oversimplify what went into it — there were plenty of late evenings staring at error messages and questioning my life choices — but the barrier to building something genuinely useful with AI assistance is lower than most people think. The key is being specific about what you want, testing everything thoroughly, and not being afraid to say "that's not right, let's try again." Claude has infinite patience. I've tested this extensively.
The other thing I'd say is that it helps enormously when you're building something you actually care about. I wasn't building a generic plant tracker. I was building something for my specific collection, my specific workflow, and my specific level of obsession with Trichocereus Bridgesii and everything else growing under my care. That passion is what kept me going through the frustrating parts, and it's probably why the app ended up being as detailed as it is.
If you've got something you're passionate about tracking, logging, or managing, and you've thought "I wish there was an app for this" — there might just be a way to build it yourself. You don't even have to be a nerd like me. You just need a good idea, some patience, and apparently, a lot of cacti.
I'd be happy to answer any questions about the process. Feel free to leave a comment below. And if AI isn't your thing — no worries, no hard feelings. I'm just a guy who wanted a better way to keep track of his plants.