Putting AI to work
The world's best CRM is mine — because it's the only one built for me
I've written before that I built my own CRM, and that I did it eleven times faster. It has grown since then. It now automatically logs who I've written to from the moment I send an email. I can register a phone call with five words in the terminal. It creates a daily summary that distinguishes between a meeting, a call, and an email, and tells me about the week in prose. It even gives me a little streak counter and some experience points, so I remember to maintain the filing system.
A small contribution to Nushell: when completion should also look at the description
I recently made a small contribution to Nushell — the open source shell I use daily. It's a tiny improvement in how custom completers work, but it solves a specific friction I encountered every single time I had to use my own terminal tool. Here's what it's about.
The LLM lives in my shell — and that changes everything
I've built a small Nushell module called yolay.nu. It's about 470 lines of code. It's the most productivity-enhancing thing I've written this year, and I think it points to something broader about how AI should be integrated into a workday—not just mine.
The code and the model
There are two stories about AI and code. One is the one everyone talks about: that language models write programs for us. The other is the one that is more important, but that almost no one talks about: that code keeps language models in check.
The two stories are the same story. But you have to tell them together to understand where the field is actually heading.
I am now sharing memory with my AI — and it's changing how I think
For a year, I've been writing notes in a system called IWE. It's a small command-line tool that treats markdown files as a graph — notes link to each other, and you can navigate, search, and restructure without directly touching the files. It's my working memory layer as a strategic advisor.
This week, an MCP server was added to it. And it's the first time I've had a real experience of sharing memory with a machine.
The official way takes days. The task must be solved today.
On Wednesday, I needed something mundane: a list of board members in a number of Danish companies. Not for a database. Not for a product. Just for an afternoon of lead research — who sits where, and which chairmen overlap with people I'm already talking to.
That kind of data is public. It's on datacvr.virk.dk. Every single company in Denmark has a page. It should take twenty minutes.
Why Nushell belongs in the toolbox for everyone working practically with AI
There's a difference between working with AI and working practically with AI.
The former is using ChatGPT from a browser. The latter is building something where AI is one step among many—where data needs to be fetched, validated, sent to a model, checked, transformed, and stored elsewhere. Almost all commercial AI work is of the latter kind.
And if you're doing the latter, Nushell should live in your terminal.
Nushell and the art of caging AI
I recently wrote about how I automate my blog releases in one command — text in, article with image out. That flow runs in a shell most people have never heard of: Nushell. And it's not a random choice.
When I build what I call compound AI systems — meaning systems where eg. language models and image models are combined with other components to solve a real task — the most important question isn't "which model are we using?". It's "what do we surround the model with?".
And that's where Nushell comes in.
From raw text to published article with image — in one command
I talk a lot about AI solving real business problems, not just impressing in a demo. So let me show you an example from my own daily life.
Every time I write an article for docujai.com, it has to go through the same chain of small tasks: post the text to Drupal via JSON:API, generate an illustrative image, give the image the right visual expression with my logo in the corner, upload it to the article, set alt-text, patch the relationship between node and file. It doesn't take long to do manually. It takes a long time to do it every time.