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
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.
STACK
Technology stack
SCREENS
What it looks like.



