Skip to content

Scanning

SirTobyB edited this page Aug 14, 2026 · 1 revision

Scanning

The scanner is the fastest way to book: hold a barcode in front of the camera, confirm, done. It is the green button in the middle of the bottom bar on the phone, and Scan in the sidebar on the desktop.

Booking in and out

  1. Point the camera at an EAN-13 or EAN-8 barcode.
  2. A short beep and a vibration confirm the read, and the item appears with its current stock.
  3. Choose book in (with location and optional best-before date) or book out.

Booking out uses FEFO: the batch expiring first is taken, wherever it sits. You do not have to pick.

When the barcode is unknown

If no item carries that EAN, Proviant offers to create one. The barcode is carried over, and name, pack size and picture are pre-filled from Open Food Facts when the product is known there. See Items.

Picnic cannot help here: its search does not accept EANs, and its product details contain none. Barcode lookups therefore only ever go to Open Food Facts.

Typing the code instead

Every scanner view has a field to enter an EAN by hand. Use it when a barcode is crumpled, missing, or the light is bad — the result is exactly the same as a successful scan.

Sound and vibration

A recognised code is acknowledged twice over: a short beep generated in the browser, and a vibration.

  • iPhone ignores vibration entirely — that is why the beep exists.
  • With the silent switch on, iOS may suppress the beep as well. Proviant asks iOS to treat it as playback audio (Safari 16.4 and newer), which helps in many but not all cases.
  • Browsers only allow sound after a user interaction, so the first beep of a session may be swallowed if you have not touched the screen yet.

Which browser does the actual reading

  • Android Chrome uses the barcode detector built into the system.
  • iPhone and desktop browsers load a WebAssembly decoder that ships with the app itself — nothing is fetched from a third party, and it works without an internet connection.

If the camera does not start at all, see the FAQ — on a self-hosted setup behind a reverse proxy, the cause is almost always a Permissions-Policy header sent by the proxy, not the app.

Clone this wiki locally