Vibe Coding

The art of AI-first software development. Build faster, ship more, iterate relentlessly.

what-is-vibe-coding.md

What is Vibe Coding?

Vibe coding is a development methodology where you describe what you want in natural language and let AI write the code. Rather than writing detailed specifications, you have a conversation. Rather than debugging line by line, you explain the problem and let the AI fix it.

The term was coined by Andrej Karpathy, but the practice has exploded since tools like Claude Code made it practical for real-world development. I've built over 100 projects this way, from VST plugins to healthcare software to Roblox games.

The Core Principle:

Don't fight the AI. Give it context, let it plan, verify it worked, iterate. Working code is the specification.

origin-story.md

The Origin: Andrej Karpathy

Andrej Karpathy coined the term "vibe coding" in February 2025. This isn't some random influencer - Karpathy is a legendary AI researcher: former Director of AI at Tesla, founding member of OpenAI, Stanford PhD. When he names something, the industry listens.

Karpathy's definition:

"There's a new kind of coding I call 'vibe coding', where you fully give in to the vibes, embrace exponentials, and forget that the code even exists... I just see stuff, say stuff, run stuff, and copy paste stuff, and it mostly works."

Karpathy described what many of us were already doing - letting AI handle the implementation while we focus on direction and verification. He legitimized a methodology that felt almost too easy to be real engineering.

From Theory to Production:

Brian Edwards has taken Karpathy's concept and pushed it to the extreme - building 100+ production projects with vibe coding. From VST audio plugins to healthcare platforms, from Roblox games to this very website. Not toy demos. Real software, shipping to real users.

The methodology works. The results speak for themselves. And now you can learn it too.

claude-code-tips.sh

Claude Code CLI Tips

$ /init

Scans your codebase and generates a CLAUDE.md file with project context. Always start here.

$ /clear

Clear context between tasks. Prevents token waste and confusion. Use frequently.

$ Press # to add instructions

Add context that persists across the session. Great for project-specific rules.

$ Ctrl+B

Background an agent or shell command. Continue working while it runs.

Pro Tip:

Keep CLAUDE.md under 150 instructions. Too much context wastes tokens and confuses the model. Be concise.

ralph-pattern.md

The RALPH Pattern

RALPH (named after Ralph Wiggum) is a pattern for autonomous development loops. You define a task with clear completion criteria, and Claude iterates until done.

/ralph-loop "Build a REST API for todos.

Requirements: CRUD operations, input validation, tests.

Output <promise>COMPLETE</promise> when done."

--completion-promise "COMPLETE"

--max-iterations 50

The model keeps iterating until it outputs the completion promise or hits max iterations. Great for well-defined tasks with automatic verification (like "all tests pass").

Warning:

RALPH can get expensive. Set max-iterations as a safety net. $50-100+ is possible for large codebases with many iterations.

git-worktrees.sh

Git Worktrees for Parallel Development

Multiple Claude sessions conflict when sharing one git checkout. Git worktrees let you check out multiple branches simultaneously in separate directories.

# Create worktree for a feature

git worktree add ../feature-auth feature-auth

cd ../feature-auth

claude # Start isolated session

Each worktree has its own working directory but shares the same .git database. Perfect for running multiple Claude agents on different features simultaneously.

effective-prompts.md

Effective Prompts

Real prompts I've used that produced great results:

"Create interactive web site hosted on cloudflare pages, with cloudflare workers ai integration. [Detailed requirements follow...]"

This prompt built this entire portfolio site.

"Git submodule all repos since September 2025. Calculate file counts and sizes. Rank by total file size."

Organized 100+ repos automatically.

"Ask me many multiple choice questions to help you understand my taste and help you proceed."

Claude's AskUserQuestion tool handles preferences gathering.

"Create HUMAN-*.md files in root for what you need from me. Report and STOP!"

Structured handoff points for human input.

prompts-that-ship.sh

Prompts That Ship

Real prompts from real sessions. These aren't theoretical - each one shipped working code.

Building This Site

$ claude

> Create interactive web site hosted on cloudflare pages,

with cloudflare workers ai integration.

[Detailed requirements follow...]

Result: Built this entire portfolio site from scratch - Astro, Tailwind, AI chat, deployed to Cloudflare.

Organizing 100+ Repos

$ claude

> Git submodule all repos since September 2025.

Calculate file counts and sizes.

Rank by total file size.

Result: Automated organization of 100+ repositories with metrics dashboard.

Preference Discovery

$ claude

> Ask me many multiple choice questions to help you

understand my taste and help you proceed.

Result: Claude uses its AskUserQuestion tool to gather requirements interactively before building.

Structured Handoffs

$ claude

> Create HUMAN-*.md files in root for what you need from me.

Report and STOP!

