- Three rules for choosing a VPN that takes your privacy seriously
The lesser-known risks of ISPs and why I chose ExpressVPN.
- Deceptively simple search-and-replace across multiple files
How to interactively search-and-replace across many files with just two commands, thanks to Vim.
- Command line tricks for managing your messy open source repository
A handy toolbox for the terminal to help open source maintainers make their projects sparkle.
- Bash and shell expansions: lazy list-making
A tour of brace expansion, shell parameter expansions, and playing with substrings in Bash.
- A portable Makefile for continuous delivery with Hugo and GitHub Pages
My Makefile for building this site, optimizing images, and running my CI/CD GitHub Actions flow.
- How to set up OpenVPN on AWS EC2 and fix DNS leaks on Ubuntu 18.04 LTS
A guide for setting up your own private VPN service, and understanding and fixing a DNS leak.
- How to do twice as much with half the keystrokes using `.bashrc`
An overview of time-saving aliases, functions, and creating a useful Bash prompt.
- How to set up a fresh Ubuntu desktop using only dotfiles and bash scripts
Configure settings, install programs, and customize your desktop environment with a single bash command.
- How to write Bash one-liners for cloning and managing GitHub and GitLab repositories
Using xargs and awk in Bash to automate managing remote-hosted repositories.
- A quick guide to changing your GitHub username
Some additional steps to consider after making a change to your username on GitHub.
- A remote sync solution for iOS and Linux: Git and Working Copy
How to set up a cross-platform solution for working with Git on iOS.
- Batch renaming images, including image resolution, with awk
How to batch rename images with custom values using file, awk, and rename - in rainbow colors!
- How I created custom desktop notifications using terminal and cron
How you can use tools your Linux system already has to create custom desktop notifications.