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…
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…
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…
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.…
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…
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…
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…
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…
I have written a command-line tool in Go called github-export that exports all GitHub issues, pull requests, releases, labels, and milestones from a repository into a local folder as plain markdown files. What makes it different from existing tools is that it syncs incrementally and generates event files that an AI agent (like Claude Code) can pick up and act on. This lets me maintain my…
For years we have been told that speed is everything. That shipping faster is the only metric that matters. We are being told that the backlog is dead, that human bandwidth is a bottleneck, and that the future belongs to whoever presses the AI’s generate button hardest. We reject this. Not because we fear change, but because we have used these tools, and we have seen what happens when people…
SQL gives us rows and columns, while APIs usually need nested JSON. That mismatch is small, but it creates a lot of repetitive code. Most backends choose one of two strategies: use a join and transform the resulting rows into nested JSON, or run multiple queries (often one per table) and then match each result set back to its parent. That code is not hard, but it is everywhere. And as Robert C.…
I wrote phpfilemerger, a small CLI tool that takes a PHP entry point and all of its class dependencies and produces a single self-contained PHP file. It uses an AST parser to resolve dependencies properly, so the output is ordered and ready to run. Use case: PHP-CRUD-API I maintain a PHP project that is distributes as a single file ( PHP-CRUD-API ) and phpfilemerger automates the process of…
I’ve built TQDBProxy to handle heavy read loads by caching SELECT queries with a TTL hint. The proxy worked well for reads. Each application server could keep a local cache and avoid trips to the database. The cache reduced pressure on primary databases and gave predictable latency under heavy read traffic. But what if not the reads, but the writes are the bottleneck? Each small insert or…
I recently evaluated the Cytrence Kiwi Plus, a USB KVM solution that enables remote access to machines via HDMI and USB. The product was provided for free for evaluation. It retails for around 100 dollars. In the past 6 weeks, I’ve tested it daily (every evening) with two real-world scenarios: Linux controlling Mac and Linux controlling Windows. In this blog I will share my extensive…
Recently Patrick Akil (of Beyond Coding) interviewed legendary architect Gregor Hohpe, author of “Enterprise Integration Patterns” and former architect at Google Cloud and AWS. What follows is a masterclass in thoughtful questioning and profound answers. I highly recommend you to watch it. This post lists the top 3 take-aways. 1. The Art of Amplification Patrick’s pointed…
In software engineering, thinking is the expensive part. It always has been. Writing code? That’s the cheap bit. Typing fast is great, but don’t let that speed fool you. Here’s something to remember: code is read many times but written only once (ref: Robert C. Martin). The real cost comes later, when you have to fix bad design. That’s when you pay, and you pay a lot. The real work is in the…
There are excellent database proxies out there. pgpool-II, MaxScale, and ProxySQL are battle-tested, feature-rich, and used in production by thousands of companies. I’ve built TQDBProxy as a learning project to explore a different approach: what if caching decisions lived in the application code itself? Custom client libraries for PHP, TypeScript, and Go allow you to (optionally) specify a…
I have built TQMemory as a high-performance, in-memory cache that can be used as a drop-in replacement for Memcached. It uses the same CLI flags, speaks the same protocol, and under some conditions it exceeds Memcached performance. When used as a Go package, it circumvents network, and can handle over 2.5 million GET requests per second (about 9x faster than Memcached over sockets). See:…
I have built TQCache as a fast and simple key-value store that can be used as a drop-in replacement for Memcached or as an alternative to Redis. While surely not as mature, it does offer a specific set of trade-offs that may interest you. It is designed for workloads where both memory efficiency and persistence are priorities, such as session storage. See: https://github.com/mevdschee/tqcache What…
PHP has built-in templating, but mixing PHP and HTML gets messy quickly. Separate template engines like Twig or Smarty add dependencies and complexity. I wanted a small implementation with Jinja-like syntax that’s easy to understand and modify. So I wrote MintyPHP Template. It allows you to write things like: <h1> {{ title }} </h1> {% if user.is_admin %} <span class="badge">Admin</span> {%…
Managing translations for multilingual software can be tedious. You maintain a POT template with all your strings, and then need to keep multiple (gettext) PO files synchronized and translated. I wrote a small command-line tool in Go called “potranslate” to automate the translation part using Google Translate. Use it from the command line: # Scans for default.pot and PO files in…
There’s an old saying: “A craftsman is only as good as their mastery of their tools.” Carpenters master their saws and chisels, surgeons master their scalpels, and software engineers master their IDEs, languages, and frameworks. Today, AI coding assistants are our newest tools. The question is: do you know how to master them? The AI revolution has levels We’ve moved through…
When building BigQuery applications using the Go SDK you may allow users to select tables or datasets dynamically. This means you need to include user-specified identifiers in your SQL queries. I was surprised that the BigQuery manual and code examples do not warn about SQL injection vulnerabilities when doing this. Even more surprising: BigQuery does not provide a built-in mechanism to safely…
I recently upgraded the webcam of my main Linux machine from an Ankerwork C200 (2k webcam) to an Ankerwork C310 (4k webcam). The C200 worked pretty well out of the box without having to update firmware or adjust settings in Windows or on MacOS. Unfortunately the C310 was showing a very overexposed picture that was only fixed by moving my face out of the center of the (captured) image. This led me…
You can view a PDF in your browser, Firefox does this fast and accurately, no need for Adobe Reader. But even if you want to edit a PDF, you don’t need Adobe Acrobat. On Linux we can install PDF toolkit with a single “sudo apt install pdftk”. But even on Windows there are some good PDF tools available, like PDF24, which even costs nothing. With PDF24 you can do all of the…
USB-Soft-KVM is a lightweight Linux solution that turns a simple USB switch into a full-featured KVM solution. By combining an inexpensive USB switch with software-based monitor switching via DDC/CI, you get complete keyboard-video-mouse control on a budget. This software solution automatically switches your monitor’s input source using DDC/CI commands over the I2C bus whenever you toggle…
In 2016 I wrote “My name is Maurits van der Schee and I love thinking about software architecture and building high traffic web applications” in my first TQdev.com post when I migrated from WordPress to a self-written PHP blog platform. I wrote “I love the idea of gradually (while writing posts) making this blogging software feature complete”. It was an experiment that…
I am still building a free email service that respects privacy and prevents profiling on 103mail.com . I started this effort in 2024 and have been building slowly since (because work and life happens). I have reached a new milestone and it is thanks to SDD (Spec Driven Development with SpecKit) and AI (VSCode + Copilot + Claude Sonnet 4.5) that I have made good progress lately. In this post…
Testing code that relies on static methods or built-in functions can be challenging in PHP. Traditionally, you’d have to refactor your code to inject dependencies or wrap functions in testable interfaces. To allow you to write clean, maintainable tests without invasive refactors, I created MintyPHP Mocking. It allows you to write things like: $mock = new StaticMethodMock ( Adder :: class ,…
Openterface, Cytrence and Sipeed make a KVM over USB product. I have bought the cheapest one: the Sipeed NanoKVM-USB at about EUR 60 (available on Amazon) which includes all nessecary cables. I love the product as it allows me to do repairs and upgrades on any laptop or desktop PC I put on my desk, without having to connect a second monitor keyboard and mouse. Data-center usage This device may not…
We stand at the threshold of a new era in software engineering. We’ve waited decades for intelligent assistants that understand code, context, and intent and now they have finally arrived. Yet too many developers hesitate, bound by outdated notions of what “real” programming means. This manifesto rejects that hesitation. We believe that embracing AI is not about replacing human…
When you buy a Windows PC it often comes bundled with a lot of software that you do NOT want. To remove this unwanted software it is recommended to do a “clean install” of Windows 11. When copying the install disk (Windows 11 ISO) to a bootable USB drive you may run into the problem that you can’t copy the “install.wim” file. This post has a solution to that problem.
Windows 11 has poor privacy and features like Recall show how bad things have gotten. Microsoft Office is pushing OneDrive a little too hard and has poor compatibility between different Office versions. This would drive people to Linux and LibreOffice if it weren’t for the ridiculous low prices of Microsoft’s digital licenses. This is what I am talking about: Microsoft Office 2024…
Windows 10 will be EOL (End-Of-Life) in exactly one month on October 14th. Microsoft says you need a modern PC with TPM chip to run Windows 11, but this is not true. In this post I’ll explain how to upgrade to Windows 11 without a TPM chip (or any other hardware requirement) using Rufus. As a bonus I’ll help you setup Windows 11 in a more privacy friendly way using the “O&O…
LibreWolf is a custom and independent version of Firefox, with the primary goals of privacy, security and user freedom. LibreWolf is designed to increase protection against tracking and fingerprinting techniques, while also including a few security improvements. This is achieved through our privacy and security oriented settings and patches. LibreWolf also aims to remove all the telemetry, data…
I often choose Linux Mint XFCE when I need a good looking and comfortable system quick. But sometimes I’d rather have a more stable system and match what I have on the server, which is Debian 13. Unfortunately Debian with XFCE doesn’t look as good as Linux Mint with XFCE. In this post I’ll explain what you can do to make Debian with XFCE look like Linux Mint XFCE.
Today I am celebrating the 9 years that the TQdev.com blog exists. In this period I have written 237 blog posts on various software development related topics. Best visited post is now “ LUKS with USB unlock ” with more than 42 thousand visitors. Below you find the visitors of the blog per month. Visitors graph The graph below is a (copy of) a server side generated SVG document from…
I’ve got a ADATA SX8200PNP (XPG SX8200 Pro PCIe Gen3x4 M.2 2280 2TB NMVe) and it is not as performant as I would like. I’ve found this out by running a simple I/O ping test (using the “ioping” tool). In this post I’ll explain how you can do this test to see whether or not you are affected as well and what you can do to make your SSD 5-10x more responsive.
Linux Mint can be installed on an external SSD. Simply boot from this SSD on any other machine and it just works! You can easily buy a fast, large and durable external SSD nowadays. Unfortunately installing Linux Mint on a an external SSD is not so straightforward due to a bug in the installer. In this post I’ll explain you how to work around this bug in the installer of Linux Mint, my…
As an IT professional, I often work on remote consoles, especially during installations or troubleshooting. Once SSH is set up, copying and pasting text is easy. However, to gain access initially, I need to enter my public key on the remote machine. Sometimes this has to be done through a VNC console, or even a Java or Spice console window. While modern ed25519 public keys are only about 50…
The Monty Hall problem is a probability puzzle. It has no logical contradiction, but for many people the result goes against their intuition. The problem originates from the American television game show “Let’s Make a Deal”. It is named after its original host, Monty Hall. The problem is stated as: Suppose you’re on a game show, and you’re given the choice of three…
I just published Fyne Authenticator: an open source TOTP soft token implementation that is written in Go and uses Zbar for QR scanning. On desktop it lives in the system tray and it uses the keyring to store the encryption password for a seamless experience. Although the application has the potential to run on many platforms it is currently only tested under Debian (based) Linux. For a Windows,…
Forms play an important role in business software. Business software typically loads data from a relational database into a form, allows users to change the data and then saves the data from the form back into the database. If you make a lot of business software you have to create and design a lot of forms. To allow you to create nice looking forms (using Bulma for instance) without having to type…
Ubuntu 20.04 is EOL at the end of next month, so it’s time to reinstall all your old web servers with Debian 12. Today I’ll share a post with all the configuration that I apply on my web servers. While you could apply these with Chef, Ansible or SaltStack (like a real pro), you can also type them in, like I often do. I’m using Debian 12 netinst and configure “SSH…
A while ago I told you about the free email service I’m building that respects privacy and prevents profiling on 103mail.com . The reason? Microsoft and Google operate most of the world’s email services and because email messages often contain all previous content, they can profile all people in the world (even people that do not use their services). When using 103mail.com the email…
I don’t like laptops. They are slow, have small screens and horrible keyboards and track pads. When I have to work on them for a longer period of time my back starts to ache. Next to that they often can’t be upgraded or repaired, because the storage and memory are soldered or glued onto the motherboard. And when you want to run Linux you are often disappointed by the (unsupported)…
You can store PHP sessions in Memcache or Redis. High traffic websites with multiple application nodes choose either sticky sessions with file session storage (recommended) or centralized Memcache or Redis session storage. If you choose Memcache or Redis you should NOT rely on your favorite framework’s implementation (see: “A session locking test suite for PHP” ). But even if you…
Memcache is a very fast cache that is a great addition to MariaDB and PHP. It is simpler and more performant than Redis. I prefer Redis for session storage and Memcache for application caching in my (high-performance) PHP projects. Installing Memcache is very easy (on any Debian based Linux), all you have to do is type: sudo apt install memcached In order to allow PHP to talk to Memcache you need…
GopherCon Europe is a well known Go conference. We are listing the GopherCon Europe 2023 and 2024 conference videos. The videos are posted on the GopherCon Europe Youtube channel and are linked below. GopherCon Europe 2024 Martin Gallauner - From Java to Go: I Have a Hammer and See Nails Everywhere (16:54) Robert Laszczak - Rethinking Domain-Driven Design in Go (28:41) Raghav Roy - Using Formal…
I often choose Linux Mint XFCE when I need a good looking and comfortable system quick. But sometimes I’d rather have a more stable system and match what I have on the server, which is Debian 12 with XFCE. Unfortunately Debian with XFCE doesn’t look as good as Mint with XFCE. In this post I’ll explain what you can do to make Debian look like Mint/Xubuntu and suitable for everyday…