All blogs / Software / engineering practice
jes's blog
This is jes's blog
- Posts
- 858 from 8 Aug 2013 to 20 Oct 2026
- Posting
- weekly (140 in the last year)
- Kind
- personal blog
- Feed
- https://incoherency.co.uk/blog/rss.xml
2026 119
- Coding agents are the ultimate sandbox game
- 2026-10-13
- 2026-10-08
- 2026-10-07
- 2026-10-06
- 2026-10-05
- 2026-09-30
- 2026-09-29
- 2026-09-24
- 2026-09-23
- 2026-09-21
- 2026-09-20
- 2026-09-19
- 2026-09-18
- 2026-09-17
- 2026-09-16
- 2026-09-15
- 2026-09-14
- 2026-09-12
- 2026-09-10
- 2026-08-30
- Foiling a Protohackers email spam bot
- 2026-08-17
- 2026-08-16
- 2026-08-15
- 2026-08-14
- 2026-08-13
- Trailer
- 2026-08-12
- 2026-08-10
- 2026-08-09
- 2026-08-08
- 2026-08-07
- 2026-08-04
- 2026-08-03
- 2026-07-31
- 2026-07-27
- 2026-07-25
- 2026-07-24
- 2026-07-23
- 2026-07-22
- Should you wash your solar panels?
- 2026-07-20
- 2026-07-19
- 2026-07-17
- Optimistic epsilon-greedy
- 2026-07-13
- ProofToken16: My Proposal for Private Decentralised Age Verification
- 2026-07-02
- Telepresence Burglary
- How to make a hyperlink
- 2026-05-22
- How to publish your secrets on Docker Hub
- 2026-05-16
- 2026-05-11
- 2026-05-07
- 2026-05-06
- Stealth Browser Survey: April 2026
- 2026-04-22
- 2026-04-13
- 2026-04-12
- 2026-04-11
- 2026-04-08
- 2026-04-06
- 2026-04-04
- 2026-04-03
- 2026-04-02
- 2026-03-31
- 2026-03-30
- 2026-03-29
- 2026-03-28
- 2026-03-27
- 2026-03-26
- 2026-03-25
- 2026-03-24
- 2026-03-23
- 2026-03-22
- 2026-03-21
- 2026-03-18
- 2026-03-17
- 2026-03-14
- 2026-03-07
- 2026-02-27
- Bot Forensics
- 2026-02-23
- Claws
- 2026-02-16
- 2026-02-14
- Evidence of absence
- 2026-02-09
- 2026-02-06
- 2026-02-03
- 2026-02-02
- 2026-01-31
- 2026-01-30
- 2026-01-29
- 2026-01-28
- 2026-01-27
- 2026-01-26
- 2026-01-25
- 2026-01-24
- 2026-01-23
- 2026-01-22
- 2026-01-21
- Tractor
- 2026-01-19
- 2026-01-18
- 2026-01-17
- 2026-01-15
- 2026-01-12
- 2026-01-11
- 2026-01-09
- 2026-01-08
- A parametric mannequin for FreeCAD
- 2026-01-07
- Against Gift Aid
- 2026-01-03
- 2026-01-02
- 2026-01-01
2025 161
- 2025-12-31
- 2025-12-30
- 2025-12-26
- 2025-12-25
- Anticloaking
- 2025-12-14
- 2025-12-13
- 2025-12-09
- Student loan deductions
- 2025-11-22
- 2025-11-19
- 2025-11-18
- 2025-11-16
- 2025-11-15
- 2025-11-14
- 2025-11-12
- 2025-11-11
- 2025-11-10
- 2025-11-09
- 2025-11-04
- 2025-11-01
- 2025-08-27
- 2025-08-19
- 2025-08-16
- 2025-07-30
- 2025-07-24
- 2025-07-23
- 2025-07-22
- 2025-07-21
- 2025-07-20
- 2025-07-16
- AI Test User
- 2025-07-13
- 2025-07-06
- 2025-07-05
- 2025-07-04
- 2025-07-02
- 2025-06-30
- The Story of Max, a Real Programmer
- 2025-06-28
- 2025-06-27
- 2025-06-25
- 2025-06-23
- 2025-06-20
- 2025-06-18
- 2025-06-17
- 2025-06-16
- 2025-06-15
- 2025-06-14
- 2025-06-13
- 2025-06-09
- 2025-06-08
- 2025-06-07
- 2025-06-06
- 2025-06-05
- 2025-06-04
- The web program manifesto
- 2025-05-28
- 2025-05-27
- 2025-05-25
- Against exponential backoff
- 2025-05-21
- Conservation of tins of paint
- 2025-05-11
- 2025-05-09
- 2025-05-05
- 2025-05-04
- 2025-05-03
- 2025-04-30
- 2025-04-28
- 2025-04-26
- 2025-04-21
- 2025-04-18
- You never ask how I'm doing
- 2025-04-15
- 2025-04-14
- 2025-04-13
- 2025-04-12
- 2025-04-10
- 2025-04-09
- Building blocks for F-Rep CAD
- 2025-04-08
- 2025-04-07
- 2025-04-06
- 2025-04-05
- 2025-04-04
- 2025-04-03
- 2025-04-02
- 2025-04-01
- 2025-03-31
- 2025-03-30
- 2025-03-29
- 2025-03-28
- 2025-03-27
- 2025-03-26
- 2025-03-25
- 2025-03-24
- 2025-03-23
- 2025-03-22
- 2025-03-21
- 2025-03-20
- 2025-03-19
- 2025-03-18
- 2025-03-17
- 2025-03-16
- 2025-03-15
- 2025-03-14
- 2025-03-13
- 2025-03-12
- 2025-03-11
- 2025-03-10
- 2025-03-09
- 2025-03-08
- Thoughts on Signed Distance Functions for CAD
- 2025-03-07
- 2025-03-06
- 2025-03-05
- 2025-03-04
- 2025-03-03
- 2025-03-02
- 2025-03-01
- How to abort calculations in OpenCascade
- 2025-02-27
- 2025-02-26
- 2025-02-25
- 2025-02-24
- 2025-02-23
- 2025-02-22
- 2025-02-21
- 2025-02-20
- 2025-02-19
- The world's stupidest AppImage
- 2025-02-18
- 2025-02-15
- 2025-02-14
- 2025-02-13
- 2025-02-11
- 2025-02-09
- 2025-02-05
- 2025-02-04
- 2025-02-02
- 2025-02-01
- 2025-01-31
- 2025-01-29
- 2025-01-26
- 2025-01-25
- 2025-01-24
- 2025-01-23
- 2025-01-22
- 2025-01-20
- 2025-01-19
- 2025-01-18
- 2025-01-16
- 2025-01-13
- 2025-01-11
- 2025-01-09
- 2025-01-07
- 2025-01-04
- 2025-01-03
- 2025-01-02
- 2025-01-01
2024 192
- 2024-12-30
- 2024-12-26
- 2024-12-23
- 2024-12-13
- 2024-12-12
- 2024-12-11
- 2024-12-10
- 2024-12-09
- 2024-12-08
- 2024-12-07
- 2024-12-06
- 2024-12-05
- 2024-12-04
- 2024-12-03
- Timeline of Discovery
- 2024-12-02
- 2024-12-01
- 2024-11-30
- 2024-11-29
- 2024-11-28
- 2024-11-26
- 2024-11-25
- 2024-11-21
- 2024-11-20
- 2024-11-19
- 2024-11-18
- 2024-11-17
- 2024-11-16
- 2024-11-15
- 2024-11-13
- 2024-11-12
- Clock Gear Train Calculator
- 2024-11-11
- 2024-11-10
- The Principles of Mr. Harrison's Time-keeper
- 2024-11-09
- My diaphragm piston air engine with rotary valve
- 2024-11-07
- 2024-11-05
- Prompts as source code: a vision for the future of programming
- 2024-11-04
- 2024-11-03
- 2024-11-01
- 2024-10-31
- 2024-10-29
- 2024-10-27
- 2024-10-26
- 2024-10-25
- 2024-10-24
- 2024-10-23
- 2024-10-22
- 2024-10-20
- 2024-10-19
- 2024-10-18
- 2024-10-14
- 2024-10-11
- 2024-10-08
- 2024-10-07
- Bare minds
- 2024-10-06
- 2024-10-05
- 2024-10-04
- 2024-09-30
- 2024-09-29
- 2024-09-28
- 2024-09-27
- 2024-09-26
- 2024-09-23
- 2024-09-22
- 2024-09-21
- 2024-09-19
- 2024-09-17
- 2024-09-16
- The free space equation
- 2024-09-14
- 2024-09-13
- Encyclopedia Mechanica
- 2024-09-10
- 2024-09-09
- 2024-08-30
- 2024-08-29
- 2024-08-26
- 2024-08-25
- 2024-08-24
- 2024-08-23
- 2024-08-20
- 2024-08-19
- 2024-08-17
- 2024-08-16
- 2024-08-13
- 2024-08-11
- 2024-07-26
- I made an LLM-powered Colonel Blotto game
- 2024-07-21
- 2024-07-18
- 2024-07-16
- 2024-07-13
- 2024-07-09
- 2014 Nissan Leaf: first impressions
- 2024-07-08
- 2024-07-06
- 2024-06-29
- 2024-06-27
- 2024-06-22
- 2024-06-18
- 2024-06-17
- Secrets of the ChatGPT Linux system
- 2024-06-11
- 2024-06-10
- 2024-06-09
- 2024-06-04
- 2024-06-01
- 2024-05-30
- 2024-05-20
- 2024-05-19
- 2024-05-10
- 2024-05-09
- 2024-05-07
- 2024-05-06
- 2024-05-05
- My first microlighting experience
- 2024-05-03
- 2024-05-01
- 2024-04-30
- 2024-04-29
- 2024-04-28
- 2024-04-27
- 2024-04-26
- 2024-04-23
- 2024-04-22
- I'm building a fixed-gantry CNC machine out of composite kitchen worktop material
- 2024-04-21
- 2024-04-20
- 2024-04-19
- 2024-04-16
- 2024-04-15
- 2024-04-13
- 2024-04-12
- 2024-04-11
- 2024-04-10
- 2024-04-08
- 2024-03-25
- 2024-03-24
- 2024-03-23
- 2024-03-21
- 2024-03-18
- 2024-03-12
- 2024-03-11
- 2024-03-10
- 2024-03-08
- 2024-03-05
- 2024-03-04
- 2024-03-03
- 2024-02-27
- 2024-02-26
- 2024-02-25
- 2024-02-23
- 2024-02-22
- 2024-02-21
- 2024-02-20
- 2024-02-19
- 2024-02-18
- 2024-02-17
- 2024-02-16
- 2024-02-14
- 2024-02-13
- 2024-02-12
- How to read from a TCP socket (but were too afraid to ask)
- 2024-02-07
- 2024-02-04
- 2024-02-03
- We're not in a simulation
- 2024-01-31
- 2024-01-29
- 2024-01-25
- 2024-01-23
- 2024-01-22
- 2024-01-21
- 2024-01-20
- 2024-01-19
- 2024-01-17
- 2024-01-16
- 2024-01-15
- 2024-01-14
- 2024-01-10
- 2024-01-09
- 2024-01-07
- 2024-01-06
- 2024-01-04
- 2024-01-03
- 2024-01-02
- 2024-01-01
2023 138
- 2023-12-31
- 2023-12-30
- 2023-12-29
- 2023-12-28
- 2023-12-27
- 2023-12-26
- 2023-12-24
- 2023-12-23
- 2023-12-21
- 2023-12-20
- 2023-12-19
- 2023-12-18
- 2023-12-17
- 2023-12-16
- 2023-12-13
- 2023-12-12
- 2023-12-10
- 2023-12-09
- 2023-12-08
- 2023-12-07
- 2023-12-06
- 2023-12-04
- 2023-12-03
- 2023-12-02
- 2023-12-01
- 2023-11-30
- 2023-11-29
- 2023-11-28
- 2023-11-27
- 2023-11-26
- 2023-11-25
- 2023-11-24
- The watch project
- 2023-11-22
- 2023-11-21
- 2023-11-20
- 2023-11-19
- 2023-11-18
- 2023-11-17
- 2023-11-16
- 2023-11-15
- 2023-11-14
- 2023-11-13
- Interesting features of John Harrison's sea clocks
- 2023-11-12
- 2023-11-11
- 2023-11-10
- 2023-11-08
- 2023-11-07
- 2023-11-06
- Incongruous technologies redux
- 2023-11-05
- 2023-11-04
- 2023-11-03
- 2023-11-02
- 2023-11-01
- 2023-10-30
- 2023-10-29
- 2023-10-27
- 2023-10-26
- A self-aligning Boggle board
- 2023-10-25
- 2023-10-24
- 2023-10-23
- 2023-10-22
- 2023-10-21
- 2023-10-20
- 2023-10-19
- 2023-10-18
- 2023-10-17
- 2023-10-16
- 2023-10-15
- 2023-10-14
- 2023-10-13
- 2023-10-12
- 2023-10-11
- 2023-10-08
- 2023-10-07
- 2023-10-06
- 2023-10-05
- 2023-10-04
- The Douzieme gauge
- 2023-10-02
- 2023-10-01
- 2023-09-30
- 2023-09-29
- 2023-09-28
- 2023-09-27
- 2023-09-26
- 2023-09-25
- 2023-09-24
- 2023-09-23
- 2023-09-22
- 2023-09-21
- 2023-09-20
- 2023-09-19
- 2023-09-18
- 2023-09-17
- 2023-09-16
- 2023-09-15
- 2023-09-14
- 2023-09-13
- 2023-09-12
- 2023-09-11
- 2023-09-10
- 2023-09-08
- 2023-09-07
- 2023-09-06
- 2023-09-05
- 2023-09-04
- 2023-09-03
- 2023-09-02
- 2023-09-01
- 2023-08-31
- Five interesting things from the Science Museum
- Designing a Bangle.js commute timer
- The Egyptian coin box
- dnstweak: quick local DNS spoofing tool
- Exploiting an insecure cipher in the wild
- Incongruous technologies
- Triangle strip encoding
- Did I receive fraudulent DMCA takedowns?
- Book Review: Bloodhounds (includes spoilers)
- Taxonomy of locked room murders
- The crank position sensor works
- A quick 3d-printed light gate
- Revisiting oscillating engine loss calibration
- Coriolis fountain
- The KRC-2 regenerative receiver kit: a review
- More inlet pressure measurements
- Measuring Wig-Wag inlet pressure fluctuations
- Calibrating losses in the oscillating engine simulator
- My Wig-Wag
- Oscillating Engine Simulator
- My mini lathe stand
- Prime Combination: Solution
- Prime Combination
- Optimal eccentric-weighted coins
2022 30
- Problems with Protohackers
- Classifying minds
- Alternative revolutions
- Solving Protohackers with Fly.io
- Nightdrive
- Protohackers problem 2 retrospective
- How small can you make text with a drag engraver?
- The future of virtual reality
- Protohackers problem 1 retrospective
- Protohackers: a new server programming challenge
- A SLANG interpreter for SCAMP
- A Lisp interpreter for SCAMP
- Cheating at chess with a computer for my shoes
- Do I really want a lambda calculus cyberdeck?
- Eldood: what Doodle used to be
- Consciousness is computable
- The ultimate SCAMP development environment
- Toolmaker's Clamp
- Progress on the CNC mini mill
- FreeCAD vs SolveSpace
- CNC milling machine project
- Meshmill: open source 3D CAM
- Using the weird rotary axis
- Librem 5: first impressions
- Packing puzzle: Six Fit
- A weird rotary axis for my CNC machine
- Party Puzzling: themed puzzle sets for special occasions
- An Arduino-based USB interface to the Psion Organiser II
- Waypointer Moto: motorcycle navigation for Bangle.js
- Measuring motorcycle lean angle with a single accelerometer
2021 31
- Advent of Code on my homemade CPU
- Bubble packing puzzle
- Lightweight and robust quadcopter guards
- I made an adjustable loaded die
- Fixing my tablesaw tilt mechanism
- Towards a high-resolution grid of tiny electromagnets
- Choozi for Bangle.js
- Approximating Lenna with a neural net
- The case for SCAMP
- Play with SCAMP from the comfort of your browser
- Porting Hamurabi to SCAMP
- Book Review: Every Tool's a Hammer
- SCAMP update
- A short pendulum with a long period
- A method and apparatus for polishing shafts
- SCAMP has booted up to the shell for the first time
- The kilo editor
- SCAMP is alive
- Bangle.js open source hackable smart watch: first impressions
- Front panels for SCAMP
- The SCAMP kernel
- A compiler for SCAMP, and machine code profiling
- How to use an AT28C16 EEPROM with an Arduino Uno without a port expander
- My second attempt at milling a PCB
- My first attempt at milling a PCB
- Making a start on the SCAMP ALU cards
- Designing the instruction set for my TTL CPU
- Progress on my TTL CPU design
- I want to cast some rings
- Adventures in CPU design
- Someone copied Stegoseed and deleted my name from it
2020 35
- I wrote a semi-literate brainfuck compiler for CP/M
- How to copy files to/from the RC2014 using XMODEM
- My Advent of Code Story
- All the gears, no ideas: an escape room puzzle
- I made some aluminium keycaps
- Sawing my dining table in half
- Seasonal.css: Give your website a seasonal colour scheme
- CNC toolpath generation from heightmaps
- First steps into CNC machining
- How to convert a 6040 CNC machine to Grbl
- I made an optical inline fuel sensor
- Miscellaneous thoughts on making stuff
- Progress on my Godot racing game for Oculus Quest
- How to import Assetto Corsa race tracks into Godot
- I made a mechanical keyboard with 3d-printed switches
- I'm working on a VR car racing game for Oculus Quest
- Another new switch tester, test results, and thoughts on the keyboard design
- Secrets of the Hanayama Cast Marble
- I made a macro keypad with 3d-printed switches
- Making a game with 24a2
- Keyboard switch progress & test results
- A better automatic keyboard switch tester
- I broke my first 3D-printed keyboard switch
- Automatic keyboard switch tester
- Thoughts on laser level design
- How to run a Cloud Desktop on any VPS, with SPICE
- An easy way to package Perl programs
- Zero-downtime Docker container deployments with nginx
- Autopatzer: my automatic chess board
- YubiKey SSH authentication: the easy way
- Automatic chess board design
- My first combat robot tournament
- I built an antweight combat robot
- My DIY Cryptosteel Capsule
- Chassis Design with Finite Element Analysis in FreeCAD
2019 16
- My RC2014 Web Server
- Design and Implementation of a Z80 Computer Front Panel
- The RC2014 Z80 Microcomputer
- My Arduino-based industrial process controller
- Home 3d metal printing: first results
- The 2019 BLMRA 12 hour lawnmower race
- An interesting 3d metal printing process (help wanted)
- How to make a rev limiter with an Arduino
- My first chess tournament
- A Strange Chess Clock
- How to win at Scotland Yard
- Puzzle Drawers
- The Wheatstone Cryptograph
- Telescope tracking with software auto-guiding
- Imaging the Orion nebula with the PiKon telescope
- Towards a Better Pythagorean Cup
2018 30
- First Light in the PiKon telescope
- Flat Earth and the Coriolis Force
- My PiKon telescope hardware
- Ramblings About a Computerised Telescope
- Deanonymising a Tor hidden service with traffic correlation
- How to use Ricochet IM on Tails
- Hiding messages in chess games
- Someone used my IPFS gateway for phishing
- How Ricochet IM works
- Please don't block Europe
- How to install Ubuntu 18.04 LTS on a Lenovo Ideacentre 310s
- Spelunking the Web Servers of the Lightning Network
- A 4x4 chess puzzle
- We entered the BLMRA 12 hour lawnmower race again
- I tried to make a vinyl record on the lathe
- What's inside an HSBC SecureKey?
- Introduction to Isopath
- My homemade ebike control panel
- A Rock-Paper-Scissors AI that is too good
- Reverse engineering an ebike 3-mode PAS LED panel
- What would the total computing power of the entire world in 1970 cost today?
- How I cracked the Bitcoin keys in Andy Bauch's Lego artwork
- How to find out if your data gets stolen (URL Canary)
- SaaS profit is market inefficiency, and it will end
- How to run SSH and HTTP on the same port
- A visual demonstration of the perils of key reuse in a one-time pad
- I designed a trick chess piece with hidden compartments
- Magnetic cubes puzzle: In practice
- Magnetic cubes puzzle: In theory
- How to get your Bitcoins out of Xapo without running their app on your phone
2017 40
- Knives: they cut, and they don't ask no fucking questions. Yet.
- How to control a digital speedometer
- Is mega.co.nz censored by every major search engine?
- Finding unsecured S3 buckets using Passive DNS
- Machines as first-class citizens
- New project: YX140 engine in a Honda Innova scooter
- Someone Created a Tor Hidden Service to Phish my Tor Hidden Service
- On Gumtree, "Bitcoin" is a dirty word
- Solving the Matchsticks Game
- Google Trends portfolio: selling Ripple
- Google Trends portfolio: buying Monero
- Using Google Trends data to speculate on cryptocurrencies
- I tried to do the BLMRA 12 hour lawnmower race
- I found a security vulnerability in SMS Privacy this morning
- The only time Hacker News is this interested in Bitcoin is when there's a bubble forming
- BTC-e, Alexander Vinnik, and the missing MtGox Bitcoins
- I tried to buy a thing off a dark net market, and the FBI stole my money
- Why Bitcoin has to succeed
- Double-check Bitcoin addresses when pasting (Bitcoin TX Generator malware)
- How to create 3d-printed stencils for spray-painting
- Someone cloned my website and is using it to scam people
- Hardbin: The World's Most Secure Encrypted Pastebin
- I made a Base58 encoding/decoding tool
- How to use bitaddress.org securely (spoiler: use IPFS)
- I've been playing with IPFS
- I semi-deanonymised some MetaMask users, and they were absolutely loaded
- Drive-by identification of MetaMask users
- eBay don't understand why people dodge their fees
- Is the Large Bitcoin Collider malware?
- I made a Rhyming Dictionary
- I started accepting 0-conf Bitcoin payments, and it was great
- On the inevitability of the machine-owned enterprise
- I don't know how many soldiers are taking drugs, and neither do you
- SMS Privacy was attacked last night
- Steganographic Bitcoin seeds: Hiding cash in plain sight
- Precautions for generating Bitcoin QR codes
- Encrypted email is still a pain in 2017
- I bought an extremely cheap 3d printer and it's great
- Why minimum wage is bad, illegal immigrants are good, and ticket scalping is fine
- The Game Theory Case for Bitcoin
2016 28
- Secrets of the Medtronic MyCareLink Patient Monitor
- Please stop making popup menu bars
- How (and why) to accept Bitcoin payments yourself (without running a full node)
- Bitcoin debit cards: Xapo vs Cryptopay
- I made a hidden bookcase door
- SMS Privacy month 1 review
- SMS Privacy now provides anonymous voicemail
- What is the most interesting thing live streaming right now?
- The SMS Privacy conversion funnel
- How to buy phone numbers anonymously
- What if we could assume new identities at will?
- Living with a Bitcoin debit card
- Perl's Digest::SHA::hmac_sha256_base64 is wrong
- On the design of a herb jar lid
- I delivered an Oak Mirror to a lady
- How to copy Wordpress theme customisations to a child theme
- How to defeat naive image steganography
- Stockfighter Review (no spoilers)
- How (and why) to make your software faster
- Going Solo
- How to peek all of the jobs in a Beanstalk tube
- I delivered 2 sofas for Vincent
- How to interrupt a regex in Perl
- How to use GNU screen for ad-hoc cluster management
- I tried to go pit biking
- I made a video of driving my van
- I tried to change the glow plugs in my van
- I bought a pit bike
2015 18
- I rode my motorbike off road and made a video
- I made a gong
- I made a puzzle game
- If you serve javascript with a 404 status does it still get executed?
- I made a knife out of a file
- Logrotate race condition with copytruncate
- I made a little knife
- I made a plymetal heart decoration
- I painted my van wheels
- How to close a running process's socket
- I drove a truck and bought a car
- Digital Ocean Private Networking is not Private
- I built a campervan
- I am back on the bike
- I built an oak chest
- How to make driftwood sink
- I bought some fish
- I made a ring out of a coin
2014 11
- I drove in the snow
- SMS Travel Map
- Stories from the Mongol Rally: Mongolian Black Market Pickpocket
- Stories from the Mongol Rally: Kazakhstan Policeman Selfie
- Stories from the Mongol Rally: the Georgian Diesel Incident
- Counter creator
- I made a brass box
- I ran out of fuel in my van
- I helped a French child fix a stolen moped
- West Country Place Name Generator
- Yurt Lush Live Tracking