pantryPal Started Because We Kept Buying the Same Things Twice

pantryPal was the first thing we built, before palStack was even a name for anything, and it came out of the dumbest, most relatable problem a household can have. We were terrible about rebuying food. I'd be standing in the grocery aisle absolutely convinced we still had olive oil at home. My wife would be equally convinced we didn't. Neither of us actually knew, because neither of us had looked, because who looks before they shop. We'd buy it anyway, get home, and find two bottles.

That was the good version of the problem. The bad version was the opposite: things expiring in the back of the fridge because we forgot they existed at all. Money and food going to waste in both directions, from the same root cause. We just didn't have a real picture of what we already had.

So I built one. The first version of pantryPal was barely more than a barcode scanner and a list. Scan something when it comes in the door, and now there's a source of truth neither of us has to hold in our heads or argue about in an aisle. It sounds almost too simple to be worth building software for. That's exactly why it worked. The problem wasn't complicated, we just needed something that removed the guessing entirely instead of asking us to be more disciplined about remembering.

The actual check underneath that first version was almost embarrassingly simple, a rough version of it:

def already_have(new_item, pantry_items, days_fresh=30):
    for item in pantry_items:
        same_product = item.barcode == new_item.barcode
        still_good = (today() - item.added_on).days < days_fresh
        if same_product and still_good:
            return f"You already have {item.name}, added {item.added_on}"
    return None

That's it. No machine learning, no fuzzy matching, nothing clever. Just a barcode and a date, and it ended more grocery aisle arguments than anything more sophisticated would have.

What it's become since then is a lot more than a list. Expiry tracking with actual alerts before something goes bad, not after. Recipe matching against what's actually in the pantry, so "what can we make tonight" stops being a five minute negotiation. Eventually, a way to photograph a receipt and have it read straight into inventory, because typing in twelve grocery items by hand after a shopping trip is its own small chore nobody wants.

Illustrative duplicate purchases avoided per month, first six months of use mo 1 3 mo 2 5 mo 3 8 mo 4 11 mo 5 14 mo 6 17

Illustrative, not measured usage data: duplicate purchases the app flagged before we bought them anyway, trending up as we actually started scanning things.

But all of that came later. The actual origin is smaller and dumber than any of it: two people standing in a grocery aisle, both sure they were right, neither one actually knowing. pantryPal ended the argument. Everything palStack became started from that one specific, unglamorous household fight.

← Previous post Next post →