<!DOCTYPE html><html dir="ltr" lang="en" class="false" data-astro-cid-sckkx6r4> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width"><link rel="icon" type="image/svg+xml" href="/favicon.svg"><link rel="canonical" href="https://baker.is/"><meta name="generator" content="Astro v5.12.0"><!-- General Meta Tags --><title>baker.is/</title><meta name="title" content="baker.is/"><meta name="description" content="Side projects, scripts, systems, and snacks."><meta name="author" content="Keith Baker"><link rel="sitemap" href="/sitemap-index.xml"><!-- Open Graph / Facebook --><meta property="og:title" content="baker.is/"><meta property="og:description" content="Side projects, scripts, systems, and snacks."><meta property="og:url" content="https://baker.is/"><meta property="og:image" content="https://baker.is/og.jpg"><!-- Article Published/Modified time --><!-- Twitter --><meta property="twitter:card" content="summary_large_image"><meta property="twitter:url" content="https://baker.is/"><meta property="twitter:title" content="baker.is/"><meta property="twitter:description" content="Side projects, scripts, systems, and snacks."><meta property="twitter:image" content="https://baker.is/og.jpg"><!-- Google JSON-LD Structured data --><script type="application/ld+json">{"@context":"https://schema.org","@type":"BlogPosting","headline":"baker.is/","image":"https://baker.is/og.jpg","datePublished":"undefined","author":[{"@type":"Person","name":"Keith Baker","url":"https://github.com/keif"}]}</script><!-- Enable RSS feed auto-discovery  --><!-- https://docs.astro.build/en/recipes/rss/#enabling-rss-feed-auto-discovery --><link rel="alternate" type="application/rss+xml" title="baker.is/" href="https://baker.is/rss.xml"><meta name="theme-color" content=""><meta name="astro-view-transitions-enabled" content="true"><meta name="astro-view-transitions-fallback" content="animate"><script type="module" src="/_astro/ClientRouter.astro_astro_type_script_index_0_lang.D98dxaWf.js"></script><script src="/toggle-theme.js"></script><link rel="stylesheet" href="/_astro/about.DfO5WoiB.css">
<style>:where([data-astro-image]){object-fit:var(--fit);object-position:var(--pos);height:auto}:where([data-astro-image=full-width]){width:100%}:where([data-astro-image=constrained]){max-width:100%}
</style></head> <body data-astro-cid-sckkx6r4>  <header class="sticky top-0 z-40 bg-background/80 backdrop-blur-md border-b border-border"> <a id="skip-to-content" href="#main-content" class="absolute start-16 -top-full z-50 bg-background px-3 py-2 text-accent backdrop-blur-lg transition-all focus:top-4">
Skip to content
</a> <div id="nav-container" class="mx-auto flex max-w-app flex-col items-center justify-between sm:flex-row"> <div id="top-nav-wrap" class="relative flex w-full items-baseline justify-between bg-transparent p-4 sm:items-center sm:py-4"> <a href="/" class="absolute py-1 text-xl leading-8 font-semibold whitespace-nowrap sm:static sm:my-auto sm:text-2xl sm:leading-none"> baker.is/ </a> <nav id="nav-menu" class="flex w-full flex-col items-center sm:ms-2 sm:flex-row sm:justify-end sm:space-x-4 sm:py-0"> <button id="menu-btn" class="focus-outline self-end p-2 sm:hidden" aria-label="Open Menu" aria-expanded="false" aria-controls="menu-items"> <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="hidden" id="close-icon"><path stroke="none" d="M0 0h24v24H0z" fill="none" /><path d="M18 6l-12 12" /><path d="M6 6l12 12" /></svg> <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-menu-deep" id="menu-icon"><path stroke="none" d="M0 0h24v24H0z" fill="none" /><path d="M4 6h16" /><path d="M7 12h13" /><path d="M10 18h10" /></svg> </button> <ul id="menu-items" class="mt-4 grid w-48 grid-cols-2 place-content-center gap-2 [&#38;>li>a]:block [&#38;>li>a]:px-4 [&#38;>li>a]:py-3 [&#38;>li>a]:text-center [&#38;>li>a]:font-medium [&#38;>li>a]:hover:text-accent sm:[&#38;>li>a]:px-3 sm:[&#38;>li>a]:py-2 hidden sm:mt-0 sm:flex sm:w-auto sm:gap-x-6 sm:gap-y-0 sm:items-center"> <li class="col-span-2 sm:col-span-1"> <a href="/posts">
Blog
</a> </li> <li class="col-span-2 sm:col-span-1"> <a href="/tags">
Tags
</a> </li> <li class="col-span-2 sm:col-span-1"> <a href="/about">
About
</a> </li> <li class="col-span-2 sm:col-span-1"> <a href="/now">
Now
</a> </li>  <li class="col-span-2 sm:col-span-1 flex items-center justify-center sm:justify-start"> <div class="flex items-center gap-2 sm:gap-1"> <div class="flex-wrap justify-center gap-1"> <a href="https://github.com/keif" class="group inline-block hover:text-accent p-2 hover:rotate-6 sm:p-1" title="baker.is/ on GitHub"> <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="inline-block size-6 scale-125 fill-transparent stroke-current stroke-2 opacity-90 group-hover:fill-transparent sm:scale-110"><path stroke="none" d="M0 0h24v24H0z" fill="none" /><path d="M9 19c-4.3 1.4 -4.3 -2.5 -6 -3m12 5v-3.5c0 -1 .1 -1.4 -.5 -2c2.8 -.3 5.5 -1.4 5.5 -6a4.6 4.6 0 0 0 -1.3 -3.2a4.2 4.2 0 0 0 -.1 -3.2s-1.1 -.3 -3.5 1.3a12.3 12.3 0 0 0 -6.2 0c-2.4 -1.6 -3.5 -1.3 -3.5 -1.3a4.2 4.2 0 0 0 -.1 3.2a4.6 4.6 0 0 0 -1.3 3.2c0 4.6 2.7 5.7 5.5 6c-.6 .6 -.6 1.2 -.5 2v3.5" /></svg> <span class="sr-only">baker.is/ on GitHub</span> </a><a href="https://bsky.app/profile/keifers.bsky.social" class="group inline-block hover:text-accent p-2 hover:rotate-6 sm:p-1" title="baker.is/ on Bluesky"> <svg class="inline-block size-6 scale-125 fill-transparent stroke-current stroke-2 opacity-90 group-hover:fill-transparent sm:scale-110" viewBox="0 0 55 55">
<path fill="currentColor" d="M27.5,25.73c-1.6-3.1-5.94-8.89-9.98-11.74c-3.87-2.73-5.35-2.26-6.31-1.82c-1.12,0.51-1.32,2.23-1.32,3.24
c0,1.01,0.55,8.3,0.92,9.51c1.2,4.02,5.45,5.38,9.37,4.94c0.2-0.03,0.4-0.06,0.61-0.08c-0.2,0.03-0.41,0.06-0.61,0.08
c-5.74,0.85-10.85,2.94-4.15,10.39c7.36,7.62,10.09-1.63,11.49-6.33c1.4,4.69,3.01,13.61,11.35,6.33c6.27-6.33,1.72-9.54-4.02-10.39
c-0.2-0.02-0.41-0.05-0.61-0.08c0.21,0.03,0.41,0.05,0.61,0.08c3.92,0.44,8.18-0.92,9.37-4.94c0.36-1.22,0.92-8.5,0.92-9.51
c0-1.01-0.2-2.73-1.32-3.24c-0.97-0.44-2.44-0.91-6.31,1.82C33.44,16.85,29.1,22.63,27.5,25.73z" />
</svg> <span class="sr-only">baker.is/ on Bluesky</span> </a><a href="https://mastodon.social/@keif" class="group inline-block hover:text-accent p-2 hover:rotate-6 sm:p-1" title="baker.is/ on Mastodon"> <svg width="16" height="16" fill="currentColor" class="inline-block size-6 scale-125 fill-transparent stroke-current stroke-2 opacity-90 group-hover:fill-transparent sm:scale-110" viewBox="0 0 16 16">
  <path d="M11.19 12.195c2.016-.24 3.77-1.475 3.99-2.603.348-1.778.32-4.339.32-4.339 0-3.47-2.286-4.488-2.286-4.488C12.062.238 10.083.017 8.027 0h-.05C5.92.017 3.942.238 2.79.765c0 0-2.285 1.017-2.285 4.488l-.002.662c-.004.64-.007 1.35.011 2.091.083 3.394.626 6.74 3.78 7.57 1.454.383 2.703.463 3.709.408 1.823-.1 2.847-.647 2.847-.647l-.06-1.317s-1.303.41-2.767.36c-1.45-.05-2.98-.156-3.215-1.928a4 4 0 0 1-.033-.496s1.424.346 3.228.428c1.103.05 2.137-.064 3.188-.189zm1.613-2.47H11.13v-4.08c0-.859-.364-1.295-1.091-1.295-.804 0-1.207.517-1.207 1.541v2.233H7.168V5.89c0-1.024-.403-1.541-1.207-1.541-.727 0-1.091.436-1.091 1.296v4.079H3.197V5.522q0-1.288.66-2.046c.456-.505 1.052-.764 1.793-.764.856 0 1.504.328 1.933.983L8 4.39l.417-.695c.429-.655 1.077-.983 1.934-.983.74 0 1.336.259 1.791.764q.662.757.661 2.046z" />
</svg> <span class="sr-only">baker.is/ on Mastodon</span> </a><a href="https://threads.net/ikeif" class="group inline-block hover:text-accent p-2 hover:rotate-6 sm:p-1" title="baker.is/ on Threads"> <svg shape-rendering="geometricPrecision" text-rendering="geometricPrecision" image-rendering="optimizeQuality" fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" viewBox="0 0 440 511.43" class="inline-block size-6 scale-125 fill-transparent stroke-current stroke-2 opacity-90 group-hover:fill-transparent sm:scale-110">
  <path fill="currentColor" fill-rule="nonzero" d="M342.383 237.038a177.282 177.282 0 00-6.707-3.046c-3.948-72.737-43.692-114.379-110.429-114.805-38.505-.255-72.972 15.445-94.454 48.041l36.702 25.178c15.265-23.159 39.221-28.096 56.864-28.096.204 0 .408 0 .61.002 21.974.14 38.555 6.529 49.287 18.987 7.81 9.071 13.034 21.606 15.621 37.425-19.483-3.311-40.553-4.329-63.077-3.038-63.45 3.655-104.24 40.661-101.501 92.08 1.391 26.083 14.385 48.523 36.587 63.181 18.772 12.391 42.95 18.45 68.077 17.079 33.183-1.819 59.215-14.48 77.377-37.63 13.793-17.58 22.516-40.363 26.368-69.069 15.814 9.544 27.535 22.103 34.007 37.2 11.006 25.665 11.648 67.84-22.764 102.223-30.15 30.121-66.392 43.151-121.164 43.554-60.758-.45-106.708-19.935-136.583-57.915-27.976-35.562-42.434-86.93-42.973-152.674.539-65.746 14.997-117.114 42.973-152.676 29.875-37.979 75.824-57.463 136.582-57.914 61.197.455 107.948 20.033 138.967 58.195 15.21 18.713 26.676 42.248 34.236 69.688L440 161.532c-9.163-33.775-23.582-62.881-43.203-87.017C357.031 25.59 298.872.519 223.936 0h-.3C148.851.518 91.344 25.683 52.709 74.795 18.331 118.499.598 179.308.002 255.535l-.002.18.002.18c.596 76.225 18.329 137.037 52.707 180.741 38.635 49.11 96.142 74.277 170.927 74.794h.3c66.486-.462 113.352-17.868 151.96-56.442 50.51-50.463 48.99-113.718 32.342-152.549-11.945-27.847-34.716-50.463-65.855-65.401zM227.587 344.967c-27.808 1.567-56.699-10.916-58.124-37.651-1.056-19.823 14.108-41.942 59.831-44.577a266.87 266.87 0 0115.422-.45c16.609 0 32.145 1.613 46.271 4.701-5.268 65.798-36.172 76.483-63.4 77.977z" />
</svg> <span class="sr-only">baker.is/ on Threads</span> </a><a href="https://x.com/ikeif" class="group inline-block hover:text-accent p-2 hover:rotate-6 sm:p-1" title="baker.is/ on X"> <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="inline-block size-6 scale-125 fill-transparent stroke-current stroke-2 opacity-90 group-hover:fill-transparent sm:scale-110"><path stroke="none" d="M0 0h24v24H0z" fill="none" /><path d="M4 4l11.733 16h4.267l-11.733 -16z" /><path d="M4 20l6.768 -6.768m2.46 -2.46l6.772 -6.772" /></svg> <span class="sr-only">baker.is/ on X</span> </a><a href="https://www.linkedin.com/in/keithbaker/" class="group inline-block hover:text-accent p-2 hover:rotate-6 sm:p-1" title="baker.is/ on LinkedIn"> <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="inline-block size-6 scale-125 fill-transparent stroke-current stroke-2 opacity-90 group-hover:fill-transparent sm:scale-110"><path stroke="none" d="M0 0h24v24H0z" fill="none" /><path d="M8 11v5" /><path d="M8 8v.01" /><path d="M12 16v-5" /><path d="M16 16v-3a2 2 0 1 0 -4 0" /><path d="M3 7a4 4 0 0 1 4 -4h10a4 4 0 0 1 4 4v10a4 4 0 0 1 -4 4h-10a4 4 0 0 1 -4 -4z" /></svg> <span class="sr-only">baker.is/ on LinkedIn</span> </a><a href="mailto:blog@baker.is" class="group inline-block hover:text-accent p-2 hover:rotate-6 sm:p-1" title="Send an email to baker.is/"> <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="inline-block size-6 scale-125 fill-transparent stroke-current stroke-2 opacity-90 group-hover:fill-transparent sm:scale-110"><path stroke="none" d="M0 0h24v24H0z" fill="none" /><path d="M3 7a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v10a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2v-10z" /><path d="M3 7l9 6l9 -6" /></svg> <span class="sr-only">Send an email to baker.is/</span> </a> </div> <div class="flex items-center gap-1 ml-2 sm:ml-1"> <a href="/search" class="group inline-block hover:text-accent focus-outline flex p-2 sm:p-1" aria-label="search" title="Search"> <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="size-5"><path stroke="none" d="M0 0h24v24H0z" fill="none" /><path d="M10 10m-7 0a7 7 0 1 0 14 0a7 7 0 1 0 -14 0" /><path d="M21 21l-6 -6" /></svg> <span class="sr-only">Search</span> </a> <button id="theme-btn" class="focus-outline relative p-2 sm:p-1 hover:[&>svg]:stroke-accent" title="Toggles light & dark" aria-label="auto" aria-live="polite"> <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="absolute top-[50%] left-[50%] -translate-[50%] scale-100 rotate-0 transition-all dark:scale-0 dark:-rotate-90 size-5"><path stroke="none" d="M0 0h24v24H0z" fill="none" /><path d="M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454z" /></svg> <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="absolute top-[50%] left-[50%] -translate-[50%] scale-0 rotate-90 transition-all dark:scale-100 dark:rotate-0 size-5"><path stroke="none" d="M0 0h24v24H0z" fill="none" /><path d="M14.828 14.828a4 4 0 1 0 -5.656 -5.656a4 4 0 0 0 5.656 5.656z" /><path d="M6.343 17.657l-1.414 1.414" /><path d="M6.343 6.343l-1.414 -1.414" /><path d="M17.657 6.343l1.414 -1.414" /><path d="M17.657 17.657l1.414 1.414" /><path d="M4 12h-2" /><path d="M12 4v-2" /><path d="M20 12h2" /><path d="M12 20v2" /></svg> </button> </div> </div> </li> </ul> </nav> </div> </div> <div class="mx-auto max-w-app px-4"> <hr class="border-border" aria-hidden="true"> </div> </header> <script type="module">function s(){const e=document.querySelector("#menu-btn"),t=document.querySelector("#menu-items"),n=document.querySelector("#menu-icon"),o=document.querySelector("#close-icon");!e||!t||!n||!o||e.addEventListener("click",()=>{const c=e.getAttribute("aria-expanded")==="true";e.setAttribute("aria-expanded",c?"false":"true"),e.setAttribute("aria-label",c?"Open Menu":"Close Menu"),t.classList.toggle("hidden"),n.classList.toggle("hidden"),o.classList.toggle("hidden")})}s();document.addEventListener("astro:after-swap",s);</script> <main id="main-content" data-layout="index"> <section id="hero" class="pt-12 pb-8"> <div class="text-center"> <h1 class="my-4 inline-block text-4xl font-bold sm:my-6 sm:text-6xl prose-headings"> baker.is/ </h1> <a target="_blank" href="/rss.xml" class="inline-block ml-3 opacity-70 hover:opacity-100 transition-opacity" aria-label="rss feed" title="RSS Feed"> <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="stroke-accent stroke-2"><path stroke="none" d="M0 0h24v24H0z" fill="none" /><path d="M5 19m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0" /><path d="M4 4a16 16 0 0 1 16 16" /><path d="M4 11a9 9 0 0 1 9 9" /></svg> <span class="sr-only">RSS Feed</span> </a> </div> <p class="mt-6 text-lg text-center text-muted-foreground max-w-2xl mx-auto"> Side projects, scripts, systems, and snacks. </p> </section> <div class="mx-auto max-w-app px-4"> <hr class="border-border" aria-hidden="true"> </div>  <section id="featured" class="pt-12 pb-8"> <h2 class="text-2xl font-semibold tracking-wide prose-headings mb-6">Featured</h2> <div class="grid grid-cols-1 md:grid-cols-2 gap-6"> <article class="card card-hover group mb-3"> <div class="p-6"> <a href="/posts/docker-override" class="block focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent"> <h3 style="view-transition-name:docker-override-extending-your-docker-compose" class="text-xl font-semibold text-foreground hover:text-accent transition-colors prose-headings group-hover:text-accent">Docker Override – Extending Your Docker Compose</h3> </a> <div class="mt-2 mb-3 flex items-center gap-2 text-sm text-muted-foreground"> <time datetime="2025-09-07T03:27:00.000Z">Sep 6, 2025</time> <span class="opacity-60">•</span> <span>3 min read</span> </div> <p class="text-muted-foreground mb-4 leading-relaxed">A walkthrough of using docker-compose override files to manage local image tags, avoid committing dev-specific changes, and support multiple configurations.</p> <div class="flex flex-wrap gap-2"> <a href="/tags/docker/" class="tag-pill"> docker </a><a href="/tags/override/" class="tag-pill"> override </a><a href="/tags/compose/" class="tag-pill"> compose </a> <span class="text-xs text-muted-foreground">+1 more</span> </div> </div> </article><article class="card card-hover group mb-3"> <div class="p-6"> <a href="/posts/javascript-currying" class="block focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent"> <h3 style="view-transition-name:java-script-currying-explained" class="text-xl font-semibold text-foreground hover:text-accent transition-colors prose-headings group-hover:text-accent">JavaScript Currying Explained</h3> </a> <div class="mt-2 mb-3 flex items-center gap-2 text-sm text-muted-foreground"> <time datetime="2025-09-07T03:27:00.000Z">Sep 6, 2025</time> <span class="opacity-60">•</span> <span>3 min read</span> </div> <p class="text-muted-foreground mb-4 leading-relaxed">A discussion on currying and partial application in JavaScript with practical examples including React&#39;s connect and letter ciphering.</p> <div class="flex flex-wrap gap-2"> <a href="/tags/javascript/" class="tag-pill"> javascript </a><a href="/tags/functions/" class="tag-pill"> functions </a><a href="/tags/react/" class="tag-pill"> react </a> <span class="text-xs text-muted-foreground">+1 more</span> </div> </div> </article><article class="card card-hover group mb-3"> <div class="p-6"> <a href="/posts/jbpm-installation-setup-osx" class="block focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent"> <h3 style="view-transition-name:j-bpm-installation-and-setup" class="text-xl font-semibold text-foreground hover:text-accent transition-colors prose-headings group-hover:text-accent">jBPM Installation and Setup</h3> </a> <div class="mt-2 mb-3 flex items-center gap-2 text-sm text-muted-foreground"> <time datetime="2025-09-07T03:27:00.000Z">Sep 6, 2025</time> <span class="opacity-60">•</span> <span>5 min read</span> </div> <p class="text-muted-foreground mb-4 leading-relaxed">Learn how to set up jBPM on macOS using Docker, including prerequisites like Xcode CLI, Homebrew, and verification steps for Docker installation.
</p> <div class="flex flex-wrap gap-2"> <a href="/tags/docker/" class="tag-pill"> docker </a><a href="/tags/java/" class="tag-pill"> java </a><a href="/tags/bpm/" class="tag-pill"> bpm </a> <span class="text-xs text-muted-foreground">+1 more</span> </div> </div> </article><article class="card card-hover group mb-3"> <div class="p-6"> <a href="/posts/getting-a-list-of-images" class="block focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent"> <h3 style="view-transition-name:getting-a-list-of-images" class="text-xl font-semibold text-foreground hover:text-accent transition-colors prose-headings group-hover:text-accent">Getting a List of Images</h3> </a> <div class="mt-2 mb-3 flex items-center gap-2 text-sm text-muted-foreground"> <time datetime="2025-09-07T03:27:00.000Z">Sep 6, 2025</time> <span class="opacity-60">•</span> <span>2 min read</span> </div> <p class="text-muted-foreground mb-4 leading-relaxed">Learn how to use wget and parallel to download thousands of images from a URL list, with setup instructions and syntax examples for macOS.</p> <div class="flex flex-wrap gap-2"> <a href="/tags/wget/" class="tag-pill"> wget </a><a href="/tags/automation/" class="tag-pill"> automation </a><a href="/tags/bash/" class="tag-pill"> bash </a> <span class="text-xs text-muted-foreground">+1 more</span> </div> </div> </article><article class="card card-hover group mb-3"> <div class="p-6"> <a href="/posts/headless-youtube-playlist-generator" class="block focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent"> <h3 style="view-transition-name:building-a-headless-you-tube-playlist-generator-with-o-auth-and-quota-management" class="text-xl font-semibold text-foreground hover:text-accent transition-colors prose-headings group-hover:text-accent">Building a Headless YouTube Playlist Generator with OAuth and Quota Management</h3> </a> <div class="mt-2 mb-3 flex items-center gap-2 text-sm text-muted-foreground"> <time datetime="2025-09-11T19:32:00.000Z">Sep 11, 2025</time> <span class="opacity-60">•</span> <span>9 min read</span> </div> <p class="text-muted-foreground mb-4 leading-relaxed">How I built a CLI tool to create YouTube playlists from my subscriptions, with quota-aware API calls, OAuth caching, and no frontend.</p> <div class="flex flex-wrap gap-2"> <a href="/tags/YouTube/" class="tag-pill"> YouTube </a><a href="/tags/API/" class="tag-pill"> API </a><a href="/tags/Python/" class="tag-pill"> Python </a> <span class="text-xs text-muted-foreground">+5 more</span> </div> </div> </article> </div> </section> <div class="mx-auto max-w-app px-4"> <hr class="border-border" aria-hidden="true"> </div> <section id="recent-posts" class="pt-12 pb-8"> <h2 class="text-2xl font-semibold tracking-wide prose-headings mb-6">Recent Posts</h2> <div class="grid grid-cols-1 md:grid-cols-2 gap-6"> <article class="card card-hover group mb-3"> <div class="p-6"> <a href="/posts/github-notification-cleanup" class="block focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent"> <h3 style="view-transition-name:cleaning-up-git-hub-notifications-with-python" class="text-xl font-semibold text-foreground hover:text-accent transition-colors prose-headings group-hover:text-accent">Cleaning Up GitHub Notifications with Python</h3> </a> <div class="mt-2 mb-3 flex items-center gap-2 text-sm text-muted-foreground"> <time datetime="2025-09-13T10:00:00.000Z">Sep 13, 2025</time> <span class="opacity-60">•</span> <span>2 min read</span> </div> <p class="text-muted-foreground mb-4 leading-relaxed">A Python script to automatically clean up GitHub notifications by marking closed or merged issues and pull requests as done.</p> <div class="flex flex-wrap gap-2"> <a href="/tags/python/" class="tag-pill"> python </a><a href="/tags/automation/" class="tag-pill"> automation </a><a href="/tags/github/" class="tag-pill"> github </a>  </div> </div> </article><article class="card card-hover group mb-3"> <div class="p-6"> <a href="/posts/gatsby-blog-image" class="block focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent"> <h3 style="view-transition-name:gatsby-images-adding-to-your-blog" class="text-xl font-semibold text-foreground hover:text-accent transition-colors prose-headings group-hover:text-accent">Gatsby Images – Adding to Your Blog</h3> </a> <div class="mt-2 mb-3 flex items-center gap-2 text-sm text-muted-foreground"> <time datetime="2025-09-07T03:27:00.000Z">Sep 6, 2025</time> <span class="opacity-60">•</span> <span>3 min read</span> </div> <p class="text-muted-foreground mb-4 leading-relaxed">Lessons learned while extending a Gatsby blog with images, and the pitfalls of outdated tutorials when working with fast-moving frameworks.</p> <div class="flex flex-wrap gap-2"> <a href="/tags/gatsby/" class="tag-pill"> gatsby </a><a href="/tags/images/" class="tag-pill"> images </a><a href="/tags/blogging/" class="tag-pill"> blogging </a> <span class="text-xs text-muted-foreground">+1 more</span> </div> </div> </article><article class="card card-hover group mb-3"> <div class="p-6"> <a href="/posts/fun-code-snippets" class="block focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent"> <h3 style="view-transition-name:fun-code-snippets" class="text-xl font-semibold text-foreground hover:text-accent transition-colors prose-headings group-hover:text-accent">Fun Code Snippets</h3> </a> <div class="mt-2 mb-3 flex items-center gap-2 text-sm text-muted-foreground"> <time datetime="2025-09-07T03:27:00.000Z">Sep 6, 2025</time> <span class="opacity-60">•</span> <span>1 min read</span> </div> <p class="text-muted-foreground mb-4 leading-relaxed">A few handy CLI snippets and notes to remember how to quickly create or overwrite files using the terminal.</p> <div class="flex flex-wrap gap-2"> <a href="/tags/cli/" class="tag-pill"> cli </a><a href="/tags/shell/" class="tag-pill"> shell </a><a href="/tags/node/" class="tag-pill"> node </a>  </div> </div> </article><article class="card card-hover group mb-3"> <div class="p-6"> <a href="/posts/bash-script-merge-conflicts" class="block focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent"> <h3 style="view-transition-name:bash-script-to-resolve-merge-conflicts" class="text-xl font-semibold text-foreground hover:text-accent transition-colors prose-headings group-hover:text-accent">Bash Script to Resolve Merge Conflicts</h3> </a> <div class="mt-2 mb-3 flex items-center gap-2 text-sm text-muted-foreground"> <time datetime="2025-09-07T03:27:00.000Z">Sep 6, 2025</time> <span class="opacity-60">•</span> <span>2 min read</span> </div> <p class="text-muted-foreground mb-4 leading-relaxed">A script to automate resolution of common merge conflict patterns using bash.
</p> <div class="flex flex-wrap gap-2"> <a href="/tags/automation/" class="tag-pill"> automation </a><a href="/tags/bash/" class="tag-pill"> bash </a><a href="/tags/devops/" class="tag-pill"> devops </a> <span class="text-xs text-muted-foreground">+1 more</span> </div> </div> </article><article class="card card-hover group mb-3"> <div class="p-6"> <a href="/posts/testivus-wisdom-of-test-coverage" class="block focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent"> <h3 style="view-transition-name:what-is-testivus-wisdom-concerning-the-proper-percentage-of-test-coverage" class="text-xl font-semibold text-foreground hover:text-accent transition-colors prose-headings group-hover:text-accent">What is Testivus&#39; wisdom concerning the proper percentage of test coverage?</h3> </a> <div class="mt-2 mb-3 flex items-center gap-2 text-sm text-muted-foreground"> <time datetime="2025-09-07T03:27:00.000Z">Sep 6, 2025</time> <span class="opacity-60">•</span> <span>3 min read</span> </div> <p class="text-muted-foreground mb-4 leading-relaxed">A parable from The Way of Testivus on how testing coverage goals depend on context — and how some developers just want simple answers.</p> <div class="flex flex-wrap gap-2"> <a href="/tags/quotes/" class="tag-pill"> quotes </a><a href="/tags/archive/" class="tag-pill"> archive </a><a href="/tags/source/" class="tag-pill"> source </a>  </div> </div> </article> </div> </section> <div class="my-12 text-center"> <a href="/posts/" class="group inline-block hover:text-accent inline-flex items-center justify-center rounded-lg bg-accent text-black hover:bg-accent-dark px-6 py-3 text-base font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent shadow-sm border border-accent-dark/20">
More Posts
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="inline-block ml-2 size-4 rtl:-rotate-180"><path stroke="none" d="M0 0h24v24H0z" fill="none" /><path d="M5 12l14 0" /><path d="M13 18l6 -6" /><path d="M13 6l6 6" /></svg> </a> </div> </main> <footer class="w-full mt-auto"> <div class="mx-auto max-w-app px-0"> <hr class="border-border" aria-hidden="true"> </div> <div class="flex flex-col items-center justify-between py-6 sm:flex-row-reverse sm:py-4"> <div class="flex-wrap justify-center gap-1 flex"> <a href="https://github.com/keif" class="group inline-block hover:text-accent p-2 hover:rotate-6 sm:p-1" title="baker.is/ on GitHub"> <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="inline-block size-6 scale-125 fill-transparent stroke-current stroke-2 opacity-90 group-hover:fill-transparent sm:scale-110"><path stroke="none" d="M0 0h24v24H0z" fill="none" /><path d="M9 19c-4.3 1.4 -4.3 -2.5 -6 -3m12 5v-3.5c0 -1 .1 -1.4 -.5 -2c2.8 -.3 5.5 -1.4 5.5 -6a4.6 4.6 0 0 0 -1.3 -3.2a4.2 4.2 0 0 0 -.1 -3.2s-1.1 -.3 -3.5 1.3a12.3 12.3 0 0 0 -6.2 0c-2.4 -1.6 -3.5 -1.3 -3.5 -1.3a4.2 4.2 0 0 0 -.1 3.2a4.6 4.6 0 0 0 -1.3 3.2c0 4.6 2.7 5.7 5.5 6c-.6 .6 -.6 1.2 -.5 2v3.5" /></svg> <span class="sr-only">baker.is/ on GitHub</span> </a><a href="https://bsky.app/profile/keifers.bsky.social" class="group inline-block hover:text-accent p-2 hover:rotate-6 sm:p-1" title="baker.is/ on Bluesky"> <svg class="inline-block size-6 scale-125 fill-transparent stroke-current stroke-2 opacity-90 group-hover:fill-transparent sm:scale-110" viewBox="0 0 55 55">
<path fill="currentColor" d="M27.5,25.73c-1.6-3.1-5.94-8.89-9.98-11.74c-3.87-2.73-5.35-2.26-6.31-1.82c-1.12,0.51-1.32,2.23-1.32,3.24
c0,1.01,0.55,8.3,0.92,9.51c1.2,4.02,5.45,5.38,9.37,4.94c0.2-0.03,0.4-0.06,0.61-0.08c-0.2,0.03-0.41,0.06-0.61,0.08
c-5.74,0.85-10.85,2.94-4.15,10.39c7.36,7.62,10.09-1.63,11.49-6.33c1.4,4.69,3.01,13.61,11.35,6.33c6.27-6.33,1.72-9.54-4.02-10.39
c-0.2-0.02-0.41-0.05-0.61-0.08c0.21,0.03,0.41,0.05,0.61,0.08c3.92,0.44,8.18-0.92,9.37-4.94c0.36-1.22,0.92-8.5,0.92-9.51
c0-1.01-0.2-2.73-1.32-3.24c-0.97-0.44-2.44-0.91-6.31,1.82C33.44,16.85,29.1,22.63,27.5,25.73z" />
</svg> <span class="sr-only">baker.is/ on Bluesky</span> </a><a href="https://mastodon.social/@keif" class="group inline-block hover:text-accent p-2 hover:rotate-6 sm:p-1" title="baker.is/ on Mastodon"> <svg width="16" height="16" fill="currentColor" class="inline-block size-6 scale-125 fill-transparent stroke-current stroke-2 opacity-90 group-hover:fill-transparent sm:scale-110" viewBox="0 0 16 16">
  <path d="M11.19 12.195c2.016-.24 3.77-1.475 3.99-2.603.348-1.778.32-4.339.32-4.339 0-3.47-2.286-4.488-2.286-4.488C12.062.238 10.083.017 8.027 0h-.05C5.92.017 3.942.238 2.79.765c0 0-2.285 1.017-2.285 4.488l-.002.662c-.004.64-.007 1.35.011 2.091.083 3.394.626 6.74 3.78 7.57 1.454.383 2.703.463 3.709.408 1.823-.1 2.847-.647 2.847-.647l-.06-1.317s-1.303.41-2.767.36c-1.45-.05-2.98-.156-3.215-1.928a4 4 0 0 1-.033-.496s1.424.346 3.228.428c1.103.05 2.137-.064 3.188-.189zm1.613-2.47H11.13v-4.08c0-.859-.364-1.295-1.091-1.295-.804 0-1.207.517-1.207 1.541v2.233H7.168V5.89c0-1.024-.403-1.541-1.207-1.541-.727 0-1.091.436-1.091 1.296v4.079H3.197V5.522q0-1.288.66-2.046c.456-.505 1.052-.764 1.793-.764.856 0 1.504.328 1.933.983L8 4.39l.417-.695c.429-.655 1.077-.983 1.934-.983.74 0 1.336.259 1.791.764q.662.757.661 2.046z" />
</svg> <span class="sr-only">baker.is/ on Mastodon</span> </a><a href="https://threads.net/ikeif" class="group inline-block hover:text-accent p-2 hover:rotate-6 sm:p-1" title="baker.is/ on Threads"> <svg shape-rendering="geometricPrecision" text-rendering="geometricPrecision" image-rendering="optimizeQuality" fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" viewBox="0 0 440 511.43" class="inline-block size-6 scale-125 fill-transparent stroke-current stroke-2 opacity-90 group-hover:fill-transparent sm:scale-110">
  <path fill="currentColor" fill-rule="nonzero" d="M342.383 237.038a177.282 177.282 0 00-6.707-3.046c-3.948-72.737-43.692-114.379-110.429-114.805-38.505-.255-72.972 15.445-94.454 48.041l36.702 25.178c15.265-23.159 39.221-28.096 56.864-28.096.204 0 .408 0 .61.002 21.974.14 38.555 6.529 49.287 18.987 7.81 9.071 13.034 21.606 15.621 37.425-19.483-3.311-40.553-4.329-63.077-3.038-63.45 3.655-104.24 40.661-101.501 92.08 1.391 26.083 14.385 48.523 36.587 63.181 18.772 12.391 42.95 18.45 68.077 17.079 33.183-1.819 59.215-14.48 77.377-37.63 13.793-17.58 22.516-40.363 26.368-69.069 15.814 9.544 27.535 22.103 34.007 37.2 11.006 25.665 11.648 67.84-22.764 102.223-30.15 30.121-66.392 43.151-121.164 43.554-60.758-.45-106.708-19.935-136.583-57.915-27.976-35.562-42.434-86.93-42.973-152.674.539-65.746 14.997-117.114 42.973-152.676 29.875-37.979 75.824-57.463 136.582-57.914 61.197.455 107.948 20.033 138.967 58.195 15.21 18.713 26.676 42.248 34.236 69.688L440 161.532c-9.163-33.775-23.582-62.881-43.203-87.017C357.031 25.59 298.872.519 223.936 0h-.3C148.851.518 91.344 25.683 52.709 74.795 18.331 118.499.598 179.308.002 255.535l-.002.18.002.18c.596 76.225 18.329 137.037 52.707 180.741 38.635 49.11 96.142 74.277 170.927 74.794h.3c66.486-.462 113.352-17.868 151.96-56.442 50.51-50.463 48.99-113.718 32.342-152.549-11.945-27.847-34.716-50.463-65.855-65.401zM227.587 344.967c-27.808 1.567-56.699-10.916-58.124-37.651-1.056-19.823 14.108-41.942 59.831-44.577a266.87 266.87 0 0115.422-.45c16.609 0 32.145 1.613 46.271 4.701-5.268 65.798-36.172 76.483-63.4 77.977z" />
</svg> <span class="sr-only">baker.is/ on Threads</span> </a><a href="https://x.com/ikeif" class="group inline-block hover:text-accent p-2 hover:rotate-6 sm:p-1" title="baker.is/ on X"> <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="inline-block size-6 scale-125 fill-transparent stroke-current stroke-2 opacity-90 group-hover:fill-transparent sm:scale-110"><path stroke="none" d="M0 0h24v24H0z" fill="none" /><path d="M4 4l11.733 16h4.267l-11.733 -16z" /><path d="M4 20l6.768 -6.768m2.46 -2.46l6.772 -6.772" /></svg> <span class="sr-only">baker.is/ on X</span> </a><a href="https://www.linkedin.com/in/keithbaker/" class="group inline-block hover:text-accent p-2 hover:rotate-6 sm:p-1" title="baker.is/ on LinkedIn"> <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="inline-block size-6 scale-125 fill-transparent stroke-current stroke-2 opacity-90 group-hover:fill-transparent sm:scale-110"><path stroke="none" d="M0 0h24v24H0z" fill="none" /><path d="M8 11v5" /><path d="M8 8v.01" /><path d="M12 16v-5" /><path d="M16 16v-3a2 2 0 1 0 -4 0" /><path d="M3 7a4 4 0 0 1 4 -4h10a4 4 0 0 1 4 4v10a4 4 0 0 1 -4 4h-10a4 4 0 0 1 -4 -4z" /></svg> <span class="sr-only">baker.is/ on LinkedIn</span> </a><a href="mailto:blog@baker.is" class="group inline-block hover:text-accent p-2 hover:rotate-6 sm:p-1" title="Send an email to baker.is/"> <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="inline-block size-6 scale-125 fill-transparent stroke-current stroke-2 opacity-90 group-hover:fill-transparent sm:scale-110"><path stroke="none" d="M0 0h24v24H0z" fill="none" /><path d="M3 7a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v10a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2v-10z" /><path d="M3 7l9 6l9 -6" /></svg> <span class="sr-only">Send an email to baker.is/</span> </a> </div> <div class="my-2 flex flex-col items-center whitespace-nowrap sm:flex-row"> <span>Copyright &#169; 2025</span> <span class="hidden sm:inline">&nbsp;|&nbsp;</span> <span>All rights reserved.</span> </div> </div> </footer>  </body></html> <script type="module">document.addEventListener("astro:page-load",()=>{document.querySelector("#main-content")?.dataset?.layout&&sessionStorage.setItem("backUrl","/")});</script>