I’ve always had this feeling that coding might be, broadly speaking, the most useful thing we can get an LLM to do. They’re great at generating written and visual content and in particular to getting you from a blank canvas to something, but there’s something special – and terrible – about code: it lives on; good code in production can run for decades. The long term productivity leverage of leaning on AI coding tools, if we can harness them well and get good quality, is big. Here’s my story about how I’ve found myself knee-deep in AI coding tools.
The Journey
My journey getting LLMs to write code started with ChatGPT – “Hey, can you write some code in <language> which does <X>?” If you haven’t even done this, I highly recommend it – programmers need to take these steps to understand what an AI tool is doing and how good (or not) it is. The first code I recall asking ChatGPT to write took 10 seconds of audio from a USB microphone, analysed it with ffmpeg to determine the mean and maximum audio levels, and wrote these values out as a prometheus textfile .prom file on disk. This got graphed, and I used this to graph to keep an eye on the 2024 cicada emergence in the midwest which was deafening and I had the graph to prove it – using code from ChatGPT! How many programmers know how to string together Linux audio recording, ffmpeg, and prometheus in one shot? Your imagination is the limit. But whatever you do – don’t become a dinosaur! Try it.
If your anxiety about privacy is blocking you from trying AI coding tools, there are many ways to run LLMs locally – I recommend trying ollama locally. It’s open source and runs models on your machine; basic models do not require a special computer. If you’re still stuck at this point, let me know – maybe this is something I should write more about.
My first intro to Claude Code was trying it against my Metra timetable app that I’ve been working on. The idea came from a chat with ChatGPT, but Claude Code is where it really took off – it debugged tricky problems with the JSON data structure under the hood, ultimately leading to me being able to build a really useful tool that Metra riders today are using. Let me know if you are a Metra rider and find it useful – or not!
The results got me engaged: high quality changes, bite-size diffs, and it asks me good questions when my prompts are not clear. Other tools lost track of how the application was designed, or didn’t check to see if the results of their work was even correct – they just did something. Claude Code has been high quality at the first use. The interface also encourages you to make simple one-line changes with a prompt because you’re not in your IDE, so you learn quickly how to use it to make precise changes. It wasn’t until I left my full-time job in August that I had enough brain space to really see what I can accomplish.
Basic intro to Claude Code
Claude Code’s native interface is – controversially – my favorite interface: the terminal! It’s not everyone’s cup of tea, but I think there’s some brilliance in constraining the UI to a simple text interface. Installation isn’t rocket science, and if you don’t have the right version of node (like most of my machines) the linked nvm install is what I use.
cd
into a code repository – or even an empty directory – and run claude.
If you don’t want to commit $20/month to Anthropic, put $5 in and use API auth (which was my first path.) I now am on the Pro $20/month plan as I use it daily, both for work and for side projects.
The most basic feature of Claude Code is it will read code and write (for its own) a markdown file explaining how it sees the code base working. For a developer unfamiliar with a new code base, this can be a useful tool.
Here’s a little demo of it looking at one of my old code bases from a high altitude balloon tracking computer. It does an inventory of the code and writes CLAUDE.md, and I also asked it a couple of questions to give you an idea how not only can it play with code, but with CLI tools. Plus – it’s fantastic at git!
You can even see that it tried to use pylint
to find problems but I don’t happen to have pylint
installed, so it found another way to give me some idea of code quality.
Getting Stuff Done
As you might expect, doing stuff isn’t hard, but as you give it more complex asks, it breaks them down into smaller tasks and it works through them. This works great – you get to keep track of what it’s doing; it gives you better understanding to know when to hit the Esc
key and tell it to pivot from doing something wrong, and it makes reviewing changes sensible. Here’s a little demo of approximately how I used Claude Code to build a little utility I called heic2web:
Real World Example
This time I found a way to let Claude Code iterate autonomously, which was a real a-ha moment for me.
The real trick is to ask it to test it’s own work. I have some hobby code which reads utility meter data from my home energy provider ComEd. They had added MFA support, and the client library I use to read data was trying to get support working for entering MFA tokens to regain unattended access to the API. I got that part working, but then I found my session would only ever last a day; I would have to manually enter an MFA token every day. Can I write some Python that reads the MFA token from my email?
My email is currently hosted on hey.com, a unique email service by 37Signals. They have no API! But wait – the opower
library interacts with ComEd webpages using aiohttp
so surely Claude Code can write something that reads my inbox?
Overview of my prompts:
- Prompt: I have this script, ./integrate.py which reads data from my energy provider. Every time I run it it’s going to prompt you for an MFA token which gets sent to my email. My email provider, hey.com, has no API. I just put the credentials for hey.com in secrets.py. Can you write a simple test program that uses aiohttp to log into my account on hey.com and tries to list the contents of the inbox (which Hey calls the “imbox”) ?
- >> Claude goes off and figures out how to do that for a while, with a few false starts
- At some point in here, I manually logged into my email and copy/pasted the top email subject lines and told Claude Code what it’s top results should be, so it knows what success looks like. It figured it out after only a few tries!
- Prompt: OK now that you can read the inbox contents, run the integrate.py script repeatedly and try to find the matching email in the inbox.
- >> During this time, Claude ran into several ad-hoc problems which it overcame – having multiple MFA tokens sitting in the inbox and authenticating with the wrong one, not waiting long enough for the new email to arrive, finding the MFA token email in different positions in the inbox list, and the integrate script itself crashing for other unrelated reasons. I had to usher it in the right direction a bit – but was mostly hands off as it wrote three different test scripts to refine how it was reading the hey.com pages
- I later discovered that each login to hey.com was generating “you’ve logged in from a new device” emails into my inbox every time. So I told Claude Code to look for it, and starting saving cookies locally until the emails stopped coming in. It took a couple of iterations but it worked too!
It’s creation, hey_email_client.py is rather lengthy, but it works, and runs every day. The whole exercise took me less than an hour.
This isn’t an original idea, giving an agent like this the space to run and iteratively solve a problem. Now I understand what Simon Willison’s write-up about in designing agentic loops – the idea is to have the agent building the desired code and also have tools/code which checks that the desired code/system works. Similarly to my experience, you can get great results out of Claude Code when you pair it with a MCP server that drives Chrome Headless to view a website you’re building…which is a story for another day!
Meet your new sysadmin, Claude Code
Since Claude Code is a CLI expert by nature, it doesn’t have to write code! I throw sysadmin-type challenges at it all the time, but this one was particularly noteworthy that I thought to share it. I don’t know what replaced Pulseaudio in Ubuntu 24, but I know I’m not going to learn it, nor the particulars of my graphics driver. But can Claude Code figure out why I can’t channel audio over HDMI when I expect this should be possible? Let’s find out!
Claude Code figured out how to modify sound card configuration by inspecting my system and executed real commands to work around the issue.
I’ve successfully asked Claude Code to do a variety of tasks like this: fixing a broken apt dependency, troubleshooting usbfluxd with XCode on an OSX machine, and finding ways to convert those pesky HEIC images.
What I’ve learned
- AI coding tools are real and effective – Claude Code is impressive.
- I am taking on technical challenges I otherwise would not spend the time/energy on.
- It’s good for a versatile set of challenges – teaching an engineer what code does, finding bugs, a mix of writing code and running system commands.
- It’s so good at git. I cannot emphasize this enough. No one on earth is as good at git!
- Removing the copy/paste back and forth between chat bot and runtime makes these tools way more fun to experiment with – you then realize how cheaply you can try an idea before really trying to make it bullet-proof.
I’ve had the best experience with Claude Code but only because I’ve spent more energy on it than others and don’t want to spend money trying them all at once.
Finally
It’s still rather early days for these tools despite the leaps and bounds of growth and releases in 2025. The game is changing for software engineers. The GUI IDE battle rages on with Windsurf, Github, Cursor and more vying for users; OpenAI, Google, Qwen, and more are releasing CLI coding agents to compete with each other. But – many people are not using them at all!
These tools give engineers leverage. The more senior you are – and able to understand what they do and command them – the more leverage you’ll find.
Got questions? Reach out – I love talking about this stuff.
Until next time – may your models be grounded, and your prompts be precise!
📧 Chasing AI: Get notified of new posts
Enter your email to be notified when I publish something new:
I’ll only email you about new blog posts. No spam.