{"$schema":"https://ejfox.com/schema/page-twin@1.json","kind":"blog_post","url":"https://ejfox.com/blog/week-notes/2024-31","json_url":"https://ejfox.com/blog/week-notes/2024-31.json","generator":"ejfox.com/json-twin@1","data":{"cacheVersion":"2026-05-13-gear-cards","html":"<h2 class=\"\" id=\"overview-of-the-week\">Overview of the Week</h2>\n<p class=\"\">Got back from Hanging with Ben &#x26; Kevin at Kevin's cabin. On Monday family helped me move out a lot of the big remaining stuff from my apartment in to storage: bookshelves, desk, bedframe. Everyone helped and left exhausted.</p>\n<p class=\"\"><a href=\"/blog/2024/my-modern-scrapbook\" class=\"internal-link text-blue-600 dark:text-blue-400\">my-modern-scrapbook</a>: wrote a blog post about the Scrapbook system I have been building, which is good, because I realized how much sprawling work I have put into it without a clear understanding of my motivations. Sitting down to write 2000+ words on it made me really think about that side of things, which is good.</p>\n<p class=\"\">I also figured out it's super easy to get little videos into my blog posts since I already have an Automator action to automatically via a shell script run through an Automator folder action that triggers anytime a new file is added to <code class=\"md-inline-code\">screenshots</code> - it automatically uploads videos, too, like the ones recorded if I hit CMD+shift+5 and record a little segment of my screen. Once it's uploaded its URL is copied to my clipboard, and I just swap out <code class=\"md-inline-code\">mp4</code> for <code class=\"md-inline-code\">gif</code>. It's also nice to set some extra Cloudinary processing params like <code class=\"md-inline-code\">/q_auto/w_768/e_loop/</code> to make the quality automatic, resize to a width of 768, and loop the gif</p>\n<p class=\"\">Here's the script that auto-uploads to Cloudinary and appends the screenshot to my weekly note with <a href=\"https://cloudinary.com/documentation/cloudinary_cli\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"external-link group inline-flex items-center text-blue-600 dark:text-blue-400\" data-preview-url=\"https://cloudinary.com/documentation/cloudinary_cli\">cld<svg class=\"inline-block w-4 h-4 ml-1 opacity-50 dark:opacity-75 group-hover:opacity-100 transition-opacity align-text-bottom\" xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\"><path fill=\"currentColor\" d=\"M24 14.86c0 2.173-1.376 3.974-3.59 4.7l-.1.031V17.99c1.378-.58 2.187-1.727 2.187-3.13a3.684 3.684 0 0 0-3.608-3.669h-.596l-.144-.569a6.5 6.5 0 0 0-6.272-4.97a6.39 6.39 0 0 0-5.81 3.664l-.184.376l-.417.044a4.43 4.43 0 0 0-3.305 2.088a4.43 4.43 0 0 0 1.458 6.095v1.69h-.01l-.149-.068a5.94 5.94 0 0 1-3.366-4.35a5.94 5.94 0 0 1 4.8-6.894a7.88 7.88 0 0 1 6.983-4.15a8.03 8.03 0 0 1 7.59 5.589A5.21 5.21 0 0 1 24 14.86M8.682 13.538h.565a.066.066 0 0 0 .046-.111l-2.209-2.211a.066.066 0 0 0-.093 0l-2.211 2.21a.066.066 0 0 0 .048.112h.556a.066.066 0 0 1 .066.065v5.058c0 .659.534 1.193 1.193 1.193h2.604a.066.066 0 0 0 .046-.112l-.33-.33a1.2 1.2 0 0 1-.348-.839v-4.97a.07.07 0 0 1 .067-.065m9.77 2.546h.566a.066.066 0 0 0 .046-.113l-2.21-2.209l-.002-.001a.064.064 0 0 0-.09.001l-2.211 2.209a.066.066 0 0 0 .046.113h.556a.066.066 0 0 1 .066.066v2.51c0 .66.534 1.193 1.193 1.193h2.606a.066.066 0 0 0 .046-.11l-.33-.33a1.2 1.2 0 0 1-.348-.84V16.15a.066.066 0 0 1 .066-.066m-4.885-1.274h.565a.066.066 0 0 0 .047-.111l-2.21-2.203h-.001a.066.066 0 0 0-.093 0l-2.208 2.207a.066.066 0 0 0 .045.111h.563a.07.07 0 0 1 .066.068v3.779c0 .659.534 1.193 1.192 1.193h2.599a.066.066 0 0 0 .047-.112l-.332-.33a1.2 1.2 0 0 1-.346-.839v-3.695c0-.037.03-.067.066-.068\" class=\"\"></path></svg></a></p>\n<figure data-rehype-pretty-code-figure=\"\" class=\"\"><pre class=\"md-pre\" style=\"background-color:#09090b;color:#cccac2\" tabindex=\"0\" data-language=\"bash\" data-theme=\"\"><code data-language=\"bash\" data-theme=\"\" style=\"display: grid;\" class=\"md-codeblock\"><span class=\"\" data-line=\"\"><span style=\"color:#B8CFE680;font-style:italic\" class=\"\">#!/bin/bash</span></span>\n<span class=\"\" data-line=\"\"> </span>\n<span class=\"\" data-line=\"\"><span style=\"color:#B8CFE680;font-style:italic\" class=\"\"># API keys for Cloudinary</span></span>\n<span class=\"\" data-line=\"\"><span style=\"color:#FFAD66\" class=\"\">export</span><span style=\"color:#CCCAC2\" class=\"\"> CLOUDINARY_URL</span><span style=\"color:#F29E74\" class=\"\">=</span><span style=\"color:#CCCAC2\" class=\"\">cloudinary://foo@bar</span></span>\n<span class=\"\" data-line=\"\"> </span>\n<span class=\"\" data-line=\"\"><span style=\"color:#B8CFE680;font-style:italic\" class=\"\"># Function to get the current year and week number</span></span>\n<span class=\"\" data-line=\"\"><span style=\"color:#FFD173\" class=\"\">get_weekly_note_path</span><span style=\"color:#CCCAC2\" class=\"\">() {</span></span>\n<span class=\"\" data-line=\"\"><span style=\"color:#FFAD66\" class=\"\">  local</span><span style=\"color:#CCCAC2\" class=\"\"> year_week</span><span style=\"color:#F29E74\" class=\"\">=</span><span style=\"color:#CCCAC2\" class=\"\">$(</span><span style=\"color:#73D0FF\" class=\"\">date</span><span style=\"color:#D5FF80\" class=\"\"> +%Y-%V</span><span style=\"color:#CCCAC2\" class=\"\">)</span></span>\n<span class=\"\" data-line=\"\"><span style=\"color:#FFAD66\" class=\"\">  local</span><span style=\"color:#CCCAC2\" class=\"\"> note_path</span><span style=\"color:#F29E74\" class=\"\">=</span><span style=\"color:#D5FF80\" class=\"\">\"~/Library/Mobile Documents/iCloud~md~obsidian/Documents/ejfox/Week Notes/$</span><span style=\"color:#CCCAC2\" class=\"\">{year_week}</span><span style=\"color:#D5FF80\" class=\"\">.md\"</span></span>\n<span class=\"\" data-line=\"\"><span style=\"color:#F28779\" class=\"\">  echo</span><span style=\"color:#D5FF80\" class=\"\"> \"</span><span style=\"color:#CCCAC2\" class=\"\">$note_path</span><span style=\"color:#D5FF80\" class=\"\">\"</span></span>\n<span class=\"\" data-line=\"\"><span style=\"color:#CCCAC2\" class=\"\">}</span></span>\n<span class=\"\" data-line=\"\"> </span>\n<span class=\"\" data-line=\"\"><span style=\"color:#B8CFE680;font-style:italic\" class=\"\"># Iterate over each passed argument</span></span>\n<span class=\"\" data-line=\"\"><span style=\"color:#FFAD66\" class=\"\">for</span><span style=\"color:#CCCAC2\" class=\"\"> file </span><span style=\"color:#FFAD66\" class=\"\">in</span><span style=\"color:#D5FF80\" class=\"\"> \"</span><span style=\"color:#DFBFFF\" class=\"\">$@</span><span style=\"color:#D5FF80\" class=\"\">\"</span></span>\n<span class=\"\" data-line=\"\"><span style=\"color:#FFAD66\" class=\"\">do</span></span>\n<span class=\"\" data-line=\"\"><span style=\"color:#B8CFE680;font-style:italic\" class=\"\">  # Check if the file exists</span></span>\n<span class=\"\" data-line=\"\"><span style=\"color:#FFAD66\" class=\"\">  if</span><span style=\"color:#CCCAC2\" class=\"\"> [ </span><span style=\"color:#F29E74\" class=\"\">-f</span><span style=\"color:#D5FF80\" class=\"\"> \"</span><span style=\"color:#CCCAC2\" class=\"\">$file</span><span style=\"color:#D5FF80\" class=\"\">\"</span><span style=\"color:#CCCAC2\" class=\"\"> ]</span><span style=\"color:#CCCAC2B3\" class=\"\">;</span><span style=\"color:#FFAD66\" class=\"\"> then</span></span>\n<span class=\"\" data-line=\"\"><span style=\"color:#B8CFE680;font-style:italic\" class=\"\">    # Upload to Cloudinary and capture output</span></span>\n<span class=\"\" data-line=\"\"><span style=\"color:#CCCAC2\" class=\"\">    upload_output</span><span style=\"color:#F29E74\" class=\"\">=</span><span style=\"color:#CCCAC2\" class=\"\">$(</span><span style=\"color:#73D0FF\" class=\"\">/opt/homebrew/bin/cld</span><span style=\"color:#D5FF80\" class=\"\"> uploader</span><span style=\"color:#D5FF80\" class=\"\"> upload</span><span style=\"color:#D5FF80\" class=\"\"> \"</span><span style=\"color:#CCCAC2\" class=\"\">$file</span><span style=\"color:#D5FF80\" class=\"\">\"</span><span style=\"color:#D5FF80\" class=\"\"> use_filename=</span><span style=\"color:#DFBFFF\" class=\"\">true</span><span style=\"color:#D5FF80\" class=\"\"> unique_filename=</span><span style=\"color:#DFBFFF\" class=\"\">false</span><span style=\"color:#F29E74\" class=\"\"> 2>&#x26;1</span><span style=\"color:#CCCAC2\" class=\"\">)</span></span>\n<span class=\"\" data-line=\"\"><span style=\"color:#CCCAC2\" class=\"\">    upload_exit_status</span><span style=\"color:#F29E74\" class=\"\">=</span><span style=\"color:#5CCFE6;font-style:italic\" class=\"\">$?</span></span>\n<span class=\"\" data-line=\"\"> </span>\n<span class=\"\" data-line=\"\"><span style=\"color:#B8CFE680;font-style:italic\" class=\"\">    # Check if the upload was successful</span></span>\n<span class=\"\" data-line=\"\"><span style=\"color:#FFAD66\" class=\"\">    if</span><span style=\"color:#CCCAC2\" class=\"\"> [ $upload_exit_status </span><span style=\"color:#F29E74\" class=\"\">-eq</span><span style=\"color:#DFBFFF\" class=\"\"> 0</span><span style=\"color:#CCCAC2\" class=\"\"> ]</span><span style=\"color:#CCCAC2B3\" class=\"\">;</span><span style=\"color:#FFAD66\" class=\"\"> then</span></span>\n<span class=\"\" data-line=\"\"><span style=\"color:#B8CFE680;font-style:italic\" class=\"\">      # Attempt to extract the URL using the absolute path for jq</span></span>\n<span class=\"\" data-line=\"\"><span style=\"color:#CCCAC2\" class=\"\">      url</span><span style=\"color:#F29E74\" class=\"\">=</span><span style=\"color:#CCCAC2\" class=\"\">$(</span><span style=\"color:#F28779\" class=\"\">echo</span><span style=\"color:#D5FF80\" class=\"\"> \"</span><span style=\"color:#CCCAC2\" class=\"\">$upload_output</span><span style=\"color:#D5FF80\" class=\"\">\"</span><span style=\"color:#F29E74\" class=\"\"> |</span><span style=\"color:#73D0FF\" class=\"\"> /opt/homebrew/bin/jq</span><span style=\"color:#95E6CB\" class=\"\"> -r</span><span style=\"color:#D5FF80\" class=\"\"> '.url'</span><span style=\"color:#F29E74\" class=\"\"> 2></span><span style=\"color:#D5FF80\" class=\"\">/dev/null</span><span style=\"color:#CCCAC2\" class=\"\">)</span></span>\n<span class=\"\" data-line=\"\"> </span>\n<span class=\"\" data-line=\"\"><span style=\"color:#B8CFE680;font-style:italic\" class=\"\">      # Check if the URL is non-empty</span></span>\n<span class=\"\" data-line=\"\"><span style=\"color:#FFAD66\" class=\"\">      if</span><span style=\"color:#CCCAC2\" class=\"\"> [ </span><span style=\"color:#F29E74\" class=\"\">-n</span><span style=\"color:#D5FF80\" class=\"\"> \"</span><span style=\"color:#CCCAC2\" class=\"\">$url</span><span style=\"color:#D5FF80\" class=\"\">\"</span><span style=\"color:#CCCAC2\" class=\"\"> ]</span><span style=\"color:#CCCAC2B3\" class=\"\">;</span><span style=\"color:#FFAD66\" class=\"\"> then</span></span>\n<span class=\"\" data-line=\"\"><span style=\"color:#F28779\" class=\"\">        echo</span><span style=\"color:#D5FF80\" class=\"\"> \"</span><span style=\"color:#CCCAC2\" class=\"\">$url</span><span style=\"color:#D5FF80\" class=\"\">\"</span><span style=\"color:#F29E74\" class=\"\"> |</span><span style=\"color:#73D0FF\" class=\"\"> pbcopy</span></span>\n<span class=\"\" data-line=\"\"><span style=\"color:#B8CFE680;font-style:italic\" class=\"\">        # Display success notification with the URL</span></span>\n<span class=\"\" data-line=\"\"><span style=\"color:#73D0FF\" class=\"\">        osascript</span><span style=\"color:#95E6CB\" class=\"\"> -e</span><span style=\"color:#D5FF80\" class=\"\"> \"display notification </span><span style=\"color:#95E6CB\" class=\"\">\\\"</span><span style=\"color:#D5FF80\" class=\"\">Uploaded </span><span style=\"color:#CCCAC2\" class=\"\">$file</span><span style=\"color:#D5FF80\" class=\"\"> to Cloudinary and URL copied to clipboard: </span><span style=\"color:#CCCAC2\" class=\"\">$url</span><span style=\"color:#95E6CB\" class=\"\">\\\"</span><span style=\"color:#D5FF80\" class=\"\"> with title </span><span style=\"color:#95E6CB\" class=\"\">\\\"</span><span style=\"color:#D5FF80\" class=\"\">Screenshot Upload</span><span style=\"color:#95E6CB\" class=\"\">\\\"</span><span style=\"color:#D5FF80\" class=\"\">\"</span></span>\n<span class=\"\" data-line=\"\"> </span>\n<span class=\"\" data-line=\"\"><span style=\"color:#B8CFE680;font-style:italic\" class=\"\">        # Get the weekly note file path</span></span>\n<span class=\"\" data-line=\"\"><span style=\"color:#CCCAC2\" class=\"\">        weekly_note_path</span><span style=\"color:#F29E74\" class=\"\">=</span><span style=\"color:#CCCAC2\" class=\"\">$(</span><span style=\"color:#73D0FF\" class=\"\">get_weekly_note_path</span><span style=\"color:#CCCAC2\" class=\"\">)</span></span>\n<span class=\"\" data-line=\"\"> </span>\n<span class=\"\" data-line=\"\"><span style=\"color:#B8CFE680;font-style:italic\" class=\"\">        # Append the markdown image format to the weekly note file</span></span>\n<span class=\"\" data-line=\"\"><span style=\"color:#F28779\" class=\"\">        echo</span><span style=\"color:#95E6CB\" class=\"\"> -e</span><span style=\"color:#D5FF80\" class=\"\"> \"\\n![Screenshot - </span><span style=\"color:#CCCAC2\" class=\"\">$current_date_time</span><span style=\"color:#D5FF80\" class=\"\"> - </span><span style=\"color:#CCCAC2\" class=\"\">$filename</span><span style=\"color:#D5FF80\" class=\"\">](</span><span style=\"color:#CCCAC2\" class=\"\">$url</span><span style=\"color:#D5FF80\" class=\"\">)\"</span><span style=\"color:#F29E74\" class=\"\"> >></span><span style=\"color:#D5FF80\" class=\"\"> \"</span><span style=\"color:#CCCAC2\" class=\"\">$weekly_note_path</span><span style=\"color:#D5FF80\" class=\"\">\"</span></span>\n<span class=\"\" data-line=\"\"> </span>\n<span class=\"\" data-line=\"\"><span style=\"color:#B8CFE680;font-style:italic\" class=\"\">        # Display notification for appending to the weekly note</span></span>\n<span class=\"\" data-line=\"\"><span style=\"color:#B8CFE680;font-style:italic\" class=\"\">        # osascript -e \"display notification \\\"Appended screenshot URL to weekly note: $weekly_note_path\\\" with title \\\"Weekly Note Update\\\"\"</span></span>\n<span class=\"\" data-line=\"\"><span style=\"color:#FFAD66\" class=\"\">      else</span></span>\n<span class=\"\" data-line=\"\"><span style=\"color:#B8CFE680;font-style:italic\" class=\"\">        # Display notification for empty URL</span></span>\n<span class=\"\" data-line=\"\"><span style=\"color:#73D0FF\" class=\"\">        osascript</span><span style=\"color:#95E6CB\" class=\"\"> -e</span><span style=\"color:#D5FF80\" class=\"\"> \"display notification </span><span style=\"color:#95E6CB\" class=\"\">\\\"</span><span style=\"color:#D5FF80\" class=\"\">Failed to extract URL from output</span><span style=\"color:#95E6CB\" class=\"\">\\\"</span><span style=\"color:#D5FF80\" class=\"\"> with title </span><span style=\"color:#95E6CB\" class=\"\">\\\"</span><span style=\"color:#D5FF80\" class=\"\">Debug</span><span style=\"color:#95E6CB\" class=\"\">\\\"</span><span style=\"color:#D5FF80\" class=\"\">\"</span></span>\n<span class=\"\" data-line=\"\"><span style=\"color:#FFAD66\" class=\"\">      fi</span></span>\n<span class=\"\" data-line=\"\"><span style=\"color:#FFAD66\" class=\"\">    else</span></span>\n<span class=\"\" data-line=\"\"><span style=\"color:#B8CFE680;font-style:italic\" class=\"\">      # Display notification for upload failure</span></span>\n<span class=\"\" data-line=\"\"><span style=\"color:#73D0FF\" class=\"\">      osascript</span><span style=\"color:#95E6CB\" class=\"\"> -e</span><span style=\"color:#D5FF80\" class=\"\"> \"display notification </span><span style=\"color:#95E6CB\" class=\"\">\\\"</span><span style=\"color:#D5FF80\" class=\"\">Failed to upload </span><span style=\"color:#CCCAC2\" class=\"\">$file</span><span style=\"color:#D5FF80\" class=\"\"> to Cloudinary. Error: </span><span style=\"color:#CCCAC2\" class=\"\">$upload_output</span><span style=\"color:#95E6CB\" class=\"\">\\\"</span><span style=\"color:#D5FF80\" class=\"\"> with title </span><span style=\"color:#95E6CB\" class=\"\">\\\"</span><span style=\"color:#D5FF80\" class=\"\">Screenshot Upload</span><span style=\"color:#95E6CB\" class=\"\">\\\"</span><span style=\"color:#D5FF80\" class=\"\">\"</span></span>\n<span class=\"\" data-line=\"\"><span style=\"color:#FFAD66\" class=\"\">    fi</span></span>\n<span class=\"\" data-line=\"\"><span style=\"color:#FFAD66\" class=\"\">  else</span></span>\n<span class=\"\" data-line=\"\"><span style=\"color:#B8CFE680;font-style:italic\" class=\"\">    # Display notification for file not found</span></span>\n<span class=\"\" data-line=\"\"><span style=\"color:#73D0FF\" class=\"\">    osascript</span><span style=\"color:#95E6CB\" class=\"\"> -e</span><span style=\"color:#D5FF80\" class=\"\"> \"display notification </span><span style=\"color:#95E6CB\" class=\"\">\\\"</span><span style=\"color:#D5FF80\" class=\"\">File does not exist: </span><span style=\"color:#CCCAC2\" class=\"\">$file</span><span style=\"color:#95E6CB\" class=\"\">\\\"</span><span style=\"color:#D5FF80\" class=\"\"> with title </span><span style=\"color:#95E6CB\" class=\"\">\\\"</span><span style=\"color:#D5FF80\" class=\"\">Debug</span><span style=\"color:#95E6CB\" class=\"\">\\\"</span><span style=\"color:#D5FF80\" class=\"\">\"</span></span>\n<span class=\"\" data-line=\"\"><span style=\"color:#FFAD66\" class=\"\">  fi</span></span>\n<span class=\"\" data-line=\"\"><span style=\"color:#FFAD66\" class=\"\">done</span></span>\n<span class=\"\" data-line=\"\"> </span><button type=\"button\" title=\"Copy code\" aria-label=\"Copy code\" data=\"#!/bin/bash\n\n# API keys for Cloudinary\nexport CLOUDINARY_URL=cloudinary://foo@bar\n\n# Function to get the current year and week number\nget_weekly_note_path() {\n  local year_week=$(date +%Y-%V)\n  local note_path=&#x22;~/Library/Mobile Documents/iCloud~md~obsidian/Documents/ejfox/Week Notes/${year_week}.md&#x22;\n  echo &#x22;$note_path&#x22;\n}\n\n# Iterate over each passed argument\nfor file in &#x22;$@&#x22;\ndo\n  # Check if the file exists\n  if [ -f &#x22;$file&#x22; ]; then\n    # Upload to Cloudinary and capture output\n    upload_output=$(/opt/homebrew/bin/cld uploader upload &#x22;$file&#x22; use_filename=true unique_filename=false 2>&#x26;1)\n    upload_exit_status=$?\n\n    # Check if the upload was successful\n    if [ $upload_exit_status -eq 0 ]; then\n      # Attempt to extract the URL using the absolute path for jq\n      url=$(echo &#x22;$upload_output&#x22; | /opt/homebrew/bin/jq -r &#x27;.url&#x27; 2>/dev/null)\n\n      # Check if the URL is non-empty\n      if [ -n &#x22;$url&#x22; ]; then\n        echo &#x22;$url&#x22; | pbcopy\n        # Display success notification with the URL\n        osascript -e &#x22;display notification \\&#x22;Uploaded $file to Cloudinary and URL copied to clipboard: $url\\&#x22; with title \\&#x22;Screenshot Upload\\&#x22;&#x22;\n\n        # Get the weekly note file path\n        weekly_note_path=$(get_weekly_note_path)\n\n        # Append the markdown image format to the weekly note file\n        echo -e &#x22;\\n![Screenshot - $current_date_time - $filename]($url)&#x22; >> &#x22;$weekly_note_path&#x22;\n\n        # Display notification for appending to the weekly note\n        # osascript -e &#x22;display notification \\&#x22;Appended screenshot URL to weekly note: $weekly_note_path\\&#x22; with title \\&#x22;Weekly Note Update\\&#x22;&#x22;\n      else\n        # Display notification for empty URL\n        osascript -e &#x22;display notification \\&#x22;Failed to extract URL from output\\&#x22; with title \\&#x22;Debug\\&#x22;&#x22;\n      fi\n    else\n      # Display notification for upload failure\n      osascript -e &#x22;display notification \\&#x22;Failed to upload $file to Cloudinary. Error: $upload_output\\&#x22; with title \\&#x22;Screenshot Upload\\&#x22;&#x22;\n    fi\n  else\n    # Display notification for file not found\n    osascript -e &#x22;display notification \\&#x22;File does not exist: $file\\&#x22; with title \\&#x22;Debug\\&#x22;&#x22;\n  fi\ndone\n\" class=\"rehype-pretty-copy\" onclick=\"navigator.clipboard.writeText(this.attributes.data.value);this.classList.add(&#x27;rehype-pretty-copied&#x27;);window.setTimeout(() => this.classList.remove(&#x27;rehype-pretty-copied&#x27;), 3000);\"><span class=\"ready\"></span><span class=\"success\"></span></button><style class=\"\">:root {--copy-icon: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 48 48'%3E%3Cpath fill='%23adadad' d='M16.187 9.5H12.25a1.75 1.75 0 0 0-1.75 1.75v28.5c0 .967.784 1.75 1.75 1.75h23.5a1.75 1.75 0 0 0 1.75-1.75v-28.5a1.75 1.75 0 0 0-1.75-1.75h-3.937a4.25 4.25 0 0 1-4.063 3h-7.5a4.25 4.25 0 0 1-4.063-3M31.813 7h3.937A4.25 4.25 0 0 1 40 11.25v28.5A4.25 4.25 0 0 1 35.75 44h-23.5A4.25 4.25 0 0 1 8 39.75v-28.5A4.25 4.25 0 0 1 12.25 7h3.937a4.25 4.25 0 0 1 4.063-3h7.5a4.25 4.25 0 0 1 4.063 3M18.5 8.25c0 .966.784 1.75 1.75 1.75h7.5a1.75 1.75 0 1 0 0-3.5h-7.5a1.75 1.75 0 0 0-1.75 1.75'/%3E%3C/svg%3E\");--success-icon: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%2366ff85' d='M9 16.17L5.53 12.7a.996.996 0 1 0-1.41 1.41l4.18 4.18c.39.39 1.02.39 1.41 0L20.29 7.71a.996.996 0 1 0-1.41-1.41z'/%3E%3C/svg%3E\");}pre:has(code) {position: relative;}pre button.rehype-pretty-copy {right: 1px;padding: 0;width: 24px;height: 24px;display: flex;margin-top: 2px;margin-right: 8px;position: absolute;border-radius: 25%;backdrop-filter: blur(3px);& span {width: 100%;aspect-ratio: 1 / 1;}& .ready {background-image: var(--copy-icon);}& .success {display: none; background-image: var(--success-icon);}}&.rehype-pretty-copied {& .success {display: block;} & .ready {display: none;}}pre button.rehype-pretty-copy.rehype-pretty-copied {opacity: 1;& .ready { display: none; }& .success { display: block; }}</style></code></pre></figure>\n<h2 class=\"\" id=\"projects-worked-on\">Projects Worked On</h2>\n<h3 class=\"\" id=\"spliff--espresso\">Spliff &#x26; Espresso</h3>\n<ul class=\"list-disc\">\n<li class=\"\">Bought &#x3C;spliffandespresso.com> and got @spliffandespresso on IG</li>\n<li class=\"\">Did some experimentation with colors and typefaces for the logo</li>\n</ul>\n<h2 class=\"\" id=\"creative-endeavors\">Creative Endeavors</h2>\n<p class=\"\">I've been playing a lot with <a href=\"https://cardinal.kx.studio\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"external-link group inline-flex items-center text-blue-600 dark:text-blue-400\" data-preview-url=\"https://cardinal.kx.studio\">Cardinal</a> the free and open-source modular synth, and it's a great way to lose hours of your life to tweaking knobs and dragging cables. It absorbs time almost as well as <a href=\"https://store.steampowered.com/app/1158310/Crusader_Kings_III/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"external-link group inline-flex items-center text-blue-600 dark:text-blue-400\" data-preview-url=\"https://store.steampowered.com/app/1158310/Crusader_Kings_III/\">Crusader Kings 3</a></p>\n<svg class=\"mx-auto my-8 w-full max-w-prose\" height=\"1\">\n  <line x1=\"0\" y1=\"0\" x2=\"100%\" y2=\"0\" stroke=\"currentColor\" stroke-width=\"1\" stroke-dasharray=\"2,4\" />\n</svg>\n<figure role=\"figure\" aria-label=\"Modular synthesizer patch in Cardinal software with oscillators, filters, envelopes, and effects connected by colorful signal cables.\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1722536061/Screenshot_2024-08-01_at_2.14.04_PM.png\" alt=\"Modular synthesizer patch in Cardinal software with oscillators, filters, envelopes, and effects connected by colorful signal cables.\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/v1722536061/Screenshot_2024-08-01_at_2.14.04_PM.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/v1722536061/Screenshot_2024-08-01_at_2.14.04_PM.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1722536061/Screenshot_2024-08-01_at_2.14.04_PM.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/v1722536061/Screenshot_2024-08-01_at_2.14.04_PM.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"Modular synthesizer patch in Cardinal software with oscillators, filters, envelopes, and effects connected by colorful signal cables.\" width=\"3824\" height=\"2474\" style=\"--splay-rot:1.71deg;\" data-dimensions=\"3824×2474\" class=\"img-full my-8 rounded-sm img-splay w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">Modular synthesizer patch in Cardinal software with oscillators, filters, envelopes, and effects connected by colorful signal cables.</figcaption>\n</figure>\n<figure role=\"figure\" aria-label=\"Search results for &#x27;scrap clig&#x27; showing Command Line Interface Guidelines, Google search option, local scraps, and Pinboard.\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1722573787/Screenshot_2024-08-02_at_12.42.54_AM.png\" alt=\"Search results for &#x27;scrap clig&#x27; showing Command Line Interface Guidelines, Google search option, local scraps, and Pinboard.\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/v1722573787/Screenshot_2024-08-02_at_12.42.54_AM.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/v1722573787/Screenshot_2024-08-02_at_12.42.54_AM.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1722573787/Screenshot_2024-08-02_at_12.42.54_AM.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/v1722573787/Screenshot_2024-08-02_at_12.42.54_AM.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"Search results for &#x27;scrap clig&#x27; showing Command Line Interface Guidelines, Google search option, local scraps, and Pinboard.\" width=\"1642\" height=\"1420\" style=\"--splay-rot:2.85deg;\" data-dimensions=\"1642×1420\" class=\"img-full my-8 rounded-sm img-splay w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">Search results for 'scrap clig' showing Command Line Interface Guidelines, Google search option, local scraps, and Pinboard.</figcaption>\n</figure>\n<figure role=\"figure\" aria-label=\"Are.na workspace by hacker-journalist EJ Fox organized into sections of personal projects, coding tutorials, and discussions on politics and technology.\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1722609608/Screenshot_2024-08-02_at_10.39.55_AM.png\" alt=\"Are.na workspace by hacker-journalist EJ Fox organized into sections of personal projects, coding tutorials, and discussions on politics and technology.\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/v1722609608/Screenshot_2024-08-02_at_10.39.55_AM.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/v1722609608/Screenshot_2024-08-02_at_10.39.55_AM.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1722609608/Screenshot_2024-08-02_at_10.39.55_AM.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/v1722609608/Screenshot_2024-08-02_at_10.39.55_AM.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"Are.na workspace by hacker-journalist EJ Fox organized into sections of personal projects, coding tutorials, and discussions on politics and technology.\" width=\"2474\" height=\"2160\" style=\"--splay-rot:-2.88deg;\" data-dimensions=\"2474×2160\" class=\"img-full my-8 rounded-sm img-splay w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">Are.na workspace by hacker-journalist EJ Fox organized into sections of personal projects, coding tutorials, and discussions on politics and technology.</figcaption>\n</figure>\n<figure role=\"figure\" aria-label=\"Are.na profile page for EJ Fox, a hacker-journalist, displaying two creative blocks: a 2024 meme about computers and capitalism being mistakes, and information graphics about permanent, temporary, and situational forms of touch and perception.\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1722609675/Screenshot_2024-08-02_at_10.41.03_AM.png\" alt=\"Are.na profile page for EJ Fox, a hacker-journalist, displaying two creative blocks: a 2024 meme about computers and capitalism being mistakes, and information graphics about permanent, temporary, and situational forms of touch and perception.\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/v1722609675/Screenshot_2024-08-02_at_10.41.03_AM.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/v1722609675/Screenshot_2024-08-02_at_10.41.03_AM.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1722609675/Screenshot_2024-08-02_at_10.41.03_AM.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/v1722609675/Screenshot_2024-08-02_at_10.41.03_AM.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"Are.na profile page for EJ Fox, a hacker-journalist, displaying two creative blocks: a 2024 meme about computers and capitalism being mistakes, and information graphics about permanent, temporary, and situational forms of touch and perception.\" width=\"2474\" height=\"2160\" style=\"--splay-rot:-2.14deg;\" data-dimensions=\"2474×2160\" class=\"img-full my-8 rounded-sm img-splay w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">Are.na profile page for EJ Fox, a hacker-journalist, displaying two creative blocks: a 2024 meme about computers and capitalism being mistakes, and information graphics about permanent, temporary, and situational forms of touch and perception.</figcaption>\n</figure>\n<figure role=\"figure\" aria-label=\"Channel of literary readings and philosophical excerpts exploring masculinity, grief, consumer culture, and beauty through quotes from writers like Karah Wale Al-Hussain.\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1722609689/Screenshot_2024-08-02_at_10.41.15_AM.png\" alt=\"Channel of literary readings and philosophical excerpts exploring masculinity, grief, consumer culture, and beauty through quotes from writers like Karah Wale Al-Hussain.\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/v1722609689/Screenshot_2024-08-02_at_10.41.15_AM.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/v1722609689/Screenshot_2024-08-02_at_10.41.15_AM.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1722609689/Screenshot_2024-08-02_at_10.41.15_AM.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/v1722609689/Screenshot_2024-08-02_at_10.41.15_AM.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"Channel of literary readings and philosophical excerpts exploring masculinity, grief, consumer culture, and beauty through quotes from writers like Karah Wale Al-Hussain.\" width=\"2474\" height=\"2160\" style=\"--splay-rot:0.6deg;\" data-dimensions=\"2474×2160\" class=\"img-full my-8 rounded-sm img-splay w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">Channel of literary readings and philosophical excerpts exploring masculinity, grief, consumer culture, and beauty through quotes from writers like Karah Wale Al-Hussain.</figcaption>\n</figure>\n<figure role=\"figure\" aria-label=\"Folder containing numerous screenshot files showing code editors, terminal windows, UI designs, and maps in macOS icon view.\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1722609820/Screenshot_2024-08-02_at_10.43.12_AM.png\" alt=\"Folder containing numerous screenshot files showing code editors, terminal windows, UI designs, and maps in macOS icon view.\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/v1722609820/Screenshot_2024-08-02_at_10.43.12_AM.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/v1722609820/Screenshot_2024-08-02_at_10.43.12_AM.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1722609820/Screenshot_2024-08-02_at_10.43.12_AM.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/v1722609820/Screenshot_2024-08-02_at_10.43.12_AM.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"Folder containing numerous screenshot files showing code editors, terminal windows, UI designs, and maps in macOS icon view.\" width=\"2576\" height=\"2474\" style=\"--splay-rot:-2.2deg;\" data-dimensions=\"2576×2474\" class=\"img-full my-8 rounded-sm img-splay aspect-square w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">Folder containing numerous screenshot files showing code editors, terminal windows, UI designs, and maps in macOS icon view.</figcaption>\n</figure>\n<figure role=\"figure\" aria-label=\"Pinboard bookmarking feed showing recent saved links about technology, politics, and data journalism from user ejfox.\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1722609879/Screenshot_2024-08-02_at_10.44.24_AM.png\" alt=\"Pinboard bookmarking feed showing recent saved links about technology, politics, and data journalism from user ejfox.\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/v1722609879/Screenshot_2024-08-02_at_10.44.24_AM.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/v1722609879/Screenshot_2024-08-02_at_10.44.24_AM.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1722609879/Screenshot_2024-08-02_at_10.44.24_AM.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/v1722609879/Screenshot_2024-08-02_at_10.44.24_AM.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"Pinboard bookmarking feed showing recent saved links about technology, politics, and data journalism from user ejfox.\" width=\"2474\" height=\"2160\" style=\"--splay-rot:-1.78deg;\" data-dimensions=\"2474×2160\" class=\"img-full my-8 rounded-sm img-splay w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">Pinboard bookmarking feed showing recent saved links about technology, politics, and data journalism from user ejfox.</figcaption>\n</figure>\n<figure role=\"figure\" aria-label=\"Flowchart showing weekly bookmark curation process: gather bookmarks, generate theme, read webpages, extract facts, and write AI summaries back into bookmark metadata.\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1722610045/Screenshot_2024-08-02_at_10.47.11_AM.png\" alt=\"Flowchart showing weekly bookmark curation process: gather bookmarks, generate theme, read webpages, extract facts, and write AI summaries back into bookmark metadata.\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/v1722610045/Screenshot_2024-08-02_at_10.47.11_AM.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/v1722610045/Screenshot_2024-08-02_at_10.47.11_AM.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1722610045/Screenshot_2024-08-02_at_10.47.11_AM.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/v1722610045/Screenshot_2024-08-02_at_10.47.11_AM.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"Flowchart showing weekly bookmark curation process: gather bookmarks, generate theme, read webpages, extract facts, and write AI summaries back into bookmark metadata.\" width=\"2906\" height=\"2168\" style=\"--splay-rot:-2.61deg;\" data-dimensions=\"2906×2168\" class=\"img-full my-8 rounded-sm img-splay w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">Flowchart showing weekly bookmark curation process: gather bookmarks, generate theme, read webpages, extract facts, and write AI summaries back into bookmark metadata.</figcaption>\n</figure>\n<p class=\"\"><img src=\"https://res.cloudinary.com/ejf/video/upload/c_scale,f_auto,q_auto:good,w_1280/v1722610907/Screen_Recording_2024-08-02_at_11.00.13_AM.mov\" alt=\"Screenshot - - \" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/video/upload/c_scale,f_auto,q_auto:good,w_640/v1722610907/Screen_Recording_2024-08-02_at_11.00.13_AM.mov 640w, https://res.cloudinary.com/ejf/video/upload/c_scale,f_auto,q_auto:good,w_960/v1722610907/Screen_Recording_2024-08-02_at_11.00.13_AM.mov 960w, https://res.cloudinary.com/ejf/video/upload/c_scale,f_auto,q_auto:good,w_1280/v1722610907/Screen_Recording_2024-08-02_at_11.00.13_AM.mov 1280w, https://res.cloudinary.com/ejf/video/upload/c_scale,f_auto,q_auto:good,w_1920/v1722610907/Screen_Recording_2024-08-02_at_11.00.13_AM.mov 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" style=\"--splay-rot:-0.6deg;\" class=\"img-full my-8 rounded-sm img-splay w-full mx-auto py-4\" crossorigin=\"anonymous\"></p>\n<figure role=\"figure\" aria-label=\"Verbose scrapbook log tracking pinboard and mastodon posts from July-August 2024, capturing news articles, technical documentation, and commentary on politics, crime, and technology.\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1722612330/Screenshot_2024-08-02_at_11.25.18_AM.png\" alt=\"Verbose scrapbook log tracking pinboard and mastodon posts from July-August 2024, capturing news articles, technical documentation, and commentary on politics, crime, and technology.\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/v1722612330/Screenshot_2024-08-02_at_11.25.18_AM.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/v1722612330/Screenshot_2024-08-02_at_11.25.18_AM.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1722612330/Screenshot_2024-08-02_at_11.25.18_AM.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/v1722612330/Screenshot_2024-08-02_at_11.25.18_AM.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"Verbose scrapbook log tracking pinboard and mastodon posts from July-August 2024, capturing news articles, technical documentation, and commentary on politics, crime, and technology.\" width=\"2020\" height=\"2058\" style=\"--splay-rot:-0.6deg;\" data-dimensions=\"2020×2058\" class=\"img-full my-8 rounded-sm img-splay aspect-square w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">Verbose scrapbook log tracking pinboard and mastodon posts from July-August 2024, capturing news articles, technical documentation, and commentary on politics, crime, and technology.</figcaption>\n</figure>\n<figure role=\"figure\" aria-label=\"Network diagram connecting bookmarks about marijuana laws, domestic violence ruling, Instagram API library, food vending trailers, and David Kleinman, dated July-August 2024.\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1722612365/Screenshot_2024-08-02_at_11.25.53_AM.png\" alt=\"Network diagram connecting bookmarks about marijuana laws, domestic violence ruling, Instagram API library, food vending trailers, and David Kleinman, dated July-August 2024.\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/v1722612365/Screenshot_2024-08-02_at_11.25.53_AM.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/v1722612365/Screenshot_2024-08-02_at_11.25.53_AM.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1722612365/Screenshot_2024-08-02_at_11.25.53_AM.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/v1722612365/Screenshot_2024-08-02_at_11.25.53_AM.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"Network diagram connecting bookmarks about marijuana laws, domestic violence ruling, Instagram API library, food vending trailers, and David Kleinman, dated July-August 2024.\" width=\"2036\" height=\"2008\" style=\"--splay-rot:2.57deg;\" data-dimensions=\"2036×2008\" class=\"img-full my-8 rounded-sm img-splay aspect-square w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">Network diagram connecting bookmarks about marijuana laws, domestic violence ruling, Instagram API library, food vending trailers, and David Kleinman, dated July-August 2024.</figcaption>\n</figure>\n<figure role=\"figure\" aria-label=\"News summary showing 56% of Phoenix police officers considering quitting over DOJ oversight concerns, with relationship diagram connecting city council, police department, DOJ, officers, and union.\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1722614112/Screenshot_2024-08-02_at_11.55.00_AM.png\" alt=\"News summary showing 56% of Phoenix police officers considering quitting over DOJ oversight concerns, with relationship diagram connecting city council, police department, DOJ, officers, and union.\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/v1722614112/Screenshot_2024-08-02_at_11.55.00_AM.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/v1722614112/Screenshot_2024-08-02_at_11.55.00_AM.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1722614112/Screenshot_2024-08-02_at_11.55.00_AM.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/v1722614112/Screenshot_2024-08-02_at_11.55.00_AM.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"News summary showing 56% of Phoenix police officers considering quitting over DOJ oversight concerns, with relationship diagram connecting city council, police department, DOJ, officers, and union.\" width=\"1266\" height=\"1572\" style=\"--splay-rot:2.25deg;\" data-dimensions=\"1266×1572\" class=\"img-full my-8 rounded-sm img-splay aspect-[3/4] w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">News summary showing 56% of Phoenix police officers considering quitting over DOJ oversight concerns, with relationship diagram connecting city council, police department, DOJ, officers, and union.</figcaption>\n</figure>\n<figure role=\"figure\" aria-label=\"Search results showing four instances of &#x27;model: &#x22;gpt-4&#x22;&#x27; being replaced with &#x27;gpt-4o-mini&#x27; across three JavaScript configuration files.\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1722618320/Screenshot_2024-08-02_at_1.05.07_PM.png\" alt=\"Search results showing four instances of &#x27;model: &#x22;gpt-4&#x22;&#x27; being replaced with &#x27;gpt-4o-mini&#x27; across three JavaScript configuration files.\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/v1722618320/Screenshot_2024-08-02_at_1.05.07_PM.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/v1722618320/Screenshot_2024-08-02_at_1.05.07_PM.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1722618320/Screenshot_2024-08-02_at_1.05.07_PM.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/v1722618320/Screenshot_2024-08-02_at_1.05.07_PM.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"Search results showing four instances of &#x27;model: &#x22;gpt-4&#x22;&#x27; being replaced with &#x27;gpt-4o-mini&#x27; across three JavaScript configuration files.\" width=\"540\" height=\"558\" style=\"--splay-rot:-1.84deg;\" data-dimensions=\"540×558\" class=\"img-full my-8 rounded-sm img-splay aspect-square w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">Search results showing four instances of 'model: \"gpt-4\"' being replaced with 'gpt-4o-mini' across three JavaScript configuration files.</figcaption>\n</figure>\n<figure role=\"figure\" aria-label=\"Web scraping tool extracting NJ Transit rider complaint data and organizing bookmarked articles by date, source, and content topics.\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1722643343/Screenshot_2024-08-02_at_8.01.35_PM.png\" alt=\"Web scraping tool extracting NJ Transit rider complaint data and organizing bookmarked articles by date, source, and content topics.\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/v1722643343/Screenshot_2024-08-02_at_8.01.35_PM.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/v1722643343/Screenshot_2024-08-02_at_8.01.35_PM.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1722643343/Screenshot_2024-08-02_at_8.01.35_PM.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/v1722643343/Screenshot_2024-08-02_at_8.01.35_PM.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"Web scraping tool extracting NJ Transit rider complaint data and organizing bookmarked articles by date, source, and content topics.\" width=\"3600\" height=\"2338\" style=\"--splay-rot:0.9deg;\" data-dimensions=\"3600×2338\" class=\"img-full my-8 rounded-sm img-splay w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">Web scraping tool extracting NJ Transit rider complaint data and organizing bookmarked articles by date, source, and content topics.</figcaption>\n</figure>\n<figure role=\"figure\" aria-label=\"Database deletion confirmation dialog warning user that 2,076 rows will be permanently deleted with no undo option.\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1722643831/Screenshot_2024-08-02_at_8.09.58_PM.png\" alt=\"Database deletion confirmation dialog warning user that 2,076 rows will be permanently deleted with no undo option.\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/v1722643831/Screenshot_2024-08-02_at_8.09.58_PM.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/v1722643831/Screenshot_2024-08-02_at_8.09.58_PM.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1722643831/Screenshot_2024-08-02_at_8.09.58_PM.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/v1722643831/Screenshot_2024-08-02_at_8.09.58_PM.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"Database deletion confirmation dialog warning user that 2,076 rows will be permanently deleted with no undo option.\" width=\"2024\" height=\"2474\" style=\"--splay-rot:-0.95deg;\" data-dimensions=\"2024×2474\" class=\"img-full my-8 rounded-sm img-splay aspect-[3/4] w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">Database deletion confirmation dialog warning user that 2,076 rows will be permanently deleted with no undo option.</figcaption>\n</figure>\n<p class=\"\"><img src=\"https://res.cloudinary.com/ejf/video/upload/c_scale,f_auto,q_auto:good,w_1280/v1722644212/Screen_Recording_2024-08-02_at_8.13.46_PM.mov\" alt=\"Screenshot - - \" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/video/upload/c_scale,f_auto,q_auto:good,w_640/v1722644212/Screen_Recording_2024-08-02_at_8.13.46_PM.mov 640w, https://res.cloudinary.com/ejf/video/upload/c_scale,f_auto,q_auto:good,w_960/v1722644212/Screen_Recording_2024-08-02_at_8.13.46_PM.mov 960w, https://res.cloudinary.com/ejf/video/upload/c_scale,f_auto,q_auto:good,w_1280/v1722644212/Screen_Recording_2024-08-02_at_8.13.46_PM.mov 1280w, https://res.cloudinary.com/ejf/video/upload/c_scale,f_auto,q_auto:good,w_1920/v1722644212/Screen_Recording_2024-08-02_at_8.13.46_PM.mov 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" style=\"--splay-rot:2.87deg;\" class=\"img-full my-8 rounded-sm img-splay w-full mx-auto py-4\" crossorigin=\"anonymous\"></p>\n<figure role=\"figure\" aria-label=\"Six handmade ceramic mugs by EJ Fox with natural glazes in earth tones and white, priced $30-$40 plus shipping.\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1722703810/Screenshot_2024-08-03_at_12.49.46_PM.png\" alt=\"Six handmade ceramic mugs by EJ Fox with natural glazes in earth tones and white, priced $30-$40 plus shipping.\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/v1722703810/Screenshot_2024-08-03_at_12.49.46_PM.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/v1722703810/Screenshot_2024-08-03_at_12.49.46_PM.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1722703810/Screenshot_2024-08-03_at_12.49.46_PM.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/v1722703810/Screenshot_2024-08-03_at_12.49.46_PM.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"Six handmade ceramic mugs by EJ Fox with natural glazes in earth tones and white, priced $30-$40 plus shipping.\" width=\"2220\" height=\"2066\" style=\"--splay-rot:1.25deg;\" data-dimensions=\"2220×2066\" class=\"img-full my-8 rounded-sm img-splay aspect-square w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">Six handmade ceramic mugs by EJ Fox with natural glazes in earth tones and white, priced $30-$40 plus shipping.</figcaption>\n</figure>\n<figure role=\"figure\" aria-label=\"Handmade ceramic mugs collection for sale priced $30-40, with artist note about winter experiments and encouraging purchase to support their work.\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1722703817/Screenshot_2024-08-03_at_12.50.03_PM.png\" alt=\"Handmade ceramic mugs collection for sale priced $30-40, with artist note about winter experiments and encouraging purchase to support their work.\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/v1722703817/Screenshot_2024-08-03_at_12.50.03_PM.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/v1722703817/Screenshot_2024-08-03_at_12.50.03_PM.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1722703817/Screenshot_2024-08-03_at_12.50.03_PM.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/v1722703817/Screenshot_2024-08-03_at_12.50.03_PM.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"Handmade ceramic mugs collection for sale priced $30-40, with artist note about winter experiments and encouraging purchase to support their work.\" width=\"2338\" height=\"2048\" style=\"--splay-rot:2.23deg;\" data-dimensions=\"2338×2048\" class=\"img-full my-8 rounded-sm img-splay w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">Handmade ceramic mugs collection for sale priced $30-40, with artist note about winter experiments and encouraging purchase to support their work.</figcaption>\n</figure>","title":"Overview of the Week","metadata":{"tags":["weekly-notes","reflections","progress","coding","automation","music","health"],"modified":"2025-08-28T19:08:25.000Z","date":"2024-07-30T18:56:51.000Z","dek":"In which the author reflects on building a Scrapbook system, experiments with a modular synth, and efficiently uploads videos to their blog posts via Cloudinary.","words":904,"images":19,"imageDetails":{"total":19,"cloudinary":18,"withDimensions":0},"links":22,"codeBlocks":1,"headers":{"h2":3},"toc":[{"text":"Overview of the Week","slug":"overview-of-the-week","level":"h2","children":[]},{"text":"Projects Worked On","slug":"projects-worked-on","level":"h2","children":[{"text":"Spliff & Espresso","slug":"spliff--espresso","level":"h3","children":[]}]},{"text":"Creative Endeavors","slug":"creative-endeavors","level":"h2","children":[]}],"type":"post"}},"_links":{"self":"https://ejfox.com/blog/week-notes/2024-31.json","html":"https://ejfox.com/blog/week-notes/2024-31","index":"/blog.json"}}