git-cliff: the changelog that writes itself (almost)

107 commits. Impeccable conventional commits from day one. Feat, fix, refactor, chore — everything perfectly labeled. And the CHANGELOG? Empty. Non-existent. A file that “I’ll write tomorrow” for two months straight. If this sounds familiar, you’re not alone. Writing a changelog by hand is an Olympic-level pain in the ass. It’s not that it’s difficult — it’s just tedious, repetitive, and there’s always something more urgent to do. And that’s exactly why git-cliff exists. ...

February 22, 2026 · Fernando

How to estimate your Claude quota when Anthropic cuts off the tap

I’m building Tokamak, a menu bar app for macOS that monitors your Claude Max quota. A couple of weeks ago, Anthropic published this in their Terms of Service: “You may not use OAuth or similar authorization mechanisms to allow third-party applications to access Claude on behalf of users.” And there I was, reading Claude Max quota using browser cookies to call an undocumented endpoint, staring at the screen thinking: “What now?” ...

February 22, 2026 · Fernando

macOS Notarization: the nightclub bouncer Apple put on your app

It’s 2 AM. Your app compiles. You sign it. You package it in a DMG. You run notarytool submit. Apple says “In Progress”. You wait 5 minutes. 10. 20. An hour. Two hours. The submission is still “In Progress”. You go to bed. The next morning: Invalid. With no more explanation than “The signature of the binary is invalid”. For both architectures. Thanks, Apple. Very helpful. Notarization is one of those processes that works perfectly… until it doesn’t. And when it fails, it leaves you with a .dmg that Gatekeeper won’t let open and an error that tells you nothing. After fighting with this for a couple of days with Tokamak (my menu bar app for monitoring Claude quota), I decided to document everything I learned and write a linter so I never have to go through this again. ...

February 22, 2026 · Fernando

macOS Virtual Machines in a Single Command

I’m building a menu bar app for macOS. It works perfectly on my Mac. Now I need to know if it works on a clean macOS: without my settings, without my permissions, without my data. A user installing it from scratch. How do you test that? You need a virtual machine. “Easy,” I thought. “I have UTM installed. I’ll open the wizard, create a macOS VM, and we’re good to go.” ...

February 21, 2026 · Fernando

Why 99% of What You Send to Claude Is Already Cached

I’m building an app that monitors my token consumption in Claude Code. A few days ago, looking at the raw numbers, I found this: cacheReadInputTokens: 4,241,579,174 inputTokens: 1,293,019 Four billion two hundred million tokens read from cache. One million three hundred thousand “fresh” tokens. That’s a 99.97% cache hit rate. My first reaction was thinking something was broken. Nobody has a 99% cache hit rate. Not Redis. Not Cloudflare. Not your mom when she claims she already knows what you’re going to ask for dinner. ...

February 19, 2026 · Fernando

Summoning the Wise: How to Use an LLM as a Mentoring Session with Any Expert

My wife summons Charlie Munger to plan our family budget. In ChatGPT. I’m not joking. She tells it something like “act as Charlie Munger reviewing our family finances” and feeds it our monthly expenses. The thing returns insights like “you’re confusing investment with expense in the education category” or “that fund has a hidden cost you’re not accounting for.” Things Munger would say. With the tone Munger would use. I did the same thing. But instead of an investor, I summoned a different expert: Edward Tufte. ...

February 18, 2026 · Fernando

Beads Is Dead. Long Live the Linear CLI

Less than a month ago I wrote an entire post explaining how to use three memory layers with Claude Code: Linear for strategy, Beads for tactics, and Tasks for execution. A nice, elegant pyramid. Yeah, no. Today I’m retiring Beads. Not on a whim, but because reality has made it abundantly clear that a tool causing more problems than it solves isn’t a tool. It’s dead weight. What Beads Brought to the Table For those who didn’t read the original post, Beads was a git-backed issue tracker. A Claude Code plugin that stored issues in JSONL files inside your repo. Brilliant idea on paper: ...

February 18, 2026 · Fernando

Git Worktrees: How to Have Multiple AI Agents Working Simultaneously Without Conflicts

The Single Checkout Bottleneck I’m developing a macOS menu bar app. I have three features in the backlog: a consumption sparkline, native notifications, and a desktop widget. All three are independent. I’m building all three with Claude Code. The problem: Claude Code works in one directory. One directory has one branch. And git checkout is like a single-lane roundabout: only one gets through. If I want to advance all three simultaneously, my classic options are: ...

February 16, 2026 · Fernando

5 Defenses Against Code Hallucinations (and Why Only 3 Work)

Last week I wrote about how my AI invented a complete JSON structure and wrapped it in DTOs, fixtures, and passing tests. 90 green tests. All fiction. That post was the diagnosis. This is the treatment. After discovering the disaster, I did what any engineer with wounded pride does: obsessively research for days to prevent it from happening again. I read papers, tried tools, analyzed real data from my APIs, and built a defense system for my app. ...

February 16, 2026 · Fernando

Silent failure: when your AI makes stuff up and tests say everything's fine

Yesterday I discovered that half of a module in my app was based on fabricated data. Not by a confused junior developer. By my AI. The worst part isn’t that it made things up. The worst part is that everything compiled and all 90 tests passed. The coherent fiction I’m building BFClaude-9000, a macOS menu bar app that monitors Claude Max quota. Part of the functionality requires distinguishing whether a Claude account is paid or free by calling the claude.ai API. ...

February 13, 2026 · Fernando