howzysolutions
the_problem
My own portfolio. The first version was a scroll-driven 3D experience that looked finished and said nothing: the engineering worked, the content did not exist. Eight real projects were missing from a site whose entire job was to show them.
what_it_does
- An interactive terminal answering real commands about the author and every project, driven by a pure command engine with no framework import.
- The command engine is renderer-agnostic by construction: a second renderer (an opt-in WebGL/immersive presentation) was built, worked exactly as specified, and was later removed without touching the engine at all. That is proof the separation holds, not just a claim about it.
- All content as typed records, so adding a project is a data-only edit and the list, the project page and the terminal cannot contradict each other.
- English and Brazilian Portuguese at parity, where a missing translation is a compile error rather than a runtime fallback.
- Dark and light themes from a single token set, applied before first paint, with contrast verified by a script rather than asserted.
- Coding activity measured at build time from WakaTime, every figure carrying its own period.
stack
frontend
React 19 · TypeScript · Vite
infra
Cloudflare Workers
other
GitHub Spec Kit · Vitest
measured
- Bundle before the rebrand
- 519.3 KBgzipped entry chunk, measured with npm run build
- Budget
- 120 KBproject constitution, performance budgets
- Functional requirements
- 33specs/001-terminal-portfolio-rebrand/spec.md
how_it_was_built
The rebrand is spec-driven: a ratified project constitution, a specification with thirty-eight functional requirements and fifteen success criteria, a plan whose decisions each record the alternatives rejected, and a task list of a hundred and six items ordered by dependency.
The organising constraint was measured, not assumed. The previous build shipped 519.3 KB of gzipped JavaScript against a 120 KB budget, 4.3× over. Each dependency group was then bundled in isolation to find where the weight was: React and react-dom at 58.7 KB, the WebGL group at 358.1 KB, and an animation library at 44.5 KB used for three fades.
Every technical decision follows from that measurement. The animation library was removed and replaced with CSS and an intersection observer. The WebGL group went behind an opt-in dynamic import. Routing was solved by prerendering one HTML document per project rather than shipping a router at all.
The 3D work from the first version was carried forward once, into an opt-in immersive renderer, then reviewed next to the plain DOM terminal it wrapped, and cut. Both calls are recorded as dated decisions rather than smoothed into a single "always was this way" narrative.
known_limitations
- In progress. This entry describes a rebrand under construction, and it is the least finished project on this site, which is exactly why it says so rather than waiting to be described in the past tense.
- No screenshots exist for any project yet. Every layout is built to read correctly with no image, so they can be added later without a layout change, but the site currently shows no screens.
- An opt-in 3D/WebGL renderer was built and then removed after review. This site does not currently demonstrate that capability as running code, only as this account of building and then cutting it.
tracked coding time
17 hrs 17 mins Source: WakaTime · tracked 2026-03-17 to current