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.