Your CLI Has a New User—and It’s Not Human

You ask your AI copilot to capture a window. The copilot writes peek app "Xcode". The tool looks for a window owned by Xcode exactly. It doesn’t find one because the process is named Xcode-16.3. The tool responds with Error: application not found. The copilot, a large language model (LLM) with the memory span of a goldfish, then tries peek app "Xcode-16.3". This time it works—but it’s wasted a conversational turn, input tokens, output tokens, and the patience of the person paying the bill. ...

April 7, 2026 · Fernando

Apple's On-Device Model is Terrible for Chat But Surprisingly Good at Structured Output and Tool Calling

I’ve spent weeks stress-testing Apple’s on-device model — the ~3B parameter one that runs on the Neural Engine of any Apple Silicon Mac. To test it thoroughly, I built Think Local, a macOS app that exercises every capability of the model: chat, image generation, structured output, tool calling, and parameter comparison. My conclusion: As a chatbot, the model is terrible. As a structured output and tool calling engine, it’s surprisingly good. ...

April 7, 2026 · Fernando

Apple's sentiment analysis thinks 'delete the temp file' is a death threat

NLTagger is Apple’s API for sentiment analysis. It’s integrated into iOS and macOS, runs on-device, needs no server, and is three lines of code away. It’s the first thing you find when searching for “sentiment analysis Swift”. Here’s what it returns for text any developer would write on a normal day: Message NLTagger Reality “delete the temp file” -0.8 Neutral instruction “ok” -0.8 Neutral confirmation “run make test” -0.6 Neutral instruction “commit and push” -0.4 Neutral instruction “great job, thanks!” +1.0 Positive (correct) “this is fucking broken” -1.0 Negative (correct) The scale goes from -1.0 (very negative) to +1.0 (very positive). According to Apple, “delete the temp file” carries almost the same emotional weight as “this is fucking broken”. And “ok” – the most neutral response in the English language – scores -0.8. ...

April 5, 2026 · Fernando

Bridging async Swift to sync C: Four Functions to Use Apple's LLM from Any Language

Apple’s Foundation Models framework (macOS 26) provides access to a ~3B parameter LLM that runs on-device, for free, with no API key. But here’s the catch: it only speaks Swift. And not just any Swift — Swift async. Is your tooling in Python? No bindings. Rust? Nope. A shell script? Forget it. The cheapest LLM in the world (literally free) is trapped behind two barriers: the language and the concurrency model. ...

April 5, 2026 · Fernando

I'm paying $15 per million tokens to write 'fix: typo'

Yesterday I wrote a commit message with Claude Code. The diff was a one-line change: a typo in a comment. Claude Opus read the diff, thought for two seconds, and generated fix: correct typo in auth comment. That consumed about 800 input tokens and 30 output tokens, at $15 and $75 per million respectively. Cost: a fraction of a cent. But multiply that by 40 commits per day, 250 days per year, across a company with 200 developers using coding agents, and the fraction of a cent becomes thousands of dollars spent on the intellectual equivalent of applying band-aids. ...

April 5, 2026 · Fernando

Your Mac Has a Free LLM and You're Not Using It

You’re paying anywhere from $20 to $200 a month for access to LLMs. Claude, GPT, Gemini, whatever. And most of the calls you’re making from your scripts and dev tools boil down to something like this: “Classify this bug into one of these five categories” “Name this variable for me” “Tell me if this commit is a fix, feat, or refactor” “Summarize this block of text in two sentences” Meanwhile, your Apple Silicon Mac has a 3-billion-parameter language model baked right in, integrated with the operating system. No cost, no internet needed, no API key, no network latency. And you’re probably not using it at all. ...

April 4, 2026 · Fernando

NLTagger and Sentiment Analysis: Why Apple Thinks Your Code is Depressing

Imagine you’re building an app that analyzes conversations within a development team. You want to detect whether the team’s tone is healthy or if there are signs of stress. You decide to use Apple’s NLTagger because it’s readily available, free, runs on-device, and doesn’t require a server. Three lines of code, and off you go. First surprise: the phrase “kill the process and restart the daemon” scores -0.6. Negative. Almost hostile. “Fatal error in memory allocation” gets a -0.8. And “crash report uploaded successfully” — which is literally good news — scores -0.4. ...

March 28, 2026 · Fernando

Your AI Writes Code That Compiles but Means Nothing (and a Linter Can Catch It)

Imagine you ask someone to build you a bookshelf. They deliver it. It’s beautiful. It has shelves, screws, everything in place. You lean it against the wall, and it collapses. The screws are fake. They look like screws, but they’re made of plastic. That’s what an LLM does when it abuses the type system. It gives you code that compiles, passes tests, and looks correct. But under the hood, where there should be meaningful types, there are strings. Where there should be explicit state, there’s a nil that means three different things depending on who reads it. And where there should be an enum with two cases, there’s a == "claude" that one day someone will misspell, and no one will notice until production. ...

March 23, 2026 · Fernando

A Kalman Filter to Stop Bothering the Server (Or the Guilty Pleasure of Over-Engineering)

I have a menu bar app that needs to know a number. A percentage from 0 to 100. To get it, it calls a server every 30 seconds. Do the math: 30 seconds means 2 calls per minute, 120 per hour, 960 in an 8-hour workday. Almost a thousand HTTP requests per day to read a number that sometimes doesn’t change for 20 minutes. That’s not monitoring. That’s harassment. The real problem isn’t technical. It’s political. When you depend on an API you don’t control — that’s not public, that has no documented rate limits, that belongs to a company that can change their Terms of Service any given Tuesday — every unnecessary request is a risk. Not of timeout. Of getting cut off. ...

March 12, 2026 · Fernando

My AI Read a JSON File from Disk 900 Times in a Loop (And Why No Linter Can Save You)

Last week my AI wrote code that read a JSON file from disk, parsed it, did one lookup, and repeated this 900 times inside a for loop. Each iteration: open file, decode JSON, look up a value, throw it all away. Start over. It’s a mistake I teach my students not to make within their first month of programming. What happened (straight to the point) I’m building Tokamak, a macOS menu bar app that monitors Claude Max quota. Part of the functionality scans ~900 JSONL files from Claude Code sessions. For each file, it needs to know the byte offset where it left off last time (incremental reading — only process what’s new). ...

February 24, 2026 · Fernando