August 01, 2025 | 18 Minute Read
Claude Code - my coding companion for the past 31 days
It’s been… one month since I purchased a Claude Pro subscription so I could try Claude Code instead of freeloading off of Google Gemini’s CLI. I thought I would take a look at the things I learned while vibe coding a few projects, and other uses that I found for Claude Code besides coding. If you missed it, be sure to check out my initial post about vibe coding, and the followup about how Claude Code was definitely better than Gemini (for now)!
Context is King!
So there’s a lot of talk about how prompt engineering is dead, and “context engineering” is the new hotness. That makes a lot of sense to me, as I ran into this issue constantly while using Claude Code, and to a lesser degree, with Gemini CLI. To understand context, let me first give you some… context.
The way that LLMs work is that there is a pre-trained model with weights (the ‘P’ in ‘GPT’ stands for pre-trained). Most of these applications are next token predictors. So if I input: “Welcome to McDonald’s, how may I help”, the next token would probably be “you”. Before there was ChatGPT, there was the text completion API (does anyone remember using davinci-002?).
But aside from the frozen model weights that the LLM is generating predictions from, any other context needs to come from you, the user. Most models have a specified knowledge cut-off date, which is basically the date of the most recent data used to train the model. So you can’t ask an LLM about anything newer unless it does a web search or something else to gain that context.
An example of models and their knowledge cutoff dates (among other info)
I like to think of Claude Code (or whatever coding agent I’m using) as a really smart software developer who also happens to have Anterograde Amnesia, like Drew Barrymore’s character in 50 First Dates (spoiler alert!). It can help you write an entire feature from scratch, and then completely forget who you are once its context has been wiped. From one session to the next, this tool will completely forget everything until you provide it with that context again somehow.
For every session, Claude Code will literally need to look at whatever you’re asking it to work on and add it to the context before making more token predictions. Claude Code has a context window of like 200k tokens (see this documentation from Anthropic), so whatever you’re working on needs to fit within that window, and every message you send to Claude Code will include all of the past context that you already sent. Claude Code might know how to reverse a list in Python, but it won’t know how to do that in your project until it loads the project into its context (why are you reversing lists in your project, anyway?).
There are a few existing ways to help “prime” the context when you start working on things, so that CC doesn’t constantly have to search around to understand what you’re asking for. The most obvious one is the CLAUDE.md file which is added to the context of each conversation you have with Claude Code. You can put things like instructions for doing common tasks, or explain the organization of which files go where. A common one would be to say where the log file is, so Claude Code can use the log files to read error messages. If you see Claude Code running a bunch of bash commands to grep files every time you ask it to do something, you might benefit from adding it to the CLAUDE.md file. Of course, it’s a balancing act as you don’t want to stick too much junk in there if it’s not relevant, either!
When your context window gets too big, Claude Code will attempt to compress it, which I typically don’t like. I find that too many details are lost and it’s better to just start over from scratch by using the /clear command which essentially wipes all of the memory from the previous context. I think there’s been some studies done about how much worse these LLMs perform when the context window approaches its limit.
Another thing that I’ve found is that context can get poisoned pretty easily. What I mean by that is you ask Claude Code to do something, and it does it the wrong way. Then you correct it and it undoes what it did, and does it the right way. Even though you corrected it, you still end up using that incorrect implementation on each and every turn of your conversation, because it’s in the history. To avoid this, you can hit esc twice, and just rephrase the thing you said that Claude Code misunderstood. This can save tokens in your context window and also keep the context from getting poisoned.
One more thing I do to keep the context small (and therefore my token usage smaller) is to /clear the context whenever I’m done doing a task, especially if the next one is unrelated to the thing I just did. The way Claude Code works, all of your previous conversation history for your current session is used for your next message. So if I had Claude Code fix a bug around authentication, and then I wanted to have it work on image caching next, it doesn’t make any sense to keep sending the history about authentication in the next messages. There is some sort of token caching going on that I believe saves you usage, but I think that longer contexts are by definition less effective anyway.
Claude Code Codes
I don’t want to repeat myself too much with what I wrote in my previous blog post, but here’s a sample of the coding I did this month with Claude Code:
- I added automated testing with playwright to Animenano
- Optimized Animenano RSS feed parsing by caching etag/last-modified headers
- Wrote a script to sync the remote Animenano Cloudflare D1 database for testing locally
- Added some tools to my LiveKit AI agent that I was messing around with, like a Japanese phrase guessing game
- Vibe coded search on my blog on a plane! (I actually made a video for this!)
- Set up staticman for comments on my blog!
- Changed the comment form on my blog from a hard reload to an AJAX update!
- Wrote a script to scrape comments from my old blog posts on archive.org to replenish my missing comments (due to having a static blog)!
- Started working on an AI powered DJ that picks from my local music collection and adds occasional personalized commentary with TTS
- Added some features to a project that automatically creates localizations for Youtube video titles/descriptions and captions
- Wrote a script to convert Final Cut Pro titles to SRT subtitles (for Youtube)
- Wrote a Windmill script to evaluate coffee deals on Slickdeals rss and send a Slack message if they meet my parameters (light/medium roast, cost per oz, whole bean, etc)
Out of all of these things, I think Claude Code does the best when it’s working on a small, single file script. This makes sense because as we discussed earlier, context is very important. If Claude Code can store the entire script in memory, it won’t make false assumptions (hopefully!) about how things work. And if it doesn’t make those false assumptions, we can assume it will write correct code for any changes. I think it does do this most of the time.
This is such a powerful use case that I really want to use more often. For example, I had an idea to add comments to my static blog, so I asked Claude Code how I should do it. Once we decided on staticman, Claude Code implemented it. Then I had an idea to get my missing comments on my blog back using the Internet Archive (I nuked them when I went from a Wordpress blog to a static site). So I had Claude Code write a script to scrape them from it. I’m sure I could’ve done this myself, but I’m also sure I’d be too lazy to sit down and figure out the endpoints and all of the glue code to make it work. With Claude Code, I just asked it to pound away at the problem until I had the solution, while I looked at Reddit. As an individual contributor for my entire software engineering career, I finally understood what it was like to be a manager!
Another use case was that when I make Youtube videos for my dog, I hard code captions in English. I would turn these into SRT subtitles for other languages by literally copy/pasting each Final Cut Pro title into a caption in the project. I had an idea to automate this. So I exported the FCP project into xml and had Claude Code inspect it to see if it could convert the titles to SRT. After a few iterations, I have a script that I can just run, which saves me probably 3 or more minutes of manual work every time I make a video.
Claude Code performed the worst when I had it make an AI powered DJ for me. That project has a lot of parts, and the architecture is honestly not super great (because vibe coding). It would code up one part, write some tests that passed, then move on to another part. The second part would also get tests, but Claude Code didn’t really integrate them at all. At the end I had a bunch of pieces that needed a lot more vibe coding to actually work together.
It finally did end up working, but I think the project has a lot of tech debt which could probably be fixed (but I won’t because vibe coding). It’s still pretty cool because it does what I want it to do, but if I had to look at the code I might cry tears of bad engineering. Some of the blame probably goes to me, actually probably all of it. This project used a bunch of technologies that I don’t really understand, so I really did just let Claude Code go to town with it. If I had focused more on getting Claude Code to write a plan, maybe set up interfaces ahead of time, and set up integration tests, things may have gone more smoothly.
You can tell this was made by AI by all the emojis 💪🎶🚀
This brings up an important point. The people who learn how to use these tools (and use them efficiently) will still have an advantage over other people using the tools like noobs. At least for now, this is a useful and probably marketable skill. Anyone can just burn a billion tokens having Claude Code try and implement something (much like an infinite number of monkeys writing Shakespeare on typewriters). But when tokens have a real cost, I think people who use them efficiently will have an edge. Who knows how long this edge will last, though, given the speed at which these things change?
Claude Code Doesn’t Code
I honestly think the non-code uses for Claude Code are more interesting than the code uses for it. The challenge is to think of domains where text is primarily used to do work, since Claude works mostly in that modality (though I guess images and video and audio work to a certain degree, too).
Like I wrote in my post about Gemini CLI, I’m not exactly sure why these tools are CLIs and not GUIs where you can select a working directory and then run prompts on it. Maybe these companies are just throwing CLIs at engineers and then seeing what they end up doing with them, to later turn them into products?
Here’s my list of non-code stuff I’ve had Claude Code work on for me this month:
- Documentation for my various side projects, instead of leaving the readme blank
- Set up wireguard vpn on my opnsense router, Claude Code helped me debug why I couldn’t access the network until it worked!
- Added documentation on how I set up mdns and nginx on a home server to serve stuff on the network, and added some more hosts
- Debugged an issue where an external SSD connected to a Linux home server went into read only mode
- Made a PDF out of some images, then compressed the PDF file with command line tools
- Markdown editor for this and my other previous blog posts!
One of the cooler things that I used Claude Code for was debugging an issue with an external drive that I had running on my home Linux server. I noticed that the drive had gone into read only mode. I tried restarting the server but that didn’t fix it. I asked Claude Code to take a look and it ran fsck on it, and found that there was some corruption. It gave me a list of commands to run (which I verified before running manually) that fixed the issue! I probably could’ve fixed this myself by doing some Google searches but I want to highlight this use case.
Often when I search for fixes to things, I won’t get a relevant answer for whatever reason. Maybe it’s because my version of Linux is different or the hardware is different or the solution is to just turn it off and on again. With Claude Code, I get a quick feedback loop where it can actually run diagnostic bash commands that help it understand and diagnose the issue I’m seeing. Simple searching alone can’t really provide this tight of a feedback loop, and doing this kind of diagnosis is FAST! As long as it’s correct, of course.
In the case of making a PDF out of some images, I was trying to use the macOS Preview app to do it, but I was getting a single page PDF that was huge. I asked Claude Code to make me a PDF and voila! Now, I realize that Claude simply used some knowledge of existing command line tools to accomplish this (in this case it used imagemagick). But as someone who doesn’t have encyclopedic knowledge of all command line tools that have ever been created, hey, it’s pretty useful to have an AI that does! I suppose that if anything, using Claude Code has made it more obvious to me how much power there is in the command line, just waiting to be used by anyone who is in the know about it.
Claude Code helping me convert images to PDF and compress them using command line tools
I mentioned the other use cases in my previous blog post about Claude Code. It happens to be quite good at reading and documenting things, especially if you give it direction. Who doesn’t have a pile of abandoned side projects with zero documentation, waiting to be resurrected? Claude Code can pretty much do the hard work of figuring out what the heck you were trying to do, and where you might’ve left off. I guess it’s kind of like reverse context engineering, where you get the AI to give you the context of the thing you completely forgot about.
Finally, I’ve been using Claude Code a lot while writing these blog posts. I’m editing the markdown in VS Code, and I don’t really have a WYSIWYG editor, so I use CC for adding links, proofreading, and resizing and adding images. This has saved me a ton of time since using Jekyll is a lot more manual work than something like Wordpress. Claude Code even wrote 100% of this blog post you’re reading right now! (Just kidding)
Other Random Observations
One thing I noticed while working on a few projects is that Claude Code and Gemini both really suck at CSS. I’m not entirely sure why this is, but I think it has to do with the fact that the final rendering of whatever you’re doing in CSS can come from many different sources. These coding agents seem much better when the context provided is right in front of them. With CSS, you might need to see what a certain class is inherting from the p tag, since it can affect what happens in a nested structure. These coding agents don’t actually compile the CSS (or whatever it’s called, I’m not a web dev) and actually get the final styles for the thing they’re working on. I doubt there’s much training data for CSS that involves reading from multiple CSS files and determining how to fix an issue due to a downstream style. So for now I’m somehow better at debugging CSS than AI, even as a native mobile developer.
This might also explain why AI seems to love writing inline css rather than use a style sheet. Because AI doesn’t care about taste or tech debt, and I wonder if reinforcement learning favors quick wins over manageable code.
For a few weeks in July, I also noticed that I kept hitting Claude Code rate limits even when I had just started a session. It was probably due to those guys on the CC leaderboard burning tokens for clout. I honestly can’t figure out why someone would try and get on that list. It’s basically admitting that you suck at using your tools efficiently. Kind of like people who brag about working 100 hours a week when most people can get by on 20!
I did get an email from Anthropic about the issues and how they’d be resolved with more rate limits. I’m pretty sure Anthropic could have just solved this by implementing actual rate limiting… how exactly does someone abuse a system unless it’s open to be abused by the platform that provides it? Either way, I’m guessing that I won’t see any difference because I often go for entire sessions without ever seeing the warning that I’m approaching my limits. Probably because I take the precautions I described above to limit my context size, etc.
Was Claude Pro Worth It?
Daily Claude Code token usage report showing $132.79 on my main desktop
I’ve been using this ccusage script to keep track of how much I’ve used Claude Code for a given time block as well as just seeing how much I’ve used in tokens if I had opted to pay per token. It’s pretty interesting to see the numbers go up, and somewhat horrifying to realize how much it would actually cost if I didn’t pay for a monthly subscription. Since I’ve been using Claude Code on multiple computers, I have to add up the usage across four machines. So far I’ve used $132.79 worth on my desktop computer, $2.05 on my linux server (mostly for debugging and documenting), $30.58 on a Macbook Air I have, and $13.38 on another Macbook Air (I have a lot of computers, so what?). That comes to a whopping $181.37 worth of usage from a $20 Claude Pro subscription. I didn’t even max out my usage every day, and there were days that I didn’t even use it because I was on vacation.
I would say that I definitely got my money’s worth out of Claude Code this month. I’ve been more productive in this month than I have in a really long time. And I don’t think it’s just because I had AI do everything for me. I’ve had more mental energy to think about things I want to accomplish, and the quick feedback loops that come from AI pounding out code has been contributing to that. This could just be a temporary boost until things regress to the mean, but for now I’m really loving the productivity gains I’m getting.
Overall I’m pretty happy with this product. I’m hoping that this isn’t just the cheap stage of coding assistants (see Lyft, Uber in 2014) and that these tools will get more useful, powerful and faster over time!
.png)
