An ode to houseplant programming 🪓

28 Apr 2025

Recurse Center (RC) peer Ryan recently coined a phrase that I instantly fell in love with: houseplant programming.

In Ryan’s words:

[The tool I built] solves my idiosyncratic problems and may not address yours at all. That’s fine—take it as an ad to write tiny software just for yourself. Houseplant programming 🪓[2] !

[2] This isn’t an existing phrase as far as I know, but the closest I can think of is ā€œbarefoot developersā€ which a) is a little more granola than my vibe and b) is maybe tied up in some AI stuff. I guess this is situated software but even smaller: I’m not building for dozens of users, I’m building for one user in particular.
[source]

Houseplant programming: tiny software just for yourself. Perfection.

At the risk of overexplaining and thus cheapening the analogy, I feel the need to wax poetic.🪓

Painting of person with long hair watering many plants in a sunny window.
Blomsterfƶnstret by Carl Larsson, 1895. Public domain via Wikimedia Commons.

When ā€œIt works on my machineā€ is the goal, not the excuse

Things I have found myself saying about some personal projects, almost apologetically:

In the world of houseplant programming none of these statements are apology-worthy. In a workplace, about a project that is intended for productionization1 and mass dissemination? Sure, production-ready code—code that has a job, or provides the infrastructure for a job—needs to be some flavor of robust and tested and reliable. For a project that lives in my house and does what I need it to and periodically needs a little extra help? No worries.

Aditya Athalye (another RC peer!) perfectly captures this vibe in the project description for his software project shite:

shite’s job is to help me make my website: https://evalapply.org. Thus, shite’s scope, (mis)feature set, polish will always be production-grade, where production is ā€œworks on my machine(s)ā€ :) [source]

Strong ā€œEverything I do is the attitude of an award winner because I have won an awardā€ energy:

Screenshot from Parks and Recreation, with text of the quote from just above this image

Any code is production ready, if you redefine the scope of your production environment!

Properties of houseplants, programmatic and chlorophyllous

Before we get to the self-reflective bit,2 here is a non-exhaustive list of parallels between my houseplants and my houseplant programs:

Photo of a shelf full of plants.
Exhibit A: Happy houseplants on a happy houseplant shelf.
Photo of a flipdisc display with the number 73 and a sun symbol displayed.
Exhibit B: Happy flipdisc installation on a happy flipdisc shelf.
Screenshot of computer menu with one line per emoji: duck, book, microscope, trophy.
Exhibit C: Happy xbar-based utilities for launching common tasks and starting music playback, on a happy menu bar on my laptop.
Photo of ceramic cat planter containing spider plant.
This cat once had a cactus tail. Now it has a spiderplant tail.

Not an idea, not yet a Platonic ideal

While I build software as a career, I also like to muck about with code in service of other goals. When sharing those other projects it has taken me a long time be able to talk about what my code does do without adding a zillion caveats about what the code does not do.6

Why? I think somewhere along the line I picked up the unhealthy—and false!—assumption that it wasn’t worth sharing my code until it was ready to be reused easily by whoever was able to access it—specifically, not sharing that code until it was ā€œproduction ready,ā€ for some arbitrary and ever-growing definition of ā€œproductionā€ that I never quite fully defined for myself.7

In the last year or so when presenting personal projects I’ve taken to saying that they’re prototypes. Prototyping is a thing that makes sense to many folks in the field—it involves a first pass at trying to build something, with output that won’t be optimized, might be hacked together with glue and dreams, and possibly even ā€œonly works on my machineā€. But it’s proof that it is worth spending more time on something, or not worth spending more time on something.8

The thing is, a lot of the personal projects I’ve built are not prototypes, even if they share a lot of the same characteristics of a prototype: while they are a first-ish pass at bringing an idea to life, and they could be turned into a more generalizable or generic Thing, they’re never designed to be more than that first pass with its context-specific configuration.

While rebranding some of the projects I’ve built as ā€œprototypesā€ helped me feel better about sharing something not totally polished, I’ve also felt like the term somehow devalues what I’ve built. Sure, sometimes what I’ve built is a prototype! But often, it isn’t. It’s a first pass, sure, but it’s just a weird little guy of an idea, and doesn’t need to promise to be any more than what it already is. Just existing is enough,and I’m not necessarily interested in developing it into a less-weird less-little guy!

Thus: houseplant programming. Tiny software for just myself.

Epilogue: Bouquet programming šŸ’

I’m going to spare us all a further brainstorm of plant/code parallels, with the exception of one spin-off term: bouquet programming šŸ’.

I’m hereby defining bouquet programming as one-off code that is written for one specific user to support one specific use-case, in a non-recurring way. By definition, it needs no maintenance and simply provides proof of what once was one run. Examples of bouquet programming: an analysis script in support of a one-time plot, a scrappy proof-of-concept or a minimal reproducible example.

Bouquet programming is still worth writing home about (!) and sharing generously in the same ways as houseplant programming—or agricultural programming!—but is even less likely to work off-the-shelf for a new application than houseplant code is, even if rerun by the same person who originally programmed it.

Examples of my own bouquet code: a script I used to scrape book cover images for generating miniature book covers as part of a physical gift, code run in service of helping a friend prepare timelapse videos of her marbling process, etc.

Photo of rolodex with rainbow cards, open to a page with a QR code and an album cover.
My Musidex, for which I wrote a semi-reusable script to convert a set of playlists into a set of album art, metadata, and QR code stickers.

Bonus: Garden stakes for horticulturalist programmers

I made a status badge for houseplant repos—feel free to use it!

Static Badge

<a href="https://www.hannahilea.com/blog/houseplant-programming">
  <img alt="Static Badge" src="https://img.shields.io/badge/%F0%9F%AA%B4%20Houseplant%20-x?style=flat&amp;label=Project%20type&amp;color=1E1E1D">
</a>

And a bonus badge for bouquet programming:

Static Badge

<a href="https://www.hannahilea.com/blog/houseplant-programming">
  <img alt="Static Badge" src="https://img.shields.io/badge/&#x1F490;%20Bouquet%20-x?style=flat&amp;label=Project%20type&amp;color=1E1E1D">
</a>

Thanks to Ryan for the coinage and to AF for introducing me to strategies for recognizing and countering perfectionism.


Footnotes

  1. What is ā€œproduction codeā€? Everyone seems to have their own non-standardized definition, but in general, it is code that is being actively used by someone other than its creator, such that some flavor of stability and uptime is expected.

    Or, my favorite definition, by way of Reddit:

    ā€œProduction code has a phone number to call when it breaksā€ [source]

    ā†©ļøŽ
  2. As if you didn’t know that was coming!ā†©ļøŽ

  3. Okay, so bugs aren’t inherently specific to houseplant code, but stillā€¦ā†©ļøŽ

  4. Except when it isn’t.ā†©ļøŽ

  5. Except when computer is mistaek.ā†©ļøŽ

  6. I’m actively trying to cut down, both for my current self and for my younger self. My younger self didn’t have the confidence of concrete professional proof that something she’d done meant she no longer had to prove herself so much—but she had just as much to share, and I wish she’d felt more empowered to take up more space in the world, rather than feeling cowed by the folks whe was impressed by all around her.ā†©ļøŽ

  7. If this is something you resonate with, I encourage you to look up ā€œperfectionismā€ and some techniques for remedying it. Ditto ā€œcapitalismā€. šŸ™ƒā†©ļøŽ

  8. As the kids say, fail fast.ā†©ļøŽ