← Work

Solo · open source

Tessera — QR Code Studio

Role
Solo — design and engineering
Outcome
Live and open source under AGPL-3.0 — installable, works fully offline, 77 tests over the encoding layer
Built with
React 19 · TypeScript · Vite · Tailwind CSS · PWA · Client-side
Tessera, cover image

A QR code studio that runs entirely in the browser. It encodes nine content kinds — links, WiFi credentials, vCard contacts, calendar events and more — into static symbols, where the data lives in the pattern itself rather than behind a vendor redirect that expires when a subscription lapses. While a code is being styled, the app scores it on the two axes that decide whether it will actually scan in the real world: colour contrast measured against decoder tolerance rather than typographic guidelines, and payload size against the symbol’s true byte capacity. There is no backend, so nothing typed into it ever leaves the device. Built solo, end to end.

Problem

Most free QR generators quietly hand the user a liability. They wrap the destination in a redirect the vendor owns, which lets them count every scan and means every printed code stops working when the free tier ends — annoying on a business card, expensive across five thousand flyers. The second problem is subtler: the same tools let you choose colours that look excellent on a screen and fail completely under a phone camera, and they say nothing about it until the print run is already done. Underneath both sits a class of silent encoding bug, where a WiFi password containing a semicolon or a vCard field containing a comma truncates the payload without any error, and the failure only surfaces when a guest cannot join the network.

Approach

Tessera generates static codes — the payload is encoded directly into the symbol, so nothing expires and no scan is tracked — and spends its effort on the guardrails the category ignores. Colour pairs are scored live against real decoder behaviour rather than WCAG text thresholds, because below roughly 3:1 most phone cameras fail outright and 3–4.5:1 only decodes in good light on clean paper. Payload size is metered in bytes against the actual version-40 capacity for the chosen error correction level, which more than halves between L and H, so overflow is caught while it can still be fixed. Reserved characters are escaped per scheme, closing the silent-truncation class of bug. The encoding, validation and contrast logic is kept in plain functions with no React dependency, which is where the test suite is aimed. Privacy is architectural rather than promised: there is no server, and the fonts are self-hosted so the app makes no third-party request at all — verifiable in a network tab. A service worker precaches the build, so the studio keeps working with the connection off.

Screens

Launch film · 21 seconds, with sound.
The Tessera landing page set as a print proof: the headline 'Proof the code before the run.', a sample QR code inside a dashed crop frame, a job ticket listing the link, its check and the minimum print size, a 'Pass for press' stamp, and a strip of measurements for ink contrast, paper, capacity, recovery, quiet zone and module count
The landing page is a press proof of a sample code: every measurement that decides whether it will scan, laid out before you type anything.
The studio in its light paper theme: content tabs with a link being encoded, ink presets each labelled with a contrast ratio, foreground and background colours, and beside them the live code with a 17.7:1 good-contrast badge and a press check of dark on light, capacity and quiet zone
The studio. Each ink preset shows its contrast ratio before you pick it, and the press check under the preview re-runs on every keystroke.
A pale lilac code flagged 'Likely unscannable' at a contrast ratio of 1.4 to 1, with an explanation that most cameras cannot decode it and a suggestion to darken the foreground or lighten the background
The point of the tool. A colour pair that looks fine on screen is caught at 1.4:1 and explained — before it reaches a printer, rather than after.
The same studio in its dark film theme, with the press check, a beta scan-prediction toggle and the capacity meter beside the code
The dark film theme. Scan prediction, in beta, adds a second opinion from a model trained on 5,000 decoded symbols, run on the device.
The landing page on a phone: the headline, the sample proof and the job ticket stacked in a single column
On a phone the proof stacks into one column, and the job ticket keeps its full width.