RSSAmplifier

Blog

Tyblog

Technology, security, and general blogging

blog.tjll.netRSS feed ↗41 posts

Latest posts

Asynchronous Emacs Direnv Devshells

Figure 1: The Meeting of San Carlo Borromeo and San Filippo Neri ; emacs logo licensed under GPLv3 from Wikimedia On the bad side of town underneath the freeway overpass with a needle full of lisp is a wild-eyed man who likes to abuse emacs. That man is me. My eccentric technology tastes take on a particularly esoteric flavor when I start setting up language servers. In short: I sandbox every…

You Don't Love systemd Timers Enough

Figure 1: Plato’s Cave by Jan Pietersz Saenredam; 24 hour clock licensed under CC3 from Wikimedia ; systemd logo by the systemd project licensed under CC-BY-SA 4.0 My favorite metonymic technology term is “cron job”: even though cron may not literally be the daemon that executes actions on a schedule, we apply the term to anything that walks like a cron and quacks like a cron .…

This Blog Post is Your Sign to Start Self-Hosting

Figure 1: Heed the call, halfling This moment—early 2026—is a particularly well-suited time in history to start self-hosting applications and rely on your own infrastructure. Whether in a local homelab or your own cloud deployment, the tools to build out personal environments have been getting better over time. The future looks a little shaky, though, so now is your moment! Increasing hardware…

Thank Goodness Universal Basic Income Saved the AI Economy

…because without dramatic policies that addressed the disruption that artificial intelligence products introduced, we’d be in a bad spot. Figure 1: Heroes? Imagine if stories like this had started to happen in 2026 without fallbacks like the UBI policies that Altman and Amodei pushed: But the reality is that 75% of the people on our engineering team lost their jobs here yesterday…

439 Days, 8,369 Miles, and 2 Kids with an Electric Vehicle

This is the blog post I wished I could have read when making electric vehicle (EV) purchasing decisions in 2024. To help others make an informed decision, you need to understand: my own family’s situation at the time of purchase, our unmet needs, and how the EV9 met those requirements. Pedantic enough for you? Because this will more more pedantic than you think. Figure 1: Actual photograph…

To monitor my backups, I had to first invent the universe

Figure 1: Happy little storage buckets made of star stuff. I store all of my critical data in ZFS and replicate it offsite nightly with zrepl . The monitoring page of the zrepl docs mock me with: Monitoring endpoints are configured in the global.monitoring section of the config file. […] zrepl can expose Prometheus metrics via HTTP. Without the ability to fire commands after replication…

systemd has been a complete, utter, unmitigated success

Figure 1: The systemd wars of the tenties were harsh and casualties were many The year is 2013 and I am hopping mad . systemd is replacing my plaintext logs with a binary format and pumping steroids into init and it is laughing at me. The unix philosophy cries out: is this the end of Linux (or, as many are calling it, GNU plus Linux)? The year is 2025 and I’m here to repent. Not only is systemd a…

The Human Resources Alignment Problem

Figure 1: The modern programmer’s dilemma Today I realized that – distinct from the idea of AI misalignment – today’s human resource departments have misaligned incentives for how employees will (or are?) using large language models. Maybe you’re like me: an employee – not an employer – and so you trade your time and effort for money. Maybe you’ve…

A Beginner's Guide to Extending Emacs

This post isn’t about the virtues of some editors versus others: that’s already been written by somebody else (and it’s really good) – if you want to know why I use emacs, I suggest reading that instead. This post will help you understand why “extensibility” and “introspectability” are such prominent emacs features even without an emacs lisp background. Bridging…

Blog Architecture Redux

There’s a common joke out there that bloggers will write more about their blogging system than actual content. Blog is dead, long live Blog My first post that explains how I write my blog is hilariously outdated now. Between then and now, my process has been: Generate Jekyll locally Push to S3 with s3_website The aforementioned blog post outlined self-hosting static assets on a VPS, which is…

How to Preview System Updates on NixOS

If you’re a NixOS user, knowing what will change on your system when performing updates can be tricky. We can make the experience better! Figure 1: Explaining how to preview NixOS package updates The Problem Here’s an example of what I see when I run a pacman -Syu on one of my Arch Linux systems: Packages (343) alsa-lib-1.2.8-1 alsa-ucm-conf-1.2.8-1 aom-3.5.0-1 apr-util-1.6.1-10…

An Affordable Voice Assistant that Won’t Spy On You

You can build your own voice assistant to avoid the questionable privacy consequences of bringing an Alexa or Google Assistant into your home. In this post I’ll explain how I did it using commodity hardware without any need for network communication outside of my own private LAN. Even more stunning, the voice recognition doesn’t suck and it may actually be useful to you . Figure 1: AIY Voice Kit…

A Modest License Violation Proposal

Figure 1: Saturn devouring the GPL Here’s a free product idea for the ambitious and morally flexible reader: Microsoft charges you $10/month for access to a service that harvests intellectual property, launders it through an algorithm, and then presents it to you absent its license which is a violation of its copyleft terms . This has been a topic of discussion for several months now, and it…

