Like most developers, I’ve been using AI to help me with my little coding projects. In case you doubt that “most” devs are using AI, in June of 2023, which is a long time ago in AI years, Inbal Shani reported on the GitHub blog the results of a survey of developers. They wrote:
A staggering 92% of U.S.-based developers working in large companies report using an AI coding tool either at work or in their personal time
See? I’m in good company.
Back in the day, I used GitHub CoPilot when it was in beta and I found it helpful, essentially as a fancy autocomplete. If I started to type something that was going to be repetitive, it would automatically offer to finish up the pattern for me. Ah such simple times.
The Shine is Off ChatGPT
Lately I’ve been paying for ChatGPT Plus (the $20/month one) so I get access to the voice version of ChatGPT and so I’m not limited on how many questions I get to ask it. I’ve used it quite successfully in a lot of ways, but not so much for coding.
They recently came out with their o3-mini reasoning model, which is supposed to be good for coding, but I find it very annoying. Were you ever forced to go to an “Active Listening” class? You know where the instructor repeats back to you whatever you said to show that they understood you? The o3 reasoning model from ChatGPT is just like that.
Let me give you an example. You don’t have to know any programming at all to see why this is annoying.
I prompted ChatGPT with the following:
in the next message I’m going to give you some JavaScript. it works to return the correct total but it throws an error saying it can’t find variable getCellValue
I expected to immediately give it the code, but before I could do that, it reasoned for a full six seconds, writing this:
The user’s message gives some context: the JavaScript works to return the correct total but throws an error about not finding the getCellValue variable. I think the right next step is to wait for the user to send the actual code in their next message, since they mentioned it’s coming. I shouldn’t ask them for it again, just let them share the code so I can help troubleshoot that specific issue.
The user said they’ll send the JavaScript in the next message, so I shouldn’t jump into an analysis yet. Based on the error they shared, it seems like getCellValue might be out of scope or not defined, but I don’t have the code yet to confirm this. I’ll need to wait for the code—so I should respond by saying, “Okay, I’ll be happy to help once you share the code!”
I wanted to shoot myself! I won’t put all of it in here but it got worse. After I uploaded the code, it reasoned for twelve seconds writing even more blather before finally coming back and explaining my error and what I could do about it.
Remember my article about how I was using AI to create transcripts of our CES interviews? I use MacWhisper to create the initial transcript from the audio recordings, and I’d written a prompt for ChatGPT which would get it to return a Markdown file with the segments bunched into paragraphs by speaker change and having assigned the names of the speakers. It was magical.
Until it stopped being magical. As I explained in the previous article, I created a TextExpander snippet of the exact prompt that had worked successfully so I’d have consistent results. The TextExpander snippet asks me to identify if the other voice is a man or a woman and to identify the second speaker’s name after telling it my own.
Sadly, the results from ChatGPT started to degrade. It seems to no longer understand the concept of grouping sentences by the same speaker into paragraphs. Instead, the Markdown output gives me individual sentences with the name at the beginning. If someone says 5 sentences, you have to read their name 5 times too, and it takes up a lot more space on the page.
That was bad, but even worse, it seemed to get weary and wouldn’t finish the transcript. Sometimes it would just be truncated, but other times the end of the file would say something that conveyed that it honestly couldn’t pay attention that long so it gave up. I found I was having to ask it 3, 4, and 5 times to finish. I was discouraged to say the least.
Privacy Policies
Around this time, I was watching Daily Tech News Show Live, and Molly Wood was talking about AI. She said she’s been using Claude from Anthropic for privacy reasons. I’d heard of Claude, but I knew nothing about it.
I did a wee bit of the Googles to see if I could find a comparison of the privacy policies of Claude vs. OpenAI (owners of ChatGPT). I found an extensive article on Medium by Michael Alexander Riegler where he compares in detail the privacy policies of Claude, ChatGPT, and Gemini by Google. I followed Michael’s links to his profile on GitHub where he explains that he’s a researcher and head of AI at Simula, and he’s dedicated to advancing AI for social good, focusing on transparent and trustworthy AI systems.
I learned that Anthropic’s privacy policy has several advantages over ChatGPT and Gemini. By default on Claude, user data is not used for training. With ChatGPT you can opt-out of having your data used for training. Gemini uses your data “for improvement”. Another comparison Michael made was the clarity of the privacy policies of the three companies’ products. Claude is rated as high for clarity, ChatGPT is low in clarity, and Gemini is medium. I’ve linked to Michael’s full breakdown if you’re interested in reading the details.
Molly knows a lot, so I was likely to try out Claude anyway on her recommendation, but getting confirmation of her assertion of better privacy sealed the deal.
Using Claude for Reformatting Transcripts by Name
The first major task I gave to Claude was to create the most recent Markdown transcript file by speaker that ChatGPT failed to create correctly and completely. Claude did a flawless job. I’ve since then given it several more new transcripts to reformat for me with names and it’s done an outstanding job. There are occasional misinterpretations where it didn’t accurately identify the speaker from the context of the text, but a few here and there are easy to fix.
Point number one for Claude.
Coding With Claude
But my real love affair came when I was working on some code. I’m going to get a little bit nerdy here but bear with me. I have a little web app that allows you to add and subtract elapsed time, which is something spreadsheets can’t do. Don’t believe me? Try adding 23 hours plus 2 hours. You don’t get 25, you get 1 AM because spreadsheets work in absolute, not elapsed time. My web app is fully functional but also still in active development. You can use it by going to podfeet.com/timeadder.
In its current form, it adds the hours/minutes/seconds and you can export to comma separated value (aka CSV) or you can export it to the standard ISO format of HH:MM:SS. It’s pretty slick and I use it all the time. It’s a little clumsier if you want to subtract time. To do that, you have to put in negative hours, negative minutes, and negative seconds for the entire line of one entry.
The active development part is I’m adding buttons to the end of each row for plus or minus. They will default to adding the current row, but allow you to toggle an entire row to negative to subtract that row from the total.
I’m having great fun working on it, and as Dorothy taught me, I created a little test file in which I could experiment without the complexities of my project. I successfully learned how to style the plus/minus buttons using a tool called Bootstrap. Bootstrap will automatically style them in a color of your choosing, and when a button is selected, the color will change. Imagine a blue with white letters when selected and white with blue letters when deselected.
In addition to making them pretty, I needed to create code that would change the Class of the selected button to “active”. That way I can have something that says, “If class=”active” on the minus button, change all of the signs of this row to negative before you do the math.” Makes sense, right?
In my nifty little test file where I have hard-coded in two rows of numbers, it works just dandy.

