08 — Behind the scenes
How this site was made.
Not a changelog. A map of the decisions that matter - the ones you see and the ones that try to stay invisible.
1// a intro só desenha depois do WebGL aquecer2const cap = setTimeout(unlock, 10_000)3whenGlobeReady(unlock) 5// se o globo travasse no meio do draw, você ia notar6if (ready) setPhase("drawing")
The intro waits for the globe. The draw starts when WebGL says so - or when the ten-second cap fires.
What holds the site up
01
Next.js 16
App Router
02
React 19
RSC
03
TypeScript
strict
04
Tailwind v4
tokens
05
Motion
layoutId
06
Three.js
WebGL
07
next-intl
pt / en
08
@wrksz/themes
no flash
01
Stack
Next.js 16 (App Router), React 19, TypeScript and Tailwind v4. Motion for transitions, Three.js for the globe, next-intl for pt/en. Theming via @wrksz/themes so React 19 doesn't fight an inline script.
02
The intro
The logo draws, flies to the header, then the rest comes in. The 3D globe warms up backstage - if it stalled mid-animation, you'd notice. That's why the wait happens before the draw, not during it.
03
Two languages, one address
Portuguese is the default at /. English lives at /en. Section hashes (#sobre, #projetos) stay stable so shared links don't break. On the first visit, the locale follows the browser.
04
Light and dark
Semantic tokens, no flash. The theme script lands in the HTML before paint; React doesn't need to inject inline JavaScript on the client just for that.
05
The palette
⌘K (or Ctrl K) opens shortcuts: sections, theme, language, email, GitHub. The kind of detail I'd hope to find on someone else's site.
06
Type and color
Geist Sans and Geist Mono. Electric blue in dark mode, a deeper blue in light - the same system, two moods.
The source for this site lives at dollyzn/portfolio onGitHub