Download CV

Wishlist / Product & Full-stack / 2026

A surprise-friendly wishlist where who reserved stays anonymous

Tanya's Wishlist homepage, from the hero through the gift grid
2 nights
Build timeline
AI-first
Development

Role

  • Product design
  • UI & visual design
  • Full-stack development

Timeline

A couple of nights,
September 2026

Stack

  • Next.js 16
  • React 19
  • TypeScript
  • Tailwind CSS 4
  • Netlify Blobs

Status

Live product
wishlist.miadzvedskaya.pro

Overview

I built this over a couple of nights before my birthday on September 20. Other wishlists always stressed me out as a guest: you had to leave an email, and some even pushed you to create an account just to pick a gift.

So I made a service that works for both sides. The owner adds gifts and shares a clean link. Guests browse the lists, open the store, and reserve anonymously. Who claimed what stays hidden, so the surprise stays intact.

Hero banner in motion: pink ribbon drift and floating gifts.
Wishlist sign-in screen with gradient brand panel
Owner sign-in: email and password, with create-wishlist signup on the same screen.
Public gift grid with Birthday and Home lists
Public gift grid: browse by list, open the store link, then reserve anonymously.
Theme toggle: dark purple hero flips to the light pink ribbon.
After Reserve: falling gifts and hearts celebrate the claim.
Admin gifts panel
Admin: paste a product URL to fetch title, image, and price.
Admin wishlists panel
Admin: public and private lists on one shared link.
Admin account panel
Admin: account, public name, and share URL.
Admin owners panel
Admin: all owners hosted on the site.

Build

Stack is Next.js 16 (App Router), React 19, TypeScript, and Tailwind CSS 4. The visual language matches this portfolio on purpose: same type feel, same quiet UI chrome, so the product and the personal site read as one family.

Data lives behind a small store abstraction. On Netlify it uses Blobs JSON persistence; locally it falls back to a file store. That kept the schema simple for a weekend build while still running in production without a separate database.

Server Actions

Reserves, admin CRUD, and auth go through Next server actions. Guests never hit a custom API surface; the public page just calls reserve and refreshes.

Auth

HttpOnly cookies for admin. A master key still works as backup; owners sign in with email and a hashed password, with signed session cookies and password reset via email.

Product fetch

Paste a store URL in admin and the app scrapes Open Graph and JSON-LD for title, image, and price. You can edit anything before saving, or fill a gift manually.

Multi-owner

The site can host more than one wishlist. Each owner gets a public path like /tanya/wishlist, plus public and private lists inside their admin.

Details that matter

The hard part was not the admin. It was keeping guests comfortable: no signup, no email field, and no way to see who already reserved a gift.

Anonymous reserve

A reserve creates a claim token on the server. The token is stripped from every public gift payload. Only the guest’s browser keeps it in localStorage, so they can undo for a short window. Everyone else just sees “Taken.”

Guest flow

Open the card, jump to the store, come back, reserve. Light and dark theme both work. No account wall between “I like this” and “it’s mine for now.”

Owner flow

Admin covers gifts, lists, account, and owners. Fetch from a product link, organize Birthday vs Home, share one clean URL with family and friends.

Surprise intact

Reserved cards stay in the grid so the list still feels full, but they are clearly unavailable. The surprise is the point of the product, so anonymity is a product rule, not a nice-to-have.