CreativelyNanda
This house
The site you are reading. A personal website that refused to be a brochure — and the only build whose bugs you can verify by looking around.
- 324 commits
- 2026-01-14 → 2026-08-08
- TypeScript 89.3%
The brief was a cultural destination rather than a portfolio: the credibility of a professional profile, the commerce of a shop, the storytelling of a craft marketplace, the community of a poetry site, the editorial standard of a magazine. That is an unreasonable list, and it shaped every technical decision after it.
It also produced the structural idea the whole site now runs on — rooms rather than pages. The poetry wing has nine. This wing is the answer to engineering having had one.
4 decisions
What the constraint forced.
Each of these is a choice with a reason attached. The reason is the part worth reading — a stack list tells you what was used, and nothing at all about the judgment that put it there.
- 01
PayFast over Stripe, on market grounds.
Stripe is the global default and the wrong choice here. PayFast is the dominant South African gateway, supports EFT and instant EFT — how people actually pay — and settles in rand without a conversion step. For an audience of South African students and small businesses, Stripe would have added friction and currency confusion to every checkout. The correct gateway is the one your buyers already trust, not the one with the best documentation.
- 02
Framer Motion, chosen for the accessibility escape hatch.
Picked over CSS animation and GSAP because it composes with React's component model, is safe to export from server components, and has first-class reduced-motion support. That last point decided it: the animation system had to be accessible from the beginning rather than retrofitted, and every wrapper on this site takes `respectReducedMotion` and a mobile fallback as ordinary props.
- 03
The grain overlay is fixed, not sticky.
A one-word difference that decides whether the texture repaints on every scroll frame. This is the register the whole front end is built in — the film grain, the parchment, the gold rules are the point of the site, and they have to cost nothing.
- 04
Publish the commit history rather than a claim about it.
The Commit Wall in this wing is measured from the GitHub API at build time and committed as data, so the site never calls GitHub while serving. The number is not typed into a paragraph, which means it cannot quietly go stale — the failure mode of every "over 1,000 commits" line on every portfolio.
The part that survives the build.
Hydration bugs on this site are a class, not a series of incidents.
React error 425 and 422 kept returning with different faces — a date rendered during render, an inline style block, a random value. Treating each as its own bug meant fixing it three times. Treating it as a class produced a rule: nothing that can differ between server and client may be evaluated during render.
A build pipeline that excludes files will eventually exclude a file you need.
Trimming image weight by pattern once broke the visual atlas, because a set of hard-coded public paths had been reorganised into subfolders and nothing connected the two facts. Any rule that removes files from a deploy needs to name what depends on them, in the same place.
The failure mode of a solo build is the branch that never merges.
A finished, reviewed, deployed-to-preview rebuild sat unmerged for days while production served the old design, because the preview looked right and the preview was not the site. Green preview is not shipped. Only main is shipped.
Built with
- Next.js 14 App Router
- TypeScript
- Tailwind CSS
- Framer Motion
- Supabase
- Cloudinary
- PayFast
- Resend
- Vercel
Measured
- commits
- 324
- last commit
- 2026-08-08
- journal sections
- 43
Written from CreativelyNanda build journal — dossier, 67 sections. The dossier is composed from the journal rather than quoted out of it — the raw sections stay behind the review gate described in docs/THE_FORGE.md §4, and every figure above is read from the GitHub API at build time.
