Skip to content

feat: one random child per load, poster QR code with UTM tags - #1

Merged
vpetersson merged 3 commits into
masterfrom
feat/poster-qr
Oct 21, 2026
Merged

vpetersson merged 3 commits into
masterfrom
feat/poster-qr

Conversation

@vpetersson-bot

@vpetersson-bot vpetersson-bot commented Oct 20, 2026 •

Copy link
Copy Markdown
Collaborator

What

  • QR code with UTM tags. Each child shows a QR code for their official NCMEC poster in place of the printed URL. The encoded link carries ?utm_source=missing-children&utm_medium=qr&utm_campaign=missing-child-poster.
  • One random child per load. The app is now single-shot, like quotes and on-this-day, instead of rotating through a list. There's no rotation loop and no refresh timer: the player's reload brings the next child. The stepSeconds setting, the 1 / 20 counter and the manifest's playback block are gone.
  • Unidentified-persons records excluded. NCMEC's unidentified-persons records (prefix NCMU, deceased "John Doe" cases) are no longer shown.
  • CI fixed. bun.lock is regenerated with the pinned Bun 1.3.14. It had been written as lockfileVersion: 2, which 1.3.14 can't read.

How the random pick works

  1. Fetch page 1 of the search. It also reports totalPages.
  2. Fetch one page chosen at random.
  3. Pick one child from that page at random, preferring cases with a photo.

Every open case gets screen time, not just the newest 20. If the random page fails, the pick comes from page 1. If page 1 also fails, or the filter has no open cases, the standing hotline appeal stays up.

Searching every page is what surfaced the NCMU records. They come from the same search with no other field marking them, so toChild drops them by prefix.

The QR code is built with qrcode-generator, as in rss-reader. It uses error correction L and a 92px minimum size so it still decodes on an 800x480 panel.

Verification

  • Typecheck, lint, 35 tests and the build pass with Bun 1.3.14.
  • Rendered in Chrome:
    • repeated loads show different children;
    • every QR code decodes (jsQR) to the UTM-tagged poster URL at 4K, 1080p, 720p and 800x480, landscape and portrait;
    • the hotline band stays fully on screen;
    • with the API unreachable, the appeal screen shows.

🤖 Generated with Claude Code

vpetersson-bot and others added 3 commits October 20, 2026 17:11
Replace the printed poster URL with a scannable QR code so a passerby can
take the case with them. The encoded link carries utm_source,
utm_medium=qr and utm_campaign so NCMEC can see the traffic.

Uses qrcode-generator (same as rss-reader) at error correction L with a
92px size floor, so it still decodes on the 800x480 panel. Portrait and
short-landscape spacing tightened to keep the hotline band on screen.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: multica-agent <github@multica.ai>
The lockfile was written by a newer Bun as lockfileVersion 2, which the
Bun 1.3.14 that CI pins cannot parse, so `bun install --frozen-lockfile`
failed before any check ran. Regenerated with 1.3.14 (lockfileVersion 1);
the only resolution changes are two transitive patch bumps.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: multica-agent <github@multica.ai>
Make the app single-shot like quotes and on-this-day: each page load
fetches page 1 of the NCMEC search (for totalPages), then one random
page, and shows one child from it at random, preferring a case with a
photo. No rotation loop and no refresh timer; the player's reload brings
the next child. Drops the stepSeconds setting, the counter and the
manifest's playback block.

Searching every page surfaced NCMEC's unidentified-persons records
(prefix NCMU, deceased "John Doe" cases), which are not missing children.
toChild now drops them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: multica-agent <github@multica.ai>
@vpetersson-bot vpetersson-bot changed the title feat: QR code for the poster link, with UTM tags feat: one random child per load, poster QR code with UTM tags Oct 21, 2026
@vpetersson
vpetersson merged commit 1ba0c99 into master Oct 21, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants