All work

Iris d’Étoiles Webstore

An editorial fashion storefront with a complete browsing, cart, and checkout flow.

Role
Solo developer
Status
live
Platforms
web
Stack
  • Next.js-style App Router (on vinext)
  • React 19
  • TypeScript
  • Tailwind CSS 4
  • Stripe Checkout
  • Cloudflare Workers (Wrangler, Vite plugin)
  • Vitest
  • Testing Library

Problem

Iris d’Étoiles needed a storefront that gave its clothing room to speak for itself. The brief called for a quiet, editorial presentation, with no large promotional banner, rotating offers, or discount-heavy copy.

The site also needed a complete shopping flow, so adding payments wouldn’t require redesigning the experience.

What I built

I built the storefront as the solo developer, from the cover and collection pages through product browsing, the cart, and checkout.

The Eden capsule collection includes a hoodie, sweatpants, and a cap. Each product has an image gallery and size selection, and a cart drawer keeps the selection available while browsing. Checkout hands off to Stripe’s hosted payment page and returns to an order-confirmation page.

The app runs on Cloudflare Workers, using React and vinext with an App Router structure. It also includes the supporting pages a store needs, such as shipping, returns, contact, and privacy.

Notable engineering

  • Keeping prices on the server. The checkout builder accepts product, size, and quantity, then looks up prices from the catalog. It rejects invalid selections and ignores prices supplied by the client.
  • Verifying payment notifications. The Stripe webhook handler checks the signature before accepting an event. It uses Stripe’s Web Crypto support to fit the Workers runtime.
  • Treating saved carts as untrusted input. The cart module validates stored items against the catalog and rejects malformed data. Clearing the cart also writes through immediately, so a delayed hydration can’t bring old items back.
  • Serving images through the Worker. The Worker entry point handles image optimization through Cloudflare’s Images binding before passing other requests to the app. The transform is covered by tests for the requested image width and format.
  • Making galleries usable beyond hover. Product cards wait for alternate images to load before switching them in. The gallery supports keyboard controls, labeled navigation, and an announced image position.

Status

The storefront is live at irisdetoiles.com. The checkout flow is implemented; completed-order webhook handling currently stops at logging the checkout event.