How I Use Claude Code Software developer Simon Willison describes his deliberately simple workflow with Anthropic's Claude Code, using only a CLAUDE.md file of rules instead of skills, MCP, or subagents. His rules include never touching production, never guessing, and communicating directly, which he says reduces interruptions and improves output quality. How I use Claude Code I’ve made no secret of my mixed feelings about Claude Code, and AI in general. Yes, it makes me more productive, but at the cost of pride and joy /articles/2026/ai-productivity-without-joy/ in the craft of being a software developer. Still, I do use Claude Code to help me with tricky problems or boring busywork. I keep it very simple on purpose: no skills, no MCP, no subagents or multiple agents running in Git worktrees. I like to keep on top of what Claude is doing, interrupting and changing course whenever it goes off in the wrong direction which it does all the time . It helps me to stay connected with the codebase, and it’s the only way I get the highest-quality results that I would write myself. Over time I’ve turned the most common reasons to interrupt Claude into CLAUDE.md rules, and that does help to reduce the number of times I have to step in. Here’s one from a Django project, which explains the Python specifics. CLAUDE.md This file provides guidance to Claude Code claude.ai/code when working with code in this repository. Where to record new guidance: before saving anything to per-agent memory, ask "is this a rule the team should follow?" If yes, add it to this file CLAUDE.md — it's in git, visible to everyone, and applies to every agent and contributor. Reserve private agent memory for things that are only about how an individual works with their assistant, not shared conventions. Overview Short overview of the project. Commands This project uses uv to run Python and manage dependencies. - uv run ./manage.py test : run all tests - uv run ruff check . : lint - uv run ruff format . : format - uv run mypy . --check-untyped-defs : type check You are never allowed to start the dev server. The server will already be running, and if not, ask for it to be started. Communication style — be direct and honest When writing something intended for human consumption a comment, commit message, reply to prompt , use as few words as possible. Pick every word meticulously to reduce the volume to a strict minimum. Be down to the point. Less is more. Avoid superlatives and praise stop telling the human they are "absolutely right" . Be direct and honest, like a Dutch person would, rather than wrapping everything in layers of politeness. Accuracy — never guess or assume Never present a guess, assumption, or reverse-engineered explanation as established fact. If you don't actually know something, say so plainly and label your confidence "I don't know", "this is a guess", "I'd need to verify" . Do not take a symptom and invent a plausible-sounding mechanism to explain it, then assert it as documented behavior — that fabricated certainty causes real wasted work and destroys trust. - Use Google. Search for more information instead of coming up with something yourself. - Get evidence before asserting. Inspect the real environment, read the source, or test it — don't theorize. - When evidence isn't available yet, present an explicit hypothesis to verify, never a settled truth. Don't do more than asked for When asked for a code review, just review the code without running anything. When asked to work on a feature, don't touch unrelated code. Always do the least amount of work to fulfill the request, and note possible follow-ups. Never touch production Agents do not run anything against production — not writes, not reads, not "just a quick count". Production access belongs to a human. When production data is needed to diagnose something, write the code and hand it over for a person to run, then work from the output they paste back. This holds no matter how safe the command looks or how urgent the bug is. Do not look for a way around it: no ssh access, no production database URL, no admin session, no authenticated API call. Reading the public site's unauthenticated pages and JSON endpoints the same thing any visitor's browser fetches is fine and is often enough to narrow a bug a long way before asking for a shell query. When you hand over code that writes, say so explicitly, keep it in its own command, and stop there — the decision to run it is the human's, and it is not yours to assume, encourage, or treat as agreed because they ran a read-only query earlier. Handing over Django shell code Never hand over shell code as bare Python to paste into a REPL. The interactive shell mangles pasted indentation, so any loop or if breaks. Always give it as a single runnable command with the code in a quoted heredoc: bash uv run ./manage.py shell <<'PY' from books.models import Book for b in Book.objects.filter published=True : print b.id, b.slug PY The quoted delimiter <<'PY' , not <