How to Actually Use Claude Code to Build Serious Software
Арвид Каль делится опытом более чем полугода использования Claude Code для разработки SaaS-платформы. Главная идея: основная ценность инструмента — в правильной конфигурации и промптах, а не в самом сгенерированном коде. Автор рекомендует подключать Claude к Chrome через флаг --chrome, чтобы агент мог видеть приложение, кликать и делать скриншоты. Описывает Ralph Wiggum loop — паттерн, при котором stop-hook не даёт агенту выйти, пока цель не достигнута. Подчёркивает важность настройки allow- и deny-списков в settings.local.json (например, блокировки php artisan db:wipe и migrate:fresh в Laravel), написания тестов после реализации фичи и проработки системного промпта (упоминает промпт Augster). Вывод: ценность агентного кодинга — в том, как вы его конфигурируете и ограничиваете.
I’ve been using Claude Code for over half a year now, pretty much exclusively, to build my platform. Haven’t really deviated much to other tools. And I think I’ve gathered enough experience with the system that it’s time to share what I’ve learned about using Claude Code effectively to build a non-trivial Software as a Service application.
Я использую Claude Code уже больше полугода, практически без альтернатив, чтобы строить свою платформу. Особо не отвлекался на другие инструменты. И мне кажется, я накопил достаточно опыта работы с этой системой, чтобы пришло время поделиться тем, что я узнал о том, как эффективно использовать Claude Code для построения нетривиального SaaS-приложения.
Here’s what I’ve found: a lot of the value of Claude Code is in its configuration and correct prompting. When you’re just starting, you think the value is really in the code it generates. But honestly, most of the value of Claude Code is in the code it doesn’t generate—so you don’t have to throw it away. The better you are at setting a really solid system prompt, at executing the agentic loop correctly with the right permissions, the right interceptions, the right restrictions, the better your experience with Claude Code will be.
Вот что я обнаружил: значительная часть ценности Claude Code заключена в его конфигурации и правильном промптинге. Когда вы только начинаете, вам кажется, что ценность — в коде, который он генерирует. Но если честно, большая часть ценности Claude Code — в том коде, который он не генерирует, — чтобы вам не пришлось его выбрасывать. Чем лучше вы умеете задать действительно прочный системный промпт, корректно выстроить агентный цикл с правильными разрешениями, правильными перехватами, правильными ограничениями, тем приятнее будет ваш опыт с Claude Code.
Let Claude See Your Application
Дайте Claude увидеть ваше приложение
First off, any plan of Claude Code will work for whatever you might need. But the moment you start using it more heavily—for feature building, for testing, for background processing—you’ll likely exceed the $20 a month plan. The Max plan tends to be what I’d recommend at this point, because then you can just keep it running. You’ll see why this matters in a second.
Прежде всего, для базовых задач подойдёт любой тариф Claude Code. Но как только вы начинаете использовать его более интенсивно — для построения фич, для тестирования, для фоновых процессов — вы, скорее всего, превысите лимит тарифа за $20 в месяц. Тариф Max — это то, что я бы рекомендовал на данном этапе, потому что тогда можно просто оставлять его работать. Через секунду вы поймёте, почему это важно.
Claude Code released an integration with Chrome a couple months ago. You can start Claude with the --chrome flag so that it connects to your Chrome instance. This creates a bridge to the browser that allows Claude to operate within a browser for you.
Пару месяцев назад Claude Code выпустил интеграцию с Chrome. Можно запустить Claude с флагом --chrome, чтобы он подключился к вашему экземпляру Chrome. Это создаёт мост к браузеру, который позволяет Claude работать внутри браузера за вас.
If you don’t do anything else from the things I tell you today, do this one thing: allow Claude to see your application. To literally be able to click around in it, take screenshots, move things, investigate the DOM and the variables that run within it.
Если вы не сделаете ничего другого из того, о чём я сегодня рассказываю, сделайте хотя бы это: позвольте Claude видеть ваше приложение. Буквально кликать в нём, делать скриншоты, перемещать элементы, исследовать DOM и переменные, которые в нём работают.
It is incredibly smart to connect your Claude instance to a running version of your software. Within the prompt and within the operational loop, it can be tasked with things like: “Look at this page, scroll down a little bit, and see how this one component overlaps with the other.” Or: “Look at this page, inject some data, and see how it shifts the layout in weird and unexpected ways.”
Подключить ваш экземпляр Claude к запущенной версии вашего софта — невероятно умное решение. В рамках промпта и операционного цикла ему можно поручать задачи вроде: «Посмотри на эту страницу, прокрути немного вниз и посмотри, как этот компонент накладывается на другой». Или: «Посмотри на эту страницу, подставь данные и посмотри, как они странным и неожиданным образом смещают разметку».
And Claude will do this. It will recreate the situation, take screenshots, and actually investigate what’s going on by diving into both the visual and the hierarchical structure of the page.
И Claude это сделает. Он воссоздаст ситуацию, сделает скриншоты и реально исследует, что происходит, погружаясь как в визуальную, так и в иерархическую структуру страницы.
I’ve done things over the last couple of weeks like asking Claude to go into the navigation on the left, click on each item, and see if all the first pages look similar—or which one looks slightly different and might need to be changed to create a consistent design language. Claude is incredibly good at this because it can navigate your website easily and build an internal representation of that structure.
За последние пару недель я делал такие вещи, как просьба к Claude зайти в навигацию слева, кликнуть по каждому пункту и посмотреть, выглядят ли все первые страницы одинаково — или какая-то из них слегка отличается и, возможно, её стоит изменить, чтобы создать единый дизайн-язык. Claude невероятно хорош в этом, потому что он легко навигирует по вашему сайту и строит внутреннее представление этой структуры.
It also makes it easy to build features that have visual components. Instead of hoping that it looks right, you can task it to build something, look at it, and then refine it. Really enjoyable.
Это также упрощает построение фич, у которых есть визуальные компоненты. Вместо того чтобы надеяться, что всё выглядит правильно, вы можете поручить ему построить что-то, посмотреть на это, а затем доработать. Действительно приятно.
The Ralph Wiggum Loop
Цикл Ральфа Виггама
One of the biggest inventions in agentic usability is called the Ralph Wiggum plugin, or the Ralph Wiggum loop.
Одно из крупнейших изобретений в области удобства агентных систем — это плагин Ralph Wiggum, или цикл Ralph Wiggum.
This might sound surprising. Obviously Ralph Wiggum is a character from The Simpsons. What does that have to do with agentic coding?
Это может прозвучать неожиданно. Очевидно, Ralph Wiggum — персонаж из «Симпсонов». Какое это имеет отношение к агентному кодингу?
Well, Ralph embodies the philosophy of persistent iteration despite setbacks. You try something, it doesn’t work, you try again, it doesn’t work, you try again—until eventually it does work. That’s the whole idea of this loop approach.
Дело в том, что Ralph воплощает философию упорной итерации вопреки неудачам. Ты пробуешь что-то, не получается, пробуешь снова, не получается, пробуешь снова — пока в конце концов не получится. В этом и состоит вся идея этого петлевого подхода.
It’s not “try it and then stop if it doesn’t work.” Instead, you set a goal, set a completion promise, and only until that promise is fulfilled do you repeat working on it—forever if necessary. If you need three iterations to get there, great. If you need thirty, okay, maybe that’s what it takes. If you need three hundred, maybe it takes that.
Это не «попробуй и остановись, если не получилось». Вместо этого вы задаёте цель, задаёте обещание завершения, и пока это обещание не выполнено, вы продолжаете работать над задачей — хоть вечно, если потребуется. Если нужны три итерации — отлично. Если тридцать — окей, может быть, столько и требуется. Если триста — может быть, понадобится и столько.
It’s a very mindless but very thoughtful approach, because it puts the idea of failing as information at the center of its core. Failure is a good thing because it teaches us another way of how it’s not to be accomplished. Success is when we ultimately reach the state of the promised goal. But every failure state along the way removes one further potential state that we need to check.
Это очень бездумный, но в то же время очень продуманный подход, потому что в его основе лежит идея неудачи как информации. Неудача — это хорошо, потому что она учит нас ещё одному способу того, как делать не нужно. Успех — это когда мы в итоге достигаем состояния обещанной цели. Но каждое промежуточное состояние неудачи убирает ещё одно потенциальное состояние, которое нам нужно проверить.
The way it works: you describe your task, and then Claude works on the task. It tries to exit the task, but there’s a stop hook that blocks the exit. The stop hook feeds the same prompt back, and until the task is completed, that loop just keeps going.
Работает это так: вы описываете задачу, и Claude над ней работает. Он пытается выйти из задачи, но stop-hook блокирует выход. Stop-hook возвращает тот же промпт обратно, и пока задача не выполнена, этот цикл просто продолжается.
This is a different approach than what Claude Code currently does by default. Right now, it tries the thing, and the moment there’s a problem, it exits and asks you to do something. The Ralph Wiggum plugin allows it to keep working and iterating on a solution by trying new things without your intervention.
Это иной подход, чем тот, что Claude Code сейчас использует по умолчанию. Сейчас он пытается что-то сделать, и как только возникает проблема, он выходит и просит вас что-то сделать. Плагин Ralph Wiggum позволяет ему продолжать работать и итерировать над решением, пробуя новые подходы без вашего вмешательства.
I have a strong feeling Claude Code will adopt this methodology eventually into the main loop. But right now, this plugin is how you get that behavior.
У меня сильное ощущение, что Claude Code в итоге внедрит эту методологию в основной цикл. Но прямо сейчас именно этот плагин даёт вам такое поведение.
Permissions: What to Allow, What to Restrict
Разрешения: что разрешать, что ограничивать
Allowing things and restricting things for Claude Code—these are pretty critical. You don’t want to have to be there all the time saying “Yes, you can do this. Yes, you’re allowed to run this command.”
Разрешать и ограничивать что-то для Claude Code — это довольно критично. Вам не хочется постоянно сидеть рядом и говорить: «Да, можешь это сделать. Да, тебе разрешено запустить эту команду».
For commands you know are perfectly fine to run automatically without confirmation, you want to persist them as permissions in the allow array in your settings.local.json. Claude Code will do this for you if you say “Yes, and allow this in the future”—it will automatically add that line.
Команды, про которые вы знаете, что их совершенно нормально запускать автоматически без подтверждения, вы хотите сохранить как разрешения в массиве allow в вашем settings.local.json. Claude Code сделает это за вас, если вы скажете «Да, и разреши это в будущем», — он автоматически добавит соответствующую строку.
You probably want to have a couple of commands in there: the Ralph Wiggum script, particular skills you know you want to use, particular build commands in your framework of choice.
Вы, вероятно, захотите иметь там пару команд: скрипт Ralph Wiggum, конкретные скиллы, которые вы знаете, что хотите использовать, конкретные build-команды в вашем фреймворке.
But just as importantly, you want to look into the deny array in your permission settings.
Но не менее важно заглянуть в массив deny в настройках разрешений.
There might be commands—particularly when it comes to testing and setting up environments—that could be quite dangerous. Most of the time, it’s fine if we wipe the test database, which is just created for the sake of testing. But your local development system might have state in your development database that you want to keep.
Могут быть команды — особенно когда речь о тестировании и настройке окружений — которые могут быть весьма опасны. В большинстве случаев нормально, если мы стираем тестовую базу данных, которая создаётся только ради тестирования. Но в вашей локальной dev-системе могут быть данные в dev-базе, которые вы хотите сохранить.
You want to prevent your framework’s tooling from wiping your database, from re-migrating all the migrations, from seeding it with data that overwrites what you’re currently working with.
Вам нужно предотвратить ситуацию, когда тулинг вашего фреймворка стирает вашу базу, перенакатывает все миграции, засеивает её данными, которые перезаписывают то, над чем вы сейчас работаете.
If you’re using PHP and Laravel like I do, you probably want php artisan db:wipe, migrate:fresh, or the db:* commands in the deny list. The moment it’s in the deny list, Claude will try it, it will fail, and then it will stop and ask you. At that point, you can figure out what the agent is currently trying to do. Is it really trying to delete my database? If so, which one? The test one? That’s fine. My dev one? Probably not. My prod one? Dear God, no.
Если вы используете PHP и Laravel, как я, вы наверняка захотите добавить php artisan db:wipe, migrate:fresh или команды db:* в deny-список. Как только это в deny-списке, Claude попробует, у него не получится, он остановится и спросит вас. В этот момент вы сможете разобраться, что агент сейчас пытается сделать. Он реально пытается удалить мою базу? Если да, то какую? Тестовую? Это нормально. Мою dev? Скорее нет. Мою prod? О боже, нет.
That’s what deny permissions really help with.
Вот в чём реально помогают deny-разрешения.
Here’s something important, though: Claude is very smart. It might see that you’re blocking a command with a rejection, so it tries to create a new bash file that contains the command, then tries to run that bash file. If you’ve allowed running all bash files it wants, it can circumvent your restrictions.
Но вот что важно: Claude очень умён. Он может увидеть, что вы блокируете команду через отказ, и тогда он попытается создать новый bash-файл с этой командой, а потом запустить этот bash-файл. Если вы разрешили запускать любые bash-файлы, какие он захочет, он сможет обойти ваши ограничения.
So you have to be very restrictive, even in what you allow Claude Code to run, because it might find alternative ways around your restrictions. Since we’re talking about a completely agentic system, this vigilance matters.
Поэтому вы должны быть очень строги даже в том, что разрешаете Claude Code запускать, потому что он может найти альтернативные обходы для ваших ограничений. Раз мы говорим о полностью агентной системе, такая бдительность важна.
Testing Is Where Claude Code Shines
Тестирование — там, где Claude Code блистает
My final tip for using Claude Code effectively: ask it to write tests for every single thing it builds.
Мой последний совет по эффективному использованию Claude Code: просите его писать тесты для каждой вещи, которую он строит.
Testing is extremely easy with Claude Code. It knows how to write tests for the language, for the framework that you’re running. It knows how to execute them. It knows how to safely execute them if you define it well.
Тестирование с Claude Code — крайне просто. Он умеет писать тесты под язык, под фреймворк, на котором вы работаете. Он умеет их выполнять. Он умеет выполнять их безопасно, если вы это правильно определите.
If you have a testing environment variable and a testing database that’s isolated from your development and production and staging systems, then you can ask Claude to test for you. If you already have a collection of tests, it will keep them working. And if you’re building a new feature, you should always—in the prompt you’re inputting, or in the system prompt you should have to begin with—ask it to create tests and make sure all tests pass after new features have been built.
Если у вас есть переменная окружения для тестирования и тестовая база, изолированная от dev, prod и staging систем, тогда можно просить Claude тестировать за вас. Если у вас уже есть набор тестов, он будет поддерживать их рабочими. А если вы строите новую фичу, вы должны всегда — в промпте, который вы вводите, или в системном промпте, который у вас должен быть изначально — просить его создавать тесты и убеждаться, что все тесты проходят после того, как новые фичи построены.
One thing I’ve learned: you tend to want to iterate a little before you add tests. Usually, it’s smarter to build the feature first, then build the tests. If you go test-first with an agentic system, iteration becomes problematic. The moment Claude Code starts experimenting and tests start to fail, it becomes this weird interference loop.
Одна вещь, которой я научился: обычно хочется немного поитерировать прежде, чем добавлять тесты. Как правило, разумнее сначала построить фичу, а потом строить тесты. Если идти test-first с агентной системой, итерация становится проблематичной. В тот момент, когда Claude Code начинает экспериментировать, а тесты начинают падать, это превращается в странную интерференционную петлю.
So let it build the feature first, but then make sure—before you commit—for it to build tests around it. That’s what works best in my experience.
Так что дайте ему сначала построить фичу, но потом обязательно — до коммита — попросите построить вокруг неё тесты. По моему опыту, именно это работает лучше всего.
Build a Solid System Prompt
Постройте прочный системный промпт
For the system prompt to be effective, it has to stand on its own. If you look at the tools provided by Augster—that’s A-U-G-S-T-E-R—they have a repository on GitHub that contains the Augster prompt, which I’ve been using for the longest time. It’s a very specific system prompt that encourages Claude Code to run in a loop, kind of like what Ralph Wiggum does, but more specifically as a definition of what good code looks like. It’s more of a description of the output than just the process.
Чтобы системный промпт был эффективным, он должен быть самодостаточен. Если посмотреть на инструменты Augster — это A-U-G-S-T-E-R — у них есть репозиторий на GitHub, содержащий промпт Augster, которым я давно пользуюсь. Это очень специфический системный промпт, который побуждает Claude Code работать в цикле, отчасти как Ralph Wiggum, но более конкретно — как определение того, как выглядит хороший код. Это скорее описание результата, а не процесса.
I still recommend building a solid system prompt for your project. A good system prompt should contain:
Я всё же рекомендую построить прочный системный промпт для вашего проекта. Хороший системный промпт должен содержать:
A description of what the project is and its capabilities. Maybe more importantly, a description of the people who are going to be using it—the ideal user. This allows Claude to build tools and functionality that are aligned with what people might need.
Описание того, что представляет собой проект, и его возможностей. Может быть, что ещё важнее, — описание людей, которые будут им пользоваться, то есть идеального пользователя. Это позволяет Claude строить инструменты и функциональность, которые соответствуют тому, что люди могут потребовать.
It’s very helpful for Claude to know who this is for. Then the automated systems that build features have a better understanding of user capabilities and user expectations.
Для Claude очень полезно знать, для кого это всё. Тогда автоматизированные системы, которые строят фичи, лучше понимают возможности пользователей и их ожидания.
Putting It All Together
Собираем всё вместе
Obviously all of this changes almost on a weekly basis. But right now, with a system prompt that encourages testing, a couple of things you allow to be automated, a couple of things you restrict to not nuke your local system, an operational loop like Ralph Wiggum or the Augster prompt, and browser access using the Chrome flag—you’re probably going to be in the top one or two percent of Claude Code users at this point.
Очевидно, всё это меняется чуть ли не еженедельно. Но прямо сейчас, имея системный промпт, который поощряет тестирование, пару вещей, которые вы разрешаете автоматизировать, пару вещей, которые ограничиваете, чтобы не снести вашу локальную систему, операционный цикл вроде Ralph Wiggum или промпт Augster и доступ к браузеру через флаг Chrome, — вы, вероятно, окажетесь в топ-1–2% пользователей Claude Code на этом этапе.
The real insight here isn’t any single tip. It’s that the value of agentic coding comes from how you configure and constrain it, not from the raw code generation. Set up your environment right, and Claude becomes a genuine collaborator. Leave it unconfigured, and you’ll spend more time cleaning up messes than building features.
Настоящее озарение здесь — не в каком-то одном совете. Оно в том, что ценность агентного кодинга идёт от того, как вы его конфигурируете и ограничиваете, а не от голой генерации кода. Настройте окружение правильно — и Claude становится настоящим коллаборатором. Оставьте его без настройки — и вы потратите больше времени на разгребание беспорядка, чем на построение фич.
I hope this gives you some insight into what you can do to level up your Claude Code workflow. If there’s more to share as the tooling evolves, I’ll keep you updated.
Надеюсь, это даст вам некоторое понимание того, что можно сделать, чтобы прокачать ваш рабочий процесс с Claude Code. Если по мере развития инструментов появится чем поделиться, я буду держать вас в курсе.
Published by
Опубликовано Arvid Kahl
I write about bootstrapping, audience-building, and building in public at The Bootstrapped Founder. Formerly FeedbackPanda (exit/2019) Wrote Zero to Sold, The Embedded Entrepreneur, and made Find your Following. View all posts by Arvid Kahl
Я пишу о бутстреппинге, выстраивании аудитории и публичной разработке в The Bootstrapped Founder. В прошлом — FeedbackPanda (exit/2019). Написал Zero to Sold, The Embedded Entrepreneur и сделал Find your Following. View all posts by Arvid Kahl