3D art gallery with print e-commerce. Artworks render as planes in a persistent Three.js/WebGL scene; page routing changes what's visible in the scene rather than replacing DOM content.
- Vike (Vite meta-framework) — filesystem-based routing, prerendering
- React + react-three-fiber / drei for the 3D scene
- Zustand for gallery interaction state
- Contentful for artwork content
- Stripe Checkout for print purchases
- Resend for order emails
- Deployed on Vercel (via Photon)
cp .env.example .envFill in Contentful, Stripe, and Resend credentials — see .env.example. For the Contentful content type schema, see CONTENTFUL_SETUP.md.
pnpm dev # Vike dev server + Express API server (ports 3000 + 3001)
pnpm build # Build with Vike
pnpm preview # Build then preview production locallyNo test or lint scripts are configured.
pages/— Vike routes (+Page.tsx,+data.ts,+Layout.tsx,+config.ts,+Head.tsxper route)index/— gallery front roomartwork/@slug/— artwork detail viewpurchase/— Stripe checkout success/canceladmin/— admin views
components/— the 3D scene (Structure.tsxis the root scene,Artwork.tsxrenders each piece,Wall.tsx/Floor.tsx/BackRoom.tsxbuild the space,CameraAnimator.tsxhandles view transitions)lib/—contentful.ts(data fetching/transform),store.ts(Zustand gallery state),stripe.ts(checkout),analytics.ts(Umami wrapper),artworks.tsapi/— Vercel serverless functions (create-checkout.ts,ship-order.ts,sitemap.ts), wrapped locally byserver.jsfor dev
See CLAUDE.md for a fuller architecture writeup and data flow.