Skip to content
SirTobyB edited this page Aug 14, 2026 · 1 revision

FAQ & troubleshooting

The camera does not start on Android

Almost always the reverse proxy, not the app. Many Traefik or nginx setups send a global Permissions-Policy: camera=() header, which forbids camera access for every site behind them. The browser then refuses silently — no permission prompt, and nothing you can fix in Android's settings.

Allow the camera for your own origin, e.g.

Permissions-Policy: camera=(self)

and reload. If Chrome has already remembered a refusal, clear the site's settings: address bar → the icon left of the URL → Site settingsReset permissions.

Android warns "built for an older version of Android"

That warning means Chrome did not install the app as a proper PWA but as a legacy wrapper — and such a wrapper cannot get camera access at all. It happens when the service worker is missing or fails to register. Reinstall from the home screen after a full reload; if it persists, check that /service-worker.js is reachable over HTTPS.

No beep after a scan

  • On iPhone the silent switch can suppress it. Vibration is no help either, iOS ignores it entirely.
  • Browsers only allow sound after a user interaction — the very first beep of a session may be swallowed if you have not touched the screen yet.

Photos fail with a 500 error

Uploads larger than the configured limit are rejected. The container sets BODY_SIZE_LIMIT=15M; a phone photo of 2–3 MB fits comfortably. If you run the app without that variable, adapter-node's default of 512 KB applies and every photo fails. Pictures themselves are capped at 10 MB.

Which image formats can I upload?

JPEG, PNG, GIF and WebP. The type is determined from the file's actual content, not from what the browser claims. SVG is not accepted — it is an active document that would run in your browser when opened directly.

The login says my password is wrong, but it is right

If your password contains # or $ and you set it through .env or docker-compose.yml, check the quoting. An unquoted # starts a comment and the password is silently truncated at that point.

If you have tried several times, wait: after five failures the username is locked for a minute, doubling up to 15 minutes. See Users.

Suggestions keep showing items I already ordered

They should not — the suggestions are reconciled against your basket and your undelivered orders. If the page shows a warning that the basket or the open orders could not be read, Picnic was unreachable at that moment and the list is not fully reconciled. Reload once Picnic responds again.

Something did not arrive in the basket

Picnic accepts unknown product IDs without complaining. Proviant checks afterwards and names what did not arrive. Fix it by setting the item's Picnic link again — see Ordering.

Can Proviant order automatically?

No, and it will not. The app fills the basket; checkout stays in the Picnic app.

Can I search Picnic by barcode?

No. Picnic's search does not accept EANs and its product details contain none. Barcodes resolve through Open Food Facts; the Picnic link is made by name or by entering the product ID.

Is my fix already deployed?

Check Account → Version: it shows the build time and commit of the running instance. That is faster than guessing, and it has explained more than one "bug".

Where is my data?

In the ./data volume: the SQLite database, the pictures and the Picnic auth key. Back that directory up and you have backed up everything. Migrations run automatically on start, so restoring an older backup into a newer version works.

Why is the changelog only in German?

Interface, messages and this wiki are English; the changelog is not, because keeping three translated copies in step would be unrealistic. The account page marks it as German-only when your interface is set to another language.

Clone this wiki locally