Projekt
Kuvert
Gift cards, punch cards and tickets for Danish businesses, sold from their own website. Built and run together with Adsmark.
What it is#
Kuvert lets restaurants, cafés, venues and salons sell digital gift cards, punch cards and tickets from their own website. The buyer pays with MobilePay, card, Apple Pay or Google Pay, and the recipient gets a code and a QR straight away, by mail or as a pass in Apple Wallet or Google Wallet. Staff redeem it at the counter with the phone they already have.
Table booking is an add-on: ordinary restaurant booking, and a nightclub mode where a club sells the night as table packages.
It is built and operated by MICCI, together with Adsmark, the Vejle marketing agency whose clients it was first built for. Adsmark handles content and marketing, we handle the product, the code and the operations.
What it solves#
A small Danish business that wants to sell gift cards online usually ends up with one of two things: a white-label platform that looks like somebody else's shop, or a WooCommerce plugin that nobody maintains once the agency has left. Neither handles tickets for a Friday night, a punch card for ten coffees, or a card that has to be spent in three visits.
Kuvert puts all of those in one place, embedded on the business's own site, with the counter, the door and the books in the same dashboard.
What I refused to compromise on#
Kuvert never holds the money. Payments run as Stripe Connect direct charges: the buyer pays on the business's own Stripe account, the money lands in their balance, and Kuvert takes only its fee. There is no pool of customer funds sitting with us for months. The reasoning is in Why Kuvert never holds the money.
A wallet pass that tells the truth. A pass saved to a phone is a copy, and nothing refreshes it on its own. Every place in the code that moves a balance also pushes the change to Apple and Google, so the card in a customer's pocket shows what is actually left. See A saved wallet pass is a copy.
The door is the hardest screen. One phone, one hand, in the dark, with a queue. The scanner keeps running between guests instead of asking for a tap after every ticket. See Teaching a gift card platform to sell a club night.
How it's built#
Bun and Hono on the API, React 19 and Vite for the storefront, the dashboard and the marketing site, Postgres through Drizzle, and end-to-end types through Hono RPC. Money is stored as integer øre everywhere. Mail goes through PostStack and everything runs on HostStack.
The quality gate runs well over three thousand tests without a database or a network, and the rules that decide money and access (card state, ticket state, the scan gate, release order) live as pure functions shared by the API, the storefront and the dashboard, so all three give the same answer.
Andre projekter
PostStack
The email API I built after a year stitching three vendors together. Transactional, marketing, and inbound on one product — typed SDK, real test mode, EU-hosted.
BunHonoPostgresRedisBullMQMCPHostStack
The European PaaS I built when Render's DX and Hetzner's prices wouldn't fit on the same invoice. Git push, zero-downtime deploys, managed Postgres + Redis next door — billed in euros.
BunHonoPostgresRedisTraefikDocker+1Skyskraber
A 2D chat universe for Danish-speaking adults, in the lineage of Habbo, Netstationen, and 3Dbyen. Rooms feel like floors of a tower. 51 WebSocket modules, one engineer.
BunWebSocketsCanvasPostgresRedisStripe