The Best Thing About Docker is not Docker

Docker is the de facto solution for packaging most server-side applications these days. The technical merits of Docker are nifty – cgroups and other mechanisms are certainly useful – but there’s one particular aspect of running an application in Docker that has been unequivocally beneficial for the industry: concretely defined inputs and outputs. I was reading the Gitea…

35 Million Hot Dogs: Benchmarking Caddy vs. Nginx

This blog post is about benchmarking Caddy against Nginx and their respective performance metrics as reverse proxies. Be forewarned: I was very thorough and there are tons of graphs and tables in here. I didn’t want to make any mistakes! Nobody is allowed to make mistakes on the Internet. You can proceed to the results if you want to, but you’ll hurt my vain writer’s feelings if…

One Year With the Framework Laptop and NixOS

About a year ago my Framework laptop arrived. Finally, after fretting constantly about finding hardware that I would feel good about supporting, here it was: first-class Linux support, best-in-class maintainability, and a company that seemed pretty concerned about sustainability. Is it the year of the Linux Desktop? Am I hallucinating? Is there a gas leak in my house? Figure 1: NixOS Linux on the…

Have You Considered Load-bearing Shell History?

I have poor command-line hygiene. When I fever-dream a useful pipeline into existence, I very seldom commit it to a shell configuration somewhere. Rather, I let fzf dredge it up sometime later when I need it. My functions are not documented, have hideously short names and variables because I tend to code golf, and are specific to the use-case-at-the-time and not general. I’ve since decided…

A Doppler Test Drive

Remember when we all used to commit secrets to source code repositories? In the bygone software engineering paleolithic era, public cloud key management services didn’t exist and neither did OSS solutions like Vault. Managing sensitive credentials has gotten much better over the years, and there’s very little reason to ever even store passwords or tokens in plaintext files any more.…

Too Simple To Fail: Marrying Nomad, Caddy, and Wireguard

My little lab can afford some experimental allowances given that I’ll never (hopefully) breach the “thousands of hosts” mark. One experiment that paid off recently was ditching Traefik v1 for a hybrid setup that uses Nomad , consul-template , Caddy , and wireguard in order to provide the HTTP routing layer for my services. I think it’s an interesting solution, and it has…

Unbreakable Builds on Container Schedulers without Containers

If you’re like me, you: have to look up Dockerfile quirks each time you write one, never know whether a container you exec into will have bash , sh , or whatever other shell, and are never sure which container init is currently the best practice. I definitely still don’t know what the hell Moby is. Overall, packaging applications into Docker container images isn’t very ergonomic,…

Tools I Love to Not Think About

I use a lot of software tools for my job - and personally, for that matter. Some live in the forefront of my brain, like emacs. Others live in the background, like my terminal (alacritty). Some of these background tools do their jobs so well and so reliably that I can sometimes forget that they’re humming away for me every day, without any hassle to fix or maintain them. This is an informal…

Industrial Strength Arch Linux

These days, I almost exclusively run Arch Linux in my homelab and personal machines. Had I the brain cells to spare, I’d try and get NixOS running on ARMv7, but in the meantime, a mix of vanilla x86_64 Arch and Arch Linux ARM is my chosen flavor just to keep things consistent. I’ve run Arch as my primary server OS for almost a decade now, and although I’m sure some will balk at…

My Favorite Things From 2019

I often think back to previous years about the best movies, games, and books that I find and wish I had recorded them somewhere. For 2019, I’m finally doing it - so here’s my biased, semi-organized, and somewhat late list of media that I really loved from 2019! Book: Why We Sleep Figure 1: Why We Sleep I’m a pretty unabashed fiction addict, and I regularly devour fantasy and…

Shell Kung Fu

My blog post about ssh is still the most frequently read content on my blog four years later. I’ve collected enough shell tricks that it’s about time for one of these type of posts about my favorite software tool of all time: the shell. My experience is mostly limited to zsh, so while the examples here will be zsh-based, I think other shells like fish and xonsh are great as well.…

Going Completely Overboard with a Clustered Homelab

A few months ago I rebuilt my router on an espressobin and got the itch to overhaul the rest of my homelab. While I could pick up some post-market AmaFaceGooSoft equipment for a typical high-power x86 lab, I decided to put the devops mantra of a distributed, fault-tolerant architecture to work and see how far I could get with lots of small, cheap, low-power machines instead. In a nutshell,…

Building my ideal router for $50

After my Asus N66U kicked the bucket, I considered a few options: another all-in-one router, upgrade to something like an EdgeRouter , or brew something custom. When I read the Ars Technica article espousing the virtues of building your own router, that pretty much settled it: DIY it is. I’ve got somewhat of a psychological complex when it comes to rolling my own over-engineered solutions,…

When Disks Die: A ZFS Recovery Post-Mortem

