eamda.dev
This site: a statically exported Next.js front end, a Node API, and a 3D avatar rigged in code.
- Year
- 2026
- Role
- Solo
- Stack
- Next.js · TypeScript · three.js · React Three Fiber · Node.js · AWS
The problem
A portfolio has to load instantly for strangers anywhere in the world, show up properly in search results and link previews, and still be something I can run, explain and extend myself.
What it does
Hosts my projects and background, with a hero avatar of me that turns to follow your cursor.
How it works
- Front end: Next.js with static export. Every page is pre-rendered to plain HTML at build time, so it works with JavaScript off and can be served from a CDN.
- Avatar: an AI-generated 3D bust, optimised from 22.5 MB to 699 KB. It loads only after the page has rendered, behind a still image of the same model, and only on devices with a mouse.
- API: a small Node service for view counts and the contact form (in progress).
Decisions
Rigging the avatar in code. The generated model was a single mesh with no skeleton, so a head can't turn on its own. Rather than rig it by hand in a 3D tool, the site builds two bones when the model loads and weights every vertex by height, with a blended band at the neck so it bends instead of tearing.
Phones get a still image. Without a cursor there's nothing to follow. Phones, tablets and visitors who prefer reduced motion get the poster instead — and never download the 260 KB of 3D code.
Nothing loads from third parties. Fonts are self-hosted at build time, and the model loader's default Google-hosted decoder is switched off. The site makes no requests anywhere but its own domain.