An interactive 3D artifact showcase. Browse a small catalogue of recovered "artifacts" (3D models) rendered in real time, with hero copy, dossier stats, and accent colors that retune per artifact.
Live preview: https://objekt-404.vercel.app
- Framework: TanStack Start v1 (React 19, file-based routing)
- Build: Vite 7, deployed to Cloudflare Workers
- Styling: Tailwind CSS v4 (native
@import+@themetokens insrc/styles.css) - 3D: three.js, @react-three/fiber, @react-three/drei
- Animation: GSAP + ScrollTrigger
- Backend: None — fully static client app
pnpm install
pnpm run devThe app runs on http://localhost:8080.
pnpm run build # production buildpublic/models/ GLB artifact models served as static files
src/assets/models/ CDN-hosted model references (.asset.json)
src/components/
Scene.tsx R3F canvas, GLB loader, auto-fit, error boundary
Cursor.tsx Custom futuristic reticle cursor
src/lib/artifacts.ts Artifact registry — single source of truth
src/routes/
__root.tsx App shell, fonts, SEO/OG metadata
index.tsx Home page (hero, dossier, catalogue, transmit)
src/styles.css Tailwind v4 theme tokens + utilities
- Drop the model into
public/models/your_model.glb(1K textures recommended). - Append an entry to
ARTIFACTSinsrc/lib/artifacts.tswith metadata, accent colors, dossier stats, andfitSizefor framing. - That's it — the hero, dossier, catalogue, and accent theme all rebind automatically.
Keep models small: aim for < 5 MB, 1K textures, Draco-compressed where possible.
- Models other than the active one preload during browser idle (
requestIdleCallback). - Canvas uses
dpr: [1, 1.5],high-performanceGL, and a single-frame baked contact shadow. - Only the
<Model>re-suspends on artifact swap — the WebGL context, lights, and environment persist.
Private / unlicensed. All artifact models belong to their respective authors.