My introduction to a hands-on, AI experience, was provided by Ollama. After the initial excitement of being able to communicate via the keyboard, with what was for all intents, a font of unlimited knowledge, hallucinations excepted, its limitations became apparent. It's purely text-based, able to offer thought-provoking prose on a vast number of subjects, but not much else. True, you can tell the LLM operating behind the scenes to do some coding for you, but you cannot submit your own code, or anything else for that matter. There are add-ons are available, WebUI, being one example - a bad one in this instance, as it relies on Docker, so I never went down that road!
Enter Unsloth Desktop. This looked a far more rewarding LLM front-end, offering microphone input, coding (sand-boxed execution), Thinking, and most important, the ability to upload files! Whereas Ollama is Terminal-based, Unsloth features a sleek GUI interface. Those are the highlights, it's all uphill from here...
...and it's mostly down to my crummy hardware, which took ages to figure out! From the get-go, it crashed constantly. Ask a handful of questions, and by the tenth one, it'd freeze up. I've only just discovered, within the last day or so, the underlying cause - yep, my hardware! But thanks to Unsloth's comprehensive configurability setup, a fix was discovered - change the 'Compute back-end' from Vulkan to CPU, yes, that easy! The downside is that a working LLM consumes significantly more power, from 80W up to 110W. But no more crashes, which is the main consideration!
Enter Vibe-coding. With Unsloth finally running reliably, I figured it was time to check out this vibe-coding lark. I wasn't expecting much to be honest, mainly because of the hardware situation (Intel 13th gen, i7, 16 core), which severely limits what LLM's qualify. I had already tried a 27B parameter Qwen model, Qwen3.8-28B-GGUF, but it had proven unusably slow. I ended up with the sickly runt of the litter, Gemma4-E2B-it-GGUF, chosen by Unsloth as the 'best-hope' choice that my meager hardware could handle.
Which proved a disaster. The token throughput proved pretty decent, about 5-6 per/sec, so usable for the small task I proposed - "vibe-code me a Linux app that could download the icecast stream directory, segregate them into user-selectable, Ogg, mp3 & Aac categories, before finally, playing a random stream from the selected category. Easy-peezy, or so I thought! The light-weight LLM proved hopeless - the number of times it came up with lines like, "this is the final, final version, guaranteed to work", almost had me screaming! It would take one step forward, producing executable code, only to back-pedal and produce an unusable mess at the next attempt. It was also about the time I started looking for pointers from Gemini 3.6 Flash.
The first piece of advice I was given was that if I was looking for an easy vibe-coding starter experience, that starting by basing a media player on the SLD2 media player library, was not the way to go. While it hadn't been my choice, I held my tongue, and told Gemini to carry on and tell me more! And it was all downhill from then on! It also was decided that it was going to be a terminal-based player, so not snazzy, but usable nonetheless. The difference between these two LLM's is like the difference between night & day. Gemma4 for instance, managed (at most) to successfully download the icecast stream directory, but it could go no further, mostly down to SDL2 issues. Give the code produced by Gemma to Gemini, and Gemini could flawlessly edit it for further development. Whereas every time I tried the opposite, Gemma would get hopelessly muddled. Long story short, Gemini had a working player up & running in short order.
Gemini also is a pleasure to instruct, Gemma4 is a nightmare. I kept waiting for Gemini to tell me that if I wanted any more coding done, I'd need to start buying tokens but it hasn't happened (yet), not even a prompt. I had tried the free version of Claude a while back and the "Sign up for tokens to continue" command occurred after just a few questions, never mind coding an app. Another thing that surprised me about Gemini was its self-introspection, its readiness to admit, without prompting, when it had been hallucinating.
So overall, a pleasurable first vibe-coding experience. You would need to be a real vibe-coding aficionado to try coding something complex, on a local setup with a slow computer - which, where LLM's are concerned, applies to about 95% of the hardware out there - the online, Gemini 3.6 Flash, is blazingly fast, and it still took 'us' hours to code this small application. Despite Gemini's coding prowess, while it invariably produces executable code, it often takes it a couple of attempts to get something to work as requested - but these are super-fast revisions, and usually include an explanation on why the prior attempt failed, so insightful into the bargain.
I still think of LLM's as some kind of magic - how 'predicting the next word' algorithms can do stuff like this will always be beyond me. If anyone wants to see my first vibe-coded app in operation, you can download it from here. Hint, preset your terminal's Row/Columns to 80/28, place the icecast_player10 executable in your home directory, and create a launcher script with your text editor, such as;
#!/bin/bash
cd ~/
./icecast_player10
Save to your Desktop/Home directory/wherever, as 'ice_player', then make it executable;
chmod +x ~/icecast_player10
That's it. When ice_player is double-clicked, select the 'Run in terminal' option, and you're ready to be rocked!
Edit:
I've spent the last week (well, it feels like a week, a couple of days in actuality) trying & failing to get to grips with 'Vibe-coding' with small 'Coder' LLMs. After receiving what seemed like glowing endorsements from Gemini, I first tried a 'tiny' 3B parameter Qwen model. This was an absolute disaster. I set it the task of adding a volume control to the existing Icecast code. Not only did it fail to do so, it also failed to produce code that would compile. I then asked it to scan the code it had just coded, for errors - it found loads. Thing is, after giving them the once-over, Gemini concluded that these were all hallucinated, meaningless drivel, and despite his earlier prognostications, this was in fact typical of small Coder-type, low-parameter models! Cowed, but not broken, I then decided that the Qwen2.5-Coder7B model was the way to go - a jump up from the 3B parameter model.
Given how awful the 3B model has been, I wasn't expecting much, and was eventually proven right, but not before being tantalised with the possibility of progress. The 7B model produced code that compiled - a huge advance in my eyes! But it simultaneously broke code that had already worked (no audio) and was powerless to rectify the problem. I eventually turned to DeepSeek on Android to provide a solution. DeepSeek, like Gemini wasn't into 'trash-talking' these smaller, less-capable models either, stating that the bug could be easily missed by a seasoned human programmer, never mind 'another' low-brow LLM model - and again, to its credit, the buggy code compiled without errors. So, while the subtle missing audio bug was resolved (in seconds!) by a much more capable LLM, I was gob-smacked to find on compiling the code, that the actual task set - the ability to alter the volume - didn't work either! Sickening, so I moved on...
But, as my hopes weren't yet dashed, I set '7B' a much simpler task - redirect all program generated user-messages to one particular area in the terminal window.
This proved a nightmare, and highlighted one of the most infuriating aspects of these less-capable LLMs - what passes to a human as a perfectly understandable request, is more or less, 'gobbledygook' to a low-IQ LLM. For instance, I found the below request, perfectly reasonable...
"Find attached file icecast_player11_Claude.cpp. Modify the code as follows; 1. Cache the message written to row 3, column 1 (user-feedback line) at startup, after the attempted refresh of icecast_dir.xml, and restore its contents whenever alternate user-feedback has been displayed there."
...but it didn't have a clue! Asking Claude how that request should be presented to my 'special' friend, it spat back the following;
"You are editing a C++ program. The full source file is provided below. TASK Add a "user-feedback line cache" to the program. Make only the change described here. Do not refactor, rename, or reformat anything else.
BACKGROUND The program has a user-feedback line on screen at row 3, column 1. Messages are written to that line during normal operation.
REQUIRED BEHAVIOUR
1. Add a global std::string variable named feedbackCache.
2. At startup, AFTER the attempted refresh/download of icecast_dir.xml has finished (whether it succeeded or failed), read whatever message was written to row 3, column 1 by that step and store it in feedbackCache.
3. Whenever any other code displays a different message on row 3, column 1, that message is temporary. After it has been shown, restore the line by re-displaying the contents of feedbackCache.
4. Implement this with two small helper functions: void saveFeedbackLine(const std::string& msg); void restoreFeedbackLine(); restoreFeedbackLine() must clear row 3 first, then print feedbackCache at row 3, column 1.
5. Do not cache the temporary messages themselves. Only the startup message is cached.
CONSTRAINTS - Keep the existing coding style, includes, and function names. - Do not change any logic outside the places needed for this feature. - Do not remove or rewrite existing comments.
OUTPUT FORMAT - First, list every place in the code where row 3, column 1 is written to. - Then show each modified function in full, with changed lines marked by a comment: // CHANGED - Then show any new functions or variables in full. - Do not output the entire file unless I ask for it. SOURCE FILE (icecast_player11_Claude.cpp): <paste the full contents of the file here>"
The bizarre thing was, it worked!!! By which I mean, it started producing code. But, code that actually worked? - God no!!! I eventually threw in the towel and asked Claude to do it for me - which it did, in about 30secs. It also worked perfectly, first time, and is playing as I type!
My takeaway from all of this? - online LLMs rock, but only when they're free, whereas, local model LLM's running on underpowered hardware are only a thing if you are a glutton for punishment! I've learnt my lesson anyway!
I'll attach the final, final version of icecast_player here. Bare in mind that the Icecast streams directory server(s) frequently go down for extended periods, but as long as you have a 'populated' copy of 'icecast_dir.xml', you'll have plenty (13,000+) streams to listen to.


















