Guide

Dark mode QR codes that actually scan

The honest answer is split: modern phone cameras read inverted codes, a lot of embedded scanners never will. Here are both routes to a dark design, and where each is safe.

The QR spec defines a code as dark modules on a light ground. Every scanner reads that. Inverted codes - light modules on a dark ground - are an optional extra that modern phone cameras handle by simply trying both polarities. The scanners inside apps and devices are a different story: the ZXing lineage that powers a huge share of in-app and embedded scanning tries one polarity and gives up. We know because our own verification pass is built on it - it reads a conventional code and refuses the same code negated.

Route one: the tile - works on every scanner ever made

Keep the code conventional and let the design around it be dark. A standard dark-on-light QR on its own light tile, sitting on your dark page, scans universally - the quiet zone and the tile give the scanner exactly the contrast it expects. This is what our own product page does, and it needs nothing special:

A conventional code. Place the PNG on your dark UI; the light ground travels with it.

curl -X POST https://api.ironfang.uk/renderwolf/v1/qr \
  -H "Authorization: Bearer if_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "data": "https://example.com",
    "dots": "circle",
    "dark": "#05050a",
    "light": "#ffffff"
  }' --output qr-tile.png

Route two: true inversion - screens only

For a genuinely dark code - light modules on a dark ground - Renderwolf requires an explicit flag, because the wrong way round is usually a typo and because the flag is where the caveat lives. With invert set, dark (the module color) must be lighter than light (the ground), the same contrast floor applies mirrored, and the finished raster is verified against its negative, so the structure is still proven before delivery.

Inverted: white modules on near-black. Fine for app screens and dashboards you control.

curl -X POST https://api.ironfang.uk/renderwolf/v1/qr \
  -H "Authorization: Bearer if_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "data": "https://example.com",
    "invert": true,
    "dark": "#fafafa",
    "light": "#05050a",
    "dots": "circle"
  }' --output qr-dark.png

Next