A Fyne tribute to UpDown Meter
I am proud to release Fyne UpDown: an open source network traffic monitor that is written in Go and built on top of the Fyne toolkit. It lives in the system tray and shows two animated meters for download and upload speed, just like UpDown Meter by ScriptFUSION does. I have always liked that little Windows tool. Back in the 90s I used DU Meter by Hagel Technologies to watch my dial-up connection. It showed the download and upload speed in a small graph, so you could see if your modem was busy. UpDown Meter brought that idea to the tray icon and Fyne UpDown continues that tradition. ...
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. ...