LinkZae · Digital business card platform
One codebase, a separate site for every tenant
Digital business cards and link pages, each customer served from their own subdomain resolved before the page renders, with one QR code per card.

Problem
A business card or link page is a commodity until it has to carry a brand: a customer's own subdomain, their own design, and a printed QR code that has to keep working after every edit. Doing that naively means one deployment per customer, which does not scale past a handful.
Constraint
Subdomain resolution happens on every single request, before anything renders. It has to be fast, and it cannot leak: one tenant must never be able to read another's pages, even by guessing an ID.
Approach
Tenant lookup runs at the edge in middleware, backed by a small in-memory cache so most requests never touch the database. Isolation is enforced in Postgres with row-level security on every table rather than in application code, and the privileged service key stays inside a narrow server-side boundary. QR codes are rendered server-side, one per card, and point to an address that does not change when the card is edited.
Result
A live multi-tenant platform where onboarding a customer means creating a row, not a deployment. It has grown well past its first version and I have been carrying it forward since.
With thanks to the friend who started this with me and helped get the first version off the ground.
How it works
Screens from LinkZae's own site, following one card from design to scan and on to its analytics and team. Scroll, and each one zooms in on the part the text describes.
- linkzae.com01 / 07

The LinkZae home page: the headline Don't lose the people you meet, and a sample business card with a QR code.
01 / 07
One card, one link, one QR
Digital business cards and link pages. Each customer is served from their own subdomain, resolved at the edge before the page renders.
- linkzae.com02 / 07

A Design Studio panel with template, color and typography options beside a phone showing a green sample card.
02 / 07
Design it in the studio
Choose a template, an accent color and a typeface, and the phone preview follows.
- linkzae.com03 / 07

A printed business card with a QR code and a short linkzae.com address, stamped Ready to print.
03 / 07
One QR code per card
The QR code is rendered on the server, one per card, ready to print. It points to an address that does not change when the card is edited.
- linkzae.com04 / 07

A printed card beside a phone showing the card's page and an Added to contacts confirmation.
04 / 07
Scan, then save the contact
Scanning the card opens its page in the phone's browser, and one tap saves the person to the phone's contacts, with no app or account. A LinkZae user can also keep the card in their own contact book with a note.
- linkzae.com05 / 07

A printed card marked Same QR next to a phone whose phone number is struck through and replaced, tagged Updated.
05 / 07
Edit the card, keep the QR
Change a number and the page updates. The printed QR still works, because its address never changes.
- linkzae.com06 / 07

A Scan analytics panel labelled Sample with total scans, today and this week, a bar chart of the last thirty days and scans by country.
06 / 07
Scan analytics at a glance
Total scans, scans today and this week, a thirty-day chart and a breakdown by country. The numbers in this frame are sample data.
- linkzae.com07 / 07

A Team panel with an invite field, a pending invite with a Copy invite link action, and a members list with an owner and two members.
07 / 07
A team on one account
On the Team plan, invite teammates by email, track pending invites and see the owner and members in one list. Row-level security in Postgres keeps one customer's data away from another's.
Need something like this?
Send two or three lines: what you have, what is broken or missing, and when you need it. I reply within 12 hours, Monday to Saturday.