I read a lot of tech success stories, but most of them revolve around building out or creating cool stuff. Last week, I had a catastrophic disk failure, and all I wanted was to find some recorded notes about disk recovery in Linux with ZFS. This is a record of my experience to illustrate the strength and maturity of ZFS on Linux and potentially help anyone in a similar situation in the future. For…

Systemd for (Impatient) Sysadmins

systemd : it’s the init system that (some?) love to hate. Full disclosure: I find systemd a little overbearing, although by no means would consider myself militantly anti-systemd. It has obvious advantages, and although I’m at philosophical odds with it at some levels, I see no reason why everybody shouldn’t understand it a bit better - especially now that most people will need…

Advent Of Code 2016 in Haskell

I recently (finally!) finished the Advent of Code challenges using Haskell. I’m still a Haskell wannabe, but the suite of problems provided an interesting backdrop for a number of Haskell concepts that I wanted to share. The long-form retrospective is here; if you want to see a condensed collection of a few Haskell toolchain by-products, check out my shorter summary under GitHub pages .…

systemd, User Instances, Device Units, and Media Archiving

I recently used systemd , HandBrake , and some simple scripts to digitize a large collection of physical media (for personal, archival use.) In this post I’ll go through systemd features that made this easier and cover all the components that make the automated pipeline work. If systemd, automation, or digital archiving sounds interesting to you, then read on! Table of Contents The Problem…

Kippo Honeypot Video Gallery

Honeypots are rad. Their uses are varied, but I’ve used my own mostly for research (and entertainment.) It’s been running for over a year now, and I thought it would be worthwhile (and interesting) to summarize my findings. This honeypot is running on one of my non-critical servers with relatively minimal exposure, so the findings contained herein could be considered a good snapshot of…

Running Docker on CentOS - External Network Access

This is just a short blip for people running Docker on CentOS who have encountered problems accessing containers from outside the localhost. The long and short of it is this command: shell sysctl net.ipv4.ip_forward=1 Why? Read this answer on StackExchange first. When Docker configures your iptables rules for network access, it likes to create a docker0 interface alongside any other network…

Practical Linux Pipelining

There are many subtle joys associated with working almost exclusively in the command line all day: tab completion, a simple interface, and unix pipes . Like general command-line mastery, learning how to wrest unix pipes to your best advantage can translate into a wide variety of benefits. Don’t get me wrong, when you need a scripting language, use a fully fledged scripting language –…

SSH Kung Fu

OpenSSH is an incredible tool. Though primarily relied upon as a secure alternative to plaintext remote tools like telnet or rsh, OpenSSH (hereafter referred to as plain old ssh) has become a swiss army knife of functionality for far more than just remote logins. I rely on ssh every day for multiple purposes and feel the need to share the love for this excellent tool. What follows is a list for…

Please stop hashing passwords

Have I got your attention? It’s a sensationalist title, but this is important and developers/administrators still get it wrong. Both online and professionally, I encounter technical people still turning to traditional hashing algorithms like SHA or, Schneier forbid, MD5 when making decisions about scrambling user credentials. Even this recent question on Stack Overflow Exchange has yielded…

An Exercise in Weak Random Seed Exploitation

Last weekend I participated in a capture-the-flag event sponsored by Bishop Fox and ran by students at BYU. Following the event I decided that it may be fun to try and crack the scoring software itself – so I’ve written up the process here to explain how I put the exploit together. Although spoofing client-side authentication tokens is nothing new (and the targeted framework in this…

Docker DVWA Container How-To

Figure 1: Docker Docker is an interesting cgroups -based virtualization alternative that uses containers to deploy applications. Docker and solutions like it are useful because: Application deployments occur in identical environments, eliminating per-host quirks Process isolation strategies incur lower overheads than emulating hardware devices Images can be built, shared, and re-used in a…

Yet Another Vim Setup

Figure 1: Sample screenshot editing my .vimrc Vim is an excellent text editor. I’ve used it for many years and like most vim users, have collected a fairly large collection of settings in my .vimrc and learned how to grok my vim usage effectively through a lot of trial and error. To that end, I’ve tried to assemble a useful overview of my experience with vim. Foreword: Why? Why would…

Raspberry Pi XBMC How-To

Figure 1: The final product A while back I finally got my 512MB revision 2 model Raspberry Pi to successfully run OpenELEC. The picture to the right shows it running, using a shared network mount to access all of my media files. Some folks requested a write-up detailing how I put everything together, so I’m going to try and provide a generalized walkthrough for those with the initiative to…

The blog zygote

Figure 1: Another blog to read, why not? Putting together all the moving pieces to get this blog to work the way I wanted took a little while. In the interest of sharing how I did it in case this helps others, I thought I’d share the approach I took. Overview So, here’s the way it goes down: I’m using jekyll to publish. If you’re unfamiliar with it, jekyll essentially lets…

In which I make a blog

This is, hopefully, the beginning of my personal blog entries. I’ve started to blog several times over the years and only gotten this far. We’ll see how this attempt turns out. I want to write my personal thoughts on here, technical discussions about computing, and pictures of cats in top hats if I have the resources to spare. My email address is at the bottom of the site. If you want…