
AI-Lab
A public space for sharing ongoing personal experiments and learnings from using AI

A public space for sharing ongoing personal experiments and learnings from using AI
AI-Lab is the site you're on right now. It's a public space for sharing my ongoing experiments with AI tools, models, and workflows, most of them rough or still in progress. I built it both as a place to be introspective about how I use AI in my personal life, and to show others what I've been playing with.
The spec is the source of truth now, and that's where my judgment has to live — To start, I built a robust PRD in ChatPRD and asked Claude to write SPEC.md and PLAN.md from it. Coding agents then built the initial site nearly autonomously, phase by phase, from those docs. As code is increasingly something an agent produces, my judgment, intent, and product vision all have to migrate up into the planning docs.
Formalizing repetitive steps into a skill improves both quality and speed — Going into my first real project import I knew I'd be doing this a dozen-plus times, so I codified the steps into the /ingest skill: ask probing questions to distill insights, resize images, assemble frontmatter, and validate. The upfront investment means I don't re-litigate the same decisions every time, outputs are more consistent, and I spend less time re-prompting to get back on track.
Skills produce visibly better AI output than bare prompting — For the first iteration of AI-Lab, I let Claude handle the UI without much guidance; the result was functional but ugly. Doing a refresh with the new frontend-design, vercel-react-best-practices, and web-design-guidelines skills resulted in a major upgrade. Claude also brainstormed and coded the bouncing connected-node animation in the header, replacing an off-the-shelf reactbits.dev background with something more on theme.
Screenshot-driven iteration is faster than describing UI in prose — A few months ago I'd describe a layout in words and let Claude guess at CSS. Today I drop in a screenshot or a marked-up image, and Claude Code uses Playwright to take its own screenshots to self-verify the result mid-task. The next step: generate a high-fidelity render with a SOTA image model first, iterate on the still until it's right, then hand the image to Claude Code to implement.
Don't work with AI the way you'd work with humans — Wordsmithing prompts, staging tidy inputs, organizing every handoff are habits left over from "best in class" human work. LLMs are good enough now that rough direction plus relevant context moves things forward fast. The messy version usually outpaces the tidy one, even with cleanup on the back end. I'm learning when to lean into the messiness.
Build for how you actually work, not how you expect to work — I spent real time on Obsidian symlinks and a /curate script that reads a lab file and drafts a public post. In practice, most building happens in other Claude Code projects, Lovable, n8n, etc., so I built /ingest instead. That's the workflow that actually gets used.
AI conventions move fast enough to age a feature within months — A year ago, detailed premade prompts were the move and "you are an XYZ expert with 40 years of experience" was supposed to maximize model intelligence. Then context management took over, models internalized most of the prompting tricks, and the prompt library I'd built felt like a relic. I swapped that section for a list of favorite tools (My Stack) which is easy to update as my opinions change.
The memory layer is doing as much work as the model — A year ago I picked tools by which model was strongest. Now what keeps pulling me back to Claude Code is everything that lets the agent carry context forward across sessions: persistent memory, session recaps, auto-compaction, files it writes for itself to pick up later. The model itself is close to what I get elsewhere; the memory layer is what keeps me coming back.
Bigger isn't always better, for models or for context — During a writing audit, Opus helped produce a great style guide, but when executing it kept losing the thread with partial completions and skipped items. Reasoning seemed to get in the way once the task was clearly defined, and switching to Sonnet (medium effort) fixed it. I saw the same pattern with context: past a certain size, stacked specs, long CLAUDE.md files, and heavy PRDs seem to crowd out focus rather than sharpen it.
Functioning prototypes will replace slides for getting buy-in — Specs still earn their keep for multi-disciplinary alignment and surfacing tech questions early, but providing a working demo now feels like essential communication.
The hardest AI skill is knowing what's not worth building — AI makes it easy to push more ideas faster and further. It's easier than ever to ship shoddy code, ignore UX wisdom, and accept the first generic output. The filter that matters most is whether the thing is worth building at all.
portfolio/projects/. No CMS database, no admin UI; the editor is the CMS.featured: true in frontmatter) and the rest fall into the gridpnpm validate before anything ships.develop, with commits pushed to GitHub via GitHub Desktop and larger chunks merged to main when ready. A push to main triggers an automatic Vercel deploy./ingest skill pulls a project README (from GitHub, a local file, or pasted content) for context, scans the temp folder for {slug}-hero and {slug}-N images, asks probing questions to draft the project page, resizes images via macOS sips to 1600px wide JPEG, archives full-resolution originals to a gitignored backup, updates frontmatter paths, and runs validationCursor (using its Agents with Opus, Sonnet, and Composer for smaller tasks) built the initial site; Claude Code took over for most work after the initial build, especially anything UI-related or skill-driven. Underneath: Next.js 16 with React 19 and Tailwind for the site itself, markdown files validated by Zod and rendered through react-markdown for the content layer, Plausible for cookie-free analytics, and Husky plus GitHub Actions catching validation issues before Vercel auto-deploys on push to main. ChatGPT Images 2.0 generated hero image.