RSSAmplifier

Blog

Bas Nijholt

Bas Nijholt

/RSS feed ↗96 posts

Latest posts

The last btrfs machine: migrating my PC to ZFS

My GPU machine was the last machine in my fleet still running btrfs. I bought it for gaming (which never happened), and these days its dual RTX 3090s almost exclusively run local AI models . btrfs itself never failed me. When I set up NixOS on this machine for the first time, I had read enough forum threads to become convinced that ZFS and NixOS were a troublesome combination, so I picked btrfs to…

Migrating from TrueNAS to NixOS without losing data after the build-system rug pull

TrueNAS was the last non-NixOS machine in my home lab. I kept postponing it for a simpler reason: moving something with ~100 TiB of data feels scary. My NAS holds the big ZFS pools. It has the SMB shares, NFS exports, snapshots, replication tasks, encrypted datasets, Incus state, Docker workloads, and all the boring-but-important health checks that are easy to take for granted until something…

MindRoom: AI agents that live in Matrix and work everywhere 🧠

Table of Contents 1. The problem: your AI is trapped in apps 2. What is MindRoom? 3. How it actually works 4. Building on Matrix: the good and the tricky 5. Memory that follows you 6. 100+ built-in tool integrations 7. Teams: agents that collaborate 8. Hot-reload: change config and plugins without downtime 9. Voice, scheduling, and other features 10. The obsession, the SaaS dream, and the burnout…

Auto-installing extras at runtime so users never have to think about dependencies

Table of Contents 1. From one command to a dependency maze 2. Why “just use extras” breaks down 3. The decorator 4. Checking without importing 5. The metadata bridge 6. Three environments, three strategies A) uv tool install — the persistent environment B) uvx — the ephemeral environment C) Regular virtualenv, pipx , or system install 7. Preventing infinite re-execution loops 8. What…

Parallel agentic coding made trivial with `agent-cli dev`

Table of Contents 1. The “just use worktrees” problem 2. Why parallel development matters for agentic coding 3. One command to rule them all 4. It knows your stack 5. Terminal magic 6. Spawning agents with prompts 7. Teaching Claude to spawn agents 8. My actual workflow 9. Managing environments 10. Getting started Conclusion Links 1. The “just use worktrees” problem Last…

SOTA RAG & Memory without the database: Files, Git, and simple folders

Table of Contents 1. The amnesia problem 2. Learning from failure: AI Journal 3. How I studied SOTA: clone, read, re-implement 4. The dependency problem: why ONNX over PyTorch 5. RAG: just let me grep it (kind of) The architecture: OpenAI compatibility Two-stage retrieval: the SOTA approach 6. Memory: files over databases Git integration: versioning memory 🕰️ The reconciliation loop The tiny…

I've gone full Nix: Proxmox to NixOS + Incus

I’ve gone full Nix: Proxmox to NixOS + Incus I have officially decommissioned my Proxmox cluster. After years of running my homelab on Proxmox, starting with a single NUC and expanding to a multi-node cluster, I have migrated everything to NixOS running Incus. Update 2026-06-26: This post reached the front page of Hacker News , and several readers correctly pointed out that Proxmox is not…

Automating nightly NixOS builds with a local cache server to avoid local compilation

The CUDA compilation nightmare: how I solved 18-hour builds with NixOS I recently migrated my entire fleet to NixOS (read my full migration story ). If you use NixOS on unstable and have heavy dependencies, you’ve probably faced the dreaded “compiling from source” wall. It starts innocently enough. You run nixos-rebuild switch , expecting a quick update. Suddenly, Nix decides it…

Switching from Ollama to llama-swap + llama.cpp on NixOS: the power user's choice 🦙

Table of Contents The draft I never published The original trigger: broken models The catalyst: dual GPUs and control API compatibility and the “switch” My NixOS setup Compiler flags matter What I gained (and lost) Advantages of llama-swap + llama.cpp The trade-off Conclusion: maturing as an AI hobbyist The draft I never published I started writing this blog post four months ago. Back…

Gemini 3 Pro: First Impressions

I’m a huge fan of agentic coding . I have the maximum subscriptions for both Claude and ChatGPT Pro, and since writing my agentic coding post, I mostly moved from Claude Code to Codex CLI with GPT-5 for my work that requires more complex reasoning. Using Claude Code often feels frustrating in comparison now. I also frequently pit them against each other, drafting parallel plans with each…

Using gpt-oss:20b in OpenCode with a larger context and high reasoning

I have hundreds of private journal entries stored locally, many with incorrect date formats. The correct date is in the filename, so I wanted to use an LLM to batch update them. However, I do not want to share my private journal with any third-party service. Instead, I used Ollama with gpt-oss:20b and OpenCode to do this all locally. The naive solution of just using gpt-oss:20b with Ollama’s…

