How to Actually Use Claude Code to Build Serious Software — The Bootstrapped Founder 435


Dear founder,

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.

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.



Let Claude See Your Application

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 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.

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.

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.”

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.

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.

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.

This might sound surprising. Obviously Ralph Wiggum is a character from The Simpsons. What does that have to do with agentic coding?

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.

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.

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.

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.

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.”

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.

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.

But just as importantly, you want to look into the deny array in your permission settings.

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.

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.

That’s what deny permissions really help with.

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.

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.

Testing Is Where Claude Code Shines

My final tip for using Claude Code effectively: ask it to write tests for every single thing it builds.

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.

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.

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.

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 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.

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.

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.

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.

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.

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.


We're the podcast database with the best and most real-time API out there. Check out podscan.fm — and tell your friends!

Thank you for reading this week’s essay edition of The Bootstrapped Founder. Did you enjoy it? If so, please spread the word and ​share this issue on Twitter.

If you want to reach tens of thousands of creators, makers, and dreamers, you can ​apply to sponsor ​an episode of this newsletter. Or just reply to this email!

To make sure you keep getting your weekly dose of Bootstrapped Founder, please add arvid@thebootstrappedfounder.com to your address book or whitelist us.

Did someone forward you this issue of The Bootstrapped Founder? ​You can subscribe to it here!​

Want to change which emails you get from The Bootstrapped Founder or unsubscribe for good? No worries, just click this link: ​change email preferences​ or ​unsubscribe​​.

Our postal address: 600 1st Ave, Ste 330 PMB 92768, Seattle, WA 98104-2246

Opt-out of preference-based advertising

Arvid Kahl

Being your own boss isn't easy, but it's worth it. Learn how to build a legacy while being kind and authentic. I want to empower as many entrepreneurs as possible to help themselves (and those they choose to serve).

Read more from Arvid Kahl

Podcast, YouTube, Blog Dear founder, A while ago, I asked my Twitter friends to tell me what the most annoying and most infuriating piece of entrepreneurial advice is that they ever received. And overwhelmingly, “follow your passion” stood out as the one that frustrated them most. I’ve seen this particular piece of advice being given a lot by people who have made it—successful entrepreneurs who found success in the field they’re passionate about. And I may have, from time to time, hinted at...

Podcast, YouTube, Blog Dear founder, Let’s add another one to the series of entrepreneurial advice that just really irritates me. Today, I’m going after “improve 1% every day” — you know, that meme or mantra about making tiny little improvements every day because they supposedly compound into something massive over time. This one is infuriating, and I’ll tell you why: it’s almost impossible to measure. I get the sentiment behind it. Make micro improvements every day, and ultimately they’ll...

Podcast, YouTube, Blog Dear founder, Let’s dive into a piece of entrepreneurial advice that’s highly irritating and very dangerous. Today I want to talk about the one that I get so much: “Don’t give up. Don’t ever give up. Force yourself, grind it out.” This advice is very dangerous because it builds on the founder’s capacity to struggle through challenges, but it uses this for the very wrong reasons. THE BOOTSTRAPPED FOUNDER • EPISODE 432 432: Don't Give Up... Your Assumptions 10:32 MORE...