Case studySaaS & StartupsOngoing

A whole SaaS platform, built in pair with AI.

QRGeno sells dynamic QR codes to Nordic and European SMBs: codes whose destination can be changed after the fact, combined with physical products — 2D stickers and 3D signs — and per-code scan statistics. Backend, frontend, payment flow, print artwork and infrastructure were built full-stack by a team of two, with Claude Code as pair programmer.

ClientQRGeno
PeriodJan 2026 – Present
RolesFullstack, DevOps
01 / Problem

A QR code is trivial. The business around it is not.

The code itself can be generated in an afternoon. What makes QRGeno a product is everything around it: a destination that can be changed after the sticker is on the shop window, print artwork that holds its measurements in the real world, statistics the customer trusts, and a payment flow that handles European SMBs from day one.

The assignment also had a hard constraint: two people, no existing platform, and a market that doesn't wait. Every decision therefore had to be chosen to avoid maintenance later — not to be maximally flexible.

ConstraintA team of two — nothing may require ongoing hand-holding.
ConstraintPhysical products: PDF artwork must be right in print, not just on screen.
ConstraintPayments and login in multiple countries — bought, not home-built.
ConstraintThe redirect path is the product: it may not be slow or down.
02 / Approach

Buy the boring, build what's yours.

Auth0 and Mollie instead of home-built login and payments. Sanity for content instead of a CMS module. Terraform and GitHub Actions from the first week, so environments never became a manual step. Left to build: the domain — codes, destinations, print artwork and statistics.

Jan 2026The domain firstThe data model for codes, destinations and scans in PostgreSQL with SQLAlchemy and Alembic migrations — the rest was built around it, not the other way round.
Jan 2026API and redirect pathFastAPI on Python 3.12 separating the product's administrative surface from the redirect flow itself, where CloudFront takes the load.
Feb 2026Accounts, payments, contentAuth0 for login, Mollie for payments and Sanity for content — three areas that otherwise eat months and then demand maintenance.
Feb 2026Physical productsPrint artwork for 2D stickers and 3D signs is generated with WeasyPrint and ReportLab, with QR rendering via qr-code-styling.
Spring 2026Platform and quality gateECS Fargate, ECR and RDS in Terraform, GitHub Actions to dev and prod, frontend on Vercel, Playwright and Vitest as the gate before release.
The principle
Everything that isn't QRGeno's business is someone else's service — and therefore not our maintenance.
03 / Architecture

Five decisions that carried the rest.

DecisionWhyConsequence
Auth0 + MollieLogin and payments across European countries are regulation, not product differentiation.No account management or PSP integration to maintain — but two vendor dependencies.
CloudFront in front of the redirectScans happen in the real world, often on weak mobile connections, and must answer instantly.Redirect latency and availability are decoupled from the application's operational state.
Terraform from day oneA team of two can't afford environments that only exist in someone's head.Dev and prod are identical descriptions; rebuilding is a command, not a project.
PDF generation in the backendPrint artwork must be right to the millimetre and be regenerable for every order.WeasyPrint and ReportLab make the artwork an API resource instead of a manual design step.
TypeScript + typed API contractsAI-assisted development needs a compiler that says no.Errors are caught in the build instead of production — the precondition for working fast.
Step 01A code is createdThe customer creates a code in the React app; destination and style are saved via the API.
Step 02Artwork is printedSticker or sign gets generated PDF artwork in the right format.
Step 03A scan happensCloudFront receives the hit and forwards the visitor instantly.
Step 04Statistics landThe hit is geolocated with GeoIP and shown per code in the customer's view.
04 / AI pair programming

Claude Code as a second pair of eyes — even on design.

Large parts of the development were driven with Claude Code as pair programmer, including design and UI. What made it a working method rather than a shortcut was the guardrails around it: typed interfaces, tests in the pipeline and infrastructure as code — everything that makes a change either prove itself or get stopped.

How it was usedClaude Code as pair programmer through large parts of the build — implementation, refactoring and UI work, including design decisions.
What made it safeTypeScript, typed API contracts, Vitest and Playwright in the pipeline: suggestions must pass the same gate as hand-written code.
What it was notNo autopilot. Architecture, vendor choices and the data model are human decisions — the AI worked inside them.
05 / Outcome

What was actually delivered.

Time to first payment— weeks —From project start to a paying customer in production.
Active codes— count —Dynamic codes in operation with customers.
Redirect latency— ms p95 —Response time on the scan path via CloudFront.
Release cadence— per week —Deploys to prod via GitHub Actions.
Dashed boxes lack a verified number — no estimates are published.

Qualitatively: a complete product in operation — accounts, payments, code management, print artwork and statistics — on infrastructure described in Terraform and released via GitHub Actions to dev and prod. The E2E flows run in Playwright, meaning the purchase path is tested the way a customer experiences it, not just as API calls.

06 / Technology

30 technologies, grouped.

Backendpython/fastapipostgresqlsqlalchemyalembicweasyprintreportlabgeoip
Frontendreacttypescriptvitetailwindcssradix-uitanstack-queryqr-code-stylingleaflet
Servicesauth0molliesanity
Infrastructureaws/ecsaws/fargateaws/ecraws/rdsaws/cloudfrontterraformdockervercel
Delivery & testgithub-actionsplaywrightvitest
AI-assisted workclaudeclaude/design
Say hello

Got a problem worth solving?

Chat with us on WhatsApp. We reply within 48 hours.