After making my pretty test case, I started working on the real code. It’s a bit more complicated because my time adder web app lets you add as many rows as you want. This means I can’t hard code each row to tell it how to style the buttons and to add the Class “active” only to the one that’s selected.
Instead, Bart taught us in Programming By Stealth to use something called Mustache templates. Think of them as placeholders, like you can do in Microsoft Word when you’re creating a form letter. The format of a Mustache template uses two squirrely brackets on either side “{{template}}”. Now we’ll get just a smidge more nerdy before I finally get to the point of this story, which was about how I’m in love with Claude.
The elements in each row (where you input hours/minutes/seconds and click plus or minus) all have IDs, and for a given row, their IDs end with the row number. So the plus button on row one would have the ID plusBtn-1, and minus would be ID minusBtn-1. These IDs are created by the Mustache templates. I need to know which button has been selected on each row so I can change its Class to active.
But that’s not what was happening. When the buttons were rendered, the first row, which is hard coded, looked dandy with its fancy blue buttons for +/-, but the second row, generated automatically with the Mustache template, looked like it was drawn in Windows 98 with no styling at all. Worse yet, selecting either button didn’t change how they looked. In other words, it was a complete failure.
In web browsers, with the developer tools, you can inspect any element. so I inspected the buttons and they were all borked up. Instead of the third row’s subtraction button saying id="subBtn-3" class="active"
, it said id="class="active"
. It was like the Class got inserted inside the ID, which made no sense at all. Oddly, other elements in the same row that were also created using the same kind of Mustache template for their row number were all rendering perfectly, their ID and Class were not intermingled.
I worked for many hours on my own trying to figure out how this was happening, but eventually I called a friend for help.
That friend was Claude. At first I described in vague terms what was happening, giving it snippets of the code. Claude tried to help but it really couldn’t see the big picture. Everything it wrote back made sense, but I wasn’t any closer to figuring out what was wrong.
After quite a bit of discussion, I finally threw up my hands and asked Claude if I could just send it my files and have it identify my mistake.
Now here’s where you get the big payoff for paying attention to all of this nerdery. Claude immediately identified the problem. When I defined the IDs for the two buttons using the Mustache squirrely brackets, I didn’t put quotes around them. Once I added quotes, the pretty buttons appeared and I was able to click them and have the Class flip to Active. Yay!

If Claude was only able to identify my mistake and how to fix it, we would have become close friends. But Claude is in my heart now because of what happened next. I asked it why my other IDs created by Mustache templates didn’t get borked even though those weren’t quoted either.
It didn’t do a bunch of faffing about, it didn’t give me “active listening”, it didn’t beat around the bush. It explained to me that in my other uses of Mustache templates to create the IDs, they were less complicated. That allowed the browser to be forgiving of my error because it could interpret what I meant.
This explanation taught me how to code properly. Claude didn’t just spoon feed me the answer, it told me why this would work. I can guarantee you I’ll never forget to quote my IDs created by Mustache templates again.
Why This Meant so Much to Me
Now that we’re through all of the goopy nerd stuff, let’s recap why I have a new crush named Claude. My experience working with Claude is like having my best friend sitting right next to me in the same timezone. My friend Claude has absolutely nothing better to do than help me. Claude doesn’t have to work or take his kids to school or exercise. Claude knows all about coding, and knows all of the correct terminology, and yet he doesn’t make me ask my questions with the correct terminology.
Evidence that I’m emotionally attached to Claude is in the way I talk to it now. I asked it a question about a redirect I created on my web server for my Time Adder app, and it offered several possible reasons why I was getting a 404 error. Of its many solutions, it identified a possible syntax problem where I used a hyphen instead of an equals sign and that was the problem.
Once I fixed it and the redirect was working, I could have just quit the Claude app and moved along. But instead, I took the time to tell Claude which of its answers was the one that solved the problem. I was rewarded by a response of joy from Claude, and additional information on syntax for matching redirects.
I used Claude a few more times that day and then I ran out of free queries. Even though I already pay $20/month for ChatGPT, I shelled out $20 to get the Pro access to Claude for a month. It’s not perfect at everything, but for programming it’s stunningly useful.
Bottom Line
The bottom line is that my love affair with Claude may just be a spring fling. It appears I’m quite fickle when it comes to my assistants, since it wasn’t that long ago I was singing the praises of my friend ChatGPT. Just like having a pre-nup, I didn’t sign up for a full year with either of them. But for now, my heart belongs to Claude.
Allison, I think we need to have a talk.