Two years on the Glove80: a split ergonomic, programmable keyboard as a programmer ⌨️

Table of Contents Why I switched Split ergonomic keyboards: What makes them different? Columnar layout Vertical column‑stagger Split halves Key wells Thumb clusters Tenting Switches The first month: Comfort vs. disruption What was frustrating Practice tools that helped Programmable features that make a difference Mod-tap: One key, two functions Sticky modifiers: Tap instead of hold Layers:…

Coding from my phone 📱

I am dictating this post at ten kilometers altitude on a flight home from Mexico, Blink Shell open on my iPhone, while an agentic assistant on my NixOS machine writes an initial draft for this post. Admittedly, I’m a little addicted to agentic coding: when an idea pops up, I want to jump on it right away—even if that means doing it from a cramped seat in the sky. This is the workflow I’ve arrived…

On agentic coding 🤖

Table of Contents 1. From skepticism to productivity 2. But don’t you love programming? The power to explore The Matty story: from midnight idea to working code clip-files UI: when ideas strike at random moments The 800-rule marathon: 80 AI agents at once 1,400 commits, rewritten in minutes for $2.50 3. The two-phase AI revolution Phase 1: copy-paste era (March 2023 - July 2025) Phase 2: the…

How a 3090 turned into two local‑first AI projects 🎮

Table of Contents 1. Introduction: The Unplayed Games 2. The Rocky Road to a Working Setup 3. The First Victory: agent-cli 🐍 4. The Grand Ambition: AIBrain 🧠 5. Conclusion: The Journey Continues 1. Introduction: The Unplayed Games I’ve wanted to dabble with local AI for a long time, mainly because of the possibilities it unlocks. Local AI allows me to use all of my data—financial records,…

Confessions of an asymmetric hypocrite: on Python dependencies

Introduction: The Dependency Dilemma 🤔 I just listened to a podcast “ Build software that lasts! ” with Bert Hubert (a fellow Dutch), who prefers to reduce the number of dependencies to an absolute minimum (also see his related blog posts [ 1 ] and [ 2 ]). While I agree one shouldn’t use is-even as a dependency ( is-odd is a better choice 😏), I think there is a lot of value in…

Functions over classes? Why I prefer a simpler, functional style in Python 🐍

Over years of building software, from scientific simulation tools like Adaptive and pipefunc to package management packages like unidep , I’ve found myself preferring a certain coding style: using small, focused functions more than large classes with complex internal state and deep inheritance hierarchies. This isn’t about dogma, but about a pragmatic approach that, in my experience,…

Open-sourcing my dotfiles: a practical, cross-platform terminal setup 🏠

Introduction Many of us spend a significant amount of time in the terminal. Over the years, I’ve found that investing in a well-organized and consistent command-line environment pays dividends in productivity and, frankly, makes the daily grind more enjoyable. After refining my personal setup across more than 10 different machines – ranging from my primary MacBooks to Linux servers…

Combining Keychain and 1Password CLI for ssh-agent management

Combining Keychain and 1Password CLI for SSH Agent Management For about a decade, I’ve relied on two key tools in my development workflow: Funtoo Keychain for managing my ssh-agent and 1Password for securely storing secrets. While I used them extensively, I never actually integrated them directly for SSH key passphrase handling. I wrote about Keychain before in this post . Recently, with the…

Vibe coding worked—until the 15‑hour cleanup

I tried “vibe coding” for 3 hours, my application worked, but then I spent 15 hours fixing it That’s not an exaggeration—it’s really what happened. Recently, I tried “ Vibe coding ,” a term coined by Andrej Karpathy, a prominent AI researcher, co-founder of OpenAI, and former AI lead at Tesla. In his viral tweet from February 2025, Karpathy described vibe coding…

dotbins: managing binary tools in your dotfiles 🧰

In my previous post about terminal productivity , I shared a setup combining tools like zsh , oh-my-zsh , zsh-z , and various plugins to create a highly efficient command-line environment. While that setup served me well for years, I’ve recently encountered a challenge: incorporating modern, compiled CLI tools across all my environments without administrative privileges. Today, I’m…

My LLM workflow: local frontends, (mostly) remote models 💻

How I Use LLMs in My Daily Workflow Over the past 1.5 years, I’ve developed a workflow for integrating Large Language Models into my daily life, particularly for open source software development. I wanted to share my setup and recent discoveries that have improved my experience. Setting it up takes a little technical know-how, but once it’s up and running, using it is easy, my wife…

Interferometric single-shot parity measurement in InAs–Al hybrid devices

GPL for Python packaging ⚖️

