Lista Marzeń
Gift lists where guests reserve presents quietly - no duplicates, no spoiled surprise.
- Type
- Consumer web app (PWA)
- Role
- Product design, design system, full-stack development
- Year
- 2025–2026
- For
- Binary Brain Technologies product
- Stack
- Next.js 16 · React 19 · TypeScript · Prisma · Supabase · Stripe · Resend · PWA · Vercel

02
Context
Gift lists usually fail in the same way: two guests buy the same present, because nobody can see what the others have already chosen.
Lista Marzeń is a Binary Brain Technologies product for Polish users, in development since August 2025 and live in production.
03
Role
I designed and built it: product, design system, backend, payments and the installable app. The repository has a single author.
04
Idea
A silent reservation.
The core of the product is one small state change: a gift moves from free to reserved. Other guests see only that it is taken; only the host sees who took it.
The visual language - “celebration editorial” - draws a ribbon from the first wish to the unwrapped gift. It is the thread through the whole marketing site.
05
Experience
- Paste a link from any shop and the gift fills itself in - title, image and price are read from the page.
- Guests open one link, reserve without creating an account, and get a private link to change their mind later.
- Occasion themes for birthdays, weddings, communions, Christmas and baby showers; a shared “envelope” to coordinate group gifts without handling money.
- Installable as an app, with an Android share target: share a product from a shop app straight onto a list.



06
System
- InterfaceNext.js 16 App RouterReact 19TailwindRadixInstallable PWA (Serwist)
- StateTanStack Query with a persisted cache
- DomainAtomic “only if unreserved” reservationPlans and limitsAudit log for the admin panel
- APIRoute handlers validated with ZodSSRF-guarded link previewStripe webhooks, idempotent
- DataPrisma on Supabase PostgresSupabase Auth (email, Google) and Storage
- InfrastructureVercelUpstash rate limitingResendGitHub Actions CI
07
Details
Reservation state is never cached at the edge
An early version cached the shared list for a minute. That was enough for a reserved gift to look free to the next guest. The response is now private and uncached - correctness beats a faster first byte on the one screen where it matters.
Share cards rendered once
Every list gets its own social preview. They are rendered once, stored, and served as immutable images with a version key. The fonts were replaced after the Polish “ń” fell back to a system font in the first renders.
The image optimiser only trusts one host
Pasted product images are shown unoptimised, and the image optimiser accepts only the app’s own storage, so it cannot be used to fetch arbitrary URLs.
08
Output
A live Polish product at listamarzen.app, installable on phones.
09
Reflection
The hardest problems were not visual. They were about what a guest must never see, and each one ended up as a rule in code: an atomic update, an uncached response, a trusted image host.