Inspiration
As university students, we noticed how easily groceries get forgotten at the back of a shared fridge. Fruit goes bad, vegetables become overripe, and leftovers are thrown away simply because people get busy. We realized this was not only happening to us, but to students and families everywhere.
Every wasted item represents more than lost money. It also means wasting the water, energy, labor, and resources used to grow, transport, and sell that food. Seeing how common this problem was made us want to build something that could help people save money while reducing unnecessary food waste.
We wanted to make it easier for people to track their groceries, use food before it expires, and pass unwanted items to someone nearby instead of throwing them away. That idea became Shelfie.
What it does
Shelfie helps students and people in shared living spaces keep track of groceries before they go bad. Instead of manually entering every purchase, users can upload a receipt, PDF, or grocery photo. Shelfie identifies the food items, records their quantities, and provides printed or conservatively estimated expiry dates.
Before adding anything, users receive an editable preview where they can correct names, quantities, and dates, remove incorrect results, or add missing items. Shelfie then organizes groceries by urgency so users can quickly understand what needs attention.
My Fridge provides recipe suggestions based on the user's available groceries and cuisine preferences. Users can mark groceries as finished and restore them if they make a mistake.
If someone cannot use an item before it expires, they can list it on the Marketplace. Other students nearby can view its quantity, price, distance, and pickup time before contacting the seller to arrange a handoff.
By connecting grocery capture, expiry tracking, cooking suggestions, and community sharing, Shelfie helps people decide whether to cook, keep, or share their food before it becomes waste.
How we built it
We built the frontend with Next.js, React, TypeScript, and Tailwind CSS. We used Codex during development and drew visual inspiration from receipts, grocery labels, shared refrigerators, and the warm colors associated with fresh food.
The interface was designed for phones first, with large touch targets, clear spacing, and a simple path from uploading groceries to deciding what to use next. We used warm paper tones, a restrained sage accent, and card-based grocery layouts to keep the experience calm and easy to scan.
Shelfie uses the OpenAI Responses API to analyze receipts, PDFs, and grocery photos. Structured output backed by a Zod schema keeps each result consistent, including the grocery name, quantity, expiry date, and whether that date was printed or estimated. Users review and edit this information before accepting it.
Authentication is handled through Auth.js and a Hono API. User accounts are stored in SQLite with Drizzle ORM, while passwords are securely hashed using Bun's Argon2id implementation. The API also includes credential validation, request-size limits, upload validation, and rate limiting.
Challenges we ran into
One of our biggest challenges was dealing with incomplete grocery information. Receipts often use abbreviated product names, while grocery photos may not show quantities or expiry dates clearly. We could extract useful information, but we could not assume every generated result was correct.
Instead of hiding that uncertainty, we designed Shelfie around confirmation. Printed and estimated expiry dates are identified separately, and every extracted field can be edited before it becomes part of the inventory. This made the interaction slightly longer, but far more trustworthy.
Another challenge was fitting several connected actions into one clear product. Shelfie includes grocery capture, expiry tracking, recipe suggestions, inventory management, and community sharing. Placing everything on one screen would have made the application difficult to understand, especially on a phone.
We solved this by focusing the home page on adding groceries and showing urgent items. My Fridge handles inventory and cooking decisions, while Marketplace provides a separate space for sharing food. A simple navigation menu connects these experiences without overwhelming the user.
We also had to make the marketplace useful while keeping pickup coordination simple. Food listings can become irrelevant quickly, so important information such as distance, quantity, price, and pickup timing needs to be visible immediately. We designed each listing around the information a student needs to make a quick decision.
Accomplishments that we're proud of
We are most proud of building a complete grocery extraction experience that does not ask users to trust AI blindly. Shelfie converts an unstructured receipt or grocery photo into organized data while keeping the user in control of the final result.
We also created a complete product journey around a simple everyday problem. A user can capture groceries, identify what needs attention, receive ideas for what to cook, mark items as finished, and share food they will not use with someone nearby.
The mobile-first interface is another accomplishment we are proud of. Shelfie remains clear across small and large screens without turning into a crowded dashboard. Its warm colors, direct language, and simple grocery cards give the product a distinct identity while keeping the food at the center.
We are also proud that Shelfie is already being used by 10 early users. Their participation shows that the problem is real and gives us a small community from which we can learn before expanding across the university.
Finally, we built a secure technical foundation that includes account creation, login, password hashing, persistent inventory, structured AI output, upload restrictions, validation, and clear error handling.
What we learned
We learned that extracting grocery names is only one part of the problem. The more important challenge is helping users understand which information is reliable and which information still needs their judgment.
This changed the way we approached AI. Instead of treating the model as the final authority, we treated it as a fast starting point. Structured output makes the result usable, but the editable preview is what makes it trustworthy.
We also learned that reducing food waste is primarily a decision-design problem. A long inventory is not useful by itself. People need to know what requires attention and what action they can take next. Organizing Shelfie around urgency made the experience much clearer.
Working with our first 10 users also taught us that a marketplace becomes more useful as the surrounding community grows. A small group can validate the experience, but wider adoption creates more listings, faster pickups, and a better chance that unwanted food reaches someone who can use it.
From an engineering perspective, we learned the value of keeping each part of the system focused. Next.js handles the product experience, Hono provides the account API, SQLite keeps persistence simple, and the OpenAI API handles structured grocery extraction. This gave us a practical foundation without introducing infrastructure the project did not need.
What's next for Shelfie
Shelfie is complete and already being used by 10 early users. Our next goal is to expand it across the university so more students can track groceries, discover food nearby, and share items within their hostels before they go to waste.
We plan to work with student groups, hostel communities, and campus sustainability teams to introduce Shelfie to more residents. As adoption grows, a larger marketplace will make it easier for students to find nearby food and arrange quick pickups.
We also want to create university-wide challenges and hostel campaigns that encourage students to record, use, and share groceries before they expire. These campaigns can help make reducing food waste a visible community habit instead of an individual responsibility.
Once Shelfie is established across our university, we want to bring it to other campuses and shared-living communities. Our long-term goal is to turn small, local groups of users into a connected network where unwanted groceries consistently reach someone who can use them.
Built With
- api
- bun
- css
- drizzle
- hono
- next.js
- openai
- orm
- react
- sqlite
- tailwind
- typescript

Log in or sign up for Devpost to join the conversation.