Table of Contents
I mostly forget everything I know the moment it’s time to meal plan or go shopping. I’m good on a stove or grill, but mostly I’ll come home with several (very nice) snacks, 2 actual meals, and multiple sad jars of peanut butter at home in various states.
So I built Pantrybird to handle the entire cycle.
How it started #
It started as a markdown file of recipes I like so I could copy things over into a new shopping list, and quickly outgrew that.
So I decided to make it an app. And look, I know, I know. People have solved this problem before. But I’m looking for something to address my particular idiosyncracies, and this experiment lets me do just that.
How It Came Together #
I didn’t want to just start by asking for code. Instead, I asked to be interviewed and to get a set of prompts I could run one at a time that would serve as the scaffold for the app.
The first draft came back with a hosted database, an auth provider, and CI I’d have to sign up for. I threw it out. I didn’t want external dependencies, just what I could maintain and host myself. Free services will put the squeeze on you to sign up for something eventually, or they’ll go out of business, and I didn’t want that hassle.
I came away with some solid business logic that was framework-free, because I’m interested in app development and may convert Pantrybird to an iOS or macOS app eventually.
Every feature I add also ships with tests, and I broke each major part of the app down into individual prompts, so it was easier to make changes to specific parts without rebuilding the entire application.
I also built a script that would configure a server with packages I know, and I can deploy with a small shell script.
What’s Neat About It #
A lot, really. I had fun seeing this come to life.
- It tracks my pantry items so I don’t end up buying multiples of a staple (see also: the peanut butter).
- I can import recipes from sites, or I can use markdown to handle the whole thing. I don’t need a complex text editor, either.
- It’s entirely self-contained, built from open source software on a server I run, which is even more fun for me.
- It’s got a sick dark mode :)
There’s also a design system. A page in the app shows every token and element, pulling values from the live stylesheet.
I also wrote a plugin that builds a Figma design file populated with variables, text styles, components, the whole thing. I can tweak a thing or two, then point Claude at my MCP and tell it to make the changes on the code’s end, though I generally prefer to do those myself.
Challenges #
The stack (next.js with React and TypeScript, with Tailwind) was new to me, and I was intentional about trying something different here. The way Pantrybird separates out CSS is not my normal way of working, as this site is built with Hugo and SCSS, so making changes took a little growth on my end. Not that I minded.
I also found that when inviting someone else into Pantrybird, my use cases needed to change to accommodate their mental models. I’d been tweaking things here and there based on feedback and actual use, as is standard UX practice. But I found that others wanted to add meals to a list from multiple spots, as well as add one-off items to the shopping list. They were simple changes, which ultimately improved quality of life overall on the app.
Lastly, I need to add some sort of semantic matching if someone types “blk pepper” or “coarse black pepper” and have it match a similar item in the pantry. As it stands, it creates a new shopping item for each one, and causes a little unnecessary friction, but it’s minor.
What’s Next #
I’m glad I built this. It solved a huge problem for me, and I’ve been using it steadily for weeks. I will likely end up making an iOS app out of this, and thanks to how I set the app up, it’ll be easy.