Vibe Coding like it's 2025

June 4, 2025

It’s 2025 and the world is heading up the lift hill on the great AI hype rollercoaster. No one is safe. There is no job that can’t be done better by a large language model. If you’re reading this post in say 2030 or beyond, it’s doubtless going to have aged like milk. Either the hype has calmed and you’re happily using AI for boring, useful stuff or you are in fact an AI agent yourself and the humans are locked in cages at the Amazon distribution centre.

Right now, I am both cynical and optimistic at the same time. LLMs are useful enough for answering questions, drawing pictures and reinforcing your biases with answers designed to sound more correct than they are. No doubt great things lie ahead, but only time will tell if the workflow of your average developer is really set to change.

I like to stay informed so I’ve been using AI in different ways to help me write code, using my Unity game hobby project as a test platform.

I think I’ve got my workflow locked in!


Prompting is easier than starting from scratch

So to give some context, I’m tweaking the user interface in the game, using the Unity UI toolkit. For the tech savvy, UI Toolkit is a web/CSS inspired, highly customisable UI framework which mixes XML layout files with CSS inspired style sheets (very similar to WPF for those who remember). It’s cool because it allows you to create a completely unique style for your interface without changing the behaviour. It’s not cool because it’s very new, not very well documented and constantly changing. The developer experience for a newbie like me is… frustrating and docs you find online are very often out of date.

I’m in the process of creating a new set of styles to make the UI look nicer. It means writing USS code for all the obvious controls: sliders, buttons, progress bars etc etc.


The game isn’t important to this story - what matters is that I need to create a new, empty stylesheet doc in the editor and then… stare at it blankly, unsure where to start. But I’ll tell you who isn’t ever unsure where to start: chatGPT! It doesn’t matter how little it knows about a subject, chatGPT will always throw itself into a problem like an enthusiastic teenager, utterly unaware of it’s own shortcomings. It’s like an automated personification of the Dunning Kruger effect.

So I open up a window and tell it what I’m doing… “I want to create a USS style for a list box with a 1px white border… blah blah”. It does some web searches, thinks for a while then spams out code and explanations with abandon - quicker than copy-pasting from Stack Overflow. Boom! The file is no longer empty!

Removing the cruft, fixing the errors

These LLMs don’t really understand coding or the end product you’re trying to create. They don’t have eyes, have never grasped a mouse or used a user interface. Their knowledge comes from trawling the web - the sum total of all the words ever written about Unity stylesheets.

Conversely, as a human and especially as a human designing a front end, your workflow is almost certainly different - you add a feature, run it, have a look, move the mouse, drag the slider. You experience the change you made and then decide whether to keep it or not before moving to the next change.

As a result of it’s origins as a distillation of “all code on the internet” the generated code tends to be full of extra cruft and obvious mistakes…

/* Vertical Scroller (Scrollbar) Styling for UI Toolkit */

/* 1) Make the vertical scroller’s background (“track”) invisible */
.unity-scroller--vertical {
    background-color: transparent; /* Hide the track behind the slider  */
}

/* 2) Hide the “low” (up-arrow) and “high” (down-arrow) buttons */
.unity-scroller__low-button,
.unity-scroller__high-button {
    display: none; /* Remove arrows entirely  */
}

/* 3) Style the dragger (“slider”) itself: black fill with 1px white border */
.unity-scroller__slider {
    background-color: #000000;  /* Black thumb */
    border-color: #FFFFFF;      /* 1px white outline */
    border-width: 1px;
    border-radius: 0;     /* (optional) square corners */
    margin: 0;           /* Ensure no extra padding/margin alters size */
    padding: 0;
}

Here are some of the issues in the code above:

  • Comments like “Remove arrows entirely” next to display: none are kinda pointless - the code says what it’s doing already
  • Likewise the numbered comments feel more like a coding tutorial (or hints to the LLM next time round) and I don’t want them in my codebase
  • .unity-scroller__slider is not the right class for the slider’s dragger - it should be .unity-base-slider__dragger.
  • I didn’t ask for square corners - everything else I’d asked for had rounded corners. Not sure how /* (optional) square corners */ crept in!
  • The slider track is actually .unity-base-slider__tracker not .unity-scroller--vertical
  • And so on…

