An interactive 3D physics junk drawer β my CV, dumped onto a workshop cutting mat as objects you can grab, throw, stack, and knock around. Click any object to read the story behind it.
Live: https://hematteo.github.io
Websites aren't supposed to have weight. This one does. Instead of a scrolling list of bullet points, ten accomplishments are real rigid bodies in a tray with real physics β pick them up, throw them at the walls, tip the coffee mug and watch it spill. Read all ten and the drawer tells you you're done.
Each object maps to something real:
| Object | Stands for |
|---|---|
| πΆ Punt | MPhil, University of Cambridge |
| Learning to Read Out (paper) | |
| πΊ Glass prism | Sparse Readout Prism (paper) |
| πΉοΈ Joystick | Low-bit RL policies (paper) |
| β Coffee mug | Solo-built LLM platform, ~3K MAU (it spills) |
| β¨οΈ Keyboard | Amazon Alexa-AI internship |
| π₯οΈ GPU | vigil-gpu, open-source training monitor |
| π¬ Dolphin | Dolphin-acoustics ML (F1 0.48 β 0.86) |
| π Trophy | Hackathon wins |
| π₯ Medal | Top Student Medal, GRE 340/340 |
- three.js β WebGL rendering, all objects modelled in code (no asset files)
- cannon-es β rigid-body physics
- Vite β build and dev server
- Web Audio API β every clonk, chirp, and fanfare is synthesised at runtime; no audio files
- No external requests at runtime β fonts are system stacks, textures are drawn on
<canvas>
- Grab / throw / stack physics with material-accurate collision sounds
- Coffee that spills and stains the mat when the mug tips
- Idle life: the paper airplane glides, the dolphin flops, the prism casts a rainbow
- Completion funnel: read all ten β confetti + a call to action
- Mobile: tilt-to-slide gravity (device orientation) and bottom-sheet cards
- Keyboard navigable, screen-reader announcements, respects
prefers-reduced-motion - Light/dark themes; renderer sleeps when the scene is at rest to save battery
npm install
npm run dev # local dev server
npm run build # production build to dist/
npm run preview # serve the built site
npm test # full 17-check Playwright interaction suite
npm run smoke # fast headless smoke test (used in CI)Requires Node 18+. The full suite (npm test) uses your installed Chrome; CI uses Playwright's bundled Chromium.
Pushing to main builds and deploys to GitHub Pages via .github/workflows/deploy.yml. .github/workflows/ci.yml runs the smoke test on every push and PR.
MIT Β© Matteo He
