If you’ve ever pointed your phone at a tiny component label in a warehouse and watched the scanner spin without registering anything, you’ve probably met the MicroQR Code — a compact variant of the standard QR Code designed for situations where space is measured in millimeters. Until now, Odoo’s browser-based barcode scanner couldn’t read them. Same story with MaxiCodes, the hexagonal matrix symbols that UPS stamps on virtually every package that moves through their network. Odoo’s scanner would stare blankly at both.
That changes with a quiet but meaningful upgrade to the barcode scanning engine that ships inside Odoo’s web client. The underlying library — ZXing, the open-source barcode reader that powers barcode detection across half the web — has been updated from version 0.21.3 to 0.23.0. Two minor version bumps, but they carry a surprisingly dense set of improvements for anyone whose business runs on scanning.
Two New Barcode Formats That Actually Matter
The headline additions are the MicroQR Code reader, introduced in ZXing 0.22.0, and the MaxiCode reader, added in 0.23.0. These aren’t obscure academic formats. They’re in active use across industries where Odoo is trying to become the default ERP.
MicroQR Codes are a compact subset of the QR Code standard, defined in ISO 18004. Where a standard QR Code needs a minimum of 21×21 modules, a MicroQR Code can encode data in as few as 11×11 modules. That size difference matters enormously on PCB boards, medical devices, jewelry tags, and pharmaceutical packaging — anywhere a full QR Code simply won’t fit. Electronics manufacturers, in particular, have been printing MicroQR Codes on surface-mount components for years.
MaxiCode, meanwhile, is the hexagonal barcode format developed by UPS in the 1990s and standardized as ISO 16023. If you’ve ever looked at a UPS shipping label, you’ve seen one — it’s the distinctive circular pattern of hexagonal dots, usually in the upper-left corner. MaxiCode encodes up to 93 characters and is optimized for high-speed scanning on conveyor belts. Warehouses and logistics operations that receive UPS shipments and wanted to scan those labels directly from Odoo’s interface had to work around the limitation. Now they don’t.
Both new readers are integrated into ZXing’s MultiFormatReader, which means they activate automatically when no specific format is requested, or when explicitly enabled through the POSSIBLE_FORMATS hint. There’s no configuration toggle in Odoo to worry about — if you’re scanning, the new formats are available.
1D Barcodes Get a Wider Detection Window
The less glamorous but arguably more impactful change is to one-dimensional barcode scanning. Traditional linear barcodes — the kind you see on every retail product, every warehouse shelf label, every inbound shipment — are read by sampling horizontal rows of pixels from the camera feed. The scanner looks for the characteristic pattern of dark and light bars in each row.
The previous version of ZXing sampled 15 rows by default, clustered around the center of the image. This worked well when the barcode was centered in the camera frame. But in real warehouse conditions — scanning at odd angles, scanning labels on tall shelves, scanning crumpled or partially obscured labels — the barcode often isn’t in the center. It’s on an edge, or rotated, or the operator is scanning from a natural arm position that doesn’t perfectly center the code.
The new version samples 25 rows, spread more widely across the image. That’s a 67% increase in sampling density, which directly translates to faster recognition and fewer missed scans when the barcode isn’t centered. For a warehouse worker scanning 200 items per shift, even a small improvement in first-scan success rate compounds into minutes saved per day.
The Logging Problem Nobody Saw Coming
Upgrading third-party libraries is rarely a clean swap, and this upgrade illustrates exactly why. ZXing 0.23.0 introduced a new behavior: when the MultiFormatReader fails to decode a barcode, it now logs the error with console.warninstead of silently swallowing it. For a normal application, that’s reasonable defensive programming. For a barcode scanner that runs on a live camera feed, it’s a catastrophe.
Here’s why. When the scanner is active but no barcode is in frame — which is most of the time — ZXing tries to decode every single video frame and fails. At 30 frames per second, that’s 30 failed decode attempts per second, each one generating a console warning. Open the browser developer console on an Odoo POS terminal with the scanner active, and within 10 seconds you’d have 300 warning messages scrolling past. Leave it running during a shift and you’re looking at hundreds of thousands of log entries.
The root cause is a quirk in ZXing’s exception hierarchy. Expected failures like NotFoundException (no barcode found in frame) extend Exception rather than the more specific ReaderException. The new logging code checks for ReaderException, doesn’t find it, and concludes the error is unexpected and worth warning about. It’s not. It’s the normal operating mode of a camera-based scanner.
Odoo’s fix is surgical: a patch on top of the library that catches all ZXing Exception types silently, logging only truly unexpected errors like TypeErrorthat indicate actual bugs. The patch will need to be maintained on future ZXing upgrades until the upstream library fixes its exception hierarchy — a deliberate trade-off that the team documented explicitly.
Performance Work Under the Hood
Beyond the new formats and the logging fix, ZXing 0.23.0 includes performance improvements to its internal data structures. TheBitMatrixclass — the fundamental representation of a decoded barcode image — has been optimized. The binarizers, which convert grayscale camera images into the black-and-white grids that barcode detection works on, are faster. And theHTMLCanvasElementLuminanceSource, which extracts brightness data from a canvas element in the browser, has been tuned for better throughput.
These are the kinds of changes that don’t show up in a feature list but make a tangible difference on low-powered devices — the cheap Android tablets that many small warehouses use as scanning stations, or the iPads running Odoo’s POS in retail environments. Faster decode cycles mean less battery drain, less heat, and snappier response when the operator brings a barcode into frame.
What This Means for Odoo Deployments
For most Odoo users, this upgrade is invisible. The barcode scanner works the same way it always has — you click the scan button, point the camera, and the system reads the code. But the set of codes it can read is now meaningfully larger, and the reliability of reads in imperfect conditions is measurably better.
If you’re running a logistics operation that handles UPS packages and wanted to automate inbound receipt scanning, you no longer need a separate hardware scanner to read the MaxiCode. If you’re in electronics manufacturing or pharmaceuticals and your components carry MicroQR codes, Odoo’s built-in scanner can now handle them natively.
And if you’re a developer who’s been staring at a browser console full of ZXing warnings wondering what went wrong — nothing went wrong. The library was just chatty. Odoo taught it to be quiet.