AI that writes code is old news. This is what it does for me once that code has to drive real electronics: firmware, testing over USB, parts and schematics, measurements and old hardware, and where it still needs a human with a multimeter.
Four open-air tests to pick an igniter charge for the I400: 2 g and 3 g of zinc-sulphur, and 2 g and 3 g of CuO-Al thermite. The thermite won, and it goes into the next static test.
My own reloadable 42 mm I-class rocket motor on home-made RNX-71V epoxy propellant: the design numbers, the hardware, how the grains are cast, and what the first static test showed.
Flying the same PML Intruder on a J motor for my Tripoli Level 2 certification in September 2026, now with dual deployment and a camera section, and comparing the flight with the simulation.
A Python data logger for static motor tests on an old NI USB-6009: thrust, chamber pressure, break wires and igniter current, in the order a test day runs. Successor to my 2008 and 2010 test electronics.
Verba, a Latin vocabulary trainer for my son’s 1051 words, in a single HTML file that runs from a USB stick without a network. How the word list was built and how the learning engine works.
How the wireless launch controller works inside: the functional design, firmware architecture, the full list of safety measures, the encrypted radio protocol, sensing and how it was tested.
A two-unit wireless rocket launch controller for VRO, built on ESP32-S3s with an encrypted radio link, and the case for why done properly it is safer than a long firing cable.
A Fri3d Camp 2026 badge app that tells you when your friends are nearby over Bluetooth, swaps contact details with a button press and is set up from a phone. It also has a camp-wide game of Gotcha.
A complete ESPHome configuration for the Fri3d Camp 2024 badge, so it shows up in Home Assistant with its motion sensor, LEDs, display and battery. Covers the driver choices that were needed.
A hands-on guide to writing your own apps for the Fri3d Camp 2024 badge with Claude Code: backing it up, the firmware model, MicroPython and a real app with the fri3d framework.
Building a Dutch word clock from the DJO Amersfoort design, with a few changes of my own to the case, and tracking down why it showed the wrong time after it was finished.
An attempt to read a Platinum 3100S solar inverter directly over its proprietary RS485 protocol with an ESP32. It has not cracked yet, so the full dataset is published for anyone who wants a go.
Predicting where a weather balloon’s radiosonde will land from its own radio telemetry alone, testing it on a real flight, and backtesting it against years of launches from Uccle.
An encrypted offsite backup on a Raspberry Pi at a relative’s house, reached over Tailscale, whose LUKS key never leaves home. Covers the threat model, the boot unlock and a dead-man’s switch.
An ESP32-C3 that controls a RunCam Thumb over its serial protocol: start recording the moment power arrives, and check and control the camera from a web page on its own Wi-Fi access point.
Keeping the Belgian capacity tariff down with three Marstek Venus E batteries and Home Assistant: how the kwartierpiek is billed, the settings that matter and two traps I nearly fell into.
Getting a second-hand Solar-Log 500 to read my Platinum 3100S solar inverter over RS485 and feed its production into Home Assistant. The wiring polarity and the firmware were the real obstacles.
Turning an ESP32 Cheap Yellow Display into a desk panel with ESPHome that shows the house’s power use and opens the door or garage with a tap. Four gotchas along the way.
Home Assistant sensors for the five-hour and weekly usage limits of my Claude and z.ai coding plans, including reverse-engineering the z.ai API and a dashboard.
Keeping Claude Code’s settings, skills and project context in sync between a desktop and a laptop with a Synology NAS, symlinks and Syncthing, plus split changelogs.
Building a TiltBox, a small wooden game console with an 8x8 LED matrix that you play by tilting it. ESP32-C3, an ADXL345 accelerometer, a home-made front panel and a few contributions back to the project.
Why I moved from pasting into ChatGPT to an AI toolkit that does the work: Claude Code in the terminal, cheaper GLM models from z.ai, plan and API pricing compared, and a switcher between backends.
Seven screens across three computers on one desk, controlled with a single keyboard and mouse through InputLeap. The layout, a custom monitor stand and the cable management.
A Docker container on an RTX 3090 that transcribes audio locally with Whisper, labels who said what, fixes names with an LLM pass and can write a summary. No audio leaves the machine.
How labelling my parts storage grew from round Herma stickers to a Dymo LabelWriter driven by a LibreOffice spreadsheet and macro, including a long fight with label orientation.
The Claude Code setup I settled on after months of daily use: a dedicated machine, config synced across computers, a model selector for three backends, session recording and a custom status bar.
The backup system for my homelab server, triggered by a failing disk: Borg with encrypted repositories, a local disk, a NAS mirror and an offsite Raspberry Pi, with retention and alerts.
Building and flying a PML Intruder for my Tripoli Level 1 certification at Exloo in March 2026: the build, the simulation, the recovery and what the flight log really shows.
The hardware and software behind running 32B language models at home: why VRAM decides everything, the full build, Ollama, tuning from 5 to 35 tokens per second, and how well it actually works.
How Claude Code brought this site back after eleven quiet years: moving from Nanoc to Hugo and Blowfish, migrating every post, keeping old URLs working, and deploying.
Bed buttons and wake-up lights for the kids, driven by VSCP: the lights turn green at a set time on weekdays and later at the weekend. The decision matrix rows that make it work.
Firmware v1.20 for the Mespelare node adds the Control TurnOn and TurnOff actions, needed for the kids’ bed buttons and lights. Shows where the new code hooks into the decision matrix.
Adding computer control to a Ham IV antenna rotator for satellite tracking, using K3NG’s rotator code on an Arduino Pro Micro with an LCD, and calibrating the heading.
Sending VSCP events at set times from the daemon’s decision matrix, for example to turn off every light that was left on at night. Each field of the DM row explained.
A charger that tops up five single-cell LiPo or Li-ion batteries at once from one 6 to 20 V supply, built around Microchip’s MCP73831 charge controller. Schematic and board included.
Switching lights on the VSCP bus from a web page, with buttons and status indicators that talk to the VSCP daemon over websockets. Includes the decision matrix and daemon configuration.
My checklist for configuring each Mespelare node as it goes into the house: loading the register template, mapping inputs to outputs and setting the LED and output control registers.
Replacing the broken pull cord on a Yamaha 9.5A outboard, including how to handle the recoil spring safely. Documented in reverse order of disassembly.
An automatic fertiliser doser for the aquarium, made from a 230 V mechanical timer whose slow geared motor turned out to be just right for driving a syringe.
Feeding the plants in my indigenous aquarium with the Estimative Index: dosing macro and micro nutrients on a schedule instead of measuring them with test kits.
Switching the Hasselt VSCP firmware from its non-standard 250 kbps CAN bus speed back to the 125 kbps everyone else uses. A small register change in vscp18f_init().
Making a Mespelare VSCP node switch its own relays from its own buttons, so the lights keep working when the bus is down. Covers the code hook, a configurable output mapping and output modes.
Changing the Hasselt firmware’s Timer0 tick from 10 ms to 1 ms for the Mespelare node, and updating the code that relied on the old period. Includes a scope capture of the result.
Turning a domestic oven into a PCB reflow oven with the Hobbybotics reflow controller firmware: PID temperature control, solder profiles, a display and a PC application.
A walk through the structure of a VSCP Module Description File, from the XML header and module information to the registers, using the Mespelare module’s own MDF as the example.
A Siemens condenser dryer kept reporting a full water tray when it was empty. A very thorough clean fixed it, at a fraction of the repair quote. Photos of every step.
A final prototype, Mespelare v9, to make sure the board design is right before ordering production PCBs. The fixes from v6, the tests and the firmware.
A small PIC 16F648A APRS tracker running the OpenTracker firmware, with a 300 mW HX1 transmitter on the back and a header for a GPS module. Hand-solderable 1206 parts.
A DumpEEPROM() routine that prints the node’s EEPROM over the serial port, to check what VSCP Works actually wrote. Needed because every published Hasselt MDF turned out to be wrong.
Adding a serial debug port to the Hasselt VSCP firmware, so you can watch variables and program flow while the PIC runs. One #define switches all the debug output on or off.
A function-by-function walk through the Hasselt VSCP firmware that the Mespelare node is based on, from the interrupts and main() to event handling, with a program flow diagram.
Labelling homebrew on the bottle cap instead of the bottle, with round Herma 4386 stickers printed from Herma’s free Label Designer. Readable in the crate and nothing to scrub off afterwards.
Modding a PlayStation 1 with a programmed PIC mod chip so it plays copied discs: how the mod works, opening the console, programming and installing the chip, and testing.
Step by step: turning a 50 MHz Rigol DS1052E oscilloscope into its 100 MHz DS1102E twin with a firmware hack, then upgrading the firmware and calibrating the scope.
A reading list for VSCP beginners: the protocol introduction and specification, VSCP Works, filters and masks, the decision matrix and setting up the daemon on Linux.
Adapting the Hasselt code to the Mespelare board: pin assignments, the MDF location and setting the registers, then running it on the hardware for the first time.
Compiling kurtsidekick’s Hasselt firmware for the first time in MPLAB X, as the starting point for the Mespelare firmware: target settings, preserving EEPROM and programming the test board.
The Mespelare VSCP node: a CAN bus board that reads a Niko six-button panel, drives its LEDs and six relay outputs, and breaks out the rest of the pins for expansion boards.
How the old version of this site was made: articles written in Markdown, compiled into a static site with Nanoc, with categories, image thumbnails and self-hosting.
Who writes this site and why: a personal, unpolished collection of technical projects for people who stumble on them with the same interests. Also covers the technical side and the licence.
A rack under the basement stairs that holds 23 cases of beer, built from cheap pine and sized for Duvel crates. The cases sit half on their side so every bottle can be reached without lifting a crate.
A small automated brewery for 28 litre batches, built around a Weck kettle and a BrewTroller controller as a cheaper alternative to a Braumeister. A photo series of the build.
A two-roller malt mill built as a metalworking exercise, with an adjustable gap so the grain is crushed fine while the husks stay mostly whole for lautering.
The third firing of the Ballistic Evaluation Motor, run to check the fixes from test 2, with the load cell now on a steel plate. Report in Dutch with data, sound and video.
The second firing of the VRO Ballistic Evaluation Motor, with a wider throat and a new igniter tube after the first test failed to light. Observations, audio, video, measured data and the fixes for next time.
An integrated measuring system for static motor tests on the Ballistic Evaluation Motor: load cell, pressure sensor and break wires read into a computer. In Dutch.
A load cell amplifier for static rocket motor tests, with the ADC on board, that plugs into USB and records the thrust curve for analysis in a spreadsheet.
A compact four-channel rocket timer built around a PIC 16F88. It detects lift-off with an accelerometer or a reed switch and fires up to four pyro charges at programmed intervals, independently or in groups.