Skip to content

Work

Age-verified unattended retail — BankID to hardware unlock

A platform that gates age-restricted vending machines behind Swedish BankID: the customer scans a QR code, verifies their age, and the machine physically unlocks. Admin console, kiosk fleet and mobile flow — one API.

.NET 8 · Blazor WebAssembly · Electron · Raspberry Pi · SignalR · Azure SQL
Context
Swedish law restricts who may buy certain goods. An unattended vending machine has no cashier to check ID — so selling age-restricted products through one requires verification at least as strong as a human check, with proof it happened.
Problem
Connect a legally valid identity check to a physical lock: from a QR scan on the customer’s phone, through BankID age verification, to a relay pulse that opens one specific machine — and nothing else.
Constraints
Hardware in the field on cellular networks: kiosks must be offline-first and remotely updatable without site visits. A QR code must be impossible to relay to someone standing elsewhere. Every unlock needs an audit trail.
Role
Sole developer across three major platform versions — API, admin console, kiosk client and mobile flow.
Architecture
One ASP.NET Core API serving three surfaces: a Blazor WebAssembly console where operators manage machines, GPIO configuration and fleet health; offline-first Electron kiosks on Raspberry Pi reacting to SignalR commands; and an anonymous, GPS-gated mobile unlock page. BankID verification runs through a certified identity gateway; on success the backend pushes an unlock command over SignalR that pulses a GPIO relay. Azure SQL keeps the audit trail; kiosk auto-updates ship from blob storage with SHA-256 integrity checks.
Key decisions
A GPS proximity gate — the phone must be within metres of the machine before a verification session starts, so QR codes cannot be shared remotely. Per-machine JWTs with silent renewal instead of shared device credentials. Signed, hash-verified auto-updates so the fleet is patched without site visits. Pulse patterns are configurable per machine, because real vending hardware disagrees about what an “unlock signal” is.
Outcome
Three major platform versions shipped; the third unified the admin console, kiosk fleet and mobile unlock under a single API. Fleet size and usage figures are the operator’s and are not published here.
Evidence
Private repositories; sole authorship verifiable from commit history across all versions. References available on request.
Confidentiality
Described at domain level only — the platform and its operator are not named here.