CASE STUDY · Label

One week from blank repo to landed: a branded QR generator with editable destinations, jsonb style config, and 44 backend tests on a shared Go pattern.

Shipping a QR product in a week by mirroring the Go link domain

Shipped: 2026-06-223 min read

PROBLEM

The problem

Label was the second glincker tool in line for migration. We needed a QR generator with editable destinations, brand customization, and analytics — none of the watermark-infested commodity sites were worth pointing users at. The QR market is full of tools that hold your codes hostage behind a paywall or slap a logo on every export by default. We wanted one that was owned, brandable, and wired into the same auth and dashboard as Glink.

APPROACH

Our approach

The first decision was whether to model Label as its own domain or bolt it onto the link domain. We chose a clean mirror: a separate qr_templates table, its own set of usecase + handler layers, the same chi routing and sqlc patterns as Glink. Mirroring let us move fast because the shape was already solved.

QR appearance config (colors, logo, corner shape, error correction level) goes into a jsonb style column on qr_templates. We did not enumerate columns for every style property. jsonb keeps the schema open for new style options without a migration each time, and the Go struct maps cleanly via the pgx json scanner.

Frontend development ran in parallel with the backend using a mock client. Ten marketing page sections (Hero, Demo, Compare, FAQ, and others) were built against typed fixtures so UI work never blocked on API readiness. Once the real API landed, swapping the mock for the real client was a one-line change per hook.

Scan analytics (a scan_events table, per-code counts) are stubbed. The columns are reserved in the schema and the stats endpoint returns zeros. Phase 5 work. Shipping stubs now costs nothing and avoids a migration later.

OUTCOME

What shipped and what we learned.

Label landed in one week: 44 backend tests (31 usecase, 13 handler), 10 frontend sections, and a single migration (0009) applied to the shared Postgres instance. No users to migrate — Label is a new product with no glincker carryover — so day-one state is clean.

1 weekBackend domain portedGo + sqlc + theauth-go, mirrored link pattern
6API routes shipped5 authed CRUD + 1 stats endpoint
44Backend tests31 usecase + 13 handler
10Frontend sectionsHero, Demo, Compare, FAQ, and more
0009Migration sequenceqr_templates table with jsonb style
0Existing users migratedNew product, no carryover

STACK

Technology stack

SCREENS

What it looks like.

Label marketing page hero
Label marketing page hero: branded QR, editable destination, no watermark.
Branded QR preview card
QR preview card: live color, logo, and corner-shape controls.
Dashboard QR codes list
Dashboard QR list: owner-scoped, edit destination without reprinting.
qr_templates schema with jsonb style column
qr_templates migration 0009: jsonb style keeps the schema open.

MORE WORK

Want to read more case studies?

Back to all work