Jared Frieden · AI Systems Architect & Engineer
jared / work / mango-qr

Mango-QR

A marketer-friendly platform for QR campaign tracking and browser-built AR experiences, with a live studio-to-phone push measured at 2.2 seconds and spatial telemetry heatmaps.

working demo Product build · 2026 Reactthree.jsFastAPIMySQLCeleryRedis StreamsWebSockets
Studio browser editorAR + QR campaigns Phone live AR viewno app install Scan telemetry every scan, locatedin space Voxel heatmap engagement, rendered in 3D ~2s push WebSocket scans aggregates informs the next edit

What it is

Mango-QR lets a marketer build an AR or 3D experience in the browser, attach it to a QR code, and see how people actually engage with it. Light assets are composed in an in-browser editor built on react-three-fiber, and a separate pipeline handles the heavy ones. Scans route through a gateway that records engagement all the way down to spatial voxel analytics of where users looked and moved.

Engineering highlights

  • Two demo moments, wired end to end. Editing in the studio pushes to a phone in 2.2 seconds over WebSockets, and scan telemetry flows into heatmaps on a 15-second beat.
  • A real publish model. Every experience carries a draft/live state. Saving never makes anything publicly scannable; only an explicit publish does, and the gateway enforces that on every public path.
  • An organ-harvest migration. Version 1 was a seven-subsystem FastAPI platform: auth, QR generation, the scan gateway, a Celery asset pipeline, Redis-Streams spatial analytics, a live configurator, and a multi-renderer viewer. Rather than rewrite it or keep limping along, v2 ported the services that had proven themselves onto a clean spine and retired the donor. Each transplanted piece was checked by running it against live infrastructure before the port counted as done.

Two war stories

The four-layer silent save. What looked like a single "view bug" turned out to be four separate defects stacked on top of each other: a persistence early-return, a field missing from the API update contract, an inner join that dropped rows, and a renderer with no 2D path. Each layer quietly swallowed the failure of the one beneath it. The fix had to run end to end, and it left me with a rule I now apply everywhere: a silent fallback is how one bug becomes four.

Verifying WebGL without a visible window. Automated review of the 3D studio hit a wall, because an occluded window stops rendering frames and the screenshots just hang. What worked was a headless Playwright harness, since Chromium still renders WebGL offscreen, and that made screenshot-graded review passes against reference exemplars possible. Three graded polish passes ran through it with the regression suite green the whole way.