I didn’t plan to rebuild my website. It started with a screenshot and an offhand comment to Claude Code: something feels off about anchor.host.
That was March 21st. By the end of the week, I had a completely new custom WordPress theme, a custom block plugin powering new components, and a cleaner site than I’ve had in years. I never once looked at the theme’s code.
The marketing site didn’t match the product.
Anchor Hosting runs on CaptainCore. It’s a fleet management tool I built for managing WordPress sites at scale. SSH terminal, 240+ REST API endpoints, security scanning, drift detection, automated deployments. Serious developer infrastructure.
But the marketing site didn’t reflect that. I was running a Blocksy child theme with a generic managed-hosting layout. Feature cards, gradient sections, and stock photography energy. The kind of site that could belong to any WordPress host. The marketing site and the actual product spoke completely different design languages.
I asked Claude Code to do some research. Look at the current theme, the plugin stack, and the page content. Figure out whether I should iterate on what I had or start over.
35 plugins. Some of them were remnants from years of experimentation. Blocksy Companion, CoBlocks, Genesis Blocks, Code Syntax Block. Layers of third-party code that I’d accumulated without ever stepping back to ask what I actually needed.
The answer was: start over.
I never read a single line of theme code.
Here’s the part that still surprises me. I built an entire WordPress theme from scratch without reading a single line of theme code. Not the old Blocksy child theme. Not a starter theme. Not a tutorial.
I described what I wanted. Claude Code built it.
The first session produced the full theme architecture in one pass. A front-page.php with a dark hero section. A page-plans.php with pricing cards and a billing toggle. Blog templates. Contact page. Header with sticky nav. Footer. A complete CSS design system using custom properties. All vanilla. No build tools. No webpack. No Vite. Just CSS files and plain JavaScript.
The design system bridges the visual language between the marketing site and the CaptainCore dashboard. Same color palette. Inter for body text, JetBrains Mono for code. The kind of typography that signals “this is a developer product” without shouting it.
Screenshot in, adjustment out.
The first pass was a starting point. The real work happened in the next session, which ran from evening into early morning. I’d take a screenshot, paste it into Claude Code, and say what I wanted different.
Make the SVG pattern bigger. Increase the feature card icons. Swap the header to use the WordPress custom logo. Move the “Popular” badge from Business to Standard on the pricing page. Make the code blocks darker. Try a lighter cyan.
Each change was a short prompt. Screenshot in, adjustment out. The feedback loop was measured in seconds, not hours. I could see the result immediately in my browser and respond with the next tweak.
That session produced the security page, the hosting plan calculator, a command palette search (Cmd+K), a featured image lightbox, blog templates with hero headers, and the footer hover card that reveals business info. All in one sitting.
A clean theme gave me a clean slate.
This is where the project shifted from “rebuild the theme” to “rethink the whole content workflow.”
I had been writing blog posts with generated HTML and wrestling it into the existing site. Code blocks needed a separate plugin. Conversation snippets were manually formatted. Timelines were hand-coded HTML. Every post required fighting with the tooling instead of focusing on the content.
With a clean theme, I had a clean slate. Instead of generating HTML and converting it to fit my site, I could build the components I actually wanted directly into the block editor.
That’s how Anchor Blocks was born.
Every block exists because a post needed it.
I started with the blocks I needed for my first post: conversation messages, timelines, and callouts. The pattern was simple. Describe the component. Claude Code builds the block registration, the editor UI, the frontend rendering, and the CSS. Test it in the editor. Adjust.
The conversation block shows Claude Code session exchanges with labeled messages. The timeline block renders events chronologically with color-coded dots. The callout block handles alerts and quotes with configurable colors.
Then the next blog post needed stats dashboards and bar charts. So those became blocks too. Then, report cards for summarizing work. Each post pushed the plugin forward.
Today, the Anchor Blocks plugin has 10 block types. Every one of them was built because a specific blog post needed it. No speculative features. No “might need this someday” blocks. Both projects are open source: github.com/anchorhost/anchor for the theme and github.com/anchorhost/anchor-blocks for the block plugin.
Custom blocks have to survive email clients, too.
One consideration with custom blocks that I didn’t expect: email. CaptainCore sends process logs and reports that include block content. Custom blocks need to render properly in email clients, which means inline styles instead of CSS classes.
Every Anchor Block has an email rendering path. The conversation block uses inline table-like layouts. The timeline uses inline borders and padding. The callout uses inline background colors. It’s not glamorous work, but it means the same blocks that power my blog posts also power my operational email reports.
35 plugins became a handful.
Building everything custom made the cleanup obvious. If I built it into the theme or the block plugin, the old plugin could go.
CoBlocks was the first to go. I was using it for a few layout blocks that the new theme handles natively. Genesis Blocks was next. Same story. Code Syntax Block was replaced by Prism.js bundled directly into the theme with Catppuccin Mocha colors and conditional loading. Blocksy and its companion plugin were deactivated. The entire old theme stack, gone.
I also went through Code Snippets and deactivated a bunch of old snippets that were patching around limitations in the previous theme. Header injection scripts, footer overrides, CSS hacks. None of it was needed anymore.
Fewer plugins means fewer updates, fewer compatibility issues, fewer potential security surfaces, and a faster site.
Security deserved its own page.
One thing that came out of this rebuild was a dedicated security page. I’ve been doing a lot of security work recently. Supply chain attack detection. Nulled plugin audits. Fleet-wide malware scanning. It deserved its own page rather than being buried in a blog post.
The page is a custom template with dashboard cards, numbered sections, severity badges, and a schedule grid. All were built in the same session as the visual overhaul. It ties the security blog posts together and gives prospective customers a clear picture of what security actually looks like at Anchor Hosting.
Stop maintaining what you have. Build what you need.
Building from custom is always an opportunity for a reset. Not just visually, but architecturally. Every plugin you replace with purpose-built code is a dependency you no longer carry. Every component you build into the block editor is content you can author directly instead of fighting with generated HTML.
I didn’t set out to rebuild my website. I made an offhand comment about something feeling off, and Claude Code diagnosed the real problem: the site didn’t match the product. From there, building the solution was easier than patching the old one.
The entire rebuild happened across six Claude Code sessions over eight days. I described what I wanted. I pasted screenshots of what I saw. I pointed at things and said, “not that, try this.” The AI wrote every line of PHP, CSS, and JavaScript. I never opened a code editor.
The result is a site with 18 template files, one CSS file, a handful of vanilla JS scripts, and 10 custom blocks. No build step. No framework. No theme dependency. Just WordPress, the way it was always meant to work.
Sometimes the best path forward is to stop maintaining what you have and build exactly what you need.