jj@portfolio:~/projects$jairik "jj" mccauley · software engineer
jj@portfolio: ~/projects/perishless — README.md — zsh

jj@portfolio:~/projects/perishless$ cat README.md

PerishLess

March 2026 · ● shipped · 4 screenshots · ai / full-stack

about

Pantry tracker that flags food before it expires, then suggests recipes and donations for whatever needs using up.

I built PerishLess after getting tired of finding food in my own kitchen after it had already expired. The pantry can be filled manually, by barcode, or from a scanned receipt, then filtered by category, expiration window, and whether an item could be donated.

The app suggests recipes and priority meals from food that needs to be used soon. It also has a community feed for giveaways, recipes, and other food-related posts, with optional location data for nearby exchanges.

architecture

The client is a React and TypeScript single-page app backed by asynchronous FastAPI services. Firebase handles sign-in, while Firestore stores pantry items, posts, reactions, and user activity. A Cloud SQL database caches food records from OpenFoodFacts because relying on that API for every request was painfully slow.

Gemini powers pantry questions and recipe suggestions, and ElevenLabs adds speech input and playback. Docker Compose runs the services behind Nginx on a DigitalOcean VPS. Getting that first deployment working ate roughly eight hours by itself, but it forced me to learn the networking and reverse-proxy pieces instead of treating deployment as somebody else's problem.

demo

screenshots — 4 files

PerishLess — AI food-waste reduction platform, screenshot 1 of 4PerishLess — AI food-waste reduction platform, screenshot 2 of 4PerishLess — AI food-waste reduction platform, screenshot 3 of 4PerishLess — AI food-waste reduction platform, screenshot 4 of 4
$ cd ~/projectsexit code 0