I Built My Personal Website Entirely with AI. Here's What Actually Happened.
Dieser Artikel ist auf Englisch.
Everyone talks about AI coding. Most of it is "look, I prompted ChatGPT and it wrote a todo app." This is different. I built a real, production website in a single weekend. Bilingual, AI-powered personalization, protected chat, database tracking, custom domain, SEO optimization. Using Claude Code as my co-pilot.
Here's the honest version. What worked, what didn't, and what I'd do differently next time.
How It Started (Not How I Planned It)
I didn't set out to build a website.
It was a Friday evening. I had just set up KIRA, a personal AI agent system I'd been tinkering with. Six specialized AI agents, each with a role: research, strategy, content, analysis. I was experimenting with how far you can push AI orchestration as a personal tool. Somewhere in that process, I read a Substack article about "the agentic web," the idea that personal AI agents could represent you online, answer questions, handle interactions.
That's when the thought landed: what if my personal website IS an AI agent? Not a static page with a CV. A website where an AI that knows my career can talk to visitors, answer their questions, adapt its content. A website that proves I understand the technology by being the technology.
I told Claude: "I'd like to set up my own website." The AI responded: "Understood. I'll stop asking questions and start building."
Three days later, I had a production website. But the path from idea to launch was anything but smooth.
The Numbers
Let me be transparent about what this actually cost:
- Time: 3 days. Friday evening to Sunday night. Maybe 15 hours of actual work, spread across 4 sessions.
- Tokens: Roughly 15 million tokens across all sessions. That's the equivalent of reading and writing about 50 novels worth of text.
- Cost: Around $60-80 in API usage for Claude Code (Opus model). Less than a freelance developer charges per hour.
- Code: ~7,000 lines across 93 files. 51 commits. Zero lines written by me manually.
- Result: A production website with features that would take a solo developer weeks to build.
15 million tokens for a personal website sounds insane. But AI coding isn't "write code once." It's a conversation. Claude reads a file, suggests a change, I say "that's not right," it reads the file again, tries differently, reads three more files for context, generates new code, I say "closer but the mobile version looks off," it reads the screenshot, adjusts. Every iteration multiplies tokens. The intelligence is cheap. The iteration is expensive.
Three Brains, One Project
I didn't use the same model for everything. The website runs on three different Claude models: Opus (biggest) built the code via Claude Code, Sonnet (mid-tier) powers the chat and page personalization, Haiku (smallest) handles quick one-shot questions. Each task gets the brain it deserves. Using Opus for a follow-up question would be like hiring a senior architect to paint a wall.
The flip side: Claude Code runs on Opus, and with a subscription you hit token limits fast. Multiple times I was mid-flow, fixing a bug, and got cut off. Had to wait, come back, re-explain the context. The AI doesn't lose patience. But momentum is real, and losing it costs more than tokens.
Where It Got Messy
The hamburger menu incident. On mobile, the navigation overlay wasn't covering the full screen. Content was visible behind it. Sounds simple, right? The fix took three attempts. backdrop-blur on the parent nav creates a new containing block in CSS, which breaks fixed positioning on children. The actual fix: make the entire nav element fullscreen when the menu opens. No nested overlay at all. Claude found this after I kept saying "it's still not working." AI doesn't get frustrated. I did.
The chat language problem. The website is bilingual (German/English). The chat was always responding in English, even on the German version. The reason: locale was never being sent from the frontend to the API. It existed in the component, existed in the hook, existed in the API route. Nobody was passing it through. Four files needed one line each. Classic integration bug that has nothing to do with intelligence and everything to do with plumbing.
DNS hell. I bought the domain on Cloudflare. Deployed on Vercel. The root domain resolved fine. The www subdomain? Nothing. For hours. Turns out CNAME propagation is slower than A records, and I spent 20 minutes wondering if I'd misconfigured something when the answer was just "wait." Not every problem has a technical solution. Sometimes the solution is patience.
The admin dashboard, three times. First version: a flat list of database entries. Ugly, hard to read. Second version: better layout, but the onboarding messages showed up as raw API input. VISITOR'S NAME: Theo WHAT THEY TOLD ME ABOUT THEMSELVES: "Tester". That's how they're stored in the database. Third version: grouped by visitor, parsed into readable fields, chat messages with the actual questions highlighted.
I kept looking at it and saying "this isn't right." Claude kept rebuilding it. The AI doesn't have taste. I do. That's the division of labor.
The AI Knows My CV. It Doesn't Know My Story.
I fed Claude detailed markdown files about my career. Timelines, projects, numbers, outcomes. Everything it needed. And it used them. But "using facts" and "telling the right story" are different things.
It would take a real achievement and frame it wrong. Inflate a number. Merge two projects into one. Say I'd been in my current role for two years when it's been less than one. Present something I struggled with as a clean success. The facts were in the files. The interpretation wasn't always what I meant.
I caught most of it. But it made me realize: AI can write your story, but it can't know which version of it is true to you. That takes a human rereading every sentence and asking "is that actually what happened?"
The Profile Picture That Cost 1.4 MB
The profile photo was a 1.4 MB PNG. For a website that's supposed to be fast. Nobody caught it during development because locally everything loads instantly. The SEO audit flagged it. Converted to WebP: 26 KB. Same quality. 98% smaller. The kind of thing that's obvious in retrospect but invisible while you're building.
Lessons Learned: What I'd Do Differently
1. Define the scope before starting. The website grew organically from "let me experiment with AI agents" to "full production website with admin dashboard, security hardening, and SEO optimization." That's exciting in the moment, but it also means I spent time on features I didn't need yet. An admin dashboard on day one? For a website with zero visitors? Next time: ship the core first, add features when there's a reason.
2. Don't let the AI set the pace. Claude will happily keep building forever. Add a feature, refactor something, improve another thing. It doesn't know when to stop. Multiple times I caught myself going down rabbit holes because the AI suggested something and I said "sure, why not." The answer to "why not" is always time. Next time: a written list of what's in scope and what's not, before the first prompt.
3. Review content more carefully, earlier. The AI generated website copy, section titles, descriptions. I reviewed most of it. But some things slipped through that didn't sound like me, or subtly misrepresented my experience. Fixing content after it's woven into multiple components is harder than getting it right in a standalone document first. Next time: write all content in a single markdown file, review it thoroughly, then let the AI build the UI around it.
4. Plan for token limits. I hit the Claude Code subscription limit multiple times, always at the worst moment. Mid-bug-fix, mid-deployment, mid-security-review. The AI loses no context when you pause. You do. Next time: break work into self-contained sessions. Don't start something that needs three hours of continuous work when you might get cut off after one.
5. Test on mobile from the start. Every layout issue I hit was a mobile issue. The hamburger menu, the profile photo centering, text overflow. I was building on a laptop, looking at laptop screens. Next time: check mobile after every visual change, not at the end.
6. Separate the models earlier. Using three different Claude models for different tasks was the right call, but I arrived at it through trial and error. Opus for code, Sonnet for chat, Haiku for quick questions. The cost difference is massive. Next time: decide model allocation upfront as part of the architecture.
7. Don't trust the AI's version of your story. This is the big one. AI is excellent at generating text that sounds right. It's bad at knowing whether the text is true to your experience. Every piece of content about me needed a careful read. Not for grammar or style, but for accuracy. Did I actually do that? Was it really that many? Is that how it happened? Next time: treat AI-generated personal content like a first draft from a ghostwriter who did good research but wasn't in the room.
What AI Is Good At (And What It's Not)
AI is good at:
- Writing boilerplate code fast. API routes, database schemas, metadata. Done in seconds.
- Knowing framework specifics. "How does Next.js 16 handle metadata for client components?" Claude just knows.
- Doing tedious refactors. Changing
x-forwarded-fortox-real-ipacross 7 API routes? One prompt. - Security reviews. The AI found timing-safe comparison issues and IP spoofing vectors I wouldn't have thought of.
- Not getting tired. At hour 6, the AI is as sharp as at hour 1. I'm not.
AI is not good at:
- Knowing when something looks wrong. Every layout issue was me looking at a screenshot and saying "that's off."
- Making content decisions. "Should this be a story or a list?" "Is this too self-congratulatory?" "Does this sound like LinkedIn-speak?" All me.
- Stopping. AI will keep adding features, improving code, refactoring. It doesn't know when to ship. I do.
The Real Lesson
The website is live at adrianfoehl.com. It has AI-powered personalization, a protected chat, bilingual content, database tracking, an admin dashboard, SEO optimization, and security hardening. 15 million tokens. ~7,000 lines of code. 51 commits. One weekend. Zero lines written by hand.
But here's what I actually learned: the technology never fails because of the technology.
The hamburger menu broke because of a CSS containing block rule. The chat spoke the wrong language because of a missing parameter. The DNS didn't work because of propagation timing. The admin dashboard was ugly because nobody asked "what does the user actually need to see?"
Every single problem was a human problem. Understanding what users need. Knowing what to build. Making decisions the AI can't make. Having taste.
AI made me build faster. But the hard part was never the building. It was knowing what to build, when to stop, and whether the result was actually good.
That's what I tell organizations every day: AI is not the hard part. You are.