---
title: "I Spent Months Tuning My AI Config. Last Week I Deleted Most of It."
date: 2026-07-26
description: "Anthropic cut 80% of the Claude Code system prompt. I audited my own setup expecting bloat and found something worse — instructions that contradicted each other, with nothing to tell me."
url: /posts/deleting-my-claude-code-config/
tags: ai-tools, claude-code, developer-workflow
---


I live in an old house. I love it. The history, the details nobody bothers with anymore, the fact that it has a story.

It is also never finished.

One year it's swapping out fixtures that were never designed for LED bulbs. Another it's dragging a 1960s kitchen into this century. This summer it's painting the wood siding. Again.

None of that means the house was built wrong. It means the world around it kept moving. Some of the work is maintenance you do on a schedule. Some of it is tearing out a wall.

My Claude Code config is an old house.

Last October I wrote up [my setup](/posts/claude-code-global-configuration/). A tuned `CLAUDE.md`, standards docs for Python and Swift, a shelf of custom skills. Months of work. I was proud of it.

Then [Thariq from the Claude Code team published an article](https://x.com/trq212/article/2080710971228918066) saying they'd deleted over 80% of the Claude Code system prompt for the Claude 5 models. No measurable loss on their evals.

Eighty percent. So I handed the article to Claude, pointed it at my own config, and asked what we should learn from it. I expected it to come back with some clutter to clear out.

The first thing it flagged was `swift-architect`, the skill that loads whenever I'm making architecture decisions on an iOS project.

It told Claude to use `@StateObject`.

My Swift standards doc bans `@StateObject`. In caps.

## The skill was arguing with the standard

That same file also recommended Combine, which contradicts my `@Observable`-only rule, and targeted iOS 16 when my floor is iOS 18. Three wrong answers in the file that loads exactly when I'm least likely to check.

That's when this stopped being about length.

Then it found the same problem in my code reviewer. The agent I built to catch mistakes had an instruction to verify state management using `@EnvironmentObject` — one of the wrappers I'd banned. The reviewer was set up to approve the exact thing it exists to flag.

From there it kept going. Skills pointing at an MCP server I don't have configured. Install commands using a package manager I abandoned a year ago. Branch naming rules that disagreed across three files, including the one checking the branch I was working on.

None of this threw an error. That's the part that bothers me. Config doesn't crash. It just quietly makes the tool worse, and the tool sounds equally confident either way.

## The library that died eighteen months ago

The worst one was React Native.

I had two skills built around Recoil for state management. 112 references across 11 files. Every recommendation, every decision table, every code sample.

Meta archived Recoil on January 1, 2025.

Eighteen months dead, and my config was still handing it to Claude as the house default. I hadn't touched React Native in long enough not to notice, and nothing in the system was ever going to raise its hand.

## Opinion or instruction

Once I stopped counting lines I needed a rule for what stays. This is the one that worked.

**Opinion** is a choice another competent developer would make differently. My Swift protocol conformance order is `Codable, Sendable, Identifiable, Equatable, Hashable`. That's arbitrary. Nobody would guess it. It has to be written down.

**Instruction** is teaching the model something it already knows. My Swift doc had sixty lines explaining what `@Observable` does and why `@Published` is unnecessary. Claude writes that correctly without being asked. Those sixty lines weren't guidance, they were a tutorial the model had already read.

That file went from 1,026 lines to 138. Python went from 119 to 37. What survived is the stuff you can't derive: my logger's subsystems, my banned property wrappers, my minimum iOS version, my list of tests to delete on sight.

There's a tiebreaker for the middle cases too. If a code sample *is* the convention, keep it. If it just demonstrates one, cut it and write the sentence.

## "So trim it back"

Sure, you're saying. Models got smarter, config gets shorter, we all move on.

That's the read I went in with and it's the wrong lesson. I sorted every problem I found by what actually caused it, and the model was responsible for two of them. The rest came from everything *else* moving.

My own opinions changed and the skills didn't follow. My toolchain moved. An MCP server disappeared. A library got archived. Claude Code itself grew a setting that quietly overrode a rule I'd written in prose months earlier, and my commit history had been ignoring that rule ever since without a word from anyone.

The model getting better is what made the bloat safe to delete. Everything else moving is what made the contradictions dangerous. Those are different problems and only one of them is about token count.

## What I didn't rebuild

My instinct with the dead React Native skills was to fix them. Pick a modern state library, write a proper standards doc, bring it current.

Then I remembered I don't know React Native as well as I know my other frameworks.

A standards doc I wrote today would be me guessing at opinions I don't have, then freezing those guesses in a file that outranks Claude's own knowledge. Which is exactly how the Recoil mess happened in the first place. Somebody confident wrote guidance for a stack they were still learning, and the ecosystem moved while the file sat still.

So I deleted both skills, indexed the React Native docs into my retrieval server, and left the guidance to the model. If I pick that work back up, the standards doc gets written from decisions I've actually lived with.

The final tally was 8,404 lines deleted across 41 files.

This wasn't spring cleaning. Spring cleaning is what I thought I was doing when I opened the file. Half of it turned out to be the kitchen.

## I didn't do any of this by hand

Here's the part I want you to steal, and it isn't a checklist.

People hear "config" and picture a file. Mine is 154 markdown files: 34 skills, most with their own references folder, plus language standards and review agents. Just under 40,000 lines.

That number sounds worse than it is. Only about 7,000 of it is the skill instructions themselves. The rest is reference material that loads only when something needs it, which is the whole point of the design.

It's still 40,000 lines I'm on the hook for, and I was never going to read it on a Saturday. So I didn't. I handed Claude the article and asked it to look at my own config.

That's the whole trick. The model is the thing consuming these instructions. It's the one that has been quietly reconciling my contradictions every single session, deciding which of two conflicting rules I probably meant. It just never had a reason to mention it.

So give it a reason.

My opening prompt was close to this:

> Here's a post about configuring Claude from one of your designers. It shows how CLAUDE.md has evolved. What can we learn from this about our config?
>
> [paste the article]

Then, once it came back with a list:

> Let's start adopting your suggestions one at a time. Ask me, adjust, repeat.

That second message matters more than the first. Left alone it will happily restructure your entire setup in one pass and hand you a diff you can't evaluate. One change at a time, with a decision from me between each one, meant I actually understood every deletion. A few times I overruled it. Once it pushed back on me and was right.

It went and did the mechanical work: grepping every skill for terms my standards docs ban, diffing the MCP servers I have configured against the ones my skills reference, checking whether the libraries in my recommendations are still maintained. Things I could have done manually and never would have.

It also caught its own mistakes mid-flight. It wrote a search that silently returned nothing because ripgrep doesn't follow symlinks and my skills are symlinked into `~/.claude`. Tested it, noticed the empty result was wrong, fixed it. If I'd run that by hand and eyeballed the output, my config would have looked spotless.

Two practical notes. Do it on a branch with one small commit per fix, because you are deleting thousands of lines of your own working notes and you want to walk any of it backward. And ask for the reasoning in the commit message: what contradicted what. Six months from now that history is the only record of why a rule you spent an afternoon writing is gone.

You'll find something. I found six, and I'm the guy who wrote a blog post about how tidy his setup was.

{{< callout >}}
**Related:** This is the sequel to [my Claude Code setup](/posts/claude-code-global-configuration/) — the config I spent months building and just took apart. I also wrote about [giving Claude persistent memory with claude-mem](/posts/claude-code-memory-plugin-claude-mem/), which is the piece that made a lot of this config unnecessary in the first place.
{{< /callout >}}

