Barcode Buddy: A PHP Barcode Bridge Between a Scanner and Grocy
Barcode system for Grocy
At a glance
- What is it?
- Barcode Buddy accepts barcode input from a scanner or the web UI and calls the Grocy API to consume, add or open the matching product. It is a small self-hosted add-on for people already running Grocy, and its value depends on Grocy being the system of record.
- Who is it for?
- Adopt Barcode Buddy if Grocy is already your inventory system of record and you want a scanner or Android device to drive consume, add and open actions without opening the Grocy web UI. Do not adopt it if you are not running Grocy, if you need a general-purpose barcode database, or if you cannot expose a PHP web endpoint that a scanner can post to.
- Can I use it commercially?
- Yes, with strict conditions. AGPL-3.0 is a network copyleft licence: if people use a modified version over a network, for example as a hosted service, you must offer them its source code under the same licence.
- Is it still maintained?
- Yes. The repository last received commits 50 days ago.
- What is it written in?
- Mainly PHP, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on November 14, 2026, and from our analysis. They are not legal advice.
Star history
- Forceu/barcodebuddy615 ★ · +11
| Repository | 2026-09-11 | 2026-11-14 |
|---|---|---|
| Forceu/barcodebuddy | 604 | 615 |
11 Stars in the last 64 days, measured from the daily GitHub snapshot. Compare with other projects
Editorial analysis
The gap Barcode Buddy fills between a scanner and Grocy
Grocy is a self-hosted ERP for household inventory. It records what you have, where it is and when it expires, but its primary interface is a web application. A barcode scanner, by contrast, emits a string. Nothing in Grocy's own surface turns a scanned EAN or UPC into a stock movement without a human clicking through the matching product first. Barcode Buddy exists to close that gap: it takes a barcode, decides whether Grocy already knows the product, and if so calls the Grocy API to consume, add or open it. If the barcode is unknown, it looks the product name up through an external API and presents a choice in its own web UI. The audience is narrow and specific: people who already run Grocy, own a barcode scanner or an Android device, and want the physical act of scanning to become the data entry step. It is not a standalone inventory system and it does not store your stock. Grocy remains the database.
What happens when a barcode arrives
The README describes the core loop plainly. Barcodes are passed to Barcode Buddy, either manually through the web UI or automatically by grabbing input from a scanner. If the barcode is already in the Grocy system, Barcode Buddy triggers the matching action there: consume, add or open the product. If the barcode is unknown, the product name is looked up and a corresponding product can be chosen in the web UI. There is a second mechanism layered on top: tags can be saved, and if a new product contains the tag in its name, that product is already preselected in the drop-down list. That preselection is the part worth noticing. It means repeated scanning of unfamiliar items from the same brand or category converges on fewer clicks over time, without any machine learning or model training. The lookup itself relies on external services, with openfoodfacts.org and upcitemdb.com named in the acknowledgments as the barcode lookup APIs. So the unknown-barcode path has an external dependency: if those services do not recognise a code, the user is left with manual entry. The README does not describe a fallback for that case.
Running it: PHP, Docker, or an Android client
The prerequisites listed are a webserver that supports PHP (NGINX and Apache are given as examples), or Docker, plus a Grocy API key and ideally a barcode scanner or Android device. The README points to the Read the Docs documentation for installation and states that installation can be done in a couple of minutes, but the repository README itself does not reproduce the commands or config keys. What it does name are the distribution channels: bare metal, an Android client published on the Play Store and F-Droid under the package de.bulling.barcodebuddyscanner, a Docker image, a community-supported Kubernetes deployment, and a community-supported Home Assistant integration. The Docker section carries a warning in the README that the image name has changed, so anyone copying an older docker pull line from a blog post or an old compose file should check the current name against the documentation rather than assume it still resolves. The only configuration instruction stated directly in the README concerns reverse proxies: caching must be disabled, with a link to the setup page for details. That is a real constraint, not a formality. A caching proxy in front of an endpoint that receives scanner posts can serve a stale response or swallow a request, and the project treats this as important enough to call out in the top-level README.
The Android client and the scanner input path
Barcode Buddy is unusual in shipping a first-party Android client rather than leaving the mobile side to third parties. The README lists it as one of the available forms, with links to both the Play Store and F-Droid. That matters for the deployment decision: a phone with the client installed can act as the scanner, which removes the need for dedicated hardware in a kitchen or stockroom. The web UI also accepts manual barcode entry, so the system degrades to a lookup-and-click tool if no scanner is present. What the README does not explain is how the Android client authenticates against the PHP backend, whether it talks over the local network only, or what happens when the phone loses connectivity mid-scan. Those are the questions to answer from the documentation before relying on the mobile path in a setting where scans must not be lost.
Where Barcode Buddy is the wrong choice
The clearest limitation is structural: Barcode Buddy is an add-on to Grocy, so without a Grocy instance and an API key it has nothing to act on. Anyone looking for a standalone barcode inventory tool, a price comparison utility, or a scanner app that keeps its own database will find the prerequisites disqualifying rather than merely inconvenient. The second limitation is the unknown-barcode path. The README states that the product name will be looked up, with openfoodfacts.org and upcitemdb.com credited for the lookup API. Coverage on those services is uneven across regions and product categories, and the README does not claim otherwise. When a lookup fails, the workflow falls back to choosing a product in the web UI, which is exactly the manual step the tool was meant to remove. The third is operational: the project requires a PHP-capable webserver or Docker, and it must be reachable by whatever device is scanning. A caching reverse proxy is explicitly called out as something to configure around. None of these are defects in the code; they are boundaries of the problem it was built to solve, and they should be checked against your environment before installation rather than after.
How this differs from scanning directly into Grocy or building your own endpoint
Grocy itself is a web application with an API, and a technically inclined user could write a small script that takes a scanner's keyboard-wedge output and posts to that API directly. The difference in approach is where the decision logic lives. A direct script has to implement the unknown-barcode branch itself: which lookup service to call, how to present the candidate products, how to remember that a given brand usually maps to a given product. Barcode Buddy packages that branch, including the tag-based preselection rule and the web UI for resolving ambiguous codes. The cost of that packaging is a second service to run and maintain alongside Grocy, plus an Android client if you want the mobile path. The benefit is that the resolution workflow is a maintained component rather than a personal script. For a single user with a stable product set and no interest in the lookup fallback, a direct API call is less machinery. For a household where new products arrive regularly and someone has to decide what they are, the packaged workflow is the part that saves time.
Maintenance, release cadence and the AGPL-3.0 licence
The project is licensed AGPL-3.0, described in the README as AGPL3+, with the LICENSE.md file as the reference. The practical implication of the AGPL family is that if you modify Barcode Buddy and let users interact with it over a network, the licence's source-availability conditions can attach to your modified version. That is a general property of the licence, not legal advice, and anyone modifying and hosting it for others should read the licence text and take their own advice. On maintenance, the release history shows v1.9.0.0 dated 2026-09-03, preceded by v1.8.1.8 in June 2024 and v1.8.1.7 in September 2023. The gap between the 2023 and 2024 releases is roughly nine months, so this is not a project that ships weekly. The version numbering carries four components, which makes it hard to infer the size of a change from the number alone; the release notes are the place to check what moved. Upgrade cost is mostly operational rather than code-level: a Docker image pull or a file replacement on bare metal. The one upgrade hazard stated in the README is the changed Docker image name, which means an old compose file may silently keep pulling an outdated or missing image. Verify the current name before upgrading.
Editorial conclusion
Adopt Barcode Buddy if Grocy is already your inventory system of record and you want a scanner or Android device to drive consume, add and open actions without opening the Grocy web UI. Do not adopt it if you are not running Grocy, if you need a general-purpose barcode database, or if you cannot expose a PHP web endpoint that a scanner can post to. Before installing, verify three things: that your Grocy instance issues an API key, that your reverse proxy configuration disables caching for the Barcode Buddy paths, and that the Docker image name you plan to pull matches the current one, since the README warns the image name has changed.
Frequently asked questions
What does Barcode Buddy do with a barcode it scans?
If the barcode is already in Grocy, Barcode Buddy consumes, adds or opens that product there. If it is unknown, the product name is looked up and you choose the matching product in the web UI.
Which service provides the barcode lookup for Barcode Buddy?
The lookups come from openfoodfacts.org and upcitemdb.com, both credited in the acknowledgements as providing the barcode lookup API. Neither is implemented inside the repository.
What do I need before installing Barcode Buddy?
A webserver that supports PHP such as NGINX or Apache, or Docker, plus a Grocy API key. Ideally you also have a barcode scanner or an Android device, since the intended workflow grabs input from the scanner rather than typing barcodes in.
Can Barcode Buddy run on Docker or Kubernetes?
Docker is a first-class option, though the README flags in red that the image name has changed. The Kubernetes deployment is a third-party repository marked community support only, as is the Home Assistant integration.
Why does Barcode Buddy ask me to disable caching on a reverse proxy?
Scanner input arrives as a request that is consumed once, so a cache in front of the application can swallow it or replay it. The symptom is a scan that appears to do nothing, or the same item counted twice, and the example directory ships an nginxReverseProxy.conf.
How is Barcode Buddy licensed?
It is AGPL3+ licensed. The README links the details in LICENSE.md, and Grocy, which it talks to, is credited to Bernd Bestel.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/forceu-barcodebuddy)Star history chart for your README
[](https://hysenlabs.com/projects/forceu-barcodebuddy)Was this useful?