fix(android): pairing QR now actually scannable

Camera decode failed because every lever was at its minimum: the web
modal generated the QR at 112px (~2.5px per module before upscaling),
the analysis stream was CameraX's 640x480 default, and ZXing ran
without TRY_HARDER. Generate the QR at 512px (displayed 192px with a
real quiet zone), analyze at 1280x720, decode with TRY_HARDER plus an
inverted-luminance fallback. v0.4.14 (versionCode 18).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Dorian
2026-07-17 02:03:11 +01:00
co-authored by Claude Fable 5
parent 9d21dd5111
commit 6df9afe684
3 changed files with 34 additions and 9 deletions
@@ -93,7 +93,9 @@
</div>
<div class="flex justify-center mb-4">
<div class="w-[128px] rounded-2xl border border-white/10 bg-white/[0.03] p-1 overflow-hidden">
<!-- Bigger than the download QR: this one is scanned by the
companion app camera, and physical size drives decode. -->
<div class="w-[192px] rounded-2xl border border-white/10 bg-white/[0.03] p-1 overflow-hidden">
<img
v-if="pairQrDataUrl"
:src="pairQrDataUrl"
@@ -218,9 +220,12 @@ watch(companionIntroRequested, (requested) => {
watch(visible, async (isVisible) => {
if (!isVisible) return
// Generate large and let CSS scale down — at 112px source a ~45-module QR
// is 2.5px/module, which camera decoders (the companion app included)
// routinely fail on. 512px keeps every module crisp.
qrDataUrl.value = await QRCode.toDataURL(companionDownloadUrl, {
width: 112,
margin: 1,
width: 512,
margin: 2,
errorCorrectionLevel: 'M',
color: {
dark: '#111111',
@@ -261,9 +266,11 @@ async function showPairScreen() {
step.value = 'pair'
if (!pairQrDataUrl.value) {
pairingUrl.value = await buildPairingUrl()
// Large source + a real quiet zone; this QR is scanned by the companion
// app's camera, so give it every advantage (see download QR note above).
pairQrDataUrl.value = await QRCode.toDataURL(pairingUrl.value, {
width: 112,
margin: 1,
width: 512,
margin: 3,
errorCorrectionLevel: 'M',
color: {
dark: '#111111',