Beta — QrScanner replaces jsQR as the primary iOS decoder. Feedback welcome via GitHub discussion #4.
Overview
The iPad QR scanning problem is solved. jsQR — the decoder used since the image capture path was introduced — consistently failed on photos of QR codes displayed on screens. Perspective distortion, glare, and uneven lighting were too much for it. QrScanner, a ZXing-based decoder, handles all of these. Tested successfully on photos taken at steep angles, poor lighting, and with visible screen reflections.
This release also tightens layout for desktop and tablet screens.
QrScanner Replaces jsQR on iOS
The Chalker’s image capture path now uses QrScanner (a JavaScript port of the ZXing barcode engine) as the primary decoder. jsQR remains as a last-resort fallback.
1500px downscale — all captured photos are downscaled to max 1500px before decoding. Faster and more reliable than full-resolution processing.
BarcodeDetector removed — confirmed unavailable on iOS Safari (iPadOS 26). Removed from the image capture path; remains in the TM’s live camera scanner for desktop Chrome/Edge.
“Not set” for missing fields — the QR confirmation modal now shows “Not set” instead of “undefined” when lane or referee are not assigned.
What was tried and ruled out:
BarcodeDetector on static images — Apple’s Vision framework backs this API, but Safari does not expose it. Confirmed on iPad Air (M4) simulator running iPadOS 26.
Full-resolution QrScanner — 3072×4096 photos failed to decode; downscaling to 1500px succeeded consistently.
jsQR at multiple resolutions — tried full-res, 2000px, and 1000px in previous betas. None reliably decoded screen photos.
QrScanner adds ~60KB (16KB UMD wrapper + 44KB Web Worker). jsQR (~250KB) stays for fallback.
Layout
Responsive breakpoint — moved from 1024px to 1120px, covering tablets in portrait mode (e.g. iPad Air at 1080px).
Denser desktop tables — cell padding halved. Shows 24 players on a desktop screen.
Sticky header fix — removed overflow-x: hidden that broke position: sticky on table headers below 1120px.
Scope indicator preserved — the Analytics scope pill was hidden below 1120px. Fixed by hiding only the button children instead of the container.
Contributors
@burgerboy85-rgb — real-device iPad testing that identified jsQR’s limitations with screen photos, driving the switch to QrScanner.
Migration
No migration required. Fully compatible with all existing tournament data and match history.
NewTon DC Tournament Manager v5.0.15-beta.1 — Ka-ZXing!