abhinavagarwal.me
·
meta tools ai

How I built this site with Claude Code

A few hours, an agent, and a Vercel deploy. Notes on the collaboration model, the stack, and the parts that genuinely surprised me.

This site you’re reading was built almost entirely by Claude Code, driving from a few paragraphs of taste-direction I gave it. I want to write it up because the experience was different from what I expected, and “different” cuts both ways.

This isn’t a tutorial. It’s a post-mortem in the friendly sense.

The stack

For the record, what’s actually shipping:

  • Astro 6 with content collections for the blog
  • Tailwind v4 for styling, MDX for posts, plus the official sitemap and RSS integrations
  • Geist Sans / Geist Mono for type
  • Vercel for hosting, with Vercel Analytics and Speed Insights
  • Cloudflare for DNS and email routing (me@abhinavagarwal.me)
  • Astro view transitions so navigating between pages cross-fades
  • A small geometric Bauhaus-y hero composition, an animated dot-grid backdrop, a fractal-tree footer ornament, and a few easter eggs that I will let you find on your own

The repo is small. Six pages of static output. No backend.

The collaboration model

The interesting part isn’t the stack. The interesting part is the way you and the agent actually work together.

The mental shift I had to make was treating Claude Code less like a faster keyboard and more like a sharp junior engineer who has read the entire web. The work I was doing was not “writing code.” The work I was doing was describing taste and judging the result.

A few patterns that landed for me.

Describe taste in concrete references. “Make it polished” is useless. “Light paper background, serif headings like Stripe Press, terracotta accent” is workable. “Geist / Vercel aesthetic, slate blue accent, white background” is precisely a theme. The more specific my reference, the closer the first cut.

Pick the smallest decision you can make right now. I tried at one point to ask for “a polished personal site.” Got back something generic. Then I broke it down: theme first, hero second, content structure third, geometric flourishes fourth. Each step was a single decision I could evaluate in 30 seconds. The whole thing came together faster as a series of small choices than as one big ask.

Course-correct fast and out loud. When something didn’t read right, I just said so: “too many fractals, lose the rest, keep the tree at the footer.” The agent didn’t push back, it just did the work. I lost almost no time to half-built features I didn’t want.

Trust the agent on infrastructure, audit it on prose. It got the Astro 6 + Tailwind v4

  • MDX wiring exactly right the first time, including a few non-obvious migration choices I would have had to look up. Then it wrote a blog post for me that had three em dashes in the first paragraph and a sentence that was just slightly too pleased with itself. The infrastructure was correct. The voice required editing.

The good parts

A few moments where I actually paused and noticed it.

The Vercel deploy was a side effect. I never opened the Vercel dashboard. The agent ran git push, Vercel auto-deployed, the agent verified the URL was returning 200, and moved on. Same for analytics, same for the favicon, same for the OG image (rendered by spinning up headless Chrome on a one-off HTML file).

Scheduled publishing for free. I asked for “selective hide” and “drafts” and got a working /drafts page with status chips, plus a GitHub Action that does a daily Vercel rebuild so future-dated posts auto-publish. I didn’t ask for the rebuild piece. The agent flagged that scheduled-publish on a static site needs some trigger, proposed the cleanest option, and shipped it.

The geometric flourishes happened because I asked for “wow factor.” I expected to get nudged toward something safe. Instead I got a slowly-rotating Bauhaus composition with a pulsing triangle, a panning dot grid, and a “Konami code” on the logo bar that cycles the accent color through four palettes. Some I kept, some I cut. The point is the agent went too far on the first cut, which was exactly right. Cutting back is much easier than asking “please add more personality” three times.

The weird parts

Voice drift. The agent’s prose has a recognisable rhythm: declarative, fond of em-dashes, somewhat earnest. I had to explicitly tell it to lay off the em-dashes, and save that preference to global memory so it doesn’t drift back. Even with that, I rewrote half of every blog post the agent drafted for me. Useful as a starting block. Not publishable as-is.

It is happy to ship features I don’t need. Early on it added a “Now” section that I realised, three iterations later, I didn’t want as a strip and didn’t want as cards either. The agent gave me what I asked for each time. The fault was mine for not knowing what I wanted. But this is a thing to watch: a fast agent makes it cheap to ship the wrong thing.

Context boundaries matter. When I asked for a post about something internal at work, it cheerfully name-dropped the internal project in the public copy. I had to walk that back. The agent will not protect you from yourself on questions of disclosure. That’s your job.

What it cost

Time: maybe four hours of my attention, spread across an evening and a morning. Most of that was me looking at screenshots and deciding what I liked, not me waiting on the agent.

Money: free hosting on Vercel’s hobby tier, free DNS and email on Cloudflare, the domain was already mine, Claude Code is included in my existing Anthropic subscription. Total incremental cost was zero.

Would I do it again

Yes, and I will. The next project I want to ship is a small tool that I would have spent an entire weekend bootstrapping a year ago. Now bootstrapping is a non-problem and I get to think about the actual thing.

The bigger shift, for me, is what kind of side projects are now worth starting. Anything that used to lose its first week to scaffolding is now a Saturday afternoon. The bar for “is this idea worth trying” has dropped substantially.

If you’ve been putting off setting up your own little corner of the internet because the yak-shaving was the dealbreaker, that excuse has expired.