Understanding GPL for Python Packaging Over the last 10 years–since I started working on and with open source projects–the GPL topic has frequently come up with friends and colleagues. I simply write this post as a reminder to myself and to have something concise and clear to link to later. Also, IANAL , so if you are relying on this post, please do your own research, I have included all the links…

tuitorial: terminal-based interactive code tutorials 📚

While trying to demonstrate my pipefunc package (a tool for automating computational pipelines), I hit a common presentation problem: how do you effectively walk through code without endless repetition? Traditional presentation tools like PowerPoint force you to copy-paste the same code snippets multiple times just to highlight different parts. Jupyter notebooks are great for self-paced learning…

Python environments that stuck: micromamba and uv 🐍

1. Introduction 🚀 Like many Python developers, I’ve spent considerable time trying different environment management tools to find what works best for me. After exploring various options from virtualenv to Conda, I found that Conda-based solutions fit my needs well - mainly because they handle non-Python dependencies without much hassle. While Conda itself can be slow when setting up…

Home Assistant Ecosystem 🏠

(See my intro post ) There are not enough days in this advent calendar to highlight all my projects. So today is a collection of IoT/Home Assistant-related packages. Each has its own story. 📖 Origin Stories & Technical Details My Home Assistant obsession began as described in Day 10 . Many projects emerged from this hobby: aiokef : To control my KEF speakers, I reverse-engineered network traffic…

pfapack 🔢

(See my intro post ) Ever needed to calculate the square root of the determinant of a skew-symmetric matrix? Probably not, but if you’re in quantum physics, you might have! This is called the Pfaffian. Today’s project, pfapack , is a Python package that provides efficient routines for computing it. The underlying algorithms and original code implementations were developed by my PhD…

tiller-streamlit 💰

(See my intro post ) Tracking personal finances is crucial, especially when working towards financial independence (see my WenFIRE post on Day 4 ). Today’s project is tiller-streamlit , a Streamlit app that visualizes your financial data from Tiller . I host it on my local network under money.local using Traefik for easy access. 📖 Origin Story Used to use Intuit Mint, but when they shut…

Interactive Graph Visualization 🕸️

(See my intro post ) After creating pipefunc (Day 20) , I wanted a way to visualize its (possibly large and complex) computational graphs interactively in Jupyter notebooks. What started as a simple visualization PR evolved into two standalone packages: graphviz-anywidget (Python) and graphvizsvg (JavaScript) - which unexpectedly introduced me to JavaScript development! 📖 Origin Story While…

pipefunc 🕸️

(See my intro post ) Of all the projects I’m sharing this month, this one that started as a passion project excites me the most! 📖 Origin Story Sometimes the best projects are born from the most unexpected moments. More than 1½ year ago, while on parental leave with my twin boys, I found myself with small pockets of time during naps to work on a problem that had been bothering me for years:…

fileup 📤

(See my intro post ) Sometimes the best tools are the ones you build for yourself and keep using for years. Today’s project is fileup , a tiny command-line utility that’s been making my life easier for 7 years - because sharing files shouldn’t require leaving the terminal! 📖 Origin Story Back in 2017, I found myself repeatedly going through the same tedious process: needing to…

Psychedelic Data Science 🍄

(See my intro post ) 📝 Note: Running out of awesome projects and I want to save the best for last, so today just something fun. While preparing for this advent calendar, I browsed through my 382 GitHub repositories and rediscovered this time capsule from 8 years ago. It explores the language of psychedelic experiences through data science - with an interesting hypothesis: do psychedelic…

Adaptive Scheduler 🚀

(See my intro post ) Ever tried to efficiently run 100,000 cores from a Jupyter notebook? No? Well, I have, and it led to some interesting discoveries about the limits of parallel computing tools. 📖 Origin Story During my 2018 internship at Microsoft Quantum, we faced a unique challenge: our adaptive sampling algorithms needed to run on massive computing clusters (50,000+ cores), but existing…

Adaptive 📈

(See my intro post ) During my PhD, I was running quantum transport simulations on our 800-core computational cluster. Traditional parameter sweeps using dense grids were hitting the cluster’s limits - wasting precious compute time on uninteresting regions while potentially missing important features. Most parameter spaces we explored were “boring” with occasional interesting…

clip-files 📋

(See my intro post ) Sometimes the most useful tools are born from daily frustrations. When working with AI assistants like ChatGPT or Claude, I found myself constantly copying files to share context. After doing this manually dozens of times, I created a tool to automate it. 📖 Origin Story While contributing to open source, I frequently like to share entire (or large parts of) codebases with AI…

PhD Thesis Cover Design 🎨

