Grocy in the House

I installed and began using Grocy a few days ago. Grocy is a household food inventory manager application with lots of bonus bells and whistles. It is available in multiple forms: a desktop application, self-hosted PHP (flat file SQL by default, which I assume you could change if you wanted to), or Docker container.

This post memorializes information about how I have set my instance up for my household. I’m running the PHP/SQL version on a Raspberry Pi on my own local network. We don’t need access outside of our local network, so no port forwarding is set up at this time.

Display of Information

Grocy helpfully makes it easy to print out lists of items grouped by location, and I’m making good use of that by posting a list at each location. This is especially helpful with freezers and refrigerators – as long as you keep the posted list sheets updated, you can see what’s inside without opening the door.

I’ve also found that we have quite a few food items that are way past due. Some have even been moved cross-country twice. So I printed out a list of everything that is past due, and wrote, ‘The “Most Wanted” List’ across the top in red marker and posted it on the pantry door, where most of the items on the list reside. I aim to refer to that list regularly and work on using up those items whenever possible.

Kits and Mixes

Any product you take and combine with staple ingredients like water, milk, butter, or fresh meat to make a meal, side dish, or dessert is included in this category. This can also be complete kits with no additional ingredient requirements. This allows me to filter just those kits/mixes when doing meal planning.

  • Use “Kit” or “Mix” at the beginning of the name for sorting. 
    • Kits have multiple separated ingredients (packets, loose pasta or rice, etc)
    • Mixes have all the ingredients already mixed together except what you add
  • Add to “Main Dish”, “Side Dish”, or “Dessert” product type, as appropriate.
  • Product measuring unit is any kind of “each” (box, can, bottle, bag or just “each”)
  • Exception: canned soups have their own category, and should be named with a leading “Soup,”

Products Used “All at Once”

Any product you can reasonably expect to use all at once (canned products, single-serving snack items, etc)

  • Enter in “each” (or similar appropriate) units
  • Multipacks should be entered by individual pieces on purchase
    • Example: fruit cups entered in “fruit cup” units, Lipton Noodle Soup in “packet” units
    • Price will be “total purchase” – ie the cost to buy the pack, while you’re entering multiple “items” that were purchased as part of the pack into the inventory. Enter the entire pack, then “consume” one if you are using one right away, or the price calculation will be off.
  • Single-serving items that come in multiple flavors can be grouped together under one product name, with “multiple flavors” in the product name and every barcode in the barcode field.
    • As long as the goal is to have a minimum quantity in stock no matter which flavor (you can always examine the actual items in the pantry to inform your shopping list)


Because we consume condiments in very small increments, we will treat them as whole items until they suddenly aren’t.

  • Enter into system as “each” counts or equivalent
  • “Consume” when you throw away the container
  • Product type of “Dry Condiments” and “Liquid Condiments” (semi-solids like jelly are classified as liquids in this instance – the “dry” classification is for powdered condiments)
  • If you allow partial units in stock, you can “consume” 0.5 unit when you are approximately halfway through a particular product, which should get the system to identify the product as “under quantity” if the number of units you physically have are equal to the minimum quantity. And that gets the product on your shopping list 🙂

Bulk Products Used Incrementally

Products like flour, bread crumbs, sugar, rice, and beans are set to be managed by weight. 

Whenever possible we store these in permanent containers. 

  • We weigh the container to measure tare weight and mark it somewhere on the container for future reference.
  • We add the tare weight to the master data entry for the product.
  • When we use the product, we weigh the container after we are done measuring out what we’re going to take and enter the new total weight into the “consume” form. The system will subtract the proper amount.
  • When we refill the container, we weigh the container after we have added the new product and enter the new total weight into the “purchase” form. If there is product left in the package, set the package on top of the container and weigh them together. Use up the product in the package first until it’s gone. 
  • Wait to refill until most or all of the new package contents can be added at once.
  • When you physically purchase a new package of a product, but you can’t add it to the container yet, write the price and store name on the packaging so it can be entered into the “purchase” form later. If you still want to track it, you could create a master data product entry for the original packaging unit. When you’re ready to transfer, you consume 1 unit of the product that has the “each” quantity unit, and then you proceed with the “purchase”.
  • Bulk products that have a “basic recipe” printed on the packaging (ex rice, quinoa, couscous) have those ratios/instructions copied into the product’s description box so that if I’m transferring the product from its original packaging to a reusable container, the instructions are preserved and easy to find.

Fresh Meats and Bulk Cheese

These are tracked by the ounce. Tare weight enabled where appropriate (ie bulk shredded cheese or whole blocks that will be used incrementally)

  • First In First Out is especially important here to reduce freezer burn
  • When repackaging meats, write the name, date, and weight on the new packet
    • The “purchase” entry will be the weight and total cost of the purchased quantity of meat. Enter weight in pounds, my copy of the application is set up to convert that to ounces automagically.

Locations, Transfers, and Perishables

Grocy automatically tracks “use by” expirations for perishable items and adjusts the “use by” date whenever you transfer an item into or out of a location that is marked as a “freezer”. When you move anything from one location to another, the system also needs to be updated. This can be recorded on the posted sheets – just write:

  • Item name, from, to, date (important only for perishables), quantity

If you open an item that is shelf stable as long as it is unopened but has a “use by” once it is opened, record the date it was opened, and transfer from/to locations if it was also moved.


Spices and dry seasoning mixes are counted as each bottle/can/jar and consumed when we discard the bottle. All are set to minimum stock of 1, and allow partial, so that when a jar is running low, it can be updated to a value that is less than 1 to trigger the shopping list.

Recipes and Meal Planning

Initially, I started putting meal/side “kits” into Grocy as “recipes” that called for the kit and the additional ingredients needed. I stopped doing that once I figured out that you can add recipes or products to the meal plan. So, now I add the kit and its needed ingredients to the meal plan and don’t bother with the recipes for those (I’m still adding recipes that don’t involve kits).

All told, I think this system will work out well for me. I think I’m going to have to go poke at the backend to see how easy it would be to backup the database. I have been using a declawed CueCat scanner as my USB scanner, but I also have put a more modern $25 USB barcode scanner on my wish list for later. I may even go as far as getting a Raspberry Pi Zero W, a 7″ touchscreen, and a case for them so I can install a scanning station right in the kitchen. Finally, as a stretch goal, I might fork the project and design a separate UI for small touchscreens like the 7″.