{"slug": "we-built-our-entire-website-with-claude-code-lessons-from-the-git-log", "title": "We Built Our Entire Website with Claude Code — Lessons from the Git Log", "summary": "Soamee, a software agency, reported that 331 of its 639 commits on its website repository since January 2025 involved Claude Code, with the tool generating translations, scripts, and repetitive components, while humans handled visual design and architecture. The site, running on Dokku at soamee.com, includes 534 .astro files, 345 blog posts, and 115 case studies across five languages.", "body_md": "There’s something uncomfortable about publishing this post. Soamee is a software agency. Companies hire us to build digital products. And over the past year and a half, we’ve used Claude Code extensively to build our own website. This is what we found when we opened the git log.\n\nThis isn’t a marketing piece about AI. It’s an honest post-mortem: what saved us weeks, what we had to rebuild, and why we keep using the tool despite its limitations.\n\n## The repository numbers\n\nBefore the analysis, the facts:\n\n**639 commits** since January 2025**331 commits** with Claude Code participation (marked with`Co-Authored-By: Claude`\n\n)**534** in the current project`.astro`\n\nfiles**345 blog posts** published or in draft**115 case studies** across multiple languages**5 languages**: Spanish, English, Portuguese, Italian, and German- The site has been running continuously in production on Dokku at soamee.com\n\nThat 52% of commits with AI involvement doesn’t mean Claude Code wrote half the code. It means it was present in more than half of our working sessions — sometimes generating entire files, sometimes suggesting a three-line fix.\n\n## What Claude Code built\n\n### The translation system\n\nThis is the use case where we recovered the most time. The site has five languages. Every blog post, every case study, every service page exists in ES, EN, PT, IT, and DE. Without AI, that would have meant hiring four translators or accepting a significant lag between Spanish content and its translated versions.\n\nClaude Code generated the initial translations. Not perfect ones — Portuguese tends to bleed Spanish when the model loses context, German needs umlaut review, Italian sometimes mixes registers. But a working draft exists in seconds, not days. The commit log tells the story: “Revisión contextual del portugués: bloques en español y acentos ambiguos”, “Corrige contenido en alemán: umlauts, erratas y bloques en español”.\n\nWe review every translation. But reviewing is much faster than creating from scratch.\n\n### The translation verification script\n\nWe have a translation checker that fails CI if any Spanish content is missing its version in the other four languages. Claude Code wrote the first version of `scripts/translation-checker.cjs`\n\n, complete with category aliases, exceptions for ES-only pages, and integration with the `pre-push`\n\nhook.\n\nIt’s a 400-line Node script that does exactly what we specified. Not glamorous. Exactly the kind of task where a human developer takes two hours and Claude Code takes twenty minutes.\n\n### Repetitive components\n\nThe site has service pages, industry pages, solution pages — many pages with similar structure but different content. Claude Code generated most of them following the established pattern. When the pattern’s design changed, we updated them in batch.\n\nIt also wrote the URL normalization middleware (HTTP to HTTPS, trailing slashes, 301 redirects for 404 errors detected in Google Search Console), the sitemap generator, and several CI scripts.\n\n### Blog content\n\nVirtually every post on this blog had some Claude Code involvement. Sometimes it generated the full draft from an outline; sometimes it suggested structure for posts I’d already started; sometimes it just expanded sections that felt thin.\n\nThe voice is always reviewed. The structure is usually suggested. The data is always verified manually.\n\n## What humans had to do\n\n### Visual design\n\nThis is the clearest boundary. Claude Code can implement a design you describe precisely. It cannot invent one. Soamee’s visual identity — deep purple (#1e1548), mint (#5dd3b3), 45-degree diagonal stripe patterns, concentric bubbles — came from human decisions, not AI.\n\nWhen we asked Claude Code to “improve the blog design,” it sometimes produced something that worked technically but didn’t sound like us. We had to learn to be very specific: “add a 3px left border in mint color on blockquotes” works. “Improve the design” doesn’t.\n\n### Architecture decisions\n\nChoosing Astro 5 with hybrid SSR was a human decision. Choosing Tailwind CSS v4 before there was much documentation was a human decision (and an expensive one in debugging time). Choosing Dokku over other deployment options was a human decision.\n\nClaude Code can evaluate options when you present them, but the selection criteria — what matters for our business, our stack, our operational capacity — come from us.\n\n### Reviewing every PR\n\nNo Claude Code-generated change went to production without review. Not because we don’t trust the model, but because human review catches things the model can’t know: whether a paragraph’s tone matches how we talk, whether a new feature makes business sense, whether an internal link points to the right place.\n\nThe git log shows commits like “Fix broken internal links: /contacto and /servicios/consultoria-tecnologica”. Those links were broken by a previous AI-generated change. They were fixed in a subsequent review session.\n\n### Real business logic\n\nThe contact form sends through Mailgun. The rate limiting logic, error handling, required fields — we designed those. Claude Code implemented the code once we had the expected behavior clearly defined.\n\n## The workflow that worked\n\nIt took us a few months to find the workflow that actually functions. What doesn’t work: giving Claude Code an ambiguous task and expecting a perfect result. What does work:\n\n**1. Specification first.** Before opening Claude Code, we write what we want: the exact behavior, the constraints, the edge cases. The more specific the specification, the fewer iterations.\n\n**2. Branches and PRs always.** Every AI-generated change goes on a branch. Never directly to master. This lets you review the full diff before merging and revert easily if something breaks.\n\n**3. CI as a safety net.** The translation checker, the image checker, internal link tests — everything runs in CI. Claude Code sometimes generates content that passes syntactically but fails semantically (a link to a page that doesn’t exist, a referenced image that wasn’t created). CI catches it.\n\n**4. Review in sections.** We don’t review a 50-file PR all at once. We divide it into thematic blocks: first the Spanish content, then one language’s translations, then the others.\n\n**5. A human closes the commit.** Always. The commit message is written by a human, not Claude Code. It’s a small signal but an important one that someone looked.\n\n## What surprised us (good and bad)\n\n### Positive surprises\n\n**CSS debugging is extraordinarily good.** Tailwind CSS v4 was new territory with sparse documentation when we adopted it. Claude Code helped us understand why certain breakpoints weren’t behaving as expected and how v4’s layer system works. Without that help, we’d have taken much longer to stabilize the design system.\n\n**Automation scripts are its sweet spot.** Translation checker, link checker, sitemap generator, SEO snapshot scripts — tools that would have taken days to write get generated in hours and then refined.\n\n**Consistency across similar files is remarkable.** When you have a pattern — a service page, a blog post with FAQ, a case study — the model replicates it faithfully. Humans are inconsistent by nature; the model is not.\n\n### Negative surprises\n\n**Dependency hallucination.** Especially in the early phases with Astro 5 and Tailwind v4, Claude Code sometimes suggested APIs that didn’t exist in those versions. We learned to always verify against official documentation before implementing.\n\n**The long-context problem.** In very long sessions, the model can “forget” constraints established at the start. A real example: we established early on that we wouldn’t use certain deprecated components, and five hours later Claude Code suggested them again. Short, focused sessions work better.\n\n**“Generic” design by default.** Without very specific instructions, Claude Code tends toward solutions that look like any other Tailwind site. Technically correct, visually without personality. Brand identity requires constant supervision.\n\n**Portuguese translations need special review.** The model confuses Spanish and Portuguese more frequently than any other language pair. Probably because of language similarity. PT reviews are systematically longer than DE or IT ones.\n\n## Would we do it again? Yes, with caveats\n\nIf we were starting soamee.com today, we’d use Claude Code from day one. But with these clear guidelines:\n\n**Use it for volume, not decisions.** If you need to create 20 similar pages, Claude Code is unbeatable. If you need to decide whether those pages should exist, that’s on you.\n\n**Review time doesn’t disappear, it changes.** Before the AI workflow, we spent time creating. Now we spend time reviewing. It’s a change in nature, not a proportional reduction. Creating with AI is faster; reviewing requires attention and judgment.\n\n**Don’t drop CI out of trust.** Every time we think “this change is so simple it doesn’t need a full check,” something breaks. CI runs always, without exceptions.\n\n**Brand voice is non-transferable.** Claude Code can imitate styles, but it doesn’t know your company, your clients, your internal values. Texts that matter — value propositions, service descriptions, case studies — always go through human editing.\n\n## Conclusion\n\n639 commits. 331 with AI involvement. 534 Astro files. 5 languages. And a website that runs in production, ranks, and converts.\n\nDid Claude Code build soamee.com? Not exactly. We built it, with Claude Code as the primary tool for volume work. The distinction matters: the tool has no stake in the outcome, doesn’t know the business context, doesn’t make the decisions that define the product.\n\nIf you have a project with lots of repetitive content, translations into multiple languages, or need to move lots of code quickly, Claude Code can significantly change your output capacity. With systematic human review, robust CI, and calibrated expectations about what it can and cannot do.\n\nIf you’re curious about how we make stack decisions — including why we chose [Astro over Next.js](/en/blog/en-nextjs-vs-astro-2026) for this site — we cover that in detail in that post. And if you’re interested in the work we do for clients, you can see our [open-source contributions](/en/open-source) and [how we work](/en/artisan-index).\n\nThe git log doesn’t lie. And ours says this combination works.", "url": "https://wpnews.pro/news/we-built-our-entire-website-with-claude-code-lessons-from-the-git-log", "canonical_source": "https://soamee.com/blog/en-we-built-website-with-claude-code/", "published_at": "2026-08-06 00:00:00+00:00", "updated_at": "2026-08-09 09:39:16.990887+00:00", "lang": "en", "topics": ["developer-tools", "generative-ai", "artificial-intelligence"], "entities": ["Soamee", "Claude Code", "Astro", "Dokku"], "alternates": {"html": "https://wpnews.pro/news/we-built-our-entire-website-with-claude-code-lessons-from-the-git-log", "markdown": "https://wpnews.pro/news/we-built-our-entire-website-with-claude-code-lessons-from-the-git-log.md", "text": "https://wpnews.pro/news/we-built-our-entire-website-with-claude-code-lessons-from-the-git-log.txt", "jsonld": "https://wpnews.pro/news/we-built-our-entire-website-with-claude-code-lessons-from-the-git-log.jsonld"}}