Vibe Coding with Claude (en-US)
What is Vibe Coding?
The term vibe coding was coined by Andrej Karpathy and describes a way of programming where you lean into an AI assistant β describing intent, reviewing output, and iterating β rather than manually typing every line yourself. The name sounds deliberately casual, but the underlying idea is serious: treat the AI as a capable junior (or sometimes senior) colleague that you direct at a high level while staying responsible for correctness and design decisions.
Iβve been a systems programmer for years. My daily tools are Zig, C, and Rust. The idea of delegating coding to an AI felt distant from my world β low-level code demands precision that LLMs have historically struggled with. But over the past few weeks I started using Claude Code (Anthropicβs CLI) as a pair-programmer on my personal blog and tooling, and my opinion shifted.
The Test Drive: My Zine-based Blog
My blog runs on Zine, a static site generator written in Zig. Itβs a niche tool even inside the Zig ecosystem, and its API has been moving fast.
The first real task I gave Claude was: investigate what changed between my pinned Zine commit and v0.11.2, figure out the migration path, and handle it.
A straightforward request for me; a surprisingly involved research task for a tool. Claude had to:
- Read
build.zig.zonto find the current pinned commit hash - Fetch Zineβs changelog, release notes, and source code across multiple files
- Determine that Zine v0.11+ moved site configuration out of
build.zigarguments into a newzine.ziggyfile using a tagged-union Ziggy format - Figure out the exact field names (
layouts_dir_path,content_dir_path, β¦) by reading Zineβssrc/root.zig - Produce the correct
zine.ziggysyntax β Ziggy tagged unions look likeSite { .field = value, β¦ }β without having a direct working example to copy from
It got through all of that in a single session, mostly correctly. The one uncertainty was the Ziggy tagged-union syntax; Claude flagged it explicitly and explained that the build would produce a clear error if the format was wrong. That kind of honest uncertainty is more useful than a confident wrong answer.
The Workflow That Emerged
The session quickly became conversational. Iβd describe a goal, Claude would explore the codebase, fetch relevant docs, and propose a change; Iβd review and either approve or course-correct. A few things I noticed:
It explores faster than I do
Grepping through an unfamiliar dependencyβs source to find a struct definition is tedious. Claude parallelises those searches and synthesises the results. Tracking down where Zineβs new Config union was defined β and understanding that zine.ziggy is parsed at runtime by the Zine binary, not at build time β took Claude a handful of web fetches. It would have taken me a coffee-fuelled half-hour.
Itβs good at boilerplate automation
After the migration work, I asked for a GitHub Actions workflow that:
- Detects the latest Zine release via the GitHub API
- Resolves the release tag to a commit SHA using
git ls-remote(correctly handling both lightweight and annotated tags) - Compares it against the pinned SHA in
build.zig.zon - Runs
zig fetch --saveto compute and write the new hash automatically - Writes
zine.ziggyand simplifiesbuild.zig - Updates the Zig version across CI and
minimum_zig_version - Opens a PR for review
Thatβs a lot of orchestration. Claude wrote it cleanly and in one pass. The subtleties β like using a heredoc-safe approach in GitHub Actions YAML, avoiding Perl-regex grep on non-GNU systems, and setting GITHUB_OUTPUT correctly β were all handled without prompting.
It requires you to stay engaged
Vibe coding is not fire-and-forget. I reviewed every diff. There were moments where Claude suggested a Zig version bump that could have broken the existing build if applied in isolation. The right answer was to update the dependency and the CI version together, which required redirecting the plan.
The AI doesnβt carry product context. It doesnβt know that my blog is low-traffic, that I prefer minimal dependencies, or that Iβd rather get a failing build error than a silent misconfiguration. You have to supply that context through your questions and corrections.
What Surprised Me
The depth of tool use. Claude Code isnβt just text generation β it reads files, runs grep, fetches URLs, executes shell commands, and chains those results together. This makes it qualitatively different from a chat interface.
The self-awareness about uncertainty. When Claude wasnβt sure about the Ziggy tagged-union syntax (because there were no direct examples in the fetched sources), it said so. It proposed a best-guess and explained the recovery path if it was wrong. Thatβs the right engineering attitude.
The writing quality. This post exists partly because Claude drafted it from a description of the session. I edited heavily, but the raw material was there. For technical writing in a second language this is genuinely useful.
What Still Needs a Human
Semantics in low-level code. Zigβs memory model, comptime, and type system require precise reasoning. I wouldnβt trust a fully autonomous vibe-coding session on a safety-critical embedded component. The AI can scaffold and suggest; the engineer must verify.
Architecture decisions. Should zine.ziggy live at the repo root or be gitignored? Should the update workflow commit directly to main or always open a PR? These depend on project philosophy that only I can supply.
Long-horizon context. Each session starts fresh (unless you resume explicitly). The AI doesnβt remember that we debated a different approach last week. Keep your CLAUDE.md up to date β it becomes the project memory.
Practical Tips
- Write a
CLAUDE.mdat the repo root. Document conventions, preferred tools, things to avoid. Claude reads it at the start of every session. - Stay in the loop on diffs. Approve each tool call at the permission boundary; review each file change before committing.
- Use
workflow_dispatchfor automation workflows while youβre still validating them. Donβt let untested automation run on a schedule against your main branch. - Describe intent, not steps. βKeep Zine up to date and open a PRβ produces better results than βwrite a sed command to update the hashβ.
- Ask for uncertainty. If Claude doesnβt flag confidence levels, ask: βWhat part of this are you least sure about?β
Closing Thoughts
Vibe coding with Claude has been a net positive for my personal projects. Itβs not magic β itβs closer to having a very well-read pair-programmer who is fast at research, patient with boilerplate, and honest about the edges of their knowledge. The βvibeβ part is real: working this way feels lighter and more exploratory than sitting alone with a terminal.
For systems programmers worried about correctness: the model isnβt replacing your judgement, itβs amplifying your throughput on the parts that donβt require it.
Codebase, CLAUDE.md, and all the workflows discussed here live at kassane/kassane.github.io.
Comments