(See my intro post ) When most people think of open source, they think of software. But what about open-sourcing your PhD thesis and creating a generative art system for its cover? 📖 Origin Story With my PhD defense approaching and needing around 100 copies of my thesis, I faced a design challenge. As someone more comfortable with Python than Photoshop, I turned what started as a simple…

UniDep 🧬

(See my intro post ) Ever tried to set up a Python project that needs both pip and conda packages? Then you know the pain of maintaining multiple requirement files. UniDep was born from years of frustration with this exact problem. 📖 Origin Story While working on large monorepos with hundreds of dependencies, I kept running into the same issue: maintaining separate files for conda (…

instacron 📸

(See my intro post ) Ever found yourself with beautiful photos but too lazy to post them? Instead of changing my habits, I did what any developer would do: spent way more time automating the process than it would have taken to post manually. 📖 Origin Story Back in 2017, I had hundreds of landscape photos from traveling through South America that I wanted to share on Instagram. The solution? Write…

conda-forge Contributions 🐍

(See my intro post ) Unlike other projects in this advent calendar, I want to celebrate being part of something much bigger: the conda-forge community, where thousands of volunteers maintain the packages that power scientific Python. 📖 Origin Story I started with conda-forge in 2016 during my PhD work with Kwant, a quantum transport simulator. Installing it was a nightmare - it required…

Home Assistant Config 🏠

(See my intro post ) Funny how things work out - initially, I didn’t care for home automation at all. But when in 2020 I discovered Home Assistant was written in Python, my favorite programming language, I suddenly found a new hobby. Over the years, I’ve built a comprehensive setup with over 137 automations (and counting!). These automations are triggered by everything from simple…

yaml2bib 📚

(See my intro post ) Every academic writing in LaTeX knows the pain: managing BibTeX files with hundreds of citations, each potentially formatted slightly differently, with inconsistent journal abbreviations, and duplicated entries across chapters. While procrastinating on writing my PhD thesis, I became obsessed with solving this universal academic headache. 📖 Origin Story When writing a PhD…

Home Assistant Stream Deck YAML 🎮

(See my intro post ) What started as a personal hack to control my home (temperature, lights, TV, music) with a gifted Stream Deck evolved into something bigger. This project became my first real exploration of AI-assisted development, showing me how much faster I could work with AI as a tool. With 250+ stars and 9 contributors adding significant features, it’s grown beyond my initial…

numthreads 🧵

(See my intro post ) Sometimes the smallest tools solve the most persistent problems. Today’s project is about taming automatic parallelization in scientific computing - a deceptively simple challenge that has cost countless CPU hours. 📖 Origin Story While working on high-performance computing clusters, I frequently encountered a counterintuitive problem: code running slower on multiple CPU…

Open Science Publications 🔬

(See my intro post ) Today’s post is about something I have strong opinions on: making scientific research reproducible. While many researchers talk about open science, actually making your work reproducible for anyone requires significant effort. 📖 Origin Story During my Ph.D. and subsequent research, I noticed a frustrating pattern in scientific publications: claims of “code…

markdown-code-runner 📝

(See my intro post ) Documentation should be as close to the code as possible - that’s the principle of “information locality.” But how do you keep code examples and their outputs in sync? Enter markdown-code-runner, a tool that executes code blocks within Markdown files and updates their output in-place! 📖 Origin Story While maintaining various open source and work projects, I…

WenFire: When Could I retire?! 🔥

(See my intro post ) While I absolutely love my job, I believe I’ll love it even more when my family’s livelihood doesn’t depend on it. That’s the dream of financial independence - doing what you love because you want to, not because you have to. This led me to create WenFire , a financial independence calculator that helps answer the eternal questions: “When can I…

rsync-time-machine.py 🕒

(See my intro post ) Sometimes the best open source projects start with “I can do better than this.” That’s exactly what happened when I looked at laurent22/rsync-time-backup , a popular 600-line Bash script for Time Machine-style backups. While it worked, it had known bugs and was tricky to maintain due to Bash’s limitations. It also lacked tests, type hints (bash…

Adaptive Lighting 💡

(See my intro post ) Unlike yesterday’s Calendar of Life project, today we’re looking at one of my most popular contributions. It’s one of several Home Assistant and home automation related projects ( Day 8 , Day 10 , Day 24 ) I’ll be sharing this month. While my coding journey started in scientific computing with physics simulations, discovering how to control my home…

Calendar of Life 📅

(See my intro post .) Visualizing the finite weeks of our lives, because apparently, I needed another reminder of my mortality! 📖 Origin Story You know how sometimes you’re just casually browsing the internet, not looking to have an existential crisis? Well, that’s exactly what happened when I stumbled upon Tim Urban’s Wait But Why post “Your Life in Weeks” and saw…