Recent Posts (all)

LLMs for grammar

UPDATE: There’s a more refined version of this in a new post.

Today, Dr. Drang asked on Mastodon about my setup to leverage LLMs to check my grammar.

My setup has a couple of assumptions, just like his:

Tooling

For this post, I’m assuming you already set up llm, but if not and you have uv handy, it’s this simple:

uv tool install llm
llm keys set openai # if using OpenAI
# if using gemini
llm install llm-gemini 
llm keys set gemini
# if using Claude
llm install llm-anthropic
llm keys set anthropic

The macro

Once this is in place, the macro is pretty straightforward, and I invoke it with the text I want to check selected. I then have to wait a bit, and the script will replace the text with a corrected version, each corrected item marked in bold (I don’t use bold much in my text, so that is OK).

A screenshot of the Keyboard Maestro macro to check for grammatical mistakes
A screenshot of the Keyboard Maestro macro to check for grammatical mistakes

The core of the macro is the (fish, but it will work on other shell unmodified, probably) script (pasted here to make it easier to copy and paste):

#!/opt/homebrew/bin/fish

pbpaste | llm -m gemini-3-flash-preview -s "
Given the following text, improve grammar and punctuations. 

Once you're done, highlight the changes by using a double asterisk (bold, in Markdown). Only output the text, don't add commentary or summaries anywhere in the text" 

Since the macro highlights clearly what has been changed, I can learn a bit as well! And if the window loses focus, everything will be in the clipboard.


  1. Not all text might need to be checked, though. For example, in my mail client, most of the text I’m replying to doesn’t need a grammar check. ↩︎

LLM-powered coding mass-produces technical debt

LLM-powered coding mass-produces technical debt

The promise of AI for engineers is getting rid of engineers.

Tools like GitHub’s Copilot write code, specs, review, and create pull requests. They create and run tests, and do so in the background while the developers engage in more productive activities, such as meetings.

On Agentic AI and reusing passwords

Agentic AI, Use Cases That Drive Revenue

However, whenever a customer went beyond the rigid scripts, the chat had to be routed to a person, only to reset the password to “Welcome97” (the previous one, in fact, was “Welcome96”, so it couldn’t be reused. Security, go figure!) and wasting everybody’s time while doing so.

I still love this bit of writing from my article on Xebia’s blog about agentic use cases that drive revenue.

Benchmarking AI models at Scale

Concurrent: Free LLM benchmarking tool

I just stumbled upon this (free) app, called Concurrent, that lets you benchmark different LLMs across speed, cost, and quality.

The app is built by Al Castle, VP of Engineering & Security @ Nerdy and works by sending your prompt to multiple AI models simultaneously, showing you side-by-side comparisons of quality, cost, and speed.

I especially like the feature to measure and compare the quality of AI responses

A screenshot of Concurrent
A screenshot of the metrics view

No Arial

Typography in ten minutes

What a marvelously succinct article about typography with a punchy take-home message!

And never choose times new roman or arial, as those fonts are favored only by the apathetic and sloppy.

https://practicaltypography.com/typography-in-ten-minutes.html

Hey Claude, delete my home folder

Claude CLI deleted my entire home directory! Wiped my whole mac.

Use agents, they said. You will save time, they said.

Tools like Anthropic Claude CLI, OpenAI Codex, Gemini CLI, etc. can be super useful but, by default, they don’t execute commands before asking for permission each time.

As a result, multi-steps tasks can become tedious to validate each time. You need to keep constant attention to it, track what it does, approving all changes and actions.

However, there’s a way around it, the --dangerously-skip-permissions flag. Using that flag, the agent starts doing things in the background and you can go on with your life and check back once it’s done. But agents hallucinate, and, sometimes, they do so big time. Like what happened with LovesWorkin (username checks out) on Reddit: Claude run a rm -rf tests/ patches/ plan/ ~/ command, wiping their whole home folder 😱

The comments, as always, are a joy to read.

A screenshot of the terminal showing the tasks Claude was executing

Forced Update to iOS 26

David Smith, colloquially known as _, has compared iOS 18 with iOS 26 adoption.

Today, he tooted that someone at Apple has hit a switch to update everyone.

Anecdotally, I saw this forced update pattern with my wife’s phone (a 14 Pro). She got it replaced by Apple (through Apple Care) and to restore her iOS 18 backup into the replacement 14 Pro, she had to update to iOS 26.

I don’t know how many phones get replaced each month, but this pattern contributes to the uptick in adoption David is seeing, as we were not planning to update to iOS 26 anytime soon!

The iOS 26 adoption as measured by David Smith, or Widgetsmith fame

Most Popular LinkedIn Post

I just written what has been, to date, my most popular LinkedIn post.

I did not expect it when writing it–it is such a niche topic–but apparently it struck a chord.

A screenshot of the LinkedIn post that got tens of thousands of views

Screenshot or it didn't happen

Ban Emails

I get plenty of annoying spam emails from so-called legitimate business. My favorite way to get rid of them is this little Powershell script that I invoke from Launchbar after I copied the email address I want to ban!

param(
[string]$email
)
$domain = $email.Split("@")[1]
Connect-ExchangeOnline -UserPrincipalName my@email.com
New-InboxRule -Name "From $domain" -DeleteMessage $True -FromAddressContainsWords $domain

For this to work, you need to replace my@email.com with your actual email and it only support Exchange/Microsoft365 tenants.

From Launchbar, I launch it through a script (there’s probably a better way, I’m sure)

#!/bin/sh

/usr/local/bin/pwsh -File ~/.dotfiles/bin/ban_email.ps1 -email $(pbpaste)

Flash the Firmware of the Preonic from Keyboardio

I recently bought the Preonic keyboard, as my two Model 01 were not really portable.

The Preonic is a superb keyboard that is highly customizable and connects either by wire or bluetooth. I couldn’t pass the opportunity.

Since it’s customizable, one of the first things I wanted to do was change the layout a bit. The suggested way is to use Chrysalis but it requires Chrome-based browsers, which I don’t use. So, I resorted to the terminal.

As there were no step-by-step instructions, this post documents how I’ve done it.

Getting started

The first step is to clone the repository and set things up. From your terminal, type:

git clone https://github.com/keyboardio/Kaleidoscope
cd Kaleidoscope
export KALEIDOSCOPE_DIR=${HOME}/git/Kaleidoscope  # or, if you use fish, use set -x KALEIDOSCOPE_DIR ${HOME}/git/Kaleidoscope
make setup # this is done the first time

Customizing the layout

If everything goes well, we should be ready to customize our layout. To do so

# for some reason, it's not where their other firmwares are
cd plugins/Kaleidoscope-Hardware-Keyboardio-Preonic/examples/Devices/Keyboardio/Preonic
vim Preonic.ino # edit the layout with whatever editor you have
make compile

If everything went well (e.g., you didn’t mess up), we should be ready to flash the layout.

Flashing the layout into the Preonic

To flash the layout, we need to put the keyboard in bootloader model (these instructions minus the last step come from their website):

That’s it! You should now have a working layout. If you want to generate an SVG of the layout, you can type

python generate_layout.py

There are a couple of quirks in the python file, but it will output something that looks like

The layout as produced by a modified version of the generate_layout.py file

Well done, Jesse and Kaia!

2/14