Live: https://art-history-museum-nine.vercel.app
A browser-based, interactive 3D art museum. The entry point is a zoomable night-sky timeline of art history: fifteen periods glow as nebulae along a real-date axis; zooming in resolves each period's artists as stars placed by the years they actually worked. Clicking a star opens a museum-placard artist card, and from there you step into that artist's own first-person 3D gallery (WASD + mouse) hung with their real works. Clicking a painting opens a high-resolution inspect view with its story and curiosities.
Every biography, image, date, story and fun fact is pulled verbatim from English Wikipedia, Wikidata and Wikimedia Commons at seed time — nothing is AI-generated. Only Commons-hosted, free-licensed images (public domain, CC0, CC BY/BY-SA) pass validation; each artwork stores its license, author attribution and a link back to its Commons file page, shown in the inspect view. Because free licensing is a hard gate, some famous 20th-century names (Picasso, Pollock, Rothko, Warhol, Magritte…) cannot have rooms — their works are still under copyright — so the modern periods feature artists whose works are genuinely free: newly public-domain painters (Léger, Gris, Tanguy, Gorky…) and photographed public works under freedom of panorama (Calder, Moore, Gormley, Saint Phalle…).
- Next.js 15 (App Router) · React 19 · TypeScript · Tailwind v4
- Timeline: SVG +
d3-zoomsemantic zoom, GSAP camera flights (d3.interpolateZoomthrough a GSAP tween), imperative screen-space layer - 3D gallery: React Three Fiber + drei — PBR materials (Polyhaven CC0),
per-painting shadow-casting spotlights baked once,
MeshReflectorMaterialparquet, N8AO + Bloom + ACES tone mapping, pointer-lock WASD with AABB clamp - Database: Neon Postgres + Drizzle ORM (read-only at runtime, statically generated pages)
- QA: Playwright against the deployed site
pnpm install
# .env.local: DATABASE_URL=postgres://… (never commit)
pnpm db:push # create tables
pnpm seed # dry-run validation (no DB writes)
pnpm seed --write # fetch + validate + upsert into Neon
pnpm devThe seed pipeline caches every API response under .cache/wiki/, throttles to
a small polite pool with a descriptive User-Agent, and refuses to write unless
≥12 periods pass with ≥3 artists each and ≥8 works per artist
(--refresh ignores the cache).
$env:BASE_URL = "https://<deployment-url>"
pnpm qaArtwork images and texts: Wikipedia / Wikimedia Commons contributors (licenses per artwork, shown in-app). Wall/floor textures and HDRI: Poly Haven (CC0).