MacOS support in Fyne Mines (and Tunnel Launcher)
Both Fyne Mines and Tunnel Launcher are written in Go on top of the Fyne toolkit, and both shipped Linux and Windows binaries only. Fyne can target MacOS, but I don’t own a Mac and I don’t like shipping a binary that I’m not able to run myself. In this post I explain how I solved this dilemma. A MacOS VM on a Linux box OSX-KVM runs MacOS under KVM, and my workstation has enough capacity to run some virtual machines. The repo ships shell scripts around qemu, but my other VMs live in libvirt, so I wrote a MacOS.xml domain based on the Catalina template in the repo. Three things in it are not obvious. ...
The Grokathon: tidying code, together
In my previous post I argued that the human code review has become the bottleneck in our software delivery process, and that most of what a review used to buy us no longer fits in a diff. But if we stop reading every generated line, when does a human ever look at this code, and what should they be doing when they do? Somebody still has to understand that code. It was written fast, it passes a demo, and nobody on the team can explain it. Before anyone is willing to put it on production, it needs a review and often by two people. Letting others review code that AI wrote for you is not a good experience, as you may have noticed. ...
Code review is the new bottleneck
I was watching the (well made) video “Can We Trust AI to Code Without Human Oversight?” by Sam Newman on the Modern Software Engineering channel (recommended watch). He asks how much attention we still need to give to the code our agents write and concludes that the human code review may be the bottleneck in our delivery process. I think he is right about the bottleneck, but I don’t think “stop reviewing” is the lesson. We still open pull requests and still ask a colleague for approval, even though no human wrote that code and no human will maintain it. That is worth questioning, so let’s look at the numbers. ...
PathQL server: safe SQL to JSON
In an earlier post I introduced PathQL: write a SQL query, get nested JSON back, with the structure inferred from table aliases and foreign keys. That post ended with a one-liner: “You may even want to set up a PathQL server.” This is the follow-up about that server, because the moment you turn PathQL into an HTTP endpoint you run into an uncomfortable question. A PathQL server accepts arbitrary SQL. That is the whole point: the caller sends SQL, the server runs it and shapes the result. But if you put that on a network with a single shared connection and no guards, you have handed the world a SQL console. It turned out that shaping SQL results in nested JSON was the easy part. The hard part was properly limiting the SQL you are allowed to execute. ...
DBML Tools VSCode extension with Go LSP server
A while ago I wrote about dbml-tools, a Go CLI for converting between live databases, DBML, SQL, and Graphviz diagrams. The CLI works fine in a terminal, but the moment you start editing DBML files by hand you want the usual editor niceties: red squiggles when you mistype a column, jump-to-definition on a foreign key, rename a table without hunting through references. That is what the DBML Tools VSCode extension delivers. ...
PuzzleHike.app v1 released!
I am happy to announce that PuzzleHike.app has reached its first stable release. PuzzleHike is a web application for organizing and walking puzzle hikes, where each waypoint on the route asks you a question and the answer unlocks the next leg of the walk. Think of it as GeoCaching, but everything is virtual. There is no plastic box hidden under a rock, no logbook, and no muggles to worry about. The puzzles live on your phone and the location checks happen against the GPS coordinates of the waypoints. ...
Tunnel Launcher puts your SSH tunnels in the tray
I am proud to release Tunnel Launcher: an open source GUI for managing SSH tunnels that is written in Go and built on top of the Fyne toolkit. It lives in the system tray, lists each configured tunnel with a click-to-toggle status icon, and reads your existing ~/.ssh/config so HostName, User, Port, IdentityFile and ProxyJump just work. Although the application has the potential to run on many platforms it is currently only tested under Debian (based) Linux and Windows 11. For a MacOS release I may need your help. ...
Local voice generation for telephony with Piper
I just published a Piper Voices TTS installer script, it turns a Linux machine into a local and offline voice generator for phone systems. It downloads the rhasspy/piper neural TTS binary and a set of pre-selected voices (120 MB each), then renders each test phrase twice. Once as a regular WAV file, and once as an 8kHz mono μ-law file that you can drop straight into a SIP PBX’s audio directory. No cloud accounts, no API keys, no per-character billing. ...
Reclaim used Yealink phones with multicast PnP
Yealink desk phones are everywhere on the second-hand market. Operators retire them in batches, resellers list them by the pallet, and they show up on Marktplaats and eBay for a fraction of the new price. The catch is that a lot of those phones are still administratively “owned” by the previous operator, even after a factory reset. In this post I will explain how I’ve put my own configuration on a set of phones that I bought, without asking Yealink (or the previous owner’s reseller) for permission. This post explains why that is harder than it sounds, and how multicast SIP PnP lets you do it anyway. ...
DBML: database schemas in plain text for genAI
Generative AI works best when everything is plain text. Code, configuration, documentation, data, the more you can represent as readable text files, the more effectively an AI agent can reason about it and transform it. Database schemas are no exception. You can dump a schema as SQL DDL and hand it to your AI agent, and that works. But SQL DDL is imperative and verbose; it tells you how to create tables, not what the schema looks like. DBML (Database Markup Language) takes a different approach: it is a clean, declarative, database-agnostic language for defining schemas that both humans and AI can read and work with comfortably. ...