Experiments and internal tools
The Lab
Studio work that isn't a client project: techniques worth keeping, problems worth writing down, and tools built because the alternative was doing something by hand twice. Each tile is the real thing running, not a picture of it.
Before: one set per half, so a gap opens
n8nOpenAISupabasen8nOpenAISupabase
After: four sets, always wider than the screen
n8nOpenAISupabasen8nOpenAISupabasen8nOpenAISupabasen8nOpenAISupabasen8nOpenAISupabasen8nOpenAISupabasen8nOpenAISupabasen8nOpenAISupabase
The marquee that didn't loop
Bug write-upThe logo strip scrolls a duplicated list and translates by exactly -50%, so one loop travels the width of one copy. That copy measured 1,033px while the strip spans the full viewport — so on any wider screen the names ran out before the reset and left a visible gap.
The fix isn't a faster animation, it's more repeats: enough that one loop distance always exceeds the screen. Duration scales with the repeat count so the speed never changes.
// src/lib/services.ts
{
slug: "voice",
n: "02",
name: "Voice AI",
proof: "frontdeskai",
hero: { headline, body, tags },
deliverables: { items: [...] },
faqs: [...],
}
// → /services/voice, its nav entry and metadata
Copy that lives in one file
ArchitectureNo string on this site is written inside a component. Everything resolves to a typed content layer, which means the voice can be audited in one place and a service page is an object rather than a route.
Adding a fifth service means adding data, not building a page. The template, the metadata, the nav entry and the related-service links all follow from it.
$ cat AGENTS.md
# This is NOT the Next.js you know
Read the relevant guide in
node_modules/next/dist/docs/
before writing any code.
$ ls node_modules/next/dist/docs
01-app 02-pages 03-architecture …
Reading the docs that shipped with the framework
PracticeThis site runs on a Next.js version newer than most training data, where conventions have genuinely changed. The project instructs any agent working on it to read the docs bundled inside the installed package before writing a line.
It costs two minutes and it is the difference between code that matches the framework you actually installed and code that matches the one that was current eighteen months ago.
Start a project
Tell me what needs to change
Share your product and the work you need. I'll help you find the right scope and next step.