The LLM will also often add tags that don’t exist, but look like they do the right thing. Sometimes adding CSS tags, because it’s read a lot of CSS on the web, sometimes just making them up.

All in all, the quality of the code on the first pass is pretty bad. It doesn’t work, which is annoying but fixable. More importantly, it’s full of irrelevant extras which, if not removed now, will doubtless cause problems later.


Too lazy to Google

So we enter a cycle of fixing, tweaking and adapting the code to make it do what we want it to do. Back to the very human workflow - tweak, run, test, adapt.

But throughout that, especially as a newbie to UI Toolkit, I constantly run into things I don’t know and questions I need answered. This is where my Vibe Coding Buddy becomes useful for the second time. What do you do when you don’t know the right google search term to even ask your question? You ask chatGPT instead. No more stumbling around finding the right search terms, no more reading a three year old Stack Overflow post that turns out to be irrelevant anyway… chatGPT does that for you.

This bit of the flow works really well - especially because I am deliberately not connecting my LLM to my code file. I’m not using Cursor, CoPilot or any of the integrated environments. I can apply a qualitative filter to the answers I get back and only copy paste the bits of code that make the cut. The code is mine, the AI is an advisor.

When you pair program with another human, you adopt the roles of Driver and a Navigator. One does the typing, one keeps an eye on the big picture. Many people use this pattern with AI too - the LLM becomes the Driver, and the human navigates via prompts. I’ve tried it - it works for simple one-off chunks of code, but I don’t think it’s the right way to work on a complex project. It starts well, but eventually you find yourself locked into a situation where each new change breaks something else. I’m working with chatGPT the way a Surgeon works with their team: I’m in control, when I need something done the AI does it, allowing me to stay focussed on the task in hand, limiting context switching.

So maybe I’m not just too lazy to Google… my AI Buddy is helping me to minimise the cognitive load of searching - I stay in the zone with the problem I am trying to solve, without needing to read through a three page Reddit flame war from 2022 to get to the info I need. I haven’t felt this good since I started using ReSharper for code complete, 15 years ago!


We’re done

You’ll find the final code below. I think it’s quite neat looking and it certainly works. It took less than half an hour to get it done from start to finish - where in the past I’d have been googling for hours before getting frustrated and doing something less annoying. This a hobby project in the end, something I do for fun. Using AI has allowed me to find a workflow that actually makes me more productive and brings the joy back.

I’m not vibe coding. I’m not delegating the process to the AI. I, as the human in the room, am retaining control of what gets done and how. My AI sidekick makes me better at what I’m doing by removing distractions, searching and distilling information. I am applying my experience as a software developer as well as my genuine human understanding of what a user wants to do. I know what good code looks like; my AI assistant knows what all code looks like. I know how a good user interface feels; my buddy helps me stay focussed on that.

AI will not replace human engineers; at the very least someone needs to write the prompt. I’ve found an AI workflow that makes me better and faster as a developer though. I can get more stuff done more quickly.

This doesn’t mean we’ll need fewer developers in future - it means we’re gonna do more stuff. Buckle up.


Appendix: The code that worked in the end

Scroller .unity-base-slider__tracker {
    background-color: transparent;
    border-width: 0;
    margin-top: 0%;
    margin-bottom: 100%;
}

Scroller .unity-base-slider {
    flex-grow: 1;  
    flex-shrink: 1;  
    margin-top: 0;
    margin-bottom: 0;
}

Scroller ScrollerSlider {
    background-color: black;
    border-width: 0px;
    margin-left: 10px;        
    border-radius: 6px;
    padding-top: 3px;
    padding-bottom: 3px;
}

Scroller .unity-scroller__low-button,
Scroller .unity-scroller__high-button {
    display: none;
    height: 0px;
}

Scroller .unity-base-slider__dragger {
    background-color: #202020;
    border-color: var(--color-normal);     
    border-width: 0px;
    border-radius: 4px;          
    padding: 0;
    margin: 0;
}