[{"data":1,"prerenderedAt":633},["ShallowReactive",2],{"blog-/blog/26-03-11-vibe-coding-my-website":3,"latest-posts":209},{"id":4,"title":5,"author":6,"body":7,"category":195,"date":196,"description":197,"extension":198,"image":199,"meta":200,"navigation":201,"path":202,"seo":203,"stem":204,"tags":205,"__hash__":208},"blog/blog/26-03-11 Vibe-Coding My Website.md","Vibe-coding My Website","Tom Haskell",{"type":8,"value":9,"toc":181},"minimark",[10,14,19,22,25,30,38,41,51,55,66,78,97,101,107,110,117,120,137,141,144,147,150,153,157,160,163,166,170],[11,12,13],"p",{},"I’ll admit it: I’m a bit old-school when it comes to coding. Whilst I’ve dabbled with GitHub Copilot and the Gemini extension for VSCode to speed up the boring bits, I’ve often found their output missed the mark—producing code that made me think, “I see why you did that, but it’s not even slightly what I’m after”. The idea of letting an AI handle the bulk of the work seemed crazy, but with the recent explosion of agentic-AI tools, I figured it was finally time to see if \"vibe-coding\" is actually the future.",[15,16,18],"h2",{"id":17},"where-to-start","Where to Start?",[11,20,21],{},"My first hurdle was simply knowing which tool to use for which task. I ended up using a tag-team approach, starting with the browser version of Gemini for the high-level design, wireframing, and copywriting. It wasn’t perfect by any means, but got me to the point where I figured I was close enough to start building.",[11,23,24],{},"So I then switched over to Google’s Antigravity: an agent-centric IDE built on VSCode.",[26,27,29],"h3",{"id":28},"the-sandbox-devcontainers","The Sandbox: Devcontainers",[11,31,32,33,37],{},"For the environment, I stuck to my usual approach of using ",[34,35,36],"strong",{},"devcontainers",". I like them because they keep my global installs clean and provide a ready-made environment for other devs that join the project. When working with an AI agent it meant I could use the \"always run\" permission (as opposed to confirming every action) so if the agent goes rogue and tries to delete everything, it’s trapped inside a Docker container.",[11,39,40],{},"A couple of things to watch out for though:",[42,43,44,48],"ul",{},[45,46,47],"li",{},"I had to specify a custom Dockerfile rather than a slim pre-built image so that certain tools the agent needs could be installed",[45,49,50],{},"I had to manually map port 3000 to see my Nuxt dev server",[26,52,54],{"id":53},"the-workflow","The Workflow",[11,56,57,58,61,62,65],{},"Once the brand rules were added, the first task I gave it was to scaffold the project (using ",[34,59,60],{},"Nuxt, Nuxt Content,"," and ",[34,63,64],{},"TailwindCSS","). The agent generated an implementation plan before writing the code, which was comforting. The execution wasn't perfect - it errored a few times and needed some manual intervention - but it mostly worked.",[11,67,68,69,73,74,77],{},"Moving the content and design from Gemini online to Antigravity was not a super smooth process. Asking it to generate a prompt did not provide enough information to build what we had talked about, so I had to do quite a lot of work to re-communicate everything. For example, it would provide lots of detail about what ",[70,71,72],"em",{},"font"," the headings should be without ",[70,75,76],{},"what"," the headings should be, or say things like “the methodology panels should have a glow on hover to emphasise they’re important” without mentioning what they are, where they should go, or what content to use.",[79,80,81,91],"blog-callout",{},[82,83,85,86,90],"h4",{"id":84},"pro-tip-the-agent-folder","Pro Tip: The ",[87,88,89],"code",{},".agent"," folder",[11,92,93,94,96],{},"I found that putting the content in a markdown file in the ",[87,95,89],{}," folder was the easiest way, along with any images or styling rules. This allows the agent to pick these up without them being included in the build.",[15,98,100],{"id":99},"working-with-a-junior-developer-ai-edition","Working with a Junior Developer (AI Edition)",[102,103,104],"blockquote",{},[11,105,106],{},"Did you even test this before you sent it to me?!",[11,108,109],{},"It’s been a couple of years since I last managed junior developers, and I’d forgotten how remarkably specific you have to be. Juniors often lack that hard-earned intuition—both for visual design and software architecture—that only comes from years of breaking things in production. Working with an AI agent feels exactly like that: you have a collaborator who is technically competent and arguably better than me at the latest syntax, but they have absolutely no \"gut feeling\".",[11,111,112,113,116],{},"The experience brought back that classic, exasperated question: ",[70,114,115],{},"“Did you even test this before you sent it to me?!”",". AI has that same blind spot. I would ask for a visual change, and the agent would confidently report that it was done, when in reality it was still wrong, or often just differently-wrong.",[11,118,119],{},"The workflow quickly devolved into a constant stream of micro-corrections:",[42,121,122,127,132],{},[45,123,124],{},[34,125,126],{},"\"Add more space here\"",[45,128,129],{},[34,130,131],{},"\"The sizing of this is inconsistent\"",[45,133,134],{},[34,135,136],{},"\"That layout looks odd\"",[15,138,140],{"id":139},"agent-quota-problems","Agent Quota Problems",[11,142,143],{},"Probably the most frustrating thing was hitting the AI quota. There are several models available in Antigravity: Gemini Fast (which I think is the same as the default in the browser), Gemini Pro, and Claude Code (both Opus and Sonnet).",[11,145,146],{},"At the start I hit the quotas almost immediately, so I upgraded from the free tier to the Google AI Pro package. Still, using Claude Sonnet - which is supposed to be the “cheaper” of the two - I could burn through the entire quota in the space of an hour, only to be told I had to wait a week for it to renew! Gemini Pro lasted longer, but it was still a frustrating experience.",[11,148,149],{},"There are of course much higher allowances as you go to the AI Ultra package, but it’s a huge jump in price that I’m just not willing to make at the moment.",[11,151,152],{},"In the human world, a junior developer's mistakes are a training expense. In the agentic world, every time the AI \"misses the mark,\" it burns through my expensive token quota. I found myself paying for the privilege of fixing the AI's mistakes. Eventually, it was just faster (and cheaper) to grab the keyboard and do it myself, utilizing the AI auto-completions as I went.",[15,154,156],{"id":155},"the-verdict","The Verdict",[11,158,159],{},"Ultimately, the AI acted like a fairly average junior developer. It required precise instructions and didn't always write \"idiomatic\" code—I often had to remind it to split logic into proper Vue components rather than leaving everything in one file.",[11,161,162],{},"However, once prompted, it was able to generate robust plans and execute them quickly. I’ll be honest: I’m not sure the AI (or even I) entirely understood where I was going with the site at first, and if I’d had a better idea of what I wanted it may have done a better job.",[11,164,165],{},"If there was a more generous quota limit I may also have gotten further, but in the end I had to do quite a lot of it myself, albeit using a lot of the AI auto-completions as I went. I think that’s still my preferred way to use it. Using the agent just requires too much micro-management for my taste.",[26,167,169],{"id":168},"update-12326","Update 12/3/26",[11,171,172,173,180],{},"I have since discovered (courtesy of ",[174,175,179],"a",{"href":176,"rel":177},"https://www.theregister.com/2026/03/12/users_protest_as_google_antigravity/",[178],"nofollow","The Register",") that I chose the exact wrong time to try Antigravity as they just changed their charging model, so I'm not the only one frustrated by hitting the quota or the lack of clarity in how usage is tracked 😞",{"title":182,"searchDepth":183,"depth":183,"links":184},"",2,[185,190,191,192],{"id":17,"depth":183,"text":18,"children":186},[187,189],{"id":28,"depth":188,"text":29},3,{"id":53,"depth":188,"text":54},{"id":99,"depth":183,"text":100},{"id":139,"depth":183,"text":140},{"id":155,"depth":183,"text":156,"children":193},[194],{"id":168,"depth":188,"text":169},"Opinion","2026-03-11","I finally stopped procrastinating and built my website, giving agentic AI a go in the process.","md","/images/blog/260311-vibe-coding.png",{},true,"/blog/26-03-11-vibe-coding-my-website",{"title":5,"description":197},"blog/26-03-11 Vibe-Coding My Website",[206,207],"AI","Web","LeGeWx9KNSn71QQ2qt0iNMI1tKWRovTQItF9TYN2LZA",[210,277,510],{"id":211,"title":212,"author":213,"body":214,"category":264,"date":265,"description":266,"extension":198,"image":213,"meta":267,"navigation":201,"path":268,"seo":269,"stem":270,"tags":271,"__hash__":276},"blog/blog/26-08-01 TH Creative is Ltd.md","TH Creative is officially a Ltd Company",null,{"type":8,"value":215,"toc":260},[216,219,222,230,234,237,240,243,247,250,257],[11,217,218],{},"I’m incredibly pleased to announce that as of this week, TH Creative is now officially a registered Limited company!",[11,220,221],{},"This is a massive milestone for me. When I first started out, operating as a Sole Trader was the easiest way to get the ball rolling. My focus was purely on doing the work: writing the code, wiring up IoT hardware, and designing user interfaces.",[11,223,224,225,229],{},"But as the scope of my consulting projects has grown, and with the active development of my own in-house software products (like ",[174,226,228],{"href":227},"/blog/26-06-16-app-building-with-agentic-ai","Klovva","), it became clear that I needed to upgrade the underlying \"operating system\" of the business itself.",[26,231,233],{"id":232},"why-the-change","Why the change?",[11,235,236],{},"As an engineer, you can think of your corporate structure a lot like your database architecture: if you get the initial schema wrong, migrations down the line become painful and expensive.",[11,238,239],{},"Moving to a Ltd structure provides the proper legal framework to shield liability, cleanly manage Intellectual Property, and build standalone SaaS products that can eventually scale, spin out, or be acquired. It’s the right vehicle for the next phase of my career.",[11,241,242],{},"Of course, it also means I've had to spend the last few weeks learning an entirely new stack: Companies House filings, corporate bank accounts, and finding a good accountant here in Birmingham. As I've mentioned before, the engineering is often the easy part - it's the business logic of the real world that takes getting used to!",[26,244,246],{"id":245},"what-this-means-for-you","What this means for you",[11,248,249],{},"If you're a current or future client, nothing changes on the day-to-day. You still get me: a multidisciplinary engineer and designer focused on the \"Zero-to-One\" phase of your projects. I'm still here to help deconstruct your complex problems and build the bridge between high-level strategy and low-level code.",[11,251,252,253,256],{},"There will just be a slightly more formal ",[70,254,255],{},"\"TH Creative Ltd\""," at the bottom of the invoices.",[11,258,259],{},"A huge thank you to everyone who has supported, hired, and collaborated with me to help get the business to this point. Here’s to the next chapter!",{"title":182,"searchDepth":183,"depth":183,"links":261},[262,263],{"id":232,"depth":188,"text":233},{"id":245,"depth":188,"text":246},"News","2026-08-01","A quick update on the business side of things: TH Creative has officially levelled up from a Sole Trader to a registered UK Limited company.",{},"/blog/26-08-01-th-creative-is-ltd",{"title":212,"description":266},"blog/26-08-01 TH Creative is Ltd",[272,273,274,275],"Milestone","Business","TH Creative","Building-in-Public","CMLwWJUV2iNepGAJ9dmJP7p9e7I9xDYOuuIVGzXUgjw",{"id":278,"title":279,"author":213,"body":280,"category":195,"date":497,"description":498,"extension":198,"image":499,"meta":500,"navigation":201,"path":501,"seo":502,"stem":503,"tags":504,"__hash__":509},"blog/blog/26-06-16 Building with agentic AI.md","App building with Agentic AI",{"type":8,"value":281,"toc":485},[282,285,291,295,302,309,313,316,320,323,326,330,341,353],[11,283,284],{},"Things have been a little quiet around here lately, but for good reason: I’ve been deep in the lab getting a new product off the ground.",[11,286,287,288,290],{},"Meet ",[34,289,228],{},".",[15,292,294],{"id":293},"what-is-klovva","What is Klovva?",[11,296,297,298,301],{},"Without giving ",[70,299,300],{},"too"," much away before we officially launch, Klovva is a new mobile platform built to help modern parents share the mental load and tame the daily chaos of juggling the kids' schedules.",[11,303,304,305,308],{},"We’re still polishing things up behind closed doors (",[70,306,307],{},"Hint",": It doesn't look like the AI-generated image above!), but it’s been taking up the vast majority of my engineering hours outside of my contracting work.",[15,310,312],{"id":311},"where-ai-was-really-super-helpful","Where AI Was Really Super Helpful",[11,314,315],{},"I know I'm not the first to say this, but AI is at its most useful when it acts as an accelerator for an engineer rather than a total replacement. Building Klovva has proved that point ten times over.",[26,317,319],{"id":318},"_1-product-designer-syntax-writer","1. Product Designer > Syntax Writer",[11,321,322],{},"I didn't actually know Flutter before starting this project. In a traditional workflow, picking up a new cross-platform framework from scratch would have added weeks of googling, refactoring, and syntax bugs before getting a functional prototype running.",[11,324,325],{},"Instead, I acted more like a Product Designer and System Architect. I defined the high-level architecture, user flows, and product logic, while letting agentic AI handle the underlying UI code and widget state management.",[26,327,329],{"id":328},"_2-antigravity-ide-gemini-pro","2. Antigravity IDE + Gemini Pro",[11,331,332,333,336,337,340],{},"I built the bulk of the application inside Google’s ",[34,334,335],{},"Antigravity IDE",", powered by ",[34,338,339],{},"Gemini Pro",". Working with an agentic IDE felt like pairing with a hyper-fast junior developer.",[11,342,343,344,348,349,352],{},"However, despite what I wrote in a ",[174,345,347],{"href":346},"/blog/26-03-18-setting-up-the-safety-net","previous post",", getting the new version (2.1) of Antigravity IDE to play nicely with my usual ",[34,350,351],{},"DevContainers"," setup did not go as smoothly as I would have liked.",[79,354,355,359,389,393,404,408,411,455,459,462,469,473,476],{},[82,356,358],{"id":357},"antigravity-ide-21-devcontainers","Antigravity IDE 2.1 + DevContainers",[42,360,361,379],{},[45,362,363,366,367,370,371,374,375,378],{},[34,364,365],{},"Push Everything into the Dockerfile:"," Don't rely on ",[87,368,369],{},"devcontainer.json"," lifecycle scripts. Antigravity doesn't run post-scripts (like ",[87,372,373],{},"postCreateCommand"," or ",[87,376,377],{},"postStartCommand","), so bake all CLI tools, Flutter SDKs, and system dependencies directly into your Dockerfile.",[45,380,381,384,385,388],{},[34,382,383],{},"The \"Container Started\" Hang:"," If the launch hangs right when you hit the ",[87,386,387],{},"\"Container Started\""," status message, don't wait around. Disconnect from the container and immediately reconnect—it usually picks up the active session instantly.\n::",[26,390,392],{"id":391},"_3-mcp-integration-with-github-issues","3. MCP Integration with GitHub Issues",[11,394,395,396,399,400,403],{},"To keep the AI agent structured, I leveraged the ",[34,397,398],{},"Model Context Protocol (MCP)"," directly integrated with ",[34,401,402],{},"GitHub Projects and Issues",". Instead of pasting long prompts into a chat window, I created structured issues in GitHub. The agent reads the issue context via MCP, generates an implementation plan, executes the changes across the repo, and closes the issue when done.",[15,405,407],{"id":406},"the-tech-stack","The Tech Stack",[11,409,410],{},"I selected a modern, serverless stack for getting the app off the ground quickly:",[42,412,413,419,425,431,437,443,449],{},[45,414,415,418],{},[34,416,417],{},"Front-end:"," Flutter (App), Nuxt + Vue + TailwindCSS (Website)",[45,420,421,424],{},[34,422,423],{},"Back-end:"," Supabase (Postgres DB, Edge Functions, Auth)",[45,426,427,430],{},[34,428,429],{},"Hosting:"," Netlify",[45,432,433,436],{},[34,434,435],{},"Email Integration:"," Resend",[45,438,439,442],{},[34,440,441],{},"AI Integration:"," Gemini, Jina",[45,444,445,448],{},[34,446,447],{},"Analytics:"," PostHog",[45,450,451,454],{},[34,452,453],{},"Project Management:"," GitHub Projects + MCP",[15,456,458],{"id":457},"the-hard-part-from-code-to-market","The Hard Part: From Code to Market",[11,460,461],{},"As engineers, we often fall into the trap of thinking that building the app is the main event. In reality, the engineering is the easy part (for us.)",[11,463,464,465,468],{},"Now, I’m turning my attention to things I don’t fully understand yet: ",[34,466,467],{},"Go-To-Market strategies, business incorporation, and monetization models",". So whilst I have a vision for the app and where I want to take it, figuring out how to launch and scale a product is a whole new challenge - wish me luck!",[26,470,472],{"id":471},"join-the-waitlist","Join the Waitlist",[11,474,475],{},"Back to Klovva - we aren't ready for a full release quite yet, but if you want to be among the first to test it out when we open the doors, go ahead and join the waitlist:",[11,477,478,479],{},"👉 ",[34,480,481],{},[174,482,483],{"href":483,"rel":484},"https://getklovva.com",[178],{"title":182,"searchDepth":183,"depth":183,"links":486},[487,488,493,494],{"id":293,"depth":183,"text":294},{"id":311,"depth":183,"text":312,"children":489},[490,491,492],{"id":318,"depth":188,"text":319},{"id":328,"depth":188,"text":329},{"id":391,"depth":188,"text":392},{"id":406,"depth":183,"text":407},{"id":457,"depth":183,"text":458,"children":495},[496],{"id":471,"depth":188,"text":472},"2026-06-16","A look under the hood at how I’ve been using Flutter, Supabase, and Antigravity IDE to build a brand new product - and the challenges beyond engineering","/images/blog/260616-building-agentic-ai.png",{},"/blog/26-06-16-building-with-agentic-ai",{"title":279,"description":498},"blog/26-06-16 Building with agentic AI",[206,505,506,507,508],"Flutter","Dev Containers","Antigravity","Docker","-srt08Fo2kHFh05xwtgX31FM2vEkzq4H-bXs3PC3UE8",{"id":511,"title":512,"author":6,"body":513,"category":195,"date":624,"description":625,"extension":198,"image":626,"meta":627,"navigation":201,"path":628,"seo":629,"stem":630,"tags":631,"__hash__":632},"blog/blog/26-03-25 Is AI making me obsolete.md","Is AI making me obsolete?",{"type":8,"value":514,"toc":616},[515,522,529,532,536,541,544,557,560,564,567,578,582,589,593,596,599,601,607],[11,516,517,518,521],{},"Many years ago, I did a Masters Degree in Artificial Intelligence. If you’d told me then we’d have LLMs that could write a strategy document or code an app, I’d have been amazed. The problem back then was ",[34,519,520],{},"availability of datasets",". To train an AI you need vast amounts of human-validated content.",[11,523,524,525,528],{},"Take face-recognition for example - that was one of the classic problems back then. There were several algorithms that were very good at finding a face in an image, but answering the question of “who does this face belong to?” was exceptionally difficult - where do you get the data for what someone looks like to associate ",[87,526,527],{},"face = name","? One of the first leaders in this were Facebook. Here was a site where you uploaded a photo, clicked a person’s face and “tagged” the face to a person, essentially making us the trainers for an AI that could then do it for you -suggesting the name immediately. It seemed like magic!",[11,530,531],{},"That’s essentially the same premise as today’s LLMs - they’ve been trained on masses of human-generated content, words, code, art, music, and your personal data to be able to suggest things to you. And that’s the problem: what you get is essentially a suggestion. Those facebook tagging suggestions were not always right - sometimes it thought you were your brother, if you were wearing glasses or a hat or looking off to the side it couldn’t identify you. But that was ok, we knew it was only a suggestion and were happy to correct it.",[15,533,535],{"id":534},"the-hype","The Hype",[102,537,538],{},[11,539,540],{},"AI models are like a good actor: they can say the words convincingly, but don’t actually know what they mean.",[11,542,543],{},"Today, AI is being touted as “the answer” rather than “the suggestion”. We’re told we don’t need copy-writers, junior developers, artists or designers because AI can do it all for us.",[11,545,546,547,550,551,556],{},"But it’s important to remember that these AI models don’t actually “know” anything - they’re just really good ",[34,548,549],{},"predictive text engines",". I heard them described somewhere as being like a good actor- take a TV doctor for example: they might know how to say the medical jargon convincingly, but don’t actually know what the words mean. There are countless examples of people asking an AI model basic reasoning questions and it failing (",[174,552,555],{"href":553,"rel":554},"https://www.youtube.com/shorts/rvlnWMj14vA",[178],"how many R’s are in strawberry?",") because there’s no “brain” to speak of, just a probability that a certain word will follow on from a previous set of words.",[11,558,559],{},"This gap between probability and real understanding is the chasm we now have to cross to reach the “True AI” that I dreamed of back in my uni days - or what we now call AGI (Artificial General Intelligence) - and has been promised by AI researchers repeatedly over the last 60 years as being just around the corner. I think we’re still someway off, if indeed it is possible at all.",[15,561,563],{"id":562},"have-i-been-replaced","Have I been replaced?",[11,565,566],{},"So bringing it back to my situation: do I still have a job in an environment where anyone can code their own app in a weekend?",[11,568,569,570,573,574,577],{},"Having used AI to ",[174,571,572],{"href":202},"vibe-code my website"," I’m not currently too concerned. Can it produce code? Absolutely. It’ll even produce code that will run and perform it’s own tests. But, as I mentioned in that previous post, it’s only as good as your ",[34,575,576],{},"average junior developer."," You need to know exactly what you want, how you want that thing to work and look, and be incredibly precise about communicating it. To be honest, if I wasn’t already a developer I’m not sure how I would know how to explain to it what I wanted. Maybe I care too much about idiomatic code and structure, but even putting that aside there’s a level of intuition and experience that it just can’t replace.",[26,579,581],{"id":580},"the-support-problem","The support problem",[11,583,584,585,588],{},"I’ve read several articles recently that have highlighted the “hidden tax” of vibe-coding: ",[34,586,587],{},"long-term support",". What happens when a critical library is updated, or a big browser change breaks the layout? If you’re relying on AI to fix it for you, you might need to wait until there are enough human-generated tutorials for it to pick up the fix.",[15,590,592],{"id":591},"positive-use-of-ai","Positive use of AI",[11,594,595],{},"So far I’ve been very negative about AI, but it’s definitely not all bad. Going back to my original point about it providing suggestions - it’s exceptionally good at that. I use it all the time for writing documents based on bullet points, or fine tuning blog posts, or as a more natural interface for my “why doesn’t this work?” type questions. But I always read it through and edit it afterwards.",[11,597,598],{},"Using it to speed up my coding is also very helpful - it can perform some of the grunt work in lieu of having my own junior dev. Scaffolding out a Vue app, or writing the boilerplate CRUD methods for data access can certainly be very useful.",[15,600,156],{"id":155},[11,602,603,604,290],{},"AI is undoubtedly useful, but lets keep using is as a suggestion tool rather than a source of expertise. With that view it will make me ",[34,605,606],{},"more productive, rather than redundant",[11,608,609,610],{},"So, if you have a project idea and you have the technical depth to communicate it clearly and support it yourself—crack on! I’d genuinely love to hear how it goes. But if you’re looking for someone to bring that human intuition and experience to the table (while using AI to make it faster and cheaper), ",[174,611,613,290],{"href":612},"/#contact",[34,614,615],{},"get in touch",{"title":182,"searchDepth":183,"depth":183,"links":617},[618,619,622,623],{"id":534,"depth":183,"text":535},{"id":562,"depth":183,"text":563,"children":620},[621],{"id":580,"depth":188,"text":581},{"id":591,"depth":183,"text":592},{"id":155,"depth":183,"text":156},"2026-03-25","There’s been a lot of talk about AI making developers obsolete. Is it all hype, or should I be concerned?","/images/blog/260325-ai-making-obsolete.png",{},"/blog/26-03-25-is-ai-making-me-obsolete",{"title":512,"description":625},"blog/26-03-25 Is AI making me obsolete",[206],"WZz80tcQqFa_b1578cYFlkndGDdYzcK0CXL3IE1DY2Y",1786541726721]