Result: Claude creates files like HUMAN-CONTENT-NEEDED.md, HUMAN-CREDENTIALS.md - clean handoff points.

RALPH Autonomous Loop

$ /ralph-loop "Build a REST API for todos.

Requirements: CRUD operations, input validation, tests.

Output <promise>COMPLETE</promise> when done."

--completion-promise "COMPLETE"

--max-iterations 50

Result: Fully autonomous development - Claude iterates until tests pass and code ships.

The Pattern:

Be specific about outcomes. Let Claude handle implementation. Verify it worked. Iterate. These prompts work because they describe what success looks like, not how to get there.

code-showcase.tsx

Code Showcase

See vibe coding in action. These examples show the prompt, the generated code, and the output. Click the copy button to grab any code snippet.

Example 1: React Hook from Natural Language

PROMPT
# User prompt to Claude Code:
Create a React hook that fetches data with loading and error states.
Should support cancellation and automatic retry on failure.
TypeScript, clean code, no external dependencies.
Generated in ~15 seconds
GENERATED CODE
import { useState, useEffect, useCallback } from 'react';

interface UseFetchResult<T> {
  data: T | null;
  loading: boolean;
  error: Error | null;
  refetch: () => void;
}

export function useFetch<T>(
  url: string,
  options?: RequestInit,
  retries = 3
): UseFetchResult<T> {
  const [data, setData] = useState<T | null>(null);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState<Error | null>(null);

  const fetchData = useCallback(async (
    controller: AbortController,
    attempt = 0
  ) => {
    try {
      const response = await fetch(url, {
        ...options,
        signal: controller.signal,
      });
      if (!response.ok) throw new Error(response.statusText);
      const json = await response.json();
      setData(json);
      setError(null);
    } catch (err) {
      if (err instanceof Error && err.name !== 'AbortError') {
        if (attempt < retries) {
          await new Promise(r => setTimeout(r, 1000 * attempt));
          return fetchData(controller, attempt + 1);
        }
        setError(err);
      }
    } finally {
      setLoading(false);
    }
  }, [url, options, retries]);

  // Auto-fetch on mount with cleanup
  useEffect(() => {
    const controller = new AbortController();
    fetchData(controller);
    return () => controller.abort();
  }, [fetchData]);

  return { data, loading, error, refetch: () => fetchData(new AbortController()) };
}

Example 2: Shell Script Automation

PROMPT
# User prompt to Claude Code:
Write a bash script to back up all postgres databases,
compress them, upload to S3, and clean up files older than 7 days.
Include error handling and logging.
Generated in ~20 seconds
GENERATED CODE
#!/bin/bash
set -euo pipefail

# Configuration
BACKUP_DIR="/var/backups/postgres"
S3_BUCKET="s3://my-backups/postgres"
RETENTION_DAYS=7
LOG_FILE="/var/log/pg-backup.log"
DATE=$(date +%Y-%m-%d_%H%M%S)

log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"; }

log "Starting PostgreSQL backup..."
mkdir -p "$BACKUP_DIR"

# Backup all databases
for db in $(psql -U postgres -t -c "SELECT datname FROM pg_database;"); do
  FILENAME="${db}_${DATE}.sql.gz"
  log "Backing up database: $db"

  if pg_dump -U postgres "$db" | gzip > "$BACKUP_DIR/$FILENAME"; then
    log "Successfully backed up $db"

    # Upload to S3
    if aws s3 cp "$BACKUP_DIR/$FILENAME" "$S3_BUCKET/$FILENAME"; then
      log "Uploaded $FILENAME to S3"
    else
      log "ERROR: Failed to upload to S3"
      exit 1
    fi
  else
    log "ERROR: Failed to backup $db"
    exit 1
  fi
done

# Clean up old backups
log "Cleaning up backups older than $RETENTION_DAYS days..."
find "$BACKUP_DIR" -name "*.sql.gz" -mtime +"$RETENTION_DAYS" -delete

log "Backup complete!"

Example 3: Cloudflare Worker API

PROMPT
# User prompt to Claude Code:
Create a Cloudflare Worker endpoint for user registration.
Validate email and password, hash the password, store in D1.
Return proper error responses. TypeScript.
Generated in ~25 seconds
GENERATED CODE
interface Env {
  DB: D1Database;
}

interface RegisterBody {
  email: string;
  password: string;
}

const EMAIL_REGEX = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;

async function hashPassword(password: string): Promise<string> {
  const encoder = new TextEncoder();
  const data = encoder.encode(password);
  const hash = await crypto.subtle.digest('SHA-256', data);
  return Array.from(new Uint8Array(hash))
    .map(b => b.toString(16).padStart(2, '0'))
    .join('');
}

function jsonResponse(data: object, status = 200): Response {
  return new Response(JSON.stringify(data), {
    status,
    headers: { 'Content-Type': 'application/json' },
  });
}

