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…typically to grab video game soundtracks… 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…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…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/