{
  "version": "https://jsonfeed.org/version/1.1",
  "title": "Today I Learned",
  "home_page_url": "https://waylonwalker.com/til/",
  "feed_url": "https://waylonwalker.com/til/feed.json",
  "description": "Short TIL posts",
  "authors": [
    {
      "name": "Waylon Walker"
    }
  ],
  "items": [
    {
      "id": "https://waylonwalker.com/rsync-delays/",
      "url": "https://waylonwalker.com/rsync-delays/",
      "title": "rsync delays",
      "content_html": "\u003cp\u003eI’ve been deploying my site old school for most of this year, rsync to a volume\nmounted to nginx.  I ran into an issue today where I updated my site and all of\nthe pages updated first, followed by upload.  The issue this created was that\nthe new cache busted css files were not up yet and the site had no styles for a\nbrief period during upload.\u003c/p\u003e\n\u003cp\u003eI found that delaying updates and delaying deletes until the new content exists\nfirst solves this problem pretty well.  Theres still possiblility of jank while\nuploading to a live directory and not doing some sort of hot swap, but I’m good\nwith this low budget option for now.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esync:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\trsync -rlt --delete --omit-dir-times \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t--info\u003cspan class=\"o\"\u003e=\u003c/span\u003eprogress2 \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t--delay-updates \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t--delete-delay \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t./output/ \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\tserver:/mnt/mysite\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nI've been deploying my site old school for most of this year, rsync to a volume\nmounted to nginx.  I ran into an issue today where I updated my site and all of\nthe pages updated first, followed by upload.  The issue this created was that\nthe new cache busted css files were not up yet and the site had no styles for a\nbrief period during upload.\n\nI found that delaying updates and delaying deletes until the new content exists\nfirst solves this problem pretty well.  Theres still possiblility of jank while\nuploading to a live directory and not doing some sort of hot swap, but I'm good\nwith this low budget option for now.\n\n``` bash\nsync:\n\trsync -rlt --delete --omit-dir-times \\\n\t--info=progress2 \\\n\t--delay-updates \\\n\t--delete-delay \\\n\t./output/ \\\n\tserver:/mnt/mysite\n```\n",
      "summary": "I've been deploying my site old school for most of this year, rsync to a volume mounted to nginx. I ran into an issue today where I updated my site and all...",
      "date_published": "2026-06-04T17:31:53Z",
      "date_modified": "2026-06-04T17:31:53Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "bash",
        "cli"
      ]
    },
    {
      "id": "https://waylonwalker.com/setopt-hist_ignore_space/",
      "url": "https://waylonwalker.com/setopt-hist_ignore_space/",
      "title": "setopt HIST_IGNORE_SPACE",
      "content_html": "\u003cp\u003eTo ignore commands that start with a space character, use the\n\u003ccode\u003eHIST_IGNORE_SPACE\u003c/code\u003e option in bash or zsh.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esetopt HIST_IGNORE_SPACE\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nTo ignore commands that start with a space character, use the\n`HIST_IGNORE_SPACE` option in bash or zsh.\n\n``` bash\nsetopt HIST_IGNORE_SPACE\n```\n",
      "summary": "To ignore commands that start with a space character, use the option in bash or zsh.",
      "date_published": "2026-05-24T20:15:37Z",
      "date_modified": "2026-05-24T20:15:37Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "bash",
        "cli"
      ]
    },
    {
      "id": "https://waylonwalker.com/forgejo-push-to-create/",
      "url": "https://waylonwalker.com/forgejo-push-to-create/",
      "title": "forgejo push to create",
      "content_html": "\u003cp\u003eI just learned that forgejo has a push to create repo feature and it is a\ngamechanger.  Upon first try it didn’t work, with just a couple of environment\nvariables I was up and running with push to create.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enotify.wayl.one on  main is 📦 v0.1.62  v3.14.4  NO PYTHON VENV SET  USING SYSTEM NVIM\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ git remote add origin https://git.waylonwalker.com/waylon/notify.wayl.one\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enotify.wayl.one on  main is 📦 v0.1.62  v3.14.4  NO PYTHON VENV SET  USING SYSTEM NVIM\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ git push\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eremote: Push to create is not enabled \u003cspan class=\"k\"\u003efor\u003c/span\u003e users.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efatal: unable to access \u003cspan class=\"s1\"\u003e\u0026#39;https://git.waylonwalker.com/waylon/notify.wayl.one/\u0026#39;\u003c/span\u003e: The requested URL returned error: \u003cspan class=\"m\"\u003e403\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSo I added the following environment variables.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAuthor: Waylon S. Walker \u0026lt;waylon@waylonwalker.com\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDate:   Wed May 6 21:56:53 2026 -0500\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    enable push to create\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003ediff --git a/k8s/forgejo/deployment.yaml b/k8s/forgejo/deployment.yaml\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003eindex d77daab..9346763 100644\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gd\"\u003e--- a/k8s/forgejo/deployment.yaml\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gi\"\u003e+++ b/k8s/forgejo/deployment.yaml\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e@@ -91,6 +91,10 @@ spec:\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e               value: \u0026#34;0.0.0.0\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e             - name: FORGEJO__server__HTTP_PORT\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e               value: \u0026#34;3000\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gi\"\u003e+            - name: FORGEJO__repository__ENABLE_PUSH_CREATE_USER\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gi\"\u003e+              value: \u0026#34;true\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gi\"\u003e+            - name: FORGEJO__repository__ENABLE_PUSH_CREATE_ORG\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gi\"\u003e+              value: \u0026#34;true\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e             - name: FORGEJO__database__DB_TYPE\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e               value: postgres\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e             - name: FORGEJO__database__HOST\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ca href=\"https://github.com/WaylonWalker/homelab-argo/commit/b2e953bc12\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/github.com.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/github.com.ico\" class=\"has-avatar  has-avatar-before\"\u003ehttps://github.com/WaylonWalker/homelab-argo/commit/b2e953bc12\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eTried again, and it just worked!\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enotify.wayl.one on  main is 📦 v0.1.62  v3.14.4  NO PYTHON VENV SET  USING SYSTEM NVIM\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ git push\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eEnumerating objects: 171, \u003cspan class=\"k\"\u003edone\u003c/span\u003e.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCounting objects: 100% \u003cspan class=\"o\"\u003e(\u003c/span\u003e171/171\u003cspan class=\"o\"\u003e)\u003c/span\u003e, \u003cspan class=\"k\"\u003edone\u003c/span\u003e.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDelta compression using up to \u003cspan class=\"m\"\u003e12\u003c/span\u003e threads\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCompressing objects: 100% \u003cspan class=\"o\"\u003e(\u003c/span\u003e169/169\u003cspan class=\"o\"\u003e)\u003c/span\u003e, \u003cspan class=\"k\"\u003edone\u003c/span\u003e.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eWriting objects: 100% \u003cspan class=\"o\"\u003e(\u003c/span\u003e171/171\u003cspan class=\"o\"\u003e)\u003c/span\u003e, 176.22 KiB \u003cspan class=\"p\"\u003e|\u003c/span\u003e 16.02 MiB/s, \u003cspan class=\"k\"\u003edone\u003c/span\u003e.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eTotal \u003cspan class=\"m\"\u003e171\u003c/span\u003e \u003cspan class=\"o\"\u003e(\u003c/span\u003edelta 99\u003cspan class=\"o\"\u003e)\u003c/span\u003e, reused \u003cspan class=\"m\"\u003e0\u003c/span\u003e \u003cspan class=\"o\"\u003e(\u003c/span\u003edelta 0\u003cspan class=\"o\"\u003e)\u003c/span\u003e, pack-reused \u003cspan class=\"m\"\u003e0\u003c/span\u003e \u003cspan class=\"o\"\u003e(\u003c/span\u003efrom 0\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eremote: Resolving deltas: 100% \u003cspan class=\"o\"\u003e(\u003c/span\u003e99/99\u003cspan class=\"o\"\u003e)\u003c/span\u003e, \u003cspan class=\"k\"\u003edone\u003c/span\u003e.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eTo https://git.waylonwalker.com/waylon/notify.wayl.one\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e * \u003cspan class=\"o\"\u003e[\u003c/span\u003enew branch\u003cspan class=\"o\"\u003e]\u003c/span\u003e      main -\u0026gt; main\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nI just learned that forgejo has a push to create repo feature and it is a\ngamechanger.  Upon first try it didn't work, with just a couple of environment\nvariables I was up and running with push to create.\n\n``` bash\nnotify.wayl.one on  main is 📦 v0.1.62  v3.14.4  NO PYTHON VENV SET  USING SYSTEM NVIM\n❯ git remote add origin https://git.waylonwalker.com/waylon/notify.wayl.one\nnotify.wayl.one on  main is 📦 v0.1.62  v3.14.4  NO PYTHON VENV SET  USING SYSTEM NVIM\n❯ git push\nremote: Push to create is not enabled for users.\nfatal: unable to access 'https://git.waylonwalker.com/waylon/notify.wayl.one/': The requested URL returned error: 403\n```\n\nSo I added the following environment variables.\n\n``` diff\nAuthor: Waylon S. Walker \u003cwaylon@waylonwalker.com\u003e\nDate:   Wed May 6 21:56:53 2026 -0500\n\n    enable push to create\n\ndiff --git a/k8s/forgejo/deployment.yaml b/k8s/forgejo/deployment.yaml\nindex d77daab..9346763 100644\n--- a/k8s/forgejo/deployment.yaml\n+++ b/k8s/forgejo/deployment.yaml\n@@ -91,6 +91,10 @@ spec:\n               value: \"0.0.0.0\"\n             - name: FORGEJO__server__HTTP_PORT\n               value: \"3000\"\n+            - name: FORGEJO__repository__ENABLE_PUSH_CREATE_USER\n+              value: \"true\"\n+            - name: FORGEJO__repository__ENABLE_PUSH_CREATE_ORG\n+              value: \"true\"\n             - name: FORGEJO__database__DB_TYPE\n               value: postgres\n             - name: FORGEJO__database__HOST\n```\n\nhttps://github.com/WaylonWalker/homelab-argo/commit/b2e953bc12\n\nTried again, and it just worked!\n\n``` bash\nnotify.wayl.one on  main is 📦 v0.1.62  v3.14.4  NO PYTHON VENV SET  USING SYSTEM NVIM\n❯ git push\nEnumerating objects: 171, done.\nCounting objects: 100% (171/171), done.\nDelta compression using up to 12 threads\nCompressing objects: 100% (169/169), done.\nWriting objects: 100% (171/171), 176.22 KiB | 16.02 MiB/s, done.\nTotal 171 (delta 99), reused 0 (delta 0), pack-reused 0 (from 0)\nremote: Resolving deltas: 100% (99/99), done.\nTo https://git.waylonwalker.com/waylon/notify.wayl.one\n * [new branch]      main -\u003e main\n ```\n",
      "summary": "I just learned that forgejo has a push to create repo feature and it is a gamechanger. Upon first try it didn't work, with just a couple of environment...",
      "date_published": "2026-05-06T21:58:55Z",
      "date_modified": "2026-05-06T21:58:55Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "git"
      ]
    },
    {
      "id": "https://waylonwalker.com/nless/",
      "url": "https://waylonwalker.com/nless/",
      "title": "nless",
      "content_html": "\u003cp\u003enless is a seriously sick tui for exploring streaming data.  It makes it\nseriously simple to pivot (U), drill in (Enter), sort (s).  It leave\nbreadcrumbs as you go and you can press q to back out.\u003c/p\u003e\n\u003cp\u003ePlay with your kubernetes events.  Ya, my \u003ca href=\"/homelab/\" class=\"glossary-term\" title=\"A place to self host applications. For me this is primarily self built web applications, and applications for sharing files with my family. Techno Tim has a...\"\u003ehomelab\u003c/a\u003e is far from perfect, dont judge.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ekubectl get events -A -w \u003cspan class=\"p\"\u003e|\u003c/span\u003e uvx --from nothing-less nless\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cfigure\u003e\n\u003ca href=\"http://dropper.wayl.one/file/ceda8873-cb08-4436-a3ac-b5bf4a0b2379.mp4\" class=\"glightbox-link\" aria-label=\"ceda8873-cb08-4436-a3ac-b5bf4a0b2379.mp4\"\u003e\u003cvideo autoplay loop muted playsinline controls preload=\"metadata\" class=\"md-video\" poster=\"https://dropper.wayl.one/file/ceda8873-cb08-4436-a3ac-b5bf4a0b2379.webp?h=675\u0026w=1200\"\u003e\u003csource src=\"http://dropper.wayl.one/file/ceda8873-cb08-4436-a3ac-b5bf4a0b2379.mp4\" type=\"video/mp4\"\u003eceda8873-cb08-4436-a3ac-b5bf4a0b2379.mp4\u003c/video\u003e\u003c/a\u003e\n\u003c/figure\u003e\n",
      "content_text": "\nnless is a seriously sick tui for exploring streaming data.  It makes it\nseriously simple to pivot (U), drill in (Enter), sort (s).  It leave\nbreadcrumbs as you go and you can press q to back out.\n\nPlay with your kubernetes events.  Ya, my homelab is far from perfect, dont judge.\n\n``` bash\nkubectl get events -A -w | uvx --from nothing-less nless\n```\n\n![ceda8873-cb08-4436-a3ac-b5bf4a0b2379.mp4](http://dropper.wayl.one/file/ceda8873-cb08-4436-a3ac-b5bf4a0b2379.mp4)\n",
      "summary": "nless is a seriously sick tui for exploring streaming data. It makes it seriously simple to pivot (U), drill in (Enter), sort (s). It leave breadcrumbs as...",
      "date_published": "2026-05-06T20:45:01Z",
      "date_modified": "2026-05-06T20:45:01Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/image-compare-in-markata-go/",
      "url": "https://waylonwalker.com/image-compare-in-markata-go/",
      "title": "image compare in markata go",
      "content_html": "\u003cp\u003e\u003ccode\u003emarkata-go\u003c/code\u003e now has web awesome integration for image compare.  It renders a\nnice web component with a slider to compare two images.\u003c/p\u003e\n\u003cwa-comparison class=\"markata-webawesome-comparison\"\u003e\u003cimg slot=\"after\" src=\"https://dropper.wayl.one/file/d628ffba-de18-4fff-91a8-700f037df119.webp\" alt=\"d628ffba-de18-4fff-91a8-700f037df119.webp\" loading=\"lazy\"\u003e\u003cimg slot=\"before\" src=\"https://dropper.waylonwalker.com/file/ca30665f-1a15-453e-aab8-221901c7df99.webp\" alt=\"\" loading=\"lazy\"\u003e\u003c/wa-comparison\u003e\n\u003cp\u003eIt’s done with a class wrapper around the image components.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::: wa-comparison\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![\u003cspan class=\"nt\"\u003ed628ffba-de18-4fff-91a8-700f037df119.webp\u003c/span\u003e](\u003cspan class=\"na\"\u003ehttps://dropper.wayl.one/file/d628ffba-de18-4fff-91a8-700f037df119.webp\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![](https://dropper.waylonwalker.com/file/ca30665f-1a15-453e-aab8-221901c7df99.webp)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWithout \u003ccode\u003emarkata-go\u003c/code\u003e’s web awesome integration, the above would look like:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e \u003cspan class=\"na\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;module\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kr\"\u003eimport\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;https://ka-f.webawesome.com/webawesome@3.6.0/components/comparison/comparison.js\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ewa-comparison\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eimg\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"na\"\u003eslot\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;before\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://dropper.wayl.one/file/d628ffba-de18-4fff-91a8-700f037df119.webp\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"na\"\u003ealt\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Grayscale version of kittens in a basket looking around.\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eimg\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"na\"\u003eslot\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;after\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://dropper.waylonwalker.com/file/ca30665f-1a15-453e-aab8-221901c7df99.webp\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"na\"\u003ealt\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Color version of kittens in a basket looking around.\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ewa-comparison\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\n`markata-go` now has web awesome integration for image compare.  It renders a\nnice web component with a slider to compare two images.\n\n::: wa-comparison\n![d628ffba-de18-4fff-91a8-700f037df119.webp](https://dropper.wayl.one/file/d628ffba-de18-4fff-91a8-700f037df119.webp)\n![](https://dropper.waylonwalker.com/file/ca30665f-1a15-453e-aab8-221901c7df99.webp)\n:::\n\nIt's done with a class wrapper around the image components.\n\n``` md\n::: wa-comparison\n![d628ffba-de18-4fff-91a8-700f037df119.webp](https://dropper.wayl.one/file/d628ffba-de18-4fff-91a8-700f037df119.webp)\n![](https://dropper.waylonwalker.com/file/ca30665f-1a15-453e-aab8-221901c7df99.webp)\n:::\n```\n\nWithout `markata-go`'s web awesome integration, the above would look like:\n\n``` html\n\u003cscript type=\"module\"\u003e\n  import 'https://ka-f.webawesome.com/webawesome@3.6.0/components/comparison/comparison.js';\n\u003c/script\u003e\n\n\u003cwa-comparison\u003e\n  \u003cimg\n    slot=\"before\"\n    src=\"https://dropper.wayl.one/file/d628ffba-de18-4fff-91a8-700f037df119.webp\"\n    alt=\"Grayscale version of kittens in a basket looking around.\"\n  /\u003e\n  \u003cimg\n    slot=\"after\"\n    src=\"https://dropper.waylonwalker.com/file/ca30665f-1a15-453e-aab8-221901c7df99.webp\"\n    alt=\"Color version of kittens in a basket looking around.\"\n  /\u003e\n\u003c/wa-comparison\u003e\n```\n\n",
      "summary": "now has web awesome integration for image compare. It renders a nice web component with a slider to compare two images.",
      "date_published": "2026-05-01T07:40:44Z",
      "date_modified": "2026-05-01T07:40:44Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "dev",
        "webdev"
      ]
    },
    {
      "id": "https://waylonwalker.com/testing-copilot-model-flag/",
      "url": "https://waylonwalker.com/testing-copilot-model-flag/",
      "title": "testing copilot model flag",
      "content_html": "\u003cp\u003eToday I found a way to test model syntax, cause the clankers always get the\nexact model name that copilot wants wrong.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecopilot --model claude-sonnet-4.5 -p \u003cspan class=\"s2\"\u003e\u0026#34;Reply with OK\u0026#34;\u003c/span\u003e --allow-all --no-ask-user -s\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecopilot --model gpt-5.4 -p \u003cspan class=\"s2\"\u003e\u0026#34;Reply with OK\u0026#34;\u003c/span\u003e --allow-all --no-ask-user -s\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nToday I found a way to test model syntax, cause the clankers always get the\nexact model name that copilot wants wrong.\n\n``` bash\ncopilot --model claude-sonnet-4.5 -p \"Reply with OK\" --allow-all --no-ask-user -s\ncopilot --model gpt-5.4 -p \"Reply with OK\" --allow-all --no-ask-user -s\n```\n",
      "summary": "Today I found a way to test model syntax, cause the clankers always get the exact model name that copilot wants wrong.",
      "date_published": "2026-04-29T11:05:39Z",
      "date_modified": "2026-04-29T11:05:39Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "cli"
      ]
    },
    {
      "id": "https://waylonwalker.com/stow-local-ignore/",
      "url": "https://waylonwalker.com/stow-local-ignore/",
      "title": "stow local ignore",
      "content_html": "\u003cp\u003eStow comes with a local and global ignore list that you can use to ignore\ncertain files or directories.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIf you put Perl regular expressions, one per line, in a .stow-local-ignore\nfile within any top level package directory, in which case any file or\ndirectory within that package matching any of these regular expressions will\nbe ignored. In the absence of this package-specific ignore list, Stow will\ninstead use the contents of ~/.stow-global-ignore, if it exists. If neither\nthe package-local or global ignore list exist, Stow will use its own built-in\ndefault ignore list, which serves as a useful example of the format of these\nignore list files:\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eExample given from the docs\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eRCS\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e.+,v\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCVS\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\\.\\#.+       # CVS conflict files / emacs lock files\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\\.cvsignore\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\\.svn\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e_darcs\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\\.hg\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\\.git\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\\.gitignore\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\\.gitmodules\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e.+~          # emacs backup files\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\\#.*\\#       # emacs autosave files\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e^/README.*\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e^/LICENSE.*\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e^/COPYING\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"reference\"\u003eReference \u003ca href=\"#reference\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://www.gnu.org/software/stow/manual/html_node/Types-And-Syntax-Of-Ignore-Lists.html\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/www.gnu.org.png\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/www.gnu.org.png\" class=\"has-avatar  has-avatar-before\"\u003ehttps://www.gnu.org/software/stow/manual/html_node/Types-And-Syntax-Of-Ignore-Lists.html\u003c/a\u003e\u003c/p\u003e\n",
      "content_text": "\nStow comes with a local and global ignore list that you can use to ignore\ncertain files or directories.\n\n\n\u003e If you put Perl regular expressions, one per line, in a .stow-local-ignore\n\u003e file within any top level package directory, in which case any file or\n\u003e directory within that package matching any of these regular expressions will\n\u003e be ignored. In the absence of this package-specific ignore list, Stow will\n\u003e instead use the contents of ~/.stow-global-ignore, if it exists. If neither\n\u003e the package-local or global ignore list exist, Stow will use its own built-in\n\u003e default ignore list, which serves as a useful example of the format of these\n\u003e ignore list files:\n\nExample given from the docs\n\n``` text\nRCS\n.+,v\n\nCVS\n\\.\\#.+       # CVS conflict files / emacs lock files\n\\.cvsignore\n\n\\.svn\n_darcs\n\\.hg\n\n\\.git\n\\.gitignore\n\\.gitmodules\n\n.+~          # emacs backup files\n\\#.*\\#       # emacs autosave files\n\n^/README.*\n^/LICENSE.*\n^/COPYING\n```\n\n\n## Reference\n\nhttps://www.gnu.org/software/stow/manual/html_node/Types-And-Syntax-Of-Ignore-Lists.html\n",
      "summary": "Stow comes with a local and global ignore list that you can use to ignore certain files or directories.",
      "date_published": "2026-04-18T10:36:00Z",
      "date_modified": "2026-04-18T10:36:00Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "linux"
      ]
    },
    {
      "id": "https://waylonwalker.com/move-zmk-keyboard-to-new-bluetooth-adapter/",
      "url": "https://waylonwalker.com/move-zmk-keyboard-to-new-bluetooth-adapter/",
      "title": "move zmk keyboard to new bluetooth adapter",
      "content_html": "\u003cp\u003eI’ve been having issue with my keyboard disconnecting to my main desktop for\nawhile.  Today I got a cheap bluetooh dongle in and am giving it a run this\nweek to see how things go.  The first step was to move it to the new adapter.\nI’ve never had multiple adapters installed so this was a new to me process.\u003c/p\u003e\n\u003cp\u003eI was able to do it all with the same keyboard, It did require some juggling\nbetween usb and bluetooth modes pluging and unplugging, two keyboards would be\nsimpler to reason about.\u003c/p\u003e\n\u003cp\u003eI can’t be bothered to change my brain to think about this machine on a\ndifferent zmk profile it is of absolute importance for it to remain on the same\nprofile, otherwise this would be a simple bind to another empty profile.\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eWhy not use a cable on desktop?\u003c/p\u003e\n\u003cp\u003eI dont mind cable, and have used one on this setup for years, but I have\nactually been picking up and moving this keyboard and using it with\ndifferent devices.\u003c/p\u003e\n\u003cp\u003eI’ve got a big battery and performace cranked up, unless my machine is\nunder load I do not notice any key lag.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eI did it with bluetoothctl, I’m sure it could have been done with a gui like\n\u003ccode\u003eblueberry\u003c/code\u003e or \u003ccode\u003eblueman\u003c/code\u003e.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebluetoothctl\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# list adapters\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elist\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eselect\u003c/span\u003e \u0026lt;old-adapter\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edevices\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# fin the MAC address of the device 42BLOCK\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eremove \u0026lt;42BLOCK_MAC\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNow I plugged into usb. And \u003cstrong\u003eimportantly\u003c/strong\u003e cleared out the zmk profile.  If\nyou do not clear the profile your board does not go into pairing mode.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebluetoothctl\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# switch adapters\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eselect\u003c/span\u003e \u0026lt;new-adapter\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epower on\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eagent on\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edefault-agent\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003escan on\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePut 42Block in pairing mode, \u003cspan class=\"k\"\u003ethen\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epair \u0026lt;42BLOCK_MAC\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etrust \u0026lt;42BLOCK_MAC\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eAt this pint I saw this show up in the logs, I think there was some masking\nissues or something in zmk, output kept going out usb no matter what so I\ndisconnected the keyboard and typed the passkey in, and it worked.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e[\u003c/span\u003eagent\u003cspan class=\"o\"\u003e]\u003c/span\u003e Passkey: \u003cspan class=\"m\"\u003e540044\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eBoom, it just started working right away.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebluetoothctl\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003econnect \u0026lt;42BLOCK_MAC\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003einfo \u0026lt;42BLOCK_MAC\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003escan off\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexit\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nI've been having issue with my keyboard disconnecting to my main desktop for\nawhile.  Today I got a cheap bluetooh dongle in and am giving it a run this\nweek to see how things go.  The first step was to move it to the new adapter.\nI've never had multiple adapters installed so this was a new to me process.\n\nI was able to do it all with the same keyboard, It did require some juggling\nbetween usb and bluetooth modes pluging and unplugging, two keyboards would be\nsimpler to reason about.\n\nI can't be bothered to change my brain to think about this machine on a\ndifferent zmk profile it is of absolute importance for it to remain on the same\nprofile, otherwise this would be a simple bind to another empty profile.\n\n!!! note \"Why not use a cable on desktop?\"\n\n    I dont mind cable, and have used one on this setup for years, but I have\n    actually been picking up and moving this keyboard and using it with\n    different devices.\n\n    I've got a big battery and performace cranked up, unless my machine is\n    under load I do not notice any key lag.\n\nI did it with bluetoothctl, I'm sure it could have been done with a gui like\n`blueberry` or `blueman`.\n\n``` bash\nbluetoothctl\n# list adapters\nlist\nselect \u003cold-adapter\u003e\ndevices\n# fin the MAC address of the device 42BLOCK\nremove \u003c42BLOCK_MAC\u003e\n```\n\nNow I plugged into usb. And **importantly** cleared out the zmk profile.  If\nyou do not clear the profile your board does not go into pairing mode.\n\n``` bash\nbluetoothctl\n# switch adapters\nselect \u003cnew-adapter\u003e\npower on\nagent on\ndefault-agent\nscan on\nPut 42Block in pairing mode, then:\npair \u003c42BLOCK_MAC\u003e\ntrust \u003c42BLOCK_MAC\u003e\n```\n\nAt this pint I saw this show up in the logs, I think there was some masking\nissues or something in zmk, output kept going out usb no matter what so I\ndisconnected the keyboard and typed the passkey in, and it worked.\n\n``` bash\n[agent] Passkey: 540044\n```\n\nBoom, it just started working right away.\n\n``` bash\nbluetoothctl\nconnect \u003c42BLOCK_MAC\u003e\ninfo \u003c42BLOCK_MAC\u003e\nscan off\nexit\n```\n",
      "summary": "I've been having issue with my keyboard disconnecting to my main desktop for awhile. Today I got a cheap bluetooh dongle in and am giving it a run this week...",
      "date_published": "2026-03-23T17:59:59Z",
      "date_modified": "2026-03-23T17:59:59Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "keeb",
        "zmk"
      ]
    },
    {
      "id": "https://waylonwalker.com/dot-dockerenv/",
      "url": "https://waylonwalker.com/dot-dockerenv/",
      "title": "dot dockerenv",
      "content_html": "\u003cp\u003eToday I learned that docker creates an empty \u003ccode\u003e/.dockerenv\u003c/code\u003e file to indicate that\nyou are running in a docker container.  Other runtimes like podman commonly use\n\u003ccode\u003e/run/.containerenv\u003c/code\u003e.  kubernetes uses neither of these, the most common way to\ndetect if you are running in kubernetes is to check for the presence of the\n\u003ccode\u003eKUBERNETES_SERVICE_HOST\u003c/code\u003e environment variable.  There will also be a directory\nat \u003ccode\u003e/var/run/secrets/kubernetes.io/serviceaccount\u003c/code\u003e that contains the service\naccount credentials if you are running in kubernetes.\u003c/p\u003e\n",
      "content_text": "\nToday I learned that docker creates an empty `/.dockerenv` file to indicate that\nyou are running in a docker container.  Other runtimes like podman commonly use\n`/run/.containerenv`.  kubernetes uses neither of these, the most common way to\ndetect if you are running in kubernetes is to check for the presence of the\n`KUBERNETES_SERVICE_HOST` environment variable.  There will also be a directory\nat `/var/run/secrets/kubernetes.io/serviceaccount` that contains the service\naccount credentials if you are running in kubernetes.\n\n",
      "summary": "Today I learned that docker creates an empty file to indicate that you are running in a docker container. Other runtimes like podman commonly use ....",
      "date_published": "2026-03-18T10:07:16Z",
      "date_modified": "2026-03-18T10:07:16Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "containers",
        "docker",
        "kubernetes"
      ]
    },
    {
      "id": "https://waylonwalker.com/gh-do-i-have-a-pr/",
      "url": "https://waylonwalker.com/gh-do-i-have-a-pr/",
      "title": "gh do I have a pr",
      "content_html": "\u003cp\u003eIn the age of agents sometimes work gets done on so many different worktrees\nand branches its hard to tell if there is already a PR or any of them or not,\nthe great \u003ccode\u003egh\u003c/code\u003e cli has us covered.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egh pr list --head fix/markata-go-connections-graph\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nIn the age of agents sometimes work gets done on so many different worktrees\nand branches its hard to tell if there is already a PR or any of them or not,\nthe great `gh` cli has us covered.\n\n``` bash\ngh pr list --head fix/markata-go-connections-graph\n```\n",
      "summary": "In the age of agents sometimes work gets done on so many different worktrees and branches its hard to tell if there is already a PR or any of them or not,...",
      "date_published": "2026-03-02T08:47:44Z",
      "date_modified": "2026-03-02T08:47:44Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "cli"
      ]
    },
    {
      "id": "https://waylonwalker.com/double-gutter/",
      "url": "https://waylonwalker.com/double-gutter/",
      "title": "double gutter",
      "content_html": "\u003cp\u003eI keep forgetting about the double gutter problem with nested containers.  When\nyou put padding on a parent and the child also has padding, you get twice the\nspacing you wanted.\u003c/p\u003e\n\u003ch2 id=\"the-problem\"\u003eThe Problem \u003ca href=\"#the-problem\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003econtainer\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003epadding\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"kt\"\u003erem\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nc\"\u003echild\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003epadding\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"kt\"\u003erem\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNow your content is 4rem from the edge.  Not what I meant at all.\u003c/p\u003e\n\u003ch2 id=\"the-fix\"\u003eThe Fix \u003ca href=\"#the-fix\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eEither remove padding from the parent or use \u003ccode\u003ebox-sizing: border-box\u003c/code\u003e and plan\nfor it.  I usually just drop the parent padding when I realize what I have done.\u003c/p\u003e\n",
      "content_text": "\nI keep forgetting about the double gutter problem with nested containers.  When\nyou put padding on a parent and the child also has padding, you get twice the\nspacing you wanted.\n\n## The Problem\n\n```css\n.container {\n  padding: 2rem;\n}\n\n.child {\n  padding: 2rem;\n}\n```\n\nNow your content is 4rem from the edge.  Not what I meant at all.\n\n## The Fix\n\nEither remove padding from the parent or use `box-sizing: border-box` and plan\nfor it.  I usually just drop the parent padding when I realize what I have done.",
      "summary": "I keep forgetting about the double gutter problem with nested containers. When you put padding on a parent and the child also has padding, you get twice the...",
      "date_published": "2026-02-14T09:12:42Z",
      "date_modified": "2026-02-14T09:12:42Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "dev",
        "webdev"
      ]
    },
    {
      "id": "https://waylonwalker.com/diff-kubernetes-manifest-with-cluster/",
      "url": "https://waylonwalker.com/diff-kubernetes-manifest-with-cluster/",
      "title": "diff kubernetes manifest with cluster",
      "content_html": "\u003cp\u003eLike a dufus this morning I did a hard reset on a \u003ca href=\"/glossary/git/\" class=\"glossary-term\" title=\"Git is a version control system for tracking changes in source code during software development. In the beginning there were many, some were licensed. As...\"\u003egit\u003c/a\u003e repo for getting I was\nworking on a manifest for.  You see I generally use argo, but occasionally I\nhave no idea what I am doing or want yet and I start raw doggin it, fully aware\nthat I’m going to just nuke this namespace before getting it into a proper\nargocd.\u003c/p\u003e\n\u003cp\u003eI was overjoyed when I found out that you can diff your manifests with live\nproduction using the \u003ccode\u003ekubectl diff\u003c/code\u003e command.  It uses standard diff so you can\nbring all your fancy diff viewers you like.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# regular manifest\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ekubectl diff -f k8s/shots -n shot\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# kustomize\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ekubectl diff -k k8s -n go-waylonwalker-com\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# using a fancy diff viewer\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ekubectl diff -f k8s/shots -n shot \u003cspan class=\"p\"\u003e|\u003c/span\u003e delta\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# using an even fancier diff viewer\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# pinkies out for this one\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ekubectl diff -f k8s/shots -n shot \u003cspan class=\"p\"\u003e|\u003c/span\u003e delta --diff-so-fancy\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNow I can get those changes back that I thought I lost, and apply updates with\nconfidence knowing what is about to change.\u003c/p\u003e\n",
      "content_text": "\nLike a dufus this morning I did a hard reset on a git repo for getting I was\nworking on a manifest for.  You see I generally use argo, but occasionally I\nhave no idea what I am doing or want yet and I start raw doggin it, fully aware\nthat I'm going to just nuke this namespace before getting it into a proper\nargocd.\n\nI was overjoyed when I found out that you can diff your manifests with live\nproduction using the `kubectl diff` command.  It uses standard diff so you can\nbring all your fancy diff viewers you like.\n\n``` bash\n# regular manifest\nkubectl diff -f k8s/shots -n shot\n# kustomize\nkubectl diff -k k8s -n go-waylonwalker-com\n# using a fancy diff viewer\nkubectl diff -f k8s/shots -n shot | delta\n# using an even fancier diff viewer\n# pinkies out for this one\nkubectl diff -f k8s/shots -n shot | delta --diff-so-fancy\n```\n\nNow I can get those changes back that I thought I lost, and apply updates with\nconfidence knowing what is about to change.\n",
      "summary": "Like a dufus this morning I did a hard reset on a git repo for getting I was working on a manifest for. You see I generally use argo, but occasionally I have...",
      "date_published": "2026-02-05T09:37:39Z",
      "date_modified": "2026-02-05T09:37:39Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "containers",
        "kubernetes"
      ]
    },
    {
      "id": "https://waylonwalker.com/format-markdown-with-mdformat/",
      "url": "https://waylonwalker.com/format-markdown-with-mdformat/",
      "title": "format markdown with mdformat",
      "content_html": "\u003cp\u003eI really wish I would have got this right a few years ago. Theres a couple of\nflags I had to use to get mdformat to do hard wraps at 80 characters and not\nwreck tables. This mix of flags and plugins is workign really well for me so\nfar.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emdfmt\u003cspan class=\"o\"\u003e()\u003c/span\u003e \u003cspan class=\"o\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    uvx \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        --with \u003cspan class=\"s2\"\u003e\u0026#34;mdformat-ruff\u0026#34;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        --with \u003cspan class=\"s2\"\u003e\u0026#34;mdformat-beautysh\u0026#34;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        --with \u003cspan class=\"s2\"\u003e\u0026#34;mdformat-web\u0026#34;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        --with \u003cspan class=\"s2\"\u003e\u0026#34;mdformat-config\u0026#34;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        --with \u003cspan class=\"s2\"\u003e\u0026#34;mdformat-gfm\u0026#34;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        --with \u003cspan class=\"s2\"\u003e\u0026#34;mdformat-front-matters\u0026#34;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        --with \u003cspan class=\"s2\"\u003e\u0026#34;mdformat-wikilink\u0026#34;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        --with \u003cspan class=\"s2\"\u003e\u0026#34;mdformat-simple-breaks\u0026#34;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        mdformat \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        --wrap \u003cspan class=\"m\"\u003e80\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        --end-of-line lf \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        --codeformatters python \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        --codeformatters bash \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$@\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eAnd as pre-commmit.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"l\"\u003erepos\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003erepo\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps://github.com/hukkin/mdformat\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003erev\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e1.0.0\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# pin to the version you want\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ehooks\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emdformat\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e- --\u003cspan class=\"l\"\u003ewrap\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;80\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e- --\u003cspan class=\"l\"\u003eend-of-line\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e- \u003cspan class=\"l\"\u003elf\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e- --\u003cspan class=\"l\"\u003ecodeformatters\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e- \u003cspan class=\"l\"\u003epython\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e- --\u003cspan class=\"l\"\u003ecodeformatters\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e- \u003cspan class=\"l\"\u003ebash\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003eadditional_dependencies\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e- \u003cspan class=\"l\"\u003emdformat-ruff\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e- \u003cspan class=\"l\"\u003emdformat-beautysh\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e- \u003cspan class=\"l\"\u003emdformat-web\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e- \u003cspan class=\"l\"\u003emdformat-config\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e- \u003cspan class=\"l\"\u003emdformat-gfm\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e- \u003cspan class=\"l\"\u003emdformat-front-matters\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e- \u003cspan class=\"l\"\u003emdformat-wikilink\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e- \u003cspan class=\"l\"\u003emdformat-simple-breaks\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nI really wish I would have got this right a few years ago. Theres a couple of\nflags I had to use to get mdformat to do hard wraps at 80 characters and not\nwreck tables. This mix of flags and plugins is workign really well for me so\nfar.\n\n```bash\nmdfmt() {\n    uvx \\\n        --with \"mdformat-ruff\" \\\n        --with \"mdformat-beautysh\" \\\n        --with \"mdformat-web\" \\\n        --with \"mdformat-config\" \\\n        --with \"mdformat-gfm\" \\\n        --with \"mdformat-front-matters\" \\\n        --with \"mdformat-wikilink\" \\\n        --with \"mdformat-simple-breaks\" \\\n        mdformat \\\n        --wrap 80 \\\n        --end-of-line lf \\\n        --codeformatters python \\\n        --codeformatters bash \\\n        \"$@\"\n}\n```\n\nAnd as pre-commmit.\n\n```yaml\nrepos\n  - repo: https://github.com/hukkin/mdformat\n    rev: 1.0.0  # pin to the version you want\n    hooks:\n      - id: mdformat\n        args:\n          - --wrap\n          - \"80\"\n          - --end-of-line\n          - lf\n          - --codeformatters\n          - python\n          - --codeformatters\n          - bash\n        additional_dependencies:\n          - mdformat-ruff\n          - mdformat-beautysh\n          - mdformat-web\n          - mdformat-config\n          - mdformat-gfm\n          - mdformat-front-matters\n          - mdformat-wikilink\n          - mdformat-simple-breaks\n```\n",
      "summary": "I really wish I would have got this right a few years ago. Theres a couple of flags I had to use to get mdformat to do hard wraps at 80 characters and not...",
      "date_published": "2026-01-19T20:41:14Z",
      "date_modified": "2026-01-19T20:41:14Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "python"
      ]
    },
    {
      "id": "https://waylonwalker.com/opencode-variants/",
      "url": "https://waylonwalker.com/opencode-variants/",
      "title": "opencode variants",
      "content_html": "\u003cp\u003eOpencode is changing on the daily right now, today I noticed the word \u003ccode\u003elow\u003c/code\u003e pop\nup in Orange text in my opencode window.  Looking into this they are exposing\n\u003ca href=\"https://opencode.ai/docs/models/#variants\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/opencode.ai.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/opencode.ai.ico\" class=\"has-avatar  has-avatar-before\"\u003evariants\u003c/a\u003e to the user.  This allows\nyou to change between fast or slow and thinking, the later taking more time to\nprepare before doing an action.\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/file/0b6bfe5e-41b0-4e44-8c5a-ff88739a770e.mp4\" class=\"glightbox-link\" aria-label=\"Swapping Variants in opencode\"\u003e\u003cvideo autoplay loop muted playsinline controls preload=\"metadata\" class=\"md-video\" poster=\"https://dropper.waylonwalker.com/file/0b6bfe5e-41b0-4e44-8c5a-ff88739a770e.webp?h=675\u0026w=1200\"\u003e\u003csource src=\"https://dropper.waylonwalker.com/file/0b6bfe5e-41b0-4e44-8c5a-ff88739a770e.mp4\" type=\"video/mp4\"\u003eSwapping Variants in opencode\u003c/video\u003e\u003c/a\u003e\n\u003c/figure\u003e\n\u003cp\u003eIt looks like this toggle may have been here for awhile and I’m just now\ndiscovering it. Potentially because its a new feature of the free Zen provider.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eVariants\nMany models support multiple variants with different configurations. OpenCode ships with built-in default variants for popular providers.\u003c/p\u003e\n\u003cp\u003eBuilt-in variants\nOpenCode ships with default variants for many providers:\u003c/p\u003e\n\u003cp\u003eAnthropic:\u003c/p\u003e\n\u003cp\u003ehigh - High thinking budget (default)\nmax - Maximum thinking budget\nOpenAI:\u003c/p\u003e\n\u003cp\u003eVaries by model but roughly:\u003c/p\u003e\n\u003cp\u003enone - No reasoning\nminimal - Minimal reasoning effort\nlow - Low reasoning effort\nmedium - Medium reasoning effort\nhigh - High reasoning effort\nxhigh - Extra high reasoning effort\nGoogle:\u003c/p\u003e\n\u003cp\u003elow - Lower effort/token budget\nhigh - Higher effort/token budget\u003c/p\u003e\n\u003c/blockquote\u003e\n",
      "content_text": "\nOpencode is changing on the daily right now, today I noticed the word `low` pop\nup in Orange text in my opencode window.  Looking into this they are exposing\n[variants](https://opencode.ai/docs/models/#variants) to the user.  This allows\nyou to change between fast or slow and thinking, the later taking more time to\nprepare before doing an action.\n\n![Swapping Variants in opencode](https://dropper.waylonwalker.com/file/0b6bfe5e-41b0-4e44-8c5a-ff88739a770e.mp4)\n\nIt looks like this toggle may have been here for awhile and I'm just now\ndiscovering it. Potentially because its a new feature of the free Zen provider.\n\n\u003e Variants\nMany models support multiple variants with different configurations. OpenCode ships with built-in default variants for popular providers.\n\u003e \n\u003e Built-in variants\n\u003e OpenCode ships with default variants for many providers:\n\u003e \n\u003e Anthropic:\n\u003e \n\u003e high - High thinking budget (default)\n\u003e max - Maximum thinking budget\n\u003e OpenAI:\n\u003e \n\u003e Varies by model but roughly:\n\u003e \n\u003e none - No reasoning\n\u003e minimal - Minimal reasoning effort\n\u003e low - Low reasoning effort\n\u003e medium - Medium reasoning effort\n\u003e high - High reasoning effort\n\u003e xhigh - Extra high reasoning effort\n\u003e Google:\n\u003e \n\u003e low - Lower effort/token budget\n\u003e high - Higher effort/token budget\n",
      "summary": "Opencode is changing on the daily right now, today I noticed the word pop up in Orange text in my opencode window. Looking into this they are exposing...",
      "date_published": "2026-01-13T08:53:36Z",
      "date_modified": "2026-01-13T08:53:36Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "ai",
        "llm",
        "opencode"
      ]
    },
    {
      "id": "https://waylonwalker.com/opencode-init-prompt/",
      "url": "https://waylonwalker.com/opencode-init-prompt/",
      "title": "opencode init prompt",
      "content_html": "\u003cp\u003eThis is opencode’s init prompt.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePlease analyze this codebase and create an AGENTS.md file containing:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e1.\u003c/span\u003e Build/lint/test commands - especially for running a single test\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e2.\u003c/span\u003e Code style guidelines including imports, formatting, types, naming conventions, error handling, etc.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eThe file you create will be given to agentic coding agents (such as yourself) that operate in this repository. Make it about 150 lines long.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eIf there are Cursor rules (in .cursor/rules/ or .cursorrules) or Copilot rules (in .github/copilot-instructions.md), make sure to include them.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eIf there\u0026#39;s already an AGENTS.md, improve it if it\u0026#39;s located in \u0026lt;dir\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\n\nThis is opencode's init prompt.\n\n``` markdown\nPlease analyze this codebase and create an AGENTS.md file containing:\n1. Build/lint/test commands - especially for running a single test\n2. Code style guidelines including imports, formatting, types, naming conventions, error handling, etc.\nThe file you create will be given to agentic coding agents (such as yourself) that operate in this repository. Make it about 150 lines long.\nIf there are Cursor rules (in .cursor/rules/ or .cursorrules) or Copilot rules (in .github/copilot-instructions.md), make sure to include them.\nIf there's already an AGENTS.md, improve it if it's located in \u003cdir\u003e\n```\n",
      "summary": "This is opencode's init prompt.",
      "date_published": "2026-01-09T13:32:12Z",
      "date_modified": "2026-01-09T13:32:12Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "ai",
        "llm"
      ]
    },
    {
      "id": "https://waylonwalker.com/til/tpope-vim-speeddating/",
      "url": "https://waylonwalker.com/til/tpope-vim-speeddating/",
      "title": "tpope vim-speeddating",
      "content_html": "\u003cp\u003eToday I discovered \u003ca href=\"https://github.com/tpope/vim-speeddating\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/github.com.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/github.com.ico\" class=\"has-avatar  has-avatar-before\"\u003evim-speeddating\u003c/a\u003e\nby tpope.  I’m sure I’ve seen years ago but it did not click for my workflow\nuntil today.  I often go through pictures from my phone for the past few days\nand make \u003ca class=\"wikilink\" data-description=\"All posts with the tag \u0026#34;shots\u0026#34;\" data-title=\"Posts tagged: shots\" href=\"/tags/shots/\" data-preview=\"All posts with the tag \u0026#34;shots\u0026#34;\"\u003ePosts tagged: shots\u003c/a\u003e posts, but I want to date them to about when the image was\ntaken most of the time.  This allows me to quickly bump days up and down using\n\u003ccode\u003ec-a\u003c/code\u003e and \u003ccode\u003ec-x\u003c/code\u003e even around the new year.\u003c/p\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/file/18c876c3-02ea-4c77-9f62-cdbb1bb759a1.mp4\" class=\"glightbox-link\" aria-label=\"Open image\"\u003e\u003cvideo autoplay loop muted playsinline controls preload=\"metadata\" class=\"md-video\" poster=\"https://dropper.waylonwalker.com/file/18c876c3-02ea-4c77-9f62-cdbb1bb759a1.webp?h=675\u0026w=1200\"\u003e\u003csource src=\"https://dropper.waylonwalker.com/file/18c876c3-02ea-4c77-9f62-cdbb1bb759a1.mp4\" type=\"video/mp4\"\u003eYour browser does not support the video tag.\u003c/video\u003e\u003c/a\u003e\n\u003cfigcaption\u003e\u003cp\u003eSound on, listen to those new switches.\u003c/p\u003e\u003c/figcaption\u003e\u003c/figure\u003e\n",
      "content_text": "\nToday I discovered [vim-speeddating](https://github.com/tpope/vim-speeddating)\nby tpope.  I'm sure I've seen years ago but it did not click for my workflow\nuntil today.  I often go through pictures from my phone for the past few days\nand make \u003ca href=\"/tags/shots/\" class=\"wikilink\" data-title=\"Posts tagged: shots\" data-description=\"All posts with the tag \u0026#34;shots\u0026#34;\"\u003ePosts tagged: shots\u003c/a\u003e posts, but I want to date them to about when the image was\ntaken most of the time.  This allows me to quickly bump days up and down using\n`c-a` and `c-x` even around the new year.\n\n![](https://dropper.waylonwalker.com/file/18c876c3-02ea-4c77-9f62-cdbb1bb759a1.mp4)\n\n\u003e Sound on, listen to those new switches.\n\n\n",
      "summary": "Today I discovered vim-speeddating by tpope. I'm sure I've seen years ago but it did not click for my workflow until today. I often go through pictures from...",
      "date_published": "2026-01-04T16:59:33Z",
      "date_modified": "2026-01-04T16:59:33Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "vim"
      ]
    },
    {
      "id": "https://waylonwalker.com/light-mode-screen-recording-css/",
      "url": "https://waylonwalker.com/light-mode-screen-recording-css/",
      "title": "light mode screen recording css",
      "content_html": "\u003cp\u003eYesterday I wrote about a way to do \u003ca class=\"wikilink\" data-date=\"2026-01-01\" data-description=\"I saw this tip from Cassidoo and had to try it out for myself. I kicked on a screen recording right from where my terminal was, converted it, and it actually...\" data-title=\"light mode screen recording\" href=\"/light-mode-screen-recording/\" data-preview=\"I saw this tip from Cassidoo and had to try it out for myself. I kicked on a screen recording right from where my terminal was, converted it, and it actually...\"\u003elight mode screen recording\u003c/a\u003e to\nconvert to light mode from dark mode with ffmpeg.  I was wondering if it could\nbe done entirely on the front end for web applications.  Turns out you can.\nI’m sure there are limited wikis and site builders that don’t allow adding\nstyle like this, but it works if you can.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003evideo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://dropper.waylonwalker.com/file/1c53dbcb-4b84-4e94-9f04-a42986ab3fa1.mp4?width=800\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"na\"\u003econtrols\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"na\"\u003estyle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;filter: invert(1) hue-rotate(180deg) contrast(1.2) saturate(1.1);\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!--markata-attribution--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003evideo\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cvideo src=\"https://dropper.waylonwalker.com/file/1c53dbcb-4b84-4e94-9f04-a42986ab3fa1.mp4?width=800\" controls=\"\" style=\"filter: invert(1) hue-rotate(0deg) contrast(1.2) saturate(1.1);\"\u003e\u003c/video\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e0 deg hue rotate\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003cvideo src=\"https://dropper.waylonwalker.com/file/1c53dbcb-4b84-4e94-9f04-a42986ab3fa1.mp4?width=800\" controls=\"\" style=\"filter: invert(1) hue-rotate(90deg) contrast(1.2) saturate(1.1);\"\u003e\u003c/video\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e90 deg hue rotate\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003cvideo src=\"https://dropper.waylonwalker.com/file/1c53dbcb-4b84-4e94-9f04-a42986ab3fa1.mp4?width=800\" controls=\"\" style=\"filter: invert(1) hue-rotate(180deg) contrast(1.2) saturate(1.1);\"\u003e\u003c/video\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e180 deg hue rotate\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003cvideo src=\"https://dropper.waylonwalker.com/file/1c53dbcb-4b84-4e94-9f04-a42986ab3fa1.mp4?width=800\" controls=\"\" style=\"filter: invert(1) hue-rotate(270deg) contrast(1.2) saturate(1.1);\"\u003e\u003c/video\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e270 deg hue rotate\u003c/p\u003e\n\u003c/blockquote\u003e\n",
      "content_text": "\nYesterday I wrote about a way to do \u003ca href=\"/light-mode-screen-recording/\" class=\"wikilink\" data-title=\"light mode screen recording\" data-description=\"I saw this tip from Cassidoo and had to try it out for myself. I kicked on a screen recording right from where my terminal was, converted it, and it actually...\" data-date=\"2026-01-01\"\u003elight mode screen recording\u003c/a\u003e to\nconvert to light mode from dark mode with ffmpeg.  I was wondering if it could\nbe done entirely on the front end for web applications.  Turns out you can.\nI'm sure there are limited wikis and site builders that don't allow adding\nstyle like this, but it works if you can.\n\n``` html\n\u003cvideo\n    src=\"https://dropper.waylonwalker.com/file/1c53dbcb-4b84-4e94-9f04-a42986ab3fa1.mp4?width=800\"\n    controls\n    style=\"filter: invert(1) hue-rotate(180deg) contrast(1.2) saturate(1.1);\"\n    \u003e\n\u003c/video\u003e\n```\n\n\u003cvideo src=\"https://dropper.waylonwalker.com/file/1c53dbcb-4b84-4e94-9f04-a42986ab3fa1.mp4?width=800\" controls style=\"filter: invert(1) hue-rotate(0deg) contrast(1.2) saturate(1.1);\" \u003e\u003c/video\u003e\n\n\u003e 0 deg hue rotate\n\n\u003cvideo src=\"https://dropper.waylonwalker.com/file/1c53dbcb-4b84-4e94-9f04-a42986ab3fa1.mp4?width=800\" controls style=\"filter: invert(1) hue-rotate(90deg) contrast(1.2) saturate(1.1);\" \u003e\u003c/video\u003e\n\n\u003e 90 deg hue rotate\n\n\u003cvideo src=\"https://dropper.waylonwalker.com/file/1c53dbcb-4b84-4e94-9f04-a42986ab3fa1.mp4?width=800\" controls style=\"filter: invert(1) hue-rotate(180deg) contrast(1.2) saturate(1.1);\" \u003e\u003c/video\u003e\n\n\u003e 180 deg hue rotate\n\n\u003cvideo src=\"https://dropper.waylonwalker.com/file/1c53dbcb-4b84-4e94-9f04-a42986ab3fa1.mp4?width=800\" controls style=\"filter: invert(1) hue-rotate(270deg) contrast(1.2) saturate(1.1);\" \u003e\u003c/video\u003e\n\n\u003e 270 deg hue rotate\n\n",
      "summary": "Yesterday I wrote about a way to do light-mode-screen-recording to convert to light mode from dark mode with ffmpeg. I was wondering if it could be done...",
      "date_published": "2026-01-02T10:29:10Z",
      "date_modified": "2026-01-02T10:29:10Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "dev",
        "webdev"
      ]
    },
    {
      "id": "https://waylonwalker.com/light-mode-screen-recording/",
      "url": "https://waylonwalker.com/light-mode-screen-recording/",
      "title": "light mode screen recording",
      "content_html": "\u003cp\u003eI saw this tip from\n\u003ca href=\"https://cassidoo.co/post/ffmpeg-dark-light/\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/cassidoo.co.png\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/cassidoo.co.png\" class=\"has-avatar  has-avatar-before\"\u003eCassidoo\u003c/a\u003e\nand had to try it out for myself.  I kicked on a\nscreen recording right from where my terminal\nwas, converted it, and it actually looks pretty\ngood.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003effmpeg \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   -i screenrecording-2026-01-01_10-10-49.mp4 \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   -vf \u003cspan class=\"s2\"\u003e\u0026#34;negate,hue=h=180,eq=contrast=1.2:saturation=1.1\u0026#34;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   screenrecording-2026-01-01_10-10-49-light.mp4\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/file/1c53dbcb-4b84-4e94-9f04-a42986ab3fa1.mp4\" class=\"glightbox-link\" aria-label=\"Open image\"\u003e\u003cvideo autoplay loop muted playsinline controls preload=\"metadata\" class=\"md-video\" poster=\"https://dropper.waylonwalker.com/file/1c53dbcb-4b84-4e94-9f04-a42986ab3fa1.webp?h=675\u0026w=1200\"\u003e\u003csource src=\"https://dropper.waylonwalker.com/file/1c53dbcb-4b84-4e94-9f04-a42986ab3fa1.mp4\" type=\"video/mp4\"\u003eYour browser does not support the video tag.\u003c/video\u003e\u003c/a\u003e\n\u003cfigcaption\u003e\u003cp\u003eDark Mode\u003c/p\u003e\u003c/figcaption\u003e\u003c/figure\u003e\n\u003cfigure\u003e\n\u003ca href=\"https://dropper.waylonwalker.com/file/de4e3378-6df2-45b1-84d5-0cc773ceb3c5.mp4\" class=\"glightbox-link\" aria-label=\"Open image\"\u003e\u003cvideo autoplay loop muted playsinline controls preload=\"metadata\" class=\"md-video\" poster=\"https://dropper.waylonwalker.com/file/de4e3378-6df2-45b1-84d5-0cc773ceb3c5.webp?h=675\u0026w=1200\"\u003e\u003csource src=\"https://dropper.waylonwalker.com/file/de4e3378-6df2-45b1-84d5-0cc773ceb3c5.mp4\" type=\"video/mp4\"\u003eYour browser does not support the video tag.\u003c/video\u003e\u003c/a\u003e\n\u003cfigcaption\u003e\u003cp\u003eLight Mode\u003c/p\u003e\u003c/figcaption\u003e\u003c/figure\u003e\n\u003cp\u003eThere are a few unsettling things about it, but\noverall I feel like it was a success.\u003c/p\u003e\n",
      "content_text": "\n\n\nI saw this tip from\n[Cassidoo](https://cassidoo.co/post/ffmpeg-dark-light/)\nand had to try it out for myself.  I kicked on a\nscreen recording right from where my terminal\nwas, converted it, and it actually looks pretty\ngood.\n\n\n``` bash\nffmpeg \\\n   -i screenrecording-2026-01-01_10-10-49.mp4 \\\n   -vf \"negate,hue=h=180,eq=contrast=1.2:saturation=1.1\" \\\n   screenrecording-2026-01-01_10-10-49-light.mp4\n```\n\n![](https://dropper.waylonwalker.com/file/1c53dbcb-4b84-4e94-9f04-a42986ab3fa1.mp4)\n\n\u003e Dark Mode\n\n![](https://dropper.waylonwalker.com/file/de4e3378-6df2-45b1-84d5-0cc773ceb3c5.mp4)\n\n\u003e Light Mode\n\nThere are a few unsettling things about it, but\noverall I feel like it was a success.\n\n",
      "summary": "I saw this tip from Cassidoo and had to try it out for myself. I kicked on a screen recording right from where my terminal was, converted it, and it actually...",
      "date_published": "2026-01-01T10:14:17Z",
      "date_modified": "2026-01-01T10:14:17Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "dev",
        "ffmpeg"
      ]
    },
    {
      "id": "https://waylonwalker.com/youtube-gemini-is-actually-useful/",
      "url": "https://waylonwalker.com/youtube-gemini-is-actually-useful/",
      "title": "YouTube Gemini is Actually Useful",
      "content_html": "\u003cp\u003eI’ve found Gemini to be very useful lately, especially for finding information\nwithin long form content.\u003c/p\u003e\n\u003cp\u003eWhen writing \u003ca href=\"https://thoughts.waylonwalker.com/post/896\" style=\"--favicon-url: url(\u0026#39;/assets/markata/link-avatars/thoughts.waylonwalker.com.ico\u0026#39;);\" data-favicon=\"/assets/markata/link-avatars/thoughts.waylonwalker.com.ico\" class=\"has-avatar  has-avatar-before\"\u003ethought-896\u003c/a\u003e, I\nwanted to use a direct quote from Jeff Dickey, Gemini popped it out very\nquickly.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egive me a quote from jeff just before the timestamp I\u0026#39;m at the interviewer\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003easked what makes a good cli and he started talking about stdout/stderr\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eIn another case, my wife and I are huge Good Eats fans.  Alton Brown taught us\nhow to cook during college and on.  We watched every single good eats episode\nnearly 10 years after they aired.  He is back with some updates to those those\nshows on his Youtube.  Gemini gives very good detailed responses with\ntimestamps.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAlton Brown had a recent YouTube video for cooking turkey. Can you get the\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003einstructions from the video?\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nI've found Gemini to be very useful lately, especially for finding information\nwithin long form content.\n\nWhen writing [thought-896](https://thoughts.waylonwalker.com/post/896), I\nwanted to use a direct quote from Jeff Dickey, Gemini popped it out very\nquickly.\n\n``` md\ngive me a quote from jeff just before the timestamp I'm at the interviewer\nasked what makes a good cli and he started talking about stdout/stderr\n```\n\nIn another case, my wife and I are huge Good Eats fans.  Alton Brown taught us\nhow to cook during college and on.  We watched every single good eats episode\nnearly 10 years after they aired.  He is back with some updates to those those\nshows on his Youtube.  Gemini gives very good detailed responses with\ntimestamps.\n\n``` md\nAlton Brown had a recent YouTube video for cooking turkey. Can you get the\ninstructions from the video?\n```\n\n",
      "summary": "I've found Gemini to be very useful lately, especially for finding information within long form content.",
      "date_published": "2025-12-22T10:09:55Z",
      "date_modified": "2025-12-22T10:09:55Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "ai"
      ]
    },
    {
      "id": "https://waylonwalker.com/numbered-posts-in-obsidian/",
      "url": "https://waylonwalker.com/numbered-posts-in-obsidian/",
      "title": "numbered posts in obsidian",
      "content_html": "\u003cp\u003eI’ve been using this one for awhile now, I have a post type that I only edit\nfrom my phone, but I have all the post numbered.  I set up a template in\nobsidian for using templater, the template goes right in the static site repo,\nI point templater to the templates directory and this has been working pretty\nseamlessly for awhile.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e---\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edate: \u0026lt;% tp.date.now(\u0026#34;YYYY-MM-DD HH:mm:ss\u0026#34;) %\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etemplateKey: myposttype\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epublished: true\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etags:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e myposttype\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;%*\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003econst folder = \u0026#34;pages/myposttype\u0026#34;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e// get all files in the vault, keep only those inside the folder\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003econst files = app.vault.getFiles().filter(f =\u0026gt; f.path.startsWith(folder + \u0026#34;/\u0026#34;));\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e// extract numeric suffixes from filenames like myposttype-123.md\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003econst nums = files.map(f =\u0026gt; {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  const m = f.basename.match(/^myposttype-(\\d+)$/);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  return m ? parseInt(m[1], 10) : null;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}).filter(n =\u0026gt; n !== null);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e// next number (start at 1 if none exist)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003econst next = (nums.length ? Math.max(...nums) : 0) + 1;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e// include the .md extension when moving\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003econst newPath = \u003cspan class=\"sb\"\u003e`${folder}/myposttype-${next}`\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eawait tp.file.move(newPath);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e%\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e---\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nI've been using this one for awhile now, I have a post type that I only edit\nfrom my phone, but I have all the post numbered.  I set up a template in\nobsidian for using templater, the template goes right in the static site repo,\nI point templater to the templates directory and this has been working pretty\nseamlessly for awhile.\n\n``` md\n---\ndate: \u003c% tp.date.now(\"YYYY-MM-DD HH:mm:ss\") %\u003e\ntemplateKey: myposttype\npublished: true\ntags:\n- myposttype\n\u003c%*\nconst folder = \"pages/myposttype\";\n\n// get all files in the vault, keep only those inside the folder\nconst files = app.vault.getFiles().filter(f =\u003e f.path.startsWith(folder + \"/\"));\n\n// extract numeric suffixes from filenames like myposttype-123.md\nconst nums = files.map(f =\u003e {\n  const m = f.basename.match(/^myposttype-(\\d+)$/);\n  return m ? parseInt(m[1], 10) : null;\n}).filter(n =\u003e n !== null);\n\n// next number (start at 1 if none exist)\nconst next = (nums.length ? Math.max(...nums) : 0) + 1;\n\n// include the .md extension when moving\nconst newPath = `${folder}/myposttype-${next}`;\nawait tp.file.move(newPath);\n%\u003e\n---\n```\n",
      "summary": "I've been using this one for awhile now, I have a post type that I only edit from my phone, but I have all the post numbered. I set up a template in obsidian...",
      "date_published": "2025-12-13T22:28:28Z",
      "date_modified": "2025-12-13T22:28:28Z",
      "authors": [
        {
          "name": "Waylon Walker",
          "url": "https://waylonwalker.com",
          "avatar": "/8bitcc.png"
        }
      ],
      "tags": [
        "dev",
        "markdown",
        "obsidian"
      ]
    }
  ]
}