Skip to content
DA

← All projects

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.