export default {
  async fetch(request: Request, env: Env): Promise<Response> {
    if (request.method !== 'POST') {
      return jsonResponse({ error: 'Method not allowed' }, 405);
    }

    let body: RegisterBody;
    try {
      body = await request.json();
    } catch {
      return jsonResponse({ error: 'Invalid JSON' }, 400);
    }

    // Validate email
    if (!body.email || !EMAIL_REGEX.test(body.email)) {
      return jsonResponse({ error: 'Invalid email' }, 400);
    }

    // Validate password
    if (!body.password || body.password.length < 8) {
      return jsonResponse({
        error: 'Password must be 8+ characters'
      }, 400);
    }

    // Check if user exists
    const existing = await env.DB
      .prepare('SELECT id FROM users WHERE email = ?')
      .bind(body.email.toLowerCase())
      .first();

    if (existing) {
      return jsonResponse({ error: 'Email exists' }, 409);
    }

    // Create user
    const hashed = await hashPassword(body.password);
    const result = await env.DB
      .prepare('INSERT INTO users (email, password) VALUES (?, ?)')
      .bind(body.email.toLowerCase(), hashed)
      .run();

    return jsonResponse({
      success: true,
      userId: result.meta.last_row_id
    }, 201);
  },
};

The Magic of Vibe Coding:

Notice how the prompts describe what, not how. Claude handles boilerplate, error handling, edge cases, and best practices automatically. You focus on intent; Claude handles implementation.

resources.md

Free Resources

metavibe - Free Vibe Coding Books

Free how-to books transforming real coding sessions into step-by-step guides. Topics include Roblox game development, healthcare platforms, RSS readers, and more.

Hex Index - Curated Reading Library

Aggregated long-form journalism and analysis from diverse publications. 148+ pages of indexed content across tech, policy, science, and culture.

Ghost Note - Rust Audio Plugin

VST3/CLAP audio plugin built with Rust. Part of the audio-forge-rs ecosystem for high-performance music production tools.

Conjunction Junction - Educational Game

"And, But, So - what's your function?" Interactive web game teaching kids (ages 7-10) proper conjunction usage with real-time LLM feedback.

Featured:

"Magnitude 9 Earthquake" - 13,700+ words on the AI transformation reshaping software development.

influencers-to-follow.md

Learn From The Best

Stay sharp on AI development by following these YouTube channels and industry voices. They cover everything from deep technical interviews to practical AI news.

Dwarkesh Patel

Deep technical interviews with AI researchers, founders, and thinkers. Long-form conversations that go beyond surface-level takes.

AI Explained

Clear, accessible breakdowns of AI news and research papers. Excellent for staying current on model capabilities and industry developments.

Theories of Everything - Curt Jaimungal

Physics and AI interviews that explore the intersection of intelligence, computation, and reality. Thoughtful long-form discussions with leading researchers.

The MAD Podcast - Matt Turck / Data Driven NYC

Machine Learning, AI, and Data landscape coverage from a VC perspective. Great for understanding where the industry is heading commercially.

Boris Cherny - Head of Claude Code

Leads Claude Code at Anthropic. Follow for insights on AI-assisted development and the future of programming tools straight from the source.

Sholto Douglas - Anthropic Researcher

Anthropic researcher working on frontier AI systems. Technical insights on model training, capabilities, and safety research.

Nate B Jones

Prominent voice in the vibe coding community. Known for documenting AI-assisted development workflows and practical techniques.

Why Follow These Voices?

Vibe coding is moving fast. These creators and researchers are at the frontier, helping you understand not just how to use AI tools, but where they're going next.

video-demos.md

See It In Action

Watch vibe coding workflows in real-time. From idea to deployed application, see how AI-first development actually works in practice.

Coming Soon
Workflow

Building a Full App in One Session

Watch an entire web application come together from a single prompt. Authentication, database, UI - all in one continuous session.

Coming Soon
Speed Run

From Idea to Deployed in 30 Minutes

A real speed run: concept to production deployment on Cloudflare Pages. No editing, no shortcuts - just vibe coding at full speed.

Coming Soon
Tutorial

Live Coding with Claude Code

Deep dive into Claude Code CLI tricks and techniques. Learn /init, /clear, worktrees, and the RALPH pattern in action.

Coming Soon
Debugging

Debugging with AI Assistance

Real debugging session with a gnarly production bug. See how to describe problems and let AI find the fix.

Subscribe for Updates

Video content is in production. Follow along as these demos get recorded and published. Real sessions, real projects, real results.

substack-feed.rss

Latest from Substack

Recent posts from Vibing Code newsletter.

$ Fetching latest posts...

Ready to vibe code?

I can train your team or build your project for you.