41554 blogs · [ { "id": "01a0879b-e0d7-7229-a4a0-4902e2d56c34", "title": "Software is like everything else", "url": "https://lo.calho.st/posts/software-is-like-everything/", "published_at": "2026-08-13T00:00:00+00:00" }, { "id": "01a0879b-e0d7-7229-a4a0-4902e3abfb78", "title": "The nature of AI discourse has changed", "url": "https://lo.calho.st/posts/complaining-about-ai/", "published_at": "2025-09-13T00:00:00+00:00" }, { "id": "01a0879b-e0d7-7229-a4a0-4902e4385414", "title": "Homelab updates", "url": "https://lo.calho.st/posts/homelab-updates/", "published_at": "2025-07-19T00:00:00+00:00" }, { "id": "01a0879b-e0d7-7229-a4a0-4902e4a9a881", "title": "I tried AI and all I got was disappointed", "url": "https://lo.calho.st/posts/i-tried-an-ai/", "published_at": "2025-07-19T00:00:00+00:00" }, { "id": "01a0879b-e0d7-7229-a4a0-4902e59be308", "title": "Raptor Lake iGPU SR-IOV", "url": "https://lo.calho.st/posts/sr-iov-raptor-lake/", "published_at": "2025-07-19T00:00:00+00:00" }, { "id": "01a0879b-e0d7-7229-a4a0-4902e605e39b", "title": "An ultra-low profile Chiffre: Le Oeuf", "url": "https://lo.calho.st/posts/le-oeuf/", "published_at": "2024-11-22T00:00:00+00:00" }, { "id": "01a0879b-e0d7-7229-a4a0-4902e6f1873f", "title": "My latest ergo design: the Solanum", "url": "https://lo.calho.st/posts/solanum/", "published_at": "2024-09-22T00:00:00+00:00" }, { "id": "01a0879b-e0d7-7229-a4a0-4902e774841a", "title": "The server has been brought to life", "url": "https://lo.calho.st/posts/new-server-part-2/", "published_at": "2024-06-01T00:00:00+00:00" }, { "id": "01a0879b-e0d7-7229-a4a0-4902e8670aec", "title": "It's time for a new server", "url": "https://lo.calho.st/posts/new-server/", "published_at": "2024-05-12T00:00:00+00:00" }, { "id": "01a0879b-e0d7-7229-a4a0-4902e8a163c0", "title": "Adapting to just 34 keys", "url": "https://lo.calho.st/posts/34-key-layout/", "published_at": "2024-05-03T00:00:00+00:00" }, { "id": "01a0879b-e0d7-7229-a4a0-4902e91658e9", "title": "Expanding LVM PVs and LVs", "url": "https://lo.calho.st/posts/extend-lvm/", "published_at": "2024-04-26T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb624d8adde", "title": "Stick a trackball on your keyboard", "url": "https://lo.calho.st/posts/corne-trackball/", "published_at": "2024-04-14T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb62511cb92", "title": "Audio controls in Home Assistant using MQTT", "url": "https://lo.calho.st/posts/mqtt-amp-control/", "published_at": "2024-04-03T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb6253f31d3", "title": "It's really easy to make a bike electric", "url": "https://lo.calho.st/posts/ebike/", "published_at": "2024-04-01T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb62630bd26", "title": "Introducing another split keyboard: the Chicklet", "url": "https://lo.calho.st/posts/chicklet/", "published_at": "2023-12-27T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb626a73e90", "title": "Blue tape or Kapton? Why not both?", "url": "https://lo.calho.st/posts/blue-tape-kapton-why-not-both/", "published_at": "2023-10-20T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb626cd1941", "title": "A 60% ortho keyboard with a trackpad: tamago v2", "url": "https://lo.calho.st/posts/tamago-v2-prototype/", "published_at": "2023-09-28T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb6279c2764", "title": "Streaming QR code detection in Home Assistant", "url": "https://lo.calho.st/posts/homeassistant-qr-code-detection/", "published_at": "2023-09-27T01:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb627ff1f3c", "title": "It's always DNS; or: why I closed my Comcast Business account", "url": "https://lo.calho.st/posts/comcast-dns-interception/", "published_at": "2023-09-27T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb628a249c8", "title": "Geocircles", "url": "https://lo.calho.st/posts/geocircles/", "published_at": "2023-08-24T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb62974ddd0", "title": "Moving to Hugo and Cloudflare Pages", "url": "https://lo.calho.st/posts/hugo/", "published_at": "2023-08-23T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb629f5b0cb", "title": "The homelab post", "url": "https://lo.calho.st/posts/homelab/", "published_at": "2023-08-23T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb62a28d78c", "title": "I designed another weird keyboard: tamago60", "url": "https://lo.calho.st/posts/tamago60/", "published_at": "2023-04-24T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb62a4df007", "title": "I made my custom keyboard wireless", "url": "https://lo.calho.st/posts/wireless-keyboard/", "published_at": "2023-03-20T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb62a79f603", "title": "The intransmissible packet", "url": "https://lo.calho.st/posts/intransmissible/", "published_at": "2023-03-06T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb62af0f7f6", "title": "Keycard door access in Home Assistant", "url": "https://lo.calho.st/posts/homeassistant-keycards/", "published_at": "2023-01-12T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb62b2d5d27", "title": "Typing on a weird keyboard: a retrospective", "url": "https://lo.calho.st/posts/weird-keyboard-retrospective/", "published_at": "2022-12-29T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb62b321cc6", "title": "Adapting CEC controls to RS-232", "url": "https://lo.calho.st/posts/cec-to-rs-232/", "published_at": "2022-12-26T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb62b965740", "title": "Zip tie to smartify: the dumbest way to upgrade your appliance", "url": "https://lo.calho.st/posts/homeassistant-dryer/", "published_at": "2022-09-16T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb62c4489bb", "title": "Scraping wildfire timeseries data with NLP", "url": "https://lo.calho.st/posts/wildfire-data/", "published_at": "2022-06-05T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb62d1b76db", "title": "Designing a split keyboard: the egg58", "url": "https://lo.calho.st/posts/egg58/", "published_at": "2022-04-12T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb62d75ae14", "title": "A demonstration of TDOA multilateration", "url": "https://lo.calho.st/posts/tdoa-multilateration/", "published_at": "2022-02-20T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb62dea16d1", "title": "How not to build a gaming PC", "url": "https://lo.calho.st/posts/gaming-vm/", "published_at": "2022-02-05T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb62defe4ca", "title": "Revised smart doorbell adapter circuit", "url": "https://lo.calho.st/posts/doorbell-adapter-revised/", "published_at": "2021-12-11T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb62e353c41", "title": "Pulseaudio configuration for soundboard routing", "url": "https://lo.calho.st/posts/pulseaudio-soundboard/", "published_at": "2021-06-25T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb62f327fd4", "title": "Adapting a smart doorbell to an incompatible digital chime", "url": "https://lo.calho.st/posts/doorbell-adapter/", "published_at": "2021-06-19T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb62f9e8ff6", "title": "Dependency and build management for sourcemod with sourceknight", "url": "https://lo.calho.st/posts/sourceknight/", "published_at": "2021-06-14T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb62fe5092d", "title": "Tools to check for compromised Keepass passwords", "url": "https://lo.calho.st/posts/check-compromised-keepass/", "published_at": "2020-11-19T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb630cc94e7", "title": "A highly customizable RGB controller implementation for Arduino", "url": "https://lo.calho.st/posts/rgb-arduino/", "published_at": "2020-03-28T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb6314f46f3", "title": "Timelapses from Landsat data", "url": "https://lo.calho.st/posts/landsat-timelapses/", "published_at": "2020-03-08T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb631cc7091", "title": "An automated workflow for fetching and mosaicing Landsat imagery", "url": "https://lo.calho.st/posts/landsat-workflow/", "published_at": "2020-03-07T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb632b17aad", "title": "Generating terrain meshes for 3D printing", "url": "https://lo.calho.st/posts/printing-terrain-meshes/", "published_at": "2019-10-05T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb632d7b31e", "title": "A graphical tool for configuring Alesis V-Series MIDI controllers on Linux.", "url": "https://lo.calho.st/posts/alesis-v-config-gui/", "published_at": "2017-11-12T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb63300215d", "title": "Reverse engineering the Alesis V-series SysEx protocol.", "url": "https://lo.calho.st/posts/reverse-engineering-sysex/", "published_at": "2017-09-08T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb63374b3a4", "title": "Using black magic to make a fast circular buffer.", "url": "https://lo.calho.st/posts/black-magic-buffer/", "published_at": "2017-08-15T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb63451ae3e", "title": "Proving a mathematical curiosity.", "url": "https://lo.calho.st/posts/proving-a-mathematical-curiosity/", "published_at": "2017-06-21T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb634a3c8e2", "title": "Generating spectrograms the hard way with numpy.", "url": "https://lo.calho.st/posts/numpy-spectrogram/", "published_at": "2017-05-18T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb63526e901", "title": "Integrating GitLab and Google Calendar.", "url": "https://lo.calho.st/posts/gitlab-calendar/", "published_at": "2017-04-25T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb6355fd55a", "title": "Adding custom fields to packets in ndnSIM 2.3 without forking the entire repository.", "url": "https://lo.calho.st/posts/ndnsim-custom-fields/", "published_at": "2017-03-16T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb63630569c", "title": "An idiot's guide to fulltext search in PostgreSQL.", "url": "https://lo.calho.st/posts/postgresql-fulltext-search/", "published_at": "2017-02-23T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb6368611fa", "title": "Fun with integer division optimizations.", "url": "https://lo.calho.st/posts/integer-division-optimization/", "published_at": "2017-02-21T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb6376c7ffc", "title": "The problem with Python's datetime class.", "url": "https://lo.calho.st/posts/python-datetime-problems/", "published_at": "2017-01-14T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb6385d041f", "title": "Using bcache to back a SSD with a HDD on Ubuntu.", "url": "https://lo.calho.st/posts/using-bcache-to-back-a-ssd-with-a-hdd-on-ubuntu/", "published_at": "2017-01-06T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb63927bb18", "title": "Parallelizing single-threaded batch jobs using Python's multiprocessing library.", "url": "https://lo.calho.st/posts/parallel-batch-jobs-with-python-multiprocessing/", "published_at": "2016-12-23T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb6398a7506", "title": "The fruits of some recent Arduino mischief.", "url": "https://lo.calho.st/posts/arduino-mischief/", "published_at": "2016-12-21T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb63a447599", "title": "Optimizing MySQL and Apache for a low-memory VPS.", "url": "https://lo.calho.st/posts/mysql-apache-low-memory/", "published_at": "2016-10-17T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb63b22665b", "title": "Information-centric networking for laymen.", "url": "https://lo.calho.st/posts/information-centric-networking/", "published_at": "2016-10-08T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb63c0acb52", "title": "Why are tuples greater than lists?", "url": "https://lo.calho.st/posts/why-are-tuples-greater-than-lists/", "published_at": "2016-10-03T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb63c3e9303", "title": "Quick postfix & dovecot config with virtual hosts (Ubuntu 16.04)", "url": "https://lo.calho.st/posts/postfix-dovecot-config/", "published_at": "2016-08-23T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb63c41b334", "title": "An easy way to visualize git activity", "url": "https://lo.calho.st/posts/git-visualization/", "published_at": "2016-06-11T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb63cf27b5d", "title": "Adventures in image glitching", "url": "https://lo.calho.st/posts/image-glitching/", "published_at": "2016-06-09T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb63d64b64b", "title": "What's inside a PEM file?", "url": "https://lo.calho.st/posts/whats-inside-a-pem-file/", "published_at": "2016-04-28T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb63e09b1e5", "title": "My first adventure with Let's Encrypt on nginx, dovecot, and postfix", "url": "https://lo.calho.st/posts/letsencrypt-nginx-dovecot-postfix/", "published_at": "2016-03-28T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb63e76cdf6", "title": "Demonstrating the double-DES meet-in-the-middle attack", "url": "https://lo.calho.st/posts/double-des-meet-in-the-middle/", "published_at": "2016-02-04T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb63f5a8d64", "title": "A fun experiment with Twilio", "url": "https://lo.calho.st/posts/twilio-experiment/", "published_at": "2016-01-09T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb63f9e8013", "title": "No, fingerprints are not secure", "url": "https://lo.calho.st/posts/fingerprints-are-not-secure/", "published_at": "2015-12-02T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb63ffca342", "title": "Time clocking at the command line", "url": "https://lo.calho.st/posts/command-line-time-clock/", "published_at": "2015-09-02T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb640d5eac3", "title": "A C++ encapsulation of the Linux inotify API", "url": "https://lo.calho.st/posts/cpp-inotify/", "published_at": "2015-02-01T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb6415c0d0b", "title": "RIOT OS ported to TI Tiva C Connected Launchpad", "url": "https://lo.calho.st/posts/riot-os-for-ti-tiva-c-launchpad/", "published_at": "2015-01-31T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb64222f54f", "title": "Roll your own dynamic DNS (Ubuntu)", "url": "https://lo.calho.st/posts/dynamic-dns-ubuntu/", "published_at": "2014-07-24T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb642eaca11", "title": "Quick and easy OpenVPN server config (Ubuntu)", "url": "https://lo.calho.st/posts/openvpn-config-ubuntu/", "published_at": "2014-07-21T00:00:00+00:00" }, { "id": "01a0879b-e0d8-726c-82e0-fcb643949bda", "title": "About", "url": "https://lo.calho.st/about/", "published_at": null } ] posts Claim your blog
Back to lo.calho.st
Blog · corpus.blog/blogs/lo.calho.st/posts

lo.calho.st

lo.calho.st

2026

2025

2024

2023

2022

2021

2020

2019

2017

2016

2015

2014

Undated