Hold up a code and the robot reads it
A new card reads QR codes and barcodes: scanning a code to join a network, reading a part number, reading a parcel label. No model to download — it works the moment the container is up. It can read the live picture, a photo, or a link. Text recognition also moved from “read every frame” to a rate you set, once a second by default.

Asked for, not streamed
Nothing wants a stream of barcodes. A code is read because somebody is holding one up, and the answer belongs to whoever asked — so the card returns it as the result of the call rather than publishing “no code in this frame” thirty times a second.
Three ways to ask, matching the other vision cards so a model that can drive one can drive this: read the live picture (it looks at a one-second rolling window, newest first, and stops at the first frame that decodes), read a photo, or read a link.
Finding nothing is a success
No code in the picture returns a successful result with a count of zero. Failure is reserved for a scan that could not happen — a bad path, a dead link, no frames, no decoder — because a model handed a failure will retry a scan that worked perfectly well.
While we were in there
Text recognition defaulted to recognising every single frame, which on a 14 fps stream meant the card quietly ate a core for nothing. It now takes a frequency — once a second by default — which is also what an operator actually reasons about.