Clean Code Is Sexy Again: Making Your Vue Project AI-Ready Vue developer and speaker presented at Vue MAD 2026, arguing that clean code practices that benefit human developers also make Vue projects AI-ready. The talk emphasized that coding agents are not magic but loops of context, tools, and verification, and that investing in context files, feedback loops, and discoverability is key to effective AI-assisted development. This is the written-up version of the talk I gave at Vue MAD 2026 in Madrid: Clean Code Is Sexy Again. Making Your Vue Project AI-Ready . If you would rather watch it, here is the original recording on YouTube https://www.youtube.com/watch?v=9bKMqvFRvvI . Otherwise, read on. Clean Code Is Sexy Again, Vue MAD 2026 TLDR - My main take: what is good for developers is also good for agents . There was never a separate “AI-ready” checklist. There was just good engineering, and now it pays off twice. - “You don’t have to write code anymore” is half true. It only works if you know your stack and your codebase is built for an agent to work in. - An agent is not magic. It is a loop: read context, pick a tool, run it, read the result, repeat. Once you have built one you stop asking “how does the magic work” and start asking “why does the same loop fly in one repo and fall apart in another.” - Three things every Vue project should invest in: context AGENTS.md, skills, hooks, a brain/ , feedback loops types, lint, tests, a real browser , and discoverability vertical feature slices . - When the agent gets something wrong, fix the factory, not the PR. Add the lint rule, update AGENTS.md, tighten the prompt. The PR fix is one bug. The factory fix prevents the next hundred. The line everyone keeps repeating Everyone keeps saying the same thing: you don’t have to write code anymore. I think that’s half true. In some of my repos AI 10x’d me. In others it produced complete garbage. Same person, same agent, same model, different codebases. It only works if two things are true. First, you have real experience with the stack. I would not let an agent write Rust for me, because I have no idea what good Rust looks like and I could not review it. Second, the codebase has to be shaped so an agent can work in it. A greenfield project is easy. A brownfield project with no tests and 10,000-line components is a mess that AI makes worse, not better, until you clean it up. A good frame for “where are we” comes from Dan Shapiro’s post on the levels of AI-assisted development. It reads like driving automation. Level 0 is spicy autocomplete, the first Copilot. Then agents arrive and it gets a lot better. At the top is the software factory where the agent defines, ships, and fixes on its own. I put myself at level three. The agent writes most of the code, and I spend my time reviewing and reading every line. Sometimes I feel like the bottleneck. I would not recommend level four or five for anything serious yet, but the pace is real. Two weeks before the talk, the creator of Bun started using Claude Code to rewrite Bun from Zig to Rust. A million lines, in days, almost entirely by an agent. Triumph or disaster, I don’t know. What I know is this is the world we ship into. What an agent actually is Most Vue devs treat agents as a magic box. Magic is the wrong mental model. The best tip I can give you to get better at AI is to build your own coding agent once. Then it stops being magic, and you get a feel for why it does the right thing sometimes and the wrong thing other times. I wrote up the full build in Building Your Own Coding Agent From Scratch /posts/building-your-own-coding-agent-from-scratch/ Building Your Own Coding Agent from Scratch A practical guide to creating a minimal Claude-powered coding assistant in TypeScript. Start with a basic chat loop and progressively add tools until you have a fully functional coding agent in about 400 lines. , but here is the whole picture in one image. The agent is bounded by three things: its context window, the tools you give it, and its ability to verify what it did. That is it. The analogy that unlocks everything is treating the agent like a new engineer joining your team. You would not throw a new hire into your worst legacy module and expect a feature in a week. Same with an agent. Strip the magic and a tool is just a function . Three fields: a description, a schema for the arguments, and the function that runs. type Tool = { description: string schema: Record