Blog
Notes from the work — platform engineering, CI/CD migrations, multi-cloud, AI agents, and whatever NixOS rabbit hole I'm down this week.
-
Factories, bridges, and a fleet that heals itself
A roundup of what I've been building lately — a four-product governed pipeline for AI software delivery, a review-first Azure DevOps → GitHub Actions migrator, self-healing for Linux fleets, and an Android...
-
Leaving GNOME 50 for niri, Noctalia, and labwc
GNOME 50 spent a few weeks falling apart on my machines, so I rebuilt the desktop around niri, Noctalia, and labwc — and ended up doing far more with far less effort....
-
Letting VS Code into CFactory — the right way, not the easy way
My editor extension couldn't connect to the hosted CFactory cockpit. The fix looked like a one-liner and turned into a proper investigation: reading the extension's own code, untangling an SSO proxy, building...
-
Tidying Neovim for a Claude-and-Ollama stack
I pulled Codeium and Mason out of my Neovim, wired in local Ollama completion, and fixed a read-only-store bug that had been quietly failing every Lazy sync. Notes on making nvim behave...
-
Cleaning out my zsh: bye oh-my-zsh, bye zplug
My shell had quietly accreted two framework managers it didn't need. Ripping out oh-my-zsh and zplug took startup from ~660ms to ~360ms — and surfaced a couple of errors they'd been politely...
-
Introducing Muninn: A Retro-Premium GitHub Portal and Browser Agent Hub
Why I built Muninn—a zero-backend, retro-premium Gruvbox dashboard that consolidates my GitHub repositories, actions, issues, and security alerts, while acting as a secure playground for local AI browser agents.
-
Making the CFactory cockpit live (and honest)
A day on CFactory — the cockpit over my planner/coder/tester agent pipeline. Killed a production 500, stopped the dashboard lying about what's running, and made it update itself with notifications instead of...
-
Cloudflare Tunnel, not Tailscale, behind Starlink CGNAT
Three Tailscale-shaped approaches that didn't survive contact with reality, and the Cloudflare Tunnel architecture that finally did. A story about CGNAT, sidecar fragility, and what "right answer for most cases" actually means....
-
Backstage portal: how the freundcloud home lab now sees itself
Four phases in one evening: a Gruvbox theme, wiring eight dormant GitHub plugins, GitLab parity, and real-time webhooks through a Tailscale Funnel. What worked, what fought back, and how the home lab...
-
Backstage the NixOS way: a portal for 71 repos, declared
I installed Spotify's Backstage on p510 yesterday. The interesting bit isn't that it works — Backstage works fine anywhere — it's that the whole thing is one PR in `nixos_config`, every secret...
-
One-button meetings: record, transcribe, summarize, done
Press a key, have your meeting, press the key again. Five minutes later a markdown brief lands on disk with TL;DR, action items, decisions, and the full diarized transcript — all produced...
-
Voice into the prompt: Groq, ydotool, and seven PRs
I wanted to talk to Claude Code instead of typing. Took seven PRs, two dead protocols, and one stale dconf key — but pressing a hotkey and watching the transcript appear in...
-
One model can't do everything
Why no single LLM is the right tool for every phase of a job, how AIFactory routes plan/code/QA across different models and providers — Claude, local Ollama, Bedrock, Gemini — and how...
-
Building SkillAi: CV keyword-match is a lie
Someone asked me to help with hiring, so naturally I built a platform instead. Here's why today's recruiting is mostly theatre, what SkillAi does about it, and the architecture choices I'm proudest...
-
Two weeks of SARC: wiring ServiceNow into three CI platforms
SARC is a reference platform for compliance-pipeline delivery — ServiceNow as control plane, Kosli as attestation data plane, the same flow running across GitLab, GitHub and Azure DevOps onto four clouds. Two...
-
Of Claude and chores
How I keep claude-code and claude-desktop fresh on NixOS today (custom derivations + hourly GitHub Actions watchers + an /update-claude-code skill), and how I'm going to close the loop with a scheduled...
-
A Telegram bot for the media stack
Bolted a Telegram bot onto the home media stack today — menu commands plus local-Ollama natural language plus inline-action notifications. Here's what shipped, why I didn't reach for Claude on the cloud...
-
Hello from a terminal-green corner of the internet
Why I finally gave the site a blog, what I plan to write about, and how the whole thing is held together with Jekyll and GitHub Pages.