freundcloud

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.