An ode to houseplant programming šŖ“
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.šŖ“

When āIt works on my machineā is the goal, not the excuse
Things I have found myself saying about some personal projects, almost apologetically:
- It works for me, butā¦
- Itās held together with string and electrical tape and visibly disorganized wiresā¦
- I have to do manual restarts after the power goes offā¦
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:

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:
- A happy home: I love having both plants and homemade projects in my living space. Sharing a space with them reminds me of things that I like about the world and about myself.



- Longevity: Like my plants, I love my little
projects and I want them to thrive, and I baby them a little bit to get
them started. But also, if they donāt work out? It isnāt a big deal,
into
the great compost bin in the skyGithub they go, where a hard-won line or two may becompostedrecycled into a future project.

Propagation: Clippings! I love to propagate my plants and share them with friends. Do you want a pilea or a spider plant or a nice philodendron? Let me know, Iāll hook you up! Similarly, do you want to set up your own pen plotter or make some quick and easy screenshot memes? Awesome, I try to document and share the code and steps for recreating most of my projects.
That said, once a plant/code has taken up residence in your home, it is no longer my responsibility. While Iād love to hear about what you did to help it thrive, and if it starts looking sad Iāll gladly help you think through what might help, if it never thrives Iām probably not going to lose sleep over it.
Besides, once youāve gotten as far as propogating the code/plant Iāve given you, youāll know about as much about the situation as I doāmaybe moreāand now we can explore the next steps together.
Pet toxicity: Just like some plants, some projects are practically poisonous to my cat andāif the cat had her wayāshould be rehomed with a pet-free pal.
Universalization: I donāt care to engineer my houseplants to thrive in every environmentāand similarly, I donāt feel a need to make my houseplant code fully generalizable, until there is a more specific reason to do so.
Knowledge sharing: I love reading about other peopleās houseplant projects. While I occasionally take code cuttings for my own home, mostly I just want to wander around and admire their houseplants and learn more about the woes they encountered when figuring out how to help their code/plants thrive.
I do not need to propagate someoneās houseplant [code] in my own home order to admire it; I can learn to consider a different fertilizer or communication protocol without transplanting their program into my own home.
Capitalism: One personās houseplants are another personās plant nursery. One personās houseplant code is another personās B2B SaaS product. Enough said.
Bugs: Soil gnats. Where do they even come from?! It is unknowable.
Sometimes my weather station shows me the icon for snow, even though it is currently April and the temperature isnāt predicted to dip below 32. ĀÆ\_(ć)_/ĀÆ 3
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.

Bonus: Garden stakes for horticulturalist programmers
I made a status badge for houseplant reposāfeel free to use it!
<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&label=Project%20type&color=1E1E1D">
</a>
And a bonus badge for bouquet programming:
<a href="https://www.hannahilea.com/blog/houseplant-programming">
<img alt="Static Badge" src="https://img.shields.io/badge/💐%20Bouquet%20-x?style=flat&label=Project%20type&color=1E1E1D">
</a>
Thanks to Ryan for the coinage and to AF for introducing me to strategies for recognizing and countering perfectionism.
Footnotes
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]
As if you didnāt know that was coming!ā©ļø
Okay, so bugs arenāt inherently specific to houseplant code, but stillā¦ā©ļø
Except when it isnāt.ā©ļø
Except when computer is mistaek.ā©ļø
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.ā©ļø
If this is something you resonate with, I encourage you to look up āperfectionismā and some techniques for remedying it. Ditto ācapitalismā. šā©ļø
As the kids say, fail fast.ā©ļø
- Created: 2025-04-28
- Last updated: 2025-04-28
- Type: Musing
- Tags: phytoid, houseplant-programming