davideisinger.com

My personal website
Log | Files | Refs | README

evanhahn-com-6hstph.txt (20931B)


      1 Scripts I wrote that I use all the time
      2 
      3 
      4 by [1]Evan Hahn
      5 , posted Oct 22, 2025
      6 
      7 In my [2]decade-plus of maintaining my dotfiles, I’ve written a lot of little
      8 shell scripts. Here’s a big list of my personal favorites.
      9 
     10 Clipboard
     11 
     12 [3]copy and [4]pasta are simple wrappers around system clipboard managers, like
     13 pbcopy on macOS and xclip on Linux. I use these all the time.
     14 
     15 # High level examples
     16 run_some_command | copy
     17 pasta > file_from_my_clipboard.txt
     18 
     19 # Copy a file's contents
     20 copy < file.txt
     21 
     22 # Open a file path from your clipboard
     23 vim "$(pasta)"
     24 
     25 # Decode some base64 from the clipboard
     26 pasta | base64 --decode
     27 
     28 [5]pastas prints the current state of your clipboard to stdout, and then
     29 whenever the clipboard changes, it prints the new version. I use this once a
     30 week or so.
     31 
     32 # High level example
     33 pastas > everything_i_copied.txt
     34 
     35 # Download every link I copy to my clipboard
     36 pastas | wget -i -
     37 
     38 [6]cpwd copies the current directory to the clipboard. Basically pwd | copy. I
     39 often use this when I’m in a directory and I want use that directory in another
     40 terminal tab; I copy it in one tab and cd to it in another. I use this once a
     41 day or so.
     42 
     43 File management
     44 
     45 [7]mkcd foo makes a directory and cds inside. It’s basically mkdir foo && cd
     46 foo. I use this all the time—almost every time I make a directory, I want to go
     47 in there.
     48 
     49 [8]tempe changes to a temporary directory. It’s basically cd "$(mktemp -d)". I
     50 use this all the time to hop into a sandbox directory. It saves me from having
     51 to manually clean up my work. A couple of common examples:
     52 
     53 # Download a file and extract it
     54 tempe
     55 wget 'https://example.com/big_file.tar.xz'
     56 tar -xf big_file.tar.xz
     57 # ...do something with the file...
     58 
     59 # Write a quick throwaway script to try something out
     60 tempe
     61 vim foo.py
     62 python3 foo.py
     63 
     64 [9]trash a.txt b.png moves a.txt and b.png to the trash. Supports macOS and
     65 Linux. I use this every day. I definitely run it more than rm, and it saves me
     66 from accidentally deleting files.
     67 
     68 [10]mksh makes it quick to create shell scripts. mksh foo.sh creates foo.sh,
     69 makes it executable with chmod u+x, adds some nice Bash prefixes, and opens it
     70 with my editor (Vim in my case). I use this every few days. Many of the scripts
     71 in this post were made with this helper!
     72 
     73 Internet
     74 
     75 [11]serveit starts a static file server on localhost:8000 in the current
     76 directory. It’s basically python3 -m http.server 8000 but handles cases where
     77 Python isn’t installed, falling back to other programs. I use this a few times
     78 a week. Probably less useful if you’re not a web developer.
     79 
     80 [12]getsong uses yt-dlp to download songs, often from YouTube or SoundCloud, in
     81 the highest available quality. For example, getsong https://www.youtube.com/
     82 watch?v=dQw4w9WgXcQ downloads that video as a song. I use this a few times a
     83 week&mldr;typically to grab video game soundtracks&mldr;
     84 
     85 [13]getpod similarly uses yt-dlp to download something for a podcast player.
     86 There are a lot of videos that I’d rather listen to like a podcast. I use this
     87 a few times a month.
     88 
     89 [14]getsubs downloads the English subtitles for a video. (There’s some
     90 fanciness to look for “official” subtitles, falling back to auto-generated
     91 subtitles.) Sometimes I read the subtitles manually, sometimes I run getsubs
     92 https://video.example/foo | ollama run llama3.2 "Summarize this", sometimes I
     93 just want it as a backup of a video I don’t want to save on my computer. I use
     94 this every few days.
     95 
     96 [15]wifi off, wifi on, and wifi toggle are useful for controlling my system’s
     97 wifi. wifi toggle is the one I use most often, when I’m having network trouble.
     98 I use this about once a month.
     99 
    100 [16]url "$my_url" parses a URL into its parts. I use this about once a month to
    101 pull data out of a URL, often because I don’t want to click a nasty tracking
    102 link.
    103 
    104 url 'https://evil.example/track-user-link?url=https%3A%2F%2Furl-i-want-to-visit.example&track=06f8582a-91e6-4c9c-bf8e-516884584aba#cookie=123'
    105 # original: https://evil.example/track-user-link?url=https%3A%2F%2Furl-i-want-to-visit.example&track=06f8582a-91e6-4c9c-bf8e-516884584aba#cookie=123
    106 # protocol: https
    107 # hostname: evil.example
    108 # path: /track-user-link
    109 # query: url=https%3A%2F%2Furl-i-want-to-visit.example&track=06f8582a-91e6-4c9c-bf8e-516884584aba
    110 # - url https://url-i-want-to-visit.example
    111 # - track 06f8582a-91e6-4c9c-bf8e-516884584aba
    112 # hash: cookie=123
    113 
    114 Text processing
    115 
    116 [17]line 10 prints line 10 from stdin. For example, cat some_big_file | line 10
    117 prints line 10 of a file. This feels like one of those things that should be
    118 built in, like head and tail. I use this about once a month.
    119 
    120 [18]scratch opens a temporary Vim buffer. It’s basically an alias for $EDITOR $
    121 (mktemp). I use this about once a day for quick text manipulation tasks, or to
    122 take a little throwaway note.
    123 
    124 [19]straightquote converts “smart quotes” to “straight quotes” (sometimes
    125 called “dumb quotes”). I don’t care much about these in general, but they
    126 sometimes weasel their way into code I’m working on. It can also make the file
    127 size smaller, which is occasionally useful. I use this at least once a week.
    128 
    129 [20]markdownquote adds > before every line. I use it in Vim a lot; I select a
    130 region and then run :'<,'>!markdownquote to quote the selection. I use this
    131 about once a week.
    132 
    133 [21]length foo returns 3. (I should probably just use wc -c.)
    134 
    135 [22]jsonformat takes JSON at stdin and pretty-prints it to stdout. I use this a
    136 few times a year.
    137 
    138 [23]uppered and [24]lowered convert strings to upper and lowercase. For
    139 example, echo foo | uppered returns FOO. I use these about once a week.
    140 
    141 [25]nato bar returns Bravo Alfa Romeo. I use this most often when talking to
    142 customer service and need to read out a long alphanumeric string, which has
    143 only happened a couple of times in my whole life. But it’s sometimes useful!
    144 
    145 [26]u+ 2025 returns ñ, LATIN SMALL LETTER N WITH TILDE. A quick way to do a
    146 lookup of a Unicode string. I don’t use this one that often&mldr;probably about
    147 once a month.
    148 
    149 [27]snippets foo cats ~/.config/evanhahn-snippets/foo. I use snippet arrow for
    150 →, snippet recruiter for a quick “not interested” response to job recruiters,
    151 snippet lorem to print a “Lorem ipsum” block, and a few others. I probably use
    152 one or two of these a week.
    153 
    154 REPL launchers
    155 
    156 Inspired by Ruby’s built-in irb REPL, I’ve made:
    157 
    158   • [28]iclj to start a Clojure REPL
    159   • [29]ijs to start a Deno REPL (or a Node REPL when Deno is missing)
    160   • [30]iphp to start a PHP REPL
    161   • [31]ipy to start a Python REPL
    162   • [32]isql to start a SQLite shell (an alias for sqlite3 :memory:)
    163 
    164 Dates and times
    165 
    166 [33]hoy prints the current date in ISO format, like 2020-04-20. I use this all
    167 the time because I like to prefix files with the current date.
    168 
    169 [34]timer 10m starts a timer for 10 minutes, then (1) plays an audible ring
    170 sound (2) sends an OS notification (see notify below). I often use bb timer 5m
    171 to start a 5 minute timer in the background (see bb below). I use this almost
    172 every day as a useful way to keep on track of time.
    173 
    174 [35]rn prints the current time and date using date and cal. I probably use it
    175 once a week. It prints something like this:
    176 
    177  4:20PM on Wednesday, October 22, 2025
    178 
    179    September 2025
    180 Su Mo Tu We Th Fr Sa
    181     1  2  3  4  5  6
    182  7  8  9 10 11 12 13
    183 14 15 16 17 18 19 20
    184 21 22 23 24 25 26 27
    185 28 29 30
    186 
    187 Audio and video and pictures
    188 
    189 [36]ocr my_image.png extracts text from an image and prints it to stdout. It
    190 only works on macOS, unfortunately, but I want to fix that. (I wrote [37]a post
    191 about this script.)
    192 
    193 [38]boop (an alias, not a shell script) makes a happy sound if the previous
    194 command succeeded and a sad sound otherwise. I do things like run_the_tests ;
    195 boop which will tell me, audibly, whether the tests succeed. It’s also helpful
    196 for long-running commands, because you get a little alert when they’re done. I
    197 use this all the time.
    198 
    199 [39]sfx foo basically just plays ~/.config/evanhahn-sfx/foo.ogg. Used in boop
    200 and timer above.
    201 
    202 [40]tunes uses mpv to play audio from a file. I use this all the time, running
    203 tunes --shuffle ~/music.
    204 
    205 [41]pix uses mpv to show a picture. I use this a few times a week to look at
    206 photos.
    207 
    208 [42]radio is a little wrapper around some of my favorite internet radio
    209 stations. radio lofi and radio salsa are two of my favorites. I use this a few
    210 times a month.
    211 
    212 [43]speak reads from stdin, removes all Markdown formatting, and pipes it to a
    213 text-to-speech system (say on macOS and espeak-ng on Linux). [44]I like using
    214 text-to-speech when I can’t proofread out loud. I use this a few times a month.
    215 
    216 [45]shrinkvid is an ffmpeg wrapper that compresses a video a bit. I use this
    217 about once a month.
    218 
    219 [46]removeexif removes EXIF data from JPEGs. I don’t use this much, in part
    220 because it doesn’t remove EXIF data from other file formats like PNGs&mldr;but
    221 I keep it around because I hope to expand this one day.
    222 
    223 [47]tuivid is one I almost never use, but you can use it to watch videos in the
    224 terminal. It’s cursed and I love it, even if I never use it.
    225 
    226 Process management
    227 
    228 [48]each is my answer to xargs and find ... -exec, which I find hard to use.
    229 For example, ls | each 'du -h {}' runs du -h on every file in a directory. I
    230 use this infrequently but I always mess up xargs so this is a nice alternative.
    231 
    232 [49]running foo is like ps aux | grep foo but much easier (for me) to read—just
    233 the PID (highlighted in purple) and the command.
    234 
    235 [50]murder foo or murder 1234 is a wrapper around kill that sends kill -15
    236 $PID, waits a little, then sends kill -2, waits and sends kill -1, waits before
    237 finally sending kill -9. If I want a program to stop, I want to ask it nicely
    238 before getting more aggressive. I use this a few times a month.
    239 
    240 [51]waitfor $PID waits for a PID to exit before continuing. It also keeps the
    241 system from going to sleep. I use this about once a month to do things like:
    242 
    243 # I want to start something only after another process finishes
    244 waitfor 1234 ; something_else
    245 
    246 # I started a long-running process and want to know when it's done
    247 waitfor 1234 ; notify 'process 1234 is done'
    248 
    249 [52]bb my_command is like my_command & but it really really runs it in the
    250 background. You’ll never hear from that program again. It’s useful when you
    251 want to start a daemon or long-running process you truly don’t care about. I
    252 use bb ollama serve and bb timer 5m most often. I use this about once a day.
    253 
    254 [53]prettypath prints $PATH but with newlines separating entries, which makes
    255 it much easier to read. I use this pretty rarely—mostly just when I’m debugging
    256 a $PATH issue, which is unusual—but I’m glad I have it when I do.
    257 
    258 [54]tryna my_command runs my_command until it succeeds. [55]trynafail
    259 my_command runs my_command until it fails. I don’t use this much, but it’s
    260 useful for various things. tryna wget ... will keep trying to download
    261 something. trynafail npm test will stop once my tests start failing.
    262 
    263 Quick references
    264 
    265 [56]emoji is my emoji lookup helper. For example, emoji cool prints the
    266 following:
    267 
    268 😛
    269 😒
    270 😎
    271 🪭
    272 🆒
    273 
    274 [57]httpstatus prints all HTTP statuses. httpstatus 204 prints 204 No Content.
    275 As a web developer, I use this a few times a month, instead of looking it up
    276 online.
    277 
    278 [58]alphabet just prints the English alphabet in upper and lowercase. I use
    279 this surprisingly often (probably about once a month). It literally just prints
    280 this:
    281 
    282 abcdefghijklmnopqrstuvwxyz
    283 ABCDEFGHIJKLMNOPQRSTUVWXYZ
    284 
    285 System management
    286 
    287 [59]theme 0 changes my whole system to dark mode. theme 1 changes it to light
    288 mode. It doesn’t just change the OS theme—it also changes my Vim, Tmux, and
    289 terminal themes. I use this at least once a day.
    290 
    291 [60]sleepybear puts my system to sleep, and works on macOS and Linux. I use
    292 this a few times a week.
    293 
    294 [61]ds-destroy recursively deletes all .DS_Store files in a directory. I hate
    295 that macOS clutters directories with these files! I don’t use this often, but
    296 I’m glad I have it when I need it.
    297 
    298 Grab bag
    299 
    300 [62]catbin foo is basically cat "$(which foo)". Useful for seeing the source
    301 code of a file in your path (used it for writing up this post, for example!). I
    302 use this a few times a month.
    303 
    304 [63]notify sends an OS notification. It’s used in several of my other scripts
    305 (see above). I also do something like this about once a month:
    306 
    307 run_some_long_running_process ; notify 'all done'
    308 
    309 [64]uuid prints a v4 UUID. I use this about once a month.
    310 
    311 What about your scripts?
    312 
    313 These are just scripts I use a lot. I hope some of them are useful to you!
    314 
    315 If you liked this post, you might like [65]“Why ‘alias’ is my last resort for
    316 aliases” and [66]“A decade of dotfiles”.
    317 
    318 Oh, and [67]contact me if you have any scripts you think I’d like.
    319 
    320 [68][logo_white]
    321 
    322   • [69]About me
    323   • [70]Contact
    324   • [71]Projects
    325   • [72]Guides
    326   • [73]Blog
    327 
    328   • [74]RSS
    329   • [75]Newsletter
    330   • [76]Mastodon
    331 
    332 Unless noted otherwise, content is licensed under the [77]Creative Commons
    333 Attribution-NonCommercial License and code under the [78]Unlicense. Logo by 
    334 [79]Lulu Tang. Profile photo by [80]Ali Boschert-Downs.
    335 
    336 
    337 References:
    338 
    339 [1] https://evanhahn.com/
    340 [2] https://evanhahn.com/a-decade-of-dotfiles/
    341 [3] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/copy
    342 [4] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/pasta
    343 [5] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/pastas
    344 [6] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/cpwd
    345 [7] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/zsh/.config/zsh/aliases.zsh#L38-L41
    346 [8] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/zsh/.config/zsh/aliases.zsh#L43-L51
    347 [9] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/trash
    348 [10] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/mksh
    349 [11] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/serveit
    350 [12] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/getsong
    351 [13] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/getpod
    352 [14] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/getsubs
    353 [15] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/wifi
    354 [16] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/url
    355 [17] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/line
    356 [18] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/scratch
    357 [19] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/straightquote
    358 [20] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/markdownquote
    359 [21] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/length
    360 [22] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/jsonformat
    361 [23] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/uppered
    362 [24] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/lowered
    363 [25] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/nato
    364 [26] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/u+
    365 [27] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/snippets
    366 [28] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/iclj
    367 [29] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/ijs
    368 [30] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/iphp
    369 [31] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/ipy
    370 [32] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/isql
    371 [33] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/hoy
    372 [34] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/timer
    373 [35] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/rn
    374 [36] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/ocr
    375 [37] https://evanhahn.com/mac-ocr-script/
    376 [38] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/zsh/.config/zsh/aliases.zsh#L53-L61
    377 [39] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/sfx
    378 [40] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/tunes
    379 [41] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/pix
    380 [42] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/radio
    381 [43] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/speak
    382 [44] https://evanhahn.com/use-text-to-speech-if-you-cant-proofread-aloud/
    383 [45] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/shrinkvid
    384 [46] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/removeexif
    385 [47] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/tuivid
    386 [48] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/each
    387 [49] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/running
    388 [50] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/murder
    389 [51] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/waitfor
    390 [52] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/bb
    391 [53] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/prettypath
    392 [54] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/tryna
    393 [55] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/trynafail
    394 [56] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/emoji
    395 [57] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/httpstatus
    396 [58] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/alphabet
    397 [59] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/theme
    398 [60] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/sleepybear
    399 [61] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/ds-destroy
    400 [62] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/catbin
    401 [63] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/notify
    402 [64] https://codeberg.org/EvanHahn/dotfiles/src/commit/843b9ee13d949d346a4a73ccee2a99351aed285b/home/bin/bin/uuid
    403 [65] https://evanhahn.com/why-alias-is-my-last-resort-for-aliases/
    404 [66] https://evanhahn.com/a-decade-of-dotfiles/
    405 [67] https://evanhahn.com/contact/
    406 [68] https://evanhahn.com/
    407 [69] https://evanhahn.com/
    408 [70] https://evanhahn.com/contact/
    409 [71] https://evanhahn.com/projects/
    410 [72] https://evanhahn.com/guides/
    411 [73] https://evanhahn.com/blog/
    412 [74] https://evanhahn.com/blog/index.xml
    413 [75] https://buttondown.com/evanhahn
    414 [76] https://bigshoulders.city/@EvanHahn
    415 [77] https://creativecommons.org/licenses/by-nc/4.0/
    416 [78] https://unlicense.org/
    417 [79] http://luluspice.com/
    418 [80] https://www.instagram.com/boschertdowns/