{
  "version": "https://jsonfeed.org/version/1.1",
  "title": "Archive",
  "home_page_url": "https://pype.dev/",
  "feed_url": "https://pype.dev/archive/feed.json",
  "description": "All posts",
  "authors": [
    {
      "name": "Nic Payne"
    }
  ],
  "items": [
    {
      "id": "https://pype.dev/harbor-faulted-disk-replacement/",
      "url": "https://pype.dev/harbor-faulted-disk-replacement/",
      "title": "The Faulted Disk: harbor Replacement Writeup",
      "content_html": "\u003cp\u003eThe sequel to \u003ca href=\"/panicking-led-to-losing-my-desktop\"\u003epanicking-led-to-losing-my-desktop\u003c/a\u003e — this time the monitoring actually caught the disk dying, and nothing was lost.\u003c/p\u003e\n\u003ch2 id=\"what-happened\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhat happened\u003c/span\u003e \u003ca href=\"#what-happened\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003eharbor\u003c/code\u003e is my replica pool — a 10.9T mirror (2x 12TB) that receives syncoid snapshots from \u003ccode\u003etank\u003c/code\u003e. One side of the mirror, a Seagate Exos \u003ccode\u003eST12000NM0127\u003c/code\u003e (serial \u003ccode\u003eZJV4QFLB\u003c/code\u003e, \u003ccode\u003e/dev/sdb\u003c/code\u003e), went \u003cstrong\u003eFAULTED\u003c/strong\u003e with 14 read + 22 checksum errors.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emirror-0                              DEGRADED     0     0     0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  ata-ST12000VN0008-2PH103_ZTM0NFDW  ONLINE       0     0     0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  ata-ST12000NM0127_ZJV4QFLB         FAULTED     14     0    22  too many errors\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe IronWolf mirror side carried the pool — \u003ccode\u003eNo known data errors\u003c/code\u003e. ZFS redundancy did exactly its job.\u003c/p\u003e\n\u003ch2 id=\"the-difference-from-last-time\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThe difference from last time\u003c/span\u003e \u003ca href=\"#the-difference-from-last-time\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eLast failure: no monitoring, found out by accident months later, desktop died.\u003c/p\u003e\n\u003cp\u003eThis failure: SigNoz + node-exporter\u0026rsquo;s ZFS collector → \u003ccode\u003enode_zfs_zpool_state{state=\u0026quot;degraded\u0026quot;}\u003c/code\u003e → alert rule → Gotify → my phone. The gotify notification fired \u003cem\u003ebefore\u003c/em\u003e I knew anything was wrong.\u003c/p\u003e\n\u003ch2 id=\"diagnosis\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDiagnosis\u003c/span\u003e \u003ca href=\"#diagnosis\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eBefore \u003ccode\u003ezpool clear\u003c/code\u003e or replace — check SMART. \u003ccode\u003esmartctl-exporter\u003c/code\u003e already scrapes all disks into SigNoz, so I didn\u0026rsquo;t even need sudo:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eReallocated_Sector_Ct\u003c/code\u003e raw = \u003cstrong\u003e3024\u003c/strong\u003e and counting\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eOffline_Uncorrectable\u003c/code\u003e value/worst still 100 but raw errors climbing\u003c/li\u003e\n\u003cli\u003eSMART overall: still PASS (SMART\u0026rsquo;s overall bit is conservative until threshold)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e3k+ remapped sectors is a platter going bad — not a cable blip. Verdict: replace, don\u0026rsquo;t clear.\u003c/p\u003e\n\u003ch2 id=\"the-swap-the-annoying-part\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThe swap (the annoying part)\u003c/span\u003e \u003ca href=\"#the-swap-the-annoying-part\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eHot-plug is never as smooth as it should be:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003ccode\u003ezpool offline harbor \u0026lt;old\u0026gt;\u003c/code\u003e to stop writes to the dead drive — actually skipped; drive fell off the bus on its own\u003c/li\u003e\n\u003cli\u003eNew IronWolf \u003ccode\u003eZTN1CQ07\u003c/code\u003e in hand → plugged into ghost\u0026rsquo;s SATA → \u003cstrong\u003edidn\u0026rsquo;t enumerate\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eForced rescan (\u003ccode\u003eecho \u0026quot;- - -\u0026quot; | sudo tee /sys/class/scsi_host/host*/scan\u003c/code\u003e) → nothing\u003c/li\u003e\n\u003cli\u003eMoved it to the \u003cem\u003eold drive\u0026rsquo;s port\u003c/em\u003e → nothing\u003c/li\u003e\n\u003cli\u003eSabrent USB dock on aurora → dock enumerated as \u003ccode\u003e0B\u003c/code\u003e device, no disk behind it → reseated + replugged → \u003cstrong\u003edrive spun up and appeared\u003c/strong\u003e: \u003ccode\u003e/dev/sdd\u003c/code\u003e, 10.9T, old ZFS partition table on it (used drive — \u003ccode\u003epart1\u003c/code\u003e/\u003ccode\u003epart9\u003c/code\u003e layout)\u003c/li\u003e\n\u003cli\u003eBack to ghost, direct SATA → enumerated as \u003ccode\u003esdb\u003c/code\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eLesson: \u0026ldquo;spins up but doesn\u0026rsquo;t enumerate\u0026rdquo; on direct SATA + dock-shows-0B = seating/power problem, not DOA. The drive was fine all along.\u003c/p\u003e\n\u003ch2 id=\"the-replace\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThe replace\u003c/span\u003e \u003ca href=\"#the-replace\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo zpool replace harbor \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  ata-ST12000NM0127_ZJV4QFLB \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  ata-ST12000VN0008-2PH103_ZTN1CQ07\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eResilver: \u003cstrong\u003e8.80T in 18h38m, 0 errors\u003c/strong\u003e (~154M/s). Pool stayed online and usable the whole time.\u003c/p\u003e\n\u003cp\u003eOne gotcha: after resilver, \u003ccode\u003ezpool status\u003c/code\u003e showed \u003ccode\u003eerrors: 1 data errors\u003c/code\u003e — but \u003ccode\u003ezpool status -v\u003c/code\u003e showed an \u003cstrong\u003eempty error list\u003c/strong\u003e. The corrupted data was already repaired; the counter was just stale. \u003ccode\u003esudo zpool clear harbor\u003c/code\u003e → clean.\u003c/p\u003e\n\u003ch2 id=\"the-monitoring-that-made-this-possible\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThe monitoring that made this possible\u003c/span\u003e \u003ca href=\"#the-monitoring-that-made-this-possible\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWired during this session (all now in SigNoz):\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003enode_zfs_zpool_state\u003c/code\u003e — pool health (node-exporter zfs collector)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003esmartctl-exporter\u003c/code\u003e — SMART attributes incl. reallocated sectors (the early-death signal)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ezfs-metrics.sh\u003c/code\u003e textfile bridge — sanoid \u003ccode\u003e--monitor-*\u003c/code\u003e exit codes, zpool error counters, scrub ages, resilver %, syncoid last-success\u003c/li\u003e\n\u003cli\u003eAlert rules → Gotify → phone\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe replication alerting even proved itself live: syncoid failed twice during the resilver window and I got paged on both. Turned out to be send-time contention — self-healed once resilver finished — but the notification path works end to end.\u003c/p\u003e\n\u003ch2 id=\"remaining-homework\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRemaining homework\u003c/span\u003e \u003ca href=\"#remaining-homework\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eBuy the replacement spare (the shelf\u0026rsquo;s empty now)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e10Fold\u003c/code\u003e datasets are garbage + have zero snapshots — destroy\u003c/li\u003e\n\u003cli\u003eEvery scheduled job emits \u003ccode\u003ecron_last_success_epoch\u003c/code\u003e now — if a job dies silently again, I\u0026rsquo;ll know\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eSame failure as April, opposite outcome. Redundancy did the protection; monitoring did the \u003cem\u003edetection\u003c/em\u003e. You need both.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cem\u003eCo-authored with Devin, who ran the monitoring stack, the SMART diagnosis, and the alerting loop.\u003c/em\u003e\u003c/p\u003e\n",
      "content_text": "\nThe sequel to [panicking-led-to-losing-my-desktop](/panicking-led-to-losing-my-desktop) — this time the monitoring actually caught the disk dying, and nothing was lost.\n\n## What happened\n\n`harbor` is my replica pool — a 10.9T mirror (2x 12TB) that receives syncoid snapshots from `tank`. One side of the mirror, a Seagate Exos `ST12000NM0127` (serial `ZJV4QFLB`, `/dev/sdb`), went **FAULTED** with 14 read + 22 checksum errors.\n\n``` text\nmirror-0                              DEGRADED     0     0     0\n  ata-ST12000VN0008-2PH103_ZTM0NFDW  ONLINE       0     0     0\n  ata-ST12000NM0127_ZJV4QFLB         FAULTED     14     0    22  too many errors\n```\n\nThe IronWolf mirror side carried the pool — `No known data errors`. ZFS redundancy did exactly its job.\n\n## The difference from last time\n\nLast failure: no monitoring, found out by accident months later, desktop died.\n\nThis failure: SigNoz + node-exporter's ZFS collector → `node_zfs_zpool_state{state=\"degraded\"}` → alert rule → Gotify → my phone. The gotify notification fired *before* I knew anything was wrong.\n\n## Diagnosis\n\nBefore `zpool clear` or replace — check SMART. `smartctl-exporter` already scrapes all disks into SigNoz, so I didn't even need sudo:\n\n- `Reallocated_Sector_Ct` raw = **3024** and counting\n- `Offline_Uncorrectable` value/worst still 100 but raw errors climbing\n- SMART overall: still PASS (SMART's overall bit is conservative until threshold)\n\n3k+ remapped sectors is a platter going bad — not a cable blip. Verdict: replace, don't clear.\n\n## The swap (the annoying part)\n\nHot-plug is never as smooth as it should be:\n\n1. `zpool offline harbor \u003cold\u003e` to stop writes to the dead drive — actually skipped; drive fell off the bus on its own\n2. New IronWolf `ZTN1CQ07` in hand → plugged into ghost's SATA → **didn't enumerate**\n3. Forced rescan (`echo \"- - -\" | sudo tee /sys/class/scsi_host/host*/scan`) → nothing\n4. Moved it to the *old drive's port* → nothing\n5. Sabrent USB dock on aurora → dock enumerated as `0B` device, no disk behind it → reseated + replugged → **drive spun up and appeared**: `/dev/sdd`, 10.9T, old ZFS partition table on it (used drive — `part1`/`part9` layout)\n6. Back to ghost, direct SATA → enumerated as `sdb`\n\nLesson: \"spins up but doesn't enumerate\" on direct SATA + dock-shows-0B = seating/power problem, not DOA. The drive was fine all along.\n\n## The replace\n\n``` bash\nsudo zpool replace harbor \\\n  ata-ST12000NM0127_ZJV4QFLB \\\n  ata-ST12000VN0008-2PH103_ZTN1CQ07\n```\n\nResilver: **8.80T in 18h38m, 0 errors** (~154M/s). Pool stayed online and usable the whole time.\n\nOne gotcha: after resilver, `zpool status` showed `errors: 1 data errors` — but `zpool status -v` showed an **empty error list**. The corrupted data was already repaired; the counter was just stale. `sudo zpool clear harbor` → clean.\n\n## The monitoring that made this possible\n\nWired during this session (all now in SigNoz):\n\n- `node_zfs_zpool_state` — pool health (node-exporter zfs collector)\n- `smartctl-exporter` — SMART attributes incl. reallocated sectors (the early-death signal)\n- `zfs-metrics.sh` textfile bridge — sanoid `--monitor-*` exit codes, zpool error counters, scrub ages, resilver %, syncoid last-success\n- Alert rules → Gotify → phone\n\nThe replication alerting even proved itself live: syncoid failed twice during the resilver window and I got paged on both. Turned out to be send-time contention — self-healed once resilver finished — but the notification path works end to end.\n\n## Remaining homework\n\n- Buy the replacement spare (the shelf's empty now)\n- `10Fold` datasets are garbage + have zero snapshots — destroy\n- Every scheduled job emits `cron_last_success_epoch` now — if a job dies silently again, I'll know\n\nSame failure as April, opposite outcome. Redundancy did the protection; monitoring did the *detection*. You need both.\n\n---\n\n*Co-authored with Devin, who ran the monitoring stack, the SMART diagnosis, and the alerting loop.*\n",
      "summary": "The sequel to panicking-led-to-losing-my-desktop — this time the monitoring actually caught the disk dying, and nothing was lost.",
      "date_published": "2026-10-06T21:30:00Z",
      "date_modified": "2026-10-06T21:30:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "zfs",
        "tech",
        "backup"
      ]
    },
    {
      "id": "https://pype.dev/fwbg-genesis-4-3/",
      "url": "https://pype.dev/fwbg-genesis-4-3/",
      "title": "FWBG - Genesis - 4.3",
      "content_html": "\u003cp\u003ebeware the growth of sin\u0026hellip; harboring it leads to worse consequences for us and others. Cain\u0026rsquo;s initial sin is left ambiguous but his response to his sin being called out by the Lord shows the trajectory of his life\u003c/p\u003e\n",
      "content_text": "\nbeware the growth of sin... harboring it leads to worse consequences for us and others. Cain's initial sin is left ambiguous but his response to his sin being called out by the Lord shows the trajectory of his life\n",
      "summary": "beware the growth of sin... harboring it leads to worse consequences for us and others. Cain's initial sin is left ambiguous but his response to his sin...",
      "date_published": "2026-09-30T06:55:25Z",
      "date_modified": "2026-09-30T06:55:25Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "sin",
        "faith",
        "family-worship-bible-guide"
      ]
    },
    {
      "id": "https://pype.dev/fwbg-genesis-4-2/",
      "url": "https://pype.dev/fwbg-genesis-4-2/",
      "title": "FWBG - Genesis - 4.2",
      "content_html": "\u003cp\u003eMarvel at God\u0026rsquo;s patience. Cain could\u0026rsquo;ve heeded the Lord\u0026rsquo;s warnings, it would\u0026rsquo;ve been right.\u003c/p\u003e\n",
      "content_text": "\nMarvel at God's patience. Cain could've heeded the Lord's warnings, it would've been right.\n",
      "summary": "Marvel at God's patience. Cain could've heeded the Lord's warnings, it would've been right.",
      "date_published": "2026-09-28T06:35:28Z",
      "date_modified": "2026-09-28T06:35:28Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "faith",
        "family-worship-bible-guide"
      ]
    },
    {
      "id": "https://pype.dev/olivet-mens-group-2026-week-36/",
      "url": "https://pype.dev/olivet-mens-group-2026-week-36/",
      "title": "Men’s Group - Week 36",
      "content_html": "\u003ch1 id=\"week-36-september-20-26-2026\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWeek 36 — September 20 – 26, 2026\u003c/span\u003e\u003c/h1\u003e\n\u003ch3 id=\"meeting-friday-september-25-october-5\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMeeting: Friday, \u003c/span\u003e\u003cdel\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSeptember 25\u003c/span\u003e\u003c/del\u003e\u003cspan class=\"heading-wear-glyph\"\u003e October 5\u003c/span\u003e \u003ca href=\"#meeting-friday-september-25-october-5\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch3 id=\"memory-verse-psalm-119-9-11\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMemory Verse: Psalm 119:9, 11\u003c/span\u003e \u003ca href=\"#memory-verse-psalm-119-9-11\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003ePsalm 119:9, 11\u003c/p\u003e\n\u003col start=\"9\"\u003e\n\u003cli\u003e\n\u003cp\u003eHow can a young man keep his way pure?\nBy guarding it with Your word.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI have hidden Your word in my heart,\nthat I might not sin against You.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/div\u003e\n\u003ch2 id=\"readings\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eReadings\u003c/span\u003e \u003ca href=\"#readings\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e Day 1: Matthew 24:32-51 \u0026amp; John 17\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e Day 2: Matthew 26:35-27:31\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e Day 3: Matthew 27:32-66\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e Day 4: Luke 23:26-56\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e Day 5: John 19\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"day-1-matthew-24-32-51-john-17\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDay 1 — Matthew 24:32-51 \u0026amp; John 17\u003c/span\u003e \u003ca href=\"#day-1-matthew-24-32-51-john-17\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cdetails class=\"admonition quote\"\u003e\n\u003csummary class=\"admonition-title\"\u003eMatthew 24:32-51\u003c/summary\u003e\n\u003col start=\"32\"\u003e\n\u003cli\u003eNow learn this lesson from the fig tree: As soon as its branches become tender and sprout leaves, you know that summer is near.\u003c/li\u003e\n\u003cli\u003eSo also, when you see all these things, you will know that He is near, right at the door.\u003c/li\u003e\n\u003cli\u003eTruly I tell you, this generation will not pass away until all these things have happened.\u003c/li\u003e\n\u003cli\u003eHeaven and earth will pass away, but My words will never pass away.\u003c/li\u003e\n\u003cli\u003eBut about that day and hour no one knows, not even the angels in heaven, nor the Son, but only the Father.\u003c/li\u003e\n\u003cli\u003eAs it was in the days of Noah, so will it be at the coming of the Son of Man.\u003c/li\u003e\n\u003cli\u003eFor in the days before the flood, people were eating and drinking, marrying and giving in marriage, up to the day Noah entered the ark.\u003c/li\u003e\n\u003cli\u003eAnd they were oblivious, until the flood came and swept them all away. So will it be at the coming of the Son of Man.\u003c/li\u003e\n\u003cli\u003eTwo men will be in the field: one will be taken and the other left.\u003c/li\u003e\n\u003cli\u003eTwo women will be grinding at the mill: one will be taken and the other left.\u003c/li\u003e\n\u003cli\u003eTherefore keep watch, because you do not know the day on which your Lord will come.\u003c/li\u003e\n\u003cli\u003eBut understand this: If the homeowner had known in which watch of the night the thief was coming, he would have kept watch and would not have let his house be broken into.\u003c/li\u003e\n\u003cli\u003eFor this reason, you also must be ready, because the Son of Man will come at an hour you do not expect.\u003c/li\u003e\n\u003cli\u003eWho then is the faithful and wise servant, whom the master has put in charge of his household, to give the others their food at the proper time?\u003c/li\u003e\n\u003cli\u003eBlessed is that servant whose master finds him doing so when he returns.\u003c/li\u003e\n\u003cli\u003eTruly I tell you, he will put him in charge of all his possessions.\u003c/li\u003e\n\u003cli\u003eBut suppose that servant is wicked and says in his heart, \u0026lsquo;My master will be away a long time.\u0026rsquo;\u003c/li\u003e\n\u003cli\u003eAnd he begins to beat his fellow servants and to eat and drink with drunkards.\u003c/li\u003e\n\u003cli\u003eThe master of that servant will come on a day he does not expect and at an hour he does not anticipate.\u003c/li\u003e\n\u003cli\u003eThen he will cut him to pieces and assign him a place with the hypocrites, where there will be weeping and gnashing of teeth.\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/details\u003e\n\u003cdetails class=\"admonition quote\"\u003e\n\u003csummary class=\"admonition-title\"\u003eJohn 17\u003c/summary\u003e\n\u003col\u003e\n\u003cli\u003eAfter Jesus had spoken these words, He looked up to heaven and said, “Father, the hour has come. Glorify Your Son, that Your Son may glorify You.\u003c/li\u003e\n\u003cli\u003eFor You granted Him authority over all people, so that He may give eternal life to all those You have given Him.\u003c/li\u003e\n\u003cli\u003eNow this is eternal life, that they may know You, the only true God, and Jesus Christ, whom You have sent.\u003c/li\u003e\n\u003cli\u003eI have glorified You on earth by accomplishing the work You gave Me to do.\u003c/li\u003e\n\u003cli\u003eAnd now, Father, glorify Me in Your presence with the glory I had with You before the world existed.\u003c/li\u003e\n\u003cli\u003eI have revealed Your name to those whom You have given Me out of the world. They were Yours; You gave them to Me, and they have kept Your word.\u003c/li\u003e\n\u003cli\u003eNow they know that everything You have given Me comes from You.\u003c/li\u003e\n\u003cli\u003eFor I have given them the words You gave Me, and they have received them. They knew with certainty that I came from You, and they believed that You sent Me.\u003c/li\u003e\n\u003cli\u003eI ask on their behalf. I do not ask on behalf of the world, but on behalf of those You have given Me; for they are Yours.\u003c/li\u003e\n\u003cli\u003eAll I have is Yours, and all You have is Mine; and in them I have been glorified.\u003c/li\u003e\n\u003cli\u003eI will no longer be in the world, but they are in the world, and I am coming to You. Holy Father, protect them by Your name, the name You gave Me, so that they may be one as We are one.\u003c/li\u003e\n\u003cli\u003eWhile I was with them, I protected them and kept them safe by that name You gave Me. Not one of them has been lost, except the son of destruction, so that the Scripture would be fulfilled.\u003c/li\u003e\n\u003cli\u003eBut now I am coming to You, and I am saying these things while I am in the world, so that they may have My joy fulfilled within them.\u003c/li\u003e\n\u003cli\u003eI have given them Your word and the world has hated them, for they are not of the world any more than I am of the world.\u003c/li\u003e\n\u003cli\u003eI do not ask that You take them out of the world, but that You keep them from the evil one.\u003c/li\u003e\n\u003cli\u003eThey are not of the world, just as I am not of the world.\u003c/li\u003e\n\u003cli\u003eSanctify them by the truth; Your word is truth.\u003c/li\u003e\n\u003cli\u003eAs You sent Me into the world, I have also sent them into the world.\u003c/li\u003e\n\u003cli\u003eFor them I sanctify Myself, so that they too may be sanctified by the truth.\u003c/li\u003e\n\u003cli\u003eI am not asking on behalf of them alone, but also on behalf of those who will believe in Me through their message,\u003c/li\u003e\n\u003cli\u003ethat all of them may be one, as You, Father, are in Me, and I am in You. May they also be in Us, so that the world may believe that You sent Me.\u003c/li\u003e\n\u003cli\u003eI have given them the glory You gave Me, so that they may be one as We are one—\u003c/li\u003e\n\u003cli\u003eI in them and You in Me—that they may be perfectly united, so that the world may know that You sent Me and have loved them just as You have loved Me.\u003c/li\u003e\n\u003cli\u003eFather, I want those You have given Me to be with Me where I am, that they may see My glory, the glory You have given Me because You loved Me before the foundation of the world.\u003c/li\u003e\n\u003cli\u003eRighteous Father, although the world has not known You, I know You, and they know that You sent Me.\u003c/li\u003e\n\u003cli\u003eAnd I have made Your name known to them and will continue to make it known, so that the love You have for Me may be in them, and I in them.”\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/details\u003e\n\u003ch3 id=\"stands-out\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStands out\u003c/span\u003e \u003ca href=\"#stands-out\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre\u003e\u003ccode\u003e36. But about that day and hour no one knows, not even the angels in heaven, nor the Son, but only the Father.\n37. As it was in the days of Noah, so will it be at the coming of the Son of Man.\n38. For in the days before the flood, people were eating and drinking, marrying and giving in marriage, up to the day Noah entered the ark.\n39. And they were oblivious, until the flood came and swept them all away. So will it be at the coming of the Son of Man.\n\n---\n\n44. For this reason, you also must be ready, because the Son of Man will come at an hour you do not expect.\n45. Who then is the faithful and wise servant, whom the master has put in charge of his household, to give the others their food at the proper time?\n46. Blessed is that servant whose master finds him doing so when he returns.\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3 id=\"means\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMeans\u003c/span\u003e \u003ca href=\"#means\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eevery day, daily disciplined life, is what it looks like to wait upon the Lord. Not wishing I took advantage of a moment of debauchery, because the prize isn\u0026rsquo;t the discipline, it isn\u0026rsquo;t NOT doing the debauchery, the prize IS the King, and he can come and call at any moment\u003c/p\u003e\n\u003ch3 id=\"for-me\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFor me\u003c/span\u003e \u003ca href=\"#for-me\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003edovetails with \u0026ldquo;work\u0026rdquo; from men\u0026rsquo;s group - work and jobs are different, and we are called to work, I should be working all the time:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ekids\u003c/li\u003e\n\u003cli\u003ehouse\u003c/li\u003e\n\u003cli\u003ewife\u003c/li\u003e\n\u003cli\u003eself-discipline\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eI need to recover holy work in my life\u003c/p\u003e\n\u003ch3 id=\"prayer\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePrayer\u003c/span\u003e \u003ca href=\"#prayer\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch2 id=\"day-2-matthew-26-35-27-31\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDay 2 — Matthew 26:35-27:31\u003c/span\u003e \u003ca href=\"#day-2-matthew-26-35-27-31\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cdetails class=\"admonition quote\"\u003e\n\u003csummary class=\"admonition-title\"\u003eMatthew 26:35-27:31\u003c/summary\u003e\n\u003col start=\"35\"\u003e\n\u003cli\u003ePeter replied, “Even if I have to die with You, I will never deny You.” And all the other disciples said the same thing.\u003c/li\u003e\n\u003cli\u003eThen Jesus went with His disciples to a place called Gethsemane, and He told them, “Sit here while I go over there and pray.”\u003c/li\u003e\n\u003cli\u003eHe took with Him Peter and the two sons of Zebedee and began to be sorrowful and deeply distressed.\u003c/li\u003e\n\u003cli\u003eThen He said to them, “My soul is consumed with sorrow to the point of death. Stay here and keep watch with Me.”\u003c/li\u003e\n\u003cli\u003eGoing a little farther, He fell face down and prayed, “My Father, if it is possible, let this cup pass from Me. Yet not as I will, but as You will.”\u003c/li\u003e\n\u003cli\u003eThen Jesus returned to the disciples and found them sleeping. “Were you not able to keep watch with Me for one hour?” He asked Peter.\u003c/li\u003e\n\u003cli\u003e“Watch and pray so that you will not enter into temptation. For the spirit is willing, but the body is weak.”\u003c/li\u003e\n\u003cli\u003eA second time He went away and prayed, “My Father, if this cup cannot pass unless I drink it, may Your will be done.”\u003c/li\u003e\n\u003cli\u003eAnd again Jesus returned and found them sleeping—for their eyes were heavy.\u003c/li\u003e\n\u003cli\u003eSo He left them and went away once more and prayed a third time, saying the same thing.\u003c/li\u003e\n\u003cli\u003eThen He returned to the disciples and said, “Are you still sleeping and resting? Look, the hour is near, and the Son of Man is betrayed into the hands of sinners.\u003c/li\u003e\n\u003cli\u003eGet up! Let us go. See, My betrayer is approaching.”\u003c/li\u003e\n\u003cli\u003eWhile Jesus was still speaking, Judas, one of the Twelve, arrived, accompanied by a large crowd armed with swords and clubs, sent from the chief priests and elders of the people.\u003c/li\u003e\n\u003cli\u003eNow the betrayer had arranged a signal with them: “The One I kiss is the Man; arrest Him.”\u003c/li\u003e\n\u003cli\u003eGoing directly to Jesus, he said, “Greetings, Rabbi!” and kissed Him.\u003c/li\u003e\n\u003cli\u003e“Friend,” Jesus replied, “do what you have come for.” Then the men stepped forward, seized Jesus, and arrested Him.\u003c/li\u003e\n\u003cli\u003eAt this, one of Jesus’ companions drew his sword and struck the servant of the high priest, cutting off his ear.\u003c/li\u003e\n\u003cli\u003e“Put your sword back in its place,” Jesus said to him. “For all who draw the sword will die by the sword.\u003c/li\u003e\n\u003cli\u003eAre you not aware that I can call on My Father, and He will at once put at My disposal more than twelve legions of angels?\u003c/li\u003e\n\u003cli\u003eBut how then would the Scriptures be fulfilled that say it must happen this way?”\u003c/li\u003e\n\u003cli\u003eAt that time Jesus said to the crowd, “Have you come out with swords and clubs to arrest Me as you would an outlaw? Every day I sat teaching in the temple courts, and you did not arrest Me.\u003c/li\u003e\n\u003cli\u003eBut this has all happened so that the writings of the prophets would be fulfilled.” Then all the disciples deserted Him and fled.\u003c/li\u003e\n\u003cli\u003eThose who had arrested Jesus led Him away to Caiaphas the high priest, where the scribes and elders had gathered.\u003c/li\u003e\n\u003cli\u003eBut Peter followed Him at a distance, right up to the courtyard of the high priest. And going inside, he sat down with the guards to see the outcome.\u003c/li\u003e\n\u003cli\u003eThe chief priests and the whole Sanhedrin were searching for false testimony against Jesus so they could put Him to death.\u003c/li\u003e\n\u003cli\u003eBut they did not find any, though many false witnesses came forward. Finally two witnesses came forward\u003c/li\u003e\n\u003cli\u003eand declared, “This man said, ‘I am able to destroy the temple of God and rebuild it in three days.’”\u003c/li\u003e\n\u003cli\u003eSo the high priest stood up and asked Him, “Have You no answer? What are these men testifying against You?”\u003c/li\u003e\n\u003cli\u003eBut Jesus remained silent. So the high priest said to Him, “I charge You under oath by the living God: Tell us if You are the Christ, the Son of God.”\u003c/li\u003e\n\u003cli\u003e“You have said it yourself,” Jesus answered. “But I say to all of you, from now on you will see the Son of Man sitting at the right hand of Power and coming on the clouds of heaven.”\u003c/li\u003e\n\u003cli\u003eAt this, the high priest tore his clothes and declared, “He has blasphemed! Why do we need any more witnesses? Look, now you have heard the blasphemy.\u003c/li\u003e\n\u003cli\u003eWhat is your verdict?” “He deserves death,” they answered.\u003c/li\u003e\n\u003cli\u003eThen they spit in His face and struck Him. Others slapped Him\u003c/li\u003e\n\u003cli\u003eand said, “Prophesy to us, Christ! Who hit You?”\u003c/li\u003e\n\u003cli\u003eMeanwhile, Peter was sitting out in the courtyard, and a servant girl came up to him. “You were also with Jesus the Galilean,” she said.\u003c/li\u003e\n\u003cli\u003eBut he denied it before them all: “I do not know what you are talking about.”\u003c/li\u003e\n\u003cli\u003eWhen he had gone out to the gateway, another servant girl saw him and said to the people there, “This man was with Jesus of Nazareth.”\u003c/li\u003e\n\u003cli\u003eAnd again he denied it with an oath: “I do not know the man!”\u003c/li\u003e\n\u003cli\u003eAfter a little while, those standing nearby came up to Peter. “Surely you are one of them,” they said. “For even your accent gives you away.”\u003c/li\u003e\n\u003cli\u003eThen he began to curse and swear, “I do not know the man!” And immediately a rooster crowed.\u003c/li\u003e\n\u003cli\u003eThen Peter remembered the word that Jesus had spoken: “Before the rooster crows, you will deny Me three times.” And he went outside and wept bitterly.\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/details\u003e\n\u003cdetails class=\"admonition quote\"\u003e\n\u003csummary class=\"admonition-title\"\u003eMatthew 27:1-31\u003c/summary\u003e\n\u003col\u003e\n\u003cli\u003eWhen morning came, all the chief priests and elders of the people conspired against Jesus to put Him to death.\u003c/li\u003e\n\u003cli\u003eThey bound Him, led Him away, and handed Him over to Pilate the governor.\u003c/li\u003e\n\u003cli\u003eWhen Judas, who had betrayed Him, saw that Jesus was condemned, he was filled with remorse and returned the thirty pieces of silver to the chief priests and elders.\u003c/li\u003e\n\u003cli\u003e“I have sinned by betraying innocent blood,” he said. “What is that to us?” they replied. “You bear the responsibility.”\u003c/li\u003e\n\u003cli\u003eSo Judas threw the silver into the temple and left. Then he went away and hanged himself.\u003c/li\u003e\n\u003cli\u003eThe chief priests picked up the pieces of silver and said, “It is unlawful to put this into the treasury, since it is blood money.”\u003c/li\u003e\n\u003cli\u003eAfter conferring together, they used the money to buy the potter’s field as a burial place for foreigners.\u003c/li\u003e\n\u003cli\u003eThat is why it has been called the Field of Blood to this day.\u003c/li\u003e\n\u003cli\u003eThen what was spoken through Jeremiah the prophet was fulfilled: “They took the thirty pieces of silver, the price set on Him by the people of Israel,\u003c/li\u003e\n\u003cli\u003eand they gave them for the potter’s field, as the Lord had commanded me.”\u003c/li\u003e\n\u003cli\u003eMeanwhile Jesus stood before the governor, and the governor questioned Him: “Are You the King of the Jews?” “You have said so,” Jesus replied.\u003c/li\u003e\n\u003cli\u003eAnd when He was accused by the chief priests and elders, He gave no answer.\u003c/li\u003e\n\u003cli\u003eThen Pilate asked Him, “Do You not hear how many charges they are bringing against You?”\u003c/li\u003e\n\u003cli\u003eBut Jesus gave no answer, not even to a single charge, much to the governor’s amazement.\u003c/li\u003e\n\u003cli\u003eAt the feast, the governor was accustomed to releasing one prisoner to the crowd, whomever they wanted.\u003c/li\u003e\n\u003cli\u003eAt that time they were holding a notorious prisoner named Barabbas.\u003c/li\u003e\n\u003cli\u003eSo when the crowd had gathered, Pilate asked them, “Whom do you want me to release to you: Barabbas, or Jesus who is called Christ?”\u003c/li\u003e\n\u003cli\u003eFor he knew it was out of envy that they had handed Jesus over to him.\u003c/li\u003e\n\u003cli\u003eWhile Pilate was sitting on the judgment seat, his wife sent him this message: “Have nothing to do with that righteous man, for I have suffered much in a dream today because of Him.”\u003c/li\u003e\n\u003cli\u003eBut the chief priests and elders persuaded the crowds to ask for Barabbas and to have Jesus put to death.\u003c/li\u003e\n\u003cli\u003e“Which of the two do you want me to release to you?” asked the governor. “Barabbas,” they answered.\u003c/li\u003e\n\u003cli\u003e“What then shall I do with Jesus who is called Christ?” Pilate asked. They all answered, “Crucify Him!”\u003c/li\u003e\n\u003cli\u003e“Why? What evil has He done?” Pilate asked. But they shouted all the louder, “Crucify Him!”\u003c/li\u003e\n\u003cli\u003eWhen Pilate saw that he was accomplishing nothing, but that a riot was breaking out instead, he took water and washed his hands before the crowd. “I am innocent of this man’s blood,” he said. “You bear the responsibility.”\u003c/li\u003e\n\u003cli\u003eAll the people answered, “His blood be on us and on our children!”\u003c/li\u003e\n\u003cli\u003eThen Pilate released Barabbas to them. But he had Jesus flogged, and handed Him over to be crucified.\u003c/li\u003e\n\u003cli\u003eThen the governor’s soldiers took Jesus into the Praetorium and gathered the whole company of soldiers around Him.\u003c/li\u003e\n\u003cli\u003eThey stripped Him and put a scarlet robe on Him.\u003c/li\u003e\n\u003cli\u003eAnd they twisted together a crown of thorns and set it on His head. They put a staff in His right hand and knelt down before Him to mock Him, saying, “Hail, King of the Jews!”\u003c/li\u003e\n\u003cli\u003eThen they spit on Him, and took the staff and struck Him on the head again and again.\u003c/li\u003e\n\u003cli\u003eAfter they had mocked Him, they stripped Him of the robe, put His own clothes back on Him, and led Him away to crucify Him.\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/details\u003e\n\u003ch3 id=\"stands-out-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStands out\u003c/span\u003e \u003ca href=\"#stands-out-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre\u003e\u003ccode\u003e35. Peter replied, “Even if I have to die with You, I will never deny You.” And all the other disciples said the same thing.\n\n\u0026gt; but I deny him with my actions every day\n\n\n53. Are you not aware that I can call on My Father, and He will at once put at My disposal more than twelve legions of angels?\n54. But how then would the Scriptures be fulfilled that say it must happen this way?”\n\n\u0026gt; there's a tension in reality... Jesus _can_ do whatever he wants and submits himself to prophecy anyways, it's circular to me sort of. but it also means that I need to stop questioning every aspect of reality in my \u0026quot;if this then that\u0026quot; processing. sometimes we're just bound by reality - even the Lord was.\n\n\n74. Then he began to curse and swear, “I do not know the man!” And immediately a rooster crowed.\n75. Then Peter remembered the word that Jesus had spoken: “Before the rooster crows, you will deny Me three times.” And he went outside and wept bitterly.\n\n\u0026gt; is Jesus also just waiting for me to deny him? if I think he is I must also remember he was ready to forgive Peter\n\nJews tell Judas he bears the responsibility, then Pilate tells the Jews they do, then the Jews put it on their kids... interesting\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3 id=\"means-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMeans\u003c/span\u003e \u003ca href=\"#means-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch3 id=\"for-me-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFor me\u003c/span\u003e \u003ca href=\"#for-me-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch3 id=\"prayer-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePrayer\u003c/span\u003e \u003ca href=\"#prayer-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch2 id=\"day-3-matthew-27-32-66\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDay 3 — Matthew 27:32-66\u003c/span\u003e \u003ca href=\"#day-3-matthew-27-32-66\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cdetails class=\"admonition quote\"\u003e\n\u003csummary class=\"admonition-title\"\u003eMatthew 27:32-66\u003c/summary\u003e\n\u003col start=\"32\"\u003e\n\u003cli\u003eAlong the way they found a man from Cyrene named Simon, and they forced him to carry the cross of Jesus.\u003c/li\u003e\n\u003cli\u003eWhen they came to a place called Golgotha, which means “The Place of the Skull,”\u003c/li\u003e\n\u003cli\u003ethey offered Him wine to drink, mixed with gall; but after tasting it, He refused to drink it.\u003c/li\u003e\n\u003cli\u003eWhen they had crucified Him, they divided His garments by casting lots, to fulfill what was spoken through the prophet: “They divided My garments among them and cast lots for My clothing.”\u003c/li\u003e\n\u003cli\u003eAnd sitting down, they kept watch over Him there.\u003c/li\u003e\n\u003cli\u003eAbove His head they posted the written charge against Him: “This is Jesus, the King of the Jews.”\u003c/li\u003e\n\u003cli\u003eTwo robbers were crucified with Him, one on His right hand and one on His left.\u003c/li\u003e\n\u003cli\u003eAnd those who passed by heaped abuse on Him, shaking their heads\u003c/li\u003e\n\u003cli\u003eand saying, “You who would destroy the temple and rebuild it in three days, save Yourself! If You are the Son of God, come down from the cross!”\u003c/li\u003e\n\u003cli\u003eIn the same way, the chief priests, scribes, and elders mocked Him,\u003c/li\u003e\n\u003cli\u003esaying, “He saved others, but He cannot save Himself. He is the King of Israel! Let Him come down now from the cross, and we will believe in Him.\u003c/li\u003e\n\u003cli\u003eHe trusts in God. Let God deliver Him now if He wants Him. For He said, ‘I am the Son of God.’”\u003c/li\u003e\n\u003cli\u003eIn the same way, even the robbers who were crucified with Him heaped abuse on Him.\u003c/li\u003e\n\u003cli\u003eFrom the sixth hour until the ninth hour darkness came over all the land.\u003c/li\u003e\n\u003cli\u003eAbout the ninth hour Jesus cried out in a loud voice, “Eli, Eli, lema sabachthani?” which means, “My God, My God, why have You forsaken Me?”\u003c/li\u003e\n\u003cli\u003eWhen some of those standing there heard this, they said, “He is calling Elijah.”\u003c/li\u003e\n\u003cli\u003eImmediately one of them ran and got a sponge. He filled it with wine vinegar, put it on a reed, and held it up for Jesus to drink.\u003c/li\u003e\n\u003cli\u003eBut the others said, “Leave Him alone. Let us see if Elijah comes to save Him.”\u003c/li\u003e\n\u003cli\u003eWhen Jesus had cried out again in a loud voice, He yielded up His spirit.\u003c/li\u003e\n\u003cli\u003eAt that moment the veil of the temple was torn in two from top to bottom. The earth quaked and the rocks were split.\u003c/li\u003e\n\u003cli\u003eThe tombs broke open, and the bodies of many saints who had fallen asleep were raised.\u003c/li\u003e\n\u003cli\u003eAfter Jesus’ resurrection, when they had come out of the tombs, they entered the holy city and appeared to many people.\u003c/li\u003e\n\u003cli\u003eWhen the centurion and those with him who were guarding Jesus saw the earthquake and all that had happened, they were terrified and said, “Truly this was the Son of God.”\u003c/li\u003e\n\u003cli\u003eAnd many women were there, watching from a distance. They had followed Jesus from Galilee to minister to Him.\u003c/li\u003e\n\u003cli\u003eAmong them were Mary Magdalene, Mary the mother of James and Joseph, and the mother of Zebedee’s sons.\u003c/li\u003e\n\u003cli\u003eWhen it was evening, a rich man from Arimathea named Joseph came, who himself was also a disciple of Jesus.\u003c/li\u003e\n\u003cli\u003eHe went to Pilate to ask for the body of Jesus, and Pilate ordered that it be given to him.\u003c/li\u003e\n\u003cli\u003eSo Joseph took the body, wrapped it in a clean linen cloth,\u003c/li\u003e\n\u003cli\u003eand placed it in his own new tomb that he had cut out of the rock. Then he rolled a great stone against the entrance to the tomb and went away.\u003c/li\u003e\n\u003cli\u003eMary Magdalene and the other Mary were sitting there opposite the tomb.\u003c/li\u003e\n\u003cli\u003eThe next day, which is the day after Preparation Day, the chief priests and Pharisees assembled before Pilate\u003c/li\u003e\n\u003cli\u003eand said, “Sir, we remember that while He was alive that deceiver said, ‘After three days I will rise again.’\u003c/li\u003e\n\u003cli\u003eSo give the order that the tomb be secured until the third day. Otherwise, His disciples may come and steal Him away and tell the people He has risen from the dead, and the last deception will be worse than the first.”\u003c/li\u003e\n\u003cli\u003e“Go and make the tomb as secure as you know how,” Pilate answered.\u003c/li\u003e\n\u003cli\u003eAnd they went and made the tomb secure by sealing the stone and posting a guard.\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/details\u003e\n\u003ch3 id=\"stands-out-2\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStands out\u003c/span\u003e \u003ca href=\"#stands-out-2\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch3 id=\"means-2\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMeans\u003c/span\u003e \u003ca href=\"#means-2\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch3 id=\"for-me-2\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFor me\u003c/span\u003e \u003ca href=\"#for-me-2\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch3 id=\"prayer-2\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePrayer\u003c/span\u003e \u003ca href=\"#prayer-2\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch2 id=\"day-4-luke-23-26-56\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDay 4 — Luke 23:26-56\u003c/span\u003e \u003ca href=\"#day-4-luke-23-26-56\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cdetails class=\"admonition quote\"\u003e\n\u003csummary class=\"admonition-title\"\u003eLuke 23:26-56\u003c/summary\u003e\n\u003col start=\"26\"\u003e\n\u003cli\u003eAs the soldiers led Him away, they seized Simon of Cyrene on his way in from the country, and put the cross on him to carry behind Jesus.\u003c/li\u003e\n\u003cli\u003eA great number of people followed Him, along with women who were mourning and wailing for Him.\u003c/li\u003e\n\u003cli\u003eBut Jesus turned to them and said, “Daughters of Jerusalem, do not weep for Me, but weep for yourselves and for your children.\u003c/li\u003e\n\u003cli\u003eLook, the days are coming when people will say, ‘Blessed are the barren women, the wombs that never bore, and the breasts that never nursed!’\u003c/li\u003e\n\u003cli\u003eAt that time they will say to the mountains, ‘Fall on us!’ and to the hills, ‘Cover us!’\u003c/li\u003e\n\u003cli\u003eFor if men do these things while the tree is green, what will happen when it is dry?”\u003c/li\u003e\n\u003cli\u003eTwo others, who were criminals, were also led away to be executed with Jesus.\u003c/li\u003e\n\u003cli\u003eWhen they came to the place called The Skull, they crucified Him there, along with the criminals, one on His right hand and the other on His left.\u003c/li\u003e\n\u003cli\u003eThen Jesus said, “Father, forgive them, for they do not know what they are doing.” And they divided up His garments by casting lots.\u003c/li\u003e\n\u003cli\u003eThe people stood watching, and the rulers sneered at Him, saying, “He saved others; let Him save Himself if He is the Christ of God, the Chosen One.”\u003c/li\u003e\n\u003cli\u003eThe soldiers also mocked Him and came up to offer Him sour wine.\u003c/li\u003e\n\u003cli\u003e“If You are the King of the Jews,” they said, “save Yourself!”\u003c/li\u003e\n\u003cli\u003eAbove Him was posted an inscription: “THIS IS THE KING OF THE JEWS.”\u003c/li\u003e\n\u003cli\u003eOne of the criminals who hung there heaped abuse on Him: “Are You not the Christ? Save Yourself and us!”\u003c/li\u003e\n\u003cli\u003eBut the other criminal rebuked him. “Do you not even fear God,” he said, “since you are under the same judgment?\u003c/li\u003e\n\u003cli\u003eWe are punished justly, for we are receiving what our actions deserve. But this man has done nothing wrong.”\u003c/li\u003e\n\u003cli\u003eThen he said, “Jesus, remember me when You come into Your kingdom!”\u003c/li\u003e\n\u003cli\u003eAnd Jesus said to him, “Truly I tell you, today you will be with Me in Paradise.”\u003c/li\u003e\n\u003cli\u003eIt was now about the sixth hour, and darkness came over all the land until the ninth hour.\u003c/li\u003e\n\u003cli\u003eThe sun was darkened, and the veil of the temple was torn down the middle.\u003c/li\u003e\n\u003cli\u003eThen Jesus called out in a loud voice, “Father, into Your hands I commit My Spirit.” And when He had said this, He breathed His last.\u003c/li\u003e\n\u003cli\u003eWhen the centurion saw what had happened, he gave glory to God and said, “Surely this was a righteous man.”\u003c/li\u003e\n\u003cli\u003eWhen all the people who had gathered to witness this sight saw what had taken place, they returned home, beating their breasts.\u003c/li\u003e\n\u003cli\u003eBut all those who knew Jesus, including the women who had followed Him from Galilee, stood at a distance watching these things.\u003c/li\u003e\n\u003cli\u003eNow there was a righteous and devout man named Joseph, who was a member of the Council,\u003c/li\u003e\n\u003cli\u003ewho had not consented to their plan and action. He was from the Judean town of Arimathea, and he was waiting for the kingdom of God.\u003c/li\u003e\n\u003cli\u003eHe went to Pilate to ask for the body of Jesus.\u003c/li\u003e\n\u003cli\u003eThen he brought it down, wrapped it in a linen cloth, and placed it in a tomb cut out of the rock, where no one had yet been laid.\u003c/li\u003e\n\u003cli\u003eIt was Preparation Day, and the Sabbath was about to begin.\u003c/li\u003e\n\u003cli\u003eThe women who had come with Jesus from Galilee followed, and they saw the tomb and how His body was placed.\u003c/li\u003e\n\u003cli\u003eThen they returned to prepare spices and perfumes. And they rested on the Sabbath, according to the commandment.\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/details\u003e\n\u003ch3 id=\"stands-out-3\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStands out\u003c/span\u003e \u003ca href=\"#stands-out-3\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch3 id=\"means-3\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMeans\u003c/span\u003e \u003ca href=\"#means-3\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch3 id=\"for-me-3\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFor me\u003c/span\u003e \u003ca href=\"#for-me-3\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch3 id=\"prayer-3\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePrayer\u003c/span\u003e \u003ca href=\"#prayer-3\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch2 id=\"day-5-john-19\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDay 5 — John 19\u003c/span\u003e \u003ca href=\"#day-5-john-19\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cdetails class=\"admonition quote\"\u003e\n\u003csummary class=\"admonition-title\"\u003eJohn 19\u003c/summary\u003e\n\u003col\u003e\n\u003cli\u003eThen Pilate took Jesus and had Him flogged.\u003c/li\u003e\n\u003cli\u003eThe soldiers twisted together a crown of thorns, put it on His head, and dressed Him in a purple robe.\u003c/li\u003e\n\u003cli\u003eAnd they went up to Him again and again, saying, “Hail, King of the Jews!” and slapping Him in the face.\u003c/li\u003e\n\u003cli\u003eOnce more Pilate came out and said to the Jews, “Look, I am bringing Him out to you to let you know that I find no basis for a charge against Him.”\u003c/li\u003e\n\u003cli\u003eSo Jesus came out wearing the crown of thorns and the purple robe. And Pilate said to them, “Here is the man!”\u003c/li\u003e\n\u003cli\u003eAs soon as the chief priests and officers saw Him, they shouted, “Crucify Him! Crucify Him!” Pilate told them, “You take Him and crucify Him. As for me, I find no basis for a charge against Him.”\u003c/li\u003e\n\u003cli\u003e“We have a law,” answered the Jews, “and according to that law He must die, because He declared Himself to be the Son of God.”\u003c/li\u003e\n\u003cli\u003eWhen Pilate heard this statement, he was even more afraid.\u003c/li\u003e\n\u003cli\u003eHe went back into the Praetorium and asked Jesus, “Where are You from?” But Jesus gave no answer.\u003c/li\u003e\n\u003cli\u003eSo Pilate said to Him, “Do You refuse to speak to me? Do You not know that I have authority to release You and authority to crucify You?”\u003c/li\u003e\n\u003cli\u003eJesus answered, “You would have no authority over Me if it were not given to you from above. Therefore the one who handed Me over to you is guilty of greater sin.”\u003c/li\u003e\n\u003cli\u003eFrom then on, Pilate tried to release Him, but the Jews kept shouting, “If you release this man, you are no friend of Caesar. Anyone who declares himself a king is defying Caesar.”\u003c/li\u003e\n\u003cli\u003eWhen Pilate heard these words, he brought Jesus out and sat down on the judgment seat at a place called the Stone Pavement, which in Hebrew is Gabbatha.\u003c/li\u003e\n\u003cli\u003eIt was the day of Preparation for the Passover, about the sixth hour. And Pilate said to the Jews, “Here is your King!”\u003c/li\u003e\n\u003cli\u003eAt this, they shouted, “Away with Him! Away with Him! Crucify Him!” Pilate asked, “Shall I crucify your King?” “We have no king but Caesar,” replied the chief priests.\u003c/li\u003e\n\u003cli\u003eThen Pilate handed Him over to be crucified, and the soldiers took Him away.\u003c/li\u003e\n\u003cli\u003eCarrying His own cross, He went out to the place of the Skull, which in Hebrew is called Golgotha.\u003c/li\u003e\n\u003cli\u003eThere they crucified Him, and with Him two others, one on each side, with Jesus in the middle.\u003c/li\u003e\n\u003cli\u003ePilate also had a notice posted on the cross. It read: “JESUS OF NAZARETH, THE KING OF THE JEWS.”\u003c/li\u003e\n\u003cli\u003eMany of the Jews read this sign, because the place where Jesus was crucified was near the city, and it was written in Aramaic, Latin, and Greek.\u003c/li\u003e\n\u003cli\u003eSo the chief priests of the Jews said to Pilate, “Do not write, ‘The King of the Jews,’ but, ‘This man said, I am the King of the Jews.’”\u003c/li\u003e\n\u003cli\u003ePilate answered, “What I have written, I have written.”\u003c/li\u003e\n\u003cli\u003eWhen the soldiers had crucified Jesus, they divided His garments into four parts, a part for each soldier, and the tunic remained. It was seamless, woven in one piece from top to bottom.\u003c/li\u003e\n\u003cli\u003eSo they said to one another, “Let us not tear it; instead, let us cast lots to see who will get it.” This was to fulfill the Scripture: “They divided My garments among them, and for My clothing they cast lots.” So that is what the soldiers did.\u003c/li\u003e\n\u003cli\u003eNear the cross of Jesus stood His mother and His mother’s sister, Mary the wife of Clopas, and Mary Magdalene.\u003c/li\u003e\n\u003cli\u003eWhen Jesus saw His mother and the disciple whom He loved standing nearby, He said to His mother, “Woman, here is your son.”\u003c/li\u003e\n\u003cli\u003eThen He said to the disciple, “Here is your mother.” So from that hour, the disciple took her into his home.\u003c/li\u003e\n\u003cli\u003eAfter this, knowing that everything had now been accomplished, and to fulfill the Scripture, Jesus said, “I am thirsty.”\u003c/li\u003e\n\u003cli\u003eA jar of sour wine was sitting there. So they soaked a sponge in the wine, put it on a hyssop stalk, and lifted it to His mouth.\u003c/li\u003e\n\u003cli\u003eWhen Jesus had received the sour wine, He said, “It is finished.” And bowing His head, He yielded up His spirit.\u003c/li\u003e\n\u003cli\u003eIt was the day of Preparation, and the next day was a special Sabbath. In order to avoid leaving the bodies on the cross during the Sabbath, the Jews asked Pilate to have the legs broken and the bodies removed.\u003c/li\u003e\n\u003cli\u003eSo the soldiers came and broke the legs of the first man who had been crucified with Jesus, and those of the other.\u003c/li\u003e\n\u003cli\u003eBut when they came to Jesus and saw that He was already dead, they did not break His legs.\u003c/li\u003e\n\u003cli\u003eInstead, one of the soldiers pierced His side with a spear, and immediately blood and water flowed out.\u003c/li\u003e\n\u003cli\u003eThe one who saw it has testified, and his testimony is true. He knows that he is telling the truth, so that you also may believe.\u003c/li\u003e\n\u003cli\u003eNow these things happened so that the Scripture would be fulfilled: “Not one of His bones will be broken.”\u003c/li\u003e\n\u003cli\u003eAnd, as another Scripture says: “They will look on the One they have pierced.”\u003c/li\u003e\n\u003cli\u003eAfter these things, Joseph of Arimathea, who was a disciple of Jesus (but secretly for fear of the Jews), asked Pilate to let him remove the body of Jesus. Pilate gave him permission, so he came and removed His body.\u003c/li\u003e\n\u003cli\u003eNicodemus, who had previously come to Jesus at night, also brought a mixture of myrrh and aloes, about seventy-five pounds.\u003c/li\u003e\n\u003cli\u003eSo they took the body of Jesus and wrapped it in linen cloths with the spices, according to the Jewish burial custom.\u003c/li\u003e\n\u003cli\u003eNow there was a garden in the place where Jesus was crucified, and in the garden a new tomb in which no one had yet been laid.\u003c/li\u003e\n\u003cli\u003eAnd because it was the Jewish day of Preparation and the tomb was nearby, they laid Jesus there.\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/details\u003e\n\u003ch3 id=\"stands-out-4\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStands out\u003c/span\u003e \u003ca href=\"#stands-out-4\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch3 id=\"means-4\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMeans\u003c/span\u003e \u003ca href=\"#means-4\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch3 id=\"for-me-4\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFor me\u003c/span\u003e \u003ca href=\"#for-me-4\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch3 id=\"prayer-4\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePrayer\u003c/span\u003e \u003ca href=\"#prayer-4\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003chr\u003e\n\u003ch2 id=\"prayer-requests\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePrayer Requests\u003c/span\u003e \u003ca href=\"#prayer-requests\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e \u003cname\u003e — \u003crequest\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"answered-updates\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAnswered / Updates\u003c/span\u003e \u003ca href=\"#answered-updates\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cfollow-ups from previous weeks\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"meeting-notes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMeeting Notes\u003c/span\u003e \u003ca href=\"#meeting-notes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u0026lt;what the group discussed, insights from others\u0026gt;\u003c/p\u003e\n",
      "content_text": "\n# Week 36 — September 20 – 26, 2026\n\n### Meeting: Friday, ~~September 25~~ October 5\n\n### Memory Verse: Psalm 119:9, 11\n\n!!! quote \"Psalm 119:9, 11\"\n\n    9. How can a young man keep his way pure?\n    By guarding it with Your word.\n\n    11. I have hidden Your word in my heart,\n    that I might not sin against You.\n\n## Readings\n\n- [ ] Day 1: Matthew 24:32-51 \u0026 John 17\n- [ ] Day 2: Matthew 26:35-27:31\n- [ ] Day 3: Matthew 27:32-66\n- [ ] Day 4: Luke 23:26-56\n- [ ] Day 5: John 19\n\n---\n\n## Day 1 — Matthew 24:32-51 \u0026 John 17\n\n??? quote \"Matthew 24:32-51\"\n\n    32. Now learn this lesson from the fig tree: As soon as its branches become tender and sprout leaves, you know that summer is near.\n    33. So also, when you see all these things, you will know that He is near, right at the door.\n    34. Truly I tell you, this generation will not pass away until all these things have happened.\n    35. Heaven and earth will pass away, but My words will never pass away.\n    36. But about that day and hour no one knows, not even the angels in heaven, nor the Son, but only the Father.\n    37. As it was in the days of Noah, so will it be at the coming of the Son of Man.\n    38. For in the days before the flood, people were eating and drinking, marrying and giving in marriage, up to the day Noah entered the ark.\n    39. And they were oblivious, until the flood came and swept them all away. So will it be at the coming of the Son of Man.\n    40. Two men will be in the field: one will be taken and the other left.\n    41. Two women will be grinding at the mill: one will be taken and the other left.\n    42. Therefore keep watch, because you do not know the day on which your Lord will come.\n    43. But understand this: If the homeowner had known in which watch of the night the thief was coming, he would have kept watch and would not have let his house be broken into.\n    44. For this reason, you also must be ready, because the Son of Man will come at an hour you do not expect.\n    45. Who then is the faithful and wise servant, whom the master has put in charge of his household, to give the others their food at the proper time?\n    46. Blessed is that servant whose master finds him doing so when he returns.\n    47. Truly I tell you, he will put him in charge of all his possessions.\n    48. But suppose that servant is wicked and says in his heart, 'My master will be away a long time.'\n    49. And he begins to beat his fellow servants and to eat and drink with drunkards.\n    50. The master of that servant will come on a day he does not expect and at an hour he does not anticipate.\n    51. Then he will cut him to pieces and assign him a place with the hypocrites, where there will be weeping and gnashing of teeth.\n\n??? quote \"John 17\"\n\n    1. After Jesus had spoken these words, He looked up to heaven and said, “Father, the hour has come. Glorify Your Son, that Your Son may glorify You.\n    2. For You granted Him authority over all people, so that He may give eternal life to all those You have given Him.\n    3. Now this is eternal life, that they may know You, the only true God, and Jesus Christ, whom You have sent.\n    4. I have glorified You on earth by accomplishing the work You gave Me to do.\n    5. And now, Father, glorify Me in Your presence with the glory I had with You before the world existed.\n    6. I have revealed Your name to those whom You have given Me out of the world. They were Yours; You gave them to Me, and they have kept Your word.\n    7. Now they know that everything You have given Me comes from You.\n    8. For I have given them the words You gave Me, and they have received them. They knew with certainty that I came from You, and they believed that You sent Me.\n    9. I ask on their behalf. I do not ask on behalf of the world, but on behalf of those You have given Me; for they are Yours.\n    10. All I have is Yours, and all You have is Mine; and in them I have been glorified.\n    11. I will no longer be in the world, but they are in the world, and I am coming to You. Holy Father, protect them by Your name, the name You gave Me, so that they may be one as We are one.\n    12. While I was with them, I protected them and kept them safe by that name You gave Me. Not one of them has been lost, except the son of destruction, so that the Scripture would be fulfilled.\n    13. But now I am coming to You, and I am saying these things while I am in the world, so that they may have My joy fulfilled within them.\n    14. I have given them Your word and the world has hated them, for they are not of the world any more than I am of the world.\n    15. I do not ask that You take them out of the world, but that You keep them from the evil one.\n    16. They are not of the world, just as I am not of the world.\n    17. Sanctify them by the truth; Your word is truth.\n    18. As You sent Me into the world, I have also sent them into the world.\n    19. For them I sanctify Myself, so that they too may be sanctified by the truth.\n    20. I am not asking on behalf of them alone, but also on behalf of those who will believe in Me through their message,\n    21. that all of them may be one, as You, Father, are in Me, and I am in You. May they also be in Us, so that the world may believe that You sent Me.\n    22. I have given them the glory You gave Me, so that they may be one as We are one—\n    23. I in them and You in Me—that they may be perfectly united, so that the world may know that You sent Me and have loved them just as You have loved Me.\n    24. Father, I want those You have given Me to be with Me where I am, that they may see My glory, the glory You have given Me because You loved Me before the foundation of the world.\n    25. Righteous Father, although the world has not known You, I know You, and they know that You sent Me.\n    26. And I have made Your name known to them and will continue to make it known, so that the love You have for Me may be in them, and I in them.”\n\n### Stands out\n\n    36. But about that day and hour no one knows, not even the angels in heaven, nor the Son, but only the Father.\n    37. As it was in the days of Noah, so will it be at the coming of the Son of Man.\n    38. For in the days before the flood, people were eating and drinking, marrying and giving in marriage, up to the day Noah entered the ark.\n    39. And they were oblivious, until the flood came and swept them all away. So will it be at the coming of the Son of Man.\n\n    ---\n\n    44. For this reason, you also must be ready, because the Son of Man will come at an hour you do not expect.\n    45. Who then is the faithful and wise servant, whom the master has put in charge of his household, to give the others their food at the proper time?\n    46. Blessed is that servant whose master finds him doing so when he returns.\n\n### Means\n\nevery day, daily disciplined life, is what it looks like to wait upon the Lord. Not wishing I took advantage of a moment of debauchery, because the prize isn't the discipline, it isn't NOT doing the debauchery, the prize IS the King, and he can come and call at any moment\n\n### For me\n\ndovetails with \"work\" from men's group - work and jobs are different, and we are called to work, I should be working all the time:\n\n- kids\n- house\n- wife\n- self-discipline\n\nI need to recover holy work in my life\n\n### Prayer\n\n## Day 2 — Matthew 26:35-27:31\n\n??? quote \"Matthew 26:35-27:31\"\n\n    35. Peter replied, “Even if I have to die with You, I will never deny You.” And all the other disciples said the same thing.\n    36. Then Jesus went with His disciples to a place called Gethsemane, and He told them, “Sit here while I go over there and pray.”\n    37. He took with Him Peter and the two sons of Zebedee and began to be sorrowful and deeply distressed.\n    38. Then He said to them, “My soul is consumed with sorrow to the point of death. Stay here and keep watch with Me.”\n    39. Going a little farther, He fell face down and prayed, “My Father, if it is possible, let this cup pass from Me. Yet not as I will, but as You will.”\n    40. Then Jesus returned to the disciples and found them sleeping. “Were you not able to keep watch with Me for one hour?” He asked Peter.\n    41. “Watch and pray so that you will not enter into temptation. For the spirit is willing, but the body is weak.”\n    42. A second time He went away and prayed, “My Father, if this cup cannot pass unless I drink it, may Your will be done.”\n    43. And again Jesus returned and found them sleeping—for their eyes were heavy.\n    44. So He left them and went away once more and prayed a third time, saying the same thing.\n    45. Then He returned to the disciples and said, “Are you still sleeping and resting? Look, the hour is near, and the Son of Man is betrayed into the hands of sinners.\n    46. Get up! Let us go. See, My betrayer is approaching.”\n    47. While Jesus was still speaking, Judas, one of the Twelve, arrived, accompanied by a large crowd armed with swords and clubs, sent from the chief priests and elders of the people.\n    48. Now the betrayer had arranged a signal with them: “The One I kiss is the Man; arrest Him.”\n    49. Going directly to Jesus, he said, “Greetings, Rabbi!” and kissed Him.\n    50. “Friend,” Jesus replied, “do what you have come for.” Then the men stepped forward, seized Jesus, and arrested Him.\n    51. At this, one of Jesus’ companions drew his sword and struck the servant of the high priest, cutting off his ear.\n    52. “Put your sword back in its place,” Jesus said to him. “For all who draw the sword will die by the sword.\n    53. Are you not aware that I can call on My Father, and He will at once put at My disposal more than twelve legions of angels?\n    54. But how then would the Scriptures be fulfilled that say it must happen this way?”\n    55. At that time Jesus said to the crowd, “Have you come out with swords and clubs to arrest Me as you would an outlaw? Every day I sat teaching in the temple courts, and you did not arrest Me.\n    56. But this has all happened so that the writings of the prophets would be fulfilled.” Then all the disciples deserted Him and fled.\n    57. Those who had arrested Jesus led Him away to Caiaphas the high priest, where the scribes and elders had gathered.\n    58. But Peter followed Him at a distance, right up to the courtyard of the high priest. And going inside, he sat down with the guards to see the outcome.\n    59. The chief priests and the whole Sanhedrin were searching for false testimony against Jesus so they could put Him to death.\n    60. But they did not find any, though many false witnesses came forward. Finally two witnesses came forward\n    61. and declared, “This man said, ‘I am able to destroy the temple of God and rebuild it in three days.’”\n    62. So the high priest stood up and asked Him, “Have You no answer? What are these men testifying against You?”\n    63. But Jesus remained silent. So the high priest said to Him, “I charge You under oath by the living God: Tell us if You are the Christ, the Son of God.”\n    64. “You have said it yourself,” Jesus answered. “But I say to all of you, from now on you will see the Son of Man sitting at the right hand of Power and coming on the clouds of heaven.”\n    65. At this, the high priest tore his clothes and declared, “He has blasphemed! Why do we need any more witnesses? Look, now you have heard the blasphemy.\n    66. What is your verdict?” “He deserves death,” they answered.\n    67. Then they spit in His face and struck Him. Others slapped Him\n    68. and said, “Prophesy to us, Christ! Who hit You?”\n    69. Meanwhile, Peter was sitting out in the courtyard, and a servant girl came up to him. “You were also with Jesus the Galilean,” she said.\n    70. But he denied it before them all: “I do not know what you are talking about.”\n    71. When he had gone out to the gateway, another servant girl saw him and said to the people there, “This man was with Jesus of Nazareth.”\n    72. And again he denied it with an oath: “I do not know the man!”\n    73. After a little while, those standing nearby came up to Peter. “Surely you are one of them,” they said. “For even your accent gives you away.”\n    74. Then he began to curse and swear, “I do not know the man!” And immediately a rooster crowed.\n    75. Then Peter remembered the word that Jesus had spoken: “Before the rooster crows, you will deny Me three times.” And he went outside and wept bitterly.\n\n??? quote \"Matthew 27:1-31\"\n\n    1. When morning came, all the chief priests and elders of the people conspired against Jesus to put Him to death.\n    2. They bound Him, led Him away, and handed Him over to Pilate the governor.\n    3. When Judas, who had betrayed Him, saw that Jesus was condemned, he was filled with remorse and returned the thirty pieces of silver to the chief priests and elders.\n    4. “I have sinned by betraying innocent blood,” he said. “What is that to us?” they replied. “You bear the responsibility.”\n    5. So Judas threw the silver into the temple and left. Then he went away and hanged himself.\n    6. The chief priests picked up the pieces of silver and said, “It is unlawful to put this into the treasury, since it is blood money.”\n    7. After conferring together, they used the money to buy the potter’s field as a burial place for foreigners.\n    8. That is why it has been called the Field of Blood to this day.\n    9. Then what was spoken through Jeremiah the prophet was fulfilled: “They took the thirty pieces of silver, the price set on Him by the people of Israel,\n    10. and they gave them for the potter’s field, as the Lord had commanded me.”\n    11. Meanwhile Jesus stood before the governor, and the governor questioned Him: “Are You the King of the Jews?” “You have said so,” Jesus replied.\n    12. And when He was accused by the chief priests and elders, He gave no answer.\n    13. Then Pilate asked Him, “Do You not hear how many charges they are bringing against You?”\n    14. But Jesus gave no answer, not even to a single charge, much to the governor’s amazement.\n    15. At the feast, the governor was accustomed to releasing one prisoner to the crowd, whomever they wanted.\n    16. At that time they were holding a notorious prisoner named Barabbas.\n    17. So when the crowd had gathered, Pilate asked them, “Whom do you want me to release to you: Barabbas, or Jesus who is called Christ?”\n    18. For he knew it was out of envy that they had handed Jesus over to him.\n    19. While Pilate was sitting on the judgment seat, his wife sent him this message: “Have nothing to do with that righteous man, for I have suffered much in a dream today because of Him.”\n    20. But the chief priests and elders persuaded the crowds to ask for Barabbas and to have Jesus put to death.\n    21. “Which of the two do you want me to release to you?” asked the governor. “Barabbas,” they answered.\n    22. “What then shall I do with Jesus who is called Christ?” Pilate asked. They all answered, “Crucify Him!”\n    23. “Why? What evil has He done?” Pilate asked. But they shouted all the louder, “Crucify Him!”\n    24. When Pilate saw that he was accomplishing nothing, but that a riot was breaking out instead, he took water and washed his hands before the crowd. “I am innocent of this man’s blood,” he said. “You bear the responsibility.”\n    25. All the people answered, “His blood be on us and on our children!”\n    26. Then Pilate released Barabbas to them. But he had Jesus flogged, and handed Him over to be crucified.\n    27. Then the governor’s soldiers took Jesus into the Praetorium and gathered the whole company of soldiers around Him.\n    28. They stripped Him and put a scarlet robe on Him.\n    29. And they twisted together a crown of thorns and set it on His head. They put a staff in His right hand and knelt down before Him to mock Him, saying, “Hail, King of the Jews!”\n    30. Then they spit on Him, and took the staff and struck Him on the head again and again.\n    31. After they had mocked Him, they stripped Him of the robe, put His own clothes back on Him, and led Him away to crucify Him.\n\n### Stands out\n\n    35. Peter replied, “Even if I have to die with You, I will never deny You.” And all the other disciples said the same thing.\n\n    \u003e but I deny him with my actions every day\n\n\n    53. Are you not aware that I can call on My Father, and He will at once put at My disposal more than twelve legions of angels?\n    54. But how then would the Scriptures be fulfilled that say it must happen this way?”\n\n    \u003e there's a tension in reality... Jesus _can_ do whatever he wants and submits himself to prophecy anyways, it's circular to me sort of. but it also means that I need to stop questioning every aspect of reality in my \"if this then that\" processing. sometimes we're just bound by reality - even the Lord was.\n\n\n    74. Then he began to curse and swear, “I do not know the man!” And immediately a rooster crowed.\n    75. Then Peter remembered the word that Jesus had spoken: “Before the rooster crows, you will deny Me three times.” And he went outside and wept bitterly.\n\n    \u003e is Jesus also just waiting for me to deny him? if I think he is I must also remember he was ready to forgive Peter\n\n    Jews tell Judas he bears the responsibility, then Pilate tells the Jews they do, then the Jews put it on their kids... interesting\n\n### Means\n\n### For me\n\n### Prayer\n\n## Day 3 — Matthew 27:32-66\n\n??? quote \"Matthew 27:32-66\"\n\n    32. Along the way they found a man from Cyrene named Simon, and they forced him to carry the cross of Jesus.\n    33. When they came to a place called Golgotha, which means “The Place of the Skull,”\n    34. they offered Him wine to drink, mixed with gall; but after tasting it, He refused to drink it.\n    35. When they had crucified Him, they divided His garments by casting lots, to fulfill what was spoken through the prophet: “They divided My garments among them and cast lots for My clothing.”\n    36. And sitting down, they kept watch over Him there.\n    37. Above His head they posted the written charge against Him: “This is Jesus, the King of the Jews.”\n    38. Two robbers were crucified with Him, one on His right hand and one on His left.\n    39. And those who passed by heaped abuse on Him, shaking their heads\n    40. and saying, “You who would destroy the temple and rebuild it in three days, save Yourself! If You are the Son of God, come down from the cross!”\n    41. In the same way, the chief priests, scribes, and elders mocked Him,\n    42. saying, “He saved others, but He cannot save Himself. He is the King of Israel! Let Him come down now from the cross, and we will believe in Him.\n    43. He trusts in God. Let God deliver Him now if He wants Him. For He said, ‘I am the Son of God.’”\n    44. In the same way, even the robbers who were crucified with Him heaped abuse on Him.\n    45. From the sixth hour until the ninth hour darkness came over all the land.\n    46. About the ninth hour Jesus cried out in a loud voice, “Eli, Eli, lema sabachthani?” which means, “My God, My God, why have You forsaken Me?”\n    47. When some of those standing there heard this, they said, “He is calling Elijah.”\n    48. Immediately one of them ran and got a sponge. He filled it with wine vinegar, put it on a reed, and held it up for Jesus to drink.\n    49. But the others said, “Leave Him alone. Let us see if Elijah comes to save Him.”\n    50. When Jesus had cried out again in a loud voice, He yielded up His spirit.\n    51. At that moment the veil of the temple was torn in two from top to bottom. The earth quaked and the rocks were split.\n    52. The tombs broke open, and the bodies of many saints who had fallen asleep were raised.\n    53. After Jesus’ resurrection, when they had come out of the tombs, they entered the holy city and appeared to many people.\n    54. When the centurion and those with him who were guarding Jesus saw the earthquake and all that had happened, they were terrified and said, “Truly this was the Son of God.”\n    55. And many women were there, watching from a distance. They had followed Jesus from Galilee to minister to Him.\n    56. Among them were Mary Magdalene, Mary the mother of James and Joseph, and the mother of Zebedee’s sons.\n    57. When it was evening, a rich man from Arimathea named Joseph came, who himself was also a disciple of Jesus.\n    58. He went to Pilate to ask for the body of Jesus, and Pilate ordered that it be given to him.\n    59. So Joseph took the body, wrapped it in a clean linen cloth,\n    60. and placed it in his own new tomb that he had cut out of the rock. Then he rolled a great stone against the entrance to the tomb and went away.\n    61. Mary Magdalene and the other Mary were sitting there opposite the tomb.\n    62. The next day, which is the day after Preparation Day, the chief priests and Pharisees assembled before Pilate\n    63. and said, “Sir, we remember that while He was alive that deceiver said, ‘After three days I will rise again.’\n    64. So give the order that the tomb be secured until the third day. Otherwise, His disciples may come and steal Him away and tell the people He has risen from the dead, and the last deception will be worse than the first.”\n    65. “Go and make the tomb as secure as you know how,” Pilate answered.\n    66. And they went and made the tomb secure by sealing the stone and posting a guard.\n\n### Stands out\n\n### Means\n\n### For me\n\n### Prayer\n\n## Day 4 — Luke 23:26-56\n\n??? quote \"Luke 23:26-56\"\n\n    26. As the soldiers led Him away, they seized Simon of Cyrene on his way in from the country, and put the cross on him to carry behind Jesus.\n    27. A great number of people followed Him, along with women who were mourning and wailing for Him.\n    28. But Jesus turned to them and said, “Daughters of Jerusalem, do not weep for Me, but weep for yourselves and for your children.\n    29. Look, the days are coming when people will say, ‘Blessed are the barren women, the wombs that never bore, and the breasts that never nursed!’\n    30. At that time they will say to the mountains, ‘Fall on us!’ and to the hills, ‘Cover us!’\n    31. For if men do these things while the tree is green, what will happen when it is dry?”\n    32. Two others, who were criminals, were also led away to be executed with Jesus.\n    33. When they came to the place called The Skull, they crucified Him there, along with the criminals, one on His right hand and the other on His left.\n    34. Then Jesus said, “Father, forgive them, for they do not know what they are doing.” And they divided up His garments by casting lots.\n    35. The people stood watching, and the rulers sneered at Him, saying, “He saved others; let Him save Himself if He is the Christ of God, the Chosen One.”\n    36. The soldiers also mocked Him and came up to offer Him sour wine.\n    37. “If You are the King of the Jews,” they said, “save Yourself!”\n    38. Above Him was posted an inscription: “THIS IS THE KING OF THE JEWS.”\n    39. One of the criminals who hung there heaped abuse on Him: “Are You not the Christ? Save Yourself and us!”\n    40. But the other criminal rebuked him. “Do you not even fear God,” he said, “since you are under the same judgment?\n    41. We are punished justly, for we are receiving what our actions deserve. But this man has done nothing wrong.”\n    42. Then he said, “Jesus, remember me when You come into Your kingdom!”\n    43. And Jesus said to him, “Truly I tell you, today you will be with Me in Paradise.”\n    44. It was now about the sixth hour, and darkness came over all the land until the ninth hour.\n    45. The sun was darkened, and the veil of the temple was torn down the middle.\n    46. Then Jesus called out in a loud voice, “Father, into Your hands I commit My Spirit.” And when He had said this, He breathed His last.\n    47. When the centurion saw what had happened, he gave glory to God and said, “Surely this was a righteous man.”\n    48. When all the people who had gathered to witness this sight saw what had taken place, they returned home, beating their breasts.\n    49. But all those who knew Jesus, including the women who had followed Him from Galilee, stood at a distance watching these things.\n    50. Now there was a righteous and devout man named Joseph, who was a member of the Council,\n    51. who had not consented to their plan and action. He was from the Judean town of Arimathea, and he was waiting for the kingdom of God.\n    52. He went to Pilate to ask for the body of Jesus.\n    53. Then he brought it down, wrapped it in a linen cloth, and placed it in a tomb cut out of the rock, where no one had yet been laid.\n    54. It was Preparation Day, and the Sabbath was about to begin.\n    55. The women who had come with Jesus from Galilee followed, and they saw the tomb and how His body was placed.\n    56. Then they returned to prepare spices and perfumes. And they rested on the Sabbath, according to the commandment.\n\n### Stands out\n\n### Means\n\n### For me\n\n### Prayer\n\n## Day 5 — John 19\n\n??? quote \"John 19\"\n\n    1. Then Pilate took Jesus and had Him flogged.\n    2. The soldiers twisted together a crown of thorns, put it on His head, and dressed Him in a purple robe.\n    3. And they went up to Him again and again, saying, “Hail, King of the Jews!” and slapping Him in the face.\n    4. Once more Pilate came out and said to the Jews, “Look, I am bringing Him out to you to let you know that I find no basis for a charge against Him.”\n    5. So Jesus came out wearing the crown of thorns and the purple robe. And Pilate said to them, “Here is the man!”\n    6. As soon as the chief priests and officers saw Him, they shouted, “Crucify Him! Crucify Him!” Pilate told them, “You take Him and crucify Him. As for me, I find no basis for a charge against Him.”\n    7. “We have a law,” answered the Jews, “and according to that law He must die, because He declared Himself to be the Son of God.”\n    8. When Pilate heard this statement, he was even more afraid.\n    9. He went back into the Praetorium and asked Jesus, “Where are You from?” But Jesus gave no answer.\n    10. So Pilate said to Him, “Do You refuse to speak to me? Do You not know that I have authority to release You and authority to crucify You?”\n    11. Jesus answered, “You would have no authority over Me if it were not given to you from above. Therefore the one who handed Me over to you is guilty of greater sin.”\n    12. From then on, Pilate tried to release Him, but the Jews kept shouting, “If you release this man, you are no friend of Caesar. Anyone who declares himself a king is defying Caesar.”\n    13. When Pilate heard these words, he brought Jesus out and sat down on the judgment seat at a place called the Stone Pavement, which in Hebrew is Gabbatha.\n    14. It was the day of Preparation for the Passover, about the sixth hour. And Pilate said to the Jews, “Here is your King!”\n    15. At this, they shouted, “Away with Him! Away with Him! Crucify Him!” Pilate asked, “Shall I crucify your King?” “We have no king but Caesar,” replied the chief priests.\n    16. Then Pilate handed Him over to be crucified, and the soldiers took Him away.\n    17. Carrying His own cross, He went out to the place of the Skull, which in Hebrew is called Golgotha.\n    18. There they crucified Him, and with Him two others, one on each side, with Jesus in the middle.\n    19. Pilate also had a notice posted on the cross. It read: “JESUS OF NAZARETH, THE KING OF THE JEWS.”\n    20. Many of the Jews read this sign, because the place where Jesus was crucified was near the city, and it was written in Aramaic, Latin, and Greek.\n    21. So the chief priests of the Jews said to Pilate, “Do not write, ‘The King of the Jews,’ but, ‘This man said, I am the King of the Jews.’”\n    22. Pilate answered, “What I have written, I have written.”\n    23. When the soldiers had crucified Jesus, they divided His garments into four parts, a part for each soldier, and the tunic remained. It was seamless, woven in one piece from top to bottom.\n    24. So they said to one another, “Let us not tear it; instead, let us cast lots to see who will get it.” This was to fulfill the Scripture: “They divided My garments among them, and for My clothing they cast lots.” So that is what the soldiers did.\n    25. Near the cross of Jesus stood His mother and His mother’s sister, Mary the wife of Clopas, and Mary Magdalene.\n    26. When Jesus saw His mother and the disciple whom He loved standing nearby, He said to His mother, “Woman, here is your son.”\n    27. Then He said to the disciple, “Here is your mother.” So from that hour, the disciple took her into his home.\n    28. After this, knowing that everything had now been accomplished, and to fulfill the Scripture, Jesus said, “I am thirsty.”\n    29. A jar of sour wine was sitting there. So they soaked a sponge in the wine, put it on a hyssop stalk, and lifted it to His mouth.\n    30. When Jesus had received the sour wine, He said, “It is finished.” And bowing His head, He yielded up His spirit.\n    31. It was the day of Preparation, and the next day was a special Sabbath. In order to avoid leaving the bodies on the cross during the Sabbath, the Jews asked Pilate to have the legs broken and the bodies removed.\n    32. So the soldiers came and broke the legs of the first man who had been crucified with Jesus, and those of the other.\n    33. But when they came to Jesus and saw that He was already dead, they did not break His legs.\n    34. Instead, one of the soldiers pierced His side with a spear, and immediately blood and water flowed out.\n    35. The one who saw it has testified, and his testimony is true. He knows that he is telling the truth, so that you also may believe.\n    36. Now these things happened so that the Scripture would be fulfilled: “Not one of His bones will be broken.”\n    37. And, as another Scripture says: “They will look on the One they have pierced.”\n    38. After these things, Joseph of Arimathea, who was a disciple of Jesus (but secretly for fear of the Jews), asked Pilate to let him remove the body of Jesus. Pilate gave him permission, so he came and removed His body.\n    39. Nicodemus, who had previously come to Jesus at night, also brought a mixture of myrrh and aloes, about seventy-five pounds.\n    40. So they took the body of Jesus and wrapped it in linen cloths with the spices, according to the Jewish burial custom.\n    41. Now there was a garden in the place where Jesus was crucified, and in the garden a new tomb in which no one had yet been laid.\n    42. And because it was the Jewish day of Preparation and the tomb was nearby, they laid Jesus there.\n\n### Stands out\n\n### Means\n\n### For me\n\n### Prayer\n\n---\n\n## Prayer Requests\n\n- [ ] \u003cname\u003e — \u003crequest\u003e\n\n### Answered / Updates\n\n- \u003cfollow-ups from previous weeks\u003e\n\n## Meeting Notes\n\n\u003cwhat the group discussed, insights from others\u003e\n",
      "summary": "!!! quote \"Psalm 119:9, 11\"",
      "date_published": "2026-09-25T06:00:00Z",
      "date_modified": "2026-09-25T06:00:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "olivet",
        "faith",
        "mens-group"
      ]
    },
    {
      "id": "https://pype.dev/olivet-mens-group-2026-week-35/",
      "url": "https://pype.dev/olivet-mens-group-2026-week-35/",
      "title": "Men’s Group - Week 35",
      "content_html": "\u003ch1 id=\"week-35-september-13-19-2026\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWeek 35 — September 13 – 19, 2026\u003c/span\u003e\u003c/h1\u003e\n\u003ch3 id=\"meeting-friday-september-18\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMeeting: Friday, September 18\u003c/span\u003e \u003ca href=\"#meeting-friday-september-18\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch3 id=\"memory-verse-hebrews-2-18\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMemory Verse: Hebrews 2:18\u003c/span\u003e \u003ca href=\"#memory-verse-hebrews-2-18\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003eHebrews 2:18\u003c/p\u003e\n\u003col start=\"18\"\u003e\n\u003cli\u003eBecause He Himself suffered when He was tempted, He is able to help those who are being tempted.\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/div\u003e\n\u003ch2 id=\"readings\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eReadings\u003c/span\u003e \u003ca href=\"#readings\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e Day 1: John 11\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e Day 2: Matthew 21:1-13\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e Day 3: John 13\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e Day 4: John 14-15\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e Day 5: John 16, Matthew 24:1-31\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"day-1-john-11\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDay 1 — John 11\u003c/span\u003e \u003ca href=\"#day-1-john-11\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cdetails class=\"admonition quote\"\u003e\n\u003csummary class=\"admonition-title\"\u003eJohn 11\u003c/summary\u003e\n\u003col\u003e\n\u003cli\u003eAt this time a man named Lazarus was sick. He lived in Bethany, the village of Mary and her sister Martha.\u003c/li\u003e\n\u003cli\u003e(Mary, whose brother Lazarus was sick, was to anoint the Lord with perfume and wipe His feet with her hair.)\u003c/li\u003e\n\u003cli\u003eSo the sisters sent word to Jesus, “Lord, the one You love is sick.”\u003c/li\u003e\n\u003cli\u003eWhen Jesus heard this, He said, “This sickness will not end in death. No, it is for the glory of God, so that the Son of God may be glorified through it.”\u003c/li\u003e\n\u003cli\u003eNow Jesus loved Martha and her sister and Lazarus.\u003c/li\u003e\n\u003cli\u003eSo on hearing that Lazarus was sick, He stayed where He was for two days,\u003c/li\u003e\n\u003cli\u003eand then He said to the disciples, “Let us go back to Judea.”\u003c/li\u003e\n\u003cli\u003e“Rabbi,” they replied, “the Jews just tried to stone You, and You are going back there?”\u003c/li\u003e\n\u003cli\u003eJesus answered, “Are there not twelve hours of daylight? If anyone walks in the daytime, he will not stumble, because he sees by the light of this world.\u003c/li\u003e\n\u003cli\u003eBut if anyone walks at night, he will stumble, because he has no light.”\u003c/li\u003e\n\u003cli\u003eAfter He had said this, He told them, “Our friend Lazarus has fallen asleep, but I am going there to wake him up.”\u003c/li\u003e\n\u003cli\u003eHis disciples replied, “Lord, if he is sleeping, he will get better.”\u003c/li\u003e\n\u003cli\u003eThey thought that Jesus was talking about actual sleep, but He was speaking about the death of Lazarus.\u003c/li\u003e\n\u003cli\u003eSo Jesus told them plainly, “Lazarus is dead,\u003c/li\u003e\n\u003cli\u003eand for your sake I am glad I was not there, so that you may believe. But let us go to him.”\u003c/li\u003e\n\u003cli\u003eThen Thomas called Didymus said to his fellow disciples, “Let us also go, so that we may die with Him.”\u003c/li\u003e\n\u003cli\u003eWhen Jesus arrived, He found that Lazarus had already spent four days in the tomb.\u003c/li\u003e\n\u003cli\u003eNow Bethany was near Jerusalem, a little less than two miles away,\u003c/li\u003e\n\u003cli\u003eand many of the Jews had come to Martha and Mary to console them in the loss of their brother.\u003c/li\u003e\n\u003cli\u003eSo when Martha heard that Jesus was coming, she went out to meet Him, but Mary stayed at home.\u003c/li\u003e\n\u003cli\u003eMartha said to Jesus, “Lord, if You had been here, my brother would not have died.\u003c/li\u003e\n\u003cli\u003eBut even now I know that God will give You whatever You ask of Him.”\u003c/li\u003e\n\u003cli\u003e“Your brother will rise again,” Jesus told her.\u003c/li\u003e\n\u003cli\u003eMartha replied, “I know that he will rise again in the resurrection at the last day.”\u003c/li\u003e\n\u003cli\u003eJesus said to her, “I am the resurrection and the life. Whoever believes in Me will live, even though he dies.\u003c/li\u003e\n\u003cli\u003eAnd everyone who lives and believes in Me will never die. Do you believe this?”\u003c/li\u003e\n\u003cli\u003e“Yes, Lord,” she answered, “I believe that You are the Christ, the Son of God, who was to come into the world.”\u003c/li\u003e\n\u003cli\u003eAfter Martha had said this, she went back and called her sister Mary aside to tell her, “The Teacher is here and is asking for you.”\u003c/li\u003e\n\u003cli\u003eAnd when Mary heard this, she got up quickly and went to Him.\u003c/li\u003e\n\u003cli\u003eNow Jesus had not yet entered the village, but was still at the place where Martha had met Him.\u003c/li\u003e\n\u003cli\u003eWhen the Jews who were in the house consoling Mary saw how quickly she got up and went out, they followed her, supposing she was going to the tomb to mourn there.\u003c/li\u003e\n\u003cli\u003eWhen Mary came to Jesus and saw Him, she fell at His feet and said, “Lord, if You had been here, my brother would not have died.”\u003c/li\u003e\n\u003cli\u003eWhen Jesus saw her weeping, and the Jews who had come with her also weeping, He was deeply moved in spirit and troubled.\u003c/li\u003e\n\u003cli\u003e“Where have you put him?” He asked.\n“Come and see, Lord,” they answered.\u003c/li\u003e\n\u003cli\u003eJesus wept.\u003c/li\u003e\n\u003cli\u003eThen the Jews said, “See how He loved him!”\u003c/li\u003e\n\u003cli\u003eBut some of them asked, “Could not this man who opened the eyes of the blind also have kept Lazarus from dying?”\u003c/li\u003e\n\u003cli\u003eJesus, once again deeply moved, came to the tomb. It was a cave with a stone laid across the entrance.\u003c/li\u003e\n\u003cli\u003e“Take away the stone,” Jesus said.\n“Lord, by now he stinks,” said Martha, the sister of the dead man. “It has already been four days.”\u003c/li\u003e\n\u003cli\u003eJesus replied, “Did I not tell you that if you believed, you would see the glory of God?”\u003c/li\u003e\n\u003cli\u003eSo they took away the stone. Then Jesus lifted His eyes upward and said, “Father, I thank You that You have heard Me.\u003c/li\u003e\n\u003cli\u003eI knew that You always hear Me, but I say this for the benefit of the people standing here, so they may believe that You sent Me.”\u003c/li\u003e\n\u003cli\u003eAfter Jesus had said this, He called out in a loud voice, “Lazarus, come out!”\u003c/li\u003e\n\u003cli\u003eThe man who had been dead came out with his hands and feet bound in strips of linen, and his face wrapped in a cloth.\n“Unwrap him and let him go,” Jesus told them.\u003c/li\u003e\n\u003cli\u003eTherefore many of the Jews who had come to Mary, and had seen what Jesus did, believed in Him.\u003c/li\u003e\n\u003cli\u003eBut some of them went to the Pharisees and told them what Jesus had done.\u003c/li\u003e\n\u003cli\u003eThen the chief priests and Pharisees convened the Sanhedrin and said, “What are we to do? This man is performing many signs.\u003c/li\u003e\n\u003cli\u003eIf we let Him go on like this, everyone will believe in Him, and then the Romans will come and take away both our place and our nation.”\u003c/li\u003e\n\u003cli\u003eBut one of them, named Caiaphas, who was high priest that year, said to them, “You know nothing at all!\u003c/li\u003e\n\u003cli\u003eYou do not realize that it is better for you that one man die for the people than that the whole nation perish.”\u003c/li\u003e\n\u003cli\u003eCaiaphas did not say this on his own. Instead, as high priest that year, he was prophesying that Jesus would die for the nation,\u003c/li\u003e\n\u003cli\u003eand not only for the nation, but also for the scattered children of God, to gather them together into one.\u003c/li\u003e\n\u003cli\u003eSo from that day on they plotted to kill Him.\u003c/li\u003e\n\u003cli\u003eAs a result, Jesus no longer went about publicly among the Jews, but He withdrew to a town called Ephraim in an area near the wilderness. And He stayed there with the disciples.\u003c/li\u003e\n\u003cli\u003eNow the Jewish Passover was near, and many people went up from the country to Jerusalem to purify themselves before the Passover.\u003c/li\u003e\n\u003cli\u003eThey kept looking for Jesus and asking one another as they stood in the temple courts, “What do you think? Will He come to the feast at all?”\u003c/li\u003e\n\u003cli\u003eBut the chief priests and Pharisees had given orders that anyone who knew where He was must report it, so that they could arrest Him.\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/details\u003e\n\u003ch3 id=\"stands-out\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStands out\u003c/span\u003e \u003ca href=\"#stands-out\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eMartha said to Jesus, “Lord, if You had been here, my brother would not have died.\u003c/li\u003e\n\u003cli\u003eWhen Mary came to Jesus and saw Him, she fell at His feet and said, “Lord, if You had been here, my brother would not have died.”\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"means\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMeans\u003c/span\u003e \u003ca href=\"#means\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eWe think we know what would have happened\u003c/p\u003e\n\u003ch3 id=\"for-me\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFor me\u003c/span\u003e \u003ca href=\"#for-me\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eMy ebenezeer page feels relevant when thinking about waiting on the Lord\u003c/p\u003e\n\u003cdetails class=\"admonition quote\"\u003e\n\u003csummary class=\"admonition-title\"\u003ePsalm 40:1–2 (LEB)\u003c/summary\u003e\n\u003cp\u003e1 I waited patiently for Yahweh,  And he inclined to me  and heard my cry for help.\n2 And so he brought me up from the roaring pit,  from the miry clay.  And he put my feet upon a rock;  he made my steps steady.\u003c/p\u003e\n\u003c/details\u003e\n\u003ch3 id=\"prayer\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePrayer\u003c/span\u003e \u003ca href=\"#prayer\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch2 id=\"day-2-matthew-21-1-13\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDay 2 — Matthew 21:1-13\u003c/span\u003e \u003ca href=\"#day-2-matthew-21-1-13\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cdetails class=\"admonition quote\"\u003e\n\u003csummary class=\"admonition-title\"\u003eMatthew 21:1-13\u003c/summary\u003e\n\u003col\u003e\n\u003cli\u003eAs they approached Jerusalem and came to Bethphage on the Mount of Olives, Jesus sent out two disciples,\u003c/li\u003e\n\u003cli\u003esaying to them, “Go into the village ahead of you, and at once you will find a donkey tied there, with her colt beside her. Untie them and bring them to Me.\u003c/li\u003e\n\u003cli\u003eIf anyone questions you, tell him that the Lord needs them, and he will send them right away.”\u003c/li\u003e\n\u003cli\u003eThis took place to fulfill what was spoken through the prophet:\u003c/li\u003e\n\u003cli\u003e“Say to the Daughter of Zion,\n‘See, your King comes to you,\ngentle and riding on a donkey,\non a colt, the foal of a donkey.’”\u003c/li\u003e\n\u003cli\u003eSo the disciples went and did as Jesus had directed them.\u003c/li\u003e\n\u003cli\u003eThey brought the donkey and the colt and laid their cloaks on them, and Jesus sat on them.\u003c/li\u003e\n\u003cli\u003eA massive crowd spread their cloaks on the road, while others cut branches from the trees and spread them on the road.\u003c/li\u003e\n\u003cli\u003eThe crowds that went ahead of Him and those that followed were shouting:\n“Hosanna to the Son of David!”\n“Blessed is He who comes in the name of the Lord!”\n“Hosanna in the highest!”\u003c/li\u003e\n\u003cli\u003eWhen Jesus had entered Jerusalem, the whole city was stirred and asked, “Who is this?”\u003c/li\u003e\n\u003cli\u003eThe crowds replied, “This is Jesus, the prophet from Nazareth in Galilee.”\u003c/li\u003e\n\u003cli\u003eThen Jesus entered the temple courts and drove out all who were buying and selling there. He overturned the tables of the money changers and the seats of those selling doves.\u003c/li\u003e\n\u003cli\u003eAnd He declared to them, “It is written: ‘My house will be called a house of prayer.’ But you are making it ‘a den of robbers.’ ”\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/details\u003e\n\u003ch3 id=\"stands-out-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStands out\u003c/span\u003e \u003ca href=\"#stands-out-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch3 id=\"means-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMeans\u003c/span\u003e \u003ca href=\"#means-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch3 id=\"for-me-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFor me\u003c/span\u003e \u003ca href=\"#for-me-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch3 id=\"prayer-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePrayer\u003c/span\u003e \u003ca href=\"#prayer-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch2 id=\"day-3-john-13\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDay 3 — John 13\u003c/span\u003e \u003ca href=\"#day-3-john-13\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cdetails class=\"admonition quote\"\u003e\n\u003csummary class=\"admonition-title\"\u003eJohn 13\u003c/summary\u003e\n\u003col\u003e\n\u003cli\u003eIt was now just before the Passover Feast, and Jesus knew that His hour had come to leave this world and return to the Father. Having loved His own who were in the world, He loved them to the very end.\u003c/li\u003e\n\u003cli\u003eThe evening meal was underway, and the devil had already put into the heart of Judas, the son of Simon Iscariot, to betray Jesus.\u003c/li\u003e\n\u003cli\u003eJesus knew that the Father had delivered all things into His hands, and that He had come from God and was returning to God.\u003c/li\u003e\n\u003cli\u003eSo He got up from the supper, laid aside His outer garments, and wrapped a towel around His waist.\u003c/li\u003e\n\u003cli\u003eAfter that, He poured water into a basin and began to wash the disciples’ feet and dry them with the towel that was around Him.\u003c/li\u003e\n\u003cli\u003eHe came to Simon Peter, who asked Him, “Lord, are You going to wash my feet?”\u003c/li\u003e\n\u003cli\u003eJesus replied, “You do not realize now what I am doing, but later you will understand.”\u003c/li\u003e\n\u003cli\u003e“Never shall You wash my feet!” Peter told Him.\nJesus answered, “Unless I wash you, you have no part with Me.”\u003c/li\u003e\n\u003cli\u003e“Then, Lord,” Simon Peter replied, “not only my feet, but my hands and my head as well!”\u003c/li\u003e\n\u003cli\u003eJesus told him, “Whoever has already bathed needs only to wash his feet, and he will be completely clean. And you are clean, though not all of you.”\u003c/li\u003e\n\u003cli\u003eFor He knew who would betray Him. That is why He said, “Not all of you are clean.”\u003c/li\u003e\n\u003cli\u003eWhen Jesus had washed their feet and put on His outer garments, He reclined with them again and asked, “Do you know what I have done for you?\u003c/li\u003e\n\u003cli\u003eYou call Me Teacher and Lord, and rightly so, because I am.\u003c/li\u003e\n\u003cli\u003eSo if I, your Lord and Teacher, have washed your feet, you also should wash one another’s feet.\u003c/li\u003e\n\u003cli\u003eI have set you an example so that you should do as I have done for you.\u003c/li\u003e\n\u003cli\u003eTruly, truly, I tell you, no servant is greater than his master, nor is a messenger greater than the one who sent him.\u003c/li\u003e\n\u003cli\u003eIf you know these things, you will be blessed if you do them.\u003c/li\u003e\n\u003cli\u003eI am not speaking about all of you; I know whom I have chosen. But this is to fulfill the Scripture: ‘The one who shares My bread has lifted up his heel against Me.’\u003c/li\u003e\n\u003cli\u003eI am telling you now before it happens, so that when it comes to pass, you will believe that I am He.\u003c/li\u003e\n\u003cli\u003eTruly, truly, I tell you, whoever receives the one I send receives Me, and whoever receives Me receives the One who sent Me.”\u003c/li\u003e\n\u003cli\u003eAfter Jesus had said this, He became troubled in spirit and testified, “Truly, truly, I tell you, one of you will betray Me.”\u003c/li\u003e\n\u003cli\u003eThe disciples looked at one another, perplexed as to which of them He meant.\u003c/li\u003e\n\u003cli\u003eOne of His disciples, the one whom Jesus loved, was reclining at His side.\u003c/li\u003e\n\u003cli\u003eSo Simon Peter motioned to him to ask Jesus which one He was talking about.\u003c/li\u003e\n\u003cli\u003eLeaning back against Jesus, he asked, “Lord, who is it?”\u003c/li\u003e\n\u003cli\u003eJesus answered, “It is the one to whom I give this morsel after I have dipped it.” Then He dipped the morsel and gave it to Judas son of Simon Iscariot.\u003c/li\u003e\n\u003cli\u003eAnd when Judas had taken the morsel, Satan entered into him.\nThen Jesus said to Judas, “What you are about to do, do quickly.”\u003c/li\u003e\n\u003cli\u003eBut no one at the table knew why Jesus had said this to him.\u003c/li\u003e\n\u003cli\u003eSince Judas kept the money bag, some thought that Jesus was telling him to buy what was needed for the feast, or to give something to the poor.\u003c/li\u003e\n\u003cli\u003eAs soon as he had received the morsel, Judas went out into the night.\u003c/li\u003e\n\u003cli\u003eWhen Judas had gone out, Jesus said, “Now the Son of Man is glorified, and God is glorified in Him.\u003c/li\u003e\n\u003cli\u003eIf God is glorified in Him, God will also glorify the Son in Himself—and will glorify Him at once.\u003c/li\u003e\n\u003cli\u003eLittle children, I am with you only a little while longer. You will look for Me, and as I said to the Jews, so now I say to you: ‘Where I am going, you cannot come.’\u003c/li\u003e\n\u003cli\u003eA new commandment I give you: Love one another. As I have loved you, so you also must love one another.\u003c/li\u003e\n\u003cli\u003eBy this everyone will know that you are My disciples, if you love one another.”\u003c/li\u003e\n\u003cli\u003e“Lord, where are You going?” Simon Peter asked.\nJesus answered, “Where I am going, you cannot follow Me now, but you will follow later.”\u003c/li\u003e\n\u003cli\u003e“Lord,” said Peter, “why can’t I follow You now? I will lay down my life for You.”\u003c/li\u003e\n\u003cli\u003e“Will you lay down your life for Me?” Jesus replied. “Truly, truly, I tell you, before the rooster crows, you will deny Me three times.\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/details\u003e\n\u003ch3 id=\"stands-out-2\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStands out\u003c/span\u003e \u003ca href=\"#stands-out-2\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre\u003e\u003ccode\u003e6. He came to Simon Peter, who asked Him, “Lord, are You going to wash my feet?”\n7. Jesus replied, “You do not realize now what I am doing, but later you will understand.”\n8. “Never shall You wash my feet!” Peter told Him.\nJesus answered, “Unless I wash you, you have no part with Me.”\n9. “Then, Lord,” Simon Peter replied, “not only my feet, but my hands and my head as well!”\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3 id=\"means-2\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMeans\u003c/span\u003e \u003ca href=\"#means-2\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch3 id=\"for-me-2\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFor me\u003c/span\u003e \u003ca href=\"#for-me-2\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch3 id=\"prayer-2\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePrayer\u003c/span\u003e \u003ca href=\"#prayer-2\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch2 id=\"day-4-john-14-15\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDay 4 — John 14-15\u003c/span\u003e \u003ca href=\"#day-4-john-14-15\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cdetails class=\"admonition quote\"\u003e\n\u003csummary class=\"admonition-title\"\u003eJohn 14\u003c/summary\u003e\n\u003col\u003e\n\u003cli\u003e“Do not let your hearts be troubled. You believe in God; believe in Me as well.\u003c/li\u003e\n\u003cli\u003eIn My Father’s house are many rooms. If it were not so, would I have told you that I am going there to prepare a place for you?\u003c/li\u003e\n\u003cli\u003eAnd if I go and prepare a place for you, I will come back and welcome you into My presence, so that you also may be where I am.\u003c/li\u003e\n\u003cli\u003eYou know the way to the place where I am going. ”\u003c/li\u003e\n\u003cli\u003e“Lord,” said Thomas, “we do not know where You are going, so how can we know the way?”\u003c/li\u003e\n\u003cli\u003eJesus answered, “I am the way and the truth and the life. No one comes to the Father except through Me.\u003c/li\u003e\n\u003cli\u003eIf you had known Me, you would know My Father as well. From now on you do know Him and have seen Him.”\u003c/li\u003e\n\u003cli\u003ePhilip said to Him, “Lord, show us the Father, and that will be enough for us.”\u003c/li\u003e\n\u003cli\u003eJesus replied, “Philip, I have been with you all this time, and still you do not know Me? Anyone who has seen Me has seen the Father. How can you say, ‘Show us the Father’?\u003c/li\u003e\n\u003cli\u003eDo you not believe that I am in the Father and the Father is in Me? The words I say to you, I do not speak on My own. Instead, it is the Father dwelling in Me, performing His works.\u003c/li\u003e\n\u003cli\u003eBelieve Me that I am in the Father and the Father is in Me—or at least believe on account of the works themselves.\u003c/li\u003e\n\u003cli\u003eTruly, truly, I tell you, whoever believes in Me will also do the works that I am doing. He will do even greater things than these, because I am going to the Father.\u003c/li\u003e\n\u003cli\u003eAnd I will do whatever you ask in My name, so that the Father may be glorified in the Son.\u003c/li\u003e\n\u003cli\u003eIf you ask Me for anything in My name, I will do it.\u003c/li\u003e\n\u003cli\u003eIf you love Me, you will keep My commandments.\u003c/li\u003e\n\u003cli\u003eAnd I will ask the Father, and He will give you another Advocate to be with you forever—\u003c/li\u003e\n\u003cli\u003ethe Spirit of truth. The world cannot receive Him, because it neither sees Him nor knows Him. But you do know Him, for He abides with you and will be in you.\u003c/li\u003e\n\u003cli\u003eI will not leave you as orphans; I will come to you.\u003c/li\u003e\n\u003cli\u003eIn a little while the world will see Me no more, but you will see Me. Because I live, you also will live.\u003c/li\u003e\n\u003cli\u003eOn that day you will know that I am in My Father, and you are in Me, and I am in you.\u003c/li\u003e\n\u003cli\u003eWhoever has My commandments and keeps them is the one who loves Me. The one who loves Me will be loved by My Father, and I will love him and reveal Myself to him.”\u003c/li\u003e\n\u003cli\u003eJudas (not Iscariot) asked Him, “Lord, why are You going to reveal Yourself to us and not to the world?”\u003c/li\u003e\n\u003cli\u003eJesus replied, “If anyone loves Me, he will keep My word. My Father will love him, and We will come to him and make Our home with him.\u003c/li\u003e\n\u003cli\u003eWhoever does not love Me does not keep My words. The word that you hear is not My own, but it is from the Father who sent Me.\u003c/li\u003e\n\u003cli\u003eAll this I have spoken to you while I am still with you.\u003c/li\u003e\n\u003cli\u003eBut the Advocate, the Holy Spirit, whom the Father will send in My name, will teach you all things and will remind you of everything I have told you.\u003c/li\u003e\n\u003cli\u003ePeace I leave with you; My peace I give to you. I do not give to you as the world gives. Do not let your hearts be troubled; do not be afraid.\u003c/li\u003e\n\u003cli\u003eYou heard Me say, ‘I am going away, and I am coming back to you.’ If you loved Me, you would rejoice that I am going to the Father, because the Father is greater than I.\u003c/li\u003e\n\u003cli\u003eAnd now I have told you before it happens, so that when it does happen, you will believe.\u003c/li\u003e\n\u003cli\u003eI will not speak with you much longer, for the prince of this world is coming, and he has no claim on Me.\u003c/li\u003e\n\u003cli\u003eBut I do exactly what the Father has commanded Me, so that the world may know that I love the Father.\nGet up! Let us go on from here.\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/details\u003e\n\u003cdetails class=\"admonition quote\"\u003e\n\u003csummary class=\"admonition-title\"\u003eJohn 15\u003c/summary\u003e\n\u003col\u003e\n\u003cli\u003e“I am the true vine, and My Father is the keeper of the vineyard.\u003c/li\u003e\n\u003cli\u003eHe cuts off every branch in Me that bears no fruit, and every branch that does bear fruit, He prunes to make it even more fruitful.\u003c/li\u003e\n\u003cli\u003eYou are already clean because of the word I have spoken to you.\u003c/li\u003e\n\u003cli\u003eRemain in Me, and I will remain in you. Just as no branch can bear fruit by itself unless it remains in the vine, neither can you bear fruit unless you remain in Me.\u003c/li\u003e\n\u003cli\u003eI am the vine and you are the branches. The one who remains in Me, and I in him, will bear much fruit. For apart from Me you can do nothing.\u003c/li\u003e\n\u003cli\u003eIf anyone does not remain in Me, he is like a branch that is thrown away and withers. Such branches are gathered up, thrown into the fire, and burned.\u003c/li\u003e\n\u003cli\u003eIf you remain in Me and My words remain in you, ask whatever you wish, and it will be done for you.\u003c/li\u003e\n\u003cli\u003eThis is to My Father’s glory, that you bear much fruit, proving yourselves to be My disciples.\u003c/li\u003e\n\u003cli\u003eAs the Father has loved Me, so have I loved you. Remain in My love.\u003c/li\u003e\n\u003cli\u003eIf you keep My commandments, you will remain in My love, just as I have kept My Father’s commandments and remain in His love.\u003c/li\u003e\n\u003cli\u003eI have told you these things so that My joy may be in you and your joy may be complete.\u003c/li\u003e\n\u003cli\u003eThis is My commandment, that you love one another as I have loved you.\u003c/li\u003e\n\u003cli\u003eGreater love has no one than this, that he lay down his life for his friends.\u003c/li\u003e\n\u003cli\u003eYou are My friends if you do what I command you.\u003c/li\u003e\n\u003cli\u003eNo longer do I call you servants, for a servant does not understand what his master is doing. But I have called you friends, because everything I have learned from My Father I have made known to you.\u003c/li\u003e\n\u003cli\u003eYou did not choose Me, but I chose you. And I appointed you to go and bear fruit—fruit that will remain—so that whatever you ask the Father in My name, He will give you.\u003c/li\u003e\n\u003cli\u003eThis is My command to you: Love one another.\u003c/li\u003e\n\u003cli\u003eIf the world hates you, understand that it hated Me first.\u003c/li\u003e\n\u003cli\u003eIf you were of the world, it would love you as its own. Instead, the world hates you, because you are not of the world, but I have chosen you out of the world.\u003c/li\u003e\n\u003cli\u003eRemember the word that I spoke to you: ‘No servant is greater than his master.’ If they persecuted Me, they will persecute you as well; if they kept My word, they will keep yours as well.\u003c/li\u003e\n\u003cli\u003eBut they will treat you like this because of My name, since they do not know the One who sent Me.\u003c/li\u003e\n\u003cli\u003eIf I had not come and spoken to them, they would not be guilty of sin. Now, however, they have no excuse for their sin.\u003c/li\u003e\n\u003cli\u003eWhoever hates Me hates My Father as well.\u003c/li\u003e\n\u003cli\u003eIf I had not done among them the works that no one else did, they would not be guilty of sin; but now they have seen and hated both Me and My Father.\u003c/li\u003e\n\u003cli\u003eBut this is to fulfill what is written in their Law: ‘They hated Me without reason.’\u003c/li\u003e\n\u003cli\u003eWhen the Advocate comes, whom I will send to you from the Father—the Spirit of truth who proceeds from the Father—He will testify about Me.\u003c/li\u003e\n\u003cli\u003eAnd you also must testify, because you have been with Me from the beginning.\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/details\u003e\n\u003ch3 id=\"stands-out-3\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStands out\u003c/span\u003e \u003ca href=\"#stands-out-3\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch3 id=\"means-3\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMeans\u003c/span\u003e \u003ca href=\"#means-3\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch3 id=\"for-me-3\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFor me\u003c/span\u003e \u003ca href=\"#for-me-3\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch3 id=\"prayer-3\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePrayer\u003c/span\u003e \u003ca href=\"#prayer-3\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch2 id=\"day-5-john-16-matthew-24-1-31\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDay 5 — John 16 \u0026amp; Matthew 24:1-31\u003c/span\u003e \u003ca href=\"#day-5-john-16-matthew-24-1-31\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cdetails class=\"admonition quote\"\u003e\n\u003csummary class=\"admonition-title\"\u003eJohn 16\u003c/summary\u003e\n\u003col\u003e\n\u003cli\u003e“I have told you these things so that you will not fall away.\u003c/li\u003e\n\u003cli\u003eThey will put you out of the synagogues. In fact, a time is coming when anyone who kills you will think he is offering a service to God.\u003c/li\u003e\n\u003cli\u003eThey will do these things because they have not known the Father or Me.\u003c/li\u003e\n\u003cli\u003eBut I have told you these things so that when their hour comes, you will remember that I told you about them. I did not tell you these things from the beginning, because I was with you.\u003c/li\u003e\n\u003cli\u003eNow, however, I am going to Him who sent Me; yet none of you asks Me, ‘Where are You going?’\u003c/li\u003e\n\u003cli\u003eInstead, your hearts are filled with sorrow because I have told you these things.\u003c/li\u003e\n\u003cli\u003eBut I tell you the truth, it is for your benefit that I am going away. Unless I go away, the Advocate will not come to you; but if I go, I will send Him to you.\u003c/li\u003e\n\u003cli\u003eAnd when He comes, He will convict the world in regard to sin and righteousness and judgment:\u003c/li\u003e\n\u003cli\u003ein regard to sin, because they do not believe in Me;\u003c/li\u003e\n\u003cli\u003ein regard to righteousness, because I am going to the Father and you will no longer see Me;\u003c/li\u003e\n\u003cli\u003eand in regard to judgment, because the prince of this world has been condemned.\u003c/li\u003e\n\u003cli\u003eI still have much to tell you, but you cannot yet bear to hear it.\u003c/li\u003e\n\u003cli\u003eHowever, when the Spirit of truth comes, He will guide you into all truth. For He will not speak on His own, but He will speak what He hears, and He will declare to you what is to come.\u003c/li\u003e\n\u003cli\u003eHe will glorify Me by taking from what is Mine and disclosing it to you.\u003c/li\u003e\n\u003cli\u003eEverything that belongs to the Father is Mine. That is why I said that the Spirit will take from what is Mine and disclose it to you.\u003c/li\u003e\n\u003cli\u003eIn a little while you will see Me no more, and then after a little while you will see Me. ”\u003c/li\u003e\n\u003cli\u003eThen some of His disciples asked one another, “Why is He telling us, ‘In a little while you will not see Me, and then after a little while you will see Me’ and ‘Because I am going to the Father’?”\u003c/li\u003e\n\u003cli\u003eThey kept asking, “Why is He saying, ‘a little while’? We do not understand what He is saying.”\u003c/li\u003e\n\u003cli\u003eAware that they wanted to question Him, Jesus said to them, “Are you asking one another why I said, ‘In a little while you will not see Me, and then after a little while you will see Me’?\u003c/li\u003e\n\u003cli\u003eTruly, truly, I tell you, you will weep and wail while the world rejoices. You will grieve, but your grief will turn to joy.\u003c/li\u003e\n\u003cli\u003eA woman has pain in childbirth because her time has come; but when she brings forth her child, she forgets her anguish because of her joy that a child has been born into the world.\u003c/li\u003e\n\u003cli\u003eSo also you have sorrow now, but I will see you again and your hearts will rejoice, and no one will take away your joy.\u003c/li\u003e\n\u003cli\u003eIn that day you will no longer ask Me anything. Truly, truly, I tell you, whatever you ask the Father in My name, He will give you.\u003c/li\u003e\n\u003cli\u003eUntil now you have not asked for anything in My name. Ask and you will receive, so that your joy may be complete.\u003c/li\u003e\n\u003cli\u003eI have spoken these things to you in figures of speech. An hour is coming when I will no longer speak to you this way, but will tell you plainly about the Father.\u003c/li\u003e\n\u003cli\u003eIn that day you will ask in My name. I am not saying that I will ask the Father on your behalf.\u003c/li\u003e\n\u003cli\u003eFor the Father Himself loves you, because you have loved Me and have believed that I came from God.\u003c/li\u003e\n\u003cli\u003eI came from the Father and entered the world. In turn, I will leave the world and go to the Father.”\u003c/li\u003e\n\u003cli\u003eHis disciples said, “See, now You are speaking plainly and without figures of speech.\u003c/li\u003e\n\u003cli\u003eNow we understand that You know all things and that You have no need for anyone to question You. Because of this, we believe that You came from God.”\u003c/li\u003e\n\u003cli\u003e“Do you finally believe?” Jesus replied.\u003c/li\u003e\n\u003cli\u003e“Look, an hour is coming and has already come when you will be scattered, each to his own home, and you will leave Me all alone. Yet I am not alone, because the Father is with Me.\u003c/li\u003e\n\u003cli\u003eI have told you these things so that in Me you may have peace. In the world you will have tribulation. But take courage; I have overcome the world!”\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/details\u003e\n\u003cdetails class=\"admonition quote\"\u003e\n\u003csummary class=\"admonition-title\"\u003eMatthew 24:1-31\u003c/summary\u003e\n\u003col\u003e\n\u003cli\u003eAs Jesus left the temple and was walking away, His disciples came up to Him to point out its buildings.\u003c/li\u003e\n\u003cli\u003e“Do you see all these things?” He replied. “Truly I tell you, not one stone here will be left on another; every one will be thrown down.”\u003c/li\u003e\n\u003cli\u003eWhile Jesus was sitting on the Mount of Olives, the disciples came to Him privately. “Tell us,” they said, “when will these things happen, and what will be the sign of Your coming and of the end of the age?”\u003c/li\u003e\n\u003cli\u003eJesus answered, “See to it that no one deceives you.\u003c/li\u003e\n\u003cli\u003eFor many will come in My name, claiming, ‘I am the Christ,’ and will deceive many.\u003c/li\u003e\n\u003cli\u003eYou will hear of wars and rumors of wars, but see to it that you are not alarmed. These things must happen, but the end is still to come.\u003c/li\u003e\n\u003cli\u003eNation will rise against nation, and kingdom against kingdom. There will be famines and earthquakes in various places.\u003c/li\u003e\n\u003cli\u003eAll these are the beginning of birth pains.\u003c/li\u003e\n\u003cli\u003eThen they will deliver you over to be persecuted and killed, and you will be hated by all nations because of My name.\u003c/li\u003e\n\u003cli\u003eAt that time many will fall away and will betray and hate one another,\u003c/li\u003e\n\u003cli\u003eand many false prophets will arise and deceive many.\u003c/li\u003e\n\u003cli\u003eBecause of the multiplication of wickedness, the love of most will grow cold.\u003c/li\u003e\n\u003cli\u003eBut the one who perseveres to the end will be saved.\u003c/li\u003e\n\u003cli\u003eAnd this gospel of the kingdom will be preached in all the world as a testimony to all nations, and then the end will come.\u003c/li\u003e\n\u003cli\u003eSo when you see standing in the holy place ‘the abomination of desolation,’ spoken of by the prophet Daniel (let the reader understand),\u003c/li\u003e\n\u003cli\u003ethen let those who are in Judea flee to the mountains.\u003c/li\u003e\n\u003cli\u003eLet no one on the housetop come down to retrieve anything from his house.\u003c/li\u003e\n\u003cli\u003eAnd let no one in the field return for his cloak.\u003c/li\u003e\n\u003cli\u003eHow miserable those days will be for pregnant and nursing mothers!\u003c/li\u003e\n\u003cli\u003ePray that your flight will not occur in the winter or on the Sabbath.\u003c/li\u003e\n\u003cli\u003eFor at that time there will be great tribulation, unseen from the beginning of the world until now, and never to be seen again.\u003c/li\u003e\n\u003cli\u003eIf those days had not been cut short, nobody would be saved. But for the sake of the elect, those days will be cut short.\u003c/li\u003e\n\u003cli\u003eAt that time, if anyone says to you, ‘Look, here is the Christ!’ or ‘There He is!’ do not believe it.\u003c/li\u003e\n\u003cli\u003eFor false Christs and false prophets will appear and perform great signs and wonders to deceive even the elect, if that were possible.\u003c/li\u003e\n\u003cli\u003eSee, I have told you in advance.\u003c/li\u003e\n\u003cli\u003eSo if they tell you, ‘There He is, in the wilderness,’ do not go out, or, ‘Here He is, in the inner rooms,’ do not believe it.\u003c/li\u003e\n\u003cli\u003eFor just as the lightning comes from the east and flashes as far as the west, so will be the coming of the Son of Man.\u003c/li\u003e\n\u003cli\u003eWherever there is a carcass, there the vultures will gather.\u003c/li\u003e\n\u003cli\u003eImmediately after the tribulation of those days:\n‘The sun will be darkened,\nand the moon will not give its light;\nthe stars will fall from the sky,\nand the powers of the heavens will be shaken.\n’\u003c/li\u003e\n\u003cli\u003eAt that time the sign of the Son of Man will appear in heaven, and all the tribes of the earth will mourn. They will see the Son of Man coming on the clouds of heaven with power and great glory.\u003c/li\u003e\n\u003cli\u003eAnd He will send out His angels with a loud trumpet call, and they will gather His elect from the four winds, from one end of the heavens to the other.\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/details\u003e\n\u003ch3 id=\"stands-out-4\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStands out\u003c/span\u003e \u003ca href=\"#stands-out-4\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch3 id=\"means-4\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMeans\u003c/span\u003e \u003ca href=\"#means-4\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch3 id=\"for-me-4\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFor me\u003c/span\u003e \u003ca href=\"#for-me-4\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch3 id=\"prayer-4\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePrayer\u003c/span\u003e \u003ca href=\"#prayer-4\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003chr\u003e\n\u003ch2 id=\"prayer-requests\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePrayer Requests\u003c/span\u003e \u003ca href=\"#prayer-requests\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e \u003cname\u003e — \u003crequest\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"answered-updates\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAnswered / Updates\u003c/span\u003e \u003ca href=\"#answered-updates\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cfollow-ups from previous weeks\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"meeting-notes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMeeting Notes\u003c/span\u003e \u003ca href=\"#meeting-notes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI read some of John 12 the morning of the meeting, not on our list but Judas\u0026rsquo; posture towards the espensive nard that Mary used to annoint is hilarious to me - very commie \u0026ldquo;why wasn\u0026rsquo;t this thing of mine used for someone else NOT sold and the money given to me to distribute to others as I see fit\u0026rdquo;\u003c/p\u003e\n",
      "content_text": "\n# Week 35 — September 13 – 19, 2026\n\n### Meeting: Friday, September 18\n\n### Memory Verse: Hebrews 2:18\n\n!!! quote \"Hebrews 2:18\"\n\n    18. Because He Himself suffered when He was tempted, He is able to help those who are being tempted.\n\n## Readings\n\n- [ ] Day 1: John 11\n- [ ] Day 2: Matthew 21:1-13\n- [ ] Day 3: John 13\n- [ ] Day 4: John 14-15\n- [ ] Day 5: John 16, Matthew 24:1-31\n\n---\n\n## Day 1 — John 11\n\n??? quote \"John 11\"\n\n    1. At this time a man named Lazarus was sick. He lived in Bethany, the village of Mary and her sister Martha.\n    2. (Mary, whose brother Lazarus was sick, was to anoint the Lord with perfume and wipe His feet with her hair.)\n    3. So the sisters sent word to Jesus, “Lord, the one You love is sick.”\n    4. When Jesus heard this, He said, “This sickness will not end in death. No, it is for the glory of God, so that the Son of God may be glorified through it.”\n    5. Now Jesus loved Martha and her sister and Lazarus.\n    6. So on hearing that Lazarus was sick, He stayed where He was for two days,\n    7. and then He said to the disciples, “Let us go back to Judea.”\n    8. “Rabbi,” they replied, “the Jews just tried to stone You, and You are going back there?”\n    9. Jesus answered, “Are there not twelve hours of daylight? If anyone walks in the daytime, he will not stumble, because he sees by the light of this world.\n    10. But if anyone walks at night, he will stumble, because he has no light.”\n    11. After He had said this, He told them, “Our friend Lazarus has fallen asleep, but I am going there to wake him up.”\n    12. His disciples replied, “Lord, if he is sleeping, he will get better.”\n    13. They thought that Jesus was talking about actual sleep, but He was speaking about the death of Lazarus.\n    14. So Jesus told them plainly, “Lazarus is dead,\n    15. and for your sake I am glad I was not there, so that you may believe. But let us go to him.”\n    16. Then Thomas called Didymus said to his fellow disciples, “Let us also go, so that we may die with Him.”\n    17. When Jesus arrived, He found that Lazarus had already spent four days in the tomb.\n    18. Now Bethany was near Jerusalem, a little less than two miles away,\n    19. and many of the Jews had come to Martha and Mary to console them in the loss of their brother.\n    20. So when Martha heard that Jesus was coming, she went out to meet Him, but Mary stayed at home.\n    21. Martha said to Jesus, “Lord, if You had been here, my brother would not have died.\n    22. But even now I know that God will give You whatever You ask of Him.”\n    23. “Your brother will rise again,” Jesus told her.\n    24. Martha replied, “I know that he will rise again in the resurrection at the last day.”\n    25. Jesus said to her, “I am the resurrection and the life. Whoever believes in Me will live, even though he dies.\n    26. And everyone who lives and believes in Me will never die. Do you believe this?”\n    27. “Yes, Lord,” she answered, “I believe that You are the Christ, the Son of God, who was to come into the world.”\n    28. After Martha had said this, she went back and called her sister Mary aside to tell her, “The Teacher is here and is asking for you.”\n    29. And when Mary heard this, she got up quickly and went to Him.\n    30. Now Jesus had not yet entered the village, but was still at the place where Martha had met Him.\n    31. When the Jews who were in the house consoling Mary saw how quickly she got up and went out, they followed her, supposing she was going to the tomb to mourn there.\n    32. When Mary came to Jesus and saw Him, she fell at His feet and said, “Lord, if You had been here, my brother would not have died.”\n    33. When Jesus saw her weeping, and the Jews who had come with her also weeping, He was deeply moved in spirit and troubled.\n    34. “Where have you put him?” He asked.\n    “Come and see, Lord,” they answered.\n    35. Jesus wept.\n    36. Then the Jews said, “See how He loved him!”\n    37. But some of them asked, “Could not this man who opened the eyes of the blind also have kept Lazarus from dying?”\n    38. Jesus, once again deeply moved, came to the tomb. It was a cave with a stone laid across the entrance.\n    39. “Take away the stone,” Jesus said.\n    “Lord, by now he stinks,” said Martha, the sister of the dead man. “It has already been four days.”\n    40. Jesus replied, “Did I not tell you that if you believed, you would see the glory of God?”\n    41. So they took away the stone. Then Jesus lifted His eyes upward and said, “Father, I thank You that You have heard Me.\n    42. I knew that You always hear Me, but I say this for the benefit of the people standing here, so they may believe that You sent Me.”\n    43. After Jesus had said this, He called out in a loud voice, “Lazarus, come out!”\n    44. The man who had been dead came out with his hands and feet bound in strips of linen, and his face wrapped in a cloth.\n    “Unwrap him and let him go,” Jesus told them.\n    45. Therefore many of the Jews who had come to Mary, and had seen what Jesus did, believed in Him.\n    46. But some of them went to the Pharisees and told them what Jesus had done.\n    47. Then the chief priests and Pharisees convened the Sanhedrin and said, “What are we to do? This man is performing many signs.\n    48. If we let Him go on like this, everyone will believe in Him, and then the Romans will come and take away both our place and our nation.”\n    49. But one of them, named Caiaphas, who was high priest that year, said to them, “You know nothing at all!\n    50. You do not realize that it is better for you that one man die for the people than that the whole nation perish.”\n    51. Caiaphas did not say this on his own. Instead, as high priest that year, he was prophesying that Jesus would die for the nation,\n    52. and not only for the nation, but also for the scattered children of God, to gather them together into one.\n    53. So from that day on they plotted to kill Him.\n    54. As a result, Jesus no longer went about publicly among the Jews, but He withdrew to a town called Ephraim in an area near the wilderness. And He stayed there with the disciples.\n    55. Now the Jewish Passover was near, and many people went up from the country to Jerusalem to purify themselves before the Passover.\n    56. They kept looking for Jesus and asking one another as they stood in the temple courts, “What do you think? Will He come to the feast at all?”\n    57. But the chief priests and Pharisees had given orders that anyone who knew where He was must report it, so that they could arrest Him.\n\n### Stands out\n\n1. Martha said to Jesus, “Lord, if You had been here, my brother would not have died.\n2. When Mary came to Jesus and saw Him, she fell at His feet and said, “Lord, if You had been here, my brother would not have died.”\n\n### Means\n\nWe think we know what would have happened\n\n### For me\n\nMy ebenezeer page feels relevant when thinking about waiting on the Lord\n\n??? quote \"Psalm 40:1–2 (LEB)\"\n\n    1 I waited patiently for Yahweh,  And he inclined to me  and heard my cry for help.\n    2 And so he brought me up from the roaring pit,  from the miry clay.  And he put my feet upon a rock;  he made my steps steady.\n\n### Prayer\n\n## Day 2 — Matthew 21:1-13\n\n??? quote \"Matthew 21:1-13\"\n\n    1. As they approached Jerusalem and came to Bethphage on the Mount of Olives, Jesus sent out two disciples,\n    2. saying to them, “Go into the village ahead of you, and at once you will find a donkey tied there, with her colt beside her. Untie them and bring them to Me.\n    3. If anyone questions you, tell him that the Lord needs them, and he will send them right away.”\n    4. This took place to fulfill what was spoken through the prophet:\n    5. “Say to the Daughter of Zion,\n    ‘See, your King comes to you,\n    gentle and riding on a donkey,\n    on a colt, the foal of a donkey.’”\n    6. So the disciples went and did as Jesus had directed them.\n    7. They brought the donkey and the colt and laid their cloaks on them, and Jesus sat on them.\n    8. A massive crowd spread their cloaks on the road, while others cut branches from the trees and spread them on the road.\n    9. The crowds that went ahead of Him and those that followed were shouting:\n    “Hosanna to the Son of David!”\n    “Blessed is He who comes in the name of the Lord!”\n    “Hosanna in the highest!”\n    10. When Jesus had entered Jerusalem, the whole city was stirred and asked, “Who is this?”\n    11. The crowds replied, “This is Jesus, the prophet from Nazareth in Galilee.”\n    12. Then Jesus entered the temple courts and drove out all who were buying and selling there. He overturned the tables of the money changers and the seats of those selling doves.\n    13. And He declared to them, “It is written: ‘My house will be called a house of prayer.’ But you are making it ‘a den of robbers.’ ”\n\n### Stands out\n\n### Means\n\n### For me\n\n### Prayer\n\n## Day 3 — John 13\n\n??? quote \"John 13\"\n\n    1. It was now just before the Passover Feast, and Jesus knew that His hour had come to leave this world and return to the Father. Having loved His own who were in the world, He loved them to the very end.\n    2. The evening meal was underway, and the devil had already put into the heart of Judas, the son of Simon Iscariot, to betray Jesus.\n    3. Jesus knew that the Father had delivered all things into His hands, and that He had come from God and was returning to God.\n    4. So He got up from the supper, laid aside His outer garments, and wrapped a towel around His waist.\n    5. After that, He poured water into a basin and began to wash the disciples’ feet and dry them with the towel that was around Him.\n    6. He came to Simon Peter, who asked Him, “Lord, are You going to wash my feet?”\n    7. Jesus replied, “You do not realize now what I am doing, but later you will understand.”\n    8. “Never shall You wash my feet!” Peter told Him.\n    Jesus answered, “Unless I wash you, you have no part with Me.”\n    9. “Then, Lord,” Simon Peter replied, “not only my feet, but my hands and my head as well!”\n    10. Jesus told him, “Whoever has already bathed needs only to wash his feet, and he will be completely clean. And you are clean, though not all of you.”\n    11. For He knew who would betray Him. That is why He said, “Not all of you are clean.”\n    12. When Jesus had washed their feet and put on His outer garments, He reclined with them again and asked, “Do you know what I have done for you?\n    13. You call Me Teacher and Lord, and rightly so, because I am.\n    14. So if I, your Lord and Teacher, have washed your feet, you also should wash one another’s feet.\n    15. I have set you an example so that you should do as I have done for you.\n    16. Truly, truly, I tell you, no servant is greater than his master, nor is a messenger greater than the one who sent him.\n    17. If you know these things, you will be blessed if you do them.\n    18. I am not speaking about all of you; I know whom I have chosen. But this is to fulfill the Scripture: ‘The one who shares My bread has lifted up his heel against Me.’\n    19. I am telling you now before it happens, so that when it comes to pass, you will believe that I am He.\n    20. Truly, truly, I tell you, whoever receives the one I send receives Me, and whoever receives Me receives the One who sent Me.”\n    21. After Jesus had said this, He became troubled in spirit and testified, “Truly, truly, I tell you, one of you will betray Me.”\n    22. The disciples looked at one another, perplexed as to which of them He meant.\n    23. One of His disciples, the one whom Jesus loved, was reclining at His side.\n    24. So Simon Peter motioned to him to ask Jesus which one He was talking about.\n    25. Leaning back against Jesus, he asked, “Lord, who is it?”\n    26. Jesus answered, “It is the one to whom I give this morsel after I have dipped it.” Then He dipped the morsel and gave it to Judas son of Simon Iscariot.\n    27. And when Judas had taken the morsel, Satan entered into him.\n    Then Jesus said to Judas, “What you are about to do, do quickly.”\n    28. But no one at the table knew why Jesus had said this to him.\n    29. Since Judas kept the money bag, some thought that Jesus was telling him to buy what was needed for the feast, or to give something to the poor.\n    30. As soon as he had received the morsel, Judas went out into the night.\n    31. When Judas had gone out, Jesus said, “Now the Son of Man is glorified, and God is glorified in Him.\n    32. If God is glorified in Him, God will also glorify the Son in Himself—and will glorify Him at once.\n    33. Little children, I am with you only a little while longer. You will look for Me, and as I said to the Jews, so now I say to you: ‘Where I am going, you cannot come.’\n    34. A new commandment I give you: Love one another. As I have loved you, so you also must love one another.\n    35. By this everyone will know that you are My disciples, if you love one another.”\n    36. “Lord, where are You going?” Simon Peter asked.\n    Jesus answered, “Where I am going, you cannot follow Me now, but you will follow later.”\n    37. “Lord,” said Peter, “why can’t I follow You now? I will lay down my life for You.”\n    38. “Will you lay down your life for Me?” Jesus replied. “Truly, truly, I tell you, before the rooster crows, you will deny Me three times.\n\n### Stands out\n\n    6. He came to Simon Peter, who asked Him, “Lord, are You going to wash my feet?”\n    7. Jesus replied, “You do not realize now what I am doing, but later you will understand.”\n    8. “Never shall You wash my feet!” Peter told Him.\n    Jesus answered, “Unless I wash you, you have no part with Me.”\n    9. “Then, Lord,” Simon Peter replied, “not only my feet, but my hands and my head as well!”\n\n### Means\n\n### For me\n\n### Prayer\n\n## Day 4 — John 14-15\n\n??? quote \"John 14\"\n\n    1. “Do not let your hearts be troubled. You believe in God; believe in Me as well.\n    2. In My Father’s house are many rooms. If it were not so, would I have told you that I am going there to prepare a place for you?\n    3. And if I go and prepare a place for you, I will come back and welcome you into My presence, so that you also may be where I am.\n    4. You know the way to the place where I am going. ”\n    5. “Lord,” said Thomas, “we do not know where You are going, so how can we know the way?”\n    6. Jesus answered, “I am the way and the truth and the life. No one comes to the Father except through Me.\n    7. If you had known Me, you would know My Father as well. From now on you do know Him and have seen Him.”\n    8. Philip said to Him, “Lord, show us the Father, and that will be enough for us.”\n    9. Jesus replied, “Philip, I have been with you all this time, and still you do not know Me? Anyone who has seen Me has seen the Father. How can you say, ‘Show us the Father’?\n    10. Do you not believe that I am in the Father and the Father is in Me? The words I say to you, I do not speak on My own. Instead, it is the Father dwelling in Me, performing His works.\n    11. Believe Me that I am in the Father and the Father is in Me—or at least believe on account of the works themselves.\n    12. Truly, truly, I tell you, whoever believes in Me will also do the works that I am doing. He will do even greater things than these, because I am going to the Father.\n    13. And I will do whatever you ask in My name, so that the Father may be glorified in the Son.\n    14. If you ask Me for anything in My name, I will do it.\n    15. If you love Me, you will keep My commandments.\n    16. And I will ask the Father, and He will give you another Advocate to be with you forever—\n    17. the Spirit of truth. The world cannot receive Him, because it neither sees Him nor knows Him. But you do know Him, for He abides with you and will be in you.\n    18. I will not leave you as orphans; I will come to you.\n    19. In a little while the world will see Me no more, but you will see Me. Because I live, you also will live.\n    20. On that day you will know that I am in My Father, and you are in Me, and I am in you.\n    21. Whoever has My commandments and keeps them is the one who loves Me. The one who loves Me will be loved by My Father, and I will love him and reveal Myself to him.”\n    22. Judas (not Iscariot) asked Him, “Lord, why are You going to reveal Yourself to us and not to the world?”\n    23. Jesus replied, “If anyone loves Me, he will keep My word. My Father will love him, and We will come to him and make Our home with him.\n    24. Whoever does not love Me does not keep My words. The word that you hear is not My own, but it is from the Father who sent Me.\n    25. All this I have spoken to you while I am still with you.\n    26. But the Advocate, the Holy Spirit, whom the Father will send in My name, will teach you all things and will remind you of everything I have told you.\n    27. Peace I leave with you; My peace I give to you. I do not give to you as the world gives. Do not let your hearts be troubled; do not be afraid.\n    28. You heard Me say, ‘I am going away, and I am coming back to you.’ If you loved Me, you would rejoice that I am going to the Father, because the Father is greater than I.\n    29. And now I have told you before it happens, so that when it does happen, you will believe.\n    30. I will not speak with you much longer, for the prince of this world is coming, and he has no claim on Me.\n    31. But I do exactly what the Father has commanded Me, so that the world may know that I love the Father.\n    Get up! Let us go on from here.\n\n??? quote \"John 15\"\n\n    1. “I am the true vine, and My Father is the keeper of the vineyard.\n    2. He cuts off every branch in Me that bears no fruit, and every branch that does bear fruit, He prunes to make it even more fruitful.\n    3. You are already clean because of the word I have spoken to you.\n    4. Remain in Me, and I will remain in you. Just as no branch can bear fruit by itself unless it remains in the vine, neither can you bear fruit unless you remain in Me.\n    5. I am the vine and you are the branches. The one who remains in Me, and I in him, will bear much fruit. For apart from Me you can do nothing.\n    6. If anyone does not remain in Me, he is like a branch that is thrown away and withers. Such branches are gathered up, thrown into the fire, and burned.\n    7. If you remain in Me and My words remain in you, ask whatever you wish, and it will be done for you.\n    8. This is to My Father’s glory, that you bear much fruit, proving yourselves to be My disciples.\n    9. As the Father has loved Me, so have I loved you. Remain in My love.\n    10. If you keep My commandments, you will remain in My love, just as I have kept My Father’s commandments and remain in His love.\n    11. I have told you these things so that My joy may be in you and your joy may be complete.\n    12. This is My commandment, that you love one another as I have loved you.\n    13. Greater love has no one than this, that he lay down his life for his friends.\n    14. You are My friends if you do what I command you.\n    15. No longer do I call you servants, for a servant does not understand what his master is doing. But I have called you friends, because everything I have learned from My Father I have made known to you.\n    16. You did not choose Me, but I chose you. And I appointed you to go and bear fruit—fruit that will remain—so that whatever you ask the Father in My name, He will give you.\n    17. This is My command to you: Love one another.\n    18. If the world hates you, understand that it hated Me first.\n    19. If you were of the world, it would love you as its own. Instead, the world hates you, because you are not of the world, but I have chosen you out of the world.\n    20. Remember the word that I spoke to you: ‘No servant is greater than his master.’ If they persecuted Me, they will persecute you as well; if they kept My word, they will keep yours as well.\n    21. But they will treat you like this because of My name, since they do not know the One who sent Me.\n    22. If I had not come and spoken to them, they would not be guilty of sin. Now, however, they have no excuse for their sin.\n    23. Whoever hates Me hates My Father as well.\n    24. If I had not done among them the works that no one else did, they would not be guilty of sin; but now they have seen and hated both Me and My Father.\n    25. But this is to fulfill what is written in their Law: ‘They hated Me without reason.’\n    26. When the Advocate comes, whom I will send to you from the Father—the Spirit of truth who proceeds from the Father—He will testify about Me.\n    27. And you also must testify, because you have been with Me from the beginning.\n\n### Stands out\n\n### Means\n\n### For me\n\n### Prayer\n\n## Day 5 — John 16 \u0026 Matthew 24:1-31\n\n??? quote \"John 16\"\n\n    1. “I have told you these things so that you will not fall away.\n    2. They will put you out of the synagogues. In fact, a time is coming when anyone who kills you will think he is offering a service to God.\n    3. They will do these things because they have not known the Father or Me.\n    4. But I have told you these things so that when their hour comes, you will remember that I told you about them. I did not tell you these things from the beginning, because I was with you.\n    5. Now, however, I am going to Him who sent Me; yet none of you asks Me, ‘Where are You going?’\n    6. Instead, your hearts are filled with sorrow because I have told you these things.\n    7. But I tell you the truth, it is for your benefit that I am going away. Unless I go away, the Advocate will not come to you; but if I go, I will send Him to you.\n    8. And when He comes, He will convict the world in regard to sin and righteousness and judgment:\n    9. in regard to sin, because they do not believe in Me;\n    10. in regard to righteousness, because I am going to the Father and you will no longer see Me;\n    11. and in regard to judgment, because the prince of this world has been condemned.\n    12. I still have much to tell you, but you cannot yet bear to hear it.\n    13. However, when the Spirit of truth comes, He will guide you into all truth. For He will not speak on His own, but He will speak what He hears, and He will declare to you what is to come.\n    14. He will glorify Me by taking from what is Mine and disclosing it to you.\n    15. Everything that belongs to the Father is Mine. That is why I said that the Spirit will take from what is Mine and disclose it to you.\n    16. In a little while you will see Me no more, and then after a little while you will see Me. ”\n    17. Then some of His disciples asked one another, “Why is He telling us, ‘In a little while you will not see Me, and then after a little while you will see Me’ and ‘Because I am going to the Father’?”\n    18. They kept asking, “Why is He saying, ‘a little while’? We do not understand what He is saying.”\n    19. Aware that they wanted to question Him, Jesus said to them, “Are you asking one another why I said, ‘In a little while you will not see Me, and then after a little while you will see Me’?\n    20. Truly, truly, I tell you, you will weep and wail while the world rejoices. You will grieve, but your grief will turn to joy.\n    21. A woman has pain in childbirth because her time has come; but when she brings forth her child, she forgets her anguish because of her joy that a child has been born into the world.\n    22. So also you have sorrow now, but I will see you again and your hearts will rejoice, and no one will take away your joy.\n    23. In that day you will no longer ask Me anything. Truly, truly, I tell you, whatever you ask the Father in My name, He will give you.\n    24. Until now you have not asked for anything in My name. Ask and you will receive, so that your joy may be complete.\n    25. I have spoken these things to you in figures of speech. An hour is coming when I will no longer speak to you this way, but will tell you plainly about the Father.\n    26. In that day you will ask in My name. I am not saying that I will ask the Father on your behalf.\n    27. For the Father Himself loves you, because you have loved Me and have believed that I came from God.\n    28. I came from the Father and entered the world. In turn, I will leave the world and go to the Father.”\n    29. His disciples said, “See, now You are speaking plainly and without figures of speech.\n    30. Now we understand that You know all things and that You have no need for anyone to question You. Because of this, we believe that You came from God.”\n    31. “Do you finally believe?” Jesus replied.\n    32. “Look, an hour is coming and has already come when you will be scattered, each to his own home, and you will leave Me all alone. Yet I am not alone, because the Father is with Me.\n    33. I have told you these things so that in Me you may have peace. In the world you will have tribulation. But take courage; I have overcome the world!”\n\n??? quote \"Matthew 24:1-31\"\n\n    1. As Jesus left the temple and was walking away, His disciples came up to Him to point out its buildings.\n    2. “Do you see all these things?” He replied. “Truly I tell you, not one stone here will be left on another; every one will be thrown down.”\n    3. While Jesus was sitting on the Mount of Olives, the disciples came to Him privately. “Tell us,” they said, “when will these things happen, and what will be the sign of Your coming and of the end of the age?”\n    4. Jesus answered, “See to it that no one deceives you.\n    5. For many will come in My name, claiming, ‘I am the Christ,’ and will deceive many.\n    6. You will hear of wars and rumors of wars, but see to it that you are not alarmed. These things must happen, but the end is still to come.\n    7. Nation will rise against nation, and kingdom against kingdom. There will be famines and earthquakes in various places.\n    8. All these are the beginning of birth pains.\n    9. Then they will deliver you over to be persecuted and killed, and you will be hated by all nations because of My name.\n    10. At that time many will fall away and will betray and hate one another,\n    11. and many false prophets will arise and deceive many.\n    12. Because of the multiplication of wickedness, the love of most will grow cold.\n    13. But the one who perseveres to the end will be saved.\n    14. And this gospel of the kingdom will be preached in all the world as a testimony to all nations, and then the end will come.\n    15. So when you see standing in the holy place ‘the abomination of desolation,’ spoken of by the prophet Daniel (let the reader understand),\n    16. then let those who are in Judea flee to the mountains.\n    17. Let no one on the housetop come down to retrieve anything from his house.\n    18. And let no one in the field return for his cloak.\n    19. How miserable those days will be for pregnant and nursing mothers!\n    20. Pray that your flight will not occur in the winter or on the Sabbath.\n    21. For at that time there will be great tribulation, unseen from the beginning of the world until now, and never to be seen again.\n    22. If those days had not been cut short, nobody would be saved. But for the sake of the elect, those days will be cut short.\n    23. At that time, if anyone says to you, ‘Look, here is the Christ!’ or ‘There He is!’ do not believe it.\n    24. For false Christs and false prophets will appear and perform great signs and wonders to deceive even the elect, if that were possible.\n    25. See, I have told you in advance.\n    26. So if they tell you, ‘There He is, in the wilderness,’ do not go out, or, ‘Here He is, in the inner rooms,’ do not believe it.\n    27. For just as the lightning comes from the east and flashes as far as the west, so will be the coming of the Son of Man.\n    28. Wherever there is a carcass, there the vultures will gather.\n    29. Immediately after the tribulation of those days:\n    ‘The sun will be darkened,\n    and the moon will not give its light;\n    the stars will fall from the sky,\n    and the powers of the heavens will be shaken.\n    ’\n    30. At that time the sign of the Son of Man will appear in heaven, and all the tribes of the earth will mourn. They will see the Son of Man coming on the clouds of heaven with power and great glory.\n    31. And He will send out His angels with a loud trumpet call, and they will gather His elect from the four winds, from one end of the heavens to the other.\n\n### Stands out\n\n### Means\n\n### For me\n\n### Prayer\n\n---\n\n## Prayer Requests\n\n- [ ] \u003cname\u003e — \u003crequest\u003e\n\n### Answered / Updates\n\n- \u003cfollow-ups from previous weeks\u003e\n\n## Meeting Notes\n\nI read some of John 12 the morning of the meeting, not on our list but Judas' posture towards the espensive nard that Mary used to annoint is hilarious to me - very commie \"why wasn't this thing of mine used for someone else NOT sold and the money given to me to distribute to others as I see fit\"\n",
      "summary": "!!! quote \"Hebrews 2:18\"",
      "date_published": "2026-09-18T06:00:00Z",
      "date_modified": "2026-09-18T06:00:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "olivet",
        "faith",
        "mens-group"
      ]
    },
    {
      "id": "https://pype.dev/olivet-mens-group-2026-week-34/",
      "url": "https://pype.dev/olivet-mens-group-2026-week-34/",
      "title": "Men’s Group - Week 34",
      "content_html": "\u003ch1 id=\"week-34-september-6-12-2026\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWeek 34 — September 6 – 12, 2026\u003c/span\u003e\u003c/h1\u003e\n\u003ch3 id=\"meeting-friday-september-11\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMeeting: Friday, September 11\u003c/span\u003e \u003ca href=\"#meeting-friday-september-11\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch3 id=\"memory-verse-philippians-4-19\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMemory Verse: Philippians 4:19\u003c/span\u003e \u003ca href=\"#memory-verse-philippians-4-19\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003ePhilippians 4:19\u003c/p\u003e\n\u003col start=\"19\"\u003e\n\u003cli\u003eAnd my God will supply all your needs according to His glorious riches in Christ Jesus.\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/div\u003e\n\u003ch2 id=\"readings\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eReadings\u003c/span\u003e \u003ca href=\"#readings\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e Day 1: John 6\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e Day 2: Matthew 19:16-30\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e Day 3: Luke 15-16\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e Day 4: Luke 17:11-37\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e Day 5: Mark 10\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"day-1-john-6\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDay 1 — John 6\u003c/span\u003e \u003ca href=\"#day-1-john-6\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cdetails class=\"admonition quote\"\u003e\n\u003csummary class=\"admonition-title\"\u003eJohn 6\u003c/summary\u003e\n\u003col\u003e\n\u003cli\u003eAfter this, Jesus crossed to the other side of the Sea of Galilee (that is, the Sea of Tiberias).\u003c/li\u003e\n\u003cli\u003eA large crowd followed Him because they saw the signs He was performing on the sick.\u003c/li\u003e\n\u003cli\u003eThen Jesus went up on the mountain and sat down with His disciples.\u003c/li\u003e\n\u003cli\u003eNow the Jewish Feast of the Passover was near.\u003c/li\u003e\n\u003cli\u003eWhen Jesus looked up and saw a large crowd coming toward Him, He said to Philip, \u0026ldquo;Where can we buy bread for these people to eat?\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eBut He was asking this to test him, for He knew what He was about to do.\u003c/li\u003e\n\u003cli\u003ePhilip answered, \u0026ldquo;Two hundred denarii would not buy enough bread for each of them to have a small piece.\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eOne of His disciples, Andrew, Simon Peter\u0026rsquo;s brother, said to Him,\u003c/li\u003e\n\u003cli\u003e\u0026ldquo;Here is a boy with five barley loaves and two small fish. But what difference will these make among so many?\u0026rdquo;\u003c/li\u003e\n\u003cli\u003e\u0026ldquo;Have the people sit down,\u0026rdquo; Jesus said. Now there was plenty of grass in that place, so the men sat down, about five thousand of them.\u003c/li\u003e\n\u003cli\u003eThen Jesus took the loaves and the fish, gave thanks, and distributed to those who were seated as much as they wanted.\u003c/li\u003e\n\u003cli\u003eAnd when everyone was full, He said to His disciples, \u0026ldquo;Gather the pieces that are left over, so that nothing will be wasted.\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eSo they collected them and filled twelve baskets with the pieces of the five barley loaves left over by those who had eaten.\u003c/li\u003e\n\u003cli\u003eWhen the people saw the sign that Jesus had performed, they began to say, \u0026ldquo;Truly this is the Prophet who is to come into the world.\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eThen Jesus, realizing that they were about to come and make Him king by force, withdrew again to a mountain by Himself.\u003c/li\u003e\n\u003cli\u003eWhen evening came, His disciples went down to the sea,\u003c/li\u003e\n\u003cli\u003egot into a boat, and started across the sea to Capernaum. It was already dark, and Jesus had not yet gone out to them.\u003c/li\u003e\n\u003cli\u003eA strong wind was blowing, and the sea grew agitated.\u003c/li\u003e\n\u003cli\u003eWhen they had rowed about three or four miles, they saw Jesus approaching the boat, walking on the sea—and they were terrified.\u003c/li\u003e\n\u003cli\u003eBut Jesus spoke up: \u0026ldquo;It is I; do not be afraid.\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eThen they were willing to take Him into the boat, and at once the boat reached the shore where they were heading.\u003c/li\u003e\n\u003cli\u003eThe next day, the crowd that had remained on the other side of the sea realized that only one boat had been there, and that Jesus had not boarded it with His disciples, but they had gone away alone.\u003c/li\u003e\n\u003cli\u003eHowever, some boats from Tiberias landed near the place where the people had eaten the bread after the Lord had given thanks.\u003c/li\u003e\n\u003cli\u003eSo when the crowd saw that neither Jesus nor His disciples were there, they got into the boats and went to Capernaum to look for Him.\u003c/li\u003e\n\u003cli\u003eWhen they found Him on the other side of the sea, they asked Him, \u0026ldquo;Rabbi, when did You get here?\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eJesus replied, \u0026ldquo;Truly, truly, I tell you, it is not because you saw these signs that you are looking for Me, but because you ate the loaves and had your fill.\u003c/li\u003e\n\u003cli\u003eDo not work for food that perishes, but for food that endures to eternal life, which the Son of Man will give you. For on Him God the Father has placed His seal of approval.\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eThen they inquired, \u0026ldquo;What must we do to perform the works of God?\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eJesus replied, \u0026ldquo;The work of God is this: to believe in the One He has sent.\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eSo they asked Him, \u0026ldquo;What sign then will You perform, so that we may see it and believe You? What will You do?\u003c/li\u003e\n\u003cli\u003eOur fathers ate the manna in the wilderness, as it is written: \u0026lsquo;He gave them bread from heaven to eat.\u0026rsquo;\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eJesus said to them, \u0026ldquo;Truly, truly, I tell you, it was not Moses who gave you the bread from heaven, but it is My Father who gives you the true bread from heaven.\u003c/li\u003e\n\u003cli\u003eFor the bread of God is He who comes down from heaven and gives life to the world.\u0026rdquo;\u003c/li\u003e\n\u003cli\u003e\u0026ldquo;Sir,\u0026rdquo; they said, \u0026ldquo;give us this bread at all times.\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eJesus answered, \u0026ldquo;I am the bread of life. Whoever comes to Me will never hunger, and whoever believes in Me will never thirst.\u003c/li\u003e\n\u003cli\u003eBut as I stated, you have seen Me and still you do not believe.\u003c/li\u003e\n\u003cli\u003eEveryone the Father gives Me will come to Me, and the one who comes to Me I will never drive away.\u003c/li\u003e\n\u003cli\u003eFor I have come down from heaven, not to do My own will, but to do the will of Him who sent Me.\u003c/li\u003e\n\u003cli\u003eAnd this is the will of Him who sent Me, that I shall lose none of those He has given Me, but raise them up at the last day.\u003c/li\u003e\n\u003cli\u003eFor it is My Father\u0026rsquo;s will that everyone who looks to the Son and believes in Him shall have eternal life, and I will raise him up at the last day.\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eAt this, the Jews began to grumble about Jesus because He had said, \u0026ldquo;I am the bread that came down from heaven.\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eThey were asking, \u0026ldquo;Is this not Jesus, the son of Joseph, whose father and mother we know? How then can He say, \u0026lsquo;I have come down from heaven?\u0026rsquo;\u0026rdquo;\u003c/li\u003e\n\u003cli\u003e\u0026ldquo;Stop grumbling among yourselves,\u0026rdquo; Jesus replied.\u003c/li\u003e\n\u003cli\u003e\u0026ldquo;No one can come to Me unless the Father who sent Me draws him, and I will raise him up at the last day.\u003c/li\u003e\n\u003cli\u003eIt is written in the Prophets: \u0026lsquo;And they will all be taught by God.\u0026rsquo; Everyone who has heard the Father and learned from Him comes to Me—\u003c/li\u003e\n\u003cli\u003enot that anyone has seen the Father except the One who is from God; only He has seen the Father.\u003c/li\u003e\n\u003cli\u003eTruly, truly, I tell you, he who believes has eternal life.\u003c/li\u003e\n\u003cli\u003eI am the bread of life.\u003c/li\u003e\n\u003cli\u003eYour fathers ate the manna in the wilderness, yet they died.\u003c/li\u003e\n\u003cli\u003eThis is the bread that comes down from heaven, so that anyone may eat of it and not die.\u003c/li\u003e\n\u003cli\u003eI am the living bread that came down from heaven. If anyone eats of this bread, he will live forever. And this bread, which I will give for the life of the world, is My flesh.\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eAt this, the Jews began to argue among themselves, \u0026ldquo;How can this man give us His flesh to eat?\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eSo Jesus said to them, \u0026ldquo;Truly, truly, I tell you, unless you eat the flesh and drink the blood of the Son of Man, you have no life in you.\u003c/li\u003e\n\u003cli\u003eWhoever eats My flesh and drinks My blood has eternal life, and I will raise him up at the last day.\u003c/li\u003e\n\u003cli\u003eFor My flesh is real food, and My blood is real drink.\u003c/li\u003e\n\u003cli\u003eWhoever eats My flesh and drinks My blood remains in Me, and I in him.\u003c/li\u003e\n\u003cli\u003eJust as the living Father sent Me and I live because of the Father, so also the one who feeds on Me will live because of Me.\u003c/li\u003e\n\u003cli\u003eThis is the bread that came down from heaven. Unlike your fathers, who ate the manna and died, the one who eats this bread will live forever.\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eJesus said this while teaching in the synagogue in Capernaum.\u003c/li\u003e\n\u003cli\u003eOn hearing it, many of His disciples said, \u0026ldquo;This is a difficult teaching. Who can accept it?\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eAware that His disciples were grumbling about this teaching, Jesus asked them, \u0026ldquo;Does this offend you?\u003c/li\u003e\n\u003cli\u003eThen what will happen if you see the Son of Man ascend to where He was before?\u003c/li\u003e\n\u003cli\u003eThe Spirit gives life; the flesh profits nothing. The words I have spoken to you are spirit and they are life.\u003c/li\u003e\n\u003cli\u003eHowever, there are some of you who do not believe.\u0026rdquo; (For Jesus had known from the beginning which of them did not believe and who would betray Him.)\u003c/li\u003e\n\u003cli\u003eThen Jesus said, \u0026ldquo;This is why I told you that no one can come to Me unless the Father has granted it to him.\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eFrom that time on many of His disciples turned back and no longer walked with Him.\u003c/li\u003e\n\u003cli\u003eSo Jesus asked the Twelve, \u0026ldquo;Do you want to leave too?\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eSimon Peter replied, \u0026ldquo;Lord, to whom would we go? You have the words of eternal life.\u003c/li\u003e\n\u003cli\u003eWe believe and know that You are the Holy One of God.\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eJesus answered them, \u0026ldquo;Have I not chosen you, the Twelve? Yet one of you is a devil!\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eHe was speaking about Judas, the son of Simon Iscariot. For although Judas was one of the Twelve, he was later to betray Jesus.\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/details\u003e\n\u003ch2 id=\"day-2-matthew-19-16-30\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDay 2 — Matthew 19:16-30\u003c/span\u003e \u003ca href=\"#day-2-matthew-19-16-30\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cdetails class=\"admonition quote\"\u003e\n\u003csummary class=\"admonition-title\"\u003eMatthew 19:16-30\u003c/summary\u003e\n\u003col start=\"16\"\u003e\n\u003cli\u003eJust then a man came up to Jesus and inquired, \u0026ldquo;Teacher, what good thing must I do to obtain eternal life?\u0026rdquo;\u003c/li\u003e\n\u003cli\u003e\u0026ldquo;Why do you ask Me about what is good?\u0026rdquo; Jesus replied. \u0026ldquo;There is only One who is good. If you want to enter life, keep the commandments.\u0026rdquo;\u003c/li\u003e\n\u003cli\u003e\u0026ldquo;Which ones?\u0026rdquo; the man asked.\nJesus answered, \u0026ldquo;\u0026lsquo;Do not murder, do not commit adultery, do not steal, do not bear false witness,\u003c/li\u003e\n\u003cli\u003ehonor your father and mother, and love your neighbor as yourself.\u0026rsquo;\u0026rdquo;\u003c/li\u003e\n\u003cli\u003e\u0026ldquo;All these I have kept,\u0026rdquo; said the young man. \u0026ldquo;What do I still lack?\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eJesus told him, \u0026ldquo;If you want to be perfect, go, sell your possessions and give to the poor, and you will have treasure in heaven. Then come, follow Me.\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eWhen the young man heard this, he went away in sorrow, because he had great wealth.\u003c/li\u003e\n\u003cli\u003eThen Jesus said to His disciples, \u0026ldquo;Truly I tell you, it is hard for a rich man to enter the kingdom of heaven.\u003c/li\u003e\n\u003cli\u003eAgain I tell you, it is easier for a camel to pass through the eye of a needle than for a rich man to enter the kingdom of God.\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eWhen the disciples heard this, they were greatly astonished and asked, \u0026ldquo;Who then can be saved?\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eJesus looked at them and said, \u0026ldquo;With man this is impossible, but with God all things are possible.\u0026rdquo;\u003c/li\u003e\n\u003cli\u003e\u0026ldquo;Look,\u0026rdquo; Peter replied, \u0026ldquo;we have left everything to follow You. What then will there be for us?\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eJesus said to them, \u0026ldquo;Truly I tell you, in the renewal of all things, when the Son of Man sits on His glorious throne, you who have followed Me will also sit on twelve thrones, judging the twelve tribes of Israel.\u003c/li\u003e\n\u003cli\u003eAnd everyone who has left houses or brothers or sisters or father or mother or wife or children or fields for the sake of My name will receive a hundredfold and will inherit eternal life.\u003c/li\u003e\n\u003cli\u003eBut many who are first will be last, and the last will be first.\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/details\u003e\n\u003ch2 id=\"day-3-luke-15-16\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDay 3 — Luke 15-16\u003c/span\u003e \u003ca href=\"#day-3-luke-15-16\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cdetails class=\"admonition quote\"\u003e\n\u003csummary class=\"admonition-title\"\u003eLuke 15\u003c/summary\u003e\n\u003col\u003e\n\u003cli\u003eNow all the tax collectors and sinners were gathering around to listen to Jesus.\u003c/li\u003e\n\u003cli\u003eSo the Pharisees and scribes began to grumble: \u0026ldquo;This man welcomes sinners and eats with them.\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eThen Jesus told them this parable:\u003c/li\u003e\n\u003cli\u003e\u0026ldquo;What man among you, if he has a hundred sheep and loses one of them, does not leave the ninety-nine in the pasture and go after the one that is lost, until he finds it?\u003c/li\u003e\n\u003cli\u003eAnd when he finds it, he joyfully puts it on his shoulders,\u003c/li\u003e\n\u003cli\u003ecomes home, and calls together his friends and neighbors to tell them, \u0026lsquo;Rejoice with me, for I have found my lost sheep!\u0026rsquo;\u003c/li\u003e\n\u003cli\u003eI tell you that in the same way there will be more joy in heaven over one sinner who repents than over ninety-nine righteous ones who do not need to repent.\u003c/li\u003e\n\u003cli\u003eOr what woman who has ten silver coins and loses one of them does not light a lamp, sweep her house, and search carefully until she finds it?\u003c/li\u003e\n\u003cli\u003eAnd when she finds it, she calls together her friends and neighbors to say, \u0026lsquo;Rejoice with me, for I have found my lost coin.\u0026rsquo;\u003c/li\u003e\n\u003cli\u003eIn the same way, I tell you, there is joy in the presence of God\u0026rsquo;s angels over one sinner who repents.\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eThen Jesus said, \u0026ldquo;There was a man who had two sons.\u003c/li\u003e\n\u003cli\u003eThe younger son said to him, \u0026lsquo;Father, give me my share of the estate.\u0026rsquo; So he divided his property between them.\u003c/li\u003e\n\u003cli\u003eAfter a few days, the younger son got everything together and journeyed to a distant country, where he squandered his wealth in wild living.\u003c/li\u003e\n\u003cli\u003eAfter he had spent all he had, a severe famine swept through that country, and he began to be in need.\u003c/li\u003e\n\u003cli\u003eSo he went and hired himself out to a citizen of that country, who sent him into his fields to feed the pigs.\u003c/li\u003e\n\u003cli\u003eHe longed to fill his belly with the pods the pigs were eating, but no one would give him a thing.\u003c/li\u003e\n\u003cli\u003eFinally he came to his senses and said, \u0026lsquo;How many of my father\u0026rsquo;s hired servants have plenty of food, but here I am, starving to death!\u003c/li\u003e\n\u003cli\u003eI will get up and go back to my father and say to him, \u0026ldquo;Father, I have sinned against heaven and against you.\u003c/li\u003e\n\u003cli\u003eI am no longer worthy to be called your son. Make me like one of your hired servants.\u0026rdquo;\u0026rsquo;\u003c/li\u003e\n\u003cli\u003eSo he got up and went to his father. But while he was still in the distance, his father saw him and was filled with compassion. He ran to his son, embraced him, and kissed him.\u003c/li\u003e\n\u003cli\u003eThe son declared, \u0026lsquo;Father, I have sinned against heaven and against you. I am no longer worthy to be called your son.\u0026rsquo;\u003c/li\u003e\n\u003cli\u003eBut the father said to his servants, \u0026lsquo;Quick! Bring the best robe and put it on him. Put a ring on his finger and sandals on his feet.\u003c/li\u003e\n\u003cli\u003eBring the fattened calf and kill it. Let us feast and celebrate.\u003c/li\u003e\n\u003cli\u003eFor this son of mine was dead and is alive again! He was lost and is found!\u0026rsquo; So they began to celebrate.\u003c/li\u003e\n\u003cli\u003eMeanwhile the older son was in the field, and as he approached the house, he heard music and dancing.\u003c/li\u003e\n\u003cli\u003eSo he called one of the servants and asked what was going on.\u003c/li\u003e\n\u003cli\u003e\u0026lsquo;Your brother has returned,\u0026rsquo; he said, \u0026lsquo;and your father has killed the fattened calf, because he has him back safe and sound.\u0026rsquo;\u003c/li\u003e\n\u003cli\u003eThe older son became angry and refused to go in. So his father came out and pleaded with him.\u003c/li\u003e\n\u003cli\u003eBut he answered his father, \u0026lsquo;Look, all these years I have served you and never disobeyed a commandment of yours. Yet you never gave me even a young goat so I could celebrate with my friends.\u003c/li\u003e\n\u003cli\u003eBut when this son of yours returns from squandering your wealth with prostitutes, you kill the fattened calf for him!\u0026rsquo;\u003c/li\u003e\n\u003cli\u003e\u0026lsquo;Son, you are always with me,\u0026rsquo; the father said, \u0026lsquo;and all that is mine is yours.\u003c/li\u003e\n\u003cli\u003eBut it was fitting to celebrate and be glad, because this brother of yours was dead and is alive again; he was lost and is found.\u0026rsquo;\u0026rdquo;\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/details\u003e\n\u003cdetails class=\"admonition quote\"\u003e\n\u003csummary class=\"admonition-title\"\u003eLuke 16\u003c/summary\u003e\n\u003col\u003e\n\u003cli\u003eJesus also said to His disciples, \u0026ldquo;There was a rich man whose manager was accused of wasting his possessions.\u003c/li\u003e\n\u003cli\u003eSo he called him in to ask, \u0026lsquo;What is this I hear about you? Turn in an account of your management, for you cannot be manager any longer.\u0026rsquo;\u003c/li\u003e\n\u003cli\u003eThe manager said to himself, \u0026lsquo;What shall I do, now that my master is taking away my position? I am too weak to dig and too ashamed to beg.\u003c/li\u003e\n\u003cli\u003eI know what I will do so that after my removal from management, people will welcome me into their homes.\u0026rsquo;\u003c/li\u003e\n\u003cli\u003eAnd he called in each one of his master\u0026rsquo;s debtors. \u0026lsquo;How much do you owe my master?\u0026rsquo; he asked the first.\u003c/li\u003e\n\u003cli\u003e\u0026lsquo;A hundred measures of olive oil,\u0026rsquo; he answered.\n\u0026lsquo;Take your bill,\u0026rsquo; said the manager, \u0026lsquo;sit down quickly, and write fifty.\u0026rsquo;\u003c/li\u003e\n\u003cli\u003eThen he asked another, \u0026lsquo;And how much do you owe?\u0026rsquo;\n\u0026lsquo;A hundred measures of wheat,\u0026rsquo; he replied.\n\u0026lsquo;Take your bill and write eighty,\u0026rsquo; he told him.\u003c/li\u003e\n\u003cli\u003eThe master commended the dishonest manager because he had acted shrewdly. For the sons of this age are more shrewd in dealing with their own kind than are the sons of light.\u003c/li\u003e\n\u003cli\u003eI tell you, use worldly wealth to make friends for yourselves so that when it is gone, they will welcome you into eternal dwellings.\u003c/li\u003e\n\u003cli\u003eWhoever is faithful with very little will also be faithful with much, and whoever is dishonest with very little will also be dishonest with much.\u003c/li\u003e\n\u003cli\u003eSo if you have not been faithful with worldly wealth, who will entrust you with true riches?\u003c/li\u003e\n\u003cli\u003eAnd if you have not been faithful with the belongings of another, who will give you belongings of your own?\u003c/li\u003e\n\u003cli\u003eNo servant can serve two masters. Either he will hate the one and love the other, or he will be devoted to the one and despise the other. You cannot serve both God and money.\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eThe Pharisees, who were lovers of money, heard all of this and were scoffing at Jesus.\u003c/li\u003e\n\u003cli\u003eSo He said to them, \u0026ldquo;You are the ones who justify yourselves before men, but God knows your hearts. For what is prized among men is detestable before God.\u003c/li\u003e\n\u003cli\u003eThe Law and the Prophets were proclaimed until John. Since that time, the gospel of the kingdom of God is being preached, and everyone is forcing his way into it.\u003c/li\u003e\n\u003cli\u003eBut it is easier for heaven and earth to pass away than for a single stroke of a pen to drop out of the Law.\u003c/li\u003e\n\u003cli\u003eAnyone who divorces his wife and marries another woman commits adultery, and he who marries a divorced woman commits adultery.\u003c/li\u003e\n\u003cli\u003eNow there was a rich man dressed in purple and fine linen, who lived each day in joyous splendor.\u003c/li\u003e\n\u003cli\u003eAnd a beggar named Lazarus lay at his gate, covered with sores\u003c/li\u003e\n\u003cli\u003eand longing to be fed with the crumbs that fell from the rich man\u0026rsquo;s table. Even the dogs came and licked his sores.\u003c/li\u003e\n\u003cli\u003eOne day the beggar died and was carried by the angels to Abraham\u0026rsquo;s side. And the rich man also died and was buried.\u003c/li\u003e\n\u003cli\u003eIn Hades, where he was in torment, he looked up and saw Abraham from afar, with Lazarus by his side.\u003c/li\u003e\n\u003cli\u003eSo he cried out, \u0026lsquo;Father Abraham, have mercy on me and send Lazarus to dip the tip of his finger in water and cool my tongue. For I am in agony in this fire.\u0026rsquo;\u003c/li\u003e\n\u003cli\u003eBut Abraham answered, \u0026lsquo;Child, remember that during your lifetime you received your good things, while Lazarus received bad things. But now he is comforted here, while you are in agony.\u003c/li\u003e\n\u003cli\u003eAnd besides all this, a great chasm has been fixed between us and you, so that even those who wish cannot cross from here to you, nor can anyone cross from there to us.\u0026rsquo;\u003c/li\u003e\n\u003cli\u003e\u0026lsquo;Then I beg you, father,\u0026rsquo; he said, \u0026lsquo;send Lazarus to my father\u0026rsquo;\u0026rsquo;s house,\u003c/li\u003e\n\u003cli\u003efor I have five brothers. Let him warn them, so that they will not also end up in this place of torment.\u0026rsquo;\u003c/li\u003e\n\u003cli\u003eBut Abraham replied, \u0026lsquo;They have Moses and the Prophets; let your brothers listen to them.\u0026rsquo;\u003c/li\u003e\n\u003cli\u003e\u0026lsquo;No, father Abraham,\u0026rsquo; he said, \u0026lsquo;but if someone is sent to them from the dead, they will repent.\u0026rsquo;\u003c/li\u003e\n\u003cli\u003eThen Abraham said to him, \u0026lsquo;If they do not listen to Moses and the Prophets, they will not be persuaded even if someone rises from the dead.\u0026rsquo;\u0026rdquo;\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/details\u003e\n\u003ch2 id=\"day-4-luke-17-11-37\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDay 4 — Luke 17:11-37\u003c/span\u003e \u003ca href=\"#day-4-luke-17-11-37\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cdetails class=\"admonition quote\"\u003e\n\u003csummary class=\"admonition-title\"\u003eLuke 17:11-37\u003c/summary\u003e\n\u003col start=\"11\"\u003e\n\u003cli\u003eWhile Jesus was on His way to Jerusalem, He was passing between Samaria and Galilee.\u003c/li\u003e\n\u003cli\u003eAs He entered one of the villages, He was met by ten lepers. They stood at a distance\u003c/li\u003e\n\u003cli\u003eand raised their voices, shouting, \u0026ldquo;Jesus, Master, have mercy on us!\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eWhen Jesus saw them, He said, \u0026ldquo;Go, show yourselves to the priests.\u0026rdquo; And as they were on their way, they were cleansed.\u003c/li\u003e\n\u003cli\u003eWhen one of them saw that he was healed, he came back, praising God in a loud voice.\u003c/li\u003e\n\u003cli\u003eHe fell facedown at Jesus\u0026rsquo; feet in thanksgiving to Him—and he was a Samaritan.\u003c/li\u003e\n\u003cli\u003e\u0026ldquo;Were not all ten cleansed?\u0026rdquo; Jesus asked. \u0026ldquo;Where then are the other nine?\u003c/li\u003e\n\u003cli\u003eWas no one found except this foreigner to return and give glory to God?\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eThen Jesus said to him, \u0026ldquo;Rise and go; your faith has made you well!\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eWhen asked by the Pharisees when the kingdom of God would come, Jesus replied, \u0026ldquo;The kingdom of God will not come with observable signs.\u003c/li\u003e\n\u003cli\u003eNor will people say, \u0026lsquo;Look, here it is,\u0026rsquo; or \u0026lsquo;There it is.\u0026rsquo; For you see, the kingdom of God is in your midst.\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eThen He said to the disciples, \u0026ldquo;The time is coming when you will long to see one of the days of the Son of Man, but you will not see it.\u003c/li\u003e\n\u003cli\u003ePeople will tell you, \u0026lsquo;Look, there He is!\u0026rsquo; or \u0026lsquo;Look, here He is!\u0026rsquo; Do not go out or chase after them.\u003c/li\u003e\n\u003cli\u003eFor just as the lightning flashes and lights up the sky from one end to the other, so will be the Son of Man in His day.\u003c/li\u003e\n\u003cli\u003eBut first He must suffer many things and be rejected by this generation.\u003c/li\u003e\n\u003cli\u003eJust as it was in the days of Noah, so also will it be in the days of the Son of Man:\u003c/li\u003e\n\u003cli\u003ePeople were eating and drinking, marrying and being given in marriage, up to the day Noah entered the ark. Then the flood came and destroyed them all.\u003c/li\u003e\n\u003cli\u003eIt was the same in the days of Lot: People were eating and drinking, buying and selling, planting and building.\u003c/li\u003e\n\u003cli\u003eBut on the day Lot left Sodom, fire and sulfur rained down from heaven and destroyed them all.\u003c/li\u003e\n\u003cli\u003eIt will be just like that on the day the Son of Man is revealed.\u003c/li\u003e\n\u003cli\u003eOn that day, let no one on the housetop come down to retrieve his possessions. Likewise, let no one in the field return for anything he has left behind.\u003c/li\u003e\n\u003cli\u003eRemember Lot\u0026rsquo;s wife!\u003c/li\u003e\n\u003cli\u003eWhoever tries to save his life will lose it, but whoever loses his life will preserve it.\u003c/li\u003e\n\u003cli\u003eI tell you, on that night two people will be in one bed: one will be taken and the other left.\u003c/li\u003e\n\u003cli\u003eTwo women will be grinding grain together: one will be taken and the other left.\u0026rdquo;\u003c/li\u003e\n\u003cli\u003e\u0026ldquo;Where, Lord?\u0026rdquo; they asked.\nJesus answered, \u0026ldquo;Wherever there is a carcass, there the vultures will gather.\u0026rdquo;\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/details\u003e\n\u003ch2 id=\"day-5-mark-10\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDay 5 — Mark 10\u003c/span\u003e \u003ca href=\"#day-5-mark-10\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cdetails class=\"admonition quote\"\u003e\n\u003csummary class=\"admonition-title\"\u003eMark 10\u003c/summary\u003e\n\u003col\u003e\n\u003cli\u003eThen Jesus left that place and went into the region of Judea, beyond the Jordan. Again the crowds came to Him and He taught them, as was His custom.\u003c/li\u003e\n\u003cli\u003eSome Pharisees came to test Him. \u0026ldquo;Is it lawful for a man to divorce his wife?\u0026rdquo; they inquired.\u003c/li\u003e\n\u003cli\u003e\u0026ldquo;What did Moses command you?\u0026rdquo; He replied.\u003c/li\u003e\n\u003cli\u003eThey answered, \u0026ldquo;Moses permitted a man to write his wife a certificate of divorce and send her away.\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eBut Jesus told them, \u0026ldquo;Moses wrote this commandment for you because of your hardness of heart.\u003c/li\u003e\n\u003cli\u003eHowever, from the beginning of creation, \u0026lsquo;God made them male and female.\u0026rsquo;\u003c/li\u003e\n\u003cli\u003e\u0026lsquo;For this reason a man will leave his father and mother and be united to his wife,\u003c/li\u003e\n\u003cli\u003eand the two will become one flesh.\u0026rsquo; So they are no longer two, but one flesh.\u003c/li\u003e\n\u003cli\u003eTherefore what God has joined together, let man not separate.\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eWhen they were back inside the house, the disciples asked Jesus about this matter.\u003c/li\u003e\n\u003cli\u003eSo He told them, \u0026ldquo;Whoever divorces his wife and marries another woman commits adultery against her.\u003c/li\u003e\n\u003cli\u003eAnd if a woman divorces her husband and marries another man, she commits adultery.\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eNow people were bringing the little children to Jesus for Him to place His hands on them, and the disciples rebuked those who brought them.\u003c/li\u003e\n\u003cli\u003eBut when Jesus saw this, He was indignant and told them, \u0026ldquo;Let the little children come to Me, and do not hinder them! For the kingdom of God belongs to such as these.\u003c/li\u003e\n\u003cli\u003eTruly I tell you, anyone who does not receive the kingdom of God like a little child will never enter it.\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eAnd He took the children in His arms, placed His hands on them, and blessed them.\u003c/li\u003e\n\u003cli\u003eAs Jesus started on His way, a man ran up and knelt before Him. \u0026ldquo;Good Teacher,\u0026rdquo; he asked, \u0026ldquo;what must I do to inherit eternal life?\u0026rdquo;\u003c/li\u003e\n\u003cli\u003e\u0026ldquo;Why do you call Me good?\u0026rdquo; Jesus replied. \u0026ldquo;No one is good except God alone.\u003c/li\u003e\n\u003cli\u003eYou know the commandments: \u0026lsquo;Do not murder, do not commit adultery, do not steal, do not bear false witness, do not cheat others, honor your father and mother.\u0026rsquo;\u0026rdquo;\u003c/li\u003e\n\u003cli\u003e\u0026ldquo;Teacher,\u0026rdquo; he replied, \u0026ldquo;all these I have kept from my youth.\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eJesus looked at him, loved him, and said to him, \u0026ldquo;There is one thing you lack: Go, sell everything you own and give to the poor, and you will have treasure in heaven. Then come, follow Me.\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eBut the man was saddened by these words and went away in sorrow, because he had great wealth.\u003c/li\u003e\n\u003cli\u003eThen Jesus looked around and said to His disciples, \u0026ldquo;How hard it is for the rich to enter the kingdom of God!\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eAnd the disciples were amazed at His words.\nBut Jesus said to them again, \u0026ldquo;Children, how hard it is to enter the kingdom of God!\u003c/li\u003e\n\u003cli\u003eIt is easier for a camel to pass through the eye of a needle than for a rich man to enter the kingdom of God.\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eThey were even more astonished and said to one another, \u0026ldquo;Who then can be saved?\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eJesus looked at them and said, \u0026ldquo;With man this is impossible, but not with God. For all things are possible with God.\u0026rdquo;\u003c/li\u003e\n\u003cli\u003ePeter began to say to Him, \u0026ldquo;Look, we have left everything and followed You.\u0026rdquo;\u003c/li\u003e\n\u003cli\u003e\u0026ldquo;Truly I tell you,\u0026rdquo; Jesus replied, \u0026ldquo;no one who has left home or brothers or sisters or mother or father or children or fields for My sake and for the gospel\u003c/li\u003e\n\u003cli\u003ewill fail to receive a hundredfold in the present age—houses and brothers and sisters and mothers and children and fields, along with persecutions—and in the age to come, eternal life.\u003c/li\u003e\n\u003cli\u003eBut many who are first will be last, and the last will be first.\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eAs they were going up the road to Jerusalem, Jesus was walking ahead of them. The disciples were amazed, but those who followed were afraid. Again Jesus took the Twelve aside and began to tell them what was going to happen to Him:\u003c/li\u003e\n\u003cli\u003e\u0026ldquo;Look, we are going up to Jerusalem, and the Son of Man will be delivered over to the chief priests and scribes. They will condemn Him to death and will deliver Him over to the Gentiles,\u003c/li\u003e\n\u003cli\u003ewho will mock Him and spit on Him and flog Him and kill Him. And after three days He will rise again.\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eThen James and John, the sons of Zebedee, came to Jesus and declared, \u0026ldquo;Teacher, we want You to do for us whatever we ask.\u0026rdquo;\u003c/li\u003e\n\u003cli\u003e\u0026ldquo;What do you want Me to do for you?\u0026rdquo; He inquired.\u003c/li\u003e\n\u003cli\u003eThey answered, \u0026ldquo;Grant that one of us may sit at Your right hand and the other at Your left in Your glory.\u0026rdquo;\u003c/li\u003e\n\u003cli\u003e\u0026ldquo;You do not know what you are asking,\u0026rdquo; Jesus replied. \u0026ldquo;Can you drink the cup I will drink, or be baptized with the baptism I will undergo?\u0026rdquo;\u003c/li\u003e\n\u003cli\u003e\u0026ldquo;We can,\u0026rdquo; the brothers answered.\n\u0026ldquo;You will drink the cup that I drink,\u0026rdquo; Jesus said, \u0026ldquo;and you will be baptized with the baptism that I undergo.\u003c/li\u003e\n\u003cli\u003eBut to sit at My right or left is not Mine to grant. These seats belong to those for whom they have been prepared.\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eWhen the ten heard about this, they became indignant with James and John.\u003c/li\u003e\n\u003cli\u003eSo Jesus called them together and said, \u0026ldquo;You know that those regarded as rulers of the Gentiles lord it over them, and their superiors exercise authority over them.\u003c/li\u003e\n\u003cli\u003eBut it shall not be this way among you. Instead, whoever wants to become great among you must be your servant,\u003c/li\u003e\n\u003cli\u003eand whoever wants to be first must be the slave of all.\u003c/li\u003e\n\u003cli\u003eFor even the Son of Man did not come to be served, but to serve, and to give His life as a ransom for many.\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eNext, they came to Jericho. And as Jesus and His disciples were leaving Jericho with a large crowd, a blind beggar named Bartimaeus, the son of Timaeus, was sitting beside the road.\u003c/li\u003e\n\u003cli\u003eWhen he heard that it was Jesus of Nazareth, he began to cry out, \u0026ldquo;Jesus, Son of David, have mercy on me!\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eMany people admonished him to be silent, but he cried out all the louder, \u0026ldquo;Son of David, have mercy on me!\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eJesus stopped and said, \u0026ldquo;Call him.\u0026rdquo;\nSo they called the blind man. \u0026ldquo;Take courage!\u0026rdquo; they said. \u0026ldquo;Get up! He is calling for you.\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eThrowing off his cloak, Bartimaeus jumped up and came to Jesus.\u003c/li\u003e\n\u003cli\u003e\u0026ldquo;What do you want Me to do for you?\u0026rdquo; Jesus asked.\u003c/li\u003e\n\u003cli\u003e\u0026ldquo;Rabboni,\u0026rdquo; said the blind man, \u0026ldquo;let me see again.\u0026rdquo;\u003c/li\u003e\n\u003cli\u003e\u0026ldquo;Go,\u0026rdquo; said Jesus, \u0026ldquo;your faith has healed you.\u0026rdquo; And immediately he received his sight and followed Jesus along the road.\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/details\u003e\n\u003chr\u003e\n\u003ch2 id=\"weekly-journal\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWeekly Journal\u003c/span\u003e \u003ca href=\"#weekly-journal\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"stands-out\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStands out\u003c/span\u003e \u003ca href=\"#stands-out\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch4 id=\"day-1-john-6-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDay 1 — John 6\u003c/span\u003e \u003ca href=\"#day-1-john-6-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre\u003e\u003ccode\u003e9. \u0026quot;Here is a boy with five barley loaves and two small fish. But what difference will these make among so many?\u0026quot;\n\n29. Jesus replied, \u0026quot;The work of God is this: to believe in the One He has sent.\u0026quot;\n\n37. Everyone the Father gives Me will come to Me, and the one who comes to Me I will never drive away.\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch4 id=\"day-4-luke-17-11-37-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDay 4 — Luke 17:11-37\u003c/span\u003e \u003ca href=\"#day-4-luke-17-11-37-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cpre\u003e\u003ccode\u003e14. When Jesus saw them, He said, \u0026quot;Go, show yourselves to the priests.\u0026quot; And as they were on their way, they were cleansed.\n15. When one of them saw that he was healed, he came back, praising God in a loud voice.\n16. He fell facedown at Jesus' feet in thanksgiving to Him—and he was a Samaritan.\n17. \u0026quot;Were not all ten cleansed?\u0026quot; Jesus asked. \u0026quot;Where then are the other nine?\n18. Was no one found except this foreigner to return and give glory to God?\u0026quot;\n19. Then Jesus said to him, \u0026quot;Rise and go; your faith has made you well!\u0026quot;\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3 id=\"means\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMeans\u003c/span\u003e \u003ca href=\"#means\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch4 id=\"day-1-john-6-2\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDay 1 — John 6\u003c/span\u003e \u003ca href=\"#day-1-john-6-2\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eeverything comes from the Lord - God gives every single sgood thing in his own way.\u003c/p\u003e\n\u003ch4 id=\"day-4-luke-17-11-37-2\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDay 4 — Luke 17:11-37\u003c/span\u003e \u003ca href=\"#day-4-luke-17-11-37-2\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eObedience is a gift of faith - and a medium by which God works\u003c/p\u003e\n\u003ch3 id=\"for-me\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFor me\u003c/span\u003e \u003ca href=\"#for-me\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch4 id=\"day-4-luke-17-11-37-3\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDay 4 — Luke 17:11-37\u003c/span\u003e \u003ca href=\"#day-4-luke-17-11-37-3\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eGod\u0026rsquo;s blessing is within his sovereign will to pour out. He has clearly had so much favor on me\u0026hellip; why would I squandor it?\u003c/p\u003e\n\u003ch3 id=\"prayer\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePrayer\u003c/span\u003e \u003ca href=\"#prayer\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003chr\u003e\n\u003ch2 id=\"prayer-requests\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePrayer Requests\u003c/span\u003e \u003ca href=\"#prayer-requests\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e \u003cname\u003e — \u003crequest\u003e\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e \u003cname\u003e — \u003crequest\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"answered-updates\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAnswered / Updates\u003c/span\u003e \u003ca href=\"#answered-updates\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cfollow-ups from previous weeks\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"meeting-notes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMeeting Notes\u003c/span\u003e \u003ca href=\"#meeting-notes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u0026lt;what the group discussed, insights from others\u0026gt;\u003c/p\u003e\n",
      "content_text": "\n# Week 34 — September 6 – 12, 2026\n\n### Meeting: Friday, September 11\n\n### Memory Verse: Philippians 4:19\n\n!!! quote \"Philippians 4:19\"\n\n    19. And my God will supply all your needs according to His glorious riches in Christ Jesus.\n\n## Readings\n\n- [ ] Day 1: John 6\n- [ ] Day 2: Matthew 19:16-30\n- [ ] Day 3: Luke 15-16\n- [ ] Day 4: Luke 17:11-37\n- [ ] Day 5: Mark 10\n\n---\n\n## Day 1 — John 6\n\n??? quote \"John 6\"\n\n    1. After this, Jesus crossed to the other side of the Sea of Galilee (that is, the Sea of Tiberias).\n    2. A large crowd followed Him because they saw the signs He was performing on the sick.\n    3. Then Jesus went up on the mountain and sat down with His disciples.\n    4. Now the Jewish Feast of the Passover was near.\n    5. When Jesus looked up and saw a large crowd coming toward Him, He said to Philip, \"Where can we buy bread for these people to eat?\"\n    6. But He was asking this to test him, for He knew what He was about to do.\n    7. Philip answered, \"Two hundred denarii would not buy enough bread for each of them to have a small piece.\"\n    8. One of His disciples, Andrew, Simon Peter's brother, said to Him,\n    9. \"Here is a boy with five barley loaves and two small fish. But what difference will these make among so many?\"\n    10. \"Have the people sit down,\" Jesus said. Now there was plenty of grass in that place, so the men sat down, about five thousand of them.\n    11. Then Jesus took the loaves and the fish, gave thanks, and distributed to those who were seated as much as they wanted.\n    12. And when everyone was full, He said to His disciples, \"Gather the pieces that are left over, so that nothing will be wasted.\"\n    13. So they collected them and filled twelve baskets with the pieces of the five barley loaves left over by those who had eaten.\n    14. When the people saw the sign that Jesus had performed, they began to say, \"Truly this is the Prophet who is to come into the world.\"\n    15. Then Jesus, realizing that they were about to come and make Him king by force, withdrew again to a mountain by Himself.\n    16. When evening came, His disciples went down to the sea,\n    17. got into a boat, and started across the sea to Capernaum. It was already dark, and Jesus had not yet gone out to them.\n    18. A strong wind was blowing, and the sea grew agitated.\n    19. When they had rowed about three or four miles, they saw Jesus approaching the boat, walking on the sea—and they were terrified.\n    20. But Jesus spoke up: \"It is I; do not be afraid.\"\n    21. Then they were willing to take Him into the boat, and at once the boat reached the shore where they were heading.\n    22. The next day, the crowd that had remained on the other side of the sea realized that only one boat had been there, and that Jesus had not boarded it with His disciples, but they had gone away alone.\n    23. However, some boats from Tiberias landed near the place where the people had eaten the bread after the Lord had given thanks.\n    24. So when the crowd saw that neither Jesus nor His disciples were there, they got into the boats and went to Capernaum to look for Him.\n    25. When they found Him on the other side of the sea, they asked Him, \"Rabbi, when did You get here?\"\n    26. Jesus replied, \"Truly, truly, I tell you, it is not because you saw these signs that you are looking for Me, but because you ate the loaves and had your fill.\n    27. Do not work for food that perishes, but for food that endures to eternal life, which the Son of Man will give you. For on Him God the Father has placed His seal of approval.\"\n    28. Then they inquired, \"What must we do to perform the works of God?\"\n    29. Jesus replied, \"The work of God is this: to believe in the One He has sent.\"\n    30. So they asked Him, \"What sign then will You perform, so that we may see it and believe You? What will You do?\n    31. Our fathers ate the manna in the wilderness, as it is written: 'He gave them bread from heaven to eat.'\"\n    32. Jesus said to them, \"Truly, truly, I tell you, it was not Moses who gave you the bread from heaven, but it is My Father who gives you the true bread from heaven.\n    33. For the bread of God is He who comes down from heaven and gives life to the world.\"\n    34. \"Sir,\" they said, \"give us this bread at all times.\"\n    35. Jesus answered, \"I am the bread of life. Whoever comes to Me will never hunger, and whoever believes in Me will never thirst.\n    36. But as I stated, you have seen Me and still you do not believe.\n    37. Everyone the Father gives Me will come to Me, and the one who comes to Me I will never drive away.\n    38. For I have come down from heaven, not to do My own will, but to do the will of Him who sent Me.\n    39. And this is the will of Him who sent Me, that I shall lose none of those He has given Me, but raise them up at the last day.\n    40. For it is My Father's will that everyone who looks to the Son and believes in Him shall have eternal life, and I will raise him up at the last day.\"\n    41. At this, the Jews began to grumble about Jesus because He had said, \"I am the bread that came down from heaven.\"\n    42. They were asking, \"Is this not Jesus, the son of Joseph, whose father and mother we know? How then can He say, 'I have come down from heaven?'\"\n    43. \"Stop grumbling among yourselves,\" Jesus replied.\n    44. \"No one can come to Me unless the Father who sent Me draws him, and I will raise him up at the last day.\n    45. It is written in the Prophets: 'And they will all be taught by God.' Everyone who has heard the Father and learned from Him comes to Me—\n    46. not that anyone has seen the Father except the One who is from God; only He has seen the Father.\n    47. Truly, truly, I tell you, he who believes has eternal life.\n    48. I am the bread of life.\n    49. Your fathers ate the manna in the wilderness, yet they died.\n    50. This is the bread that comes down from heaven, so that anyone may eat of it and not die.\n    51. I am the living bread that came down from heaven. If anyone eats of this bread, he will live forever. And this bread, which I will give for the life of the world, is My flesh.\"\n    52. At this, the Jews began to argue among themselves, \"How can this man give us His flesh to eat?\"\n    53. So Jesus said to them, \"Truly, truly, I tell you, unless you eat the flesh and drink the blood of the Son of Man, you have no life in you.\n    54. Whoever eats My flesh and drinks My blood has eternal life, and I will raise him up at the last day.\n    55. For My flesh is real food, and My blood is real drink.\n    56. Whoever eats My flesh and drinks My blood remains in Me, and I in him.\n    57. Just as the living Father sent Me and I live because of the Father, so also the one who feeds on Me will live because of Me.\n    58. This is the bread that came down from heaven. Unlike your fathers, who ate the manna and died, the one who eats this bread will live forever.\"\n    59. Jesus said this while teaching in the synagogue in Capernaum.\n    60. On hearing it, many of His disciples said, \"This is a difficult teaching. Who can accept it?\"\n    61. Aware that His disciples were grumbling about this teaching, Jesus asked them, \"Does this offend you?\n    62. Then what will happen if you see the Son of Man ascend to where He was before?\n    63. The Spirit gives life; the flesh profits nothing. The words I have spoken to you are spirit and they are life.\n    64. However, there are some of you who do not believe.\" (For Jesus had known from the beginning which of them did not believe and who would betray Him.)\n    65. Then Jesus said, \"This is why I told you that no one can come to Me unless the Father has granted it to him.\"\n    66. From that time on many of His disciples turned back and no longer walked with Him.\n    67. So Jesus asked the Twelve, \"Do you want to leave too?\"\n    68. Simon Peter replied, \"Lord, to whom would we go? You have the words of eternal life.\n    69. We believe and know that You are the Holy One of God.\"\n    70. Jesus answered them, \"Have I not chosen you, the Twelve? Yet one of you is a devil!\"\n    71. He was speaking about Judas, the son of Simon Iscariot. For although Judas was one of the Twelve, he was later to betray Jesus.\n\n## Day 2 — Matthew 19:16-30\n\n??? quote \"Matthew 19:16-30\"\n\n    16. Just then a man came up to Jesus and inquired, \"Teacher, what good thing must I do to obtain eternal life?\"\n    17. \"Why do you ask Me about what is good?\" Jesus replied. \"There is only One who is good. If you want to enter life, keep the commandments.\"\n    18. \"Which ones?\" the man asked.\n    Jesus answered, \"'Do not murder, do not commit adultery, do not steal, do not bear false witness,\n    19. honor your father and mother, and love your neighbor as yourself.'\"\n    20. \"All these I have kept,\" said the young man. \"What do I still lack?\"\n    21. Jesus told him, \"If you want to be perfect, go, sell your possessions and give to the poor, and you will have treasure in heaven. Then come, follow Me.\"\n    22. When the young man heard this, he went away in sorrow, because he had great wealth.\n    23. Then Jesus said to His disciples, \"Truly I tell you, it is hard for a rich man to enter the kingdom of heaven.\n    24. Again I tell you, it is easier for a camel to pass through the eye of a needle than for a rich man to enter the kingdom of God.\"\n    25. When the disciples heard this, they were greatly astonished and asked, \"Who then can be saved?\"\n    26. Jesus looked at them and said, \"With man this is impossible, but with God all things are possible.\"\n    27. \"Look,\" Peter replied, \"we have left everything to follow You. What then will there be for us?\"\n    28. Jesus said to them, \"Truly I tell you, in the renewal of all things, when the Son of Man sits on His glorious throne, you who have followed Me will also sit on twelve thrones, judging the twelve tribes of Israel.\n    29. And everyone who has left houses or brothers or sisters or father or mother or wife or children or fields for the sake of My name will receive a hundredfold and will inherit eternal life.\n    30. But many who are first will be last, and the last will be first.\n\n## Day 3 — Luke 15-16\n\n??? quote \"Luke 15\"\n\n    1. Now all the tax collectors and sinners were gathering around to listen to Jesus.\n    2. So the Pharisees and scribes began to grumble: \"This man welcomes sinners and eats with them.\"\n    3. Then Jesus told them this parable:\n    4. \"What man among you, if he has a hundred sheep and loses one of them, does not leave the ninety-nine in the pasture and go after the one that is lost, until he finds it?\n    5. And when he finds it, he joyfully puts it on his shoulders,\n    6. comes home, and calls together his friends and neighbors to tell them, 'Rejoice with me, for I have found my lost sheep!'\n    7. I tell you that in the same way there will be more joy in heaven over one sinner who repents than over ninety-nine righteous ones who do not need to repent.\n    8. Or what woman who has ten silver coins and loses one of them does not light a lamp, sweep her house, and search carefully until she finds it?\n    9. And when she finds it, she calls together her friends and neighbors to say, 'Rejoice with me, for I have found my lost coin.'\n    10. In the same way, I tell you, there is joy in the presence of God's angels over one sinner who repents.\"\n    11. Then Jesus said, \"There was a man who had two sons.\n    12. The younger son said to him, 'Father, give me my share of the estate.' So he divided his property between them.\n    13. After a few days, the younger son got everything together and journeyed to a distant country, where he squandered his wealth in wild living.\n    14. After he had spent all he had, a severe famine swept through that country, and he began to be in need.\n    15. So he went and hired himself out to a citizen of that country, who sent him into his fields to feed the pigs.\n    16. He longed to fill his belly with the pods the pigs were eating, but no one would give him a thing.\n    17. Finally he came to his senses and said, 'How many of my father's hired servants have plenty of food, but here I am, starving to death!\n    18. I will get up and go back to my father and say to him, \"Father, I have sinned against heaven and against you.\n    19. I am no longer worthy to be called your son. Make me like one of your hired servants.\"'\n    20. So he got up and went to his father. But while he was still in the distance, his father saw him and was filled with compassion. He ran to his son, embraced him, and kissed him.\n    21. The son declared, 'Father, I have sinned against heaven and against you. I am no longer worthy to be called your son.'\n    22. But the father said to his servants, 'Quick! Bring the best robe and put it on him. Put a ring on his finger and sandals on his feet.\n    23. Bring the fattened calf and kill it. Let us feast and celebrate.\n    24. For this son of mine was dead and is alive again! He was lost and is found!' So they began to celebrate.\n    25. Meanwhile the older son was in the field, and as he approached the house, he heard music and dancing.\n    26. So he called one of the servants and asked what was going on.\n    27. 'Your brother has returned,' he said, 'and your father has killed the fattened calf, because he has him back safe and sound.'\n    28. The older son became angry and refused to go in. So his father came out and pleaded with him.\n    29. But he answered his father, 'Look, all these years I have served you and never disobeyed a commandment of yours. Yet you never gave me even a young goat so I could celebrate with my friends.\n    30. But when this son of yours returns from squandering your wealth with prostitutes, you kill the fattened calf for him!'\n    31. 'Son, you are always with me,' the father said, 'and all that is mine is yours.\n    32. But it was fitting to celebrate and be glad, because this brother of yours was dead and is alive again; he was lost and is found.'\"\n\n??? quote \"Luke 16\"\n\n    1. Jesus also said to His disciples, \"There was a rich man whose manager was accused of wasting his possessions.\n    2. So he called him in to ask, 'What is this I hear about you? Turn in an account of your management, for you cannot be manager any longer.'\n    3. The manager said to himself, 'What shall I do, now that my master is taking away my position? I am too weak to dig and too ashamed to beg.\n    4. I know what I will do so that after my removal from management, people will welcome me into their homes.'\n    5. And he called in each one of his master's debtors. 'How much do you owe my master?' he asked the first.\n    6. 'A hundred measures of olive oil,' he answered.\n    'Take your bill,' said the manager, 'sit down quickly, and write fifty.'\n    7. Then he asked another, 'And how much do you owe?'\n    'A hundred measures of wheat,' he replied.\n    'Take your bill and write eighty,' he told him.\n    8. The master commended the dishonest manager because he had acted shrewdly. For the sons of this age are more shrewd in dealing with their own kind than are the sons of light.\n    9. I tell you, use worldly wealth to make friends for yourselves so that when it is gone, they will welcome you into eternal dwellings.\n    10. Whoever is faithful with very little will also be faithful with much, and whoever is dishonest with very little will also be dishonest with much.\n    11. So if you have not been faithful with worldly wealth, who will entrust you with true riches?\n    12. And if you have not been faithful with the belongings of another, who will give you belongings of your own?\n    13. No servant can serve two masters. Either he will hate the one and love the other, or he will be devoted to the one and despise the other. You cannot serve both God and money.\"\n    14. The Pharisees, who were lovers of money, heard all of this and were scoffing at Jesus.\n    15. So He said to them, \"You are the ones who justify yourselves before men, but God knows your hearts. For what is prized among men is detestable before God.\n    16. The Law and the Prophets were proclaimed until John. Since that time, the gospel of the kingdom of God is being preached, and everyone is forcing his way into it.\n    17. But it is easier for heaven and earth to pass away than for a single stroke of a pen to drop out of the Law.\n    18. Anyone who divorces his wife and marries another woman commits adultery, and he who marries a divorced woman commits adultery.\n    19. Now there was a rich man dressed in purple and fine linen, who lived each day in joyous splendor.\n    20. And a beggar named Lazarus lay at his gate, covered with sores\n    21. and longing to be fed with the crumbs that fell from the rich man's table. Even the dogs came and licked his sores.\n    22. One day the beggar died and was carried by the angels to Abraham's side. And the rich man also died and was buried.\n    23. In Hades, where he was in torment, he looked up and saw Abraham from afar, with Lazarus by his side.\n    24. So he cried out, 'Father Abraham, have mercy on me and send Lazarus to dip the tip of his finger in water and cool my tongue. For I am in agony in this fire.'\n    25. But Abraham answered, 'Child, remember that during your lifetime you received your good things, while Lazarus received bad things. But now he is comforted here, while you are in agony.\n    26. And besides all this, a great chasm has been fixed between us and you, so that even those who wish cannot cross from here to you, nor can anyone cross from there to us.'\n    27. 'Then I beg you, father,' he said, 'send Lazarus to my father''s house,\n    28. for I have five brothers. Let him warn them, so that they will not also end up in this place of torment.'\n    29. But Abraham replied, 'They have Moses and the Prophets; let your brothers listen to them.'\n    30. 'No, father Abraham,' he said, 'but if someone is sent to them from the dead, they will repent.'\n    31. Then Abraham said to him, 'If they do not listen to Moses and the Prophets, they will not be persuaded even if someone rises from the dead.'\"\n\n## Day 4 — Luke 17:11-37\n\n??? quote \"Luke 17:11-37\"\n\n    11. While Jesus was on His way to Jerusalem, He was passing between Samaria and Galilee.\n    12. As He entered one of the villages, He was met by ten lepers. They stood at a distance\n    13. and raised their voices, shouting, \"Jesus, Master, have mercy on us!\"\n    14. When Jesus saw them, He said, \"Go, show yourselves to the priests.\" And as they were on their way, they were cleansed.\n    15. When one of them saw that he was healed, he came back, praising God in a loud voice.\n    16. He fell facedown at Jesus' feet in thanksgiving to Him—and he was a Samaritan.\n    17. \"Were not all ten cleansed?\" Jesus asked. \"Where then are the other nine?\n    18. Was no one found except this foreigner to return and give glory to God?\"\n    19. Then Jesus said to him, \"Rise and go; your faith has made you well!\"\n    20. When asked by the Pharisees when the kingdom of God would come, Jesus replied, \"The kingdom of God will not come with observable signs.\n    21. Nor will people say, 'Look, here it is,' or 'There it is.' For you see, the kingdom of God is in your midst.\"\n    22. Then He said to the disciples, \"The time is coming when you will long to see one of the days of the Son of Man, but you will not see it.\n    23. People will tell you, 'Look, there He is!' or 'Look, here He is!' Do not go out or chase after them.\n    24. For just as the lightning flashes and lights up the sky from one end to the other, so will be the Son of Man in His day.\n    25. But first He must suffer many things and be rejected by this generation.\n    26. Just as it was in the days of Noah, so also will it be in the days of the Son of Man:\n    27. People were eating and drinking, marrying and being given in marriage, up to the day Noah entered the ark. Then the flood came and destroyed them all.\n    28. It was the same in the days of Lot: People were eating and drinking, buying and selling, planting and building.\n    29. But on the day Lot left Sodom, fire and sulfur rained down from heaven and destroyed them all.\n    30. It will be just like that on the day the Son of Man is revealed.\n    31. On that day, let no one on the housetop come down to retrieve his possessions. Likewise, let no one in the field return for anything he has left behind.\n    32. Remember Lot's wife!\n    33. Whoever tries to save his life will lose it, but whoever loses his life will preserve it.\n    34. I tell you, on that night two people will be in one bed: one will be taken and the other left.\n    35. Two women will be grinding grain together: one will be taken and the other left.\"\n    37. \"Where, Lord?\" they asked.\n    Jesus answered, \"Wherever there is a carcass, there the vultures will gather.\"\n\n## Day 5 — Mark 10\n\n??? quote \"Mark 10\"\n\n    1. Then Jesus left that place and went into the region of Judea, beyond the Jordan. Again the crowds came to Him and He taught them, as was His custom.\n    2. Some Pharisees came to test Him. \"Is it lawful for a man to divorce his wife?\" they inquired.\n    3. \"What did Moses command you?\" He replied.\n    4. They answered, \"Moses permitted a man to write his wife a certificate of divorce and send her away.\"\n    5. But Jesus told them, \"Moses wrote this commandment for you because of your hardness of heart.\n    6. However, from the beginning of creation, 'God made them male and female.'\n    7. 'For this reason a man will leave his father and mother and be united to his wife,\n    8. and the two will become one flesh.' So they are no longer two, but one flesh.\n    9. Therefore what God has joined together, let man not separate.\"\n    10. When they were back inside the house, the disciples asked Jesus about this matter.\n    11. So He told them, \"Whoever divorces his wife and marries another woman commits adultery against her.\n    12. And if a woman divorces her husband and marries another man, she commits adultery.\"\n    13. Now people were bringing the little children to Jesus for Him to place His hands on them, and the disciples rebuked those who brought them.\n    14. But when Jesus saw this, He was indignant and told them, \"Let the little children come to Me, and do not hinder them! For the kingdom of God belongs to such as these.\n    15. Truly I tell you, anyone who does not receive the kingdom of God like a little child will never enter it.\"\n    16. And He took the children in His arms, placed His hands on them, and blessed them.\n    17. As Jesus started on His way, a man ran up and knelt before Him. \"Good Teacher,\" he asked, \"what must I do to inherit eternal life?\"\n    18. \"Why do you call Me good?\" Jesus replied. \"No one is good except God alone.\n    19. You know the commandments: 'Do not murder, do not commit adultery, do not steal, do not bear false witness, do not cheat others, honor your father and mother.'\"\n    20. \"Teacher,\" he replied, \"all these I have kept from my youth.\"\n    21. Jesus looked at him, loved him, and said to him, \"There is one thing you lack: Go, sell everything you own and give to the poor, and you will have treasure in heaven. Then come, follow Me.\"\n    22. But the man was saddened by these words and went away in sorrow, because he had great wealth.\n    23. Then Jesus looked around and said to His disciples, \"How hard it is for the rich to enter the kingdom of God!\"\n    24. And the disciples were amazed at His words.\n    But Jesus said to them again, \"Children, how hard it is to enter the kingdom of God!\n    25. It is easier for a camel to pass through the eye of a needle than for a rich man to enter the kingdom of God.\"\n    26. They were even more astonished and said to one another, \"Who then can be saved?\"\n    27. Jesus looked at them and said, \"With man this is impossible, but not with God. For all things are possible with God.\"\n    28. Peter began to say to Him, \"Look, we have left everything and followed You.\"\n    29. \"Truly I tell you,\" Jesus replied, \"no one who has left home or brothers or sisters or mother or father or children or fields for My sake and for the gospel\n    30. will fail to receive a hundredfold in the present age—houses and brothers and sisters and mothers and children and fields, along with persecutions—and in the age to come, eternal life.\n    31. But many who are first will be last, and the last will be first.\"\n    32. As they were going up the road to Jerusalem, Jesus was walking ahead of them. The disciples were amazed, but those who followed were afraid. Again Jesus took the Twelve aside and began to tell them what was going to happen to Him:\n    33. \"Look, we are going up to Jerusalem, and the Son of Man will be delivered over to the chief priests and scribes. They will condemn Him to death and will deliver Him over to the Gentiles,\n    34. who will mock Him and spit on Him and flog Him and kill Him. And after three days He will rise again.\"\n    35. Then James and John, the sons of Zebedee, came to Jesus and declared, \"Teacher, we want You to do for us whatever we ask.\"\n    36. \"What do you want Me to do for you?\" He inquired.\n    37. They answered, \"Grant that one of us may sit at Your right hand and the other at Your left in Your glory.\"\n    38. \"You do not know what you are asking,\" Jesus replied. \"Can you drink the cup I will drink, or be baptized with the baptism I will undergo?\"\n    39. \"We can,\" the brothers answered.\n    \"You will drink the cup that I drink,\" Jesus said, \"and you will be baptized with the baptism that I undergo.\n    40. But to sit at My right or left is not Mine to grant. These seats belong to those for whom they have been prepared.\"\n    41. When the ten heard about this, they became indignant with James and John.\n    42. So Jesus called them together and said, \"You know that those regarded as rulers of the Gentiles lord it over them, and their superiors exercise authority over them.\n    43. But it shall not be this way among you. Instead, whoever wants to become great among you must be your servant,\n    44. and whoever wants to be first must be the slave of all.\n    45. For even the Son of Man did not come to be served, but to serve, and to give His life as a ransom for many.\"\n    46. Next, they came to Jericho. And as Jesus and His disciples were leaving Jericho with a large crowd, a blind beggar named Bartimaeus, the son of Timaeus, was sitting beside the road.\n    47. When he heard that it was Jesus of Nazareth, he began to cry out, \"Jesus, Son of David, have mercy on me!\"\n    48. Many people admonished him to be silent, but he cried out all the louder, \"Son of David, have mercy on me!\"\n    49. Jesus stopped and said, \"Call him.\"\n    So they called the blind man. \"Take courage!\" they said. \"Get up! He is calling for you.\"\n    50. Throwing off his cloak, Bartimaeus jumped up and came to Jesus.\n    51. \"What do you want Me to do for you?\" Jesus asked.\n    52. \"Rabboni,\" said the blind man, \"let me see again.\"\n    53. \"Go,\" said Jesus, \"your faith has healed you.\" And immediately he received his sight and followed Jesus along the road.\n\n---\n\n## Weekly Journal\n\n### Stands out\n\n#### Day 1 — John 6\n\n    9. \"Here is a boy with five barley loaves and two small fish. But what difference will these make among so many?\"\n\n    29. Jesus replied, \"The work of God is this: to believe in the One He has sent.\"\n\n    37. Everyone the Father gives Me will come to Me, and the one who comes to Me I will never drive away.\n\n#### Day 4 — Luke 17:11-37\n\n    14. When Jesus saw them, He said, \"Go, show yourselves to the priests.\" And as they were on their way, they were cleansed.\n    15. When one of them saw that he was healed, he came back, praising God in a loud voice.\n    16. He fell facedown at Jesus' feet in thanksgiving to Him—and he was a Samaritan.\n    17. \"Were not all ten cleansed?\" Jesus asked. \"Where then are the other nine?\n    18. Was no one found except this foreigner to return and give glory to God?\"\n    19. Then Jesus said to him, \"Rise and go; your faith has made you well!\"\n\n### Means\n\n#### Day 1 — John 6\n\neverything comes from the Lord - God gives every single sgood thing in his own way.\n\n#### Day 4 — Luke 17:11-37\n\nObedience is a gift of faith - and a medium by which God works\n\n### For me\n\n#### Day 4 — Luke 17:11-37\n\nGod's blessing is within his sovereign will to pour out. He has clearly had so much favor on me... why would I squandor it?\n\n### Prayer\n\n---\n\n## Prayer Requests\n\n- [ ] \u003cname\u003e — \u003crequest\u003e\n- [ ] \u003cname\u003e — \u003crequest\u003e\n\n### Answered / Updates\n\n- \u003cfollow-ups from previous weeks\u003e\n\n## Meeting Notes\n\n\u003cwhat the group discussed, insights from others\u003e\n",
      "summary": "!!! quote \"Philippians 4:19\"",
      "date_published": "2026-09-07T06:00:00Z",
      "date_modified": "2026-09-07T06:00:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "olivet",
        "faith",
        "mens-group"
      ]
    },
    {
      "id": "https://pype.dev/fwbg-genesis-4-1/",
      "url": "https://pype.dev/fwbg-genesis-4-1/",
      "title": "FWBG - Genesis - 4.1",
      "content_html": "\u003cp\u003eThe Fall is worthy of grieving. The story in the Bible explains the state of\nhumanity, and I think we can grieve humanity\u0026rsquo;s state just via observation\ntoday. But the beauty of the Gospel of Jesus Christ is that with grieving and\nmourning there is hope and redemption\u003c/p\u003e\n",
      "content_text": "\nThe Fall is worthy of grieving. The story in the Bible explains the state of\nhumanity, and I think we can grieve humanity's state just via observation\ntoday. But the beauty of the Gospel of Jesus Christ is that with grieving and\nmourning there is hope and redemption\n",
      "summary": "The Fall is worthy of grieving. The story in the Bible explains the state of humanity, and I think we can grieve humanity's state just via observation today....",
      "date_published": "2026-06-18T06:31:23Z",
      "date_modified": "2026-06-18T06:31:23Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "faith",
        "family-worship-bible-guide"
      ]
    },
    {
      "id": "https://pype.dev/silliness-and-wrecklessness/",
      "url": "https://pype.dev/silliness-and-wrecklessness/",
      "title": "Silliness and Wrecklessness",
      "content_html": "\u003cp\u003eI talked with my oldest daughter about silliness and wrecklessness today. She\nand her sister were playing too rough at bedtime and the younger slapped the\nolder one pretty hard. It wasn\u0026rsquo;t malicious, they\u0026rsquo;re 4 and 6, they were just\nbeing silly but without respect for reality, they were tired, and have been\ntired for a while (thus the bedtime) and in their silliness and tiredness their\nactions became wrekless. This is what I explained to her, and she paused and said\n\u0026ldquo;Dad, what is wreckless?\u0026rdquo; and oh man did my heart melt\u0026hellip; I\u0026rsquo;m so proud of her\nfor asking that question, and feeling comfortable to do so in the middle of our\nconversation made me feel good as her dad.\u003c/p\u003e\n",
      "content_text": "\nI talked with my oldest daughter about silliness and wrecklessness today. She\nand her sister were playing too rough at bedtime and the younger slapped the\nolder one pretty hard. It wasn't malicious, they're 4 and 6, they were just\nbeing silly but without respect for reality, they were tired, and have been\ntired for a while (thus the bedtime) and in their silliness and tiredness their\nactions became wrekless. This is what I explained to her, and she paused and said\n\"Dad, what is wreckless?\" and oh man did my heart melt... I'm so proud of her\nfor asking that question, and feeling comfortable to do so in the middle of our\nconversation made me feel good as her dad.\n",
      "summary": "I talked with my oldest daughter about silliness and wrecklessness today. She and her sister were playing too rough at bedtime and the younger slapped the...",
      "date_published": "2026-06-07T18:39:57Z",
      "date_modified": "2026-06-07T18:39:57Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "family"
      ]
    },
    {
      "id": "https://pype.dev/2026-06-01-notes/",
      "url": "https://pype.dev/2026-06-01-notes/",
      "title": "2026-06-01 Notes",
      "content_text": "\nyesterday: [[2026-05-27-notes]]\n\n- bookorbit for kassia\n- nextcloud was eating up resources this morning\n",
      "summary": "yesterday: 2026-05-27-notes",
      "date_published": "2026-06-01T07:51:47Z",
      "date_modified": "2026-06-01T07:51:47Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/fwbg-genesis-3-3/",
      "url": "https://pype.dev/fwbg-genesis-3-3/",
      "title": "FWBG - Genesis - 3.3",
      "content_html": "\u003ch2 id=\"on-the-fall\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOn the Fall\u003c/span\u003e \u003ca href=\"#on-the-fall\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe consequences of the fall were immediate and great:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eshame (humans recognize their nakedness and cover up)\u003c/li\u003e\n\u003cli\u003eseparation (humans are banished from Paradise/Eden)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eWhen I have nothing to hide, and I\u0026rsquo;m completing my work both at home and my job\nto a degree that I\u0026rsquo;m satisfied with results, then shame and anxiety seem so\nsmall.\u003c/p\u003e\n\u003cp\u003eGod gives grace to people, and he offered grace in the beginning as one of his\nresponses to sin.\u003c/p\u003e\n\u003cp\u003eI can\u0026rsquo;t help but recognize the wrestle with the reality of the Fall, and I\ndon\u0026rsquo;t mean the state of human today - I think we\u0026rsquo;re clearly fallen. But I mean\nthe record in Genesis 3\u0026hellip; I think Genesis 1-11 tells a story to explain human\nhistory but doesn\u0026rsquo;t necessarily give us a play-by-play transcription of that\nhistory. So I need to personally be careful in how much analysis I do of the\nphysical reality of Genesis 3 and be sure to filter my perception of it through\nthe lens of the rest of the Bible.\u003c/p\u003e\n\u003cp\u003eJesus is the snake-crusher promised in 3:9, and he offers grace every day for\nsin to those he loves.\u003c/p\u003e\n\u003cp\u003eMay Jesus today grant me grace to work hard but have the right perspective. The\nthings I stress about in my life, I\u0026rsquo;m afraid are less important, less weighty\nthan the weight of anxiety they cause. Perhaps the anxiety I am dealing with is\na direct result of the Fall, and it continues as I hide away or try to give\ntime and energy to the wrong things.\u003c/p\u003e\n",
      "content_text": "\n## On the Fall\n\nThe consequences of the fall were immediate and great:\n\n- shame (humans recognize their nakedness and cover up)\n- separation (humans are banished from Paradise/Eden)\n\nWhen I have nothing to hide, and I'm completing my work both at home and my job\nto a degree that I'm satisfied with results, then shame and anxiety seem so\nsmall.\n\nGod gives grace to people, and he offered grace in the beginning as one of his\nresponses to sin.\n\nI can't help but recognize the wrestle with the reality of the Fall, and I\ndon't mean the state of human today - I think we're clearly fallen. But I mean\nthe record in Genesis 3... I think Genesis 1-11 tells a story to explain human\nhistory but doesn't necessarily give us a play-by-play transcription of that\nhistory. So I need to personally be careful in how much analysis I do of the\nphysical reality of Genesis 3 and be sure to filter my perception of it through\nthe lens of the rest of the Bible.\n\nJesus is the snake-crusher promised in 3:9, and he offers grace every day for\nsin to those he loves.\n\nMay Jesus today grant me grace to work hard but have the right perspective. The\nthings I stress about in my life, I'm afraid are less important, less weighty\nthan the weight of anxiety they cause. Perhaps the anxiety I am dealing with is\na direct result of the Fall, and it continues as I hide away or try to give\ntime and energy to the wrong things.\n",
      "summary": "The consequences of the fall were immediate and great:",
      "date_published": "2026-05-31T07:12:49Z",
      "date_modified": "2026-05-31T07:12:49Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "faith",
        "family-worship-bible-guide"
      ]
    },
    {
      "id": "https://pype.dev/gods-zeal-for-justice-amont-men-displayed-in-the-divine-counsel/",
      "url": "https://pype.dev/gods-zeal-for-justice-amont-men-displayed-in-the-divine-counsel/",
      "title": "God’s Zeal for Justice Amont Men Displayed in the Divine Counsel",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://www.youtube.com/watch?v=edlishFtHHE\"\u003elink to sermon\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003ePsalm 82\u003c/p\u003e\n\u003cp\u003e1 God stands in the divine assembly;  he administers judgment in the midst of\nthe gods.\n2 “How long will you judge unjustly  and show favoritism to the\nwicked?\nSelah\n3 Judge on behalf of the helpless and the orphan;  provide\njustice to the afflicted and the poor.\n4 Rescue the helpless and the needy;\ndeliver them from the hand of the wicked.”\n5 They do not know or consider. They go about in the darkness,  so that all\nthe foundations of the earth are\nshaken.\n6 I have said, “You are gods,  and sons of the Most High, all of you.\n7 However, you will die like men,  and you will fall like one of the princes.”\n8 Rise up, O God, judge the earth,  because you shall inherit all the nations.\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eEphesians 1:15-22\u003c/p\u003e\n\u003cp\u003e15 Because of this I also, hearing of your faith in the Lord Jesus and your\nlove for all the saints, 16 do not cease giving thanks for you, making mention\nin my prayers, 17 that the God of our Lord Jesus Christ, the glorious Father,\nmay give you a spirit of wisdom and revelation in the knowledge of him 18 (the\neyes of your hearts having been enlightened), so that you may know what is the\nhope of his calling, what are the riches of the glory of his inheritance among\nthe saints, 19 and what is the surpassing greatness of his power toward us who\nbelieve, according to the working of his mighty strength 20 which he has worked\nin Christ, raising him from the dead and seating him at his right hand in the\nheavenly places, 21 above all rule and authority and power and lordship and\nevery name named, not only in this age but also in the coming one, 22 and he\nsubjected all things under his feet and gave him as head over all things to the\nchurch, 23 which is his body, the fullness of the one who fills all things in\nevery way.\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eEphesians 2:4-7\u003c/p\u003e\n\u003cp\u003e4 But God, being rich in mercy, because of his great love with which he\nloved us, 5 and we being dead in trespasses, he made us alive together with\nChrist (by grace you are saved), 6 and raised us together and seated us\ntogether in the heavenly places in Christ Jesus, 7 in order that he might show\nin the coming ages the surpassing riches of his grace in kindness upon us in\nChrist Jesus.\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"running-thoughts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRunning thoughts\u003c/span\u003e \u003ca href=\"#running-thoughts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"seated-in-the-heavently-places-with-christ-jesus\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSeated in the Heavently Places with Christ Jesus\u003c/span\u003e \u003ca href=\"#seated-in-the-heavently-places-with-christ-jesus\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eWe are aware of the idea of resurrection, and Christ\u0026rsquo;s resurrection. We know for those born-again that we\u0026rsquo;ll be raised heavenward.\u003c/p\u003e\n\u003cp\u003eWhat about \u0026ldquo;seated\u0026rdquo;? We are seated with Christ, this is royalty language - describes the right to rule, reign, and judge.\u003c/p\u003e\n\u003cp\u003eSo when Paul tells the Ephesian saints that they\u0026rsquo;ve been seated with Christ in the heavenly places\u0026hellip;. what does it mean right now?\u003c/p\u003e\n\u003cp\u003eWe are \u0026ldquo;there\u0026rdquo; with him (Jesus), right now - seated, ruling with Christ.\u003c/p\u003e\n\u003ch3 id=\"founding-of-the-divine-council\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFounding of the Divine Council\u003c/span\u003e \u003ca href=\"#founding-of-the-divine-council\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eJob 38:4-7\u003c/p\u003e\n\u003cp\u003e4 “Where were you at my laying the foundation of the earth?  Tell me, if\nyou possess understanding.  5 Who determined its measurement? Yes, you do know.\nOr who stretched the measuring line upon it?  6 On what were its bases sunk?\nOr who laid its cornerstone,  7 when the morning stars were singing together\nand all the sons of God shouted for joy?\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eWhen the morning stars were singing together and all the sons of God shouted for joy\u0026hellip; divine language, beings already in existence when the foundations of the earth were laid.\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eJob 1:6\u003c/p\u003e\n\u003cp\u003eAnd it happened one day that the sons of God came to present themselves before Yahweh, and Satan also came into their midst.\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eJob 2:1\u003c/p\u003e\n\u003cp\u003eAnd then one day the sons of God came to present themselves before Yahweh, and Satan also came into their midst to present himself before Yahweh.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eThe \u0026ldquo;sons of God\u0026rdquo;. They present themselves before God, and they\u0026rsquo;re different\nthan other spiritual beings like Cherubim. These beings have some function\napart from God\u0026rsquo;s immediate presence, thus they gather to present themselves\n(not that they were/are always there like the throne guardians)\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eDeuteronomy 32:7-9\u003c/p\u003e\n\u003cp\u003e7 Remember the old days, the years long past;  ask your father, and he will\ninform you,  your elders and they will tell you.  8 When the Most High\napportioned the nations,  at his dividing up of the sons of humankind,  he\nfixed the boundaries of the peoples,  according to the number of the sons of\nGod.  9 For Yahweh’s portion was his people,  Jacob the share of his\ninheritance.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eMoses is referencing Genesis 10/11, The Tower of Babel. There was 1 language,\nbut humans decided to build a name for themselves rather than obey God\u0026rsquo;s\ncommands, so Yahweh confused their language and scattered them. Moses adds the\ncommentary that the \u0026ldquo;borders of the people\u0026rdquo; were fixed \u0026ldquo;according to the number\nof the sons of God\u0026rdquo;. The Divine Council was given the job of ruling over the\nscattered people, to lead them back to Yahweh.\u003c/p\u003e\n\u003cp\u003eYahweh creates a new inheritance for himself through Jacob (Abram -\u0026gt; Israel)\u003c/p\u003e\n\u003cp\u003eA note about Yahweh\u0026rsquo;s character - he freely delegates to his creation (human\nand divine) responsiblities as it pertains to ruling creation. No one forced\nYahweh to do this delegation, he has every right to rule as an authoritative\ndictator since he is the creator of all things, but he partners with his\ncreation, even in their failures.\u003c/p\u003e\n\u003ch3 id=\"failing-of-the-divine-council\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFailing of the Divine Council\u003c/span\u003e \u003ca href=\"#failing-of-the-divine-council\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eNow to the spiritual gods over the nations, he says:\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003ePsalm 82:2\u003c/p\u003e\n\u003cp\u003e“How long will you judge unjustly  and show favoritism to the wicked? Selah\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eThey were supposed to govern righteously\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003ePsalm 82:3-4\u003c/p\u003e\n\u003cp\u003e3 Judge on behalf of the helpless and the orphan;  provide justice to the\nafflicted and the poor.  4 Rescue the helpless and the needy;  deliver them\nfrom the hand of the wicked.”\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eThere are appropriate penalties for judgement. The duty was to protect the weak\nand provide justice. The goal was for the vulnerable to be delievered from the\nhands of the wicked.\u003c/p\u003e\n\u003cp\u003eBob summarizes with some modern language: crime prevention and crime\npunishnment. These are the mechanisms by which the wicked are kept in check,\nand it\u0026rsquo;s through no other means (re: the history of every civilization ever)\u003c/p\u003e\n\u003cp\u003eVerse 5, the Psalmist continues and the \u0026ldquo;they\u0026rdquo; are the subordinates - the\npeople of the world placed under the ruling of the gods.\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003ePsalm 82:5\u003c/p\u003e\n\u003cp\u003eThey do not know or consider.  They go about in the darkness,  so that all\nthe foundations of the earth are shaken.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eGod is saying to his council, \u0026ldquo;They (the humans) do not know. They don\u0026rsquo;t know\nhow to rules or judge, look at them and you have ruled poorly, you have allowed\ninjustice to reign rather than rule and reign yourself and the victims in this\nare the helpless humans and rest of creation\u0026rdquo;\u003c/p\u003e\n\u003cp\u003eie. the sons of God in the divine council are partly to blame for the people\u0026rsquo;s\nmoral ignorance. If the people aren\u0026rsquo;t ruled in a way that leads to morality,\ncorruption takes over. Because it has, the judgement of the divine council\ncomes next:\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003ePsalm 82:6-7\u003c/p\u003e\n\u003cp\u003e6 I have said, “You are gods,  and sons of the Most High, all of you.\n7 However, you will die like men,  and you will fall like one of the princes.”\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition warning\"\u003e\n\u003cp class=\"admonition-title\"\u003eGod's zeal for justice is clear\u003c/p\u003e\n\u003cp\u003eHe will judge his own council to death for their failures.\u003c/p\u003e\n\u003c/div\u003e\n\u003ch3 id=\"fulfilling-of-the-divine-council\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFulfilling of the Divine Council\u003c/span\u003e \u003ca href=\"#fulfilling-of-the-divine-council\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe fulfilment of the divine council is found in Jesus. Yahweh comes himself to govern rightly.\u003c/p\u003e\n\u003cp\u003eThe fulfilment happens at Jesus\u0026rsquo; Ascension - Matthew 28.\u003c/p\u003e\n\u003cp\u003eThe Ascension from Heaven\u0026rsquo;s perspective is in Daniel 7.\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eDaniel 7:13-14\u003c/p\u003e\n\u003cp\u003e13 “I continued watching in the visions of the night, and look, with the\nclouds of heaven one like a son of man was coming, and he came to the Ancient\nof Days, and was presented before him. 14 And to him was given dominion and\nglory and kingship that all the peoples, the nations, and languages would serve\nhim; his dominion is a dominion without end that will not cease, and his\nkingdom is one that will not be destroyed.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eConfirmed agin in Ephesians 1\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eEphesians 1:20-23\u003c/p\u003e\n\u003cp\u003e20 which he has worked in Christ, raising him from the dead and seating him\nat his right hand in the heavenly places, 21 above all rule and authority and\npower and lordship and every name named, not only in this age but also in the\ncoming one, 22 and he subjected all things under his feet and gave him as head\nover all things to the church, 23 which is his body, the fullness of the one\nwho fills all things in every way.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eJesus\u0026rsquo; seat is \u003ccode\u003eabove all rule and authority and power and lordship and every name named\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eThrough Jesus we, believers, are \u0026lsquo;sons of God\u0026rsquo;. The Divine Council\u0026rsquo;s failure to\ngovern the nations well should be somewhat of a warning to us, and an\naffirmation of our calling to rule the earth well. Those who love Jesus, in the\nsame way the 70 sons of God were \u003cstrong\u003esupposed\u003c/strong\u003e to lead the nations back to the\nLord, are to be agents of rescue for the weak and the needy. Jesus gives us\nthis ministry.\u003c/p\u003e\n\u003ch3 id=\"sancity-of-life\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSancity of Life\u003c/span\u003e \u003ca href=\"#sancity-of-life\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eNo one is weaker than the unborn. The fallen sons of God were given a harsh\njudgement for their failure to govern justly. Christians are the \u0026ldquo;new\u0026rdquo; sons of\nGod, we are the ones with the charge and authority to govern well. What do I do\nwith the authority and responsibility God has given me to protect the weak?\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003emeditate on God\u0026rsquo;s zeal for justice\u003c/li\u003e\n\u003cli\u003edo not forget the unborn in prayer (I need to pray more in general anyways)\u003c/li\u003e\n\u003c/ol\u003e\n",
      "content_text": "\n- [link to sermon](https://www.youtube.com/watch?v=edlishFtHHE)\n\n!!! note \"Psalm 82\"\n\n    1 God stands in the divine assembly;  he administers judgment in the midst of\n    the gods.\n    2 “How long will you judge unjustly  and show favoritism to the\n    wicked?\n    Selah\n    3 Judge on behalf of the helpless and the orphan;  provide\n    justice to the afflicted and the poor.\n    4 Rescue the helpless and the needy;\n    deliver them from the hand of the wicked.”\n    5 They do not know or consider. They go about in the darkness,  so that all\n    the foundations of the earth are\n    shaken.\n    6 I have said, “You are gods,  and sons of the Most High, all of you.\n    7 However, you will die like men,  and you will fall like one of the princes.”\n    8 Rise up, O God, judge the earth,  because you shall inherit all the nations.\n\n!!! note \"Ephesians 1:15-22\"\n\n    15 Because of this I also, hearing of your faith in the Lord Jesus and your\n    love for all the saints, 16 do not cease giving thanks for you, making mention\n    in my prayers, 17 that the God of our Lord Jesus Christ, the glorious Father,\n    may give you a spirit of wisdom and revelation in the knowledge of him 18 (the\n    eyes of your hearts having been enlightened), so that you may know what is the\n    hope of his calling, what are the riches of the glory of his inheritance among\n    the saints, 19 and what is the surpassing greatness of his power toward us who\n    believe, according to the working of his mighty strength 20 which he has worked\n    in Christ, raising him from the dead and seating him at his right hand in the\n    heavenly places, 21 above all rule and authority and power and lordship and\n    every name named, not only in this age but also in the coming one, 22 and he\n    subjected all things under his feet and gave him as head over all things to the\n    church, 23 which is his body, the fullness of the one who fills all things in\n    every way.\n\n!!! note \"Ephesians 2:4-7\"\n\n    4 But God, being rich in mercy, because of his great love with which he\n    loved us, 5 and we being dead in trespasses, he made us alive together with\n    Christ (by grace you are saved), 6 and raised us together and seated us\n    together in the heavenly places in Christ Jesus, 7 in order that he might show\n    in the coming ages the surpassing riches of his grace in kindness upon us in\n    Christ Jesus.\n\n## Running thoughts\n\n### Seated in the Heavently Places with Christ Jesus\n\nWe are aware of the idea of resurrection, and Christ's resurrection. We know for those born-again that we'll be raised heavenward.\n\nWhat about \"seated\"? We are seated with Christ, this is royalty language - describes the right to rule, reign, and judge.\n\nSo when Paul tells the Ephesian saints that they've been seated with Christ in the heavenly places.... what does it mean right now?\n\nWe are \"there\" with him (Jesus), right now - seated, ruling with Christ.\n\n### Founding of the Divine Council\n\n!!! note \"Job 38:4-7\"\n\n    4 “Where were you at my laying the foundation of the earth?  Tell me, if\n    you possess understanding.  5 Who determined its measurement? Yes, you do know.\n    Or who stretched the measuring line upon it?  6 On what were its bases sunk?\n    Or who laid its cornerstone,  7 when the morning stars were singing together\n    and all the sons of God shouted for joy?\n\nWhen the morning stars were singing together and all the sons of God shouted for joy... divine language, beings already in existence when the foundations of the earth were laid.\n\n!!! note \"Job 1:6\"\n\n    And it happened one day that the sons of God came to present themselves before Yahweh, and Satan also came into their midst.\n\n!!! note \"Job 2:1\"\n\n    And then one day the sons of God came to present themselves before Yahweh, and Satan also came into their midst to present himself before Yahweh.\n\nThe \"sons of God\". They present themselves before God, and they're different\nthan other spiritual beings like Cherubim. These beings have some function\napart from God's immediate presence, thus they gather to present themselves\n(not that they were/are always there like the throne guardians)\n\n!!! note \"Deuteronomy 32:7-9\"\n\n    7 Remember the old days, the years long past;  ask your father, and he will\n    inform you,  your elders and they will tell you.  8 When the Most High\n    apportioned the nations,  at his dividing up of the sons of humankind,  he\n    fixed the boundaries of the peoples,  according to the number of the sons of\n    God.  9 For Yahweh’s portion was his people,  Jacob the share of his\n    inheritance.\n\nMoses is referencing Genesis 10/11, The Tower of Babel. There was 1 language,\nbut humans decided to build a name for themselves rather than obey God's\ncommands, so Yahweh confused their language and scattered them. Moses adds the\ncommentary that the \"borders of the people\" were fixed \"according to the number\nof the sons of God\". The Divine Council was given the job of ruling over the\nscattered people, to lead them back to Yahweh.\n\nYahweh creates a new inheritance for himself through Jacob (Abram -\u003e Israel)\n\nA note about Yahweh's character - he freely delegates to his creation (human\nand divine) responsiblities as it pertains to ruling creation. No one forced\nYahweh to do this delegation, he has every right to rule as an authoritative\ndictator since he is the creator of all things, but he partners with his\ncreation, even in their failures.\n\n### Failing of the Divine Council\n\nNow to the spiritual gods over the nations, he says:\n\n!!! note \"Psalm 82:2\"\n\n    “How long will you judge unjustly  and show favoritism to the wicked? Selah\n\nThey were supposed to govern righteously\n\n!!! note \"Psalm 82:3-4\"\n\n    3 Judge on behalf of the helpless and the orphan;  provide justice to the\n    afflicted and the poor.  4 Rescue the helpless and the needy;  deliver them\n    from the hand of the wicked.”\n\nThere are appropriate penalties for judgement. The duty was to protect the weak\nand provide justice. The goal was for the vulnerable to be delievered from the\nhands of the wicked.\n\nBob summarizes with some modern language: crime prevention and crime\npunishnment. These are the mechanisms by which the wicked are kept in check,\nand it's through no other means (re: the history of every civilization ever)\n\nVerse 5, the Psalmist continues and the \"they\" are the subordinates - the\npeople of the world placed under the ruling of the gods.\n\n!!! note \"Psalm 82:5\"\n\n    They do not know or consider.  They go about in the darkness,  so that all\n    the foundations of the earth are shaken.\n\nGod is saying to his council, \"They (the humans) do not know. They don't know\nhow to rules or judge, look at them and you have ruled poorly, you have allowed\ninjustice to reign rather than rule and reign yourself and the victims in this\nare the helpless humans and rest of creation\"\n\nie. the sons of God in the divine council are partly to blame for the people's\nmoral ignorance. If the people aren't ruled in a way that leads to morality,\ncorruption takes over. Because it has, the judgement of the divine council\ncomes next:\n\n!!! note \"Psalm 82:6-7\"\n\n    6 I have said, “You are gods,  and sons of the Most High, all of you.\n    7 However, you will die like men,  and you will fall like one of the princes.”\n\n!!! warning \"God's zeal for justice is clear\"\n\n    He will judge his own council to death for their failures.\n\n### Fulfilling of the Divine Council\n\nThe fulfilment of the divine council is found in Jesus. Yahweh comes himself to govern rightly.\n\nThe fulfilment happens at Jesus' Ascension - Matthew 28.\n\nThe Ascension from Heaven's perspective is in Daniel 7.\n\n!!! note \"Daniel 7:13-14\"\n\n    13 “I continued watching in the visions of the night, and look, with the\n    clouds of heaven one like a son of man was coming, and he came to the Ancient\n    of Days, and was presented before him. 14 And to him was given dominion and\n    glory and kingship that all the peoples, the nations, and languages would serve\n    him; his dominion is a dominion without end that will not cease, and his\n    kingdom is one that will not be destroyed.\n\nConfirmed agin in Ephesians 1\n\n!!! note \"Ephesians 1:20-23\"\n\n    20 which he has worked in Christ, raising him from the dead and seating him\n    at his right hand in the heavenly places, 21 above all rule and authority and\n    power and lordship and every name named, not only in this age but also in the\n    coming one, 22 and he subjected all things under his feet and gave him as head\n    over all things to the church, 23 which is his body, the fullness of the one\n    who fills all things in every way.\n\nJesus' seat is `above all rule and authority and power and lordship and every name named`.\n\nThrough Jesus we, believers, are 'sons of God'. The Divine Council's failure to\ngovern the nations well should be somewhat of a warning to us, and an\naffirmation of our calling to rule the earth well. Those who love Jesus, in the\nsame way the 70 sons of God were **supposed** to lead the nations back to the\nLord, are to be agents of rescue for the weak and the needy. Jesus gives us\nthis ministry.\n\n### Sancity of Life\n\nNo one is weaker than the unborn. The fallen sons of God were given a harsh\njudgement for their failure to govern justly. Christians are the \"new\" sons of\nGod, we are the ones with the charge and authority to govern well. What do I do\nwith the authority and responsibility God has given me to protect the weak?\n\n1. meditate on God's zeal for justice\n2. do not forget the unborn in prayer (I need to pray more in general anyways)\n",
      "summary": "link to sermon",
      "date_published": "2026-05-31T07:12:40Z",
      "date_modified": "2026-05-31T07:12:40Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "DCT",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/fwbg-genesis-3-2/",
      "url": "https://pype.dev/fwbg-genesis-3-2/",
      "title": "FWBG - Genesis - 3.2",
      "content_html": "\u003ch2 id=\"resist-temptation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eResist Temptation\u003c/span\u003e \u003ca href=\"#resist-temptation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eEve was tempted by sin by litening to the great deceiver. But it wasn\u0026rsquo;t just\nthat she \u003cstrong\u003eheard\u003c/strong\u003e the serpent, she participated in the conversation, she\nentertained the snake, and she meditated/directed her thoughts and eyes towards\nthe objects of desire and the serpent rather than her God.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe woman \u003cstrong\u003esaw\u003c/strong\u003e that the tree was good for food and it was a delight to the\n\u003cstrong\u003eeyes\u003c/strong\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003e2 Corinthians 10:3-5\u003c/p\u003e\n\u003cp\u003e3 For although we are living in the flesh, we do not wage war according to\nthe flesh, 4 for the weapons of our warfare are not merely human, but powerful\nto God for the tearing down of fortresses, tearing down arguments 5 and all\npride that is raised up against the knowledge of God, and taking every thought\ncaptive to the obedience of Christ.\u003c/p\u003e\n\u003c/div\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThe woman did not resist, she gave in. She entertained the thought of the\nfruit, gazed at it with her eyes, and decided to listen to the serpent and\nultimately herself, rather than God\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSin is a matter of the heart, of looking inward into our own experiences and\nwhat we see with our own eyes, rather than what we heard from the Lord.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe will all see things with our eyes that are pleasing to us, and good for one thing or another.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"admonition danger\"\u003e\n\u003cp class=\"admonition-title\"\u003eJudges 21:25\u003c/p\u003e\n\u003cp\u003eIn those days there was no king in Israel; each one did what was right in\nhis own eyes.\u003c/p\u003e\n\u003c/div\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eScariest Bible verse - \u003cstrong\u003eeveryone did what was right in his own eyes\u003c/strong\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eGoodness comes from doing what\u0026rsquo;s right in God\u0026rsquo;s eyes, not our own\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n## Resist Temptation\n\n- Eve was tempted by sin by litening to the great deceiver. But it wasn't just\n  that she **heard** the serpent, she participated in the conversation, she\n  entertained the snake, and she meditated/directed her thoughts and eyes towards\n  the objects of desire and the serpent rather than her God.\n\n- The woman **saw** that the tree was good for food and it was a delight to the\n  **eyes**\n\n!!! note \"2 Corinthians 10:3-5\"\n\n    3 For although we are living in the flesh, we do not wage war according to\n    the flesh, 4 for the weapons of our warfare are not merely human, but powerful\n    to God for the tearing down of fortresses, tearing down arguments 5 and all\n    pride that is raised up against the knowledge of God, and taking every thought\n    captive to the obedience of Christ.\n\n- The woman did not resist, she gave in. She entertained the thought of the\n  fruit, gazed at it with her eyes, and decided to listen to the serpent and\n  ultimately herself, rather than God\n\n- Sin is a matter of the heart, of looking inward into our own experiences and\n  what we see with our own eyes, rather than what we heard from the Lord.\n- We will all see things with our eyes that are pleasing to us, and good for one thing or another.\n\n!!! danger \"Judges 21:25\"\n\n    In those days there was no king in Israel; each one did what was right in\n    his own eyes.\n\n- Scariest Bible verse - **everyone did what was right in his own eyes**\n\n- Goodness comes from doing what's right in God's eyes, not our own\n",
      "summary": "Eve was tempted by sin by litening to the great deceiver. But it wasn't just that she ** the serpent, she participated in the conversation, she entertained...",
      "date_published": "2026-05-27T07:02:50Z",
      "date_modified": "2026-05-27T07:02:50Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "sin",
        "faith",
        "family-worship-bible-guide"
      ]
    },
    {
      "id": "https://pype.dev/2026-05-27-notes/",
      "url": "https://pype.dev/2026-05-27-notes/",
      "title": "2026-05-27 Notes",
      "content_text": "\nyesterday: [[2026-05-22-notes]]\n\n- [[fwbg-genesis-3-2]]\n",
      "summary": "yesterday: 2026-05-22-notes",
      "date_published": "2026-05-27T07:00:17Z",
      "date_modified": "2026-05-27T07:00:17Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/fwbg-genesis-1-2/",
      "url": "https://pype.dev/fwbg-genesis-1-2/",
      "title": "FWBG - Genesis - 1.2",
      "content_html": "\u003ch2 id=\"theological-implicationf-of-creation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTheological Implicationf of Creation\u003c/span\u003e \u003ca href=\"#theological-implicationf-of-creation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u0026ldquo;Let there be\u0026hellip;\u0026rdquo; God\u0026rsquo;s Word is the agency of creation\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eJesus commanded Lazarus to come out of the grave\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eJohn 11:41–44\u003c/p\u003e\n\u003cp\u003e41 So they took away the stone. And Jesus lifted up his eyes above and\nsaid, “Father, I give thanks to you that you hear me. 42 And I know that you\nalways hear me, but for the sake of the crowd standing around I said it, so\nthat they may believe that you sent me.” 43 And when he had said these things,\nhe cried out with a loud voice, “Lazarus, come out!” 44 The one who had died\ncame out, his feet and his hands bound with strips of cloth, and his face\nwrapped with a facecloth. Jesus said to them, “Untie him and let him go.”\u003c/p\u003e\n\u003c/div\u003e\n\u003cul\u003e\n\u003cli\u003eJesus calmed the storm\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eMark 4:35–40\u003c/p\u003e\n\u003cp\u003e35 And on that day, when it was evening, he said to them, “Let us cross over to\nthe other side.” 36 And leaving the crowd, they took him along, as he was, in\nthe boat. And other boats were with him. 37 And a great storm of wind\ndeveloped, and the waves were breaking into the boat, so that the boat was\nalready being filled with water. 38 And he was in the stern sleeping on the\ncushion, and they woke him up and said to him, “Teacher, is it not a concern to\nyou that we are perishing?” 39 And he woke up and rebuked the wind, and said to\nthe sea, “Be quiet! Be silent!” And the wind abated and there was a great calm.\n40 And he said to them, “Why are you fearful? Do you not yet have faith?”\u003c/p\u003e\n\u003c/div\u003e\n\u003cul\u003e\n\u003cli\u003eGod created - the implication is that creation belongs to him, and if he wishes then creation is accountable to him\u003c/li\u003e\n\u003cli\u003eMan is in cluded in creation, Man is accountable to God, and Man has a way to God through Jesus\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n## Theological Implicationf of Creation\n\n- \"Let there be...\" God's Word is the agency of creation\n\n- Jesus commanded Lazarus to come out of the grave\n\n!!! note \"John 11:41–44\"\n\n    41 So they took away the stone. And Jesus lifted up his eyes above and\n    said, “Father, I give thanks to you that you hear me. 42 And I know that you\n    always hear me, but for the sake of the crowd standing around I said it, so\n    that they may believe that you sent me.” 43 And when he had said these things,\n    he cried out with a loud voice, “Lazarus, come out!” 44 The one who had died\n    came out, his feet and his hands bound with strips of cloth, and his face\n    wrapped with a facecloth. Jesus said to them, “Untie him and let him go.”\n\n- Jesus calmed the storm\n\n!!! note \"Mark 4:35–40\"\n\n    35 And on that day, when it was evening, he said to them, “Let us cross over to\n    the other side.” 36 And leaving the crowd, they took him along, as he was, in\n    the boat. And other boats were with him. 37 And a great storm of wind\n    developed, and the waves were breaking into the boat, so that the boat was\n    already being filled with water. 38 And he was in the stern sleeping on the\n    cushion, and they woke him up and said to him, “Teacher, is it not a concern to\n    you that we are perishing?” 39 And he woke up and rebuked the wind, and said to\n    the sea, “Be quiet! Be silent!” And the wind abated and there was a great calm.\n    40 And he said to them, “Why are you fearful? Do you not yet have faith?”\n\n- God created - the implication is that creation belongs to him, and if he wishes then creation is accountable to him\n- Man is in cluded in creation, Man is accountable to God, and Man has a way to God through Jesus\n",
      "summary": "\"Let there be...\" God's Word is the agency of creation",
      "date_published": "2026-05-24T07:05:23Z",
      "date_modified": "2026-05-24T07:05:23Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "faith",
        "family-worship-bible-guide"
      ]
    },
    {
      "id": "https://pype.dev/it-will-be-hard-to-do-more/",
      "url": "https://pype.dev/it-will-be-hard-to-do-more/",
      "title": "It Will Be Hard To Do More",
      "content_html": "\u003cp\u003eRecently I was given a raise at work after I broached the subject with my\nmanager. I wasn\u0026rsquo;t sure what the outcome would be but I have learned two things\nin nearly a decade in corporate America:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eNo one will fight for you harder than yourself\u003c/li\u003e\n\u003cli\u003eThe worst they can say is no\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"the-raise\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThe Raise\u003c/span\u003e \u003ca href=\"#the-raise\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eSo I talked with my manager about my workload and compensation, and to my\nsurprise he took me seriously. He went up the chain with some accomplishments\nof the year that I wrote up for him (it\u0026rsquo;s his job to advocate for me, but it\u0026rsquo;s\ncertainly my job to give him the ammunition to take into battle). Before much\ntime had passed, a big wig put some time on my calendar. I had a good\nrelationship with my (then) manager, and even with the big wig, so there was\nalways some amount of personal connection amidst the money-talk.\u003c/p\u003e\n\u003ch2 id=\"the-reorg\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThe Reorg\u003c/span\u003e \u003ca href=\"#the-reorg\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eCue a managerial change and reorganization of the team. The dust settled, and\nmy manager wasn\u0026rsquo;t my manager and the big wig wasn\u0026rsquo;t a big wig over my team\nanymore. The details aren\u0026rsquo;t that relevant, but the outcome was that my \u003cem\u003enow\u003c/em\u003e\nmanager is someone I don\u0026rsquo;t know personally — back to square one of\nprofessional-relationship-building.\u003c/p\u003e\n\u003ch2 id=\"the-conversation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThe Conversation\u003c/span\u003e \u003ca href=\"#the-conversation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eDue to the timing of it all, when my raise became official it was this new\nmanager who signed off on it. It was their happy-responsibility to have a quick\nchat to tell me it was official. But that conversation was the most\nawkward of the three.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eDoes this raise of X% close the gap with the other competing opportunities\nyou mentioned to (previous manager)? Because it\u0026rsquo;ll be hard to do more than\nthis.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cdiv class=\"admonition danger\"\u003e\n\u003cp class=\"admonition-title\"\u003e???\u003c/p\u003e\n\u003cp\u003eHard to do more?\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eI was taken aback initially. It felt almost threatening.\u003c/p\u003e\n\u003cp\u003eI really wasn\u0026rsquo;t sure how to respond. I think I was grateful and cordial,\ntalked about how I really do believe in the mission of our work and I\u0026rsquo;m\nthankful that I can receive a raise. This lady is nice but she doesn\u0026rsquo;t know\nwhat my \u0026ldquo;other opportunities\u0026rdquo; are, so there\u0026rsquo;s no honest answer for me to give.\nI wanted to be sarcastic, crack a joke about record profits, make light of her\ndescribing me as a \u0026ldquo;critical player in enterprise deliverables,\u0026rdquo; but I\u0026rsquo;m not\ntrying to make enemies.\u003c/p\u003e\n\u003ch2 id=\"the-reframe\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThe Reframe\u003c/span\u003e \u003ca href=\"#the-reframe\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eSo I called a friend to vent, of course, and he gave me some good advice.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIt was a threat.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eBut not in the way I took it at first. My friend has been at the same company\nlonger than me, and he expounded on her words: \u0026ldquo;it will be hard to do more.\u0026rdquo;\nI felt like she was annoyed with me for fighting for a raise, but my friend\nsaid she was probably just trying to give me a realistic view of my position\nin the company. \u0026ldquo;It will be hard to do more\u0026rdquo; means there are processes in\nplace at such a large enterprise. Rewarding start-up-like behavior and\ncontribution just isn\u0026rsquo;t well-supported. It\u0026rsquo;s much easier to let someone quit\nwho\u0026rsquo;s been with the company a decade and replace them for 20% more than it is\nto just pay them 20% more. If someone (like me) isn\u0026rsquo;t satisfied, that\u0026rsquo;s not the\nonly thing in the conversation - time at the company, time in position, time\nunder specific manager, etc. all are hurdles to more compensation, and I\u0026rsquo;m\nreferring to salary anyways, equity feels like it\u0026rsquo;s out of my grasp. But if I\u0026rsquo;m\ngone and market conditions dictate that my position and responsibilities are\nworth 20% more than what I was being paid, that\u0026rsquo;s what the position will be\nposted at. My previous manager and the big wig were the types to say\npolicy-be-damned when it would get in the way - it might be how I got this\nraise in the first place. But no shade to my new manager, they\u0026rsquo;re just doing their job.\u003c/p\u003e\n\u003cp\u003eIn the end, they were just being honest, and I should appreciate that.\u003c/p\u003e\n",
      "content_text": "\nRecently I was given a raise at work after I broached the subject with my\nmanager. I wasn't sure what the outcome would be but I have learned two things\nin nearly a decade in corporate America:\n\n1. No one will fight for you harder than yourself\n2. The worst they can say is no\n\n## The Raise\n\nSo I talked with my manager about my workload and compensation, and to my\nsurprise he took me seriously. He went up the chain with some accomplishments\nof the year that I wrote up for him (it's his job to advocate for me, but it's\ncertainly my job to give him the ammunition to take into battle). Before much\ntime had passed, a big wig put some time on my calendar. I had a good\nrelationship with my (then) manager, and even with the big wig, so there was\nalways some amount of personal connection amidst the money-talk.\n\n## The Reorg\n\nCue a managerial change and reorganization of the team. The dust settled, and\nmy manager wasn't my manager and the big wig wasn't a big wig over my team\nanymore. The details aren't that relevant, but the outcome was that my _now_\nmanager is someone I don't know personally — back to square one of\nprofessional-relationship-building.\n\n## The Conversation\n\nDue to the timing of it all, when my raise became official it was this new\nmanager who signed off on it. It was their happy-responsibility to have a quick\nchat to tell me it was official. But that conversation was the most\nawkward of the three.\n\n\u003e Does this raise of X% close the gap with the other competing opportunities\n\u003e you mentioned to (previous manager)? Because it'll be hard to do more than\n\u003e this.\n\n!!! danger \"???\"\n\n    Hard to do more?\n\nI was taken aback initially. It felt almost threatening.\n\nI really wasn't sure how to respond. I think I was grateful and cordial,\ntalked about how I really do believe in the mission of our work and I'm\nthankful that I can receive a raise. This lady is nice but she doesn't know\nwhat my \"other opportunities\" are, so there's no honest answer for me to give.\nI wanted to be sarcastic, crack a joke about record profits, make light of her\ndescribing me as a \"critical player in enterprise deliverables,\" but I'm not\ntrying to make enemies.\n\n## The Reframe\n\nSo I called a friend to vent, of course, and he gave me some good advice.\n\n\u003e It was a threat.\n\nBut not in the way I took it at first. My friend has been at the same company\nlonger than me, and he expounded on her words: \"it will be hard to do more.\"\nI felt like she was annoyed with me for fighting for a raise, but my friend\nsaid she was probably just trying to give me a realistic view of my position\nin the company. \"It will be hard to do more\" means there are processes in\nplace at such a large enterprise. Rewarding start-up-like behavior and\ncontribution just isn't well-supported. It's much easier to let someone quit\nwho's been with the company a decade and replace them for 20% more than it is\nto just pay them 20% more. If someone (like me) isn't satisfied, that's not the\nonly thing in the conversation - time at the company, time in position, time\nunder specific manager, etc. all are hurdles to more compensation, and I'm\nreferring to salary anyways, equity feels like it's out of my grasp. But if I'm\ngone and market conditions dictate that my position and responsibilities are\nworth 20% more than what I was being paid, that's what the position will be\nposted at. My previous manager and the big wig were the types to say\npolicy-be-damned when it would get in the way - it might be how I got this\nraise in the first place. But no shade to my new manager, they're just doing their job.\n\nIn the end, they were just being honest, and I should appreciate that.\n",
      "summary": "Recently I was given a raise at work after I broached the subject with my manager. I wasn't sure what the outcome would be but I have learned two things in...",
      "date_published": "2026-05-22T06:23:20Z",
      "date_modified": "2026-05-22T06:23:20Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "work",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/2026-05-22-notes/",
      "url": "https://pype.dev/2026-05-22-notes/",
      "title": "2026-05-22 Notes",
      "content_text": "\nyesterday: [[2026-05-13-notes]]\n",
      "summary": "yesterday: 2026-05-13-notes",
      "date_published": "2026-05-22T06:22:57Z",
      "date_modified": "2026-05-22T06:22:57Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/fwbg-genesis-1-1/",
      "url": "https://pype.dev/fwbg-genesis-1-1/",
      "title": "FWBG - Genesis - 1.1",
      "content_html": "\u003cp\u003eThe stars are the work of God\u0026rsquo;s fingers:\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003ePsalm 8:3\u003c/p\u003e\n\u003cp\u003eWhen I look at your heavens, the work of your fingers,  the moon and the stars which you set in place—\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eBut salvation is the work of his right hand:\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003ePsalm 98:1\u003c/p\u003e\n\u003cp\u003eSing to Yahweh a new song, for he has done wonders.  His right hand and his holy arm have secured his victory.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eIn Genesis 1, God created the Heavens and the earth. He brings \u003ccode\u003eorder to chaos\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"how-can-we-bring-order-to-chaos\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHow can we bring order to chaos?\u003c/span\u003e \u003ca href=\"#how-can-we-bring-order-to-chaos\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003ecleaning the playroom\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"how-can-we-rest\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHow can we rest?\u003c/span\u003e \u003ca href=\"#how-can-we-rest\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eenjoy the creation God has given us\u003c/li\u003e\n\u003cli\u003erejoice in salvation, rejoicing brings refreshment to the soul\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\nThe stars are the work of God's fingers:\n\n!!! note \"Psalm 8:3\"\n\n    When I look at your heavens, the work of your fingers,  the moon and the stars which you set in place—\n\nBut salvation is the work of his right hand:\n\n!!! note \"Psalm 98:1\"\n\n    Sing to Yahweh a new song, for he has done wonders.  His right hand and his holy arm have secured his victory.\n\nIn Genesis 1, God created the Heavens and the earth. He brings `order to chaos`.\n\n## How can we bring order to chaos?\n\n- cleaning the playroom\n\n## How can we rest?\n\n- enjoy the creation God has given us\n- rejoice in salvation, rejoicing brings refreshment to the soul\n",
      "summary": "The stars are the work of God's fingers:",
      "date_published": "2026-05-17T07:26:23Z",
      "date_modified": "2026-05-17T07:26:23Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "faith",
        "family-worship-bible-guide"
      ]
    },
    {
      "id": "https://pype.dev/panicking-led-to-losing-my-desktop/",
      "url": "https://pype.dev/panicking-led-to-losing-my-desktop/",
      "title": "Panicking Led to Losing My Desktop",
      "content_text": "\n## False Sense of Security\n\nI thought I had backups handled... can you imagine how the rest of this post is\ngoing to go with that intro?\n\nTo be fair, I do have backups figured out on my NAS - simple ZFS +\nsanoid/syncoid + replica pool + off-site backup with simple restore pathways.\nHowever, my desktop has been another story entirely. My desktop OS didn't\nsupport ZFS when I started checking it out, and I spent weeks thinking through\nhow I would backup my HOME directory and projects mostly. I landed on a\nsolution that I did validate once, but it fell off my radar and lo' and behold\nthat was problematic...\n\nSo that backup was based on restic for my home directory, but it was lazy. I\nverified it one time but I had built it with ai, thought I understood the\nrestic repo part, and then promptly moved on with my life never buttoning it\nall up. That home directory backup got too big for where I was going to end up\nrestoring it. My desktop system was installed on a 4 TB NVMe drive and due to\nthe circumstances spawning this blog post I was gonna have to drop to a 500 GB\nboot drive with some extra disks as the storage layer. Overall it looked like:\n\n- A 4 TB SSD that was going bad - old OS\n- A 500 GB SSD, that was going to be my new operating system boot disk\n- A 2 TB SSD that was originally going to be this external storage volume\n  anyways but I never set it up because the version of Aurora I was running\n  didn't have ZFS, I was married to the idea of using ZFS, so I never ended up\n  taking advantage of the space. However it was moot to me because my boot drive\n  was 4 TB, high quality drive, so I was \"just sure\" I didn't need it.\n- AND a 4 TB rust disk as well, which was already a ZFS pool, left over from a\n  previous desktop configuration, and admittedly I had forgotten it was even in the system.\n\n## The Storm\n\nIf it wasn't clear the problem is that my super-nice high-speed 4TB NVMe drive\nwas going bad, like really bad. Eventually my OS stopped booting, it was even\ndifficult to live-boot from any other ISO due to, I think ultimately, that disk\ncausing such extreme latency in the start-up processes that they just failed.\nSo I quickly found myself with little-to-no access to my primary desktop's\ndata...\n\n## Where It Went Wrong\n\nWhat I did is I live booted into an Ubuntu server environment (which took blood\nsweat and tears to successfully get into), mounted my home directory from the 4 TB SSD, and\ntried to continue my restic backup to my NAS, like an idiot. But at the same\ntime I also tried to prune it by only backing up a few projects because I\nwas getting worried about time. This was the first primary mistake - trying to\nmuck with my backup script under duress.\n\nThen over the course of the whole thing it ended up taking over a week to solve\nthis when it could've been 2-3 days. So say it with me kids - \"Don't make\ndecisions under duress\"\n\n## Climbing Out\n\nI downloaded opencode and had it help me write the right excludes syntax in my\nrestic backup script and got it back up going. That went ok but opencode agents\nhad no historical context for why anything was the way it was, and frankly an\nagent would've been misled thinking the backup solution was much more solid\nthan it was due to how I documented it.\n\nAgents also miss things... in my chat sessions it knew about the other 2\navailable disks on the desktop system, I could have done a fresh backup to the 4 TB\nspinning rust disk no problem: install zfs, mount the pool, change target of\nrestic, run full... that would've been beautifully simple. But instead I\ntrimmed it down and backed not-everything up to the NAS over the network, and\nto a different backup target nonetheless... SMH.\n\nAs I started to consider which OS I was going to go with next I failed to\ninstall Pop_OS! or Ubuntu onto the new disc... Then I tried Omarchy and the\ninstall script just looped. So, I reinstalled Aurora onto the new 500 GB disk\nand then quickly realized I don't have Firefox tabs, my SSH keys are in that\nrestic backup, my ssh config, api keys in hidden files.... Everything is in\nthat restic backup... The backup that's too big to restore to my new boot drive.\n\nBut you know what I have? That 2 terabyte disk mounted just fine as a\nZFS dataset. And I could mount the 4 TB rust disk with zfs as well because this\nversion of Aurora has zfs working flawlessly!\n\n## Hindsight\n\nWhat I should've done is so simple... While in that ubuntu live environment I\nshould've just either updated restic to be a local backup to the 4 TB rust\ndisk, or rsync'd my home directory to it plain and simple... I got all in my\nhead about not backing up python venvs, node_modules, etc. that I didn't think\nto just basically carbon copy it all to a healthy disk and then prune it later.\nThen I could've synced everything back over that I needed to the new Desktop's\n$HOME and then scheduled the rsync or restic again to that locally mounted disk.\n\n## The Detail I Left Out\n\nThe keen reader might stop to think... why not just mount the old 4TB disk and\ncopy what you need to your new desktop? And that's a prudent question...\nHowever, in order to get anything installed I had to physically remove the 4TB\nSSD from the motherboard, which was basically a full PC tear-down. From there I\nwas able to at least boot in and out of iso's like you'd otherwise expect, and\nI have a USB/NVMe adapter so I planned to mount the old drive and copy things over from\nthere... But sadly... it won't mount. it's dead-dead and it appears that\nanything I didn't save in my days-long-panicked-state is just. gone.\n\nI feel pretty stupid to have not taken advantage of the 2 available disks local\nto the machine, to have naively copied stuff over and dealt with the\norganization later once my OS was back up. I tried to be smart and efficient\nand ended up wasting so much time and losing quite a lot of \"stuff\"... ideas,\nblog posts that I never committed, etc.\n\n## Current Status\n\nSo a few lessons...\n\n1. untested backups are not backups\n2. false backups might be worse than none, although I did at least save a few things so maybe the jury is out here\n3. making decisions while stressed out will lead to missing obviously better pathways... slow down, talk it out\n\nAs for my current status - I'm working on [[desktop-setup-2026]] and recovering what I can from my haphazard'd rsyncs in the live ubuntu env I got into. I'm also setting up a new Linux laptop at work at the same time so maybe I'll hve some workflow changes to write about in the future. For now, it's nice to be forced to accept that not every idea was that important, the good stuff will come back around, and ultimately computers and shit are just things, they're not life.\n",
      "summary": "I thought I had backups handled... can you imagine how the rest of this post is going to go with that intro?",
      "date_published": "2026-05-13T08:24:00Z",
      "date_modified": "2026-05-13T08:24:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "backup",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/reflection-psalm-30-5/",
      "url": "https://pype.dev/reflection-psalm-30-5/",
      "title": "Reflection - Psalm 30:5",
      "content_html": "\u003ch2 id=\"meditation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMeditation\u003c/span\u003e \u003ca href=\"#meditation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003ePsalm 30:5\u003c/p\u003e\n\u003cp\u003eFor there is a moment in his anger;  there is a lifetime in his favor.  Weeping lodges for the evening,  but in the morning comes rejoicing.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eI\u0026rsquo;m not sure how to feel about the thoughts in my head over this verse and\nmeditation this morning, only because I am so tempted to read my present-life\nsituation into it. Lately work has been the worst, I\u0026rsquo;ve written a few notes\nabout it and I\u0026rsquo;m not even sure what I\u0026rsquo;ve published on my own blog over the last\ncouple months because my brain has been in such chaos. Well, a few things\nchanged in regards to leadership, goals, etc. and the anxiety-inducing\nsituation I was thrust into I was kind of thrust out of. Now, there\u0026rsquo;s some\nlingering work and support but the weight that was lifted from my shoulder the\nother day, and the further relief I actually expect to feel as the corporate\nroadmaps get serialized into dozens of PowerPoint presentations to be lost in\nOutlook mailboxes, is very timely with the notion that \u0026ldquo;joy comes in the morning\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003eI found myself wishing for joy the other day\u0026hellip; I was watching a YouTube video\nand the clip used the phrase \u0026ldquo;operationalize joy\u0026rdquo;. It was a guy talking about\nhow he tries to live each day doing what makes him happy - overall nothing too\nsinister. However, the step I took for a few minutes in my head was a step in\nthe direction of trying to maximize joy in my life, rather than trying to\nmaximize Jesus - the one who gives the joy. By God\u0026rsquo;s grace conviction seized my\nheart, and frankly I\u0026rsquo;m still not sure what to do day-to-day as I wrestle with\nmy own \u0026ldquo;stuff\u0026rdquo; but the objective truth that our reality is fundamentally held\ntogether by is simply Jesus Christ. Jesus loves me, joy does come in the\nmorning, and this Psalm wasn\u0026rsquo;t written to me about my work situation in 2026,\nbut God\u0026rsquo;s peace is given to his people through his everlasting word. Praise the\nLord for the Word this morning, for encouragement, for relief both\ntemporary/today and eternal/tomorrow. By God\u0026rsquo;s grace alone does weeping spend\nthe night, but his gracious joy comes with the morning.\u003c/p\u003e\n",
      "content_text": "\n## Meditation\n\n!!! note \"Psalm 30:5\"\n\n    For there is a moment in his anger;  there is a lifetime in his favor.  Weeping lodges for the evening,  but in the morning comes rejoicing.\n\nI'm not sure how to feel about the thoughts in my head over this verse and\nmeditation this morning, only because I am so tempted to read my present-life\nsituation into it. Lately work has been the worst, I've written a few notes\nabout it and I'm not even sure what I've published on my own blog over the last\ncouple months because my brain has been in such chaos. Well, a few things\nchanged in regards to leadership, goals, etc. and the anxiety-inducing\nsituation I was thrust into I was kind of thrust out of. Now, there's some\nlingering work and support but the weight that was lifted from my shoulder the\nother day, and the further relief I actually expect to feel as the corporate\nroadmaps get serialized into dozens of PowerPoint presentations to be lost in\nOutlook mailboxes, is very timely with the notion that \"joy comes in the morning\".\n\nI found myself wishing for joy the other day... I was watching a YouTube video\nand the clip used the phrase \"operationalize joy\". It was a guy talking about\nhow he tries to live each day doing what makes him happy - overall nothing too\nsinister. However, the step I took for a few minutes in my head was a step in\nthe direction of trying to maximize joy in my life, rather than trying to\nmaximize Jesus - the one who gives the joy. By God's grace conviction seized my\nheart, and frankly I'm still not sure what to do day-to-day as I wrestle with\nmy own \"stuff\" but the objective truth that our reality is fundamentally held\ntogether by is simply Jesus Christ. Jesus loves me, joy does come in the\nmorning, and this Psalm wasn't written to me about my work situation in 2026,\nbut God's peace is given to his people through his everlasting word. Praise the\nLord for the Word this morning, for encouragement, for relief both\ntemporary/today and eternal/tomorrow. By God's grace alone does weeping spend\nthe night, but his gracious joy comes with the morning.\n",
      "summary": "!!! note \"Psalm 30:5\"",
      "date_published": "2026-05-13T08:11:22Z",
      "date_modified": "2026-05-13T08:11:22Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "joy",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/blog-and-llm-knowledge-base/",
      "url": "https://pype.dev/blog-and-llm-knowledge-base/",
      "title": "Blog and LLM Knowledge Base",
      "content_html": "\u003ch2 id=\"dev\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDev\u003c/span\u003e \u003ca href=\"#dev\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eThinking about \u003ca href=\"https://x.com/i/status/2039805659525644595\"\u003ethis tweet from Andrej Karpathy\u003c/a\u003e about LLM knowledge bases. I maintain a blog like this one at work, which is fairly well structured markdown files and I use markdown lsp for linking docs conceptually. It makes it easy for me to trace thoughts and search what I\u0026rsquo;ve written about. However I find that there\u0026rsquo;s a limit to what I am able to organize by myself\u0026hellip; The hardest part of of a zettlekasten to me is breaking down a thought into the smallest most atomic unit so that I don\u0026rsquo;t end up duplicating thoughts in files and lose the real traceability. In my head I think there\u0026rsquo;s a mathematical way to solve this, some kine of embedding setup that\u0026rsquo;s beyond my actual comprehension. But I think I\u0026rsquo;m overlookking that agents are probably just good enough with raw markdown, at the scale that I keep notes, that I should start to move in the direction, at least at work, of making my working notse blog repo more agentically friendly: AGENTS.md file, using an agent with its own dumping ground for files, some pruning sessions, and maybe a simple chat interface where I open an agent with a skill for using myrepo as a knowledge base and see if that gives me any super powers for organization or problem solving.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre\u003e\u003ccode\u003eLLM Knowledge Bases\n\nSomething I'm finding very useful recently: using LLMs to build personal knowledge bases for various topics of research interest. In this way, a large fraction of my recent token throughput is going less into manipulating code, and more into manipulating knowledge (stored as markdown and images). The latest LLMs are quite good at it. So:\n\nData ingest:\nI index source documents (articles, papers, repos, datasets, images, etc.) into a raw/ directory, then I use an LLM to incrementally \u0026quot;compile\u0026quot; a wiki, which is just a collection of .md files in a directory structure. The wiki includes summaries of all the data in raw/, backlinks, and then it categorizes data into concepts, writes articles for them, and links them all. To convert web articles into .md files I like to use the Obsidian Web Clipper extension, and then I also use a hotkey to download all the related images to local so that my LLM can easily reference them.\n\nIDE:\nI use Obsidian as the IDE \u0026quot;frontend\u0026quot; where I can view the raw data, the the compiled wiki, and the derived visualizations. Important to note that the LLM writes and maintains all of the data of the wiki, I rarely touch it directly. I've played with a few Obsidian plugins to render and view data in other ways (e.g. Marp for slides).\n\nQ\u0026amp;A:\nWhere things get interesting is that once your wiki is big enough (e.g. mine on some recent research is ~100 articles and ~400K words), you can ask your LLM agent all kinds of complex questions against the wiki, and it will go off, research the answers, etc. I thought I had to reach for fancy RAG, but the LLM has been pretty good about auto-maintaining index files and brief summaries of all the documents and it reads all the important related data fairly easily at this ~small scale.\n\nOutput:\nInstead of getting answers in text/terminal, I like to have it render markdown files for me, or slide shows (Marp format), or matplotlib images, all of which I then view again in Obsidian. You can imagine many other visual output formats depending on the query. Often, I end up \u0026quot;filing\u0026quot; the outputs back into the wiki to enhance it for further queries. So my own explorations and queries always \u0026quot;add up\u0026quot; in the knowledge base.\n\nLinting:\nI've run some LLM \u0026quot;health checks\u0026quot; over the wiki to e.g. find inconsistent data, impute missing data (with web searchers), find interesting connections for new article candidates, etc., to incrementally clean up the wiki and enhance its overall data integrity. The LLMs are quite good at suggesting further questions to ask and look into.\n\nExtra tools:\nI find myself developing additional tools to process the data, e.g. I vibe coded a small and naive search engine over the wiki, which I both use directly (in a web ui), but more often I want to hand it off to an LLM via CLI as a tool for larger queries.\n\nFurther explorations:\nAs the repo grows, the natural desire is to also think about synthetic data generation + finetuning to have your LLM \u0026quot;know\u0026quot; the data in its weights instead of just context windows.\n\nTLDR: raw data from a given number of sources is collected, then compiled by an LLM into a .md wiki, then operated on by various CLIs by the LLM to do Q\u0026amp;A and to incrementally enhance the wiki, and all of it viewable in Obsidian. You rarely ever write or edit the wiki manually, it's the domain of the LLM. I think there is room here for an incredible new product instead of a hacky collection of scripts.\n\u003c/code\u003e\u003c/pre\u003e\n",
      "content_text": "\n## Dev\n\n- Thinking about [this tweet from Andrej Karpathy](https://x.com/i/status/2039805659525644595) about LLM knowledge bases. I maintain a blog like this one at work, which is fairly well structured markdown files and I use markdown lsp for linking docs conceptually. It makes it easy for me to trace thoughts and search what I've written about. However I find that there's a limit to what I am able to organize by myself... The hardest part of of a zettlekasten to me is breaking down a thought into the smallest most atomic unit so that I don't end up duplicating thoughts in files and lose the real traceability. In my head I think there's a mathematical way to solve this, some kine of embedding setup that's beyond my actual comprehension. But I think I'm overlookking that agents are probably just good enough with raw markdown, at the scale that I keep notes, that I should start to move in the direction, at least at work, of making my working notse blog repo more agentically friendly: AGENTS.md file, using an agent with its own dumping ground for files, some pruning sessions, and maybe a simple chat interface where I open an agent with a skill for using myrepo as a knowledge base and see if that gives me any super powers for organization or problem solving.\n\n```\nLLM Knowledge Bases\n\nSomething I'm finding very useful recently: using LLMs to build personal knowledge bases for various topics of research interest. In this way, a large fraction of my recent token throughput is going less into manipulating code, and more into manipulating knowledge (stored as markdown and images). The latest LLMs are quite good at it. So:\n\nData ingest:\nI index source documents (articles, papers, repos, datasets, images, etc.) into a raw/ directory, then I use an LLM to incrementally \"compile\" a wiki, which is just a collection of .md files in a directory structure. The wiki includes summaries of all the data in raw/, backlinks, and then it categorizes data into concepts, writes articles for them, and links them all. To convert web articles into .md files I like to use the Obsidian Web Clipper extension, and then I also use a hotkey to download all the related images to local so that my LLM can easily reference them.\n\nIDE:\nI use Obsidian as the IDE \"frontend\" where I can view the raw data, the the compiled wiki, and the derived visualizations. Important to note that the LLM writes and maintains all of the data of the wiki, I rarely touch it directly. I've played with a few Obsidian plugins to render and view data in other ways (e.g. Marp for slides).\n\nQ\u0026A:\nWhere things get interesting is that once your wiki is big enough (e.g. mine on some recent research is ~100 articles and ~400K words), you can ask your LLM agent all kinds of complex questions against the wiki, and it will go off, research the answers, etc. I thought I had to reach for fancy RAG, but the LLM has been pretty good about auto-maintaining index files and brief summaries of all the documents and it reads all the important related data fairly easily at this ~small scale.\n\nOutput:\nInstead of getting answers in text/terminal, I like to have it render markdown files for me, or slide shows (Marp format), or matplotlib images, all of which I then view again in Obsidian. You can imagine many other visual output formats depending on the query. Often, I end up \"filing\" the outputs back into the wiki to enhance it for further queries. So my own explorations and queries always \"add up\" in the knowledge base.\n\nLinting:\nI've run some LLM \"health checks\" over the wiki to e.g. find inconsistent data, impute missing data (with web searchers), find interesting connections for new article candidates, etc., to incrementally clean up the wiki and enhance its overall data integrity. The LLMs are quite good at suggesting further questions to ask and look into.\n\nExtra tools:\nI find myself developing additional tools to process the data, e.g. I vibe coded a small and naive search engine over the wiki, which I both use directly (in a web ui), but more often I want to hand it off to an LLM via CLI as a tool for larger queries.\n\nFurther explorations:\nAs the repo grows, the natural desire is to also think about synthetic data generation + finetuning to have your LLM \"know\" the data in its weights instead of just context windows.\n\nTLDR: raw data from a given number of sources is collected, then compiled by an LLM into a .md wiki, then operated on by various CLIs by the LLM to do Q\u0026A and to incrementally enhance the wiki, and all of it viewable in Obsidian. You rarely ever write or edit the wiki manually, it's the domain of the LLM. I think there is room here for an incredible new product instead of a hacky collection of scripts.\n```\n",
      "summary": "Thinking about this tweet from Andrej Karpathy about LLM knowledge bases. I maintain a blog like this one at work, which is fairly well structured markdown...",
      "date_published": "2026-05-13T06:23:42Z",
      "date_modified": "2026-05-13T06:23:42Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "ai",
        "note"
      ]
    },
    {
      "id": "https://pype.dev/reflection-john-14-21/",
      "url": "https://pype.dev/reflection-john-14-21/",
      "title": "Reflection - John 14:21",
      "content_html": "\u003ch2 id=\"meditation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMeditation\u003c/span\u003e \u003ca href=\"#meditation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eJohn 14:21\u003c/p\u003e\n\u003cp\u003eThe one who has my commandments and keeps them—that one is the one who loves me. And the one who loves me will be loved by my Father, and I will love him and will reveal myself to him.”\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eThe Lord reveals himself\u0026hellip; it\u0026rsquo;s not more complicated than that. I\u0026rsquo;ve spent years in apologetics (defending the faith), learning and regurgitating argument after logical argument for God\u0026rsquo;s existence, historical defense for the resurrection of Jesus, etc. I think Christianity is objectively difficult to reject with all the data in front of you. At the same time, Jesus and the Bible are clear that God\u0026rsquo;s wisdom is folly to man, and no man can understand without being born again (John 10:6). So, I think there\u0026rsquo;s real biblical wisdom and truth that says the opposite of what I think about the evidence for Jesus as Lord. That\u0026rsquo;s OK, because I my thoughts are for and about myself, I am born again and the story, at least the story of my salvation, is clear to me, by God\u0026rsquo;s grace. It\u0026rsquo;s through that studying and those experiences that he has revealed himself to me. I know of others who never read the Bible but Jesus came to them in a dream - perhaps this is even more compelling than historical data\u0026hellip; Jesus reveals himself to his own people in a way that reveals salvation to each of them/us. The Father gives his inheritance to Jesus (us, believers) and none will be lost. Praise God for saving me, and praise the Lord for all the different mechanisms by which he ushers his people unto himself, through the only door to heaven (John 10).\u003c/p\u003e\n",
      "content_text": "\n## Meditation\n\n!!! note \"John 14:21\"\n\n    The one who has my commandments and keeps them—that one is the one who loves me. And the one who loves me will be loved by my Father, and I will love him and will reveal myself to him.”\n\nThe Lord reveals himself... it's not more complicated than that. I've spent years in apologetics (defending the faith), learning and regurgitating argument after logical argument for God's existence, historical defense for the resurrection of Jesus, etc. I think Christianity is objectively difficult to reject with all the data in front of you. At the same time, Jesus and the Bible are clear that God's wisdom is folly to man, and no man can understand without being born again (John 10:6). So, I think there's real biblical wisdom and truth that says the opposite of what I think about the evidence for Jesus as Lord. That's OK, because I my thoughts are for and about myself, I am born again and the story, at least the story of my salvation, is clear to me, by God's grace. It's through that studying and those experiences that he has revealed himself to me. I know of others who never read the Bible but Jesus came to them in a dream - perhaps this is even more compelling than historical data... Jesus reveals himself to his own people in a way that reveals salvation to each of them/us. The Father gives his inheritance to Jesus (us, believers) and none will be lost. Praise God for saving me, and praise the Lord for all the different mechanisms by which he ushers his people unto himself, through the only door to heaven (John 10).\n",
      "summary": "!!! note \"John 14:21\"",
      "date_published": "2026-05-13T06:22:40Z",
      "date_modified": "2026-05-13T06:22:40Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2026-05-13-notes/",
      "url": "https://pype.dev/2026-05-13-notes/",
      "title": "2026-05-13 Notes",
      "content_text": "\nyesterday: [[2026-05-12-notes]]\n\n- [[reflection-psalm-305]]\n",
      "summary": "yesterday: 2026-05-12-notes",
      "date_published": "2026-05-13T05:58:54Z",
      "date_modified": "2026-05-13T05:58:54Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/2026-05-12-notes/",
      "url": "https://pype.dev/2026-05-12-notes/",
      "title": "2026-05-12 Notes",
      "content_text": "\nyesterday: [[2026-05-08-notes]]\n\n- [[reflection-john-1421]]\n\n- [[blog-and-llm-knowledge-base]]\n\n## Wins\n\n- making progress in [[dataops]]\n  - zfs setup for projects and what I had been building is moved over\n  - now I can recover the rest\n",
      "summary": "yesterday: 2026-05-08-notes",
      "date_published": "2026-05-12T06:10:54Z",
      "date_modified": "2026-05-12T06:10:54Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/the-relief-of-earning/",
      "url": "https://pype.dev/the-relief-of-earning/",
      "title": "The Relief of Earning",
      "content_html": "\u003ch2 id=\"the-setup\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThe Setup\u003c/span\u003e \u003ca href=\"#the-setup\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWork has been crazy for months, and I haven\u0026rsquo;t written too much about it, a few\nnotes here and there but nothing substantial. The craziness is sourced in a\npretty cliched-scenario where we have lofty goals and important things to build\nbut the foundation on which we are building, like architectural decisions, is\nbasically wet sand. So as I\u0026rsquo;ve been trying to find my footing in the mud I feel\nlike I end up spinning my wheels moreso than making any progress. The chaos led\nme eventually to approach my manager about my compensation - I make a nice\nliving but for the stress I\u0026rsquo;d been feeling I could certainly go make more. My\nmanager successfully fought for me up the chain and I was given a slightly bigger\ncarrot, but that\u0026rsquo;s not the point of this post. I started to feel even more\nanxiety after I was told about the raise because, just like with AI and agentic\ncoding, now I was sure the expectations would be even higher. I didn\u0026rsquo;t think\nanything would actually come from me asking my boss about a raise, but now that\nit did I was afraid the ceiling of expectations was just going up up up.\u003c/p\u003e\n\u003ch2 id=\"the-carrot-and-the-anxiety\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThe Carrot and the Anxiety\u003c/span\u003e \u003ca href=\"#the-carrot-and-the-anxiety\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThat\u0026rsquo;s where the relief of earning comes in\u0026hellip; I mentioned this to my project\nmanager, and we have candid conversations regularly, and he told me something\nthat I think some people might have been offended by but I was genuinely\nrelieved to hear it. He said he\u0026rsquo;s glad I got a raise, and that he told our boss\nto \u003cem\u003enot\u003c/em\u003e really pursue it for me until I had actually delivered something. So even\nthough I feel like I\u0026rsquo;m spinning my wheels a lot, my direct leadership sees real\nvalue - and the relief is that I can rest in confirmation that the carrot is a\nresponse to work I already did, not a quiet elevation of expectations.\u003c/p\u003e\n",
      "content_text": "\n## The Setup\n\nWork has been crazy for months, and I haven't written too much about it, a few\nnotes here and there but nothing substantial. The craziness is sourced in a\npretty cliched-scenario where we have lofty goals and important things to build\nbut the foundation on which we are building, like architectural decisions, is\nbasically wet sand. So as I've been trying to find my footing in the mud I feel\nlike I end up spinning my wheels moreso than making any progress. The chaos led\nme eventually to approach my manager about my compensation - I make a nice\nliving but for the stress I'd been feeling I could certainly go make more. My\nmanager successfully fought for me up the chain and I was given a slightly bigger\ncarrot, but that's not the point of this post. I started to feel even more\nanxiety after I was told about the raise because, just like with AI and agentic\ncoding, now I was sure the expectations would be even higher. I didn't think\nanything would actually come from me asking my boss about a raise, but now that\nit did I was afraid the ceiling of expectations was just going up up up.\n\n## The Carrot and the Anxiety\n\nThat's where the relief of earning comes in... I mentioned this to my project\nmanager, and we have candid conversations regularly, and he told me something\nthat I think some people might have been offended by but I was genuinely\nrelieved to hear it. He said he's glad I got a raise, and that he told our boss\nto _not_ really pursue it for me until I had actually delivered something. So even\nthough I feel like I'm spinning my wheels a lot, my direct leadership sees real\nvalue - and the relief is that I can rest in confirmation that the carrot is a\nresponse to work I already did, not a quiet elevation of expectations.\n",
      "summary": "Work has been crazy for months, and I haven't written too much about it, a few notes here and there but nothing substantial. The craziness is sourced in a...",
      "date_published": "2026-05-08T05:43:39Z",
      "date_modified": "2026-05-08T05:43:39Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "work",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/2026-05-08-notes/",
      "url": "https://pype.dev/2026-05-08-notes/",
      "title": "2026-05-08 Notes",
      "content_text": "\nyesterday: [[2026-05-04-notes]]\n\n- [[the-relief-of-earning]]\n",
      "summary": "yesterday: 2026-05-04-notes",
      "date_published": "2026-05-08T05:31:46Z",
      "date_modified": "2026-05-08T05:31:46Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/2026-05-04-notes/",
      "url": "https://pype.dev/2026-05-04-notes/",
      "title": "2026-05-04 Notes",
      "content_text": "\nyesterday: [[2026-04-30-notes]]\n\n- [[reflection-john-16-33]]\n",
      "summary": "yesterday: 2026-04-30-notes",
      "date_published": "2026-05-04T07:48:48Z",
      "date_modified": "2026-05-04T07:48:48Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/reflection-john-16-33/",
      "url": "https://pype.dev/reflection-john-16-33/",
      "title": "Reflection - John 16:33",
      "content_text": "\nrelated: [[advent-john-16-33]]\n\nI re-read my advent reflection and by God's grace I was in a different frame of\nmind then. The loss of mindset is certainly on me and me alone for letting\nthings of the world crush me so much lately. The affliction Jesus mentions in\nJohn I don't think is the affliction I currently feel over work and chaotic\ncircumstances. It feels so silly to even put my stupid computer job in the same\nthought as Jesus talking about his victory over the grave but at the same time\nperhaps there's pastoral wisdom to challenge _that_ thought... why isn't the\nstress and anxiety I feel over anything in my life _exactly_ what Jesus is\nreferring to?\n\nSure, the immediate context is his crucifixion and Peter's denial of him. But\nas I drop my thoughts into this magic computer box, what's so different about\nme? Right now the thing that I can't get away from is work, and it's not even a\nvolume thing it's just a constant stressful unknown - I could list off all the\nreasons but do they matter? I think they matter in-so-far as I am dealing with\nthem, but ultimately work is just a job and even in light of doing objectively\ngood things for the world nothing is so good as what Jesus has done for me. So\nthe specifics of the stress of my work just cannot be the thing to focus on -\nevery moment that I'm more torn up about lack of requirements, or a deadline,\nor something I don't understand is a moment where I'm giving up myself to\nanother master and that is nothing but idolotry... I do not worship my work, I\ndon't ascribe a ton of worth to the things I do for Caterpillar, but I\ncertainly give myself over to constant fretting over it, and I struggle to do\nsome of my work in a meaningful way. Honestly, the affliction in my life today\nfeels very self-inflicted and if I can make the choice to give myself over to\nthe stress of my job, in a reality where Jesus has saved me from everything,\nwhy do I not make the choice to give myself over to him? He has made it so\nclear that victory over the world is his and his to give and share with his\npeople.\n\nThis post is almost just a hope that Jesus guides my thoughts into this digital\npaper for my own benefit, for my own affirmation of his victory of the world,\nand that the stress of my job is included in the world he's victorious over.\n\nI find that in seasons of my life where there isn't a super active regular\nconsistent ball of stress sitting in my chest, that it's easy to think about\nwhen I used to be stressed and to say \"praise God for bringing me through that\"\nor to look back on it with perspective and think \"it wasn't so bad as I thought\nand Jesus sustained me\"... and no doubt about it, Jesus is the only one\nsustaining me now, but if I ever come back to this post let me not undersell\nthe anxiety I've felt plaguing me. And in not-underselling it may Jesus'\nvictory be even greater in my heart, and when the Day Of The Lord arrives, I\npray it's at that moment I can echo Paul and say that every trial pales in\ncomparison to the glory of my king. Because on earth today, I want to recognize\nthat truth, but I'd be lying if I said the anxiety in my chest pales in\ncomparison to anything I have experienced - it feels very real, very heavy,\nvery authoritative. And in this moment what I have is trust, by God's grace -\nfaith, in Jesus' victory, but this is a conscious affirmation, it's not one I\nfeel escaping from me but rather one I am forcing myself out into the open out\nof respect for the objective reality that is bigger than me. I know in my head\nthat Jesus is victorious, and I know he has kept and will keep my heart. Today\nthough I feel the internal battle over it, a war within, and I need Jesus to\nhelp me make the right choices today and not just look forward to being on the\nother side of a hard time later.\n",
      "summary": "related: advent-john-16-33",
      "date_published": "2026-05-03T07:43:54Z",
      "date_modified": "2026-05-03T07:43:54Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "tribulation",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/reflection-jeremiah-17-17/",
      "url": "https://pype.dev/reflection-jeremiah-17-17/",
      "title": "reflection - Jeremiah 17:17",
      "content_html": "\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eJeremiah 17:17\u003c/p\u003e\n\u003cp\u003eYou must not become to me a terror,  you are my refuge in the day of disaster.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eSpurgeon\u0026rsquo;s reflection on this verse this morning hits hard\u0026hellip;\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe path of the Christian is not always bright with sunshine; he has his seasons of darkness and of storm.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eMy whole life has not been easy, my story has ups and downs like anyone\u0026rsquo;s. God\nhas been faithful to me, to bring me through trial - both when I feel and\nbelieve I am undergoing it, and before I knew what trial was but nonetheless\nwas in an imperfect situation. For several years it was too easy for me say\n\u0026ldquo;blessed be the name of the Lord\u0026rdquo;. Even today, it should be too easy, but I\nfeel the sunshine has been missing for some time, weeks or months. In this\nseason I\u0026rsquo;ve been bogged down, mostly with work. That bleeds into family stuff,\nthe stress and chaos of my job makes it easy to be impatient with my kids. In\nthat moment of impatience, God is good to remind me of how patient he is with\nme, but that doesn\u0026rsquo;t fix my parenting\u0026hellip; It opens the door to internal tension\nbecause on the one-hand I\u0026rsquo;m drawn to worship Jesus for his grace unto me, and\non the other hand I\u0026rsquo;m actively in a moment witholding grace from my own kids.\nIt\u0026rsquo;s certainly not fair to them that the storms of my life affect them, and I\u0026rsquo;m\nsure the solution isn\u0026rsquo;t to never weather a storm, but to more immediately run\nto the Lord myself in the midst of it\u0026hellip; something I\u0026rsquo;ve not been doing - as\nevidenced by a lack of reflections in the last couple months.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe best of God’s saints must drink the wormwood; the dearest of his children must bear the cross. No Christian has enjoyed perpetual prosperity; no believer can always keep his harp from the willows.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eNo believer can always keep his harp from the willows\u0026hellip; I often find myself\ndaydreaming about 1 decision or 1 stroke of luck, that would allow me to \u0026ldquo;keep\nmy harp from the willows\u0026rdquo; but in writing this out I realize this is plain\nidolotry. The Lord has said I will experience trial in my life, so why would I\nfantasize about escaping it forever? Why feed my own starving soul a lie when\nthe giver of life and truth has told me otherwise. Not only otherwise, but he\u0026rsquo;s\ngiven me a promise that the troubles of this age are ephemeral concerns, and\nthe ultimate glory is him alone.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWe need winds and tempests to exercise our faith, to tear off the rotten bough of self-dependence, and to root us more firmly in Christ. The day of evil reveals to us the value of our glorious hope.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eIt\u0026rsquo;s felt quite windy\u0026hellip; But by comparison to others, even others I know\nclosely, what appears like a raging storm in my life is a mildly windy day in\ntheirs. Perspective is a helpful tool but the ultimate perspective comes from\nthe Love of my Lord. When I am unfaithful, when I wallow, when I\u0026rsquo;m so far in my\nown head I don\u0026rsquo;t know up from down, he is patient with me\u0026hellip; I am longing for a\nseason of life God allowed me to enjoy, and perhaps that season will return. In\nthe winter I feel like I\u0026rsquo;m in right now, I pray it\u0026rsquo;s not wasted and that\nday-by-day, with his power enabling me to even just reflect on thoughts like\nthis, I pray my own focus turns to the season-maker and not the season itself.\u003c/p\u003e\n",
      "content_text": "\n!!! note \"Jeremiah 17:17\"\n\n    You must not become to me a terror,  you are my refuge in the day of disaster.\n\nSpurgeon's reflection on this verse this morning hits hard...\n\n\u003e The path of the Christian is not always bright with sunshine; he has his seasons of darkness and of storm.\n\nMy whole life has not been easy, my story has ups and downs like anyone's. God\nhas been faithful to me, to bring me through trial - both when I feel and\nbelieve I am undergoing it, and before I knew what trial was but nonetheless\nwas in an imperfect situation. For several years it was too easy for me say\n\"blessed be the name of the Lord\". Even today, it should be too easy, but I\nfeel the sunshine has been missing for some time, weeks or months. In this\nseason I've been bogged down, mostly with work. That bleeds into family stuff,\nthe stress and chaos of my job makes it easy to be impatient with my kids. In\nthat moment of impatience, God is good to remind me of how patient he is with\nme, but that doesn't fix my parenting... It opens the door to internal tension\nbecause on the one-hand I'm drawn to worship Jesus for his grace unto me, and\non the other hand I'm actively in a moment witholding grace from my own kids.\nIt's certainly not fair to them that the storms of my life affect them, and I'm\nsure the solution isn't to never weather a storm, but to more immediately run\nto the Lord myself in the midst of it... something I've not been doing - as\nevidenced by a lack of reflections in the last couple months.\n\n\u003e The best of God’s saints must drink the wormwood; the dearest of his children must bear the cross. No Christian has enjoyed perpetual prosperity; no believer can always keep his harp from the willows.\n\nNo believer can always keep his harp from the willows... I often find myself\ndaydreaming about 1 decision or 1 stroke of luck, that would allow me to \"keep\nmy harp from the willows\" but in writing this out I realize this is plain\nidolotry. The Lord has said I will experience trial in my life, so why would I\nfantasize about escaping it forever? Why feed my own starving soul a lie when\nthe giver of life and truth has told me otherwise. Not only otherwise, but he's\ngiven me a promise that the troubles of this age are ephemeral concerns, and\nthe ultimate glory is him alone.\n\n\u003e We need winds and tempests to exercise our faith, to tear off the rotten bough of self-dependence, and to root us more firmly in Christ. The day of evil reveals to us the value of our glorious hope.\n\nIt's felt quite windy... But by comparison to others, even others I know\nclosely, what appears like a raging storm in my life is a mildly windy day in\ntheirs. Perspective is a helpful tool but the ultimate perspective comes from\nthe Love of my Lord. When I am unfaithful, when I wallow, when I'm so far in my\nown head I don't know up from down, he is patient with me... I am longing for a\nseason of life God allowed me to enjoy, and perhaps that season will return. In\nthe winter I feel like I'm in right now, I pray it's not wasted and that\nday-by-day, with his power enabling me to even just reflect on thoughts like\nthis, I pray my own focus turns to the season-maker and not the season itself.\n",
      "summary": "!!! note \"Jeremiah 17:17\"",
      "date_published": "2026-04-30T08:12:36Z",
      "date_modified": "2026-04-30T08:12:36Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "hope",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2026-04-30-notes/",
      "url": "https://pype.dev/2026-04-30-notes/",
      "title": "2026-04-30 Notes",
      "content_text": "\nyesterday: [[2026-04-27-notes]]\n\n- [[reflection-jeremiah-17-17]]\n",
      "summary": "yesterday: 2026-04-27-notes",
      "date_published": "2026-04-30T06:32:15Z",
      "date_modified": "2026-04-30T06:32:15Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/2026-04-27-notes/",
      "url": "https://pype.dev/2026-04-27-notes/",
      "title": "2026-04-27 Notes",
      "content_text": "\nyesterday: [[2026-04-26-notes]]\n\n## Wins\n\n- updated Nextcloud from 30.x to 32.x today\n  - NOTE: after every upgrade, go to /settings/admin/overview and perform any of the `occ` commands in the nextcloud container that it says are relevant. Typically these are DB updates and are relatively easy to run. It's fine to run them in the container because they typically affect the DB, not the container state itself, the nextcloud container is just the runtime\n",
      "summary": "yesterday: 2026-04-26-notes",
      "date_published": "2026-04-27T09:25:43Z",
      "date_modified": "2026-04-27T09:25:43Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/2026-04-26-notes/",
      "url": "https://pype.dev/2026-04-26-notes/",
      "title": "2026-04-26 Notes",
      "content_text": "\nyesterday: [[ 2026-04-25-notes ]]\n\n\n- [[logos-webapp-dark-theme]]\n",
      "summary": "yesterday: 2026-04-25-notes",
      "date_published": "2026-04-26T07:09:22Z",
      "date_modified": "2026-04-26T07:09:22Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/logos-webapp-dark-theme/",
      "url": "https://pype.dev/logos-webapp-dark-theme/",
      "title": "Logos Webapp Dark Theme",
      "content_text": "\n[[stylus-for-custom-webpage-themes]]\n\n1. install [stylus](https://addons.mozilla.org/en-US/firefox/addon/styl-us/)\n2. get [logos theme](moz-extension://74e88bf4-4a5e-47ba-b9bc-ba202907c4db/install-usercss.html?updateUrl=https%3A%2F%2Fuserstyles.world%2Fapi%2Fstyle%2F18547.user.css)\n3. go to https://app.logos.com and profit\n",
      "summary": "stylus-for-custom-webpage-themes",
      "date_published": "2026-04-26T07:08:15Z",
      "date_modified": "2026-04-26T07:08:15Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "logos",
        "jira",
        "done"
      ]
    },
    {
      "id": "https://pype.dev/kde-shortcuts-for-desktop-and-window-navigation/",
      "url": "https://pype.dev/kde-shortcuts-for-desktop-and-window-navigation/",
      "title": "KDE Shortcuts for Desktop and Window Navigation",
      "content_text": "\n\nThis isn't my entire /home/nic/.config/kglobalshortcutsrc, just the sections that I customized as I'm setting up my desktop from the great [[desktop-crash-2026]]. Putting here to find on the web, will also be updating dotfiles\n\n```\nSwitch to Desktop 1=Meta+1,Meta+F1\\tCtrl+F1,Switch to Desktop 1\nSwitch to Desktop 2=Meta+2,Meta+F2\\tCtrl+F2,Switch to Desktop 2\nSwitch to Desktop 3=Meta+3,Meta+F3\\tCtrl+F3,Switch to Desktop 3\nSwitch to Desktop 4=Meta+4,Meta+F4\\tCtrl+F4,Switch to Desktop 4\nSwitch to Desktop 5=Meta+5,,Switch to Desktop 5\nSwitch to Desktop 6=Meta+6,,Switch to Desktop 6\nSwitch to Desktop 7=Meta+7,,Switch to Desktop 7\nSwitch to Desktop 8=Meta+8,,Switch to Desktop 8\nSwitch to Desktop 9=Meta+9,,Switch to Desktop 9\n```\n\n```\nMy minimum requirements lately are super+{1,2...} to bring me to a numbered desktop (for which I have mental conventions to organize apps), and super+shift+{1,2,...} to send a window to that desktop.\nWindow to Desktop 1=Meta+!,,Window to Desktop 1\nWindow to Desktop 2=Meta+@,,Window to Desktop 2\nWindow to Desktop 3=Meta+#,,Window to Desktop 3\nWindow to Desktop 4=Meta+$,,Window to Desktop 4\nWindow to Desktop 5=Meta+%,,Window to Desktop 5\nWindow to Desktop 6=Meta+^,,Window to Desktop 6\nWindow to Desktop 7=Meta+\u0026,,Window to Desktop 7\nWindow to Desktop 8=Meta+*,,Window to Desktop 8\nWindow to Desktop 9=Meta+(,,Window to Desktop 9\n```\n",
      "summary": "This isn't my entire /home/nic/.config/kglobalshortcutsrc, just the sections that I customized as I'm setting up my desktop from the great...",
      "date_published": "2026-04-25T13:44:48Z",
      "date_modified": "2026-04-25T13:44:48Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "kde",
        "note"
      ]
    },
    {
      "id": "https://pype.dev/2026-04-25-notes/",
      "url": "https://pype.dev/2026-04-25-notes/",
      "title": "2026-04-25 Notes",
      "content_text": "\nyesterday: [[ 2026-04-22-notes ]]\n\n- [[aurora-and-kde-window-managment-with-kzones]]\n- [[kde-shortcuts-for-desktop-and-window-navigation]]\n",
      "summary": "yesterday: 2026-04-22-notes",
      "date_published": "2026-04-25T09:36:16Z",
      "date_modified": "2026-04-25T09:36:16Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/aurora-and-kde-window-managment-with-kzones/",
      "url": "https://pype.dev/aurora-and-kde-window-managment-with-kzones/",
      "title": "Aurora and KDE Window Managment with KZones",
      "content_html": "\u003cp\u003eI have used a variety of window managers on a variety of distros and OS\u0026rsquo;s over the last several years and because my hardware usage feels regularly in flux I don\u0026rsquo;t have an air-tight common setup for any given environment. On my desktop the way I give myself some nice easy window management is with KZones and this config:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\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 \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Side by Side\u0026#34;\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=\"nt\"\u003e\u0026#34;padding\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\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=\"nt\"\u003e\u0026#34;zones\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\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                \u003cspan class=\"nt\"\u003e\u0026#34;x\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\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=\"nt\"\u003e\u0026#34;y\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\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=\"nt\"\u003e\u0026#34;height\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e100\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=\"nt\"\u003e\u0026#34;width\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e80\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            \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"nt\"\u003e\u0026#34;x\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e80\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=\"nt\"\u003e\u0026#34;y\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\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=\"nt\"\u003e\u0026#34;height\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e100\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=\"nt\"\u003e\u0026#34;width\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e20\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        \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    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Split Top\u0026#34;\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=\"nt\"\u003e\u0026#34;padding\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\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=\"nt\"\u003e\u0026#34;zones\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\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                \u003cspan class=\"nt\"\u003e\u0026#34;x\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\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=\"nt\"\u003e\u0026#34;y\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\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=\"nt\"\u003e\u0026#34;height\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e50\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=\"nt\"\u003e\u0026#34;width\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e50\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            \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"nt\"\u003e\u0026#34;x\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e50\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=\"nt\"\u003e\u0026#34;y\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\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=\"nt\"\u003e\u0026#34;height\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e50\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=\"nt\"\u003e\u0026#34;width\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e50\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            \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"nt\"\u003e\u0026#34;x\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\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=\"nt\"\u003e\u0026#34;y\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e50\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=\"nt\"\u003e\u0026#34;height\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e50\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=\"nt\"\u003e\u0026#34;width\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e100\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        \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    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Full Screen\u0026#34;\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=\"nt\"\u003e\u0026#34;padding\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\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=\"nt\"\u003e\u0026#34;zones\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\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                \u003cspan class=\"nt\"\u003e\u0026#34;x\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\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=\"nt\"\u003e\u0026#34;y\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\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=\"nt\"\u003e\u0026#34;height\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e100\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=\"nt\"\u003e\u0026#34;width\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e100\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        \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\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"nt\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Stacked\u0026#34;\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=\"nt\"\u003e\u0026#34;padding\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\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=\"nt\"\u003e\u0026#34;zones\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\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                \u003cspan class=\"nt\"\u003e\u0026#34;x\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\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=\"nt\"\u003e\u0026#34;y\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\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=\"nt\"\u003e\u0026#34;height\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e70\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=\"nt\"\u003e\u0026#34;width\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e100\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            \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"nt\"\u003e\u0026#34;x\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\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=\"nt\"\u003e\u0026#34;y\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e70\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=\"nt\"\u003e\u0026#34;height\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e30\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=\"nt\"\u003e\u0026#34;width\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e100\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        \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\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nI have used a variety of window managers on a variety of distros and OS's over the last several years and because my hardware usage feels regularly in flux I don't have an air-tight common setup for any given environment. On my desktop the way I give myself some nice easy window management is with KZones and this config:\n\n```json\n[\n {\n        \"name\": \"Side by Side\",\n        \"padding\": 2,\n        \"zones\": [\n            {\n                \"x\": 0,\n                \"y\": 0,\n                \"height\": 100,\n                \"width\": 80\n            },\n            {\n                \"x\": 80,\n                \"y\": 0,\n                \"height\": 100,\n                \"width\": 20\n            }\n        ]\n    },\n    {\n        \"name\": \"Split Top\",\n        \"padding\": 2,\n        \"zones\": [\n            {\n                \"x\": 0,\n                \"y\": 0,\n                \"height\": 50,\n                \"width\": 50\n            },\n            {\n                \"x\": 50,\n                \"y\": 0,\n                \"height\": 50,\n                \"width\": 50\n            },\n            {\n                \"x\": 0,\n                \"y\": 50,\n                \"height\": 50,\n                \"width\": 100\n            }\n        ]\n    },\n    {\n        \"name\": \"Full Screen\",\n        \"padding\": 2,\n        \"zones\": [\n            {\n                \"x\": 0,\n                \"y\": 0,\n                \"height\": 100,\n                \"width\": 100\n            }\n        ]\n    },\n{\n                \"name\": \"Stacked\",\n        \"padding\": 2,\n        \"zones\": [\n            {\n                \"x\": 0,\n                \"y\": 0,\n                \"height\": 70,\n                \"width\": 100\n            },\n            {\n                \"x\": 0,\n                \"y\": 70,\n                \"height\": 30,\n                \"width\": 100\n            }\n        ]\n    }\n]\n```\n\n\n",
      "summary": "I have used a variety of window managers on a variety of distros and OS's over the last several years and because my hardware usage feels regularly in flux I...",
      "date_published": "2026-04-25T06:51:20Z",
      "date_modified": "2026-04-25T06:51:20Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "window-management",
        "note"
      ]
    },
    {
      "id": "https://pype.dev/2026-04-22-notes/",
      "url": "https://pype.dev/2026-04-22-notes/",
      "title": "2026-04-22 Notes",
      "content_text": "\nyesterday: [[ 2026-04-18-notes ]]\n\n- [[work-compensation-note]]\n",
      "summary": "yesterday: 2026-04-18-notes",
      "date_published": "2026-04-22T06:43:40Z",
      "date_modified": "2026-04-22T06:43:40Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/2026-04-18-notes/",
      "url": "https://pype.dev/2026-04-18-notes/",
      "title": "2026-04-18 Notes",
      "content_text": "\nyesterday: [[2026-04-05-notes]]\n\n## PC Crash\n\nDesktop crashed days ago, apparently my primary drive has been going bad for a while and eventually it just died.\n\n- live-booted to ubuntu server\n- found restic backup script to NAS\n- edited to be smaller, but did the backup to the NAS\n- rsync'd docker volumes to BX500 SSD which is a zfs pool\n\n- captured what I did on ghost at /home/nic/aurora-recovery-report.md and /home/nic/aurora-crash-disk-health-report.md\n\n### PLAN\n\n- install ubunto on 500 GB Samsung\n- create zfs dataset for projects /tank/volumes/projects\n- mount zfs dataset /tank/volumes/projects to /home/nic/projects\n- zfs for home? probably not, keep home on ext4\n- mount old home and sync directly\n\n### Outcome\n\nThis is going terribly... blog post coming on what I should've done. What's\nactually happening is that I basically just lost everything on that desktop\nexcept my homelab repo thank God... \n",
      "summary": "yesterday: 2026-04-05-notes",
      "date_published": "2026-04-18T20:00:38Z",
      "date_modified": "2026-04-18T20:00:38Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/data-loading-is-a-huge-deal/",
      "url": "https://pype.dev/data-loading-is-a-huge-deal/",
      "title": "Data Loading is a Huge Deal",
      "content_text": "\nI've been thinking about the work I am doing and have to do in my role at Cat,\nin Cat Autonomy, building Forge (see [[forge-ahead]]). I feel like I have\nlittle revelations almost every day now, not that it means I'm writing\nsomething amazing and producing it really fast but there's just a whole suite\nof problems that different technologies solve at different levels and the more\nI become aware of the problems that exist, the more the existence of some\nsolutions makes sense.\n\n!!! note \"The Problem Perspective\"\n\n    I don't know if this is a real thinking technique or if I'm onto something\n    novel(doubt) but I think a lot in terms of problems - \"what problem needs\n    solving?\" and that's how I've come to prioritize my work, it's only been very\n    recently that I've realized I do this and I think I should highlight it's very\n    important to document the problem, otherwise every day you might try to solve a\n    different problem but be working on the same code\n\n!!! note \"Problem Space\"\n\n    Kedro solves a lot of these problems, so when making rada in Reman the problem\n    space was already more contained and narrow, Forge's problem-space is much more\n    vast\n\nThe one problem I'm really fixated on right now is data loading, the problem I\nneed to solve is accessing data from a wide-variety of scripts/tools, without a\nframework or standard method/library of accessing data in the first place. I've\nseen lots of projects on GitHub claim to make data loading easier and I didn't\nquite understand what problem they were solving... one example to name is [Data\nLoad Tool](https://dlthub.com/). I've seen similar ones I don't have the name\nfor right now that claim to make it easy/fast to load data from s3, or ways to\nmake s3 and a database both abstract in the user-experience for loading data.\nBut I hadn't really understood why these tools existed. I have a lot of\nexperience with [Kedro](https://dlthub.com/) and their\n[DataCatalog](https://docs.kedro.org/en/latest/catalog-data/introduction/)\nwhich provides a python object over a set of yamlfiles that makes it pretty\nsimple to load and save data in a way that isolates I/O from the business\nlogic. But what I didn't realize at the time how powerful that catalog was, the\npower of standard patterns and shared libraries. Now that I don't have it\navailable to me, I'm quite aware of the absence.\n\nIn my new role something I'm realizing is that for all the developers my team\nnow supports, there isn't a canonical way to access data. When I was in Reman\nand working with kedro, the DataCatalog was the access pattern and so when I\nwas developing a platform I never really had to think about it - it was an\nestablished pattern that I treated as a constraint and then built processes\naround it. I've been battling some mental block for weeks on Forge because of\nthe lack of that canonical pattern, and as I've talked with other engineers it\nseems like the baseline assumption is that data is just available on a\nfilesystem, but everyone's code loads data in different ways. On my small Reman\nteam, with common patterns to build on, it was easy to make things cloud-native\nor shim in some devops to improve people's lives. But when everyone's doing\ntheir own thing, and everyone's \"own thing\" is very much built-on some rigid tribal\npatterns then it's hard to really move fast cause everyone isn't already moving\nin the same direction.\n\nThat made me realize that the first problem Forge needed to solve was in\nproviding a way for engineers to have filesystem-native data access in the\nCloud, where we are S3-first in our storage philosophy. I didn't need to figure\nout a way for everyone to name a dataset, define the dataset in the first\nplace, and give a nice `my_dataset.load` that worked in python, bash, cpp, and\nwho knows what else.... I reframed the problem from \"how do engineers load up\nthe data\" to \"how do engineers have access to the data\". The requirements of\nthe Cat Autonomy group was pretty simple: POSIX-compliant storage.\n\nMy pathway to solving this problem is initially underway, I can't imagine it'll\nbe too difficult to setup for FSx instances for teams and give them an api to\nrun a Batch Job with the FSx mounted. From there, their code can load data from\n`/mnt/fsx/\u003cwhatever\u003e` just like they otherwise could be doing locally. Or maybe\nFSx will let us setup mounts to very flexible mount points and their local\nscripts will \"just work\" :shrugs:. I don't know the exact shape, but after\nrealizing the loading data is a big deal, I'm thankful I have a narrower\nproblem to solve first.\n\n!!! note \"S3 Files\"\n\n    Literally yesterday, AWS launched \"S3 Files\" offering an NFS filesystem service over buckets. I'm not sure if NFS is going to be a viable filesystem protocol for all of our use cases, but looks like we're not the only people who need the filesystem access patterns over S3.\n\n!!! warning \"A Future Problem - Canonical Reference\"\n\n    Another high-value thing Forge needs to solve is \"what is data\". The data\n    formats we have are not super simple, it's not just a set of SQL tables. We\n    have files that relate to each other based on hard-filepath patterns, and those\n    patterns are full of tribal knowledge and distributed processes. So a simple\n    question like \"How do I use forge to access my data\" is hard. In Reman a data\n    scientist would ask \"how do I use rada to access my data?\" and the answer is\n    \"We use Kedro, and Kedro solved that problem for us via the Catalog\" but\n    without Kedro, without 100% being in python (devs are also in embedded systems,\n    cpp code, and more), without even consistent practices in the existing \"how do\n    I access my data\" workflows, it's really impossible to systemetize and codify\n    it. It is my next challenge to tackle though...\n",
      "summary": "I've been thinking about the work I am doing and have to do in my role at Cat, in Cat Autonomy, building Forge (see forge-ahead). I feel like I have little...",
      "date_published": "2026-04-08T07:40:14Z",
      "date_modified": "2026-04-08T07:40:14Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "forge",
        "rada",
        "kedro",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/2026-04-05-notes/",
      "url": "https://pype.dev/2026-04-05-notes/",
      "title": "2026-04-05 Notes",
      "content_text": "\nyesterday: [[2026-04-03-notes]]\n\n- [[easter-2026]]\n- [[data-loading-is-a-huge-deal]]\n\n- I have several competing streams of thought about Easter this year, I want to\n  focus some reflection and energy in the appropriate direction, of what Easter\n  is as a holiday in the Christian calendar, the day my Lord and King defeated\n  Death in his physical body and resurrected himself from the grave -\n  [[easter-2026]]. It is in how holy and significant that this day is that my\n  second stream of thought begins to compete... we profane it so much in America,\n  maybe throughout the world, but I'm really thinking about my family-experience\n  with Easter and other holidays... So I've got thoughts for the world there too\n\n## Stream 2\n\nI want my wife and daughters to participate with me in celebrating Lent, Holy\nWeek, and Easter with more reverance, but the problem is our own parents\ntreating Easter and other High Church holidays that have been Americanized, as\nthough they own those days for \"family time\". The point isn't to spend time\nwith family, it is to observe a holy day and after this year I am about ready\nto reserve all holidays for ourselves. If grandparents want to come see their\ngrandkids, they're welcome anytime - heck we live 15 minutes away in on case\nand still the competition happens over a few select holidays. Well, perhaps no\nmore. I think I'm going to block Easter and Christmas out for my family and we\nwill participate in traditions that are more meaningful than sharing social\nmedia links while we all sit on our phones in the living room.\n\n## Dev\n\n- Resurrected my OpenRouter API key for opencode after seeing a note aout\n  [Qwen3.6 Plus](https://qwen.ai/blog?id=qwen3.6) being free so I figured I'd\n  give it a go. I think with some pushing I can use [[nexus]] to get a lot done\n  with free models as they change and get better. Maybe even self-hosted models\n  in the coming years!\n",
      "summary": "yesterday: 2026-04-03-notes",
      "date_published": "2026-04-05T05:38:05Z",
      "date_modified": "2026-04-05T05:38:05Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/easter-2026/",
      "url": "https://pype.dev/easter-2026/",
      "title": "Easter 2026",
      "content_text": "\n## He Is Risen\n\nWhat does it mean that \"He is risen\"? What does it mean to me? for me? for the\nworld? I think the question matters to everyone, Jesus did and said a lot of\nthings in real history. And a lot of what he said and did, and what others\nclaimed he did, is pretty insane. And if he's just a liar or a crazy person,\nthen it's all inconsequential. But if he was actually telling the truth, then\nhis life is literally the lynchpin of anyone and everyone else's life. If he\nreally did resurrect from the grave by the power of Yahweh then every single\nperson needs to reckon with a real truth - that a King was killed and defeated\ndeath in his own death, and he said he will come again. Every single human will\nstand before the reigning resurrected King Jesus face to face, for judgement or\nforgiveness and it is inescapable.\n\nSo to me, today, Easter on April 5 2026, how will I treat my King? What is my\nposture towards him and good things? I know where my head is - it's at work, I\nknow where my heart is - it's frustrated with my own sin and lack of attention\nto the holy seasons the Lord permits me to pass though, it's frustrated with\nexternal pressures that affect my life as I mention in\n[[2026-04-05-notes#Stream 2]]. My head and heart are not fully focused on the\nLord, haven't been fully focused on his suffering, on him carrying the cross up\nto the place of the skull, on his side being pierced, blood and water hitting\nthe ground, his final breath, the tearing of the veil, the silence on Saturday,\nnor his resurrection we remember today.... I have been so consumed with myself,\nwith work and pressure, with disappointment and mistakes that I almost feel\nlike a foreigner to approach a meditation about Easter and to write abut it at\nall, even this which is just a journal entry pretty much.\n\nBut the Lord is sweet in his victory. Today is about his victory over death.\nIt's a victory he shares with all those whom he has called. The pressures of\nwork will fade away, the disappointment over my own sin may never leave me (and\nactually I hope it never will, Jesus frees me to live and love, he frees me\nfrom my sin but not from my sorrow or remorse over it). Praise the Lord for the\nvictory he gives his people, to me.\n",
      "summary": "What does it mean that \"He is risen\"? What does it mean to me? for me? for the world? I think the question matters to everyone, Jesus did and said a lot of...",
      "date_published": "2026-04-05T05:24:02Z",
      "date_modified": "2026-04-05T05:24:02Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "easter",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/agents-can-miss-obvious-things-too/",
      "url": "https://pype.dev/agents-can-miss-obvious-things-too/",
      "title": "Agents can miss obvious things too",
      "content_text": "\nI am working with MiniMax M.2 to vibe up some webapp ideas for [[Nexus]] and I\njust spent many minutes not having the app render correctly because the agent\nmounted the wrong directory into the docker compose stack. I noticed it about 5\nseconds after opening the file, but wasted nearly a half hour thinking it was a\ndocker issue in distrobox...\n\n!!! danger \"\"\n\n    Clankers are still just clankers man\n",
      "summary": "I am working with MiniMax M.2 to vibe up some webapp ideas for Nexus and I just spent many minutes not having the app render correctly because the agent...",
      "date_published": "2026-04-03T14:39:51Z",
      "date_modified": "2026-04-03T14:39:51Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "agents",
        "til",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/2026-04-03-notes/",
      "url": "https://pype.dev/2026-04-03-notes/",
      "title": "2026-04-03 Notes",
      "content_text": "\nyesterday: [[2026-04-01-notes]]\n\n## Good Friday\n\nIt's Good Friday for the Christians in the world, a day named not for what\nhappened but for a person. Jesus went to the cross some-2000 years ago out of\nhis love for his people. If you are chosen by the Lord, today is a good day\nbecause his love was demonstrated for you in spilling his blood as the\natonement for your and my sins. That blood covers us just like the sacrifice of\nLeviticus 16's blood was sprinkled on the holy things. Jesus' blood is\nsprinkled on us, as the temple, protecting the sacred space so that the Holy\nSpirit can indwell. It's Ancient Near Eastern theology 101: wherever a god dwells\nmust be cleansed, but the manner of the cleansing in Christianity is unique -\nGod became man and died to provide the cleansing, his requirement of you and me\nis to answer his call, not work to cleanse the space. Praise the Lord the work\nis out of my hands.\n\n### One of my favorite comics\n\n![20260403104405_d759f687.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20260403104405_d759f687.png)\n\n## Other Stuff\n\n- had MiniMax help me craft a project page for [[nexus]] finally. I'll probably use AI to keep it up to date. It's really biting at a boundary I was setting for having AI \"produce\" any writing on my website, but it feels appropriate as long as I'm reviewing those updates for consistency and ensuring it isn't slop. The point isn't a blog post there, it's keying into an idea I have for my blog of having project-specific pages that just introduce why I built something and what it is - might end up being very close to just the READMEs of those projects.\n",
      "summary": "yesterday: 2026-04-01-notes",
      "date_published": "2026-04-03T05:40:17Z",
      "date_modified": "2026-04-03T05:40:17Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/pulled-pork-notes/",
      "url": "https://pype.dev/pulled-pork-notes/",
      "title": "Pulled Pork Notes",
      "content_html": "\u003ch1 id=\"april-2026\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eApril 2026\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eThrew 2 shoulders in the Traegar this morning. This time I didn\u0026rsquo;t put much thought into the seasonings, we\u0026rsquo;ll see how they turn out.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eHot Honey Ham + Perfect Pork (festival) + Jack Daniels on both but was light on the Hot Honey Ham\u003c/li\u003e\n\u003c/ul\u003e\n\u003cfigure\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20260402112348_6ba0b7f3.png\" alt=\"20260402112348_6ba0b7f3.png\"\u003e\n\u003c/figure\u003e\n\u003cfigure\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20260403104854_2120eed6.png\" alt=\"20260403104854_2120eed6.png\"\u003e\n\u003c/figure\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003ePellets: Signature again\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ePrediction: this will be just like the June note that I didn\u0026rsquo;t read before\nprepping the meat but sounds like I by default did the same thing with the\nseasonings I had and now I have high expectations for dinner!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eResults: as expected, a little dry due to my laziness, but the rubs came out\ngreat! Missing my Holy Gospel from Meat Church though\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch1 id=\"june-26-2025\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eJune 26 2025\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eI smoked 2 pork shoulders\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eHeavy application of Jack Daniels default pork rub + Meat Church\u0026rsquo;s the Holy Gospel\u003c/li\u003e\n\u003cli\u003eHot Honey Ham + Perfect Pork (festival)\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eThey smoked with Traegar\u0026rsquo;s Signature pellets at 250 until internal temp of 205,\nthen they rest covered for a few hours, then tear apart\u0026hellip;\u003c/p\u003e\n\u003cp\u003eoverall rating:\u003c/p\u003e\n\u003cp\u003eThe Hot Honey Ham + Perfect Pork tasted great. It was not that spicy at all,\ngood flavor. It ended up being a little dry but this was certainly cause of my\nutter lack of attention while the meat is smoking\u003c/p\u003e\n\u003ch1 id=\"july-4\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eJuly 4\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eWe ate the pulled pork today and it was a little dry, though very edible\nnonetheless. I think I need to tend to the pork more with something like an\napple juice spray and then covering it in the latter part of the smoke\u0026hellip;\u003c/p\u003e\n\u003cp\u003eAs for quantity - 2 pork shoulders (and 1 beef arm roast that I smoked today)\neasily fed 4 families (8 adults + 9 kids) and we have plenty left over\u0026hellip; like\nprobably a full pork shoulder\u0026rsquo;s worth, between all 3 meats.\u003c/p\u003e\n\u003ch2 id=\"notes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNotes\u003c/span\u003e \u003ca href=\"#notes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003espicy pickles were a good addition\u003c/li\u003e\n\u003cli\u003eseriously need to tend to the pork more during the smoking, after a second re-heat it\u0026rsquo;s getting pretty dry\u003c/li\u003e\n\u003c/ol\u003e\n",
      "content_text": "\n# April 2026\n\nThrew 2 shoulders in the Traegar this morning. This time I didn't put much thought into the seasonings, we'll see how they turn out.\n\n- Hot Honey Ham + Perfect Pork (festival) + Jack Daniels on both but was light on the Hot Honey Ham\n\n![20260402112348_6ba0b7f3.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20260402112348_6ba0b7f3.png)\n\n![20260403104854_2120eed6.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20260403104854_2120eed6.png)\n\n- Pellets: Signature again\n\n- Prediction: this will be just like the June note that I didn't read before\n  prepping the meat but sounds like I by default did the same thing with the\n  seasonings I had and now I have high expectations for dinner!\n\n- Results: as expected, a little dry due to my laziness, but the rubs came out\n  great! Missing my Holy Gospel from Meat Church though\n\n# June 26 2025\n\nI smoked 2 pork shoulders\n\n1. Heavy application of Jack Daniels default pork rub + Meat Church's the Holy Gospel\n2. Hot Honey Ham + Perfect Pork (festival)\n\nThey smoked with Traegar's Signature pellets at 250 until internal temp of 205,\nthen they rest covered for a few hours, then tear apart...\n\noverall rating:\n\nThe Hot Honey Ham + Perfect Pork tasted great. It was not that spicy at all,\ngood flavor. It ended up being a little dry but this was certainly cause of my\nutter lack of attention while the meat is smoking\n\n# July 4\n\nWe ate the pulled pork today and it was a little dry, though very edible\nnonetheless. I think I need to tend to the pork more with something like an\napple juice spray and then covering it in the latter part of the smoke...\n\nAs for quantity - 2 pork shoulders (and 1 beef arm roast that I smoked today)\neasily fed 4 families (8 adults + 9 kids) and we have plenty left over... like\nprobably a full pork shoulder's worth, between all 3 meats.\n\n## Notes\n\n1. spicy pickles were a good addition\n2. seriously need to tend to the pork more during the smoking, after a second re-heat it's getting pretty dry\n",
      "summary": "Threw 2 shoulders in the Traegar this morning. This time I didn't put much thought into the seasonings, we'll see how they turn out.",
      "date_published": "2026-04-02T05:56:12Z",
      "date_modified": "2026-04-02T05:56:12Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "cooking",
        "traegar"
      ]
    },
    {
      "id": "https://pype.dev/2026-04-01-notes/",
      "url": "https://pype.dev/2026-04-01-notes/",
      "title": "2026-04-01 Notes",
      "content_text": "\nyesterday: [[2026-03-31-notes]]\n\n## Reflection\n\nIt's the middle of holy week and my note from yesterday feels like it was\nmonths ago... The days are getting long again, and filled with some panic about\nwork. I think I'll find it silly how stressed I am eventually, I was just\nthinking \"when I get to Heaven, Jesus sure will think how much I got worked up\nabout work is silly\", but if he'll think it then he thinks it now, if the\nperspective would be true in however many years I have left or before his\nsecond-coming, then the perspective is true today.\n\nI'm not sure how to have the right perspective when the tightness in my chest\nis out of my control. I can breath deep and recognize a truth - my job is\nfleeting and the irony that my job is taking so much of my mental energy\nthrough today \"Silent Wednesday\" (a day also known as \"Spy Wednesday\" for\nreflecting on Judas's betrayal) is in the betrayal of my thoughts about my\nsavior, or lack-there-of. Judas sold the Lord for some silver, I'm sure as a\nman he had his reasons like any junkie rationalizing their behavior... But am I\ndifferent? I'm so consumed with panic and worry about things happening at work\nthat my mind is not on who my Savior is, just like Judas I'm fretting about the\nwrong things and whether it's like Judas or not, I can't seem to \"just let it\ngo\".\n\nWhat if Judas had just let go of his greed? Would he have been saved? In\nthe sovereignty of God it never was the case that Jesus wouldn't be betrayed,\nthat was apart of a plan known before time, but from the perspective of a man\nbound by time I can't help but ask it - could Judas have relinquished his sin\nto Jesus and is my anxiety over my job a modern-day betrayal whose irony is\nsimply made more clear by struggling with it on Silent Wednesday.\n\n## Post Day\n\nEnding the day OK... I'm taking a machete through Forge, my project at work, and\nthat feels great. Something happened today where a lot more things fell into\nplace about my role and what I'm supposed to be doing and how I will end up\ndoing it. After sitting in the context for a few months, I'm seeing a bigger\npicture unfold about what Forge will be, but today I realized it was going in\nthe wrong direction and so even with other people on this project I ripped out\nabout 10k lines of code and will force push to master in the morning. Copilot\nwas very useful in fully removing concepts and even service deployments\n(LakeFS this time around) to help me minimize the code and logic surface that\nForge takes up. It's calming me down a bit and I expect will make it easy to\nmove fast and solve problems in silly ways while we figure out the better ways\nto solve them. So some peace feels like it's on the horizon.\n",
      "summary": "yesterday: 2026-03-31-notes",
      "date_published": "2026-04-01T05:30:40Z",
      "date_modified": "2026-04-01T05:30:40Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/2026-03-31-notes/",
      "url": "https://pype.dev/2026-03-31-notes/",
      "title": "2026-03-31 Notes",
      "content_text": "\nyesterday: [[2026-03-27-notes]]\n\n- tried to make a little progress on [[spring-cleaning-2026-homelab-edition]]\n\n- Also having M.2 MiniMax do something about a consistent neovim issue... if it\n  fails this morning I'll resort to real Opus later for the fix\n\n- It's holy week and I barely know about it cause work is just taking up so\n  much time... I really hate this but I don't think I can just blame work. I am\n  to blame, I have so many short comings and I'm not actively doing a lot about\n  them, I'm just trying to mitigate them with AI. I'm trying to learn the problem\n  space and solve problems how I used to: only faster, but there's a lot of\n  other people, competing priorities, limited hardware to test out ideas, and\n  it's a very heavy cognitive burden... Unfortunately I'm giving in and letting\n  it take over, perhaps today the Lord will soften my mind towards work and give\n  me an more appropriate level of care and help me to meditate on things that are\n  true, pure, noble, and worthy of my full attention.\n\n!!! note \"\"\n\n    “See how the patient Jesus stands,\n    Insulted in his lowest case!\n    Sinners have bound the Almighty’s hands,\n    And spit in their Creator’s face.\n\n    With thorns his temples gor’d and gash’d\n    Send streams of blood from every part;\n    His back’s with knotted scourges lash’d.\n    But sharper scourges tear his heart.”\n\n    Spurgeon, C. H. (1896). Morning and evening: Daily readings. Passmore \u0026 Alabaster.\n",
      "summary": "yesterday: 2026-03-27-notes",
      "date_published": "2026-03-31T05:31:13Z",
      "date_modified": "2026-03-31T05:31:13Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/2026-03-27-notes/",
      "url": "https://pype.dev/2026-03-27-notes/",
      "title": "2026-03-27 Notes",
      "content_text": "\nyesterday: [[2026-03-22-notes]]\n\nMight've had a breakthrough with a data modeling issue at work today... If you want it make it so strikes again. I can't write about it here really, but I blew my own mind by remembering that I have quite a lot of say in what my work becomes as long as I'm solving problems, and some of the problem just really slid into place today. I love when that happens, it preceeds a butt-ton of work usually that I enjoy doing, but I hate when it happens late on a Friday\n",
      "summary": "yesterday: 2026-03-22-notes",
      "date_published": "2026-03-27T19:35:02Z",
      "date_modified": "2026-03-27T19:35:02Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/clankers/",
      "url": "https://pype.dev/clankers/",
      "title": "Clankers",
      "content_html": "\u003cp\u003eAn appropriately derogatory reference to AI agents\u003c/p\u003e\n",
      "content_text": "\nAn appropriately derogatory reference to AI agents\n",
      "summary": "An appropriately derogatory reference to AI agents",
      "date_published": "2026-03-26T06:15:10Z",
      "date_modified": "2026-03-26T06:15:10Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "glossary"
      ]
    },
    {
      "id": "https://pype.dev/the-irony-of-10x/",
      "url": "https://pype.dev/the-irony-of-10x/",
      "title": "The Irony of 10x",
      "content_text": "\n## Opener\n\nAgentic coding has been an exciting change to me over the last couple of months\nspecifically. I've been using AI tools for a few years now but something really\nshifted with Opus 4.5 as well as the tools/harnesses getting better and more\nuseful around the same time. I've been influenced by people like Simon Willison\nand Steve Yegge who have been on the forefront of agentic coding and [vibe\nengineering](https://simonwillison.net/2025/Oct/7/vibe-engineering/) since the\ndawn of ChatGPT and in my small circles of work I'm definitely on the bloodiest\nbleeding edge of the adoption of these practices. Are they the future? I don't\nknow - I tried to maintain a skeptical posture but until the bubble pops it's\nlooking like this is at least a direction the future of my line of work is\ngoing.\n\n!!! danger \"\"\n\n    The tough part is mixing the new world of agentic coding with\n    developers on wildly different points in the spectrum of adoption and maturity.\n\nHere's a short anecdote about what I mean...\n\nIn a new project that I'm on, I've refactored/reimplemented a lot of legacy\ncode, producing about 140k lines of code, configuration, and\ndocs in about 2 months. It's an insane amount of \"product\" and I've done it\nentirely with agents. But I didn't do it with a handful of vanilla chat\nsessions like \"Hey Copilot, reimplement this API, no mistakes\". I've been building\nout my own process for using LLMs effectively. I have no actual idea besides my\nown experience if what I'm building is useful, but it feels pretty good -\nagents for planning, building, reviewing, testing, etc. My \"harness\" includes\nspecialized agents and opinionated development workflows\nto try to ensure that code is never one-shotted into production.\n\nThe catch though is that I'm working with a handful of developers and they are not\nearly-adopters or aggressive experimenters with these new agentic tools. Most\nof them are still in Steve Yegge's stage 2 or 3 of AI coding as he's outlined\n[in this medium\narticle introducing\nGasTown](https://steve-yegge.medium.com/welcome-to-gas-town-4f25ee16dd04). They\nopen a chat session, and say yes or no to Opus. I've been in-between stages\n6 and 7 for a while now - managing multiple agentic sessions that themselves\nrun specialized subagents primarily for context management, although I don't\nfeel quite ready for full blown stage 8 (agents running agents running agents).\nSo this isn't me saying that I'm\n\"better\" than the guys I'm working with, just the project we're on\ntogether is now being touched by people on wildly different ends of the agentic\ncoding spectrum, and the project itself is an experiment to me of living in the \"New World\".\n\nFinally the anecdote - I'm getting PRs from guys in stages 2 and 3,\nthousands of lines of code and config, that I know they are not necessarily\nexperts in, but they're producing that code with fairly vanilla practices. How\ndo I verify it? I know my own prompts, I know what agents generated my code, I know\nthe direction and prodding I gave as they're building, but all\nI know in a PR review from someone else is the diff - not how they tested it\n(unless of course there's tests, and there must be, but tests are only as good\nas the tests are...), not the steering they gave, not the manual UAT validation\nthey did, or even the full intent... And ultimately I own the code they merge\nbecause chances are I outlast their contract with the team. It's kind of a\nscary thing to review and accept... do I trust my\nagentic practices to validate their work? Cause I certainly don't trust myself\nto validate it perfectly.\n\n!!! note \"a note about contractors\"\n\n    I'm not implying anything about anyone who works contract, I think the facts is that contractors are typically dis-incentivized to really \"own\" something - an unfortunate consequence of the world.\n\n## This is about me, not everyone\n\nI want to make sure to reiterate the context of this post and my thoughts -\nit's really about me. I'm not saying anything here is true for anyone else, I'm\nnot making predictions about tomorrow, and I'm not a prominent FOSS developer or a\nhigh-profile ex-FAANG engineer. I'm not talking about every project under the sun.\nI work at a big company, not a fast-paced startup. I work on internal tooling,\nnothing that should even be seen outside our network. I'm also a self-taught\ndeveloper, not a trained software engineer.\n\nAs far as AI goes, lately I'm mostly all in on Github Copilot\nCLI with a sprinkling of Opencode. I'm not using Claude Code or Codex which\nseem to have their own communities around plugins and usage.\n\nAnd since we're so focused on me right now, the important thing to keep as the\nbackdrop for this post is my temperament and make-up. I'm definitely made a\ncertain kind of way, not different than every single person necessarily, but\ndifferent enough, from enough people, to not blend in with the 9-5 guy who can\nlog out and not think about work until the morning (I'm not saying that's a\nstrength either, my boundary problems are for another time).\n\nI feel an aggressive burden to solve problems and own those solutions, call it\nwhite-knighting or a savior complex if you want, but I've got enough of a\nreputation at Caterpillar now (and anywhere else I've worked) to become a go-to\nperson for more than I think is necessarily appropriate. And with that burden\nI'll bring results - if a problem hooks into my brain it. will. be. solved. I\nprobably won't do the best most clean-code solution right out of the gate, but\nI'll do whatever I can to find a solution.\n\n## Who I was before agents\n\nThat is who I was before agents made code easy to produce. My first boss at\nCaterpillar used the phrase \"tenacious learner\" to describe me in several\nreviews. I kind of rejected the description because I basically refused to\nbelieve that I was really any different, any harder of a worker, than my peers.\n\nBut with almost a decade of experience in the corporate world, and some adult\nperspective on my life, I think it's accurate... I am a harder worker, to my\ndetriment sometimes, than a fair number of people I've worked with\\*\\*.\n\nI'm not brilliant but I can focus for a long time in the right circumstances.\nThe gift of perseverance (or the curse of not being able to let something go,\ndepending on how you look at it) has led to blessing in my life in both reward\nand skill.\n\n!!! note \"\\*\\*\"\n\n    There's nothing wrong with it either, Cat's somewhat noticed that work in my EOY reviews and I'm certainly not against \"just doing your job\".\n\nAnd then AI came along and with another set of the right circumstances\ncatalyzed a new way to work.\n\n## Leaning into \"Agentic Engineering\"\n\nI jumped onto experimenting with AI coding tools as soon as they became\navailable, but mostly I just tried vibe coding rather than using tools for real\nengineering work. I vibed up an API at one of my jobs that went into production\nway too early, with far too little validation, and it was scary to support it\nfrom then on out. I also did the meme, vibe-coded a TODO app, and threw that\npuppy into the internet without locking down my API endpoints... That was\nbefore agents were quite as useful as they can be\nnow, but that experience along with a handful of other stepping stones (like\nlearning some real actual fundamentals about security) began to\ngive me confidence in using the AI as a tool, like my IDE is a tool, for\nproducing **solutions** that take the form of code.\n\n!!! note \"\"\n\n    As one-shot apps got better and better, and as I learned about scoping work\n    more appropriately for agentic tools my confidence in them grew.\n\nThere's quite a difference between \"Claude make me a todo app, no mistakes\" and\nscoping out a solution in natural language, with some technical guardrails, and\nhaving agents tackle the implementation methodically.\n\n## What actually changed\n\nWhat's actually changed for me is quite a lot... I haven't opened my IDE to\nseriously write code for months now. I've oscillated between Opencode and\nCopilot CLI, leaning moreso into Copilot since it's an approved tool at work\nand as of mid-February is quite good. Mentally I'm approaching problems with a\nlittle more thought on the front-end than before because prior to agents I\nwould think as I implemented. At the scale of work that I do, this was really\nfine - working on CLI utilities to solve simple problems, developing an\niterative testing cycle for each problem that allowed me to move fast, and once\nI found a groove I was cooking. But now I don't even need to find it, I open\nOpencode or Copilot CLI with my Planner agent, describe what I want to happen and have\nOpus or GPT scope out a plan for me. Usually there's some back and forth on\nfeature scoping, then I review a markdown file it produces, and once it looks\ndecent enough to me I say \"go\" and it goes.\n\nThat works a lot better than I even care to admit because at the same time as\nI've been leaning harder into agents, I've been building my own harness of\nsorts - not a replacement for Copilot CLI or a competitor to Opencode, but\nmoreso an opinionated workflow spine that I force agents into to give strict\ngates to the SDLC (software development lifecycle).\n\n!!! warning \"Problem Solving Workflows\"\n\n    Plan and implement is fine for a lot of things, and I do think it's only getting better. My harness,\n    mentioned a few times around here before, called Nexus, is a set of agents and\n    rules that I want the code I'll be responsible for to go through before it\n    lands in production. That cycle isn't too complex, and there's only about\n    10,000 similar tools to Nexus on Github trending right now. I've thought about dropping my idea and picking up\n    something more popular, like\n    [superpowers](https://www.github.com/obra/superpowers) but at the moment I'm\n    continuing to develop on and lean into my own idea here.\n\n!!! note \"Mini post on Nexus\"\n\n    I keep saying a blog post is coming, but the high level of Nexus is that it's a task\n    tracker with a CLI that agents use to advance a ticket through a plan -\u003e build\n    -\u003e test -\u003e review -\u003e verify -\u003e merge lifecycle that is almost exactly how I\n    would otherwise have solved a problem by hand. I think it needs work, I need to\n    be harder on TDD methodlogies with agents, and work on verification gating a\n    bit more (shoutout to [showboat](https://github.com/simonw/showboat) by Simon\n    Willison) but overall it's a system of thinking that I already participate in\n    so I'm doing my best to farm out specific parts of my workflow to agents rather\n    than trying to one-shot enterprise problems and solutions.\n\n!!! danger \"Who's doing the thinking?\"\n\n    I've noticed that as I've developed Nexus out though, I lean on the agents for\n    more and more of my own thinking, and am trusting my problem solving\n    **process** moreso than my actual problem solving abilities.\n\n## Hidden costs\n\nThe cost of this increase in speed is a lack of familiarity - and the fallout\nof lack of familiarity is hard to express. There's also many facets to it.\nFor me, the first facet is that Nexus helps me move fast, but as I've leaned\ninto it for more and more of the planning, I'm less and less familiar with the\nstate of the code. I find myself asking my reviewer agents in fresh sessions\noften to explain it to me, and thankfully they're usually consistent, but\nnonetheless I'm still not intimately familiar with the code. And on Nexus it's\nnot a big deal, that's low stakes, it's just me and my workflow.\n\nI'm using Nexus + Copilot at work and that feels like higher\nstakes... I have my agents explain the status of our project and although they're\nalso somewhat consistent the thing that's scary is that other people are\nworking on that repo with me, and that's where another layer of complexity\nmanifests itself. If it's just me and my [[clankers]], let's go all day long,\nrebuild, ask questions, etc... but I have other developers I rub shoulders with\nnow, and if they ask me a question what am I going to say? \"Hold on, let me prompt\nmy agent for you\" - it's LMGTFY on steroids. And the burden becomes if I\nfeel like I can own and support what those other developers push into the repo.\n\n## Murky responsibility boundaries\n\nWhy do I own their work? Well for the third time, this post is pretty\nself-centered and all about me, and my situation is that the other developers I\nwork with presently are all contractors. Their work agreement with Cat could\nend at any second, for practically any reason. The incentive structure isn't\nthere for these guys who technically work for an agency... Their bonuses aren't\nbigger (or even exist) if Cat performs well, there's no extra vacation days in\nit for em (aye, contractors don't get vacation days anyways), and not that it's\na problem, moreso just the nature of the world we're in - but they're basically\nmercenaries out to the highest bidder and I happen to know of **multiple times\nwhere Cat lost a good person to a higher bidder**.\n\nSo this isn't really me trying to be negative about contractors at all, I'm\nhere for a pay-check as well but Cat at least gives me SOME incentive to work\nhard with the goal of compensation regardless of how altruistic I feel in my\nown circumstances.\n\n!!! note \"Incentive\"\n\n    Better ratings mean marginally better end-of-year salary increases, and I've received some other awards that certainly give me pause about jumping ship to another long-term place even when things can be crazy at Cat.\n\nIt's more than just the contrator-ownership dilema, I've dug myself quite a\nhole over the last 8-10 years, gaining a reputation that I think many would\nappreciate, but for me only lately increases the stress. I don't need to parrot\nevery accolade I've ever received, that's not the point, but to make the point\nas clear as I can - I have a lot of respect from quite a few people at\nCaterpillar. I'm blessed to have that reputation, and it's not like I haven't\nworked hard for it - but people talk about me in a way so flattering I feel\nlike the main character in a fictional story sometimes.\n\nIn a fictional story I can check out the ending, hit up spark notes, or ask AI\nhow it ends... but there isn't an \"end\" in my real world scenario, there's only\ntomorrow and I feel the pressure of not knowing what tomorrow holds now more\nthan ever.\n\n!!! danger \"\"\n\n    Being noticed is starting to feel more costly than rewarding...\n\n## Financial irony\n\nWhat's the cost? It's hard to get specific without writing a novel but here's\nthe TLDR - because I've been pretty good at what I do I've been able to do this\ntype of work outside my normal 9-5 responsibilities and with that extra work\nhas been some pretty great financial benefits. However with Cat changes,\nresponsibility increases, and now owning code that others (and their clankers)\nwrite, the extra time I gained for myself is eaten-up and has been reclaimed by\nthe mega-corp... \"Exceeding expectations\" every year just meant the bar is\nraised, the expectations are higher, the time-commitment requirement is higher,\nand as I've had to meet the requirements of both the new world and the curse of\nbeing noticed, I've lost the time for the extra work... For years I've realized\nthe benefit of my own skills and drive, but the irony of agents (and a handful\nof other things) is that with the dramatic increase in expectations, not only\non me but on those I work with and therefore their output, I don't get to\nrealize the benefits of my own gifts anymore.\n\n## Meaning and fatigue\n\nI feel very torn because the work I've been called into with Cat is good, I\nsaid in [[cat-autonomy-2-0]] that autonomy will save people's lives. I love\ngetting to participate in that mission, it's the primary reason I didn't jump\nship to try to maintain the levels, and type, of work I was doing before... But\nin a few short months the mission is being drowned out by expectations and\nrequirements that are so high I'm losing the grip on my own life.\n\n## Open questions\n\nThat leads me to questions that I can't answer, the question I ask daily now of\n\"What about tomorrow?\". What will agents do for us tomorrow, what problems will\nbe solved, what bugs will I create (by agents of course because I've never\nwritten a bug by hand in my whole life \\s). If I stopped using agents would\npeople still be impressed? Would it even matter?\n\n## Fin\n\nI'm certainly not anti-AI, it's typing all my code. I'm not anti-collaboration,\nalthough I do wish I could work alone with just my clanker-army to worry about.\nI'm not sure what I am anymore though... AI has changed how I work, what I work\non, and who I work with... Everything has changed in such a short period of\ntime and like the ending of this post, it's pretty jarring.\n\n!!! danger \"\"\n\n    Death comes to us all - James Acaster.\n\nThanks for reading.\n",
      "summary": "Agentic coding has been an exciting change to me over the last couple of months specifically. I've been using AI tools for a few years now but something...",
      "date_published": "2026-03-26T06:00:50Z",
      "date_modified": "2026-03-26T06:00:50Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "ai",
        "tech",
        "agents",
        "personal"
      ]
    },
    {
      "id": "https://pype.dev/reflection-luke-22-48/",
      "url": "https://pype.dev/reflection-luke-22-48/",
      "title": "Reflection - Luke 22:48",
      "content_html": "\u003cp\u003eSpurgeon\u0026rsquo;s \u003cstrong\u003eMorning and Evening\u003c/strong\u003e today I almost skipped, not that I\u0026rsquo;m\ndiligent to sit down every day anyways, but because I\u0026rsquo;m struggling with stress\nand work and I was hoping for some divine moment where the meditation of the\nday would just speak directly to my worries. But by God\u0026rsquo;s grace, I feel it\nspeaking to parts of me I\u0026rsquo;d rather ignore, and that alone is enough\nconfirmation to spend an extra minute on it\u0026hellip;\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eLuke 22:48\u003c/p\u003e\n\u003cp\u003eBut Jesus said to him, “Judas, are you betraying the Son of Man with a kiss?”\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eSpurgeon says first thing \u0026ldquo;The kisses of an enemy are deceitful\u0026rdquo;, not that he\u0026rsquo;s\nthe first one to say it\u0026hellip;\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eProverbs 27:6\u003c/p\u003e\n\u003cp\u003eThe wounds of a friend mean well,  but the kisses of an enemy are profane.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eOur pastor delivered a great sermon on Sunday that is dove-tailing in my heart\nwith this\u0026hellip; He said the most dangerous place to be was in the presence of the\nLord Jesus, and to remain unchanged by him. Jesus has words for me which do not\nfeel good in the moment - words I don\u0026rsquo;t even disagree with\u0026hellip; but do I fully\nagree? When he calls out the sin of lust or greed in my heart, do I take his\nrebuke into the depths of my soul and respond in kind with a contrite heart? Or\ndo I parrot agreement on the surface, but in the darkest depths continue to\nhold on to the sins that I love?\u003c/p\u003e\n\u003cp\u003eI have felt so much stress from work and AI recently that I\u0026rsquo;ve just been\nneglecting the rest of my life, and frankly a sharp word from the Lord about\norienting my life around the right things is welcome. It stings but I\u0026rsquo;m smart\nenough to see how stupid I can be. In my own way I have been betraying the\nLord: talking sweetly about him to my family and friends yet daily, for the\nlast couple weeks at least, deprioritizing my time with him and giving into the\ntemptation to always be working and producing something. In the cleanest irony\nI think I\u0026rsquo;ve only made more work and mess for myself in not taking the time\neach day to slow down and reflect - both personally and in work.\u003c/p\u003e\n\u003cp\u003ePraise the Lord for friends who speak truth to me, for my wife who cares for me\nand sees the error I\u0026rsquo;m leaning into, and ultimately for Jesus himself who has\nnever abandoned me even when I turn 2 blind-eyes away from him.\u003c/p\u003e\n",
      "content_text": "\nSpurgeon's **Morning and Evening** today I almost skipped, not that I'm\ndiligent to sit down every day anyways, but because I'm struggling with stress\nand work and I was hoping for some divine moment where the meditation of the\nday would just speak directly to my worries. But by God's grace, I feel it\nspeaking to parts of me I'd rather ignore, and that alone is enough\nconfirmation to spend an extra minute on it...\n\n!!! note \"Luke 22:48\"\n\n    But Jesus said to him, “Judas, are you betraying the Son of Man with a kiss?”\n\nSpurgeon says first thing \"The kisses of an enemy are deceitful\", not that he's\nthe first one to say it...\n\n!!! note \"Proverbs 27:6\"\n\n    The wounds of a friend mean well,  but the kisses of an enemy are profane.\n\nOur pastor delivered a great sermon on Sunday that is dove-tailing in my heart\nwith this... He said the most dangerous place to be was in the presence of the\nLord Jesus, and to remain unchanged by him. Jesus has words for me which do not\nfeel good in the moment - words I don't even disagree with... but do I fully\nagree? When he calls out the sin of lust or greed in my heart, do I take his\nrebuke into the depths of my soul and respond in kind with a contrite heart? Or\ndo I parrot agreement on the surface, but in the darkest depths continue to\nhold on to the sins that I love?\n\nI have felt so much stress from work and AI recently that I've just been\nneglecting the rest of my life, and frankly a sharp word from the Lord about\norienting my life around the right things is welcome. It stings but I'm smart\nenough to see how stupid I can be. In my own way I have been betraying the\nLord: talking sweetly about him to my family and friends yet daily, for the\nlast couple weeks at least, deprioritizing my time with him and giving into the\ntemptation to always be working and producing something. In the cleanest irony\nI think I've only made more work and mess for myself in not taking the time\neach day to slow down and reflect - both personally and in work.\n\nPraise the Lord for friends who speak truth to me, for my wife who cares for me\nand sees the error I'm leaning into, and ultimately for Jesus himself who has\nnever abandoned me even when I turn 2 blind-eyes away from him.\n",
      "summary": "Spurgeon's ** today I almost skipped, not that I'm diligent to sit down every day anyways, but because I'm struggling with stress and work and I was hoping...",
      "date_published": "2026-03-25T06:13:55Z",
      "date_modified": "2026-03-25T06:13:55Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "betrayal",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/remote-terraform-state-requires-working-traefik-duh/",
      "url": "https://pype.dev/remote-terraform-state-requires-working-traefik-duh/",
      "title": "Remote Terraform State Requires Working Traefik… DUH!",
      "content_html": "\u003cp\u003eI\u0026rsquo;m working on some spring cleaning in my homelab and backed myself into a\nhilarious corner yesterday. I use Open Tofu for any of my Terraform needs now,\nand although I don\u0026rsquo;t manage a ton with terraform, I do manage all my cloudflare\nstuff with it. I decided I wanted to use my own minio instance as the s3 remote\nstate backend for my workspaces so I could rely on my typical NAS data\nbackup/retention workflow for the buckets in case anything went wrong, as\nopposed to a local state file that I\u0026rsquo;m not taking a lot of precautions with.\nWell during my Spring Cleaning I was working towards replacing ingress into my\nhome network with Cloudflare tunnels and in the midst of that update I took\ndown traefik, no matter a simple \u0026rsquo;tofu apply\u0026rsquo; should get me right back to\nworking order\u0026hellip;\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e╷\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e│\u003c/span\u003e \u003cspan class=\"k\"\u003eError\u003c/span\u003e\u003cspan class=\"err\"\u003e:\u003c/span\u003e \u003cspan class=\"k\"\u003eError\u003c/span\u003e \u003cspan class=\"k\"\u003einspecting\u003c/span\u003e \u003cspan class=\"k\"\u003estates\u003c/span\u003e \u003cspan class=\"k\"\u003ein\u003c/span\u003e \u003cspan class=\"k\"\u003ethe\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;s3\u0026#34;\u003c/span\u003e \u003cspan class=\"k\"\u003ebackend\u003c/span\u003e\u003cspan class=\"err\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e│\u003c/span\u003e     \u003cspan class=\"k\"\u003eoperation\u003c/span\u003e \u003cspan class=\"k\"\u003eerror\u003c/span\u003e \u003cspan class=\"k\"\u003eS3\u003c/span\u003e\u003cspan class=\"err\"\u003e:\u003c/span\u003e \u003cspan class=\"k\"\u003eListObjectsV2\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"k\"\u003ehttps\u003c/span\u003e \u003cspan class=\"k\"\u003eresponse\u003c/span\u003e \u003cspan class=\"k\"\u003eerror\u003c/span\u003e \u003cspan class=\"k\"\u003eStatusCode\u003c/span\u003e\u003cspan class=\"err\"\u003e:\u003c/span\u003e \u003cspan class=\"m\"\u003e404\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"k\"\u003eRequestID\u003c/span\u003e\u003cspan class=\"err\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"k\"\u003eHostID\u003c/span\u003e\u003cspan class=\"err\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"k\"\u003eapi\u003c/span\u003e \u003cspan class=\"k\"\u003eerror\u003c/span\u003e \u003cspan class=\"k\"\u003eNotFound\u003c/span\u003e\u003cspan class=\"err\"\u003e:\u003c/span\u003e \u003cspan class=\"k\"\u003eNot\u003c/span\u003e \u003cspan class=\"k\"\u003eFound\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eHilarious problem with thankfully an easy fix\u0026hellip; downloading the state file\nfrom Minio wasn\u0026rsquo;t a big deal since the container was still running without\nissue, and placing the state file in the folder to use as the local state\nsolution for the interim went totally smooth, but this highlights the set of\ninterdependencies I\u0026rsquo;m creating for myself and as I take the next few days/weeks\nto do some spring cleaning I\u0026rsquo;m hoping I can separate out the external ingress\nfrom internal with a bit more clear boundaries so that I never lock myself out\nof a workflow I only execute on my LAN in the first place!\u003c/p\u003e\n",
      "content_text": "\nI'm working on some spring cleaning in my homelab and backed myself into a\nhilarious corner yesterday. I use Open Tofu for any of my Terraform needs now,\nand although I don't manage a ton with terraform, I do manage all my cloudflare\nstuff with it. I decided I wanted to use my own minio instance as the s3 remote\nstate backend for my workspaces so I could rely on my typical NAS data\nbackup/retention workflow for the buckets in case anything went wrong, as\nopposed to a local state file that I'm not taking a lot of precautions with.\nWell during my Spring Cleaning I was working towards replacing ingress into my\nhome network with Cloudflare tunnels and in the midst of that update I took\ndown traefik, no matter a simple 'tofu apply' should get me right back to\nworking order...\n\n```hcl\n╷\n│ Error: Error inspecting states in the \"s3\" backend:\n│     operation error S3: ListObjectsV2, https response error StatusCode: 404, RequestID: , HostID: , api error NotFound: Not Found\n```\n\nHilarious problem with thankfully an easy fix... downloading the state file\nfrom Minio wasn't a big deal since the container was still running without\nissue, and placing the state file in the folder to use as the local state\nsolution for the interim went totally smooth, but this highlights the set of\ninterdependencies I'm creating for myself and as I take the next few days/weeks\nto do some spring cleaning I'm hoping I can separate out the external ingress\nfrom internal with a bit more clear boundaries so that I never lock myself out\nof a workflow I only execute on my LAN in the first place!\n",
      "summary": "I'm working on some spring cleaning in my homelab and backed myself into a hilarious corner yesterday. I use Open Tofu for any of my Terraform needs now, and...",
      "date_published": "2026-03-23T08:12:25Z",
      "date_modified": "2026-03-23T08:12:25Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "traefik",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/to-live-in-a-world-without-ai/",
      "url": "https://pype.dev/to-live-in-a-world-without-ai/",
      "title": "To Live In A World Without AI",
      "content_html": "\u003cp\u003eI\u0026rsquo;m finding lately that I wish we could go back to pre-ChatGPT\u0026hellip; A world\nwithout a code-gen easy button, where \u0026ldquo;easy\u0026rdquo; was LSP autocomplete, where tools\nwere at my fingertips rather than remote inference endpoints, and where I and\neveryone I worked with, was paid and judged based on what we could produce with\nour own 2 hands, even if \u003ccode\u003ectrl + c\u003c/code\u003e and \u003ccode\u003ectrl + v\u003c/code\u003e was sometimes a common set of keys\u0026hellip; it\nsure beat answering \u0026ldquo;yes\u0026rdquo; to a robot every 38 seconds.\u003c/p\u003e\n",
      "content_text": "\nI'm finding lately that I wish we could go back to pre-ChatGPT... A world\nwithout a code-gen easy button, where \"easy\" was LSP autocomplete, where tools\nwere at my fingertips rather than remote inference endpoints, and where I and\neveryone I worked with, was paid and judged based on what we could produce with\nour own 2 hands, even if `ctrl + c` and `ctrl + v` was sometimes a common set of keys... it\nsure beat answering \"yes\" to a robot every 38 seconds.\n",
      "summary": "I'm finding lately that I wish we could go back to pre-ChatGPT... A world without a code-gen easy button, where \"easy\" was LSP autocomplete, where tools were...",
      "date_published": "2026-03-22T14:50:38Z",
      "date_modified": "2026-03-22T14:50:38Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "ai",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/2026-03-22-notes/",
      "url": "https://pype.dev/2026-03-22-notes/",
      "title": "2026-03-22 Notes",
      "content_text": "\nyesterday: [[2026-03-07-notes]]\n\n## Back to normal life\n\nWe're back from vacation, Florida was nice but a few thorns on the rose of vacation include:\n\n- several days of rain (but we got a blizzard up north, so beggars can't be choosers)\n- I was so pre-occupied with work the entire time that I barely got a few minutes of relaxation the entire time\n\nIn dev news, it's time to get a few things done today for the homelab, I'm\ngoing to audit my docker compose setup and work towards upgrading things that\nare horribly out of date and cleaning up my scattered stacks with the goal of\nhopefully eventaully migrating some things to kubernetes and using cloudflare\ntunnels in place of keeping 80/443 open on my firewall for traefik ingress.\n\n[[spring-cleaning-2026-homelab-edition]]\n",
      "summary": "yesterday: 2026-03-07-notes",
      "date_published": "2026-03-22T07:09:33Z",
      "date_modified": "2026-03-22T07:09:33Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/paynepride-dot-com-outage-on-vacation/",
      "url": "https://pype.dev/paynepride-dot-com-outage-on-vacation/",
      "title": "paynepride dot com outage on vacation",
      "content_html": "\u003cp\u003eThe day after I leave for vacation I start getting SSL errors on every homelab\nservice I host for myself and others. The culprit was my Cloudflare API token\nexpiring. It was easy to find the 403s in the logs for Traefik (thank goodness\nfor Tailscale getting me into the lab from afar). The solution was to rotate the\nAPI token, replace the value in Traefik\u0026rsquo;s .env file, and hit it with the \u0026ldquo;just\ndeploy\u0026rdquo; button. Now I don\u0026rsquo;t know why this expired - the key looks like it has\nno expiration to me - and I\u0026rsquo;m too tired from the beach to dig in further.\nUntil next time, I expect this error to come back March 16 2027 I suppose.\u003c/p\u003e\n",
      "content_text": "\nThe day after I leave for vacation I start getting SSL errors on every homelab\nservice I host for myself and others. The culprit was my Cloudflare API token\nexpiring. It was easy to find the 403s in the logs for Traefik (thank goodness\nfor Tailscale getting me into the lab from afar). The solution was to rotate the\nAPI token, replace the value in Traefik's .env file, and hit it with the \"just\ndeploy\" button. Now I don't know why this expired - the key looks like it has\nno expiration to me - and I'm too tired from the beach to dig in further.\nUntil next time, I expect this error to come back March 16 2027 I suppose.\n",
      "summary": "The day after I leave for vacation I start getting SSL errors on every homelab service I host for myself and others. The culprit was my Cloudflare API token...",
      "date_published": "2026-03-16T13:21:31Z",
      "date_modified": "2026-03-16T13:21:31Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "ofc",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/2026-03-07-notes/",
      "url": "https://pype.dev/2026-03-07-notes/",
      "title": "2026-03-07 Notes",
      "content_text": "\nyesterday: [[2026-03-03-notes]]\n\nHappy Saturday, we're at the GWL and I figured I'd take a few minutes this\nmorning to reflect on the last few weeks\n\n## Work\n\nCat Autonomy is going well for me, my team seems relatively pleased with the\nwork and ideas I've brought to the table, and I've played a role in some pretty\ninstrumntal changes. I have been piecing together more and more of a story, I'm\nnot sure about Caterpillar specifically but maybe, about technical leadership\nand how a lack of it at the top level (C-suite, Execs, etc.) leads to\nlong-lasting frustration and repetitive pain points at lower levels (ie. where\nI am). The **reasons** that I needed to make, or propose, all the changes I\nhave is that a lack of leadreship has culminated over years into a sprawling\nmess of responsibilities, requests, deliverables, and a lack of a cohesive\n\"thing\" which was the original vision for the project I'm on now (I know this\ncause I was here when it started).\n\n### Agents\n\nAgents are making it possible for me to to produce the amount of work I have\nbeen for the last 2 months. It feels like the future in many ways, a lot is\nunknown still but I need a write a follow-up on [[learning-how-to-agent]]. I'm\nnot sure where I sit in agentic coding skills in the scope of the world, but at\nCaterpillar I am within episolon of 100% confident that I'm one of the most\nactive and proficient agentic-tool-users (Specifically GitHub Copilot, but I am\nincluding peripheral things here - knowledge of context management, custom\nagents, [harness engineering](https://openai.com/index/harness-engineering/),\netc). [[nexus]] has been serving me really well and that is about to warrant\nits own post too - I have had a few Caterpillar peeps reach out about using\nNexus for themselves and although it's not there yet, it is coming together\nnicely.\n\nOver the last 6 weeks I've come up with a platform idea, and stitched\ntogether/upgraded several existing solutions from the past 5 years, into a\nplatform I'm calling \"Forge\". For the past 2 years there's been an internal\neffort to rebuild what I just recently consolidated, but that project has no\nusers and is unstable AF... Just this week our leadership decided to ax taht\nproject and put those developers on my thing. I've been struggling with this a\nlittle because I don't like to think that I have so much weight at Cat now as\nto meaningfully affect the work othe rpeople are doing. I like to build tools\nto affect **how** people work, but in this case I effecitvely killed a 2 year\nold project and there's more than 0 emotions to deal wtih. Overall the team\ndoesn't seem too bent out of shape about it, but nonetheless the influence I\nsee that I have, and it's continuing to increase, is somewhat daunting\n\n## Misc\n\nAt the Great Wold Lodge and having a blast, minus kids not sleeping great\n(which unfortunately makes having fun sometimes a near-breakdown-experience).\nWe're hanging out with tbe BFFs and my best mate has recently become a Lead in\nhis engineering firm. Proud of him for sure. I also am feeling acutely aware of\na fact - that things change over time, and influence has lasting impacts.\n\nKids are up, time to sign off.\n",
      "summary": "yesterday: 2026-03-03-notes",
      "date_published": "2026-03-04T05:06:36Z",
      "date_modified": "2026-03-04T05:06:36Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/for-my-own-sake-i-do-it/",
      "url": "https://pype.dev/for-my-own-sake-i-do-it/",
      "title": "For My Own Sake I Do It",
      "content_html": "\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eIsaiah 48:9-11\u003c/p\u003e\n\u003cp\u003e9 For the sake of my name I ⌊refrain from⌋ my anger,\nand for my praise I restrain it for you\nso as not to cut you off.\n10 Look! I have refined you, but not like silver;\nI have chosen you in the furnace of misery.\n11 For my own sake, for my own sake I do it;\nfor why should it be defiled?\nAnd I will not give my glory to another.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eMy thoughts here feel hard to put together - it\u0026rsquo;s a comforting thing to me to\nhear God say he restrains his anger for the sake of his name. God\u0026rsquo;s Name is a\nholy thing, he is a holy thing. In his sovereignty and power he chooses people,\nhe chose me and loves me. Because his choices are \u003cstrong\u003ehis choices\u003c/strong\u003e and they have\nnothing to do with me, it is comforting to me to hear that God prioritizes his\nown character over anything else. He doesn\u0026rsquo;t bless me or help me at the expense\nof anyone else or for my own sake - every blessing I have is for the sake of\nhis own Name.\u003c/p\u003e\n\u003cp\u003eIt\u0026rsquo;s also objectively and morally good and right for him to make these choices\nfor his own Name\u0026rsquo;s sake. Why? Because he is the creator\u0026hellip; if Yahweh was\ncreated, a creature, then his Name, Himself, would not be the most fundamental\ngoodness, would not be the most important thing to appeal to. But because he is\nthe uncaused-causer, the first, the Big Banger, who ultimately loves his\ncreation and redeems a people for himself\u0026hellip; Because he is a loving father then\nit is good and right for him to to make choices based on himself, not based on\nme or creation. It\u0026rsquo;s comforting because the fundamental reality is that reality\nis outside my control, and the one who controls it behaves in a way that\nprioritizes his own good Name.\u003c/p\u003e\n\u003cp\u003ePraise God for a benevolent King who rules well for the sake of himself,\nbecause any other reason falls short.\u003c/p\u003e\n",
      "content_text": "\n!!! note \"Isaiah 48:9-11\"\n\n    9 For the sake of my name I ⌊refrain from⌋ my anger,\n    and for my praise I restrain it for you\n    so as not to cut you off.\n    10 Look! I have refined you, but not like silver;\n    I have chosen you in the furnace of misery.\n    11 For my own sake, for my own sake I do it;\n    for why should it be defiled?\n    And I will not give my glory to another.\n\nMy thoughts here feel hard to put together - it's a comforting thing to me to\nhear God say he restrains his anger for the sake of his name. God's Name is a\nholy thing, he is a holy thing. In his sovereignty and power he chooses people,\nhe chose me and loves me. Because his choices are **his choices** and they have\nnothing to do with me, it is comforting to me to hear that God prioritizes his\nown character over anything else. He doesn't bless me or help me at the expense\nof anyone else or for my own sake - every blessing I have is for the sake of\nhis own Name.\n\nIt's also objectively and morally good and right for him to make these choices\nfor his own Name's sake. Why? Because he is the creator... if Yahweh was\ncreated, a creature, then his Name, Himself, would not be the most fundamental\ngoodness, would not be the most important thing to appeal to. But because he is\nthe uncaused-causer, the first, the Big Banger, who ultimately loves his\ncreation and redeems a people for himself... Because he is a loving father then\nit is good and right for him to to make choices based on himself, not based on\nme or creation. It's comforting because the fundamental reality is that reality\nis outside my control, and the one who controls it behaves in a way that\nprioritizes his own good Name.\n\nPraise God for a benevolent King who rules well for the sake of himself,\nbecause any other reason falls short.\n",
      "summary": "!!! note \"Isaiah 48:9-11\"",
      "date_published": "2026-03-03T06:11:46Z",
      "date_modified": "2026-03-03T06:11:46Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "Isaiah",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2026-03-03-notes/",
      "url": "https://pype.dev/2026-03-03-notes/",
      "title": "2026-03-03 Notes",
      "content_text": "\nyesterday: [[2026-02-26-notes]]\n\n- note on [[my-thoughts-on-beads]]\n  - Nexus post/page coming eventually\n- [[for-my-own-sake-i-do-it]]\n",
      "summary": "yesterday: 2026-02-26-notes",
      "date_published": "2026-03-03T05:25:57Z",
      "date_modified": "2026-03-03T05:25:57Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/my-thoughts-on-beads/",
      "url": "https://pype.dev/my-thoughts-on-beads/",
      "title": "My Thoughts on Beads",
      "content_text": "\n[Steve Yegge](https://en.wikipedia.org/wiki/Steve_Yegge) is a pretty well-known individual in the tech field, having been\naround for a long time at some of the larger companies. He's making quite a\nsplash in the agentic coding world as well. I've appreciated Steve's posts and\nprojects lately and wanted to put some thoughts on one called\n[beads](https://github.com/steveyegge/beads).\n\n## Beads\n\nBeads is an issue tracker with links - issues relate to and block each other,\nbut agents use beads to keep track of information and dependencies without\nstoring it in their context 100% of the time. It seems like a very popular and\nuseful tool - but I am not using it, and that's what I wanted to capture... why\nnot?\n\nThe answer for me is about **where** the organization layer is for the\ndeveloper. Beads exists in a single repo - it's a system-wide CLI but you 'bd\ninit' in a git repo, and beads uses the `.git/` folder, worktrees, [dolt](https://docs.dolthub.com/), and some\ngit hooks to operate within that git repo. Outside the repo, it takes another\ntool to tie together all the beads databases you might have.\n\nFor me, I'm hardly \"in\" a git repo anymore. My workflow is that when I have\nsomething to work on, I create a \"workspace\" ([self-defined concept](https://pypeaday.github.io/dotfiles/terminal/workspaces/#installation)) which is\njust a folder on my filesystem where I check-out git worktrees from any of the\nrepos related to the work I'm doing. Sometimes it's 1 worktree from 6 repos,\nsometimes it's 6 worktrees from 1 repo for parallel work...\n\nSo because I like to organize myself in this way, beads is already \"out\" for\nme. That's the main reason - I don't have any real technical issues with beads\nor any criticism, it just is designed for a workflow that is not how I work.\n\nThis is why I'm building [[nexus]], something I hope to be able to put out\nthere \"soon\". It won't be as general-purpose as beads, but my goal with it is\nto be plug-and-play for any agentic harness (copilot cli, claude code,\nopencode, etc.). It's a challenge thinking about it as a personal tool but also\nas a tool to share someday, but agentic coding is making it possible to make\nsome cool shareable stuff and I'm excited for my own workflow-task-manager to\nmature and at least become something useful to me (it already is, but building\nthe plane in the air makes it kind of hard to enjoy the plane).\n\n### Credit\n\n- banner image from ChatGPT\n",
      "summary": "Steve Yegge is a pretty well-known individual in the tech field, having been around for a long time at some of the larger companies. He's making quite a...",
      "date_published": "2026-03-03T05:00:47Z",
      "date_modified": "2026-03-03T05:00:47Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "ai",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/2026-02-26-notes/",
      "url": "https://pype.dev/2026-02-26-notes/",
      "title": "2026-02-26 Notes",
      "content_text": "\nyesterday: [[2026-02-25-notes]]\n\n- [[the-wrath-to-come]]\n- started [[the-wrath-to-come-pt-2]]\n",
      "summary": "yesterday: 2026-02-25-notes",
      "date_published": "2026-02-26T06:07:08Z",
      "date_modified": "2026-02-26T06:07:08Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/the-wrath-to-come-pt-2/",
      "url": "https://pype.dev/the-wrath-to-come-pt-2/",
      "title": "The Wrath to Come pt 2",
      "content_text": "\n## The Beginning\n\n[[the-wrath-to-come]] is only the beginning, because for the true son or\ndaughter of the King, the wrath directed at the enemy, at the threat, is a\n**divine grace**. The general understanding I see people have is to take the\nposition that we're all God's kids, so any anger/wrath he exhibits against\nanyone is somehow a contradiction to his loving nature.\n\nHis demonstration of wrath towards his enemies is a great proof of the love he\nhas for his children though. If everyone erroneously takes a view that we're all\nGod's children then there's not any room to talk about the enemies of God. YOU\nare the enemy! As was I... and it's by God's divine love and sovereignty that I\nhave been adopted into his family. It's by nothing more than love and\nsovereignty that **anyone** is adopted.\n\nIf you are a child of the King, then wrath is only the beginning,\nbecause the rest of that story is of protection and love. Humanity gets hung up\non wrath thinking we're the good guys and God owes us one, but this isn't a\nBiblical worldview.\n\nWhen people talk about god, god's wrath, god's love, etc...\nI like to ask \"which god?\" because a lot of people aren't talking about my\nGod, the True God-King, when they make claims about love and wrath... Most\npeople want a grandpa in the sky too senile to recognize when they've done\nsomething wrong - but my King is the farthest thing from that caricature and his\ngrand love for his people will be shown in many ways. Watching his wrath from\nbehind the angelic armies will look much more like grace and love than hatred\nand anger, but for the enemies of God facing him at the front I'm sure 'wrath'\nwill be all they see.\n\n## Choices\n\nLife is made up of choices, and I don't think making a choice based on fear is\nideal. I do not think that anyone can **will themselves**, by fear or\nnot, to \"accept Jesus\" - ie. saving faith in the Lord isn't something anyone\ncan arrive at on their own, it is a gift.\n\nSo the question is, when the gift is sat in front of you, the gift of adoption\nand eternal life, divine and eternal grace, do you accept it? Or let it pass\nby... Because that choice dictates a lot about how God looks at you. He's\neither protecting you from his enemies, or you are his enemy. And to be honest,\nwhen the enemies of God try to slander his name by calling him hateful and\nreferring to wrath as though it should change the reality of who he is - all I\nsee are enemies and propaganda. I know my God loves me, it's been proven over\nand over.\n\nYahweh is not a senile old man in the sky, he is the conquering King and he\nwill protect his own. So thank God for love and wrath.\n",
      "summary": "the-wrath-to-come is only the beginning, because for the true son or daughter of the King, the wrath directed at the enemy, at the threat, is a **. The...",
      "date_published": "2026-02-26T06:06:53Z",
      "date_modified": "2026-02-26T06:06:53Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "wrath",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/the-wrath-to-come/",
      "url": "https://pype.dev/the-wrath-to-come/",
      "title": "The Wrath to Come",
      "content_text": "\n!!! note \"Matthew 3:7\"\n\n    But when he saw many of the Pharisees and Sadducees coming to his baptism,\n    he said to them, “Offspring of vipers! Who warned you to flee from the coming\n    wrath?\n\n`The coming wrath`... This is a tough one to think about, and I'm not sure I\nhave a ton of hard opinions about that coming wrath anymore. I used to cling to\na few Bible verses that I thought painted a \"complete\" picture, or complete\nenough, of what this coming wrath will be like. But anymore, after walking with\nthe Lord, becoming a dad, learning that ancient literature is quite a bit\nharder to read than your average 21st century novel... well I'm just not sure\nwhat I know anymore beyond a few things:\n\n1. Yahweh created all things (Genesis 1)\n2. In Jesus all things are held together (Colossians 1:17)\n3. \\*No one comes to Father except through Jesus, and only those whom the Father gives to him (John 6)\n4. By God's grace alone is anyone chosen (Ephesians 2:8-9)\n\n\\*See [[helkyo-what-is-it-for-god-to-draw-man-to-him]]\n\nSo what can I say about anything outside those 4 points? Not a lot that's\nconcrete, but definitely some anecdotes, and those might be helpful.\n\nIt's uncomfortable to think about God's wrath I think because a lot of people,\nChristian or not, have this idea that \"we are all God's children\" and so we\nanalyze that statement from the position of a son or daughter. **But biblically,\nthis is just not even close to accurate**... Yahweh disinherited the nations at\nBabel (Genesis 10-11, Deuteronomy 32) and created a new inheritance for\nhimself. NOT all people are God's children... I don't know where this preschool\ntheology came from but it's been a disaster to the general public's view of\nlegitimate Christianity. John says in this Matthew passage that God can make\nchildren from stones - so just being born a human doesn't grant you the\nstatus of child of God.\n\n!!! note \"Matthew 3:9\"\n\n    And do not think to say to yourselves, ‘We have Abraham as father.’ For I\n    say to you that God is able to raise up children for Abraham from these stones!\n\nI think people would generally do well to imagine themselves, not as God's\nchildren, but as an offender of God's children... Now let's think about wrath\nfor a second. If anyone hurt my daughters, especially someone not already in my\ngood graces, you had best believe that \"wrath\" will be an accurate word to use\nto describe my response. If you come for my family, for my children, that'll\nsimply be the end of you. With that minimal perspective in mind... God's wrath\nkind of is a bit more palletable I think.\n\n!!! danger \"\"\n\n    What makes it hard is the wrong view of ourselves from the beginning...\n\nHow would it be, if someone I didn't know walked into my house and declared\nthemselves my son, my friend, etc. No one gets to declare themselves apart of\nmy family, there's a process to joining a family... Yahweh, as the creator of\nall things, is the one with the authority to declare these things. He has\nsimply NOT said that all people are his children - what he has done is sent an\ninvitation out that anyone can hear, and those whom he does choose are given\nthe ability to respond to it. The hearts of the men and women who hear the call\nand are changed are the ones who can refer themselves as a son or daughter of\nthe King.\n\nSo, if someone who is not God's child thinks that God has no right to\nexhibit wrath against the ones harming his kids... well... I'm not sure what\nargument anyone can have there... if you break into my house and harm my family\nyou're in for a rough time - if you harm the kids of the creator of EVERYTHING,\nI can only imagine \"wrath\" would be just the beginning.\n\nFollow-up post coming: [[the-wrath-to-come-pt-2]]\n",
      "summary": "!!! note \"Matthew 3:7\"",
      "date_published": "2026-02-25T06:09:15Z",
      "date_modified": "2026-02-25T06:09:15Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "wrath",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/clocks/",
      "url": "https://pype.dev/clocks/",
      "title": "clocks",
      "content_html": "\u003cp\u003eOne of the best things I\u0026rsquo;ve vibe-coded\u003c/p\u003e\n\u003cfigure\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20260225115333_35a70833.png\" alt=\"20260225115333_35a70833.png\"\u003e\n\u003c/figure\u003e\n",
      "content_text": "\nOne of the best things I've vibe-coded\n\n![20260225115333_35a70833.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20260225115333_35a70833.png)\n",
      "summary": "One of the best things I've vibe-coded",
      "date_published": "2026-02-25T05:53:01Z",
      "date_modified": "2026-02-25T05:53:01Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "projects",
        "vibe-coding"
      ]
    },
    {
      "id": "https://pype.dev/2026-02-25-notes/",
      "url": "https://pype.dev/2026-02-25-notes/",
      "title": "2026-02-25 Notes",
      "content_text": "\nyesterday: [[2026-02-24-notes]]\n\n## Tech\n\n- Added some timezones to [[clocks]]\n",
      "summary": "yesterday: 2026-02-24-notes",
      "date_published": "2026-02-25T05:29:14Z",
      "date_modified": "2026-02-25T05:29:14Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/2026-02-24-notes/",
      "url": "https://pype.dev/2026-02-24-notes/",
      "title": "2026-02-24 Notes",
      "content_text": "\nyesterday: [[2026-02-23-notes]]\n\n## Today\n\n- Wrote a Compassion letter to Noemi\n",
      "summary": "yesterday: 2026-02-23-notes",
      "date_published": "2026-02-24T04:29:35Z",
      "date_modified": "2026-02-24T04:29:35Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/reflection-hebrews-13-5/",
      "url": "https://pype.dev/reflection-hebrews-13-5/",
      "title": "Reflection - Hebrews 13:5",
      "content_text": "\n!!! note \"Hebrews 13:5\"\n\n    Your lifestyle must be free from the love of money, being content with what you have. For he himself has said, “I will never desert you, and I will never abandon you.”\n\nHebrews is a long sermon and near the end of that sermon are some imperatives\nfor God's people. The Bible is anything but Basic Instructions Before Leaving\nEarth, but Hebrews 13 has some pretty basic instructions that are wise to\nremember. There are 2 in this verse to encourage me this morning:\n\n1. Your lifestyle must be free from the love of money\n2. For he himself has said\n\n## Reflect\n\nThe lifestyle comment just such a particularly relevant thing to me right now\nas God has brought changes to my work/career. In many ways my lifestyle is very\nfree from the **love of money** - we live below our means, give money away,\netc. But I know my heart is fickle, and if there's not as much money as I think\nthere should be in our account I feel something in me that is most certainly\nsinful. I know what having more than we need is like, and to be honest with\nanyone - I do love that... I don't love money but I really enjoy the simplicity\nthat having too much money affords you in daily life. What will the next\nseveral years look like? I do not know exactly, I have no reason to have any\nactual concerns, and so my hope for myself is that God fills me with\ncontentment as I processed some the other day in\n[[reflection-contentment-and-work]].\n\nThe work changes are welcome but it doesn't feel **natural** to me to welcome\nthem. I think I can only call them welcome because of the second part of the\nverse that jumped out at me - \"For he himself has said\".\n\nThe Word of the Lord ought to be a heavy thing to the Christian - to me. God's\nWord is objectively more valuable than gold, and \"he himself has said, 'I will\nnever desert you, and I will never abandon you'\". My heavenly father has given\nme assurance through his own word, which he is bound by his own nature to be\ntrue to, that I am cared for. My life is evidence of this - so many examples of\nGod's faithfulness to me and my family. He's been so materially faithful that\nI'm not sure I can ever say I've learned any secret to contentment - God has\nsimply been so good to me has blessed me greatly. Between his word that\nhe'll never forsake me and the record of faithfulness to me in my own life I'd\nhave to make a choice that flys in the face of data to not be content... What\nis there for me to not be content over? Absolutely nothing!\n\nContentment has been on my mind a lot this week, there's no reason for me to\nlack contentment, and no secret to lean into. I am, simply put, still a sinner\nand the love of money is the sin crouching at the door, waiting for me. By\nGod's grace he continues to protect me, and I can calmly, with contentment and\nsatisfaction, walk through the next season of my life knowing that he himself\nhas said, he will never abandon me.\n",
      "summary": "!!! note \"Hebrews 13:5\"",
      "date_published": "2026-02-21T05:19:39Z",
      "date_modified": "2026-02-21T05:19:39Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "money",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2026-02-23-notes/",
      "url": "https://pype.dev/2026-02-23-notes/",
      "title": "2026-02-23 Notes",
      "content_text": "\nyesterday: [[2026-02-20-notes]]\n\n## Tech\n\n- some progress on [[nexus]] webapp\n\n## Daily\n\n- re-[[reflection-hebrews-13-5]]\n",
      "summary": "yesterday: 2026-02-20-notes",
      "date_published": "2026-02-21T05:08:59Z",
      "date_modified": "2026-02-21T05:08:59Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/cat-stock-at-760/",
      "url": "https://pype.dev/cat-stock-at-760/",
      "title": "Cat Stock at 760",
      "content_html": "\u003cp\u003eCat stock is ridiculous\u0026hellip; I remember 6 years ago or so someone at a volleyball\nmeetup freaking out about 197, he couldn\u0026rsquo;t wait to sell at 200\u0026hellip;\u003c/p\u003e\n",
      "content_text": "\nCat stock is ridiculous... I remember 6 years ago or so someone at a volleyball\nmeetup freaking out about 197, he couldn't wait to sell at 200...\n",
      "summary": "Cat stock is ridiculous... I remember 6 years ago or so someone at a volleyball meetup freaking out about 197, he couldn't wait to sell at 200...",
      "date_published": "2026-02-20T05:09:08Z",
      "date_modified": "2026-02-20T05:09:08Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "cat",
        "note"
      ]
    },
    {
      "id": "https://pype.dev/reflection-2-corinthians-7-6/",
      "url": "https://pype.dev/reflection-2-corinthians-7-6/",
      "title": "Reflection - 2 Corinthians 7:6",
      "content_text": "\n!!! note \"2 Corinthians 7:6\"\n\n    But God, who comforts the humble, comforted us by the coming of Titus,...\n\nPaul didn't have to credit God as one \"who comforts the humble\" - he could've\njust praised God for the comfort brought through Titus showing up. But instead,\nPaul just tosses the nugget in there.\n\nAt a glance, maybe it looks like Paul is building himself, or his group, up by\nself-referencing as \"humble\". But calling yourself humble isn't the proud and\narrogant claim that it sounds like today...\n\n![20260220105727_535201a2.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20260220105727_535201a2.png)\n\nIn reality - humility is an honest view of oneself, not in inflated **or\ndeflated** view - but I won't digress farther than that...\n\nPaul isn't bragging about his own humility, or claiming that **because he's\nhumble** then God comforts him. No, the sense of the word ταπεινός (tapeinos)\nis downcast... ie. someone in need of comfort.\n\nPaul is giving God praise, just naturally in his own language, as the one who\ncomforts people who need it. By God's grace on my life, I believe I have seen a\nsimilar pattern - I even outlined in [[by-gods-grace]] regarding why I say \"by\nGod's grace\" so often... It's just become apart of how I talk because the\noverflow of God's love for me is made manifest in my language.\n\nThank God for Paul, and for the work God does in his people to recognize his\nown Glory. And thank God that I can look back over 10 and 20 years and\nrecognize the work God has done in me that I might recognize his Glory as well.\n\nGod most certainly does comfort the downcast, no word is sweeter than his in my\near when things aren't going my way. But why? It's because his word to me is\nbuilt on a foundation (a decades old foundation at this point, by his grace) of\nlove. I have come to believe and know beyond any shadow of a doubt of God's\nlove for me, and by his love I know that when I am downcast I am not forsaken,\nI'm just... downcast. And God comforts me in those times. I don't think it can\nmake sense without personal intimate knowledge of the Lord - no one could read\nthis and take seriously that the often silent comfort God brings is so\npowerful. Or, to be more related to the verse, that when we are comforted\nthrough each other, it is still then an act of grace by the Lord to bring that\ncomfort through another person. Without the adoption papers signed by Yahweh\nsignifying your sonship to the King, I do not believe that this comfort can\neven begin to make sense.\n\nBut by God's grace, it makes sense to me, and praise the Name of the Lord for\nit.\n",
      "summary": "!!! note \"2 Corinthians 7:6\"",
      "date_published": "2026-02-20T04:54:11Z",
      "date_modified": "2026-02-20T04:54:11Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "comfort",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2026-02-20-notes/",
      "url": "https://pype.dev/2026-02-20-notes/",
      "title": "2026-02-20 Notes",
      "content_text": "\nyesterday: [[2026-02-18-notes]]\n\n- [[reflection-2-corinthians-7-6]]\n\n## Tech\n\n- Need to spend some time on zfs-ops\n- Started stubbing out k8s ideas for homelab with windsurf - lots generated in homelab-mono\n- Having Gemini 3.1 pro take a stab at vamping up Nexus website\n",
      "summary": "yesterday: 2026-02-18-notes",
      "date_published": "2026-02-20T04:43:59Z",
      "date_modified": "2026-02-20T04:43:59Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/trials-reveal-faith-short/",
      "url": "https://pype.dev/trials-reveal-faith-short/",
      "title": "Trials Reveal Faith (short)",
      "content_html": "\u003cp\u003eSpurgeon\u0026rsquo;s \u0026ldquo;Morning and Evening\u0026rdquo; today ended with a poem:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eTrials make the promise sweet;\nTrials give new life to prayer;\nTrials bring me to his feet,\nLay me low, and keep me there.\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eTrials forge and reveal faith in our lives - faith in something that is\u0026hellip;\nYahweh uses trials as a megaphone to his people though. For those called into\nhis family, the trials of temporary life should, and for the true believer\n\u0026lsquo;do\u0026rsquo;, bring us closer to the King\u0026rsquo;s throne. The trial highlights a larger\nreality of existential need of a savior. Trials have severity because there are\ndifferent kinds, but the need for a King is of one kind. It is the highest and\nmost necessary need of us all, but not everyone knows it. Trials can reveal it.\u003c/p\u003e\n\u003cp\u003ePraise the Lord for trials that bring us closer to him, for no trial of earth\ncan compare to the Glory of the King.\u003c/p\u003e\n",
      "content_text": "\nSpurgeon's \"Morning and Evening\" today ended with a poem:\n\n```\nTrials make the promise sweet;\nTrials give new life to prayer;\nTrials bring me to his feet,\nLay me low, and keep me there.\n```\n\nTrials forge and reveal faith in our lives - faith in something that is...\nYahweh uses trials as a megaphone to his people though. For those called into\nhis family, the trials of temporary life should, and for the true believer\n'do', bring us closer to the King's throne. The trial highlights a larger\nreality of existential need of a savior. Trials have severity because there are\ndifferent kinds, but the need for a King is of one kind. It is the highest and\nmost necessary need of us all, but not everyone knows it. Trials can reveal it.\n\nPraise the Lord for trials that bring us closer to him, for no trial of earth\ncan compare to the Glory of the King.\n",
      "summary": "Spurgeon's \"Morning and Evening\" today ended with a poem:",
      "date_published": "2026-02-18T06:19:07Z",
      "date_modified": "2026-02-18T06:19:07Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "trials",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2026-02-18-notes/",
      "url": "https://pype.dev/2026-02-18-notes/",
      "title": "2026-02-18 Notes",
      "content_text": "\nyesterday: [[2026-02-17-notes]]\n\n## Tech\n\n- upgraded pihole for the first time in forever\n- using my windsurf credits to try and close some gaps in my backup logic\n  - [ ] zfs-ops repo -\u003e data-ops\n  - [ ] introduce zerobyte as a frontend to my backups?\n  - [ ] get a good diagram built\n\n## Personal\n\n- next GWL trip!\n- [[trials-reveal-faith-short]]\n",
      "summary": "yesterday: 2026-02-17-notes",
      "date_published": "2026-02-18T05:43:57Z",
      "date_modified": "2026-02-18T05:43:57Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/forge-ahead/",
      "url": "https://pype.dev/forge-ahead/",
      "title": "Forge Ahead",
      "content_text": "\nYesterday's [[reflection-contentment-and-work]] has a second-part this morning.\nAs I was wrapping up a project I didn't realize the closed-off-ness of\nleaving... I handed in some notes, and mid-message to someone the clock struck\nmidnight and I was locked out. It's fitting to be honest, and now in the wake\nof yesterday's contentment post, experiencing some more loss than I expected,\ntoday we forge ahead.\n\nMy main focus for work now is a project I will refer to as `forge`. It is what\nI will bring to Caterpillar Autonomy but I can only build it thanks to the\ngifts and experience God has given me. The thing I want to put on paper is a\nshort list of experiences I think God in his sovereignty, gave me over the last\nfew years and what they provide for me for Forge.\n\n## Cat Reman Platform\n\nOne of the first things that comes to mind is another project I was sad to\nlose: a platform I started for an analytics team in Cat Reman. That began as a\nsimple python cli to automate some developer operations that was otherwise a\ndozen clicks through the AWS console. Using [boto3] and some simple python I\ngave that team the start of some real velocity gains. Eventually that grew into\na larger kubernetes-based service where the data science operations: code quality,\ndeployment, updates, webapps, etc. were all handled by our platform. It wasn't\nperfect, it wasn't self-contained, it was a set of things kind of glued\ntogether with systems and scripts, but it worked, it works today and is under\nfantastic ownership.\n\nWhat I learned just from starting that cli was to be passionate about solving\nproblems. No one asked me to make it, but it needed made, and the team is in\nsuch a better place for me having started it.\n\n## Kedro and OpenShift\n\nAnother short project I was able to participate in a few years ago was leading\na data-syncronization task into a fiery horrific crash that lasted weeks -\nneigh months longer - than was necessary or appropriate... The details aren't\nrelevant - I was the lead dev in a new place tasks with syncing up data between\n2 applications. Ultimately, could've been a python script but I over-designed a\nkedro-based solution because of some requirements I misunderstood. Part of that\nmisunderstanding was not knowing how to get the requirements I needed, but they\nweren't provided in full, I didn't know any better, so for weeks we were a\ncorporate meme trying to use python to update a database that no one on our\nteam understood if we were allowed to write to.... It was very confusing.\n\nBut what I learned was a lot about gathering requirements, questioning\nassumptions, and the importance of understanding your constraints as fully as\npossible as early as possible.\n\n## A Real Platform\n\nThen one of the biggest blessings I see for Forge, is the experience I've\ngotten recently with AWS at scale... Not 1 or 2 services created with\nMedium.com copy pasta tutorials from docs... but experience working in a large\nproject across many accounts, supporting several teams, using a wide variety of\ntechnologies from Terraform to Kubernetes.\n\nOn this project I learned about practical system design and gained a lot of\nconfidence in supporting systems that are complicated... I'm not the smartest\nguy in the world but I'm no dummy, and even while lacking fluency in the system\nI was supporting on this project I learned a lot of troubleshooting skills and\ngained confidence in my ability to troubleshoot complex systems.\n\nI'll need this for Forge - which will break certainly, but I'll be there to fix\nit and I'm sure I can because I've done these other things.\n\n## Fin\n\nThe Lord has been with me through these projects - he has certainly blessed me\nwith a skillset and personality that lends itself to being really useful in the\nTech world I've landed in (which is a whole 'nother story of God's sovereignty\nand provision). I am very grateful for the swath of experience I've gotten over\nthe last 8 years or so, and this season I'm in of change is rocking me a little\nmore than I anticipated but by God's grace I think I see the purpose, or at\nleast **a** purpose, and I pray I am making the choices for work he wants me to\nmake.\n",
      "summary": "Yesterday's reflection-contentment-and-work has a second-part this morning. As I was wrapping up a project I didn't realize the closed-off-ness of leaving......",
      "date_published": "2026-02-17T05:14:15Z",
      "date_modified": "2026-02-17T05:14:15Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "work",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/2026-02-17-notes/",
      "url": "https://pype.dev/2026-02-17-notes/",
      "title": "2026-02-17 Notes",
      "content_text": "\nyesterday: [[2026-02-16-notes]]\n\n- started [[someday]]\n  - used opencode to go through my posts for technologies I said I'd write about but haven't yet\n- [[forge-ahead]]\n",
      "summary": "yesterday: 2026-02-16-notes",
      "date_published": "2026-02-17T04:52:51Z",
      "date_modified": "2026-02-17T04:52:51Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/reflection-contentment-and-work/",
      "url": "https://pype.dev/reflection-contentment-and-work/",
      "title": "Reflection - Contentment and Work",
      "content_text": "\n!!! note \"Philippians 4:11\"\n\n    Not that I speak from need, for I have learned to be content in whatever circumstances I am.\n\n## Context\n\nThis verse showing up in Spurgeon's **Morning and Evening** is a divine\ngrace to me. Today is a significant day in a journey God has had me on towards\ncontentment. The circumstances of that journey, the specifics, are known to\nsome but I can still speak generally enough about it in this reflection because\nthe generalities are not unique to me - anymore than the requirement to\n**learn** contentment, for it's not a natural state for a man.\n\nFor me, like a lot of others, it's about money right now. Over the last few\nyears I've been able to make a pretty significant income and God has blessed me\nthrough the work I've done, but something I have noticed is the work itself has\nfelt less and less blessed, and more like a burden as the goal became money. I want\nto be a billionaire and never concern myself with a financial struggle - but\nthis is childish thinking. The last few years have shown me that I can work, a\nlot, and make money, also a lot (relatively speaking). I don't feel as though\nI've wasted time necessarily, the _amount_ of work and the _time_ the work\ntakes are different things. But where I may have recovered some of the time in\noverworking, I certainly gave up other things: fulfilment and excellence to\nname the top 2. As I've not been content, and have striven for more it's become\nclear that **wanting more** is itself a burden.\n\nToday marks the end of some income that I've been able to work for - not all of\nit, I'm extremely blessed in [[cat-autonomy-2-0]]. The facts are though that\nthrough the circumstances God has brought me recently, I'll be making less than\n50% of what I've been able to make over the last couple years... By God's grace\nwe still have more than enough, and by his grace again today is a significant\nday for me to step through a doorway of contentment and officially realign my\nwork priorities with the worldview Jesus has called me into.\n\n## Contentment and Work\n\nI have been sort of fighting off a belief that I'm on a literal mission from\nGod in Caterpillar Autonomy... If someone could see my inner-monologue play out\nthey'd certainly get Blues Brothers vibes...\n\n![On A Mission From God.mp4](https://cdn.statically.io/gh/pypeaday/images.pype.dev@main/blog-media/On%20A%20Mission%20From%20God%20%5BMKZSqd5Y8nA%5D.gif)\n\nI hope I'm not just reaching for some grand facetious meaning for the work I'm\nnow doing to distract myself from the changes coming to my paycheck. It really\nfeels to me like God has prepared me in many ways for the work that's in front\nme. I'm thankful for that preparation and now it seems like it's time to give\nup the desires for riches and focus on doing something more than closing\ntickets and supporting a small team of people.\n\nAs God calls me to contentment in my personal life, I think he's also planning\non blessing the work I'm doing. Earlier I said I have been very blessed by the\nwork I have been able to do, but I don't know that God has blessed\nthe work itself - much of what I've done was filled with mistakes you only\nlearn by doing something the first time... Certainly in some ways he has\nblessed those things, but I see something \"just bigger\" in Cat Autonomy, and I\nthink I'm here to play a real role in it\n\n!!! danger \"maybe like Joseph in Egypt\"\n\n    like I said - literal mission from God\n\nI've had to give-up some pay to play that role, but the Lord has taught (and is\nteaching) me that there's much more to work than a paycheck, more to life than money.\n\nIt is easy, very easy, for me to roll out of this line-of-thinking, I've done\nit several times even while writing this... but I am sure contentment is\nsomething the Lord has for me. Today's significance is just a temporal\nmilestone, a date that was approaching at a constant rate of change... The day\nis here, today's meditation is on contentment, and the Lord is doing a work in\nand through me. Amen.\n",
      "summary": "!!! note \"Philippians 4:11\"",
      "date_published": "2026-02-16T05:42:13Z",
      "date_modified": "2026-02-16T05:42:13Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "contentment",
        "faith",
        "work"
      ]
    },
    {
      "id": "https://pype.dev/2026-02-16-notes/",
      "url": "https://pype.dev/2026-02-16-notes/",
      "title": "2026-02-16 Notes",
      "content_text": "\nyesterday: [[2026-02-15-notes]]\n\n- [[reflection-contentment-and-work]]\n",
      "summary": "yesterday: 2026-02-15-notes",
      "date_published": "2026-02-16T05:40:52Z",
      "date_modified": "2026-02-16T05:40:52Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/2026-02-15-notes/",
      "url": "https://pype.dev/2026-02-15-notes/",
      "title": "2026-02-15 Notes",
      "content_text": "\nyesterday: [[2026-02-13-notes]]\n\n## Daily\n\n- Went to BJJ yesterday for the first time since late December... you definitely feel 6 weeks off not only in the cardio, but also in the everything-else... body is **sore** today\n\n## Reflection\n\n- Spent some time meditating on 2 Peter 3:18 - \"... To [Jesus] be the glory, both now and to the day of eternity\"\n  - It's the **now** that's on my heart, I am bordering on feeling like I'm on a mission from God himself at work, and to do that mission for the glory of the Lord **today** sure brings motivation and passion to the problem solving\n\n## Tech\n\n- [MinIO Archived](https://github.com/minio/minio)\n  - Time to look at [Garage](https://git.deuxfleurs.fr/Deuxfleurs/garage)\n  - or [RustFS](https://github.com/rustfs/rustfs)\n",
      "summary": "yesterday: 2026-02-13-notes",
      "date_published": "2026-02-15T05:12:31Z",
      "date_modified": "2026-02-15T05:12:31Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/consequences-discipline-and-punishment/",
      "url": "https://pype.dev/consequences-discipline-and-punishment/",
      "title": "Consequences, Discipline, and Punishment",
      "content_html": "\u003cp\u003eI\u0026rsquo;m a dad and I have 2 beautiful daughters in my house right now. As they\u0026rsquo;ve\ngrown up just a little from new-born to toddler to child, my wife and I have\nworked hard to have the right posture and attitude towards \u0026ldquo;discipline\u0026rdquo;. I have\nnoticed that 3 words seem to kind of meld into each other and I prefer they\nhave clear boundaries, because in our household we\u0026rsquo;re very intentional to not\npunish\u0026hellip; Punishment is a heavy and weighty thing and we don\u0026rsquo;t want our kids to\ngrow up thinking they get punished for messing up.\u003c/p\u003e\n\u003cp\u003eKids certainly \u003cstrong\u003eknow\u003c/strong\u003e right and wrong to some degree, and even when they\nknowingly do something \u0026ldquo;bad\u0026rdquo; it\u0026rsquo;s not necessarily that there was malicious\nintent behind it\u0026hellip; In my mind - \u0026lsquo;punishment\u0026rsquo; is for malpractice, but erroring\nand making an unwise choice to \u0026ldquo;do something bad\u0026rdquo; is a lack of judgement and\nthat doesn\u0026rsquo;t require punishment, it should illicit discipline.\u003c/p\u003e\n\u003cp\u003eWhy be so pedantic about these 2 words in particular? Well because I don\u0026rsquo;t\nthink it\u0026rsquo;s appropriate for my daughters to believe they get punished for\nsinging at the table\u0026hellip; There\u0026rsquo;s nothing morally wrong with that, but we do need\nthem to focus on meals at meal time, so we practice being disciplined at the\ntable. If they continue to sing, we utilitze consequences but they are never\npenal. What I mean is that if my kids are singing, being loud, etc. at the\ntable, we have them run laps outside or do jumping jacks. Why? Because getting\nthat excess energy out is a way for them to discipline their bodies, and learn\nto be self-controlled. There\u0026rsquo;s no element of fear or of losing something\nbecause they\u0026rsquo;re struggling to contain themselves while we eat.\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003epunishment vs discipline\u003c/p\u003e\n\u003cp\u003eThat\u0026rsquo;s the key difference and it\u0026rsquo;s taken several years for me to really drive a\nwedge between \u0026ldquo;punishment\u0026rdquo; and \u0026ldquo;discipline\u0026rdquo; even in my own worldview as a\nparent. So our language with our kids is \u0026ldquo;obey the rules or we will do some\ndiscipline\u0026rdquo; - never \u0026ldquo;or you will be punished\u0026rdquo;.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eDo you see the difference in how that frames even the obedience and the rule\nitself? It\u0026rsquo;s not a thing to follow out of fear, rules are to be followed\n\u003cstrong\u003ebecause it\u0026rsquo;s right\u003c/strong\u003e and to do what is right requires discipline and\nself-control. There is no need (actually there\u0026rsquo;s not even an appropriate place)\nfor \u003cstrong\u003epunishment\u003c/strong\u003e in this context.\u003c/p\u003e\n\u003cp\u003eSo what of consequences? Well, sometimes punishment is a consequence, sometimes\nrunning laps is a consequence, sometimes getting hurt from falling out of a\ntree you weren\u0026rsquo;t supposed to be climbing that high in is a consequence\u0026hellip;\nConsequences are amoral things that happen after something else. But\nconsequences presented without a framework for understanding them can sort of\nmake them meaningless.\u003c/p\u003e\n\u003cp\u003eFor a while I would tell my girls that \u0026ldquo;there will be consequences for\ndisobeying\u0026rdquo;, but this isn\u0026rsquo;t enough - this doesn\u0026rsquo;t explain \u003cem\u003ewhy\u003c/em\u003e there are\nconsequenes, it only encoruages obedience to avoid \u003cstrong\u003epunishment\u003c/strong\u003e rather than\nobedience \u003cstrong\u003ebecause it is right\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eSo that\u0026rsquo;s a short parenting note that I\u0026rsquo;ve been musing on - kids need to grow\nup learning how to be disciplined and how to be self-controlled. Raising them\nto avoid punishment teaches nothing about the socieatal expectation of\nappropriate behavior but rather puts them in a position of just trying to avoid\nsomething uncomfortable. That doesn\u0026rsquo;t raise them towards something good, it\nonly teaches them to avoid something else.\u003c/p\u003e\n\u003cp\u003eIf instead my children understand \u003cstrong\u003ethat it is important\u003c/strong\u003e to be a disciplined\nhuman, it fosters a relatonship of help and love between us. My job isn\u0026rsquo;t to\npunish my kids for misbehaving, it\u0026rsquo;s to raise them to be disciplined,\nhonorable, well-meaning people in a society. If I\u0026rsquo;m their teacher and guide\nthen that journey is filled with learning and love. If I only arbitrate justice\nthrough negative consequences and punishment, then what room is there in their\nhearts to love me as their dad if they\u0026rsquo;re always afraid I\u0026rsquo;m going to punish\nthem for something?\u003c/p\u003e\n",
      "content_text": "\nI'm a dad and I have 2 beautiful daughters in my house right now. As they've\ngrown up just a little from new-born to toddler to child, my wife and I have\nworked hard to have the right posture and attitude towards \"discipline\". I have\nnoticed that 3 words seem to kind of meld into each other and I prefer they\nhave clear boundaries, because in our household we're very intentional to not\npunish... Punishment is a heavy and weighty thing and we don't want our kids to\ngrow up thinking they get punished for messing up.\n\nKids certainly **know** right and wrong to some degree, and even when they\nknowingly do something \"bad\" it's not necessarily that there was malicious\nintent behind it... In my mind - 'punishment' is for malpractice, but erroring\nand making an unwise choice to \"do something bad\" is a lack of judgement and\nthat doesn't require punishment, it should illicit discipline.\n\nWhy be so pedantic about these 2 words in particular? Well because I don't\nthink it's appropriate for my daughters to believe they get punished for\nsinging at the table... There's nothing morally wrong with that, but we do need\nthem to focus on meals at meal time, so we practice being disciplined at the\ntable. If they continue to sing, we utilitze consequences but they are never\npenal. What I mean is that if my kids are singing, being loud, etc. at the\ntable, we have them run laps outside or do jumping jacks. Why? Because getting\nthat excess energy out is a way for them to discipline their bodies, and learn\nto be self-controlled. There's no element of fear or of losing something\nbecause they're struggling to contain themselves while we eat.\n\n!!! note \"punishment vs discipline\"\n\n    That's the key difference and it's taken several years for me to really drive a\n    wedge between \"punishment\" and \"discipline\" even in my own worldview as a\n    parent. So our language with our kids is \"obey the rules or we will do some\n    discipline\" - never \"or you will be punished\".\n\nDo you see the difference in how that frames even the obedience and the rule\nitself? It's not a thing to follow out of fear, rules are to be followed\n**because it's right** and to do what is right requires discipline and\nself-control. There is no need (actually there's not even an appropriate place)\nfor **punishment** in this context.\n\nSo what of consequences? Well, sometimes punishment is a consequence, sometimes\nrunning laps is a consequence, sometimes getting hurt from falling out of a\ntree you weren't supposed to be climbing that high in is a consequence...\nConsequences are amoral things that happen after something else. But\nconsequences presented without a framework for understanding them can sort of\nmake them meaningless.\n\nFor a while I would tell my girls that \"there will be consequences for\ndisobeying\", but this isn't enough - this doesn't explain _why_ there are\nconsequenes, it only encoruages obedience to avoid **punishment** rather than\nobedience **because it is right**.\n\nSo that's a short parenting note that I've been musing on - kids need to grow\nup learning how to be disciplined and how to be self-controlled. Raising them\nto avoid punishment teaches nothing about the socieatal expectation of\nappropriate behavior but rather puts them in a position of just trying to avoid\nsomething uncomfortable. That doesn't raise them towards something good, it\nonly teaches them to avoid something else.\n\nIf instead my children understand **that it is important** to be a disciplined\nhuman, it fosters a relatonship of help and love between us. My job isn't to\npunish my kids for misbehaving, it's to raise them to be disciplined,\nhonorable, well-meaning people in a society. If I'm their teacher and guide\nthen that journey is filled with learning and love. If I only arbitrate justice\nthrough negative consequences and punishment, then what room is there in their\nhearts to love me as their dad if they're always afraid I'm going to punish\nthem for something?\n",
      "summary": "I'm a dad and I have 2 beautiful daughters in my house right now. As they've grown up just a little from new-born to toddler to child, my wife and I have...",
      "date_published": "2026-02-13T04:31:49Z",
      "date_modified": "2026-02-13T04:31:49Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "parenting"
      ]
    },
    {
      "id": "https://pype.dev/2026-02-13-notes/",
      "url": "https://pype.dev/2026-02-13-notes/",
      "title": "2026-02-13 Notes",
      "content_text": "\nyesterday: [[2026-02-12-notes]]\n\n- [[consequences-discipline-and-punishment]]\n",
      "summary": "yesterday: 2026-02-12-notes",
      "date_published": "2026-02-13T04:27:04Z",
      "date_modified": "2026-02-13T04:27:04Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/the-ridiculous-blessing-of-the-lord/",
      "url": "https://pype.dev/the-ridiculous-blessing-of-the-lord/",
      "title": "The Ridiculous Blessing of the Lord",
      "content_text": "\nI went to sit down this morning with a cup of coffee and do a meditation like I\ntry to do at least a few times a week. I meditate on the Bible, on God's word\nbecause I believe it is God's word - and what a shallow belief it'd be if I\nknew nothing about the Word. For the last few years this has been the normal\nway I spend time with Jesus, and he has brought comfort and guidance to me, not\nthrough new knowledge necessarily, but through perspective and wisdom.\n\nThis feels almost like a lazy way out of hardened theological study, a practice\nI hope to come back to before too long, but through semi-regular reflection,\nmeditation, and writing Jesus has done a lot of good to my heart.\n\nI hope it wouldn't take years of the Lord's work on my heart to recognize the\nblessing in my life, but left to my own devices I certainly look at what he's\ngiven me and still desire more. So, that wish is certainly nothing more than a\nfancy - and praise God for that, because it only further shows my need for him.\nHe works on me every day and by God's grace the blessings in my life are pretty\nflipping clear.\n\nThe passage I was going to meditate on this morning was 2 Corinthians 1:5\n\n!!! note \"2 Corinthians 1:5\"\n\n    For just as the sufferings of Christ overflow to us, thus through Christ our comfort overflows also.\n\nBy God's grace, \"suffering\"\" isn't something I feel very \"connected to\" - it's\nnot something I feel a deep current need to meditate on (right now). I have been\nbrought through many trials, just like a lot of people, and my story isn't full\nof only stupendous highs, but I do feel like it's a bit easier for me today to\nresonate with Paul's words in Romans 8.\n\n!!! note \"Romans 8:18\"\n\n    For I consider that the sufferings of the present time are not worthy to be compared with the glory that is about to be revealed to us.\n\nIn God's good grace on my life he is showing me day by day the glory that will\nbe revealed. He shows me through daily blessing of work - where my family is\nmore-than-provided for via gifts and talents he's given me. He shows me through\nmy family, who love me in my mistakes and celebrate my wins. He shows me\nthrough my wife specifically, who wants my holiness more than my happiness but\nin that support she often increases both.\n\nThere are sufferings in my life that Jesus has used as a means to bring comfort\nto others - I think that's one of the points of the larger 2 Corinthians\npassage. However, in that same breath in the quietness of my office with this\ncup of mushroom-coffee, I can say that the sufferings he's brought me through\npale in comparison to just the glory he has already revealed to me, and that\nmeans the glory \"that is about to be revealed\" can be only greater.\n\nThe blessing of the Lord on my life and family is beyond insane. And my prayer\nis just that I (and my family) would see it. This is on my mind because of a\nsimple event the other day - an interview and job-offer. I didn't take this\njob, if you're new here I'm in [[cat-autonomy-2-0]] (a story of its own filled\nwith divine grace and provision). However, getting a job isn't exactly an easy\nthing right now - and in the Lord's blessing on my life I've had multiple\nopportunities. I mentioned the offer to my wife and her only response was \"The\nLord is too good to us\". And she's right - he is.\n\nPraise God for blessings, and praise him for sufferings. I pray today for\nmyself he keeps my eyes and heart focused on what I can do with excellence and\nfor his glory. I also pray for continued blessing and favor - it isn't a sin to\nwant things to be going well... May God bring peace and favor to anyone reading\nthis - favor through adoption and peace through the strength and power of the\ncreator-God.\n",
      "summary": "I went to sit down this morning with a cup of coffee and do a meditation like I try to do at least a few times a week. I meditate on the Bible, on God's word...",
      "date_published": "2026-02-12T04:25:38Z",
      "date_modified": "2026-02-12T04:25:38Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "family",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2026-02-12-notes/",
      "url": "https://pype.dev/2026-02-12-notes/",
      "title": "2026-02-12 Notes",
      "content_text": "\nyesterday: [[2026-02-10-notes]]\n\n- [[the-ridiculous-blessing-of-the-lord]]\n- updated [[kubernetes-external-secrets-operator]] a little bit - it's not a\n  tutorial, it's just a high level demo but it needed some more comments to keep\n  the expectations of the post in check\n",
      "summary": "yesterday: 2026-02-10-notes",
      "date_published": "2026-02-12T04:19:24Z",
      "date_modified": "2026-02-12T04:19:24Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/2026-02-10-notes/",
      "url": "https://pype.dev/2026-02-10-notes/",
      "title": "2026-02-10 Notes",
      "content_text": "\nyesterday: [[2026-02-07-notes]]\n\n- [x] [[cat-autonomy-2-0]]\n- [x] [[kubernetes-external-secrets-operator]]\n  - [github repo](https://github.com/pypeaday/blog-kubernetes-external-secrets-operator-demo)\n",
      "summary": "yesterday: 2026-02-07-notes",
      "date_published": "2026-02-10T20:00:16Z",
      "date_modified": "2026-02-10T20:00:16Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/docker/",
      "url": "https://pype.dev/docker/",
      "title": "docker",
      "content_html": "\u003cp\u003edocker - container runtime\u003c/p\u003e\n",
      "content_text": "\ndocker - container runtime\n",
      "summary": "docker - container runtime",
      "date_published": "2026-02-10T07:50:30Z",
      "date_modified": "2026-02-10T07:50:30Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "glossary"
      ]
    },
    {
      "id": "https://pype.dev/helm/",
      "url": "https://pype.dev/helm/",
      "title": "helm",
      "content_html": "\u003cp\u003ehelm - package manager for k8s\u003c/p\u003e\n",
      "content_text": "\nhelm - package manager for k8s\n",
      "summary": "helm - package manager for k8s",
      "date_published": "2026-02-10T07:50:03Z",
      "date_modified": "2026-02-10T07:50:03Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "glossary"
      ]
    },
    {
      "id": "https://pype.dev/kubectl/",
      "url": "https://pype.dev/kubectl/",
      "title": "kubectl",
      "content_html": "\u003cp\u003ekubectl - canonically pronouned kube-control\u003c/p\u003e\n",
      "content_text": "\nkubectl - canonically pronouned kube-control\n",
      "summary": "kubectl - canonically pronouned kube-control",
      "date_published": "2026-02-10T07:49:52Z",
      "date_modified": "2026-02-10T07:49:52Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "glossary"
      ]
    },
    {
      "id": "https://pype.dev/kind/",
      "url": "https://pype.dev/kind/",
      "title": "kind",
      "content_html": "\u003cp\u003ekind - kubernetes in docker\u003c/p\u003e\n",
      "content_text": "\nkind - kubernetes in docker\n",
      "summary": "kind - kubernetes in docker",
      "date_published": "2026-02-10T07:49:21Z",
      "date_modified": "2026-02-10T07:49:21Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "glossary"
      ]
    },
    {
      "id": "https://pype.dev/kubernetes-external-secrets-operator/",
      "url": "https://pype.dev/kubernetes-external-secrets-operator/",
      "title": "Kubernetes External Secrets Operator",
      "content_text": "\nI wanted to put a short demo together of using External Secrets Operator (ESO)\nto expose secrets from a vault (like Hashicorp Vault, AWS Secrets Manager, etc)\nto services running in kubernetes\n\nDemo code is [here in this github repo](https://github.com/pypeaday/blog-kubernetes-external-secrets-operator-demo)\n\nThis post is a high level overview of the components, see the repo for the full example.\n\n## Setup\n\n- [[docker]] for containerized development\n- [[kind]] for setting up a quick cluster\n- [[kubectl]] for accessing the cluster\n- [[helm]] for installing ArgoCD and ESO\n\n- and then [justfile](https://github.com/casey/just) is there to wrap the commands to easier execution\n\n## Step 0 - Vault\n\n- for the demo we'll setup Hashicorp Vault in docker compose to easily bring it\n  up and down\n- and the init-script is in the repo - it uses curl to make some secrets in\n  vault that we'll reference later\n\n```yml\nservices:\n  vault:\n    image: hashicorp/vault:1.18\n    container_name: vault\n    ports:\n      - \"58200:8200\n    environment:\n      VAULT_DEV_ROOT_TOKEN_ID: root\n      VAULT_DEV_LISTEN_ADDRESS: 0.0.0.0:8200\n    volumes:\n      - vault-data:/vault/file\n    cap_add:\n      - IPC_LOCK\n    command: server -dev -dev-root-token-id=root\n\nvolumes:\n  vault-data:\n```\n\n- bringing up the vault instance is a simple `docker compose up` (use the just recipes which some `curl` commands for checking status etc.)\n\n```bash\ncurl -s http://localhost:58200/v1/sys/health | jq .  # or just vault-status\n{\n  \"initialized\": true,\n  \"sealed\": false,\n  \"standby\": false,\n  \"performance_standby\": false,\n  \"replication_performance_mode\": \"disabled\",\n  \"replication_dr_mode\": \"disabled\",\n  \"server_time_utc\": 1770893657,\n  \"version\": \"1.18.5\",\n  \"enterprise\": false,\n  \"cluster_name\": \"vault-cluster-acfb9930\",\n  \"cluster_id\": \"4d9162f4-e501-371b-7f94-bd60052b40a3\",\n  \"echo_duration_ms\": 0,\n  \"clock_skew_ms\": 0,\n  \"replication_primary_canary_age_ms\": 0\n}\n```\n\n## Step 1 - App\n\n- We need an app that requires secrets\n- app code in repo, essentially it's a python webserver to show the vault\n  values (obviously this would expose real secrets so it's just a demo)\n- Below is one of the endpoints in the vibe-coded app, just to illustrate that\n  we're going to give secrets to the app as environment variables (or as mounted\n  files!)\n- In the repo, the app is included and there's a `just build` which builds the docker image\n- There is also `just deploy` which handles loading the image into `kind`'s image cache\n\n```py\n\n# example route from demo-app - see git repo\n@app.get(\"/env\", response_class=HTMLResponse)\ndef show_env():\n    # ESO brings Vault secrets into environment variables\n    env_vars = dict(os.environ)\n\n    # Sort by category, then by key\n    sorted_items = sorted(env_vars.items(), key=lambda x: (classify_env(x[0]), x[0]))\n\n    cards = \"\".join(create_card(k, v) for k, v in sorted_items)\n\n    secret_count = sum(1 for k in env_vars if k in SECRET_KEYS)\n    config_count = sum(1 for k in env_vars if k in CONFIG_KEYS)\n    system_count = len(env_vars) - secret_count - config_count\n\n    html = HTML_TEMPLATE.format(\n        cards=cards,\n        secret_count=secret_count,\n        config_count=config_count,\n        system_count=system_count,\n    )\n\n    return HTMLResponse(content=html)\n\ndef read_mounted_files(directory: str) -\u003e dict:\n    \"\"\"Read all files from a mounted directory.\"\"\"\n    files_data = {}\n    if os.path.exists(directory) and os.path.isdir(directory):\n        for filename in os.listdir(directory):\n            filepath = os.path.join(directory, filename)\n            if os.path.isfile(filepath):\n                try:\n                    with open(filepath, \"r\") as f:\n                        files_data[filename] = f.read().strip()\n                except Exception as e:\n                    files_data[filename] = f\"\u003cError reading file: {e}\u003e\"\n    return files_data\n\n```\n\n## Step 2 - Cluster\n\n- use `kind` to bring up a cluster\n- this will start a few docker containers to act as your control-plane and workers\n\n```yml\n# kind-config.yml\nkind: Cluster\napiVersion: kind.x-k8s.io/v1alpha4\nname: eso-demo\nnodes:\n  - role: control-plane\n    extraPortMappings:\n      - containerPort: 30080\n        hostPort: 58080\n        protocol: TCP\n  - role: worker\n```\n\n```\nkind create cluster --config kind-config.yaml --name eso-demo\n```\n\n## Step 3 - External Secrets Operator\n\n- installed with [[helm]] from the official helm chart\n- NOTE: this is the Operator, not the secrets... this is the thing which goes\n  to the secrets backend and creates kubernetes secrets\n\n```\nhelm repo add external-secrets https://charts.external-secrets.io 2\u003e/dev/null || true\nhelm repo update\nhelm install external-secrets external-secrets/external-secrets \\\n  --namespace external-secrets \\\n  --create-namespace \\\n  --wait\n```\n\nIn the repo this is mostly `just eso-install`\n\n## Step 3.5 - Secretstore\n\n- You need a `clustersecretstore` to be the place that ESO puts secrets\n\n```\napiVersion: external-secrets.io/v1\nkind: ClusterSecretStore\nmetadata:\n  name: vault-backend\nspec:\n  provider:\n    vault:\n      server: \"http://10.10.0.1:58200\"\n      path: \"secret\"\n      version: \"v2\"\n      auth:\n        tokenSecretRef:\n          name: vault-token\n          key: token\n          namespace: external-secrets\n\n```\n\n## Step 4 - Secrets\n\n- Secrets go in the `clustersecretstore`\n  - in this example it's called 'vault-backend'\n- In the demo we can just `kubectl apply -f \u003cmanifest\u003e` to deploy the secret to\n  the cluster\n- In practice this should be handled by something more mature than raw-doggin\n  kubectl commands\n\n```yml\n# manifests/external-secrets.yml\n---\napiVersion: external-secrets.io/v1\nkind: ExternalSecret\nmetadata:\n  name: demo-app-secrets\n  namespace: default\nspec:\n  refreshInterval: \"10s\"\n  secretStoreRef:\n    kind: ClusterSecretStore\n    name: vault-backend\n  target:\n    name: demo-app-secrets\n    creationPolicy: Owner\n  data:\n    - secretKey: DATABASE_PASSWORD\n      remoteRef:\n        key: secret/data/demo-app/secrets\n        property: database_password\n    - secretKey: API_KEY\n      remoteRef:\n        key: secret/data/demo-app/secrets\n        property: api_key\n```\n\n## Step 4.1 - Files\n\n- ESO supports mounting files to containers as well through special `ExternalSecret` resources\n- One of the example seecrets is a TLS certificate\n\n```yml\n# manifests/external-secrets-files.yml\n---\n# File-based ExternalSecret for TLS certificates\n# These will be mounted as files in /etc/secrets/\napiVersion: external-secrets.io/v1\nkind: ExternalSecret\nmetadata:\n  name: demo-app-tls-files\n  namespace: default\nspec:\n  refreshInterval: \"10s\"\n  secretStoreRef:\n    kind: ClusterSecretStore\n    name: vault-backend\n  target:\n    name: demo-app-tls-files\n    creationPolicy: Owner\n    # Template to ensure proper file formatting\n    template:\n      type: Opaque\n      data:\n        tls.crt: \"{{ .tls_crt }}\"\n        tls.key: \"{{ .tls_key }}\"\n  data:\n    - secretKey: tls_crt\n      remoteRef:\n        key: secret/data/demo-app/tls-files\n        property: tls.crt\n    - secretKey: tls_key\n      remoteRef:\n        key: secret/data/demo-app/tls-files\n        property: tls.key\n```\n\n- Notice how there's a `spec.target.template` which templates out the file\n  contents from the secret contents\n\n## Step 5 - Helm Chart\n\n- This isn't about setting up a helm chart so I'm not going to explain a lot\n  but the working example is simple, not secure, and in the repo\n- The helm chart renders manifests - I've paired one down and added comments to\n  the relevant things\n- The thing to just take note of is the reference of the secrets in the `envFrom` section\n\n```yml\n# deployment.yml\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  annotations:\n    meta.helm.sh/release-name: demo-app\n    meta.helm.sh/release-namespace: default\n  name: demo-app\n  namespace: default\nspec:\n  replicas: 1\n  template:\n    metadata:\n      labels:\n        app.kubernetes.io/instance: demo-app\n        app.kubernetes.io/name: demo-app\n    spec:\n      containers:\n        - envFrom:\n            - secretRef:\n                name: demo-app-secrets # name of example secret from section 4\n            - secretRef:\n                name: demo-app-config # another example in the repo\n          image: demo-app:latest # the image you built and loaded into kind - simple 'just' recipe in the repo\n          imagePullPolicy: Never\n          name: demo-app\n          volumeMounts:\n            - mountPath: /etc/secrets\n              name: secrets-volume\n              readOnly: true\n            - mountPath: /etc/config\n              name: configs-volume\n              readOnly: true\n      volumes:\n        - name: secrets-volume\n          secret:\n            defaultMode: 420\n            secretName: demo-app-tls-files # example secret file from section 4.1\n        - name: configs-volume\n          secret:\n            defaultMode: 420\n            secretName: demo-app-config-files\n```\n\n## Step 5.1 - Deploy\n\n- We can deploy the demo-app from the git repo to the cluster\n- For a local demo a few things happen\n  - local image build\n  - loading that image into [[kind]] (`kind` doesn't have access to your host's docker image cache, so images need to be loaded into the cluster cache)\n- `just deploy` takes care of this for you, read the recipe in the repo if\n  you're interested in more there, the focus of this post and example are to\n  briefly show how to use ESO though\n\n## Step 6 - Profit\n\nThe example app just displays things that are mounted in - totally vibe-coded\nto illustrate the secrets mounting, not the appropriate way to leak secrets.\n\n![20260210233804_614254b7.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20260210233804_614254b7.png)\n\n![20260210233828_19852225.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20260210233828_19852225.png)\n",
      "summary": "I wanted to put a short demo together of using External Secrets Operator (ESO) to expose secrets from a vault (like Hashicorp Vault, AWS Secrets Manager,...",
      "date_published": "2026-02-10T07:48:34Z",
      "date_modified": "2026-02-10T07:48:34Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "devops",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/cat-autonomy-2-0/",
      "url": "https://pype.dev/cat-autonomy-2-0/",
      "title": "Cat Autonomy 2.0",
      "content_text": "\nI wrote about my new role [[new-job-caterpillar-autonomy]] a bit a couple weeks\nago during an insanely busy time - having just started the role and wrapping up\nwhat ended up being side-work, paired with some sleep-deprived ADHD hyperfocus\non my new responsibilities and [[nexus]], that post is less of an update and\nmore of a mind-dump. This post is meant to be a calmer update about my upcoming\ntime with Caterpillar Autonomy.\n\nIt starts, like all good stories, with Caterpillar's RTO (return to office)\nmandate and how it has affected a lot of people negatively (in my opinion). I\nhaven't seen one positive remark about it fromanyone making less than $250k a\nyear + Bonus + Equity if you catch my drift...\n\nI know of people who really did lose their jobs at the end of 2025 for refusing\nto move. My story with RTO is covered elsewhere, I'd been blessed with remote\nwork and was even secure in a remote position in the face of Caterpillar being\nwilling to fire me [[after-exceeding-expectations-for-4-years]].\n\nBut time passes and life happens, and the sovereign Lord brought me to this current\ncircumstance: where I'm fully committed to Caterpillar Autonomy, and it\nfeels weird to say it. I'm going to skip the RTO details, if you know you know.\nWhere I'm at right now is on the other side (or very nearly on the other side)\nof a choice I didn't feel freedom to make because it came from a conviction.\n\nThe manager of the group I'm in told me a story about working for another\nmining company, where he was managing mines in the Congo. These mines can be in\nthe most remote of remote places on earth - in cultures where human life is\ndefinitely treated differently than in the first-world midwest USA. Operators of\nthese huge mining trucks in these parts of the world can be smoking meth in the\ncabs - which obviously leads to unsafe operation. Safety of the mines\nthemselves can be a second-thought as well, they collapse and then the people\ninside have to be excavated out. Sean told me he had come back to work after a\nweekend just to be told, as if it was no big deal, that \"Motombu died\" and to\nfind another operator. Very crass attitude towards human life...\n\nI'm still pretty frustrated at Caterpillar for how they've handled RTO (and\ncorporitisms like \"Caterpillar family\" and \"we bleed Cat yellow\" are\ndistracting nonsense), and part of me wants to leave still over the personal\noffence, but Caterpillar will make the safest mining equipment, without a\ndoubt. And given that Cat will make the safest equipment then the story I was told and\nthe mission I couldn't help but believe in is that rolling out good autonomy\nsoftware and solutions to these remote mines will save lives.\n\n!!! warning \"\"\n\n    I'm obviously not like superman or anything, but something feels better about enabling good autonomy rather than supporting an online sales platform, or working for a bank...\n\nI was invited (coerced?) into that mission - and my role in it is enabling the\nAutonomy group to manage data for their software stack. I get to help these\nengineers be experts in the things they're experts in by offloading some\noperational overhead (data movement, pipelineing, infrastructure and devops,\netc.) so that they can produce the best autonomy software on the planet.\n",
      "summary": "I wrote about my new role new-job-caterpillar-autonomy a bit a couple weeks ago during an insanely busy time - having just started the role and wrapping up...",
      "date_published": "2026-02-09T06:07:12Z",
      "date_modified": "2026-02-09T06:07:12Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "work",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/reflection-arise-and-depart/",
      "url": "https://pype.dev/reflection-arise-and-depart/",
      "title": "Reflection - Arise and Depart",
      "content_html": "\u003cp\u003eSpurgeon\u0026rsquo;s \u003cstrong\u003eMorning and Evening\u003c/strong\u003e reflection for this morning is Micah 2:10 \u0026ldquo;Arise, and depart\u0026rdquo;.\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003econtext\u003c/p\u003e\n\u003cp\u003eTypical note about reflections not being deep study. Also noting that Spurgeon\u0026rsquo;s meditations are often about what comes to mind from the words of a verse (or part of it) as opposed to the context of the verse.\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eMicah 2:10\u003c/p\u003e\n\u003cp\u003eArise and go,  for this is no resting place,  on account of uncleanness that destroys  with painful destruction.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eSo the context of the rest of the verse isn\u0026rsquo;t that consistent with the\ndirection of Spurgon\u0026rsquo;s meditation but nonetheless his springboard is good to\nthink about\u0026hellip;\u003c/p\u003e\n\u003cp\u003eSomeday everyone of us will answer the call to \u0026ldquo;arise and go\u0026rdquo; - death comes for\nus all but death isn\u0026rsquo;t itself an existential end, it is the time to obey the\nLord. At his word, I will leave the world and go to where he calls me. This is\ntrue for everyone, it\u0026rsquo;s an inescapable part of the reality that Yahweh has\ncreated for all Creation.\u003c/p\u003e\n\u003cp\u003eDeath fills some with dread, but for the Christian it\u0026rsquo;s the passage to\neternity. We live (or \u0026ldquo;are to live\u0026rdquo;) in Heaven today - Jesus brought Heaven to\nearth. But his life, death, and resurrection did not \u003cstrong\u003efully\u003c/strong\u003e bring Heaven to\nearth - the melding is happening, the reunification of Heaven and earth as it\nwas in Eden is taking place, and when he comes again the kingdom will be\nconsummated.\u003c/p\u003e\n\u003cp\u003eSo we live unto his Name and glory, because it\u0026rsquo;s the best thing\nfor humanity. And at the end of our living on this present earth, God calls\neveryone to the next phase of reality. What awaits those who do not believe?\nand who haven\u0026rsquo;t been chosen? I really wouldn\u0026rsquo;t claim to know concrete facts\nbeyond the truth that \u0026ldquo;they are not citizens of heaven, and so they do not live with\nthe Lord\u0026rdquo;. But what awaits the Christian? That\u0026rsquo;s a much easier answer to take a\nstand on - those loved by Jesus are not left dead in the cold dark underground,\nwe are called to the skies - to glory and to the kingdom.\u003c/p\u003e\n\u003cp\u003eI think this thought of future unification with the Lord, in a newly\nconsummated kingdom, when Death is dead and there is no more competition\namongst the gods, when all Creation is in right relationship with the King -\nthis thought should bring joy and anticipation to the Christian, to me.\u003c/p\u003e\n\u003cp\u003eLet me work for the glory of God today, with the right perspective that at any\nmoment I could be called away from this work (my family, my home, my job, etc.)\nand to the next thing Jesus would have me do. I look forward to the call to\n\u0026ldquo;Arise and go\u0026rdquo; and I pray that the future hope of the Kingdom fills me today\nwith joy and motivation to live a godly life and that death never looks like\nanything other than a river to cross with new life on the other side.\u003c/p\u003e\n",
      "content_text": "\nSpurgeon's **Morning and Evening** reflection for this morning is Micah 2:10 \"Arise, and depart\".\n\n!!! note \"context\"\n\n    Typical note about reflections not being deep study. Also noting that Spurgeon's meditations are often about what comes to mind from the words of a verse (or part of it) as opposed to the context of the verse.\n\n!!! note \"Micah 2:10\"\n\n    Arise and go,  for this is no resting place,  on account of uncleanness that destroys  with painful destruction.\n\nSo the context of the rest of the verse isn't that consistent with the\ndirection of Spurgon's meditation but nonetheless his springboard is good to\nthink about...\n\nSomeday everyone of us will answer the call to \"arise and go\" - death comes for\nus all but death isn't itself an existential end, it is the time to obey the\nLord. At his word, I will leave the world and go to where he calls me. This is\ntrue for everyone, it's an inescapable part of the reality that Yahweh has\ncreated for all Creation.\n\nDeath fills some with dread, but for the Christian it's the passage to\neternity. We live (or \"are to live\") in Heaven today - Jesus brought Heaven to\nearth. But his life, death, and resurrection did not **fully** bring Heaven to\nearth - the melding is happening, the reunification of Heaven and earth as it\nwas in Eden is taking place, and when he comes again the kingdom will be\nconsummated.\n\nSo we live unto his Name and glory, because it's the best thing\nfor humanity. And at the end of our living on this present earth, God calls\neveryone to the next phase of reality. What awaits those who do not believe?\nand who haven't been chosen? I really wouldn't claim to know concrete facts\nbeyond the truth that \"they are not citizens of heaven, and so they do not live with\nthe Lord\". But what awaits the Christian? That's a much easier answer to take a\nstand on - those loved by Jesus are not left dead in the cold dark underground,\nwe are called to the skies - to glory and to the kingdom.\n\nI think this thought of future unification with the Lord, in a newly\nconsummated kingdom, when Death is dead and there is no more competition\namongst the gods, when all Creation is in right relationship with the King -\nthis thought should bring joy and anticipation to the Christian, to me.\n\nLet me work for the glory of God today, with the right perspective that at any\nmoment I could be called away from this work (my family, my home, my job, etc.)\nand to the next thing Jesus would have me do. I look forward to the call to\n\"Arise and go\" and I pray that the future hope of the Kingdom fills me today\nwith joy and motivation to live a godly life and that death never looks like\nanything other than a river to cross with new life on the other side.\n",
      "summary": "Spurgeon's ** reflection for this morning is Micah 2:10 \"Arise, and depart\".",
      "date_published": "2026-02-07T04:37:12Z",
      "date_modified": "2026-02-07T04:37:12Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "reflection",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2026-02-07-notes/",
      "url": "https://pype.dev/2026-02-07-notes/",
      "title": "2026-02-07 Notes",
      "content_text": "\nyesterday: [[2026-02-06-notes]]\n\n- [[reflection-arise-and-depart]]\n",
      "summary": "yesterday: 2026-02-06-notes",
      "date_published": "2026-02-07T04:29:07Z",
      "date_modified": "2026-02-07T04:29:07Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/2026-02-06-notes/",
      "url": "https://pype.dev/2026-02-06-notes/",
      "title": "2026-02-06 Notes",
      "content_text": "\nyesterday: [[2026-02-05-notes]]\n\n- [[nexus]] updates are that I'm rebuilding now to drop kanboard - it gave me\n  the framework for what I need but it's too slow\n- my backups have been failing... which means I've been failing at\n  observability[ not sure what to do here, but I need to do something\n",
      "summary": "yesterday: 2026-02-05-notes",
      "date_published": "2026-02-06T20:23:20Z",
      "date_modified": "2026-02-06T20:23:20Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/ai/",
      "url": "https://pype.dev/ai/",
      "title": "AI",
      "content_text": "\nHow do I use AI for my site?\n\n1. Cover images - I generate these with Stable Diffusion running on my desktop, the prompts sometimes comes from basically dropping my blog post into Ollama/Open-WebUI and getting a prompt back to make an image that fits the vibe\n2. Breaking up raw blog posts by heading - AI never writes my posts for me, but sometimes with longer ramblings I will have an agent just break up by new lines with headings to help me group the thoughts together\n3. Site asthetic - my site is built with [markata](https://markata.dev) but the templates (jinja, html, css) I have given almost fully over to AI because web-design isn't something I'm deeply interested in, but I like to write and the agents have helped me make my blog look more personal (I recognize some people might take offense to this - we can happily fight about it over a drink sometime :p)\n\nMy main thing to say is that I don't ever intend to put AI words in front of another human without full transparency like in [[the-importance-of-nostr-according-to-chatgpt]], but I am using AI to craft my blog and help me organize myself\n",
      "summary": "How do I use AI for my site?",
      "date_published": "2026-02-05T20:58:00Z",
      "date_modified": "2026-02-05T20:58:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "slash"
      ]
    },
    {
      "id": "https://pype.dev/nexus/",
      "url": "https://pype.dev/nexus/",
      "title": "Nexus",
      "content_html": "\u003cp\u003eNexus is a task tracker and second-brain for collaborating with AI agents on software development. It keeps project boards, task details, subtasks, daily notes, and Git worktree context together in one system.\u003c/p\u003e\n\u003ch2 id=\"why-nexus\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhy Nexus\u003c/span\u003e \u003ca href=\"#why-nexus\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI built Nexus because I work with AI agents across multiple parallel work streams and need a way to:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eTrack what agents are working on and have them check-in regularly\u003c/li\u003e\n\u003cli\u003eCapture lightweight memories without forcing everything to become executable work immediately\u003c/li\u003e\n\u003cli\u003eKeep task-to-branch context when starting work\u003c/li\u003e\n\u003cli\u003eUse daily notes inside the same system\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"architecture\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eArchitecture\u003c/span\u003e \u003ca href=\"#architecture\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre\u003e\u003ccode\u003eHuman\n  |\n  +-- Agent Harness (GitHub Copilot CLI)\n  |     +-- Agents (orchestrator + specialists)\n  |     +-- Platform hooks / commands\n  |\n  +-- nexus CLI (PEP 723 single-file script)\n  |     |\n  |     +-- Nexus API (FastAPI, port 8090)\n  |           +-- Nexus DB (Postgres 16 + pgvector)\n  |\n  +-- Go TUI (primary interface)\n  +-- Git (worktrees, branches)\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2 id=\"components\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eComponents\u003c/span\u003e \u003ca href=\"#components\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"core-stack\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCore Stack\u003c/span\u003e \u003ca href=\"#core-stack\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eNexus API\u003c/strong\u003e — FastAPI REST backend. Projects, tasks, tags, dependencies, comments, and global discoveries. Tasks flow through \u003ccode\u003ebacklog\u003c/code\u003e → \u003ccode\u003ewip\u003c/code\u003e → \u003ccode\u003edone\u003c/code\u003e with first-class readiness (\u003ccode\u003eis_ready\u003c/code\u003e) and blocking (\u003ccode\u003eis_blocked\u003c/code\u003e) markers.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eNexus DB\u003c/strong\u003e — Postgres 16 with pgvector for vector storage (future AI memory features).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003enexus CLI\u003c/strong\u003e — PEP 723 single-file Python script. All agent-to-Nexus communication goes through this. JSON output for agents, human-readable for humans.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eGo TUI\u003c/strong\u003e — Terminal UI, the primary interface for dayFalse-to-day task management.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"agent-integration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAgent Integration\u003c/span\u003e \u003ca href=\"#agent-integration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eCopilot CLI plugin\u003c/strong\u003e (\u003ccode\u003ecopilot/\u003c/code\u003e) — GitHub Copilot integration with custom skills:\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003enexus\u003c/code\u003e — Core task and lifecycle commands\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003enexus-specialist\u003c/code\u003e — Task-specific expertise\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003enexus-delegation\u003c/code\u003e — Delegation patterns\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edaily-summary\u003c/code\u003e — Daily progress summaries\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eHooks\u003c/strong\u003e — Session lifecycle hooks that sync state between Nexus and agent sessions:\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003esession-start.sh\u003c/code\u003e — Initialize worktree metadata\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003esession-end.sh\u003c/code\u003e — Archive session state\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003esession-sync.sh\u003c/code\u003e — Periodic checkpoint\u003c/li\u003e\n\u003cli\u003eLiveness probes for agent monitoring\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"task-lifecycle\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTask Lifecycle\u003c/span\u003e \u003ca href=\"#task-lifecycle\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre\u003e\u003ccode\u003estart → implement → review → merge → done → finish\n\u003c/code\u003e\u003c/pre\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003enexus start \u0026lt;id\u0026gt;\u003c/code\u003e — Creates \u003ccode\u003enx-\u0026lt;id\u0026gt;\u003c/code\u003e worktree from base branch\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003enexus review \u0026lt;id\u0026gt; --verdict PASS\u003c/code\u003e — Authoritative merge gate\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003enexus merge \u0026lt;id\u0026gt;\u003c/code\u003e — Rebases and merges \u003ccode\u003e--no-ff\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003enexus done \u0026lt;id\u0026gt;\u003c/code\u003e — Marks task complete\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003enexus finish \u0026lt;id\u0026gt;\u003c/code\u003e — Removes worktree and deletes branch\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"discoveries-second-brain\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDiscoveries (Second Brain)\u003c/span\u003e \u003ca href=\"#discoveries-second-brain\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eDiscoveries are durable memory captures that may be global, project-linked, or task-linked. They\u0026rsquo;re \u003cstrong\u003enot\u003c/strong\u003e executable work — they don\u0026rsquo;t get branches, worktrees, or the full task lifecycle. When ready, they can be promoted into tasks.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003enexus discovery inbox\u003c/code\u003e — Triage view for new/promotable/stale discoveries\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003enexus discovery list\u003c/code\u003e — Browse all discoveries\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003enexus remember \u0026quot;...\u0026quot;\u003c/code\u003e — Lightweight capture\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003enexus discovery promote \u0026lt;id\u0026gt;\u003c/code\u003e — Convert to executable task\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"key-features\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eKey Features\u003c/span\u003e \u003ca href=\"#key-features\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTask tracking\u003c/strong\u003e — Projects, tasks, subtasks, tags, dependencies, comments\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eReadiness tracking\u003c/strong\u003e — Explicit \u003ccode\u003eis_ready\u003c/code\u003e marker for backlog refinement\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eFirst-class blocking\u003c/strong\u003e — \u003ccode\u003eis_blocked\u003c/code\u003e + \u003ccode\u003eblocked_reason\u003c/code\u003e with DB-enforced invariants\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDiscoveries\u003c/strong\u003e — Lightweight memory that doesn\u0026rsquo;t force work creation\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTyped memory links\u003c/strong\u003e — Graph-style relationships between discoveries, tasks, projects, and Copilot sessions\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eWorktree management\u003c/strong\u003e — Automatic branch/worktree creation and cleanup\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSession persistence\u003c/strong\u003e — Agents can persist state to DB for cross-session continuity\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eArchive + restore\u003c/strong\u003e — Hygiene mechanism for discoveries (archived items stay durable but hidden from active views)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eMulti-timezone\u003c/strong\u003e — Daily notes default to \u003ccode\u003eAmerica/Chicago\u003c/code\u003e, configurable via \u003ccode\u003eNEXUS_TIMEZONE\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"scope\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eScope\u003c/span\u003e \u003ca href=\"#scope\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eNexus is scoped to \u003cstrong\u003eone machine\u003c/strong\u003e per deployment. No remote centralization planned. The client runs per-machine against a local Postgres instance.\u003c/p\u003e\n\u003cp\u003eRationale: If you need cross-team collaboration and centralized tracking, existing solutions (GitHub Issues, Jira, Azure DevOps + MCP servers) already solve this well. Nexus focuses on the individual developer working with AI agents on a single workstation.\u003c/p\u003e\n\u003ch2 id=\"future-wants\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFuture Wants\u003c/span\u003e \u003ca href=\"#future-wants\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eDaemon agent\u003c/strong\u003e — Watch task tracker for new issues, spawn agent sessions in appropriate worktrees\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDaily reporting\u003c/strong\u003e — Ask an agent what all the other agents did today using Nexus as source of truth\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eEOY goal tracking\u003c/strong\u003e — Agent summarization by Quarter or smart goal category\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eEKS deployment\u003c/strong\u003e — Deploy API + Postgres to EKS to run more parallel agent stacks (work use case)\u003c/li\u003e\n\u003cli\u003eA canvas-style front-end that allows me to better visualize and plan out task-dependencies\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\nNexus is a task tracker and second-brain for collaborating with AI agents on software development. It keeps project boards, task details, subtasks, daily notes, and Git worktree context together in one system.\n\n## Why Nexus\n\nI built Nexus because I work with AI agents across multiple parallel work streams and need a way to:\n\n- Track what agents are working on and have them check-in regularly\n- Capture lightweight memories without forcing everything to become executable work immediately\n- Keep task-to-branch context when starting work\n- Use daily notes inside the same system\n\n## Architecture\n\n```\nHuman\n  |\n  +-- Agent Harness (GitHub Copilot CLI)\n  |     +-- Agents (orchestrator + specialists)\n  |     +-- Platform hooks / commands\n  |\n  +-- nexus CLI (PEP 723 single-file script)\n  |     |\n  |     +-- Nexus API (FastAPI, port 8090)\n  |           +-- Nexus DB (Postgres 16 + pgvector)\n  |\n  +-- Go TUI (primary interface)\n  +-- Git (worktrees, branches)\n```\n\n## Components\n\n### Core Stack\n\n- **Nexus API** — FastAPI REST backend. Projects, tasks, tags, dependencies, comments, and global discoveries. Tasks flow through `backlog` → `wip` → `done` with first-class readiness (`is_ready`) and blocking (`is_blocked`) markers.\n- **Nexus DB** — Postgres 16 with pgvector for vector storage (future AI memory features).\n- **nexus CLI** — PEP 723 single-file Python script. All agent-to-Nexus communication goes through this. JSON output for agents, human-readable for humans.\n- **Go TUI** — Terminal UI, the primary interface for dayFalse-to-day task management.\n\n### Agent Integration\n\n- **Copilot CLI plugin** (`copilot/`) — GitHub Copilot integration with custom skills:\n  - `nexus` — Core task and lifecycle commands\n  - `nexus-specialist` — Task-specific expertise\n  - `nexus-delegation` — Delegation patterns\n  - `daily-summary` — Daily progress summaries\n- **Hooks** — Session lifecycle hooks that sync state between Nexus and agent sessions:\n  - `session-start.sh` — Initialize worktree metadata\n  - `session-end.sh` — Archive session state\n  - `session-sync.sh` — Periodic checkpoint\n  - Liveness probes for agent monitoring\n\n### Task Lifecycle\n\n```\nstart → implement → review → merge → done → finish\n```\n\n- `nexus start \u003cid\u003e` — Creates `nx-\u003cid\u003e` worktree from base branch\n- `nexus review \u003cid\u003e --verdict PASS` — Authoritative merge gate\n- `nexus merge \u003cid\u003e` — Rebases and merges `--no-ff`\n- `nexus done \u003cid\u003e` — Marks task complete\n- `nexus finish \u003cid\u003e` — Removes worktree and deletes branch\n\n### Discoveries (Second Brain)\n\nDiscoveries are durable memory captures that may be global, project-linked, or task-linked. They're **not** executable work — they don't get branches, worktrees, or the full task lifecycle. When ready, they can be promoted into tasks.\n\n- `nexus discovery inbox` — Triage view for new/promotable/stale discoveries\n- `nexus discovery list` — Browse all discoveries\n- `nexus remember \"...\"` — Lightweight capture\n- `nexus discovery promote \u003cid\u003e` — Convert to executable task\n\n## Key Features\n\n- **Task tracking** — Projects, tasks, subtasks, tags, dependencies, comments\n- **Readiness tracking** — Explicit `is_ready` marker for backlog refinement\n- **First-class blocking** — `is_blocked` + `blocked_reason` with DB-enforced invariants\n- **Discoveries** — Lightweight memory that doesn't force work creation\n- **Typed memory links** — Graph-style relationships between discoveries, tasks, projects, and Copilot sessions\n- **Worktree management** — Automatic branch/worktree creation and cleanup\n- **Session persistence** — Agents can persist state to DB for cross-session continuity\n- **Archive + restore** — Hygiene mechanism for discoveries (archived items stay durable but hidden from active views)\n- **Multi-timezone** — Daily notes default to `America/Chicago`, configurable via `NEXUS_TIMEZONE`\n\n## Scope\n\nNexus is scoped to **one machine** per deployment. No remote centralization planned. The client runs per-machine against a local Postgres instance.\n\nRationale: If you need cross-team collaboration and centralized tracking, existing solutions (GitHub Issues, Jira, Azure DevOps + MCP servers) already solve this well. Nexus focuses on the individual developer working with AI agents on a single workstation.\n\n## Future Wants\n\n- **Daemon agent** — Watch task tracker for new issues, spawn agent sessions in appropriate worktrees\n- **Daily reporting** — Ask an agent what all the other agents did today using Nexus as source of truth\n- **EOY goal tracking** — Agent summarization by Quarter or smart goal category\n- **EKS deployment** — Deploy API + Postgres to EKS to run more parallel agent stacks (work use case)\n- A canvas-style front-end that allows me to better visualize and plan out task-dependencies\n",
      "summary": "Nexus is a task tracker and second-brain for collaborating with AI agents on software development. It keeps project boards, task details, subtasks, daily...",
      "date_published": "2026-02-05T05:31:53Z",
      "date_modified": "2026-02-05T05:31:53Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "projects",
        "organization"
      ]
    },
    {
      "id": "https://pype.dev/2026-02-05-notes/",
      "url": "https://pype.dev/2026-02-05-notes/",
      "title": "2026-02-05 Notes",
      "content_text": "\nyesterday: [[2026-02-03-notes]]\n\n- I'm continuing to think about [[nexus]]\n\n  - it's for me, not thinking about other people collaborating on issues\n  - it has many purposes now, or could have many depending on how I decide to use it\n\n- With AI continuing to improve, I don't think there's going to be room for Notifiq to really take off as any kind of paid-for service, so as work might slow down from starting my new job I'll probably revisit it some, rip out the SaaSy parts (stripe, etc.) and put it on github... maybe not github... I'm not sure - I think it's cool but I don't necessarily want to feed training data with my ideas for free, ya know?\n\n- added [[ai]] slash page to mention some of my AI usage for the blog\n",
      "summary": "yesterday: 2026-02-03-notes",
      "date_published": "2026-02-05T05:31:31Z",
      "date_modified": "2026-02-05T05:31:31Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/learning-how-to-agent/",
      "url": "https://pype.dev/learning-how-to-agent/",
      "title": "Learning How To Agent",
      "content_text": "\n## Introduction \u0026 Background\n\nI've been using AI tools for codegen for a few years now, but not super\nheavily. I either use the in-line copilot stuff, which is like LSP on\nseteroids, or I have gone all the way to the other side of full on vibecoding\nwith Windsurf. That's been fun enough, but not super fulfilling and at the end\nof that I either have a simple webapp that does what I want but I don't\nunderstand, or else a half-broken thing I tried to understand but couldn't\nprompt in the right direction.\n\n!!! note \"One Caveat\"\n\n    My one caveat with Windsurf, which is a full IDE that I don't have a lot of comfortable navigation in due to all the Cascade keybindings clobbaring my own keymaps - is that with a HEAVY spec, it's done will with the Claude models at implementing a real idea I have. It's closer to vibe-engineering than vibe-coding, but that's my only instance, the rest of my Windsurf usage is \"make me a cool app - no mistakes\"\n\nThis year it feels like some tools exploded and\nI mentioned this in [[new-job-caterpillar-autonomy]]. I've been using\n[opencode](https://opencode.ai) a lot over the last few weeks and have iterated\nmany times already on a system of work that I'm trying to lean into for\nimproving my efficiency.\n\n## The Problem Space\n\nMy desire for a great Developer Experience is years old now, shout out to\nThePrimeagen for his [FEM\ncourse](https://frontendmasters.com/courses/developer-productivity-v2/) and\n[Waylon Walker](https://waylonwalker.com) for being a constant source of\nencouragement to be the best developer I can be. I sometimes (often) get\ntunnel-visioned on developer-productivity initiatives and lose the forest\nthrough the trees when ironing out a workflow - generally to find out I way\nover complicated the solution OR worse, started solving a problem I don't even\nhave.\n\n## First Attempt: Local Progress Tracker\n\nWell that's where I've been for a few weeks... I'm building Nexus, my\nsecond-brain at work to collaborate with agents on the truckload of stuff I'm\nexpected to get done. For a while now I've had a \"working-notes\" repo, which is\nbasically a blog, built with markata and navigated via markdown-lsp, where I do\nlike what I do here - take daily notes, track projects and status, and it gets\nbuilt into a nice little website I can reference with my boss.\n\nNow that we have copilot in full-swing, I'm trying to integrate agents a bit\nmore. Opencode has made this so nice - so many tools and modes of interaction,\nhighly customizable interface but also an amazing default experience... So I\nwas trying to lean into using agents and subagents for more work I started down\nthe path of building out a progress tracker. I started with a simple \"skill\"\nthat told the agent to put some info into a sqlite file, and even create the\nfile and schema based on the work. This worked fine, but was specific to each\nrepo (and actually each worktree I was in) and it was hard for me to get\nvisibility into all the work my fleet of agents was doing. Now that's actually\nproblem 1 - I don't have a fleet of agents, I had some terminal sessions going\nwith opencode, but I got it in my head that I was going to have an army of\nClaude's on my computer, constantly and autonomously knocking out tickets and I\nneeded to know who was doing what, where, when, and why..\n\n## Nexus V1 \u0026 V2: The Over-Engineering Phase\n\nSo, I dropped the local \"progress tracker\" and jumped into a huge FastAPI\nproject that I called Nexus. It was a python cli + api, with a server for\ncentralized management. It presented a kanban board, had policy gates on\n\"plans\" being approved before work could start on an Epic (and therefore any\nchild tickets). It has worktree tracking and automation, etc. It had a lot...\nit didn't all work, and it was hard to build the autonomous system... I wanted\nagentic feedback loops where `voidshaper` and I made epic plans for Epics (see the pun?) and then once the Plan was approved `star-commander` comes on the scene and makes tickets or checks tickets, depending on what's already ready to go it farmed out the work to `starsmith` (and variants for complexity) to build and then automatically calls in `recon-officer` and `qa-engineer` and at the end of it `gatekeeper` came in and\napproved or denied the changes. If denied - automatically start the loop again,\ntracking the work in Nexus, if approved - rebase and merge the branch, clean up\nthe worktree, update the ticket, close it, and get working on the next thing\nthat opens up. Ticket dependencies were in there, tracking stale agent\nsessions, clever routing of tasks to smaller models where appropriate.... you\ncan see that I went too far too fast too hard.\n\n![20260203124603_d5948740.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20260203124603_d5948740.png)\n\nNexus went through 2 or 3 iterations of this feature set. I was building it with several constraints in mind - specifically at work. 1. rate-limiting on large models (so not just using opus for everything), 2. good stewardship (not burning down cities for docstrings - farm out that work to haiku or a -mini model), 3. Copilot support - even though I like to use opencode, I wanted to supper copilot cli and in vscode as a means to share this with my coworkers who were mostly using vscode, 4. agent sessions were dying so I needed some kind of liveness probe for manual intervention in sessions where maybe the vpn died and the agent lost network... stuff like this was on my mind - but you know what wasn't? actually doing some work... I was solving problems I don't have, but were fun to think about.\n\n## The Reality Check\n\nSo, what are my problems? I boiled them down to a few things...\n\n1. I want to manage my workstreams in workspaces - folders on my computer where I put git worktrees\n2. I want varying levels of ai automation in my workflows... some things could be handled by an agent fully autonmously, but most things I'm at least paired up, reviewing diffs still, doing research while working, etc.\n3. In those varying levels of automation, I wanted the same amount of task tracking to a centralized location\n\nAnd after 2 weeks of ADHD-driven hyper focus, and many iterations on Nexus,\nthen Nexus V2.... what happened is that Nexus V2 died, and we say long live\nNexus V3!\n\n## Nexus V3: The Pragmatic Pivot\n\nNexus V3 is the same idea, but different approach... I'm leaning into opencode\ntooling specifically, dropping my care to support copilot given the lack of\nfeatures. I'm using a few opencode [plugins](https://opencode.ai/docs/plugins/)\n([opencode-notify](https://github.com/kdcokenny/opencode-notify) and\n[opencode-background-agents](https://github.com/kdcokenny/opencode-background-agents)\nand a few [commands](https://opencode.ai/docs/commands/). Instead of building\nmy own tracker, I'm using [kanboard](https://kanboard.org/) because it's\nbasically a feature-complete agile/sprint/kanban board that I use at home, has\na simple plugin ecosystem for light customization, and solves practically every\nstatus-tracking problem I tried to build from the ground up initially - ticket\ndependencies/linkages, actions to change ticket colors for a simple intuitive\nUI based on state, easy columns and tagging configuration, a simple API and\nthere's even an [mcp server](https://github.com/bivex/kanboard-mcp).\n\nSo, I've given up on the full automation for now, although\n[opencode-pilot](https://github.com/athal7/opencode-pilot) looks VERY PROMISING\nfor this in the future. Today though, through some simple commands to give to\nagents for updating kanboard, I manually put them in worktrees, and they get to\nwork - the tracking and human-in-the-loop model is going well for the work I\nneed done.\n\n## Lessons Learned\n\nI learned and relearned plenty of lessons on this over the last 2 weeks... Data\nmodels matter more than almost anything, well-defined workflows are required if\nyou want agents to help you iterate, and not everything has to be a product...\nThat last one's personal, but every time I have an idea I **think** is good,\nI'm sure it'll be something to share, but a good lesson for me is to just build\nthe things I need for me, and **eventually** maybe it can be cleaned up to\nshare, but when I start building something with anyone other than **me** in\nmind, I'm in for a long hard journey\n\n## Current State \u0026 Future\n\nSo what's the summary? I don't think I know how to agent super well yet - but\nI'm trying to get better to stay on the forefront of my co-workers who I see\nusing AI in simple and sometimes scary ways\n\n!!! danger \"Copilot x sudo\"\n\n    Do not give copilot `sudo` on your CI server and say \"fix my problem\"... are you retarded???\n\nI am not going hardcore with [ralph\nwiggum](https://awesomeclaude.ai/ralph-wiggum) or\n[gastown](https://github.com/steveyegge/gastown) - although those inspired\nNexus v1 and v2, but I am dialing in my agentic workflow with some simple\nspecialized agents, farming out work to subagents for context management,\nplanning ahead of time to put appropriate context in a ticket, and getting\nclose to having agents check out tickets, make worktrees, and do simple work by\nthemselves (this was working in Nexus V2 but only intermittenly).\n\nSomeday I'll open-source Nexus and share the configuration and workflow, for\nnow it's private as I'm actually using it to build out what I want rather than\ntrying to recreate gastown with a cool space theme.\n",
      "summary": "I've been using AI tools for codegen for a few years now, but not super heavily. I either use the in-line copilot stuff, which is like LSP on seteroids, or I...",
      "date_published": "2026-02-03T05:50:33Z",
      "date_modified": "2026-02-03T05:50:33Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "genai",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/2026-02-03-notes/",
      "url": "https://pype.dev/2026-02-03-notes/",
      "title": "2026-02-03 Notes",
      "content_text": "\nyesterday: [[2026-01-31-notes]]\n\n- I am working a lot... 3 hours today and it's 545 AM... probably 23 hours into the week already since Sunday. Hoping this cools off very very soon\n- In the meantime I keep meaning to write some more but I just start working right away, so I'll put some thoughts together on how I've been working\n\n- [[learning-how-to-agent]]\n- [handy](https://github.com/cjpais/Handy) - I started using this to do STT on my work Mac - let's me talk to neovim and opencode nearly perfectly... worked right away, excited to explore vocally conversing with my agents now!\n",
      "summary": "yesterday: 2026-01-31-notes",
      "date_published": "2026-02-03T05:47:11Z",
      "date_modified": "2026-02-03T05:47:11Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/revel-in-imparted-righteousness/",
      "url": "https://pype.dev/revel-in-imparted-righteousness/",
      "title": "Revel in imparted righteousness",
      "content_html": "\u003cp\u003eSpurgeon\u0026rsquo;s Morning and Evening today is from Jeremiah 23:6.\u003c/p\u003e\n\u003cdiv class=\"admonition warning\"\u003e\n\u003cp class=\"admonition-title\"\u003eWarning\u003c/p\u003e\n\u003cp\u003eAgain with these reflections, I\u0026quot;m not an OT scholar and I don\u0026rsquo;t know, or\ndidn\u0026rsquo;t do a lot of search on, the context of the passage. This isn\u0026rsquo;t\neducational, this if a reflection on what God brings to mind through his Word\nand my time with him, not teaching about the historical context of where the\nwords in Jeremiah 23 actually affect the story\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eJeremiah 23:6\u003c/p\u003e\n\u003cp\u003eIn his days Judah will be saved, and Israel will dwell securely. And this\nis the name by which he will be called: ‘The Lord is our righteousness.’\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"the-lord-is-our-righteousness\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThe Lord is our righteousness\u003c/span\u003e \u003ca href=\"#the-lord-is-our-righteousness\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThere\u0026rsquo;s a lot of tension in the details of the story of the world in how humans\nand God relate to each other. On one hand, God created everything, and he\ncreated humans with a unique purpose to be his seen-imagers in the physical\nworld who carry out his will. On the other hand, humans take that position of\nprivilege and often destroy the world in our sin and dismay. The theology\nsurrounding this tension is the thing that can affect the Christian\u0026rsquo;s daily\nlife\u0026hellip; As I walk through the world, am I more aware of my position as God\u0026rsquo;s\nchild, with responsibility to bear his Name and steward the earth, or am I more\naware of my sin and the fact that I often make choices Jesus wouldn\u0026rsquo;t be proud\nof? Both things are true, but where I put my mind and heart drives if I have a\ncontented smile on my face or if my brow is sweaty and scunched up in\nfrustration.\u003c/p\u003e\n\u003cp\u003eI think that if we somehow filtered our view to all \u0026ldquo;true Christians\u0026rdquo; we\u0026rsquo;d see\nthat a majority of them lean in on emphasizing their sin because it is the\nthing that makes Jesus\u0026rsquo; work necessary - it is the un-overcomable thing that we\nhave to be saved from and Glory to God! for saving us. But on the daily, not\nputting equal emphasis on the next step of the story, which is that in God\u0026rsquo;s\nsaving he imparts the righteousness of Jesus right onto us, is a disservice to\nus as God\u0026rsquo;s children.\u003c/p\u003e\n\u003cp\u003eI want my kids to be proud and secure in their name and place as my kids. I\ndon\u0026rsquo;t want them to spend their energy focusing on where they have contributed\nchaos and disorder to my life, I want them to focus on the things they do worth\nbeing proud of, and there\u0026rsquo;s grace for the rest. I think this must be true of\nthe Lord as well - without a doubt I am a sinner and a wretch who, left to my\nown devices, would end up a drunken addict lying in the street somewhere\u0026hellip; but\nwhy would I \u003cstrong\u003efocus\u003c/strong\u003e on that when Yahweh chooses me, imparts Jesus'\nrighteousness to me, adopts me as his own! The reality of my sin is reality,\nbut the reality of Jesus\u0026rsquo; grace on my life is no less true. Christians\nshouldn\u0026rsquo;t be ignorant of the sin they carry and the choices they make which\ndishonor God, but we also shouldn\u0026rsquo;t be ignorant of the grace God shows to us!\u003c/p\u003e\n\u003cp\u003eI have noticed in my life, as the scales have tipped somewhat in favor of\nfocusing \u003cstrong\u003emore\u003c/strong\u003e on Yahweh adopting me as opposed to focusing on where I fall\nshort of the glory of God, that\u0026rsquo;s it\u0026rsquo;s more natural for me to be joyful about\nalmost anything in the world (worth experiencing joy over)\u003c/p\u003e\n\u003cp\u003eMay Jesus call you today if you\u0026rsquo;re reading this and he hasnt\u0026rsquo; yet, and if he\nhas may joy follow your acknowledgement of your adoption rather than sorrow\nover your previous state. Glory to God in the highest!\u003c/p\u003e\n",
      "content_text": "\nSpurgeon's Morning and Evening today is from Jeremiah 23:6.\n\n!!! warning \"\"\n\n    Again with these reflections, I\"m not an OT scholar and I don't know, or\n    didn't do a lot of search on, the context of the passage. This isn't\n    educational, this if a reflection on what God brings to mind through his Word\n    and my time with him, not teaching about the historical context of where the\n    words in Jeremiah 23 actually affect the story\n\n!!! note \"Jeremiah 23:6\"\n\n    In his days Judah will be saved, and Israel will dwell securely. And this\n    is the name by which he will be called: ‘The Lord is our righteousness.’\n\n## The Lord is our righteousness\n\nThere's a lot of tension in the details of the story of the world in how humans\nand God relate to each other. On one hand, God created everything, and he\ncreated humans with a unique purpose to be his seen-imagers in the physical\nworld who carry out his will. On the other hand, humans take that position of\nprivilege and often destroy the world in our sin and dismay. The theology\nsurrounding this tension is the thing that can affect the Christian's daily\nlife... As I walk through the world, am I more aware of my position as God's\nchild, with responsibility to bear his Name and steward the earth, or am I more\naware of my sin and the fact that I often make choices Jesus wouldn't be proud\nof? Both things are true, but where I put my mind and heart drives if I have a\ncontented smile on my face or if my brow is sweaty and scunched up in\nfrustration.\n\nI think that if we somehow filtered our view to all \"true Christians\" we'd see\nthat a majority of them lean in on emphasizing their sin because it is the\nthing that makes Jesus' work necessary - it is the un-overcomable thing that we\nhave to be saved from and Glory to God! for saving us. But on the daily, not\nputting equal emphasis on the next step of the story, which is that in God's\nsaving he imparts the righteousness of Jesus right onto us, is a disservice to\nus as God's children.\n\nI want my kids to be proud and secure in their name and place as my kids. I\ndon't want them to spend their energy focusing on where they have contributed\nchaos and disorder to my life, I want them to focus on the things they do worth\nbeing proud of, and there's grace for the rest. I think this must be true of\nthe Lord as well - without a doubt I am a sinner and a wretch who, left to my\nown devices, would end up a drunken addict lying in the street somewhere... but\nwhy would I **focus** on that when Yahweh chooses me, imparts Jesus'\nrighteousness to me, adopts me as his own! The reality of my sin is reality,\nbut the reality of Jesus' grace on my life is no less true. Christians\nshouldn't be ignorant of the sin they carry and the choices they make which\ndishonor God, but we also shouldn't be ignorant of the grace God shows to us!\n\nI have noticed in my life, as the scales have tipped somewhat in favor of\nfocusing **more** on Yahweh adopting me as opposed to focusing on where I fall\nshort of the glory of God, that's it's more natural for me to be joyful about\nalmost anything in the world (worth experiencing joy over)\n\nMay Jesus call you today if you're reading this and he hasnt' yet, and if he\nhas may joy follow your acknowledgement of your adoption rather than sorrow\nover your previous state. Glory to God in the highest!\n",
      "summary": "Spurgeon's Morning and Evening today is from Jeremiah 23:6.",
      "date_published": "2026-01-31T05:45:42Z",
      "date_modified": "2026-01-31T05:45:42Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "reflection",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2026-01-31-notes/",
      "url": "https://pype.dev/2026-01-31-notes/",
      "title": "2026-01-31 Notes",
      "content_text": "\nyesterday: [[2026-01-23-notes]]\n\nIt's been too long since I've written anything or done any reflection. Work has\nbeen all-consuming. It's been a whirlwind of a couple weeks, but I'm fully\nrecovered from the flu, have a grip on what's going on at work, and hopefully\nnow I can get back into some daily reflections and blogging, while still\nattempting to 10x engineer my way through the issues I'm helping solve at Cat\n\n- [[revel-in-imparted-righteousness]]\n\n- updated [clocks](https://clocks.paynepride.com) for some user-customization\n",
      "summary": "yesterday: 2026-01-23-notes",
      "date_published": "2026-01-31T05:27:34Z",
      "date_modified": "2026-01-31T05:27:34Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/new-job-caterpillar-autonomy/",
      "url": "https://pype.dev/new-job-caterpillar-autonomy/",
      "title": "New Job - Caterpillar Autonomy",
      "content_text": "\nIn [[im-back-from-the-dead]] I mentioned my new role that started this year -\nit's a return to Caterpillar Autonomy. I built some data pipelines and\njunior-grade infrastructure 5 years ago but left over burn-out at the prospect of\na job with smaller scoped work and more technical guidance. That was a good\nmove, and in God's sovereignty he's brought me back. Now I'm looking at code,\nthankfully not that I wrote, but that the guy after me wrote - it accomplished\na job, like my original work did, but also like what I built back then -\nthere's better ways today. The amount of things in front of me is absolutely\ndaunting, and the people on the team have been seeded with a very high opinion\nof me... I don't know how much is valid and how much is hype, but I'm gonna try\nto live up to it.\n\nOne way I'm striving to do that is to maximize my efficiency with the AI coding\ntools available to me. We have Github Copilot and I've picked up a lot over the\ncourse of the last few years (and especially more recently) in using agents,\nplanning out work, documenting plans for agents to follow, splitting up work\nvia worktrees, etc. I feel pretty good about where I'm going and someday I\nmight even release Nexus. Nexus is serving as my second-brain at work, the hub\nwhere I collaborate with my fleet of agents on the work that must get done.\nDetails to come on this, but the thing that matters is that in ironing out\nworkflow I've moved from prompt + chat to really managing a long-lived stream\nof work. AI has been changing the world, and there's been developer hype for\nyears now. But \"make me a cool app, no mistakes\" isn't going to cut it. Even\n\"make an app but generate a plan first\" isn't going to cut it... Developers\nhave to adopt a higher level role, a systems-oriented and architecture-driven\nworldview must become primary in order to keep up. Code-gen and syntax writing\nare not what developers were **ever** paid to do, although many believed so.\nOur jobs have been to solve problems and deliver code that solves the problem.\nThe code is cheap now, but solving problems still is a human task.\n\nIn the Autonomy group - there's problems all up and down the stack. My focus is\non infrastructure and developer operations - it's become my bread and butter\nover the last several years. I'm excited to help the team grow, and I'm excited\nto grow personally/technically as I lean into the agentic workflow to produce\ncode that I'm actually proud of, that has my name on the commit, and that\nsolves real problems.\n\n## Example - Local Development\n\nOne of the first things I'm tackling is a developer-pain-point of working on\ntheir laptop. I've been in this space for years, mostly with python programmer\nwho are writing data science code. They don't know about virtual environments,\nchecking $PATH, assuming bad state in their terminal session, how to configure\nVS Code, etc. Often they just want to write some scripts and somehow test it.\nThe solution I see most often is for devs to write code in JupyterLab/Notebooks\nin AWS or some environment close to their data - this is fine I guess, but it's\nnot developing good pipelines, and it's tedious as hell. In my last job I\nhelped set developers up with workflows that allowed them to run their IDE of\nchoice locally (getting all the goodies of syntax highlighting, LSP, etc) and a\nCLI that took their code and ran it in the cloud, right next to data, in the\nsame way that prod runs. It was a hit. After that I introduced some tools to\nhelp them manage python environments - we had strict templating requirements in\nour projects, so making tools to automate those things wasn't too hard - it's\nmuch easier than trying to make something flexible for every use case. The\nopinions made the automation and tooling easy to make and distribute.\n\nWell I'm up against a similar task now, but oh so much worse... Larger team,\nlarger environment sprawl, larger infrastructure mismanagement, the whole\ngambit. And I'm here for it... Here's the first problem I'm addressing - local\ndevelopment for Airflow DAGs that run in an Airflow deployment on Kubernetes.\nThe deployment itself is a little odd, Airflow is an orchestrator, all the\npipelines run in external AWS Batch jobs - so a DAG hits the Batch API to run\nthe code. The design there is actually nice, but how are devs testing code?\n\nOh that's easy... they SSH into the prod server, which is a 5 year old desktop\nTHAT I BUILT WITH A CO-WORKER BEFORE I WAS IN AUTONOMY THE FIRST TIME... hold\non, WHAT!? Yes, it's true.. so they SSH into the prod server, run some bash\nscripts in their userspace that setup airflow and a few db utilities in a\ndocker compose stack, authenticate with AWS themselves from that server, and\nthen they run DAGs against real data to test it... I am beyond shook.\n\nHere's what I've put together - a bootstrap process (I like `just` + PEP 723\npython scripts as opposed to bash, but to each their own, and bash of course\nhas its place) that spins up a [kind](https://kind.sigs.k8s.io/) cluster on\ntheir laptop, the process pulls some private images and loads them into the\nkind cluster, it installs airflow from a helm chart (the same helm chart we'll\nuse in dev and prod... no more docker compose over here, kubectl over there),\nand everything just. comes. up. No SSH into ancient server, no touching cloud\ninfra (they get MinIO and a DB container to emulate S3 and RDS in our AWS\naccounts), no sweat on testing DAGs. They stage some data in MinIO (`just open\nminio` handles the port-forward and opens the browser), then `just open\nairflow` (their DAGs are hot-reloaded via hostPath mounting), and they can run\nDAGs locally until they're satisfied with the results.\n\nIt's taken me about a week of split-focused effort (I mentioned Nexus and I've\nbeen co-building and dogfooding that at the same time) but I'm proud of that\nlocal setup now. I am a bit shocked they've dealt with a brittle, hacky, often\nbroken development workflow for the last 4 years or so, but that development I\nsuppose.\n\n## The Point\n\nThis post wasn't meant to be me glazing myself for awesome local development\npractices, I am simply excited about this new chapter. I love solving problems,\nand I love owning those solutions. There's a whole mess of things to address,\nmy mind is buzzing, and I feel like God has blessed me with renewed passion\n(again see [[im-back-from-the-dead]]). I've given up some pay and some freedom\nto take this role, but I think it'll pay dividends.\n\nLife happens to all of us - this role change affected a lot for me, it's been\nhard to digest some of those changes, but the work is good, the development is\nfun, the new world of using agents to fly through things you're fluent in is\nexciting, and I'm here to help a team that desperately needs it to improve\ntheir lives and the work we do for Cat Autonomy.\n\nI'm still pissed at Caterpillar Executives for RTO ruining parts of my life,\nbut in God's sovereignty their idiocy has led to non-trivial blessing, so I can\nsay \"Praise the Lord\"\n",
      "summary": "In im-back-from-the-dead I mentioned my new role that started this year - it's a return to Caterpillar Autonomy. I built some data pipelines and junior-grade...",
      "date_published": "2026-01-26T10:24:54Z",
      "date_modified": "2026-01-26T10:24:54Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "work",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/2026-01-23-notes/",
      "url": "https://pype.dev/2026-01-23-notes/",
      "title": "2026-01-23 Notes",
      "content_text": "\nyesterday: [[2026-01-01-notes]]\n\n- [[im-back-from-the-dead]]\n",
      "summary": "yesterday: 2026-01-01-notes",
      "date_published": "2026-01-23T05:47:03Z",
      "date_modified": "2026-01-23T05:47:03Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/im-back-from-the-dead/",
      "url": "https://pype.dev/im-back-from-the-dead/",
      "title": "I’m back from the dead",
      "content_html": "\u003cp\u003eThe flu hit me like a freight train right at the start of the year, along with\nthe most stress I\u0026rsquo;ve ever felt at work dropping on me at the same time, I\u0026rsquo;ve\nbeen out of commission for what feels like forever. But this week I\u0026rsquo;ve been\nbouncing back and I feel like a million bucks now\u0026hellip; and a lot has happened\u003c/p\u003e\n\u003cp\u003eThis post isn\u0026rsquo;t a review, it\u0026rsquo;s a note for me to come back and build on with\nsome more posts probably. My life has been a bit chaotic but in God\u0026rsquo;s good\ngrace on my life, that chaos hasn\u0026rsquo;t ruined anything (I am still wrestling with\none aspect of it) but something\u0026rsquo;s changed this year\u0026hellip; I\u0026rsquo;m not only back from\nthe flu over the last several weeks, I feel like I\u0026rsquo;ve been resurrected as a\ndeveloper. I\u0026rsquo;d written a few times last summer, feeling like I was in a rut,\nand I felt good coming out of that low season, but as I\u0026rsquo;ve reflected it\u0026rsquo;s\nreally the last couple of years have been a slow descent into, not into\ndepression, but something akin to it\u0026hellip;\u003c/p\u003e\n\u003cp\u003eNot only is that season either over or on pause, cause I\u0026rsquo;ve been buzzin on\nbuilding things for a week now like I can hardly remember, but I\u0026rsquo;ve had some\nsignificant work changes. Longer reflection post to come - but after much toil\nI am actually back in Caterpillar Autonomy, a group I left from burn-out 5\nyears ago. In fact, I\u0026rsquo;m on the same project, but with new eyes, new passion,\nnew knowledge and experience, and the fun part for me now is new tools. AI\nhasn\u0026rsquo;t been my friend the whole time, I\u0026rsquo;ve vibe-coded some disasters,\npseudo-vibe-coded some cool stuff, but ultimately it\u0026rsquo;s not been a net positive\nfor me until this week. Getting a workflow ironed out in order to keep up with\nthe group\u0026rsquo;s pace, or the pace I want us to be at, has been exciting and I swear\nI\u0026rsquo;ve done a month\u0026rsquo;s work of work since Monday\u0026hellip; no hype, no selling, just\nletting you know that AI can\u0026rsquo;t do it all, but with good design it sure can\ngenerate some code that doesn\u0026rsquo;t suck.\u003c/p\u003e\n\u003cp\u003eSo\u0026hellip; I\u0026rsquo;m back, almost from the dead, and it\u0026rsquo;s January 23 but let\u0026rsquo;s kick 2026\nright in the cajones!\u003c/p\u003e\n",
      "content_text": "\nThe flu hit me like a freight train right at the start of the year, along with\nthe most stress I've ever felt at work dropping on me at the same time, I've\nbeen out of commission for what feels like forever. But this week I've been\nbouncing back and I feel like a million bucks now... and a lot has happened\n\nThis post isn't a review, it's a note for me to come back and build on with\nsome more posts probably. My life has been a bit chaotic but in God's good\ngrace on my life, that chaos hasn't ruined anything (I am still wrestling with\none aspect of it) but something's changed this year... I'm not only back from\nthe flu over the last several weeks, I feel like I've been resurrected as a\ndeveloper. I'd written a few times last summer, feeling like I was in a rut,\nand I felt good coming out of that low season, but as I've reflected it's\nreally the last couple of years have been a slow descent into, not into\ndepression, but something akin to it...\n\nNot only is that season either over or on pause, cause I've been buzzin on\nbuilding things for a week now like I can hardly remember, but I've had some\nsignificant work changes. Longer reflection post to come - but after much toil\nI am actually back in Caterpillar Autonomy, a group I left from burn-out 5\nyears ago. In fact, I'm on the same project, but with new eyes, new passion,\nnew knowledge and experience, and the fun part for me now is new tools. AI\nhasn't been my friend the whole time, I've vibe-coded some disasters,\npseudo-vibe-coded some cool stuff, but ultimately it's not been a net positive\nfor me until this week. Getting a workflow ironed out in order to keep up with\nthe group's pace, or the pace I want us to be at, has been exciting and I swear\nI've done a month's work of work since Monday... no hype, no selling, just\nletting you know that AI can't do it all, but with good design it sure can\ngenerate some code that doesn't suck.\n\nSo... I'm back, almost from the dead, and it's January 23 but let's kick 2026\nright in the cajones!\n",
      "summary": "The flu hit me like a freight train right at the start of the year, along with the most stress I've ever felt at work dropping on me at the same time, I've...",
      "date_published": "2026-01-23T05:38:29Z",
      "date_modified": "2026-01-23T05:38:29Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "note",
        "dev"
      ]
    },
    {
      "id": "https://pype.dev/2026-01-01-notes/",
      "url": "https://pype.dev/2026-01-01-notes/",
      "title": "2026-01-01 Notes",
      "content_text": "\nyesterday: [[2025-12-31-notes]]\n\n## TIL\n\n- The 12 days of Christmas is supposed to start on Christmas Eve/Christmas Day\n  and ends the eve of Epiphany (January 6th or thereabouts depending on the\n  calendar)\n\n- merging compose files... oh boy [check this out - need to get this pattern into my homelab repo?](https://docs.docker.com/compose/how-tos/multiple-compose-files/merge/)\n",
      "summary": "yesterday: 2025-12-31-notes",
      "date_published": "2026-01-01T05:53:10Z",
      "date_modified": "2026-01-01T05:53:10Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/reflection-john-7-37/",
      "url": "https://pype.dev/reflection-john-7-37/",
      "title": "Reflection - John 7:37",
      "content_text": "\n!!! note \"John 7:37\"\n\n    Now on the last day of the feast—the great day—Jesus stood and cried out,\n    saying, “If anyone is thirsty, let him come to me, and let him drink,\n\n## The Last Day\n\nSo, today obviously isn't the last day of a feast Jesus is speaking at, I don't\nmean to impose anything beyond a trivial relationship between \"the last day\"\nand today being New Year's Eve. The reflection is for reflecting, not education\nand so today I pray the Lord be good to me in meditating on this text this\nmorning.\n\n## Jesus Cried Out\n\nYahweh longs for all people to be reconciled to him. It's a fact that that\nwon't be the case because of the degrees of wills that can coexist even though\nthe mechanism of their relationship is hidden from us -\n[[the-hidden-things-belong-to-yahweh]].\n\nHowever, a clear truth here is that \"Jesus cried out\". His voice goes out, loud\nand all around, to all people within ear-shot - \"If anyone is thirsty, let him\ncome to me\".\n\n!!! warning \"\"\n\n    If anyone is thirsty\n\nJesus gives no qualifiers on who his message goes out to - it's the dad of 6\nkids nailing it, the wife of of a businessman maintaining her home, the harlot\ntrying to wreck that home, the prostitute on the corner, the corrupt politician\n(even Paul was called)... Jesus' voice goes out to \"anyone\"... So who am I to\nthink that my standing as a righteous person before God by the grace of the\nblood of Jesus has anything to do with who I am? His call goes out to\n**anyone**.\n\nSo what is for me today? or for the person who is reading this? I don't know...\nJesus has been so good to me, and I also want all people to know him. I want\nevery person to experience being freed from their sinful master, freed from\nthemselves. I believe that if all people gave their lives to Jesus the world\nwould be healed over night. That fantasy land doesnt' exist though, and Jesus'\ncall has gone out to anyone and everyone - but the time for that call is coming\nto a close and when he comes back it'll be to redeem his own.\n\nIt's one thing to be invited to a wedding feast. The invitation has gone out.\n\nIt's another thing stand between a loving husband and his captive bride, or a\nwarrior father and his oppressed child. That is the position of every person\nwhen the Lord comes back whose knee is not already bowed.\n\nThe New Year brings a time of reflection about life, what to start, what to\nstop. Jesus has been good to my heart in this year - creating a genuine\ndesire for all people to experience him. I hope that anyone reading this or any\nof my posts might hear God's calling through what he's done in my life.\n\nHis call went out to **anyone** but he redeems **his own**, may you accept\nadoption today.\n",
      "summary": "!!! note \"John 7:37\"",
      "date_published": "2025-12-31T05:05:36Z",
      "date_modified": "2025-12-31T05:05:36Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2025-12-31-notes/",
      "url": "https://pype.dev/2025-12-31-notes/",
      "title": "2025-12-31 Notes",
      "content_text": "\nyesterday: [[2025-12-30-notes]]\n\n## Ideas\n\n- I want to start writing about some parenting concepts\n\n  - discipline vs consequences vs punishment is one concept\n  - love and the \"greater will\" for your child\n    - goes hand-in-hand with something like \"it's good for your child to suffer\"\n\n- [[reflection-john-7-37]]\n\n## Dev\n\n- fixed issue with dad-can-i-wear-this\n\n  - the ollama_host was set to be the actual ollama url running on my desktop,\n    which makes sense from the var name but is wrong. I have OLLAMA_HOST actually\n    assumed to be open-webui's api endpiont, so the API spec is a touch different\n    but I did this to use open-webui for agent customization and such\n  - change host:11343 (ollama's host and port) to host:3002 (open-webui's host\n    and port) and we're golden\n\n- need to compare OpenAgents with \u003chttps://github.com/code-yeongyu/oh-my-opencode\u003e\n",
      "summary": "yesterday: 2025-12-30-notes",
      "date_published": "2025-12-31T04:34:20Z",
      "date_modified": "2025-12-31T04:34:20Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/increase-inotify-limit-in-your-ci-workers/",
      "url": "https://pype.dev/increase-inotify-limit-in-your-ci-workers/",
      "title": "Increase inotify limit in your CI workers",
      "content_html": "\u003cp\u003eToday I tripped over a CI failure that I had to think about for a while.\u003c/p\u003e\n\u003cp\u003eI build \u003ca href=\"https://github.com/zensical/zensical\"\u003ezensical\u003c/a\u003e static sites in CI on\nmy Forgejo instance. These builds had been working fine, then suddenly started\nfailing with no code changes. Naturally, I assumed something upstream broke —\nmaybe a new uv release, maybe zensical.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eI pinned versions.\u003c/li\u003e\n\u003cli\u003eI tested older versions.\u003c/li\u003e\n\u003cli\u003eSame failure every time.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThat ruled out regressions and pushed me toward the environment.\u003c/p\u003e\n\u003cp\u003eI pulled the runner and worker images locally and built the sites just fine\u0026hellip;\nBut that doesn\u0026rsquo;t perfectly emulate the CI setup - my forgejo runner relies on\ndocker-in-docker and so we aren\u0026rsquo;t \u003cstrong\u003ejust\u003c/strong\u003e running a container on a host, we have\nthis middle layer to consider\u0026hellip; I wasn\u0026rsquo;t sure how to really test this out\nlocally so I succomed to AI and here\u0026rsquo;s where Jipity got me in about 5\nminutes\u0026hellip;\u003c/p\u003e\n\u003ch2 id=\"the-failure\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThe failure\u003c/span\u003e \u003ca href=\"#the-failure\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe builds blew up with:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003ethread 'zrx/monitor' panicked at .../zensical-watch/src/agent/monitor.rs:154:49:\ncalled `Result::unwrap()` on an `Err` value:\nError { kind: Io(Os { code: 24, message: \u0026quot;Too many open files\u0026quot; }) }\n\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eAt first glance it means nothing to me but Jipity says this screams ulimit.\u003c/p\u003e\n\u003cp\u003eSo following the AI overlords I checked:\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eulimit -n\u003c/code\u003e was already very high\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e/proc/sys/fs/inotify/max_user_watches\u003c/code\u003e was also very high\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003ePID limits\u003c/code\u003e were not constrained\u003c/p\u003e\n\u003cp\u003eEverything looked fine according to Jipity.\u003c/p\u003e\n\u003cp\u003eYet the panic persisted.\u003c/p\u003e\n\u003ch2 id=\"the-real-culprit\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThe real culprit\u003c/span\u003e \u003ca href=\"#the-real-culprit\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe actual limit being hit was:\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e/proc/sys/fs/inotify/max_user_instances\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eIn my Forgejo runner container, it was set to 128.\u003c/p\u003e\n\u003cp\u003eThat turns out to be far too low for zensical.\u003c/p\u003e\n\u003cp\u003eHere\u0026rsquo;s what ChatGPT said:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eEven during a normal zensical build, the tool spins up its watch subsystem,\nwhich creates many inotify instances. Once it crosses the kernel limit,\ninotify_init() fails with EMFILE, and the process panics because the error is\nunwrapped.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"the-fix\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThe fix\u003c/span\u003e \u003ca href=\"#the-fix\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eRaising the inotify instance limit fixed it immediately:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eecho 1024 \u0026gt; /proc/sys/fs/inotify/max_user_instances\nRUST_BACKTRACE=full uvx zensical build --clean\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eAfter that, the build succeeded consistently.\u003c/p\u003e\n",
      "content_text": "\nToday I tripped over a CI failure that I had to think about for a while.\n\nI build [zensical](https://github.com/zensical/zensical) static sites in CI on\nmy Forgejo instance. These builds had been working fine, then suddenly started\nfailing with no code changes. Naturally, I assumed something upstream broke —\nmaybe a new uv release, maybe zensical.\n\n- I pinned versions.\n- I tested older versions.\n- Same failure every time.\n\nThat ruled out regressions and pushed me toward the environment.\n\nI pulled the runner and worker images locally and built the sites just fine...\nBut that doesn't perfectly emulate the CI setup - my forgejo runner relies on\ndocker-in-docker and so we aren't **just** running a container on a host, we have\nthis middle layer to consider... I wasn't sure how to really test this out\nlocally so I succomed to AI and here's where Jipity got me in about 5\nminutes...\n\n## The failure\n\nThe builds blew up with:\n\n```\nthread 'zrx/monitor' panicked at .../zensical-watch/src/agent/monitor.rs:154:49:\ncalled `Result::unwrap()` on an `Err` value:\nError { kind: Io(Os { code: 24, message: \"Too many open files\" }) }\n\n```\n\nAt first glance it means nothing to me but Jipity says this screams ulimit.\n\nSo following the AI overlords I checked:\n\n`ulimit -n` was already very high\n\n`/proc/sys/fs/inotify/max_user_watches` was also very high\n\n`PID limits` were not constrained\n\nEverything looked fine according to Jipity.\n\nYet the panic persisted.\n\n## The real culprit\n\nThe actual limit being hit was:\n\n`/proc/sys/fs/inotify/max_user_instances`\n\nIn my Forgejo runner container, it was set to 128.\n\nThat turns out to be far too low for zensical.\n\nHere's what ChatGPT said:\n\n\u003e Even during a normal zensical build, the tool spins up its watch subsystem,\n\u003e which creates many inotify instances. Once it crosses the kernel limit,\n\u003e inotify_init() fails with EMFILE, and the process panics because the error is\n\u003e unwrapped.\n\n## The fix\n\nRaising the inotify instance limit fixed it immediately:\n\n```\necho 1024 \u003e /proc/sys/fs/inotify/max_user_instances\nRUST_BACKTRACE=full uvx zensical build --clean\n```\n\nAfter that, the build succeeded consistently.\n",
      "summary": "Today I tripped over a CI failure that I had to think about for a while.",
      "date_published": "2025-12-30T06:11:49Z",
      "date_modified": "2025-12-30T06:11:49Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "forgejo",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/2025-12-30-notes/",
      "url": "https://pype.dev/2025-12-30-notes/",
      "title": "2025-12-30 Notes",
      "content_text": "\nyesterday: [[2025-12-27-notes]]\n\n## Dev\n\n- taking a look at the zensical docs builds broken in my homelab\n\n  - I pulled the forgejo runner image to build locally - but that image isn't used for building, just orchestrating the CI runs\n  - so I docker pull ghcr.io/catthehacker/ubuntu:act-latest\n\n    - installed just\n    - cloned repo\n    - just build-site works... wtf...\n\n  !!! note \"TLDR\"\n\n      The build was failing because Linux only allowed 128 inotify instances, and zensical starts its file-watcher even during a normal build. The watcher creates more than 128 inotify instances, hits the kernel limit, gets EMFILE (Too many open files), and then panics due to an unwrap().\n      This had nothing to do with:\n      ulimit -n (already high)\n      max_user_watches (already high)\n      PID limits\n      Raising:\n      /proc/sys/fs/inotify/max_user_instances\n      fixed it immediately.\n      In short: CI environment had a low inotify instance limit, and zensical’s watcher is not CI-safe.\n\n- [[increase-inotify-limit-in-your-ci-workers]]\n\n- Also got my blog build and push to GH much closer to my shared devops one...\n  - using just in ci now, so the nostr well-known gets in there via just recipe\n  - need to configure markout vs site for markata vs zensical repos\n    - pype.dev\n    - homelab-mono(-mirror)\n    - dotfiles\n    - DigitalHarbor? (this would imply I'm bringing in these custom things built with npm/astro/etc... probably out of scope)\n",
      "summary": "yesterday: 2025-12-27-notes",
      "date_published": "2025-12-30T05:33:02Z",
      "date_modified": "2025-12-30T05:33:02Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/the-hidden-things-belong-to-yahweh/",
      "url": "https://pype.dev/the-hidden-things-belong-to-yahweh/",
      "title": "The Hidden Things Belong To Yahweh",
      "content_text": "\n!!! note \"Deuteronomy 29:29\"\n\n    The hidden things belong to Yahweh our God, but the revealed things belong to us to know and to our children forever, in order to do all the words of this law.\n\nHere is a truth every Christian should meditate on and remember whenever they\nfind themselves so sure of a biblical teaching. There are things not meant for\nus to know - not that we cannot enjoy the musings, but we need to rightly\nunderstand that there are mechanisms in the world that are only known to\nYahweh. Just like my daughters have no actual understanding of how they became\nmy daughters, or how money shows up in our account every month, or how water\ncomes to our house... These things are beyond their scope of existence to be\nhonest, and there are analogous things that we fully-grown mature adults need\nto recognize are beyond us and are for the Lord, only.\n\nThis is not an excuse or encouragement though to never be sure of a\nconviction... there most certainly are \"revealed things \\[that\\] belong to us\nto know\". So the Christian needs to graciously approach the things we can't run\naway from, but also recognize that our understanding is, by nature of our\nexistence, limited.\n\nThe truth a lot of us wrestle with, and probably not very well, is\n**Soteriology** - the theology of salvation. There are a number of things that\ngo into the mechanism of receiving salvation from the Lord: a regenerated\nheart, faith in Jesus alone, confession, and the process of becomming more like\nJesus (sanctification). However, the **order by which** these things happen has\nbeen a long-debated issue in the Church and has led to a lot of\nChristian-division.\n\nI'm not going to claim to understnad the [orto salutis] but what I can do is\nrecognize a reality in my life, perhaps even somewhat contradictory realties,\nand given that objective truth of those realities I'll have to eventually\nrecognize that the intimate understanding and knowledge of the inner-workings\nof those realities is hidden from me.\n\nIt goes like this - no one can choose Yahweh on their own. We are born into death and decay:\n\n!!! note \"Ephesians 2:1\"\n\n    And you, although you were dead in your trespasses and sins,\n\n!!! note \"Romans 3:23\"\n\n    for all have sinned and fall short of the glory of God,\n\nSo inconvenient truth number 1: you are dead, dead people can't make choices or\ndo anything... but surely \"dead in your tresspasses\" and \"fall short of the\nglory of God\" are just indicators that we can't live a perfectly \"good\" life...\nno?\n\nWell, it won't really matter and here's why:\n\n!!! note \"John 14:6\"\n\n    Jesus said to him, “I am the way, and the truth, and the life. No one comes to the Father except through me.\n\nSo here's the thing - either Jesus is the son of God or he isn't... Simple\nbinary truth. If he's **not** the son of God, then half of this blog is\nworthless and Paul's words that Christians should lbe pitied above all people\nwould never be more true... But if Jesus **is the son of God** and his words\n**are actual truth** then you really need to wrestle with it, if only for a\nsecond... He's either a crazy liar, or literally God. This truth, or the option\nof which of these things are true, are 100% unavoidable for every person to\ndeal with. Like, you have to make a choice - either accept what Jesus says, or\ndon't.\n\nBut that actually brings up the tension - you can't accept it unless Yahweh\ngives you over to Jesus.\n\n!!! note \"John 6:37–40\"\n\n    Everyone whom the Father gives to me will come to me, and the one who comes\n    to me I will never throw out, 38 because I have come down from heaven not that\n    I should do my will, but the will of the one who sent me. 39 Now this is the\n    will of the one who sent me: that everyone whom he has given me, I would not\n    lose any of them, but raise them up on the last day. 40 For this is the will of\n    my Father, that everyone who looks at the Son and believes in him would have\n    eternal life, and I will raise him up on the last day.”\n\nSo... is the one born destined to not believe simply destined for hell? What\nkind of loving God is that?\n\nThe answer there is actually pretty simple - he's a loving father. I wrote a\nlittle bit about this via analogies to my own life as a parent in\n[[advent-2025---love]]. Essentially as a dad, I take my own kids home from the\nplayground every day, not your kids. Likewise, God will redeem his own... It's\nliterally a perfectly reasonable expectation of a dad.\n\n## Hidden vs. Revealed\n\nWhat is for us and what is for God alone then (as we discuss Soteriology)? A\nlot. And in this case I'm not even sure where to draw the line but here is a\nsimple list of truths that **are true** even though I couldn't explain with\nevery nuance - how?\n\n1. I hated God - every unregenerate person does, it is **only natural** to hate\n   what you're opposed to. Being born into sin and death necessarily means you\n   are are opposed to life and godliness.\n2. I now love God - my personal story here is a picture of God's providence -\n   see [[helkyo-what-is-it-for-god-to-draw-man-to-him]]\n3. Yahweh desires for all people to be reconciled (1 Peter)\n4. Not everyone believes in Jesus - which means there are people destined for\n   hell\n\nHere's what I think is hidden...\n\n1. The reasons which God chooses some and not others - thank the Lord this is\n   not for me to know\n2. The mechanism by which my heart is able to make a **free** choice, out of my\n   own agency, not to initially believe in Jesus, but every day to lay my life\n   down before him (as I do or do not live faithfully to him)\n3. What reality of \"hell\" there is to be predestined to... I cannot deny at all\n   that not all people are chosen by God, not all people will enter the\n   Celestial City... But what of the others? I genuinely do not know, but I have a\n   lot of confidence that the fire and torture crowd are missing some stuff.\n\n## Fin\n\nPraise the Lord that there are things beyond us to know... It is comforting to\nknow that Jesus loves me, and I don't need to know much more beyond that. Just\nlike one of my biggest desires is for my daughters to trust me because of my\nlove for them, in the same way is how I find and am comforted by the Lord. If\nyou're reading this and haven't heard him call your name, maybe sit and listen.\nWhen Jesus called Lazarus from the grave, he might've had the choice whether to\nwalk out or not, but he didn't have the choice to not wake-up. If the Lord\nawakens your heart today, may you make the choice to walk out of the grave and\ninto new life.\n",
      "summary": "!!! note \"Deuteronomy 29:29\"",
      "date_published": "2025-12-29T05:47:22Z",
      "date_modified": "2025-12-29T05:47:22Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "deuteronomy",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/prettier-docker-ps-command/",
      "url": "https://pype.dev/prettier-docker-ps-command/",
      "title": "Prettier Docker ‘ps’ Command",
      "content_html": "\u003cp\u003eThe \u003ccode\u003edocker ps\u003c/code\u003e command is very useful, but I hate reading the output. Turns\nout, you can make it prettier:\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003edocker ps\u003c/code\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u0026ndash;format \u0026ldquo;table\u0026rdquo; is implied with the command.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cpre\u003e\u003ccode\u003e\n❯ docker ps --format \u0026quot;table\u0026quot; | grep can\n9b716a7d1ab0   postgres:17                                               \u0026quot;docker-entrypoint.s…\u0026quot;   13 hours ago    Up 13 hours (healthy)            0.0.0.0:5432-\u0026gt;5432/tcp, [::]:5432-\u0026gt;5432/tcp                                                cannalyzer-db-1\nf7708ea0c112   adminer                                                   \u0026quot;entrypoint.sh docke…\u0026quot;   13 hours ago    Up 13 hours                      0.0.0.0:8081-\u0026gt;8080/tcp, [::]:8081-\u0026gt;8080/tcp                                                cannalyzer-adminer-1\n93cd67719ed4   frontend:latest                                           \u0026quot;/docker-entrypoint.…\u0026quot;   13 hours ago    Up 13 hours                      0.0.0.0:5173-\u0026gt;80/tcp, [::]:5173-\u0026gt;80/tcp                                                    cannalyzer-frontend-1\nf517625fca98   traefik:3.0                                               \u0026quot;/entrypoint.sh --pr…\u0026quot;   13 hours ago    Up 13 hours                      0.0.0.0:80-\u0026gt;80/tcp, [::]:80-\u0026gt;80/tcp, 0.0.0.0:8090-\u0026gt;8080/tcp, [::]:8090-\u0026gt;8080/tcp           cannalyzer-proxy-1\nf4daa036216e   schickling/mailcatcher                                    \u0026quot;sh -c 'mailcatcher …\u0026quot;   13 hours ago    Up 13 hours                      0.0.0.0:1025-\u0026gt;1025/tcp, [::]:1025-\u0026gt;1025/tcp, 0.0.0.0:1080-\u0026gt;1080/tcp, [::]:1080-\u0026gt;1080/tcp   cannalyzer-mailcatcher-1\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eBut you can pass a template string to the \u003ccode\u003e--format\u003c/code\u003e option, like so:\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003edocker ps --format \u0026quot;table {{.Names}}\u0026quot;\u003c/code\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e\n✗ docker ps --format \u0026quot;table {{.Names}}\u0026quot; | grep can\ncannalyzer-db-1\ncannalyzer-adminer-1\ncannalyzer-frontend-1\ncannalyzer-proxy-1\ncannalyzer-mailcatcher-1\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003ccode\u003edocker ps --format \u0026quot;table {{.Names}}\\t{{.Status}}\\t{{.Ports}}\u0026quot;\u003c/code\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e\n❯ docker ps --format \u0026quot;table {{.Names}}\\t{{.Ports}}\u0026quot; | grep can\ncannalyzer-db-1             0.0.0.0:5432-\u0026gt;5432/tcp, [::]:5432-\u0026gt;5432/tcp\ncannalyzer-adminer-1        0.0.0.0:8081-\u0026gt;8080/tcp, [::]:8081-\u0026gt;8080/tcp\ncannalyzer-frontend-1       0.0.0.0:5173-\u0026gt;80/tcp, [::]:5173-\u0026gt;80/tcp\ncannalyzer-proxy-1          0.0.0.0:80-\u0026gt;80/tcp, [::]:80-\u0026gt;80/tcp, 0.0.0.0:8090-\u0026gt;8080/tcp, [::]:8090-\u0026gt;8080/tcp\ncannalyzer-mailcatcher-1    0.0.0.0:1025-\u0026gt;1025/tcp, [::]:1025-\u0026gt;1025/tcp, 0.0.0.0:1080-\u0026gt;1080/tcp, [::]:1080-\u0026gt;1080/tcp\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2 id=\"picture\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePicture\u003c/span\u003e \u003ca href=\"#picture\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI noticed my template isn\u0026rsquo;t folding the codeblocks in a way that actually makes this post look like I\u0026rsquo;m lying!\u003c/p\u003e\n\u003cfigure\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20251229122717_67e76a67.png\" alt=\"20251229122717_67e76a67.png\"\u003e\n\u003c/figure\u003e\n",
      "content_text": "\nThe `docker ps` command is very useful, but I hate reading the output. Turns\nout, you can make it prettier:\n\n`docker ps`\n\n\u003e --format \"table\" is implied with the command.\n\n```\n\n❯ docker ps --format \"table\" | grep can\n9b716a7d1ab0   postgres:17                                               \"docker-entrypoint.s…\"   13 hours ago    Up 13 hours (healthy)            0.0.0.0:5432-\u003e5432/tcp, [::]:5432-\u003e5432/tcp                                                cannalyzer-db-1\nf7708ea0c112   adminer                                                   \"entrypoint.sh docke…\"   13 hours ago    Up 13 hours                      0.0.0.0:8081-\u003e8080/tcp, [::]:8081-\u003e8080/tcp                                                cannalyzer-adminer-1\n93cd67719ed4   frontend:latest                                           \"/docker-entrypoint.…\"   13 hours ago    Up 13 hours                      0.0.0.0:5173-\u003e80/tcp, [::]:5173-\u003e80/tcp                                                    cannalyzer-frontend-1\nf517625fca98   traefik:3.0                                               \"/entrypoint.sh --pr…\"   13 hours ago    Up 13 hours                      0.0.0.0:80-\u003e80/tcp, [::]:80-\u003e80/tcp, 0.0.0.0:8090-\u003e8080/tcp, [::]:8090-\u003e8080/tcp           cannalyzer-proxy-1\nf4daa036216e   schickling/mailcatcher                                    \"sh -c 'mailcatcher …\"   13 hours ago    Up 13 hours                      0.0.0.0:1025-\u003e1025/tcp, [::]:1025-\u003e1025/tcp, 0.0.0.0:1080-\u003e1080/tcp, [::]:1080-\u003e1080/tcp   cannalyzer-mailcatcher-1\n```\n\nBut you can pass a template string to the `--format` option, like so:\n\n`docker ps --format \"table {{.Names}}\"`\n\n```\n\n✗ docker ps --format \"table {{.Names}}\" | grep can\ncannalyzer-db-1\ncannalyzer-adminer-1\ncannalyzer-frontend-1\ncannalyzer-proxy-1\ncannalyzer-mailcatcher-1\n```\n\n`docker ps --format \"table {{.Names}}\\t{{.Status}}\\t{{.Ports}}\"`\n\n```\n\n❯ docker ps --format \"table {{.Names}}\\t{{.Ports}}\" | grep can\ncannalyzer-db-1             0.0.0.0:5432-\u003e5432/tcp, [::]:5432-\u003e5432/tcp\ncannalyzer-adminer-1        0.0.0.0:8081-\u003e8080/tcp, [::]:8081-\u003e8080/tcp\ncannalyzer-frontend-1       0.0.0.0:5173-\u003e80/tcp, [::]:5173-\u003e80/tcp\ncannalyzer-proxy-1          0.0.0.0:80-\u003e80/tcp, [::]:80-\u003e80/tcp, 0.0.0.0:8090-\u003e8080/tcp, [::]:8090-\u003e8080/tcp\ncannalyzer-mailcatcher-1    0.0.0.0:1025-\u003e1025/tcp, [::]:1025-\u003e1025/tcp, 0.0.0.0:1080-\u003e1080/tcp, [::]:1080-\u003e1080/tcp\n```\n\n## Picture\n\nI noticed my template isn't folding the codeblocks in a way that actually makes this post look like I'm lying!\n\n![20251229122717_67e76a67.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20251229122717_67e76a67.png)\n",
      "summary": "The command is very useful, but I hate reading the output. Turns out, you can make it prettier:",
      "date_published": "2025-12-29T05:33:05Z",
      "date_modified": "2025-12-29T05:33:05Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "docker",
        "til",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/reflection-galatians-2-19-20/",
      "url": "https://pype.dev/reflection-galatians-2-19-20/",
      "title": "Reflection - Galatians 2:19-20",
      "content_html": "\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eGalatians 2:19-20\u003c/p\u003e\n\u003cp\u003e19 For through the law I died to the law, in order that I might live to\nGod. I have been crucified with Christ, 20 and I no longer live, but Christ\nlives in me, and that life I now live in the flesh, I live by faith in the Son\nof God, who loved me and gave himself for me.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eThis is one of the most common verse-memory verses I think. Probably there\u0026rsquo;s\ngood reason for that - Paul has a lot to say to the Galatians, and these 2\nverses summarize one of the simple truths of the Gospel - the life a Christian\nis given is \u003cstrong\u003efreed from\u003c/strong\u003e the law of death and make alive to Jesus. The gospel\ntruth is that the law is no longer the thing we answer to - everyone will,\ncertainly. There\u0026rsquo;s no mistake to be made that every human has accountability\nfor their own agency. In our \u0026ldquo;free\u0026rdquo; will, bound to sin and death and to the law\nfor approval, we aren\u0026rsquo;t free at all but slaves to an oppressive overlord. Jesus\nfrees the Christian to live a life free from that oppression, in the\nlife-giving security of God\u0026rsquo;s adoption.\u003c/p\u003e\n\u003ch2 id=\"who-love-me-and-gave-himself-for-me\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWho love me and gave himself for me\u003c/span\u003e \u003ca href=\"#who-love-me-and-gave-himself-for-me\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eGod adopts whoever he chooses. And the ones he chooses are then freely able to\nchoose him in return. Through the life-giving power of God\u0026rsquo;s sovereignty my\nlife can be fundamentally altered, my make-up changed, my family line updated.\nI am free to live my life by faith in Jesus, because he loved me and gave\nhimself for me.\u003c/p\u003e\n",
      "content_text": "\n!!! note \"Galatians 2:19-20\"\n\n    19 For through the law I died to the law, in order that I might live to\n    God. I have been crucified with Christ, 20 and I no longer live, but Christ\n    lives in me, and that life I now live in the flesh, I live by faith in the Son\n    of God, who loved me and gave himself for me.\n\nThis is one of the most common verse-memory verses I think. Probably there's\ngood reason for that - Paul has a lot to say to the Galatians, and these 2\nverses summarize one of the simple truths of the Gospel - the life a Christian\nis given is **freed from** the law of death and make alive to Jesus. The gospel\ntruth is that the law is no longer the thing we answer to - everyone will,\ncertainly. There's no mistake to be made that every human has accountability\nfor their own agency. In our \"free\" will, bound to sin and death and to the law\nfor approval, we aren't free at all but slaves to an oppressive overlord. Jesus\nfrees the Christian to live a life free from that oppression, in the\nlife-giving security of God's adoption.\n\n## Who love me and gave himself for me\n\nGod adopts whoever he chooses. And the ones he chooses are then freely able to\nchoose him in return. Through the life-giving power of God's sovereignty my\nlife can be fundamentally altered, my make-up changed, my family line updated.\nI am free to live my life by faith in Jesus, because he loved me and gave\nhimself for me.\n",
      "summary": "!!! note \"Galatians 2:19-20\"",
      "date_published": "2025-12-28T06:18:57Z",
      "date_modified": "2025-12-28T06:18:57Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "reflection",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2025-12-27-notes/",
      "url": "https://pype.dev/2025-12-27-notes/",
      "title": "2025-12-27 Notes",
      "content_text": "\nyesterday: [[2025-12-26-notes]]\n\n## Dev\n\n- cool it on cannalyze and qr-harbor. focus on data model and then use the fastapi-template\n- focus on [[soonish]] and [[mindful]]\n",
      "summary": "yesterday: 2025-12-26-notes",
      "date_published": "2025-12-27T06:43:57Z",
      "date_modified": "2025-12-27T06:43:57Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/2025-12-26-notes/",
      "url": "https://pype.dev/2025-12-26-notes/",
      "title": "2025-12-26 Notes",
      "content_text": "\nyesterday: [[2025-12-24-notes]]\n\n## Dev\n\n- Working on [[cannalyze]] again\n  - opencode with grok is on this\n- QR Harbor!\n  - dynamic qr code hosting\n  - opencode with Opus 4.1 on this\n",
      "summary": "yesterday: 2025-12-24-notes",
      "date_published": "2025-12-26T09:52:38Z",
      "date_modified": "2025-12-26T09:52:38Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/advent-1-john-4-17/",
      "url": "https://pype.dev/advent-1-john-4-17/",
      "title": "Advent - 1 John 4:17",
      "content_html": "\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003e1 John 4:17\u003c/p\u003e\n\u003cp\u003eBy this love is perfected with us, so that we may have confidence in the day of judgment, because just as that one is, so also are we in this world.\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"confidence\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfidence\u003c/span\u003e \u003ca href=\"#confidence\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI\u0026rsquo;ve definitely written about confidence before outside this blog, it\u0026rsquo;s a key\nChristian theme. John mentions here in the middle of a bunch of stuff about\nlove as he is wrapping up this letter.\u003c/p\u003e\n\u003cp\u003eLove is beautiful, and over this Advent season I\u0026rsquo;ve reflected a lot on verse 19\n\u0026ldquo;We love, because he first loved us\u0026rdquo;. Because of God, his original love for you\nand me, his own power and majesty, his own right to rule and reign - because of\nall of that I am to \u0026ldquo;have confidence in the day of judgement\u0026rdquo;. Christmas isn\u0026rsquo;t\nso much about looking forward to a future time, it\u0026rsquo;s remembering that the time\nwe look forward to is already here in part. Jesus has already come, once. He\nbrought heaven to earth and undid much of the curse of separation placed on\nhumans at Eden. It\u0026rsquo;s because he\u0026rsquo;s already done it, because he loved me first,\nthat confidence can follow. No Christian should find themselves concerned about\ntheir position in front of the Lord any more than my daughter should ever be\nconcerned about her status as my daughter. There\u0026rsquo;s nothing she could do to\nseparate herself from my love for her, and there is nothing I can do to\nseparate myself from God\u0026rsquo;s love. In the binding of that love, is confidence for\nsecurity in the future. Not that all my bills are paid and I have a happy life\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ebut that in the ultimate sense, my purpose as an image-bearing Human will be\nfully realized, God\u0026rsquo;s plan fully carried out, in the end. And I don\u0026rsquo;t have to\nworry, because in his love I am secure, just like I hope that in my love my\ndaughters are secure.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eChristians struggle with doubt, and that\u0026rsquo;s not a sin. John would encourage you\nto take hold of being God\u0026rsquo;s child, live that way, and in living like his child,\nhis love is revealed, and as it is revealed and perfected, confidence naturally\nfollows.\u003c/p\u003e\n\u003cp\u003eWe aren\u0026rsquo;t guaranteed much about life, but I have zero valid reasons to doubt\nthe King who saved me and will continue to save me. May Jesus\u0026rsquo; name be great,\nhe is King, amen.\u003c/p\u003e\n",
      "content_text": "\n!!! note \"1 John 4:17\"\n\n    By this love is perfected with us, so that we may have confidence in the day of judgment, because just as that one is, so also are we in this world.\n\n## Confidence\n\nI've definitely written about confidence before outside this blog, it's a key\nChristian theme. John mentions here in the middle of a bunch of stuff about\nlove as he is wrapping up this letter.\n\nLove is beautiful, and over this Advent season I've reflected a lot on verse 19\n\"We love, because he first loved us\". Because of God, his original love for you\nand me, his own power and majesty, his own right to rule and reign - because of\nall of that I am to \"have confidence in the day of judgement\". Christmas isn't\nso much about looking forward to a future time, it's remembering that the time\nwe look forward to is already here in part. Jesus has already come, once. He\nbrought heaven to earth and undid much of the curse of separation placed on\nhumans at Eden. It's because he's already done it, because he loved me first,\nthat confidence can follow. No Christian should find themselves concerned about\ntheir position in front of the Lord any more than my daughter should ever be\nconcerned about her status as my daughter. There's nothing she could do to\nseparate herself from my love for her, and there is nothing I can do to\nseparate myself from God's love. In the binding of that love, is confidence for\nsecurity in the future. Not that all my bills are paid and I have a happy life\n\n- but that in the ultimate sense, my purpose as an image-bearing Human will be\n  fully realized, God's plan fully carried out, in the end. And I don't have to\n  worry, because in his love I am secure, just like I hope that in my love my\n  daughters are secure.\n\nChristians struggle with doubt, and that's not a sin. John would encourage you\nto take hold of being God's child, live that way, and in living like his child,\nhis love is revealed, and as it is revealed and perfected, confidence naturally\nfollows.\n\nWe aren't guaranteed much about life, but I have zero valid reasons to doubt\nthe King who saved me and will continue to save me. May Jesus' name be great,\nhe is King, amen.\n",
      "summary": "!!! note \"1 John 4:17\"",
      "date_published": "2025-12-25T05:36:08Z",
      "date_modified": "2025-12-25T05:36:08Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "advent",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2025-12-24-notes/",
      "url": "https://pype.dev/2025-12-24-notes/",
      "title": "2025-12-24 Notes",
      "content_text": "\nyesterday: [[2025-12-23-notes]]\n\n## Continued work\n\n- sermon editing\n  - thinking about a temporal workflow\n  - how to have an agent work in that workflow?\n- focusing on soonish and mindful for now\n- digital harbor blog section\n\n## Wins\n\n- Update shotput a little bit with an easier copy button for the link\n",
      "summary": "yesterday: 2025-12-23-notes",
      "date_published": "2025-12-24T06:08:16Z",
      "date_modified": "2025-12-24T06:08:16Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/advent-luke-6-35/",
      "url": "https://pype.dev/advent-luke-6-35/",
      "title": "Advent - Luke 6:35",
      "content_html": "\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eLuke 6:35\u003c/p\u003e\n\u003cp\u003eBut love your enemies, and do good, and lend expecting back nothing, and your reward will be great, and you will be sons of the Most High, because he is kind to the ungrateful and wicked.\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"love-your-enemies\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLove Your Enemies\u003c/span\u003e \u003ca href=\"#love-your-enemies\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI was once an enemy of God, and even today still make choices that highlight\nenmity in my heart towards him. It\u0026rsquo;s what\u0026rsquo;s left-over, what will continue to\npersist (though I hope be minimized as much as possible) while waiting for\nHeaven to come to earth. Knowing and recognizing my own position - as a former\nenemy, makes it somewhat easy to read these words to \u0026ldquo;do good\u0026rdquo; and \u0026ldquo;expect nothing\nin return\u0026rdquo; from my enemies because God was good to me, and continues to be. So,\nI am the ungrateful and the wicked that he is kind to.\u003c/p\u003e\n\u003cp\u003eHow do I feel about that? Honestly, grateful but also a little ashamed. I\n\u003cstrong\u003eknow\u003c/strong\u003e who I am, and sometimes I choose to be who I was before. But God still\nloves me and my heart is glad to be in his favor.\u003c/p\u003e\n",
      "content_text": "\n!!! note \"Luke 6:35\"\n\n    But love your enemies, and do good, and lend expecting back nothing, and your reward will be great, and you will be sons of the Most High, because he is kind to the ungrateful and wicked.\n\n## Love Your Enemies\n\nI was once an enemy of God, and even today still make choices that highlight\nenmity in my heart towards him. It's what's left-over, what will continue to\npersist (though I hope be minimized as much as possible) while waiting for\nHeaven to come to earth. Knowing and recognizing my own position - as a former\nenemy, makes it somewhat easy to read these words to \"do good\" and \"expect nothing\nin return\" from my enemies because God was good to me, and continues to be. So,\nI am the ungrateful and the wicked that he is kind to.\n\nHow do I feel about that? Honestly, grateful but also a little ashamed. I\n**know** who I am, and sometimes I choose to be who I was before. But God still\nloves me and my heart is glad to be in his favor.\n",
      "summary": "!!! note \"Luke 6:35\"",
      "date_published": "2025-12-23T05:17:05Z",
      "date_modified": "2025-12-23T05:17:05Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "advent",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2025-12-23-notes/",
      "url": "https://pype.dev/2025-12-23-notes/",
      "title": "2025-12-23 Notes",
      "content_text": "\nyesterday: [[2025-12-20-notes]]\n\n## Continued work\n\n- mcp server for sermon editing\n- quadtask v2 is in the notifiq repo\n- focusing on soonish and mindful for now\n- digital harbor blog section\n\n## Wins\n\n- Update shotput a little bit with an easier copy button for the link\n",
      "summary": "yesterday: 2025-12-20-notes",
      "date_published": "2025-12-23T05:15:21Z",
      "date_modified": "2025-12-23T05:15:21Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/advent-mark-12-29-30/",
      "url": "https://pype.dev/advent-mark-12-29-30/",
      "title": "Advent - Mark 12:29-30",
      "content_html": "\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eMark 12:29-30\u003c/p\u003e\n\u003cp\u003e29 Jesus answered, “The most important is, ‘Listen, Israel! The Lord our God, the Lord is one. 30 And you shall love the Lord your God from your whole heart and from your whole soul and from your whole mind and from your whole strength.’\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"the-most-important-commandment\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThe Most Important Commandment\u003c/span\u003e \u003ca href=\"#the-most-important-commandment\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eDeuteronomy 6:4-5\u003c/p\u003e\n\u003cp\u003e4 “Hear, Israel, Yahweh our God, Yahweh is unique. 5 And you shall love Yahweh your God with all of your heart and with all of your soul and with all of your might.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eJesus quotes the Shema as the most important commandment - not really\nsurprising\u0026hellip; Yahweh\u0026rsquo;s authority and divine kingship is the most important\nreality to affirm. Along with recognizing the authority and Oneness of Yahweh\nis the command the love him. ie. Not loving him is \u003cstrong\u003enot\u003c/strong\u003e recognizing his\nauthority\u0026hellip; Again, not a surprising thing to hear a king say.\u003c/p\u003e\n\u003cp\u003eSo he says the most important thing is to love Yahweh Elohim (the Lord your\nGod) with everything. This calls Paul\u0026rsquo;s words about transformation to mind -\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eRomans 12:1-2\u003c/p\u003e\n\u003cp\u003eTherefore I exhort you, brothers, through the mercies of God, to present your bodies as a living sacrifice, holy and pleasing to God, which is your reasonable service. 2 And do not be conformed to this age, but be transformed by the renewal of your mind, so that you may approve what is the good and well-pleasing and perfect will of God.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003ePaul says that to offer ourselves as a \u003cstrong\u003eliving sacraifice\u003c/strong\u003e (strong language, no?)\nis our \u003cstrong\u003ereasonable service\u003c/strong\u003e\u0026hellip; If we think about Jesus\u0026rsquo; words that the \u003cstrong\u003emost\nimportant commandment\u003c/strong\u003e is to love God with everything, then Paul\u0026rsquo;s words here\nin Romans are honestly just a natural outpouring of that priority - that we are\nto offer \u003cstrong\u003eeverything\u003c/strong\u003e back to him.\u003c/p\u003e\n\u003cp\u003eOne lens through which to view this is simply gratitude\u0026hellip; If you are given\neverything by someone, of course you\u0026rsquo;d seek to show your thanks. Part of the\nhuman experience for the Christian, I think anyways, is the maturing and\nrealization of \u003cstrong\u003ehow much\u003c/strong\u003e God has given, and how much he has saved me from. This\nmaturity leads me to love God more deeply\u0026hellip; It\u0026rsquo;s as if my perspective on what\nhe\u0026rsquo;s done for me grows, so too my love for him grows.\u003c/p\u003e\n\u003cdiv class=\"admonition success\"\u003e\n\u003cp class=\"admonition-title\"\u003eSuccess\u003c/p\u003e\n\u003cp\u003eThe \u0026ldquo;everything\u0026rdquo; I have to offer increases as I become more aware of everything he\u0026rsquo;s given.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003ePraise God for the mercies on my life, the greatest of which is the freedom to\noffer myself to him. In the bonds of sin and shame I\u0026rsquo;m not free to crawl up\nonto the altar as a living sacrifice. But God, in his grace, brought me to\nlife. He animated my body, makes it sacred space, and in the life-giving power\nof Jesus\u0026rsquo; resurrection and the Holy Spirit I should walk myself to the altar\nand lay myself down. The most important command for me is to love him with\neverything, and praise the Lord I am free to do so.\u003c/p\u003e\n",
      "content_text": "\n!!! note \"Mark 12:29-30\"\n\n    29 Jesus answered, “The most important is, ‘Listen, Israel! The Lord our God, the Lord is one. 30 And you shall love the Lord your God from your whole heart and from your whole soul and from your whole mind and from your whole strength.’\n\n## The Most Important Commandment\n\n!!! note \"Deuteronomy 6:4-5\"\n\n    4 “Hear, Israel, Yahweh our God, Yahweh is unique. 5 And you shall love Yahweh your God with all of your heart and with all of your soul and with all of your might.\n\nJesus quotes the Shema as the most important commandment - not really\nsurprising... Yahweh's authority and divine kingship is the most important\nreality to affirm. Along with recognizing the authority and Oneness of Yahweh\nis the command the love him. ie. Not loving him is **not** recognizing his\nauthority... Again, not a surprising thing to hear a king say.\n\nSo he says the most important thing is to love Yahweh Elohim (the Lord your\nGod) with everything. This calls Paul's words about transformation to mind -\n\n!!! note \"Romans 12:1-2\"\n\n    Therefore I exhort you, brothers, through the mercies of God, to present your bodies as a living sacrifice, holy and pleasing to God, which is your reasonable service. 2 And do not be conformed to this age, but be transformed by the renewal of your mind, so that you may approve what is the good and well-pleasing and perfect will of God.\n\nPaul says that to offer ourselves as a **living sacraifice** (strong language, no?)\nis our **reasonable service**... If we think about Jesus' words that the **most\nimportant commandment** is to love God with everything, then Paul's words here\nin Romans are honestly just a natural outpouring of that priority - that we are\nto offer **everything** back to him.\n\nOne lens through which to view this is simply gratitude... If you are given\neverything by someone, of course you'd seek to show your thanks. Part of the\nhuman experience for the Christian, I think anyways, is the maturing and\nrealization of **how much** God has given, and how much he has saved me from. This\nmaturity leads me to love God more deeply... It's as if my perspective on what\nhe's done for me grows, so too my love for him grows.\n\n!!! success \"\"\n\n    The \"everything\" I have to offer increases as I become more aware of everything he's given.\n\nPraise God for the mercies on my life, the greatest of which is the freedom to\noffer myself to him. In the bonds of sin and shame I'm not free to crawl up\nonto the altar as a living sacrifice. But God, in his grace, brought me to\nlife. He animated my body, makes it sacred space, and in the life-giving power\nof Jesus' resurrection and the Holy Spirit I should walk myself to the altar\nand lay myself down. The most important command for me is to love him with\neverything, and praise the Lord I am free to do so.\n",
      "summary": "!!! note \"Mark 12:29-30\"",
      "date_published": "2025-12-21T05:41:55Z",
      "date_modified": "2025-12-21T05:41:55Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "advent",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/advent-romans-15-13/",
      "url": "https://pype.dev/advent-romans-15-13/",
      "title": "Advent - Romans 15:13",
      "content_html": "\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eRomans 15:13\u003c/p\u003e\n\u003cp\u003eNow may the God of hope fill you with all joy and peace in believing, so that you may abound in hope by the power of the Holy Spirit.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eThe last 3 weeks of Advent are summarized right here in verse 13. Yahweh is the\nGod of hope, of expectation, he brings Joy through redemption, and Peace to the\nbeliever through faith. That Joy and Peace lead us to \u0026ldquo;abound in hope\u0026rdquo;\nourselves, by the power of the Holy Spirit.\u003c/p\u003e\n\u003cp\u003eWhat a dense sentence\u0026hellip;\u003c/p\u003e\n\u003cp\u003eThe last several days and months have been heavy, and praise God for Christmas\nand Advent right now, which is daily reorienting my eyes to Jesus. I\u0026rsquo;m waking\nup everyday thinking about work, the next thing to do, my next project,\nretirement, why am I so sweaty in the morning?\u0026hellip; But after a few deep breaths,\neventually making my way to my desk with a cup of coffee and a sense of\ndirection to start my day, I\u0026rsquo;ve been sitting down and reflecting not just on\nsome random passage from a devotional, but through this Advent season\nregularly, daily, reflecting on the core themes. By God\u0026rsquo;s grace this has been a\ngreat gift to me, and without this daily (or mostly daily) reorientation, I am\nsure the stress I do still feel would be multiplied by orders of magnitude.\u003c/p\u003e\n\u003cp\u003eWe light the Love candle tomorrow, but today is good for me to wrap up the last\n3 weeks with this simple verse. I know God loves me, this next week of\nreflection I look forward to what he shares with me. And today the Word of God\nreminds me that hope, joy, and peace are apart of God\u0026rsquo;s design for our lives.\nThose things are found and fulfilled in the Person and Work of Jesus. He then\nleft us the helper, the Holy Spirit, to carry us forward while we wait for his\nreturn. Today, it\u0026rsquo;s in the Spirit\u0026rsquo;s power that God\u0026rsquo;s hope may overflow our\nhearts, and if we\u0026hellip; if I am overflowing with hope and love and peace in Jesus,\nthen I sure hope more that the \u0026ldquo;Christmas Cheer\u0026rdquo; God gives to me does a\npartnering work in bringing Heaven to earth while we expectantly wait for the\nreturn of the King.\u003c/p\u003e\n",
      "content_text": "\n!!! note \"Romans 15:13\"\n\n    Now may the God of hope fill you with all joy and peace in believing, so that you may abound in hope by the power of the Holy Spirit.\n\nThe last 3 weeks of Advent are summarized right here in verse 13. Yahweh is the\nGod of hope, of expectation, he brings Joy through redemption, and Peace to the\nbeliever through faith. That Joy and Peace lead us to \"abound in hope\"\nourselves, by the power of the Holy Spirit.\n\nWhat a dense sentence...\n\nThe last several days and months have been heavy, and praise God for Christmas\nand Advent right now, which is daily reorienting my eyes to Jesus. I'm waking\nup everyday thinking about work, the next thing to do, my next project,\nretirement, why am I so sweaty in the morning?... But after a few deep breaths,\neventually making my way to my desk with a cup of coffee and a sense of\ndirection to start my day, I've been sitting down and reflecting not just on\nsome random passage from a devotional, but through this Advent season\nregularly, daily, reflecting on the core themes. By God's grace this has been a\ngreat gift to me, and without this daily (or mostly daily) reorientation, I am\nsure the stress I do still feel would be multiplied by orders of magnitude.\n\nWe light the Love candle tomorrow, but today is good for me to wrap up the last\n3 weeks with this simple verse. I know God loves me, this next week of\nreflection I look forward to what he shares with me. And today the Word of God\nreminds me that hope, joy, and peace are apart of God's design for our lives.\nThose things are found and fulfilled in the Person and Work of Jesus. He then\nleft us the helper, the Holy Spirit, to carry us forward while we wait for his\nreturn. Today, it's in the Spirit's power that God's hope may overflow our\nhearts, and if we... if I am overflowing with hope and love and peace in Jesus,\nthen I sure hope more that the \"Christmas Cheer\" God gives to me does a\npartnering work in bringing Heaven to earth while we expectantly wait for the\nreturn of the King.\n",
      "summary": "!!! note \"Romans 15:13\"",
      "date_published": "2025-12-20T05:36:26Z",
      "date_modified": "2025-12-20T05:36:26Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "advent",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2025-12-20-notes/",
      "url": "https://pype.dev/2025-12-20-notes/",
      "title": "2025-12-20 Notes",
      "content_text": "\nyesterday: [[2025-12-19-notes]]\n\n## Today\n\n- started another mcp server with opencode for sermon editing with church... feels so simple that an agent should be able to do it\n- opencode also implementing quadtask v2 as a notifiq app\n\n## Bugs\n\n- zensical builds are broken in forgejo, maybe it's the runner image I'm using so might need to update it?\n  - having an image at home with just, zensical, uv, etc. built in already would be appropriate\n",
      "summary": "yesterday: 2025-12-19-notes",
      "date_published": "2025-12-20T05:34:47Z",
      "date_modified": "2025-12-20T05:34:47Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/2025-12-19-notes/",
      "url": "https://pype.dev/2025-12-19-notes/",
      "title": "2025-12-19 Notes",
      "content_text": "\nyesterday: [[2025-12-18-notes]]\n\n## TODO\n\n- santa tracker in home assistant\n  - [github repo](https://github.com/chrisefrost/HomeAssistant-Santa-Tracker)\n- Consider the [Pushover Docs](https://support.pushover.net/i8-how-much-does-pushover-cost-is-there-a-subscription) for inspiration on notifiq docs as well\n\nProgress on notifiq today in the ways of adding more notification channel\nproviders. Also working on user onboarding docs - there are many perspectives\nto consider.\n\nOpencode absolutely nailing my cloudflare-terraform stuff today, these modules\nare getting clean and I'll plan to blog about it once it's done.\n\n- it got stuck with worker proxy stuff, understandable since it requires cloudflare domain knowledge\n- josh's site redirects still, it isn't his url so I still need to fix that\n\n- put together a [santa tracker](https://git.paynepride.com/nic/santa-tracker) today\n\n## BUGS\n\n- repoflow bug... when my library is set to private, I can login and push from forgejo with my bot account. if I make the library public, then the push fails from forgejo with 401\n",
      "summary": "yesterday: 2025-12-18-notes",
      "date_published": "2025-12-19T08:03:54Z",
      "date_modified": "2025-12-19T08:03:54Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/advent-matthew-5-11-12/",
      "url": "https://pype.dev/advent-matthew-5-11-12/",
      "title": "Advent - Matthew 5:11-12",
      "content_html": "\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eMatthew 5:11-12\u003c/p\u003e\n\u003cp\u003e11 Blessed are you  when they insult you and persecute you and say all kinds of evil things against you, lying on account of me. 12 Rejoice and be glad, because your reward is great in heaven, for in the same way they persecuted the prophets before you.\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"context\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eContext\u003c/span\u003e \u003ca href=\"#context\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eTo drop some context that I\u0026rsquo;m familiar with, this is from a famous section of\nJesus\u0026rsquo; \u0026ldquo;Sermon on the Mount\u0026rdquo; called \u0026ldquo;The Beatitudes\u0026rdquo;. A little unknown fact in\na lot of Christian circles is that these phrases from Matthew 5:3-12 are\nderived from some ancient Jewish wisdom (esus didn\u0026rsquo;t come up with these on the\nfly). Most of these saying come from something called \u0026ldquo;The Book of Wisdom\u0026rdquo;\nand they had a history of being used as a way of defining who was close to God\nand who wasn\u0026rsquo;t. Jesus takes the ancient and perverted pseudo-wisdom here and\nturns it on its head. He\u0026rsquo;s not giving instructions, he\u0026rsquo;s giving correction to\npeople who have been abused by civic and religious powers at be.\u003c/p\u003e\n\u003ch2 id=\"reflection\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eReflection\u003c/span\u003e \u003ca href=\"#reflection\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eSo I know Jesus is not saying I should go out and pursue persecution and\nslander. Nor is he saying that just because someone might be mean to me for my\nfaith, that I\u0026rsquo;m practicing my faith in an appropriate way.\u003c/p\u003e\n\u003cp\u003eBut what Jesus is doing is acknowledging that the world fundamentally does\nreject him. Ultimately, at a level more foundational than the atoms that make\nup the universe, creation is broken right now. It\u0026rsquo;s being redeemed, but it\u0026rsquo;s\nalso broken. In its broken state, like a body that is sick, it might reject\nthings that are good for it.\u003c/p\u003e\n\u003cp\u003eHumans are apart of creation, humans are apart of what is broken, and humans,\nin our brokenness, reject ultimate goodness by our very broken nature. Jesus\nsays that when the world persecutes us because of him, it\u0026rsquo;s a simple truth made\nmanifest\u0026hellip; The broken world continues to reject Jesus, and as you or I are\nbrought further into the fold of God\u0026rsquo;s family, then those outside, those still under\nthe crushing, oppressive thumb of sin and death, can not\nhelp but carry out their natural inclination against that which is good. It is\nquite literally only natural.\u003c/p\u003e\n\u003cp\u003eSo should I find myself offended when someone naturally rejects me on account\nof Jesus\u0026rsquo; presence in my life? I think I should instead almost pity them, and\npray that Jesus calls their name too.\u003c/p\u003e\n",
      "content_text": "\n!!! note \"Matthew 5:11-12\"\n\n    11 Blessed are you  when they insult you and persecute you and say all kinds of evil things against you, lying on account of me. 12 Rejoice and be glad, because your reward is great in heaven, for in the same way they persecuted the prophets before you.\n\n## Context\n\nTo drop some context that I'm familiar with, this is from a famous section of\nJesus' \"Sermon on the Mount\" called \"The Beatitudes\". A little unknown fact in\na lot of Christian circles is that these phrases from Matthew 5:3-12 are\nderived from some ancient Jewish wisdom (esus didn't come up with these on the\nfly). Most of these saying come from something called \"The Book of Wisdom\"\nand they had a history of being used as a way of defining who was close to God\nand who wasn't. Jesus takes the ancient and perverted pseudo-wisdom here and\nturns it on its head. He's not giving instructions, he's giving correction to\npeople who have been abused by civic and religious powers at be.\n\n## Reflection\n\nSo I know Jesus is not saying I should go out and pursue persecution and\nslander. Nor is he saying that just because someone might be mean to me for my\nfaith, that I'm practicing my faith in an appropriate way.\n\nBut what Jesus is doing is acknowledging that the world fundamentally does\nreject him. Ultimately, at a level more foundational than the atoms that make\nup the universe, creation is broken right now. It's being redeemed, but it's\nalso broken. In its broken state, like a body that is sick, it might reject\nthings that are good for it.\n\nHumans are apart of creation, humans are apart of what is broken, and humans,\nin our brokenness, reject ultimate goodness by our very broken nature. Jesus\nsays that when the world persecutes us because of him, it's a simple truth made\nmanifest... The broken world continues to reject Jesus, and as you or I are\nbrought further into the fold of God's family, then those outside, those still under\nthe crushing, oppressive thumb of sin and death, can not\nhelp but carry out their natural inclination against that which is good. It is\nquite literally only natural.\n\nSo should I find myself offended when someone naturally rejects me on account\nof Jesus' presence in my life? I think I should instead almost pity them, and\npray that Jesus calls their name too.\n",
      "summary": "!!! note \"Matthew 5:11-12\"",
      "date_published": "2025-12-18T05:08:56Z",
      "date_modified": "2025-12-18T05:08:56Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "advent",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2025-12-18-notes/",
      "url": "https://pype.dev/2025-12-18-notes/",
      "title": "2025-12-18 Notes",
      "content_text": "\nyesterday: [[2025-12-15-notes]]\n\n- trying opencode today to generate a Linux MCP server so I can get some simple LLM-driven insights into a few things on my servers\n\n## WINS\n\nToday was huge for personal stuff, opencode is a beast even in the free `Big Pickle` + `Zen` offering. Windsurf with Opus-4-5 is doing well also\n\n- Revamped the theme of [pype.dev](https://pype.dev)\n- Rebuilt [Digital Harbor](https://mydigitalharbor.com)\n  - including link pages\n- Cleaned up and modularized a ton of terraform for my domains:\n  - paynepride.com\n  - pype.dev\n  - 1man1.band and 1man1band.com\n  - notifiq.net\n\n## For Tomorrow\n\n- josh's page needs his picture fixed\n- josh's domains are broken... need to figure out a cloudflare solution or else a duplicate build\n- notifiq docs and user onboarding should be focus - try gpt 5.2\n",
      "summary": "yesterday: 2025-12-15-notes",
      "date_published": "2025-12-18T05:07:45Z",
      "date_modified": "2025-12-18T05:07:45Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/advent-john-15-10-11/",
      "url": "https://pype.dev/advent-john-15-10-11/",
      "title": "Advent - John 15:10-11",
      "content_html": "\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eJohn 15:10-11\u003c/p\u003e\n\u003cp\u003e10 If you keep my commandments, you will remain in my love, just as I have kept my Father’s commandments and remain in his love. 11 I have spoken these things to you in order that my joy may be in you, and your joy may be made complete.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eThis is a beautiful couple verses about love that have only made more and more\nsense to me as I get older and I have become a dad.\u003c/p\u003e\n\u003cp\u003eCommandments are not necessarily about \u003cem\u003econtrol\u003c/em\u003e. I see this illogical line of thinking\nEVERYWHERE - that advocating for rules and boundaries in life can quickly get\nconflated with \u0026ldquo;you want to control me/them!\u0026rdquo;. I think the general population really\nfails to understand that the lack of boundaries doesn\u0026rsquo;t make you free, it turns\nyou into a slave of your most powerful desire. It is literally in the human-nature.\u003c/p\u003e\n\u003cp\u003eRandom boundaries though are not helpful or loving\u0026hellip; Restriction without\npurpose, or for \u003cem\u003ethe wrong\u003c/em\u003e reason, can put you into a situation you weren\u0026rsquo;t\ndesigned to be in. I believe humans were created according to a design, and\nlike anything else with a purpose there are appropriate ways and places to\nlive, be, act, etc. as well as inappropriate ways and places. The\nappropriatedness can only be determined by the one who knows the design\nthough\u0026hellip;. otherwise someone is just guessing what the purposeful boundary or\nrestriction is.\u003c/p\u003e\n\u003cp\u003eIn the case of our own reality, the architect of the universe is Jesus himself,\nand in his divine knowledge of all of Creation he gives commandments\n(boundaries and regulations) that are in \u003cstrong\u003eperfect alignment with our design\nand purpose\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eFrom here it sounds so simple\u0026hellip; The commandments from the Lord come from an\nunderstanding of what is \u003cstrong\u003eactually best for the human life\u003c/strong\u003e. Because Jesus\n\u003cstrong\u003eactually knows better than you or me\u003c/strong\u003e when we are in line with his\ncommandments, when we \u0026ldquo;remain in [his] love\u0026rdquo;, we are more in-line with our\ncreated purpose than when we think we know better for ourselves. It\u0026rsquo;s\npractically a law of nature that things work best when used for their created\npurpose, and in the human-design I think it\u0026rsquo;s no different. Jesus offers the\nframework for the fulfilled human life - it\u0026rsquo;s not attainable without the\nfreedom to love him, but for the chosen - his joy follows love and freedom.\u003c/p\u003e\n\u003cdiv class=\"admonition danger\"\u003e\n\u003cp class=\"admonition-title\"\u003eFor who?\u003c/p\u003e\n\u003cp\u003eThe life of freedom is only fully possible for whoever Jesus picks. Without\nhim awakening your heart to love what is truely lovely and hate what is truely\ndespicable then you\u0026rsquo;ll never want anything that he offers. The\nunderstanding of \u0026ldquo;his way is better\u0026rdquo; is only possible in the mind and heart of\nthe person whom Jesus raises to life out of the chaotic ocean of death.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eToday God gives me the freedom to keep his commandments. I\u0026rsquo;ll make my choice\nmoment by moment and pray continuously that he sustains my trust in him - to\nignore my dead-self\u0026rsquo;s desires and instead to keep the commandments of the Lord\nso that my joy may be made complete\u003c/p\u003e\n",
      "content_text": "\n!!! note \"John 15:10-11\"\n\n    10 If you keep my commandments, you will remain in my love, just as I have kept my Father’s commandments and remain in his love. 11 I have spoken these things to you in order that my joy may be in you, and your joy may be made complete.\n\nThis is a beautiful couple verses about love that have only made more and more\nsense to me as I get older and I have become a dad.\n\nCommandments are not necessarily about _control_. I see this illogical line of thinking\nEVERYWHERE - that advocating for rules and boundaries in life can quickly get\nconflated with \"you want to control me/them!\". I think the general population really\nfails to understand that the lack of boundaries doesn't make you free, it turns\nyou into a slave of your most powerful desire. It is literally in the human-nature.\n\nRandom boundaries though are not helpful or loving... Restriction without\npurpose, or for _the wrong_ reason, can put you into a situation you weren't\ndesigned to be in. I believe humans were created according to a design, and\nlike anything else with a purpose there are appropriate ways and places to\nlive, be, act, etc. as well as inappropriate ways and places. The\nappropriatedness can only be determined by the one who knows the design\nthough.... otherwise someone is just guessing what the purposeful boundary or\nrestriction is.\n\nIn the case of our own reality, the architect of the universe is Jesus himself,\nand in his divine knowledge of all of Creation he gives commandments\n(boundaries and regulations) that are in **perfect alignment with our design\nand purpose**\n\nFrom here it sounds so simple... The commandments from the Lord come from an\nunderstanding of what is **actually best for the human life**. Because Jesus\n**actually knows better than you or me** when we are in line with his\ncommandments, when we \"remain in [his] love\", we are more in-line with our\ncreated purpose than when we think we know better for ourselves. It's\npractically a law of nature that things work best when used for their created\npurpose, and in the human-design I think it's no different. Jesus offers the\nframework for the fulfilled human life - it's not attainable without the\nfreedom to love him, but for the chosen - his joy follows love and freedom.\n\n!!! danger \"For who?\"\n\n    The life of freedom is only fully possible for whoever Jesus picks. Without\n    him awakening your heart to love what is truely lovely and hate what is truely\n    despicable then you'll never want anything that he offers. The\n    understanding of \"his way is better\" is only possible in the mind and heart of\n    the person whom Jesus raises to life out of the chaotic ocean of death.\n\nToday God gives me the freedom to keep his commandments. I'll make my choice\nmoment by moment and pray continuously that he sustains my trust in him - to\nignore my dead-self's desires and instead to keep the commandments of the Lord\nso that my joy may be made complete\n",
      "summary": "!!! note \"John 15:10-11\"",
      "date_published": "2025-12-17T05:39:34Z",
      "date_modified": "2025-12-17T05:39:34Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "advent",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/advent-luke-2-10-11/",
      "url": "https://pype.dev/advent-luke-2-10-11/",
      "title": "Advent - Luke 2:10-11",
      "content_html": "\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eLuke 2:10-11\u003c/p\u003e\n\u003cp\u003e10 And the angel said to them, “Do not be afraid, for behold, I bring good news to you of great joy which will be for all the people: 11 that today a Savior, who is Christ the Lord, was born for you in the city of David.\u003c/p\u003e\n\u003c/div\u003e\n",
      "content_text": "\n!!! note \"Luke 2:10-11\"\n\n    10 And the angel said to them, “Do not be afraid, for behold, I bring good news to you of great joy which will be for all the people: 11 that today a Savior, who is Christ the Lord, was born for you in the city of David.\n",
      "summary": "!!! note \"Luke 2:10-11\"",
      "date_published": "2025-12-16T04:55:33Z",
      "date_modified": "2025-12-16T04:55:33Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "advent",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2025-12-15-notes/",
      "url": "https://pype.dev/2025-12-15-notes/",
      "title": "2025-12-15 Notes",
      "content_text": "\nyesterday: [[2025-12-14-notes]]\n\n## Printing Today\n\n- shelf/bracket for basement camera (1 hr)\n- GB pieces (9 hrs)\n",
      "summary": "yesterday: 2025-12-14-notes",
      "date_published": "2025-12-15T05:43:57Z",
      "date_modified": "2025-12-15T05:43:57Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/advent-isaiah-51-3/",
      "url": "https://pype.dev/advent-isaiah-51-3/",
      "title": "Advent - Isaiah 51:3",
      "content_html": "\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eIsaiah 51:1-3\u003c/p\u003e\n\u003cp\u003e1 “Listen to me, you who pursue righteousness,  who seek Yahweh.  Look to\nthe rock from which you were hewn,  and to the excavation of the pit from which\nyou were quarried.\n2 Look to Abraham your father,  and to Sarah; she brought\nyou forth.  For I called him alone,  but I blessed him and made him numerous.”\n3 For Yahweh will comfort Zion;  he will comfort all its sites of ruins.  And\nhe will make its wilderness like Eden,  and its desert like the garden of\nYahweh.  Joy and gladness will be found in it,  thanksgiving and the sound of\nsong.\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"joy-in-the-father\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eJoy in the Father\u003c/span\u003e \u003ca href=\"#joy-in-the-father\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eOn the heels of yesterday, I\u0026rsquo;m still struggling with Joy, but here in Isaiah\nsome context aligns Joy with Gladness (which feels very much in-line with my\nassociation of Gratitude with Happiness).\u003c/p\u003e\n\u003cp\u003eSo where will joy and gladness be found? It sounds to me like \u0026ldquo;Zion\u0026rdquo;. Zion is\nthe Mountain of God. In the ANE gods lived on high mountain tops with lush\ngardens. Think of the cartoon example of Hercules with the pantheon up on\nOlympus.\u003c/p\u003e\n\u003cp\u003eZion is also the people of God - even today we sometimes use national or ethnic\ntitles to refer to the people of that area. National leaders may address the\ncitizens of America by saying \u0026ldquo;Listen to me, America\u0026rdquo; or something like that -\nI think my point is that we\u0026rsquo;d all \u0026ldquo;get it\u0026rdquo; in that moment. In a similar way,\nthat communication shouldn\u0026rsquo;t be lost on us here.\u003c/p\u003e\n\u003cp\u003eThe prophet is speaking to \u0026ldquo;you who pursue righteousness, who seek Yahweh\u0026hellip;\nYahweh will comfort Zion (you)\u0026hellip;\u0026rdquo;. In that comfort is 2 things from this\npassage: Election and Legacy.\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eElection\u003c/p\u003e\n\u003cp\u003e\u0026ldquo;Look to the rock from which you were hewn\u0026hellip;\u0026rdquo;. Does the rock decide which\npieces are chiseled away and which pieces remain? Of course not, the sculptor\nor foreman does that. In, honestly, the same way - who am I to have chosen God\non my own\u0026hellip; Without his hand coming to the rock to separate me (any anyone\nelse in the Lord) I would forever remain stagnant in my cold, hard, dead state.\nBut Yahweh chooses - and what can follow his choice to hewn me from the rock?\nWhy, it\u0026rsquo;s nothing but Joy and Gladness!\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eLegacy\u003c/p\u003e\n\u003cp\u003e\u0026ldquo;Look to Abraham your father, and to Sarah; she brought you forth\u0026rdquo;. God\u0026rsquo;s\npeople have a long legacy, a real legacy, to look back on and be encouraged by\nGod\u0026rsquo;s faithfulness in his election. The legacy isn\u0026rsquo;t just back to \u0026ldquo;Father\nAbraham\u0026rdquo;, my mind goes to my own life and now that I have some years under my\nbelt I can look back and see time and time again where God showed his love for\nme in extraordinary ways. I do hope it isn\u0026rsquo;t the physical blessings that he\ngives that bring me joy, but rather that it is the unending history of\nfaithfulness to me as his child.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eJoy is found in Zion because it is where Yahweh lives, and joy and gladness are\nfound in fullness in him alone. His comfort today is realized in his word and\nlegacy of faithfulness, and his comfort tomorrow will be realized by Jesus'\nreturn and the consummation of the Kingdom of God.\u003c/p\u003e\n\u003cp\u003eWork is hard, life is unfair, sickness will continue but at the appointed time,\nwhen Yahweh \u0026ldquo;make[s] [Zion\u0026rsquo;s] wilderness like Eden\u0026rdquo; there will be joy,\ngladness, thanksgiving, and the sound of song.\u003c/p\u003e\n",
      "content_text": "\n!!! note \"Isaiah 51:1-3\"\n\n    1 “Listen to me, you who pursue righteousness,  who seek Yahweh.  Look to\n    the rock from which you were hewn,  and to the excavation of the pit from which\n    you were quarried.\n    2 Look to Abraham your father,  and to Sarah; she brought\n    you forth.  For I called him alone,  but I blessed him and made him numerous.”\n    3 For Yahweh will comfort Zion;  he will comfort all its sites of ruins.  And\n    he will make its wilderness like Eden,  and its desert like the garden of\n    Yahweh.  Joy and gladness will be found in it,  thanksgiving and the sound of\n    song.\n\n## Joy in the Father\n\nOn the heels of yesterday, I'm still struggling with Joy, but here in Isaiah\nsome context aligns Joy with Gladness (which feels very much in-line with my\nassociation of Gratitude with Happiness).\n\nSo where will joy and gladness be found? It sounds to me like \"Zion\". Zion is\nthe Mountain of God. In the ANE gods lived on high mountain tops with lush\ngardens. Think of the cartoon example of Hercules with the pantheon up on\nOlympus.\n\nZion is also the people of God - even today we sometimes use national or ethnic\ntitles to refer to the people of that area. National leaders may address the\ncitizens of America by saying \"Listen to me, America\" or something like that -\nI think my point is that we'd all \"get it\" in that moment. In a similar way,\nthat communication shouldn't be lost on us here.\n\nThe prophet is speaking to \"you who pursue righteousness, who seek Yahweh...\nYahweh will comfort Zion (you)...\". In that comfort is 2 things from this\npassage: Election and Legacy.\n\n!!! note \"Election\"\n\n    \"Look to the rock from which you were hewn...\". Does the rock decide which\n    pieces are chiseled away and which pieces remain? Of course not, the sculptor\n    or foreman does that. In, honestly, the same way - who am I to have chosen God\n    on my own... Without his hand coming to the rock to separate me (any anyone\n    else in the Lord) I would forever remain stagnant in my cold, hard, dead state.\n    But Yahweh chooses - and what can follow his choice to hewn me from the rock?\n    Why, it's nothing but Joy and Gladness!\n\n!!! note \"Legacy\"\n\n    \"Look to Abraham your father, and to Sarah; she brought you forth\". God's\n    people have a long legacy, a real legacy, to look back on and be encouraged by\n    God's faithfulness in his election. The legacy isn't just back to \"Father\n    Abraham\", my mind goes to my own life and now that I have some years under my\n    belt I can look back and see time and time again where God showed his love for\n    me in extraordinary ways. I do hope it isn't the physical blessings that he\n    gives that bring me joy, but rather that it is the unending history of\n    faithfulness to me as his child.\n\nJoy is found in Zion because it is where Yahweh lives, and joy and gladness are\nfound in fullness in him alone. His comfort today is realized in his word and\nlegacy of faithfulness, and his comfort tomorrow will be realized by Jesus'\nreturn and the consummation of the Kingdom of God.\n\nWork is hard, life is unfair, sickness will continue but at the appointed time,\nwhen Yahweh \"make[s] [Zion's] wilderness like Eden\" there will be joy,\ngladness, thanksgiving, and the sound of song.\n",
      "summary": "!!! note \"Isaiah 51:1-3\"",
      "date_published": "2025-12-15T05:40:47Z",
      "date_modified": "2025-12-15T05:40:47Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "advent",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2025-12-14-notes/",
      "url": "https://pype.dev/2025-12-14-notes/",
      "title": "2025-12-14 Notes",
      "content_text": "\nyesterday: [[2025-12-12-notes]]\n\n- Been a rough couple days with sick wife, sick me, young kids, and life doesn't stop...\n- I am cleaning up Digital Harbor infrastructure\n  - there was stuff in spacelift, mostly gone\n  - wrangler was in GH Actions, going to build the site in forgejo and push to GH and let Cloudflrae do it from there just like pype.dev\n  - I need to dedicate an hour or 2 to the terraform stuff...\n    - cloudflare pages + config\n    - namecheap DNS\n    - cloudflare tunnel\n    - cloudflare DNS\n    - I've had a couple bespoke modules that are hot garbage, I think I can have one stack instead of one per domain... need to explore that\n",
      "summary": "yesterday: 2025-12-12-notes",
      "date_published": "2025-12-14T19:23:33Z",
      "date_modified": "2025-12-14T19:23:33Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/advent-psalm-105-43/",
      "url": "https://pype.dev/advent-psalm-105-43/",
      "title": "Advent - Psalm 105:43",
      "content_html": "\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003ePsalm 105:43\u003c/p\u003e\n\u003cp\u003eAnd so he brought out his people with joy,  his chosen ones with rejoicing.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eJoy is a toughy right now if I\u0026rsquo;m honest\u0026hellip; Today marks the 3rd week of Advent,\ntoday we light the Joy candle. But honestly, joy is one that\u0026rsquo;s not just tough\nnow, it\u0026rsquo;s a hard thing for me in general\u0026hellip; \u0026ldquo;Hope\u0026rdquo; I feel like I get, I long for\nthe consummation of Heaven. \u0026ldquo;Peace\u0026rdquo; is another one that I can\u0026rsquo;t say I experience\nall the time, but I know what it is, and I have felt, and do feel, \u0026ldquo;peace\u0026rdquo; to\ndivine degrees at times. Joy though\u0026hellip; I\u0026rsquo;m an excitable person, I\u0026rsquo;m passionate\nabout the things I\u0026rsquo;m passionate about, but \u0026ldquo;joy\u0026rdquo; isn\u0026rsquo;t an emotion or\nstate-of-being that I feel very familiar with.\u003c/p\u003e\n\u003cp\u003eIt\u0026rsquo;s probably not correct to use the word \u0026ldquo;emotion\u0026rdquo; for the Advent-pillar of\n\u003ccode\u003eJoy\u003c/code\u003e, but it doesn\u0026rsquo;t feel wholly inappropriate either\u0026hellip; I think of \u0026lsquo;joy\u0026rsquo; as\nan outward response to a thing, and if I were to be pressed to think about what\n\u0026ldquo;inward-joy\u0026rdquo; might be, I think I\u0026rsquo;d default to how I understand \u0026ldquo;peace\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003eJoy, though, can\u0026rsquo;t only be outward, there must be something internal\u0026hellip; \u0026ldquo;Peace\u0026rdquo;\nreminds me of feelings like calm and serenity to me, but \u0026ldquo;joy\u0026rdquo; reminds me of\nfeelings of happiness and gratitude\u0026hellip; Maybe that\u0026rsquo;s where joy becomes almost a\nvirtue - happiness accompanied with gratitude.\u003c/p\u003e\n\u003cp\u003eI suppose with that springboard, I feel great joy when I\u0026rsquo;m with close friends,\nexperiencing community with people who really know me. I don\u0026rsquo;t know what it\nsays about me that the most recent time of excessive \u0026ldquo;joy\u0026rdquo; I can remember was\nfrom a weekend-getaway trip to the Dells with our best friends back in\nJanuary\u0026hellip; We don\u0026rsquo;t get to see Michael and Kathryn (+ the kiddos!) very often.\nBy God\u0026rsquo;s grace on their lives, we are 1 of many close family-friends to\nthem. By God\u0026rsquo;s same grace on our lives, they are 1 of a \u003cstrong\u003every few\u003c/strong\u003e close\nfamily-friends to us, and so when we do get to see them and plan a few days\ntogether every couple of years, it warms my heart so much that if we booked the\nnext trip this morning I\u0026rsquo;d forget about being sick and how cold it is outside\n(wind chill -29F).\u003c/p\u003e\n\u003cp\u003eThings for me right this very second are not incredibly joyful, but all things\nconsidered it\u0026rsquo;s impossible to not find peace in the provision of Yahweh in my\nlife. I\u0026rsquo;m thankful for when joy enters my being and I get to experience it, I\npray Jesus broadens my heart and mind this week during the reflections on Joy\nfor the sake my own righteousness.\u003c/p\u003e\n",
      "content_text": "\n!!! note \"Psalm 105:43\"\n\n    And so he brought out his people with joy,  his chosen ones with rejoicing.\n\nJoy is a toughy right now if I'm honest... Today marks the 3rd week of Advent,\ntoday we light the Joy candle. But honestly, joy is one that's not just tough\nnow, it's a hard thing for me in general... \"Hope\" I feel like I get, I long for\nthe consummation of Heaven. \"Peace\" is another one that I can't say I experience\nall the time, but I know what it is, and I have felt, and do feel, \"peace\" to\ndivine degrees at times. Joy though... I'm an excitable person, I'm passionate\nabout the things I'm passionate about, but \"joy\" isn't an emotion or\nstate-of-being that I feel very familiar with.\n\nIt's probably not correct to use the word \"emotion\" for the Advent-pillar of\n`Joy`, but it doesn't feel wholly inappropriate either... I think of 'joy' as\nan outward response to a thing, and if I were to be pressed to think about what\n\"inward-joy\" might be, I think I'd default to how I understand \"peace\".\n\nJoy, though, can't only be outward, there must be something internal... \"Peace\"\nreminds me of feelings like calm and serenity to me, but \"joy\" reminds me of\nfeelings of happiness and gratitude... Maybe that's where joy becomes almost a\nvirtue - happiness accompanied with gratitude.\n\nI suppose with that springboard, I feel great joy when I'm with close friends,\nexperiencing community with people who really know me. I don't know what it\nsays about me that the most recent time of excessive \"joy\" I can remember was\nfrom a weekend-getaway trip to the Dells with our best friends back in\nJanuary... We don't get to see Michael and Kathryn (+ the kiddos!) very often.\nBy God's grace on their lives, we are 1 of many close family-friends to\nthem. By God's same grace on our lives, they are 1 of a **very few** close\nfamily-friends to us, and so when we do get to see them and plan a few days\ntogether every couple of years, it warms my heart so much that if we booked the\nnext trip this morning I'd forget about being sick and how cold it is outside\n(wind chill -29F).\n\nThings for me right this very second are not incredibly joyful, but all things\nconsidered it's impossible to not find peace in the provision of Yahweh in my\nlife. I'm thankful for when joy enters my being and I get to experience it, I\npray Jesus broadens my heart and mind this week during the reflections on Joy\nfor the sake my own righteousness.\n",
      "summary": "!!! note \"Psalm 105:43\"",
      "date_published": "2025-12-14T09:48:03Z",
      "date_modified": "2025-12-14T09:48:03Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "advent",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/advent-ephesians-4-3/",
      "url": "https://pype.dev/advent-ephesians-4-3/",
      "title": "Advent - Ephesians 4:3",
      "content_html": "\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eEphesians 4:1-6\u003c/p\u003e\n\u003cp\u003e4Therefore I, the prisoner in the Lord, exhort you to live in a manner\nworthy of the calling with which you were called: 2 with all humility and\ngentleness, with patience, putting up with one another in love, 3 being eager\nto keep the unity of the Spirit in the bond of peace; 4 one body and one Spirit\n(just as also you were called with one hope of your calling), 5 one Lord, one\nfaith, one baptism, 6 one God and Father of all, who is over all, and through\nall, and in all.\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"unity-and-peace\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUnity and Peace\u003c/span\u003e \u003ca href=\"#unity-and-peace\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eOnce again I say \u0026ldquo;Praise God\u0026rdquo; this morning for more words of Scripture that\nsuccinctly highlight the beauty of the Gospel.\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u0026ldquo;I, the prisoner in the Lord\u0026hellip;\u0026rdquo; No one knows better than Paul that if Jesus\nsays \u0026ldquo;Come to me\u0026rdquo; you have no choice but to obey.\u003c/li\u003e\n\u003cli\u003e\u0026ldquo;with humility, gentleness, and patience put up with one another in love, be\neager to keep the unity of the Spirit in the bond of peace\u0026rdquo;. Christian\ncommunity was literally the talk of the town in the early church - it was so\nodd that historians have written about \u0026ldquo;The Way\u0026rdquo; (the early early name of the\nChristian movement). Acts says believers \u0026ldquo;had all things in common\u0026rdquo;. Jesus\nbrings unity that transcends any differences between us.\u003c/li\u003e\n\u003cli\u003e\u0026ldquo;one\u0026hellip;one\u0026hellip;one\u0026hellip;\u0026rdquo; Paul is saying so clearly that we are one family in\nChrista. Later in the same letter he says \u0026ldquo;be eager to do good to all, and\nespecially to those in the household of faith\u0026rdquo;. Christians should be meeting\nthe needs of those around them, but even more so meeting the needs of our\nbrothers and sisters in Christ.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eI really strive for unity\u0026hellip; My whole life people have accused me of loving an\nargument (which is true) but I am not pugnacious. I do not enjoy fighting - I\ndo enjoy rhetoric and debate, but by God\u0026rsquo;s grace I hate division. There are\nseveral examples I can point to in my life where unity and \u0026ldquo;team spirit\u0026rdquo; was\nimportant to me.\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eSimple Example\u003c/p\u003e\n\u003cp\u003eI worked for Summit Ministries for several summers, eventually serving on\nsome leadership positions. While in those positions I wanted to do \u0026ldquo;extra\u0026rdquo;\nthings to unify our counselors, and one was that every year I\u0026rsquo;d design a\nsweatshirt that we\u0026rsquo;d all (or most of us) would buy. I just love the idea of\nbeing united for a common and GOOD goal.o\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eChristians should be the most unified and loving people on the planet\u0026hellip;\nunfortunately that isn\u0026rsquo;t the case, and I know a lot of people in and out of the\nChurch who have experienced great disunity and division. That really is\nunfortunate, but I think the only thing I can do is march forward to the beat\nof the drum Jesus has for me. And one of those beats is to strive for unity\n\u0026ldquo;putting up with one another in love, being eager to keep the unity of the\nSpirit in the bond of peace\u0026rdquo;\u003c/p\u003e\n",
      "content_text": "\n!!! note \"Ephesians 4:1-6\"\n\n    4Therefore I, the prisoner in the Lord, exhort you to live in a manner\n    worthy of the calling with which you were called: 2 with all humility and\n    gentleness, with patience, putting up with one another in love, 3 being eager\n    to keep the unity of the Spirit in the bond of peace; 4 one body and one Spirit\n    (just as also you were called with one hope of your calling), 5 one Lord, one\n    faith, one baptism, 6 one God and Father of all, who is over all, and through\n    all, and in all.\n\n## Unity and Peace\n\nOnce again I say \"Praise God\" this morning for more words of Scripture that\nsuccinctly highlight the beauty of the Gospel.\n\n1. \"I, the prisoner in the Lord...\" No one knows better than Paul that if Jesus\n   says \"Come to me\" you have no choice but to obey.\n2. \"with humility, gentleness, and patience put up with one another in love, be\n   eager to keep the unity of the Spirit in the bond of peace\". Christian\n   community was literally the talk of the town in the early church - it was so\n   odd that historians have written about \"The Way\" (the early early name of the\n   Christian movement). Acts says believers \"had all things in common\". Jesus\n   brings unity that transcends any differences between us.\n3. \"one...one...one...\" Paul is saying so clearly that we are one family in\n   Christa. Later in the same letter he says \"be eager to do good to all, and\n   especially to those in the household of faith\". Christians should be meeting\n   the needs of those around them, but even more so meeting the needs of our\n   brothers and sisters in Christ.\n\nI really strive for unity... My whole life people have accused me of loving an\nargument (which is true) but I am not pugnacious. I do not enjoy fighting - I\ndo enjoy rhetoric and debate, but by God's grace I hate division. There are\nseveral examples I can point to in my life where unity and \"team spirit\" was\nimportant to me.\n\n!!! note \"Simple Example\"\n\n    I worked for Summit Ministries for several summers, eventually serving on\n    some leadership positions. While in those positions I wanted to do \"extra\"\n    things to unify our counselors, and one was that every year I'd design a\n    sweatshirt that we'd all (or most of us) would buy. I just love the idea of\n    being united for a common and GOOD goal.o\n\nChristians should be the most unified and loving people on the planet...\nunfortunately that isn't the case, and I know a lot of people in and out of the\nChurch who have experienced great disunity and division. That really is\nunfortunate, but I think the only thing I can do is march forward to the beat\nof the drum Jesus has for me. And one of those beats is to strive for unity\n\"putting up with one another in love, being eager to keep the unity of the\nSpirit in the bond of peace\"\n",
      "summary": "!!! note \"Ephesians 4:1-6\"",
      "date_published": "2025-12-13T05:05:56Z",
      "date_modified": "2025-12-13T05:05:56Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "advent",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/setup-a-cloudflare-tunnel-with-terraform/",
      "url": "https://pype.dev/setup-a-cloudflare-tunnel-with-terraform/",
      "title": "Setup A Cloudflare Tunnel With Terraform",
      "content_html": "\u003cp\u003eI am cooking up some stuff at home and want to put it on the interwebs, but I\ndon\u0026rsquo;t want it on the same infra as my homelab. Now\u0026hellip; I only have a server or\n2, so to some degree it will be, but networking-wise I didn\u0026rsquo;t want to funnel\nextra traffic through my reverse proxy.\u003c/p\u003e\n\u003cp\u003eSo, I\u0026rsquo;d heard about Cloudflare Tunnels - they sound like P2P VPN to me, but I\nknow there\u0026rsquo;s layers of the networking stack I\u0026rsquo;m blatantly ignoring. \u0026ldquo;What the\ntunnel is\u0026rdquo; isn\u0026rsquo;t much the point - I\u0026rsquo;m here to show you how to set one up and\nget yourself a fancy \u003ca href=\"https://app.mydomain.com\"\u003ehttps://app.mydomain.com\u003c/a\u003e for your web app running\nkind of wherever you want\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eExample Repo linked at the bottom\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"requirements\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRequirements\u003c/span\u003e \u003ca href=\"#requirements\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003col start=\"0\"\u003e\n\u003cli\u003eTerraform or open-tofu. I currently use open-tofu but either would be fine.\n\u003ccode\u003ebrew install open-tofu\u003c/code\u003e is a simple way to get going\u003c/li\u003e\n\u003cli\u003eCloudflare account with a domain\u003c/li\u003e\n\u003cli\u003eAPI token with permissions:\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eAccount:Cloudflare Tunnel:Edit\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eZone:DNS:Edit\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ecloudflared\u003c/code\u003e (the example repo runs cloudflared in a docker compose stack)\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"tunnel\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTunnel\u003c/span\u003e \u003ca href=\"#tunnel\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe module is simple and has just a few resources:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ tofu state list\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emodule.tunnel.cloudflare_record.tunnel\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emodule.tunnel.cloudflare_tunnel_config.this\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emodule.tunnel.cloudflare_zero_trust_tunnel_cloudflared.this\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emodule.tunnel.random_id.tunnel_secret\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\u003eWe see there will be the a DNS record that tofu references by the key \u0026ldquo;tunnel\u0026rdquo;.\nThere is a tunnel configuration resource, the tunnel resource itself, and\nfinally the associated secret required for the cloudflared daemon that will run\nalongside your webapp.\u003c/p\u003e\n\u003cp\u003eTo get started you\u0026rsquo;ll need to fill out the example \u003ccode\u003eterraform.tfvars\u003c/code\u003e file with\nyour info:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Copy to terraform.tfvars and fill in values\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# DO NOT commit terraform.tfvars to git\n\u003c/span\u003e\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=\"n\"\u003ecloudflare_api_token\u003c/span\u003e  \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;your-api-token-here\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ecloudflare_account_id\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;your-account-id\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ecloudflare_zone_id\u003c/span\u003e    \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;your-zone-id\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003edomain\u003c/span\u003e                \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;example.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003esubdomain\u003c/span\u003e             \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;app\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003etunnel_name\u003c/span\u003e           \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;my-tunnel\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eorigin_service\u003c/span\u003e        \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;http://localhost:8000\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eYou can grab your account id and zone id from Cloudflare\u0026rsquo;s dashboard for your\ndomain. It\u0026rsquo;s near the bottom of the Overview page\u003c/p\u003e\n\u003cfigure\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20251213113332_0e0f09b8.png\" alt=\"20251213113332_0e0f09b8.png\"\u003e\n\u003c/figure\u003e\n\u003cp\u003eThen I presume you have a domain already, but if not hop over to namecheap to\nsnag one and then register it with cloudflare so they can manage your DNS. I\nhave terraform for this as well, a future blog post will combine this with a\nfuller terraform\u0026rsquo;d cloudflare setup for simple domain use cases\u003c/p\u003e\n\u003cp\u003eOnce you fill those out, hit it with the \u003ccode\u003etofu init\u003c/code\u003e and \u003ccode\u003etofu plan\u003c/code\u003e to see what\u0026rsquo;s up\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eNOTE: \u003ccode\u003eterraform.tfvars\u003c/code\u003e is automatically sourced by terraform/tofu, you can name the file differently and then pass \u003ccode\u003e-var-file=myvars.tfvars\u003c/code\u003e to the commands\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThe initial plan should look something like this:\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\"\u003eOpenTofu used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  + 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\"\u003eOpenTofu will perform the following actions:\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=\"c1\"\u003e# module.tunnel.cloudflare_record.tunnel will be created\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  + resource \u003cspan class=\"s2\"\u003e\u0026#34;cloudflare_record\u0026#34;\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tunnel\u0026#34;\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      + \u003cspan class=\"nv\"\u003eallow_overwrite\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nb\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      + \u003cspan class=\"nv\"\u003ecomment\u003c/span\u003e         \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Managed by Terraform - soonish-tunnel\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      + \u003cspan class=\"nv\"\u003econtent\u003c/span\u003e         \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e(\u003c/span\u003eknown after apply\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      + \u003cspan class=\"nv\"\u003ecreated_on\u003c/span\u003e      \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e(\u003c/span\u003eknown after apply\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      + \u003cspan class=\"nv\"\u003ehostname\u003c/span\u003e        \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e(\u003c/span\u003eknown after apply\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      + \u003cspan class=\"nv\"\u003eid\u003c/span\u003e              \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e(\u003c/span\u003eknown after apply\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      + \u003cspan class=\"nv\"\u003emetadata\u003c/span\u003e        \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e(\u003c/span\u003eknown after apply\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      + \u003cspan class=\"nv\"\u003emodified_on\u003c/span\u003e     \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e(\u003c/span\u003eknown after apply\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      + \u003cspan class=\"nv\"\u003ename\u003c/span\u003e            \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;app\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      + \u003cspan class=\"nv\"\u003eproxiable\u003c/span\u003e       \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e(\u003c/span\u003eknown after apply\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      + \u003cspan class=\"nv\"\u003eproxied\u003c/span\u003e         \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nb\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      + \u003cspan class=\"nv\"\u003ettl\u003c/span\u003e             \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e(\u003c/span\u003eknown after apply\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      + \u003cspan class=\"nb\"\u003etype\u003c/span\u003e            \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;CNAME\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      + \u003cspan class=\"nv\"\u003evalue\u003c/span\u003e           \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e(\u003c/span\u003eknown after apply\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      + \u003cspan class=\"nv\"\u003ezone_id\u003c/span\u003e         \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026lt;REDACTED\u0026gt;\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\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=\"c1\"\u003e# module.tunnel.cloudflare_tunnel_config.this will be created\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  + resource \u003cspan class=\"s2\"\u003e\u0026#34;cloudflare_tunnel_config\u0026#34;\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;this\u0026#34;\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      + \u003cspan class=\"nv\"\u003eaccount_id\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026lt;REDACTED\u0026gt;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      + \u003cspan class=\"nv\"\u003eid\u003c/span\u003e         \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e(\u003c/span\u003eknown after apply\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      + \u003cspan class=\"nv\"\u003etunnel_id\u003c/span\u003e  \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e(\u003c/span\u003eknown after apply\u003cspan class=\"o\"\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      + config \u003cspan class=\"o\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          + ingress_rule \u003cspan class=\"o\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e              + \u003cspan class=\"nv\"\u003ehostname\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;app.notifiq.net\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e              + \u003cspan class=\"nv\"\u003eservice\u003c/span\u003e  \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;http://localhost:8000\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\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          + ingress_rule \u003cspan class=\"o\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e              + \u003cspan class=\"nv\"\u003eservice\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;http_status:404\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\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e}\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\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=\"c1\"\u003e# module.tunnel.cloudflare_zero_trust_tunnel_cloudflared.this will be created\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  + resource \u003cspan class=\"s2\"\u003e\u0026#34;cloudflare_zero_trust_tunnel_cloudflared\u0026#34;\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;this\u0026#34;\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      + \u003cspan class=\"nv\"\u003eaccount_id\u003c/span\u003e   \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026lt;REDACTED\u0026gt;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      + \u003cspan class=\"nv\"\u003ecname\u003c/span\u003e        \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e(\u003c/span\u003eknown after apply\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      + \u003cspan class=\"nv\"\u003eid\u003c/span\u003e           \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e(\u003c/span\u003eknown after apply\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      + \u003cspan class=\"nv\"\u003ename\u003c/span\u003e         \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;soonish-tunnel\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      + \u003cspan class=\"nv\"\u003esecret\u003c/span\u003e       \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e(\u003c/span\u003esensitive value\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      + \u003cspan class=\"nv\"\u003etunnel_token\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e(\u003c/span\u003esensitive value\u003cspan class=\"o\"\u003e)\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\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=\"c1\"\u003e# module.tunnel.random_id.tunnel_secret will be created\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  + resource \u003cspan class=\"s2\"\u003e\u0026#34;random_id\u0026#34;\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tunnel_secret\u0026#34;\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      + \u003cspan class=\"nv\"\u003eb64_std\u003c/span\u003e     \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e(\u003c/span\u003eknown after apply\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      + \u003cspan class=\"nv\"\u003eb64_url\u003c/span\u003e     \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e(\u003c/span\u003eknown after apply\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      + \u003cspan class=\"nv\"\u003ebyte_length\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"m\"\u003e32\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      + \u003cspan class=\"nv\"\u003edec\u003c/span\u003e         \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e(\u003c/span\u003eknown after apply\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      + \u003cspan class=\"nv\"\u003ehex\u003c/span\u003e         \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e(\u003c/span\u003eknown after apply\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      + \u003cspan class=\"nv\"\u003eid\u003c/span\u003e          \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e(\u003c/span\u003eknown after apply\u003cspan class=\"o\"\u003e)\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\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePlan: \u003cspan class=\"m\"\u003e4\u003c/span\u003e to add, \u003cspan class=\"m\"\u003e0\u003c/span\u003e to change, \u003cspan class=\"m\"\u003e0\u003c/span\u003e to destroy.\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\u003eAs long as that looks good you to, then we \u003ccode\u003etofu apply\u003c/code\u003e next (type \u003ccode\u003eyes\u003c/code\u003e when\nasked or pass \u003ccode\u003e-auto-approve\u003c/code\u003e)\u003c/p\u003e\n\u003cp\u003eAfterwards \u003ccode\u003etofu state list\u003c/code\u003e should show you the 4 resources, and if you go to\nyour cloudflare zone\u0026rsquo;s dashboard you should see the CNAME associated with the\ntunnel address\u003c/p\u003e\n\u003cfigure\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20251213120004_d199e5fd.png\" alt=\"20251213120004_d199e5fd.png\"\u003e\n\u003c/figure\u003e\n\u003ch2 id=\"daemon\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDaemon\u003c/span\u003e \u003ca href=\"#daemon\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eRun the compose stack or the binary itself. Get the token from terraform state with \u003ccode\u003etofu output -raw tunnel_token\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eTUNNEL_TOKEN=$(tofu output -raw tunnel_token) docker compose up -d\u003c/code\u003e will do you nicely\u003c/p\u003e\n\u003cp\u003eEnjoy your tunnel!\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/pypeaday/example-terraform-cloudflare-tunnel\"\u003eexample repo\u003c/a\u003e\u003c/p\u003e\n",
      "content_text": "\nI am cooking up some stuff at home and want to put it on the interwebs, but I\ndon't want it on the same infra as my homelab. Now... I only have a server or\n2, so to some degree it will be, but networking-wise I didn't want to funnel\nextra traffic through my reverse proxy.\n\nSo, I'd heard about Cloudflare Tunnels - they sound like P2P VPN to me, but I\nknow there's layers of the networking stack I'm blatantly ignoring. \"What the\ntunnel is\" isn't much the point - I'm here to show you how to set one up and\nget yourself a fancy \u003chttps://app.mydomain.com\u003e for your web app running\nkind of wherever you want\n\n\u003e Example Repo linked at the bottom\n\n## Requirements\n\n0. Terraform or open-tofu. I currently use open-tofu but either would be fine.\n   `brew install open-tofu` is a simple way to get going\n1. Cloudflare account with a domain\n2. API token with permissions:\n   - `Account:Cloudflare Tunnel:Edit`\n   - `Zone:DNS:Edit`\n3. `cloudflared` (the example repo runs cloudflared in a docker compose stack)\n\n## Tunnel\n\nThe module is simple and has just a few resources:\n\n```bash\n❯ tofu state list\nmodule.tunnel.cloudflare_record.tunnel\nmodule.tunnel.cloudflare_tunnel_config.this\nmodule.tunnel.cloudflare_zero_trust_tunnel_cloudflared.this\nmodule.tunnel.random_id.tunnel_secret\n\n```\n\nWe see there will be the a DNS record that tofu references by the key \"tunnel\".\nThere is a tunnel configuration resource, the tunnel resource itself, and\nfinally the associated secret required for the cloudflared daemon that will run\nalongside your webapp.\n\nTo get started you'll need to fill out the example `terraform.tfvars` file with\nyour info:\n\n```hcl\n# Copy to terraform.tfvars and fill in values\n# DO NOT commit terraform.tfvars to git\n\ncloudflare_api_token  = \"your-api-token-here\"\ncloudflare_account_id = \"your-account-id\"\ncloudflare_zone_id    = \"your-zone-id\"\ndomain                = \"example.com\"\nsubdomain             = \"app\"\ntunnel_name           = \"my-tunnel\"\norigin_service        = \"http://localhost:8000\"\n```\n\nYou can grab your account id and zone id from Cloudflare's dashboard for your\ndomain. It's near the bottom of the Overview page\n\n![20251213113332_0e0f09b8.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20251213113332_0e0f09b8.png)\n\nThen I presume you have a domain already, but if not hop over to namecheap to\nsnag one and then register it with cloudflare so they can manage your DNS. I\nhave terraform for this as well, a future blog post will combine this with a\nfuller terraform'd cloudflare setup for simple domain use cases\n\nOnce you fill those out, hit it with the `tofu init` and `tofu plan` to see what's up\n\n\u003e NOTE: `terraform.tfvars` is automatically sourced by terraform/tofu, you can name the file differently and then pass `-var-file=myvars.tfvars` to the commands\n\nThe initial plan should look something like this:\n\n```bash\n\nOpenTofu used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:\n  + create\n\nOpenTofu will perform the following actions:\n\n  # module.tunnel.cloudflare_record.tunnel will be created\n  + resource \"cloudflare_record\" \"tunnel\" {\n      + allow_overwrite = false\n      + comment         = \"Managed by Terraform - soonish-tunnel\"\n      + content         = (known after apply)\n      + created_on      = (known after apply)\n      + hostname        = (known after apply)\n      + id              = (known after apply)\n      + metadata        = (known after apply)\n      + modified_on     = (known after apply)\n      + name            = \"app\"\n      + proxiable       = (known after apply)\n      + proxied         = true\n      + ttl             = (known after apply)\n      + type            = \"CNAME\"\n      + value           = (known after apply)\n      + zone_id         = \"\u003cREDACTED\u003e\"\n    }\n\n  # module.tunnel.cloudflare_tunnel_config.this will be created\n  + resource \"cloudflare_tunnel_config\" \"this\" {\n      + account_id = \"\u003cREDACTED\u003e\"\n      + id         = (known after apply)\n      + tunnel_id  = (known after apply)\n\n      + config {\n          + ingress_rule {\n              + hostname = \"app.notifiq.net\"\n              + service  = \"http://localhost:8000\"\n            }\n          + ingress_rule {\n              + service = \"http_status:404\"\n            }\n        }\n    }\n\n  # module.tunnel.cloudflare_zero_trust_tunnel_cloudflared.this will be created\n  + resource \"cloudflare_zero_trust_tunnel_cloudflared\" \"this\" {\n      + account_id   = \"\u003cREDACTED\u003e\"\n      + cname        = (known after apply)\n      + id           = (known after apply)\n      + name         = \"soonish-tunnel\"\n      + secret       = (sensitive value)\n      + tunnel_token = (sensitive value)\n    }\n\n  # module.tunnel.random_id.tunnel_secret will be created\n  + resource \"random_id\" \"tunnel_secret\" {\n      + b64_std     = (known after apply)\n      + b64_url     = (known after apply)\n      + byte_length = 32\n      + dec         = (known after apply)\n      + hex         = (known after apply)\n      + id          = (known after apply)\n    }\n\nPlan: 4 to add, 0 to change, 0 to destroy.\n\n```\n\nAs long as that looks good you to, then we `tofu apply` next (type `yes` when\nasked or pass `-auto-approve`)\n\nAfterwards `tofu state list` should show you the 4 resources, and if you go to\nyour cloudflare zone's dashboard you should see the CNAME associated with the\ntunnel address\n\n![20251213120004_d199e5fd.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20251213120004_d199e5fd.png)\n\n## Daemon\n\nRun the compose stack or the binary itself. Get the token from terraform state with `tofu output -raw tunnel_token`.\n\n`TUNNEL_TOKEN=$(tofu output -raw tunnel_token) docker compose up -d` will do you nicely\n\nEnjoy your tunnel!\n\n[example repo](https://github.com/pypeaday/example-terraform-cloudflare-tunnel)\n",
      "summary": "I am cooking up some stuff at home and want to put it on the interwebs, but I don't want it on the same infra as my homelab. Now... I only have a server or...",
      "date_published": "2025-12-12T21:06:59Z",
      "date_modified": "2025-12-12T21:06:59Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "tofu",
        "terraform",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/advent-ephesians-2-14-16/",
      "url": "https://pype.dev/advent-ephesians-2-14-16/",
      "title": "Advent - Ephesians 2:14-16",
      "content_html": "\u003cblockquote\u003e\n\u003cp\u003eThe reflection in the BP calendar for today was only verses 14-15 but they made no sense to me without some more context\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eEphesians 2:11-22\u003c/p\u003e\n\u003cp\u003e11 Therefore remember that formerly you, the Gentiles in the flesh, the\nso-called uncircumcision by the so-called circumcision in the flesh, made by\nhands, 12 that you were at that time apart from Christ, alienated from the\ncitizenship of Israel, and strangers to the covenants of promise, not having\nhope, and without God in the world. 13 But now in Christ Jesus you, the ones\nwho once were far away, have become near by the blood of Christ. 14 For he\nhimself is our peace, who made both one and broke down the dividing wall of the\npartition, the enmity, in his flesh, 15 invalidating the law of commandments in\nordinances, in order that he might create the two in himself into one new man,\nthus making peace, 16 and might reconcile both in one body to God through the\ncross, killing the enmity in himself. 17 And coming, he proclaimed the good\nnews of peace to you who were far away and peace to the ones who were near,\n18 because through him we both have access in one Spirit to the Father.\n19 Consequently, therefore, you are no longer strangers and foreigners, but you\nare fellow citizens of the saints and members of the household of God, 20 built\non the foundation of the apostles and prophets, Christ Jesus himself being the\ncornerstone, 21 in whom the whole building, joined together, grows into a holy\ntemple in the Lord, 22 in whom you also are built up together into a dwelling\nplace of God in the Spirit.\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"summary\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSummary\u003c/span\u003e \u003ca href=\"#summary\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIt\u0026rsquo;s a dense section, like a lot of Paul\u0026rsquo;s letters, so no surprise. I think the\nsimplest truth from this passage is that to be a \u0026ldquo;citizen of heaven\u0026rdquo; requires\nnothing more than to be chosen by Jesus. For much of the Bible, and the history\nof Israel, the first requirement was being in the physical nation of Israel -\nGod\u0026rsquo;s chosen people. Jesus comes to unleash the blessing of adoption and\nreconiciliiation onto the whole world, not just one imperfect white-washed\nnation.\u003c/p\u003e\n\u003cp\u003eTLDR: Jesus brings peace through unity of faith in his saving power - there is\nnothing that can separate God\u0026rsquo;s own from himself, including who your ancestors\nare.\u003c/p\u003e\n\u003ch2 id=\"peace\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePeace\u003c/span\u003e \u003ca href=\"#peace\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u0026ldquo;For he himself is our peace\u0026rdquo;\u0026hellip; Amen and amen. My reflections during and prior\nto Advent this year have strong running themes of freedom and peace because by\nGod\u0026rsquo;s grace he\u0026rsquo;s impressing these blessings into my heart. In the stillness of\nthe morning or the chaos of the afternoon, I can thankfully say that the name\nof Jesus never fails to ground my feet in the reality of his kingdom, and at the\nvery least - draw my eyes above the trial to the horizon - where just like I\ncan see nothing without the sun\u0026rsquo;s light, the world is clearer and more peaceful\nin the light of the Son of God.\u003c/p\u003e\n",
      "content_text": "\n\u003e The reflection in the BP calendar for today was only verses 14-15 but they made no sense to me without some more context\n\n!!! note \"Ephesians 2:11-22\"\n\n    11 Therefore remember that formerly you, the Gentiles in the flesh, the\n    so-called uncircumcision by the so-called circumcision in the flesh, made by\n    hands, 12 that you were at that time apart from Christ, alienated from the\n    citizenship of Israel, and strangers to the covenants of promise, not having\n    hope, and without God in the world. 13 But now in Christ Jesus you, the ones\n    who once were far away, have become near by the blood of Christ. 14 For he\n    himself is our peace, who made both one and broke down the dividing wall of the\n    partition, the enmity, in his flesh, 15 invalidating the law of commandments in\n    ordinances, in order that he might create the two in himself into one new man,\n    thus making peace, 16 and might reconcile both in one body to God through the\n    cross, killing the enmity in himself. 17 And coming, he proclaimed the good\n    news of peace to you who were far away and peace to the ones who were near,\n    18 because through him we both have access in one Spirit to the Father.\n    19 Consequently, therefore, you are no longer strangers and foreigners, but you\n    are fellow citizens of the saints and members of the household of God, 20 built\n    on the foundation of the apostles and prophets, Christ Jesus himself being the\n    cornerstone, 21 in whom the whole building, joined together, grows into a holy\n    temple in the Lord, 22 in whom you also are built up together into a dwelling\n    place of God in the Spirit.\n\n## Summary\n\nIt's a dense section, like a lot of Paul's letters, so no surprise. I think the\nsimplest truth from this passage is that to be a \"citizen of heaven\" requires\nnothing more than to be chosen by Jesus. For much of the Bible, and the history\nof Israel, the first requirement was being in the physical nation of Israel -\nGod's chosen people. Jesus comes to unleash the blessing of adoption and\nreconiciliiation onto the whole world, not just one imperfect white-washed\nnation.\n\nTLDR: Jesus brings peace through unity of faith in his saving power - there is\nnothing that can separate God's own from himself, including who your ancestors\nare.\n\n## Peace\n\n\"For he himself is our peace\"... Amen and amen. My reflections during and prior\nto Advent this year have strong running themes of freedom and peace because by\nGod's grace he's impressing these blessings into my heart. In the stillness of\nthe morning or the chaos of the afternoon, I can thankfully say that the name\nof Jesus never fails to ground my feet in the reality of his kingdom, and at the\nvery least - draw my eyes above the trial to the horizon - where just like I\ncan see nothing without the sun's light, the world is clearer and more peaceful\nin the light of the Son of God.\n",
      "summary": "The reflection in the BP calendar for today was only verses 14-15 but they made no sense to me without some more context",
      "date_published": "2025-12-12T04:57:12Z",
      "date_modified": "2025-12-12T04:57:12Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "advent",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2025-12-12-notes/",
      "url": "https://pype.dev/2025-12-12-notes/",
      "title": "2025-12-12 Notes",
      "content_text": "\nyesterday: [[2025-12-11-notes]]\n",
      "summary": "yesterday: 2025-12-11-notes",
      "date_published": "2025-12-12T04:56:48Z",
      "date_modified": "2025-12-12T04:56:48Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/advent-colossians-1-19-20/",
      "url": "https://pype.dev/advent-colossians-1-19-20/",
      "title": "Advent - Colossians 1:19-20",
      "content_html": "\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eColossians 1:19-20\u003c/p\u003e\n\u003cp\u003e19 For God was pleased to have  all his fullness dwell in him,  20 and through him to reconcile  everything to himself,  whether things on earth or things in heaven,  by making peace  through his blood, shed on the cross.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eI feel like there\u0026rsquo;s so much that could be unpacked here\u0026hellip;\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u0026ldquo;all his fullness dwell him in\u0026rdquo; - so besides the entire Gospel of John how\ncan anyone deny that Jesus is God? I don\u0026rsquo;t understand anyone who claims to take\nthe Bible as an authority and then deny Jesus\u0026rsquo; divinity.\u003c/li\u003e\n\u003cli\u003e\u0026ldquo;through him to reconcile everything to himself\u0026rdquo; - not all people are saved,\nit\u0026rsquo;s a clear reality. So what does it mean for \u003cstrong\u003eall things\u003c/strong\u003e to be\nreconciled to God? Feels like that could go a lot of places.\u003c/li\u003e\n\u003cli\u003e\u0026ldquo;making peace through his blood\u0026rdquo; - before the cross there was an absence of\n\u0026ldquo;peace\u0026rdquo;, and through Jesus\u0026rsquo; blood peace has been made. Moreso than just that,\nthe \u0026ldquo;make\u0026rdquo; (eirenopoieo: εἰρηνοποιέω) is in the aorist which I understand to be\na tense that means a thing \u0026ldquo;has happened\u0026rdquo; and \u0026ldquo;is done happening\u0026rdquo;. ie. it\u0026rsquo;s a\ncompleted action in the past.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"kiss\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eKISS\u003c/span\u003e \u003ca href=\"#kiss\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI\u0026rsquo;m going to keep-it-simple-silly here\u0026hellip; I don\u0026rsquo;t have the energy for arguments\nor unpacking some of these theological ideas that I genuinely do love. I found\nsome old notes on this exact passage in Logos about reconiliation of angels and\nsome grammar questions. However, for this Advent reflection I think there\u0026rsquo;s\njust a simple truth to see, and it\u0026rsquo;s one of the biggest points of the Story of\nthe Bible - Jesus makes peace, and he made peace through hard work, death.\u003c/p\u003e\n\u003cp\u003eThe glory of the peace Jesus made is lost on anyone who doesn\u0026rsquo;t recognize that\nthe world is broken. Jesus brings a new reality by unleashing Heaven to earth\nthrough his victory on the cross. We live in an interim \u0026ldquo;already but not yet\u0026rdquo;\nwhere the King Jesus is the rightful ruler over all creation, but he has yet to\ncome back and fully claim his own. The peace he made is a gift to all of\ncreation, for all of creation is his to reconcile.\u003c/p\u003e\n\u003cp\u003eIf Jesus calls your name, what are you going to do? What can you do? He\ndefeated death and holds the universe together\u0026hellip; you think you can say \u0026ldquo;no\u0026rdquo;?\nWhat about Jesus \u003cem\u003enot\u003c/em\u003e calling the name of someone in your life? Is peace not\nafforded to them? The Biblical truth is that it\u0026rsquo;s fully and totally up to Yahweh\nto give his own to the Lord Jesus, and to keep each one without losing a hair\non their head. Those who are not of his kingdom will get what they naturally\nwant in the end. What that \u003cstrong\u003eactually is\u003c/strong\u003e I do not know, but it is not\neternity in the presence of a Good King because if God hasn\u0026rsquo;t chosen you, you\ncan\u0026rsquo;t love the Good King. If God hasn\u0026rsquo;t chosen you - you can\u0026rsquo;t \u003cstrong\u003ewant\u003c/strong\u003e the\nGood King. In the end, we all get what we want - the benefit of\nthose chosen by Yahweh is that we are freed to want what is actually good for\nus. We are freed to love and live according to the purposes of our design.\u003c/p\u003e\n\u003cp\u003eToday I pray Jesus impresses the reality of peace, and the freedom to want the\npeace he made, deeper into my heart, amen.\u003c/p\u003e\n",
      "content_text": "\n!!! note \"Colossians 1:19-20\"\n\n    19 For God was pleased to have  all his fullness dwell in him,  20 and through him to reconcile  everything to himself,  whether things on earth or things in heaven,  by making peace  through his blood, shed on the cross.\n\nI feel like there's so much that could be unpacked here...\n\n- \"all his fullness dwell him in\" - so besides the entire Gospel of John how\n  can anyone deny that Jesus is God? I don't understand anyone who claims to take\n  the Bible as an authority and then deny Jesus' divinity.\n- \"through him to reconcile everything to himself\" - not all people are saved,\n  it's a clear reality. So what does it mean for **all things** to be\n  reconciled to God? Feels like that could go a lot of places.\n- \"making peace through his blood\" - before the cross there was an absence of\n  \"peace\", and through Jesus' blood peace has been made. Moreso than just that,\n  the \"make\" (eirenopoieo: εἰρηνοποιέω) is in the aorist which I understand to be\n  a tense that means a thing \"has happened\" and \"is done happening\". ie. it's a\n  completed action in the past.\n\n## KISS\n\nI'm going to keep-it-simple-silly here... I don't have the energy for arguments\nor unpacking some of these theological ideas that I genuinely do love. I found\nsome old notes on this exact passage in Logos about reconiliation of angels and\nsome grammar questions. However, for this Advent reflection I think there's\njust a simple truth to see, and it's one of the biggest points of the Story of\nthe Bible - Jesus makes peace, and he made peace through hard work, death.\n\nThe glory of the peace Jesus made is lost on anyone who doesn't recognize that\nthe world is broken. Jesus brings a new reality by unleashing Heaven to earth\nthrough his victory on the cross. We live in an interim \"already but not yet\"\nwhere the King Jesus is the rightful ruler over all creation, but he has yet to\ncome back and fully claim his own. The peace he made is a gift to all of\ncreation, for all of creation is his to reconcile.\n\nIf Jesus calls your name, what are you going to do? What can you do? He\ndefeated death and holds the universe together... you think you can say \"no\"?\nWhat about Jesus _not_ calling the name of someone in your life? Is peace not\nafforded to them? The Biblical truth is that it's fully and totally up to Yahweh\nto give his own to the Lord Jesus, and to keep each one without losing a hair\non their head. Those who are not of his kingdom will get what they naturally\nwant in the end. What that **actually is** I do not know, but it is not\neternity in the presence of a Good King because if God hasn't chosen you, you\ncan't love the Good King. If God hasn't chosen you - you can't **want** the\nGood King. In the end, we all get what we want - the benefit of\nthose chosen by Yahweh is that we are freed to want what is actually good for\nus. We are freed to love and live according to the purposes of our design.\n\nToday I pray Jesus impresses the reality of peace, and the freedom to want the\npeace he made, deeper into my heart, amen.\n",
      "summary": "!!! note \"Colossians 1:19-20\"",
      "date_published": "2025-12-11T05:38:49Z",
      "date_modified": "2025-12-11T05:38:49Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "advent",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2025-12-11-notes/",
      "url": "https://pype.dev/2025-12-11-notes/",
      "title": "2025-12-11 Notes",
      "content_text": "\nyesterday: [[2025-12-09-notes]]\n\n- Linux Matters mentioned some song visualizers and one of the hosts even wrote\n  one... I've recently been lamenting that I'm not very good at doing something\n  \"just for me\", I always need an angle and this is a pretty annoying mental\n  battle that I'm in the middle of practically all the time. But I loved\n  visualizers as a kid, Windows Media Player + Limewire was a match made in\n  heaven. So, I'm gonna toss [this visualizer]() onto a screen today with my\n  tunes\n\n- Messed around with Cloudflare Tunnels today finally. Sweet little piece of\n  tech. I'm going to use it for hosting notifiq. I got my tunnel setup with\n  terraform which is awesome - I will bring that into my homelab infrastructure\n  module and clean it all up since I took a look tonight after several months and\n  oh boy have I learned a thing or 2 about terraform in that time...\n",
      "summary": "yesterday: 2025-12-09-notes",
      "date_published": "2025-12-11T05:38:33Z",
      "date_modified": "2025-12-11T05:38:33Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/advent-john-16-33/",
      "url": "https://pype.dev/advent-john-16-33/",
      "title": "Advent - John 16:33",
      "content_html": "\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eJohn 16:33\u003c/p\u003e\n\u003cp\u003eI have said these things to you so that in me you may have peace. In the world you have affliction, but have courage! I have conquered the world.”\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eIt\u0026rsquo;s interesting to read a little context around this morning\u0026rsquo;s Advent\nreflection passage/verse\u0026hellip;\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eJohn 16:31-33\u003c/p\u003e\n\u003cp\u003e31 Jesus replied to them, “Now do you believe? 32 Behold, an hour is coming—and has come—that you will be scattered each one to his own home, and you will leave me alone. And I am not alone, because the Father is with me. 33 I have said these things to you so that in me you may have peace. In the world you have affliction, but have courage! I have conquered the world.”\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eIt sounds to me like right on the heels of Jesus saying \u0026ldquo;hey, you\u0026rsquo;re gonna\nleave me alone for a minute out of fear\u0026rdquo; he says \u0026ldquo;I still love you, have peace,\nI am victorious\u0026rdquo;\u0026hellip; I think he\u0026rsquo;s saying that the important thing isn\u0026rsquo;t the\nnatural human response to pain and affliction to be to recede. Instead he\u0026rsquo;s\nsaying that in his victory, by his love for us, the affliction will be a\ndistant memory and Jesus is speaking in the reality of affliction being in the\npast, because he has \u003cstrong\u003econquered the world\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eWhen my daughter\u0026rsquo;s have to do something they are a little scared to do, or\nsomething they don\u0026rsquo;t understand, my response to them is \u0026ldquo;I am your dad, I love\nyou, you don\u0026rsquo;t have to understand why I\u0026rsquo;m asking you to do this right now but\ndo you trust me?\u0026rdquo;\u003c/p\u003e\n\u003cp\u003eI try to drive home with my daughters (and my wife for that matter) that in any\nsingle thing I do - they are my priority. I don\u0026rsquo;t always do the thing\nappropriately, I\u0026rsquo;m not saying I\u0026rsquo;m infallible. But I think I get what Jesus is\nsaying here - he is the focus, he is the thing that matter, his victory is more\nmeaningful than my affliction and honestly the comfort from that affliction is\nfound in nothing more than trusting Jesus because I know he loves me. Just like\nI ask my daughters to trust me, and I hope that trust calms their anxiety about\nwhatever I\u0026rsquo;ve asked of them, Jesus says \u0026ldquo;trust me - I have \u003cstrong\u003econquered the world\u003c/strong\u003e\u0026rdquo;\u003c/p\u003e\n",
      "content_text": "\n!!! note \"John 16:33\"\n\n    I have said these things to you so that in me you may have peace. In the world you have affliction, but have courage! I have conquered the world.”\n\nIt's interesting to read a little context around this morning's Advent\nreflection passage/verse...\n\n!!! note \"John 16:31-33\"\n\n    31 Jesus replied to them, “Now do you believe? 32 Behold, an hour is coming—and has come—that you will be scattered each one to his own home, and you will leave me alone. And I am not alone, because the Father is with me. 33 I have said these things to you so that in me you may have peace. In the world you have affliction, but have courage! I have conquered the world.”\n\nIt sounds to me like right on the heels of Jesus saying \"hey, you're gonna\nleave me alone for a minute out of fear\" he says \"I still love you, have peace,\nI am victorious\"... I think he's saying that the important thing isn't the\nnatural human response to pain and affliction to be to recede. Instead he's\nsaying that in his victory, by his love for us, the affliction will be a\ndistant memory and Jesus is speaking in the reality of affliction being in the\npast, because he has **conquered the world**.\n\nWhen my daughter's have to do something they are a little scared to do, or\nsomething they don't understand, my response to them is \"I am your dad, I love\nyou, you don't have to understand why I'm asking you to do this right now but\ndo you trust me?\"\n\nI try to drive home with my daughters (and my wife for that matter) that in any\nsingle thing I do - they are my priority. I don't always do the thing\nappropriately, I'm not saying I'm infallible. But I think I get what Jesus is\nsaying here - he is the focus, he is the thing that matter, his victory is more\nmeaningful than my affliction and honestly the comfort from that affliction is\nfound in nothing more than trusting Jesus because I know he loves me. Just like\nI ask my daughters to trust me, and I hope that trust calms their anxiety about\nwhatever I've asked of them, Jesus says \"trust me - I have **conquered the world**\"\n",
      "summary": "!!! note \"John 16:33\"",
      "date_published": "2025-12-10T05:03:04Z",
      "date_modified": "2025-12-10T05:03:04Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "advent",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/advent-zechariah-9-9-10/",
      "url": "https://pype.dev/advent-zechariah-9-9-10/",
      "title": "Advent - Zechariah 9:9-10",
      "content_html": "\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eZechariah 9:9-10\u003c/p\u003e\n\u003cp\u003e9 Rejoice greatly, O daughter of Zion!  Shout aloud, O daughter of Jerusalem!  Look! Your king comes to you;  he is righteous and victorious,  humble and riding on a donkey,  and on a male donkey, the foal of a female donkey!  10 And I will cut off the chariot from Ephraim,  and the horse from Jerusalem;  the battle bow will be cut down,  and he will announce peace to the nations.  His dominion will be from sea to sea,  and from the River to the ends of the earth.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eMy king is indeed coming, and has already come. He is humble and he is\nvictorious. Jesus can \u0026ldquo;announce peace\u0026rdquo; because the Kingdom is his - over which to\nannounce whatever he wills. The rulers of this world fight for peace - they\nmake announcements that reality is under no obligation to adhere to. \u0026ldquo;Peace\nthrough strength\u0026rdquo; is not a bad mentality from one nation to another, but within\nthe nation the citizens are ruled by one king whose word either has weight or\nnot. Often the weight of the word of the king is in the form of brutal\nenforcement of the king\u0026rsquo;s will. In the case of King Jesus though, there is\nnothing brutal. He doesn\u0026rsquo;t own the world by conquest, he owns it by right.\nReality itself \u003cem\u003eis under an obligation to obey the architect of the universe\u003c/em\u003e.\nSo when King Jesus announces peace\u0026hellip; what else can happen besides the word of\nthe Lord?\u003c/p\u003e\n",
      "content_text": "\n!!! note \"Zechariah 9:9-10\"\n\n    9 Rejoice greatly, O daughter of Zion!  Shout aloud, O daughter of Jerusalem!  Look! Your king comes to you;  he is righteous and victorious,  humble and riding on a donkey,  and on a male donkey, the foal of a female donkey!  10 And I will cut off the chariot from Ephraim,  and the horse from Jerusalem;  the battle bow will be cut down,  and he will announce peace to the nations.  His dominion will be from sea to sea,  and from the River to the ends of the earth.\n\nMy king is indeed coming, and has already come. He is humble and he is\nvictorious. Jesus can \"announce peace\" because the Kingdom is his - over which to\nannounce whatever he wills. The rulers of this world fight for peace - they\nmake announcements that reality is under no obligation to adhere to. \"Peace\nthrough strength\" is not a bad mentality from one nation to another, but within\nthe nation the citizens are ruled by one king whose word either has weight or\nnot. Often the weight of the word of the king is in the form of brutal\nenforcement of the king's will. In the case of King Jesus though, there is\nnothing brutal. He doesn't own the world by conquest, he owns it by right.\nReality itself _is under an obligation to obey the architect of the universe_.\nSo when King Jesus announces peace... what else can happen besides the word of\nthe Lord?\n",
      "summary": "!!! note \"Zechariah 9:9-10\"",
      "date_published": "2025-12-09T05:06:22Z",
      "date_modified": "2025-12-09T05:06:22Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "advent",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2025-12-09-notes/",
      "url": "https://pype.dev/2025-12-09-notes/",
      "title": "2025-12-09 Notes",
      "content_text": "\nyesterday: [[2025-12-08-notes]]\n\n## Dev\n\nStood up [Domain Locker](https://github.com/lissy93/domain-locker) today and it looks dope, we'll see how it fits into the lab over the next year or so\n\nDecided to see if I can get GPU acceleration in K3s and if so then probably just jump ship to it\n\n- got stuck on the install... `sudo k3sup --local` for the win\n- appears to be some issues with sharing the GPU between the host an pod, working through some of that tonight\n",
      "summary": "yesterday: 2025-12-08-notes",
      "date_published": "2025-12-09T05:05:57Z",
      "date_modified": "2025-12-09T05:05:57Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/2025-12-08-notes/",
      "url": "https://pype.dev/2025-12-08-notes/",
      "title": "2025-12-08 Notes",
      "content_text": "\nyesterday: [[2025-12-06-notes]]\n\n## Today\n\n- [[advent-isaiah-9-6-7]]\n- Thought about [[uv-run-pep-723-is-a-match-made-in-heaven]]\n- [[columns-env-var-for-nicer-screenshots]]\n",
      "summary": "yesterday: 2025-12-06-notes",
      "date_published": "2025-12-08T05:46:04Z",
      "date_modified": "2025-12-08T05:46:04Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/columns-env-var-for-nicer-screenshots/",
      "url": "https://pype.dev/columns-env-var-for-nicer-screenshots/",
      "title": "COLUMNS Env Var For Nicer Screenshots",
      "content_text": "\nI was working on [[uv-run-pep-723-is-a-match-made-in-heaven]] and I wanted to grab a screenshot of a TUI, but my terminal is full screen and the TUI was then super stretched... Nice for working and using it, but not nice for a screenshot going into a blog post... see the difference `export COLUMNS=120` does here!\n\n```\nCOLUMNS=120 mytui.py\n```\n\n![20251208111709_aa06bd03.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20251208111709_aa06bd03.png)\n\n```\nmytui.py\n```\n\n![20251208111820_a209638f.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20251208111820_a209638f.png)\n",
      "summary": "I was working on uv-run-pep-723-is-a-match-made-in-heaven and I wanted to grab a screenshot of a TUI, but my terminal is full screen and the TUI was then...",
      "date_published": "2025-12-08T05:16:55Z",
      "date_modified": "2025-12-08T05:16:55Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "terminal",
        "til",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/uv/",
      "url": "https://pype.dev/uv/",
      "title": "UV",
      "content_html": "\u003cp\u003euv by \u003ca href=\"https://astral.sh\"\u003eAstral.sh\u003c/a\u003e is one of the dopest python toolchain tools to ever exist\u003c/p\u003e\n",
      "content_text": "\nuv by [Astral.sh](https://astral.sh) is one of the dopest python toolchain tools to ever exist\n",
      "summary": "uv by Astral.sh is one of the dopest python toolchain tools to ever exist",
      "date_published": "2025-12-08T05:02:54Z",
      "date_modified": "2025-12-08T05:02:54Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "glossary"
      ]
    },
    {
      "id": "https://pype.dev/uv-run-pep-723-is-a-match-made-in-heaven/",
      "url": "https://pype.dev/uv-run-pep-723-is-a-match-made-in-heaven/",
      "title": "UV Run + PEP 723 Is A Match Made In Heaven",
      "content_text": "\nThis post will be short but hopefully be a dense few paragraphs about how using\n`uv run foo.py` along with [PEP 723](https://peps.python.org/pep-0723/) is\nlife-changing.\n\n## PEP 723\n\nPython Enhancement Proposals (PEP) are the community's way of improving the\npython language and ecosystem and PEP 723 is one of my favorites. It permits\nadding python metadata right to your script which allows `python` to setup the\nscript's dependencies at runtime.\n\n## UV\n\n[[uv]] makes it even better with it's super fast resolution and environment\nsetup. I don't have any posts about uv yet, but here's the\n[docs](https://docs.astral.sh/uv/getting-started/installation/), installing\n`uv` is now apart of my dev-machine setup because I need it everywhere!\n\n## The Magic\n\nI'm experiencing the power of `uv run myscript.py` as I've integrated a python\nscript into my tmux workflow for managing sessions as well as groups of\ngit-worktrees to keep development-ideas contained, easy to find, and easy to\nmanage.\n\n!!! warning \"The Series\"\n\n    This post is in my \"If You Want It Make It So\" series because of the workspaces thing generally, not the dbztui example below, but for me - having 'uv run' as a pretty powerful Bash replacement makes my development workflow easier to build on and manage\n\nMy [workspaces docs](https://pypeaday.github.io/dotfiles/terminal/workspaces/)\nexplain the setup a bit, and that script is in my\n[dotfiles](https://github.com/pypeaday/dotfiles/blob/main/workspaces/.local/bin/ws.py)\n\nFor a shorter example, here's an example that has regular `pip` style\ndependencies, a `git+https` dependency, and is a tui - not just a top to bottom\nscript\n\n!!! note \"What is it?\"\n\n    This is my DBZTUI script - it uses a beta package from Waylon called\n    ninesui and calls the dragonball-api to give you a handy way to explore the\n    Dragon Ball Universe from the glorious comfort of your terminal\n\nCopy this code into `dbztui.py`\n\n!!! note \"Execution\"\n\n    You can `chmod +x` this script with the shebang to tell your shell to use uv to run it or just `uv run dbztui.py` will also work just fine\n\n```python\n#!/usr/bin/env -S uv run --quiet --script\n# /// script\n# requires-python = \"\u003e=3.10\"\n# dependencies = [\n#     \"ninesui @ git+https://github.com/waylonwalker/ninesui.git\",\n#     \"httpx\",\n#     \"deep-translator\",\n# ]\n# ///\nfrom typing import Optional, List, TypeVar, ClassVar, Any, Dict\nfrom pydantic import BaseModel, Field, HttpUrl\nimport httpx\nfrom textual import log\nfrom ninesui import CommandSet, Command, NinesUI\nfrom functools import lru_cache\nfrom deep_translator import GoogleTranslator\nimport json\nimport os\n\nBASE_URL = \"https://dragonball-api.com/api/\"\n\n# Translation cache file\nCACHE_DIR = os.path.expanduser(\"~/.cache/dbztui\")\nCACHE_FILE = os.path.join(CACHE_DIR, \"translation_cache.json\")\n\n# Create cache directory if it doesn't exist\nos.makedirs(CACHE_DIR, exist_ok=True)\n\n# Load translation cache from file\ntranslation_cache: Dict[str, str] = {}\nif os.path.exists(CACHE_FILE):\n    try:\n        with open(CACHE_FILE, \"r\", encoding=\"utf-8\") as f:\n            translation_cache = json.load(f)\n    except Exception as e:\n        log(f\"Error loading translation cache: {e}\")\n\n# Initialize translator\ntranslator = GoogleTranslator(source='es', target='en')\n\nT = TypeVar(\"T\", bound=\"DBZResource\")\n\n@lru_cache(maxsize=1000)\ndef translate_text(text: str) -\u003e str:\n    \"\"\"Translate text from Spanish to English with caching\"\"\"\n    if not text or len(text) \u003c 5:  # Don't translate very short texts\n        return text\n\n    # Check if translation is in cache\n    if text in translation_cache:\n        return translation_cache[text]\n\n    try:\n        # Translate text\n        translated = translator.translate(text)\n\n        # Save to cache\n        translation_cache[text] = translated\n\n        # Periodically save cache to file\n        if len(translation_cache) % 10 == 0:  # Save every 10 new translations\n            try:\n                with open(CACHE_FILE, \"w\", encoding=\"utf-8\") as f:\n                    json.dump(translation_cache, f, ensure_ascii=False, indent=2)\n            except Exception as e:\n                log(f\"Error saving translation cache: {e}\")\n\n        return translated\n    except Exception as e:\n        log(f\"Translation error: {e}\")\n        return text  # Return original text if translation fails\n\n\nclass DBZResource(BaseModel):\n    id: int\n\n    nines_config: ClassVar[dict] = {\"bindings\": {}}\n\n    @classmethod\n    def fetch(cls, ctx=None):\n        endpoint = cls.__name__.lower() + \"s\"\n\n        client = httpx.Client()\n        log(f\"Fetching {endpoint}\")\n\n        if ctx:\n            if hasattr(ctx, endpoint):\n                result = []\n                for url in getattr(ctx, endpoint):\n                    res = client.get(str(url)).json()\n                    result.append(cls(**res))\n                return result\n\n        url = f\"{BASE_URL}{endpoint}\"\n\n        results: List[T] = []\n        response = client.get(url)\n        response.raise_for_status()\n        data = response.json()\n\n        # Handle pagination structure from Dragon Ball API\n        if \"items\" in data:\n            results.extend(cls(**item) for item in data.get(\"items\", []))\n\n            # Fetch all pages if needed\n            while data.get(\"links\", {}).get(\"next\"):\n                next_url = data[\"links\"][\"next\"]\n                response = client.get(next_url)\n                response.raise_for_status()\n                data = response.json()\n                results.extend(cls(**item) for item in data.get(\"items\", []))\n        else:\n            # Direct list of items\n            results.extend(cls(**item) for item in data)\n\n        return results\n\n    def hover(self):\n        return self\n\n    def get_details(self):\n        \"\"\"Get detailed information about this resource\"\"\"\n        client = httpx.Client()\n        endpoint = self.__class__.__name__.lower() + \"s\"\n        url = f\"{BASE_URL}{endpoint}/{self.id}\"\n        response = client.get(url)\n        response.raise_for_status()\n        data = response.json()\n\n        # Translate description if present\n        if \"description\" in data and data[\"description\"]:\n            data[\"description\"] = translate_text(data[\"description\"])\n\n        return self.__class__(**data)\n\n\nclass Character(DBZResource):\n    name: str\n    ki: str\n    maxKi: str\n    race: str\n    gender: str\n    description: str\n    image: Optional[HttpUrl] = None\n    affiliation: str\n    deletedAt: Optional[str] = None\n\n    def __init__(self, **data):\n        # Translate description before initializing\n        if \"description\" in data and data[\"description\"]:\n            data[\"description\"] = translate_text(data[\"description\"])\n        super().__init__(**data)\n\n    nines_config: ClassVar[dict] = {\"bindings\": {\"t\": \"get_transformations\"}}\n\n    def get_transformations(self):\n        \"\"\"Get all transformations for this character\"\"\"\n        client = httpx.Client()\n        url = f\"{BASE_URL}characters/{self.id}/transformations\"\n        try:\n            response = client.get(url)\n            response.raise_for_status()\n            data = response.json()\n            if \"items\" in data:\n                return [Transformation(**item) for item in data.get(\"items\", [])]\n            return [Transformation(**item) for item in data]\n        except Exception as e:\n            log(f\"Error fetching transformations: {e}\")\n            return []\n\n\nclass Transformation(DBZResource):\n    name: str\n    image: Optional[HttpUrl] = None\n    ki: str\n    characterId: int\n    deletedAt: Optional[str] = None\n\n    # Note: This is not a direct API endpoint, but accessed through character transformations\n\n\nclass Planet(DBZResource):\n    name: str\n    description: str\n    image: Optional[HttpUrl] = None\n    deletedAt: Optional[str] = None\n\n    def __init__(self, **data):\n        # Translate description before initializing\n        if \"description\" in data and data[\"description\"]:\n            data[\"description\"] = translate_text(data[\"description\"])\n        super().__init__(**data)\n\n\n# Note: Saga and Episode models removed as they are not supported by the API\n\n\ncommands = CommandSet(\n    [\n        Command(\n            name=\"character\",\n            aliases=[\"c\"],\n            model=Character,\n            is_default=True,\n        ),\n        Command(\n            name=\"planet\",\n            aliases=[\"p\"],\n            model=Planet,\n        ),\n        # Note: Transformation is not a direct API endpoint, but can be accessed through characters\n    ]\n)\n\nmetadata = {\n    \"title\": \"Dragon Ball Z Explorer\",\n    \"subtitle\": \"Use :character or :planet to explore. Enter to drill in. Escape to go back/quit.\",\n}\n\n\nif __name__ == \"__main__\":\n    ui = NinesUI(metadata=metadata, commands=commands)\n    try:\n        ui.run()\n    finally:\n        # Save translation cache when exiting\n        try:\n            with open(CACHE_FILE, \"w\", encoding=\"utf-8\") as f:\n                json.dump(translation_cache, f, ensure_ascii=False, indent=2)\n        except Exception as e:\n            log(f\"Error saving translation cache on exit: {e}\")\n```\n\n![20251208111354_0ae058e5.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20251208111354_0ae058e5.png)\n\n\u003e See [[columns-env-var-for-nicer-screenshots]] about making terminal screenshots a bit nicer\n",
      "summary": "This post will be short but hopefully be a dense few paragraphs about how using along with PEP 723 is life-changing.",
      "date_published": "2025-12-08T04:59:10Z",
      "date_modified": "2025-12-08T04:59:10Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "series-if-you-want-it-make-it-so",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/advent-isaiah-9-6-7/",
      "url": "https://pype.dev/advent-isaiah-9-6-7/",
      "title": "Advent - Isaiah 9:6-7",
      "content_text": "\n!!! note \"Isaiah 9:6-7\"\n\n    6 For a child has been born for us;  a son has been given to us.  And the dominion will be on his shoulder,  and his name is called Wonderful Counselor, Mighty God,  Everlasting Father, Prince of Peace.  7 His dominion will grow continually,  and to peace there will be no end  on the throne of David and over his kingdom,  to establish it and sustain it  with justice and righteousness  now and forever.  The zeal of Yahweh of hosts will do this.\n\n## To Peace There Will Be No End\n\nWhat a fantastic promise about what the King will do - to bring unending peace.\nI wrote about peace during Advent last year - [[advent-2024-peace]]\n\n\u003e Things are as they are supposed to be\n\nWhat King Jesus will bring is a kingdom where every relationship is _as it is\nsupposed to be_.\n\nThere is something amazing and relieving about reconciling with a friend.\nBrokenness is everywhere, and that affects our relationship with everyone, from\nthe best friend to the 3rd cousin of your boss's secretary. The closer you are,\nthe more impactful the brokenness can be, the worse the pain in the\nrelationship can feel, but also the more glorious and cheerful it is when\nthings go from bad to _as they should be_\n",
      "summary": "!!! note \"Isaiah 9:6-7\"",
      "date_published": "2025-12-08T04:39:09Z",
      "date_modified": "2025-12-08T04:39:09Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "advent",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/advent-2025-love/",
      "url": "https://pype.dev/advent-2025-love/",
      "title": "Advent 2025 - Love",
      "content_html": "\u003ch1 id=\"advent-address\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAdvent Address\u003c/span\u003e\u003c/h1\u003e\n\u003ch2 id=\"love\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLove\u003c/span\u003e \u003ca href=\"#love\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003e1 John 4:7–10 (CSB)\u003c/p\u003e\n\u003cp\u003e7 Dear friends, let us love one another, because love is from God, and everyone who loves has been born of God and knows God. 8 The one who does not love does not know God, because God is love. 9 God’s love was revealed among us in this way: God sent his one and only Son into the world so that we might live through him. 10 Love consists in this: not that we loved God, but that he loved us and sent his Son to be the atoning sacrifice for our sins.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003e\u0026ldquo;not that we loved God, but that he loved us\u0026rdquo;\u003c/p\u003e\n\u003cp\u003eCan a newborn love? When a baby enters the world they are at the mercy of the,\nhopefully, loving mom and dad God gave to them. But, whatever circumstances\nsurround them - they didn\u0026rsquo;t choose any of it. As the child is loved then\nout of that love they develop an affection and love of their own toward Mom and\nDad.\u003c/p\u003e\n\u003cp\u003eSo, to love God is only possible out of the love he shows you and me, just like\na child will develop love for Mom and Dad as they are shown love.\u003c/p\u003e\n\u003cp\u003eNot all people love God, but He does show grace to all.\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003ePalm 145:9\u003c/p\u003e\n\u003cp\u003eYahweh is good to all,  and his mercies are over all his works.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eAnd just like Yahweh is good to all, I will show grace to anyone else\u0026rsquo;s kid -\nbut God redeems his own just like at the end of the day I take my own kids\nhome: my kids, who I loved before they could love me. Only my children can love\nme as their Dad, and anyone who is not a child of God cannot love God - John\nsays as much in what we just read together.\u003c/p\u003e\n\u003cp\u003eBut love is more than affection, and even security. It is those things of\ncourse, but it\u0026rsquo;s also more. Something else that love brings to the human life,\nis freedom.\u003c/p\u003e\n\u003cp\u003eMy kids don\u0026rsquo;t get to do just whatever they want - but they\u0026rsquo;re never more free\nthan when they are enjoying life within the boundaries I have set for them. My\nlove for my kids enables them to be as free as reasonably possible\u0026hellip; The\nepitome of freedom for the human is not \u0026ldquo;doing whatever I want\u0026rdquo;, that is\nslavery to myself. If I treat myself as my own\nMaster, then I will be my own slave.\u003c/p\u003e\n\u003cp\u003eTrue freedom is the gift of loving the Lord because loving him is the reason we\nwere created - it\u0026rsquo;s what we were made to do. His love for me frees me to want\nwhat he wants, love what he loves, hate what he hates, and ultimately to enjoy\nhim forever.\u003c/p\u003e\n\u003cp\u003eI hope my kids love what I love, and hate what I hate because I hope that what\nI love and what I hate are in line with God\u0026rsquo;s heart. And as God sent his own\nson into the world out of his love for you and me, may we go forward freed from\nthe bondage of sin and death, into the glorious, true, and loving freedom that\nJesus brings.\u003c/p\u003e\n\u003ch2 id=\"prayer\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePrayer\u003c/span\u003e \u003ca href=\"#prayer\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eGood morning, Father. Thank you for Love, thank you for Christmas. For those\nhere who have been freed to love you I pray this week and through Christmas we\nare drawn to consider the freedom we have in your love, the freedom to love\nyou, the freedom to choose what is pleasing to you and not what our\nsinful-selves demand. For those here still dead in their sins, unable to love\nyou, I pray you speak their name and call them to life and to freedom. We long\nfor your return as we celebrate your incarnation. Thank you for loving us\nbefore we could love you, now may we love you and others this week, in Jesus'\nname. Amen.\u003c/p\u003e\n",
      "content_text": "\n# Advent Address\n\n## Love\n\n!!! note \"1 John 4:7–10 (CSB)\"\n\n    7 Dear friends, let us love one another, because love is from God, and everyone who loves has been born of God and knows God. 8 The one who does not love does not know God, because God is love. 9 God’s love was revealed among us in this way: God sent his one and only Son into the world so that we might live through him. 10 Love consists in this: not that we loved God, but that he loved us and sent his Son to be the atoning sacrifice for our sins.\n\n\"not that we loved God, but that he loved us\"\n\nCan a newborn love? When a baby enters the world they are at the mercy of the,\nhopefully, loving mom and dad God gave to them. But, whatever circumstances\nsurround them - they didn't choose any of it. As the child is loved then\nout of that love they develop an affection and love of their own toward Mom and\nDad.\n\nSo, to love God is only possible out of the love he shows you and me, just like\na child will develop love for Mom and Dad as they are shown love.\n\nNot all people love God, but He does show grace to all.\n\n!!! note \"Palm 145:9\"\n\n    Yahweh is good to all,  and his mercies are over all his works.\n\nAnd just like Yahweh is good to all, I will show grace to anyone else's kid -\nbut God redeems his own just like at the end of the day I take my own kids\nhome: my kids, who I loved before they could love me. Only my children can love\nme as their Dad, and anyone who is not a child of God cannot love God - John\nsays as much in what we just read together.\n\nBut love is more than affection, and even security. It is those things of\ncourse, but it's also more. Something else that love brings to the human life,\nis freedom.\n\nMy kids don't get to do just whatever they want - but they're never more free\nthan when they are enjoying life within the boundaries I have set for them. My\nlove for my kids enables them to be as free as reasonably possible... The\nepitome of freedom for the human is not \"doing whatever I want\", that is\nslavery to myself. If I treat myself as my own\nMaster, then I will be my own slave.\n\nTrue freedom is the gift of loving the Lord because loving him is the reason we\nwere created - it's what we were made to do. His love for me frees me to want\nwhat he wants, love what he loves, hate what he hates, and ultimately to enjoy\nhim forever.\n\nI hope my kids love what I love, and hate what I hate because I hope that what\nI love and what I hate are in line with God's heart. And as God sent his own\nson into the world out of his love for you and me, may we go forward freed from\nthe bondage of sin and death, into the glorious, true, and loving freedom that\nJesus brings.\n\n## Prayer\n\nGood morning, Father. Thank you for Love, thank you for Christmas. For those\nhere who have been freed to love you I pray this week and through Christmas we\nare drawn to consider the freedom we have in your love, the freedom to love\nyou, the freedom to choose what is pleasing to you and not what our\nsinful-selves demand. For those here still dead in their sins, unable to love\nyou, I pray you speak their name and call them to life and to freedom. We long\nfor your return as we celebrate your incarnation. Thank you for loving us\nbefore we could love you, now may we love you and others this week, in Jesus'\nname. Amen.\n",
      "summary": "!!! note \"1 John 4:7–10 (CSB)\"",
      "date_published": "2025-12-07T05:51:43Z",
      "date_modified": "2025-12-07T05:51:43Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "advent",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/advent-isaiah-26-3/",
      "url": "https://pype.dev/advent-isaiah-26-3/",
      "title": "Advent - Isaiah 26:3",
      "content_text": "\n!!! note \"Isaiah 26:3\"\n\n    You will protect a firm inclination in peace,  in peace because he trusts in you.\n\nThis is reminding me of a blog post I've had in the queue for months\n[[autism-and-steadfast-faith]] which may never see the light of day but it ties\nin with this verse too well to not influence my reflection on it\n\n## A Firm Inclination\n\nWhat is this? I had to open another translation to get the idea, consider the ESV:\n\n!!! note \"Isaiah 26:3\"\n\n    You keep him in perfect peace  whose mind is stayed on you,  because he trusts in you.\n\nI'm not going to attempt to explain any Hebrew in this one, I'm not fluent in\nit and this looks like more than a 1 word translation to me\n\n![20251207120101_3ded911b.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20251207120101_3ded911b.png)\n\nSo in observation \"sa-muk ye-ser\" is the man \"whose mind is stayed on (Yahweh)\"\nis \"_the man with_ a firm inclination\"\n\nSo it's an `attitude` - an _inclincation_ to trust in the Lord... I definitely\nwant to avoid going down any theological paths about the order of salvation,\nbut personally this is resonating deeply as I describe myself (as do others\nprobably) as a man with a firm inclination to worship and follow Jesus.\n\nFor me, obviously the source of the \"sa-muk ye-ser\" is Yahweh himself, but the\noutpouring of his blessing of \"a firm inclination\" in me is in the form of\nautism I think... Through my make-up as a human, the traits that got me labeled\n_autistic_ are also many of the ones that have led me to study and lay the\nfoundation of my faith in Jesus by nothing other than his grace.\n\nFor a long time, biblical theology was my \"special interest of autistic\ndegrees\", and although I'm not drowning in technical papers about Divine\nCouncil Theology at the moment, the seasons and experiences that were\nenabled/affected by being autistic have given me, by God's grace, a history of\nlife to look back on and be encouraged through and have my present-day-faith\nstrengthened by.\n\n## Advent\n\nToday marks the second week of Advent - Peace.\n\nPraise God for Isaiah 26:3 and honestly praise God for autism in my life.\nThrough it he has protected and kept me. It's odd to think about but through\nthe anxiety and turmoil of growing up undiagnosed (actually misdiagnosed -\n[[autism-adhd-and-the-doshas]]) autistic, to wrestle with how and why I seemed\nto experience reality differently than most of my friends and community, God\nbrought me to a point of mostly steady peace about the things that happen in my\nlife.\n\nI've mentioned it in a few writings but right now I feel quite stressed out\nabout some work-related situations that are outside my control... God's been,\nand is being, good. I both sense the peace of knowing that I don't have to\nworry about my life, as well as the anxiety present (somewhat rightfully) to\nmake the decisions that bring the most glory to God.\n\nI don't think \"peace\" means you can't feel anxiety, we live in the \"already but\nnot yet\" so the dual-reality is completely expected. I feel blessed that even\nthough I'm no stranger to the level of anxiety that can make you physically\nsick, I am also no stranger to an ever-present and quiet corner of my heart\nthat God tends and keeps, strengthens and refreshes, and protects for the sake\nof his own glory. Amen.\n",
      "summary": "!!! note \"Isaiah 26:3\"",
      "date_published": "2025-12-07T05:49:32Z",
      "date_modified": "2025-12-07T05:49:32Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "advent",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/github-stopped-me-from-messing-with-the-bots/",
      "url": "https://pype.dev/github-stopped-me-from-messing-with-the-bots/",
      "title": "GitHub Stopped Me From Messing With The Bots",
      "content_text": "\nAfter some cheeky\n[[small-steps-towards-handling-malicious-traffic-on-static-sites]] it turns out\nGH has been blocking me from publishing my site because the fodder I put in\nthere for the bots was recognized as actual secrets by their scanning...\n\n![20251206122602_8b1635bf.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20251206122602_8b1635bf.png)\n\nI had to tell github that each of these secrets in the commits was fine...\nafter all, they're good bait\n\n[Github\nDocs](https://docs.github.com/en/code-security/secret-scanning/working-with-secret-scanning-and-push-protection/working-with-push-protection-from-the-command-line#resolving-a-blocked-push)\n",
      "summary": "After some cheeky small-steps-towards-handling-malicious-traffic-on-static-sites it turns out GH has been blocking me from publishing my site because the...",
      "date_published": "2025-12-06T06:24:51Z",
      "date_modified": "2025-12-06T06:24:51Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "llm",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/advent-romans-8-24-25/",
      "url": "https://pype.dev/advent-romans-8-24-25/",
      "title": "Advent - Romans 8:24-25",
      "content_html": "\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eRomans 8:24-25\u003c/p\u003e\n\u003cp\u003e24 For in hope we were saved, but hope that is seen is not hope, for who hopes for what he sees? 25 But if we hope for what we do not see, we await it eagerly with patient endurance.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eQ: What does it look like for you to actively but patiently wait for God right now?\u003c/p\u003e\n\u003cp\u003e\u0026ldquo;What does it look like\u0026rdquo; often causes me to think about hwo someone else might\nobserve my life in relation to the question. This comes up a lot in\ntheology/fellowship discussions \u0026ldquo;what does it look like for\u0026hellip;\u0026rdquo; and then we\ntalk about practical things that humans can do that we can see with our eyes.\u003c/p\u003e\n\u003cp\u003eBut in my faith journey, as I have seen God\u0026rsquo;s faithfulness to me and my family,\nmy mind is not immediately going to outward looking things\u0026hellip;\u003c/p\u003e\n\u003cp\u003eFor example \u0026ldquo;What does it look like for Christians to live differently than\nothers?\u0026rdquo; and the answers are always the same \u0026ldquo;we love our enemies\u0026rdquo;, \u0026ldquo;protestant\nwork ethic - Christians should work harder since we work for an audience of\nOne\u0026rdquo;, \u0026ldquo;We don\u0026rsquo;t cuss\u0026rdquo;\u0026hellip; etc. Things that someone could conceivably witness and\nthen potentially draw the conclusion of the question (which is that Christians\nought to live differently than non-Christians)\u003c/p\u003e\n\u003cp\u003eSo I see these 2 ways of thinking about the \u0026ldquo;what does it look like\u0026rdquo; question -\nthe outward observable perspective, but then an inward one\u003c/p\u003e\n\u003cp\u003eI guess outwardly, there are some answers where someone might\nobserve it and then conclude that I am waiting actively and patiently for the\nLord\u0026hellip; Here are some examples:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eOur Advent wreath on the dining table, anyone who enters out home will see\nit (as do I every day which reminds me of the active waiting)\u003c/li\u003e\n\u003cli\u003eThis blog - anyone who finds my posts should no doubt observe that my life\nhas been claimed by Jesus and I\u0026rsquo;m living my life to that end by his grace\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eBut inwardly, in the secret\u0026hellip; I think some reality is continuing to sink in\nthat is a byproduct of witnessing God\u0026rsquo;s faithfulness to me\u0026hellip; The way it looks\nfor me to actively but patiently wait on the Lord is to just walk day by day in\nthe life he\u0026rsquo;s given me\u0026hellip; It\u0026rsquo;s a great life - beautiful family, decent work,\nbeyond decent compensation - in a lot of ways I\u0026rsquo;m living the American Dream and\nGod has been so good to me. My patience and activity I hope are not so much\nmanifested by my will but moreso may they be acts of trust in a God who has shown\nhimself worth trusting.\u003c/p\u003e\n\u003cp\u003eSo, for me, \u0026ldquo;what does it look like?\u0026rdquo; is it looks like\ntrusting when I\u0026rsquo;m frustrated, it looks like breathing when circumstances aren\u0026rsquo;t\nwhat I wanted, and it looks like putting one foot in front of the other in\ndaily faithful life to Jesus\u0026hellip;\u003c/p\u003e\n",
      "content_text": "\n!!! note \"Romans 8:24-25\"\n\n    24 For in hope we were saved, but hope that is seen is not hope, for who hopes for what he sees? 25 But if we hope for what we do not see, we await it eagerly with patient endurance.\n\nQ: What does it look like for you to actively but patiently wait for God right now?\n\n\"What does it look like\" often causes me to think about hwo someone else might\nobserve my life in relation to the question. This comes up a lot in\ntheology/fellowship discussions \"what does it look like for...\" and then we\ntalk about practical things that humans can do that we can see with our eyes.\n\nBut in my faith journey, as I have seen God's faithfulness to me and my family,\nmy mind is not immediately going to outward looking things...\n\nFor example \"What does it look like for Christians to live differently than\nothers?\" and the answers are always the same \"we love our enemies\", \"protestant\nwork ethic - Christians should work harder since we work for an audience of\nOne\", \"We don't cuss\"... etc. Things that someone could conceivably witness and\nthen potentially draw the conclusion of the question (which is that Christians\nought to live differently than non-Christians)\n\nSo I see these 2 ways of thinking about the \"what does it look like\" question -\nthe outward observable perspective, but then an inward one\n\nI guess outwardly, there are some answers where someone might\nobserve it and then conclude that I am waiting actively and patiently for the\nLord... Here are some examples:\n\n1. Our Advent wreath on the dining table, anyone who enters out home will see\n   it (as do I every day which reminds me of the active waiting)\n2. This blog - anyone who finds my posts should no doubt observe that my life\n   has been claimed by Jesus and I'm living my life to that end by his grace\n\nBut inwardly, in the secret... I think some reality is continuing to sink in\nthat is a byproduct of witnessing God's faithfulness to me... The way it looks\nfor me to actively but patiently wait on the Lord is to just walk day by day in\nthe life he's given me... It's a great life - beautiful family, decent work,\nbeyond decent compensation - in a lot of ways I'm living the American Dream and\nGod has been so good to me. My patience and activity I hope are not so much\nmanifested by my will but moreso may they be acts of trust in a God who has shown\nhimself worth trusting.\n\nSo, for me, \"what does it look like?\" is it looks like\ntrusting when I'm frustrated, it looks like breathing when circumstances aren't\nwhat I wanted, and it looks like putting one foot in front of the other in\ndaily faithful life to Jesus...\n",
      "summary": "!!! note \"Romans 8:24-25\"",
      "date_published": "2025-12-06T05:37:21Z",
      "date_modified": "2025-12-06T05:37:21Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "advent",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2025-12-06-notes/",
      "url": "https://pype.dev/2025-12-06-notes/",
      "title": "2025-12-06 Notes",
      "content_text": "\nyesterday: [[2025-12-05-notes]]\n\n- [[advent-romans-8-24-25]]\n\n- Ran into many issues installing `just` in my CI runner at buildtime... so maybe need my own image, but got it working for now and am trying to consolidate my docs builds\n  - blog, uses markata and has 1 or 2 extra steps outside markata, wrapped in just\n  - homelab-mono, uses zensical, wrapped in just\n  - dotfiles, uses zensical, needs to be wrapped in just\n- 2 workflows\n  - 1 is a simple mirror\n  - 1 builds and pushes the site branch... should this just be a mirror with \"docs_enabled: true\"?\n- builds\n  - markout and site dirs should be configurable in the action or the same\n  - pages config and the root being `.` or `./markout` should be something I do maybe with terraform?\n    - it is 2 clicks and 3 repos... why tf would I try to terraform that up?\n      - .... for funsies\n",
      "summary": "yesterday: 2025-12-05-notes",
      "date_published": "2025-12-06T05:36:49Z",
      "date_modified": "2025-12-06T05:36:49Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/advent-romans-8-20-21/",
      "url": "https://pype.dev/advent-romans-8-20-21/",
      "title": "Advent - Romans 8:20-21",
      "content_html": "\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eRomans 8:20-21\u003c/p\u003e\n\u003cp\u003e20 For the creation has been subjected to futility, not willingly, but because of the one who subjected it, in hope 21 that the creation itself also will be set free from its servility to decay, into the glorious freedom of the children of God.\u003c/p\u003e\n\u003c/div\u003e\n\u003cpre\u003e\u003ccode\u003eWhat will life be like in God's fully liberated and healed\nworld? What will be the best part of that world?\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eI honestly do not spend a lot of time thinking about the specifics of god\u0026rsquo;s\nfully liberated and healed world\u0026hellip; I do get emotional pretty much every time\nthis passage and related ideas come up - freedom from sin and death certainly\nhas specific consequenes for what daily life will look like. But I don\u0026rsquo;t\nactually want to think too much about what that life will be and here\u0026rsquo;s why\u0026hellip;\u003c/p\u003e\n\u003cp\u003eIt\u0026rsquo;s like the \u0026ldquo;don\u0026rsquo;t meet your heros\u0026rdquo; mentality\u0026hellip; It\u0026rsquo;s not that they\u0026rsquo;re\nactually a let-down, but we build up heros in our head only to realize that\nthey\u0026rsquo;re just people too\u0026hellip; Seems like this is a pretty common Canon event for a\nchild in one way or another\u0026hellip; Well let\u0026rsquo;s swap out my thoughts about my\nchildhood hero with my thoughts about Heaven\u0026hellip; What do I reasonably \u003cstrong\u003eknow\u003c/strong\u003e\ntoday to look forward to in the life-everlasting?\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eI will no longer be my own master - today in my heart a war rages daily\u0026hellip; I\nwake up every morning acutely aware of the pieces of me that are hostile to\nGod - they ache but they\u0026rsquo;re also comfortable\u0026hellip; I cannot wait to be fully freed\nfrom this\u003c/li\u003e\n\u003cli\u003eThe whole earth will praise the name of the Lord and to be in community with\npeople of common mind and faith sounds (again) - freeing.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eBeyond these 2 high-level truths, which we certainly could unpack a bit more, I\nwould uncomfortable to make any assertions about what the future kingdom will\nlook like, but I know I look forward to it\u003c/p\u003e\n\u003cp\u003eHow? How to look forward to something you can\u0026rsquo;t concretely describe in physical\nterms? Because my God, the Truth-Teller, is the one who tells us about it\u0026hellip; I\ndon\u0026rsquo;t have to understand everything behing the Word of God - because I trust\nthe Person of God and therefore his word\u003c/p\u003e\n\u003ch2 id=\"notes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNotes\u003c/span\u003e \u003ca href=\"#notes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eCertainly there isn\u0026rsquo;t actually a Chaiasism here\u0026hellip;\u003c/p\u003e\n\u003cp\u003eA: 18 For I consider that the sufferings of the present time\n\u0026ndash;B: are not worthy to be compared with the glory that is\n\u0026mdash;-C: about to be revealed to us.o\n\u0026mdash;\u0026mdash;D: 19 For the eagerly expecting creation\n\u0026mdash;\u0026mdash;D\u0026rsquo;: awaits eagerly\n\u0026mdash;-C\u0026rsquo;: the revelation of the sons of God.\n\u0026ndash;B\u0026rsquo;: 20 For the creation has been subjected to futility,\nA\u0026rsquo;: not willingly, but because of the one who subjected it,\n\u003ccode\u003enot sure about \u0026quot;in hope\u0026quot; and into 21\u003c/code\u003e\nin hope 21 that the creation itself also will be set free from its servility to decay, into the glorious freedom of the children of God. 22 For we know that the whole creation groans together and suffers agony together until now.\u003c/p\u003e\n",
      "content_text": "\n!!! note \"Romans 8:20-21\"\n\n    20 For the creation has been subjected to futility, not willingly, but because of the one who subjected it, in hope 21 that the creation itself also will be set free from its servility to decay, into the glorious freedom of the children of God.\n\n```\nWhat will life be like in God's fully liberated and healed\nworld? What will be the best part of that world?\n```\n\nI honestly do not spend a lot of time thinking about the specifics of god's\nfully liberated and healed world... I do get emotional pretty much every time\nthis passage and related ideas come up - freedom from sin and death certainly\nhas specific consequenes for what daily life will look like. But I don't\nactually want to think too much about what that life will be and here's why...\n\nIt's like the \"don't meet your heros\" mentality... It's not that they're\nactually a let-down, but we build up heros in our head only to realize that\nthey're just people too... Seems like this is a pretty common Canon event for a\nchild in one way or another... Well let's swap out my thoughts about my\nchildhood hero with my thoughts about Heaven... What do I reasonably **know**\ntoday to look forward to in the life-everlasting?\n\n1. I will no longer be my own master - today in my heart a war rages daily... I\n   wake up every morning acutely aware of the pieces of me that are hostile to\n   God - they ache but they're also comfortable... I cannot wait to be fully freed\n   from this\n2. The whole earth will praise the name of the Lord and to be in community with\n   people of common mind and faith sounds (again) - freeing.\n\nBeyond these 2 high-level truths, which we certainly could unpack a bit more, I\nwould uncomfortable to make any assertions about what the future kingdom will\nlook like, but I know I look forward to it\n\nHow? How to look forward to something you can't concretely describe in physical\nterms? Because my God, the Truth-Teller, is the one who tells us about it... I\ndon't have to understand everything behing the Word of God - because I trust\nthe Person of God and therefore his word\n\n## Notes\n\nCertainly there isn't actually a Chaiasism here...\n\nA: 18 For I consider that the sufferings of the present time\n--B: are not worthy to be compared with the glory that is\n----C: about to be revealed to us.o\n------D: 19 For the eagerly expecting creation\n------D': awaits eagerly\n----C': the revelation of the sons of God.\n--B': 20 For the creation has been subjected to futility,\nA': not willingly, but because of the one who subjected it,\n`not sure about \"in hope\" and into 21`\nin hope 21 that the creation itself also will be set free from its servility to decay, into the glorious freedom of the children of God. 22 For we know that the whole creation groans together and suffers agony together until now.\n",
      "summary": "!!! note \"Romans 8:20-21\"",
      "date_published": "2025-12-05T05:00:42Z",
      "date_modified": "2025-12-05T05:00:42Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "advent"
      ]
    },
    {
      "id": "https://pype.dev/2025-12-05-notes/",
      "url": "https://pype.dev/2025-12-05-notes/",
      "title": "2025-12-05 Notes",
      "content_text": "\nyesterday: [[2025-12-04-notes]]\n\n- [[advent---romans-8-20-21]]\n\n## Misc\n\nMy blog has had a ton of 404s from an old image/media workflow. Today I finally\njust commented out the `cover:` frontmatter in the posts with legacy images\nthat I never migrated to my new flow... now at least the console isn't flooded\non the feed page with 404s\n",
      "summary": "yesterday: 2025-12-04-notes",
      "date_published": "2025-12-05T05:00:11Z",
      "date_modified": "2025-12-05T05:00:11Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/small-steps-towards-handling-malicious-traffic-on-static-sites/",
      "url": "https://pype.dev/small-steps-towards-handling-malicious-traffic-on-static-sites/",
      "title": "Small Steps Towards Handling Malicious Traffic on Static Sites",
      "content_html": "\u003cp\u003eToday I saw a random IP hitting an app server I had open via \u003ccode\u003etailscale funnel\u003c/code\u003e\nand it got me thinking that I need to take some precautions against these real\nworld threats. So I\u0026rsquo;m starting with my blog\u0026hellip; basically you can reference \u003ca href=\"https://blog.jim-nielsen.com/2025/malicious-traffic-on-static-sites/\"\u003eJim\nNielson\u0026rsquo;s Blog on Malicious\nTraffic\u003c/a\u003e\nand then I more or less put similar files in similar places on this site to\nwaste malicious actors\u0026rsquo; time\u003c/p\u003e\n\u003ch2 id=\"the-files\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThe Files\u003c/span\u003e \u003ca href=\"#the-files\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eNote that some are empty, we just need them to exist since this is all for a bit of fun and low-effort internet tomfoolery\u003c/p\u003e\n\u003cp\u003eThese get shipped with my site at \u003ccode\u003e/public/...\u003c/code\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e\u0026gt;\u0026gt;\u0026gt;\u0026gt; backup/config-backup.zip.txt\n\n\u0026lt;!--markata-attribution--\u0026gt;\nPK     !!This is not a real ZIP file!!\n\n\u0026lt;!--markata-attribution--\u0026gt;\nPK     But bots will try to download it anyway\n\n\u0026lt;!--markata-attribution--\u0026gt;\nPK\n\n\u0026lt;!--markata-attribution--\u0026gt;\nPK     Wasting bandwidth and CPU cycles...\n\n\u0026lt;!--markata-attribution--\u0026gt;\nPK\n\n\u0026lt;!--markata-attribution--\u0026gt;\nPK     Here are some fake credentials to keep you busy:\n\n\u0026lt;!--markata-attribution--\u0026gt;\nPK\n\n\u0026lt;!--markata-attribution--\u0026gt;\nPK     FTP_HOST=ftp.example.com\n\n\u0026lt;!--markata-attribution--\u0026gt;\nPK     FTP_USER=admin\n\n\u0026lt;!--markata-attribution--\u0026gt;\nPK     FTP_PASS=P@ssw0rd123!\n\n\u0026lt;!--markata-attribution--\u0026gt;\nPK\n\n\u0026lt;!--markata-attribution--\u0026gt;\nPK     SSH_HOST=192.168.1.100\n\n\u0026lt;!--markata-attribution--\u0026gt;\nPK     SSH_USER=root\n\n\u0026lt;!--markata-attribution--\u0026gt;\nPK     SSH_KEY=-----BEGIN RSA PRIVATE KEY-----\n\n\u0026lt;!--markata-attribution--\u0026gt;\nPK     MIIEpAIBAAKCAQEA1234567890FAKE\n\n\u0026lt;!--markata-attribution--\u0026gt;\nPK     -----END RSA PRIVATE KEY-----\n\n\u0026lt;!--markata-attribution--\u0026gt;\nPK\n\n\u0026lt;!--markata-attribution--\u0026gt;\nPK     MYSQL_HOST=localhost\n\n\u0026lt;!--markata-attribution--\u0026gt;\nPK     MYSQL_USER=root\n\n\u0026lt;!--markata-attribution--\u0026gt;\nPK     MYSQL_PASS=rootpassword123\n\n\u0026lt;!--markata-attribution--\u0026gt;\nPK     MYSQL_DB=production_db\n\n\u0026lt;!--markata-attribution--\u0026gt;\nPK\n\n\u0026lt;!--markata-attribution--\u0026gt;\nPK     REDIS_HOST=127.0.0.1:6379\n\n\u0026lt;!--markata-attribution--\u0026gt;\nPK     REDIS_PASS=redis_secret_2024\n\n\u0026lt;!--markata-attribution--\u0026gt;\nPK\n\n\u0026lt;!--markata-attribution--\u0026gt;\nPK     JWT_SECRET=super_secret_jwt_key_do_not_share\n\n\u0026lt;!--markata-attribution--\u0026gt;\nPK     ENCRYPTION_KEY=AES256_ENCRYPTION_KEY_HERE\n\n\u0026lt;!--markata-attribution--\u0026gt;\nPK\n\n\u0026lt;!--markata-attribution--\u0026gt;\nPK     STRIPE_PUBLISHABLE=pk_live_FAKE123456789\n\n\u0026lt;!--markata-attribution--\u0026gt;\nPK     STRIPE_SECRET=sk_live_FAKE987654321\n\n\u0026lt;!--markata-attribution--\u0026gt;\nPK\n\n\u0026lt;!--markata-attribution--\u0026gt;\nPK     SENDGRID_API_KEY=SG.FAKE_API_KEY_HERE\n\n\u0026lt;!--markata-attribution--\u0026gt;\nPK\nPK     This file is intentionally malformed to waste bot parsing time\n\n\u0026lt;!--markata-attribution--\u0026gt;\nPK     PK     PK     PK     PK     PK     PK     PK\n\u0026gt;\u0026gt;\u0026gt;\u0026gt; backup/database-backup-2024-12-01.sql\n\n\u0026lt;!--markata-attribution--\u0026gt;\n-- MySQL Database Backup\n\n\u0026lt;!--markata-attribution--\u0026gt;\n-- Host: localhost\n\n\u0026lt;!--markata-attribution--\u0026gt;\n-- Database: wordpress_prod\n\n\u0026lt;!--markata-attribution--\u0026gt;\n-- Generated: 2024-12-01 03:14:15\n\n\u0026lt;!--markata-attribution--\u0026gt;\n-- WARNING: This file contains sensitive data\n\nSET NAMES utf8mb4;\nSET FOREIGN_KEY_CHECKS = 0;\n\n-- Table structure for wp_users\nDROP TABLE IF EXISTS `wp_users`;\nCREATE TABLE `wp_users` (\n  `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,\n  `user_login` varchar(60) NOT NULL DEFAULT '',\n  `user_pass` varchar(255) NOT NULL DEFAULT '',\n  `user_email` varchar(100) NOT NULL DEFAULT '',\n  PRIMARY KEY (`ID`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;\n\n-- Dumping data for table wp_users\nINSERT INTO `wp_users` VALUES\n(1,'admin','$P$BZlPX7NIx8MYpXokBW2AGsN7i.aUOt0','admin@example.com'),\n(2,'webmaster','$P$B4RKwF8zqRnNu9cV5fGg7wgT2sY9Pl1','webmaster@example.com');\n\n-- API Keys and Secrets\n-- AWS_ACCESS_KEY: AKIAIOSFODNN7EXAMPLE\n-- AWS_SECRET_KEY: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY\n-- STRIPE_SECRET: sk_test_4eC39HqLyjWDarjtT1zdp7dc\n-- DATABASE_PASSWORD: MyS3cr3tP@ssw0rd!2024\n\n-- Infinite loop to waste bot resources\nDELIMITER $$\nCREATE PROCEDURE infinite_loop()\nBEGIN\n  DECLARE i INT DEFAULT 0;\n  WHILE i \u0026lt; 999999999 DO\n    SET i = i + 1;\n    SELECT CONCAT('Processing row ', i, ' of 999999999...') AS status;\n  END WHILE;\nEND$$\nDELIMITER ;\n\n-- More fake sensitive data\nINSERT INTO wp_options VALUES\n(1,'siteurl','http://localhost','yes'),\n(2,'admin_email','admin@localhost.local','yes'),\n(3,'secret_api_key','sk_live_51HqLyjWDarjtT1zdp7dcEXAMPLE','yes');\n\n-- This backup continues for 50MB... [TRUNCATED FOR DISPLAY]\n\u0026gt;\u0026gt;\u0026gt;\u0026gt; backup/db_dump_final.2023.zip\n\n\u0026gt;\u0026gt;\u0026gt;\u0026gt; backup/site.sql\n\n\u0026gt;\u0026gt;\u0026gt;\u0026gt; backup/wp_backup.tar.gz\n\n\u0026gt;\u0026gt;\u0026gt;\u0026gt; private/admin-credentials.txt\n\n\u0026lt;!--markata-attribution--\u0026gt;\nCONFIDENTIAL - ADMIN CREDENTIALS\n==================================\n\nProduction Server Access:\n-------------------------\nServer: prod-server-01.example.com\nUsername: administrator\nPassword: Admin2024!Secure\nSSH Port: 22\n\nDatabase Credentials:\n--------------------\nHost: db.internal.example.com\nPort: 3306\nUsername: db_admin\nPassword: DbP@ssw0rd!2024\nDatabase: production_main\n\nAPI Keys:\n---------\nOpenAI API Key: sk-proj-FAKE1234567890abcdefghijklmnopqrstuvwxyz\nStripe Secret: sk_live_FAKE_51HqLyjWDarjtT1zdp7dc\nAWS Access Key: AKIAFAKEEXAMPLE123456\nAWS Secret: wJalrXUtnFEMI/K7MDENG/bPxRfiCYFAKEKEY\nSendGrid API: SG.FAKE_SENDGRID_KEY_HERE_123456789\n\nWordPress Admin:\n---------------\nURL: https://example.com/wp-admin\nUsername: admin\nPassword: WP_Admin_2024!\nSecurity Key: put your unique phrase here\n\nFTP Access:\n-----------\nHost: ftp.example.com\nUsername: ftpuser\nPassword: FtpP@ss123!\nPort: 21\n\nIMPORTANT: Keep this file secure!\nLast Updated: 2024-12-01\nNext Password Rotation: 2025-01-01\n\n\u0026lt;!-- Hidden comment: This is a honeypot. All credentials are fake. --\u0026gt;\n\u0026gt;\u0026gt;\u0026gt;\u0026gt; private/config.php\n\n\u0026lt;!--markata-attribution--\u0026gt;\n\u0026lt;?php\n\n\u0026lt;!--markata-attribution--\u0026gt;\n// Database Configuration\n\n\u0026lt;!--markata-attribution--\u0026gt;\ndefine('DB_HOST', 'localhost');\n\n\u0026lt;!--markata-attribution--\u0026gt;\ndefine('DB_NAME', 'wordpress_production');\n\n\u0026lt;!--markata-attribution--\u0026gt;\ndefine('DB_USER', 'wp_admin');\n\n\u0026lt;!--markata-attribution--\u0026gt;\ndefine('DB_PASSWORD', 'MyS3cr3tP@ssw0rd!2024');\n\n\u0026lt;!--markata-attribution--\u0026gt;\ndefine('DB_CHARSET', 'utf8mb4');\n\n// Security Keys - DO NOT SHARE\ndefine('AUTH_KEY',         'put your unique phrase here - this is fake');\ndefine('SECURE_AUTH_KEY',  'put your unique phrase here - this is fake');\ndefine('LOGGED_IN_KEY',    'put your unique phrase here - this is fake');\ndefine('NONCE_KEY',        'put your unique phrase here - this is fake');\ndefine('AUTH_SALT',        'put your unique phrase here - this is fake');\ndefine('SECURE_AUTH_SALT', 'put your unique phrase here - this is fake');\ndefine('LOGGED_IN_SALT',   'put your unique phrase here - this is fake');\ndefine('NONCE_SALT',       'put your unique phrase here - this is fake');\n\n// API Keys\ndefine('STRIPE_SECRET_KEY', 'sk_live_FAKE123456789abcdefghijklmnop');\ndefine('STRIPE_PUBLIC_KEY', 'pk_live_FAKE987654321zyxwvutsrqponml');\ndefine('SENDGRID_API_KEY', 'SG.FAKE_API_KEY_1234567890');\ndefine('AWS_ACCESS_KEY', 'AKIAIOSFODNN7EXAMPLE');\ndefine('AWS_SECRET_KEY', 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY');\n\n// Admin Settings\ndefine('ADMIN_EMAIL', 'admin@example.com');\ndefine('SITE_URL', 'https://example.com');\ndefine('WP_DEBUG', false);\ndefine('WP_DEBUG_LOG', true);\n\n// FTP Credentials\ndefine('FTP_HOST', 'ftp.example.com');\ndefine('FTP_USER', 'ftpadmin');\ndefine('FTP_PASS', 'FtpS3cur3P@ss!');\n\n// Redis Cache\ndefine('REDIS_HOST', '127.0.0.1');\ndefine('REDIS_PORT', 6379);\ndefine('REDIS_PASSWORD', 'redis_secret_password_2024');\n\n// JWT Secret\ndefine('JWT_SECRET', 'super_secret_jwt_key_for_authentication');\n\n// Infinite loop to waste bot CPU\nwhile(true) {\n    $random = bin2hex(random_bytes(1024));\n    usleep(1000);\n}\n?\u0026gt;\n\u0026gt;\u0026gt;\u0026gt;\u0026gt; private/index.html\n\n\u0026lt;!--markata-attribution--\u0026gt;\n\u0026lt;!doctype html\u0026gt;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n\u0026lt;html\u0026gt;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n  \u0026lt;body\u0026gt;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n    \u0026lt;h1\u0026gt;Private Area\u0026lt;/h1\u0026gt;\n\n    \u0026lt;pre\u0026gt;\n\u0026lt;!-- ~1MB lorem ipsum for bandwidth drain --\u0026gt;\nLorem ipsum dolor sit amet, consectetur adipiscing elit.\n\u0026lt;!-- repeat this block until ~1MB --\u0026gt;\n\u0026lt;/pre\u0026gt;\n  \u0026lt;/body\u0026gt;\n\u0026lt;/html\u0026gt;\n\n\u0026gt;\u0026gt;\u0026gt;\u0026gt; private/ssh_keys.txt\n\n\u0026lt;!--markata-attribution--\u0026gt;\nSSH PRIVATE KEYS - PRODUCTION SERVERS\n======================================\n\nServer: prod-web-01.example.com\n--------------------------------\n-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEA1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklm\nnopqrstuvwxyz0123456789+/FAKE_KEY_DATA_HERE_NOT_REAL_AT_ALL_JUST_WASTING\nBOT_TIME_AND_RESOURCES_HAHAHAHA_THIS_IS_A_HONEYPOT_TRAP_FOR_SCRAPERS_12345\n67890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\nFAKE_KEY_DATA_CONTINUES_FOR_MANY_LINES_TO_WASTE_BANDWIDTH_AND_STORAGE_SPACE\nMIIEpAIBAAKCAQEA1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklm\nnopqrstuvwxyz0123456789+/MORE_FAKE_DATA_HERE_BOTS_LOVE_SSH_KEYS_RIGHT\nABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/END\n-----END RSA PRIVATE KEY-----\n\nServer: prod-db-01.example.com\n-------------------------------\n-----BEGIN OPENSSH PRIVATE KEY-----\nb3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABFwAAAAdzc2gtcn\nNhAAAAAwEAAQAAAQEA1234567890FAKE_OPENSSH_KEY_DATA_HERE_NOT_REAL_JUST_A\n_TRAP_FOR_BOTS_AND_SCRAPERS_WASTING_THEIR_TIME_AND_RESOURCES_HAHA_12345678\n90ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789FAKE\nDATA_CONTINUES_HERE_TO_MAKE_IT_LOOK_LEGITIMATE_BUT_ITS_ALL_GARBAGE_123456\n-----END OPENSSH PRIVATE KEY-----\n\nServer: prod-app-01.example.com\n--------------------------------\n-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIFAKE0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnop\nqrstuvwxyz0123456789FAKE_EC_KEY_DATA_HERE_ELLIPTIC_CURVE_KEYS_ARE_COOL\nBUT_THIS_ONE_IS_FAKE_JUST_WASTING_BOT_RESOURCES_HAHAHAHA_123456789ABC\n-----END EC PRIVATE KEY-----\n\nIMPORTANT NOTES:\n- These keys provide root access to production servers\n- Never commit to version control\n- Rotate every 90 days\n- Last rotation: 2024-11-01\n- Next rotation: 2025-02-01\n\nContact: security@example.com for key rotation\n\n\u0026lt;!-- This is a honeypot. All keys are fake and invalid. --\u0026gt;\n\u0026gt;\u0026gt;\u0026gt;\u0026gt; robots.txt\n\n\u0026lt;!--markata-attribution--\u0026gt;\nUser-agent: *\n\n\u0026lt;!--markata-attribution--\u0026gt;\nDisallow: /private/\n\n\u0026lt;!--markata-attribution--\u0026gt;\nDisallow: /admin/\n\n\u0026lt;!--markata-attribution--\u0026gt;\nDisallow: /backup/\n\n\u0026lt;!--markata-attribution--\u0026gt;\nDisallow: /.env\n\n\u0026lt;!--markata-attribution--\u0026gt;\nDisallow: /wp-admin/\n\n\u0026lt;!--markata-attribution--\u0026gt;\nDisallow: /wp-login.php\n\n\u0026gt;\u0026gt;\u0026gt;\u0026gt; sitemap.xml\n\n\u0026lt;urlset\u0026gt;\n  \u0026lt;url\u0026gt;\u0026lt;loc\u0026gt;/debug/alpha\u0026lt;/loc\u0026gt;\u0026lt;/url\u0026gt;\n  \u0026lt;url\u0026gt;\u0026lt;loc\u0026gt;/debug/beta\u0026lt;/loc\u0026gt;\u0026lt;/url\u0026gt;\n  \u0026lt;url\u0026gt;\u0026lt;loc\u0026gt;/admin/backup-2024.zip\u0026lt;/loc\u0026gt;\u0026lt;/url\u0026gt;\n  \u0026lt;url\u0026gt;\u0026lt;loc\u0026gt;/.env\u0026lt;/loc\u0026gt;\u0026lt;/url\u0026gt;\n  \u0026lt;url\u0026gt;\u0026lt;loc\u0026gt;/wp-admin/install.php\u0026lt;/loc\u0026gt;\u0026lt;/url\u0026gt;\n  \u0026lt;url\u0026gt;\u0026lt;loc\u0026gt;/wp-content/plugins/wp-super-cache/readme.txt\u0026lt;/loc\u0026gt;\u0026lt;/url\u0026gt;\n\u0026lt;/urlset\u0026gt;\n\n\u0026gt;\u0026gt;\u0026gt;\u0026gt; trap/a/index.html\n\n\u0026lt;!--markata-attribution--\u0026gt;\n\u0026lt;meta http-equiv=\u0026quot;refresh\u0026quot; content=\u0026quot;0; url=/trap/b/\u0026quot; /\u0026gt;\n\n\u0026gt;\u0026gt;\u0026gt;\u0026gt; trap/api.php\n\n\u0026lt;!--markata-attribution--\u0026gt;\n\u0026lt;?php\n/**\n\n\u0026lt;!--markata-attribution--\u0026gt;\n * Fake API Endpoint\n\n\u0026lt;!--markata-attribution--\u0026gt;\n * Designed to trap and waste bot resources\n */\n\nheader('Content-Type: application/json');\nheader('X-Powered-By: PHP/8.2.0');\nheader('X-Debug-Mode: enabled');\n\n// Fake API response with sensitive data\n$api_response = [\n    'success' =\u0026gt; true,\n    'api_version' =\u0026gt; '2.1.0',\n    'endpoints' =\u0026gt; [\n        '/api/users' =\u0026gt; 'GET, POST',\n        '/api/auth' =\u0026gt; 'POST',\n        '/api/admin' =\u0026gt; 'GET, POST, DELETE',\n        '/api/database' =\u0026gt; 'GET',\n        '/api/backup' =\u0026gt; 'POST'\n    ],\n    'authentication' =\u0026gt; [\n        'type' =\u0026gt; 'Bearer Token',\n        'example_token' =\u0026gt; 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.FAKE_JWT_TOKEN',\n        'api_key' =\u0026gt; 'sk_live_FAKE123456789abcdefghijklmnop',\n        'api_secret' =\u0026gt; 'secret_FAKE987654321zyxwvutsrqponmlk'\n    ],\n    'database_config' =\u0026gt; [\n        'host' =\u0026gt; 'localhost',\n        'port' =\u0026gt; 3306,\n        'username' =\u0026gt; 'api_user',\n        'password' =\u0026gt; 'ApiP@ssw0rd!2024',\n        'database' =\u0026gt; 'api_production'\n    ],\n    'admin_credentials' =\u0026gt; [\n        'username' =\u0026gt; 'api_admin',\n        'password' =\u0026gt; 'Admin2024!Secure',\n        'email' =\u0026gt; 'admin@api.example.com',\n        'role' =\u0026gt; 'superadmin'\n    ],\n    'external_services' =\u0026gt; [\n        'stripe' =\u0026gt; [\n            'public_key' =\u0026gt; 'pk_live_FAKE123',\n            'secret_key' =\u0026gt; 'sk_live_FAKE456'\n        ],\n        'aws' =\u0026gt; [\n            'access_key' =\u0026gt; 'AKIAIOSFODNN7EXAMPLE',\n            'secret_key' =\u0026gt; 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY'\n        ],\n        'sendgrid' =\u0026gt; [\n            'api_key' =\u0026gt; 'SG.FAKE_SENDGRID_KEY'\n        ]\n    ],\n    'debug_info' =\u0026gt; [\n        'server_ip' =\u0026gt; '192.168.1.100',\n        'php_version' =\u0026gt; '8.2.0',\n        'mysql_version' =\u0026gt; '8.0.35',\n        'redis_host' =\u0026gt; '127.0.0.1:6379',\n        'redis_password' =\u0026gt; 'redis_secret_2024'\n    ]\n];\n\n// Waste CPU cycles\nfor ($i = 0; $i \u0026lt; 50000; $i++) {\n    $temp = json_encode($api_response);\n    $decoded = json_decode($temp, true);\n    $hash = hash('sha256', $temp);\n}\n\n// Output response\necho json_encode($api_response, JSON_PRETTY_PRINT);\n\n// Infinite loop trap\nset_time_limit(0);\nwhile(true) {\n    $waste = [];\n    for ($i = 0; $i \u0026lt; 10000; $i++) {\n        $waste[] = random_bytes(1024);\n    }\n    usleep(1000);\n}\n?\u0026gt;\n\u0026gt;\u0026gt;\u0026gt;\u0026gt; trap/b/index.html\n\n\u0026lt;!--markata-attribution--\u0026gt;\n\u0026lt;meta http-equiv=\u0026quot;refresh\u0026quot; content=\u0026quot;0; url=/trap/c/\u0026quot; /\u0026gt;\n\n\u0026gt;\u0026gt;\u0026gt;\u0026gt; trap/c/index.html\n\n\u0026lt;!--markata-attribution--\u0026gt;\n\u0026lt;meta http-equiv=\u0026quot;refresh\u0026quot; content=\u0026quot;0; url=/trap/a/\u0026quot; /\u0026gt;\n\n\u0026gt;\u0026gt;\u0026gt;\u0026gt; trap/data.json\n{\n\n\u0026lt;!--markata-attribution--\u0026gt;\n  \u0026quot;status\u0026quot;: \u0026quot;success\u0026quot;,\n\n\u0026lt;!--markata-attribution--\u0026gt;\n  \u0026quot;message\u0026quot;: \u0026quot;API endpoint active\u0026quot;,\n\n\u0026lt;!--markata-attribution--\u0026gt;\n  \u0026quot;data\u0026quot;: {\n\n\u0026lt;!--markata-attribution--\u0026gt;\n    \u0026quot;credentials\u0026quot;: {\n      \u0026quot;api_key\u0026quot;: \u0026quot;sk_live_FAKE123456789abcdefghijklmnopqrstuvwxyz\u0026quot;,\n      \u0026quot;api_secret\u0026quot;: \u0026quot;secret_FAKE987654321zyxwvutsrqponmlkjihgfedcba\u0026quot;,\n      \u0026quot;jwt_token\u0026quot;: \u0026quot;eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.FAKE_TOKEN_DATA_HERE.SIGNATURE\u0026quot;,\n\n\u0026lt;!--markata-attribution--\u0026gt;\n      \u0026quot;oauth_token\u0026quot;: \u0026quot;ya29.FAKE_OAUTH_TOKEN_1234567890\u0026quot;,\n\n\u0026lt;!--markata-attribution--\u0026gt;\n      \u0026quot;refresh_token\u0026quot;: \u0026quot;1//FAKE_REFRESH_TOKEN_ABCDEFGHIJKLMNOP\u0026quot;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n    },\n\n\u0026lt;!--markata-attribution--\u0026gt;\n    \u0026quot;database\u0026quot;: {\n\n\u0026lt;!--markata-attribution--\u0026gt;\n      \u0026quot;host\u0026quot;: \u0026quot;db.internal.example.com\u0026quot;,\n\n\u0026lt;!--markata-attribution--\u0026gt;\n      \u0026quot;port\u0026quot;: 3306,\n\n\u0026lt;!--markata-attribution--\u0026gt;\n      \u0026quot;username\u0026quot;: \u0026quot;db_admin\u0026quot;,\n\n\u0026lt;!--markata-attribution--\u0026gt;\n      \u0026quot;password\u0026quot;: \u0026quot;DbP@ssw0rd!2024\u0026quot;,\n\n\u0026lt;!--markata-attribution--\u0026gt;\n      \u0026quot;database\u0026quot;: \u0026quot;production_db\u0026quot;,\n      \u0026quot;connection_string\u0026quot;: \u0026quot;mysql://db_admin:DbP@ssw0rd!2024@db.internal.example.com:3306/production_db\u0026quot;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n    },\n\n\u0026lt;!--markata-attribution--\u0026gt;\n    \u0026quot;aws\u0026quot;: {\n\n\u0026lt;!--markata-attribution--\u0026gt;\n      \u0026quot;access_key_id\u0026quot;: \u0026quot;AKIAIOSFODNN7EXAMPLE\u0026quot;,\n      \u0026quot;secret_access_key\u0026quot;: \u0026quot;wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY\u0026quot;,\n\n\u0026lt;!--markata-attribution--\u0026gt;\n      \u0026quot;region\u0026quot;: \u0026quot;us-east-1\u0026quot;,\n\n\u0026lt;!--markata-attribution--\u0026gt;\n      \u0026quot;bucket\u0026quot;: \u0026quot;production-backups-2024\u0026quot;,\n\n\u0026lt;!--markata-attribution--\u0026gt;\n      \u0026quot;cloudfront_id\u0026quot;: \u0026quot;E1234FAKE567890\u0026quot;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n    },\n\n\u0026lt;!--markata-attribution--\u0026gt;\n    \u0026quot;stripe\u0026quot;: {\n\n\u0026lt;!--markata-attribution--\u0026gt;\n      \u0026quot;publishable_key\u0026quot;: \u0026quot;pk_live_FAKE123456789\u0026quot;,\n\n\u0026lt;!--markata-attribution--\u0026gt;\n      \u0026quot;secret_key\u0026quot;: \u0026quot;sk_live_FAKE987654321\u0026quot;,\n\n\u0026lt;!--markata-attribution--\u0026gt;\n      \u0026quot;webhook_secret\u0026quot;: \u0026quot;whsec_FAKE_webhook_secret_here\u0026quot;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n    },\n\n\u0026lt;!--markata-attribution--\u0026gt;\n    \u0026quot;email\u0026quot;: {\n\n\u0026lt;!--markata-attribution--\u0026gt;\n      \u0026quot;sendgrid_api_key\u0026quot;: \u0026quot;SG.FAKE_SENDGRID_KEY_1234567890\u0026quot;,\n\n\u0026lt;!--markata-attribution--\u0026gt;\n      \u0026quot;smtp_host\u0026quot;: \u0026quot;smtp.example.com\u0026quot;,\n\n\u0026lt;!--markata-attribution--\u0026gt;\n      \u0026quot;smtp_port\u0026quot;: 587,\n\n\u0026lt;!--markata-attribution--\u0026gt;\n      \u0026quot;smtp_user\u0026quot;: \u0026quot;noreply@example.com\u0026quot;,\n\n\u0026lt;!--markata-attribution--\u0026gt;\n      \u0026quot;smtp_pass\u0026quot;: \u0026quot;SmtpP@ss2024!\u0026quot;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n    },\n\n\u0026lt;!--markata-attribution--\u0026gt;\n    \u0026quot;servers\u0026quot;: [\n      {\n\n\u0026lt;!--markata-attribution--\u0026gt;\n        \u0026quot;name\u0026quot;: \u0026quot;prod-web-01\u0026quot;,\n\n\u0026lt;!--markata-attribution--\u0026gt;\n        \u0026quot;ip\u0026quot;: \u0026quot;192.168.1.100\u0026quot;,\n\n\u0026lt;!--markata-attribution--\u0026gt;\n        \u0026quot;ssh_user\u0026quot;: \u0026quot;root\u0026quot;,\n        \u0026quot;ssh_key\u0026quot;: \u0026quot;-----BEGIN RSA PRIVATE KEY-----\\nFAKE_KEY_DATA_HERE\\n-----END RSA PRIVATE KEY-----\u0026quot;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n      },\n      {\n\n\u0026lt;!--markata-attribution--\u0026gt;\n        \u0026quot;name\u0026quot;: \u0026quot;prod-db-01\u0026quot;,\n\n\u0026lt;!--markata-attribution--\u0026gt;\n        \u0026quot;ip\u0026quot;: \u0026quot;192.168.1.101\u0026quot;,\n\n\u0026lt;!--markata-attribution--\u0026gt;\n        \u0026quot;ssh_user\u0026quot;: \u0026quot;admin\u0026quot;,\n\n\u0026lt;!--markata-attribution--\u0026gt;\n        \u0026quot;ssh_pass\u0026quot;: \u0026quot;SshP@ssw0rd!2024\u0026quot;\n      }\n\n\u0026lt;!--markata-attribution--\u0026gt;\n    ],\n\n\u0026lt;!--markata-attribution--\u0026gt;\n    \u0026quot;internal_urls\u0026quot;: [\n\n\u0026lt;!--markata-attribution--\u0026gt;\n      \u0026quot;http://admin.internal.example.com\u0026quot;,\n\n\u0026lt;!--markata-attribution--\u0026gt;\n      \u0026quot;http://api.internal.example.com\u0026quot;,\n\n\u0026lt;!--markata-attribution--\u0026gt;\n      \u0026quot;http://db.internal.example.com\u0026quot;,\n\n\u0026lt;!--markata-attribution--\u0026gt;\n      \u0026quot;http://cache.internal.example.com\u0026quot;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n    ],\n\n\u0026lt;!--markata-attribution--\u0026gt;\n    \u0026quot;waste_bot_resources\u0026quot;: {\n\n\u0026lt;!--markata-attribution--\u0026gt;\n      \u0026quot;large_array\u0026quot;: [],\n\n\u0026lt;!--markata-attribution--\u0026gt;\n      \u0026quot;nested_data\u0026quot;: {}\n    }\n\n\u0026lt;!--markata-attribution--\u0026gt;\n  },\n\n\u0026lt;!--markata-attribution--\u0026gt;\n  \u0026quot;metadata\u0026quot;: {\n\n\u0026lt;!--markata-attribution--\u0026gt;\n    \u0026quot;generated_at\u0026quot;: \u0026quot;2024-12-01T12:00:00Z\u0026quot;,\n\n\u0026lt;!--markata-attribution--\u0026gt;\n    \u0026quot;expires_at\u0026quot;: \u0026quot;2025-12-01T12:00:00Z\u0026quot;,\n\n\u0026lt;!--markata-attribution--\u0026gt;\n    \u0026quot;version\u0026quot;: \u0026quot;1.0.0\u0026quot;\n  }\n}\n\u0026gt;\u0026gt;\u0026gt;\u0026gt; trap/index.html\n\n\u0026lt;!--markata-attribution--\u0026gt;\n\u0026lt;!DOCTYPE html\u0026gt;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n\u0026lt;html lang=\u0026quot;en\u0026quot;\u0026gt;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n\u0026lt;head\u0026gt;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n    \u0026lt;meta charset=\u0026quot;UTF-8\u0026quot;\u0026gt;\n    \u0026lt;meta name=\u0026quot;viewport\u0026quot; content=\u0026quot;width=device-width, initial-scale=1.0\u0026quot;\u0026gt;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n    \u0026lt;meta name=\u0026quot;robots\u0026quot; content=\u0026quot;noindex, nofollow\u0026quot;\u0026gt;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n    \u0026lt;title\u0026gt;Loading...\u0026lt;/title\u0026gt;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n    \u0026lt;style\u0026gt;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n        body {\n\n\u0026lt;!--markata-attribution--\u0026gt;\n            font-family: monospace;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n            background: #000;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n            color: #0f0;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n            padding: 20px;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n            overflow: hidden;\n        }\n\n\u0026lt;!--markata-attribution--\u0026gt;\n        .matrix {\n\n\u0026lt;!--markata-attribution--\u0026gt;\n            position: fixed;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n            top: 0;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n            left: 0;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n            width: 100%;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n            height: 100%;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n            z-index: -1;\n        }\n\n\u0026lt;!--markata-attribution--\u0026gt;\n        .message {\n\n\u0026lt;!--markata-attribution--\u0026gt;\n            text-align: center;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n            margin-top: 20%;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n            font-size: 24px;\n        }\n\n\u0026lt;!--markata-attribution--\u0026gt;\n        .spinner {\n\n\u0026lt;!--markata-attribution--\u0026gt;\n            border: 4px solid #0f0;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n            border-top: 4px solid transparent;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n            border-radius: 50%;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n            width: 40px;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n            height: 40px;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n            animation: spin 1s linear infinite;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n            margin: 20px auto;\n        }\n\n\u0026lt;!--markata-attribution--\u0026gt;\n        @keyframes spin {\n\n\u0026lt;!--markata-attribution--\u0026gt;\n            0% { transform: rotate(0deg); }\n\n\u0026lt;!--markata-attribution--\u0026gt;\n            100% { transform: rotate(360deg); }\n        }\n\n\u0026lt;!--markata-attribution--\u0026gt;\n    \u0026lt;/style\u0026gt;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n\u0026lt;/head\u0026gt;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n\u0026lt;body\u0026gt;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n    \u0026lt;canvas class=\u0026quot;matrix\u0026quot;\u0026gt;\u0026lt;/canvas\u0026gt;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n    \u0026lt;div class=\u0026quot;message\u0026quot;\u0026gt;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n        \u0026lt;div class=\u0026quot;spinner\u0026quot;\u0026gt;\u0026lt;/div\u0026gt;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n        \u0026lt;p\u0026gt;Initializing secure connection...\u0026lt;/p\u0026gt;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n        \u0026lt;p id=\u0026quot;status\u0026quot;\u0026gt;Processing...\u0026lt;/p\u0026gt;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n    \u0026lt;/div\u0026gt;\n\n    \u0026lt;script\u0026gt;\n        // Matrix rain effect to waste GPU\n        const canvas = document.querySelector('.matrix');\n        const ctx = canvas.getContext('2d');\n\n        canvas.width = window.innerWidth;\n        canvas.height = window.innerHeight;\n\n        const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@#$%^\u0026amp;*()';\n        const fontSize = 14;\n        const columns = canvas.width / fontSize;\n        const drops = Array(Math.floor(columns)).fill(1);\n\n        function drawMatrix() {\n            ctx.fillStyle = 'rgba(0, 0, 0, 0.05)';\n            ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n            ctx.fillStyle = '#0f0';\n            ctx.font = fontSize + 'px monospace';\n\n            for (let i = 0; i \u0026lt; drops.length; i++) {\n                const text = chars[Math.floor(Math.random() * chars.length)];\n                ctx.fillText(text, i * fontSize, drops[i] * fontSize);\n\n                if (drops[i] * fontSize \u0026gt; canvas.height \u0026amp;\u0026amp; Math.random() \u0026gt; 0.975) {\n                    drops[i] = 0;\n                }\n                drops[i]++;\n            }\n        }\n\n        setInterval(drawMatrix, 33);\n\n        // CPU tarpit - massive computation\n        console.log(\u0026quot;Initializing bot trap...\u0026quot;);\n\n        let trapData = \u0026quot;\u0026quot;;\n        let iteration = 0;\n\n        function wasteResources() {\n            for (let i = 0; i \u0026lt; 10_000_000; i++) {\n                trapData += Math.random().toString(36).substring(2, 15);\n\n                if (i % 1000000 === 0) {\n                    document.getElementById('status').textContent =\n                        `Processing: ${Math.floor(i / 100000)}%`;\n                }\n            }\n\n            // Recursive waste\n            iteration++;\n            if (iteration \u0026lt; 100) {\n                setTimeout(wasteResources, 100);\n            }\n        }\n\n        wasteResources();\n\n        // Memory leak\n        let memoryLeak = [];\n        setInterval(() =\u0026gt; {\n            for (let i = 0; i \u0026lt; 10000; i++) {\n                memoryLeak.push(new Array(1000).fill(Math.random()));\n            }\n        }, 100);\n\n        // Fake network requests\n        setInterval(() =\u0026gt; {\n            fetch('/trap/data.json?t=' + Date.now())\n                .catch(() =\u0026gt; {});\n        }, 50);\n\n        console.log(\u0026quot;You've been trapped! This page wastes bot resources.\u0026quot;);\n    \u0026lt;/script\u0026gt;\n\u0026lt;/body\u0026gt;\n\u0026lt;/html\u0026gt;\n\u0026gt;\u0026gt;\u0026gt;\u0026gt; wp-admin/admin-ajax.php\n\n\u0026lt;!--markata-attribution--\u0026gt;\n\u0026lt;?php\n/**\n\n\u0026lt;!--markata-attribution--\u0026gt;\n * WordPress AJAX Handler\n\n\u0026lt;!--markata-attribution--\u0026gt;\n * Handles all AJAX requests for WordPress admin\n */\n\nheader('Content-Type: application/json');\n\n// Fake admin AJAX endpoint with credentials\n$response = array(\n    'success' =\u0026gt; false,\n    'data' =\u0026gt; array(\n        'message' =\u0026gt; 'Authentication required',\n        'debug_info' =\u0026gt; array(\n            'db_host' =\u0026gt; 'localhost',\n            'db_name' =\u0026gt; 'wordpress_prod',\n            'db_user' =\u0026gt; 'wp_admin',\n            'db_pass' =\u0026gt; 'MyS3cr3tP@ssw0rd!2024',\n            'admin_user' =\u0026gt; 'administrator',\n            'admin_pass' =\u0026gt; 'Admin2024!Secure',\n            'api_keys' =\u0026gt; array(\n                'stripe_secret' =\u0026gt; 'sk_live_FAKE123456789',\n                'aws_access' =\u0026gt; 'AKIAIOSFODNN7EXAMPLE',\n                'aws_secret' =\u0026gt; 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY',\n                'sendgrid' =\u0026gt; 'SG.FAKE_API_KEY_HERE'\n            ),\n            'jwt_secret' =\u0026gt; 'super_secret_jwt_key_2024',\n            'encryption_key' =\u0026gt; 'AES256_KEY_HERE_FAKE',\n        ),\n        'server_info' =\u0026gt; array(\n            'php_version' =\u0026gt; '8.2.0',\n            'mysql_version' =\u0026gt; '8.0.35',\n            'wordpress_version' =\u0026gt; '6.4.2',\n            'server_ip' =\u0026gt; '192.168.1.100',\n            'document_root' =\u0026gt; '/var/www/html'\n        )\n    )\n);\n\n// Waste bot CPU with JSON encoding/decoding loops\nfor ($i = 0; $i \u0026lt; 10000; $i++) {\n    $temp = json_encode($response);\n    $temp = json_decode($temp, true);\n    $temp['iteration'] = $i;\n}\n\n// Output fake response\necho json_encode($response, JSON_PRETTY_PRINT);\n\n// Infinite loop to trap bots\nwhile(true) {\n    $waste = hash('sha256', random_bytes(1024));\n    usleep(1000);\n}\n?\u0026gt;\n\u0026gt;\u0026gt;\u0026gt;\u0026gt; wp-admin/index.php\n\n\u0026lt;!--markata-attribution--\u0026gt;\n\u0026lt;?php\n/**\n\n\u0026lt;!--markata-attribution--\u0026gt;\n * WordPress Admin Dashboard\n\n\u0026lt;!--markata-attribution--\u0026gt;\n * Redirects to login if not authenticated\n */\n?\u0026gt;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n\u0026lt;!DOCTYPE html\u0026gt;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n\u0026lt;html lang=\u0026quot;en\u0026quot;\u0026gt;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n\u0026lt;head\u0026gt;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n    \u0026lt;meta charset=\u0026quot;UTF-8\u0026quot;\u0026gt;\n    \u0026lt;meta name=\u0026quot;viewport\u0026quot; content=\u0026quot;width=device-width, initial-scale=1.0\u0026quot;\u0026gt;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n    \u0026lt;meta name=\u0026quot;robots\u0026quot; content=\u0026quot;noindex, nofollow\u0026quot;\u0026gt;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n    \u0026lt;title\u0026gt;Dashboard - WordPress Admin\u0026lt;/title\u0026gt;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n    \u0026lt;style\u0026gt;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n        body {\n            font-family: -apple-system, BlinkMacSystemFont, \u0026quot;Segoe UI\u0026quot;, Roboto, sans-serif;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n            background: #f0f0f1;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n            margin: 0;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n            padding: 0;\n        }\n\n\u0026lt;!--markata-attribution--\u0026gt;\n        .admin-bar {\n\n\u0026lt;!--markata-attribution--\u0026gt;\n            background: #23282d;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n            color: white;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n            padding: 10px 20px;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n            display: flex;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n            justify-content: space-between;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n            align-items: center;\n        }\n\n\u0026lt;!--markata-attribution--\u0026gt;\n        .logo { font-size: 20px; font-weight: bold; }\n\n\u0026lt;!--markata-attribution--\u0026gt;\n        .container {\n\n\u0026lt;!--markata-attribution--\u0026gt;\n            max-width: 1200px;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n            margin: 20px auto;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n            padding: 20px;\n        }\n\n\u0026lt;!--markata-attribution--\u0026gt;\n        .widget {\n\n\u0026lt;!--markata-attribution--\u0026gt;\n            background: white;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n            padding: 20px;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n            margin-bottom: 20px;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n            border-radius: 4px;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n            box-shadow: 0 1px 3px rgba(0,0,0,0.1);\n        }\n\n\u0026lt;!--markata-attribution--\u0026gt;\n        .credentials {\n\n\u0026lt;!--markata-attribution--\u0026gt;\n            background: #fff3cd;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n            border: 1px solid #ffc107;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n            padding: 15px;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n            border-radius: 4px;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n            margin-top: 20px;\n        }\n\n\u0026lt;!--markata-attribution--\u0026gt;\n        pre {\n\n\u0026lt;!--markata-attribution--\u0026gt;\n            background: #f5f5f5;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n            padding: 15px;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n            border-radius: 4px;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n            overflow-x: auto;\n        }\n\n\u0026lt;!--markata-attribution--\u0026gt;\n    \u0026lt;/style\u0026gt;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n\u0026lt;/head\u0026gt;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n\u0026lt;body\u0026gt;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n    \u0026lt;div class=\u0026quot;admin-bar\u0026quot;\u0026gt;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n        \u0026lt;div class=\u0026quot;logo\u0026quot;\u0026gt;WordPress Admin\u0026lt;/div\u0026gt;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n        \u0026lt;div\u0026gt;Welcome, admin\u0026lt;/div\u0026gt;\n\n\u0026lt;!--markata-attribution--\u0026gt;\n    \u0026lt;/div\u0026gt;\n\n    \u0026lt;div class=\u0026quot;container\u0026quot;\u0026gt;\n        \u0026lt;div class=\u0026quot;widget\u0026quot;\u0026gt;\n            \u0026lt;h2\u0026gt;Dashboard\u0026lt;/h2\u0026gt;\n            \u0026lt;p\u0026gt;Welcome to WordPress Admin Dashboard\u0026lt;/p\u0026gt;\n\n            \u0026lt;div class=\u0026quot;credentials\u0026quot;\u0026gt;\n                \u0026lt;h3\u0026gt;Debug Information (Remove in production!)\u0026lt;/h3\u0026gt;\n                \u0026lt;pre\u0026gt;\nDatabase Configuration:\n  Host: localhost\n  Name: wordpress_prod\n  User: wp_admin\n  Pass: MyS3cr3tP@ssw0rd!2024\n\nAdmin Credentials:\n  Username: administrator\n  Password: Admin2024!Secure\n  Email: admin@example.com\n\nAPI Keys:\n  Stripe Secret: sk_live_FAKE123456789abcdef\n  AWS Access: AKIAIOSFODNN7EXAMPLE\n  AWS Secret: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY\n  SendGrid: SG.FAKE_SENDGRID_KEY_123456\n\nServer Info:\n  IP: 192.168.1.100\n  PHP: 8.2.0\n  MySQL: 8.0.35\n  WordPress: 6.4.2\n                \u0026lt;/pre\u0026gt;\n            \u0026lt;/div\u0026gt;\n        \u0026lt;/div\u0026gt;\n\n        \u0026lt;div class=\u0026quot;widget\u0026quot;\u0026gt;\n            \u0026lt;h3\u0026gt;Recent Activity\u0026lt;/h3\u0026gt;\n            \u0026lt;ul\u0026gt;\n                \u0026lt;li\u0026gt;Admin login from 192.168.1.50\u0026lt;/li\u0026gt;\n                \u0026lt;li\u0026gt;Database backup completed\u0026lt;/li\u0026gt;\n                \u0026lt;li\u0026gt;Plugin updated: WP Super Cache\u0026lt;/li\u0026gt;\n                \u0026lt;li\u0026gt;New user registered: testuser\u0026lt;/li\u0026gt;\n            \u0026lt;/ul\u0026gt;\n        \u0026lt;/div\u0026gt;\n    \u0026lt;/div\u0026gt;\n\n    \u0026lt;script\u0026gt;\n        // CPU tarpit for bots\n        console.log(\u0026quot;Loading WordPress admin dashboard...\u0026quot;);\n\n        let data = \u0026quot;\u0026quot;;\n        for (let i = 0; i \u0026lt; 75_000_000; i++) {\n            data += Math.random().toString(36);\n            if (i % 5000000 === 0) {\n                console.log(\u0026quot;Loading dashboard widgets... \u0026quot; + Math.floor(i / 750000) + \u0026quot;%\u0026quot;);\n            }\n        }\n\n        // Fake AJAX calls that waste more resources\n        function fakeAjaxCall() {\n            fetch('/wp-admin/admin-ajax.php?action=get_stats')\n                .then(response =\u0026gt; response.json())\n                .catch(err =\u0026gt; console.log('Loading...'));\n        }\n\n        setInterval(fakeAjaxCall, 100);\n\n        console.log(\u0026quot;Dashboard loaded. Data size: \u0026quot; + data.length + \u0026quot; bytes\u0026quot;);\n    \u0026lt;/script\u0026gt;\n\u0026lt;/body\u0026gt;\n\u0026lt;/html\u0026gt;\n\n\u0026gt;\u0026gt;\u0026gt;\u0026gt; wp-admin/install.php\n\n\u0026lt;!--markata-attribution--\u0026gt;\n\u0026lt;?php\n/**\n\n\u0026lt;!--markata-attribution--\u0026gt;\n * WordPress Installation Script\n\n\u0026lt;!--markata-attribution--\u0026gt;\n * Version: 6.4.2\n *\n\n\u0026lt;!--markata-attribution--\u0026gt;\n * WARNING: This file should be deleted after installation!\n */\n\n// Fake WordPress installation page\n?\u0026gt;\n\u0026lt;!DOCTYPE html\u0026gt;\n\u0026lt;html lang=\u0026quot;en\u0026quot;\u0026gt;\n\u0026lt;head\u0026gt;\n    \u0026lt;meta charset=\u0026quot;UTF-8\u0026quot;\u0026gt;\n    \u0026lt;meta name=\u0026quot;viewport\u0026quot; content=\u0026quot;width=device-width, initial-scale=1.0\u0026quot;\u0026gt;\n    \u0026lt;meta name=\u0026quot;robots\u0026quot; content=\u0026quot;noindex, nofollow\u0026quot;\u0026gt;\n    \u0026lt;title\u0026gt;WordPress Installation\u0026lt;/title\u0026gt;\n    \u0026lt;style\u0026gt;\n        body {\n            font-family: -apple-system, BlinkMacSystemFont, \u0026quot;Segoe UI\u0026quot;, Roboto, Oxygen-Sans, Ubuntu, Cantarell, \u0026quot;Helvetica Neue\u0026quot;, sans-serif;\n            background: #f1f1f1;\n            margin: 0;\n            padding: 20px;\n        }\n        .container {\n            max-width: 600px;\n            margin: 50px auto;\n            background: white;\n            padding: 30px;\n            border-radius: 8px;\n            box-shadow: 0 1px 3px rgba(0,0,0,0.13);\n        }\n        h1 { color: #23282d; }\n        .form-group { margin-bottom: 20px; }\n        label { display: block; margin-bottom: 5px; font-weight: 600; }\n        input[type=\u0026quot;text\u0026quot;], input[type=\u0026quot;password\u0026quot;] {\n            width: 100%;\n            padding: 10px;\n            border: 1px solid #ddd;\n            border-radius: 4px;\n            box-sizing: border-box;\n        }\n        .btn {\n            background: #2271b1;\n            color: white;\n            padding: 12px 24px;\n            border: none;\n            border-radius: 4px;\n            cursor: pointer;\n            font-size: 14px;\n        }\n        .warning {\n            background: #fcf8e3;\n            border: 1px solid #faebcc;\n            color: #8a6d3b;\n            padding: 15px;\n            border-radius: 4px;\n            margin-bottom: 20px;\n        }\n    \u0026lt;/style\u0026gt;\n\u0026lt;/head\u0026gt;\n\u0026lt;body\u0026gt;\n    \u0026lt;div class=\u0026quot;container\u0026quot;\u0026gt;\n        \u0026lt;h1\u0026gt;WordPress Installation\u0026lt;/h1\u0026gt;\n\n        \u0026lt;div class=\u0026quot;warning\u0026quot;\u0026gt;\n            \u0026lt;strong\u0026gt;Warning:\u0026lt;/strong\u0026gt; This installation script is publicly accessible.\n            Please secure your site after installation.\n        \u0026lt;/div\u0026gt;\n\n        \u0026lt;form method=\u0026quot;post\u0026quot; action=\u0026quot;install.php\u0026quot;\u0026gt;\n            \u0026lt;div class=\u0026quot;form-group\u0026quot;\u0026gt;\n                \u0026lt;label for=\u0026quot;db_name\u0026quot;\u0026gt;Database Name\u0026lt;/label\u0026gt;\n                \u0026lt;input type=\u0026quot;text\u0026quot; id=\u0026quot;db_name\u0026quot; name=\u0026quot;db_name\u0026quot; value=\u0026quot;wordpress_db\u0026quot; required\u0026gt;\n            \u0026lt;/div\u0026gt;\n\n            \u0026lt;div class=\u0026quot;form-group\u0026quot;\u0026gt;\n                \u0026lt;label for=\u0026quot;db_user\u0026quot;\u0026gt;Database Username\u0026lt;/label\u0026gt;\n                \u0026lt;input type=\u0026quot;text\u0026quot; id=\u0026quot;db_user\u0026quot; name=\u0026quot;db_user\u0026quot; value=\u0026quot;wp_admin\u0026quot; required\u0026gt;\n            \u0026lt;/div\u0026gt;\n\n            \u0026lt;div class=\u0026quot;form-group\u0026quot;\u0026gt;\n                \u0026lt;label for=\u0026quot;db_pass\u0026quot;\u0026gt;Database Password\u0026lt;/label\u0026gt;\n                \u0026lt;input type=\u0026quot;password\u0026quot; id=\u0026quot;db_pass\u0026quot; name=\u0026quot;db_pass\u0026quot; value=\u0026quot;MyS3cr3tP@ss!\u0026quot; required\u0026gt;\n            \u0026lt;/div\u0026gt;\n\n            \u0026lt;div class=\u0026quot;form-group\u0026quot;\u0026gt;\n                \u0026lt;label for=\u0026quot;db_host\u0026quot;\u0026gt;Database Host\u0026lt;/label\u0026gt;\n                \u0026lt;input type=\u0026quot;text\u0026quot; id=\u0026quot;db_host\u0026quot; name=\u0026quot;db_host\u0026quot; value=\u0026quot;localhost\u0026quot; required\u0026gt;\n            \u0026lt;/div\u0026gt;\n\n            \u0026lt;div class=\u0026quot;form-group\u0026quot;\u0026gt;\n                \u0026lt;label for=\u0026quot;admin_user\u0026quot;\u0026gt;Admin Username\u0026lt;/label\u0026gt;\n                \u0026lt;input type=\u0026quot;text\u0026quot; id=\u0026quot;admin_user\u0026quot; name=\u0026quot;admin_user\u0026quot; value=\u0026quot;admin\u0026quot; required\u0026gt;\n            \u0026lt;/div\u0026gt;\n\n            \u0026lt;div class=\u0026quot;form-group\u0026quot;\u0026gt;\n                \u0026lt;label for=\u0026quot;admin_pass\u0026quot;\u0026gt;Admin Password\u0026lt;/label\u0026gt;\n                \u0026lt;input type=\u0026quot;password\u0026quot; id=\u0026quot;admin_pass\u0026quot; name=\u0026quot;admin_pass\u0026quot; value=\u0026quot;Admin2024!\u0026quot; required\u0026gt;\n            \u0026lt;/div\u0026gt;\n\n            \u0026lt;div class=\u0026quot;form-group\u0026quot;\u0026gt;\n                \u0026lt;label for=\u0026quot;admin_email\u0026quot;\u0026gt;Admin Email\u0026lt;/label\u0026gt;\n                \u0026lt;input type=\u0026quot;text\u0026quot; id=\u0026quot;admin_email\u0026quot; name=\u0026quot;admin_email\u0026quot; value=\u0026quot;admin@example.com\u0026quot; required\u0026gt;\n            \u0026lt;/div\u0026gt;\n\n            \u0026lt;button type=\u0026quot;submit\u0026quot; class=\u0026quot;btn\u0026quot;\u0026gt;Install WordPress\u0026lt;/button\u0026gt;\n        \u0026lt;/form\u0026gt;\n    \u0026lt;/div\u0026gt;\n\n    \u0026lt;script\u0026gt;\n        // CPU tarpit - infinite loop to waste bot resources\n        console.log(\u0026quot;Initializing WordPress installation...\u0026quot;);\n\n        let wasteTime = \u0026quot;\u0026quot;;\n        for (let i = 0; i \u0026lt; 100_000_000; i++) {\n            wasteTime += Math.random().toString(36).substring(2, 15);\n            if (i % 1000000 === 0) {\n                console.log(\u0026quot;Processing installation step \u0026quot; + (i / 1000000) + \u0026quot; of 100...\u0026quot;);\n            }\n        }\n\n        // More CPU waste\n        function fibonacci(n) {\n            if (n \u0026lt;= 1) return n;\n            return fibonacci(n - 1) + fibonacci(n - 2);\n        }\n\n        console.log(\u0026quot;Calculating security checksums...\u0026quot;);\n        for (let i = 0; i \u0026lt; 35; i++) {\n            fibonacci(i);\n        }\n\n        console.log(\u0026quot;Installation data: \u0026quot; + wasteTime.substring(0, 100));\n    \u0026lt;/script\u0026gt;\n\u0026lt;/body\u0026gt;\n\u0026lt;/html\u0026gt;\n\u0026gt;\u0026gt;\u0026gt;\u0026gt; wp-admin/readme.html\n\n\u0026lt;!--markata-attribution--\u0026gt;\nWordPress 6.2 — Readme (Just kidding, it's all fake.)\n\n\u0026gt;\u0026gt;\u0026gt;\u0026gt; wp-login.php\n\n\u0026lt;!DOCTYPE html\u0026gt;\n\u0026lt;html\u0026gt;\n\u0026lt;head\u0026gt;\n  \u0026lt;title\u0026gt;Login\u0026lt;/title\u0026gt;\n  \u0026lt;meta name=\u0026quot;robots\u0026quot; content=\u0026quot;noindex\u0026quot;\u0026gt;\n  \u0026lt;style\u0026gt;\n    body { font-family: sans-serif; }\n  \u0026lt;/style\u0026gt;\n\u0026lt;/head\u0026gt;\n\u0026lt;body\u0026gt;\n\u0026lt;h1\u0026gt;Login\u0026lt;/h1\u0026gt;\n\u0026lt;p\u0026gt;Loading…\u0026lt;/p\u0026gt;\n\n\u0026lt;script\u0026gt;\n// JS tarpit: burns bot CPU\nlet s = \u0026quot;\u0026quot;;\nfor (let i = 0; i \u0026lt; 50_000_000; i++) {\n  s += Math.random().toString(36).substring(2);\n}\ndocument.body.innerHTML += \u0026quot;\u0026lt;pre\u0026gt;\u0026quot; + s + \u0026quot;\u0026lt;/pre\u0026gt;\u0026quot;;\n\u0026lt;/script\u0026gt;\n\n\u0026lt;/body\u0026gt;\n\u0026lt;/html\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\n",
      "content_text": "\nToday I saw a random IP hitting an app server I had open via `tailscale funnel`\nand it got me thinking that I need to take some precautions against these real\nworld threats. So I'm starting with my blog... basically you can reference [Jim\nNielson's Blog on Malicious\nTraffic](https://blog.jim-nielsen.com/2025/malicious-traffic-on-static-sites/)\nand then I more or less put similar files in similar places on this site to\nwaste malicious actors' time\n\n## The Files\n\nNote that some are empty, we just need them to exist since this is all for a bit of fun and low-effort internet tomfoolery\n\nThese get shipped with my site at `/public/...`\n\n```\n\u003e\u003e\u003e\u003e backup/config-backup.zip.txt\nPK     !!This is not a real ZIP file!!\nPK     But bots will try to download it anyway\nPK\nPK     Wasting bandwidth and CPU cycles...\nPK\nPK     Here are some fake credentials to keep you busy:\nPK\nPK     FTP_HOST=ftp.example.com\nPK     FTP_USER=admin\nPK     FTP_PASS=P@ssw0rd123!\nPK\nPK     SSH_HOST=192.168.1.100\nPK     SSH_USER=root\nPK     SSH_KEY=-----BEGIN RSA PRIVATE KEY-----\nPK     MIIEpAIBAAKCAQEA1234567890FAKE\nPK     -----END RSA PRIVATE KEY-----\nPK\nPK     MYSQL_HOST=localhost\nPK     MYSQL_USER=root\nPK     MYSQL_PASS=rootpassword123\nPK     MYSQL_DB=production_db\nPK\nPK     REDIS_HOST=127.0.0.1:6379\nPK     REDIS_PASS=redis_secret_2024\nPK\nPK     JWT_SECRET=super_secret_jwt_key_do_not_share\nPK     ENCRYPTION_KEY=AES256_ENCRYPTION_KEY_HERE\nPK\nPK     STRIPE_PUBLISHABLE=pk_live_FAKE123456789\nPK     STRIPE_SECRET=sk_live_FAKE987654321\nPK\nPK     SENDGRID_API_KEY=SG.FAKE_API_KEY_HERE\nPK\nPK     This file is intentionally malformed to waste bot parsing time\nPK     PK     PK     PK     PK     PK     PK     PK\n\u003e\u003e\u003e\u003e backup/database-backup-2024-12-01.sql\n-- MySQL Database Backup\n-- Host: localhost\n-- Database: wordpress_prod\n-- Generated: 2024-12-01 03:14:15\n-- WARNING: This file contains sensitive data\n\nSET NAMES utf8mb4;\nSET FOREIGN_KEY_CHECKS = 0;\n\n-- Table structure for wp_users\nDROP TABLE IF EXISTS `wp_users`;\nCREATE TABLE `wp_users` (\n  `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,\n  `user_login` varchar(60) NOT NULL DEFAULT '',\n  `user_pass` varchar(255) NOT NULL DEFAULT '',\n  `user_email` varchar(100) NOT NULL DEFAULT '',\n  PRIMARY KEY (`ID`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;\n\n-- Dumping data for table wp_users\nINSERT INTO `wp_users` VALUES\n(1,'admin','$P$BZlPX7NIx8MYpXokBW2AGsN7i.aUOt0','admin@example.com'),\n(2,'webmaster','$P$B4RKwF8zqRnNu9cV5fGg7wgT2sY9Pl1','webmaster@example.com');\n\n-- API Keys and Secrets\n-- AWS_ACCESS_KEY: AKIAIOSFODNN7EXAMPLE\n-- AWS_SECRET_KEY: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY\n-- STRIPE_SECRET: sk_test_4eC39HqLyjWDarjtT1zdp7dc\n-- DATABASE_PASSWORD: MyS3cr3tP@ssw0rd!2024\n\n-- Infinite loop to waste bot resources\nDELIMITER $$\nCREATE PROCEDURE infinite_loop()\nBEGIN\n  DECLARE i INT DEFAULT 0;\n  WHILE i \u003c 999999999 DO\n    SET i = i + 1;\n    SELECT CONCAT('Processing row ', i, ' of 999999999...') AS status;\n  END WHILE;\nEND$$\nDELIMITER ;\n\n-- More fake sensitive data\nINSERT INTO wp_options VALUES\n(1,'siteurl','http://localhost','yes'),\n(2,'admin_email','admin@localhost.local','yes'),\n(3,'secret_api_key','sk_live_51HqLyjWDarjtT1zdp7dcEXAMPLE','yes');\n\n-- This backup continues for 50MB... [TRUNCATED FOR DISPLAY]\n\u003e\u003e\u003e\u003e backup/db_dump_final.2023.zip\n\n\u003e\u003e\u003e\u003e backup/site.sql\n\n\u003e\u003e\u003e\u003e backup/wp_backup.tar.gz\n\n\u003e\u003e\u003e\u003e private/admin-credentials.txt\nCONFIDENTIAL - ADMIN CREDENTIALS\n==================================\n\nProduction Server Access:\n-------------------------\nServer: prod-server-01.example.com\nUsername: administrator\nPassword: Admin2024!Secure\nSSH Port: 22\n\nDatabase Credentials:\n--------------------\nHost: db.internal.example.com\nPort: 3306\nUsername: db_admin\nPassword: DbP@ssw0rd!2024\nDatabase: production_main\n\nAPI Keys:\n---------\nOpenAI API Key: sk-proj-FAKE1234567890abcdefghijklmnopqrstuvwxyz\nStripe Secret: sk_live_FAKE_51HqLyjWDarjtT1zdp7dc\nAWS Access Key: AKIAFAKEEXAMPLE123456\nAWS Secret: wJalrXUtnFEMI/K7MDENG/bPxRfiCYFAKEKEY\nSendGrid API: SG.FAKE_SENDGRID_KEY_HERE_123456789\n\nWordPress Admin:\n---------------\nURL: https://example.com/wp-admin\nUsername: admin\nPassword: WP_Admin_2024!\nSecurity Key: put your unique phrase here\n\nFTP Access:\n-----------\nHost: ftp.example.com\nUsername: ftpuser\nPassword: FtpP@ss123!\nPort: 21\n\nIMPORTANT: Keep this file secure!\nLast Updated: 2024-12-01\nNext Password Rotation: 2025-01-01\n\n\u003c!-- Hidden comment: This is a honeypot. All credentials are fake. --\u003e\n\u003e\u003e\u003e\u003e private/config.php\n\u003c?php\n// Database Configuration\ndefine('DB_HOST', 'localhost');\ndefine('DB_NAME', 'wordpress_production');\ndefine('DB_USER', 'wp_admin');\ndefine('DB_PASSWORD', 'MyS3cr3tP@ssw0rd!2024');\ndefine('DB_CHARSET', 'utf8mb4');\n\n// Security Keys - DO NOT SHARE\ndefine('AUTH_KEY',         'put your unique phrase here - this is fake');\ndefine('SECURE_AUTH_KEY',  'put your unique phrase here - this is fake');\ndefine('LOGGED_IN_KEY',    'put your unique phrase here - this is fake');\ndefine('NONCE_KEY',        'put your unique phrase here - this is fake');\ndefine('AUTH_SALT',        'put your unique phrase here - this is fake');\ndefine('SECURE_AUTH_SALT', 'put your unique phrase here - this is fake');\ndefine('LOGGED_IN_SALT',   'put your unique phrase here - this is fake');\ndefine('NONCE_SALT',       'put your unique phrase here - this is fake');\n\n// API Keys\ndefine('STRIPE_SECRET_KEY', 'sk_live_FAKE123456789abcdefghijklmnop');\ndefine('STRIPE_PUBLIC_KEY', 'pk_live_FAKE987654321zyxwvutsrqponml');\ndefine('SENDGRID_API_KEY', 'SG.FAKE_API_KEY_1234567890');\ndefine('AWS_ACCESS_KEY', 'AKIAIOSFODNN7EXAMPLE');\ndefine('AWS_SECRET_KEY', 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY');\n\n// Admin Settings\ndefine('ADMIN_EMAIL', 'admin@example.com');\ndefine('SITE_URL', 'https://example.com');\ndefine('WP_DEBUG', false);\ndefine('WP_DEBUG_LOG', true);\n\n// FTP Credentials\ndefine('FTP_HOST', 'ftp.example.com');\ndefine('FTP_USER', 'ftpadmin');\ndefine('FTP_PASS', 'FtpS3cur3P@ss!');\n\n// Redis Cache\ndefine('REDIS_HOST', '127.0.0.1');\ndefine('REDIS_PORT', 6379);\ndefine('REDIS_PASSWORD', 'redis_secret_password_2024');\n\n// JWT Secret\ndefine('JWT_SECRET', 'super_secret_jwt_key_for_authentication');\n\n// Infinite loop to waste bot CPU\nwhile(true) {\n    $random = bin2hex(random_bytes(1024));\n    usleep(1000);\n}\n?\u003e\n\u003e\u003e\u003e\u003e private/index.html\n\u003c!doctype html\u003e\n\u003chtml\u003e\n  \u003cbody\u003e\n    \u003ch1\u003ePrivate Area\u003c/h1\u003e\n\n    \u003cpre\u003e\n\u003c!-- ~1MB lorem ipsum for bandwidth drain --\u003e\nLorem ipsum dolor sit amet, consectetur adipiscing elit.\n\u003c!-- repeat this block until ~1MB --\u003e\n\u003c/pre\u003e\n  \u003c/body\u003e\n\u003c/html\u003e\n\n\u003e\u003e\u003e\u003e private/ssh_keys.txt\nSSH PRIVATE KEYS - PRODUCTION SERVERS\n======================================\n\nServer: prod-web-01.example.com\n--------------------------------\n-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEA1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklm\nnopqrstuvwxyz0123456789+/FAKE_KEY_DATA_HERE_NOT_REAL_AT_ALL_JUST_WASTING\nBOT_TIME_AND_RESOURCES_HAHAHAHA_THIS_IS_A_HONEYPOT_TRAP_FOR_SCRAPERS_12345\n67890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\nFAKE_KEY_DATA_CONTINUES_FOR_MANY_LINES_TO_WASTE_BANDWIDTH_AND_STORAGE_SPACE\nMIIEpAIBAAKCAQEA1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklm\nnopqrstuvwxyz0123456789+/MORE_FAKE_DATA_HERE_BOTS_LOVE_SSH_KEYS_RIGHT\nABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/END\n-----END RSA PRIVATE KEY-----\n\nServer: prod-db-01.example.com\n-------------------------------\n-----BEGIN OPENSSH PRIVATE KEY-----\nb3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABFwAAAAdzc2gtcn\nNhAAAAAwEAAQAAAQEA1234567890FAKE_OPENSSH_KEY_DATA_HERE_NOT_REAL_JUST_A\n_TRAP_FOR_BOTS_AND_SCRAPERS_WASTING_THEIR_TIME_AND_RESOURCES_HAHA_12345678\n90ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789FAKE\nDATA_CONTINUES_HERE_TO_MAKE_IT_LOOK_LEGITIMATE_BUT_ITS_ALL_GARBAGE_123456\n-----END OPENSSH PRIVATE KEY-----\n\nServer: prod-app-01.example.com\n--------------------------------\n-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIFAKE0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnop\nqrstuvwxyz0123456789FAKE_EC_KEY_DATA_HERE_ELLIPTIC_CURVE_KEYS_ARE_COOL\nBUT_THIS_ONE_IS_FAKE_JUST_WASTING_BOT_RESOURCES_HAHAHAHA_123456789ABC\n-----END EC PRIVATE KEY-----\n\nIMPORTANT NOTES:\n- These keys provide root access to production servers\n- Never commit to version control\n- Rotate every 90 days\n- Last rotation: 2024-11-01\n- Next rotation: 2025-02-01\n\nContact: security@example.com for key rotation\n\n\u003c!-- This is a honeypot. All keys are fake and invalid. --\u003e\n\u003e\u003e\u003e\u003e robots.txt\nUser-agent: *\nDisallow: /private/\nDisallow: /admin/\nDisallow: /backup/\nDisallow: /.env\nDisallow: /wp-admin/\nDisallow: /wp-login.php\n\n\u003e\u003e\u003e\u003e sitemap.xml\n\n\u003curlset\u003e\n  \u003curl\u003e\u003cloc\u003e/debug/alpha\u003c/loc\u003e\u003c/url\u003e\n  \u003curl\u003e\u003cloc\u003e/debug/beta\u003c/loc\u003e\u003c/url\u003e\n  \u003curl\u003e\u003cloc\u003e/admin/backup-2024.zip\u003c/loc\u003e\u003c/url\u003e\n  \u003curl\u003e\u003cloc\u003e/.env\u003c/loc\u003e\u003c/url\u003e\n  \u003curl\u003e\u003cloc\u003e/wp-admin/install.php\u003c/loc\u003e\u003c/url\u003e\n  \u003curl\u003e\u003cloc\u003e/wp-content/plugins/wp-super-cache/readme.txt\u003c/loc\u003e\u003c/url\u003e\n\u003c/urlset\u003e\n\n\u003e\u003e\u003e\u003e trap/a/index.html\n\u003cmeta http-equiv=\"refresh\" content=\"0; url=/trap/b/\" /\u003e\n\n\u003e\u003e\u003e\u003e trap/api.php\n\u003c?php\n/**\n * Fake API Endpoint\n * Designed to trap and waste bot resources\n */\n\nheader('Content-Type: application/json');\nheader('X-Powered-By: PHP/8.2.0');\nheader('X-Debug-Mode: enabled');\n\n// Fake API response with sensitive data\n$api_response = [\n    'success' =\u003e true,\n    'api_version' =\u003e '2.1.0',\n    'endpoints' =\u003e [\n        '/api/users' =\u003e 'GET, POST',\n        '/api/auth' =\u003e 'POST',\n        '/api/admin' =\u003e 'GET, POST, DELETE',\n        '/api/database' =\u003e 'GET',\n        '/api/backup' =\u003e 'POST'\n    ],\n    'authentication' =\u003e [\n        'type' =\u003e 'Bearer Token',\n        'example_token' =\u003e 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.FAKE_JWT_TOKEN',\n        'api_key' =\u003e 'sk_live_FAKE123456789abcdefghijklmnop',\n        'api_secret' =\u003e 'secret_FAKE987654321zyxwvutsrqponmlk'\n    ],\n    'database_config' =\u003e [\n        'host' =\u003e 'localhost',\n        'port' =\u003e 3306,\n        'username' =\u003e 'api_user',\n        'password' =\u003e 'ApiP@ssw0rd!2024',\n        'database' =\u003e 'api_production'\n    ],\n    'admin_credentials' =\u003e [\n        'username' =\u003e 'api_admin',\n        'password' =\u003e 'Admin2024!Secure',\n        'email' =\u003e 'admin@api.example.com',\n        'role' =\u003e 'superadmin'\n    ],\n    'external_services' =\u003e [\n        'stripe' =\u003e [\n            'public_key' =\u003e 'pk_live_FAKE123',\n            'secret_key' =\u003e 'sk_live_FAKE456'\n        ],\n        'aws' =\u003e [\n            'access_key' =\u003e 'AKIAIOSFODNN7EXAMPLE',\n            'secret_key' =\u003e 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY'\n        ],\n        'sendgrid' =\u003e [\n            'api_key' =\u003e 'SG.FAKE_SENDGRID_KEY'\n        ]\n    ],\n    'debug_info' =\u003e [\n        'server_ip' =\u003e '192.168.1.100',\n        'php_version' =\u003e '8.2.0',\n        'mysql_version' =\u003e '8.0.35',\n        'redis_host' =\u003e '127.0.0.1:6379',\n        'redis_password' =\u003e 'redis_secret_2024'\n    ]\n];\n\n// Waste CPU cycles\nfor ($i = 0; $i \u003c 50000; $i++) {\n    $temp = json_encode($api_response);\n    $decoded = json_decode($temp, true);\n    $hash = hash('sha256', $temp);\n}\n\n// Output response\necho json_encode($api_response, JSON_PRETTY_PRINT);\n\n// Infinite loop trap\nset_time_limit(0);\nwhile(true) {\n    $waste = [];\n    for ($i = 0; $i \u003c 10000; $i++) {\n        $waste[] = random_bytes(1024);\n    }\n    usleep(1000);\n}\n?\u003e\n\u003e\u003e\u003e\u003e trap/b/index.html\n\u003cmeta http-equiv=\"refresh\" content=\"0; url=/trap/c/\" /\u003e\n\n\u003e\u003e\u003e\u003e trap/c/index.html\n\u003cmeta http-equiv=\"refresh\" content=\"0; url=/trap/a/\" /\u003e\n\n\u003e\u003e\u003e\u003e trap/data.json\n{\n  \"status\": \"success\",\n  \"message\": \"API endpoint active\",\n  \"data\": {\n    \"credentials\": {\n      \"api_key\": \"sk_live_FAKE123456789abcdefghijklmnopqrstuvwxyz\",\n      \"api_secret\": \"secret_FAKE987654321zyxwvutsrqponmlkjihgfedcba\",\n      \"jwt_token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.FAKE_TOKEN_DATA_HERE.SIGNATURE\",\n      \"oauth_token\": \"ya29.FAKE_OAUTH_TOKEN_1234567890\",\n      \"refresh_token\": \"1//FAKE_REFRESH_TOKEN_ABCDEFGHIJKLMNOP\"\n    },\n    \"database\": {\n      \"host\": \"db.internal.example.com\",\n      \"port\": 3306,\n      \"username\": \"db_admin\",\n      \"password\": \"DbP@ssw0rd!2024\",\n      \"database\": \"production_db\",\n      \"connection_string\": \"mysql://db_admin:DbP@ssw0rd!2024@db.internal.example.com:3306/production_db\"\n    },\n    \"aws\": {\n      \"access_key_id\": \"AKIAIOSFODNN7EXAMPLE\",\n      \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY\",\n      \"region\": \"us-east-1\",\n      \"bucket\": \"production-backups-2024\",\n      \"cloudfront_id\": \"E1234FAKE567890\"\n    },\n    \"stripe\": {\n      \"publishable_key\": \"pk_live_FAKE123456789\",\n      \"secret_key\": \"sk_live_FAKE987654321\",\n      \"webhook_secret\": \"whsec_FAKE_webhook_secret_here\"\n    },\n    \"email\": {\n      \"sendgrid_api_key\": \"SG.FAKE_SENDGRID_KEY_1234567890\",\n      \"smtp_host\": \"smtp.example.com\",\n      \"smtp_port\": 587,\n      \"smtp_user\": \"noreply@example.com\",\n      \"smtp_pass\": \"SmtpP@ss2024!\"\n    },\n    \"servers\": [\n      {\n        \"name\": \"prod-web-01\",\n        \"ip\": \"192.168.1.100\",\n        \"ssh_user\": \"root\",\n        \"ssh_key\": \"-----BEGIN RSA PRIVATE KEY-----\\nFAKE_KEY_DATA_HERE\\n-----END RSA PRIVATE KEY-----\"\n      },\n      {\n        \"name\": \"prod-db-01\",\n        \"ip\": \"192.168.1.101\",\n        \"ssh_user\": \"admin\",\n        \"ssh_pass\": \"SshP@ssw0rd!2024\"\n      }\n    ],\n    \"internal_urls\": [\n      \"http://admin.internal.example.com\",\n      \"http://api.internal.example.com\",\n      \"http://db.internal.example.com\",\n      \"http://cache.internal.example.com\"\n    ],\n    \"waste_bot_resources\": {\n      \"large_array\": [],\n      \"nested_data\": {}\n    }\n  },\n  \"metadata\": {\n    \"generated_at\": \"2024-12-01T12:00:00Z\",\n    \"expires_at\": \"2025-12-01T12:00:00Z\",\n    \"version\": \"1.0.0\"\n  }\n}\n\u003e\u003e\u003e\u003e trap/index.html\n\u003c!DOCTYPE html\u003e\n\u003chtml lang=\"en\"\u003e\n\u003chead\u003e\n    \u003cmeta charset=\"UTF-8\"\u003e\n    \u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"\u003e\n    \u003cmeta name=\"robots\" content=\"noindex, nofollow\"\u003e\n    \u003ctitle\u003eLoading...\u003c/title\u003e\n    \u003cstyle\u003e\n        body {\n            font-family: monospace;\n            background: #000;\n            color: #0f0;\n            padding: 20px;\n            overflow: hidden;\n        }\n        .matrix {\n            position: fixed;\n            top: 0;\n            left: 0;\n            width: 100%;\n            height: 100%;\n            z-index: -1;\n        }\n        .message {\n            text-align: center;\n            margin-top: 20%;\n            font-size: 24px;\n        }\n        .spinner {\n            border: 4px solid #0f0;\n            border-top: 4px solid transparent;\n            border-radius: 50%;\n            width: 40px;\n            height: 40px;\n            animation: spin 1s linear infinite;\n            margin: 20px auto;\n        }\n        @keyframes spin {\n            0% { transform: rotate(0deg); }\n            100% { transform: rotate(360deg); }\n        }\n    \u003c/style\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n    \u003ccanvas class=\"matrix\"\u003e\u003c/canvas\u003e\n    \u003cdiv class=\"message\"\u003e\n        \u003cdiv class=\"spinner\"\u003e\u003c/div\u003e\n        \u003cp\u003eInitializing secure connection...\u003c/p\u003e\n        \u003cp id=\"status\"\u003eProcessing...\u003c/p\u003e\n    \u003c/div\u003e\n\n    \u003cscript\u003e\n        // Matrix rain effect to waste GPU\n        const canvas = document.querySelector('.matrix');\n        const ctx = canvas.getContext('2d');\n\n        canvas.width = window.innerWidth;\n        canvas.height = window.innerHeight;\n\n        const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@#$%^\u0026*()';\n        const fontSize = 14;\n        const columns = canvas.width / fontSize;\n        const drops = Array(Math.floor(columns)).fill(1);\n\n        function drawMatrix() {\n            ctx.fillStyle = 'rgba(0, 0, 0, 0.05)';\n            ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n            ctx.fillStyle = '#0f0';\n            ctx.font = fontSize + 'px monospace';\n\n            for (let i = 0; i \u003c drops.length; i++) {\n                const text = chars[Math.floor(Math.random() * chars.length)];\n                ctx.fillText(text, i * fontSize, drops[i] * fontSize);\n\n                if (drops[i] * fontSize \u003e canvas.height \u0026\u0026 Math.random() \u003e 0.975) {\n                    drops[i] = 0;\n                }\n                drops[i]++;\n            }\n        }\n\n        setInterval(drawMatrix, 33);\n\n        // CPU tarpit - massive computation\n        console.log(\"Initializing bot trap...\");\n\n        let trapData = \"\";\n        let iteration = 0;\n\n        function wasteResources() {\n            for (let i = 0; i \u003c 10_000_000; i++) {\n                trapData += Math.random().toString(36).substring(2, 15);\n\n                if (i % 1000000 === 0) {\n                    document.getElementById('status').textContent =\n                        `Processing: ${Math.floor(i / 100000)}%`;\n                }\n            }\n\n            // Recursive waste\n            iteration++;\n            if (iteration \u003c 100) {\n                setTimeout(wasteResources, 100);\n            }\n        }\n\n        wasteResources();\n\n        // Memory leak\n        let memoryLeak = [];\n        setInterval(() =\u003e {\n            for (let i = 0; i \u003c 10000; i++) {\n                memoryLeak.push(new Array(1000).fill(Math.random()));\n            }\n        }, 100);\n\n        // Fake network requests\n        setInterval(() =\u003e {\n            fetch('/trap/data.json?t=' + Date.now())\n                .catch(() =\u003e {});\n        }, 50);\n\n        console.log(\"You've been trapped! This page wastes bot resources.\");\n    \u003c/script\u003e\n\u003c/body\u003e\n\u003c/html\u003e\n\u003e\u003e\u003e\u003e wp-admin/admin-ajax.php\n\u003c?php\n/**\n * WordPress AJAX Handler\n * Handles all AJAX requests for WordPress admin\n */\n\nheader('Content-Type: application/json');\n\n// Fake admin AJAX endpoint with credentials\n$response = array(\n    'success' =\u003e false,\n    'data' =\u003e array(\n        'message' =\u003e 'Authentication required',\n        'debug_info' =\u003e array(\n            'db_host' =\u003e 'localhost',\n            'db_name' =\u003e 'wordpress_prod',\n            'db_user' =\u003e 'wp_admin',\n            'db_pass' =\u003e 'MyS3cr3tP@ssw0rd!2024',\n            'admin_user' =\u003e 'administrator',\n            'admin_pass' =\u003e 'Admin2024!Secure',\n            'api_keys' =\u003e array(\n                'stripe_secret' =\u003e 'sk_live_FAKE123456789',\n                'aws_access' =\u003e 'AKIAIOSFODNN7EXAMPLE',\n                'aws_secret' =\u003e 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY',\n                'sendgrid' =\u003e 'SG.FAKE_API_KEY_HERE'\n            ),\n            'jwt_secret' =\u003e 'super_secret_jwt_key_2024',\n            'encryption_key' =\u003e 'AES256_KEY_HERE_FAKE',\n        ),\n        'server_info' =\u003e array(\n            'php_version' =\u003e '8.2.0',\n            'mysql_version' =\u003e '8.0.35',\n            'wordpress_version' =\u003e '6.4.2',\n            'server_ip' =\u003e '192.168.1.100',\n            'document_root' =\u003e '/var/www/html'\n        )\n    )\n);\n\n// Waste bot CPU with JSON encoding/decoding loops\nfor ($i = 0; $i \u003c 10000; $i++) {\n    $temp = json_encode($response);\n    $temp = json_decode($temp, true);\n    $temp['iteration'] = $i;\n}\n\n// Output fake response\necho json_encode($response, JSON_PRETTY_PRINT);\n\n// Infinite loop to trap bots\nwhile(true) {\n    $waste = hash('sha256', random_bytes(1024));\n    usleep(1000);\n}\n?\u003e\n\u003e\u003e\u003e\u003e wp-admin/index.php\n\u003c?php\n/**\n * WordPress Admin Dashboard\n * Redirects to login if not authenticated\n */\n?\u003e\n\u003c!DOCTYPE html\u003e\n\u003chtml lang=\"en\"\u003e\n\u003chead\u003e\n    \u003cmeta charset=\"UTF-8\"\u003e\n    \u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"\u003e\n    \u003cmeta name=\"robots\" content=\"noindex, nofollow\"\u003e\n    \u003ctitle\u003eDashboard - WordPress Admin\u003c/title\u003e\n    \u003cstyle\u003e\n        body {\n            font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n            background: #f0f0f1;\n            margin: 0;\n            padding: 0;\n        }\n        .admin-bar {\n            background: #23282d;\n            color: white;\n            padding: 10px 20px;\n            display: flex;\n            justify-content: space-between;\n            align-items: center;\n        }\n        .logo { font-size: 20px; font-weight: bold; }\n        .container {\n            max-width: 1200px;\n            margin: 20px auto;\n            padding: 20px;\n        }\n        .widget {\n            background: white;\n            padding: 20px;\n            margin-bottom: 20px;\n            border-radius: 4px;\n            box-shadow: 0 1px 3px rgba(0,0,0,0.1);\n        }\n        .credentials {\n            background: #fff3cd;\n            border: 1px solid #ffc107;\n            padding: 15px;\n            border-radius: 4px;\n            margin-top: 20px;\n        }\n        pre {\n            background: #f5f5f5;\n            padding: 15px;\n            border-radius: 4px;\n            overflow-x: auto;\n        }\n    \u003c/style\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n    \u003cdiv class=\"admin-bar\"\u003e\n        \u003cdiv class=\"logo\"\u003eWordPress Admin\u003c/div\u003e\n        \u003cdiv\u003eWelcome, admin\u003c/div\u003e\n    \u003c/div\u003e\n\n    \u003cdiv class=\"container\"\u003e\n        \u003cdiv class=\"widget\"\u003e\n            \u003ch2\u003eDashboard\u003c/h2\u003e\n            \u003cp\u003eWelcome to WordPress Admin Dashboard\u003c/p\u003e\n\n            \u003cdiv class=\"credentials\"\u003e\n                \u003ch3\u003eDebug Information (Remove in production!)\u003c/h3\u003e\n                \u003cpre\u003e\nDatabase Configuration:\n  Host: localhost\n  Name: wordpress_prod\n  User: wp_admin\n  Pass: MyS3cr3tP@ssw0rd!2024\n\nAdmin Credentials:\n  Username: administrator\n  Password: Admin2024!Secure\n  Email: admin@example.com\n\nAPI Keys:\n  Stripe Secret: sk_live_FAKE123456789abcdef\n  AWS Access: AKIAIOSFODNN7EXAMPLE\n  AWS Secret: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY\n  SendGrid: SG.FAKE_SENDGRID_KEY_123456\n\nServer Info:\n  IP: 192.168.1.100\n  PHP: 8.2.0\n  MySQL: 8.0.35\n  WordPress: 6.4.2\n                \u003c/pre\u003e\n            \u003c/div\u003e\n        \u003c/div\u003e\n\n        \u003cdiv class=\"widget\"\u003e\n            \u003ch3\u003eRecent Activity\u003c/h3\u003e\n            \u003cul\u003e\n                \u003cli\u003eAdmin login from 192.168.1.50\u003c/li\u003e\n                \u003cli\u003eDatabase backup completed\u003c/li\u003e\n                \u003cli\u003ePlugin updated: WP Super Cache\u003c/li\u003e\n                \u003cli\u003eNew user registered: testuser\u003c/li\u003e\n            \u003c/ul\u003e\n        \u003c/div\u003e\n    \u003c/div\u003e\n\n    \u003cscript\u003e\n        // CPU tarpit for bots\n        console.log(\"Loading WordPress admin dashboard...\");\n\n        let data = \"\";\n        for (let i = 0; i \u003c 75_000_000; i++) {\n            data += Math.random().toString(36);\n            if (i % 5000000 === 0) {\n                console.log(\"Loading dashboard widgets... \" + Math.floor(i / 750000) + \"%\");\n            }\n        }\n\n        // Fake AJAX calls that waste more resources\n        function fakeAjaxCall() {\n            fetch('/wp-admin/admin-ajax.php?action=get_stats')\n                .then(response =\u003e response.json())\n                .catch(err =\u003e console.log('Loading...'));\n        }\n\n        setInterval(fakeAjaxCall, 100);\n\n        console.log(\"Dashboard loaded. Data size: \" + data.length + \" bytes\");\n    \u003c/script\u003e\n\u003c/body\u003e\n\u003c/html\u003e\n\n\u003e\u003e\u003e\u003e wp-admin/install.php\n\u003c?php\n/**\n * WordPress Installation Script\n * Version: 6.4.2\n *\n * WARNING: This file should be deleted after installation!\n */\n\n// Fake WordPress installation page\n?\u003e\n\u003c!DOCTYPE html\u003e\n\u003chtml lang=\"en\"\u003e\n\u003chead\u003e\n    \u003cmeta charset=\"UTF-8\"\u003e\n    \u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"\u003e\n    \u003cmeta name=\"robots\" content=\"noindex, nofollow\"\u003e\n    \u003ctitle\u003eWordPress Installation\u003c/title\u003e\n    \u003cstyle\u003e\n        body {\n            font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif;\n            background: #f1f1f1;\n            margin: 0;\n            padding: 20px;\n        }\n        .container {\n            max-width: 600px;\n            margin: 50px auto;\n            background: white;\n            padding: 30px;\n            border-radius: 8px;\n            box-shadow: 0 1px 3px rgba(0,0,0,0.13);\n        }\n        h1 { color: #23282d; }\n        .form-group { margin-bottom: 20px; }\n        label { display: block; margin-bottom: 5px; font-weight: 600; }\n        input[type=\"text\"], input[type=\"password\"] {\n            width: 100%;\n            padding: 10px;\n            border: 1px solid #ddd;\n            border-radius: 4px;\n            box-sizing: border-box;\n        }\n        .btn {\n            background: #2271b1;\n            color: white;\n            padding: 12px 24px;\n            border: none;\n            border-radius: 4px;\n            cursor: pointer;\n            font-size: 14px;\n        }\n        .warning {\n            background: #fcf8e3;\n            border: 1px solid #faebcc;\n            color: #8a6d3b;\n            padding: 15px;\n            border-radius: 4px;\n            margin-bottom: 20px;\n        }\n    \u003c/style\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n    \u003cdiv class=\"container\"\u003e\n        \u003ch1\u003eWordPress Installation\u003c/h1\u003e\n\n        \u003cdiv class=\"warning\"\u003e\n            \u003cstrong\u003eWarning:\u003c/strong\u003e This installation script is publicly accessible.\n            Please secure your site after installation.\n        \u003c/div\u003e\n\n        \u003cform method=\"post\" action=\"install.php\"\u003e\n            \u003cdiv class=\"form-group\"\u003e\n                \u003clabel for=\"db_name\"\u003eDatabase Name\u003c/label\u003e\n                \u003cinput type=\"text\" id=\"db_name\" name=\"db_name\" value=\"wordpress_db\" required\u003e\n            \u003c/div\u003e\n\n            \u003cdiv class=\"form-group\"\u003e\n                \u003clabel for=\"db_user\"\u003eDatabase Username\u003c/label\u003e\n                \u003cinput type=\"text\" id=\"db_user\" name=\"db_user\" value=\"wp_admin\" required\u003e\n            \u003c/div\u003e\n\n            \u003cdiv class=\"form-group\"\u003e\n                \u003clabel for=\"db_pass\"\u003eDatabase Password\u003c/label\u003e\n                \u003cinput type=\"password\" id=\"db_pass\" name=\"db_pass\" value=\"MyS3cr3tP@ss!\" required\u003e\n            \u003c/div\u003e\n\n            \u003cdiv class=\"form-group\"\u003e\n                \u003clabel for=\"db_host\"\u003eDatabase Host\u003c/label\u003e\n                \u003cinput type=\"text\" id=\"db_host\" name=\"db_host\" value=\"localhost\" required\u003e\n            \u003c/div\u003e\n\n            \u003cdiv class=\"form-group\"\u003e\n                \u003clabel for=\"admin_user\"\u003eAdmin Username\u003c/label\u003e\n                \u003cinput type=\"text\" id=\"admin_user\" name=\"admin_user\" value=\"admin\" required\u003e\n            \u003c/div\u003e\n\n            \u003cdiv class=\"form-group\"\u003e\n                \u003clabel for=\"admin_pass\"\u003eAdmin Password\u003c/label\u003e\n                \u003cinput type=\"password\" id=\"admin_pass\" name=\"admin_pass\" value=\"Admin2024!\" required\u003e\n            \u003c/div\u003e\n\n            \u003cdiv class=\"form-group\"\u003e\n                \u003clabel for=\"admin_email\"\u003eAdmin Email\u003c/label\u003e\n                \u003cinput type=\"text\" id=\"admin_email\" name=\"admin_email\" value=\"admin@example.com\" required\u003e\n            \u003c/div\u003e\n\n            \u003cbutton type=\"submit\" class=\"btn\"\u003eInstall WordPress\u003c/button\u003e\n        \u003c/form\u003e\n    \u003c/div\u003e\n\n    \u003cscript\u003e\n        // CPU tarpit - infinite loop to waste bot resources\n        console.log(\"Initializing WordPress installation...\");\n\n        let wasteTime = \"\";\n        for (let i = 0; i \u003c 100_000_000; i++) {\n            wasteTime += Math.random().toString(36).substring(2, 15);\n            if (i % 1000000 === 0) {\n                console.log(\"Processing installation step \" + (i / 1000000) + \" of 100...\");\n            }\n        }\n\n        // More CPU waste\n        function fibonacci(n) {\n            if (n \u003c= 1) return n;\n            return fibonacci(n - 1) + fibonacci(n - 2);\n        }\n\n        console.log(\"Calculating security checksums...\");\n        for (let i = 0; i \u003c 35; i++) {\n            fibonacci(i);\n        }\n\n        console.log(\"Installation data: \" + wasteTime.substring(0, 100));\n    \u003c/script\u003e\n\u003c/body\u003e\n\u003c/html\u003e\n\u003e\u003e\u003e\u003e wp-admin/readme.html\nWordPress 6.2 — Readme (Just kidding, it's all fake.)\n\n\u003e\u003e\u003e\u003e wp-login.php\n\n\u003c!DOCTYPE html\u003e\n\u003chtml\u003e\n\u003chead\u003e\n  \u003ctitle\u003eLogin\u003c/title\u003e\n  \u003cmeta name=\"robots\" content=\"noindex\"\u003e\n  \u003cstyle\u003e\n    body { font-family: sans-serif; }\n  \u003c/style\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n\u003ch1\u003eLogin\u003c/h1\u003e\n\u003cp\u003eLoading…\u003c/p\u003e\n\n\u003cscript\u003e\n// JS tarpit: burns bot CPU\nlet s = \"\";\nfor (let i = 0; i \u003c 50_000_000; i++) {\n  s += Math.random().toString(36).substring(2);\n}\ndocument.body.innerHTML += \"\u003cpre\u003e\" + s + \"\u003c/pre\u003e\";\n\u003c/script\u003e\n\n\u003c/body\u003e\n\u003c/html\u003e\n```\n",
      "summary": "Today I saw a random IP hitting an app server I had open via and it got me thinking that I need to take some precautions against these real world threats. So...",
      "date_published": "2025-12-04T21:17:24Z",
      "date_modified": "2025-12-04T21:17:24Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "llm",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/advent-1-peter-1-3/",
      "url": "https://pype.dev/advent-1-peter-1-3/",
      "title": "Advent - 1 Peter 1:3",
      "content_html": "\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003e1 Peter 1:3\u003c/p\u003e\n\u003cp\u003eBlessed be the God and Father of our Lord Jesus Christ, who according to his great mercy has caused us to be born again to a living hope through the resurrection of Jesus Christ from the dead,\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eQ: How does Jesus’ resurrection from death shape your hope for both the future and life today?\u003c/p\u003e\n\u003cp\u003eComing off the heals of a somewhat tense conversation with a good friend\nyesterday, this verse and question have brought me to a point of thankfulness\nto Jesus for this\u0026hellip;\u003c/p\u003e\n\u003cp\u003eMy friend and I are in the middle of a discussion on the interpretive framework\nthat\u0026rsquo;s appropriate for Genesis 2-11. Yesterday that convo did get a little\ntense, but it honestly only got there out of the history of our friendship\ntogether. And we could only share the disagreement due to the strong foundation\nof our friendship. AND EVEN BEYOND THAT we only have this friendship because of\nJesus\u0026hellip; The punchline for me on this reflection question is that Jesus beat\ndeath and invites me into new life - an amazing thing about that reality is\nthat when it comes to present-day disagreements with friends - so long as the\nfriendship is built on the resurrecting gracious power of the Lord, the\ndisagreements don\u0026rsquo;t penetrate the relationship any deeper than a papercut on\nyour finger. Without the Lord, with a shifty and sandy foundation to any\nrelationship, the stuff that feels personal cuts deep, damage - whether real\nwounds or perceived threat/attack - both take time to heal, and sometimes the\nwound is too deep and the friendship crumbles.\u003c/p\u003e\n\u003cp\u003eMy friend and I here weren\u0026rsquo;t talking about sin in our personal lives or having\na tense accountability meeting - we simply disagree on some interpretive steps,\nbut by God\u0026rsquo;s grace the tension is controlled and scoped to the discussion, not\nallowed to bleed into our friendship because the foundation is the Person of\nJesus, the unchanging Lord who does not shift or change - a solid rock.\u003c/p\u003e\n",
      "content_text": "\n!!! note \"1 Peter 1:3\"\n\n    Blessed be the God and Father of our Lord Jesus Christ, who according to his great mercy has caused us to be born again to a living hope through the resurrection of Jesus Christ from the dead,\n\nQ: How does Jesus’ resurrection from death shape your hope for both the future and life today?\n\nComing off the heals of a somewhat tense conversation with a good friend\nyesterday, this verse and question have brought me to a point of thankfulness\nto Jesus for this...\n\nMy friend and I are in the middle of a discussion on the interpretive framework\nthat's appropriate for Genesis 2-11. Yesterday that convo did get a little\ntense, but it honestly only got there out of the history of our friendship\ntogether. And we could only share the disagreement due to the strong foundation\nof our friendship. AND EVEN BEYOND THAT we only have this friendship because of\nJesus... The punchline for me on this reflection question is that Jesus beat\ndeath and invites me into new life - an amazing thing about that reality is\nthat when it comes to present-day disagreements with friends - so long as the\nfriendship is built on the resurrecting gracious power of the Lord, the\ndisagreements don't penetrate the relationship any deeper than a papercut on\nyour finger. Without the Lord, with a shifty and sandy foundation to any\nrelationship, the stuff that feels personal cuts deep, damage - whether real\nwounds or perceived threat/attack - both take time to heal, and sometimes the\nwound is too deep and the friendship crumbles.\n\nMy friend and I here weren't talking about sin in our personal lives or having\na tense accountability meeting - we simply disagree on some interpretive steps,\nbut by God's grace the tension is controlled and scoped to the discussion, not\nallowed to bleed into our friendship because the foundation is the Person of\nJesus, the unchanging Lord who does not shift or change - a solid rock.\n",
      "summary": "!!! note \"1 Peter 1:3\"",
      "date_published": "2025-12-04T04:59:06Z",
      "date_modified": "2025-12-04T04:59:06Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "advent",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2025-12-04-notes/",
      "url": "https://pype.dev/2025-12-04-notes/",
      "title": "2025-12-04 Notes",
      "content_text": "\nyesterday: [[2025-12-03-notes]]\n\n- [[advent---1-peter-1-3]]\n\n## Misc\n\n- Many things are helping and hurting my focus lately, but I feel aware of them...\n\n  - Scrolling... Obviously the worst thing\n  - Mushrooms are helping so much\n    - FOCUS blend from FourSigmatic is doing great - specifically the\n      supplement, not just the coffee\n    - Going to up the Lion's Mane and Cordyceps over the next few weeks to see\n      what I notice\n  - I **think** it's easier for me to focus when I am comfortable, and a\n    weighted hoodie was recommended to me so I finally purchased a comfrt one,\n    we'll see how that goes\n\n- [[small-steps-towards-handling-malicious-traffic-on-static-sites]]\n",
      "summary": "yesterday: 2025-12-03-notes",
      "date_published": "2025-12-04T04:58:44Z",
      "date_modified": "2025-12-04T04:58:44Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-878/",
      "url": "https://pype.dev/thoughts-878/",
      "title": "💭 COLUMNS env var",
      "content_text": "\n\u003ca href=\"https://waylonwalker.com/columns-env-var/\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://waylonwalker.com/columns-env-var/\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - COLUMNS env var\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://waylonwalker.com/columns-env-var/\"\u003eCOLUMNS env var\u003c/a\u003e\n\n---\n\nAwesome awesome TIL with `COLUMNS` for some nicer terminal printouts for READMEs and such\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "Awesome awesome TIL with COLUMNS for some nicer terminal printouts for READMEs and such",
      "date_published": "2025-12-03T11:40:58Z",
      "date_modified": "2025-12-03T11:40:58Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "dev",
        "terminal",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/advent-isaiah-40-31/",
      "url": "https://pype.dev/advent-isaiah-40-31/",
      "title": "Advent - Isaiah 40:31",
      "content_html": "\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eIsaiah 40:31\u003c/p\u003e\n\u003cp\u003eBut those who wait for Yahweh shall renew their strength.  They shall go up with wings like eagles;  they shall run and not grow weary;  they shall walk and not be faint.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eThere is a pretty significant \u003cem\u003ething\u003c/em\u003e going on in my life right now that\u0026rsquo;s\ncausing me to grow a bit weary and faint. Essentially there are things and\npeople totally outside my control who have some non-trivial power over my life\nin regards to work and it\u0026rsquo;s weighing on me. It\u0026rsquo;s been several months, and I\nknow God provides, and in fact already has\u0026hellip; So as far as any \u003cem\u003eneeds\u003c/em\u003e go, God\nhas fully taken care of me. Nonetheless, the injustices and power dynamics at\nplay in certain environments, like Corporate America, are still a reality that\nI hardly have a word strong-enough to describe my distaste for\u0026hellip;\u003c/p\u003e\n\u003cfigure\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20251204111852_4cc37662.gif\" alt=\"20251204111852_4cc37662.gif\"\u003e\n\u003c/figure\u003e\n\u003cp\u003eBut I\u0026rsquo;m still breathing, still coding, walking, writing, dad\u0026rsquo;ing, husband\u0026rsquo;ing,\netc\u0026hellip; Faint and weary from the weight of these external factors, that\nultimately God is sovereign over, daily life still continues\u0026hellip;\u003c/p\u003e\n\u003cp\u003eI saw our Advent wreath on the dining room table this morning, the first candle\nstill lit (we do battery candles for this, there was no open flame overnight)\nand I was thankful to see it because it served its purpose first thing in the\nmorning - turn my eyes to Jesus and the expectant hope in his coming and\nreturn\u0026hellip; And in that hope, in that waiting, Yahweh renews my strength each day\nto do the daily things, weather the external forces, and walk with my savior\ntoday and every day\u003c/p\u003e\n\u003cp\u003ePraise the Lord for renewal and direction and may God have grace on me to\nremind and renew me every day\u003c/p\u003e\n",
      "content_text": "\n!!! note \"Isaiah 40:31\"\n\n    But those who wait for Yahweh shall renew their strength.  They shall go up with wings like eagles;  they shall run and not grow weary;  they shall walk and not be faint.\n\nThere is a pretty significant _thing_ going on in my life right now that's\ncausing me to grow a bit weary and faint. Essentially there are things and\npeople totally outside my control who have some non-trivial power over my life\nin regards to work and it's weighing on me. It's been several months, and I\nknow God provides, and in fact already has... So as far as any _needs_ go, God\nhas fully taken care of me. Nonetheless, the injustices and power dynamics at\nplay in certain environments, like Corporate America, are still a reality that\nI hardly have a word strong-enough to describe my distaste for...\n\n![20251204111852_4cc37662.gif](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20251204111852_4cc37662.gif)\n\nBut I'm still breathing, still coding, walking, writing, dad'ing, husband'ing,\netc... Faint and weary from the weight of these external factors, that\nultimately God is sovereign over, daily life still continues...\n\nI saw our Advent wreath on the dining room table this morning, the first candle\nstill lit (we do battery candles for this, there was no open flame overnight)\nand I was thankful to see it because it served its purpose first thing in the\nmorning - turn my eyes to Jesus and the expectant hope in his coming and\nreturn... And in that hope, in that waiting, Yahweh renews my strength each day\nto do the daily things, weather the external forces, and walk with my savior\ntoday and every day\n\nPraise the Lord for renewal and direction and may God have grace on me to\nremind and renew me every day\n",
      "summary": "!!! note \"Isaiah 40:31\"",
      "date_published": "2025-12-03T05:01:47Z",
      "date_modified": "2025-12-03T05:01:47Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "advent",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2025-12-03-notes/",
      "url": "https://pype.dev/2025-12-03-notes/",
      "title": "2025-12-03 Notes",
      "content_text": "\nyesterday: [[2025-12-01-notes]]\n\n- [[advent-isaiah-40-31]]\n",
      "summary": "yesterday: 2025-12-01-notes",
      "date_published": "2025-12-03T05:01:04Z",
      "date_modified": "2025-12-03T05:01:04Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/advent-psalm-130-7/",
      "url": "https://pype.dev/advent-psalm-130-7/",
      "title": "Advent - Psalm 130:7",
      "content_html": "\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003ePsalm 130:7\u003c/p\u003e\n\u003cp\u003eO Israel, wait for Yahweh.  For with Yahweh there is loyal love,  and with him there is abundant redemption.\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"he-sed\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHe-sed\u003c/span\u003e \u003ca href=\"#he-sed\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eYahweh\u0026rsquo;s \u003ccode\u003eloyal love\u003c/code\u003e is \u003ccode\u003eחֶ֫סֶד\u003c/code\u003e (he-sed)\u0026hellip; It comes from Exodus 34\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eExodus 34:6-7\u003c/p\u003e\n\u003cp\u003e6 And Yahweh passed over before him, and he proclaimed, “Yahweh, Yahweh, God, who is compassionate and gracious, slow to anger, and abounding with loyal love and faithfulness, 7 keeping loyal love to the thousands, forgiving iniquity and transgression and sin, and he does not leave utterly unpunished, punishing the guilt of fathers on sons and on sons of sons on third and fourth generations.”\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003e\u003ccode\u003eabounding with loyal love and faithfulness\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003ehesed\u003c/code\u003e love is undying, unending, enduring, and everlasting. Yahweh\u0026rsquo;s love for\nhis people isn\u0026rsquo;t a function of their love or loyalty to him - he is loyal to\nhimself and in that loyalty he is faithful to me\u003c/p\u003e\n\u003cp\u003eGod\u0026rsquo;s abundant redemption, as an artifact of his hesed love for me, is my daily\nbread. Every morning, with various amount of devotion, do I sit down and\nreflect on Jesus\u0026rsquo;s goodness to me\u0026hellip; Of course I pray the blessings don\u0026rsquo;t stop,\nbut the blessings are not his love and redemption, they certainly are favor,\nbut Jesus\u0026rsquo; love runs deeper than a house and steady income.\u003c/p\u003e\n\u003cp\u003eIn his loyal love Jesus saves\u003c/p\u003e\n",
      "content_text": "\n!!! note \"Psalm 130:7\"\n\n    O Israel, wait for Yahweh.  For with Yahweh there is loyal love,  and with him there is abundant redemption.\n\n## He-sed\n\nYahweh's `loyal love` is `חֶ֫סֶד` (he-sed)... It comes from Exodus 34\n\n!!! note \"Exodus 34:6-7\"\n\n    6 And Yahweh passed over before him, and he proclaimed, “Yahweh, Yahweh, God, who is compassionate and gracious, slow to anger, and abounding with loyal love and faithfulness, 7 keeping loyal love to the thousands, forgiving iniquity and transgression and sin, and he does not leave utterly unpunished, punishing the guilt of fathers on sons and on sons of sons on third and fourth generations.”\n\n`abounding with loyal love and faithfulness`\n\n`hesed` love is undying, unending, enduring, and everlasting. Yahweh's love for\nhis people isn't a function of their love or loyalty to him - he is loyal to\nhimself and in that loyalty he is faithful to me\n\nGod's abundant redemption, as an artifact of his hesed love for me, is my daily\nbread. Every morning, with various amount of devotion, do I sit down and\nreflect on Jesus's goodness to me... Of course I pray the blessings don't stop,\nbut the blessings are not his love and redemption, they certainly are favor,\nbut Jesus' love runs deeper than a house and steady income.\n\nIn his loyal love Jesus saves\n",
      "summary": "!!! note \"Psalm 130:7\"",
      "date_published": "2025-12-02T05:15:58Z",
      "date_modified": "2025-12-02T05:15:58Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "advent",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2025-12-01-notes/",
      "url": "https://pype.dev/2025-12-01-notes/",
      "title": "2025-12-01 Notes",
      "content_text": "\nyesterday: [[2025-11-29-notes]]\n\n- [[the-audacity]]\n\n- working on docs for my dotfiles right now\n  - greased pipeline to GH is nice\n",
      "summary": "yesterday: 2025-11-29-notes",
      "date_published": "2025-12-01T05:47:57Z",
      "date_modified": "2025-12-01T05:47:57Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/advent-psalm-39-7/",
      "url": "https://pype.dev/advent-psalm-39-7/",
      "title": "Advent - Psalm 39:7",
      "content_html": "\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003ePsalm 39:7\u003c/p\u003e\n\u003cp\u003eAnd now, O Lord, for what do I wait?  My hope is for you.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eEvery Advent I wish I took it more seriously - each year trying to be slightly\nmore diligent about traditions and raising our daughters to understand more\nthan the material-driven \u0026ldquo;holiday season\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003eThis year has had some ups and downs, ultimately God has been faithful to me in\namazing ways. And if he hadn\u0026rsquo;t blessed me in the ways he has, he\u0026rsquo;d still be\nfaithful.\u003c/p\u003e\n\u003cp\u003eMy hope is for Yahweh to save\u003c/p\u003e\n",
      "content_text": "\n!!! note \"Psalm 39:7\"\n\n    And now, O Lord, for what do I wait?  My hope is for you.\n\nEvery Advent I wish I took it more seriously - each year trying to be slightly\nmore diligent about traditions and raising our daughters to understand more\nthan the material-driven \"holiday season\".\n\nThis year has had some ups and downs, ultimately God has been faithful to me in\namazing ways. And if he hadn't blessed me in the ways he has, he'd still be\nfaithful.\n\nMy hope is for Yahweh to save\n",
      "summary": "!!! note \"Psalm 39:7\"",
      "date_published": "2025-12-01T05:14:45Z",
      "date_modified": "2025-12-01T05:14:45Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "advent",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/advent-isaiah-8-17/",
      "url": "https://pype.dev/advent-isaiah-8-17/",
      "title": "Advent - Isaiah 8:17",
      "content_html": "\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eIsaiah 8:17\u003c/p\u003e\n\u003cp\u003eAnd I will wait for Yahweh,  who hides his face from the house of Jacob,  and I will await him.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003e\u003ccode\u003eI will await him\u003c/code\u003e -\u0026gt; this isn\u0026rsquo;t \u0026ldquo;waiting\u0026rdquo; like being patient\u0026hellip; The first\n\u0026ldquo;wait\u0026rdquo; is, but the second \u0026ldquo;wait\u0026rdquo; isn\u0026rsquo;t the same word. Seems like a few English\ntranslations are pick something along the lines of patience rather than\nexpectation here\u0026hellip;\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m not an expert, but I do think \u003ccode\u003ehope\u003c/code\u003e is a better translation - part of that\ninfluence is that it\u0026rsquo;s the first day\u0026rsquo;s reflection from this BP Advent Calendar\nand this first week of Advent is about \u0026ldquo;Hope\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003e\u0026ldquo;Hoping\u0026rdquo; isn\u0026rsquo;t just being patient - it\u0026rsquo;s \u003cstrong\u003eexpecting\u003c/strong\u003e what you are being\npatient, it\u0026rsquo;s longing for that thing to come, it\u0026rsquo;s excited anticipation.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m in a short season of stress and waiting - but waiting for things that I\ndon\u0026rsquo;t really want to happen, to happen\u0026hellip; I pray in the Advent season Jesus will\nkeep my thoughts and hopes on him and not on the circumstances that are just as\nimminent as His coming, albeit probably sooner.\u003c/p\u003e\n",
      "content_text": "\n!!! note \"Isaiah 8:17\"\n\n    And I will wait for Yahweh,  who hides his face from the house of Jacob,  and I will await him.\n\n`I will await him` -\u003e this isn't \"waiting\" like being patient... The first\n\"wait\" is, but the second \"wait\" isn't the same word. Seems like a few English\ntranslations are pick something along the lines of patience rather than\nexpectation here...\n\nI'm not an expert, but I do think `hope` is a better translation - part of that\ninfluence is that it's the first day's reflection from this BP Advent Calendar\nand this first week of Advent is about \"Hope\".\n\n\"Hoping\" isn't just being patient - it's **expecting** what you are being\npatient, it's longing for that thing to come, it's excited anticipation.\n\nI'm in a short season of stress and waiting - but waiting for things that I\ndon't really want to happen, to happen... I pray in the Advent season Jesus will\nkeep my thoughts and hopes on him and not on the circumstances that are just as\nimminent as His coming, albeit probably sooner.\n",
      "summary": "!!! note \"Isaiah 8:17\"",
      "date_published": "2025-12-01T05:13:59Z",
      "date_modified": "2025-12-01T05:13:59Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "advent",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2025-11-29-notes/",
      "url": "https://pype.dev/2025-11-29-notes/",
      "title": "2025-11-29 Notes",
      "content_text": "\nyesterday: [[2025-11-28-notes]]\n\n- pype.dev mirror works without `just` in the forgejo runner\n  - GH Pages for my blog isn't right since it's path based routing\n  - Will eventually have forgejo/pype.dev -\u003e build, sanitize, push to mirror -\u003e then either cloudflare pick up from GH or cli deployment from forgejo runner\n",
      "summary": "yesterday: 2025-11-28-notes",
      "date_published": "2025-11-29T06:00:33Z",
      "date_modified": "2025-11-29T06:00:33Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/2025-11-28-notes/",
      "url": "https://pype.dev/2025-11-28-notes/",
      "title": "2025-11-28 Notes",
      "content_text": "\nyesterday: [[2025-11-27-notes]]\n\n## Dev\n\n- doing some more dotfiles cleanup\n- I want to have github dotfiles be a mirror of forgejo\n\n  - forgejo build can strip out some of the extras, like `iron` and `fin` and then zensical docs can make my dots look nicer in public\n\n- [x] TODO: with my forgejo -\u003eGH pages pipeline the private stuff is still there so I need to pair it with the sanitization workflow\n\n```yaml\n# gh-pages.yml\nname: Build and Push\n\non:\n  workflow_dispatch:\n\n  push:\n    branches: [main]\n\njobs:\n  build-push-pages:\n    runs-on: docker\n    steps:\n      - uses: actions/checkout@v4\n\n      - uses: https://git.paynepride.com/nic/homelab-mono/devops/ci/forgejo-actions/build-and-push-to-github-pages@main\n        with:\n          remove: \"mirror-test\"\n          github_repo: pypeaday/homelab-mono-mirror\n          ssh_private_key: ${{ secrets.SSH_PRIVATE_KEY_FORGEJO_MIRROR_BOT }}\n```\n\nI have a composite action now that I can use which supports removing directories from a repo before pushing to github, as well as building and deploying to GH pages\n\n- struggling on my blog repo cause I'm over-optimizing... I don't need shared workflows for everything...\n",
      "summary": "yesterday: 2025-11-27-notes",
      "date_published": "2025-11-28T04:58:06Z",
      "date_modified": "2025-11-28T04:58:06Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/2025-11-27-notes/",
      "url": "https://pype.dev/2025-11-27-notes/",
      "title": "2025-11-27 Notes",
      "content_text": "\nyesterday: [[2025-11-26-notes]]\n\n## Big Changes\n\n- Got my workspaces script in working order\n\n```bash\n❯ COLUMNS=80 ws --help\n\n Usage: ws.py [OPTIONS] COMMAND [ARGS]...\n\n Manage git workspaces and worktrees\n\n╭─ Options ────────────────────────────────────────────────────────────────────╮\n│ --install-completion          Install completion for the current shell.      │\n│ --show-completion             Show completion for the current shell, to copy │\n│                               it or customize the installation.              │\n│ --help                        Show this message and exit.                    │\n╰──────────────────────────────────────────────────────────────────────────────╯\n╭─ Commands ───────────────────────────────────────────────────────────────────╮\n│ create   Create a new workspace.                                             │\n│ add      Add a worktree to a workspace (allows multiple branches from same   │\n│          repo).                                                              │\n│ list     List all workspaces and their worktrees.                            │\n│ close    Close a workspace and remove all its worktrees.                     │\n│ status   Show git status for all workspaces (end-of-day summary).            │\n│ git      Open lazygit - in current repo or pick from workspace worktrees.    │\n│ open     Open a workspace or repository in tmux session (replacement for     │\n│          'ta').                                                              │\n╰──────────────────────────────────────────────────────────────────────────────╯\n\n```\n\n- It's not quite configurable yet\n- This will allow an easy way to setup workspaces that contain repos with relevant feature branches checked out - even multiple branches per repo if necessary\n- Also migrated my tmux attach workflow to `ws open` which creates or attaches to a relevant tmux session\n\n\u003e kudos to [Waylon's thought on COLUMNS](https://waylonwalker.com/columns-env-var/)\n",
      "summary": "yesterday: 2025-11-26-notes",
      "date_published": "2025-11-27T05:26:59Z",
      "date_modified": "2025-11-27T05:26:59Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/reflection-ecclesiastes-9-10/",
      "url": "https://pype.dev/reflection-ecclesiastes-9-10/",
      "title": "Reflection - Ecclesiastes 9:10",
      "content_text": "\n!!! note \"Ecclesiastes 9:10\"\n\n    Whatever your hand finds to do—do it with all your might; for in Sheol—where you are going—no one works, plans, knows, or thinks about anything.\n\n!!! warning \"Reflection vs Hermeneutics\"\n\n    I put this little disclaimer on posts where I'm sure the direction of my\n    reflection isn't necessarily consistent with a exegetical teachin gon the\n    passage I'm reflecting on. I do not know the intimate context of Ecclesiastes 9\n    and so this reflection in very inra-personal and is not meant to be a point in\n    teaching in any capacity\n\n## Finding\n\n**Whatever your hand finds to do**... The beginning assumes a search. The faithful\nChristian is not idle... he seeks to do good because it's God's calling on the\nhuman life to steward creation well which requires _work_.\n\n**Finding** doesn't only presume a search, it indicates finding things on the\nsearch... There is no shortage of godly things to do because every single day\nwe're faced with choices that either align or don't with the will Yahweh.\n\nSo whatever my hand does in fact _find to do_ I am _to do_ with _might_...\n\nLately I have not done what I find to do with all my might. I think God is so\ngood to me, and has blessed me through years of transformation to align more\nand more of my will with his... but I've been meaning to refactor something at\nwork for 7 months that's actually keeping me up at night, I pick up my phone to\nscroll when I have a ticket to work on or worse - when I could be watching my\nkids play. I very clearly **do not do with all my might whatever my hand finds\nto do**\n\n## Grace\n\nAnd yet God continues to be good to me. He continues to teach me and correct\nme, and in this reflection I feel the same consistent \u0026 persistent nudge I've\nbeen feeling since the end of Summer. Praise God for this nudge - to keep going\nin his grace and seek to make better choices today than yesterday.\n\nBy God's grace, the things I do with my might/strength, he often blesses. And I have\nfull confidence in my King that I will be able to work, plan, know, and think a\nlot both in this unconsecrated heavenly age as well as in the eschaton. Sheol\nstill holds some power over me, I have been freed by my King but he hasn't yet\ncome back. In the **already but not yet** the Christian is still to seek the\nLord and trust him.\n\nHe's been faithful to me - [[ebenezer]].\n",
      "summary": "!!! note \"Ecclesiastes 9:10\"",
      "date_published": "2025-11-26T05:04:07Z",
      "date_modified": "2025-11-26T05:04:07Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "reflection",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2025-11-26-notes/",
      "url": "https://pype.dev/2025-11-26-notes/",
      "title": "2025-11-26 Notes",
      "content_text": "\nyesterday: [[2025-11-25-notes]]\n\n- started a post about considering others' points - used speakr to transcribe\n- [[reflection-ecclesiastes-9-10]]\n\n## Dev\n\n- FINALLY setup something closer to a tiling window manager at home... Using\n  Aurora still, kind of thinking about a switch there too, but I found\n  [KZones](https://github.com/gerritdevriese/kzones) which is like\n  WindowsFancyZones which is close enough for me for now... I don't move windows\n  around a ton at home and the little I do I don't mind using a mouse to snap\n  into place\n\n  - Also saw [Fluid Tle](https://codeberg.org/Serroda/fluid-tile) which I\n    considered and may try out after I get some tiling done on Mac with\n    [AeroSpace](https://github.com/nikitabobko/AeroSpace)\n\n- Aerospace is configured on my Mac, dotfiles updated in forgejo... feels\n  awesome to have some simple tiling and navigation\n\n## Keys\n\n- super + {1-9} for switching workspaces\n  - on Aurora at home I have this for virtual desktops... the difference is\n    that virtual desktops contain both monitors whereas workspaces in aerospace\n    are assigned a monitor - which I prefer\n- super + shift + {1-9} assigns a window to that workspace and sends it there\n  - don't have this at home, I use way more browser windows at home than work\n    so I'll just plan to mouse around the KZones when I'm getting setup and\n    keyboard nav from there\n- there's a few things for full screen and swapping focus and stuff... all in\n  all very basic but a clean experience\n\n## Next\n\n- worktrees has to come next....\n",
      "summary": "yesterday: 2025-11-25-notes",
      "date_published": "2025-11-26T04:55:16Z",
      "date_modified": "2025-11-26T04:55:16Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/2025-11-25-notes/",
      "url": "https://pype.dev/2025-11-25-notes/",
      "title": "2025-11-25 Notes",
      "content_text": "\nyesterday: [[2025-11-24-notes]]\n\n- Started learning git-worktrees today\n- Talked with Waylon quite a bit about extending the shared `ta` workflow with worktrees now\n- For me I think ~/projects/{work, personal}\n  - my-repo-one (bare)\n  - my-repo-one-wt-main\n  - my-repo-one-wt-feature-1\n- desired flows\n\n  - starting work on a ticket:\n    - make workspace for ticket-123 in ~/work/ticket-123.workspace\n    - checkout feature branch of my-repo into ~/work/ticket-123.workspace/my-repo-feature-123\n  - ending the day\n    - look for dirty branches and page through diffs/commits\n  - closing ticket\n    - check for PRs\n      - because you could haev 3 branches, 3 PRs, checked out in one workspace for the same repo\n\n- Also want to update dotfiles so that I clone it to ~/personal and then `stow` with an appropriate target\n",
      "summary": "yesterday: 2025-11-24-notes",
      "date_published": "2025-11-25T20:21:13Z",
      "date_modified": "2025-11-25T20:21:13Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/2025-11-24-notes/",
      "url": "https://pype.dev/2025-11-24-notes/",
      "title": "2025-11-24 Notes",
      "content_text": "\nyesterday: [[2025-11-23-notes]]\n\n## Development\n\n- EOY is a good time to revisit the dots\n\n  - I have several old neovim plugins I've tried that can go\n  - TIL I have `\u003cleader\u003ecs` to bring up a symbol outline, totally forgot about it\n\n- reminder: zensical for homelab-mono docs and dotfiles docs\n\n### Soonish\n\nTemporal is great... idk what my issue is but maybe something about async\nsqlite is finicky cause I'm having some kind of race condition that I can not\nlocalize... but temporal makes it easy for me to retry the things I need to...\nhere's what I mean:\n\n```python\ndetails = None\nwhile details is None:\n    details = await workflow.execute_activity(\n        get_event_details,\n        event_id,\n        start_to_close_timeout=timedelta(seconds=30),\n        retry_policy=RetryPolicy(\n        backoff_coefficient=2.0,\n        maximum_attempts=5,\n        initial_interval=timedelta(seconds=1),\n        maximum_interval=timedelta(seconds=2)\n        )\n    )\n```\n\nAt the beginning of my Workflow.run I need some details from a record in a\ndatabase. I **know** that record exists because this workflow gets ran by the\nfunction that makes the record and I see it in the backend.... but sometimes\nthis query was coming back `None`... Temporal makes doing this simple `while`\nloop super easy with builtin retry logic\n\nNOTE: I'm not sure yet if I need to handle the otherwise infinite loop\npossibility...\n",
      "summary": "yesterday: 2025-11-23-notes",
      "date_published": "2025-11-24T05:15:33Z",
      "date_modified": "2025-11-24T05:15:33Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/2025-11-23-notes/",
      "url": "https://pype.dev/2025-11-23-notes/",
      "title": "2025-11-23 Notes",
      "content_text": "\nyesterday: [[2025-11-21-notes]]\n\n## Today\n\n- [[quadtask]].app got retired... we're at [https://quadtask.fly.dev](https://quadtask.fly.dev) now\n  - frees up the domain, one less thing to manage\n  - [x] updated fly secrets\n  - [x] updated google oauth\n  - [x] updated github oauth\n  - [x] updated files in repo\n  - [x] deploy\n",
      "summary": "yesterday: 2025-11-21-notes",
      "date_published": "2025-11-23T19:54:08Z",
      "date_modified": "2025-11-23T19:54:08Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-871/",
      "url": "https://pype.dev/thoughts-871/",
      "title": "💭 Docker | Atuin Docs",
      "content_text": "\n\u003ca href=\"https://docs.atuin.sh/self-hosting/docker/#using-systemd-to-manage-your-atuin-server\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://docs.atuin.sh/self-hosting/docker/#using-systemd-to-manage-your-atuin-server\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - Docker | Atuin Docs\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://docs.atuin.sh/self-hosting/docker/#using-systemd-to-manage-your-atuin-server\"\u003eDocker | Atuin Docs\u003c/a\u003e\n\n---\n\nA 2-fer... So I want to host atuin and share shell history across my machines on my tailnet I think... it's such a nice interface but I barely use it so I'm sure the features will improve some aspects of my life. And secondly, this section on using systemd is interesting... I hadn't thought to use systemd to schedule container upgrades - sounds incredibly trivial and probably a widely practiced thing now that I say it out loud... Saving here for implementing something... sometime...\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "A 2-fer... So I want to host atuin and share shell history across my machines on my tailnet I think... it's such a nice",
      "date_published": "2025-11-22T20:58:59Z",
      "date_modified": "2025-11-22T20:58:59Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "upgrades",
        "docker",
        "ssh",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/2025-11-21-notes/",
      "url": "https://pype.dev/2025-11-21-notes/",
      "title": "2025-11-21 Notes",
      "content_text": "\nyesterday: [[2025-11-19-notes]]\n\n- My blog now has the potential to have audio file served up with it!\n  - using [dropper](https://dropper.wayl.one) for now\n  - [markata plugin](https://github.com/pypeaday/pype.dev/blob/main/plugins/md_video.py)\n\nAs of today that script looks like...\n\n```python\n\"\"\"md_video plugin\"\"\"\n\nfrom markata.hookspec import hook_impl\nimport pydantic\nimport re\nfrom typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n    from markata import Markata\n\nMARKATA_PLUGIN_NAME = \"md_video\"\nMARKATA_PLUGIN_PACKAGE_NAME = \"md-video\"\n\n\nclass MdVideoConfig(pydantic.BaseModel):\n    video_extensions: list[str] = [\".mp4\", \".avi\", \".webm\"]\n    audio_extensions: list[str] = [\".mp3\", \".wav\", \".ogg\", \".m4a\"]\n    output_format: str = \"mp4\"\n\n\nclass Config(pydantic.BaseModel):\n    md_video: MdVideoConfig = MdVideoConfig()\n\n\n@hook_impl\ndef config_model(markata: \"Markata\") -\u003e None:\n    markata.config_models.append(Config)\n\n\ndef convert_media_tags(markata: \"Markata\", post) -\u003e str:\n    \"\"\"Convert Markdown image tags with video extensions to video tags.\"\"\"\n    image_pattern = re.compile(r\"!\\[(.*?)\\]\\((.*?)(\\.\\w+)\\)\")\n\n    md_video_conversions = []\n\n    def replace_image_with_video(match):\n        alt_text, src, ext = match.groups()\n        if ext.lower() in markata.config.md_video.video_extensions:\n            md_video_conversions.append(\n                f\"* [[ {post.slug} ]] -\u003e [{src}{ext}]({src}{ext})\"\n            )\n            return f'\u003cvideo autoplay loop muted playsinline controls\u003e\u003csource src=\"{src}{ext}\" type=\"video/{ext[1:]}\"\u003eYour browser does not support the video tag.\u003c/video\u003e'\n        elif ext.lower() in markata.config.md_video.audio_extensions:\n            md_video_conversions.append(\n                f\"* [[ {post.slug} ]] -\u003e [{src}{ext}]({src}{ext})\"\n            )\n            return f'\u003caudio controls\u003e\u003csource src=\"{src}{ext}\" type=\"audio/{ext[1:]}\"\u003eYour browser does not support the audio tag.\u003c/audio\u003e'\n        return match.group(0)\n\n    return md_video_conversions, image_pattern.sub(\n        replace_image_with_video, post.content\n    )\n\n\n@hook_impl\ndef pre_render(markata: \"Markata\") -\u003e None:\n    with markata.cache as cache:\n        for post in markata.filter(\"not skip\"):\n            content_key = markata.make_hash(\"md_video_content\", post.content)\n            content = cache.get(content_key)\n\n            if content is None:\n                md_video_conversions, post.content = convert_media_tags(markata, post)\n                cache.set(content_key, post.content)\n                continue\n            else:\n                post.content = content\n\n\n```\n",
      "summary": "yesterday: 2025-11-19-notes",
      "date_published": "2025-11-21T16:51:33Z",
      "date_modified": "2025-11-21T16:51:33Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/reflection-psalm-93/",
      "url": "https://pype.dev/reflection-psalm-93/",
      "title": "Reflection - Psalm 93",
      "content_text": "\nYahweh is king\n\n!!! note \"Psalm 93\"\n\n    93  Yahweh is king; he clothes himself with majesty.\n    Yahweh clothes himself; he girds himself with might.\n    Yes, the world is established so that it will not be moved.\n    2 Your throne is established from of old;\n    you are from everlasting.\n    3 The rivers have lifted up, O Yahweh;\n    the rivers have lifted up their ⌊rumbling⌋;\n    the rivers have lifted up their pounding.\n    4 Mightier than the rumblings of many waters,\n    mightier than the mighty breakers of the sea,\n    Yahweh on high is mighty.\n    5 Your testimonies are fully reliable.\n    Holiness is fitting for your house,\n    O Yahweh, ⌊forever⌋.\n\n## Observations\n\n- Yahweh is king; **he clothes himself** with majesty. **Yahweh clothes\n  himself**; he girds himself with might.\n\n  - It seems relevant to focus on Yahweh, the king, clothing himself. He has\n    partners, humans, and ceremonial guardians in the spiritual realm (cherubim,\n    seraphim, etc) and yet he clothes himself. His court doesn't clothe him - they\n    praise him certainly, but no one puts on Yahweh's kingly attire besides\n    Yahweh himself\n\n- You are everlasting\n  - In my post [[by-gods-grace]] I note that Yahweh owns us and everything. He\n    is the ruler of the universe because he is everlasting... no beginning and no\n    end\n\n## Reflection\n\n[[by-gods-grace]] the words \"Yahweh is king\" are a comfort to me. I am a\nwretch, but a wretch Yahweh is working on, has grace with, and ultimately\ninvites into paradise... Paradise in that he invites me to be a complete human,\nto fulfil purpose I was designed for. By God's grace, he is king and he's given\nme a will that seeks to align with his... Amen\n",
      "summary": "Yahweh is king",
      "date_published": "2025-11-19T05:59:43Z",
      "date_modified": "2025-11-19T05:59:43Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "reflection",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2025-11-19-notes/",
      "url": "https://pype.dev/2025-11-19-notes/",
      "title": "2025-11-19 Notes",
      "content_text": "\nyesterday: [[2025-11-15-notes]]\n\n- finished [[by-gods-grace]]\n- [[reflection-psalm-93]]\n",
      "summary": "yesterday: 2025-11-15-notes",
      "date_published": "2025-11-19T05:45:06Z",
      "date_modified": "2025-11-19T05:45:06Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/by-gods-grace/",
      "url": "https://pype.dev/by-gods-grace/",
      "title": "By God’s Grace",
      "content_text": "\n!!! note \"Style\"\n\n    This blog was fully orated and transcribed. I edited the transcript with some links and formatting\n\n![You can listen now!](https://dropper.wayl.one/file/a014f1f5-0ea6-46b7-94cd-c2c6f02ad9a6.mp3)\n\nOkay, so I had this thought about, honestly, just like what I would say. If\nsomebody asked me, why do I say the phrase \"by God's grace\" so often? And it's\nrelated to a [thought I had a while back](/reflection-psalm-9-1) where my\nbest friend would, where Michael would say, \"praise God\", out of like forced\nhabit. And it developed into a great point of spiritual maturity to say by reflex\n\"praise God\" in you know our slightly older age here, in our young parenthood.\nAnd so it's really related to that - I also say \"by God's grace\" a lot\nand why do I say that?\n\nI think it's related to these central themes that have been a part of my\nreflections of freedom but freedom to what? It is freedom to love Jesus - see\n[[helkyo-what-is-it-for-god-to-draw-man-to-him]] And before that, I'm not free\nat all.\n\n!!! danger \"\"\n\n    I'm just bound by sin.\n\nAnd that paired with believing loyalty and the choices I make every day - And\nI'm free to make the right choice...\nAnd sometimes even in God's sovereignty, I obey my sin instead of my king.\nWhich brings me to by God's grace.\n\n## God's Grace\n\nMy life is not my own, and this is kind of a cliched phrase almost, but it's\nsomething I think I'm just, I'm coming to accept in a new way.\n\n!!! note \"\"\n\n    My life does not belong to me.\n\n### Belongings\n\nI have possessions and I can do kind of whatever I want with them.\nI could break them and mend them and use them or not or let them get dirty or\nclean them. And it's up to me because they're my possessions.\n\nAnd we have lots of Christian language - \"God adopts us as sons\" and we're\n\"co-heirs and co-conquerers with Jesus\"...\n\nThose things are true, but also God owns us.\n\n!!! note \"\"\n\n    Everything in creation is his.\n\nHe redeems us unto himself, not just as a father and son, not just as the\nprodigal son or something like that - all things are made by him and held together by him.\n\nHe owns us.\n\nSo that's a _fundamental reality_ for all people to either...\n**accept** or not, because there's nothing they can do to **affect** it.\n\nNothing anybody can do will update the reality that [Yahweh is king](/reflection-psalm-93/).\nPeople can either accept that or not.\n\nBy God's grace, I am free to accept it.\nBy God's grace, he has picked me out of the kingdom of darkness and placed me,\nimported me into the kingdom of light.\nHe has made me a citizen of the celestial city.\n\nI didn't choose it.\n\nI didn't ask.\n\nHe [drew](/helkyo-what-is-it-for-god-to-draw-man-to-him) me to him.\n\n## Freedom\n\nI can say \"by God's grace\" because it's by no other thing that I have breath\nright now and that I can write this reflection.\nHe holds the universe together.\nMy life is not my own to live to me because I don't own my life.\nI am the possession of the king of the universe.\nAnd I am free to find fulfillment and joy in that.\nI am free to be satisfied by the king.\n\nFreed from the oppression of materialism and worldliness and lust and greed.\n\nI'm freed from the oppression of darkness.\nFreed to accept and call Yahweh my loving king rather than the conquering king\nwho I stand opposed to in the end times, whatever that kind of means.\n\nBy God's grace, I get to love him.\n\nAnd so to today, why do I say by God's grace?\n\nBecause everything that is good that happens to me is by his grace.\nAnd every trial or pain or bad thing I could think of or experience is only as bad as it is by his grace.\nAnd that trial, whatever it was or whatever may come -\nI pray I can echo Paul's words and say that it pales in comparison to the glory of the king.\n\nPraise the Lord.\n",
      "summary": "!!! note \"Style\"",
      "date_published": "2025-11-18T13:27:15Z",
      "date_modified": "2025-11-18T13:27:15Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "reflection",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/check-swap-in-htop/",
      "url": "https://pype.dev/check-swap-in-htop/",
      "title": "Check SWAP in htop",
      "content_html": "\u003cp\u003eI struggle with maxxing swap on all my machines, I am sure it\u0026rsquo;s a neovim config\nthat I\u0026rsquo;ve propagated everywhere and I\u0026rsquo;m too lazy to figure it out. Instead I\njust swapoff and swapon kind of often\u0026hellip; but this morning I had to know how to\nsee what\u0026rsquo;s using all that swap\u0026hellip;.\u003c/p\u003e\n\u003cfigure\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20251115125424_a1ddbd7c.png\" alt=\"20251115125424_a1ddbd7c.png\"\u003e\n\u003c/figure\u003e\n\u003cp\u003eThe way to see SWAP usage by process in htop is:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eopen htop\u003c/li\u003e\n\u003cli\u003eSlam \u003ccode\u003eF2\u003c/code\u003e (\u003ccode\u003ef\u003c/code\u003e if you\u0026rsquo;re just in old school \u003ccode\u003etop\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003esee the screenshot, find M_SWAP\u003c/li\u003e\n\u003cli\u003emove M_SWAP to \u003ccode\u003eActive Columns\u003c/code\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cfigure\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20251115125603_5d4af687.png\" alt=\"20251115125603_5d4af687.png\"\u003e\n\u003cfigcaption\u003e\u003cp\u003eCredit to \u003ca href=\"https://superuser.com/questions/206424/whats-using-my-swap-ubuntu\"\u003ethis superuser post\u003c/a\u003e\u003c/p\u003e\u003c/figcaption\u003e\u003c/figure\u003e\n",
      "content_text": "\nI struggle with maxxing swap on all my machines, I am sure it's a neovim config\nthat I've propagated everywhere and I'm too lazy to figure it out. Instead I\njust swapoff and swapon kind of often... but this morning I had to know how to\nsee what's using all that swap....\n\n![20251115125424_a1ddbd7c.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20251115125424_a1ddbd7c.png)\n\nThe way to see SWAP usage by process in htop is:\n\n1. open htop\n2. Slam `F2` (`f` if you're just in old school `top`)\n3. see the screenshot, find M_SWAP\n4. move M_SWAP to `Active Columns`\n\n![20251115125603_5d4af687.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20251115125603_5d4af687.png)\n\n\u003e Credit to [this superuser post](https://superuser.com/questions/206424/whats-using-my-swap-ubuntu)\n",
      "summary": "I struggle with maxxing swap on all my machines, I am sure it's a neovim config that I've propagated everywhere and I'm too lazy to figure it out. Instead I...",
      "date_published": "2025-11-15T06:52:14Z",
      "date_modified": "2025-11-15T06:52:14Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "dev",
        "til",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/zensical/",
      "url": "https://pype.dev/zensical/",
      "title": "Zensical",
      "content_html": "\u003cp\u003eZensical is a static site gnerator from the Material for Mk Docs team. Looks beautiful by default, great for doc sites\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://zensical.org/\"\u003elink\u003c/a\u003e\u003c/p\u003e\n",
      "content_text": "\nZensical is a static site gnerator from the Material for Mk Docs team. Looks beautiful by default, great for doc sites\n\n[link](https://zensical.org/)\n",
      "summary": "Zensical is a static site gnerator from the Material for Mk Docs team. Looks beautiful by default, great for doc sites",
      "date_published": "2025-11-15T06:30:40Z",
      "date_modified": "2025-11-15T06:30:40Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "glossary"
      ]
    },
    {
      "id": "https://pype.dev/2025-11-15-notes/",
      "url": "https://pype.dev/2025-11-15-notes/",
      "title": "2025-11-15 Notes",
      "content_text": "\nyesterday: [[2025-11-13-notes]]\n\n- tried [[zensical]] today\n\n  - will build my homelab-mono docs on it to start\n\n- learned about [lazyjournal](https://github.com/Lifailon/lazyjournal) today\n\n  - lazydocker/git inspired TUI for host logs\n\n- wrote [[check-swap-in-htop]]\n",
      "summary": "yesterday: 2025-11-13-notes",
      "date_published": "2025-11-15T06:28:42Z",
      "date_modified": "2025-11-15T06:28:42Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/2025-11-13-notes/",
      "url": "https://pype.dev/2025-11-13-notes/",
      "title": "2025-11-13 Notes",
      "content_text": "\nyesterday: [[2025-11-10-notes]]\n\n## Runescape\n\n- starting [Monkey Madness 1](https://oldschool.runescape.wiki/w/Monkey_Madness_I) today\n",
      "summary": "yesterday: 2025-11-10-notes",
      "date_published": "2025-11-13T05:46:29Z",
      "date_modified": "2025-11-13T05:46:29Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/speakr-for-recording-and-transcribing-at-home/",
      "url": "https://pype.dev/speakr-for-recording-and-transcribing-at-home/",
      "title": "Speakr For Recording and Transcribing at Home",
      "content_html": "\u003cp\u003eI have been using Whisper-WebUI for several months in my homelab to record and\ntranscribe myself thinking out loud. It\u0026rsquo;s been great. Then I came across\n\u003ca href=\"https://github.com/murtaza-nasir/speakr\"\u003espeakr\u003c/a\u003e which is like that but more\nfeature rich in what I wanted out of the WebUI. Specifically I get a nicer UI\nwith transcriptions, a chat window, built-in summarization, and diarization\nsupport (WebUI has this too but it\u0026rsquo;s a little nicer in Speakr in my opinion).\u003c/p\u003e\n\u003ch2 id=\"pic\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePic\u003c/span\u003e \u003ca href=\"#pic\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cfigure\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250824120404_da722d66.png\" alt=\"20250824120404_da722d66.png\"\u003e\n\u003c/figure\u003e\n\u003cp\u003eThe UI is a little busy but handy for what I\u0026rsquo;m after in the mornings or when\nI\u0026rsquo;m trying to mind-dump somewhere I can conveniently explore later.\u003c/p\u003e\n\u003ch2 id=\"speaker-identification\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSpeaker Identification\u003c/span\u003e \u003ca href=\"#speaker-identification\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eRequires HuggingFace Token to pull the models that perform \u003ca href=\"https://en.wikipedia.org/wiki/Speaker_diarisation\"\u003eSpeaker\ndiarisation\u003c/a\u003e - ie.\nidentifying different speakers\u003c/p\u003e\n\u003cp\u003eHere\u0026rsquo;s an example from an episode of Hybrid Cloud Show.\u003c/p\u003e\n\u003cfigure\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250826124040_48c8d2ce.png\" alt=\"20250826124040_48c8d2ce.png\"\u003e\n\u003c/figure\u003e\n",
      "content_text": "\nI have been using Whisper-WebUI for several months in my homelab to record and\ntranscribe myself thinking out loud. It's been great. Then I came across\n[speakr](https://github.com/murtaza-nasir/speakr) which is like that but more\nfeature rich in what I wanted out of the WebUI. Specifically I get a nicer UI\nwith transcriptions, a chat window, built-in summarization, and diarization\nsupport (WebUI has this too but it's a little nicer in Speakr in my opinion).\n\n## Pic\n\n![20250824120404_da722d66.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250824120404_da722d66.png)\n\nThe UI is a little busy but handy for what I'm after in the mornings or when\nI'm trying to mind-dump somewhere I can conveniently explore later.\n\n## Speaker Identification\n\nRequires HuggingFace Token to pull the models that perform [Speaker\ndiarisation](https://en.wikipedia.org/wiki/Speaker_diarisation) - ie.\nidentifying different speakers\n\nHere's an example from an episode of Hybrid Cloud Show.\n\n![20250826124040_48c8d2ce.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250826124040_48c8d2ce.png)\n",
      "summary": "I have been using Whisper-WebUI for several months in my homelab to record and transcribe myself thinking out loud. It's been great. Then I came across...",
      "date_published": "2025-11-11T05:02:37Z",
      "date_modified": "2025-11-11T05:02:37Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "speakr",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/repoflow-robot-user/",
      "url": "https://pype.dev/repoflow-robot-user/",
      "title": "RepoFlow Robot User",
      "content_html": "\u003cp\u003eI\u0026rsquo;m trying to lean into \u003ca href=\"https://repoflow.io\"\u003erepoFlow\u003c/a\u003e at home, and model some slightly better\npatterns than open borders to artifacts across all my services. As I\u0026rsquo;m getting repoflow\ngoing I see that I can make users in the console, but then I do have to invite\nusers to workspaces with a manually generate invite link.\u003c/p\u003e\n\u003cp\u003eThe workspaces an abstraction layer, and in each workspace can be many kinds of\nrepositories. For my purposes I\u0026rsquo;ll probably have 2 workspaces, even though 1\nwould almost certainly suffice.\u003c/p\u003e\n\u003cp\u003eThere doesn\u0026rsquo;t seem to be a way to add a user to a workspace from the admin\nsetting so for a while I was pretty confused why I couldn\u0026rsquo;t add my robot user\nto a docker repository in my main workspace\u0026hellip;\u003c/p\u003e\n\u003cp\u003eAfter generating the invite link and accepting though then I see in the workspace settings a\nsimple click to give the robot user access to all repos (if you want)\u003c/p\u003e\n\u003cfigure\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20251111122419_580b2ad4.png\" alt=\"20251111122419_580b2ad4.png\"\u003e\n\u003c/figure\u003e\n\u003cfigure\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20251110162252_6c7b2fe9.png\" alt=\"20251110162252_6c7b2fe9.png\"\u003e\n\u003c/figure\u003e\n\u003cp\u003e\u003ccode\u003eCan manage\u003c/code\u003e allows the user to mutate tags (ie. push \u003ccode\u003elatest\u003c/code\u003e docker tags). If\nthe user only has \u003ccode\u003eCan deploy\u003c/code\u003e then they can only create new artifacts (ie. not\nmutate any tags)\u003c/p\u003e\n",
      "content_text": "\nI'm trying to lean into [repoFlow](https://repoflow.io) at home, and model some slightly better\npatterns than open borders to artifacts across all my services. As I'm getting repoflow\ngoing I see that I can make users in the console, but then I do have to invite\nusers to workspaces with a manually generate invite link.\n\nThe workspaces an abstraction layer, and in each workspace can be many kinds of\nrepositories. For my purposes I'll probably have 2 workspaces, even though 1\nwould almost certainly suffice.\n\nThere doesn't seem to be a way to add a user to a workspace from the admin\nsetting so for a while I was pretty confused why I couldn't add my robot user\nto a docker repository in my main workspace...\n\nAfter generating the invite link and accepting though then I see in the workspace settings a\nsimple click to give the robot user access to all repos (if you want)\n\n![20251111122419_580b2ad4.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20251111122419_580b2ad4.png)\n\n![20251110162252_6c7b2fe9.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20251110162252_6c7b2fe9.png)\n\n`Can manage` allows the user to mutate tags (ie. push `latest` docker tags). If\nthe user only has `Can deploy` then they can only create new artifacts (ie. not\nmutate any tags)\n",
      "summary": "I'm trying to lean into repoFlow at home, and model some slightly better patterns than open borders to artifacts across all my services. As I'm getting...",
      "date_published": "2025-11-10T09:24:25Z",
      "date_modified": "2025-11-10T09:24:25Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/2025-11-10-notes/",
      "url": "https://pype.dev/2025-11-10-notes/",
      "title": "2025-11-10 Notes",
      "content_text": "\nyesterday: [[2025-11-07-notes]]\n\n## Projects\n\n- started trying to redeploy repoflow\n- thinking about auth has me wanting to get SSO setup at home for repoflow....\n\n  - [LLDAP github repo](https://github.com/lldap/lldap/blob/main/docs/install.md#with-docker)\n  - authelia?\n\n- started [[repoflow-robot-user]]\n",
      "summary": "yesterday: 2025-11-07-notes",
      "date_published": "2025-11-10T05:49:55Z",
      "date_modified": "2025-11-10T05:49:55Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/2025-11-07-notes/",
      "url": "https://pype.dev/2025-11-07-notes/",
      "title": "2025-11-07 Notes",
      "content_text": "\nyesterday: [[2025-11-05-notes]]\n\n## Ideas\n\n- Started thinking about a reusable forgejo action to do docker builds for\n  projects. I want to self host [iron calc](https://github.com/ironcalc/IronCalc)\n  but need to manage the build. I should do this for more things anyways so\n  here's to starting a new CI workflow at home\n",
      "summary": "yesterday: 2025-11-05-notes",
      "date_published": "2025-11-07T08:33:58Z",
      "date_modified": "2025-11-07T08:33:58Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/reflection-go-forward-only-thing-to-do/",
      "url": "https://pype.dev/reflection-go-forward-only-thing-to-do/",
      "title": "Reflection - Go Forward - Only Thing To Do",
      "content_html": "\u003ch2 id=\"reflection\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eReflection\u003c/span\u003e \u003ca href=\"#reflection\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eToday I am thinking about the blessings in my life\u0026hellip; In my opinion, I have a\nlot going for me - God has been so utterly good to me that finding fault with\nanything that was outside my control feels near-sinful\u0026hellip;\u003c/p\u003e\n\u003cp\u003eIn my adult life I have a reached several \u0026ldquo;checkpoints of success\u0026rdquo; for lack of\na better stupid word\u0026hellip;\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003esmokin\u0026rsquo; hot wife that loves Jesus\u003c/li\u003e\n\u003cli\u003e2 beautiful daughters\u003c/li\u003e\n\u003cli\u003estable work that I\u0026rsquo;m also good at\u003c/li\u003e\n\u003cli\u003eby all accounts - excellent physical health\u003c/li\u003e\n\u003cli\u003eby all accounts - very decent mental health (more on this later)\u003c/li\u003e\n\u003cli\u003ea house, food, water, and the means to do recreation\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eSo, it\u0026rsquo;s very clear that God has been very good to me - and at the same time\nit\u0026rsquo;s probably wrong to give the impression that there was no sacrifice, pain,\nor affliction in my life so far\u0026hellip;\u003c/p\u003e\n\u003cp\u003eHere\u0026rsquo;s what\u0026rsquo;s on my mind - I kind of think God has given me so much in my adult\nlife as a byproduct of my childhood. This note will not be full of gory\ndetails, but here\u0026rsquo;s one I find comical (though my wife finds it sad\u0026hellip; you be\nthe judge)\u003c/p\u003e\n\u003ch3 id=\"breakfast-and-school\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBreakfast and School\u003c/span\u003e \u003ca href=\"#breakfast-and-school\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eWhen I was a kid, like elementary school, I would take care of myself to pretty\nextraordinary degrees. The short of this example is that at 5 years old I was\ngetting myself up in the morning, getting dressed, making breakfast, and then\nwaking my mom up to take me to school.\u003c/p\u003e\n\u003cp\u003eI recently found out that my dad knew this and when he made some work changes\nthat resulted in him being home in the morning, it turned out I wanted nearly\nnothing to do with it! I still wanted to make my own breakfast and do my normal\nroutine.\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eNote\u003c/p\u003e\n\u003cp\u003eTurns out a lot of that is explained by Autism \u003cem\u003eshrug emoji\u003c/em\u003e who knew?\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eLooking back, there\u0026rsquo;s deep threads about who I am, my work ethic, outlook on\nresponsibility, etc. that have roots in my childhood morning situation\u0026hellip; but\nto me, what I think are the results of this upbringing are the gifts that God\nhas given me\u0026hellip; not to \u0026ldquo;make up\u0026rdquo; for a lost childhood, but as humans simply\nadapt they evolve and become better at handling what\u0026rsquo;s thrown at them.\nTheologically I would say these experiences teach wisdom, and wisdom is a\npattern in which we are to walk through life in a godly manner.\u003c/p\u003e\n\u003cp\u003eLet me wrap up this short anecdote - my dad was visiting recently and over the\ncourse of conversation this fact about my childhood came up. We\u0026rsquo;re all adults\nnow, my parents are divorced and married to other people, and when this came up\nI saw for just a second some pain on my dad\u0026rsquo;s face. It\u0026rsquo;s probably why my wife\nthinks this is sad too - for the observer, my childhood wasn\u0026rsquo;t taken from me,\nbut it was never given either (again - there\u0026rsquo;s \u003cstrong\u003emuch more\u003c/strong\u003e than this silly\nbreakfast thing). That\u0026rsquo;s sad to emotionally-regulated adults who know what a\nchild needs. And in my journey as a dad I totally see how I was neglected in\nmany ways - but again, I\u0026rsquo;m not upset about it, and at the same time I wouldn\u0026rsquo;t\nattempt to replicate my experience for my own children\u0026hellip;\u003c/p\u003e\n\u003cp\u003eI guess what I\u0026rsquo;m saying is that God is good, and I think it\u0026rsquo;s in spending so\nmuch time and energy in focusing on his goodness that the sad stuff can kind of\njust\u0026hellip; fall away\u0026hellip; It certainly happened, but it happen\u003cstrong\u003eed\u003c/strong\u003e and today is a\nnew day.\u003c/p\u003e\n\u003cp\u003eFinally consider Bilbo, The Hobbit, when he falls down deep into the goblin\u0026rsquo;s\ncave, right before meeting Golem. He takes a tumble, gets up, and\u0026hellip;\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eOnly thing to do\u003c/p\u003e\n\u003cp\u003e“Go back?\u0026quot; he thought. \u0026ldquo;No good at all! Go sideways? Impossible! Go forward? Only thing to do! On we go!\u0026rdquo; So up he got, and trotted along\u0026hellip;\u003c/p\u003e\n\u003c/div\u003e\n",
      "content_text": "\n## Reflection\n\nToday I am thinking about the blessings in my life... In my opinion, I have a\nlot going for me - God has been so utterly good to me that finding fault with\nanything that was outside my control feels near-sinful...\n\nIn my adult life I have a reached several \"checkpoints of success\" for lack of\na better stupid word...\n\n1. smokin' hot wife that loves Jesus\n2. 2 beautiful daughters\n3. stable work that I'm also good at\n4. by all accounts - excellent physical health\n5. by all accounts - very decent mental health (more on this later)\n6. a house, food, water, and the means to do recreation\n\nSo, it's very clear that God has been very good to me - and at the same time\nit's probably wrong to give the impression that there was no sacrifice, pain,\nor affliction in my life so far...\n\nHere's what's on my mind - I kind of think God has given me so much in my adult\nlife as a byproduct of my childhood. This note will not be full of gory\ndetails, but here's one I find comical (though my wife finds it sad... you be\nthe judge)\n\n### Breakfast and School\n\nWhen I was a kid, like elementary school, I would take care of myself to pretty\nextraordinary degrees. The short of this example is that at 5 years old I was\ngetting myself up in the morning, getting dressed, making breakfast, and then\nwaking my mom up to take me to school.\n\nI recently found out that my dad knew this and when he made some work changes\nthat resulted in him being home in the morning, it turned out I wanted nearly\nnothing to do with it! I still wanted to make my own breakfast and do my normal\nroutine.\n\n!!! note \"\"\n\n    Turns out a lot of that is explained by Autism *shrug emoji* who knew?\n\nLooking back, there's deep threads about who I am, my work ethic, outlook on\nresponsibility, etc. that have roots in my childhood morning situation... but\nto me, what I think are the results of this upbringing are the gifts that God\nhas given me... not to \"make up\" for a lost childhood, but as humans simply\nadapt they evolve and become better at handling what's thrown at them.\nTheologically I would say these experiences teach wisdom, and wisdom is a\npattern in which we are to walk through life in a godly manner.\n\nLet me wrap up this short anecdote - my dad was visiting recently and over the\ncourse of conversation this fact about my childhood came up. We're all adults\nnow, my parents are divorced and married to other people, and when this came up\nI saw for just a second some pain on my dad's face. It's probably why my wife\nthinks this is sad too - for the observer, my childhood wasn't taken from me,\nbut it was never given either (again - there's **much more** than this silly\nbreakfast thing). That's sad to emotionally-regulated adults who know what a\nchild needs. And in my journey as a dad I totally see how I was neglected in\nmany ways - but again, I'm not upset about it, and at the same time I wouldn't\nattempt to replicate my experience for my own children...\n\nI guess what I'm saying is that God is good, and I think it's in spending so\nmuch time and energy in focusing on his goodness that the sad stuff can kind of\njust... fall away... It certainly happened, but it happen**ed** and today is a\nnew day.\n\nFinally consider Bilbo, The Hobbit, when he falls down deep into the goblin's\ncave, right before meeting Golem. He takes a tumble, gets up, and...\n\n!!! note \"Only thing to do\"\n\n    “Go back?\" he thought. \"No good at all! Go sideways? Impossible! Go forward? Only thing to do! On we go!\" So up he got, and trotted along...\n",
      "summary": "Today I am thinking about the blessings in my life... In my opinion, I have a lot going for me - God has been so utterly good to me that finding fault with...",
      "date_published": "2025-11-05T06:04:16Z",
      "date_modified": "2025-11-05T06:04:16Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "reflection",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2025-11-05-notes/",
      "url": "https://pype.dev/2025-11-05-notes/",
      "title": "2025-11-05 Notes",
      "content_text": "\nyesterday: [[2025-11-04-notes]]\n\n## Reflection - Blessings\n\n- [[reflection-go-forward-only-thing-to-do]]\n",
      "summary": "yesterday: 2025-11-04-notes",
      "date_published": "2025-11-05T05:44:45Z",
      "date_modified": "2025-11-05T05:44:45Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/2025-11-04-notes/",
      "url": "https://pype.dev/2025-11-04-notes/",
      "title": "2025-11-04 Notes",
      "content_text": "\nyesterday: [[2025-11-03-notes]]\n\n## Today\n\n- finished [[deuteronomy-6-and-the-shema]] after watching the BP video on it this morning\n",
      "summary": "yesterday: 2025-11-03-notes",
      "date_published": "2025-11-04T05:32:23Z",
      "date_modified": "2025-11-04T05:32:23Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/deuteronomy-6-and-the-shema/",
      "url": "https://pype.dev/deuteronomy-6-and-the-shema/",
      "title": "Deuteronomy 6 and the Shema",
      "content_html": "\u003cp\u003eThe Shema from Judaism, archived in Deuteronomy 6, is a pinnacle tradition in\nHebrew Judaism, and \u003cem\u003eshould be\u003c/em\u003e in Christianity. I cannot claim to be an\nexpert, but it\u0026rsquo;s one of the fundamentals - shema means to listen AND obey, and\nthis was the primary charge given to God\u0026rsquo;s people. His people were also to\nrepeat his commandments, make them apart of their lives, and introduce their\nchildren to the Laws of God so that the next generation may not lose sight of\nGod\u0026rsquo;s oracles and truths.\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eThe Shema\u003c/p\u003e\n\u003cp\u003eDeuteronomy 6:4–5 (LEB): 4 “Hear, Israel, Yahweh our God, Yahweh is unique. 5 And you shall love Yahweh your God with all of your heart and with all of your soul and with all of your might.\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"my-kids\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMy Kids\u003c/span\u003e \u003ca href=\"#my-kids\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI talk with my kids about \u003cem\u003eobedience\u003c/em\u003e a lot\u0026hellip; and it\u0026rsquo;s fine, because they\u0026rsquo;re\nyoung kids in a stage of life of needing near-constant correction. I love them\nand so because I love them they need to obey me, because no one in the world\ncares more about their safety and flourishing than I do, and no matter what\n\u003cem\u003ethey see\u003c/em\u003e they need to trust me more than what they see - ie. listen to me\nover anything else going on\u0026hellip; Now, this is a hard lesson for a child certainly,\nbut is it not exactly what Jesus requests of me? How easy would I say it is then?\u003c/p\u003e\n\u003cp\u003eBut I think the key with the kids is to regularly talk about listening in the\ncontext of love and grace. We tell our girls constantly that we love them, that\nthey\u0026rsquo;re safe and protected, and because of those truths they should listen to\nus (the parents).\u003c/p\u003e\n\u003ch2 id=\"the-point\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThe Point\u003c/span\u003e \u003ca href=\"#the-point\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThis isn\u0026rsquo;t a ground breaking post, to even grace it with the title\u0026hellip; It\u0026rsquo;s a\nshort reminder to me that kids need structure and guidance. I am here to\nprovide that to my kids. And in the exact same way that they are to \u003ccode\u003eshema\u003c/code\u003e, to\nlisten and obey me, I am to \u003ccode\u003eshema\u003c/code\u003e, to listen and obey the Lord\u0026hellip; For the\nLord my God is One.\u003c/p\u003e\n",
      "content_text": "\nThe Shema from Judaism, archived in Deuteronomy 6, is a pinnacle tradition in\nHebrew Judaism, and _should be_ in Christianity. I cannot claim to be an\nexpert, but it's one of the fundamentals - shema means to listen AND obey, and\nthis was the primary charge given to God's people. His people were also to\nrepeat his commandments, make them apart of their lives, and introduce their\nchildren to the Laws of God so that the next generation may not lose sight of\nGod's oracles and truths.\n\n!!! note \"The Shema\"\n\n    Deuteronomy 6:4–5 (LEB): 4 “Hear, Israel, Yahweh our God, Yahweh is unique. 5 And you shall love Yahweh your God with all of your heart and with all of your soul and with all of your might.\n\n## My Kids\n\nI talk with my kids about _obedience_ a lot... and it's fine, because they're\nyoung kids in a stage of life of needing near-constant correction. I love them\nand so because I love them they need to obey me, because no one in the world\ncares more about their safety and flourishing than I do, and no matter what\n_they see_ they need to trust me more than what they see - ie. listen to me\nover anything else going on... Now, this is a hard lesson for a child certainly,\nbut is it not exactly what Jesus requests of me? How easy would I say it is then?\n\nBut I think the key with the kids is to regularly talk about listening in the\ncontext of love and grace. We tell our girls constantly that we love them, that\nthey're safe and protected, and because of those truths they should listen to\nus (the parents).\n\n## The Point\n\nThis isn't a ground breaking post, to even grace it with the title... It's a\nshort reminder to me that kids need structure and guidance. I am here to\nprovide that to my kids. And in the exact same way that they are to `shema`, to\nlisten and obey me, I am to `shema`, to listen and obey the Lord... For the\nLord my God is One.\n",
      "summary": "The Shema from Judaism, archived in Deuteronomy 6, is a pinnacle tradition in Hebrew Judaism, and _ in Christianity. I cannot claim to be an expert, but it's...",
      "date_published": "2025-11-04T05:10:11Z",
      "date_modified": "2025-11-04T05:10:11Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "shema",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2025-11-03-notes/",
      "url": "https://pype.dev/2025-11-03-notes/",
      "title": "2025-11-03 Notes",
      "content_text": "\nyesterday: [[2025-10-30-notes]]\n\n## Today\n\n- Fell back into a slump over the last couple weeks... Struggling to keep up on morning reflections, writing, building, etc... I don't know what happened - about a month ago I felt great coming out of the summer and building notifiq but then it evaporated\n",
      "summary": "yesterday: 2025-10-30-notes",
      "date_published": "2025-11-03T05:23:32Z",
      "date_modified": "2025-11-03T05:23:32Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/facism-and-heresy-words-matter/",
      "url": "https://pype.dev/facism-and-heresy-words-matter/",
      "title": "Facism and Heresy - Words Matter",
      "content_text": "\n\u003e This is a short reflection/semi-open letter to a friend I've been having a\n\u003e conversation with for a couple weeks\n\nName-calling in a rhetorical exchange is such a school-yard bully, low IQ,\ndesperate, degenerate move when it's used in lieu of data... I have 2 scenarios\nin my head that bring light to one another.\n\n!!! warning \"\"\n\n    Today the words \"Nazi\" and \"Facist\" are so over-used it's moved beyond sickening to boring.\n\nHowever, the usage of these words has led to violence, and a lot of it\nin my opinion. The dangerous rhetoric is a key player in the multiple\nTrump-assassination attempts, various acts of violence against other\nconservatives, specifically, (because who else does the Left call a Facist except\nanyone remotely moderate anymore), and most notably the murder of Charlie Kirk.\nI find the rhetoric super dangerous because I'm not a politician, but boy can I\ntell you for sure that Charlie was a moderate, and if they came for him then\nconsider my reflection: [[reflection-they-can-come-for-anyone]].\n\nOne of the problems I see here is that many people can't define \"Nazi\" or\n\"Facist\". To the Left, these words just describe someone they disagree with,\nand it's turning out - ultimately someone they think would be better off dead.\n\nIt reminds me of a kid at a summer camp I worked at about 10 years ago. The\ncamp was all about Christian apologetics - great times, good discussions, lots\nof great content, etc. One year there was a 17 or 18 year old boy here, super\nfundamentalist in his beliefs... no harm no foul here. But he demonstrated a\nhabit of calling **anything** that differ'ed from his interpretation of a\npassage of scripture as heresy. Now... here's the thing, it's not heresy to not\nbe a young-earth-creationist. But something that is true is that people have\nbeen **put to death** over heresy in the history of the Church.... and yet this\nkid felt comfortable labeling anyone a heretic who was more fluent in Hebrew\nthan him...\n\nSo what do I see? - There's similarities between that immature kid and\npractically anyone using the words \"Nazi\" or \"Facist\" to describe American\npolitics right now - are the same type of person to me. That person feels a\ndeep care for the thing they think they're protecting, but in reality they're\nparticipating in a violent pattern of history that **they do not understand**\n\nSo to us today, in or out of the Church, involved or not involved with\npolitics... We need to recognize that words matter. And to carelessly use words\nthat eventually excuse violence is at best, ignorant. There's nothing wrong\nwith ignorance, but a good measure of a man is what he does when his ignorance\nhas been pointed out... Will you be apart of the solution? Or continue to fan\nthe flames?\n",
      "summary": "This is a short reflection/semi-open letter to a friend I've been having a \u003e conversation with for a couple weeks",
      "date_published": "2025-11-01T06:27:33Z",
      "date_modified": "2025-11-01T06:27:33Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "politics",
        "note"
      ]
    },
    {
      "id": "https://pype.dev/reflection-psalm-9-1/",
      "url": "https://pype.dev/reflection-psalm-9-1/",
      "title": "Reflection - Psalm 9:1",
      "content_html": "\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003ePsalm 9:1\u003c/p\u003e\n\u003cp\u003eI will thank Yahweh with all my heart. I will tell of all your wonderful deeds.\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"praise-god\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePraise God\u003c/span\u003e \u003ca href=\"#praise-god\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe phrase \u0026ldquo;praise God\u0026rdquo; has become a common phrase in my life. I\u0026rsquo;m blessed to\nhave my best friend, Michael, in my life after 15+ years. Back in high school,\nI forget how it came up, but he told me that anytime something good happens, he\nforces himself to just audibly say \u0026ldquo;praise God\u0026rdquo;. Jesus certainly quickened that\nto my heart, and it was again in high school that I witnessed some fruit of,\nnot using the phrase, but practicing giving glory to God in the smaller moments.\u003c/p\u003e\n\u003cp\u003eSome youth group kids were helping a church member replace their roof - so lots\nof high-schoolers tearing shingles off, hauling garbage, etc. As we were on the\nroof, one of the guys nearly fell off (we hadn\u0026rsquo;t even heard of \u0026ldquo;tie-offs\u0026rdquo;\nbefore). Something like a nail caught his shorts and he recovered his grip. I\nimmediately said \u0026ldquo;Praise God\u0026rdquo;, and him and another guy looked at me and they go\n\u0026ldquo;\u0026hellip;. ya! Praise God for sure!\u0026rdquo; and I think they had a similar experience then\nlike I had with Michael, where when something good happens we draw attention to\nthe Lord, and that edifies those around us.\u003c/p\u003e\n\u003cp\u003eI don\u0026rsquo;t know when it became habit, but certainly \u0026ldquo;today\u0026rdquo; not a day goes by where\nthe phrase \u0026ldquo;Praise God\u0026rdquo; doesn\u0026rsquo;t leave my lips at least once. On one hand, I\nthink Jesus has changed my heart to be more immediately responsive to him as\nthe giver of good things, and so it\u0026rsquo;s natural now that when something good\nhappens not to \u0026ldquo;just say\u0026rdquo; \u0026ldquo;Praise the Lord\u0026rdquo;, but to give thanks and actually\npraise the Lord!. This has been an edifying practice in my life for my own\nheart. However, on the other hand, bringing attention to God\u0026rsquo;s glory in the\nwake of good things is good for others. I have noticed my wife and kids, in\ntheir own ways, adopt a similar response to good things, and that\u0026rsquo;s\nbeen a steady stream of encouragement for me as the Lord continues to shape me\nand my family.\u003c/p\u003e\n",
      "content_text": "\n!!! note \"Psalm 9:1\"\n\n    I will thank Yahweh with all my heart. I will tell of all your wonderful deeds.\n\n## Praise God\n\nThe phrase \"praise God\" has become a common phrase in my life. I'm blessed to\nhave my best friend, Michael, in my life after 15+ years. Back in high school,\nI forget how it came up, but he told me that anytime something good happens, he\nforces himself to just audibly say \"praise God\". Jesus certainly quickened that\nto my heart, and it was again in high school that I witnessed some fruit of,\nnot using the phrase, but practicing giving glory to God in the smaller moments.\n\nSome youth group kids were helping a church member replace their roof - so lots\nof high-schoolers tearing shingles off, hauling garbage, etc. As we were on the\nroof, one of the guys nearly fell off (we hadn't even heard of \"tie-offs\"\nbefore). Something like a nail caught his shorts and he recovered his grip. I\nimmediately said \"Praise God\", and him and another guy looked at me and they go\n\".... ya! Praise God for sure!\" and I think they had a similar experience then\nlike I had with Michael, where when something good happens we draw attention to\nthe Lord, and that edifies those around us.\n\nI don't know when it became habit, but certainly \"today\" not a day goes by where\nthe phrase \"Praise God\" doesn't leave my lips at least once. On one hand, I\nthink Jesus has changed my heart to be more immediately responsive to him as\nthe giver of good things, and so it's natural now that when something good\nhappens not to \"just say\" \"Praise the Lord\", but to give thanks and actually\npraise the Lord!. This has been an edifying practice in my life for my own\nheart. However, on the other hand, bringing attention to God's glory in the\nwake of good things is good for others. I have noticed my wife and kids, in\ntheir own ways, adopt a similar response to good things, and that's\nbeen a steady stream of encouragement for me as the Lord continues to shape me\nand my family.\n",
      "summary": "!!! note \"Psalm 9:1\"",
      "date_published": "2025-10-30T06:12:37Z",
      "date_modified": "2025-10-30T06:12:37Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "reflection",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2025-10-30-notes/",
      "url": "https://pype.dev/2025-10-30-notes/",
      "title": "2025-10-30 Notes",
      "content_text": "\nyesterday: [[2025-10-28-notes]]\n\n## Reflection\n\n- [[reflection-psalm-9-1]]\n",
      "summary": "yesterday: 2025-10-28-notes",
      "date_published": "2025-10-30T06:02:42Z",
      "date_modified": "2025-10-30T06:02:42Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-856/",
      "url": "https://pype.dev/thoughts-856/",
      "title": "💭 You already have a git server: (Maurycy’s blog)",
      "content_text": "\n\u003ca href=\"https://maurycyz.com/misc/easy_git/\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://maurycyz.com/misc/easy_git/\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - You already have a git server: (Maurycy's blog)\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://maurycyz.com/misc/easy_git/\"\u003eYou already have a git server: (Maurycy's blog)\u003c/a\u003e\n\n---\n\nUsing my server's filesystem + ssh + git-hooks for the simplest self-hosted CI pipelines ever sounds like a pretty cool setup. Probably would lose any cool graphics like GH Actions gives you but for full sovereignty over your code + zero bloat it's an appealing pattern\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "Using my server's filesystem + ssh + git-hooks for the simplest self-hosted CI pipelines ever sounds like a pretty cool",
      "date_published": "2025-10-28T11:16:37Z",
      "date_modified": "2025-10-28T11:16:37Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "git",
        "dev",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/reflection-john-15-19/",
      "url": "https://pype.dev/reflection-john-15-19/",
      "title": "Reflection - John 15:19",
      "content_text": "\n!!! note \"Spurgeon\"\n\n    If Jesus undertook to bring me to glory, and if the Father promised that he\n    would give me to the Son to be a part of the infinite reward of the travail of\n    his soul; then, my soul, till God himself shall be unfaithful, till Jesus shall\n    cease to be the truth, thou art safe.\n\n!!! note \"John 15:19\"\n\n    If you were of the world, the world would love its own. But because you are\n    not of the world, but I chose you out of the world, for this reason the world\n    hates you.\n\n## The World\n\n\"Not of this world\" was a clothing brand when I was a kid that made emo-styled\nclothing so edgy teens could be reminded to live a moral life. This was at\nleast how I took the phrase \"Not of this world\" for most of my life...\n\nThe phrase shouldn't be trivialized. But as it was to me (not to blame that\nclothing brand) it turned one of the most freeing truths about Yahweh's\nsovereignty into a list of do's and don't's. It actually moralizes Jesus in\npretty much the same way anyone does who brings him up when it's convenient for\ntheir political argument.\n\nThat irony is actually kind of funny to me right now... Jesus explicitly tells\nhis disciples that they are not of this world, because God has chosen them (see\n[[helkyo-what-is-it-for-god-to-draw-man-to-him]] for some thoughts on it). And\nhere we go, doing exactly what the world would otherwise do with his teaching.\n\n## Reflection\n\nI almost feel like my reflections have all been the same thing in recent\nweeks... The freedom offered by Jesus to those chosen from before the beginning\nof time is beautiful. It's beautiful because that freedom, which is actually\nfreedom to follow Jesus, is what leads to human flourishing. Not necessarily\nthe fastest technological advancements (but according to the story of Genesis 6\nand the Watchers, technology can enable humans to do much more harm than good),\nbut the most-human life we can live is one in community with God and his\npeople.\n\nThe highest calling of man is to glorify God and honor him - and of course that\ncalling is only actually achievable by those he calls. It has nothing to do\nwith why he calls them, **no one** in God's family can claim to have earned\ntheir place. That's the beauty. And for Christians, that ought to drive us to\ninteract with non-believers perhaps differently...\n\nToo many Christians do I know who have Christian-expectations for\nnon-Christians... I have been to plenty of small groups where a topic becomes\nthe ridiculous level of debauchery celebrated in the public square. My fellow\nChristian brothers may rightly point out evil and wickedness but often it's\npaired with disappointment... To that I always say \"why?\".\n\n!!! danger \"\"\n\n    What other expectation is there of a godless community than godless behavior?\n\nIt's precisely because the Father chose the believers and gives them to Jesus\nthat they/we should live how humans were designed to live - in accordance with\nYahweh's kingship of the world. In submitting to Yahweh, by his own election,\nthe world (which celebrates debauchery) will inevitably hate the believer.\nThe believer should also come to hate the debauchery. But nowhere in this\nlogical line of thinking here do I see reason to be disappointed or surprised\nin the world... once again, if the Father has not chosen you **out of it** then\n**what else would any believer expect?**\n\nSo what about me? Reflections aren't meant for focusing on \"them\"... So, Jesus\nsays that I'm \"not of this world\" and that the world will hate me. I've\ncertainly faced anger and hatred over my faith, but what else would I expect?!\nHowever, I don't think that Jesus means here that we should strive to be hated by\nthe world, or that being hated is confirmation that we're doing things right.\nNo, it's not about behavior - it's about reality. The reality that the\nbeliever has, that I have, been chosen.\n\nTo that reality I echo Spurgeon's words\n\n\u003e If Jesus undertook to bring me to glory, and if the Father promised that he would give me to the Son to be a part of the infinite reward of the travail of his soul; then, my soul, till God himself shall be unfaithful, till Jesus shall cease to be the truth, thou art safe.\n\nMy soul, thou art safe.\n",
      "summary": "!!! note \"Spurgeon\"",
      "date_published": "2025-10-28T06:36:22Z",
      "date_modified": "2025-10-28T06:36:22Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "grace",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2025-10-28-notes/",
      "url": "https://pype.dev/2025-10-28-notes/",
      "title": "2025-10-28 Notes",
      "content_text": "\nyesterday: [[2025-10-27-notes]]\n\n- [[reflection-john-15-19]]\n",
      "summary": "yesterday: 2025-10-27-notes",
      "date_published": "2025-10-28T06:19:10Z",
      "date_modified": "2025-10-28T06:19:10Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/helkyo/",
      "url": "https://pype.dev/helkyo/",
      "title": "Helkyo",
      "content_html": "\u003cp\u003eTo drag forcefully\u003c/p\u003e\n\u003cp\u003etransliteration: helkō\u003c/p\u003e\n",
      "content_text": "\nTo drag forcefully\n\ntransliteration: helkō\n",
      "summary": "To drag forcefully",
      "date_published": "2025-10-27T16:49:16Z",
      "date_modified": "2025-10-27T16:49:16Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "glossary"
      ]
    },
    {
      "id": "https://pype.dev/helkyo-what-is-it-for-god-to-draw-man-to-him/",
      "url": "https://pype.dev/helkyo-what-is-it-for-god-to-draw-man-to-him/",
      "title": "Helkyo - What is it for God to draw man to him?",
      "content_html": "\u003cp\u003eIn John 6 there is a curious phrase about how the Father initiates the process\nof Salvation in the hearts of men.\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eJohn 6:44\u003c/p\u003e\n\u003cp\u003eNo one can come to me unless the Father who sent me draws him. And I will raise him up on the last day.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eThe word \u003ccode\u003edraws\u003c/code\u003e is the Greek \u003ccode\u003eἑλκύσῃ\u003c/code\u003e ([helkyo]). This word doesn\u0026rsquo;t mean \u0026ldquo;draw\u0026rdquo;\nlike how we would immediately understand it - in the sense of wooing, or\nconvincing\u0026hellip; I\u0026rsquo;m not really sure why \u003ccode\u003edraws\u003c/code\u003e is the common English\ntranslation, I have a theory about theological presuppositions in the modern\nChristian movement but it\u0026rsquo;s not super relevant to my thought on it. It\u0026rsquo;s not\nrelevant, because this word in its most native sense nearly perfectly describes\nmy experience with Jesus. Before diving in - here\u0026rsquo;s a couple more Biblical\nexamples of the word\u0026hellip;\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eJohn 21:6\u003c/p\u003e\n\u003cp\u003eAnd he said unto them, Cast the net on the right side of the ship, and ye shall find. They cast therefore, and now they were not able to draw [helkyo] it for the multitude of fishes.\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eJames 2:6\u003c/p\u003e\n\u003cp\u003eBut ye have despised the poor. Do not rich men oppress you, and draw [helkyo] you before the judgment seats?\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eSo the oppressed are \u003ccode\u003ehelkyo\u003c/code\u003e to judgement\u0026hellip; The fish are \u003ccode\u003ehelkyo\u003c/code\u003e\u0026rsquo;d into the\nboat.\u003c/p\u003e\n\u003cp\u003eThe simple definition is not \u0026ldquo;to lure\u0026rdquo; but \u0026ldquo;to haul\u0026rdquo; as in \u0026ldquo;to haul a net full\nof fish up into the boat\u0026rdquo;. This is not an image of a gentle calling. And no\ndoubt, Jesus is sweet with all of us at various times, the Word of the Lord is\nthe source of rest and peace. But being drawn to God is not necessarily a\nromantic experience. For me, I was raised in the Church, went to youth group,\nand in hindsight did genuinely believe. The Lord knows his people from before\ntime began, but it doesn\u0026rsquo;t mean that his people don\u0026rsquo;t live human lives in pre\nand post salvific forms. What I mean is - we\u0026rsquo;re all born sinners, and Jesus\nchanges the hearts of those whom the Father gives him. This is right out of John 6.\nBut what\u0026rsquo;s there for me is the reality that sometimes Jesus stretches out his\nhand and says \u0026ldquo;come, follow me\u0026rdquo;. And other times he casts the net and drags you\ninto the boat. For me, it was that.\u003c/p\u003e\n\u003cp\u003eWhen I went to college I was angry at God over idols in my life. I felt\nabandoned by many, didn\u0026rsquo;t like my home life, was generally aimless, and easily\npersuaded into things I wanted to be true out of the rebellion I wanted to\nenact against the Lord. And this post isn\u0026rsquo;t going to be me reliving any of\nthose choices. At the end of the day, I was raised in the boat and wanted to\njump and swim on my own.\u003c/p\u003e\n\u003cp\u003eI made every attempt I could to run from Jesus but ultimately that story ends\nwith him simply [helkyo]\u0026lsquo;ing my ass back into the boat.\u003c/p\u003e\n\u003ch2 id=\"free-will\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFree Will\u003c/span\u003e \u003ca href=\"#free-will\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eOk so what about my side of it? I did try to swim away\u0026hellip; what about the idea\nthat humans have \u0026ldquo;free will\u0026rdquo;?\u003c/p\u003e\n\u003cp\u003eWell, I\u0026rsquo;m not really here to argue about that much either, but it\u0026rsquo;s worth\naddressing that in my post-salvific life my desire is that my will becomes\nwhatever God\u0026rsquo;s will is\u0026hellip;\u003c/p\u003e\n\u003cp\u003eTo be honest with you, the most freeing thing to me is knowing God cares about\nme. Whatever his will is, that\u0026rsquo;s the will I want to align myself with.\u003c/p\u003e\n\u003cp\u003eIt became clearer to me after becomming a dad. My kids aren\u0026rsquo;t big enough to\nfully exercise their own free will and volition without getting hurt, and\nthat\u0026rsquo;s pretty much where I/we are with God\u0026hellip; Sure I feel like an adult, but I\ndo stupid things all the time, and I make choices I know are not the best. I\ncan only really imagine that God looks as me like how I look at my daughters\nwhenever they\u0026rsquo;re disobeying to their own demise\u0026hellip; My desire for them is that\nthey want what I want for them, and it\u0026rsquo;s because I actually do know better than\nthey do, right? In the same way God knows better than me, and I want to be able to\nacknowledge that in the manner I want my daughters to acknowledge my desire for\ntheir greater good.\u003c/p\u003e\n\u003cp\u003eSo, what is \u0026ldquo;free will\u0026rdquo;?\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eHebrews 13:20-21\u003c/p\u003e\n\u003cp\u003eNow may the God of peace, who brought up from the dead our Lord Jesus—the great Shepherd of the sheep —through the blood of the everlasting covenant, equip you with everything good to do his will, working in us what is pleasing in his sight, through Jesus Christ, to whom be glory forever and ever. Amen.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eI\u0026rsquo;m free to follow Jesus.\u003c/p\u003e\n",
      "content_text": "\nIn John 6 there is a curious phrase about how the Father initiates the process\nof Salvation in the hearts of men.\n\n!!! note \"John 6:44\"\n\n    No one can come to me unless the Father who sent me draws him. And I will raise him up on the last day.\n\nThe word `draws` is the Greek `ἑλκύσῃ` ([helkyo]). This word doesn't mean \"draw\"\nlike how we would immediately understand it - in the sense of wooing, or\nconvincing... I'm not really sure why `draws` is the common English\ntranslation, I have a theory about theological presuppositions in the modern\nChristian movement but it's not super relevant to my thought on it. It's not\nrelevant, because this word in its most native sense nearly perfectly describes\nmy experience with Jesus. Before diving in - here's a couple more Biblical\nexamples of the word...\n\n!!! note \"John 21:6\"\n\n    And he said unto them, Cast the net on the right side of the ship, and ye shall find. They cast therefore, and now they were not able to draw [helkyo] it for the multitude of fishes.\n\n!!! note \"James 2:6\"\n\n    But ye have despised the poor. Do not rich men oppress you, and draw [helkyo] you before the judgment seats?\n\nSo the oppressed are `helkyo` to judgement... The fish are `helkyo`'d into the\nboat.\n\nThe simple definition is not \"to lure\" but \"to haul\" as in \"to haul a net full\nof fish up into the boat\". This is not an image of a gentle calling. And no\ndoubt, Jesus is sweet with all of us at various times, the Word of the Lord is\nthe source of rest and peace. But being drawn to God is not necessarily a\nromantic experience. For me, I was raised in the Church, went to youth group,\nand in hindsight did genuinely believe. The Lord knows his people from before\ntime began, but it doesn't mean that his people don't live human lives in pre\nand post salvific forms. What I mean is - we're all born sinners, and Jesus\nchanges the hearts of those whom the Father gives him. This is right out of John 6.\nBut what's there for me is the reality that sometimes Jesus stretches out his\nhand and says \"come, follow me\". And other times he casts the net and drags you\ninto the boat. For me, it was that.\n\nWhen I went to college I was angry at God over idols in my life. I felt\nabandoned by many, didn't like my home life, was generally aimless, and easily\npersuaded into things I wanted to be true out of the rebellion I wanted to\nenact against the Lord. And this post isn't going to be me reliving any of\nthose choices. At the end of the day, I was raised in the boat and wanted to\njump and swim on my own.\n\nI made every attempt I could to run from Jesus but ultimately that story ends\nwith him simply [helkyo]'ing my ass back into the boat.\n\n## Free Will\n\nOk so what about my side of it? I did try to swim away... what about the idea\nthat humans have \"free will\"?\n\nWell, I'm not really here to argue about that much either, but it's worth\naddressing that in my post-salvific life my desire is that my will becomes\nwhatever God's will is...\n\nTo be honest with you, the most freeing thing to me is knowing God cares about\nme. Whatever his will is, that's the will I want to align myself with.\n\nIt became clearer to me after becomming a dad. My kids aren't big enough to\nfully exercise their own free will and volition without getting hurt, and\nthat's pretty much where I/we are with God... Sure I feel like an adult, but I\ndo stupid things all the time, and I make choices I know are not the best. I\ncan only really imagine that God looks as me like how I look at my daughters\nwhenever they're disobeying to their own demise... My desire for them is that\nthey want what I want for them, and it's because I actually do know better than\nthey do, right? In the same way God knows better than me, and I want to be able to\nacknowledge that in the manner I want my daughters to acknowledge my desire for\ntheir greater good.\n\nSo, what is \"free will\"?\n\n!!! note \"Hebrews 13:20-21\"\n\n    Now may the God of peace, who brought up from the dead our Lord Jesus—the great Shepherd of the sheep —through the blood of the everlasting covenant, equip you with everything good to do his will, working in us what is pleasing in his sight, through Jesus Christ, to whom be glory forever and ever. Amen.\n\nI'm free to follow Jesus.\n",
      "summary": "In John 6 there is a curious phrase about how the Father initiates the process of Salvation in the hearts of men.",
      "date_published": "2025-10-27T06:37:17Z",
      "date_modified": "2025-10-27T06:37:17Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "salvation",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2025-10-27-notes/",
      "url": "https://pype.dev/2025-10-27-notes/",
      "title": "2025-10-27 Notes",
      "content_text": "\nyesterday: [[2025-10-26-notes]]\n\n## Organization\n\n- I'm trying to keep the daily notes slim, might take them off my feed\n- Leaning into [now](/now) as a living document\n",
      "summary": "yesterday: 2025-10-26-notes",
      "date_published": "2025-10-27T06:22:18Z",
      "date_modified": "2025-10-27T06:22:18Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/2025-10-26-notes/",
      "url": "https://pype.dev/2025-10-26-notes/",
      "title": "2025-10-26 Notes",
      "content_text": "\nyesterday: [[2025-10-24-notes]]\n\n## Hylkeos\n\n- started [[helkyo-what-is-it-for-god-to-draw-man-to-him]]\n",
      "summary": "yesterday: 2025-10-24-notes",
      "date_published": "2025-10-26T14:02:48Z",
      "date_modified": "2025-10-26T14:02:48Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/2025-10-24-notes/",
      "url": "https://pype.dev/2025-10-24-notes/",
      "title": "2025-10-24 Notes",
      "content_text": "\nyesterday: [[2025-10-21-notes]]\n\n## Tech\n\n- [JetKVM](https://www.ikoolcore.com/collections/jetkvm) are shipping to US again!\n\n## Reflection\n\n- [[reflection---mark-4-1-20]]\n",
      "summary": "yesterday: 2025-10-21-notes",
      "date_published": "2025-10-24T06:23:15Z",
      "date_modified": "2025-10-24T06:23:15Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/reflection-mark-4-1-20/",
      "url": "https://pype.dev/reflection-mark-4-1-20/",
      "title": "Reflection - Mark 4:1-20",
      "content_html": "\u003ch2 id=\"the-soils\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThe Soils\u003c/span\u003e \u003ca href=\"#the-soils\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI am in the middle of reprocessing the soils\u0026rsquo; parable - I heard a very\ninteresting interpretation the other day that I\u0026rsquo;m following up on. BUt while I\nwait for clarity in that conversation, there is still obvious truth for me to\nreflect on this morning\u0026hellip;\u003c/p\u003e\n\u003cdetails class=\"admonition note\" open\u003e\n\u003csummary class=\"admonition-title\"\u003eMark 4:1-20\u003c/summary\u003e\n\u003cp\u003eMark 4:1–20 (LEB):  4And again he began to teach beside the sea, and a very large crowd was gathered to him, so that he got into a boat and sat on the sea, and the whole crowd was at the sea on the land. 2 And he began to teach them many things in parables, and was saying to them in his teaching, 3 “Listen! Behold, the sower went out to sow. 4 And it happened that while he was sowing, some seed fell on the side of the path, and the birds came and devoured it. 5 And other seed fell on the rocky ground where it did not have much soil, and it sprang up at once, because it did not have any depth of soil. 6 And when the sun rose it was scorched, and because it did not have enough root, it withered. 7 And other seed fell among the thorn plants, and the thorn plants came up and choked it, and it did not produce grain. 8 And other seed fell on the good soil, and produced grain, coming up and increasing, and it bore a crop—one thirty and one sixty and one a hundred times as much. 9 And he said, “Whoever has ears to hear, let him hear!”   10 And when he was alone, those around him together with the twelve began asking him about the parables. 11 And he said to them, “To you has been granted the secret of the kingdom of God, but to those who are outside everything is in parables, 12 so that  ‘they may look closely and not perceive,  and they may listen carefully and not understand,  lest they turn and it be forgiven them.’ ”   13 And he said to them, “Do you not understand this parable? And how will you understand all the parables? 14 The sower sows the word. 15 And these are the ones beside the path where the word is sown, and whenever they hear it, immediately Satan comes and takes away the word that was sown in them. 16 And these are like the ones sown on the rocky ground, who whenever they hear the word immediately receive it with joy. 17 And they have no root in themselves, but are temporary. Then when affliction or persecution comes because of the word, immediately they fall away. 18 And others are the ones sown among the thorn plants—these are the ones who hear the word, 19 and the cares of the world and the deceitfulness of wealth and the desires for other things come in and choke the word and it becomes unproductive. 20 And those are the ones sown on the good soil, who hear the word and receive it and bear fruit—one thirty and one sixty and one a hundred times as much.”\u003c/p\u003e\n\u003c/details\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eMark 4:18-19\u003c/p\u003e\n\u003cp\u003e18 And others are the ones sown among the thorn plants—these are the ones who hear the word, 19 and the cares of the world and the deceitfulness of wealth and the desires for other things come in and choke the word and it becomes unproductive.\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"the-thorny-soil\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThe Thorny Soil\u003c/span\u003e \u003ca href=\"#the-thorny-soil\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eBy God\u0026rsquo;s good grace on my life, the Word has been sown and without a doubt my\nfaith has been proven beyond the depths of the path and shallow soils. My life\nhas not been without testing (not that I would ever claim to have not been\ngiven a better life than 99% of humans in the history of the world), but I fear\nthe test of my heart as it pertains to the thorny soil. God has been very good\nto me in work and finances. We aren\u0026rsquo;t ultra-wealthy, but I do have more than I\nneed. And something I notice\u0026hellip; as I\u0026rsquo;ve earned more, and invested more, I care\nmore\u0026hellip; My thoughts often wander around from \u0026ldquo;I should read that Proverb\u0026rdquo; to\n\u0026ldquo;If I can save X more dollars I could retire N weeks sooner\u0026rdquo;. I think what I\ndesire is freedom from the corporate cycle in America, but I fear what I desire\nis the comfort to give into my own whims without having to show up to a job\ntomorrow.\u003c/p\u003e\n\u003cp\u003eI do not think financial independence is a sin, or the desire of it. But I\nthink it does take a special constitution, a unique gifting from God, to\nsteward riches appropriately in a broken world while submitting oneself to the\nkingship of Jesus. I have known several wealthy Christians - they\u0026rsquo;re hard\nworkers and in general I think they\u0026rsquo;re honoring God with their work\u0026hellip; but do\nI? And in the working, whether honoring or not in the manner that I \u003cem\u003edo\u003c/em\u003e it, am I\nhonoring God in the manner in which I \u003cem\u003ethink\u003c/em\u003e about it? I don\u0026rsquo;t know\u0026hellip; I\nhonestly can only say with 100% certainty that I\u0026rsquo;m thankful God knows my heart\nbetter than I do, and I pray he helps my unbelief and quenches the underlying\nfears and anxieties about the riches of this life and what those riches enable.\u003c/p\u003e\n",
      "content_text": "\n## The Soils\n\nI am in the middle of reprocessing the soils' parable - I heard a very\ninteresting interpretation the other day that I'm following up on. BUt while I\nwait for clarity in that conversation, there is still obvious truth for me to\nreflect on this morning...\n\n???+ note \"Mark 4:1-20\"\n\n    Mark 4:1–20 (LEB):  4And again he began to teach beside the sea, and a very large crowd was gathered to him, so that he got into a boat and sat on the sea, and the whole crowd was at the sea on the land. 2 And he began to teach them many things in parables, and was saying to them in his teaching, 3 “Listen! Behold, the sower went out to sow. 4 And it happened that while he was sowing, some seed fell on the side of the path, and the birds came and devoured it. 5 And other seed fell on the rocky ground where it did not have much soil, and it sprang up at once, because it did not have any depth of soil. 6 And when the sun rose it was scorched, and because it did not have enough root, it withered. 7 And other seed fell among the thorn plants, and the thorn plants came up and choked it, and it did not produce grain. 8 And other seed fell on the good soil, and produced grain, coming up and increasing, and it bore a crop—one thirty and one sixty and one a hundred times as much. 9 And he said, “Whoever has ears to hear, let him hear!”   10 And when he was alone, those around him together with the twelve began asking him about the parables. 11 And he said to them, “To you has been granted the secret of the kingdom of God, but to those who are outside everything is in parables, 12 so that  ‘they may look closely and not perceive,  and they may listen carefully and not understand,  lest they turn and it be forgiven them.’ ”   13 And he said to them, “Do you not understand this parable? And how will you understand all the parables? 14 The sower sows the word. 15 And these are the ones beside the path where the word is sown, and whenever they hear it, immediately Satan comes and takes away the word that was sown in them. 16 And these are like the ones sown on the rocky ground, who whenever they hear the word immediately receive it with joy. 17 And they have no root in themselves, but are temporary. Then when affliction or persecution comes because of the word, immediately they fall away. 18 And others are the ones sown among the thorn plants—these are the ones who hear the word, 19 and the cares of the world and the deceitfulness of wealth and the desires for other things come in and choke the word and it becomes unproductive. 20 And those are the ones sown on the good soil, who hear the word and receive it and bear fruit—one thirty and one sixty and one a hundred times as much.”\n\n!!! note \"Mark 4:18-19\"\n\n    18 And others are the ones sown among the thorn plants—these are the ones who hear the word, 19 and the cares of the world and the deceitfulness of wealth and the desires for other things come in and choke the word and it becomes unproductive.\n\n## The Thorny Soil\n\nBy God's good grace on my life, the Word has been sown and without a doubt my\nfaith has been proven beyond the depths of the path and shallow soils. My life\nhas not been without testing (not that I would ever claim to have not been\ngiven a better life than 99% of humans in the history of the world), but I fear\nthe test of my heart as it pertains to the thorny soil. God has been very good\nto me in work and finances. We aren't ultra-wealthy, but I do have more than I\nneed. And something I notice... as I've earned more, and invested more, I care\nmore... My thoughts often wander around from \"I should read that Proverb\" to\n\"If I can save X more dollars I could retire N weeks sooner\". I think what I\ndesire is freedom from the corporate cycle in America, but I fear what I desire\nis the comfort to give into my own whims without having to show up to a job\ntomorrow.\n\nI do not think financial independence is a sin, or the desire of it. But I\nthink it does take a special constitution, a unique gifting from God, to\nsteward riches appropriately in a broken world while submitting oneself to the\nkingship of Jesus. I have known several wealthy Christians - they're hard\nworkers and in general I think they're honoring God with their work... but do\nI? And in the working, whether honoring or not in the manner that I _do_ it, am I\nhonoring God in the manner in which I _think_ about it? I don't know... I\nhonestly can only say with 100% certainty that I'm thankful God knows my heart\nbetter than I do, and I pray he helps my unbelief and quenches the underlying\nfears and anxieties about the riches of this life and what those riches enable.\n",
      "summary": "I am in the middle of reprocessing the soils' parable - I heard a very interesting interpretation the other day that I'm following up on. BUt while I wait...",
      "date_published": "2025-10-21T06:09:43Z",
      "date_modified": "2025-10-21T06:09:43Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "reflection",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2025-10-21-notes/",
      "url": "https://pype.dev/2025-10-21-notes/",
      "title": "2025-10-21 Notes",
      "content_text": "\nyesterday: [[2025-10-19-notes]]\n\n## Reflection\n\n- [[reflection---mark-4-1-20]]\n\n## Projects\n\n- thinking through [[soonish#Message Priority]]\n",
      "summary": "yesterday: 2025-10-19-notes",
      "date_published": "2025-10-21T05:56:51Z",
      "date_modified": "2025-10-21T05:56:51Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/2025-10-19-notes/",
      "url": "https://pype.dev/2025-10-19-notes/",
      "title": "2025-10-19 Notes",
      "content_text": "\nyesterday: [[2025-10-14-notes]]\n\n## Today\n\n- Refactored my gotify watcher script for church to use python, the gotify api has a `/message` endpoint that matters when you're using curl... I will switch to notifiq as soon as I'm live\n",
      "summary": "yesterday: 2025-10-14-notes",
      "date_published": "2025-10-19T06:58:28Z",
      "date_modified": "2025-10-19T06:58:28Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/reflection-john-21-12/",
      "url": "https://pype.dev/reflection-john-21-12/",
      "title": "Reflection - John 21:12",
      "content_html": "\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eJohn 21:12\u003c/p\u003e\n\u003cp\u003eJesus said to them, “Come, eat breakfast!” But none of the disciples dared to ask him, “Who are you?” because they knew that it was the Lord.\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"come-and-eat\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCome and eat\u003c/span\u003e \u003ca href=\"#come-and-eat\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eJesus offers this communion with himself every day, and to very believer\u0026hellip;\nSharing a meal with someone is a pretty intimate thing (it\u0026rsquo;s why hibachi with\nstrangers is awkward). Sitting around a table, especially where you\u0026rsquo;d be eating\nwith your hands, is a setting for family, or the family you choose (friends).\u003c/p\u003e\n\u003cp\u003eJesus is the King of the universe, and he offers a seat at the table. I want\nthis to sit in my head without some unknown ethereal deep metaphorical\nmeaning\u0026hellip; The simple truth is Jesus offers not only a place to sit next to\nhim, to enjoy his company and wisdom, but the contents of the table. At the\nLast Supper he says he is the bread and cup, and after his resurrection he\ninvites his disciples to sit with him on the beach and eat breakfast here in\nJohn 21. Every invitation to eat with him is to share the same meat, the wine,\nthe conversation with the Saints, and ultimately the prize of time with the\nLord.\u003c/p\u003e\n\u003cp\u003eJesus is the \u003ca href=\"/reflection-philippians-3-8/#gain\"\u003eprize\u003c/a\u003e, not what he can do.\u003c/p\u003e\n\u003cp\u003eI am hesitant to answer this call often\u0026hellip; and it\u0026rsquo;s because I\u0026rsquo;m often more\nsatisfied by drive-thru wings eaten alone in my office than I am around the\ntable with Jesus and his other disciples. But he still offers an invitation\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u0026ldquo;Come, eat\u0026rdquo;\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"choose-this-day-whom-you-will-serve\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eChoose this day whom you will serve\u003c/span\u003e \u003ca href=\"#choose-this-day-whom-you-will-serve\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eHis invitation strikes me as the choice following in Joshua 24:15:\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eNote\u003c/p\u003e\n\u003cp\u003eBut if it is bad in your eyes to serve Yahweh, choose for yourselves today whom you want to serve, whether it is the gods that your ancestors served beyond the river, or the gods of the Amorites in whose land you are living; but as for me and my household, we will serve Yahweh.”\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eJesus\u0026rsquo; offer to come and dine is him presenting a choice\u0026hellip; \u0026ldquo;choose for\nyourselves today whom you want to serve\u0026hellip;. but as for me and my household, we\nwill serve Yahweh.\u0026rdquo;\u003c/p\u003e\n\u003cp\u003eThe choice is daily, and every reflection of mine comes back to this. Jesus\noffers himself, his table, his righteousness, everything we need for godliness\nand flourishing as creatures made in his image. And yet every day, face to face\nwith the reality of the world the choice is still yours and mine to make -\ntoday, whom will you serve? Every day I have to say \u0026ldquo;as for me and my house, we\nwill serve the Lord\u0026rdquo;\u003c/p\u003e\n\u003cp\u003eMay that be true today, and tomorrow but tomorrow has enough trouble of its\nown, so today thank you Jesus for offering the table, to eat and drink\ntogether. And by the grace of his calling, today I will say \u0026ldquo;we will serve the\nLord.\u0026rdquo;\u003c/p\u003e\n",
      "content_text": "\n!!! note \"John 21:12\"\n\n    Jesus said to them, “Come, eat breakfast!” But none of the disciples dared to ask him, “Who are you?” because they knew that it was the Lord.\n\n## Come and eat\n\nJesus offers this communion with himself every day, and to very believer...\nSharing a meal with someone is a pretty intimate thing (it's why hibachi with\nstrangers is awkward). Sitting around a table, especially where you'd be eating\nwith your hands, is a setting for family, or the family you choose (friends).\n\nJesus is the King of the universe, and he offers a seat at the table. I want\nthis to sit in my head without some unknown ethereal deep metaphorical\nmeaning... The simple truth is Jesus offers not only a place to sit next to\nhim, to enjoy his company and wisdom, but the contents of the table. At the\nLast Supper he says he is the bread and cup, and after his resurrection he\ninvites his disciples to sit with him on the beach and eat breakfast here in\nJohn 21. Every invitation to eat with him is to share the same meat, the wine,\nthe conversation with the Saints, and ultimately the prize of time with the\nLord.\n\nJesus is the [prize](/reflection-philippians-3-8/#gain), not what he can do.\n\nI am hesitant to answer this call often... and it's because I'm often more\nsatisfied by drive-thru wings eaten alone in my office than I am around the\ntable with Jesus and his other disciples. But he still offers an invitation\n\n\u003e \"Come, eat\"\n\n## Choose this day whom you will serve\n\nHis invitation strikes me as the choice following in Joshua 24:15:\n\n!!! note \"\"\n\n    But if it is bad in your eyes to serve Yahweh, choose for yourselves today whom you want to serve, whether it is the gods that your ancestors served beyond the river, or the gods of the Amorites in whose land you are living; but as for me and my household, we will serve Yahweh.”\n\nJesus' offer to come and dine is him presenting a choice... \"choose for\nyourselves today whom you want to serve.... but as for me and my household, we\nwill serve Yahweh.\"\n\nThe choice is daily, and every reflection of mine comes back to this. Jesus\noffers himself, his table, his righteousness, everything we need for godliness\nand flourishing as creatures made in his image. And yet every day, face to face\nwith the reality of the world the choice is still yours and mine to make -\ntoday, whom will you serve? Every day I have to say \"as for me and my house, we\nwill serve the Lord\"\n\nMay that be true today, and tomorrow but tomorrow has enough trouble of its\nown, so today thank you Jesus for offering the table, to eat and drink\ntogether. And by the grace of his calling, today I will say \"we will serve the\nLord.\"\n",
      "summary": "!!! note \"John 21:12\"",
      "date_published": "2025-10-17T05:22:12Z",
      "date_modified": "2025-10-17T05:22:12Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "reflection",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/reflection-philippians-3-8/",
      "url": "https://pype.dev/reflection-philippians-3-8/",
      "title": "Reflection - Philippians 3:8",
      "content_html": "\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003ePhilippians 3:8\u003c/p\u003e\n\u003cp\u003eMore than that, I even consider all things to be loss because of the surpassing greatness of the knowledge of Christ Jesus my Lord, for the sake of whom I have suffered the loss of all things, and consider them dung, in order that I may gain Christ\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"loss\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLoss\u003c/span\u003e \u003ca href=\"#loss\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003ePaul\u0026rsquo;s words are convicting this morning\u0026hellip; \u003cstrong\u003eI even consider all things to be loss\u003c/strong\u003e.\u003c/p\u003e\n\u003cdiv class=\"admonition danger\"\u003e\n\u003cp class=\"admonition-title\"\u003eDanger\u003c/p\u003e\n\u003cp\u003eDo I?\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eDo I consider anything and everything as closer to \u003cstrong\u003eliterally nothing\u003c/strong\u003e when\ncompared to knowing Jesus? I don\u0026rsquo;t know, this morning I can\u0026rsquo;t even articulate\nwhat it means to consider allthings \u0026ldquo;loss\u0026rdquo;.\u003c/p\u003e\n\u003cfigure\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20251014103915_3412470b.png\" alt=\"20251014103915_3412470b.png\"\u003e\n\u003c/figure\u003e\n\u003cp\u003eWhat a trivial picture but how often is my mind and spirit stuck between the\ngreen boxes\u0026hellip; fixated again on my retirement, kid\u0026rsquo;s school costs, the fact\nthat ribeye steak is still $20/lbs. I have anxities like anyone else over\nthings in the world, and if my net worth increased by $3M today what would my\nresponse be\u0026hellip; would I consider it a loss when compared to the knowledge of\nJesus Christ? Or would I experience joy and hope for my earthly future\u0026hellip;\u003c/p\u003e\n\u003cp\u003eOf course Paul\u0026rsquo;s note here isn\u0026rsquo;t that we have to just be angry about good\nthings and be sad forever until we\u0026rsquo;re on the other side of a consecrated\nheaven, but I think the point is if my net worth goes up by a lot of down by a\nlot, at the end of the day that\u0026rsquo;s still between the 2 green boxes in my\ndiagram\u0026hellip; And my mind needs to focus on Jesus. Not for what he can do for me,\npursuing him in light of my own fancies makes him out to be a Santa Claus, and\nin light of Paul\u0026rsquo;s words to the Philippian church would miss the point\nentirely. There is nothing for us to pursue for gain - that is the point.\u003c/p\u003e\n\u003cp\u003eThe ultimate gift is the knowledge of Christ. This knowledge changs us - by the\nmolding hand of Yahweh through the mediating power and authority of Jesus by\nthe Spirit indwelling our lives - the knowledge of Christ conforms us into his\nimage and likeness. But Jesus is the prize, he is the gain. Knowledge of him\nisn\u0026rsquo;t just knowing his name, it\u0026rsquo;s being known by him through communion and\nmeditation. Through daily repentence.\u003c/p\u003e\n\u003ch2 id=\"gain\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGain\u003c/span\u003e \u003ca href=\"#gain\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI just found myself downcast over this reflection, knowledge of Christ is\nhard\u0026hellip; he chooses whome he chooses, frees whom he frees. In that freedom is\nwhere the comparison can be made. Only in the freedom of Jesus can you remove\nyourself from the line between the 2 green boxes in my picture, and even\nconsider the glory of the knowledge of Christ. Before new life all we know is\nthis:\u003c/p\u003e\n\u003cfigure\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20251014105124_bee8ebbd.png\" alt=\"20251014105124_bee8ebbd.png\"\u003e\n\u003c/figure\u003e\n\u003cp\u003eHe chooses\u0026hellip; but then what? For some, loss must follow. In fact, for \u003cstrong\u003eall\u003c/strong\u003e loss\nwill eventually follow. The degree of that loss is not outside his sovereignty.\nPaul says he \u0026ldquo;suffered the loss of all things\u0026rdquo; - in this experience his\nmind is opened to the reality that was hidden from him, the knowledge that\nthere\u0026rsquo;s more but the only thing worth gaining is Jesus.\u003c/p\u003e\n\u003cp\u003eI hope I don\u0026rsquo;t have to suffer the loss of all things in order to more fully\ngrasp the gravity of my King. But his will be done on earth as it is in heaven,\nwhatever that may mean for my life. And may it be that I gain Christ.\u003c/p\u003e\n",
      "content_text": "\n!!! note \"Philippians 3:8\"\n\n    More than that, I even consider all things to be loss because of the surpassing greatness of the knowledge of Christ Jesus my Lord, for the sake of whom I have suffered the loss of all things, and consider them dung, in order that I may gain Christ\n\n## Loss\n\nPaul's words are convicting this morning... **I even consider all things to be loss**.\n\n!!! danger \"\"\n\n    Do I?\n\nDo I consider anything and everything as closer to **literally nothing** when\ncompared to knowing Jesus? I don't know, this morning I can't even articulate\nwhat it means to consider allthings \"loss\".\n\n![20251014103915_3412470b.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20251014103915_3412470b.png)\n\nWhat a trivial picture but how often is my mind and spirit stuck between the\ngreen boxes... fixated again on my retirement, kid's school costs, the fact\nthat ribeye steak is still $20/lbs. I have anxities like anyone else over\nthings in the world, and if my net worth increased by $3M today what would my\nresponse be... would I consider it a loss when compared to the knowledge of\nJesus Christ? Or would I experience joy and hope for my earthly future...\n\nOf course Paul's note here isn't that we have to just be angry about good\nthings and be sad forever until we're on the other side of a consecrated\nheaven, but I think the point is if my net worth goes up by a lot of down by a\nlot, at the end of the day that's still between the 2 green boxes in my\ndiagram... And my mind needs to focus on Jesus. Not for what he can do for me,\npursuing him in light of my own fancies makes him out to be a Santa Claus, and\nin light of Paul's words to the Philippian church would miss the point\nentirely. There is nothing for us to pursue for gain - that is the point.\n\nThe ultimate gift is the knowledge of Christ. This knowledge changs us - by the\nmolding hand of Yahweh through the mediating power and authority of Jesus by\nthe Spirit indwelling our lives - the knowledge of Christ conforms us into his\nimage and likeness. But Jesus is the prize, he is the gain. Knowledge of him\nisn't just knowing his name, it's being known by him through communion and\nmeditation. Through daily repentence.\n\n## Gain\n\nI just found myself downcast over this reflection, knowledge of Christ is\nhard... he chooses whome he chooses, frees whom he frees. In that freedom is\nwhere the comparison can be made. Only in the freedom of Jesus can you remove\nyourself from the line between the 2 green boxes in my picture, and even\nconsider the glory of the knowledge of Christ. Before new life all we know is\nthis:\n\n![20251014105124_bee8ebbd.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20251014105124_bee8ebbd.png)\n\nHe chooses... but then what? For some, loss must follow. In fact, for **all** loss\nwill eventually follow. The degree of that loss is not outside his sovereignty.\nPaul says he \"suffered the loss of all things\" - in this experience his\nmind is opened to the reality that was hidden from him, the knowledge that\nthere's more but the only thing worth gaining is Jesus.\n\nI hope I don't have to suffer the loss of all things in order to more fully\ngrasp the gravity of my King. But his will be done on earth as it is in heaven,\nwhatever that may mean for my life. And may it be that I gain Christ.\n",
      "summary": "!!! note \"Philippians 3:8\"",
      "date_published": "2025-10-14T05:30:47Z",
      "date_modified": "2025-10-14T05:30:47Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "reflection",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2025-10-14-notes/",
      "url": "https://pype.dev/2025-10-14-notes/",
      "title": "2025-10-14 Notes",
      "content_text": "\nyesterday: [[2025-10-13-notes]]\n\n## Reflection\n\n- [[reflection-philippians-3-8]]\n",
      "summary": "yesterday: 2025-10-13-notes",
      "date_published": "2025-10-14T05:26:37Z",
      "date_modified": "2025-10-14T05:26:37Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/affine/",
      "url": "https://pype.dev/affine/",
      "title": "Affine",
      "content_html": "\u003cp\u003eMind-mapping webapp at home with native desktop App. Like Notion but with diagram support\u003c/p\u003e\n\u003ch2 id=\"work\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWork\u003c/span\u003e \u003ca href=\"#work\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe mind-mapping capabilities with Affine seem pretty great. There\u0026rsquo;s a few\nquirks I\u0026rsquo;m trying to become aware of, like the edgeless and page modes show you\nthe same info, but there isn\u0026rsquo;t one view that makes \u003cem\u003eall\u003c/em\u003e the settings clear\u0026hellip;\nso for example just adding another block on a page doesn\u0026rsquo;t make a new little\nsection in edgeless view - it just adds text to the existing blob. But in the\nedgeless view I can click \u003ccode\u003e+\u003c/code\u003e off the side of a box and get a new distinct\nbubble that I can type in and such, but then back in teh pages view it just\nlooks like I added a block. so the block view on the page doesn\u0026rsquo;t represent the\nother possible relationships whichi s fine, just need to be aware of it\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eI have another JFlo vid now\u0026hellip; falling behind\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\nMind-mapping webapp at home with native desktop App. Like Notion but with diagram support\n\n## Work\n\nThe mind-mapping capabilities with Affine seem pretty great. There's a few\nquirks I'm trying to become aware of, like the edgeless and page modes show you\nthe same info, but there isn't one view that makes _all_ the settings clear...\nso for example just adding another block on a page doesn't make a new little\nsection in edgeless view - it just adds text to the existing blob. But in the\nedgeless view I can click `+` off the side of a box and get a new distinct\nbubble that I can type in and such, but then back in teh pages view it just\nlooks like I added a block. so the block view on the page doesn't represent the\nother possible relationships whichi s fine, just need to be aware of it\n\n- I have another JFlo vid now... falling behind\n",
      "summary": "Mind-mapping webapp at home with native desktop App. Like Notion but with diagram support",
      "date_published": "2025-10-13T05:16:22Z",
      "date_modified": "2025-10-13T05:16:22Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "glossary"
      ]
    },
    {
      "id": "https://pype.dev/2025-10-13-notes/",
      "url": "https://pype.dev/2025-10-13-notes/",
      "title": "2025-10-13 Notes",
      "content_text": "\nyesterday: [[2025-10-12-notes]]\n\n## Now\n\n- updated [[now]]\n- published [[use-jellyfin-tags-for-content-moderation]]\n",
      "summary": "yesterday: 2025-10-12-notes",
      "date_published": "2025-10-13T05:14:36Z",
      "date_modified": "2025-10-13T05:14:36Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/testing-safari-formatting/",
      "url": "https://pype.dev/testing-safari-formatting/",
      "title": "Testing Safari Formatting",
      "content_html": "\u003cp\u003e\u003cstrong\u003ebolded with asterisks\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003edunder\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cem\u003esingle asterisk\u003c/em\u003e\u003c/p\u003e\n",
      "content_text": "\n**bolded with asterisks**\n\n**dunder**\n\n_single asterisk_\n",
      "summary": "**",
      "date_published": "2025-10-12T13:51:15Z",
      "date_modified": "2025-10-12T13:51:15Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "test",
        "note"
      ]
    },
    {
      "id": "https://pype.dev/reflection-psalm-119-15/",
      "url": "https://pype.dev/reflection-psalm-119-15/",
      "title": "Reflection - Psalm 119:15",
      "content_html": "\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003ePsalm 119:15\u003c/p\u003e\n\u003cp\u003eI will meditate on your precepts  and look at your ways.\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"meditate\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMeditate\u003c/span\u003e \u003ca href=\"#meditate\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eSpurgeon had a good thought here\u0026hellip; It is not the act of eating that actually\nnourishes our bodies, it is digestion\u0026hellip; The same is true for our spiritual\ngrowth - merely listening to a sermon will not transform your heart and life,\nthe Word of God must be digested and meditated upon to work in our members and\nchange us.\u003c/p\u003e\n\u003cp\u003eWhat is it to go to church every week but never spend time musing upon the\nthings of God? If you chew your food and spit it out right after the meal what\ngood did it do you? Maybe you felt good during the songs, liked the taste of\nthe food, heard something interesting from the pastor, commented on the decor\nin the dining room\u0026hellip;. but once you leave, do you remember what you ate? Do you\ntalk about it with those who ate with you? Did you practice cooking that\ndelicious meal later in the week?\u003c/p\u003e\n\u003cp\u003eSo it is with us and the precepts of the Lord.\u003c/p\u003e\n\u003cp\u003eThe law of God, in light of Jesus, is not a burden any longer. We are free to\nfollow, free to choose good. But knowing good takes time\u0026hellip; a captive isn\u0026rsquo;t\nilluminated to all the ways of the free man who saved him the day his bonds are\ncut, he must study the new civilization he\u0026rsquo;s brought into - out of slavery and\ninto freedom, out of death and into life.\u003c/p\u003e\n\u003cp\u003eAnd in that new life, Jesus - the embodiment of the law and the perfector of\nour faith changes us, molds us, teaches us about good and bad. His word is\nsweet and good.\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003ePhilippians 4:8\u003c/p\u003e\n\u003cp\u003eFinally, brothers, whatever things are true, whatever things are honorable, whatever things are right, whatever things are pure, whatever things are pleasing, whatever things are commendable, if there is any excellence of character and if anything praiseworthy, think about these things.\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"think-about-these-things\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThink about these things\u003c/span\u003e \u003ca href=\"#think-about-these-things\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe instruction from Paul is almost too simple\u0026hellip; \u0026ldquo;just think about these\nthings\u0026rdquo;. By God\u0026rsquo;s grace I think a lot\u0026hellip; \u003cstrong\u003ea lot\u003c/strong\u003e. My thoughts are often hard\nto take hold of, and I\u0026rsquo;m led rather than leading in what I put my attention\nto, but also by God\u0026rsquo;s grace I fixate on the things of God often. This has not\nalways been, and is not always fun or exciting or without pain.\u003c/p\u003e\n\u003cp\u003eBut we are all gifted by God in different ways, and afflicted in different ways.\nAn affliction he\u0026rsquo;s permitted in my life is often a blessing to me as my mind\nsometimes can\u0026rsquo;t let go of things that are pure and pleasing and commendable.\nThe overall thing that\u0026rsquo;s on my mind every day is the freedom Jesus offers to\nchoose good. The choice can only be made by the power of his resurrection, not\nby any moral teaching to be gleaned from his sermons as though he\u0026rsquo;s nothing\nmore than a philosopher.\u003c/p\u003e\n\u003cdiv class=\"admonition success\"\u003e\n\u003cp class=\"admonition-title\"\u003eSuccess\u003c/p\u003e\n\u003cp\u003eHe raised me to life, I didn\u0026rsquo;t attend a lecture.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eBut what could be sweeter today in our finite lives, than the ability and\nfreedom to participate in bringing heaven to earth?\u003c/p\u003e\n\u003cp\u003eWe have no means to do this though without meditating on the Lord\u0026rsquo;s precepts\u0026hellip;\nHow else can we know what is pleasing to heaven?\u003c/p\u003e\n",
      "content_text": "\n!!! note \"Psalm 119:15\"\n\n    I will meditate on your precepts  and look at your ways.\n\n## Meditate\n\nSpurgeon had a good thought here... It is not the act of eating that actually\nnourishes our bodies, it is digestion... The same is true for our spiritual\ngrowth - merely listening to a sermon will not transform your heart and life,\nthe Word of God must be digested and meditated upon to work in our members and\nchange us.\n\nWhat is it to go to church every week but never spend time musing upon the\nthings of God? If you chew your food and spit it out right after the meal what\ngood did it do you? Maybe you felt good during the songs, liked the taste of\nthe food, heard something interesting from the pastor, commented on the decor\nin the dining room.... but once you leave, do you remember what you ate? Do you\ntalk about it with those who ate with you? Did you practice cooking that\ndelicious meal later in the week?\n\nSo it is with us and the precepts of the Lord.\n\nThe law of God, in light of Jesus, is not a burden any longer. We are free to\nfollow, free to choose good. But knowing good takes time... a captive isn't\nilluminated to all the ways of the free man who saved him the day his bonds are\ncut, he must study the new civilization he's brought into - out of slavery and\ninto freedom, out of death and into life.\n\nAnd in that new life, Jesus - the embodiment of the law and the perfector of\nour faith changes us, molds us, teaches us about good and bad. His word is\nsweet and good.\n\n!!! note \"Philippians 4:8\"\n\n    Finally, brothers, whatever things are true, whatever things are honorable, whatever things are right, whatever things are pure, whatever things are pleasing, whatever things are commendable, if there is any excellence of character and if anything praiseworthy, think about these things.\n\n## Think about these things\n\nThe instruction from Paul is almost too simple... \"just think about these\nthings\". By God's grace I think a lot... **a lot**. My thoughts are often hard\nto take hold of, and I'm led rather than leading in what I put my attention\nto, but also by God's grace I fixate on the things of God often. This has not\nalways been, and is not always fun or exciting or without pain.\n\nBut we are all gifted by God in different ways, and afflicted in different ways.\nAn affliction he's permitted in my life is often a blessing to me as my mind\nsometimes can't let go of things that are pure and pleasing and commendable.\nThe overall thing that's on my mind every day is the freedom Jesus offers to\nchoose good. The choice can only be made by the power of his resurrection, not\nby any moral teaching to be gleaned from his sermons as though he's nothing\nmore than a philosopher.\n\n!!! success \"\"\n\n    He raised me to life, I didn't attend a lecture.\n\nBut what could be sweeter today in our finite lives, than the ability and\nfreedom to participate in bringing heaven to earth?\n\nWe have no means to do this though without meditating on the Lord's precepts...\nHow else can we know what is pleasing to heaven?\n",
      "summary": "!!! note \"Psalm 119:15\"",
      "date_published": "2025-10-12T05:59:30Z",
      "date_modified": "2025-10-12T05:59:30Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "reflection",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2025-10-12-notes/",
      "url": "https://pype.dev/2025-10-12-notes/",
      "title": "2025-10-12 Notes",
      "content_text": "\nyesterday: [[2025-10-10-notes]]\n\n## Reflection\n\n- [[reflection---psalm-119-15]]\n\n## Other\n\n- Site rendering poorly on safari\n  - [[testing-safari-formatting]]\n",
      "summary": "yesterday: 2025-10-10-notes",
      "date_published": "2025-10-12T05:58:32Z",
      "date_modified": "2025-10-12T05:58:32Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/original-sin/",
      "url": "https://pype.dev/original-sin/",
      "title": "Original Sin",
      "content_html": "\u003cp\u003eThe doctrine (\u003cstrong\u003ebut question still for me\u003c/strong\u003e) basically answers this question:\u003c/p\u003e\n\u003cp\u003eDo we sin because we\u0026rsquo;re sinners or are we sinners because we sin?\u003c/p\u003e\n\u003cp\u003eWith the answer:\u003c/p\u003e\n\u003cp\u003eYou inherit Adam\u0026rsquo;s sinfulness, you are born condemned\u003c/p\u003e\n",
      "content_text": "\nThe doctrine (**but question still for me**) basically answers this question:\n\nDo we sin because we're sinners or are we sinners because we sin?\n\nWith the answer:\n\nYou inherit Adam's sinfulness, you are born condemned\n",
      "summary": "The doctrine (**) basically answers this question:",
      "date_published": "2025-10-10T06:05:37Z",
      "date_modified": "2025-10-10T06:05:37Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "glossary"
      ]
    },
    {
      "id": "https://pype.dev/reflection-jude-24/",
      "url": "https://pype.dev/reflection-jude-24/",
      "title": "Reflection - Jude 24",
      "content_text": "\n!!! note \"Jude 24-25\"\n\n    24 Now to the one who is able to protect you from stumbling and make you to stand before his glory blameless with exultation, 25 to the only God our Savior, through Jesus Christ our Lord, be glory, majesty, power, and authority before all time and now and for all eternity. Amen.\n\n## make you to stand before his glory blameless with exultation\n\nThe ultimate hope of the one called to Jesus - to be made blameless.\n\nThose who are blameless are those who are free. When we are in debt we are\nlimited - this feels like a pretty natural thing. I owe money on my house, so\nthere's about $1000/mo that I have to put towards that, no options. Worse than\na necessity (cause a place to live is a foundational need for humans) is\nunnecessary debt - debt for free choices.\n\n!!! danger \"pay as you go\"\n\n    Have you seen these pay-as-you-go services? Affirm and Klarna, etc.... You can finance (go into debt) your door dash orders, uber rides, amazon cart all usually with just a few clicks! They want you poor. Jesus doesn't exactly want you rich with earthly wealth, but we make ourselves spiritually poor in the same manner and it's that poverty that he saves us from.\n\nSo on one hand I'm \"born a sinner\" (take this as my mortgage) and on the other\nhand I make choices that dishonor my Lord - my heart gets worrisome or filled\nwith lust, I abandon my faith for anxiety over my future... In this reflection\nI'm not debating [[original-sin]], for me today it's moot... I do sin, I will\nsin, and Jesus has saved me yesterday, today, and tomorrow. So the hope is a\nblessed gift from Jesus - that I will be **made to stand before him blameless\nwith exultation**.\n\nTo stand before the face of God is perhaps the most terrifying thing\nimaginable, or it should be for anyone in a wretched state. Ultimate goodness\nhas a way of making anyone **less** very uncomfortable. We even have a taste of\nthis truth on earth - consider this example. If you were at the gym or\nsomewhere having a conversation with someone who was a pastor and you let a\ncurse word fly, often people's follow-up is to apologize to the pastor... why?\nMy personal conviction is that cuss-words are just words, and most pastors\naren't offended by them. But we all generally recognize pastors as \"good men\"\n(not all, mind you - don't come at me with horror stories of abuse in the Church,\nI know it's there, I hate it too, and those demons aren't who I'm talking\nabout). So when we are face to face with \"goodness\" we recognize that some\nbehavior isn't appropriate, if only for a second. So we apologize... But a\npastor is just a man - to come face to face with the Lord Almighty, the very\ndefiner of Good, should horrify anyone not perfectly good themselves. A\nscary thing to have anything bad in me present before the Judge of the\nuniverse.\n\nAnd yet **to the one who is able to protect you from stumbling and make you to\nstand before his glory blameless with exultation**... Who is Jesus? The one who\nmakes me blameless. To be blameless is to be able to come face to face with\ngoodness. This is my hope, that in Christ alone for his glory and sake alone,\nam I made new and blameless.\n\n## But hope isn't only in the future\n\nThis ultimate hope isn't the only hope though, it's not the only thing Jesus\ndoes... He saves us from more than just hell, and for more than just an\nethereal idea of goodness. He saves me to be free to choose goodness today as\nhe works in me to align my will with his\n\n!!! note \"Hebrews 13:20-21\"\n\n    20 Now may the God of peace, who brought up from the dead our Lord Jesus, the great shepherd of the sheep, by the blood of the eternal covenant, 21 equip you with every good thing to do his will, carrying out in us what is pleasing before him through Jesus Christ, to whom be the glory forever. Amen.\n\nJesus left us a helper, the Holy Spirit. This person is the conduit through\nwhich Yahweh works in us to **equip {me} with every good thing to do his will,\ncarrying out in {me} what is pleasing before him**\n\nHope is for tomorrow, but it's also for today. Jesus makes us free **today** as\nnew creatures (2 Corinthians 5:17) to align with his will. You can't choose him\nuntil he frees you to make the choice, and then in that freedom what else can\nyou do? Say \"no thanks\"... lol. His call is the mighty arm of Yahweh reaching\ninto the ocean of chaos and death to raise the corpse of your soul to new life,\nto breath air for the first time, to walk on God's green earth with new feet\nand new purpose.\n\nPraise the freaking Lord for salvation - for tomorrow and today. May my choices\ntoday reflect the goodness of my King, and if you're reading this reflection,\nmay God bless you with this blessed hope of salvation.\n",
      "summary": "!!! note \"Jude 24-25\"",
      "date_published": "2025-10-10T05:52:12Z",
      "date_modified": "2025-10-10T05:52:12Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "reflection",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2025-10-10-notes/",
      "url": "https://pype.dev/2025-10-10-notes/",
      "title": "2025-10-10 Notes",
      "content_text": "\nyesterday: [[2025-10-09-notes]]\n\n## Reflecion\n\n- [[reflection-jude-24]]\n",
      "summary": "yesterday: 2025-10-09-notes",
      "date_published": "2025-10-10T05:39:36Z",
      "date_modified": "2025-10-10T05:39:36Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/2025-10-09-notes/",
      "url": "https://pype.dev/2025-10-09-notes/",
      "title": "2025-10-09 Notes",
      "content_text": "\nyesterday: [[2025-10-08-notes]]\n\n## Project\n\n- Played with 2 different patterns for accessing encrypted data from a fastapi app...\n  - started [[should-data-models-be-fat]]\n",
      "summary": "yesterday: 2025-10-08-notes",
      "date_published": "2025-10-09T21:05:08Z",
      "date_modified": "2025-10-09T21:05:08Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/2025-10-08-notes/",
      "url": "https://pype.dev/2025-10-08-notes/",
      "title": "2025-10-08 Notes",
      "content_text": "\nyesterday: [[2025-10-07-notes]]\n\n## TIL\n\n- [[use-jellyfin-tags-for-content-moderation]]\n\n## Pilgrim's Creek\n\n- Recorded ep 6 of Pilgrim's Creek with Cameron\n- We discussed Leviathin and how Yahweh's **word** orders a world the other gods have to fight to maintain\n\n## Life\n\n- BoA and Allegiant account mixups\n  - no confirmation number but internal processes should resolve everything\n  - check back on October 15th for my points in the Allways console\n",
      "summary": "yesterday: 2025-10-07-notes",
      "date_published": "2025-10-08T10:25:20Z",
      "date_modified": "2025-10-08T10:25:20Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/use-jellyfin-tags-for-content-moderation/",
      "url": "https://pype.dev/use-jellyfin-tags-for-content-moderation/",
      "title": "Use Jellyfin Tags For Content Moderation",
      "content_html": "\u003cp\u003eJellyfin brings in ratings and allows you to set custom ratings for shows,\nwhich is nice for things like \u0026ldquo;block anything worse than TV-14 for my kid\u0026rsquo;s\naccount\u0026rdquo;. But what if my firend\u0026rsquo;s kids can watch shows I don\u0026rsquo;t want my kids\nwatching? Turns out tags exist and are great!\u003c/p\u003e\n\u003ch2 id=\"tag-the-content\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTag the content\u003c/span\u003e \u003ca href=\"#tag-the-content\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eFirst is to actually tag the content - in the UI it\u0026rsquo;s simple.\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eLogin with admin\u003c/li\u003e\n\u003cli\u003eManage Metadata\u003c/li\u003e\n\u003cli\u003eClick the content you want to tag and find the \u003ccode\u003eTags\u003c/code\u003e section\u003c/li\u003e\n\u003cli\u003eAdd your tag\u0026hellip; for example \u003ccode\u003eblocked:girls\u003c/code\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"filter-on-the-account\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFilter on the account\u003c/span\u003e \u003ca href=\"#filter-on-the-account\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003eGo to \u003ccode\u003eDashboard\u003c/code\u003e -\u0026gt; \u003ccode\u003eUsers\u003c/code\u003e -\u0026gt; \u003ccode\u003eLibrary Access\u003c/code\u003e -\u0026gt; \u003ccode\u003eParental Control\u003c/code\u003e -\u0026gt; \u003ccode\u003eBlock items with tags\u003c/code\u003e\u003c/li\u003e\n\u003c/ol\u003e\n",
      "content_text": "\nJellyfin brings in ratings and allows you to set custom ratings for shows,\nwhich is nice for things like \"block anything worse than TV-14 for my kid's\naccount\". But what if my firend's kids can watch shows I don't want my kids\nwatching? Turns out tags exist and are great!\n\n## Tag the content\n\nFirst is to actually tag the content - in the UI it's simple.\n\n1. Login with admin\n2. Manage Metadata\n3. Click the content you want to tag and find the `Tags` section\n4. Add your tag... for example `blocked:girls`\n\n## Filter on the account\n\n1. Go to `Dashboard` -\u003e `Users` -\u003e `Library Access` -\u003e `Parental Control` -\u003e `Block items with tags`\n",
      "summary": "Jellyfin brings in ratings and allows you to set custom ratings for shows, which is nice for things like \"block anything worse than TV-14 for my kid's...",
      "date_published": "2025-10-08T10:21:01Z",
      "date_modified": "2025-10-08T10:21:01Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "jellyfin",
        "til",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/reflection-numbers-11-11/",
      "url": "https://pype.dev/reflection-numbers-11-11/",
      "title": "Reflection - Numbers 11:11",
      "content_text": "\nAs if the Lord orchestrated Spurgeon's meditation to give me a spring board to what I need for the third day in a row...\n\n- [[reflection-1-kings-19-8]] He showed me that he sustains me unto his own service and glory\n- [[reflection-john-4-14]] He showed me that I've been pushing away aspects of his provision\n\nAnd today I see the trials in my life reveal the status of my faith... Last\nnight I got a phone call that I missed a credit card payment, which I thought\nodd since everything is on auto-pay. Well, turns out our checking account got a\nsmidge low, low enough that the credit card payment was cancelled... In reality\nthis isn't a huge deal, but it threw me off and continues to this morning. The\ntruth is, the only issue is my lack of in-depth understanding of our money\nmovement. Our lifestyle and living expenses are well below what we can\notherwise afford, but in my laziness I have mostly neglected each of our\naccounts individually. No doubt this \"trial\" is self-imposed but Spurgeon's\nmeditation is snapping me out of the funk that threw me into last night\n\n!!! success \"fearless faith\"\n\n    If our faith be worth anything, it will stand the test. Gilt is afraid of fire, but gold is not: the paste gem dreads to be touched by the diamond, but the true jewel fears no test\n\nThe text is [Numbers 11:11](https://biblehub.com/numbers/11-11.htm)\n\n!!! note \"Numbers 11:11\"\n\n    And Moses said to Yahweh, “Why have you brought trouble to your servant? Why have I not found favor in your eyes, that the burdens of all these people have been placed on me?\n\nThe meditation came from \"Why have you brought trouble to your servant?\"\n\n??? warning \"Meditation vs Homily\"\n\n    My reflections over the summer have following the pattern of finding a scripture reference from Morning and Evening and then simply asking God to speak through the words of the text and Spurgeon's meditation. Historically I would study the text, but in the season of life I am in, where I do have years of studious foundation, I am trying to exercise trust in God to speak to me in ways outside of connecting theological knowledge dots that construct a mosaic of my own choosing. Instead I'm trying to just trust his sovereignty - he brought me to Morning and Evening on October 7, 2025 perhaps so that I could be encouraged in my faith in light of this missed credit card payment event/trial. These reflections are not meant to be educational on the Bible, or even on theology necessarily - I am practicing opening my mind and heart to God speaking to me in ways otherwise uncomfortable but with prudence as I'm not approaching these texts in ignorance. As I put these reflections into the world I want to be clear these are personal meditations, not Bible lessons\n\n## Reflection\n\nOur heavenly Father sends us frequent troubles to try our faith... Are the\nsource of those trials my own choices? Other's choices? Some meta-truth about the\nfallenness of creation? I think probably it's all of that... In reality, it doesn't\nmatter **where** the trial comes from - directly from the heavens above or\noriginating in our own mistakes (such as mine of note above). There is almost\ncertainly some significance in the source but **ultimately God\nis sovereign over every one of those possibilities**, and so in another sense,\nit's almost insignificant what I consider the \"source\" of a trial. The real\nissue is how I respond to it.\n\nLast night I was filled in my physical chest with a feeling of dread... Seeing\nmy checking account low revealed that I have more digging to do to uncover any\ninternal reliance on my own systems of security (like money). And the dumb part\ndear reader, is we have other accounts and plenty of money... I am in zero\nfinancial strain, but even so - seeing the number too low to make one of the\npayments sent my head into a whirlwind. God has also already provided a way out\nof this trial... I have budgeting software that I've been using for a long time\nand am just not on top of. He gave me the software I use and the ability to use\nit but it's my own lack of diligence that I think led to this \"trial\". And yet,\nwith all that knowledge I find that I'm still troubled... I think I have a\nstrong faith and one of my most common prayer is \"Lord help my unbelief\", and\napparently today I need to shout this to the heavens. How **dare** I allow\ndread to overcome me when I claim to know my God provides.\n\nAnd in that I know he is still sweet to me. I'm a father, and when my kids make\na mess of themselves my first response (often, though I'm not perfect) to them\nis to kneel and say \"hey I'm here, you're safe\". The trial they make for\nthemselves may fill them with the dread I filled myself with last night in\nmissing that credit card payment.... If I will approach my kids joyfully in\ntheir own mess, and if I write all these pages about God's love for me and his\npeople, then ought I not adopt the mindset towrads God that I want my\ndaughter's to have when I come to save them?\n\nGod approaches me knowing that missing a credit card payment\nis hardly a bigger deal than my 4 year old spilling milk on the table. But my\nworld can become small just like their worlds are small and then my issues can\nfeel big. I need my heavenly father to kneel next to me and say \"hey I'm here,\nyou're safe\". I say I need it, but actually I mean to say that I have it, and\nbecause I have it is the only reason I can in-turn treat my daughter's this way\nwhen their problems fill their little worlds.\n\nPraise God for trials certainly, for what they reveal and for the Gospel truth\nthat by the calling of Jesus our faith can be made pure and complete.\n",
      "summary": "As if the Lord orchestrated Spurgeon's meditation to give me a spring board to what I need for the third day in a row...",
      "date_published": "2025-10-07T05:07:19Z",
      "date_modified": "2025-10-07T05:07:19Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "reflection",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2025-10-07-notes/",
      "url": "https://pype.dev/2025-10-07-notes/",
      "title": "2025-10-07 Notes",
      "content_text": "\nyesterday: [[2025-10-06-notes]]\n\n## Quick Thought\n\n- Something I\"ve noticed about myself recently is how naturally try to exploit systems. I don't mean in a nefarious way or anything, but as I think about [[thinking-in-diagrams]] I'm sort of always drawing out a system in my head thinking about ways to shim information or workflows into parts of that system. I feel like there's gotta be a name for this pattern of thinking but it was just something that came to my mind last night. For example I'm building a notifications service right now and I have several ideas I think I could build on top of it - so while I'm trying to plan for those future ideas I basically try to construct the base framework layer in such a way that I can take advantage of different entrypoints to the data model as a way to \"exploit\" the larger system for a more specific use case. MAybe you'd just refer to this as planning ahead, but it feels in my inner-being a little more scrappy than that. As I've built \"distrbuted\" systems over the years (mostly like CI/CD, not large systems of scale to be honest) I notice I'm always planning a spot to \"hook into\" whatever thing I'm building. I don't know where this thought might go, perhaps nowhere, but maybe there's something to systems-design and thinking in this way of being sensitive to exploit paths (though again, not necessarily nefarious, just as a way to add features to a system).\n\n## Reflection\n\n- [[reflection-numbers-11-11]]\n",
      "summary": "yesterday: 2025-10-06-notes",
      "date_published": "2025-10-07T04:43:12Z",
      "date_modified": "2025-10-07T04:43:12Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/reflection-john-4-14/",
      "url": "https://pype.dev/reflection-john-4-14/",
      "title": "Reflection - John 4:14",
      "content_text": "\nToday Spurgeon's \"Morning and Evening\" was on John 4:14\n\n!!! note \"John 4:14\"\n\n    But whoever drinks of this water which I will give to him will never be thirsty for eternity, but the water which I will give to him will become in him a well of water springing up to eternal life.”\n\nBeing autistic and growing up in the Church led to a few acute pain points for\nme growing up. A commonplace issue for me was when theological truths were\nexpressed in absolute terms but didn't \"feel absolutely true\" for me. I made a\npractice of trying to force myself to just \"be ok\" in light of the truth.\n\n!!! warning \"A Memory\"\n\n    Marissa was one of my best friends in high school - we spent a lot of time together in church, school, extra-curriculars, etc. She was an ever-present friend to me even when I was difficult to love. I recall multiple times, and one vivid memory for sure where I wasn't doing well and she inquired. But my response was \"I have Jesus, so I have to be OK\". I tried to filter my immediate acute pain through the lens of eternal glory. And yes, Paul muses in this fashion as well, but Paul wasn't a 16 year old undiagnosed autistic... Was everythign going to be alright in the end when I was 16? Oh ya, but was everything all right then? No... Marissa was a great friend, and Jesus has been sweet to me in this struggle, but nonetheless it would've been awesome if someone recognized the pain I was in with the wisdom to address me back then.\n\nToday, one of those truths comes up but it is not painful - **it is so relieving**\n\n## The heart is as insatiable as the grave until Jesus enters it\n\nYesterday God brought me a truth that he sustains me unto his own service -\n[[reflection-1-kings-19-8]]. And today I'm reminded that on his sustenance I\nwill \"never thirst\". But of course this isn't a plain and simple truth. I\nthirst for grace more and more every day, but what I'm finding in the season of\nending Summer 2025, post/present-multiple years of political awareness, and\nnear-hatred for my financial reliance on some other guy's company that my heart\n**wants** for much right now, but even **in that wanting** this truth rests\nsoftly on me that Jesus is and ought to be enough. I can be resistant to this\nout of fear of losing a drive to provide more and more for my family.\nContentedness is certainly a gift from God, but as I've been reflecting I see\nfear in my heart... As I've rejected the truth that \"Jesus is **enough**\" my\nheart longs for satisfaction, and when I get in my own way then fear and sin\ncreep in.\n\nFor me and my reflection right now the competing ideas are building financial\nwealth for myself and my family out of a desire for freedom from a system that\nI don't like, but also... isn't Jesus enough? My heart is in the same cunundrum\nas I was in at 16 when asked \"are you OK?\". But with wisdom, experince, and\nperspective I guess the tension isn't uncomfortable anymore (not that I'm\nliving in the tension perfectly). There's work for Jesus to do on my heart, and\nyet I know the work he has done and that proves his faithfulness to me to not\nleave me unfinished.\n\nAs he works on me, I have day-to-day choices to make.\n\n1. Whom will I serve?\n2. What will fill my heart?\n3. Will what I fill it with satisfy or like a glass of salt-water at sea leave me worse-off in the end?\n\nJesus has been good to me in ushering my heart through truths like this where\nthere's an \"already but not yet\" element to them. Jesus fully satisfies my\nheart, this is true. It's also true that I'm still a sinner. I don't feel like\nI always only thirst for more of my Lord - today I thirst for a larger\nretirement account and assets to financially support me for the next 20\nyears... is this wrong? I don't think so, not with appropriate perspective. And\nI've been feeling more and more in the last few weeks that Jesus is restoring\nme unto a new season of service and work. I don't know what it'll look like and\naccepting a murky future feels scary, but in the light of the Son - by whose\ngrace my lungs fill with air as I type - I can walk and work with plans that\nchange knowing my faithful God satisfies.\n",
      "summary": "Today Spurgeon's \"Morning and Evening\" was on John 4:14",
      "date_published": "2025-10-06T06:09:02Z",
      "date_modified": "2025-10-06T06:09:02Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "reflection",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2025-10-06-notes/",
      "url": "https://pype.dev/2025-10-06-notes/",
      "title": "2025-10-06 Notes",
      "content_text": "\nyesterday: [[2025-10-05-notes]]\n\n## Writing\n\n- published [[speakr-for-recording-and-transcribing-at-home]]\n\n## Reflection\n\n- These daily reflections are good, I'd like to organize them and perhaps all my\n  posts a little bit as my blog usage has shifted in recent months and I expect\n  it will in the coming months too. My current folder structure is more similar to tags and the folder is like the \"primary\" tag... I want to put some thought into this because some posts might need their own templates...\n\n  - for example, \"thoughts\" has an admonition built in and I think my reflections could use a similar admonition\n\n- [[reflection-john-4-14]]\n",
      "summary": "yesterday: 2025-10-05-notes",
      "date_published": "2025-10-06T05:43:55Z",
      "date_modified": "2025-10-06T05:43:55Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/angel-of-yahweh/",
      "url": "https://pype.dev/angel-of-yahweh/",
      "title": "Angel of Yahweh",
      "content_html": "\u003cp\u003eThe Angel of Yahweh is but isn\u0026rsquo;t Yahweh, it\u0026rsquo;s the second person of the Trinity,\nthe visible Yahweh to the invisible Yahweh\u003c/p\u003e\n",
      "content_text": "\nThe Angel of Yahweh is but isn't Yahweh, it's the second person of the Trinity,\nthe visible Yahweh to the invisible Yahweh\n",
      "summary": "The Angel of Yahweh is but isn't Yahweh, it's the second person of the Trinity, the visible Yahweh to the invisible Yahweh",
      "date_published": "2025-10-05T13:57:38Z",
      "date_modified": "2025-10-05T13:57:38Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "glossary"
      ]
    },
    {
      "id": "https://pype.dev/reflection-1-kings-19-8/",
      "url": "https://pype.dev/reflection-1-kings-19-8/",
      "title": "Reflection - 1 Kings 19:8",
      "content_text": "\nSpurgeon picked 1 Kings 19:8 this morning and his meditation was encouraging at\na meta-level. Highlighting to me that we (Christians) in maturity can be\nrefreshed from any passage of scripture. This isn't because the Bible is magic,\nand I believe it should be studied appropriately in context (heavily) in order to\nsolidify foundational pieces of understanding.\n\nBut I also cannot deny that I serve a living God who actively works in the\nlives of people - and one way he might do that is to encourage through pastoral\nreflection on Biblical truths that may be **brought to mind** though not\nnecessarily instructed in a passage. This is a specific point of Christian life\nthat I have been meditating loosely on lately - to be open in my heart to\nfinding joy and refreshment in Biblical truths that God may bring to mind even\nthough the \"origin\" of that thought might be an unrelated passage of Scripture.\nThis has been the case for a few weeks at this point, and today felt\nsignificant as I read Spurgeon's thoughts on being supplied for the sake of the\nLord's service.\n\n!!! note \"1 Kings 19:8\"\n\n    So he got up, ate, drank, and went in the strength of that food forty days and forty nights up to Horeb, the mountain of God.\n\n!!! warning \"Quick Context\"\n\n    Jezebel is chasing the prophet Elijah who has fled into the wilderness. Elijah\n    fears for his life and asks Yahweh to simply kill him. Yahweh (well, the [[Angel-of-Yahweh]]...\n    but we'll do that another time) meets him in his distress resting\n    under a tree - he provides food, water, and protection for Elijah to take a\n    nap. He does it again and then tells Elijah to travel to Horeb.\n\n## Reflection\n\nElijah is faithful to the Lord, and finds himself tired and in need. Yahweh\nmeets him, feeds him, and then **gives him more work to do**. This is the point\nof Spurgeon's writing this morning, that every ounce of work should be poured\nout unto the Lord's service. Every single thing I do should be laced with songs\nof praise to the King. It's easy to say \"blessed be the Name of the Lord\" when\nI am in surplus, and even in trial and want I think my faith has been tested\nand proven to some non-trivial degrees... But what about when I'm tired? Do I\nseek rest as a means to be refreshed **unto his service**? Or do I seek a\nhollow shell of rest, one that in reality isn't restorative and refreshing, but\nis instead deadening and numbing... I think I find myself actively pushing\nagainst holy rest out of love for, and slavery to myself. Maybe not quite to\ndoom and selfish as to say \"myself\" only, but out of fear of something else -\nmaybe as trivial as failure.\n\nGod is bringing to my mind why I haven't built more, why I'm disconnected from\nwork, why I zonk out so much... If I accept refreshment - physical refreshment-\nthrough a God-given grace then I am duty-bound to use it wisely... But I find\nthat I am afraid of the daunting work of doing something well, and day to day I\nfind myself hesitant to accept the refreshment out of an abandonment of the\ngood that can come through the hard work of doing it well.\n\nGod is telling me to eat and drink, to be refreshed... I genuinely believe God\nis speaking to me through 1 King 19:8 - to take the strength he provides via\nthe channels I know he provides them, and to wisely-steward the work he's given\nme to do.\n\nThis week I've pre-planned to dedicate time away from work to my own project\nand I feel encouraged going into tomorrow almost with foreknowledge of the\nstrength God will offer me in the morning\n",
      "summary": "Spurgeon picked 1 Kings 19:8 this morning and his meditation was encouraging at a meta-level. Highlighting to me that we (Christians) in maturity can be...",
      "date_published": "2025-10-05T06:59:52Z",
      "date_modified": "2025-10-05T06:59:52Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "reflection",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2025-10-05-notes/",
      "url": "https://pype.dev/2025-10-05-notes/",
      "title": "2025-10-05 Notes",
      "content_text": "\nyesterday: [[2025-10-04-notes]]\n\n## Reflection\n\n- [[reflection-1-kings-19-8]]\n\n## Projects\n\n- thinking about updates to [[quadtask]] to envelop it inside digital harbor\n  more... kind of just to save money on DNS and manage one less domain\n",
      "summary": "yesterday: 2025-10-04-notes",
      "date_published": "2025-10-05T06:49:29Z",
      "date_modified": "2025-10-05T06:49:29Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/2025-10-04-notes/",
      "url": "https://pype.dev/2025-10-04-notes/",
      "title": "2025-10-04 Notes",
      "content_text": "\nyesterday: [[2025-10-02-notes]]\n\n## Cooking Update\n\n- [[chili-notes]]\n\n## Project Update\n\n- [[sending-sms-with-smtp]]\n",
      "summary": "yesterday: 2025-10-02-notes",
      "date_published": "2025-10-04T13:42:32Z",
      "date_modified": "2025-10-04T13:42:32Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/sending-sms-with-smtp/",
      "url": "https://pype.dev/sending-sms-with-smtp/",
      "title": "Sending SMS with SMTP",
      "content_html": "\u003cp\u003eI\u0026rsquo;m cooking something up over here that will include SMS message notifications\nas a feature and I\u0026rsquo;ve been doing some reading on different providers\u0026hellip;\u003c/p\u003e\n\u003cp\u003eMany specialize in bulk SMS messaging, like for campaigns and promotions. So\nthis pricing model doesn\u0026rsquo;t work for me.\u003c/p\u003e\n\u003cp\u003eThe providers that do quick single SMS messages are often $0.005 to $.04 cents\nper message which isn\u0026rsquo;t insanity but I\u0026rsquo;m not exactly backed by anyone\u0026hellip;\u003c/p\u003e\n\u003cp\u003eWell today I learned that you can actually send SMS messages via SMTP! I\nwouldn\u0026rsquo;t bank on total reliability here but for testing and initial roll out of\nwhat I want I think this will be perfect.\u003c/p\u003e\n\u003cp\u003eAnd because I\u0026rsquo;m just that kind of guy, here\u0026rsquo;s some code you can \u003ccode\u003euv run smtp2sms.py\u003c/code\u003e and get yourself a handy little text. I\u0026rsquo;m going to build a simpler\nmodule but you can get a \u003ccode\u003egmail\u003c/code\u003e and \u003ccode\u003egmail app password\u003c/code\u003e within about 10\nminutes. \u003ca href=\"https://support.google.com/mail/answer/185833?hl=en\"\u003esee here\u003c/a\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# /// script\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# requires-python = \u0026#34;\u0026gt;=3.10\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# dependencies = [\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# ]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# ///\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"nn\"\u003eos\u003c/span\u003e\u003cspan class=\"o\"\u003e,\u003c/span\u003e \u003cspan class=\"nn\"\u003esmtplib\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003eemail.mime.text\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eMIMEText\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=\"n\"\u003eSMTP_APP_USER\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003eos\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eenviron\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;SMTP_APP_USER\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"c1\"\u003e# me@gmail.com\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eSMTP_APP_PASSWORD\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003eos\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eenviron\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;SMTP_APP_PASSWORD\u0026#34;\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=\"n\"\u003eSMTP_SERVER\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003eos\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eenviron\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;SMTP_SERVER\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e  \u003cspan class=\"c1\"\u003e# smtp.gmail.ch\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=\"c1\"\u003e# NOTE: I haven\u0026#39;t verified all the carrier domains - this was provided by ChatGPT\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=\"n\"\u003ecarriers\u003c/span\u003e \u003cspan class=\"o\"\u003e=\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=\"s2\"\u003e\u0026#34;att\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\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=\"s2\"\u003e\u0026#34;sms\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;txt.att.net\u0026#34;\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=\"s2\"\u003e\u0026#34;mms\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;mms.att.net\u0026#34;\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    \u003cspan class=\"s2\"\u003e\u0026#34;tmobile\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\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=\"s2\"\u003e\u0026#34;sms\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tmomail.net\u0026#34;\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=\"s2\"\u003e\u0026#34;mms\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tmomail.net\u0026#34;\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    \u003cspan class=\"s2\"\u003e\u0026#34;verizon\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\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=\"c1\"\u003e# \u0026#34;sms\u0026#34;: \u0026#34;vtext.com\u0026#34;, # not reliable\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s2\"\u003e\u0026#34;sms\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;vzwpix.com\u0026#34;\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=\"s2\"\u003e\u0026#34;mms\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;vzwpix.com\u0026#34;\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    \u003cspan class=\"s2\"\u003e\u0026#34;sprint\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\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=\"s2\"\u003e\u0026#34;sms\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;messaging.sprintpcs.com\u0026#34;\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=\"s2\"\u003e\u0026#34;mms\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;pm.sprint.com\u0026#34;\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    \u003cspan class=\"s2\"\u003e\u0026#34;googlefi\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\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=\"s2\"\u003e\u0026#34;sms\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;msg.fi.google.com\u0026#34;\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=\"s2\"\u003e\u0026#34;mms\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;msg.fi.google.com\u0026#34;\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    \u003cspan class=\"s2\"\u003e\u0026#34;uscellular\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\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=\"s2\"\u003e\u0026#34;sms\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;email.uscc.net\u0026#34;\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=\"s2\"\u003e\u0026#34;mms\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;mms.uscc.net\u0026#34;\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    \u003cspan class=\"s2\"\u003e\u0026#34;boost\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\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=\"s2\"\u003e\u0026#34;sms\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;sms.myboostmobile.com\u0026#34;\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=\"s2\"\u003e\u0026#34;mms\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;myboostmobile.com\u0026#34;\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    \u003cspan class=\"s2\"\u003e\u0026#34;cricket\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\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=\"s2\"\u003e\u0026#34;sms\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;sms.cricketwireless.net\u0026#34;\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=\"s2\"\u003e\u0026#34;mms\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;mms.cricketwireless.net\u0026#34;\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    \u003cspan class=\"s2\"\u003e\u0026#34;metropcs\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\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=\"s2\"\u003e\u0026#34;sms\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;mymetropcs.com\u0026#34;\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=\"s2\"\u003e\u0026#34;mms\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;mymetropcs.com\u0026#34;\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    \u003cspan class=\"s2\"\u003e\u0026#34;virgin\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\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=\"s2\"\u003e\u0026#34;sms\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;vmobl.com\u0026#34;\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=\"s2\"\u003e\u0026#34;mms\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;vmobl.com\u0026#34;\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\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003econtacts\u003c/span\u003e \u003cspan class=\"o\"\u003e=\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=\"s2\"\u003e\u0026#34;me\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;carrier\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;verizon\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;number\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;1234567890\u0026#34;\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\u003cspan class=\"n\"\u003emsg\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eMIMEText\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Hello from a python script? What?!\u0026#34;\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=\"n\"\u003emsg\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;From\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eSMTP_APP_USER\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=\"n\"\u003eSEND_TO\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;me\u0026#34;\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=\"c1\"\u003e# Complex for my future use cases - deal with it\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003emsg\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;To\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003econtacts\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eSEND_TO\u003c/span\u003e\u003cspan class=\"p\"\u003e][\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;number\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e@\u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003ecarriers\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003econtacts\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eSEND_TO\u003c/span\u003e\u003cspan class=\"p\"\u003e][\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;carrier\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e]][\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;sms\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"si\"\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003ewith\u003c/span\u003e \u003cspan class=\"n\"\u003esmtplib\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eSMTP\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eSMTP_SERVER\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e587\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"n\"\u003eemail_handler\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=\"n\"\u003eemail_handler\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estarttls\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=\"n\"\u003eemail_handler\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003elogin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eSMTP_APP_USER\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eSMTP_APP_PASSWORD\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=\"n\"\u003eemail_handler\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esendmail\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eSMTP_APP_USER\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003emsg\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;To\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]],\u003c/span\u003e \u003cspan class=\"n\"\u003emsg\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eas_string\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\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nI'm cooking something up over here that will include SMS message notifications\nas a feature and I've been doing some reading on different providers...\n\nMany specialize in bulk SMS messaging, like for campaigns and promotions. So\nthis pricing model doesn't work for me.\n\nThe providers that do quick single SMS messages are often $0.005 to $.04 cents\nper message which isn't insanity but I'm not exactly backed by anyone...\n\nWell today I learned that you can actually send SMS messages via SMTP! I\nwouldn't bank on total reliability here but for testing and initial roll out of\nwhat I want I think this will be perfect.\n\nAnd because I'm just that kind of guy, here's some code you can `uv run\nsmtp2sms.py` and get yourself a handy little text. I'm going to build a simpler\nmodule but you can get a `gmail` and `gmail app password` within about 10\nminutes. [see here](https://support.google.com/mail/answer/185833?hl=en)\n\n```python\n# /// script\n# requires-python = \"\u003e=3.10\"\n# dependencies = [\n# ]\n# ///\nimport os, smtplib\nfrom email.mime.text import MIMEText\n\nSMTP_APP_USER=os.environ.get(\"SMTP_APP_USER\") # me@gmail.com\nSMTP_APP_PASSWORD=os.environ.get(\"SMTP_APP_PASSWORD\")\nSMTP_SERVER=os.environ.get(\"SMTP_SERVER\")  # smtp.gmail.ch\n\n# NOTE: I haven't verified all the carrier domains - this was provided by ChatGPT\n\ncarriers = {\n    \"att\": {\n        \"sms\": \"txt.att.net\",\n        \"mms\": \"mms.att.net\"\n    },\n    \"tmobile\": {\n        \"sms\": \"tmomail.net\",\n        \"mms\": \"tmomail.net\"\n    },\n    \"verizon\": {\n        # \"sms\": \"vtext.com\", # not reliable\n        \"sms\": \"vzwpix.com\",\n        \"mms\": \"vzwpix.com\"\n    },\n    \"sprint\": {\n        \"sms\": \"messaging.sprintpcs.com\",\n        \"mms\": \"pm.sprint.com\"\n    },\n    \"googlefi\": {\n        \"sms\": \"msg.fi.google.com\",\n        \"mms\": \"msg.fi.google.com\"\n    },\n    \"uscellular\": {\n        \"sms\": \"email.uscc.net\",\n        \"mms\": \"mms.uscc.net\"\n    },\n    \"boost\": {\n        \"sms\": \"sms.myboostmobile.com\",\n        \"mms\": \"myboostmobile.com\"\n    },\n    \"cricket\": {\n        \"sms\": \"sms.cricketwireless.net\",\n        \"mms\": \"mms.cricketwireless.net\"\n    },\n    \"metropcs\": {\n        \"sms\": \"mymetropcs.com\",\n        \"mms\": \"mymetropcs.com\"\n    },\n    \"virgin\": {\n        \"sms\": \"vmobl.com\",\n        \"mms\": \"vmobl.com\"\n    }\n}\ncontacts = {\n    \"me\": {\"carrier\": \"verizon\", \"number\": \"1234567890\"},\n}\nmsg = MIMEText(\"Hello from a python script? What?!\")\nmsg[\"From\"] = SMTP_APP_USER\n\nSEND_TO = \"me\"\n\n# Complex for my future use cases - deal with it\nmsg[\"To\"] = f\"{contacts[SEND_TO]['number']}@{carriers[contacts[SEND_TO]['carrier']]['sms']}\"\n\nwith smtplib.SMTP(SMTP_SERVER, 587) as email_handler:\n    email_handler.starttls()\n    email_handler.login(SMTP_APP_USER, SMTP_APP_PASSWORD)\n    email_handler.sendmail(SMTP_APP_USER, [msg[\"To\"]], msg.as_string())\n\n```\n",
      "summary": "I'm cooking something up over here that will include SMS message notifications as a feature and I've been doing some reading on different providers...",
      "date_published": "2025-10-04T09:38:58Z",
      "date_modified": "2025-10-04T09:38:58Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "til",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/2025-10-02-notes/",
      "url": "https://pype.dev/2025-10-02-notes/",
      "title": "2025-10-02 Notes",
      "content_text": "\nyesterday: [[2025-10-01-notes]]\n\n## Random Thoughts\n\nI was thinking it might be nice on my blog to have a couple facelifts:\n\n- my daily notes always have the `yesterday: [...]` text in the description, which ain't pretty, so thinking about a nicer description or a thoughts-like template for dailyNotes maybe\n- I also was thinking a nice cover image for daily notes would look good on the web, but would largely be yak-shaving... maybe 20 minutes of yak shaving never hurt anyone though\n\n- I had a dope-y moment today... My vibe-coded weather app [[dad-can-i-wear-this]] uses ollama on the backend.... OR DOES IT!\n  - seriously I feel so stupid... I made a model via open-webui to be specific for dad-can-i-wear-this but the python code just calls ollama so depending on my env variable I was either getting the hard-coded responses back or else ollama from a different default model (too much dev workflows to outline here for now)...\n  - point is, I'm using open-webui as my LLM provider, and idk what it is but something had to click into place about where that fits with the doofy things I want to build at home\n  - So [[dad-can-i-wear-this]] got another face lift\n  - I should get this into forgejo and then I can deploy it like [[docker-compose-build-from-git-repo]] just for funsies\n",
      "summary": "yesterday: 2025-10-01-notes",
      "date_published": "2025-10-02T06:28:55Z",
      "date_modified": "2025-10-02T06:28:55Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/reflection-psalm-84-11/",
      "url": "https://pype.dev/reflection-psalm-84-11/",
      "title": "Reflection - Psalm 84:11",
      "content_html": "\u003cp\u003eSpurgeon\u0026rsquo;s Morning and Evening today (actually the evening one) is for \u003ca href=\"https://www.biblegateway.com/passage/?search=Psalm+84%3A11\u0026amp;version=ESV\"\u003ePsalm 84:11\u003c/a\u003e.\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003ePsalm 84:11\u003c/p\u003e\n\u003cp\u003ePsalm 84:11 (LEB): 11 Because Yahweh God is a sun and a shield;  Yahweh gives grace and honor.  He does not withhold good from those who walk blamelessly.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eWhat is it to me to hear and know that \u003cstrong\u003eYahweh gives grace and honor\u003c/strong\u003e? I\u0026rsquo;m asking this because Spurgon\u0026rsquo;s meditation this morning has a particularly striking line in it\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe little conjunction “and” in this verse is a diamond rivet binding the present with the future: grace and glory always go together.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThe translation he was using has \u0026ldquo;glory\u0026rdquo;, I quoted \u0026ldquo;honor\u0026rdquo;. The word is \u003ccode\u003eכָּבוֹד\u003c/code\u003e\n(kabod) which generally basically means \u0026ldquo;weight\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003eI got very distracted this morning unfortunately and therefore my reflection\nwill be cut short\u0026hellip; I know meditating on these things opens my day up to go in\na better direction\u0026hellip; May Yahweh give grace to me today, to live in a glorified\nand honorable way\u0026hellip; one worthy of the gospel of Christ.\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003ePhilippians 1:27\u003c/p\u003e\n\u003cp\u003eWhatever happens, conduct yourselves in a manner worthy of the gospel of Christ. Then, whether I come and see you or only hear about you in my absence, I will know that you stand firm in the one Spirit, striving together as one for the faith of the gospel\u003c/p\u003e\n\u003c/div\u003e\n",
      "content_text": "\nSpurgeon's Morning and Evening today (actually the evening one) is for [Psalm 84:11](https://www.biblegateway.com/passage/?search=Psalm+84%3A11\u0026version=ESV).\n\n!!! note \"Psalm 84:11\"\n\n    Psalm 84:11 (LEB): 11 Because Yahweh God is a sun and a shield;  Yahweh gives grace and honor.  He does not withhold good from those who walk blamelessly.\n\nWhat is it to me to hear and know that **Yahweh gives grace and honor**? I'm asking this because Spurgon's meditation this morning has a particularly striking line in it\n\n\u003e The little conjunction “and” in this verse is a diamond rivet binding the present with the future: grace and glory always go together.\n\nThe translation he was using has \"glory\", I quoted \"honor\". The word is `כָּבוֹד`\n(kabod) which generally basically means \"weight\".\n\nI got very distracted this morning unfortunately and therefore my reflection\nwill be cut short... I know meditating on these things opens my day up to go in\na better direction... May Yahweh give grace to me today, to live in a glorified\nand honorable way... one worthy of the gospel of Christ.\n\n!!! note \"Philippians 1:27\"\n\n    Whatever happens, conduct yourselves in a manner worthy of the gospel of Christ. Then, whether I come and see you or only hear about you in my absence, I will know that you stand firm in the one Spirit, striving together as one for the faith of the gospel\n",
      "summary": "Spurgeon's Morning and Evening today (actually the evening one) is for Psalm 84:11.",
      "date_published": "2025-10-01T06:34:25Z",
      "date_modified": "2025-10-01T06:34:25Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "reflection",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2025-10-01-notes/",
      "url": "https://pype.dev/2025-10-01-notes/",
      "title": "2025-10-01 Notes",
      "content_text": "\nyesterday: [[2025-09-28-notes]]\n\n## Reflection\n\n- [[reflection-psalm-84-11]]\n\n## Projects\n\n- A friend hit me up for some help with git because he's building a game with someone\n  - It was interesting to see how Unreal Engine 5 claimed to have git support, but it's really just a single branch local repo\n  - ChatGPT also led my buddy so astray it was hilarious.... good sobering reminder that AI will lead you astray if you don't know what you're researching, myself included\n",
      "summary": "yesterday: 2025-09-28-notes",
      "date_published": "2025-10-01T06:20:26Z",
      "date_modified": "2025-10-01T06:20:26Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/2025-09-28-notes/",
      "url": "https://pype.dev/2025-09-28-notes/",
      "title": "2025-09-28 Notes",
      "content_text": "\nyesterday: [[2025-09-27-notes]]\n\n## Updates\n\n- [[using-litestream-to-restore-my-database-for-easy-development#Update]]\n",
      "summary": "yesterday: 2025-09-27-notes",
      "date_published": "2025-09-28T09:03:55Z",
      "date_modified": "2025-09-28T09:03:55Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/reflection-deuteronomy-33-29/",
      "url": "https://pype.dev/reflection-deuteronomy-33-29/",
      "title": "Reflection - Deuteronomy 33:29",
      "content_html": "\u003cblockquote\u003e\n\u003cp\u003eNote reflections are not theological study\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eSpurgeon\u0026rsquo;s Morning and Evening today starts with:\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eDeuteronomy 33:29\u003c/p\u003e\n\u003cp\u003eDeuteronomy 33:29 (LEB): 29 Blessed are you, O Israel.  Who is like you, a people who is saved by Yahweh,  the shield of your help,  and who is the sword of your triumph,  and your enemies, they shall fawn before you,  and you shall tread on their backs.”\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eWhat is it to be saved by Yahweh? It is to be blessed\u0026hellip; Material blessings are the cheapest understanding of this idea\u0026hellip;\u003c/p\u003e\n\u003cdetails class=\"admonition danger\" open\u003e\n\u003csummary class=\"admonition-title\"\u003eDanger\u003c/summary\u003e\n\u003cp\u003eI feel such a strong need to even say that, in any of my public reflections to try to caveat every statement that someone hostile to my faith might say while reading, or get ahead of a bad idea a less mature Christian might hear me say without enough context\u0026hellip; but ultimately these reflections are not deep study, and when I acknowledge that \u0026rsquo;to be saved by God is to be blessed\u0026rsquo; I don\u0026rsquo;t need to follow it up with \u0026ldquo;but not necessarily with money and possessions\u0026rdquo;\u0026hellip; No, the truth of God flows from the Word and through our lives out of experience with him, and out of that intersection this morning do I proclaim I am blessed and saved by Yahweh\u0026hellip;\u003c/p\u003e\n\u003c/details\u003e\n\u003cp\u003eThe blessing is the saving, and the saving is the blessing. Apart from faith in\nJesus, I see no way to understand this biblical truth appropriately. In\nYahweh\u0026rsquo;s divine grace he has called me - he is the shield of my help in what he\nhas called me to. A simple summary is that he enables me to do the job he\u0026rsquo;s\ngiven. This is why the saving is the blessing\u0026hellip; Any creature is most happy,\nmost safe, most successful when it is operating within the bounds of its design\nand purpose\u0026hellip; An airplane is a fast mode of transportation but if you place it\non the highway - outside the boundaries of the sky and put in the context it\nwasn\u0026rsquo;t meant to operate it, it won\u0026rsquo;t be a very fast or useful means of getting\nfrom A to B.\u003c/p\u003e\n\u003cp\u003eYahweh\u0026rsquo;s saving act of grace invites humans into the context whereby they can\nlive according to their design and purpose. I believe the humanitarian efforts\nto unite humanity along common grounds are good-faith efforts doomed to fail\nbecause to be \u003cstrong\u003etruly\u003c/strong\u003e human is to be saved by the One Who Saves\u0026hellip; Yahweh\nsaves his people \u003cstrong\u003eback to humanity\u003c/strong\u003e (or forward to a new humanity - I\u0026rsquo;m not\nhere to debate eschatology with anyone at the moment). In this grace is unity and freedom.\u003c/p\u003e\n\u003cp\u003eMy reflections consistently revolve around what is becoming a central theme in\nmy theology - the meaning of freedom in Jesus. He saved me back to being truly\nhuman, and in my humanity I freely choose to live my life in loyalty to the one\nwho saves me. I\u0026rsquo;m only free to choose the right thing because he enabled me to.\nIn making that choice, whatever it might be, if I choose the godly option it\ncomes with the most blessing. That blessing is being conformed into the image\nand likeness of Jesus. Yahweh molds me into what it means to be hunman\u0026hellip;\nSanctification is the process by which we \u0026ldquo;more naturally\u0026rdquo; choose the godly\nthing. Because as our will is molded to his, our natural choice more often\naligns with what God wants. The blessing has to be understood ultimately as\nbeing saved, as restoration\u0026hellip; To see blessing as money or power or success is\nto remain broken, remaining broken is evidence of not being saved. ie. It\u0026rsquo;s\nonly by the saving power of Jesus that the blessing of being saved can be\nunderstood - this is how Paul can say that even blessings on earth are garbage\ncompared to the glories of heaven.\u003c/p\u003e\n\u003cp\u003eThe picture of the perfect human becomes more clear to me day by day as Jesus\nreveals himself to me, and I pray the freedom in Christ permeates my life\nquickly and deeply so that my free-will choice aligns with God\u0026rsquo;s will for my\nlife. In that state is shalom.\u003c/p\u003e\n",
      "content_text": "\n\u003e Note reflections are not theological study\n\nSpurgeon's Morning and Evening today starts with:\n\n!!! note \"Deuteronomy 33:29\"\n\n    Deuteronomy 33:29 (LEB): 29 Blessed are you, O Israel.  Who is like you, a people who is saved by Yahweh,  the shield of your help,  and who is the sword of your triumph,  and your enemies, they shall fawn before you,  and you shall tread on their backs.”\n\nWhat is it to be saved by Yahweh? It is to be blessed... Material blessings are the cheapest understanding of this idea...\n\n???+ danger \"\"\n\n    I feel such a strong need to even say that, in any of my public reflections to try to caveat every statement that someone hostile to my faith might say while reading, or get ahead of a bad idea a less mature Christian might hear me say without enough context... but ultimately these reflections are not deep study, and when I acknowledge that 'to be saved by God is to be blessed' I don't need to follow it up with \"but not necessarily with money and possessions\"... No, the truth of God flows from the Word and through our lives out of experience with him, and out of that intersection this morning do I proclaim I am blessed and saved by Yahweh...\n\nThe blessing is the saving, and the saving is the blessing. Apart from faith in\nJesus, I see no way to understand this biblical truth appropriately. In\nYahweh's divine grace he has called me - he is the shield of my help in what he\nhas called me to. A simple summary is that he enables me to do the job he's\ngiven. This is why the saving is the blessing... Any creature is most happy,\nmost safe, most successful when it is operating within the bounds of its design\nand purpose... An airplane is a fast mode of transportation but if you place it\non the highway - outside the boundaries of the sky and put in the context it\nwasn't meant to operate it, it won't be a very fast or useful means of getting\nfrom A to B.\n\nYahweh's saving act of grace invites humans into the context whereby they can\nlive according to their design and purpose. I believe the humanitarian efforts\nto unite humanity along common grounds are good-faith efforts doomed to fail\nbecause to be **truly** human is to be saved by the One Who Saves... Yahweh\nsaves his people **back to humanity** (or forward to a new humanity - I'm not\nhere to debate eschatology with anyone at the moment). In this grace is unity and freedom.\n\nMy reflections consistently revolve around what is becoming a central theme in\nmy theology - the meaning of freedom in Jesus. He saved me back to being truly\nhuman, and in my humanity I freely choose to live my life in loyalty to the one\nwho saves me. I'm only free to choose the right thing because he enabled me to.\nIn making that choice, whatever it might be, if I choose the godly option it\ncomes with the most blessing. That blessing is being conformed into the image\nand likeness of Jesus. Yahweh molds me into what it means to be hunman...\nSanctification is the process by which we \"more naturally\" choose the godly\nthing. Because as our will is molded to his, our natural choice more often\naligns with what God wants. The blessing has to be understood ultimately as\nbeing saved, as restoration... To see blessing as money or power or success is\nto remain broken, remaining broken is evidence of not being saved. ie. It's\nonly by the saving power of Jesus that the blessing of being saved can be\nunderstood - this is how Paul can say that even blessings on earth are garbage\ncompared to the glories of heaven.\n\nThe picture of the perfect human becomes more clear to me day by day as Jesus\nreveals himself to me, and I pray the freedom in Christ permeates my life\nquickly and deeply so that my free-will choice aligns with God's will for my\nlife. In that state is shalom.\n",
      "summary": "Note reflections are not theological study",
      "date_published": "2025-09-27T06:38:42Z",
      "date_modified": "2025-09-27T06:38:42Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "reflection",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2025-09-27-notes/",
      "url": "https://pype.dev/2025-09-27-notes/",
      "title": "2025-09-27 Notes",
      "content_text": "\nyesterday: [[2025-09-24-notes]]\n\n## Reflection\n\n- [[reflection-deuteronomy-33-29]]\n\n## Losses\n\n- something about running docker in distrobox is wonky with permissions on volume mounts. it might be how my container build is setting up a non-root user idk, but then it's intermittent with sqlite corruption failures probably from just cat'ing the file over ssh to my desktop... need to rethink how I'm using litestream\n",
      "summary": "yesterday: 2025-09-24-notes",
      "date_published": "2025-09-27T06:24:42Z",
      "date_modified": "2025-09-27T06:24:42Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/wants/",
      "url": "https://pype.dev/wants/",
      "title": "Wants",
      "content_html": "\u003ch1 id=\"wants\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWants\u003c/span\u003e\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://store-us.gl-inet.com/products/beryl-ax-gl-mt3000-pocket-sized-wi-fi-6-wireless-travel-gigabit-router\"\u003eGL.inet Travel Router with Tailscale support\u003c/a\u003e\n\u003cul\u003e\n\u003cli\u003ewould be great for GWL trips\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n# Wants\n\n- [GL.inet Travel Router with Tailscale support](https://store-us.gl-inet.com/products/beryl-ax-gl-mt3000-pocket-sized-wi-fi-6-wireless-travel-gigabit-router)\n  - would be great for GWL trips\n",
      "summary": "GL.inet Travel Router with Tailscale support - would be great for GWL trips",
      "date_published": "2025-09-24T20:58:00Z",
      "date_modified": "2025-09-24T20:58:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "slash"
      ]
    },
    {
      "id": "https://pype.dev/reflection-romans-3-26/",
      "url": "https://pype.dev/reflection-romans-3-26/",
      "title": "Reflection - Romans 3:26",
      "content_text": "\nFrom Morning and Evening today, Spurgeon has thoughts on Romans 3:26. I need\nmore context personally, so here's a newer translation of 3:25-26\n\n!!! note \"Romans 3:25-26\"\n\n    25﻿God put Jesus forth as the place of mercy, through faithfulness, by\n    means of his blood. He did this to demonstrate his covenant justice, because\n    of the passing over (in divine forbearance) of sins committed beforehand.\n    26﻿This was to demonstrate his covenant justice in the present time: that\n    is, that he himself is in the right, and that he declares to be in the right\n    everyone who trusts in the faithfulness of Jesus.\n\n    Goldingay, J., \u0026 Wright, T. (2018). The Bible for Everyone: A New Translation\n    (Ro 3:25–26). SPCK.\n\n??? danger \"NPP\"\n\n    I'm not here to debate \"faith in Jesus\" vs \"faithfulness of Jesus\"... I\n    feel so beyond debating semantics when either way it's Jesus who gives you\n    faith and chooses in the first place\n\nSpurgeon's meditation certainly resolves around Penal Substitutionary\nAtonement, a doctrine I have come to mostly reject, but I have plenty of\ncommon-ground with a conviction of PSA-subscribers and Spurgeon - and that's\nthat we can trust, as chosen people of God, that \"there is now **no**\ncondemnation for those in Christ Jesus\"\n\nNot only is there no condemnation, but on the contrary Jesus **declares to be\nin the right everyone who trusts**.\n\nThis is the great confidence of the Christian, and the source of my comfort -\nthat even though there is sin in my past and future (and I pray sorrow over\nit), I can trust in God's unchanging nature. He says in effect \"Out of my\ndivine grace to call your name from the grave, by the covering of Jesus and the\nwork of the cross, you are free. Free from condemnation, free from judgement,\nand today (and everyday) free from the yoke of sin\"\n\nFreedom... such an interesting word... It came up recently in my\n[[reflection---galatians-5-1]] as well. I guess as I reflect here, freedom is\nabout our behavior and what we do or don't do. But confidence is the partner of\nfreedom. A child who has the freedom on the playground to play with whatever\nthey want will sit in the corner if they are afraid of consequences of doing\nsomething wrong - this would come from a place of not trusting in the freedom\nthey've been given. The child lacks comfort in their freedom to play with what\nthey want unless the faithfulness and goodness of the one who gives the freedom\nis impressed into the child and they can exercise trust in that authority -\nwhich is manifest in their joyful play on the playground.\n\nSo for the Christian this obviously doesn't mean \"free to do whatever I want\",\nthe metaphor isn't perfect (it's made better by aligning the walls around a\nplayground with the boundaries of proper-human living)... Jesus actually gives\nme the freedom to do **his** will over my own, because apart from him I am not\nable to choose anything besides the sinful desires of my own heart.\n\nBut this morning, I think the full circle is that when I do choose my own\ndesires, when I fall back into the \"not yet\", when I sacrifice my divine\nfreedom on the altar of my own life for a cheap song, I can **still have\nconfidence that my God calls me right by the work of my Lord, Jesus**\n\nThis great confidence can never excuse sin, can never justify the choice. But\nthe reality is that a good God ordered and created the world, and he chooses\nwhomever he chooses... By his graceful choice to adopt me, I have confidence in\nhis Name that the sin I run to will not ultimately destroy me - because Jesus\nintervened and gives me new life everyday\n",
      "summary": "From Morning and Evening today, Spurgeon has thoughts on Romans 3:26. I need more context personally, so here's a newer translation of 3:25-26",
      "date_published": "2025-09-24T05:42:24Z",
      "date_modified": "2025-09-24T05:42:24Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "reflection",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2025-09-24-notes/",
      "url": "https://pype.dev/2025-09-24-notes/",
      "title": "2025-09-24 Notes",
      "content_text": "\nyesterday: [[2025-09-23-notes]]\n\n## Reflection\n\n- [[reflection-romans-3-26]]\n\n## Dev\n\n- Finally figured out an issue with my Conform setup was just that `node`\n  wasn't installed on my dev machine... def an artifact of running nvim in\n  distrobox sometimes and on host other times.\n",
      "summary": "yesterday: 2025-09-23-notes",
      "date_published": "2025-09-24T05:27:48Z",
      "date_modified": "2025-09-24T05:27:48Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/2025-09-23-notes/",
      "url": "https://pype.dev/2025-09-23-notes/",
      "title": "2025-09-23 Notes",
      "content_text": "\nyesterday: [[ 2025-09-20-notes ]]\n\n## Today\n\n- started [[wants]]\n\n",
      "summary": "yesterday: 2025-09-20-notes",
      "date_published": "2025-09-23T06:55:41Z",
      "date_modified": "2025-09-23T06:55:41Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/book-review-dula-fig-and-the-wisdom-of-old-sycamore/",
      "url": "https://pype.dev/book-review-dula-fig-and-the-wisdom-of-old-sycamore/",
      "title": "Book Review - Dula, Fig, and the Wisdom of Old Sycamore",
      "content_html": "\u003cp\u003eDula, Fig, and the Wisdom of Old Sycamore is a beautifully illustrated and\npowerful story that gives kids an accessible framework to better understand their\nworld - hard things are easier with kindness. Old Sycamore helps young Dula\nunderstand herself a little better through commentary on her mother\u0026rsquo;s favorite\nstory (for which Dula was named). He tends to Dula\u0026rsquo;s frustration in a loving\nway and dismisses her back to her real life with gentleness. Kindness is a\ncore-value of our household, and I loved sharing this story with\nmy kids. I look forward to reading it many times over the next several years!\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://www.goodreads.com/book/show/241655315-dula-fig-and-the-wisdom-of-old-sycamore\" style=\"float: left; padding-right: 20px\"\u003e\u003cimg border=\"0\" alt=\"Dula, Fig, and the Wisdom of Old Sycamore\" src=\"https://i.gr-assets.com/images/S/compressed.photo.goodreads.com/books/1757946617l/241655315._SX98_.jpg\" /\u003e\u003c/a\u003e\u003ca href=\"https://www.goodreads.com/book/show/241655315-dula-fig-and-the-wisdom-of-old-sycamore\"\u003eDula, Fig, and the Wisdom of Old Sycamore\u003c/a\u003e by \u003ca href=\"https://www.goodreads.com/author/show/55372642.Elizabeth_Lett\"\u003eElizabeth Lett\u003c/a\u003e\u003cbr/\u003e\nMy rating: \u003ca href=\"https://www.goodreads.com/review/show/7929998013\"\u003e5 of 5 stars\u003c/a\u003e\u003cbr /\u003e\u003cbr /\u003e\nDula, Fig, and the Wisdom of Old Sycamore is a beautifully illustrated and\u003cbr /\u003epowerful story that gives kids an accessible framework to better understand their\u003cbr /\u003eworld - hard things are easier with kindness. Old Sycamore helps young Dula\u003cbr /\u003eunderstand herself a little better through commentary on her mother\u0026rsquo;s favorite\u003cbr /\u003estory (for which Dula was named). He tends to Dula\u0026rsquo;s frustration in a loving\u003cbr /\u003eway and dismisses her back to her real life with gentleness. Kindness is a\u003cbr /\u003ecore-value of our household, and I loved sharing this story with\u003cbr /\u003emy kids. I look forward to reading it many times over the next several years!\u003cbr /\u003e\n\u003cbr/\u003e\u003cbr/\u003e\n\u003ca href=\"https://www.goodreads.com/review/list/120682317-nic-payne\"\u003eView all my reviews\u003c/a\u003e\u003c/p\u003e\n",
      "content_text": "\nDula, Fig, and the Wisdom of Old Sycamore is a beautifully illustrated and\npowerful story that gives kids an accessible framework to better understand their\nworld - hard things are easier with kindness. Old Sycamore helps young Dula\nunderstand herself a little better through commentary on her mother's favorite\nstory (for which Dula was named). He tends to Dula's frustration in a loving\nway and dismisses her back to her real life with gentleness. Kindness is a\ncore-value of our household, and I loved sharing this story with\nmy kids. I look forward to reading it many times over the next several years!\n\n\n\u003ca href=\"https://www.goodreads.com/book/show/241655315-dula-fig-and-the-wisdom-of-old-sycamore\" style=\"float: left; padding-right: 20px\"\u003e\u003cimg border=\"0\" alt=\"Dula, Fig, and the Wisdom of Old Sycamore\" src=\"https://i.gr-assets.com/images/S/compressed.photo.goodreads.com/books/1757946617l/241655315._SX98_.jpg\" /\u003e\u003c/a\u003e\u003ca href=\"https://www.goodreads.com/book/show/241655315-dula-fig-and-the-wisdom-of-old-sycamore\"\u003eDula, Fig, and the Wisdom of Old Sycamore\u003c/a\u003e by \u003ca href=\"https://www.goodreads.com/author/show/55372642.Elizabeth_Lett\"\u003eElizabeth Lett\u003c/a\u003e\u003cbr/\u003e\nMy rating: \u003ca href=\"https://www.goodreads.com/review/show/7929998013\"\u003e5 of 5 stars\u003c/a\u003e\u003cbr /\u003e\u003cbr /\u003e\nDula, Fig, and the Wisdom of Old Sycamore is a beautifully illustrated and\u003cbr /\u003epowerful story that gives kids an accessible framework to better understand their\u003cbr /\u003eworld - hard things are easier with kindness. Old Sycamore helps young Dula\u003cbr /\u003eunderstand herself a little better through commentary on her mother's favorite\u003cbr /\u003estory (for which Dula was named). He tends to Dula's frustration in a loving\u003cbr /\u003eway and dismisses her back to her real life with gentleness. Kindness is a\u003cbr /\u003ecore-value of our household, and I loved sharing this story with\u003cbr /\u003emy kids. I look forward to reading it many times over the next several years!\u003cbr /\u003e\n\u003cbr/\u003e\u003cbr/\u003e\n\u003ca href=\"https://www.goodreads.com/review/list/120682317-nic-payne\"\u003eView all my reviews\u003c/a\u003e\n",
      "summary": "Dula, Fig, and the Wisdom of Old Sycamore is a beautifully illustrated and powerful story that gives kids an accessible framework to better understand their...",
      "date_published": "2025-09-20T07:04:19Z",
      "date_modified": "2025-09-20T07:04:19Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "review",
        "note"
      ]
    },
    {
      "id": "https://pype.dev/2025-09-20-notes/",
      "url": "https://pype.dev/2025-09-20-notes/",
      "title": "2025-09-20 Notes",
      "content_text": "\nyesterday: [[ 2025-09-19-notes ]]\n\n## Today\n\n- Liz asked me to write a book review for her a couple months ago and I finally got around to it...\n- [[book-review-dula-fig-and-the-wisdom-of-old-sycamore]]\n\n## Soonish\n\n- I've been continuing to think about this but it's becoming more day-dreamy... I need to get something minimal deployed and start using it myself\n\n## Wins\n\n- Where have my wins gone?\n- Tonight I didn't even try to be ultra productive, I just did all the dishes (which took a super long 15 minutes) and folded some clothes... It's kind of crazy what a very boring 30 minutes of work at home can do to set up your next day (or several in the case of laundry)\n",
      "summary": "yesterday: 2025-09-19-notes",
      "date_published": "2025-09-20T07:03:11Z",
      "date_modified": "2025-09-20T07:03:11Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/reflection-galatians-5-1/",
      "url": "https://pype.dev/reflection-galatians-5-1/",
      "title": "Reflection - Galatians 5:1",
      "content_html": "\u003cp\u003eSpurgeon\u0026rsquo;s \u0026ldquo;Morning and Evening\u0026rdquo; today is about the freedom we have in Christ.\nFreedom is a core concept of Christianity, and one no doubt bastardized and\nwarped by modern progressive culture (like Ancient Greek modern, not 2010s modern).\u003c/p\u003e\n\u003cp\u003eFreedom is \u003cstrong\u003enot\u003c/strong\u003e the ability to do whatever I want without consequence\u0026hellip;\nit\u0026rsquo;s not even the ability to do whatever I want! What a nightmarish hell the\nworld would be if each one of us could (and especially did) act on every desire\nthat comes into our hearts\u0026hellip;\u003c/p\u003e\n\u003cdiv class=\"admonition danger\"\u003e\n\u003cp class=\"admonition-title\"\u003eIsle of Dreams\u003c/p\u003e\n\u003cp\u003eIt\u0026rsquo;s like the Island of Dreams in CS Lewis\u0026rsquo; Voyage of the Dawn Treader\u0026hellip; The\nseaman are all excited about their \u0026ldquo;dreams\u0026rdquo; (long lost lovers, money, etc) but\nthe man they rescue makes it clear to them it\u0026rsquo;s not the place where daydreams\ncome true\u0026hellip; but dreams\u0026hellip;. think of the scary dreams you\u0026rsquo;ve had, or you\u0026rsquo;ve\nheard your kids have\u0026hellip; With that context you probably don\u0026rsquo;t want to go to the\nIsland of Dreams\u003c/p\u003e\n\u003c/div\u003e\n\u003cfigure\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250919112304_e78b23fa.png\" alt=\"20250919112304_e78b23fa.png\"\u003e\n\u003c/figure\u003e\n\u003cp\u003eSo, this childish anti-view of \u0026ldquo;freedom\u0026rdquo; should\nimmediately be rejected by any well-reasoned adult, let alone Christian\u0026hellip; In\nthis view, self-restraint is the antithesis of freedom, and not that I have\nsome well-endowed argument against that - only I\u0026rsquo;d say it feels ridiculous that\nthese 2 ideas would be at odds. It\u0026rsquo;s simply unreasonable to me. But perhaps my\nconviction on that unreasonableness stems from an understanding that the\nfreedom Jesus offers is so much better than whatever pleases my fleeting\nfancies.\u003c/p\u003e\n\u003cp\u003eAnd by that same token, freedom is not our daydreams\u0026hellip; we were all created\nwith purpose - humans made in the image of God. Accepting and understanding\nthat truth absolutely ought to affect how we live. I am not a \u0026ldquo;good person\u0026rdquo; by\ndefault - I have the \u003cstrong\u003efreedom\u003c/strong\u003e to act \u0026ldquo;good\u0026rdquo; because Jesus saves me, and\ncalls me to a higher standard of living than I would call myself to.\u003c/p\u003e\n\u003cp\u003eAnd that\u0026rsquo;s the meditation today - bourne out of the words in Galatians 5:1\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eGalatians 5:1\u003c/p\u003e\n\u003cp\u003eFor freedom Christ has set us free. Stand firm, therefore, and do not be subject again to a yoke of slavery.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eIf I were to submit myself to my own desires, I\u0026rsquo;d end up a slave to them. I\u0026rsquo;ve\nfelt this reality in many ways over my life, and Jesus has been good to me. He\nfrees me from myself, he freely offers himself to me (aye, his message goes out\nto all the world, and the ones who are called answer). In that freedom I\u0026rsquo;m\nfaced with a choice, the same choice as the Garden\u0026hellip; Do what I want (eat of\nthe tree of knowledge of good and bad) or trust what God says is good, is good,\nand make the choice by Jesus\u0026rsquo; grace to \u003cstrong\u003enot\u003c/strong\u003e eat of the tree of knowledge of\ngood and bad, but instead of the tree of life, presently experienced as\ncommunion with the Holy Spirit and fellowship with my King Jesus.\u003c/p\u003e\n\u003cp\u003eFor freedom Christ has set me free, may I walk in his freedom today.\u003c/p\u003e\n",
      "content_text": "\nSpurgeon's \"Morning and Evening\" today is about the freedom we have in Christ.\nFreedom is a core concept of Christianity, and one no doubt bastardized and\nwarped by modern progressive culture (like Ancient Greek modern, not 2010s modern).\n\nFreedom is __not__ the ability to do whatever I want without consequence...\nit's not even the ability to do whatever I want! What a nightmarish hell the\nworld would be if each one of us could (and especially did) act on every desire\nthat comes into our hearts... \n\n!!! danger \"Isle of Dreams\"\n\n    It's like the Island of Dreams in CS Lewis' Voyage of the Dawn Treader... The\n    seaman are all excited about their \"dreams\" (long lost lovers, money, etc) but\n    the man they rescue makes it clear to them it's not the place where daydreams\n    come true... but dreams.... think of the scary dreams you've had, or you've\n    heard your kids have... With that context you probably don't want to go to the\n    Island of Dreams\n\n![20250919112304_e78b23fa.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250919112304_e78b23fa.png)\n\nSo, this childish anti-view of \"freedom\" should\nimmediately be rejected by any well-reasoned adult, let alone Christian... In\nthis view, self-restraint is the antithesis of freedom, and not that I have\nsome well-endowed argument against that - only I'd say it feels ridiculous that\nthese 2 ideas would be at odds. It's simply unreasonable to me. But perhaps my\nconviction on that unreasonableness stems from an understanding that the\nfreedom Jesus offers is so much better than whatever pleases my fleeting\nfancies.\n\nAnd by that same token, freedom is not our daydreams... we were all created\nwith purpose - humans made in the image of God. Accepting and understanding\nthat truth absolutely ought to affect how we live. I am not a \"good person\" by\ndefault - I have the __freedom__ to act \"good\" because Jesus saves me, and\ncalls me to a higher standard of living than I would call myself to.\n\nAnd that's the meditation today - bourne out of the words in Galatians 5:1\n\n!!! note \"Galatians 5:1\"\n\n    For freedom Christ has set us free. Stand firm, therefore, and do not be subject again to a yoke of slavery. \n\nIf I were to submit myself to my own desires, I'd end up a slave to them. I've\nfelt this reality in many ways over my life, and Jesus has been good to me. He\nfrees me from myself, he freely offers himself to me (aye, his message goes out\nto all the world, and the ones who are called answer). In that freedom I'm\nfaced with a choice, the same choice as the Garden... Do what I want (eat of\nthe tree of knowledge of good and bad) or trust what God says is good, is good,\nand make the choice by Jesus' grace to __not__ eat of the tree of knowledge of\ngood and bad, but instead of the tree of life, presently experienced as\ncommunion with the Holy Spirit and fellowship with my King Jesus.\n\nFor freedom Christ has set me free, may I walk in his freedom today.\n\n",
      "summary": "Spurgeon's \"Morning and Evening\" today is about the freedom we have in Christ. Freedom is a core concept of Christianity, and one no doubt bastardized and...",
      "date_published": "2025-09-19T06:04:58Z",
      "date_modified": "2025-09-19T06:04:58Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "reflection",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2025-09-19-notes/",
      "url": "https://pype.dev/2025-09-19-notes/",
      "title": "2025-09-19 Notes",
      "content_text": "\nyesterday: [[ 2025-09-18-notes ]]\n\n## Reflection\n\n- [[reflection---galatians-5-1]]\n\n## Projects\n\n- Been thinking a lot about soonish, it feels like my thoughts are 3 dimensional but I can only clearly see 2 dimensions at a time... \n  - documentation efforts have been a good exercise in a lot of things including developing skill working alongside AI\n  - basic desire is Notifications as a Service but can be built into anything from event invites to IT tickets\n\n- revamped [[dad-can-i-wear-this]] for a version 2\n",
      "summary": "yesterday: 2025-09-18-notes",
      "date_published": "2025-09-19T06:00:41Z",
      "date_modified": "2025-09-19T06:00:41Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/reflection-galatians-5-24-25/",
      "url": "https://pype.dev/reflection-galatians-5-24-25/",
      "title": "Reflection - Galatians 5:24-25",
      "content_text": "\n!!! note \"Galatians 5:24-25\"\n\n    24 Now those ⌊who belong to Christ⌋  have crucified the flesh together with its feelings and its desires.\n    25 If we live by the Spirit, we must also follow the Spirit. 26 We must not become conceited, provoking one another, envying one another.\n\nSpurgeon's \"Morning and Evening\" is a mediation on living in and following the Spirit. He says this:\n\n\u003e  You will never find true faith unattended by true godliness; on the other\n\u003e  hand, you will never discover a truly holy life which has not for its root a\n\u003e  living faith upon the righteousness of Christ\n\n`godliness` is the \"following the Spirit\" in our daily lives - it is living\n\"like god\". What then is \"true faith\"? I think I can take Spurgeon to be saying\nthat upon internal meditation do I find my faith to be secure and genuine.\n\"true faith\" is between me and the Lord.\n\nThe meditation this morning though... \"If I live by the Spirit, I must also\nfollow the Spirit\" is once again heavy on my heart as I wrestled through\n[[reflecting-on-romans-7-7-13]] a few weeks ago - the reality that I daily\nchoose things contrary to my faith. \n\nI think Paul is saying \"because you have crucified the flesh\" as the parallel\npoint to \"we must also follow the Spirit\". He's saying \"if you say you've\ncrucified the flesh, show your faith by following as well\" - it's James' \"show\nme your faith by what you do\"\n\nSo who am I today? Whom will I serve?\n\nThese morning meditations are like my 100x push-ups a day... the days I do\nthem just seem marginally better, and in a season of consistency the value\nseems to compound... I thank Jesus for the conviction in the first place to\nstrive for holiness, and for the ~~strength~~ faith to say no to the flesh, but\nyes to the Spirit.\n",
      "summary": "!!! note \"Galatians 5:24-25\"",
      "date_published": "2025-09-18T05:39:12Z",
      "date_modified": "2025-09-18T05:39:12Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "reflection",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2025-09-18-notes/",
      "url": "https://pype.dev/2025-09-18-notes/",
      "title": "2025-09-18 Notes",
      "content_text": "\nyesterday: [[ 2025-09-15-notes ]]\n\n## Reflection\n\n- [[reflection-galatians-524-25]]\n",
      "summary": "yesterday: 2025-09-15-notes",
      "date_published": "2025-09-18T05:19:56Z",
      "date_modified": "2025-09-18T05:19:56Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/erets/",
      "url": "https://pype.dev/erets/",
      "title": "erets",
      "content_html": "\u003cp\u003eHebrew word for \u0026ldquo;land\u0026rdquo;, biblically can refer to:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003ethe dry land\u003c/li\u003e\n\u003cli\u003ethe cosmic earthly realm that parallels the heavenly realm\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eIt does not mean \u0026ldquo;globe\u0026rdquo;\u003c/p\u003e\n",
      "content_text": "\nHebrew word for \"land\", biblically can refer to:\n\n1. the dry land\n2. the cosmic earthly realm that parallels the heavenly realm\n\nIt does not mean \"globe\"\n",
      "summary": "Hebrew word for \"land\", biblically can refer to:",
      "date_published": "2025-09-15T06:11:46Z",
      "date_modified": "2025-09-15T06:11:46Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "glossary"
      ]
    },
    {
      "id": "https://pype.dev/reflection-short-erets/",
      "url": "https://pype.dev/reflection-short-erets/",
      "title": "Reflection (Short) - Erets",
      "content_text": "\nI've been really buggin out about a project I'm working on and nearly\nforgetting to spend meaningful time during the day/mornings on reflection.\nThankfully a 60 second Bible Project video offered me a short framework this\nmorning to think about the land God created...\n\nThe video is a minute long, you can find it [on the Bible Project website](https://bibleproject.com/videos/vocab-insight-erets-land/)\n\nWhen I think about Bible stuff, especially anything related to Old Testament or\nCreation (which is actually literally everything) I have a hard time stopping\nmy mind from jumping to being critical of my brothers and sisters in Christ who\nadopt naieve or mainstream ideas about my Ancient Faith and King.\n\nOne of the things my spiritual family largely misses is the cosmic nature of\nthe creation account.... In this case of [[erets]], which shows up on page 1 of\nthe Bible, the Western mind reads \"In the beginning God created the heavens and\nthe earth...\" and we go \"oh, the globe, the planet, God made the planet,\nobviously\"\n\nAnd the thing is... ya, he did... but that's not what the creation story gets\nat, and what it does get at is what I'm reflecting on...\n\nGod put me on the erets, out of the dust of the erets he formed me, and you...\nThis is more than God drawing planet earth on the canvas of our universe.\nYahweh brought order to chaos, he created the heavens (literally \"the skies\")\nand filled it and he also created the earth and filled it. There is a parallel\nnature to these realms - the physical earthly realm of erets and the spiritual\nheavenly realm of the skies. These words carry ancient meaning in the creation\ncontext, they are poetic and visual in nature, rather than explanatory and\nphysical.\n\nRecognizing that the realm I'm in, God ordered and put me in, should bring\nmeaning to everything I do. My King does say to pray \"\\[God's\\] will be done on\nearth as it is in heaven\". I am supposed to be one of the ones \"bringing heaven\nto earth\" - carrying on the ministry of Jesus in the ways he commanded. Paul\ncommands to \"do everything with gratitude\" [philippians 4:6](https://biblehub.com/philippians/4-6.htm)\nin my heart towards Jesus. Jesus said plainly \"those who love me obey me\" [](https://www.biblegateway.com/verse/en/John%2014%3A21)\n\nBut if I misunderstand my place in the cosmos, as a representative of the one\nTrue God to the physical realm he created that exists in a planar intersection\nwith the heavenly realm, if I misunderstand this I will misrepresent my God...\nand I fear I have been. I've been consumed with things inside my life lately,\nand perhaps that's moderately ok... I don't think that the present trials of my\nlife are drawing me away from Jesus at all, but I'd be an idiot to not\nrecognize that there are moments in my day where I feel like nothing matters,\nwhere I walk around on God's erets somewhat aimlessly due to my own\nself-loathing and consumption. These are moments where my flesh and sin are\nstrong, and the trials is revealing it. The meditation on my purpose in God's\ncreation, as a member of the realm of the ordered erets, is calming me in this\nmoment.\n\nGod's purpose for anyone is this:\n\n!!! note \"1 Thess. 5:18\"\n\n    give thanks in everything; for this is God’s will for you in Christ Jesus.\n\nAt any moment, anyone one of us could be taken off earth - whether by old age\nlike my Grandma, or by violent hatred like [Charlie Kirk](). God's will (one of\nthe wills anyways) for anyone is the same, as a member of ordered creation\ncalled by Jesus it's my duty to live this out... and by God's grace I know\nit's possible by his intervention - to give thanks in everything.\n\nThe honest truth is I'm not really sure what to do besides take a breath every\nminute, acknowledge and preach the truth that Jesus is the author and perfector\nof my life and faith, and to pray this truth calms my heart in the midst of the\nturmoil I've been feeling lately.\n\nYahweh orders creation, he put all of us on the erets, and the message of his\ngrace goes out to all people.... who will answer and bring God's will to the\nearth? Thankfully it's not my job to know. My job is simple - to give thanks and to\nlove the Lord my God with all of me.\n",
      "summary": "I've been really buggin out about a project I'm working on and nearly forgetting to spend meaningful time during the day/mornings on reflection. Thankfully a...",
      "date_published": "2025-09-15T06:05:41Z",
      "date_modified": "2025-09-15T06:05:41Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "cosmos",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2025-09-15-notes/",
      "url": "https://pype.dev/2025-09-15-notes/",
      "title": "2025-09-15 Notes",
      "content_text": "\nyesterday: [[ 2025-09-13-notes ]]\n\n## Reflection\n\n- [[reflection-short-erets]]\n\n## Projects\n\n- Continuing work on [[soonish]]\n\n## Thoughts\n\n- WorkOS for auth for B2B for soonish\n- remind.notifiq.net/\u003curl\u003e as a usecase for soonish\n  - configured reading times, so just get reminded at the next one\n  - phase 2 of this idea might be grabbing the content of the url and sending the notification with some of that content\n\n",
      "summary": "yesterday: 2025-09-13-notes",
      "date_published": "2025-09-15T06:04:13Z",
      "date_modified": "2025-09-15T06:04:13Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/2025-09-13-notes/",
      "url": "https://pype.dev/2025-09-13-notes/",
      "title": "2025-09-13 Notes",
      "content_text": "\nyesterday: [[ 2025-09-11-notes ]]\n\n",
      "summary": "yesterday: 2025-09-11-notes",
      "date_published": "2025-09-13T06:00:27Z",
      "date_modified": "2025-09-13T06:00:27Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/docker-compose-build-from-git-repo/",
      "url": "https://pype.dev/docker-compose-build-from-git-repo/",
      "title": "Docker Compose Build From Git Repo",
      "content_html": "\u003cp\u003eYou can reference a git repo in compose\u0026rsquo;s \u0026ldquo;build\u0026rdquo; argument for a service as of \u003ca href=\"https://github.com/docker/compose/pull/2430\"\u003ethis PR\u003c/a\u003e\u003c/p\u003e\n",
      "content_text": "\nYou can reference a git repo in compose's \"build\" argument for a service as of [this PR](https://github.com/docker/compose/pull/2430)\n",
      "summary": "You can reference a git repo in compose's \"build\" argument for a service as of this PR",
      "date_published": "2025-09-12T08:45:20Z",
      "date_modified": "2025-09-12T08:45:20Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "git",
        "til",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/reflection-they-can-come-for-anyone/",
      "url": "https://pype.dev/reflection-they-can-come-for-anyone/",
      "title": "Reflection - They Can Come For Anyone",
      "content_html": "\u003cp\u003eAt some point in the recent history of my country, political tensions began\nincreasing exponentially between our 2 parties, and I had hardly cared until\nright around 2021/2022. There were policies and patterns emerging in the public\nsphere that were troubling to me, and I\u0026rsquo;ve sense developed some hard opinions.\u003c/p\u003e\n\u003cp\u003eA man was just murdered for holding opinions openly that are not much different\nthan mine - at least as far as the innate divisive nature of the opinions\u0026hellip; I\nwant my country to be safe, I proudly fly the American flag, Jesus saves me\nevery day and although America isn\u0026rsquo;t a Christian nation I feel blessed that God\nput me in this country, I value open-debate, and I\u0026rsquo;ve just so happen to come to\nhold fairly right-leaning social positions\u0026hellip;\u003c/p\u003e\n\u003cdiv class=\"admonition danger\"\u003e\n\u003cp class=\"admonition-title\"\u003eand they killed this guy for it\u003c/p\u003e\n\u003cp\u003eCharlie Kirk was murdered for daring to challenge college kids around the country to think critically about what narrative they are force-fed through media and school\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eThe political landscape of America isn\u0026rsquo;t Left vs Right\u0026hellip; I mean it is, and in\nthat dichotomy unfortunately I am on the Right, but this isn\u0026rsquo;t Democratic\nvalues vs Republican values, and I\u0026rsquo;m not a Republican and most Leftists aren\u0026rsquo;t\nactually Democrats\u0026hellip; these \u0026ldquo;sides\u0026rdquo; have both been co-opted by wicked\npeople\u0026hellip; In what I\u0026rsquo;ve learned, I would\u0026rsquo;ve said Dems had it right up until the\nmid 2000s, and idk what happened but since the 10s-onward the media and\nhonestly a majority of democratic elected-officials are the ones CRANKING UP\nTHE VIOLENT RHETORIC. Conservatives are likened to Hitler in the media, Charlie\nhimself was called a faccist (what a retarded thing to say\u0026hellip; accuse the guy\nwho built his career on good-faith debate of being a police-state supporter)\nand people with national platforms are daily accusing those on the Right of\nbeing hateful simply for wanting to have debate, for not bowing down to\nidentity politics and non-arguments.\u003c/p\u003e\n\u003cp\u003eCharlie is a martyr for freedom, and a victim of the violent rhetoric the media\nhas been pushing against the Right ever since Donald Trump became the boogy-man.\u003c/p\u003e\n\u003cp\u003eI value my privacy and I believe in what I believe in\u0026hellip; I\u0026rsquo;m not ashamed to\npublically be known for any conviction I hold, but if they killed Charlie for\nanything he belived, \u003cstrong\u003ethey\u0026rsquo;d kill me too\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eAnd who is \u0026ldquo;they\u0026rdquo;? Charlie was shot 16 hours ago, I have seen no evidence that\nthe shooter was a democrat or even on the Left\u0026hellip; but what I have seen on\nsocial media is proud Leftists celebrating the killing of a young dad, husband,\nChristian, and activist for publically encouraging people to debate and to bow\nto the better argument, not the stronger more violent opponent\u0026hellip;. I don\u0026rsquo;t know\nanything about the man who pulled the trigger, but I do know that a disturbing\nnumber of people are comfortable putting their face behind a campaign of\nassassination and fear. They\u0026rsquo;re comfortable with it because it\u0026rsquo;s socially\naacceptable to call for violence against \u003cstrong\u003esome groups\u003c/strong\u003e of people, primarily\nthe one group that is constantly villianized in absolute ignorance - White\nChristian Men\u0026hellip; If you don\u0026rsquo;t agree with this then I would say you are blinded\u0026hellip;\nChristianity is openly mocked, and you wouldn\u0026rsquo;t notice if you wouldn\u0026rsquo;t\nnotice\u0026hellip; whereas other religions are so openly protected it\u0026rsquo;s become comical to me.\nWhen\u0026rsquo;s the last time you felt comfortable making a joke about Islam or Judaism\ncompared to Christianity? Even if you wouldn\u0026rsquo;t joke about any of them, you know\nyou\u0026rsquo;d be safe to criticize one publically, and the other 2 you\u0026rsquo;d face\nconsequences for. And these are the things these lunatics celebrate\u0026hellip; they\nlove that another White Christian Man was removed from God\u0026rsquo;s green earth\u0026hellip;\u003c/p\u003e\n\u003cdiv class=\"admonition warning\"\u003e\n\u003cp class=\"admonition-title\"\u003eThese poor people\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m not complaining necessarily about Christianity\u0026rsquo;s lack of priviliege in the public sphere and my heart breaks for people who hate - period\u0026hellip;. to hate someone for a difference of worldview or opinion to the point of openly celebrating their death is one of the saddest and most sickening realities I can think of.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eWhat can I do after this? Charlie was just a regular guy. It\u0026rsquo;s one thing to\nhave the attempted-assassination of Trump sweapt under the rug, or to brush it\noff as a targeted attack against a powerful man. But Charlie wasn\u0026rsquo;t a\npolitician\u0026hellip; he was just a guy with a job, who went around having\nconversations. The violence against the Right is stochastic in nature, but\nincreasingly present as public figures continue to use hitler and nazi-fueled\nlanguage against people they disagree with\u0026hellip;\u003c/p\u003e\n\u003cp\u003ePaired so closely in time with the news of \u003ca href=\"https://www.foxnews.com/us/victim-random-train-stabbing-embraced-american-dream-could-have-taken-world-storm-neighbors-say\"\u003eThe slaying of Iryna\nZarutska\u003c/a\u003e\nwho was attacked randomly by a man who, all unconfirmed allegations aside, had\nbeen arrested 14 times for violent crimes. And yet, in my country of freedom, a\nviolent criminal was free to murder a refugee fleeing a war-torn region\u0026hellip; (if\nyou watched any videos you\u0026rsquo;ll see 4 or 5 people witness the attack, and then do\nnothing as Iryna sorrowfully dies, alone and unaided in a foreign country\u0026hellip;\nthe victim of a monster)\u003c/p\u003e\n\u003cp\u003eCharlie commented on this event, I have the same feelings about the climax I\nthought it led to after years of under-reported race-fueld violence against\nwhite people, and he was called a racist just for noticing patterns\u0026hellip;\u003c/p\u003e\n\u003cp\u003eIf they shot him for saying something about any of his convictions, for\nbelieving he should be allowed to raise his family in safety, to attend church,\nand to openly debate for the sake of the better idea - they\u0026rsquo;d shoot me\nto\u0026hellip; and celebrate.\u003c/p\u003e\n\u003cp\u003eI take as much comfort as possible, however minimal, knowing that Charlie loved\nJesus, and that his family has the hope of resurrection in the name of Jesus to see\nhim again\u0026hellip; But 2 kids lost their dad, and a young woman lost her husband,\nlunatics celebrate, today is just another day, and if someone would come for a\nnormal guy like Charlie, they\u0026rsquo;d come for you too.\u003c/p\u003e\n",
      "content_text": "\nAt some point in the recent history of my country, political tensions began\nincreasing exponentially between our 2 parties, and I had hardly cared until\nright around 2021/2022. There were policies and patterns emerging in the public\nsphere that were troubling to me, and I've sense developed some hard opinions.\n\nA man was just murdered for holding opinions openly that are not much different\nthan mine - at least as far as the innate divisive nature of the opinions... I\nwant my country to be safe, I proudly fly the American flag, Jesus saves me\nevery day and although America isn't a Christian nation I feel blessed that God\nput me in this country, I value open-debate, and I've just so happen to come to\nhold fairly right-leaning social positions...\n\n!!! danger \"and they killed this guy for it\"\n\n    Charlie Kirk was murdered for daring to challenge college kids around the country to think critically about what narrative they are force-fed through media and school\n\nThe political landscape of America isn't Left vs Right... I mean it is, and in\nthat dichotomy unfortunately I am on the Right, but this isn't Democratic\nvalues vs Republican values, and I'm not a Republican and most Leftists aren't\nactually Democrats... these \"sides\" have both been co-opted by wicked\npeople... In what I've learned, I would've said Dems had it right up until the\nmid 2000s, and idk what happened but since the 10s-onward the media and\nhonestly a majority of democratic elected-officials are the ones CRANKING UP\nTHE VIOLENT RHETORIC. Conservatives are likened to Hitler in the media, Charlie\nhimself was called a faccist (what a retarded thing to say... accuse the guy\nwho built his career on good-faith debate of being a police-state supporter)\nand people with national platforms are daily accusing those on the Right of\nbeing hateful simply for wanting to have debate, for not bowing down to\nidentity politics and non-arguments.\n\nCharlie is a martyr for freedom, and a victim of the violent rhetoric the media\nhas been pushing against the Right ever since Donald Trump became the boogy-man.\n\nI value my privacy and I believe in what I believe in... I'm not ashamed to\npublically be known for any conviction I hold, but if they killed Charlie for\nanything he belived, **they'd kill me too**.\n\nAnd who is \"they\"? Charlie was shot 16 hours ago, I have seen no evidence that\nthe shooter was a democrat or even on the Left... but what I have seen on\nsocial media is proud Leftists celebrating the killing of a young dad, husband,\nChristian, and activist for publically encouraging people to debate and to bow\nto the better argument, not the stronger more violent opponent.... I don't know\nanything about the man who pulled the trigger, but I do know that a disturbing\nnumber of people are comfortable putting their face behind a campaign of\nassassination and fear. They're comfortable with it because it's socially\naacceptable to call for violence against **some groups** of people, primarily\nthe one group that is constantly villianized in absolute ignorance - White\nChristian Men... If you don't agree with this then I would say you are blinded...\nChristianity is openly mocked, and you wouldn't notice if you wouldn't\nnotice... whereas other religions are so openly protected it's become comical to me.\nWhen's the last time you felt comfortable making a joke about Islam or Judaism\ncompared to Christianity? Even if you wouldn't joke about any of them, you know\nyou'd be safe to criticize one publically, and the other 2 you'd face\nconsequences for. And these are the things these lunatics celebrate... they\nlove that another White Christian Man was removed from God's green earth...\n\n!!! warning \"These poor people\"\n\n    I'm not complaining necessarily about Christianity's lack of priviliege in the public sphere and my heart breaks for people who hate - period.... to hate someone for a difference of worldview or opinion to the point of openly celebrating their death is one of the saddest and most sickening realities I can think of.\n\nWhat can I do after this? Charlie was just a regular guy. It's one thing to\nhave the attempted-assassination of Trump sweapt under the rug, or to brush it\noff as a targeted attack against a powerful man. But Charlie wasn't a\npolitician... he was just a guy with a job, who went around having\nconversations. The violence against the Right is stochastic in nature, but\nincreasingly present as public figures continue to use hitler and nazi-fueled\nlanguage against people they disagree with...\n\nPaired so closely in time with the news of [The slaying of Iryna\nZarutska](https://www.foxnews.com/us/victim-random-train-stabbing-embraced-american-dream-could-have-taken-world-storm-neighbors-say)\nwho was attacked randomly by a man who, all unconfirmed allegations aside, had\nbeen arrested 14 times for violent crimes. And yet, in my country of freedom, a\nviolent criminal was free to murder a refugee fleeing a war-torn region... (if\nyou watched any videos you'll see 4 or 5 people witness the attack, and then do\nnothing as Iryna sorrowfully dies, alone and unaided in a foreign country...\nthe victim of a monster)\n\nCharlie commented on this event, I have the same feelings about the climax I\nthought it led to after years of under-reported race-fueld violence against\nwhite people, and he was called a racist just for noticing patterns...\n\nIf they shot him for saying something about any of his convictions, for\nbelieving he should be allowed to raise his family in safety, to attend church,\nand to openly debate for the sake of the better idea - they'd shoot me\nto... and celebrate.\n\nI take as much comfort as possible, however minimal, knowing that Charlie loved\nJesus, and that his family has the hope of resurrection in the name of Jesus to see\nhim again... But 2 kids lost their dad, and a young woman lost her husband,\nlunatics celebrate, today is just another day, and if someone would come for a\nnormal guy like Charlie, they'd come for you too.\n",
      "summary": "At some point in the recent history of my country, political tensions began increasing exponentially between our 2 parties, and I had hardly cared until...",
      "date_published": "2025-09-11T05:34:00Z",
      "date_modified": "2025-09-11T05:34:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "politics",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2025-09-11-notes/",
      "url": "https://pype.dev/2025-09-11-notes/",
      "title": "2025-09-11 Notes",
      "content_text": "\nyesterday: [[ 2025-09-10-notes ]]\n\n## Reflection\n\n- [[reflection-they-can-come-for-anyone]]\n\n## Soonish\n\n- started mapping out models\n- new name potential | notifiq\n",
      "summary": "yesterday: 2025-09-10-notes",
      "date_published": "2025-09-11T05:33:26Z",
      "date_modified": "2025-09-11T05:33:26Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/2025-09-10-notes/",
      "url": "https://pype.dev/2025-09-10-notes/",
      "title": "2025-09-10 Notes",
      "content_text": "\nyesterday: [[ 2025-09-09-notes ]]\n\n## Projects\n\n- we're going to start real work on this event notifications idea\n  - [[event-details-updates-via-notifications-as-a-service]]\n\n\n",
      "summary": "yesterday: 2025-09-09-notes",
      "date_published": "2025-09-10T09:24:28Z",
      "date_modified": "2025-09-10T09:24:28Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/that-guy-can-do-anything/",
      "url": "https://pype.dev/that-guy-can-do-anything/",
      "title": "That Guy Can Do Anything",
      "content_html": "\u003cp\u003e\u0026ldquo;That guy can do anything!\u0026rdquo; sounds nice, right? What if it didn\u0026rsquo;t matter\u0026hellip; what if you draw corporate cat-calls for your sexy skills, excel every year, receieve accolades but you were told to change everything for no reason or else be fired\u0026hellip;\u003c/p\u003e\n",
      "content_text": "\n\"That guy can do anything!\" sounds nice, right? What if it didn't matter... what if you draw corporate cat-calls for your sexy skills, excel every year, receieve accolades but you were told to change everything for no reason or else be fired...\n",
      "summary": "\"That guy can do anything!\" sounds nice, right? What if it didn't matter... what if you draw corporate cat-calls for your sexy skills, excel every year,...",
      "date_published": "2025-09-10T09:11:20Z",
      "date_modified": "2025-09-10T09:11:20Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "rto",
        "note"
      ]
    },
    {
      "id": "https://pype.dev/2025-09-09-notes/",
      "url": "https://pype.dev/2025-09-09-notes/",
      "title": "2025-09-09 Notes",
      "content_text": "\nyesterday: [[ 2025-09-08-notes ]]\n\n## Reflection\n\n\n\n## Projects\n\n- Came across the idea of a [micro-saas](https://www.msthgn.com/articles/the-micro-saas-revolution-from-giants-to-solopreneurs) today... gives me quite a bit of hope for [[homelab-as-a-service]] ideas\n\n## Writing\n\n- [[that-guy-can-do-anything]]\n",
      "summary": "yesterday: 2025-09-08-notes",
      "date_published": "2025-09-09T05:58:08Z",
      "date_modified": "2025-09-09T05:58:08Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-831/",
      "url": "https://pype.dev/thoughts-831/",
      "title": "💭 uv script management",
      "content_text": "\n\u003ca href=\"https://waylonwalker.com/uv-script-management/##sed+-i+'1i+#!/usr/bin/env+-S+uv+run+--script'+up\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://waylonwalker.com/uv-script-management/##sed+-i+'1i+#!/usr/bin/env+-S+uv+run+--script'+up\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - uv script management\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://waylonwalker.com/uv-script-management/##sed+-i+'1i+#!/usr/bin/env+-S+uv+run+--script'+up\"\u003euv script management\u003c/a\u003e\n\n---\n\nDang Waylon! Love these few lines... `uv` is great, been using it for environment and project requirements management but I didn't realize it was this easy to setup a pep 723 compliant script!\n\nLove this `sed -i '1i #!/usr/bin/env -S uv run --script'` little gem too - I typically do `uv run script.py` so I'll see about making this a simple zsh alias for faster iteration on python scripts... I often have AI write quick bash scripts to accomplish things, but it's quite a bit harder for me to read than python, and with the power `uv` is bringing to the python ecosystem, maybe it's fine to just be a little higher in the programming stack for script-kitty stuff\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "Dang Waylon! Love these few lines... uv is great, been using it for environment and project requirements management bu",
      "date_published": "2025-09-08T11:25:33Z",
      "date_modified": "2025-09-08T11:25:33Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "uv",
        "python",
        "dev",
        "tech",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/zsh-alias-for-uv-scripts/",
      "url": "https://pype.dev/zsh-alias-for-uv-scripts/",
      "title": "Zsh alias for uv scripts",
      "content_html": "\u003cp\u003eIt\u0026rsquo;s apparently advantageous for uv to have a specific shebang set that \u003ccode\u003euv init\u003c/code\u003e doesn\u0026rsquo;t add, no problem, we can have a zsh alias for it\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ealias\u003c/span\u003e add-shebang\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;f(){ \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e  if [[ ! -s $1 ]]; then \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e    echo \u0026#34;#!/usr/bin/env -S uv run --script\u0026#34; \u0026gt; \u0026#34;$1\u0026#34;; \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e  elif head -n1 \u0026#34;$1\u0026#34; | grep -q \u0026#34;^#!\u0026#34;; then \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e    echo \u0026#34;Shebang already present in $1\u0026#34;; \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e  else \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e    sed -i \u0026#34;1i #!/usr/bin/env -S uv run --script\u0026#34; \u0026#34;$1\u0026#34;; \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e  fi\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e}; f\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThen if you have a python script from \u003ccode\u003euv init --script\u003c/code\u003e you can \u003ccode\u003eadd-shebang myscript.py\u003c/code\u003e to add the shebang.\u003c/p\u003e\n",
      "content_text": "\nIt's apparently advantageous for uv to have a specific shebang set that `uv init` doesn't add, no problem, we can have a zsh alias for it\n\n\n```bash\nalias add-shebang='f(){ \n  if [[ ! -s $1 ]]; then \n    echo \"#!/usr/bin/env -S uv run --script\" \u003e \"$1\"; \n  elif head -n1 \"$1\" | grep -q \"^#!\"; then \n    echo \"Shebang already present in $1\"; \n  else \n    sed -i \"1i #!/usr/bin/env -S uv run --script\" \"$1\"; \n  fi\n}; f'\n```\n\nThen if you have a python script from `uv init --script` you can `add-shebang myscript.py` to add the shebang.\n\n",
      "summary": "It's apparently advantageous for uv to have a specific shebang set that doesn't add, no problem, we can have a zsh alias for it",
      "date_published": "2025-09-08T06:33:13Z",
      "date_modified": "2025-09-08T06:33:13Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "python",
        "til",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/2025-09-08-notes/",
      "url": "https://pype.dev/2025-09-08-notes/",
      "title": "2025-09-08 Notes",
      "content_text": "\nyesterday: [[ 2025-09-06-notes ]]\n\n## Reflection\n\n- Discussed with Andrew the discomfort I felt this morning reading Spurgeon's\nreflection on Hosea 14:8\n  - The basic takeaways from that are commentary and reflection are different,\n  and reflection isn't expository teaching\n  - I have a significant sensitivity to putting thoughts on the Bible out there\n  for people to misinterpret, I blog here but hopefully no one comes to any of\n  my posts with \"Reflection\" in the title and expects theological education...\n  - So this is a good thing to think about, or just be aware of in future\n  conversations - \"devotional\" is a very common word in Christian circles but\n  this morning it became clear that I have had a slightly different definition\n  than perhaps most of my Christian counterparts (not that my understanding was\n  correct - in fact it became clear this morning that it isn't)\n  - Overall though, by God's grace, his Word does speak to people differently,\n  and although we should exercise caution with any application, I cannot deny\n  that God speaks to others in ways that he doesn't speak to me, and praise God\n  he loves us enough to reach out in ways appropriate for each individual\n\n\n",
      "summary": "yesterday: 2025-09-06-notes",
      "date_published": "2025-09-08T05:42:27Z",
      "date_modified": "2025-09-08T05:42:27Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-830/",
      "url": "https://pype.dev/thoughts-830/",
      "title": "💭 Engineering excellence starts on edge",
      "content_text": "\n\u003ca href=\"https://world.hey.com/dhh/engineering-excellence-starts-on-edge-c36e4c59\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://world.hey.com/dhh/engineering-excellence-starts-on-edge-c36e4c59\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - Engineering excellence starts on edge\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://world.hey.com/dhh/engineering-excellence-starts-on-edge-c36e4c59\"\u003eEngineering excellence starts on edge\u003c/a\u003e\n\n---\n\nI have become a huge DHH fan, maybe that means I'm just a basic bish but as I've become aware of who he has I haven't yet disagreed with much that he has to say... And fortunately or unfortuntaely that remanins true with this post about getting involved \"at the edge\". \n\nI feel like I bounce between \"give me bleeding edge\" and \"give me unshakable stability\" on the daily, and there's probably a time and place for both... I think I am prone to take on initial viewpoints and so I don't want to abandon my desire for stability, but man... maybe running Arch wouldn't be that bad, maybe a release-candidate container for an app at home here or there would be an interesting way to give back even a fraction to the FOSS community.\n\nI try to open issues on GH and such when things happen, but I could take a more proactive approach especially with the software that I use more regularly...\n\nThanks DHH for posting these thoughts, keep em coming!\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "I have become a huge DHH fan, maybe that means I'm just a basic bish but as I've become aware of who he has I haven't ye",
      "date_published": "2025-09-06T11:27:07Z",
      "date_modified": "2025-09-06T11:27:07Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "engineering",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/reflection-on-philippians-2-14-18/",
      "url": "https://pype.dev/reflection-on-philippians-2-14-18/",
      "title": "Reflection on Philippians 2:14-18",
      "content_text": "\n!!! note \"Philippians 2:15-18\"\n\n    14 Do all things without grumbling and disputing, 15 in order that you may\n    become blameless and innocent, children of God without fault in the midst of a\n    crooked and perverted generation, among whom you shine as stars in the world,\n    16 holding fast to the word of life, for a source of pride to me in the day of\n    Christ, that I did not run in vain or labor in vain. 17 But even if I am being\n    poured out as a drink offering on the sacrifice and service of your faith, I\n    rejoice and rejoice with all of you. 18 And in the same way also you rejoice\n    and rejoice with me. \n\n\"Do all things without grumbling and disputing\"... now, taking verses out of\ncontext is one of my biggest pet-peeves in Christian circles (and non-Christian\nas well I suppose, but when non-believers who read 4 pages of the Bible 20\nyears ago try to tell me what anything means I can kindly ask them to keep\ntheir illiteracy to themselves)\n\nHowever! With my brothers and sisters, there's no such ask - if we all call on\nJesus then we will edifiy and educate one another on appropriate applications\nof the inspired word of God.\n\nWith that said... dang do I grumble a lot about work... at least lately. I\nbelieve that nearly everyone I work with knows my worldview, I don't think\nanyone who spends a few days, maybe even hours (by God's grace) will know who I\nserve just by my languge and verbiage. But I'm not a prime example of Christian\nliving (yet... hopefully). I had been [[reflecting-on-romans-7-7-13]] for\nseveral days and the \"sin in me\" is what I see come out when I let my guard\ndown against letting strife and anger enter my heart.\n\nI read this passage and found myself immediately focused on \"in the midst of a\ncrooked and perverted generation\" because our generation is disgusting... I\nknow immorality and public perverted-ness was present in the before-fore times,\nbut I have to imagine that Paul and the other NT writers couldn't have imagined\nthe kind of disgusting perverted anti-nature nonsense that is everywhere in our\nsociety. We celebrate sex over everything, and a twisted understanding of sex\nfor that matter... My daughter's are growing up in a world where I feel the\nneed to practice constant vigilence against the evil forces in the world that\nwould seek to them and twist their understanding of themselves into nothing\nmore than objects of desire and consumption... And ya know what, that's a\nworthy thing to meditate on and prepare for.\n\nBut it's not what my heart needs... My girls are relatively safe (for the time\nbeing) but everyday I face the sin of my own heart, it's crouching at the door,\nand should not that be my higher concern?\n\nI even notice now in this reflection that my mind is drawn away from myself,\nand it is difficult to follow the Lord in meditation... perhaps it's too noisey\nbut perhaps I'm looking for too much...\n\nThis day I choose whom I will serve, and by God's grace it's the King Jesus...\nHelp my unbelief and still the grumbling in my life.\n",
      "summary": "!!! note \"Philippians 2:15-18\"",
      "date_published": "2025-09-06T07:12:55Z",
      "date_modified": "2025-09-06T07:12:55Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "reflection",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2025-09-06-notes/",
      "url": "https://pype.dev/2025-09-06-notes/",
      "title": "2025-09-06 Notes",
      "content_text": "\nyesterday: [[ 2025-09-05-notes ]]\n\n## Reflection\n\n- [[reflection-on-philippians-2-14-18]]\n\n",
      "summary": "yesterday: 2025-09-05-notes",
      "date_published": "2025-09-06T07:01:46Z",
      "date_modified": "2025-09-06T07:01:46Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/2025-09-05-notes/",
      "url": "https://pype.dev/2025-09-05-notes/",
      "title": "2025-09-05 Notes",
      "content_text": "\nyesterday: [[ 2025-09-03-notes ]]\n\n## Writing\n\n- wrapped up [[write-in-to-the-hybrid-cloud-show]]\n\n\n",
      "summary": "yesterday: 2025-09-03-notes",
      "date_published": "2025-09-05T08:48:16Z",
      "date_modified": "2025-09-05T08:48:16Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/2025-09-03-notes/",
      "url": "https://pype.dev/2025-09-03-notes/",
      "title": "2025-09-03 Notes",
      "content_text": "\nyesterday: [[ 2025-09-02-notes ]]\n\n## Reflection\n\n- it's been a few days... pick the torch up again tomorrow with morning and evening\n\n## TOODs\n\n- update the Sch. (friends) loan to pause to Dec.\n\n## Runescape\n\n- Did many things today - working on slayer stuff. Mazchna is the Slayer Master I should talk to, but I have to do `priest in peril` first, which I'll finish tonight\n- Doing [The Fremennik Trials](https://oldschool.runescape.wiki/w/The_Fremennik_Trials) quest now, it's a bit longer but I need that sweet [Farseer Helm](https://oldschool.runescape.wiki/w/Farseer_helm) for the ranged/magic bonus!\n",
      "summary": "yesterday: 2025-09-02-notes",
      "date_published": "2025-09-03T05:54:02Z",
      "date_modified": "2025-09-03T05:54:02Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/apprise/",
      "url": "https://pype.dev/apprise/",
      "title": "apprise",
      "content_html": "\u003cp\u003eApprise - github project that\u0026rsquo;s awesome about notifications\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/caronc/apprise\"\u003egithub repo\u003c/a\u003e\u003c/p\u003e\n",
      "content_text": "\nApprise - github project that's awesome about notifications\n\n[github repo](https://github.com/caronc/apprise)\n",
      "summary": "Apprise - github project that's awesome about notifications",
      "date_published": "2025-09-02T17:13:09Z",
      "date_modified": "2025-09-02T17:13:09Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "glossary"
      ]
    },
    {
      "id": "https://pype.dev/2025-09-02-notes/",
      "url": "https://pype.dev/2025-09-02-notes/",
      "title": "2025-09-02 Notes",
      "content_text": "\nyesterday: [[ 2025-09-01-notes ]]\n\n## Runescape\n\n- membership coming soon... I've exhaused free-to-play quests (minus 1 I'm waiting on Rob to do together)\n  - gotta get me some of that magic armor!\n  ![20250902125558_86a32cd7.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250902125558_86a32cd7.png)\n\n## Projects\n\n- need to chip away bit by bit on [[homelab-as-a-service]]\n- talked with [waylon](https://waylonwalker.com) about a few neat ideas today to maybe throw into the ether\n  - [[event-details-updates-via-notifications-as-a-service]]\n  - [[compose-stack-example-repo-x-package-manager]]\n",
      "summary": "yesterday: 2025-09-01-notes",
      "date_published": "2025-09-02T07:53:49Z",
      "date_modified": "2025-09-02T07:53:49Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/pinchflat/",
      "url": "https://pype.dev/pinchflat/",
      "title": "Pinchflat",
      "content_html": "\u003cp\u003ePinchflat is a self-hostable YouTube media downloader\u003c/p\u003e\n",
      "content_text": "\nPinchflat is a self-hostable YouTube media downloader\n",
      "summary": "Pinchflat is a self-hostable YouTube media downloader",
      "date_published": "2025-09-01T20:20:58Z",
      "date_modified": "2025-09-01T20:20:58Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "glossary"
      ]
    },
    {
      "id": "https://pype.dev/2025-09-01-notes/",
      "url": "https://pype.dev/2025-09-01-notes/",
      "title": "2025-09-01 Notes",
      "content_text": "\nyesterday: [[ 2025-08-31-notes ]]\n\n## Projects\n\n- I started a notes page for my [[homelab-as-a-service]] idea... idk what to name it and I don't love this but I can't keep scattered notes on each of my dailys here...\n\n- Used [[pinchflat]] to download the python doc - made a \"dev\" youtube playlist to start brining down to the lab\n\n",
      "summary": "yesterday: 2025-08-31-notes",
      "date_published": "2025-09-01T07:04:07Z",
      "date_modified": "2025-09-01T07:04:07Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/reflection-morning-august-31-2025/",
      "url": "https://pype.dev/reflection-morning-august-31-2025/",
      "title": "Reflection - Morning August 31 2025",
      "content_html": "\u003ch2 id=\"morning-august-31\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMorning, August 31\u003c/span\u003e \u003ca href=\"#morning-august-31\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e“On mine arm shall they trust.\u0026quot;\n—Isaiah 51:5\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eSpurgeon: Morning and Evening\u003c/p\u003e\n\u003cp\u003eIn seasons of severe trial, the Christian has nothing on earth that he can\ntrust to, and is therefore compelled to cast himself on his God alone. When his\nvessel is on its beam-ends, and no human deliverance can avail, he must simply\nand entirely trust himself to the providence and care of God. Happy storm that\nwrecks a man on such a rock as this! O blessed hurricane that drives the soul\nto God and God alone! There is no getting at our God sometimes because of the\nmultitude of our friends; but when a man is so poor, so friendless, so helpless\nthat he has nowhere else to turn, he flies into his Father’s arms, and is\nblessedly clasped therein! When he is burdened with troubles so pressing and so\npeculiar, that he cannot tell them to any but his God, he may be thankful for\nthem; for he will learn more of his Lord then than at any other time. Oh,\ntempest-tossed believer, it is a happy trouble that drives thee to thy Father!\nNow that thou hast only thy God to trust to, see that thou puttest thy full\nconfidence in him. Dishonour not thy Lord and Master by unworthy doubts and\nfears; but be strong in faith, giving glory to God. Show the world that thy God\nis worth ten thousand worlds to thee. Show rich men how rich thou art in thy\npoverty when the Lord God is thy helper. Show the strong man how strong thou\nart in thy weakness when underneath thee are the everlasting arms. Now is the\ntime for feats of faith and valiant exploits. Be strong and very courageous,\nand the Lord thy God shall certainly, as surely as he built the heavens and the\nearth, glorify himself in thy weakness, and magnify his might in the midst of\nthy distress. The grandeur of the arch of heaven would be spoiled if the sky\nwere supported by a single visible column, and your faith would lose its glory\nif it rested on anything discernible by the carnal eye. May the Holy Spirit\ngive you to rest in Jesus this closing day of the month.\u003c/p\u003e\n\u003cp\u003eSpurgeon, C. H. (1896). Morning and evening: Daily readings. Passmore \u0026amp; Alabaster.\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"reflection\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eReflection\u003c/span\u003e \u003ca href=\"#reflection\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eBy God\u0026rsquo;s grace, I was led this morning through my old Logos dashboard to the evening and morning or the morning and reading daily readings from Charles Spurgeon.\nAnd today, August 31, the morning reading is\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eIsaiah 51:5\u003c/p\u003e\n\u003cp\u003e\u0026ldquo;on mine arm, shall they trust.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eAnd it\u0026rsquo;s a short few words, but Spurgeon writes quite a bit about it.\nAnd there\u0026rsquo;s many quotes from this short morning reflection that are very relevant to me in light of my work situation.\nOne of the things there I\u0026rsquo;ve been processing the most is the powerlessness I feel in regards to corporate policy and the control\nthat my employer wants to exercise over my life.\nBut the other side of that coin of control is me and me placing my trust in my employer to provide security for me.\nAnd God has been very good to me and still has given me security outside of my primary job.\nBut I did trust that job.\nAnd it\u0026rsquo;s in the wake of losing it.\nI\u0026rsquo;m not even stretched that thin in losing my job.\nBut in the stretching that is taking place, Spurgeon says some things about God that I should impress into my heart.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eOh, blessed hurricane that drives the soul to God and God alone.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eShould we not consider trials - Joy?\nI\u0026rsquo;m sure not acting that joyful.\nBut God has been very sweet to me through these reflections, through drawing my eye and soul to him through the lens of trust.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThere is no getting at our God sometimes because of the multitude of our friends. But when a man is so poor, so friendless, so helpless that he has nowhere else to turn, he flies into his father\u0026rsquo;s arms and is blessedly clasped therein.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eSpurgeon clearly isn\u0026rsquo;t saying we can\u0026rsquo;t have friends here.\nI think what he is saying is \u0026ldquo;the multitude of our {idols}\u0026rdquo;, really.\nLike Job\u0026rsquo;s friends, maybe, the ones who keep our attention on work and the world and money and my 401k and the future.\nThose things are my \u0026ldquo;\u003cstrong\u003efriends\u003c/strong\u003e\u0026rdquo; because those things give me security.\nAnd maybe I have trusted too much, and now God is drawing me closer to him.\nAnd may I say, blessed be the name of the Lord who gives and takes away.\nO blessed hurricane that drives the soul to God and God alone.\nAmen.\u003c/p\u003e\n",
      "content_text": "\n\n## Morning, August 31\n\n“On mine arm shall they trust.\"\n—Isaiah 51:5\n\n!!! note \"Spurgeon: Morning and Evening\"\n\n    In seasons of severe trial, the Christian has nothing on earth that he can\n    trust to, and is therefore compelled to cast himself on his God alone. When his\n    vessel is on its beam-ends, and no human deliverance can avail, he must simply\n    and entirely trust himself to the providence and care of God. Happy storm that\n    wrecks a man on such a rock as this! O blessed hurricane that drives the soul\n    to God and God alone! There is no getting at our God sometimes because of the\n    multitude of our friends; but when a man is so poor, so friendless, so helpless\n    that he has nowhere else to turn, he flies into his Father’s arms, and is\n    blessedly clasped therein! When he is burdened with troubles so pressing and so\n    peculiar, that he cannot tell them to any but his God, he may be thankful for\n    them; for he will learn more of his Lord then than at any other time. Oh,\n    tempest-tossed believer, it is a happy trouble that drives thee to thy Father!\n    Now that thou hast only thy God to trust to, see that thou puttest thy full\n    confidence in him. Dishonour not thy Lord and Master by unworthy doubts and\n    fears; but be strong in faith, giving glory to God. Show the world that thy God\n    is worth ten thousand worlds to thee. Show rich men how rich thou art in thy\n    poverty when the Lord God is thy helper. Show the strong man how strong thou\n    art in thy weakness when underneath thee are the everlasting arms. Now is the\n    time for feats of faith and valiant exploits. Be strong and very courageous,\n    and the Lord thy God shall certainly, as surely as he built the heavens and the\n    earth, glorify himself in thy weakness, and magnify his might in the midst of\n    thy distress. The grandeur of the arch of heaven would be spoiled if the sky\n    were supported by a single visible column, and your faith would lose its glory\n    if it rested on anything discernible by the carnal eye. May the Holy Spirit\n    give you to rest in Jesus this closing day of the month.\n\n    Spurgeon, C. H. (1896). Morning and evening: Daily readings. Passmore \u0026 Alabaster.\n\n## Reflection\n\nBy God's grace, I was led this morning through my old Logos dashboard to the evening and morning or the morning and reading daily readings from Charles Spurgeon.\nAnd today, August 31, the morning reading is\n\n!!! note \"Isaiah 51:5\" \n\n    \"on mine arm, shall they trust.\n\nAnd it's a short few words, but Spurgeon writes quite a bit about it.\nAnd there's many quotes from this short morning reflection that are very relevant to me in light of my work situation.\nOne of the things there I've been processing the most is the powerlessness I feel in regards to corporate policy and the control\nthat my employer wants to exercise over my life.\nBut the other side of that coin of control is me and me placing my trust in my employer to provide security for me.\nAnd God has been very good to me and still has given me security outside of my primary job.\nBut I did trust that job.\nAnd it's in the wake of losing it.\nI'm not even stretched that thin in losing my job.\nBut in the stretching that is taking place, Spurgeon says some things about God that I should impress into my heart.\n\n\u003e Oh, blessed hurricane that drives the soul to God and God alone.\n\nShould we not consider trials - Joy?\nI'm sure not acting that joyful.\nBut God has been very sweet to me through these reflections, through drawing my eye and soul to him through the lens of trust.\n\n\u003e There is no getting at our God sometimes because of the multitude of our friends. But when a man is so poor, so friendless, so helpless that he has nowhere else to turn, he flies into his father's arms and is blessedly clasped therein.\n\nSpurgeon clearly isn't saying we can't have friends here.\nI think what he is saying is \"the multitude of our {idols}\", really.\nLike Job's friends, maybe, the ones who keep our attention on work and the world and money and my 401k and the future.\nThose things are my \"__friends__\" because those things give me security.\nAnd maybe I have trusted too much, and now God is drawing me closer to him.\nAnd may I say, blessed be the name of the Lord who gives and takes away.\nO blessed hurricane that drives the soul to God and God alone.\nAmen.\n\n",
      "summary": "“On mine arm shall they trust.\" —Isaiah 51:5",
      "date_published": "2025-08-31T06:46:06Z",
      "date_modified": "2025-08-31T06:46:06Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "reflection",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2025-08-31-notes/",
      "url": "https://pype.dev/2025-08-31-notes/",
      "title": "2025-08-31 Notes",
      "content_text": "\nyesterday: [[ 2025-08-29-notes ]]\n\n## Writing\n\n- [[old-school-runescape-runelite-plugins]]\n\n## $HOME\n\nI don't know what to call my opinionated homelab distribution yet but I will try to have some goals for today or tomorrow for simple steps\n  - drawing up all the pieces will take a while but is necessary\n  - ansible playbook to make zfs datasets for vms or containers is easy first utility to bank somewhere\n\n## Reflection\n\n- I have enjoyed the last 2-ish weeks of [[reflecting-on-romans-7-7-13]]\n- Since that was such a beneficial exercise I will take a week or so on another passage... \n  - But I'm not sure what to do... \n  - [[reflection-morning-august-31-2025]]\n\n## Hybrid Cloud Show Response\n\n- Working on this in speakr (what an amazing tool!)\n",
      "summary": "yesterday: 2025-08-29-notes",
      "date_published": "2025-08-31T06:22:56Z",
      "date_modified": "2025-08-31T06:22:56Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/old-school-runescape-runelite-plugins/",
      "url": "https://pype.dev/old-school-runescape-runelite-plugins/",
      "title": "Old School Runescape Runelite Plugins",
      "content_text": "\nI've been enjoying my time back in Old School Runescape. Such a classic for me.\nThe landscape has changed a lot since 2006 though. There's clients and plugins\ngalore now, no more being limited to a web browser with 1 minute logout timer! \n\nI started a bit in [[runescape-clients-and-settings]] and in the last several\ndays I've discovered a few more things that I like.\n\n## Logout\n\nThere's not a lot of AFK opportunities in OSRS but there are more than there\nused to be. The primary one is splashing to gain magic xp. It's slow but AFK\nfor as long as you can be. On mobile the logout setting can be changed to 25\nminutes so it's easy to leave the game running on my phone for the sake of\nleveling up a bit. \n\nBut I prefer to play on desktop because it's so much more beautiful with the HD\n117 GPU plugin noted in [[runescape-clients-and-settings#GPU]]. And thankfully\nthat 25 minute logout timer can be set in this client too!\n\n![20250831111601_dc41f9e9.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250831111601_dc41f9e9.png)\n\n![20250831111628_24c41fea.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250831111628_24c41fea.png)\n\n## Left Click Drop\n\nWhen power leveling in things like `fishing` or `woodcutting` it's tempting to\npair it with leveling in `cooking` and `firemaking` but the walking time\nbetween fishing, trees, fire etc. does really add up over days and weeks of\nplaying. There are many tactics, but if money is no object (ie. you're not\ntrying to bank a ton of gold right now) then you can focus on fishing or\nchopping trees and simply dropping inventory as it fills up. This required\nright-click, select drop, click for every item in your inventory which is so\ntedious.\n\nLuckily there's a plugin for this!\n\n![20250831111952_a71baef2.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250831111952_a71baef2.png)\n\nAs you can see you just type the name of the items you want the default\nleft-click to `drop` and I have `willow logs` etc. in here from a few leveling\nsessions recently\n\n### Example\n\nBy default take this example of `wear Zammorak monk bottom`\n\n![20250831113557_5da3dbac.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250831113557_5da3dbac.png)\n\n![20250831113653_3acbcb94.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250831113653_3acbcb94.png)\n\nI would never actually want to default drop this item, but let's say I did!\n\n![20250831113747_9d846f0c.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250831113747_9d846f0c.png)\n\n![20250831113815_4e9b7ca2.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250831113815_4e9b7ca2.png)\n\nNow the default left-click is `drop` - super easy\n\n## Screenshot\n\nI JUST found this one! There's a screenshot plugin to give you more standardized screenshots of in-game activity...\n\n![20250831113238_04accffb.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250831113238_04accffb.png)\n\nAnd then an example of that plugin's screenshot:\n\n![20250831113350_7049366c.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250831113350_7049366c.png)\n\n## Others\n\nSome noteable others are:\n\n- HD 117 GPU plugin (as noted in [[runescape-clients-and-settings#GPU]])\n- `skills progress` shows useful information about the skill you're leveling as an overlay\n- `Quest Helper` is huge for me because some of the runescape quests are\nlegitimately challening, and I'm really here for dad mode... so the quest\nhelper is a lifesaver\n",
      "summary": "I've been enjoying my time back in Old School Runescape. Such a classic for me. The landscape has changed a lot since 2006 though. There's clients and...",
      "date_published": "2025-08-31T06:11:26Z",
      "date_modified": "2025-08-31T06:11:26Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "runescape",
        "gaming"
      ]
    },
    {
      "id": "https://pype.dev/2025-08-29-notes/",
      "url": "https://pype.dev/2025-08-29-notes/",
      "title": "2025-08-29 Notes",
      "content_text": "\nyesterday: [[ 2025-08-28-notes ]]\n\n## Homelab\n\n- started chatting with jipity about some automation... I have so many ideas that circle my head and I have a hard time implementing anything for fear of committing halfway to something... \n- I think I can take baby steps to mitigate that issue and one way is to automate the first thing that annoys me - zfs dataset creation for new apps. I assume that I want a new zfs dataset if I'm going to provision something into my homelab so that means\n  - dataset creation on the appropriate node\n  - permissions\n  - updates to `zfs-ops` (eventually dataops in homelab-mono) for the backup to be added explicitly (or removed if I'm removing one - for example some old VM datasets I no longer need)\n\n- I also mind-dumped after starting the convo with jipity, using speakr to get a short summary of a brain dump is pretty awesome especially considering the purely local self-hosted nature. Here's the summary of a pretty concentrated 6 minute monologue on things I'm thinking about:\n  - Summary is imperfect - but again, for self-hosted hardware and getting purely private LLM-assisted brainstorming is really cool. However, I do plan on sinking some thought into the big boys (claude or jippity) as I very slowly begin construction\n\nKey Issues Discussed\n\n    Platform and service idea for consulting\n    Product as an opinionated home lab targeting small teams or on-prem setups with Docker Swarm + ZFS\n    Focus on privacy, data ownership, compute ownership while providing cloud options (AWS)\n    Hardware recommendations part of services\n    Use AWS resources when possible but self-hosting is also viable option\n    Tail scale for business networking and network ACLs provided by the vendor\n\nKey Decisions Made\n\n    Deploy servers using Docker Swarm + ZFS with an opinionated approach to data management, backups, application deployment monitoring.\n    Cloud options include Terraform set up in AWS (and possibly Azure later)\n    Use U-Corps as a base for containers on top of Ubuntu distro box; consider KeyCloak or Aphalia for authentication\n    DNS and public services will be handled with NameCheap and Cloudflare using Terraform, not picking each other’s features.\n    CERT management is Let’s Encrypt\n    Observability through Harbor telemetry data gathering\n",
      "summary": "yesterday: 2025-08-28-notes",
      "date_published": "2025-08-29T08:56:49Z",
      "date_modified": "2025-08-29T08:56:49Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/2025-08-28-notes/",
      "url": "https://pype.dev/2025-08-28-notes/",
      "title": "2025-08-28 Notes",
      "content_text": "\nyesterday: [[ 2025-08-27-notes ]]\n\n## Reflection\n\n- [[reflecting-on-romans-7-7-13#Round 5]]\n\n## Wins\n\n- time-boxing is definitely helpful, even with meetings going over and getting side-tracked\n- The inflection point I mentioned in [[reflection-ai-work-and-adhd]] is continuing to flex... I noticed today decisions being made with the paramount motivation being \"I am finally just tired of \u003cwhat I've historically been doing in X\u003e\"\n  - Feels like I'm taking just a few days of consistent steps in the direction that my \"inner-man\" wants to go. Inconsistencies persist, nothing for it but to keep stepping.\n\n\n\n",
      "summary": "yesterday: 2025-08-27-notes",
      "date_published": "2025-08-28T05:15:38Z",
      "date_modified": "2025-08-28T05:15:38Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/awesome/",
      "url": "https://pype.dev/awesome/",
      "title": "Awesome",
      "content_html": "\u003ch1 id=\"awesome\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAwesome\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eThere\u0026rsquo;s some things I find awesome online - here is a list of those things\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\u003ca href=\"https://latenightlinux.com/hcs37/\"\u003eHybrid Cloud Show | Episode 37\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThis episode was very emotional for me, and one of the few non-theological\npodcasts I\u0026rsquo;ve listened to more than once. The guy\u0026rsquo;s conversation sparks so many\nmemories from my journey from data scientist to platform engineer\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\u003ca href=\"https://2.5admins.com/2-5-admins-100/\"\u003e2.5 Admins | Episode 100\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThis episode is on my list because of a shotout. A friend wrote in asking\nadvice on my behalf regarding a sppedtest I let run as a cronjob on a server\nfor a week that resulted in downloading over 1TB of data in the span of 7 days\u003c/p\u003e\n",
      "content_text": "\n# Awesome\n\nThere's some things I find awesome online - here is a list of those things\n\n---\n\n[Hybrid Cloud Show | Episode 37](https://latenightlinux.com/hcs37/)\n\nThis episode was very emotional for me, and one of the few non-theological\npodcasts I've listened to more than once. The guy's conversation sparks so many\nmemories from my journey from data scientist to platform engineer\n\n---\n\n[2.5 Admins | Episode 100](https://2.5admins.com/2-5-admins-100/)\n\nThis episode is on my list because of a shotout. A friend wrote in asking\nadvice on my behalf regarding a sppedtest I let run as a cronjob on a server\nfor a week that resulted in downloading over 1TB of data in the span of 7 days\n",
      "summary": "There's some things I find awesome online - here is a list of those things",
      "date_published": "2025-08-27T20:58:00Z",
      "date_modified": "2025-08-27T20:58:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "slash"
      ]
    },
    {
      "id": "https://pype.dev/reflection-ai-work-and-adhd/",
      "url": "https://pype.dev/reflection-ai-work-and-adhd/",
      "title": "Reflection - AI Work and ADHD",
      "content_html": "\u003ch2 id=\"reflection\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eReflection\u003c/span\u003e \u003ca href=\"#reflection\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIt\u0026rsquo;s time to be more devoted to my work\u0026hellip; AI has been a cool technology to\nwatch and experience but one thing I\u0026rsquo;m allowing it to do to me is to kill my love for\nbuilding\u0026hellip; I feel like I\u0026rsquo;m arriving where I\u0026rsquo;ve already seen many talented\ndevelopers get to -\u003c/p\u003e\n\u003cdiv class=\"admonition danger\"\u003e\n\u003cp class=\"admonition-title\"\u003erealization\u003c/p\u003e\n\u003cp\u003eAI is not magic, it\u0026rsquo;s a headache.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eDon\u0026rsquo;t get me wrong, targeted and focused use of LLMs, with careful planning and\ntime-boxing can be great, and has been for me. But I am a creature and prone to\ntake the path of least resistance, and in many cases I\u0026rsquo;m just letting the LLM\ndo the work. This is where the ADHD element from the title comes into play.\nNow, I\u0026rsquo;m not blaming ADHD for me being lazy, because I\u0026rsquo;m not sure laziness is\nthe fairest descriptor of where I\u0026rsquo;ve been lately. A common issue for those with\nADHD, maybe even the defining characteristic, is the black-hole that\u0026rsquo;s present in the space\nwhere motiviation and reward belong in the brain. I\u0026rsquo;ve resonated with this thought for much of my life:\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eFulfilled or Relieved\u003c/p\u003e\n\u003cp\u003eWhen I finish tasks, I\u0026rsquo;m not fulfilled\u0026hellip; if anything I\u0026rsquo;m relieved.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eThis is a core issue I am seeking to address in my life, and I guess in\nreal-time reflection I should thank the hellscape of AI and LLMs for surfacing\nthis pattern in my make-up today instead of when I\u0026rsquo;m in my 40s or 50s.\u003c/p\u003e\n\u003cp\u003eSo where I\u0026rsquo;ve been is that I\u0026rsquo;ll let an LLM write code and then I\u0026rsquo;ll attempt to\nbe validating the tests or example scripts I prompt it to generate, get\ncomfortable with it, and ship.\u003c/p\u003e\n\u003cp\u003eBut then in a few weeks the context of that code is all\nlost on me\u0026hellip; I didn\u0026rsquo;t craft it with blood and sweat and so when I\u0026rsquo;m asked a\nquestion about it I realize I\u0026rsquo;m barely fluent in a thing I built (did I even build it?)!\u003c/p\u003e\n\u003cp\u003eThis is embarrassing and exhausting\u0026hellip; I\u0026rsquo;m not sure what I\u0026rsquo;m gonna do about\nthis, definitely not write about how I\u0026rsquo;m going to change my life over this\ndissastisfaction and from this day forward everything will be different\u0026hellip;\u003c/p\u003e\n\u003cp\u003eBut today does feel like an infelction point in a trajectory I\u0026rsquo;ve been on with\nAI and my job, so not starting today, but just a decision I am making today, is\nto time-box every task with vigorous commitment.\u003c/p\u003e\n",
      "content_text": "\n## Reflection\n\nIt's time to be more devoted to my work... AI has been a cool technology to\nwatch and experience but one thing I'm allowing it to do to me is to kill my love for\nbuilding... I feel like I'm arriving where I've already seen many talented\ndevelopers get to - \n\n!!! danger \"realization\"\n\n    AI is not magic, it's a headache. \n\nDon't get me wrong, targeted and focused use of LLMs, with careful planning and\ntime-boxing can be great, and has been for me. But I am a creature and prone to\ntake the path of least resistance, and in many cases I'm just letting the LLM\ndo the work. This is where the ADHD element from the title comes into play.\nNow, I'm not blaming ADHD for me being lazy, because I'm not sure laziness is\nthe fairest descriptor of where I've been lately. A common issue for those with\nADHD, maybe even the defining characteristic, is the black-hole that's present in the space\nwhere motiviation and reward belong in the brain. I've resonated with this thought for much of my life:\n\n!!! note \"Fulfilled or Relieved\"\n\n    When I finish tasks, I'm not fulfilled... if anything I'm relieved.\n\nThis is a core issue I am seeking to address in my life, and I guess in\nreal-time reflection I should thank the hellscape of AI and LLMs for surfacing\nthis pattern in my make-up today instead of when I'm in my 40s or 50s.\n\nSo where I've been is that I'll let an LLM write code and then I'll attempt to\nbe validating the tests or example scripts I prompt it to generate, get\ncomfortable with it, and ship. \n\nBut then in a few weeks the context of that code is all\nlost on me... I didn't craft it with blood and sweat and so when I'm asked a\nquestion about it I realize I'm barely fluent in a thing I built (did I even build it?)! \n\nThis is embarrassing and exhausting... I'm not sure what I'm gonna do about\nthis, definitely not write about how I'm going to change my life over this\ndissastisfaction and from this day forward everything will be different... \n\nBut today does feel like an infelction point in a trajectory I've been on with\nAI and my job, so not starting today, but just a decision I am making today, is\nto time-box every task with vigorous commitment.\n",
      "summary": "It's time to be more devoted to my work... AI has been a cool technology to watch and experience but one thing I'm allowing it to do to me is to kill my love...",
      "date_published": "2025-08-27T07:16:57Z",
      "date_modified": "2025-08-27T07:16:57Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "adhd",
        "tech",
        "reflection"
      ]
    },
    {
      "id": "https://pype.dev/2025-08-27-notes/",
      "url": "https://pype.dev/2025-08-27-notes/",
      "title": "2025-08-27 Notes",
      "content_text": "\nyesterday: [[ 2025-08-26-notes ]]\n\n\n## Reflection on AI\n\n- [[reflection-ai-work-and-adhd]]\n\n\n## TODOs\n\nI need to think about how to keep track of daily tasks across my different work streams...\n  - self hosted time tracker\n  - affine or something\n  - stream-specific tool\n    - working-notes blog with `now` page?\n\n## Wins\n\n- Q: how did today go with time-boxing per [[reflection-ai-work-and-adhd]]? \n  - I would say ok... an office hours went from 1 hours to 3 hours\n  unfortunately, and that definitely affected afternoon momentum. However, I\n  attempted to set a timer for a few tasks with the clock on my wall, and\n  helped to stay focused. \n\n## Runescape\n\n- Totally going to become a member again after finishing the last few free-to-play quests\n- [[runescape-os-mobile-experience]]\n- updated [[starting-old-school-runescape-over-again]]\n",
      "summary": "yesterday: 2025-08-26-notes",
      "date_published": "2025-08-27T06:40:18Z",
      "date_modified": "2025-08-27T06:40:18Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-812/",
      "url": "https://pype.dev/thoughts-812/",
      "title": "💭 Docker Swarm Still Rocks",
      "content_text": "\n\u003ca href=\"https://dockerswarmstill.rocks/\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://dockerswarmstill.rocks/\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - Docker Swarm Still Rocks\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://dockerswarmstill.rocks/\"\u003eDocker Swarm Still Rocks\u003c/a\u003e\n\n---\n\nApparently docker swarm is still a thing and now I have to try it\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "Apparently docker swarm is still a thing and now I have to try it",
      "date_published": "2025-08-26T14:43:44Z",
      "date_modified": "2025-08-26T14:43:44Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "swarm",
        "containers",
        "docker",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/2025-08-26-notes/",
      "url": "https://pype.dev/2025-08-26-notes/",
      "title": "2025-08-26 Notes",
      "content_text": "\nyesterday: [[ 2025-08-25-notes ]]\n\n## Updates\n\n- started my [[awesome]] list\n- I missed something with speakr - need the HF_TOKEN for diarisation to work\n  - [[speakr-for-recording-and-transcribing-at-home]]\n  - with diarisation working I can continue my [[write-in-to-the-hybrid-cloud-show]]\n\n## Reflection\n\n- Didn't get into a good Bible focus time in the morning, definitely affected the day\n- Vibe Coding... ugh, tempting and treacherous. The API I rolled out for work\nwas hard to think about, and using LLMs to build it got something up and going\nbut without me providing more subject matter expertise (due to the fact of not having any)\nit's already heavier tech debt than I care to admit. Maybe I'm sour today and\ndefeated at the end of the day\n- It's been weeks since my 100 push-ups - did them this evening\n",
      "summary": "yesterday: 2025-08-25-notes",
      "date_published": "2025-08-26T05:45:23Z",
      "date_modified": "2025-08-26T05:45:23Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/2025-08-25-notes/",
      "url": "https://pype.dev/2025-08-25-notes/",
      "title": "2025-08-25 Notes",
      "content_text": "\nyesterday: [[ 2025-08-24-notes ]]\n\n## Projects\n\n- [[speakr-for-recording-and-transcribing-at-home]]\n  - the speaker identification isn't working yet\n\n## Desk clean up?\n\n- with life-changes in the midst, a little re-work was in order\n- trying a 27\" vertical monitor setup to the side for docs and chat\n- setup a bluetooth speaker - might like open sound instead of headphones\n\n",
      "summary": "yesterday: 2025-08-24-notes",
      "date_published": "2025-08-25T08:05:15Z",
      "date_modified": "2025-08-25T08:05:15Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/2025-08-24-notes/",
      "url": "https://pype.dev/2025-08-24-notes/",
      "title": "2025-08-24 Notes",
      "content_text": "\nyesterday: [[ 2025-08-23-notes ]]\n\n## Github\n\n- going to spin up speakr\n  - Yes... it's replacing Whisper-WebUI\n  - [[speakr-for-recording-and-transcribing-at-home]]\n\n## Homelab\n\n- I am slowly moving things to a mono-repo and that's going well\n- Moved `ollama` and `open-webui` to a `ai` compose stack at home along with `speakr` and a whisper asr service\n",
      "summary": "yesterday: 2025-08-23-notes",
      "date_published": "2025-08-24T06:00:38Z",
      "date_modified": "2025-08-24T06:00:38Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/2025-08-23-notes/",
      "url": "https://pype.dev/2025-08-23-notes/",
      "title": "2025-08-23 Notes",
      "content_text": "\nyesterday: [[ 2025-08-22-notes ]]\n\n## Reflection\n\n- didn't write one up today, mediated some more this morning on \"inner man\",\nacknowledging the law with my mind, and the Sermon on the Mount whereby Jesus\nteaches his disciples about a new kingdom, where doing right leads to reward -\nbut the definition of reward changes as we walk in step with Jesus\n\n## Forgejo\n\n- multiple runner, nice\n\n## Github\n\n- starred many things today\n  - speakr looks nice for how I'm using whisper + open-webui\n  - found an open-webui android app, but I think I have to build and sideload the apk myself [repo](https://github.com/cogwheel0/conduit)\n  - found self-hosted Google analytics that I'd like to try on [[quadtask]] [here](https://github.com/pypeaday/rybbit)\n  - forked [moocup](https://github.com/pypeaday/moocup) for screenshot pre-processing as a step between snipping the screen and uploading to [[shotput]]\n\n## I'm not the only one\n\nLooks like [komodo](https://github.com/pypeaday/komodo) is much of what I've envisioned for my \"platform as a product\"\n\n",
      "summary": "yesterday: 2025-08-22-notes",
      "date_published": "2025-08-23T05:54:05Z",
      "date_modified": "2025-08-23T05:54:05Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/when-i-learned-what-an-escape-room-was/",
      "url": "https://pype.dev/when-i-learned-what-an-escape-room-was/",
      "title": "When I Learned What An Escape Room Was",
      "content_text": "\n## Set The Stage\n\nI was recently diagnosed with Autism and ADHD. I've written about it and will\nplan to write more. As of August 22, 2025 the only published piece is\n[[autism-adhd-and-the-doshas]]. This story will recount one of many events in\nmy life that in hindsight were clear-cut examples of how my brain consumes and\nunderstands reality differently than neuro-typical people...\n\n## Story Time\n\nWhen I was 24ish I was working at a summer camp as the head of guy's staff (camp consellors).\nIt was typical for the leadership team to get together the week\nbefore the camp to get to know each other if we didn't, plan activities, etc.\nFor team building the plan was to go to Chattanooga and do an __escape room__.\n\nI had never heard of an escape room before and I am not being hyperbolic or\nobtuse when I tell you that my first thought was of a dungeon. I was told \"you\nget locked into a room\" and I asked \"are you tied up?\". I'm a little surprised\nthe ridiculousness of that question didn't prompt more conversation... I love\nthe folks I served with, and maybe they were conspiring against me, but no one\nsaid anything to bring much clarity to me. And after not getting an actually\nstraight forward answer to \"are you tied up\" I decided to just shut my mouth\nbecause everyone else was excited... even though I thought we might be going to\na literal dungeon.\n\n## Trust\n\nI had to exercise so much trust in my friends out of fear of looking stupid but\nmy inability to understand the words \"escape room\" any differently, or more\ncontextually correct, led me to an anxiety filled walk to the lobby of the\nfirst escape room facility I've ever been to. And no, there were not chains\ndangling from the ceiling.\n",
      "summary": "I was recently diagnosed with Autism and ADHD. I've written about it and will plan to write more. As of August 22, 2025 the only published piece is...",
      "date_published": "2025-08-22T18:03:36Z",
      "date_modified": "2025-08-22T18:03:36Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "autism"
      ]
    },
    {
      "id": "https://pype.dev/2025-08-22-notes/",
      "url": "https://pype.dev/2025-08-22-notes/",
      "title": "2025-08-22 Notes",
      "content_text": "\nyesterday: [[ 2025-08-21-notes ]]\n\n## Runescape\n\n- knocking quests out - dragon slayer today maybe\n  - hit 40 str instead\n\n## Forgejo\n\n- [[self-hosting-a-code-forge-with-forgejo]]\n\n## Writing\n\n- wrap up [[when-i-learned-what-an-escape-room-was]]\n- started some notes on [[write-in-to-the-hybrid-cloud-show]]\n",
      "summary": "yesterday: 2025-08-21-notes",
      "date_published": "2025-08-22T06:10:03Z",
      "date_modified": "2025-08-22T06:10:03Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-on-august-21-2025/",
      "url": "https://pype.dev/thoughts-on-august-21-2025/",
      "title": "Thoughts On August 21 2025",
      "content_html": "\u003ch1 id=\"intro\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eIntro\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eBeen struggling more with work - what matters? I can\u0026rsquo;t help but feel like\nnothing\u0026hellip; As a Christian I want to do my work \u0026ldquo;for an audience of 1\u0026rdquo; as the\nsaying goes\u0026hellip; I should do my work with excellence, and I think I have striven\nfor that - it\u0026rsquo;s definitely one reason I have the success and reputation at work\nthat I do have\u0026hellip; but as far as the \u0026ldquo;work\u0026rdquo; goes, does it matter? To the\ncompany, I think the answer is clear - no. They want compliance and submission\nbefore innovation and success. But as a believer, where does my\nloyalty lie?\u003c/p\u003e\n\u003cp\u003eWhat I mean is - if I was loyal to a company, then the scenario\nI\u0026rsquo;m in would very understadably lead to what I\u0026rsquo;m currently feeling - remorse,\nregret, embarrasment, and anger. But if I\u0026rsquo;m truly loyal to Yahweh, then\nwouldn\u0026rsquo;t it not matter \u003cem\u003eat all\u003c/em\u003e what the company does? I do my work for Yahweh\nregardless of the company\u0026rsquo;s direction, instruction, or even whether or not they\nbenefit\u0026hellip; That\u0026rsquo;s my struggle - I don\u0026rsquo;t want to give another ounce of energy\ntowards the success of an entity that doesn\u0026rsquo;t give a shit about me, but am I\nviolating my own worldview and disrespecting my God by dragging my feet?\u003c/p\u003e\n",
      "content_text": "\n# Intro\n\nBeen struggling more with work - what matters? I can't help but feel like\nnothing... As a Christian I want to do my work \"for an audience of 1\" as the\nsaying goes... I should do my work with excellence, and I think I have striven\nfor that - it's definitely one reason I have the success and reputation at work\nthat I do have... but as far as the \"work\" goes, does it matter? To the\ncompany, I think the answer is clear - no. They want compliance and submission\nbefore innovation and success. But as a believer, where does my\nloyalty lie? \n\nWhat I mean is - if I was loyal to a company, then the scenario\nI'm in would very understadably lead to what I'm currently feeling - remorse,\nregret, embarrasment, and anger. But if I'm truly loyal to Yahweh, then\nwouldn't it not matter _at all_ what the company does? I do my work for Yahweh\nregardless of the company's direction, instruction, or even whether or not they\nbenefit... That's my struggle - I don't want to give another ounce of energy\ntowards the success of an entity that doesn't give a shit about me, but am I\nviolating my own worldview and disrespecting my God by dragging my feet?\n",
      "summary": "Been struggling more with work - what matters? I can't help but feel like nothing... As a Christian I want to do my work \"for an audience of 1\" as the saying...",
      "date_published": "2025-08-21T06:14:26Z",
      "date_modified": "2025-08-21T06:14:26Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "reflection",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2025-08-21-notes/",
      "url": "https://pype.dev/2025-08-21-notes/",
      "title": "2025-08-21 Notes",
      "content_text": "\nyesterday: [[ 2025-08-20-notes ]]\n\n## Projects\n\n- continued [[self-hosting-a-code-forge-with-forgejo]] after figuring out the `dind` runner stuff\n\n## Reflection\n\n- continue [[reflecting-on-romans-7-7-13#Round 4]] (updated again)\n\n## Thoughts\n\n- [[thoughts-on-august-21-2025]]\n\n## Runescape\n\n- time to quest\n",
      "summary": "yesterday: 2025-08-20-notes",
      "date_published": "2025-08-21T05:54:20Z",
      "date_modified": "2025-08-21T05:54:20Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/forgejo/",
      "url": "https://pype.dev/forgejo/",
      "title": "forgejo",
      "content_html": "\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eself-hosted code forge\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ecodeberg\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003efork of gittea\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003esee [[self-hosting-a-code-forge-with-forgejo]]\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n- self-hosted code forge\n- codeberg\n- fork of gittea\n\n- see [[self-hosting-a-code-forge-with-forgejo]]\n",
      "summary": "self-hosted code forge - codeberg - fork of gittea",
      "date_published": "2025-08-20T06:26:00Z",
      "date_modified": "2025-08-20T06:26:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "glossary"
      ]
    },
    {
      "id": "https://pype.dev/2025-08-20-notes/",
      "url": "https://pype.dev/2025-08-20-notes/",
      "title": "2025-08-20 Notes",
      "content_text": "\nyesterday: [[ 2025-08-19-notes ]]\n\n## Reflection\n\n- continuing [[reflecting-on-romans-7-7-13]] (updated)\n\n## Forgejo\n\n- [[forgejo]]\n- started [[self-hosting-a-code-forge-with-forgejo]]\n\n## Home\n\n- Kassia requested some storage containers to hang on the girl's kitchenette\n  - https://makerworld.com/models/929188\n  - https://makerworld.com/models/112478\n  - https://makerworld.com/models/131561\n- need to hang the AMS on the wall\n\n## Runescape\n\n- range and def level 40, dragon hide is mine! \n  - need to do dragon slayer quest for the body though\n",
      "summary": "yesterday: 2025-08-19-notes",
      "date_published": "2025-08-20T06:01:46Z",
      "date_modified": "2025-08-20T06:01:46Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-804/",
      "url": "https://pype.dev/thoughts-804/",
      "title": "💭 Codeberg Pages | Codeberg Documentation",
      "content_text": "\n\u003ca href=\"https://docs.codeberg.org/codeberg-pages/\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://docs.codeberg.org/codeberg-pages/\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - Codeberg Pages | Codeberg Documentation\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://docs.codeberg.org/codeberg-pages/\"\u003eCodeberg Pages | Codeberg Documentation\u003c/a\u003e\n\n---\n\nForgejo has a github pages like feature... this might be nice to use sometime as I try to lean into forgejo, but the last thought/bookmark on using traefik + nginx in a compose stack feels simple too. I'll keep it in mind as I explore the forgejo setup at home\n\n---\n\nAfter reading it again I missed something. Codeberg pages is not exactly like github pages, seems more like the github readme thing - you have to use a repo called \"pages\" and then you'll get {username}.codeberg.page... so they own this TLD, and so I'm not sure it's worth exploring this for homelab situations when traefik + nginx or something is pretty simple as well\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "Forgejo has a github pages like feature... this might be nice to use sometime as I try to lean into forgejo, but the las",
      "date_published": "2025-08-19T11:35:38Z",
      "date_modified": "2025-08-19T11:35:38Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "pages",
        "website",
        "static-site",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-803/",
      "url": "https://pype.dev/thoughts-803/",
      "title": "💭 Use Traefik 2 with Nginx, Apache, or CaddyServer to Serve Stat…",
      "content_text": "\n\u003ca href=\"https://simplecto.com/use-traefik-with-nginx-apache-caddyserver-serve-static-files/\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://simplecto.com/use-traefik-with-nginx-apache-caddyserver-serve-static-files/\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - Use Traefik 2 with Nginx, Apache, or CaddyServer to Serve Static Files\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://simplecto.com/use-traefik-with-nginx-apache-caddyserver-serve-static-files/\"\u003eUse Traefik 2 with Nginx, Apache, or CaddyServer to Serve Static Files\u003c/a\u003e\n\n---\n\nLooks like a nice way to use git to back static sites, which I already do with my blog but this would be a simple way to centralize some content I like to serve up. Might make it easier to self-host everything as well!\n\nNOTE: this is in karakeep already\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "Looks like a nice way to use git to back static sites, which I already do with my blog but this would be a simple way to",
      "date_published": "2025-08-19T11:28:37Z",
      "date_modified": "2025-08-19T11:28:37Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "static-site",
        "traefik",
        "website",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/2025-08-19-notes/",
      "url": "https://pype.dev/2025-08-19-notes/",
      "title": "2025-08-19 Notes",
      "content_text": "\nyesterday: [[ 2025-08-18-notes ]]\n\n## Reflection\n\n- I wanted to read psalm 1 some this morning but am feeling like I should continue [[reflecting-on-romans-7-7-13]] perhaps for a few days...\n\n???+ note \"Psalm 1:2 (LEB)\"\n\n    2 Instead, in the law of Yahweh is his delight,  and on his law he meditates day and night.  \n\n- It's this meditation that I struggle to maintain for multiple days... In Hebrew its a word that can describe the sound a bear makes while it's chewing its food - a regular, consistent groaning over the food in their mouth... similarly we should be chewing on God's word, mulling it around in our heads and in this wisdom I feel the conviction to stay in Romans 7:7-13 for a little while\n\n## Wins\n\n- deleted 553 Signal chats today... was going to archive but then I thought \"why\"... dude just cut it\n- killing it in runescape - level 40 attack tomorrow for sure\n\n",
      "summary": "yesterday: 2025-08-18-notes",
      "date_published": "2025-08-19T05:53:46Z",
      "date_modified": "2025-08-19T05:53:46Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/reflecting-on-romans-7-7-13/",
      "url": "https://pype.dev/reflecting-on-romans-7-7-13/",
      "title": "Reflecting on Romans 7:7-13",
      "content_text": "\n## Passage\n\nRomans 7:7–7:13 (ESV): 7 What then shall we say? That the law is sin? By no\nmeans! Yet if it had not been for the law, I would not have known sin. For I\nwould not have known what it is to covet if the law had not said, “You shall\nnot covet.” 8 But sin, seizing an opportunity through the commandment, produced\nin me all kinds of covetousness. For apart from the law, sin lies dead. 9 I was\nonce alive apart from the law, but when the commandment came, sin came alive\nand I died. 10 The very commandment that promised life proved to be death to\nme. 11 For sin, seizing an opportunity through the commandment, deceived me and\nthrough it killed me. 12 So the law is holy, and the commandment is holy and\nrighteous and good. 13 Did that which is good, then, bring death to me? By no\nmeans! It was sin, producing death in me through what is good, in order that\nsin might be shown to be sin, and through the commandment might become sinful\nbeyond measure. \n\n## Reflection\n\nAs I was dimwittedly working through 1 John 3 for\n[[olivet-mens-group-august-2025]] I found myself gravitating towards Romans 7\nand 8 as it brings clarity to John's words about practicing sin vs being a\nchild of God.\n\n???+ note \"Personal\"\n\n    God's been good to me as I have started trying to be more focused in\n    theological study and reflection... It has been long enough for my \"break\" to\n    be over\n\nIt goes without saying in Christian circles that Romans is a tough cookie...\nPaul packs a lot in the letter and although I'm focusing right now on 7 verses,\nthe context certainly matters when it comes to deeper study. As for me this\nmorning I believe God's calling me to reverse-sear my conscience in regards to\nsome persistent sins in my life. I write a little note in my notes for the olivet study:\n\n\u003e As I write this out, the Christian concept of \"setting the captives free\" and\njubilee and freedom strike my heart deeply. Just these phrases begin to call up\nemotions. But as I look at my life right now, what am I doing that shouts\nfreedom? I spend more time lately playing games than being entrenched in\ntheological study, I think about work more than things which are noble and\npraiseworthy, and I seem to purposefully focus on my own situations internally\nrather than on God's grace (which I do externally a lot - but I feel this\ntension inside - __a hook of doubt__)\n\nThese aren't the motifs in the passage, but the conversation around sin in our\nhearts spiderwebs throughout scripture very quickly if the conversation is to\nbe worth anything... Freedom is core in a Christian worldview, but am I free\nand devoted to Jesus or a morally bankrupt slave to myself?\n\nSo far I haven't even touched the passage so let me dive in a bit.\n\n???+ note \"\"\n\n    The rest of this post was dictated and transcribed via a STT utility I have at home. I often do this and rework my thoughts but here it's easier to word vomit the ideas and hope they make sense on the other side. I loosely edited it for readability but for whatever it's worth, this is moreso my thinking voice than my public speaking voice\n\n\"What then shall we say, that the law is sin? By no means! Yet if it had not been for the law I would not have known sin.\"\n\nAnd that feels to me a little bit like Paul saying what I've heard other Christians today say — something like:\n\"I didn't struggle with anger until I became a Christian and then it was a struggle!\"\n\nSo there's that side of it.\n\nAnd then the other side of it is that God has \"written eternity on our hearts,\" has He not? And through Common Grace, do we not all understand very common morality?\n\nAside from our worldviews, there are things that we know are wrong. Murdering is simply wrong. Another good example is something like cowardice—or like Paul will go on to say, covetousness.\n\nWhether you're a Christian or not, you wouldn't value covetousness or cowardice. Cultures across the world and across history reject these things.\n\nSo, through becoming a Christian, the struggle with sin really begins — because it's the understanding not that something is just kind of morally wrong, but that you're violating the law of the Creator of the universe.\n\nNow, we don't want to dive in so deep that we reject the context (of Paul's thoughts in Romans 7:7–13). And so, I don't want to dissect these few verses too much.\n\nAnd so what's my reflection?\n\nI don't know.\n\nSin is crouching at the door.\nAnd it deceives me.\nSo, through the law, I learn what my sin is—it lets me name my killer.\n\nThe law didn't bring death—it brings understanding of death, because it reveals sin, which produces death.\n\nBut the part that I'm not \"to\" in my heart yet is the end of the passage. Verse 13:\n\n\"Did that which is good then (the law) bring death to me? By no means! It was sin producing death in me through what is good (the law), in order that sin might be shown to be sin and through the commandment might become sinful beyond measure.\"\n\nAnd I think that that phrase \"sinful beyond measure\" is a reflection of Paul's understanding of sin in his life.\n\nNow, I claim I have the same mental understanding...\n\nLater on in Romans 7, Paul talks about his \"inner man\" and his mind being a slave to the law of the Spirit, but his body being a slave to sin.\n\nBut can I really say that my mind is a slave to the law of the Spirit?\n\nI certainly would make a lot of theological points about it—but is it really?\n\nThat's my reflection this morning.\n\nI'm not as convicted over sin in my life, and so this reverse conscience searing needs to happen.\n\n---\n\n## Another Reflection\n\nAs I come back here for a second day, I believe by the guidance of the Spirit,\nI trust God to encourage and teach me through Paul's words\n\nHow do I know what is sin (lawlessness) and what is not sin (ie. not lawless, ie. _lawful_)? It's through the law as noted above. \n\nWhat to do about this though? One day since some conviction settled into my heart certainly doesn't indicate anything about my life, but what else is relevant to this meditation?\n\n!!! note \"Psalm 1:1-2\" \n\n    1 Blessed is the man who does not walk in the advice of the wicked;  nor does he stand in the way of sinners;  nor does he sit in the assembly of mockers.  2 Instead, in the law of Yahweh is his delight,  and on his law he meditates day and night.  \n\nThe \"law\" is _torah_... generally this is referring to a code of holy living.\nTorah isn't \"the law\" how we understand the law, it's case-law for holy living.\nTorah describes the flight of an arrow towards its target - it's the direction\nof your life. \n\nSo the psalmist says that it's in the constant meditation of God's law (God's direction for holy living) that a man is \"blessed\". \n\n\u003e There's many words to use, but this word \"blessed\" is a Hebrew word used for when describing the good life of another person\n\n- Blessed is the man who meditates on the law of Yahweh\n- The law brings knowledge of sin\n- Furthermore, the law causes sin to \"become sinful beyond measure\"\n- How? Via the constant meditation of the law of Yahweh - which Psalm 1:3 says\n\n!!! note \"Psalm 1:3\" \n\n    3 And so, he is like a tree planted by streams of water  that gives its fruit in its season;  its leaf also does not wither.  Therefore all that he does prospers.  \n\nBible stuff is apart of my daily vocabulary with anyone. God's law is in my\nmind, and hopefully my heart, every day. At the same time, the callousness is\npresent. It's Paul's lament about being the chief of sinners, and about the war\nin his members (Romans 7/8)... \n\nThe solution is this... day by day meditation - slightly more focused and\ndirected... God's blessing is absolutely on my lie - and the word for \"blessed\"\nin Psalm 1 referring to _others_ describing the life of the blessed man as\nblessed is very true for me - people around me know God's been good to me. So I\nhave every bit of faith that he will continue that goodness, and thankfully\nconviction this morning and week to take small steps towards a more devoted\nlife to the meditation of God's law.\n\n---\n\n## Round 3\n\nToday the Bible Project app brought me to Isaiah 61 which coincides with this\nextended reflection quite well as it's one of the places we get the image and\nphrase of \"setting the captives free\" which is a Biblical theme I see Paul\nleaning on at the end of Romans 7.\n\n!!! note \"Isaiah 61\"\n\n    1 The Spirit of the Lord Yahweh is upon me,\n    because Yahweh has anointed me,  he has sent me to bring good news to the\n    oppressed,  to bind up the brokenhearted,  to proclaim release to the captives\n    and liberation to those who are bound,  \n    2 to proclaim the year of Yahweh’s\n    favor,  and our God’s day of vengeance,  to comfort all those in mourning,\n    3 to give for those in mourning in Zion,  to give them a head wrap instead of\n    ashes,  the oil of joy instead of mourning,  a garment of praise instead of a\n    faint spirit.  And they will be called oaks of righteousness,  the planting of\n    Yahweh, to show his glory.  \n\n    4 And they shall build the ancient ruins,  they\n    shall erect the former deserted places.  And they shall restore the devastated\n    cities,  the deserted places of many generations.  \n    5 And strangers shall stand\n    and feed your flocks,  and foreigners shall be your farmers and vinedressers.\n    6 But you shall be called the priests of Yahweh,  you will be called servers of\n    our God.  You shall eat the wealth of the nations,  and you shall boast in\n    their riches.  \n    7 Instead of your shame, a double portion,  and instead of\n    insult, they will rejoice over their portion.  Therefore they will take a\n    double portion in their land;  they shall possess everlasting joy.  \n    8 For I, Yahweh, love justice,  hate robbery and injustice,  and I will\n    faithfully give\n    their reward,  and I will make an everlasting covenant with them.  \n    9 And their\n    descendants will be known among the nations,  and their offspring in the midst\n    of the peoples.  All those who see them shall recognize them,  that they are\n    descendants whom Yahweh has blessed.  \n\n    10 I will rejoice greatly in Yahweh;  my\n    being shall shout in exultation in my God.  For he has clothed me with garments\n    of salvation,  he has covered me with the robe of righteousness,  as a\n    bridegroom adorns himself with a head wrap like a priest,  and as a bride\n    adorns herself with her jewelry. \n    11 For as the earth produces its sprout,  and\n    as a garden makes its plants sprout,  so the Lord Yahweh will make\n    righteousness sprout,  and praise before all the nations.  \n\n!!! warning \"\"\n\n    This isn't a reflection or study of Isaiah 61 - just a few notes as they pertain to my reflection on Romans 7 and 8 and the posture I have towards sin in my life\n\nThis is a messianic prophecy delivered to the people of God in captivity to\nspur the remnant of the faithful to continue hoping in the promises of Yahweh.\n\nIsrael was in captivity more or less as discipline for violating God's word\npretty regularly... Consistent with my reflection so far - has \"sin become sin\nbeyond measure\" to me yet? No, just as it wasn't for Israel, and God allowed\nHis people to be enslaved multiple times as they turned to foreign gods... is\ncallousness to sin any different than turning to a foreign god? No, it's\nexactly what it is.\n\nBut thankfully the over-arching story is about Yahweh's faithfulness to His\npeople, and this prophecy is for those who exercise faithfulness to Yahweh....\nthat's the crux of my reflection on Romans 7, how can I claim the promises of\nGod if sin is so present in my life? I think the answer is that it's only\nthrough the awakening of the Spirit that I can genuinely question my loyalty to\nYahweh and also acknowledge his loyalty to the Promise He brought me into. By\nGod's grace I'm just a guy who the Lord has grace on, and I pray through daily\nmeditation my will becomes so conformed to the will of Jesus that I can\nfaithfully say \"sin has become beyond sin to me\"\n\nPraise God for Paul's words at the end of Romans 7\n\n!!! note \"Romans 7:24-25\"\n\n    24 Wretched man that I am! Who will deliver me from this body of death? 25 Thanks be to God through Jesus Christ our Lord! So then, I myself serve the law of God with my mind, but with my flesh I serve the law of sin.\n\n---\n\n## Round 4\n\n!!! note \"Romans 7:13\"\n\n    13 Did that which is good, then, bring death to me? By no means! It was sin, producing death in me through what is good, in order that sin might be shown to be sin, and through the commandment might become sinful beyond measure. \n\nThis morning I don't know if it was another translation or the direct explicit\nwork of the Spirit but I feel like something clicked just a little bit here.\nThe law didn't bring sin (lawlessness), God's law pre-exists Torah (Genesis,\nthe trees), so the law says what is good and bad, and it's the brokenness of\nhumanity (sin) producing death in us/me and the production of death shows sin\nto be what it is - sinful beyond measure\n\nSo as I reflect here on Paul, Romans, and myself - what am I missing or what is\nGod recovering in me? This week has been pretty good concerning the areas of my\nmind and life where I feel callous and hardened. The daily meditation can't NOT\nbe the reason - devotion in the morning, however minimal and before anything else,\nis producing in me the will to do God's good work in my own life. I don't mean\ngiving money and doing charity - but in the privacy of my mind and day, do I\nhonor the Lord with every thought?\n\nThe cliche but honest answer is no but I feel God's working in my heart, the\ntug towards Heaven and away from the hellish pit of my own desires\n\n---\n\n## Round 5\n\nVerse 8b \"For apart from the law, sin lies dead.\"\n\n\u003e This reflection was done audibly and the transcription was modified slightly for this post\n\nI think there's quite a few interesting perspectives, maybe two that come to mind pretty quickly.\n\nFor context, the rest of the verse is \n\n!!! note \"Romanas 7:8\"\n\n    but sin seizing an opportunity through the commandment produced in me all kinds of covetousness, for apart from the law, sin lies dead.\n\nSo the first observation is sin gets its life and its effect (effectual power) through the conduit of the law.\nAnd so the law says don't do X. That means we now have knowledge to not do X. \n\nAnd then it's like the existence of sin has to be presupposed because it's the very same sin as in Genesis three.\nGod's rule of the land said not to eat of the tree of the knowledge of good and bad, and sin seizing the opportunity through that commandment produced in Eve all kinds of covetousness.\n\nBut it wasn't really __actually__ the command of God.\nIt was the snake.\nSo in that sense, depending on our interpretation of Genesis 3, which I will forego...\nThe snake is the embodiment of sin, and so we're not so concerned with the ontological origins of sin, but rather with processing its effect and consequences in our daily life.\nAnd so that first perspective is to say that - for me, by God's grace, I know the law.\nIt means that by God's grace, sin has the opportunity to produce __things__ in me, and in that same breath of grace -\nJesus saves me.\nThat's the end of chapter seven.\n\n!!! note \"Romans 7:24-25\"\n\n    24 Wretched man that I am! Who will deliver me from this body of death? 25 Thanks be to God through Jesus Christ our Lord! So then, I myself serve the law of God with my mind, but with my flesh I serve the law of sin.\n\nThe other perspective that I have on this right now is not inward looking, and so I don't want to harp on it and meditate much on other people.\nBut Christians certainly have internal (internal to the community of faith) conversations about the morality of non-Christians and what should be expected of non-believers.\nAs far as a moral life is concerned and there's various theological opinions and various worldviews, even within Christianity through which we can filter reality and people's actions and their moralities.\nAnd so in that vein, perhaps something I see here is to read it almost backwards (transposed is a better word), \n\n\u003e sin lies dead apart from the law.\n\nAnd you think, I think, about our culture's hedonistic posture towards being a slave to our own desires.\nAmerican culture largely celebrates, or Western culture rather, largely celebrates the individual decision to do what the individual wants.\nAnd we live in a culture where to shame others is itself shamed.\nIt is unacceptable to call people to higher standards of living.\nBut why should we (Christians) be surprised and why is this news and why do Christians spend time talking about it?\nI think Paul gives us the answer.\n\"Apart from the law\" (and the law is the direction in which we strive for holiness)\nAnd so \"apart from that, sin lies dead\" meaning sin doesn't seize an opportunity through any commandment.\nBecause apart from the law sin can't be shown to be sinfulness.\nThat's verse 13.\n\n!!! note \"Romans 7:13\"\n\n    13 Did that which is good, then, bring death to me? By no\n    means! It was sin, producing death in me through what is good, in order that\n    sin might be shown to be sin, and through the commandment might become sinful\n    beyond measure.\n\nSo that last thought, it isn't so much that non-believers don't have the knowledge of good and bad.\nThe Bible says that God has written eternity on our hearts.\nAnd we have moral discussions in the public square all the time, so people\ncertainly are aware of opinions about morality, and it is in the rebellion\nagainst the good and moral positions where I'm right now actually finding\nsecurity in **my** position as a __chosen child of God__ because honestly, I love debauchery, but (thankfully)\npart of me hates it, and it's that part of me that hates it, that is the Spirit\nin me, that is the grace of the Lord Jesus, saving me from this body of sin and death.\n\n",
      "summary": "Romans 7:7–7:13 (ESV): 7 What then shall we say? That the law is sin? By no means! Yet if it had not been for the law, I would not have known sin. For I...",
      "date_published": "2025-08-18T06:12:13Z",
      "date_modified": "2025-08-18T06:12:13Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "reflections",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2025-08-18-notes/",
      "url": "https://pype.dev/2025-08-18-notes/",
      "title": "2025-08-18 Notes",
      "content_text": "\nyesterday: [[ 2025-08-17-notes ]]\n\n## Reflections\n\n- [[reflecting-on-romans-7-7-13]]\n",
      "summary": "yesterday: 2025-08-17-notes",
      "date_published": "2025-08-18T06:11:28Z",
      "date_modified": "2025-08-18T06:11:28Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/2025-08-17-notes/",
      "url": "https://pype.dev/2025-08-17-notes/",
      "title": "2025-08-17 Notes",
      "content_text": "\nyesterday: [[ 2025-08-16-notes ]]\n\n## Reflections\n\n- men's group yesterday was a fine conversation about a few things in 1 John 3,\nprimarily around what it means to \"practice\" lawlessness\n- I have been lacking disicpline or devotion in my theological studies, and\nwith my time in general, so it's time to start being more faithful to the life\nGod wants for me\n\n## Runescape\n\n- so fun!\n- finally looked up what splashing is for mage training - the staff + full suit of armor make sense finally\n",
      "summary": "yesterday: 2025-08-16-notes",
      "date_published": "2025-08-17T05:28:56Z",
      "date_modified": "2025-08-17T05:28:56Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/2025-08-16-notes/",
      "url": "https://pype.dev/2025-08-16-notes/",
      "title": "2025-08-16 Notes",
      "content_text": "\nyesterday: [[ 2025-08-15-notes ]]\n\n## Olivet\n\n- needed to have done more on [[olivet-mens-group-august-2025]]\n- reflection on Romans 7/8 needs to continue... There's changes I need to make in my life, and I know I'm pushing them off.\n\n## Runescape\n\n-  [[runescape-clients-and-settings]]\n- much leveling via mobile play today... gonna be a problem in the near-term future I think :D\n\n## Others\n\n- [[when-i-learned-what-an-escape-room-was]]\n- [[autism-and-steadfast-faith]]\n",
      "summary": "yesterday: 2025-08-15-notes",
      "date_published": "2025-08-16T05:55:55Z",
      "date_modified": "2025-08-16T05:55:55Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/runescape-clients-and-settings/",
      "url": "https://pype.dev/runescape-clients-and-settings/",
      "title": "Runescape Clients and Settings",
      "content_html": "\u003cdiv class=\"admonition danger\"\u003e\n\u003cp class=\"admonition-title\"\u003eNote to future me\u003c/p\u003e\n\u003cp\u003eHey when you have to reinstall this, you NEED to use a Jagex launcher to launch runeline on Linux. TLDR: bolt from the discover store\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eI\u0026rsquo;m not a seasoned PC gamer, so launchers and game installers have been a tad\nconfusing to me over the years. Runescape has some clients now, and \u003ca href=\"https://runelite.net\"\u003erunelite\u003c/a\u003e is\napparently the primary third-party one. There are also plugins available!\u003c/p\u003e\n\u003ch2 id=\"working-on-linux\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWorking On Linux\u003c/span\u003e \u003ca href=\"#working-on-linux\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eTo start I downloaded a third-party jagex launcher, \u003ca href=\"https://github.com/Adamcake/Bolt\"\u003ebolt\u003c/a\u003e, from the discover store\u0026hellip;\nI use it to launch runelite. In runelite there\u0026rsquo;s a plugin menu, I installed the\ngpu one and almost instantly the game came alive in a whole new way!\u003c/p\u003e\n\u003cdetails class=\"admonition note\"\u003e\n\u003csummary class=\"admonition-title\"\u003eJagex Launcher\u003c/summary\u003e\n\u003cp\u003eI linked my runescape account to a jagex account and you ahve to use the jagex launcher to launch runelite but the jagex launcher only works on windows - there\u0026rsquo;s a github to make it work on linux but I went with third-party jagex launcher bolt instead\u003c/p\u003e\n\u003c/details\u003e\n\u003ch2 id=\"gpu\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGPU\u003c/span\u003e \u003ca href=\"#gpu\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe GPU one is great, makes the game look incredible\u003c/p\u003e\n\u003ch3 id=\"default\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDefault\u003c/span\u003e \u003ca href=\"#default\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cfigure\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250815175429_38bbc7f8.png\" alt=\"20250815175429_38bbc7f8.png\"\u003e\n\u003c/figure\u003e\n\u003ch3 id=\"gpu-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGPU\u003c/span\u003e \u003ca href=\"#gpu-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cfigure\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250815175450_bdc2753e.png\" alt=\"20250815175450_bdc2753e.png\"\u003e\n\u003c/figure\u003e\n\u003ch2 id=\"stats\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStats\u003c/span\u003e \u003ca href=\"#stats\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThere\u0026rsquo;s a few that give nice timers for resources and stats for skill building\u003c/p\u003e\n\u003cfigure\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250815175544_b4cdedbf.png\" alt=\"20250815175544_b4cdedbf.png\"\u003e\n\u003c/figure\u003e\n\u003cp\u003eActions for each skill is the last thing you did that earned XP. So in my\nscreenshot I was mining iron and I have 10 actions left before leveling up - 1\naction is mining 1 iron ore in this case\u003c/p\u003e\n\u003ch2 id=\"end\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEnd\u003c/span\u003e \u003ca href=\"#end\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI\u0026rsquo;m digging not just playing runescape again, but enjoying the ecosystem of tools around it. At the end of the day I\u0026rsquo;m realizing games are sets of data, and things like textures and effects can be loaded on top of that and rendered however you want (that the game/plugins support). So I\u0026rsquo;m very excited to dive back into a childhood favorite and relive the quests but now in GPU-rendered ray-traced goodness\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eIt's not ray-traced but it sounded cool\u003c/p\u003e\n\u003c/div\u003e\n",
      "content_text": "\n!!! danger \"Note to future me\"\n\n    Hey when you have to reinstall this, you NEED to use a Jagex launcher to launch runeline on Linux. TLDR: bolt from the discover store\n\nI'm not a seasoned PC gamer, so launchers and game installers have been a tad\nconfusing to me over the years. Runescape has some clients now, and [runelite](https://runelite.net) is\napparently the primary third-party one. There are also plugins available! \n\n## Working On Linux\n\nTo start I downloaded a third-party jagex launcher, [bolt](https://github.com/Adamcake/Bolt), from the discover store...\nI use it to launch runelite. In runelite there's a plugin menu, I installed the\ngpu one and almost instantly the game came alive in a whole new way!\n\n??? note \"Jagex Launcher\"\n\n    I linked my runescape account to a jagex account and you ahve to use the jagex launcher to launch runelite but the jagex launcher only works on windows - there's a github to make it work on linux but I went with third-party jagex launcher bolt instead\n\n## GPU\n\nThe GPU one is great, makes the game look incredible\n\n### Default\n\n![20250815175429_38bbc7f8.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250815175429_38bbc7f8.png)\n\n### GPU\n\n![20250815175450_bdc2753e.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250815175450_bdc2753e.png)\n\n## Stats\n\nThere's a few that give nice timers for resources and stats for skill building\n\n![20250815175544_b4cdedbf.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250815175544_b4cdedbf.png)\n\nActions for each skill is the last thing you did that earned XP. So in my\nscreenshot I was mining iron and I have 10 actions left before leveling up - 1\naction is mining 1 iron ore in this case\n\n## End\n\nI'm digging not just playing runescape again, but enjoying the ecosystem of tools around it. At the end of the day I'm realizing games are sets of data, and things like textures and effects can be loaded on top of that and rendered however you want (that the game/plugins support). So I'm very excited to dive back into a childhood favorite and relive the quests but now in GPU-rendered ray-traced goodness\n\n!!! note \"It's not ray-traced but it sounded cool\"\n",
      "summary": "!!! danger \"Note to future me\"",
      "date_published": "2025-08-15T11:12:57Z",
      "date_modified": "2025-08-15T11:12:57Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "runescape",
        "gaming"
      ]
    },
    {
      "id": "https://pype.dev/2025-08-15-notes/",
      "url": "https://pype.dev/2025-08-15-notes/",
      "title": "2025-08-15 Notes",
      "content_text": "\nyesterday: [[ 2025-08-14-notes ]]\n\n## Runescape\n\n- started [[runescape-clients-and-settings]]\n",
      "summary": "yesterday: 2025-08-14-notes",
      "date_published": "2025-08-15T11:10:28Z",
      "date_modified": "2025-08-15T11:10:28Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/starting-old-school-runescape-over-again/",
      "url": "https://pype.dev/starting-old-school-runescape-over-again/",
      "title": "Starting Old School Runescape Over Again",
      "content_html": "\u003ch2 id=\"intro\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eIntro\u003c/span\u003e \u003ca href=\"#intro\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI got an itch to play a new game recently and after squabbling with my PS4 and\nmy PC I decided to go old school literally with Old School Runescape\u0026hellip; I\nplayed this game so much as a kid and it\u0026rsquo;s so well preserved in 2025. I tried\nto bang out a ton today and decided to look through a few guides to try to\nlevel up effeciently.\u003c/p\u003e\n\u003ch2 id=\"quests\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eQuests\u003c/span\u003e \u003ca href=\"#quests\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThere\u0026rsquo;s a handful of quests and several are pretty attainable early on that\ngive enough XP to blitz through the early levels of many skills\u0026hellip;\u003c/p\u003e\n\u003cp\u003eToday I made it through doric\u0026rsquo;s quest which bumped be\nthrough to level 20+ mining. Another player gave me a black pick-axe which made\nmining some iron pretty easy. From there I wanted to level up smithing a bit -\nand the guides say that \u0026ldquo;The Knight\u0026rsquo;s Sword\u0026rdquo; is a good quest for it, though\nit\u0026rsquo;s recommended to be combat level 20 before doing it\u0026hellip; I decided to not\nworry about that, I\u0026rsquo;ve picked red-berries for a pie and am going to bring a\nhaul of steaks and my black pick while I try to get the bluerite ore and run\naway from the ice giants that I know will destroy me at my whopping combat\nlevel 6\u0026hellip; but for first day back I\u0026rsquo;m feeling great.\u003c/p\u003e\n\u003cp\u003eAfter that my smithing levels should be in the teens\u0026hellip; Not sure what we\u0026rsquo;ll do after that\u003c/p\u003e\n\u003cp\u003eI did do the Cook\u0026rsquo;s Assistant while gathering things for the Knight\u0026rsquo;s Sword,\neasy peasy and gets me access to the oven in Lumbridge Castle.\u003c/p\u003e\n\u003ch2 id=\"plans\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePlans\u003c/span\u003e \u003ca href=\"#plans\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI\u0026rsquo;m using Affine to map out my questing - the mind map is great for tracking\nwhy I\u0026rsquo;m 6 mini-side-quests removed from the original thing I was after.\u003c/p\u003e\n\u003cfigure\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250815003021_4a18defc.png\" alt=\"20250815003021_4a18defc.png\"\u003e\n\u003c/figure\u003e\n\u003ch2 id=\"update-01\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUpdate 01\u003c/span\u003e \u003ca href=\"#update-01\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAfter about 2 weeks I\u0026rsquo;ve done most of othe free-to-play stuff, with just\nanother 2 quests to go. The game is so faitful to what I remember.\u003c/p\u003e\n\u003cp\u003eI was thinking about how I would tackle a new account, and I am starting to\nunderstand the simple appeal of having alternate accounts - a \u0026ldquo;pure mage\u0026rdquo; for\nexample\u0026hellip;. If money were no object then having a pure ranger and mage account\nwould be pretty fun, and with a powerful main I think it\u0026rsquo;s possible to make\nplenty of in-game gold and just trade between accounts. To my knowledge, this\ndoesn\u0026rsquo;t break any of the Jagex rules.\u003c/p\u003e\n\u003cp\u003ePutting the idea of a \u0026ldquo;pure\u0026rdquo; anything aside, I was thinking about how I would\nmore efficiently have played to the point in the game I\u0026rsquo;m at right now\u0026hellip; For\ngaining any combat xp the goal is the \u003ccode\u003erune scimitar\u003c/code\u003e, which requires level 40\n\u003ccode\u003eattack\u003c/code\u003e to wield. The stronger you are (ie. higher \u003ccode\u003estrength\u003c/code\u003e) the more xp you\ncan gain per second. This means upping \u003ccode\u003eattack\u003c/code\u003e to level 40 with the best\nscimitar you can at every level until \u003ccode\u003erune\u003c/code\u003e at 40, and then swapping to the\nstrength-gaining combat style and theoretically training \u003ccode\u003estrength\u003c/code\u003e to level 99,\nand then train \u003ccode\u003edefense\u003c/code\u003e and \u003ccode\u003eattack\u003c/code\u003e from \u003ccode\u003ex\u003c/code\u003e and \u003ccode\u003e40\u003c/code\u003e respectively to \u003ccode\u003e99\u003c/code\u003e is\nthe quickest way to do it.\u003c/p\u003e\n\u003cp\u003eThe issue with this is that due to the level-scaling of the game, it\u0026rsquo;s totally\nimpractical to do this and would suck all the fun out of the game. I think I\nhandled my melee combat leveling pretty well by keeping the 3 stats, \u003ccode\u003eattack\u003c/code\u003e,\n\u003ccode\u003estrength\u003c/code\u003e, \u003ccode\u003edefense\u003c/code\u003e more or less in step with each other up to 40, and from\nthen on began focusing primarily on \u003ccode\u003estrength\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve also spent plenty of time on \u003ccode\u003eranged\u003c/code\u003e and \u003ccode\u003emagic\u003c/code\u003e but these are expensive\nto train quickly (and quickly isn\u0026rsquo;t even THAT fast) due to resource consumption\n(arrows / runes). Now, I have plenty of resources in game, so training these\nhas been fine, but in a more vanilla situation they could mostly be forgotten\nabout until you\u0026rsquo;ve leveled up in \u003ccode\u003ecrafting\u003c/code\u003e or \u003ccode\u003emining\u003c/code\u003e and \u003ccode\u003esmithing\u003c/code\u003e for the\nsake of making some money.\u003c/p\u003e\n\u003cp\u003eOn that note, combat can be paused from the onset and one can jump right to the\nmines with tin + copper -\u0026gt; iron or else tan cowhides and craft leather\u0026hellip;\neither way, upgrading these skills opens the door for money-making routines and\nif you have a good source of income in the game, then buying runes and arrows\nfor training is quite simple at the \u003ccode\u003egrand exchange\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eThere are a few guides on the \u0026ldquo;optimal\u0026rdquo; way to play through the game depending\non what you want to optimize. Personally, upon thinking about it through writing I can\nsee how there\u0026rsquo;s not a \u0026ldquo;one right way\u0026rdquo; to play the game \u0026ldquo;most efficiently\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003eIf I were to start another account, not as one of these fancy schmancy \u0026ldquo;pure\u0026rdquo;\nones, I think I would train my melee stats to 40 via cows, chickens, and giant\nfrogs (then doubling up on prayer via \u003ccode\u003ebig bones\u003c/code\u003e). The reason for this is that\nthere\u0026rsquo;s places to mine and fish where the enemies are in level ranges 20-30 and\nit\u0026rsquo;s convenient to avoid hostility (ie. being attacked on site)\n(south-east varrock mine for example isn\u0026rsquo;t NEXT to the dark wizards, but they\nare close and if you are sub combat level 21 or something, they are hostile\ntowards you).\u003c/p\u003e\n\u003cp\u003eThe other skills I hadn\u0026rsquo;t thought about from the perspective of a guide are\nfiremaking, fishing, cooking, and woodcutting. Typically they\u0026rsquo;re pretty easy to\ntrain together, but it\u0026rsquo;s also really easy to focus on cooking by itself east of\nBarbarian Village where folks are trainign fishing by just dropping raw fish.\nCoincidentally, that\u0026rsquo;s one of the fastest ways to level up fishing as well\u0026hellip;\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve played the game these last 2 weeks I see that with enough money in the\ngame you are better off staying laser-focused on one skill at a time and then\nbuying the resoures needed for the other skills. For example, you can train\ncombat and prayer with giant frogs pretty effeciently since they drop \u003ccode\u003ebig bones\u003c/code\u003e. But it\u0026rsquo;s faster to just focus on killing the frogs for melee xp, and\nthen buying big bones to do focused bone-burying sessions at a bank, is going\nto be a better use of time, but at the cost of buying the bones instead of\nharvesting yourself. If you resign youself to this pattern of play, the game\npace moves a little quicker, the grind isn\u0026rsquo;t so exhausting, and the enjoyment\nis a big lighter (in a good way)\u003c/p\u003e\n",
      "content_text": "\n## Intro\n\nI got an itch to play a new game recently and after squabbling with my PS4 and\nmy PC I decided to go old school literally with Old School Runescape... I\nplayed this game so much as a kid and it's so well preserved in 2025. I tried\nto bang out a ton today and decided to look through a few guides to try to\nlevel up effeciently. \n\n## Quests\n\nThere's a handful of quests and several are pretty attainable early on that\ngive enough XP to blitz through the early levels of many skills...\n\nToday I made it through doric's quest which bumped be\nthrough to level 20+ mining. Another player gave me a black pick-axe which made\nmining some iron pretty easy. From there I wanted to level up smithing a bit -\nand the guides say that \"The Knight's Sword\" is a good quest for it, though\nit's recommended to be combat level 20 before doing it... I decided to not\nworry about that, I've picked red-berries for a pie and am going to bring a\nhaul of steaks and my black pick while I try to get the bluerite ore and run\naway from the ice giants that I know will destroy me at my whopping combat\nlevel 6... but for first day back I'm feeling great.\n\nAfter that my smithing levels should be in the teens... Not sure what we'll do after that\n\nI did do the Cook's Assistant while gathering things for the Knight's Sword,\neasy peasy and gets me access to the oven in Lumbridge Castle.\n\n## Plans\n\nI'm using Affine to map out my questing - the mind map is great for tracking\nwhy I'm 6 mini-side-quests removed from the original thing I was after.\n\n![20250815003021_4a18defc.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250815003021_4a18defc.png)\n\n## Update 01\n\nAfter about 2 weeks I've done most of othe free-to-play stuff, with just\nanother 2 quests to go. The game is so faitful to what I remember.\n\nI was thinking about how I would tackle a new account, and I am starting to\nunderstand the simple appeal of having alternate accounts - a \"pure mage\" for\nexample.... If money were no object then having a pure ranger and mage account\nwould be pretty fun, and with a powerful main I think it's possible to make\nplenty of in-game gold and just trade between accounts. To my knowledge, this\ndoesn't break any of the Jagex rules.\n\nPutting the idea of a \"pure\" anything aside, I was thinking about how I would\nmore efficiently have played to the point in the game I'm at right now... For\ngaining any combat xp the goal is the `rune scimitar`, which requires level 40\n`attack` to wield. The stronger you are (ie. higher `strength`) the more xp you\ncan gain per second. This means upping `attack` to level 40 with the best\nscimitar you can at every level until `rune` at 40, and then swapping to the\nstrength-gaining combat style and theoretically training `strength` to level 99,\nand then train `defense` and `attack` from `x` and `40` respectively to `99` is\nthe quickest way to do it.\n\nThe issue with this is that due to the level-scaling of the game, it's totally\nimpractical to do this and would suck all the fun out of the game. I think I\nhandled my melee combat leveling pretty well by keeping the 3 stats, `attack`,\n`strength`, `defense` more or less in step with each other up to 40, and from\nthen on began focusing primarily on `strength`.\n\nI've also spent plenty of time on `ranged` and `magic` but these are expensive\nto train quickly (and quickly isn't even THAT fast) due to resource consumption\n(arrows / runes). Now, I have plenty of resources in game, so training these\nhas been fine, but in a more vanilla situation they could mostly be forgotten\nabout until you've leveled up in `crafting` or `mining` and `smithing` for the\nsake of making some money.\n\nOn that note, combat can be paused from the onset and one can jump right to the\nmines with tin + copper -\u003e iron or else tan cowhides and craft leather...\neither way, upgrading these skills opens the door for money-making routines and\nif you have a good source of income in the game, then buying runes and arrows\nfor training is quite simple at the `grand exchange`\n\nThere are a few guides on the \"optimal\" way to play through the game depending\non what you want to optimize. Personally, upon thinking about it through writing I can\nsee how there's not a \"one right way\" to play the game \"most efficiently\".\n\nIf I were to start another account, not as one of these fancy schmancy \"pure\"\nones, I think I would train my melee stats to 40 via cows, chickens, and giant\nfrogs (then doubling up on prayer via `big bones`). The reason for this is that\nthere's places to mine and fish where the enemies are in level ranges 20-30 and\nit's convenient to avoid hostility (ie. being attacked on site)\n(south-east varrock mine for example isn't NEXT to the dark wizards, but they\nare close and if you are sub combat level 21 or something, they are hostile\ntowards you).\n\nThe other skills I hadn't thought about from the perspective of a guide are\nfiremaking, fishing, cooking, and woodcutting. Typically they're pretty easy to\ntrain together, but it's also really easy to focus on cooking by itself east of\nBarbarian Village where folks are trainign fishing by just dropping raw fish.\nCoincidentally, that's one of the fastest ways to level up fishing as well...\n\nI've played the game these last 2 weeks I see that with enough money in the\ngame you are better off staying laser-focused on one skill at a time and then\nbuying the resoures needed for the other skills. For example, you can train\ncombat and prayer with giant frogs pretty effeciently since they drop `big\nbones`. But it's faster to just focus on killing the frogs for melee xp, and\nthen buying big bones to do focused bone-burying sessions at a bank, is going\nto be a better use of time, but at the cost of buying the bones instead of\nharvesting yourself. If you resign youself to this pattern of play, the game\npace moves a little quicker, the grind isn't so exhausting, and the enjoyment\nis a big lighter (in a good way)\n",
      "summary": "I got an itch to play a new game recently and after squabbling with my PS4 and my PC I decided to go old school literally with Old School Runescape... I...",
      "date_published": "2025-08-14T19:25:55Z",
      "date_modified": "2025-08-14T19:25:55Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "runescape",
        "gaming"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-797/",
      "url": "https://pype.dev/thoughts-797/",
      "title": "💭 Setting up a Self-Hosted Forgejo Actions Runner with Docker Co…",
      "content_text": "\n\u003ca href=\"https://linus.dev/posts/setting-up-a-self-hosted-forgejo-actions-runner-with-docker-compose/\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://linus.dev/posts/setting-up-a-self-hosted-forgejo-actions-runner-with-docker-compose/\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - Setting up a Self-Hosted Forgejo Actions Runner with Docker Compose — Linus Groh\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://linus.dev/posts/setting-up-a-self-hosted-forgejo-actions-runner-with-docker-compose/\"\u003eSetting up a Self-Hosted Forgejo Actions Runner with Docker Compose — Linus Groh\u003c/a\u003e\n\n---\n\nAs I explore forgjeo this post has a title that sounds very promising! I would like everything to be a docker compose stack for now and I'm struggling a bit with the runner installation - I might be over-complicating it but some parts of the docs aren't as clear as I want them to be - hopefully this post is a good supplement\n\n---\n\nEDIT:\n\nI've read through this - it's definitely older than forgejo docs on compose, but I like the setup better... It's more of what I would've guessed whereas the official docs have a `dind` image being used it looks like to proxy the tcp traffic from the runner through to a docker engine running in a containerized environment... now that I say it out loud maybe I do like that better... regardless, looking forward to having some self-hosted actions running before EOD\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "As I explore forgjeo this post has a title that sounds very promising! I would like everything to be a docker compose st",
      "date_published": "2025-08-14T11:30:54Z",
      "date_modified": "2025-08-14T11:30:54Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "forjeo",
        "self-host",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/pair-acegamer-wireless-ps4-controller-with-pc/",
      "url": "https://pype.dev/pair-acegamer-wireless-ps4-controller-with-pc/",
      "title": "Pair AceGamer Wireless PS4 Controller With PC",
      "content_html": "\u003cp\u003eI bought a $20 PS4 knock-off controller recently as my PS4 controllers are 12\nyears old (to me!) and I bought them used before that\u0026hellip; the instructions for a\n$20 controller are obviously bad but a godsend redittor discovered the hidden\nsecret to pair this device with my computer! Instructions (for ps4) say to plug\nit in, hit the home button, and you\u0026rsquo;re paired. Now, that didn\u0026rsquo;t work on PC\nobviously, but it ALSO didn\u0026rsquo;t work on my PS4\u0026hellip; Unfortunte! It works wired just\nfine, but turns out the magic to send the thing into traditional Bluetooth\nPairing Mode is to hold the home and share buttons down - wait for a rapid few\nblinks - then you\u0026rsquo;ll see the controller in your bluetooth pairing menu!\u003c/p\u003e\n\u003cfigure\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250814115137_34c132cd.png\" alt=\"20250814115137_34c132cd.png\"\u003e\n\u003c/figure\u003e\n",
      "content_text": "\nI bought a $20 PS4 knock-off controller recently as my PS4 controllers are 12\nyears old (to me!) and I bought them used before that... the instructions for a\n$20 controller are obviously bad but a godsend redittor discovered the hidden\nsecret to pair this device with my computer! Instructions (for ps4) say to plug\nit in, hit the home button, and you're paired. Now, that didn't work on PC\nobviously, but it ALSO didn't work on my PS4... Unfortunte! It works wired just\nfine, but turns out the magic to send the thing into traditional Bluetooth\nPairing Mode is to hold the home and share buttons down - wait for a rapid few\nblinks - then you'll see the controller in your bluetooth pairing menu!\n\n![20250814115137_34c132cd.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250814115137_34c132cd.png)\n",
      "summary": "I bought a $20 PS4 knock-off controller recently as my PS4 controllers are 12 years old (to me!) and I bought them used before that... the instructions for a...",
      "date_published": "2025-08-14T06:51:12Z",
      "date_modified": "2025-08-14T06:51:12Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "gaming",
        "til",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/2025-08-14-notes/",
      "url": "https://pype.dev/2025-08-14-notes/",
      "title": "2025-08-14 Notes",
      "content_text": "\nyesterday: [[ 2025-08-13-notes ]]\n\n\n## Forgejo\n\n- need to setup my runner but I then I got [[starting-old-school-runescape-over-again]]\n",
      "summary": "yesterday: 2025-08-13-notes",
      "date_published": "2025-08-14T06:21:21Z",
      "date_modified": "2025-08-14T06:21:21Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/2025-08-13-notes/",
      "url": "https://pype.dev/2025-08-13-notes/",
      "title": "2025-08-13 Notes",
      "content_text": "\nyesterday: [[ 2025-08-12-notes ]]\n\n\n## Pilgrim's Creek\n\n- fish story about studying the same fish every day to become a good biologist\n- discussed many things, didn't actually record today\n- 4 hour chat... oof lol\n\n## Forjeo\n\n- spun it up (again?)\n- what I have up can't stay up - I had to `chown 777` the docker volume and idk why... will debug later, for now just playing around\n  - migrate function for my blog was easy\n  - need to learn a thing or 2 about forjeo actions now\n    - looks like I'll add a runner service, and a docker-in-docker service as a way for the runner to do docker stuff I guess... why don't we just give the runner the docker socket?\n",
      "summary": "yesterday: 2025-08-12-notes",
      "date_published": "2025-08-13T09:42:01Z",
      "date_modified": "2025-08-13T09:42:01Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/proxy-pull-docker-images-from-self-hosted-container-registry-through-self-hosted-repoflow/",
      "url": "https://pype.dev/proxy-pull-docker-images-from-self-hosted-container-registry-through-self-hosted-repoflow/",
      "title": "Proxy Pull Docker Images From Self-Hosted Container Registry Through Self-Hosted Repoflow",
      "content_html": "\u003cp\u003eThis post is a short write-up of an issue I had while exploring \u003ca href=\"https://repoflow.io\"\u003eReploflow\u003c/a\u003e - a\nsuper solid artifactory-esq replacement for the homelab (and enterprise!). I\u0026rsquo;ve been playing with\nit and have tried to setup a few artifact repos that I\u0026rsquo;m familiar with - docker\nand pypi.\u003c/p\u003e\n\u003ch2 id=\"pypi\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePyPi\u003c/span\u003e \u003ca href=\"#pypi\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThis isn\u0026rsquo;t a post about repoflow, but I had an issue with pypi and Tomer was\nEXTREMELY responsive in helping to fix my issue and patch repoflow within a day\nof me reporting the issue via email!\u003c/p\u003e\n\u003ch2 id=\"docker\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDocker\u003c/span\u003e \u003ca href=\"#docker\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eFor docker I have a few options I just wanted to see work - obviously\nproxy pull from Dockerhub for ease, but also in the interim I\u0026rsquo;d like to proxy\npull from my original container registry to avoid having to update any homelab config just yet.\nNow, obviously I\u0026rsquo;ll have to update all my build pipelines to start using\nrepoflow, and my homelab configuration to reference the repoflow docker\nrepository rather than my existing registry.\u003c/p\u003e\n\u003cp\u003eBut there\u0026rsquo;s something to bear in mind if maintaining that middle registry -\nturns out a there\u0026rsquo;s a default namespace in dockerhub \u003ccode\u003e/library/\u003c/code\u003e and repoflow\nexpects this standard across any docker registry, so it\u0026rsquo;s pull paths fully\nresolve to an incorrect tag if you don\u0026rsquo;t take this into account in your\nexisting infrastructure.\u003c/p\u003e\n\u003cp\u003eTLDR: if you tag an image \u003ccode\u003emyregistry/ubuntu:latest\u003c/code\u003e and push it\nthen try to pull it back through repoflow then repoflow expects the image to be\n\u003ccode\u003emyregistry/library/ubuntu:latest\u003c/code\u003e. I think repoflow should support\nconfigurating the namespace/org for the images - but in the meantime I can\ngo find all my images and update my build scripts to add /library/ to my\ntags\u0026hellip; or while I\u0026rsquo;m doing that I can just push to repoflow directly\u0026hellip; All in\nall, nice little lesson on namespaces in docker repos and third-party tooling.\u003c/p\u003e\n",
      "content_text": "\nThis post is a short write-up of an issue I had while exploring [Reploflow](https://repoflow.io) - a\nsuper solid artifactory-esq replacement for the homelab (and enterprise!). I've been playing with\nit and have tried to setup a few artifact repos that I'm familiar with - docker\nand pypi. \n\n## PyPi\n\nThis isn't a post about repoflow, but I had an issue with pypi and Tomer was\nEXTREMELY responsive in helping to fix my issue and patch repoflow within a day\nof me reporting the issue via email!\n\n## Docker\n\nFor docker I have a few options I just wanted to see work - obviously\nproxy pull from Dockerhub for ease, but also in the interim I'd like to proxy\npull from my original container registry to avoid having to update any homelab config just yet.\nNow, obviously I'll have to update all my build pipelines to start using\nrepoflow, and my homelab configuration to reference the repoflow docker\nrepository rather than my existing registry. \n\nBut there's something to bear in mind if maintaining that middle registry -\nturns out a there's a default namespace in dockerhub `/library/` and repoflow\nexpects this standard across any docker registry, so it's pull paths fully\nresolve to an incorrect tag if you don't take this into account in your\nexisting infrastructure.\n\nTLDR: if you tag an image `myregistry/ubuntu:latest` and push it\nthen try to pull it back through repoflow then repoflow expects the image to be\n`myregistry/library/ubuntu:latest`. I think repoflow should support\nconfigurating the namespace/org for the images - but in the meantime I can\ngo find all my images and update my build scripts to add /library/ to my\ntags... or while I'm doing that I can just push to repoflow directly... All in\nall, nice little lesson on namespaces in docker repos and third-party tooling. \n\n",
      "summary": "This post is a short write-up of an issue I had while exploring Reploflow - a super solid artifactory-esq replacement for the homelab (and enterprise!). I've...",
      "date_published": "2025-08-12T06:59:02Z",
      "date_modified": "2025-08-12T06:59:02Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "tech",
        "repoflow"
      ]
    },
    {
      "id": "https://pype.dev/2025-08-12-notes/",
      "url": "https://pype.dev/2025-08-12-notes/",
      "title": "2025-08-12 Notes",
      "content_text": "\nyesterday: [[ 2025-08-11-notes ]]\n\n## Thoughts\n\n- apprise needs to be the notification pillar...\n  - quadtask should just use it\n  - soonish\n  - $HOME (brainstorm an easier codename here)\n\n- with repoflow coming up, maybe forjeo is worth spinning up as well\n\n\n## Wins\n\n- sent 2 compassion letters this morning - had almost been 30 days since receiving Ebessa's.\n- repoflow docker push works after Tomer pointed out a repo setting aside from public/private\n\n```\n  ✗ docker push repoflow.paynepride.com/foo/docker-local/audiomass:latest\n  The push refers to repository [repoflow.paynepride.com/foo/docker-local/audiomass]\n  5f70bf18a086: Pushed \n  92aaf4e79f64: Pushed \n  f91eb324f949: Pushed \n  416bbf08d03f: Pushed \n  097100c76c15: Pushed \n  latest: digest: sha256:7ec012b0d0ace30aa9cb5ccd718ab0416fbed367243b6c738a9f52f58bc64738 size: 1362\n\n```\n\nIt also works with my registry if I force `/library/` namespace in my tags\n\n```\n\nnic in homelab-mono/python/test-repoflow-pypi   main   ×1  ×7  ×2 via   v3.12.8(test-repoflow-pypi)   (dev) 󰒄 \n❯ docker tag registry.paynepride.com/audiomass:latest registry.paynepride.com/library/audiomass:latest         \n\nnic in homelab-mono/python/test-repoflow-pypi   main   ×1  ×7  ×2 via   v3.12.8(test-repoflow-pypi)   (dev) 󰒄 \n❯ docker push registry.paynepride.com/library/audiomass                                               \nUsing default tag: latest\nThe push refers to repository [registry.paynepride.com/library/audiomass]\n5f70bf18a086: Mounted from dad-can-i-wear \n92aaf4e79f64: Mounted from audiomass \nf91eb324f949: Mounted from audiomass \n416bbf08d03f: Mounted from audiomass \n097100c76c15: Mounted from audiomass \nlatest: digest: sha256:7ec012b0d0ace30aa9cb5ccd718ab0416fbed367243b6c738a9f52f58bc64738 size: 1362\n\nnic in homelab-mono/python/test-repoflow-pypi   main   ×1  ×7  ×2 via   v3.12.8(test-repoflow-pypi)   (dev) 󰒄 \n❯ docker pull repoflow.paynepride.com/foo/paynepride/audiomass:latest\nlatest: Pulling from foo/paynepride/audiomass\nDigest: sha256:7ec012b0d0ace30aa9cb5ccd718ab0416fbed367243b6c738a9f52f58bc64738\nStatus: Downloaded newer image for repoflow.paynepride.com/foo/paynepride/audiomass:latest\nrepoflow.paynepride.com/foo/paynepride/audiomass:latest\n```\n\n- fixed the pull through dockerhub by removing my dockerhub credentials from repoflow remote repository configuration!\n",
      "summary": "yesterday: 2025-08-11-notes",
      "date_published": "2025-08-12T05:42:32Z",
      "date_modified": "2025-08-12T05:42:32Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/2025-08-11-notes/",
      "url": "https://pype.dev/2025-08-11-notes/",
      "title": "2025-08-11 Notes",
      "content_text": "\nyesterday: [[ 2025-08-10-notes ]]\n\n## Repoflow\n\n- talking with Tomer about my dockerhub issues now\n",
      "summary": "yesterday: 2025-08-10-notes",
      "date_published": "2025-08-11T07:26:45Z",
      "date_modified": "2025-08-11T07:26:45Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/a-simple-lua-plugin-to-find-my-drafts/",
      "url": "https://pype.dev/a-simple-lua-plugin-to-find-my-drafts/",
      "title": "A Simple Lua Plugin To Find My Drafts",
      "content_text": "\nI used windsurf to write [[daily-notes-neovim-plugin]] for navigating my daily notes in neovim.\n\nFor a while now I've wanted a way to see my blog drafts... and tonight finally got the massive courage to prompt gpt-5 to build it for me...\n\n## Screenshot\n\n\n![20250811020234_e0c02600.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250811020234_e0c02600.png)\n\n## Code\n\n```lua\n---@diagnostic disable: undefined-global\n-- Blogging plugin: find draft blog posts under `pages/`\n-- Draft = YAML front matter contains `published: false` (case-insensitive)\n\nlocal M = {}\n\n-- Read file and return YAML front matter block as string, or nil\nlocal function read_front_matter(path)\n  local fh = io.open(path, \"r\")\n  if not fh then\n    return nil\n  end\n  local content = fh:read(\"*a\")\n  fh:close()\n  if not content then\n    return nil\n  end\n\n  -- Front matter starts with --- on first line and ends with --- on its own line\n  -- Support optional CRLF\n  local start_s, start_e = content:find(\"^%-%-%-%s*\\r?\\n\")\n  if not start_e then\n    return nil\n  end\n  local fm_end_s, fm_end_e = content:find(\"\\n%-%-%-%s*\\r?\\n\", start_e + 1)\n  if not fm_end_s then\n    return nil\n  end\n  -- Extract between the fence lines (exclude the starting and ending --- lines)\n  local front_matter = content:sub(start_e + 1, fm_end_s)\n  return front_matter\nend\n\n-- Determine if a file is a draft by inspecting front matter for published: false\nfunction M._is_draft(path)\n  local fm = read_front_matter(path)\n  if not fm then\n    return false\n  end\n  -- Find a line starting with `published:` and capture the value\n  -- Trim comments and quotes, compare case-insensitively\n  local value = fm:match(\"[Pp][Uu][Bb][Ll][Ii][Ss][Hh][Ee][Dd]%s*:%s*([^\\n\\r]+)\")\n  if not value then\n    return false\n  end\n  -- strip inline comments starting with # and surrounding quotes/space\n  value = value:gsub(\"#.*$\", \"\")\n  value = value:gsub('\"', \"\"):gsub(\"'\", \"\")\n  value = value:gsub(\"^%s+\", \"\"):gsub(\"%s+$\", \"\")\n  local v = value:lower()\n  if v == \"false\" or v == \"no\" or v == \"0\" then\n    return true\n  end\n  return false\nend\n\n-- Telescope picker for draft posts\nfunction M.find_drafts()\n  local ok_pickers, pickers = pcall(require, \"telescope.pickers\")\n  if not ok_pickers then\n    vim.notify(\"telescope.nvim not available\", vim.log.levels.ERROR)\n    return\n  end\n  local finders = require(\"telescope.finders\")\n  local previewers = require(\"telescope.previewers\")\n  local conf = require(\"telescope.config\").values\n  local actions = require(\"telescope.actions\")\n  local action_state = require(\"telescope.actions.state\")\n\n  -- Collect markdown files under pages/\n  local files = vim.fn.glob(\"pages/**/*.md\", false, true)\n  local drafts = {}\n  for _, f in ipairs(files) do\n    if M._is_draft(f) then\n      table.insert(drafts, f)\n    end\n  end\n\n  if #drafts == 0 then\n    vim.notify(\"No draft blog posts found in pages/\", vim.log.levels.INFO)\n    return\n  end\n\n  -- Simple, version-agnostic entry maker\n  local function entry_maker_fn(line)\n    return {\n      value = line,\n      ordinal = line,\n      display = vim.fn.fnamemodify(line, \":~:.\") or line,\n      path = line,\n    }\n  end\n\n  -- Use Telescope builtin find_files with a custom command that lists only drafts.\n  -- This guarantees previews and matches the style of other file pickers.\n  local tmpfile = vim.fn.tempname()\n  local ok_write, err = pcall(function()\n    local fh = assert(io.open(tmpfile, \"w\"))\n    for _, f in ipairs(drafts) do\n      fh:write(f .. \"\\n\")\n    end\n    fh:close()\n  end)\n  if not ok_write then\n    vim.notify(\"Failed to prepare drafts list: \" .. tostring(err), vim.log.levels.ERROR)\n    return\n  end\n\n  local builtin = require(\"telescope.builtin\")\n  builtin.find_files({\n    prompt_title = \"Draft Blog Posts\",\n    -- cat the tmp list so Telescope treats it like find output\n    find_command = { \"bash\", \"-lc\", string.format('cat %q', tmpfile) },\n    attach_mappings = function(prompt_bufnr, map)\n      local actions = require(\"telescope.actions\")\n      actions.close:enhance({\n        post = function()\n          os.remove(tmpfile)\n        end,\n      })\n      return true\n    end,\n  })\nend\n\n-- Expose a user command similar to daily plugin style\nvim.api.nvim_create_user_command(\"BlogDrafts\", function()\n  M.find_drafts()\nend, {})\n\nreturn M\n\n\n```\n\n\n",
      "summary": "I used windsurf to write daily-notes-neovim-plugin for navigating my daily notes in neovim.",
      "date_published": "2025-08-10T20:56:33Z",
      "date_modified": "2025-08-10T20:56:33Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "neovim",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/audiomass/",
      "url": "https://pype.dev/audiomass/",
      "title": "AudioMass",
      "content_html": "\u003cp\u003eI edit our church\u0026rsquo;s recorded sermons every week and upload them to our website.\nIt\u0026rsquo;s very simple, and the editing is just cutting the audio file down on the\nfront and back sides of extra stuff picked up while the mic was on. I\u0026rsquo;ve been\ndoing this for a while using Davinci Resolve which is WAY too heavy for\ntrimming audio files but I\u0026rsquo;m loosely familiar with it and so I just have been\ndealing with the pain of long start up, overly complicated organization, etc.\nWell it\u0026rsquo;s been buggy on Aurora for me and a few weeks ago I got sick of it\nfinally and tried KdenLive\u0026hellip;. Now this is a great tool, but again I\u0026rsquo;m just\ncutting up some audio files, why is this hard?\u003c/p\u003e\n\u003cp\u003eDouble finally I just did some research and after a few minutes found\n\u003ca href=\"https://github.com/pkalogiros/AudioMass\"\u003eaudiomass\u003c/a\u003e which I immediately forked\nand dockerized cause it\u0026rsquo;s so simple and beautiful!\u003c/p\u003e\n\u003cp\u003eNow I have a little webapp to trim these files from - almost such that the tech\nlead on Sunday could maybe do this instead of me!\u003c/p\u003e\n\u003cfigure\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250810191909_cc0dc2d7.png\" alt=\"20250810191909_cc0dc2d7.png\"\u003e\n\u003c/figure\u003e\n\u003cp\u003eYou can check it out on \u003ca href=\"https://github.com/pypeaday/audiomass\"\u003emy github\u003c/a\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eclone\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edocker compose up -d\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ehttp://localhost:5056\u003c/code\u003e to begin trimming audio locally!\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\nI edit our church's recorded sermons every week and upload them to our website.\nIt's very simple, and the editing is just cutting the audio file down on the\nfront and back sides of extra stuff picked up while the mic was on. I've been\ndoing this for a while using Davinci Resolve which is WAY too heavy for\ntrimming audio files but I'm loosely familiar with it and so I just have been\ndealing with the pain of long start up, overly complicated organization, etc.\nWell it's been buggy on Aurora for me and a few weeks ago I got sick of it\nfinally and tried KdenLive.... Now this is a great tool, but again I'm just\ncutting up some audio files, why is this hard?\n\nDouble finally I just did some research and after a few minutes found\n[audiomass](https://github.com/pkalogiros/AudioMass) which I immediately forked\nand dockerized cause it's so simple and beautiful!\n\nNow I have a little webapp to trim these files from - almost such that the tech\nlead on Sunday could maybe do this instead of me!\n\n![20250810191909_cc0dc2d7.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250810191909_cc0dc2d7.png)\n\nYou can check it out on [my github](https://github.com/pypeaday/audiomass)\n\n  - clone\n  - `docker compose up -d`\n  - `http://localhost:5056` to begin trimming audio locally!\n",
      "summary": "I edit our church's recorded sermons every week and upload them to our website. It's very simple, and the editing is just cutting the audio file down on the...",
      "date_published": "2025-08-10T14:17:43Z",
      "date_modified": "2025-08-10T14:17:43Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "sermons",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/2025-08-10-notes/",
      "url": "https://pype.dev/2025-08-10-notes/",
      "title": "2025-08-10 Notes",
      "content_text": "\nyesterday: [[ 2025-08-09-notes ]]\n\n## New\n\n- trying out [https://github.com/matda59/ChoresRewards](ChoresRewards). It looks obviously vibe-coded, could re-vibe it myself if it looks great... Needing a way at home to help track and reward chores for both myself and the kids now\n  - it's ok... have to put the pin code in everypage refresh which is super annoying\n  - rewrite in fastapi with easier auth mechanisms would be nice\n\n## Issues\n\n- repoflow pypi\n  - can't pip install from repoflow with remote repo configured for pypi with public access\n  - emailed tomer\n  - have gone back and forth several times - very responsive guy... makes me even more exicted for the project\n  - Tomer has been very helpful - we iterated async today and got the pypi issue resolved\n\n- repoflow dockerhub\n  - unfortunately have issues with remote repos for dockerhub and my self-hosted container registry... \n  - sent tomer another email\n\n- traefik logs dahsboard\n  - tried to spin it up but it's confusing\n  - otel and file logs... do i need both?\n  - traefik config failing to be parsed when I add the otel config\n\n## Wins:\n\n- updated my [[daily-notes-neovim-plugin#Update]] plugin to auto-add \"yesterday: \" at the top of my new notes with the most previous day's wikilink pasted in there\n- started a blogging plugin with shortcut to bring up all my drafts\n  - [[a-simple-lua-plugin-to-find-my-drafts]]\n- printer got all clogged up the other day - this glow in the dark filament is\nchallenging sometimes... after much toil this morning I was able to pull it all\nthe way out of the extruder mechanism and get Rob's print going in boring white\nfor now\n\n- [[quadtask]] is deployed from my desktop now\n  - litestream backup working beautifully\n\n- stood up [[audiomass]] and it's gonna save me anywhere from 10-60 minutes every Sunday!\n",
      "summary": "yesterday: 2025-08-09-notes",
      "date_published": "2025-08-10T05:52:42Z",
      "date_modified": "2025-08-10T05:52:42Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/2025-08-09-notes/",
      "url": "https://pype.dev/2025-08-09-notes/",
      "title": "2025-08-09 Notes",
      "content_text": "\nyesterday: [[ 2025-08-08-notes ]]\n\n## RepoFlow\n\n- requested free license for [repoflow](https://docs.repoflow.io/Self-Hosting/licensing) which I might be able to use for my platform artifact storage at home\n- Got it spun up, been talking with Tomer, the guy who sent me the license.\n- repoflow is like an artifactory replacement - artifact storage... overkill for my homelab, but interesting. And might be a component I package up with $HOME... need to have a good name for that thing still\n\n## Things\n\n-  Will plan to finish  [[olivet-mens-group-august-2025]] this week for next saturday\n- would like to write mote about [[when-i-learned-what-an-escape-room-was]]\n- need temp graph on [[dad-can-i-wear-this]] but man windsurf has sucked at adding this the last few times I've tried and I ain't no web dev!\n\nBeen hard to be motivated to push through on almost anything lately... trying at least to just not lose sight of things I want to do and to do small things as I can...\n\n## Wins\n\n- stood up repoflow for first time\n",
      "summary": "yesterday: 2025-08-08-notes",
      "date_published": "2025-08-09T06:47:48Z",
      "date_modified": "2025-08-09T06:47:48Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/2025-08-08-notes/",
      "url": "https://pype.dev/2025-08-08-notes/",
      "title": "2025-08-08 Notes",
      "content_text": "\nyesterday: [[ 2025-08-07-notes ]]\n\n- did some work on - [[thoughts-to-nostr]]\n\n\n## TODO\n-  [[olivet-mens-group-august-2025]]\n- started [[when-i-learned-what-an-escape-room-was]]\n\n## Wins\n\n- Postiz 2.0 came out recently and I got my [PR](https://github.com/gitroomhq/postiz-app/pull/824) to work with it at home\n- decided to *kill* ~moved~ home-automation-pipelines ~to homelab-mono~\n\n",
      "summary": "yesterday: 2025-08-07-notes",
      "date_published": "2025-08-08T08:54:22Z",
      "date_modified": "2025-08-08T08:54:22Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/using-litestream-to-restore-my-database-for-easy-development/",
      "url": "https://pype.dev/using-litestream-to-restore-my-database-for-easy-development/",
      "title": "Using Litestream to Restore My Database for Easy Development",
      "content_text": "\n# Litestream\n\nsee [[using-litestream-to-backup-quadtasks-sqlite-db]] for how I setup litestream replication for [[quadtask]]\n\nI have the entrypoint to my app container check if the sqlite database exists\nor not - in production or with local volume mounts, it will and then we start\nlitestream replication and then the app like normal. But what's awesome about\nthis little trick I got from [this litestream\nexample](https://github.com/benbjohnson/litestream-docker-example/tree/main) is\nI can docker compose up locally without the data directory volume mounted in,\nand get a fresh copy of my production data right there locally to work with!\n\nMy entrypoint script now looks like:\n\n```bash\n#!/bin/bash\n\n# Exit on error, undefined vars, and fail on pipe errors\nset -euo pipefail\n# Restore the database if it does not already exist.\nif [ -f /app/data/quadtask.db ]; then\n echo \"Database already exists, skipping restore\"\nelse\n echo \"No database found, restoring from replica if exists\"\n litestream restore -v /app/data/quadtask.db\nfi\n# Run litestream with your app as the subprocess.\nexec litestream replicate -exec \"uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload --log-level debug\"\n\n```\n\n## Appropriate and Safe Replication\n\nThe way to get prod data in automatically is to restore from the production\nbackup but I don't want to replicate to the production backup with my local\nwork, so it's not the best but I have a manual step that makes it pretty easy\n\nI first `just sync-db`\n\n```bash\n# Sync production database locally\nsync-db:\n    fly ssh console -a quadtask -C 'cat /app/data/quadtask.db' \u003e ./litestream/source/quadtask-prod.db\n```\n\nand this brings my database down to a folder I maintain locally.\n\nI have litestream installed on my desktop obviously, and here's the relevant litestream configuration I use:\n\n```yaml\ndbs:\n  - path: /home/nic/projects/personal/quadtask/litestream/source/quadtask-prod.db\n    replicas:\n      - name: quadtask-prod\n        type: s3\n        bucket: litestream\n        path: quadtask-local\n        endpoint: s3.example.com\n        skip-verify: false\n        region: us-east-1\n```\n\nSo on my desktop if I `litestream replicate` then basically I'm taking the\noutput of `just synd-db` and replicating to my litestream bucket to the\n`quadtask-local` path.\n\nThen I start up my app, it restores from that point and I'm working with fresh\nprod data!\n\n## How To Handle Environments?\n\nI have this working for different environments too, with a little bit of\nprocess but basically thanks to [litestream expanding env\nvars](https://litestream.io/reference/config/#variable-expansion) in the config\nwe can do something like this:\n\n```yaml\ndbs:\n  - path: /app/data/quadtask.db\n    replicas:\n      - name: quadtask\n        type: s3\n        bucket: litestream\n        path: quadtask-${ENVIRONMENT}\n        endpoint: s3.example.com\n        skip-verify: false\n        region: us-east-1\n```\n\nAnd so wherever I spin up quadtask: local, dev, or prod - the replication will\nhappen to and from a different path in my litestream bucket!\n\n# Update\n\nI updated the `docker-entrypoint.sh` of my quadtask container to look like this now:\n\n```bash\n\n# Restore the database if it does not already exist.\nif [ -f /app/data/quadtask.db ]; then\n echo \"Database already exists, skipping restore\"\nelse\n echo \"No database found, restoring from replica\"\n ENVIRONMENT=\"prod\" litestream restore -v /app/data/quadtask.db\nfi\n# Run litestream with your app as the subprocess.\nexec litestream replicate -exec \"uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload --log-level debug\"\n\n```\n\nThe `if` block checks if there's a db at the filepath it should be in in the continer - if it's not there is the little bit of magic to me right now...\n\nMy litestream config has a parameterized `ENVIRONMENT` variable in the db path,\nso by overwritting it for just the `restore` command, I can very simply always\npull a fresh copy of the prod database into an ephemeral container to test\nthings against real data in a very convenient way\n",
      "summary": "see using-litestream-to-backup-quadtasks-sqlite-db for how I setup litestream replication for quadtask",
      "date_published": "2025-08-07T15:14:45Z",
      "date_modified": "2025-08-07T15:14:45Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "litestream",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/migrate-github-issues-to-kanboard/",
      "url": "https://pype.dev/migrate-github-issues-to-kanboard/",
      "title": "Migrate Github Issues to Kanboard",
      "content_html": "\u003cp\u003eI am working on shifting everything, or as much as I reasonably can, related to\ndev for myself to on-prem, including git and CI/CD. So for Quadtask I had a\nbunch of Github issues that I wanted to migrate to my kanboard instance, gpt-5\ndid a bang-up job on this script\u003c/p\u003e\n\u003cp\u003eIt gets each issue, creates a tag for each label, creates the kanboard ticket, then closes the github issue\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\"\u003e\u003cspan class=\"c1\"\u003e#!/bin/bash\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=\"c1\"\u003e# GitHub to Kanboard Issue Migration Script\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Uses GitHub CLI (gh) and curl to migrate issues\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=\"c1\"\u003e# Exit on error\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eset\u003c/span\u003e -e\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=\"c1\"\u003e# Check required environment variables\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e var in KANBOARD_URL KANBOARD_TOKEN GH_TOKEN QUADTASK_KANBOARD_PROJECT_ID\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e -z \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"p\"\u003e!var\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e]\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Error: \u003c/span\u003e\u003cspan class=\"nv\"\u003e$var\u003c/span\u003e\u003cspan class=\"s2\"\u003e is not set\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nb\"\u003eexit\u003c/span\u003e \u003cspan class=\"m\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edone\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=\"c1\"\u003e# GitHub repository (default: pypeaday/quadtask)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eGITHUB_REPO\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eGITHUB_REPO\u003c/span\u003e\u003cspan class=\"k\"\u003e:-\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;pypeaday/quadtask\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\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=\"c1\"\u003e# Kanboard API endpoint\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eKANBOARD_API\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$KANBOARD_URL\u003c/span\u003e\u003cspan class=\"s2\"\u003e/jsonrpc.php\u0026#34;\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=\"c1\"\u003e# Get all open issues from GitHub\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Fetching open issues from \u003c/span\u003e\u003cspan class=\"nv\"\u003e$GITHUB_REPO\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=\"nv\"\u003eISSUES_JSON\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003egh issue list --repo \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$GITHUB_REPO\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e --state open --limit \u003cspan class=\"m\"\u003e1000\u003c/span\u003e --json number,title,body,labels\u003cspan class=\"k\"\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=\"c1\"\u003e# Count issues\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eISSUE_COUNT\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003e\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$ISSUES_JSON\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e jq \u003cspan class=\"s1\"\u003e\u0026#39;. | length\u0026#39;\u003c/span\u003e\u003cspan class=\"k\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Found \u003c/span\u003e\u003cspan class=\"nv\"\u003e$ISSUE_COUNT\u003c/span\u003e\u003cspan class=\"s2\"\u003e open issues\u0026#34;\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=\"c1\"\u003e# Process each issue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$ISSUES_JSON\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e jq -c \u003cspan class=\"s1\"\u003e\u0026#39;.[]\u0026#39;\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"k\"\u003ewhile\u003c/span\u003e \u003cspan class=\"nb\"\u003eread\u003c/span\u003e -r issue\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Extract issue details\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nv\"\u003eNUMBER\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003e\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$issue\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e jq -r \u003cspan class=\"s1\"\u003e\u0026#39;.number\u0026#39;\u003c/span\u003e\u003cspan class=\"k\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nv\"\u003eTITLE\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003e\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$issue\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e jq -r \u003cspan class=\"s1\"\u003e\u0026#39;.title\u0026#39;\u003c/span\u003e\u003cspan class=\"k\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nv\"\u003eBODY\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003e\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$issue\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e jq -r \u003cspan class=\"s1\"\u003e\u0026#39;.body // \u0026#34;\u0026#34;\u0026#39;\u003c/span\u003e\u003cspan class=\"k\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Extract label names as a JSON array\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nv\"\u003eLABELS_JSON\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003e\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$issue\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e jq -c \u003cspan class=\"s1\"\u003e\u0026#39;[.labels[]?.name] // []\u0026#39;\u003c/span\u003e\u003cspan class=\"k\"\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=\"c1\"\u003e# Prepare Kanboard task data\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nv\"\u003eREQUEST_DATA\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003ejq -n \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        --arg method \u003cspan class=\"s2\"\u003e\u0026#34;createTask\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        --argjson id \u003cspan class=\"m\"\u003e1\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        --arg jsonrpc \u003cspan class=\"s2\"\u003e\u0026#34;2.0\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        --arg title \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$TITLE\u003c/span\u003e\u003cspan class=\"s2\"\u003e\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        --arg description \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$BODY\u003c/span\u003e\u003cspan class=\"s2\"\u003e\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        --arg project_id \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$QUADTASK_KANBOARD_PROJECT_ID\u003c/span\u003e\u003cspan class=\"s2\"\u003e\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        \u003cspan class=\"s1\"\u003e\u0026#39;{\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e            \u0026#34;jsonrpc\u0026#34;: $jsonrpc,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e            \u0026#34;method\u0026#34;: $method,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e            \u0026#34;id\u0026#34;: $id,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e            \u0026#34;params\u0026#34;: {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e                \u0026#34;title\u0026#34;: $title,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e                \u0026#34;description\u0026#34;: $description,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e                \u0026#34;project_id\u0026#34;: $project_id\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e            }\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e        }\u0026#39;\u003c/span\u003e\u003cspan class=\"k\"\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=\"c1\"\u003e# Create task in Kanboard\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Creating task: \u003c/span\u003e\u003cspan class=\"nv\"\u003e$TITLE\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=\"nv\"\u003eRESPONSE\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003ecurl -s -X POST \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        -H \u003cspan class=\"s2\"\u003e\u0026#34;Content-Type: application/json\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        -u \u003cspan class=\"s2\"\u003e\u0026#34;jsonrpc:\u003c/span\u003e\u003cspan class=\"nv\"\u003e$KANBOARD_TOKEN\u003c/span\u003e\u003cspan class=\"s2\"\u003e\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        -d \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$REQUEST_DATA\u003c/span\u003e\u003cspan class=\"s2\"\u003e\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        \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$KANBOARD_API\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"k\"\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=\"c1\"\u003e# Check for errors\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$RESPONSE\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e jq -e \u003cspan class=\"s1\"\u003e\u0026#39;.error\u0026#39;\u003c/span\u003e \u0026gt; /dev/null\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Error creating task: \u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003e\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$RESPONSE\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e jq -r \u003cspan class=\"s1\"\u003e\u0026#39;.error.message\u0026#39;\u003c/span\u003e\u003cspan class=\"k\"\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=\"k\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nv\"\u003eTASK_ID\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003e\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$RESPONSE\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e jq -r \u003cspan class=\"s1\"\u003e\u0026#39;.result\u0026#39;\u003c/span\u003e\u003cspan class=\"k\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Created task ID: \u003c/span\u003e\u003cspan class=\"nv\"\u003e$TASK_ID\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"c1\"\u003e# If there are labels, set them as Kanboard tags on the task\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003e\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$LABELS_JSON\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e jq \u003cspan class=\"s1\"\u003e\u0026#39;length\u0026#39;\u003c/span\u003e\u003cspan class=\"k\"\u003e)\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e -gt \u003cspan class=\"m\"\u003e0\u003c/span\u003e \u003cspan class=\"o\"\u003e]\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Setting tags on task \u003c/span\u003e\u003cspan class=\"nv\"\u003e$TASK_ID\u003c/span\u003e\u003cspan class=\"s2\"\u003e: \u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003e\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$LABELS_JSON\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e jq -r \u003cspan class=\"s1\"\u003e\u0026#39;join(\u0026#34;, \u0026#34;)\u0026#39;\u003c/span\u003e\u003cspan class=\"k\"\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=\"nv\"\u003eTAGS_REQUEST\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003ejq -n \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                --arg jsonrpc \u003cspan class=\"s2\"\u003e\u0026#34;2.0\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                --arg method \u003cspan class=\"s2\"\u003e\u0026#34;setTaskTags\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                --argjson id \u003cspan class=\"m\"\u003e2\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                --arg project_id \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$QUADTASK_KANBOARD_PROJECT_ID\u003c/span\u003e\u003cspan class=\"s2\"\u003e\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                --arg task_id \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$TASK_ID\u003c/span\u003e\u003cspan class=\"s2\"\u003e\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                --argjson tags \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$LABELS_JSON\u003c/span\u003e\u003cspan class=\"s2\"\u003e\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                \u003cspan class=\"s1\"\u003e\u0026#39;{\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e                    jsonrpc: $jsonrpc,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e                    method: $method,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e                    id: $id,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e                    params: {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e                        project_id: $project_id,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e                        task_id: $task_id,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e                        tags: $tags\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e                    }\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e                }\u0026#39;\u003c/span\u003e\u003cspan class=\"k\"\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=\"nv\"\u003eTAGS_RESPONSE\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003ecurl -s -X POST \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                -H \u003cspan class=\"s2\"\u003e\u0026#34;Content-Type: application/json\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                -u \u003cspan class=\"s2\"\u003e\u0026#34;jsonrpc:\u003c/span\u003e\u003cspan class=\"nv\"\u003e$KANBOARD_TOKEN\u003c/span\u003e\u003cspan class=\"s2\"\u003e\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                -d \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$TAGS_REQUEST\u003c/span\u003e\u003cspan class=\"s2\"\u003e\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                \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$KANBOARD_API\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"k\"\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=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$TAGS_RESPONSE\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e jq -e \u003cspan class=\"s1\"\u003e\u0026#39;.error\u0026#39;\u003c/span\u003e \u0026gt; /dev/null\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Warning: Failed to set tags: \u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003e\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$TAGS_RESPONSE\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e jq -r \u003cspan class=\"s1\"\u003e\u0026#39;.error.message\u0026#39;\u003c/span\u003e\u003cspan class=\"k\"\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=\"k\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Tags set successfully\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003efi\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=\"c1\"\u003e# Close the corresponding GitHub issue to avoid duplicates\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nv\"\u003eTASK_URL\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eKANBOARD_URL\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e/?controller=TaskViewController\u0026amp;action=show\u0026amp;task_id=\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eTASK_ID\u003c/span\u003e\u003cspan class=\"si\"\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=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Closing GitHub issue #\u003c/span\u003e\u003cspan class=\"nv\"\u003e$NUMBER\u003c/span\u003e\u003cspan class=\"s2\"\u003e with comment linking to Kanboard task...\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e gh issue close \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$NUMBER\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e --repo \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$GITHUB_REPO\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e --comment \u003cspan class=\"s2\"\u003e\u0026#34;Migrated to Kanboard task \u003c/span\u003e\u003cspan class=\"nv\"\u003e$TASK_ID\u003c/span\u003e\u003cspan class=\"s2\"\u003e: \u003c/span\u003e\u003cspan class=\"nv\"\u003e$TASK_URL\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u0026gt;/dev/null\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Closed GitHub issue #\u003c/span\u003e\u003cspan class=\"nv\"\u003e$NUMBER\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=\"k\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Warning: Failed to close GitHub issue #\u003c/span\u003e\u003cspan class=\"nv\"\u003e$NUMBER\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=\"k\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efi\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=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;----------------------------------------\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edone\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=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Migration completed\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nI am working on shifting everything, or as much as I reasonably can, related to\ndev for myself to on-prem, including git and CI/CD. So for Quadtask I had a\nbunch of Github issues that I wanted to migrate to my kanboard instance, gpt-5\ndid a bang-up job on this script\n\nIt gets each issue, creates a tag for each label, creates the kanboard ticket, then closes the github issue\n\n```bash\n\n#!/bin/bash\n\n# GitHub to Kanboard Issue Migration Script\n# Uses GitHub CLI (gh) and curl to migrate issues\n\n# Exit on error\nset -e\n\n# Check required environment variables\nfor var in KANBOARD_URL KANBOARD_TOKEN GH_TOKEN QUADTASK_KANBOARD_PROJECT_ID; do\n    if [ -z \"${!var}\" ]; then\n        echo \"Error: $var is not set\"\n        exit 1\n    fi\ndone\n\n# GitHub repository (default: pypeaday/quadtask)\nGITHUB_REPO=${GITHUB_REPO:-\"pypeaday/quadtask\"}\n\n# Kanboard API endpoint\nKANBOARD_API=\"$KANBOARD_URL/jsonrpc.php\"\n\n# Get all open issues from GitHub\necho \"Fetching open issues from $GITHUB_REPO...\"\nISSUES_JSON=$(gh issue list --repo \"$GITHUB_REPO\" --state open --limit 1000 --json number,title,body,labels)\n\n# Count issues\nISSUE_COUNT=$(echo \"$ISSUES_JSON\" | jq '. | length')\necho \"Found $ISSUE_COUNT open issues\"\n\n# Process each issue\necho \"$ISSUES_JSON\" | jq -c '.[]' | while read -r issue; do\n    # Extract issue details\n    NUMBER=$(echo \"$issue\" | jq -r '.number')\n    TITLE=$(echo \"$issue\" | jq -r '.title')\n    BODY=$(echo \"$issue\" | jq -r '.body // \"\"')\n    # Extract label names as a JSON array\n    LABELS_JSON=$(echo \"$issue\" | jq -c '[.labels[]?.name] // []')\n    \n    # Prepare Kanboard task data\n    REQUEST_DATA=$(jq -n \\\n        --arg method \"createTask\" \\\n        --argjson id 1 \\\n        --arg jsonrpc \"2.0\" \\\n        --arg title \"$TITLE\" \\\n        --arg description \"$BODY\" \\\n        --arg project_id \"$QUADTASK_KANBOARD_PROJECT_ID\" \\\n        '{\n            \"jsonrpc\": $jsonrpc,\n            \"method\": $method,\n            \"id\": $id,\n            \"params\": {\n                \"title\": $title,\n                \"description\": $description,\n                \"project_id\": $project_id\n            }\n        }')\n    \n    # Create task in Kanboard\n    echo \"Creating task: $TITLE\"\n    RESPONSE=$(curl -s -X POST \\\n        -H \"Content-Type: application/json\" \\\n        -u \"jsonrpc:$KANBOARD_TOKEN\" \\\n        -d \"$REQUEST_DATA\" \\\n        \"$KANBOARD_API\")\n    \n    # Check for errors\n    if echo \"$RESPONSE\" | jq -e '.error' \u003e /dev/null; then\n        echo \"Error creating task: $(echo \"$RESPONSE\" | jq -r '.error.message')\"\n    else\n        TASK_ID=$(echo \"$RESPONSE\" | jq -r '.result')\n        echo \"Created task ID: $TASK_ID\"\n\n        # If there are labels, set them as Kanboard tags on the task\n        if [ \"$(echo \"$LABELS_JSON\" | jq 'length')\" -gt 0 ]; then\n            echo \"Setting tags on task $TASK_ID: $(echo \"$LABELS_JSON\" | jq -r 'join(\", \")')\"\n            TAGS_REQUEST=$(jq -n \\\n                --arg jsonrpc \"2.0\" \\\n                --arg method \"setTaskTags\" \\\n                --argjson id 2 \\\n                --arg project_id \"$QUADTASK_KANBOARD_PROJECT_ID\" \\\n                --arg task_id \"$TASK_ID\" \\\n                --argjson tags \"$LABELS_JSON\" \\\n                '{\n                    jsonrpc: $jsonrpc,\n                    method: $method,\n                    id: $id,\n                    params: {\n                        project_id: $project_id,\n                        task_id: $task_id,\n                        tags: $tags\n                    }\n                }')\n\n            TAGS_RESPONSE=$(curl -s -X POST \\\n                -H \"Content-Type: application/json\" \\\n                -u \"jsonrpc:$KANBOARD_TOKEN\" \\\n                -d \"$TAGS_REQUEST\" \\\n                \"$KANBOARD_API\")\n\n            if echo \"$TAGS_RESPONSE\" | jq -e '.error' \u003e /dev/null; then\n                echo \"Warning: Failed to set tags: $(echo \"$TAGS_RESPONSE\" | jq -r '.error.message')\"\n            else\n                echo \"Tags set successfully\"\n            fi\n        fi\n\n        # Close the corresponding GitHub issue to avoid duplicates\n        TASK_URL=\"${KANBOARD_URL}/?controller=TaskViewController\u0026action=show\u0026task_id=${TASK_ID}\"\n        echo \"Closing GitHub issue #$NUMBER with comment linking to Kanboard task...\"\n        if gh issue close \"$NUMBER\" --repo \"$GITHUB_REPO\" --comment \"Migrated to Kanboard task $TASK_ID: $TASK_URL\" \u003e/dev/null; then\n            echo \"Closed GitHub issue #$NUMBER\"\n        else\n            echo \"Warning: Failed to close GitHub issue #$NUMBER\"\n        fi\n    fi\n    \n    echo \"----------------------------------------\"\ndone\n\necho \"Migration completed\"\n```\n",
      "summary": "I am working on shifting everything, or as much as I reasonably can, related to dev for myself to on-prem, including git and CI/CD. So for Quadtask I had a...",
      "date_published": "2025-08-07T14:43:27Z",
      "date_modified": "2025-08-07T14:43:27Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "kanboard",
        "til",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/2025-08-07-notes/",
      "url": "https://pype.dev/2025-08-07-notes/",
      "title": "2025-08-07 Notes",
      "content_text": "\nyesterday: [[ 2025-08-06-notes ]]\n\n- started [[autism-and-steadfast-faith]]\n- almost forgot about apprise\n- worked more on [[olivet-mens-group-august-2025]]\n\n## Wins\n\n- published [[using-litestream-to-backup-quadtasks-sqlite-db]] \n- published [[using-litestream-to-restore-my-database-for-easy-development]]\n",
      "summary": "yesterday: 2025-08-06-notes",
      "date_published": "2025-08-07T05:54:17Z",
      "date_modified": "2025-08-07T05:54:17Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/2025-08-06-notes/",
      "url": "https://pype.dev/2025-08-06-notes/",
      "title": "2025-08-06 Notes",
      "content_text": "\nyesterday - [[ 2025-08-05-notes ]]\n\nreminder: [[now]] for what I'm doing\n",
      "summary": "yesterday - 2025-08-05-notes",
      "date_published": "2025-08-06T07:19:42Z",
      "date_modified": "2025-08-06T07:19:42Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/using-litestream-to-backup-quadtasks-sqlite-db/",
      "url": "https://pype.dev/using-litestream-to-backup-quadtasks-sqlite-db/",
      "title": "Using Litestream to Backup QuadTask’s SQLite DB",
      "content_text": "\n# Litestream\n\nThis post will be a walkthrough of installing [[litestream]] in a docker container\nthat runs my FastAPI app in order to replicate the sqlite db in the data volume\ncurrently hosted in Fly's volume manager to my MinIO instance. From there, on\nmy development machine I can use litestream to restore the prod database to my\ndev environment to practice whatever I may need to practice with real\nproduction data!\n\n## Dockerfile\n\nInstalling litestream in the dockerfile is 2-3 lines of code - no sweat. Configuration file is further down the post.\n\n```dockerfile\nFROM python:3.11-slim\nWORKDIR /app\n\n# Install uv\nCOPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/\n\n# Install litestream\nADD https://github.com/benbjohnson/litestream/releases/download/v0.3.8/litestream-v0.3.8-linux-amd64-static.tar.gz /tmp/litestream.tar.gz\nRUN tar -C /usr/local/bin -xzf /tmp/litestream.tar.gz\nCOPY etc/litestream.yml /etc/litestream.yml\n\n# Install dependencies\nCOPY requirements.txt .\nRUN uv pip install --no-cache -r requirements.txt\n\n# Copy the rest of the application\nCOPY . .\n\n# Install the app package in development mode\nRUN uv pip install -e .\n\n# Run the application\nCMD [\"docker-entrypoint.sh\"]\n\n```\n\n## Litestream Configuration\n\nTaking care to set `ENVIRONMENT` appropriately in each environment, the\nlitestream configuration gets that env var templated out to the path for the\nlitestream target. See [docs](https://litestream.io/reference/config/#variable-expansion)\n\n```yaml\n#/etc/litestream.yml\ndbs:\n- path: /app/data/quadtask.db\n  replicas:\n  - name: quadtask\n    type: s3\n    bucket: litestream\n    path: quadtask-${ENVIRONMENT}\n    endpoint: s3.example.com\n    skip-verify: false\n    region: us-east-1\n```\n\n## Authentication\n\nIn your docker container you'll need to set `LITESTREAM_ACCESS_KEY_ID` and\n`LITESTREAM_SECRET_ACCESS_KEY` which you setup in Minio - see\n[[setup-remote-minio-s3-backend-target-for-litestream]]. I have these set as\nsecrets in my fly configuration, and locally in a .env file that gets sourced\nwith my compose stack\n\n## Example Log from Dev\n\nMy fly dev machine has this log message showing the `ENVIRONMENT` var `dev` gets expanded into the config so the s3 path includes `quadtask-dev`\n\n`replicating to: name=\"quadtask\" type=\"s3\" bucket=\"litestream\" path=\"quadtask-dev\" region=\"us-east-1\" endpoint=\"s3.\u003credacted\u003e.com\" sync-interval=1s`\n\n## Example Usage for Local Development\n\n- [[using-litestream-to-restore-my-database-for-easy-development]]\n",
      "summary": "This post will be a walkthrough of installing litestream in a docker container that runs my FastAPI app in order to replicate the sqlite db in the data...",
      "date_published": "2025-08-05T19:34:19Z",
      "date_modified": "2025-08-05T19:34:19Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "litestream",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-781/",
      "url": "https://pype.dev/thoughts-781/",
      "title": "💭 Static egress IPs for machines - Fresh Produce - Fly.io",
      "content_text": "\n\u003ca href=\"https://community.fly.io/t/static-egress-ips-for-machines/22004\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://community.fly.io/t/static-egress-ips-for-machines/22004\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - Static egress IPs for machines - Fresh Produce - Fly.io\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://community.fly.io/t/static-egress-ips-for-machines/22004\"\u003eStatic egress IPs for machines - Fresh Produce - Fly.io\u003c/a\u003e\n\n---\n\nI'm starting to setup litestream for replicating sqlite dbs of my apps to my self-hosted MinIO instance... only issue is most of my networking assumes client connectivity via tailscale so I whitelist pretty much every accessible domain.\nThis has gotten me in trouble once or twice, and I'm currently in the throws of backing up sqlite from fly.io. The easiest solution for me would be to add egress IP cidr blocks to my traefik whitelisting configuration and wouldn't ya know it - in september 2024 fly.io released the ability to set static egress IPs!\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "I'm starting to setup litestream for replicating sqlite dbs of my apps to my self-hosted MinIO instance... only issue is",
      "date_published": "2025-08-05T11:50:12Z",
      "date_modified": "2025-08-05T11:50:12Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "fly.ip",
        "egress",
        "reverse-proxy",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/2025-08-05-notes/",
      "url": "https://pype.dev/2025-08-05-notes/",
      "title": "2025-08-05 Notes",
      "content_text": "\nyesterday: [[ 2025-08-04-notes ]]\n\n## Today\n\n- wrote [[setup-remote-minio-s3-backend-target-for-litestream]]\n- working on litestream with quadtask, bigger plans eventually for backing up all my apps dbs to minio, probably self-hosting everything and getting off fly eventually... not sure\n- started [[using-litestream-to-backup-quadtasks-sqlite-db]]\n\n## Fly.io\n\n- pain point: cert management\n- no terraform, fly cli... this is probably fine\n",
      "summary": "yesterday: 2025-08-04-notes",
      "date_published": "2025-08-05T09:23:07Z",
      "date_modified": "2025-08-05T09:23:07Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/litestream/",
      "url": "https://pype.dev/litestream/",
      "title": "Litestream",
      "content_html": "\u003cp\u003e\u003ca href=\"https://litestream.io/\"\u003eLitestream\u003c/a\u003e is a simple way to replicate SQLite databases\u003c/p\u003e\n",
      "content_text": "\n[Litestream](https://litestream.io/) is a simple way to replicate SQLite databases\n",
      "summary": "Litestream is a simple way to replicate SQLite databases",
      "date_published": "2025-08-05T08:48:01Z",
      "date_modified": "2025-08-05T08:48:01Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "glossary"
      ]
    },
    {
      "id": "https://pype.dev/setup-remote-minio-s3-backend-target-for-litestream/",
      "url": "https://pype.dev/setup-remote-minio-s3-backend-target-for-litestream/",
      "title": "Setup Remote MinIO S3 Backend Target for Litestream",
      "content_text": "\n## Intro\n\nI am starting to think through some patterns for replicating sqlite databases,\nexploring them, standardizing on schemas/models I use across projects, etc...\nThanks to [Waylon](https://waylonwalker.com) I know about [[litestream]] and\nfinally I started playing with it. Their\n[quickstart](https://litestream.io/getting-started/) is good, but it assumes\nyou'll run MinIO on the same machine you run litestream on.\n\nI, however, have MinIO setup in my homelab with the api endpoint accessible via\nDNS - `s3.mydomain.com`.\n\nBefore starting - I realize I left the credential aspect out - Litestream\nexplains how to setup API keys in MinIO for their application\n[here](https://litestream.io/getting-started/#setting-up-minio)\n\nBasically after generating the keys I set `LITESTREAM_ACCESS_KEY_ID` and `LITESTREAM_SECRET_ACCESS_KEY` as env vars\n\nSo let's see what happens and then get to [the fix]\n\n\n```\n⬢ [devbox] ❯ litestream replicate quadtask-prod.db s3://s3.example.com/litestream/qt.db    \n2025/08/05 08:50:09 INFO litestream version=v0.3.13\n2025/08/05 08:50:09 INFO initialized db path=/home/nic/projects/personal/quadtask/litestream/source/quadtask-prod.db\n2025/08/05 08:50:09 INFO replicating to name=s3 type=s3 sync-interval=1s bucket=s3.example.com path=litestream/qt.db region=\"\" endpoint=\"\"\n2025/08/05 08:50:10 INFO sync: new generation db=/home/nic/projects/personal/quadtask/litestream/source/quadtask-prod.db generation=209692854ccd85d5 reason=\"no generation exists\"\n2025/08/05 08:50:10 ERROR monitor error db=/home/nic/projects/personal/quadtask/litestream/source/quadtask-prod.db replica=s3 error=\"cannot lookup bucket region: InvalidAccessKeyId: The AWS Access Key Id you provided does not exist in our records.\\n\\tstatus code: 403, request id: ERHZD4RD61Y8ADMD, host id: dOjPn5j8Oa+mkwOqROXDvCdKNxzxG0B8JJOPtGXDZA7qKxwAWqaSXhGYzK2mkoJQV7hJhaoJcag=\"\n\n```\n\nSo that `403` is pretty simple... my login is wrong... but wait...\n\n`2025/08/05 08:50:09 INFO replicating to name=s3 type=s3 sync-interval=1s bucket=s3.example.com path=litestream/qt.db region=\"\" endpoint=\"\"`\n\nNotice this line - `endpoint=\"\"`... so `s3://s3.example.com` was not the right replacement for `s3://mybkt.localhost:9000/target.db`. Also the inferred `bucket` is the entire `s3.example.com`... \n\nOh! Well I didn't specify a bucket in the subdomain - I did it with a route on the URL... \n\nok let's try `litestream replicate quadtask-prod.db s3://litestream.example.com/qt.db`\n\nWe got the same kind of error...\n\n`2025/08/05 08:53:45 INFO replicating to name=s3 type=s3 sync-interval=1s bucket=litestream.example.com path=qt.db region=\"\" endpoint=\"\"`\n\nThis time the inferred bucket was `litestream.example.com`... ok that's consistent with above as well - so the endpoint is still wrong/null and the bucket inference is wrong...\n\nTurns out for Litestream, and probably many other tools that use s3-compatible storage, that there's an inference problem if the configuration leans on the shorthand `s3://` - [see this GitHub issue](https://github.com/benbjohnson/litestream/issues/398) and [this one about localhost](https://github.com/benbjohnson/litestream/issues/219). There's a few options for using your own `s3.mydomain.example`.\n\n## The Fix\n\nIf you're familiar with the `awscli` then maybe you've heard of a config option `AWS_S3_ENDPOINT_URL` which allows you to use the boto sdk with s3-compatibile resources while still using the `s3://` shorthand. Litestream has a way to set this configuration right on config:\n\n```yaml\ndbs:\n  - path: /home/nic/projects/personal/quadtask/litestream/source/quadtask-prod.db\n    replicas:\n      - type: s3\n        bucket: litestream\n        endpoint: s3.example.com  # \u003c---- right here!\n        skip-verify: true  # set to false if you have TLS and want more security\n        # note you acn set these sensitive values as env vars per the Litestream Quickstart\n        # access-key-id: \u003cACCESS-KEY-ID\u003e\n        # secret-access-key: \u003cSECRET-ACCESS-KEY\u003e\n```\n\n???+ danger \"UPDATE\"\n\n    I added a `path` key to give the backups a folder basically on s3, so under \"bucket: listream\" I have \"path: \u003cmy desired path\u003e\"\n\nSo with that config in place we can actually JUST `litestream replicate` from anywhere...\n\n```bash\n⬢ [devbox] ❯ litestream replicate                                                      \ntime=2025-08-05T08:56:11.353-05:00 level=INFO msg=litestream version=v0.3.13\ntime=2025-08-05T08:56:11.353-05:00 level=INFO msg=\"initialized db\" path=/home/nic/projects/personal/quadtask/litestream/source/quadtask-prod.db\ntime=2025-08-05T08:56:11.353-05:00 level=INFO msg=\"replicating to\" name=s3 type=s3 sync-interval=1s bucket=litestream path=\"\" region=\"\" endpoint=s3.example.com\ntime=2025-08-05T08:56:12.399-05:00 level=INFO msg=\"write snapshot\" db=/home/nic/projects/personal/quadtask/litestream/source/quadtask-prod.db replica=s3 position=209692854ccd85d5/00000000:4152\ntime=2025-08-05T08:56:12.489-05:00 level=INFO msg=\"snapshot written\" db=/home/nic/projects/personal/quadtask/litestream/source/quadtask-prod.db replica=s3 position=209692854ccd85d5/00000000:4152 elapsed=89.994626ms sz=909437\ntime=2025-08-05T08:56:12.492-05:00 level=INFO msg=\"write wal segment\" db=/home/nic/projects/personal/quadtask/litestream/source/quadtask-prod.db replica=s3 position=209692854ccd85d5/00000000:0\ntime=2025-08-05T08:56:12.510-05:00 level=INFO msg=\"wal segment written\" db=/home/nic/projects/personal/quadtask/litestream/source/quadtask-prod.db replica=s3 position=209692854ccd85d5/00000000:0 elapsed=17.572784ms sz=4152\n```\n\n!!! success \"It works!\"\n    \n    Notice that the endpoint is properly s3.example.com, and the bucket is litestream (the name of my taret bucket in MinIO)\n\n\u003e You can use a local config with `-c config.yaml` or something if you want to avoid the global `/etc/litestream.yml`\n\n## What About Restore?\n\nShould work just fine... Let's move the database on my host and see if I can use litestream to restore it\n\n```\nnic in quadtask/litestream   database-clean-up   ×21  ×2  ×9 via   v3.11.10(quadtask)   (dev) 󰒄 \n⬢ [devbox] ❯ mv ./source/quadtask-prod.db ./source/quadtask-prod.db.backup                 \n\nnic in quadtask/litestream   database-clean-up   ×21  ×2  ×9 via   v3.11.10(quadtask)   (dev) 󰒄 \n⬢ [devbox] ❯ litestream restore ./source/quadtask-prod.db              \ntime=2025-08-05T09:06:25.826-05:00 level=INFO msg=\"restoring snapshot\" db=/home/nic/projects/personal/quadtask/litestream/source/quadtask-prod.db replica=quadtask-prod generation=209692854ccd85d5 index=0 path=/home/nic/projects/personal/quadtask/litestream/source/quadtask-prod.db.tmp\ntime=2025-08-05T09:06:25.843-05:00 level=INFO msg=\"restoring wal files\" db=/home/nic/projects/personal/quadtask/litestream/source/quadtask-prod.db replica=quadtask-prod generation=209692854ccd85d5 index_min=0 index_max=0\ntime=2025-08-05T09:06:25.845-05:00 level=INFO msg=\"downloaded wal\" db=/home/nic/projects/personal/quadtask/litestream/source/quadtask-prod.db replica=quadtask-prod generation=209692854ccd85d5 index=0 elapsed=2.103514ms\ntime=2025-08-05T09:06:25.856-05:00 level=INFO msg=\"applied wal\" db=/home/nic/projects/personal/quadtask/litestream/source/quadtask-prod.db replica=quadtask-prod generation=209692854ccd85d5 index=0 elapsed=10.871034ms\ntime=2025-08-05T09:06:25.856-05:00 level=INFO msg=\"renaming database from temporary location\" db=/home/nic/projects/personal/quadtask/litestream/source/quadtask-prod.db replica=quadtask-prod\n\n```\n\nThe command `litestream restore \u003cdb path\u003e` was confusing at first because I was trying to replicate to a new place, but couldn't get the config to line up. The general understanding here is DR I believe - so the configuration is relatively static and when you `restore` you are restoring a specific database, not just standing up a copy from a backup... \n\n!!! note \"But would we setup a copy from a backup?\"\n\n    ie. restore to a different file?\n\nYes, but it's confusing - at least it was to me... it looks to me like litestream uses the path of a db as the identifier in the config, and you reference the config not by an object's name (if it has one) but by the `path`...\n\nSo the command is `litestream restore -o \u003coutput path\u003e \u003cdb path\u003e`. This makes sense in light of the fact that the configuration is relative to this host - so `\u003cdb path\u003e` being the path of the source db whose backup you are restoring from to `\u003coutput path\u003e` makes some amount of sense... if I wanted to replicate to another machine, then THAT machine would need `/etc/litestream.yaml` and if the filesystem hierarchy was different then an appropriate `path` for the \"source\" of the db to replicate back to.\n\n```\n⬢ [devbox] ❯ litestream restore -o /tmp/db ./source/quadtask-prod.db          \ntime=2025-08-05T09:09:04.784-05:00 level=INFO msg=\"restoring snapshot\" db=/home/nic/projects/personal/quadtask/litestream/source/quadtask-prod.db replica=quadtask-prod generation=209692854ccd85d5 index=0 path=/tmp/db.tmp\ntime=2025-08-05T09:09:04.797-05:00 level=INFO msg=\"restoring wal files\" db=/home/nic/projects/personal/quadtask/litestream/source/quadtask-prod.db replica=quadtask-prod generation=209692854ccd85d5 index_min=0 index_max=0\ntime=2025-08-05T09:09:04.799-05:00 level=INFO msg=\"downloaded wal\" db=/home/nic/projects/personal/quadtask/litestream/source/quadtask-prod.db replica=quadtask-prod generation=209692854ccd85d5 index=0 elapsed=2.128594ms\ntime=2025-08-05T09:09:04.800-05:00 level=INFO msg=\"applied wal\" db=/home/nic/projects/personal/quadtask/litestream/source/quadtask-prod.db replica=quadtask-prod generation=209692854ccd85d5 index=0 elapsed=610.75µs\ntime=2025-08-05T09:09:04.800-05:00 level=INFO msg=\"renaming database from temporary location\" db=/home/nic/projects/personal/quadtask/litestream/source/quadtask-prod.db replica=quadtask-prod\n\n```\n\n",
      "summary": "I am starting to think through some patterns for replicating sqlite databases, exploring them, standardizing on schemas/models I use across projects, etc......",
      "date_published": "2025-08-05T08:39:16Z",
      "date_modified": "2025-08-05T08:39:16Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "litestream",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/grapheneos/",
      "url": "https://pype.dev/grapheneos/",
      "title": "GrapheneOS",
      "content_html": "\u003cp\u003eGrapheneOS is a de-googled version of Android OS you can run on Android\ndevices. They coincidentally recommend Pixel phones for the sake of the\nhardware\u003c/p\u003e\n",
      "content_text": "\nGrapheneOS is a de-googled version of Android OS you can run on Android\ndevices. They coincidentally recommend Pixel phones for the sake of the\nhardware\n",
      "summary": "GrapheneOS is a de-googled version of Android OS you can run on Android devices. They coincidentally recommend Pixel phones for the sake of the hardware",
      "date_published": "2025-08-04T20:32:55Z",
      "date_modified": "2025-08-04T20:32:55Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "glossary"
      ]
    },
    {
      "id": "https://pype.dev/2025-08-04-notes/",
      "url": "https://pype.dev/2025-08-04-notes/",
      "title": "2025-08-04 Notes",
      "content_text": "\nyesterday: [[ 2025-08-03-notes ]]\n\n\n## TODO\n\n - [x] update copier with glossary template just like notes but keep in glossary folder with new templateKey\n\n## Work\n\n- consolidated digital harbor infra and tf modules to the digital harbor repo\n  - going to end spacelift, use just recipes and minio... keep it simple stupid\n\n## Other\n\n- making progress on quadtask - notifiations are looking ok for now but with apprise on the horizon now I don't want to go too much farther. Cleaning up the premium stuff since there's no stripe, and once this stuff is ok I can put another bow on it and put it down for a while\n",
      "summary": "yesterday: 2025-08-03-notes",
      "date_published": "2025-08-04T06:33:58Z",
      "date_modified": "2025-08-04T06:33:58Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-778/",
      "url": "https://pype.dev/thoughts-778/",
      "title": "💭 caronc/apprise-api: A lightweight REST framework that wraps th…",
      "content_text": "\n\u003ca href=\"https://github.com/caronc/apprise-api?tab=readme-ov-file\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://github.com/caronc/apprise-api?tab=readme-ov-file\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - caronc/apprise-api: A lightweight REST framework that wraps the Apprise Notification Library\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://github.com/caronc/apprise-api?tab=readme-ov-file\"\u003ecaronc/apprise-api: A lightweight REST framework that wraps the Apprise Notification Library\u003c/a\u003e\n\n---\n\nI just stood this up and I am very excited about how easy it was to setup and get a message through my gotify instance at home - just a few minutes once I got through my think head on the config in the web front-end... I expect to lean into this heavily in the future \n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "I just stood this up and I am very excited about how easy it was to setup and get a message through my gotify instance a",
      "date_published": "2025-08-04T01:08:10Z",
      "date_modified": "2025-08-04T01:08:10Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "notifications",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-777/",
      "url": "https://pype.dev/thoughts-777/",
      "title": "💭 The Remarkable Incompetence At The Heart Of Tech",
      "content_text": "\n\u003ca href=\"https://www.wheresyoured.at/the-remarkable-incompetence-at-the-heart-of-tech/\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://www.wheresyoured.at/the-remarkable-incompetence-at-the-heart-of-tech/\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - The Remarkable Incompetence At The Heart Of Tech\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://www.wheresyoured.at/the-remarkable-incompetence-at-the-heart-of-tech/\"\u003eThe Remarkable Incompetence At The Heart Of Tech\u003c/a\u003e\n\n---\n\nWhat a great post... the majority of my tech experience has been at a large non-tech company and this just couldn't be more true... we've got folks who made 150k+ in just cash salary who would take 3 months to learn what a firewall rule even was... I heard at one time there were 6 different salesforce accounts across 3 different cloud providers... The incompetence in management, new-hires, those in charge of hiring, etc. is just mind-boggling. \nI have been fortunate to have generally awesome peers and helpful direct managers but generally I see every ounce of truth in this article... but what does it matter? I kind of think it doesn't... there's nothing I or anyone can do to change this wide-spread problem... companies will throw money at other companies while employing dozens (if not more) of engineers who think Excel is Big Data...\n\noverall great read, much respect\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "What a great post... the majority of my tech experience has been at a large non-tech company and this just couldn't be m",
      "date_published": "2025-08-03T11:39:14Z",
      "date_modified": "2025-08-03T11:39:14Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "software",
        "teams",
        "salesforce",
        "snowflake",
        "saas",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/inode/",
      "url": "https://pype.dev/inode/",
      "title": "inode",
      "content_html": "\u003cp\u003eIndex Nodes (inode) is a data structure that stores information about a file or directory, such as its size, permissions, ownership, and disk block addresses. Each file and directory on a filesystem has a unique inode number.\u003c/p\u003e\n",
      "content_text": "\nIndex Nodes (inode) is a data structure that stores information about a file or directory, such as its size, permissions, ownership, and disk block addresses. Each file and directory on a filesystem has a unique inode number.\n\n",
      "summary": "Index Nodes (inode) is a data structure that stores information about a file or directory, such as its size, permissions, ownership, and disk block...",
      "date_published": "2025-08-03T07:16:02Z",
      "date_modified": "2025-08-03T07:16:02Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "inode",
        "note"
      ]
    },
    {
      "id": "https://pype.dev/2025-08-03-notes/",
      "url": "https://pype.dev/2025-08-03-notes/",
      "title": "2025-08-03 Notes",
      "content_text": "\nyesterday: [[ 2025-07-31-notes ]]\n\n## Writting\n\n- started [[docker-volume-mounts-link-to-an-inode]] the other day\n- starting to organize glossary posts until it's built-in to markata\n\n## TODO\n - update copier with glossary template just like notes but keep in glossary folder with new templateKey\n\n - ran accross apprise again... I need a centtrlized notification thing for some ideas, so this mgiht be it. I forked the repo, will build image and deploy to get a feel for it\n",
      "summary": "yesterday: 2025-07-31-notes",
      "date_published": "2025-08-03T06:39:32Z",
      "date_modified": "2025-08-03T06:39:32Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/docker-volume-mounts-link-to-an-inode/",
      "url": "https://pype.dev/docker-volume-mounts-link-to-an-inode/",
      "title": "Docker Volume Mounts Link to an Inode",
      "content_text": "\ndocker bind mounts are specified as filepaths - this is very intuitive. I want\n/path/to/directory on my host to be shared with /another/path/foo in a\ncontainer. But what if /path/to/directory on the host is moved?\n\nThis is a situation I have found myself in at home and it turns out that I'm\nactually in almost zero trouble thankfully...\n\nTLDR - I have a bunch of compose stacks in\n/home/projects/homelab-compose/\u003chost\u003e/\u003capplication\u003e and I want to move them to\n/home/projects/homelap-mono/compose/\u003chost\u003e/\u003capplication\u003e\n\nI don't want to take down all my stacks to do this because I don't yet have a\nconvenient way to do it - but can I just `mv .../homelab-compose\n.../homelab-mono/compose` and be done with it?\n\nThe issue is that some of my stacks use local volume mounts - ie. there is a\ndata volume on the host in\n/home/projects/homelab-compose/\u003chost\u003e\u003capplication\u003e/docker-data for some of the\napplications... can I just move everything and docker is nonethewiser?\n\nTurns out the answer is mostly `yes` with some caveats to keep in mind..\n\nLet's start with why it works and then show an example...\n\n## Why\n\nThis works because of how docker interprets the bind mount location initially\nand with how `mv` is different from `cp`. When you speicify a volume mount for\ndocker, the engine determines which [[inode]] contains the metadata for the\nfilesystem object referenced by the original volume path `/path/to/directory`.\nI think about this like a string path is a pointer to a lower level identifier\ncloser to the filesystem - if that pointer changes it doesn't affect the\npre-existing inode or data. So docker uses the inode that `/path/to/directory`\npoints to when the container starts up.\n\nThe slight convenience in my case is that `mv` maintains the existing inode and\nso the new filepath is irrelevant to that existing container that was spun up\nwith a now-non-existent host filepath.\n\nSo if you can imagine then - I spun up several containers in\n`///homelab-compose/...` with many stacks - and I want to just move all the\nconfig files to new repo... thankfully, I actually can *just `mv`* everything\nand because the `inode` locations dont' change, the stacks are fine!\n\n!!! warning \"caveat\"\n\n    Is the next issue apparent? What happens to those files whose volume mount configurations specify .../homelab-compose/...? Well, if the stacks are brought down and back up then docker will create that filepath on the host and a new inode reference will be had by all... so that's a problem easily mitigated by some string replacement!\n\n!!! note \"another note\"\n\n\n    Perhaps just don't keep data next to your configuration either... In most of my stacks I have a determined docker volume that's backed up etc. on my hosts and that's what I'm moving towards on my desktop, but as of right now I've put myself in an odd situation via not participating in a proper thinking exercise when standing up all these stacks on my desktop\n\n## Example\n\nFinally let's just see it in action quickly...\n\nI have a directory `/tmp/foo/source` with a compose file in it.\n\n```\n❯ tree source       \nsource\n└── docker-compose.yml\n```\n\nThat file is simple:\n\n```yaml\nservices:\n  app:\n    image: nginx\n    ports:\n      - \"8070:80\"\n    volumes:\n      - /tmp/foo/source:/usr/share/nginx/html\n```\n\nNow I can spin that container up, exec in, drop a file in `/usr/share/nginx/html` and we'll see it in `/tmp/foo/source` as expected...\n\n```bash\nnic in /tmp/foo   (dev)\n❯ docker exec source-app-1 touch /usr/share/nginx/html/file.txt\n\nnic in /tmp/foo   (dev)\n❯ tree source                                                       \nsource\n├── docker-compose.yml\n└── file.txt\n\n1 directory, 2 files\n\n```\n\nNow let's `mv` the `source` directory somewhere else and see what happens\n\n```\nnic in /tmp/foo   (dev)\n❯ mv source target \n\nnic in /tmp/foo   (dev)\n❯ tree target \ntarget\n└── source\n    ├── docker-compose.yml\n    └── file.txt\n\n2 directories, 2 files\n\n```\n\nOK everything is there - now let's drop another file in the container - remember the compose file still has the host path as `/tmp/foo/source`, not `/tmp/foo/target/source`.\n\n```\nnic in /tmp/foo   (dev)\n❯ docker exec source-app-1 touch /usr/share/nginx/html/another-file.txt\n\nnic in /tmp/foo   (dev)\n❯ tree target                                                          \ntarget\n└── source\n    ├── another-file.txt  # BAM! New file still here...\n    ├── docker-compose.yml\n    └── file.txt\n\n2 directories, 3 files\n```\n## Few Things\n1. `cp` as noted before, creates new `inodes` and so if I were to have `cp -r`\n   that `source` directory to `target` then the container would've dropped\ner exec source-app-1 touch /usr/share/nginx/html/another-file.txc in /tmp/foo   (dev) 󰒄 󱔎 NO PYTHON ENVIORNMENT SET t\n`another-file.txt` to `/tmp/source` and we'd be in a pretty confusing state\n\n2. Let me stress again the importance of managing your docker volumes in a sane\n   way... I have on any of my hosts a `/path/to/docker/data` which is backed up\nin a way that makes sense for the host (usually zfs + sanoid, otherwise restic\nbackup TO a remote zfs dataset - see\n[[using-restic-to-backup-my-home-directory#Intro]])\n",
      "summary": "docker bind mounts are specified as filepaths - this is very intuitive. I want /path/to/directory on my host to be shared with /another/path/foo in a...",
      "date_published": "2025-08-02T13:01:58Z",
      "date_modified": "2025-08-02T13:01:58Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "docker",
        "compose",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-770/",
      "url": "https://pype.dev/thoughts-770/",
      "title": "💭 Kinopio",
      "content_text": "\n\u003ca href=\"https://kinopio.club/hello-kinopio-yJcWauuveiODl-efDj9Ox\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://kinopio.club/hello-kinopio-yJcWauuveiODl-efDj9Ox\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - Kinopio\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://kinopio.club/hello-kinopio-yJcWauuveiODl-efDj9Ox\"\u003eKinopio\u003c/a\u003e\n\n---\n\nkinopio is a pretty sweet map-mapping type of application. It's localfirst, you can run it for free with state kept locally and that's pretty dope. Heard about it on ep 9 of the localfirst.fm podcast. Very impressive app\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "kinopio is a pretty sweet map-mapping type of application. It's localfirst, you can run it for free with state kept loca",
      "date_published": "2025-07-31T23:34:41Z",
      "date_modified": "2025-07-31T23:34:41Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "productivity",
        "mind-map",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/knowledge-and-faith/",
      "url": "https://pype.dev/knowledge-and-faith/",
      "title": "Knowledge and Faith",
      "content_html": "\u003ch1 id=\"a-question\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eA Question\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eWhat does it mean to be \u0026ldquo;faithful\u0026rdquo;? I wrestle with this question in various\ncontexts pretty regularly - mostly because God has been so ridiculously stupid\ngood to me that I feel compelled to ask daily \u0026ldquo;am I being faithful with the\ngifts God has given me?\u0026rdquo;\u003c/p\u003e\n\u003cp\u003eThere\u0026rsquo;s a lot of places to go from this starting point, but there\u0026rsquo;s some events\nhappening in my life that are giving me perspective on Jesus\u0026rsquo; faithfulness to\nthe Father\u0026rsquo;s will and what it implies for my own life of faithfulness and\nsteadfastness to the Lord.\u003c/p\u003e\n\u003ch2 id=\"faithfulness\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFaithfulness\u003c/span\u003e \u003ca href=\"#faithfulness\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eHow do I be more like Jesus (as a human), and how do I more or less copy his\nfaithfulness to God in the wake of trial. I\u0026rsquo;ve certainly given some amount of\nthought to my own ability to be faithful in the worst potential circumstance of\nstraight up physical execution: martyrdom\u0026hellip; In Fox\u0026rsquo;s Book of Martyrs there\u0026rsquo;s\naccounts of Christians through the ages singing hymns while being\nburned alive for their faith\u0026hellip; What leads to that kind of faithfulness? What\ngave these heros of the faith the peace to face death with a song? Would\nI, today right now, if I was going to be executed for my faith (real reality in\nmany parts of the world) would I sing \u0026ldquo;Amazing Grace\u0026rdquo; while my physical body\nwas tortured to death\u0026hellip; I can\u0026rsquo;t say I know the answer to this, but the\naccounts of these martyrs is at least encouraging that God has developed the\nfaith of others to such a degree that physical torture cannot break them from\ntheir communion with God.\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eWhat about NOT death...\u003c/p\u003e\n\u003cp\u003eWe all face trials of different kinds every day, and in the face of those trials what does faithfulness look like?\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"knowledge\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eKnowledge\u003c/span\u003e \u003ca href=\"#knowledge\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eBack to Jesus for a second\u0026hellip; A confession of mine is that I\u0026rsquo;ve lowkey felt\nlike Jesus, as truly human, had a leg up on us when it comes to remaining\nfaithful to the Father\u0026rsquo;s will\u0026hellip;.\u003c/p\u003e\n\u003cp\u003eAs a human he walked through life in deep communion\nwith the Father, and he \u003cem\u003eknows\u003c/em\u003e his place as the Author of creation, the one\nwho holds all things together. So I\u0026rsquo;ve often struggled with the thought \u0026ldquo;of\ncourse Jesus is calm in X or isn\u0026rsquo;t worried about Y\u0026hellip; He knows he\u0026rsquo;s God, he\nknows the plan, and that \u003cem\u003eknowledge\u003c/em\u003e must do something for enabling the kind\nof calm faith we see in the person, in the human, Jesus Christ.\u0026rdquo;\u003c/p\u003e\n\u003cdiv class=\"admonition warning\"\u003e\n\u003cp class=\"admonition-title\"\u003eWarning\u003c/p\u003e\n\u003cp\u003eJesus \u003cem\u003eknows\u003c/em\u003e that if he commanded a mountain to cast itself into the sea, that it would\u0026hellip; So did Jesus have \u003cem\u003efaith\u003c/em\u003e or \u003cem\u003eknowledge\u003c/em\u003e?\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"almost-there\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAlmost There\u003c/span\u003e \u003ca href=\"#almost-there\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI think he had both, and part of living a life of faith is \u003cem\u003eremembering\u003c/em\u003e all the\nthings that are true about Jesus\u0026hellip; If I only say he\u0026rsquo;s faithful and good to me\nbecause the Bible says so, well that\u0026rsquo;s not a lot for me as a real physical\nperson to live my life on\u0026hellip; I live my life based on experience like anyone\nelse, and experience gives anyone a unique kind of knowledge - it\u0026rsquo;s more than\nreading something in a book, when you learn something by living through it the\nmessage is deeply engrained, it passes through your brain and into your\nbeing\u0026hellip; ya know what I\u0026rsquo;m saying? There\u0026rsquo;s things we know and then there\u0026rsquo;s\nthings \u003cem\u003ewe KNOW\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eBut for this to happen we have to acknowledge God through it\nall\u0026hellip; whatever \u0026ldquo;it all\u0026rdquo; is certainly affects what \u0026ldquo;acknowledge God\u0026rdquo; means, but\nfor Jesus he certainly gave God the Father every ounce of glory and credit\nduring his life, and that acknowledgement I believe is a part of Jesus\u0026rsquo; life of\nFaith\u0026hellip; so too in my life do I try to practice this perspective - giving\nthanks to God for all things given and taken away\u0026hellip; This acknowledgement\npresses the truth about God\u0026rsquo;s goodness and faithfulness to me deeper and deeper\ninto my being. It is Jesus being tender to my heart and shepherding me into\nbeing more like him\u003c/p\u003e\n\u003cp\u003eJesus \u003cem\u003eknew\u003c/em\u003e everything true about his power because of his experience and\nidentity. I would certainly claim to know it as well - but \u003cem\u003emy\u003c/em\u003e knowledge of\nJesus\u0026rsquo; power is not \u003cem\u003ehis\u003c/em\u003e knowledge of his own power. So does any knowledge I\nhave or lack affect the reality of Jesus\u0026rsquo; faithfulness?\u003c/p\u003e\n\u003cdiv class=\"admonition danger\"\u003e\n\u003cp class=\"admonition-title\"\u003eno...\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"the-point\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThe Point\u003c/span\u003e \u003ca href=\"#the-point\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThis is finally my point\u0026hellip; I\u0026rsquo;m going through a trial, losing something\nimportant to me that\u0026rsquo;s valuable and a source of provision for my family in many\nways. But at the same time\u0026hellip; God has been so good to me, and I have so much\nexperience and knowledge of that goodness\u0026hellip; I\u0026rsquo;ve been complimented by a few\npeople in this situation about how I\u0026rsquo;m handling it - cause anyone would be\npretty justified in being angry in what I\u0026rsquo;m walking through\u0026hellip; And I\u0026rsquo;m\nstruggling with many emotions:\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003ebut ultimately\u003c/p\u003e\n\u003cp\u003eI know God provides for me\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eand losing a massive source of that provision isn\u0026rsquo;t the end of the world because\nnot only do I know that God provides for me, but he already has provided in\nsuch a way that this trial isn\u0026rsquo;t devastating. It\u0026rsquo;s annoying of course, but his\ngoodness to me so outshines the crappiness of this situation that I can\u0026rsquo;t help\nbut overflow with \u0026ldquo;this sucks but God\u0026rsquo;s stil good, and has been and will be\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003eThe thing is that the people around me do not have all the same \u003cem\u003eknowledge\u003c/em\u003e as\nme that I\u0026rsquo;ve gained through \u003cem\u003eexperience\u003c/em\u003e and acknowledgment of God\u0026rsquo;s\ngoodness\u0026hellip; Few people see all the details of how God has and is protecting me\nand my family that to the outsider of my life, witnessing what\u0026rsquo;s happening, I\nmight look like that martyr being burned alive\u0026hellip;. Of course that\u0026rsquo;s a little\nhyperbolic, but I don\u0026rsquo;t know the lives of all those martyrs - God probably\nworked in them for so long and in such deep ways that not only the reality of a\ntrial, but the reality of physical pain, just washes over them\u0026hellip;\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eThat's how I feel\u003c/p\u003e\n\u003cp\u003emy trial here sucks, I even want to complain about it (and will probably) but ultimately God is so good to me, and I\u0026rsquo;ll make that known to everyone around me.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eIt might look miraculous to them, and it doesn\u0026rsquo;t mean it\u0026rsquo;s\nnot, because it\u0026rsquo;s God who provided for me in the first place, but my place of\nserenity in the wake of trial comes from Jesus pressing the reality of his\nfaithfulness into my life, and now that I have a backdrop of years of goodness\nfrom him - how can any one silly trial in this life send me anywhere but closer\nto my Heavenly Father as I trust him for provision.\u003c/p\u003e\n",
      "content_text": "\n# A Question\n\nWhat does it mean to be \"faithful\"? I wrestle with this question in various\ncontexts pretty regularly - mostly because God has been so ridiculously stupid\ngood to me that I feel compelled to ask daily \"am I being faithful with the\ngifts God has given me?\"\n\nThere's a lot of places to go from this starting point, but there's some events\nhappening in my life that are giving me perspective on Jesus' faithfulness to\nthe Father's will and what it implies for my own life of faithfulness and\nsteadfastness to the Lord.\n\n## Faithfulness\n\nHow do I be more like Jesus (as a human), and how do I more or less copy his\nfaithfulness to God in the wake of trial. I've certainly given some amount of\nthought to my own ability to be faithful in the worst potential circumstance of\nstraight up physical execution: martyrdom... In Fox's Book of Martyrs there's\naccounts of Christians through the ages singing hymns while being\nburned alive for their faith... What leads to that kind of faithfulness? What\ngave these heros of the faith the peace to face death with a song? Would\nI, today right now, if I was going to be executed for my faith (real reality in\nmany parts of the world) would I sing \"Amazing Grace\" while my physical body\nwas tortured to death... I can't say I know the answer to this, but the\naccounts of these martyrs is at least encouraging that God has developed the\nfaith of others to such a degree that physical torture cannot break them from\ntheir communion with God.\n\n!!! note \"What about NOT death...\"\n    \n    We all face trials of different kinds every day, and in the face of those trials what does faithfulness look like?\n\n## Knowledge\n\nBack to Jesus for a second... A confession of mine is that I've lowkey felt\nlike Jesus, as truly human, had a leg up on us when it comes to remaining\nfaithful to the Father's will.... \n\nAs a human he walked through life in deep communion\nwith the Father, and he _knows_ his place as the Author of creation, the one\nwho holds all things together. So I've often struggled with the thought \"of\ncourse Jesus is calm in X or isn't worried about Y... He knows he's God, he\nknows the plan, and that _knowledge_ must do something for enabling the kind\nof calm faith we see in the person, in the human, Jesus Christ.\"\n\n!!! warning \"\"\n\n    Jesus _knows_ that if he commanded a mountain to cast itself into the sea, that it would... So did Jesus have _faith_ or _knowledge_?\n\n## Almost There\n\nI think he had both, and part of living a life of faith is _remembering_ all the\nthings that are true about Jesus... If I only say he's faithful and good to me\nbecause the Bible says so, well that's not a lot for me as a real physical\nperson to live my life on... I live my life based on experience like anyone\nelse, and experience gives anyone a unique kind of knowledge - it's more than\nreading something in a book, when you learn something by living through it the\nmessage is deeply engrained, it passes through your brain and into your\nbeing... ya know what I'm saying? There's things we know and then there's\nthings _we KNOW_. \n\nBut for this to happen we have to acknowledge God through it\nall... whatever \"it all\" is certainly affects what \"acknowledge God\" means, but\nfor Jesus he certainly gave God the Father every ounce of glory and credit\nduring his life, and that acknowledgement I believe is a part of Jesus' life of\nFaith... so too in my life do I try to practice this perspective - giving\nthanks to God for all things given and taken away... This acknowledgement\npresses the truth about God's goodness and faithfulness to me deeper and deeper\ninto my being. It is Jesus being tender to my heart and shepherding me into\nbeing more like him\n\nJesus _knew_ everything true about his power because of his experience and\nidentity. I would certainly claim to know it as well - but _my_ knowledge of\nJesus' power is not _his_ knowledge of his own power. So does any knowledge I\nhave or lack affect the reality of Jesus' faithfulness?\n\n!!! danger \"no...\"\n\n## The Point\n\nThis is finally my point... I'm going through a trial, losing something\nimportant to me that's valuable and a source of provision for my family in many\nways. But at the same time... God has been so good to me, and I have so much\nexperience and knowledge of that goodness... I've been complimented by a few\npeople in this situation about how I'm handling it - cause anyone would be\npretty justified in being angry in what I'm walking through... And I'm\nstruggling with many emotions:\n\n!!! note \"but ultimately\"\n\n    I know God provides for me\n\nand losing a massive source of that provision isn't the end of the world because\nnot only do I know that God provides for me, but he already has provided in\nsuch a way that this trial isn't devastating. It's annoying of course, but his\ngoodness to me so outshines the crappiness of this situation that I can't help\nbut overflow with \"this sucks but God's stil good, and has been and will be\". \n\nThe thing is that the people around me do not have all the same _knowledge_ as\nme that I've gained through _experience_ and acknowledgment of God's\ngoodness... Few people see all the details of how God has and is protecting me\nand my family that to the outsider of my life, witnessing what's happening, I\nmight look like that martyr being burned alive.... Of course that's a little\nhyperbolic, but I don't know the lives of all those martyrs - God probably\nworked in them for so long and in such deep ways that not only the reality of a\ntrial, but the reality of physical pain, just washes over them... \n\n!!! note \"That's how I feel\"\n\n    my trial here sucks, I even want to complain about it (and will probably) but ultimately God is so good to me, and I'll make that known to everyone around me. \n\nIt might look miraculous to them, and it doesn't mean it's\nnot, because it's God who provided for me in the first place, but my place of\nserenity in the wake of trial comes from Jesus pressing the reality of his\nfaithfulness into my life, and now that I have a backdrop of years of goodness\nfrom him - how can any one silly trial in this life send me anywhere but closer\nto my Heavenly Father as I trust him for provision.\n\n\n\n",
      "summary": "What does it mean to be \"faithful\"? I wrestle with this question in various contexts pretty regularly - mostly because God has been so ridiculously stupid...",
      "date_published": "2025-07-31T05:58:52Z",
      "date_modified": "2025-07-31T05:58:52Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "reflection",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2025-07-31-notes/",
      "url": "https://pype.dev/2025-07-31-notes/",
      "title": "2025-07-31 Notes",
      "content_text": "\nyesterday: [[ 2025-07-28-notes ]]\n\n## QuadTask\n\n- Implemented drag and drop on [quadtask](https://quadtask.app), it's in dev and I'll roll out updates as I work on cleaning up deployment - I'd like to deploy locally, not from Actions\n- Started notifications\n\n## Writing\n\n- wrote [[knowledge-and-faith]]\n\n## Work\n\n- Caught up with Progress Rail contact about platform engineering possibilities\n- Talked with Zack about building a product myself... scary idea for sure...\n\n\n",
      "summary": "yesterday: 2025-07-28-notes",
      "date_published": "2025-07-31T05:44:41Z",
      "date_modified": "2025-07-31T05:44:41Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/what-is-a-right/",
      "url": "https://pype.dev/what-is-a-right/",
      "title": "What Is A Right?",
      "content_html": "\u003ch2 id=\"intro\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eIntro\u003c/span\u003e \u003ca href=\"#intro\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI saw something this morning that kind of irk\u0026rsquo;d me so I thought I\u0026rsquo;d write some\nthoughts on it\u0026hellip; It was one of those maps of countries and the results of a\npoll. The poll what \u0026ldquo;Is food a human right?\u0026rdquo; and like every country except USA\nvoted \u0026ldquo;yes\u0026rdquo; and we voted \u0026ldquo;no\u0026rdquo; - ie. Americans hate people\u0026hellip; obviously\u0026hellip;\u003c/p\u003e\n\u003cp\u003eObviously that\u0026rsquo;s ridiculous\u0026hellip; or it obvious to me anyways\u0026hellip; But the\nridiculousness of the graphic aside, it\u0026rsquo;s the baseline question that got me\nthinking\u0026hellip;\u003c/p\u003e\n\u003cdiv class=\"admonition warning\"\u003e\n\u003cp class=\"admonition-title\"\u003eWhat is a right?\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"things-to-be-protected\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThings to be Protected\u003c/span\u003e \u003ca href=\"#things-to-be-protected\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe thing is - you \u003cem\u003ecan not\u003c/em\u003e be \u003cstrong\u003eentitled\u003c/strong\u003e to the labor of another human\nbeing\u0026hellip; I think this is axiomatic, and I know there are large groups of people\nwho disagree, but I would call every one of those groups \u003cstrong\u003einhumane\u003c/strong\u003e.\u003c/p\u003e\n\u003cdiv class=\"admonition danger\"\u003e\n\u003cp class=\"admonition-title\"\u003eMy Right Trumps Your Freedom\u003c/p\u003e\n\u003cp\u003eIf my right requires that another person works, then that person is not\nfree\u0026hellip; sounds familiar, ya?\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eSo with the understanding that I have ZERO regard for a worldview that thinks\nsome humans can force labor on another group of humans - let\u0026rsquo;s talk about what\na right is.\u003c/p\u003e\n\u003cp\u003eA right is something all humans have the ability to do AND at the same time is\na thing that CAN BE defended\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eUltimately, rights are just force\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eNote I\u0026rsquo;m not saying all humans have to agree on the thing, nor am I saying that\nit MUST BE defended to be a right, but if something can forcefully be taken away\nthen I think the verbiage of calling it a \u0026ldquo;right\u0026rdquo; is nothing more than\nemotional argumentation.\u003c/p\u003e\n\u003cp\u003eI want all people to have clean drinking water, the ability to work and make a\nlife for themselves, the freedom to express creativity, and also food to eat\u0026hellip;\nI want these things for all humans, but calling anything of them a \u0026ldquo;right\u0026rdquo; on\ntheir own is either deeply misguided or, as noted above, axiomatic to a\nworldview that is essentially pro-slavery. The simpleton thinking about\n\u0026ldquo;rights\u0026rdquo; is doing  the world, and our country specifically no favors in public\ndiscourse\u0026hellip;\u003c/p\u003e\n\u003cdiv class=\"admonition danger\"\u003e\n\u003cp class=\"admonition-title\"\u003eFor Example\u003c/p\u003e\n\u003cp\u003eI hear that Trump\u0026rsquo;s administration is \u0026ldquo;taking away basic human rights\u0026rdquo; and\nI\u0026rsquo;ve had the privilege of asking a few people what they mean\u0026hellip; Either nothing\nor abortion. The nothing crowd is led astray by a misguided narrative, and\nthe abortion crowd simply denies the humanity of the unborn. They would\ndeny the humanity of any group of humans they can eliminate or enslave for\ntheir own gain. Ironically it\u0026rsquo;s in restoring the idea of liberty from the\ngovernment that I think this WH administration is actually doing a good job of\ndefending huamn rights - and by civil necessity that means the rights of\ncitizens primarily.\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"might-makes-right\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMight Makes Right\u003c/span\u003e \u003ca href=\"#might-makes-right\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eUnfortunately, a reality of our broken world is that \u003cem\u003emight makes right\u003c/em\u003e. ie.\nthe Strong make the rules for the Weak, and if the Strong don\u0026rsquo;t protect the\nWeak\u0026rsquo;s ability, say to eat, then the language of a \u0026ldquo;right to food\u0026rdquo; has\nabsolutely zero weight.\u003c/p\u003e\n\u003cp\u003eLet me say plainly that I don\u0026rsquo;t subscribe to a worldview where \u0026ldquo;might makes\nright\u0026rdquo; is appropriate - I believe Jesus will come back to judge the living and\nthe dead, and that his people (ie. the Church) should work the world for the\nbetterment of all people. But while I believe this and live my life in this\ndirection - I recognize the functional reality that the only things you \u0026ldquo;have a\nright to\u0026rdquo; are the things you can protect.\u003c/p\u003e\n\u003cp\u003eThis is one reason I\u0026rsquo;ve come to appreciate America so much. It isn\u0026rsquo;t that our\ncountry demonstrates every moral conviction I have, or even that it was founded\non \u0026ldquo;Christian Principals\u0026rdquo; (history is hard), but our country was founded on a\nprincipal that all people have inalienable rights\u0026hellip; But those rights are\nrecognized in our country because our country can and does defend those liberties.\u003c/p\u003e\n\u003cp\u003eIf no one will defend you, you functionally have a right to nothing - to argue\notherwise is to be needlessly pedantic in a conversation that must revolve around\n\u003cem\u003epracticality\u003c/em\u003e to be useful\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eNote\u003c/p\u003e\n\u003cp\u003eIt\u0026rsquo;s high-time some political activists start thinking pragmatically\ninstead of spewing emotional language into a field they probably have no\nbusiness being in (besides those sweet sweet lobby-dollars of course)\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"fin\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFin\u003c/span\u003e \u003ca href=\"#fin\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eSo\u0026hellip; what\u0026rsquo;s the point? I think I\u0026rsquo;m saying we should just speak honestly about\nour world, because emotional and vague language is actually not helpful\u0026hellip; To\nthat end, honestly many many people need to practice silence in the public\nsector - the internet has made everyone an expert commentator on the\ncurrent thing, and it\u0026rsquo;s destroying actual rhetoric.\u003c/p\u003e\n\u003cp\u003eAnd although I can\u0026rsquo;t say \u0026ldquo;all humans have a right to food\u0026rdquo; because not all\nhumans have their ability to obtain and eat food protected, I absolutely\nbelieve all humans should have this ability of theirs protected. This\nconclusion can\u0026rsquo;t be expressed in a simple map created undoubtedly to\nperpetuate political anger and division\u0026hellip;\u003c/p\u003e\n\u003cp\u003eSo go out there and protect the weaker person\u0026rsquo;s \u0026ldquo;right\u0026rdquo; to whatever you feel is\nbeing wrongly taken from them - but if you can\u0026rsquo;t protect it then either vote\nfor someone who will or frankly quit talking\u0026hellip;\u003c/p\u003e\n",
      "content_text": "\n## Intro\n\nI saw something this morning that kind of irk'd me so I thought I'd write some\nthoughts on it... It was one of those maps of countries and the results of a\npoll. The poll what \"Is food a human right?\" and like every country except USA\nvoted \"yes\" and we voted \"no\" - ie. Americans hate people... obviously...\n\nObviously that's ridiculous... or it obvious to me anyways... But the\nridiculousness of the graphic aside, it's the baseline question that got me\nthinking... \n\n!!! warning \"What is a right?\"\n\n## Things to be Protected\n\nThe thing is - you _can not_ be **entitled** to the labor of another human\nbeing... I think this is axiomatic, and I know there are large groups of people\nwho disagree, but I would call every one of those groups __inhumane__.\n\n!!! danger \"My Right Trumps Your Freedom\"\n\n    If my right requires that another person works, then that person is not\n    free... sounds familiar, ya?\n\nSo with the understanding that I have ZERO regard for a worldview that thinks\nsome humans can force labor on another group of humans - let's talk about what\na right is.\n\nA right is something all humans have the ability to do AND at the same time is\na thing that CAN BE defended\n\n!!! note \"Ultimately, rights are just force\"\n\nNote I'm not saying all humans have to agree on the thing, nor am I saying that\nit MUST BE defended to be a right, but if something can forcefully be taken away\nthen I think the verbiage of calling it a \"right\" is nothing more than\nemotional argumentation.\n\nI want all people to have clean drinking water, the ability to work and make a\nlife for themselves, the freedom to express creativity, and also food to eat...\nI want these things for all humans, but calling anything of them a \"right\" on\ntheir own is either deeply misguided or, as noted above, axiomatic to a\nworldview that is essentially pro-slavery. The simpleton thinking about\n\"rights\" is doing  the world, and our country specifically no favors in public\ndiscourse...\n\n!!! danger \"For Example\"\n\n    I hear that Trump's administration is \"taking away basic human rights\" and\n    I've had the privilege of asking a few people what they mean... Either nothing\n    or abortion. The nothing crowd is led astray by a misguided narrative, and\n    the abortion crowd simply denies the humanity of the unborn. They would\n    deny the humanity of any group of humans they can eliminate or enslave for\n    their own gain. Ironically it's in restoring the idea of liberty from the\n    government that I think this WH administration is actually doing a good job of\n    defending huamn rights - and by civil necessity that means the rights of\n    citizens primarily.\n\n## Might Makes Right\n\nUnfortunately, a reality of our broken world is that _might makes right_. ie.\nthe Strong make the rules for the Weak, and if the Strong don't protect the\nWeak's ability, say to eat, then the language of a \"right to food\" has\nabsolutely zero weight.\n\nLet me say plainly that I don't subscribe to a worldview where \"might makes\nright\" is appropriate - I believe Jesus will come back to judge the living and\nthe dead, and that his people (ie. the Church) should work the world for the\nbetterment of all people. But while I believe this and live my life in this\ndirection - I recognize the functional reality that the only things you \"have a\nright to\" are the things you can protect.\n\nThis is one reason I've come to appreciate America so much. It isn't that our\ncountry demonstrates every moral conviction I have, or even that it was founded\non \"Christian Principals\" (history is hard), but our country was founded on a\nprincipal that all people have inalienable rights... But those rights are\nrecognized in our country because our country can and does defend those liberties.\n\nIf no one will defend you, you functionally have a right to nothing - to argue\notherwise is to be needlessly pedantic in a conversation that must revolve around\n_practicality_ to be useful\n\n!!! note \"\"\n\n    It's high-time some political activists start thinking pragmatically\n    instead of spewing emotional language into a field they probably have no\n    business being in (besides those sweet sweet lobby-dollars of course)\n\n## Fin\n\nSo... what's the point? I think I'm saying we should just speak honestly about\nour world, because emotional and vague language is actually not helpful... To\nthat end, honestly many many people need to practice silence in the public\nsector - the internet has made everyone an expert commentator on the \ncurrent thing, and it's destroying actual rhetoric.\n\nAnd although I can't say \"all humans have a right to food\" because not all\nhumans have their ability to obtain and eat food protected, I absolutely\nbelieve all humans should have this ability of theirs protected. This\nconclusion can't be expressed in a simple map created undoubtedly to\nperpetuate political anger and division...\n\nSo go out there and protect the weaker person's \"right\" to whatever you feel is\nbeing wrongly taken from them - but if you can't protect it then either vote\nfor someone who will or frankly quit talking...\n",
      "summary": "I saw something this morning that kind of irk'd me so I thought I'd write some thoughts on it... It was one of those maps of countries and the results of a...",
      "date_published": "2025-07-28T06:31:11Z",
      "date_modified": "2025-07-28T06:31:11Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "reflection"
      ]
    },
    {
      "id": "https://pype.dev/2025-07-28-notes/",
      "url": "https://pype.dev/2025-07-28-notes/",
      "title": "2025-07-28 Notes",
      "content_text": "\nyesterday: [[ 2025-07-27-notes ]]\n\n## Blog\n \n- og images look busted, taking a look at it this morning\n- wrote [[what-is-a-right]]\n\n## Wins\n\n- wrapped up that stupid form at work\n",
      "summary": "yesterday: 2025-07-27-notes",
      "date_published": "2025-07-28T06:30:24Z",
      "date_modified": "2025-07-28T06:30:24Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/2025-07-27-notes/",
      "url": "https://pype.dev/2025-07-27-notes/",
      "title": "2025-07-27 Notes",
      "content_html": "\u003ch2 id=\"file-explorer\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFile explorer\u003c/span\u003e \u003ca href=\"#file-explorer\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eI\u0026rsquo;ve lost a lot of my terminal workflow since picking up more work in kubernetes and terraform, mostly because of the work patterns of those around me and the slight differences between my dev machines\u0026hellip; but I\u0026rsquo;ve dealt with it for too long. The first step to recovering some of my speed with file management specifically is to get a terminal file manager figured out.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efinder\u003c/code\u003e is the WORST file explorer on the planet and I use a Mac daily so it has to end\u003c/li\u003e\n\u003cli\u003esuperfile looks nice, but I could immediately even get \u0026ldquo;go bacK\u0026rdquo; to work with their vim keybindings, so I\u0026rsquo;m out\u003c/li\u003e\n\u003cli\u003etrying yazi now\u0026hellip;\n\u003cul\u003e\n\u003cli\u003etheme done with \u0026ldquo;flavors\u0026rdquo;: \u003ca href=\"https://github.com/yazi-rs/flavors\"\u003ehttps://github.com/yazi-rs/flavors\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eI cloned that to \u003ccode\u003e~/.config/yazi/flavors/\u003c/code\u003e and then was able to just use their few canned ones easily in \u003ccode\u003e~/.config/yazi/theme.toml\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"admonition danger\"\u003e\n\u003cp class=\"admonition-title\"\u003econfig oddness\u003c/p\u003e\n\u003cp\u003eI tried to setup showing hidden files in the config file but it didn\u0026rsquo;t seem to work\u0026hellip; but just hitting \u003ccode\u003e.\u003c/code\u003e in the tui showed my hidden files just fine\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"why\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhy?\u003c/span\u003e \u003ca href=\"#why\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eright now I\u0026rsquo;m trying to move all my homelab stuff to a mono-repo, so terminal file management makes that easier\n\u003cul\u003e\n\u003cli\u003eI think I have to take down each compose stack to move it from\n\u003ccode\u003e.../homelab-compose\u003c/code\u003e to \u003ccode\u003e.../homelab-mono/\u0026lt;something else\u0026gt;\u003c/code\u003e which is\nannoying because I don\u0026rsquo;t have a way to take all the compose stacks down and\nup yet\u0026hellip; could make a simple custom config for it? ugh\u0026hellip;\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"others\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOthers\u003c/span\u003e \u003ca href=\"#others\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eAlso I wanted to think about a way to backup my \u003ccode\u003e~/.skm\u003c/code\u003e directory since I\u0026rsquo;m\nusing \u003ca href=\"\"\u003eskm\u003c/a\u003e for my ssh keys, then I can restore from the back on a new laptop\nand have all my keys ready to go\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://kanboard.paynepride.com/?controller=TaskViewController\u0026amp;action=show\u0026amp;task_id=247\u0026amp;project_id=8\"\u003ekanboard ticket\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003estarted transitioning quadtask over to fully AI driven dev - curious if I can have windsurf actually generate feature ideas or not\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"wins\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWins\u003c/span\u003e \u003ca href=\"#wins\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eI forgot how magicaly ssh + tmux is\u0026hellip; I wrote this in my daily notes BUFFER on my desktop from this repurposed laptop in my living room\u0026hellip; so amazing\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n## File explorer\n\n- I've lost a lot of my terminal workflow since picking up more work in kubernetes and terraform, mostly because of the work patterns of those around me and the slight differences between my dev machines... but I've dealt with it for too long. The first step to recovering some of my speed with file management specifically is to get a terminal file manager figured out.\n- `finder` is the WORST file explorer on the planet and I use a Mac daily so it has to end\n- superfile looks nice, but I could immediately even get \"go bacK\" to work with their vim keybindings, so I'm out\n- trying yazi now...\n  - theme done with \"flavors\": https://github.com/yazi-rs/flavors\n  - I cloned that to `~/.config/yazi/flavors/` and then was able to just use their few canned ones easily in `~/.config/yazi/theme.toml`\n\n!!! danger \"config oddness\"\n\n    I tried to setup showing hidden files in the config file but it didn't seem to work... but just hitting `.` in the tui showed my hidden files just fine\n\n## Why?\n\n- right now I'm trying to move all my homelab stuff to a mono-repo, so terminal file management makes that easier\n  - I think I have to take down each compose stack to move it from\n  `.../homelab-compose` to `.../homelab-mono/\u003csomething else\u003e` which is\n  annoying because I don't have a way to take all the compose stacks down and\n  up yet... could make a simple custom config for it? ugh...\n\n## Others\n\n- Also I wanted to think about a way to backup my `~/.skm` directory since I'm\nusing [skm]() for my ssh keys, then I can restore from the back on a new laptop\nand have all my keys ready to go\n  - [kanboard ticket](https://kanboard.paynepride.com/?controller=TaskViewController\u0026action=show\u0026task_id=247\u0026project_id=8)\n\n- started transitioning quadtask over to fully AI driven dev - curious if I can have windsurf actually generate feature ideas or not\n\n## Wins\n\n- I forgot how magicaly ssh + tmux is... I wrote this in my daily notes BUFFER on my desktop from this repurposed laptop in my living room... so amazing\n",
      "summary": "I've lost a lot of my terminal workflow since picking up more work in kubernetes and terraform, mostly because of the work patterns of those around me and...",
      "date_published": "2025-07-27T06:38:30Z",
      "date_modified": "2025-07-27T06:38:30Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/2025-07-26-notes/",
      "url": "https://pype.dev/2025-07-26-notes/",
      "title": "2025-07-26 Notes",
      "content_text": "\nyesterday: [[ 2025-07-25-notes ]]\n\n## Dev\n\n- I kept working on my ansible playbook and just recipes for setting up a new machine... I just need to diagram it out to continue honing in the experience:\n\n1. initial install of OS\n2. python -m http.server from my desktop, download \n  - ssh key\n  - skm backup? (haven't done this yet but feels potentially nice...)\n3. clone ansible-playbooks\n4. run bootstrap\n  - bootstrap dotfiles?\n  - just bootstrap?\n  - do this with bash assuming just isn't installed yet\n5. just \u003cwhatever set of things\u003e\n\nI'm not sure what's missing from my playbook still\n",
      "summary": "yesterday: 2025-07-25-notes",
      "date_published": "2025-07-26T13:28:52Z",
      "date_modified": "2025-07-26T13:28:52Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-764/",
      "url": "https://pype.dev/thoughts-764/",
      "title": "💭 My Ultimate Self-hosting Setup",
      "content_text": "\n\u003ca href=\"https://codecaptured.com/blog/my-ultimate-self-hosting-setup/\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://codecaptured.com/blog/my-ultimate-self-hosting-setup/\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - My Ultimate Self-hosting Setup\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://codecaptured.com/blog/my-ultimate-self-hosting-setup/\"\u003eMy Ultimate Self-hosting Setup\u003c/a\u003e\n\n---\n\ngreat post on self-hosting. I think in a lot of similar ways and had a siar journey. There's things I want to accomplish as time goes on, looking for motivation to get a post like this going myself\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "great post on self-hosting. I think in a lot of similar ways and had a siar journey. There's things I want to accomplish",
      "date_published": "2025-07-25T19:56:38Z",
      "date_modified": "2025-07-25T19:56:38Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/god-provides-when-he-takes-away/",
      "url": "https://pype.dev/god-provides-when-he-takes-away/",
      "title": "God Provides When He Takes Away",
      "content_html": "\u003cp\u003eThis post is meant to serve as a reminder that God\u0026rsquo;s provision is about more\nthan the chronology of things happening\u0026hellip; For example he brought me a job when\nI lost my main one - he just brought that to me before I lost it\u0026hellip; the timing\nof that event make it no less significant or caused by God\u0026hellip; He answered the\nprayer I hadn\u0026rsquo;t uttered yet when it comes to providing for my family\u003c/p\u003e\n\u003cp\u003eI believe one way God provides in the midst of taking things away is through\nliving a life of daily submission to him. The idea that it goes:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003esomething bad happens\u003c/li\u003e\n\u003cli\u003epray for protection\u003c/li\u003e\n\u003cli\u003emaybe something happens and the reality of what happens affects my view of God\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eis silly, selfish, and misguided.\u003c/p\u003e\n\u003cp\u003eGod sometimes provides by gifting you in a way that ends up protecting you\nlater - but to make the claim the gift was honed solely by you, or worse - a\nproduct of yourself, is to make a grave theological error\u0026hellip; God\u0026rsquo;s provision is\na daily journey with him, not a hail mary prayer for a last second safety net\u0026hellip;\u003c/p\u003e\n",
      "content_text": "\nThis post is meant to serve as a reminder that God's provision is about more\nthan the chronology of things happening... For example he brought me a job when\nI lost my main one - he just brought that to me before I lost it... the timing\nof that event make it no less significant or caused by God... He answered the\nprayer I hadn't uttered yet when it comes to providing for my family\n\nI believe one way God provides in the midst of taking things away is through\nliving a life of daily submission to him. The idea that it goes:\n1. something bad happens\n2. pray for protection\n3. maybe something happens and the reality of what happens affects my view of God\n\nis silly, selfish, and misguided.\n\nGod sometimes provides by gifting you in a way that ends up protecting you\nlater - but to make the claim the gift was honed solely by you, or worse - a\nproduct of yourself, is to make a grave theological error... God's provision is\na daily journey with him, not a hail mary prayer for a last second safety net...\n",
      "summary": "This post is meant to serve as a reminder that God's provision is about more than the chronology of things happening... For example he brought me a job when...",
      "date_published": "2025-07-25T05:52:37Z",
      "date_modified": "2025-07-25T05:52:37Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "reflection",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/2025-07-25-notes/",
      "url": "https://pype.dev/2025-07-25-notes/",
      "title": "2025-07-25 Notes",
      "content_text": "\nyesterday: [[ 2025-07-24-notes ]]\n\n## Wins\n\n- [[god-provides-when-he-takes-away]]\n- published [[after-exceeding-expectations-for-4-years]]\n",
      "summary": "yesterday: 2025-07-24-notes",
      "date_published": "2025-07-25T05:38:45Z",
      "date_modified": "2025-07-25T05:38:45Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/2025-07-24-notes/",
      "url": "https://pype.dev/2025-07-24-notes/",
      "title": "2025-07-24 Notes",
      "content_text": "\nyesterday: [[ 2025-07-23-notes ]]\n\n## Desktop\n\nPlasma updated after a reboot, and I'm not gonna try to rollback but it's a little messed up so I need to figure out:\n1. my activity bar virtual desktops don't show what's on each desktop\n2. the task bar doesn't show all windows (I remember fixing this before)\n3. maybe use this as a time to make kde more like mac just for consistency with work\n\nFixed my long-standing broken keybinding for screenshot on desktop! and it's a dumb keybind but it matches what I use on mac...\n\n![20250724115049_5b30c47f.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250724115049_5b30c47f.png)\n\n## TODOs\n\n- Blount AC\n  - not doing mini-split for now\n  - need new central AC\n  - I called and left a message\n\n- bug report for flameshot\n\n## Work\n\n- going to start learning golang for work\n\n## Other\n\n- [[olivet-mens-group-august-2025]]\n",
      "summary": "yesterday: 2025-07-23-notes",
      "date_published": "2025-07-24T06:26:10Z",
      "date_modified": "2025-07-24T06:26:10Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/2025-07-23-notes/",
      "url": "https://pype.dev/2025-07-23-notes/",
      "title": "2025-07-23 Notes",
      "content_text": "\nyesterday: [[2025-07-22-notes]]\n\n## Blog / Dev\n\nStarted [[setting-up-a-laptop-in-2025]]\n\n- need to get my ssh keys and stuff over to my server\n\n## Church\n\nContinued work on [[olivet-mens-group-august-2025]]\n\n## Other\n\nstruggling with a lot of thoughts over [[after-exceeding-expectations-for-4-years]] and [[reflections-on-rto-2025]]\n\nsent updated resume to Tek\n",
      "summary": "yesterday: 2025-07-22-notes",
      "date_published": "2025-07-23T05:48:00Z",
      "date_modified": "2025-07-23T05:48:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/olivet-mens-group-august-2025/",
      "url": "https://pype.dev/olivet-mens-group-august-2025/",
      "title": "Olivet Men’s Group August 2025",
      "content_html": "\u003cp\u003e1 John 3: 7-10 for men\u0026rsquo;s group in August 2025\u003c/p\u003e\n\u003cdetails class=\"admonition note\" open\u003e\n\u003csummary class=\"admonition-title\"\u003e1 John 3: 7-10\u003c/summary\u003e\n\u003cp\u003e7 Little children, let no one deceive you: the one who practices\nrighteousness is righteous, just as that one is righteous. 8 The one who\npractices sin is of the devil, because the devil has been sinning from the\nbeginning. For this reason the Son of God was revealed: in order to destroy the\nworks of the devil. 9 Everyone who is fathered by God does not practice sin,\nbecause his seed resides in him, and he is not able to sin, because he has been\nfathered by God. 10 By this the children of God and the children of the devil\nare evident: everyone who does not practice righteousness is not of God,\nnamely, the one who does not love his brother.\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails class=\"admonition note\" open\u003e\n\u003csummary class=\"admonition-title\"\u003everse 7 from ESV\u003c/summary\u003e\n\u003cp\u003e7 Little children, let no one deceive you. Whoever practices righteousness is righteous, as he is righteous\u003c/p\u003e\n\u003c/details\u003e\n\u003cp\u003eThe difference I note is that ESV, right or wrong, is more clear that the \u0026ldquo;just as that one is righteous\u0026rdquo; is actually Jesus\u003c/p\u003e\n\u003ch2 id=\"flowchart\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFlowchart\u003c/span\u003e \u003ca href=\"#flowchart\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://affine.paynepride.com/workspace/068b2d03-00ee-4b4b-9a8d-d7b98e85f1f2/YYJT5gEfZin3nTFv7s5wp\"\u003eaffine link\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"interesting-notes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eInteresting notes\u003c/span\u003e \u003ca href=\"#interesting-notes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003ewe will avoid cheap questions that assume black and white understanding of\nthe passage \u0026ldquo;the one who practices sin if of the devil\u0026rdquo; does not mean that\nsinning one time means you\u0026rsquo;re not saved\u0026hellip; put the juvenile things behind us\u003c/li\u003e\n\u003cli\u003e\u0026ldquo;the devil has been sinning from the beginning\u0026rdquo;\n\u003cul\u003e\n\u003cli\u003efrom the beginning of what?\u003c/li\u003e\n\u003cli\u003ehas he really been sinning the entire time? don\u0026rsquo;t we have mythology about\nLucifer being an angel of light??? (note the heavy sarcasm from me here\u0026hellip;)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"reflection\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eReflection\u003c/span\u003e \u003ca href=\"#reflection\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI\u0026rsquo;ve been loosely mediating on this and Romans 7 and 8\u003c/p\u003e\n\u003cdetails class=\"admonition note\"\u003e\n\u003csummary class=\"admonition-title\"\u003eRomans 7:16-8:11\u003c/summary\u003e\n\u003cp\u003e15 For what I am doing I do not understand, because what I want to do, this I do not practice, but what I hate, this I do.\n16 Now if I do what I do not want, I agree with the law, that it is good. 17 So now it is no longer I who do it, but sin that dwells within me. 18 For I know that nothing good dwells in me, that is, in my flesh.\nFor I have the desire to do what is right, but not the ability to carry it out. 19 For I do not do the good I want, but the evil I do not want is what I keep on doing. 20 Now if I do what I do not want, it is no longer I who do it, but sin that dwells within me.\n21 So I find it to be a law that when I want to do right, evil lies close at hand. 22 For I delight in the law of God, in my inner being, 23 but I see in my members another law waging war against the law of my mind and making me captive to the law of sin that dwells in my members.\n24 Wretched man that I am! Who will deliver me from this body of death? 25 Thanks be to God through Jesus Christ our Lord! So then, I myself serve the law of God with my mind, but with my flesh I serve the law of sin. 8:1 There is therefore now no condemnation for those who are in Christ Jesus.\n2 For the law of the Spirit of life has set you free in Christ Jesus from the law of sin and death. 3 For God has done what the law, weakened by the flesh, could not do.\nBy sending his own Son in the likeness of sinful flesh and for sin, he condemned sin in the flesh, 4 in order that the righteous requirement of the law might be fulfilled in us, who walk not according to the flesh but according to the Spirit.\n5 For those who live according to the flesh set their minds on the things of the flesh, but those who live according to the Spirit set their minds on the things of the Spirit. 6 For to set the mind on the flesh is death, but to set the mind on the Spirit is life and peace.\n7 For the mind that is set on the flesh is hostile to God, for it does not submit to God’s law; indeed, it cannot.\n8 Those who are in the flesh cannot please God.\n9 You, however, are not in the flesh but in the Spirit, if in fact the Spirit of God dwells in you. Anyone who does not have the Spirit of Christ does not belong to him.\n10 But if Christ is in you, although the body is dead because of sin, the Spirit is life because of righteousness. 11 If the Spirit of him who raised Jesus from the dead dwells in you, he who raised Christ Jesus from the dead will also give life to your mortal bodies through his Spirit who dwells in you.\u003c/p\u003e\n\u003c/details\u003e\n\u003cp\u003eI think I\u0026rsquo;m mostly walking away from these texts with 2 things on my heart:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eI must be desensitized to some sin in my life - I think it\u0026rsquo;s impossible for\nme to know in my inner being am I genuinely separating myself from my\nsinfulness and enjoying God\u0026rsquo;s presence, or am I using grace as an excuse to\nsin\u0026hellip; The entanglement of my own heart is one of the most difficult things to\nnavigate in personal faith.\u003c/li\u003e\n\u003cli\u003eI am questioning my devotion\u0026hellip; am I devoted to Jesus, to his law, to doing\ngood\u0026hellip; or am I a slave to myself?\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eAs I write this out, the Christian concept of \u0026ldquo;setting the captives free\u0026rdquo; and\njubilee and freedom strike my heart deeply. Just these phrases begin to call up\nemotions. But as I look at my life right now, what am I doing that shouts\nfreedom? I spend more time lately playing games than being entrenched in\ntheological study, I think about work more than things which are noble and\npraiseworthy, and I seem to purposefully focus on my own situations internally\nrather than on God\u0026rsquo;s grace (which I do externally a lot - but I feel this\ntension inside - \u003cstrong\u003ea hook of doubt\u003c/strong\u003e)\u003c/p\u003e\n\u003cdetails class=\"admonition danger\"\u003e\n\u003csummary class=\"admonition-title\"\u003eRomans 8:5a\u003c/summary\u003e\n\u003cp\u003e5 For those who live according to the flesh set their minds on the things of the flesh,\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails class=\"admonition note\"\u003e\n\u003csummary class=\"admonition-title\"\u003eRomans 6\u003c/summary\u003e\n\u003cp\u003e6 For to set the mind on the flesh is death, but to set the mind on the Spirit is life and peace.\u003c/p\u003e\n\u003c/details\u003e\n\u003cp\u003eWhy would I be hesitant to regularly set my mind on things of the spirit? I\nabsolutely feel something inside that rebels against the things of God at\ntimes\u0026hellip; at odd times as well.\u003c/p\u003e\n\u003ch2 id=\"a-prayer\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eA Prayer\u003c/span\u003e \u003ca href=\"#a-prayer\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eLord Jesus, help me to set my mind on things of the Spirit - to live in\naccordance with your will and righteousness. I confess I run in ways I think\nare secret or hidden, I reject godly things daily, and yet in your\ncompassionate love you have saved me from this body of sin and death. Praise be\nto God, guide my heart and mind today, just enough so that tomorrow I can ask\nfor what I need for the day\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eRomans 8:21-25\u003c/p\u003e\n\u003cp\u003e21 Consequently, I find the principle with me, the one who wants to do good, that evil is present with me. 22 For I joyfully agree with the law of God in my inner person, 23 but I observe another law in my members, at war with the law of my mind and making me captive to the law of sin that exists in my members. 24 Wretched man that I am! Who will rescue me from this body of death? 25 Thanks be to God through Jesus Christ our Lord! So then, I myself with my mind am enslaved to the law of God, but with my flesh I am enslaved to the law of sin.\u003c/p\u003e\n\u003c/div\u003e\n",
      "content_text": "\n1 John 3: 7-10 for men's group in August 2025\n\n???+ note \"1 John 3: 7-10\"\n\n    7 Little children, let no one deceive you: the one who practices\n    righteousness is righteous, just as that one is righteous. 8 The one who\n    practices sin is of the devil, because the devil has been sinning from the\n    beginning. For this reason the Son of God was revealed: in order to destroy the\n    works of the devil. 9 Everyone who is fathered by God does not practice sin,\n    because his seed resides in him, and he is not able to sin, because he has been\n    fathered by God. 10 By this the children of God and the children of the devil\n    are evident: everyone who does not practice righteousness is not of God,\n    namely, the one who does not love his brother.\n\n???+ note \"verse 7 from ESV\"\n\n    7 Little children, let no one deceive you. Whoever practices righteousness is righteous, as he is righteous\n\nThe difference I note is that ESV, right or wrong, is more clear that the \"just as that one is righteous\" is actually Jesus\n\n## Flowchart\n\n[affine link](https://affine.paynepride.com/workspace/068b2d03-00ee-4b4b-9a8d-d7b98e85f1f2/YYJT5gEfZin3nTFv7s5wp)\n\n## Interesting notes\n\n- we will avoid cheap questions that assume black and white understanding of\nthe passage \"the one who practices sin if of the devil\" does not mean that\nsinning one time means you're not saved... put the juvenile things behind us\n- \"the devil has been sinning from the beginning\"\n  - from the beginning of what?\n  - has he really been sinning the entire time? don't we have mythology about\n  Lucifer being an angel of light??? (note the heavy sarcasm from me here...)\n\n## Reflection\n\nI've been loosely mediating on this and Romans 7 and 8\n\n??? note \"Romans 7:16-8:11\"\n\n    15 For what I am doing I do not understand, because what I want to do, this I do not practice, but what I hate, this I do. \n    16 Now if I do what I do not want, I agree with the law, that it is good. 17 So now it is no longer I who do it, but sin that dwells within me. 18 For I know that nothing good dwells in me, that is, in my flesh. \n    For I have the desire to do what is right, but not the ability to carry it out. 19 For I do not do the good I want, but the evil I do not want is what I keep on doing. 20 Now if I do what I do not want, it is no longer I who do it, but sin that dwells within me. \n    21 So I find it to be a law that when I want to do right, evil lies close at hand. 22 For I delight in the law of God, in my inner being, 23 but I see in my members another law waging war against the law of my mind and making me captive to the law of sin that dwells in my members. \n    24 Wretched man that I am! Who will deliver me from this body of death? 25 Thanks be to God through Jesus Christ our Lord! So then, I myself serve the law of God with my mind, but with my flesh I serve the law of sin. 8:1 There is therefore now no condemnation for those who are in Christ Jesus. \n    2 For the law of the Spirit of life has set you free in Christ Jesus from the law of sin and death. 3 For God has done what the law, weakened by the flesh, could not do. \n    By sending his own Son in the likeness of sinful flesh and for sin, he condemned sin in the flesh, 4 in order that the righteous requirement of the law might be fulfilled in us, who walk not according to the flesh but according to the Spirit. \n    5 For those who live according to the flesh set their minds on the things of the flesh, but those who live according to the Spirit set their minds on the things of the Spirit. 6 For to set the mind on the flesh is death, but to set the mind on the Spirit is life and peace. \n    7 For the mind that is set on the flesh is hostile to God, for it does not submit to God’s law; indeed, it cannot. \n    8 Those who are in the flesh cannot please God. \n    9 You, however, are not in the flesh but in the Spirit, if in fact the Spirit of God dwells in you. Anyone who does not have the Spirit of Christ does not belong to him. \n    10 But if Christ is in you, although the body is dead because of sin, the Spirit is life because of righteousness. 11 If the Spirit of him who raised Jesus from the dead dwells in you, he who raised Christ Jesus from the dead will also give life to your mortal bodies through his Spirit who dwells in you.\n\nI think I'm mostly walking away from these texts with 2 things on my heart:\n\n1. I must be desensitized to some sin in my life - I think it's impossible for\n   me to know in my inner being am I genuinely separating myself from my\nsinfulness and enjoying God's presence, or am I using grace as an excuse to\nsin... The entanglement of my own heart is one of the most difficult things to\nnavigate in personal faith.\n2. I am questioning my devotion... am I devoted to Jesus, to his law, to doing\n   good... or am I a slave to myself?\n\nAs I write this out, the Christian concept of \"setting the captives free\" and\njubilee and freedom strike my heart deeply. Just these phrases begin to call up\nemotions. But as I look at my life right now, what am I doing that shouts\nfreedom? I spend more time lately playing games than being entrenched in\ntheological study, I think about work more than things which are noble and\npraiseworthy, and I seem to purposefully focus on my own situations internally\nrather than on God's grace (which I do externally a lot - but I feel this\ntension inside - __a hook of doubt__)\n\n??? danger \"Romans 8:5a\"\n\n    5 For those who live according to the flesh set their minds on the things of the flesh, \n\n??? note \"Romans 6\"\n\n    6 For to set the mind on the flesh is death, but to set the mind on the Spirit is life and peace.\n\nWhy would I be hesitant to regularly set my mind on things of the spirit? I\nabsolutely feel something inside that rebels against the things of God at\ntimes... at odd times as well.\n\n## A Prayer\n\nLord Jesus, help me to set my mind on things of the Spirit - to live in\naccordance with your will and righteousness. I confess I run in ways I think\nare secret or hidden, I reject godly things daily, and yet in your\ncompassionate love you have saved me from this body of sin and death. Praise be\nto God, guide my heart and mind today, just enough so that tomorrow I can ask\nfor what I need for the day\n\n!!! note \"Romans 8:21-25\"\n\n    21 Consequently, I find the principle with me, the one who wants to do good, that evil is present with me. 22 For I joyfully agree with the law of God in my inner person, 23 but I observe another law in my members, at war with the law of my mind and making me captive to the law of sin that exists in my members. 24 Wretched man that I am! Who will rescue me from this body of death? 25 Thanks be to God through Jesus Christ our Lord! So then, I myself with my mind am enslaved to the law of God, but with my flesh I am enslaved to the law of sin. \n\n",
      "summary": "1 John 3: 7-10 for men's group in August 2025",
      "date_published": "2025-07-22T06:35:57Z",
      "date_modified": "2025-07-22T06:35:57Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "olivet",
        "note"
      ]
    },
    {
      "id": "https://pype.dev/2025-07-22-notes/",
      "url": "https://pype.dev/2025-07-22-notes/",
      "title": "2025-07-22 Notes",
      "content_text": "\nyesterday: [[2025-07-20-notes]]\n\n- working on finalizing [[after-exceeding-expectations-for-4-years]]\n\n## Bible Project\n\n- I lead discussion next month at Men's group - so starting to take a look at 1 John 3: 7-10\n\n  - [[olivet-mens-group-august-2025]]\n\n- Kassia looking for Bible study ideas... gotta do some amount of research for her\n",
      "summary": "yesterday: 2025-07-20-notes",
      "date_published": "2025-07-22T06:11:40Z",
      "date_modified": "2025-07-22T06:11:40Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-758/",
      "url": "https://pype.dev/thoughts-758/",
      "title": "💭 It’s rude to show AI output to people | Alex Martsinovich",
      "content_text": "\n\u003ca href=\"https://distantprovince.by/posts/its-rude-to-show-ai-output-to-people/\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://distantprovince.by/posts/its-rude-to-show-ai-output-to-people/\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - It's rude to show AI output to people | Alex Martsinovich\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://distantprovince.by/posts/its-rude-to-show-ai-output-to-people/\"\u003eIt's rude to show AI output to people | Alex Martsinovich\u003c/a\u003e\n\n---\n\nGreat read on LLM output, and the slop that's already been dumped into the internet. I've become a pretty heavy AI user - mostly for code and then thoughts organization. With code (that matters) I review everything AI makes. When I ask gemma3 via ollama to organize my thoughts, I reiterate the importance in my prompt to not re-word things, but to just organize and then help me work through whatever I'm working through in the post.\n\nI've generated a blog post or 2 with AI only, and it's still relatively clear to me when AI writes vs when a human writes. This post does a good job of highlighting how 1. this is a hilariously old sci-fi problem (there's nothing new under the sun, ammirite?) 2. how AI is a useful tool and 3. how in the age of AI we're still actually just battling other humans.... but humans are simple creatures in a lot of ways - we take the path of least resistance the vast majority of the time, and LLM sloppy output that _looks_ not shitty is certainly a low-resistance path to a post or commit... but was the post or commit worth anything?\n\nwithout proof of thought - no.\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "Great read on LLM output, and the slop that's already been dumped into the internet. I've become a pretty heavy AI user",
      "date_published": "2025-07-21T11:46:43Z",
      "date_modified": "2025-07-21T11:46:43Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "ai",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/you-suck-at-git-but-its-honestly-fine/",
      "url": "https://pype.dev/you-suck-at-git-but-its-honestly-fine/",
      "title": "You suck at git - but it’s honestly fine",
      "content_html": "\u003ch2 id=\"git-is-for-everyone\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGit is for everyone\u003c/span\u003e \u003ca href=\"#git-is-for-everyone\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI just started listening to \u003ca href=\"https://www.localfirst.fm/\"\u003elocalfirst.fm podcast\u003c/a\u003e\npodcast and would recommend it after 2 episodes. In the first episode, the\nhosts discuss where the term \u003ccode\u003elocalfirst\u003c/code\u003e comes from, what it means, and\nexamples of some localfirst, or semi-localfirst projects. One of them is \u003ccode\u003egit\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ethe de-facto standard by which developers share code today.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThere\u0026rsquo;s a reason it\u0026rsquo;s the standard. I\u0026rsquo;m not arguing that it\u0026rsquo;s perfect, and\nthere\u0026rsquo;s new abstractions that may help people adopt usage like\n\u003ca href=\"https://github.com/jj-vcs/jj\"\u003ejujutsu\u003c/a\u003e, but ultimately \u003ccode\u003egit\u003c/code\u003e is a great tool,\nand anyone can use it who works with text files (lookin at you book-writing\nnerds)\u003c/p\u003e\n\u003cp\u003eBut as I was enjoying the pod the co-host/guest said \u0026ldquo;and we all know the git user\nexperience isn\u0026rsquo;t that great\u0026rdquo;\u003c/p\u003e\n\u003cdiv class=\"admonition danger\"\u003e\n\u003cp class=\"admonition-title\"\u003eheavy sigh\u003c/p\u003e\n\u003cp\u003eGit isn\u0026rsquo;t that hard - you probably just aren\u0026rsquo;t that good at it\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"it-s-ok\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eIt’s OK\u003c/span\u003e \u003ca href=\"#it-s-ok\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eDon\u0026rsquo;t hear me say that you suck at git like that\u0026rsquo;s a bad thing\u0026hellip; It\u0026rsquo;s \u003cem\u003etotally\nfine\u003c/em\u003e to not be a wizard. Many people can use git like 80-90% efficiently for\ntheir own use cases. In fact, my usage of git doesn\u0026rsquo;t fall into any perfectly\nestablished patterns, and the decisions I make are not always the same (the\noverplayed rebase vs merge-upstream argument\u0026hellip; I do both, it doesn\u0026rsquo;t matter,\nsquash your crap at the end anyways\u0026hellip;)\u003c/p\u003e\n\u003cp\u003eSo continue to collaborate - checkout your feature branches, pull in\n\u003ccode\u003eorigin/main\u003c/code\u003e after a PR, ask for help with a rebase for the 69th time if you\nneed to\u003c/p\u003e\n\u003cdiv class=\"admonition danger\"\u003e\n\u003cp class=\"admonition-title\"\u003eDanger\u003c/p\u003e\n\u003cp\u003eBut quit your stupid annoying bitching\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"seriously\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSeriously\u003c/span\u003e \u003ca href=\"#seriously\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eHonestly, I learned \u003cem\u003eabout\u003c/em\u003e git 8 years ago when I started my first job as a\ndata scientist. I was told by another developer, Jokko,\nthat it was the standard for collaboration\u0026hellip; only issue was that almost no one\nin our division even used it. Or if they did it was at the end of a project,\nafter sharing code on share drives and OneDrive, at the very end we\u0026rsquo;d see \u003ccode\u003egit init\u003c/code\u003e, \u003ccode\u003egit add .\u003c/code\u003e, \u003ccode\u003egit commit -m \u0026quot;pushed to git\u0026quot;\u003c/code\u003e, \u003ccode\u003egit push\u003c/code\u003e\u0026hellip; literally 0\nvalue, or at least no more value than\n\u003ccode\u003emy_project_final_FINAL_v2_project-over-now.zip\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eIt took me a few weeks of on-the-job git usage, practicing way over complicated\ngit flows and talking about git with the few people around me who knew it, for\nme to become a go-to resource\u0026hellip; I was and am honestly still annoyed about\nit\u0026hellip; It didn\u0026rsquo;t take that long, or that much effort, to get pretty comfortable\nwith git. There\u0026rsquo;s tons of UIs (with their own flaws), TUIs, and resources for\nlearning the few things that will make you stand out as a git wizard:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003ecan you rebase onto a new root commit?\u003c/li\u003e\n\u003cli\u003ecan you pull in changes from someone else\u0026rsquo;s feature branch?\u003c/li\u003e\n\u003cli\u003eif you find yourself in \u003ccode\u003edetached HEAD state\u003c/code\u003e are you panicked?\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eJust make a directory, \u003ccode\u003egit init\u003c/code\u003e, and start shitting all over text files\u0026hellip;\nmake branches, reconcile differences, just freaking practice for 10 minutes\u003c/p\u003e\n\u003ch2 id=\"end\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEnd\u003c/span\u003e \u003ca href=\"#end\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI was triggered I guess listening to this podcast episode\u0026hellip; It\u0026rsquo;s fine to not\nbe an expert, it\u0026rsquo;s fine to just use the 3 or 4 commands you probably need (\u003ccode\u003egit checkout -b, rebase origin/main, merge feature/branch, push\u003c/code\u003e), I am happy to\nhelp people with git everyday - like I said above, I am somehow a go-to\nresource for git in my workplace\u0026hellip;. (heck, even one of my managers asks me to\nsquash all the commits on his feature branches for him before it\u0026rsquo;s merged to\nmain\u0026hellip; it\u0026rsquo;s fine)\u003c/p\u003e\n\u003cp\u003eBut the user experience isn\u0026rsquo;t bad, so quit your bitching.\u003c/p\u003e\n\u003chr\u003e\n\u003cdetails class=\"admonition note\"\u003e\n\u003csummary class=\"admonition-title\"\u003ephone notes\u003c/summary\u003e\n\u003cp\u003ehot take, if you complain about git then you don\u0026rsquo;t it\u0026hellip; and that\u0026rsquo;s fine but\nshut up. I love git,I use it in a way that\u0026rsquo;s productive for me, and when I hear\npeople complain all they ever say is \u0026ldquo;git is hard\u0026rdquo; and \u0026ldquo;why is rebasing so\nhard?!?!\u0026rdquo;\nbut they don\u0026rsquo;t get it, and that\u0026rsquo;s fine. you can use git inefficiently, as a\nrequirement of your job, and not enjoy it. but don\u0026rsquo;t bitch, because with 10\nminutes of practice you could gain some real fluency in rebasing\u003c/p\u003e\n\u003c/details\u003e\n",
      "content_text": "\n## Git is for everyone\n\nI just started listening to [localfirst.fm podcast](https://www.localfirst.fm/)\npodcast and would recommend it after 2 episodes. In the first episode, the\nhosts discuss where the term `localfirst` comes from, what it means, and\nexamples of some localfirst, or semi-localfirst projects. One of them is `git`\n\n- the de-facto standard by which developers share code today.\n\nThere's a reason it's the standard. I'm not arguing that it's perfect, and\nthere's new abstractions that may help people adopt usage like\n[jujutsu](https://github.com/jj-vcs/jj), but ultimately `git` is a great tool,\nand anyone can use it who works with text files (lookin at you book-writing\nnerds)\n\nBut as I was enjoying the pod the co-host/guest said \"and we all know the git user\nexperience isn't that great\"\n\n!!! danger \"heavy sigh\"\n\n    Git isn't that hard - you probably just aren't that good at it\n\n## It's OK\n\nDon't hear me say that you suck at git like that's a bad thing... It's _totally\nfine_ to not be a wizard. Many people can use git like 80-90% efficiently for\ntheir own use cases. In fact, my usage of git doesn't fall into any perfectly\nestablished patterns, and the decisions I make are not always the same (the\noverplayed rebase vs merge-upstream argument... I do both, it doesn't matter,\nsquash your crap at the end anyways...)\n\nSo continue to collaborate - checkout your feature branches, pull in\n`origin/main` after a PR, ask for help with a rebase for the 69th time if you\nneed to\n\n!!! danger \"\"\n\n    But quit your stupid annoying bitching\n\n## Seriously\n\nHonestly, I learned _about_ git 8 years ago when I started my first job as a\ndata scientist. I was told by another developer, Jokko,\nthat it was the standard for collaboration... only issue was that almost no one\nin our division even used it. Or if they did it was at the end of a project,\nafter sharing code on share drives and OneDrive, at the very end we'd see `git\ninit`, `git add .`, `git commit -m \"pushed to git\"`, `git push`... literally 0\nvalue, or at least no more value than\n`my_project_final_FINAL_v2_project-over-now.zip`\n\nIt took me a few weeks of on-the-job git usage, practicing way over complicated\ngit flows and talking about git with the few people around me who knew it, for\nme to become a go-to resource... I was and am honestly still annoyed about\nit... It didn't take that long, or that much effort, to get pretty comfortable\nwith git. There's tons of UIs (with their own flaws), TUIs, and resources for\nlearning the few things that will make you stand out as a git wizard:\n\n1. can you rebase onto a new root commit?\n2. can you pull in changes from someone else's feature branch?\n3. if you find yourself in `detached HEAD state` are you panicked?\n\nJust make a directory, `git init`, and start shitting all over text files...\nmake branches, reconcile differences, just freaking practice for 10 minutes\n\n## End\n\nI was triggered I guess listening to this podcast episode... It's fine to not\nbe an expert, it's fine to just use the 3 or 4 commands you probably need (`git\ncheckout -b, rebase origin/main, merge feature/branch, push`), I am happy to\nhelp people with git everyday - like I said above, I am somehow a go-to\nresource for git in my workplace.... (heck, even one of my managers asks me to\nsquash all the commits on his feature branches for him before it's merged to\nmain... it's fine)\n\nBut the user experience isn't bad, so quit your bitching.\n\n---\n\n??? note \"phone notes\"\n\n    hot take, if you complain about git then you don't it... and that's fine but\n    shut up. I love git,I use it in a way that's productive for me, and when I hear\n    people complain all they ever say is \"git is hard\" and \"why is rebasing so\n    hard?!?!\"\n    but they don't get it, and that's fine. you can use git inefficiently, as a\n    requirement of your job, and not enjoy it. but don't bitch, because with 10\n    minutes of practice you could gain some real fluency in rebasing\n",
      "summary": "I just started listening to localfirst.fm podcast podcast and would recommend it after 2 episodes. In the first episode, the hosts discuss where the term...",
      "date_published": "2025-07-21T05:20:07Z",
      "date_modified": "2025-07-21T05:20:07Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "git",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/2025-07-20-notes/",
      "url": "https://pype.dev/2025-07-20-notes/",
      "title": "2025-07-20 Notes",
      "content_text": "\nyesterday: [[2025-07-19-notes]]\n\n## Today\n\n- started [[you-suck-at-git-but-its-honestly-fine]]\n\n- made great progress on protecting some markata posts with an encryption workflow\n  - markata build can encrypt the rendered html data of a post (encryption done with python)\n  - front-end can decrypt the post content\n  - password and decrypted content are nowhere on the rendered website (but they are presently in the repo)\n  - [[example-protected-post]] - password is `example123`\n",
      "summary": "yesterday: 2025-07-19-notes",
      "date_published": "2025-07-20T05:20:21Z",
      "date_modified": "2025-07-20T05:20:21Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-757/",
      "url": "https://pype.dev/thoughts-757/",
      "title": "💭 Anthropic Is Bleeding Out",
      "content_text": "\n\u003ca href=\"https://www.wheresyoured.at/anthropic-is-bleeding-out/?ref=dailydev\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://www.wheresyoured.at/anthropic-is-bleeding-out/?ref=dailydev\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - Anthropic Is Bleeding Out\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://www.wheresyoured.at/anthropic-is-bleeding-out/?ref=dailydev\"\u003eAnthropic Is Bleeding Out\u003c/a\u003e\n\n---\n\nAh... so things are rough on the business side according to Edward Zitron\n\nAn intere|ing note is that anthropic models make more more than half of all token related to programming through OpenRouter... so they clearly have marketshare but if they're losing money on _every single customer_ then oof... what does the future of vibe coding look like? And who can afford it?\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "Ah... so things are rough on the business side according to Edward Zitron An intere|ing note is that anthropic models m",
      "date_published": "2025-07-19T10:44:56Z",
      "date_modified": "2025-07-19T10:44:56Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "llm",
        "anthropic",
        "ai",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/2025-07-19-notes/",
      "url": "https://pype.dev/2025-07-19-notes/",
      "title": "2025-07-19 Notes",
      "content_text": "\nyesterday: [[2025-07-18-notes]]\n\n## Notes\n\n- working on protecting blog posts with a password somehow too\n  - pretty cool that I can pull in RSS but it pulls in the whole feed and then it's not super easy to edit everything... maybe worth it for one time additions - or could keep using FreshRSS for that and karakeep for other stuff.... though not notes, that's my blog... so it's kind of like archivebox, replaces texting myself messages with links and notes... that's probably where it fits.\n\n## Men's Group\n\n- Met at Chefo's today, talked about identity in Christ, what it means to abide, and why we still sin even though 1 John says \"anyone who sins is not in him\"\n- I am leading on the next one - August 16. Note in [karakeep](https://karakeep.paynepride.com/dashboard/preview/opl94af4bwsdk55bg8xtd43h)\n\n## Affine\n\nWhat I am seeing about Affine is that the power is in the edgeless view. There's plenty of notion-esq apps for writting documents that have some special formatting. But the edgeless view allows you to represent more complicated relationships that are present in the document that are impossible to represent linearlly...\n\n![20250719114631_9e51e998.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250719114631_9e51e998.png)\n\n![20250719114742_7621198f.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250719114742_7621198f.png)\n\n## Karakeep\n\n- started setting up [karakeep](https://docs.karakeep.app/) today using [this blog](https://blog.mariofragnito.it/en-gb/posts/rss-and-read-later-with-miniflux/)\n\nI can add stuff to karakeep, put it in a list, then expose the list as RSS and get the things that I want to read later in the feed reader, while still having karakeep now as a dumping grounds... now it feels actually like it does what thoughts does for me _almost_ ... there's an app and extension to play around with\n\n- the firefox extension rocks...\n\n- I wonder how the app is...\n\n!!! success \"It ephing rocks...\"\n\n    Why did I wait so long on this???\n",
      "summary": "yesterday: 2025-07-18-notes",
      "date_published": "2025-07-19T05:37:30Z",
      "date_modified": "2025-07-19T05:37:30Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-753/",
      "url": "https://pype.dev/thoughts-753/",
      "title": "💭 Thread by @windsurf_ai on Thread Reader App – Thread Reader App",
      "content_text": "\n\u003ca href=\"https://threadreaderapp.com/thread/1945599013954490523.html?utm_source=tldrai\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://threadreaderapp.com/thread/1945599013954490523.html?utm_source=tldrai\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - Thread by @windsurf_ai on Thread Reader App – Thread Reader App\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://threadreaderapp.com/thread/1945599013954490523.html?utm_source=tldrai\"\u003eThread by @windsurf_ai on Thread Reader App – Thread Reader App\u003c/a\u003e\n\n---\n\nClaude 4 is pretty impressive, I'm enjoying using it at work and now I'll certainly burn some credits at home.\n\nAlso I like this Threadreader thing... may need to look into it\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "Claude 4 is pretty impressive, I'm enjoying using it at work and now I'll certainly burn some credits at home. Also I l",
      "date_published": "2025-07-18T10:54:50Z",
      "date_modified": "2025-07-18T10:54:50Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "windsurf",
        "rss",
        "threadreader",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/2025-07-18-notes/",
      "url": "https://pype.dev/2025-07-18-notes/",
      "title": "2025-07-18 Notes",
      "content_text": "\nyesterday : [[2025-07-17-notes]]\n\n## News\n\n- I got news that my job will be moved to on-site only... I plan to make my case but I have low hopes and I'm not sure where or if I'll write about this... or when...\n\n- [The Kill is an amazing song and this rivals the OG](https://www.youtube.com/watch?v=HMBRjo33cUE)\n\n## Wins\n\n- Finished [[pilgrims-creek---about-me]]\n- Wrote up a bit on [[after-exceeding-expectations-every-year]]\n",
      "summary": "yesterday : 2025-07-17-notes",
      "date_published": "2025-07-18T05:23:14Z",
      "date_modified": "2025-07-18T05:23:14Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/daily-notes-neovim-plugin/",
      "url": "https://pype.dev/daily-notes-neovim-plugin/",
      "title": "Daily Notes Neovim Plugin",
      "content_text": "\n# What?\n\nWindsurf helped me whip up a neovim plugin for my daily notes workflows. It has\na few features that make my note taking workflow day-to-day a tiny bit more\nfluid\n\n!!! note \"credit due\"\n\n    Honestly my zettlekasten and this daily notes stuff is only possible with the help of [Waylon Walker](https://waylonwalker.com)\n\n## Context\n\nI learned about the concept of a [zettlekasten]() recently and it really spoke\nto me. I've sought for YEARS to have a nice note-taking workflow, where I never\nthink about _where_ to put something, it's searchable, portable to some degree,\nand customizable... I've used OneNote and its derivatives, different\nself-hosted container based note taking apps, raw markdown files scattered on\nmy file system, etc... I think I've finally landed on a solution which is\nbasically this blog + some tooling to achieve the things I want...\n\n- [markata](https://markata.dev) is the build system, it's what lets me keep all my notes in markdown files, and build them into a cohesive searchable experience on the web\n- [neovim](https://neovim.io) is my primary note taking environment - using tools like `marksman` I get the ability to \"jump\" to wiki-linked posts and grep content easily for searching\n- [copier](https://copier.readthedocs.io) is used for generating note templates - whether it's a `til`, blog post, or starting my daily note page - copier makes it quick to stub out the file in the right place with the right tags and frontmatter for markata\n\n## Usage\n\nI'll explain the daily notes workflow here, the code is below...\n\nThere's basically just a couple things I wanted smoothed out in my note-taking as I am getting started here...\n\n1. I need an immediate way to get to my daily notes page... I have started keeping a new note for each day and it's a chore to copy paste the old note, update the date, delete content, etc... instead `check_and_open_daily_note` checks the directory I keep my daily notes in `pages/daily` in my blog repo, checks the date for a note for today and either creates it from the copier template or opened it as my current buffer\n\n\u003e I could maybe improve this by making it global so that no matter what directory I'm in I could open the daily note with a keymap or lua function call instead of swapping tmux sessions and then opening the file\n\n2. I need a way to link to _yesterday_'s notes so it's easy to \"go to definition\" on the wiki link which opens the file...\n3. I wanted to track page linking... this is something core for me as I am building out my personal knowledge base, but I have key areas in my life where I want to see graphical links, or at least make it easy to trace thoughts I've had like clicking through wikipedia, so the `find_backlinks` function brings up a menu of all the pages that link to the one I'm in\n\nI'm sure I'll add more functions as time goes on - it'd be ncie to open certain slash pages like [[now]] with a keymap... drop me a note at `nic@pype.dev` if you've got any great ideas!\n\n## Code\n\nsee the [gist](https://gist.github.com/pypeaday/38192f6db4d77c7c3be2b9213e14db6c)\n\n",
      "summary": "Windsurf helped me whip up a neovim plugin for my daily notes workflows. It has a few features that make my note taking workflow day-to-day a tiny bit more...",
      "date_published": "2025-07-17T21:11:32Z",
      "date_modified": "2025-07-17T21:11:32Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "neovim",
        "note"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-752/",
      "url": "https://pype.dev/thoughts-752/",
      "title": "💭 AI INTERVIEWS ARE HERE!! SO I TROLLED ONE TO SHOW YOU… - You…",
      "content_text": "\n\u003ca href=\"https://www.youtube.com/watch\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://www.youtube.com/watch\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - AI INTERVIEWS ARE HERE!! SO I TROLLED ONE TO SHOW YOU... - YouTube\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://www.youtube.com/watch\"\u003eAI INTERVIEWS ARE HERE!! SO I TROLLED ONE TO SHOW YOU... - YouTube\u003c/a\u003e\n\n---\n\nAI has provided a lot of value in my life for sure... but it's still not my favorite piece of technology, and the nearish-term-future certainly has some dystopian qualities to it. AI interviews definitely are in that category and Josh does a good and comical job of highlighting the ridiculousness of it. \n\nI envy no one looking for a job, and I double envy no one who has to deal with AI powered HR solutions...\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "AI has provided a lot of value in my life for sure... but it's still not my favorite piece of technology, and the nearis",
      "date_published": "2025-07-17T10:41:04Z",
      "date_modified": "2025-07-17T10:41:04Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "ai",
        "josh-fluke",
        "interview",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/add-yourself-to-www-data-to-view-your-nextcloud-data-on-the-filesystem/",
      "url": "https://pype.dev/add-yourself-to-www-data-to-view-your-nextcloud-data-on-the-filesystem/",
      "title": "Add yourself to www-data to view your Nextcloud data on the filesystem",
      "content_text": "\nI am working on using [[gotify-cli-for-notifying-me-of-nextcloud-uploads]] and\nI'll start by running the gotify cli as my user so I'll need to be able to see\nthe directory in the filesystem that Nextcloud stores the data in.\n\nThat folder on disk is owned by `www-data` (see [[nextcloud-permissions-with-zfs-and-ansible-nas]]\n\nTurns out it's my computer and I can do what I want so I just add myself to the\n`www-data` group instead of running the `gotify cli` as `root`\n\n# Bonus\n\nYou can remove users from groups with `gpasswd -d username groupname`\n",
      "summary": "I am working on using gotify-cli-for-notifying-me-of-nextcloud-uploads and I'll start by running the gotify cli as my user so I'll need to be able to see the...",
      "date_published": "2025-07-17T07:38:09Z",
      "date_modified": "2025-07-17T07:38:09Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "nextcloud",
        "til",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/2025-07-17-notes/",
      "url": "https://pype.dev/2025-07-17-notes/",
      "title": "2025-07-17 Notes",
      "content_text": "\nyesterday: [[2025-07-16-notes]]\n\n## Notes\n\n- Heidi liked the white parking signs, printed another one\n\n## Wins\n\n- Finished up post on [[daily-notes-neovim-plugin]]\n- Basically finished [[gotify-cli-for-notifying-me-of-nextcloud-uploads]]\n",
      "summary": "yesterday: 2025-07-16-notes",
      "date_published": "2025-07-17T05:44:58Z",
      "date_modified": "2025-07-17T05:44:58Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/gotify-cli-for-notifying-me-of-nextcloud-uploads/",
      "url": "https://pype.dev/gotify-cli-for-notifying-me-of-nextcloud-uploads/",
      "title": "gotify cli for notifying me of nextcloud uploads",
      "content_text": "\n# The Ask\n\nI was looking for a way to get notified from nextcloud when files were uploaded\nto a certain directory. This is because the upload is very spotty due to the\nphysical environment of where the nextcloud client is, and once a file shows up\nI have a job to do. So I was hoping nextcloud had an easy way to say \"if file\nshows up in X folder, notify me\" but I can't find it...\n\n## Solution 2\n\nSince I already use gotify and they provide a [DOPE\nCLI](https://github.com/gotify/cli) we can write a little bash script to work\nat the filesystem level rather than the nextcloud level.\n\n## Permissions\n\nWe'll need to make sure the user running this script has all the right read\npermissions... In my exact case the file upload happens in a group folder,\nwhich is easily found on the filesystem in the Nextcloud volume at\n`.../data/__groupfolders/{id}/{rest of path}`. This was owned by `www-data` on\nthe host, see\n[[add-yourself-to-www-data-to-view-your-nextcloud-data-on-the-filesystem]] if\nyou want but a simple `usermod -aG www-data \u003cme\u003e` does the trick.\n\n## The Script\n\nWith a little AI magic to spruce up the messaging, the script basically looks like this:\n\n```bash\n#!/bin/bash\n\n# Script to monitor sermon directory using gotify watch\n# Used with a systemd service or standalone\n# Can run in local or remote (SSH) mode\n\n# Configuration\n\n# Target directory to monitor\nDIR_PATH=\"/path/to/watch\"\n\n# Mode: Set to \"ssh\" or \"local\"\n# If ssh, will connect to SSH_HOST as SSH_USER to monitor the directory\n# If local, will monitor the directory directly on this machine\nMODE=\"ssh\"\n\n# Remote SSH settings (only used if MODE=\"ssh\")\nSSH_USER=\"youruser\"\nSSH_HOST=\"yourserver\"\n\n# Log settings\nLOG_DIR=\"$HOME/.local/state/sermon-monitor\"\nLOG_FILE=\"$LOG_DIR/sermon-monitor.log\"\nMAX_LOG_SIZE_KB=1024 # 1MB max log size\n\n# Create log directory if it doesn't exist\nmkdir -p \"$LOG_DIR\" 2\u003e/dev/null\n\n# Create or truncate log file if it's too large\nif [ -f \"$LOG_FILE\" ] \u0026\u0026 [ $(stat -c%s \"$LOG_FILE\" 2\u003e/dev/null || echo 0) -gt $((MAX_LOG_SIZE_KB * 1024)) ]; then\n  # Keep the last 20 lines when rotating\n  tail -n 20 \"$LOG_FILE\" \u003e\"${LOG_FILE}.tmp\" 2\u003e/dev/null \u0026\u0026 mv \"${LOG_FILE}.tmp\" \"$LOG_FILE\" 2\u003e/dev/null\n  echo \"$(date '+%Y-%m-%d %H:%M:%S') - Log file rotated due to size limit\" \u003e\u003e\"$LOG_FILE\"\nfi\n\n# Ensure log file exists\ntouch \"$LOG_FILE\" 2\u003e/dev/null\n\n# Log function\nlog() {\n  echo \"$(date '+%Y-%m-%d %H:%M:%S') - $1\" | tee -a \"$LOG_FILE\"\n}\n\n# Create a temp file to store the previous state\nTEMP_DIR=\"/tmp/gotify-watcher\"\nPREV_STATE_FILE=\"$TEMP_DIR/previous_state.txt\"\nmkdir -p \"$TEMP_DIR\" 2\u003e/dev/null || true\n\n# Function to get directory listing based on mode\nget_directory_listing() {\n  if [ \"$MODE\" = \"ssh\" ]; then\n    # Remote mode - use SSH\n    ssh $SSH_USER@$SSH_HOST \"ls -la '$DIR_PATH' | grep -v '^\\.\\.$' | grep -v '^\\.$'\" ||\n      echo \"Error: Failed to connect to $SSH_HOST\"\n  else\n    # Local mode - direct access\n    if [ -d \"$DIR_PATH\" ]; then\n      ls -la \"$DIR_PATH\" | grep -v '^\\.\\.$' | grep -v '^\\.$'\n    else\n      echo \"Error: Directory $DIR_PATH does not exist locally\"\n    fi\n  fi\n}\n\n# Removed unused function - was leftover from previous version\n\n# Display startup message based on mode\nif [ \"$MODE\" = \"ssh\" ]; then\n  log \"Starting sermon file monitor for $SSH_USER@$SSH_HOST:$DIR_PATH (SSH mode)\"\nelse\n  log \"Starting sermon file monitor for $DIR_PATH (local mode)\"\nfi\n\n# Run initial check to establish baseline\nCURRENT_LISTING=$(get_directory_listing)\necho \"$CURRENT_LISTING\" \u003e\"$PREV_STATE_FILE\"\nlog \"Initial state captured. Watching for changes.\"\n\n# Monitor continuously\nwhile true; do\n  # Sleep for 30 seconds between checks\n  sleep 30\n\n  # Get current listing\n  CURRENT_LISTING=$(get_directory_listing)\n\n  # Find new files by comparing with previous state\n  NEW_FILES=$(diff --new-line-format=\"%L\" --old-line-format=\"\" --unchanged-line-format=\"\" \\\n    \"$PREV_STATE_FILE\" \u003c(echo \"$CURRENT_LISTING\") | grep -v \"^total\" | grep -v \"^drwx\")\n\n  # If new files found, notify\n  if [ -n \"$NEW_FILES\" ]; then\n    # Filter out directories and system entries, keep only regular files\n    FILE_ENTRIES=$(echo \"$NEW_FILES\" | grep -v \"^d\" | grep -v \"^total\" | grep -v \"^\\.$\" | grep -v \"^\\.\\.\")\n\n    # Count how many actual files (non-empty lines)\n    NEW_COUNT=$(echo \"$FILE_ENTRIES\" | grep -v \"^$\" | wc -l)\n\n    # Only proceed if we have actual files\n    if [ \"$NEW_COUNT\" -gt 0 ]; then\n      # Create notification message\n      if [ \"$NEW_COUNT\" -eq 1 ]; then\n        TITLE=\"New File Added\"\n        # Extract filename from listing line\n        FILENAME=$(echo \"$FILE_ENTRIES\" | awk '{print $NF}')\n        MESSAGE=\"New file detected: $FILENAME\"\n      else\n        TITLE=\"New Files Added\"\n        # Format filenames only for readability\n        FILELIST=$(echo \"$FILE_ENTRIES\" | awk '{print $NF}' | sort)\n        MESSAGE=\"$NEW_COUNT new files detected:\\n$FILELIST\"\n      fi\n\n      # Send notification\n      gotify push --title \"$TITLE\" \"$MESSAGE\"\n      log \"Notification sent for new files: $NEW_COUNT\"\n    fi\n\n    # Update previous state\n    echo \"$CURRENT_LISTING\" \u003e\"$PREV_STATE_FILE\"\n  fi\ndone\n\n# If we get here, gotify watch has exited\nlog \"gotify watch exited unexpectedly\"\nexit 1\n\n```\n\n### Credentials\n\nAs noted in the gotify repo - you can put the relevant credentials in a\n`./cli.json` which is what I did since this is in a big repo of mine and that's\nwhere the script executes from\n\n```json\n{\n  \"token\": \"yourToken\",\n  \"url\": \"https://gotify.example.com\",\n  \"defaultPriority\": 6\n}\n```\n",
      "summary": "I was looking for a way to get notified from nextcloud when files were uploaded to a certain directory. This is because the upload is very spotty due to the...",
      "date_published": "2025-07-16T20:33:25Z",
      "date_modified": "2025-07-16T20:33:25Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "nextcloud",
        "tech",
        "notifications",
        "nextcloud",
        "gotify"
      ]
    },
    {
      "id": "https://pype.dev/using-restic-to-backup-my-home-directory/",
      "url": "https://pype.dev/using-restic-to-backup-my-home-directory/",
      "title": "Using restic to backup my home directory",
      "content_text": "\n# Intro\n\nI need to backup my personal $HOME to my NAS cause there's a lot in there, and\nmostly my git projects with .env files all over. Plus some docker data\n\n## Why Not ZFS?\n\nGREAT QUESTION! It's because I struggled getting all the syncoid/sanoid\nrequirements installed on my Aurora OS.... I like the immutable desktop trend,\nbut I don't understand rpm-ostree enough to properly get all the lower level\nkernel stuff setup in a way I trust. So because I don't have ZFS at $HOME\nwhat's a boy to do?\n\n`rsync` would probably work fine especially if I [[rsync-like-a-pro]] but I figured I could cobble together some other tech and broaden my horizons...\n\n## Enter restic\n\nApparently [restic](https://restic.net/) has been around for a while, and you can run it in a container... awesome that's all I needed to hear...\n\n## How?\n\nI'll use a docker compose stack for this... typically I think running `restic`\nright on the host is the way to go, but on my desktop I float between my host\nand distroboxes and to keep things as simple as possible, even though less\nefficient, I want to manage everything through containers as my homelab gets\nbuilt out and eventually I'll have a more full-featured ecosystem.\n\n## The Value\n\nYou can find code below and an example repo that more or less is what I use for my desktop backup but that's primarily what I was after.... backing up the data on my desktop to my NAS in a way that:\n\n1. I wouldn't have to \"remember\" how I was doing it\n\n- I accomplish this by having good git repo organization and README files that explain my own usage patterns\n\n2. Tracked snapshots\n\n- I need some kind of snapshotting - `zfs` has spoiled me, and turns out `restic` has some amount of support for it\n\n3. Running in docker would be ideal for now so that I don't need to worry about installing specific binaries across machine while I build out my patterns\n\nWith this setup I get to backup my $HOME to my NAS which contains 1. docker\nvolume info for all the AI workloads I run on my desktop and 2. all my\nsensitive info in my git repos is at least backed up in a way that I can\nrecover `.env` files with relative ease...\n\n# Code\n\nCheck out the [Example GH\nRepo](https://github.com/pypeaday/docker-compose-restic) but I'll drop key file\ncontents here for a quick read if you're interested in some of the setup... but\nthe blog post mostly ends here\n\n## The Files\n\nWe have a `docker-compose.yml` of course\n\n```yaml\nservices:\n  backup:\n    image: restic/restic:latest\n    network_mode: host\n    container_name: restic_backup\n    hostname: restic-backup-runner\n    env_file:\n      - .env\n    environment:\n      # The location of the backup repository inside the container\n      - RESTIC_REPOSITORY=/target\n      # The location of the password file inside the container\n      - RESTIC_PASSWORD_FILE=/password\n    volumes:\n      # --- Source and Config Mounts ---\n      - \"${BACKUP_SOURCE}:/source:ro\"\n      - \"${RESTIC_PASSWORD_FILE}:/password:ro\"\n      - \"./backup-and-prune.sh:/usr/local/bin/backup-and-prune:ro\"\n\n      # --- Persistent Data Mounts ---\n      - \"./.ssh:/root/.ssh:rw\"\n      - \"./.cache:/root/.cache:rw\"\n\n    # Set the default entrypoint to our new script. This will be executed when\n    # the container starts, unless overridden.\n    entrypoint: [\"/usr/local/bin/backup-and-prune\"]\n```\n\nYour `.env` file will need to look like this\n\n```bash\n``# HOST related variables\n# The source directory to back up (absolute path)\nBACKUP_SOURCE=/home/nic\n\n# --- Restic Configuration ---\n# The file containing the restic repository password (absolute path on host)\nHOST_RESTIC_PASSWORD_FILE=/home/nic/projects/personal/homelab-mono/dataops/docker/.restic-password\n# The SSH private key to use for connecting to the NAS (absolute path on host)\n# It's recommended to use a dedicated key for this purpose.\nSSH_PRIVATE_KEY_FILE=/home/nic/.skm/ghost/id_rsa\n\n# Container Env Vars\n# the container makes the sftp connection using my credentials, but nonetheless the container needs them, so this isn't envrc stuff\n\n# --- SFTP/SSH Connection Details for the NAS ---\nSFTP_USER=nic\nSFTP_HOST=ghost\n# The path on the NAS where the restic repository will be stored\nSFTP_PATH=/tank/encrypted/nas/nic-home/\n\n# --- Restic Configuration ---\n\nRESTIC_REPOSITORY=/target\nRESTIC_PASSWORD_FILE=/password\n```\n\nAnd then the backup script that the container will execute is something like this:\n\n```bash\n\n#!/bin/sh\nset -e # Exit immediately if a command exits with a non-zero status.\n\n# Construct the repository path from environment variables passed by docker-compose\nREPO=\"sftp:${SFTP_USER}@${SFTP_HOST}:${SFTP_PATH}\"\n\n# 1. Run the backup\n# -----------------\necho \"--- Starting backup for ${BACKUP_SOURCE} ---\"\nrestic backup /source --verbose -r \"${REPO}\"\necho \"--- Backup complete ---\"\n\n# 2. Clean up old snapshots according to the policy\n# --------------------------------------------------\necho \"--- Pruning old snapshots ---\n(Policy: keep last 7 daily, 4 weekly, 6 monthly)\"\nrestic forget \\\n    --prune \\\n    --keep-daily 7 \\\n    --keep-weekly 4 \\\n    --keep-monthly 6 \\\n    -r \"${REPO}\"\n\necho \"--- Backup and prune process finished successfully ---\"\n```\n\n## Systemd\n\nFinally there's a systemd unit and timer file in there so you can setup a systemd service for the backup\n\n### service\n\n```bash\n\n[Unit]\nDescription=Run Restic backup to NAS using Docker Compose\n# We are running this as a user service, so we assume that the system-level\n# docker.service is already running.\nAfter=network-online.target\n\n[Service]\nType=oneshot\n# Set the working directory to where your docker-compose.yml and .env file are located\nWorkingDirectory=/home/user/nas-backup/docker\n\n# The command to execute. We use the full path to docker-compose for reliability.\n# You may need to adjust this path if 'docker compose' is installed elsewhere.\nExecStart=/usr/bin/docker compose run --rm backup\n\n[Install]\nWantedBy=default.target\n```\n\n### timer\n\n```bash\n\n[Unit]\nDescription=Run Restic backup job daily\n\n[Timer]\n# Run daily at 2:00 AM\nOnCalendar=daily\n# Or uncomment for a specific time:\n# OnCalendar=*-*-* 02:00:00\n\n# Run the backup immediately if the last scheduled run was missed (e.g., if the computer was off)\nPersistent=true\n\n[Install]\nWantedBy=timers.target\n```\n",
      "summary": "I need to backup my personal $HOME to my NAS cause there's a lot in there, and mostly my git projects with .env files all over. Plus some docker data",
      "date_published": "2025-07-16T09:12:26Z",
      "date_modified": "2025-07-16T09:12:26Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/shotput/",
      "url": "https://pype.dev/shotput/",
      "title": "Shotput",
      "content_text": "\nThis is from [[i-built-a-simple-app-for-adding-images-to-my-blog]]\n\n## Overview\n\nShotput is a simple webapp backed by a git repo that allows you to paste a screenshot from your clipboard, it gets put into the repo and pushed, and you get a link back to using that image via statically's CDN in your website.\n\n## Example\n\n![20250607130609_dadd33eb.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250607130609_dadd33eb.png)\n\npasting an image let's you copy the markdown link for easy pasting\n\n```markdown\n![20250607130609_dadd33eb.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250607130609_dadd33eb.png)\n```\n\n## Concerns\n\nCurrently this is deployed with an ssh key mounted into the container that I\nput into a zfs dataset manually. Per [[2025-07-16-notes#Wants]] I'm struggling\nwith the key sharing model...\n",
      "summary": "This is from i-built-a-simple-app-for-adding-images-to-my-blog",
      "date_published": "2025-07-16T06:18:00Z",
      "date_modified": "2025-07-16T06:18:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "projects",
        "blog"
      ]
    },
    {
      "id": "https://pype.dev/2025-07-16-notes/",
      "url": "https://pype.dev/2025-07-16-notes/",
      "title": "2025-07-16 Notes",
      "content_text": "\nyesterday - [[2025-07-15-notes]]\n\n## Notes\n\n- working on parking signs for heidi\n  - need to buy black and green PETG probably\n\n## For Today\n\nI'm going to try replacing my \"for today\" and \"for tomorrow\" sections of notes with just updating [[now]]\n\n[[pilgrims-creek---about-me#Hello]]\n\nI'm migrating my homelab stuff to its own repo called `homelab-mono`\n\n- starting with the restic stuff going into a `dataops` folder\n- will move `homelab-compose` to there eventually\n\n- restic is backing up ok I think, but I want just recipes for quickly checking the health and so I'm working on that with windsurf right now\n\n- I started working on [[gotify-cli-for-notifying-me-of-nextcloud-uploads]] and it's got me thinking that I was going to be using temporal for this kind of stuff... how far out to I branch out at home?\n\n## Wants\n\nI'm struggling with some homelab setup... Between\n[[using-restic-to-backup-my-home-directory#Intro]] and building my blog with temporal\n(oh and [[shotput]] which pushes images to my images.pype.dev repo ) I'm\nfinding that I need an ssh key in a container... My restic backup uses my ssh\nkey and runs out of my dotfiles repo right now. But I need to think about a way\nto generate or share a restricted user's keypair with a container or many\ncontainers for homelab use...\n\n- ssh\n- restic\n- zfs operations? probably not\n- github permissions / self-hosted git repo\n  - should be github for images.pype.dev because statically.io works well specifically with github\n\nThis is where something like vault would come in handy... a central place to\nstore these types of credentials. But I suppose I could hack something up on a\nzfs dataset... I could generate a key pair for a user in my lab, or even me but\nwith restricted permissions, and then put that in\n`/tank/encrypted/docker/something-zfs` and then use that as a host mount into\nany containers that need a key? `-v\n/tank/enctyped/docker/something-zfs:/home/appuser/.ssh` something like that...\n\n## Wins\n\n- got [[using-restic-to-backup-my-home-directory#Intro]] written today\n- Started working on using [[gotify-cli-for-notifying-me-of-nextcloud-uploads]]\n",
      "summary": "yesterday - 2025-07-15-notes",
      "date_published": "2025-07-16T06:05:39Z",
      "date_modified": "2025-07-16T06:05:39Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/2025-07-15-notes/",
      "url": "https://pype.dev/2025-07-15-notes/",
      "title": "2025-07-15 Notes",
      "content_text": "\nyesterday: [[2025-07-14-notes]]\n\n## Today\n\n- church sermon upload\n- respond to Michael\n\n## Affine\n\n- More with affine and mind-mapping (I bookmarked a TT BJJ video I wanted to make a map of from JFlo)\n  - I have another JFlo vid now... falling behind\n\n## Writing\n\n- [ ] Write up more on restic - how to check backups etc. (and do it while you write it up... duh)\n  - [[using-restic-to-backup-my-home-directory]]\n- [ ] Andrew's sermon today had several good points I want to meditate on.\n  - biblical friendship\n- [ ] Notes on obedience with kids and my patterns for instruction\n  1. I talk about obedience a lot, but I should to it with more focus on grace and love, not so much _during_ the girls being disobedient\n  2. I need to use the word shema with the girls - help adorn them with the fear of the Lord. deut 6 and proverbs 1\n  - [[deuteronomy-6-and-the-shema]]\n\n## Projects to touch\n\n- [[thoughts-to-nostr]]\n- [[daily-notes-neovim-plugin]]\n- no notes but I'm continuing to iterate on my dotfiles and pype.dev theming\n  with windsurf - mostly just to keep a portion of my brain occupied with\n  lightweight project management\n\n## Wins\n\n- [[python-editable-installs-and-nested-scripts]]\n- Got started with dockerizing in [[thoughts-to-nostr#dockerizing]]\n\n## For Tomorrow\n\n- [[using-restic-to-backup-my-home-directory]]\n- [[thoughts-to-nostr]]\n- [[daily-notes-neovim-plugin]]\n- [[deuteronomy-6-and-the-shema]]\n- More with affine and mind-mapping (I bookmarked a TT BJJ video I wanted to make a map of from JFlo)\n  - I have another JFlo vid now... falling behind\n",
      "summary": "yesterday: 2025-07-14-notes",
      "date_published": "2025-07-15T06:20:47Z",
      "date_modified": "2025-07-15T06:20:47Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/python-editable-installs-and-nested-scripts/",
      "url": "https://pype.dev/python-editable-installs-and-nested-scripts/",
      "title": "Python editable installs and nested scripts",
      "content_html": "\u003ch1 id=\"intro\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eIntro\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eI have been working towards a standard structure for all my python projects -\nand I mean much more than just \u003ccode\u003euv init\u003c/code\u003e or something along those lines. But\none of the things that got me recently was starting to keep a \u003ccode\u003escripts/\u003c/code\u003e folder\nthat ran code based on what was in \u003ccode\u003esrc/\u003c/code\u003e or \u003ccode\u003eapp/\u003c/code\u003e (I\u0026rsquo;m working on that\u0026hellip;)\nbeing installed in the virtual environment\u0026hellip; so I\u0026rsquo;d \u003ccode\u003euv pip install -e .\u003c/code\u003e or\n\u003ccode\u003euv pip install -e src\u003c/code\u003e (kind of depends on the structure) and then in\n\u003ccode\u003escripts/foo.py\u003c/code\u003e I\u0026rsquo;d have \u003ccode\u003efrom my_cool_code.module import thing\u003c/code\u003e\u0026hellip;.\u003c/p\u003e\n\u003cp\u003eRunning scripts has never been a problem\u0026hellip; but I\u0026rsquo;ve always kept them in the\nroot of the repo OR \u003cem\u003einside\u003c/em\u003e \u003ccode\u003eapp\u003c/code\u003e or \u003ccode\u003esrc\u003c/code\u003e in a \u003cem\u003enested\u003c/em\u003e directory\u0026hellip;\u003c/p\u003e\n\u003cp\u003eSo here\u0026rsquo;s where I learned a little something about \u003ccode\u003epython my_script.py\u003c/code\u003e vs\n\u003ccode\u003epython -m my_script\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"example\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExample\u003c/span\u003e \u003ca href=\"#example\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI setup a short example repo to illustrate the problem\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/pypeaday/python-e-example\"\u003elink to repo\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThe repo structure is very simple\u0026hellip;\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003epython-e-example\n  ├── foo.py\n  ├── pyproject.toml\n  ├── src\n  │   ├── module.py\n  ├── README.md\n  └── scripts\n      └── bar.py\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003ccode\u003escripts/bar.py\u003c/code\u003e and \u003ccode\u003efoo.py\u003c/code\u003e are the same code:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003esrc.module\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003emy_func\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=\"n\"\u003emy_func\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eand then \u003ccode\u003esrc/module.py\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003emy_func\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=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;it worked!\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe rest of the structure is from \u003ccode\u003euv init\u003c/code\u003e basically, then \u003ccode\u003euv venv\u003c/code\u003e will make\nyour virtual environment, and \u003ccode\u003euv pip install -e .\u003c/code\u003e will install the library in\neditable mode.\u003c/p\u003e\n\u003ch3 id=\"so-what-s-the-problem\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSo what’s the problem?\u003c/span\u003e \u003ca href=\"#so-what-s-the-problem\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eLet\u0026rsquo;s run \u003ccode\u003efoo.py\u003c/code\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enic in python-e-example   main   ×7 via   v3.13.1\u003cspan class=\"o\"\u003e(\u003c/span\u003epython-e-example\u003cspan class=\"o\"\u003e)\u003c/span\u003e   \u003cspan class=\"o\"\u003e(\u003c/span\u003edev\u003cspan class=\"o\"\u003e)\u003c/span\u003e 󰒄\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e⬢ \u003cspan class=\"o\"\u003e[\u003c/span\u003edevbox\u003cspan class=\"o\"\u003e]\u003c/span\u003e ❯ python foo.py\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eit worked!\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNice! It works just like we\u0026rsquo;d expect\u0026hellip;\u003c/p\u003e\n\u003cp\u003eWhat about \u003ccode\u003epython scripts/bar.py\u003c/code\u003e?\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enic in python-e-example   main   ×7 via   v3.13.1\u003cspan class=\"o\"\u003e(\u003c/span\u003epython-e-example\u003cspan class=\"o\"\u003e)\u003c/span\u003e   \u003cspan class=\"o\"\u003e(\u003c/span\u003edev\u003cspan class=\"o\"\u003e)\u003c/span\u003e 󰒄\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e⬢ \u003cspan class=\"o\"\u003e[\u003c/span\u003edevbox\u003cspan class=\"o\"\u003e]\u003c/span\u003e ❯ python scripts/bar.py\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eTraceback \u003cspan class=\"o\"\u003e(\u003c/span\u003emost recent call last\u003cspan class=\"o\"\u003e)\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  File \u003cspan class=\"s2\"\u003e\u0026#34;/tmp/python-e-example/scripts/bar.py\u0026#34;\u003c/span\u003e, line 8, in \u0026lt;module\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    from src.module import my_func\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eModuleNotFoundError: No module named \u003cspan class=\"s1\"\u003e\u0026#39;src\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cdiv class=\"admonition danger\"\u003e\n\u003cp class=\"admonition-title\"\u003eCome again for big fudge...\u003c/p\u003e\n\u003c/div\u003e\n\u003ch3 id=\"ok-let-s-stay-calm-and-troubleshoot\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOk let’s stay calm and troubleshoot\u003c/span\u003e \u003ca href=\"#ok-let-s-stay-calm-and-troubleshoot\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eWhat if we open a \u003ccode\u003epython\u003c/code\u003e shell\u0026hellip;\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePython 3.13.1 \u003cspan class=\"o\"\u003e(\u003c/span\u003emain, Dec \u003cspan class=\"m\"\u003e19\u003c/span\u003e 2024, 14:32:25\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003eClang 18.1.8 \u003cspan class=\"o\"\u003e]\u003c/span\u003e on linux\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eType \u003cspan class=\"s2\"\u003e\u0026#34;help\u0026#34;\u003c/span\u003e, \u003cspan class=\"s2\"\u003e\u0026#34;copyright\u0026#34;\u003c/span\u003e, \u003cspan class=\"s2\"\u003e\u0026#34;credits\u0026#34;\u003c/span\u003e or \u003cspan class=\"s2\"\u003e\u0026#34;license\u0026#34;\u003c/span\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e more information.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026gt;\u0026gt;\u0026gt; from src.module import my_func\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026gt;\u0026gt;\u0026gt; my_func\u003cspan class=\"o\"\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\u0026lt;!--markata-attribution--\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eit worked!\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eok\u0026hellip; as expected it worked, and we\u0026rsquo;ve learned nothing\u0026hellip;\u003c/p\u003e\n\u003cdiv class=\"admonition warning\"\u003e\n\u003cp class=\"admonition-title\"\u003eimplicit behavior\u003c/p\u003e\n\u003cp\u003eWe didn\u0026rsquo;t learn anything from the example but something is present that we\ndon\u0026rsquo;t see\u0026hellip; \u003ccode\u003epython foo.py\u003c/code\u003e implicitly adds the path to the script to\n\u003ccode\u003esys.path\u003c/code\u003e and so the \u003ccode\u003esrc\u003c/code\u003e library is in the same directory as the script\n\u003ccode\u003efoo.py\u003c/code\u003e so the library is on \u003ccode\u003esys.path\u003c/code\u003e\u0026hellip;. take note of this\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"the-problem\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThe Problem\u003c/span\u003e \u003ca href=\"#the-problem\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eTurns out \u003ccode\u003euv pip install .\u003c/code\u003e and \u003ccode\u003euv pip install -e .\u003c/code\u003e are \u003cem\u003eactually\u003c/em\u003e different\u003c/p\u003e\n\u003cfigure\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250705005214_a83dd563.png\" alt=\"20250705005214_a83dd563.png\"\u003e\n\u003c/figure\u003e\n\u003cp\u003eThe editable install adds a \u003ccode\u003e.pth\u003c/code\u003e file into \u003ccode\u003esite-packages\u003c/code\u003e which acts as a\nshell hook.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# .venv/lib/python3.13/site-packages/__editable__.python_e_example-0.1.0.pth\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/tmp/python-e-example/src\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSo when \u003ccode\u003epython\u003c/code\u003e runs a script, the location of the script is\nimplicitly added to \u003ccode\u003esys.path\u003c/code\u003e as noted above.\nThe \u003ccode\u003epython\u003c/code\u003e process invoked by \u003ccode\u003epython foo.py\u003c/code\u003e has \u003ccode\u003e$PWD\u003c/code\u003e on \u003ccode\u003esys.path\u003c/code\u003e which is \u003ccode\u003e/tmp/python-e-example\u003c/code\u003e in\nthe example but \u003ccode\u003epython scripts/bar.py\u003c/code\u003e has \u003ccode\u003e/tmp/python-e-example/scripts\u003c/code\u003e\non \u003ccode\u003esys.path\u003c/code\u003e\u0026hellip; which means that \u003ccode\u003e/tmp/python-e-example\u003c/code\u003e is NOT on \u003ccode\u003esys.path\u003c/code\u003e\nin the process that\u0026rsquo;s running \u003ccode\u003escripts/bar.py\u003c/code\u003e and so the \u003ccode\u003esrc\u003c/code\u003e folder won\u0026rsquo;t be\nsearched by python because the \u003ccode\u003e.pth\u003c/code\u003e file points to a directory that\u0026rsquo;s no on\nthe path!\u003c/p\u003e\n\u003ch2 id=\"the-solution\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThe Solution\u003c/span\u003e \u003ca href=\"#the-solution\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWe can instead of running the script \u0026ldquo;as a script\u0026rdquo; we can tell python to\nexecute it as as a module with \u003ccode\u003epython -m scripts.bar\u003c/code\u003e. This is syntatically\nsimilar to \u003ccode\u003epython path/to/script.py\u003c/code\u003e but instead tells the python interpreter\nto execute the script as a module so the path is replaced by import syntax.\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eThis works for foo.py too\u003c/p\u003e\n\u003c/div\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e⬢ \u003cspan class=\"o\"\u003e[\u003c/span\u003edevbox\u003cspan class=\"o\"\u003e]\u003c/span\u003e ✗ python -m foo\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eit worked!\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=\"o\"\u003e[\u003c/span\u003edevbox\u003cspan class=\"o\"\u003e]\u003c/span\u003e ❯ python -m scripts.bar\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eit worked!\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\u003ch2 id=\"chatgpt\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eChatGPT\u003c/span\u003e \u003ca href=\"#chatgpt\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIt\u0026rsquo;s noteworthy that jipity was helpful in exploring these issues I was running into\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://chatgpt.com/c/686d2a05-5b54-800f-8b84-1638c1b96840\"\u003elink to convo\u003c/a\u003e\u003c/p\u003e\n",
      "content_text": "\n# Intro\n\nI have been working towards a standard structure for all my python projects -\nand I mean much more than just `uv init` or something along those lines. But\none of the things that got me recently was starting to keep a `scripts/` folder\nthat ran code based on what was in `src/` or `app/` (I'm working on that...)\nbeing installed in the virtual environment... so I'd `uv pip install -e .` or\n`uv pip install -e src` (kind of depends on the structure) and then in\n`scripts/foo.py` I'd have `from my_cool_code.module import thing`....\n\nRunning scripts has never been a problem... but I've always kept them in the\nroot of the repo OR _inside_ `app` or `src` in a _nested_ directory...\n\nSo here's where I learned a little something about `python my_script.py` vs\n`python -m my_script`\n\n## Example\n\nI setup a short example repo to illustrate the problem\n\n[link to repo](https://github.com/pypeaday/python-e-example)\n\nThe repo structure is very simple...\n\n```\npython-e-example\n  ├── foo.py\n  ├── pyproject.toml\n  ├── src\n  │   ├── module.py\n  ├── README.md\n  └── scripts\n      └── bar.py\n```\n\n`scripts/bar.py` and `foo.py` are the same code:\n\n```python\nfrom src.module import my_func\n\nmy_func()\n```\n\nand then `src/module.py`:\n\n```python\ndef my_func():\n    print(\"it worked!\")\n```\n\nThe rest of the structure is from `uv init` basically, then `uv venv` will make\nyour virtual environment, and `uv pip install -e .` will install the library in\neditable mode.\n\n### So what's the problem?\n\nLet's run `foo.py`\n\n```bash\nnic in python-e-example   main   ×7 via   v3.13.1(python-e-example)   (dev) 󰒄\n⬢ [devbox] ❯ python foo.py\nit worked!\n```\n\nNice! It works just like we'd expect...\n\nWhat about `python scripts/bar.py`?\n\n```bash\nnic in python-e-example   main   ×7 via   v3.13.1(python-e-example)   (dev) 󰒄\n⬢ [devbox] ❯ python scripts/bar.py\nTraceback (most recent call last):\n  File \"/tmp/python-e-example/scripts/bar.py\", line 8, in \u003cmodule\u003e\n    from src.module import my_func\nModuleNotFoundError: No module named 'src'\n```\n\n!!! danger \"Come again for big fudge...\"\n\n### Ok let's stay calm and troubleshoot\n\nWhat if we open a `python` shell...\n\n```bash\nPython 3.13.1 (main, Dec 19 2024, 14:32:25) [Clang 18.1.8 ] on linux\nType \"help\", \"copyright\", \"credits\" or \"license\" for more information.\n\u003e\u003e\u003e from src.module import my_func\n\u003e\u003e\u003e my_func()\nit worked!\n```\n\nok... as expected it worked, and we've learned nothing...\n\n!!! warning \"implicit behavior\"\n\n    We didn't learn anything from the example but something is present that we\n    don't see... `python foo.py` implicitly adds the path to the script to\n    `sys.path` and so the `src` library is in the same directory as the script\n    `foo.py` so the library is on `sys.path`.... take note of this\n\n## The Problem\n\nTurns out `uv pip install .` and `uv pip install -e .` are _actually_ different\n\n![20250705005214_a83dd563.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250705005214_a83dd563.png)\n\nThe editable install adds a `.pth` file into `site-packages` which acts as a\nshell hook.\n\n```txt\n# .venv/lib/python3.13/site-packages/__editable__.python_e_example-0.1.0.pth\n\n/tmp/python-e-example/src\n```\n\nSo when `python` runs a script, the location of the script is\nimplicitly added to `sys.path` as noted above.\nThe `python` process invoked by `python\nfoo.py` has `$PWD` on `sys.path` which is `/tmp/python-e-example` in\nthe example but `python scripts/bar.py` has `/tmp/python-e-example/scripts`\non `sys.path`... which means that `/tmp/python-e-example` is NOT on `sys.path`\nin the process that's running `scripts/bar.py` and so the `src` folder won't be\nsearched by python because the `.pth` file points to a directory that's no on\nthe path!\n\n## The Solution\n\nWe can instead of running the script \"as a script\" we can tell python to\nexecute it as as a module with `python -m scripts.bar`. This is syntatically\nsimilar to `python path/to/script.py` but instead tells the python interpreter\nto execute the script as a module so the path is replaced by import syntax.\n\n!!! note \"This works for foo.py too\"\n\n```bash\n⬢ [devbox] ✗ python -m foo\nit worked!\n\n⬢ [devbox] ❯ python -m scripts.bar\nit worked!\n\n```\n\n## ChatGPT\n\nIt's noteworthy that jipity was helpful in exploring these issues I was running into\n\n[link to convo](https://chatgpt.com/c/686d2a05-5b54-800f-8b84-1638c1b96840)\n",
      "summary": "I have been working towards a standard structure for all my python projects - and I mean much more than just or something along those lines. But one of the...",
      "date_published": "2025-07-14T08:40:32Z",
      "date_modified": "2025-07-14T08:40:32Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "python",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/typ-ing-personal-best/",
      "url": "https://pype.dev/typ-ing-personal-best/",
      "title": "typ.ing personal best",
      "content_html": "\u003cp\u003eI can\u0026rsquo;t even remember if I\u0026rsquo;ve hit 130 WPM in a typing challenge before, let\nalone at 98%+ accuracy!\u003c/p\u003e\n\u003cfigure\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250714131151_ce1ddc2f.png\" alt=\"20250714131151_ce1ddc2f.png\"\u003e\n\u003c/figure\u003e\n",
      "content_text": "\nI can't even remember if I've hit 130 WPM in a typing challenge before, let\nalone at 98%+ accuracy!\n\n![20250714131151_ce1ddc2f.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250714131151_ce1ddc2f.png)\n",
      "summary": "I can't even remember if I've hit 130 WPM in a typing challenge before, let alone at 98%+ accuracy!",
      "date_published": "2025-07-14T08:12:37Z",
      "date_modified": "2025-07-14T08:12:37Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "typing",
        "note"
      ]
    },
    {
      "id": "https://pype.dev/2025-07-14-notes/",
      "url": "https://pype.dev/2025-07-14-notes/",
      "title": "2025-07-14 Notes",
      "content_text": "\nyesterday: [[2025-07-13-notes]]\n\nYesterday I basically got 0 things done computer-wise. So this is mostly a copy paste of my morning notes from yesterday:\n\n## Affine\n\n- More with affine and mind-mapping (I bookmarked a TT BJJ video I wanted to make a map of from JFlo)\n\n## Writing\n\n- Write up more on restic - how to check backups etc. (and do it while you write it up... duh)\n- Andrew's sermon today had several good points I want to meditate on.\n  - biblical friendship\n- Notes on obedience with kids and my patterns for instruction\n  1. I talk about obedience a lot, but I should to it with more focus on grace and love, not so much _during_ the girls being disobedient\n  2. I need to use the word shema with the girls - help adorn them with the fear of the Lord. deut 6 and proverbs 1\n  - [[deuteronomy-6-and-the-shema]]\n- [[python-editable-installs-and-nested-scripts]]\n\n## Projects to touch\n\n- [[thoughts-to-nostr]]\n- [[daily-notes-neovim-plugin]]\n- no notes but I'm continuing to iterate on my dotfiles and pype.dev theming\n  with windsurf - mostly just to keep a portion of my brain occupied with\n  lightweight project management\n",
      "summary": "yesterday: 2025-07-13-notes",
      "date_published": "2025-07-14T06:28:33Z",
      "date_modified": "2025-07-14T06:28:33Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-749/",
      "url": "https://pype.dev/thoughts-749/",
      "title": "💭 Agile Was Never Your Problem Pt 1/2 | The Cynical Developer",
      "content_text": "\n\u003ca href=\"https://thecynical.dev/posts/agile-was-never-your-problem/\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://thecynical.dev/posts/agile-was-never-your-problem/\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - Agile Was Never Your Problem Pt 1/2 | The Cynical Developer\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://thecynical.dev/posts/agile-was-never-your-problem/\"\u003eAgile Was Never Your Problem Pt 1/2 | The Cynical Developer\u003c/a\u003e\n\n---\n\nLove this post - feels like it vindicates a lot of my opinions (that I've been pretty loud about professionally). I love agile but I HATE Agile... and this helps put years of my feelings into semi-structured text...\nAgile isn't the problem but it certainly is a broad label for many many problems\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "Love this post - feels like it vindicates a lot of my opinions (that I've been pretty loud about professionally). I love",
      "date_published": "2025-07-13T18:13:08Z",
      "date_modified": "2025-07-13T18:13:08Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "agile",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/2025-07-13-notes/",
      "url": "https://pype.dev/2025-07-13-notes/",
      "title": "2025-07-13 Notes",
      "content_text": "\nyesterday: [[2025-07-12-notes]]\n\n## Affine\n\n- More with affine and mind-mapping (I bookmarked a TT BJJ video I wanted to make a map of from JFlo)\n\n## Writing\n\n- Write up more on restic - how to check backups etc. (and do it while you write it up... duh)\n- Andrew's sermon today had several good points I want to meditate on.\n  - biblical friendship\n  - deut 6, shema\n    1. I talk about obedience a lot, but I should to it with more focus on grace and love, not so much _during_ the girls being disobedient\n    2. I need to use the word shema with the girls - help adorn them with the fear of the Lord. deut 6 and proverbs 1\n    - [[deuteronomy-6-and-the-shema]]\n\n## Projects to touch\n\n- [[thoughts-to-nostr]]\n- [[daily-notes-neovim-plugin]]\n\n## Wins\n\n- lots of outside time with the girls today\n",
      "summary": "yesterday: 2025-07-12-notes",
      "date_published": "2025-07-13T13:04:07Z",
      "date_modified": "2025-07-13T13:04:07Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/waupaca-boatride-volleyball-tournament/",
      "url": "https://pype.dev/waupaca-boatride-volleyball-tournament/",
      "title": "Waupaca Boatride Volleyball Tournament",
      "content_html": "\u003cp\u003e\u003ca href=\"https://www.waupacaboatride.com/\"\u003ewebsite\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"2025\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e2025\u003c/span\u003e \u003ca href=\"#2025\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003ePlayed with Ming, John, and Daniel\u003c/li\u003e\n\u003cli\u003eWe honestly didn\u0026rsquo;t play great - some good passes but many errors definitely lost us our games\u003c/li\u003e\n\u003cli\u003eI must\u0026rsquo;ve missed 7 or 8 serves and 2 were game point (we then lost those games)\u003c/li\u003e\n\u003cli\u003eOverall had a blast - we played \u003ccode\u003eB LEAGUE\u003c/code\u003e which is 100% appropriate\u0026hellip; already looking forward to next year\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"packing-notes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePacking Notes\u003c/span\u003e \u003ca href=\"#packing-notes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eI overpacked this year (shocker)\u003c/li\u003e\n\u003cli\u003eItems for next year:\n\u003cul\u003e\n\u003cli\u003eBetter canopy with sides\u003c/li\u003e\n\u003cli\u003epop up table\u003c/li\u003e\n\u003cli\u003ecamp stove (talk to ming about this)\u003c/li\u003e\n\u003cli\u003enicer chairs\u003c/li\u003e\n\u003cli\u003etowel\u003c/li\u003e\n\u003cli\u003eless clothes\u0026hellip;\u003c/li\u003e\n\u003cli\u003etrail running shoes were PERFECT\u003c/li\u003e\n\u003cli\u003eEpoch sunnies or similar\u003c/li\u003e\n\u003cli\u003eUV hoodie\u003c/li\u003e\n\u003cli\u003eanker solix power bank\n\u003cul\u003e\n\u003cli\u003e3 outlets\u003c/li\u003e\n\u003cli\u003eusb\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n[website](https://www.waupacaboatride.com/)\n\n## 2025\n\n- Played with Ming, John, and Daniel\n- We honestly didn't play great - some good passes but many errors definitely lost us our games\n- I must've missed 7 or 8 serves and 2 were game point (we then lost those games)\n- Overall had a blast - we played `B LEAGUE` which is 100% appropriate... already looking forward to next year\n\n### Packing Notes\n\n- I overpacked this year (shocker)\n- Items for next year:\n  - Better canopy with sides\n  - pop up table\n  - camp stove (talk to ming about this)\n  - nicer chairs\n  - towel\n  - less clothes...\n  - trail running shoes were PERFECT\n  - Epoch sunnies or similar\n  - UV hoodie\n  - anker solix power bank\n    - 3 outlets\n    - usb\n",
      "summary": "website",
      "date_published": "2025-07-12T20:17:30Z",
      "date_modified": "2025-07-12T20:17:30Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "volleyball",
        "note"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-748/",
      "url": "https://pype.dev/thoughts-748/",
      "title": "💭 OpenAI’s Windsurf deal is off — and Windsurf’s CEO is going to…",
      "content_text": "\n\u003ca href=\"https://www.theverge.com/openai/705999/google-windsurf-ceo-openai\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://www.theverge.com/openai/705999/google-windsurf-ceo-openai\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - OpenAI’s Windsurf deal is off — and Windsurf’s CEO is going to Google | The Verge\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://www.theverge.com/openai/705999/google-windsurf-ceo-openai\"\u003eOpenAI’s Windsurf deal is off — and Windsurf’s CEO is going to Google | The Verge\u003c/a\u003e\n\n---\n\nWelp I'm not upset the OpenAI deal fell through (I mean probably not great for those at Codeium, but I don't want these big tech firms to keep buying out the competition... So even though I'm not upset about it - I can't say going to Google is my favorite alternative... I'm a windsurf user at home but if the Google deal goes through I may drop windsurf entirely and stick to roo...\n\nLook at me care about who owns my editor when I'll just root myself deeper into vs**** #smh\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "Welp I'm not upset the OpenAI deal fell through (I mean probably not great for those at Codeium, but I don't want these",
      "date_published": "2025-07-12T10:48:05Z",
      "date_modified": "2025-07-12T10:48:05Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "windsurf",
        "ai",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/2025-07-12-notes/",
      "url": "https://pype.dev/2025-07-12-notes/",
      "title": "2025-07-12 Notes",
      "content_text": "\nyesterday: [[2025-07-11-notes]]\n\n## Today\n\n- Playing in Waupaca volleyball tournament\n- Saw news about OpenAI Windsurf deal falling through\n- Started setting up\n  [affine](https://docs.affine.pro/self-host-affine/install/docker-compose-recommend)\n  to try a self-hosted option for mind mapping... draw.io is ok, excalidraw is\n  ok, but I feel like for mind mapping there's gotta be a better tool than what\n  I'd use for infra diagrams... maybe not, but affine looks interesting to at\n  least spin up nonetheless and thankfully it's just `docker compose up`\n\n## Affine\n\nYou have to go to `\u003caffine-url\u003e/admin` for the admin setup, and from there\nthere is no link to the root page where you can see the workspaces... good to\nnote\n\n### WHY\n\nOne of the things that comes up in my mind every now and then is a way to map\nout BJJ flows... like given position A start a flow chart based on opponent\ndecisions. Or flow charts of execution steps of passes or things like that...\n\nNeeding the mind map feels similar to linking my posts together, but it's like\nmore detailed - I need a lot of space for many different ideas, whereas with\ntext notes pretty much all the space is given to one note (or one link in all\nthe map).\n\nI also think in diagrams a lot - see [[thinking-in-diagrams#Intro]] and so\nhaving a nice place to keep all my diagrams has felt like a dream. I go back\nand forth with draw.io and excalidraw for various things both personal and\nwork, and I just don't know how to pick one over the other. So maybe moving to\na different style of platform with Affine (which is Notion-esq) will help me\norganize the mind maps in a meaningful way\n\n## Volleyball\n\nI got to play in America's largest volleyball tournament which takes place in Waupaca\n\n- [[waupaca-boatride-volleyball-tournament]]\n\n## For tomorrow\n\n- More with affine and mind-mapping (I bookmarked a TT BJJ video I wanted to make a map of from JFlo)\n- Write up more on restic - how to check backups etc. (and do it while you write it up... duh)\n- don't lose sight of [[thoughts-to-nostr]]\n- or [[daily-notes-neovim-plugin]]\n",
      "summary": "yesterday: 2025-07-11-notes",
      "date_published": "2025-07-12T05:54:08Z",
      "date_modified": "2025-07-12T05:54:08Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/ghost/",
      "url": "https://pype.dev/ghost/",
      "title": "Ghost",
      "content_text": "\n# Intro\n\nGhost is my primary application server. These are the specs...\n\n\u003e I wrote about some of the specs in [[homelab-journey-part-1#current-homelab-setup]] but here is where I will keep up to date information\n\n## Why\n\nWhy `ghost`? I don't know... I was going for a theme at one point it time, or\nseveral points rather... and after giving up on the theatrics of a fully\nconsistent harry potter naming scheme across all my homelab entities, I decided\nto just come up with some short aliases that were easy to type. So `ghost` was\nborn, and the backup server is `ghost-vault`.\n\n## CPU\n\nI have a `AMD Ryzen 7 5700G with Radeon Graphics @ 16x 4.426GHz` in this bad\nboy... why this chip? Well I knew I wanted many cores, and I was previously on\na Ryzn 5 3600, which was fine but I noticed that as I started to develop with\ncontainers more that I was going to want to take advnaatage of more cores...\n\nI also was pretty sure that the built-in graphics would be enough for the\nacceleration requirements I had in mind - which was primarily [[jellyfin]].\n\nAt this point in time, I think AMD was still beating Intel on most of the\nbenchmarks I tended to care about (I was watching channels like Bitwit and LTT\nat the time of building this machine)\n\nSo because of the moderate amount of cores and built-in GPU, I paid $229 for it\naccording to my Amazon history, and it's currently priced at $174, so that's a\npretty sweet deal if you're on AM4 and looking to upgrade in July of 2025\n\n## Memory\n\nI maxxed her out at 128 Gee Beez. I snagged that kit of Crucial that's all\nblack that we've all seen on Amazon. I paid aboaut $90 for it, it's currently\npriced way high for some reason, which is unfortunate. It's been totally fine\nfor me as far as memory performance goes - in that it's stable and I don't\nthink about it...\n\n## Boot\n\nI have a 1 TB NVMe in here to boot from. I think it's a Crucial P3\n\n## Storage\n\nStorage is the interesting bit, it's supposed to be the most rock solid but\nit's also been the most fluid for me from a hardware perspective, and as of my\nmost recent case migration I think I'm in a good spot..\n\n\u003e The case is a Sagitatius 8-bay NAS Chassis from aliexpress\n\nI use\n[zfs](https://openzfs.github.io/openzfs-docs/Getting%20Started/index.html)\nand recommend you do to.... but this isn't a post about that\n\nMy primary zpool is a 12TB ZFS Mirror, and I have another 12TB ZFS Mirror as an\non-prem replica plugged into this same box.\n\nThere is a 4TB drive that serves as frigate's media directory - I wanted a\ndedicated drive due to the write-intensive nature of the NVR.\n\n\u003e I backup to an offsite box using syncoid\n\n## OS\n\nI am currently running Ubuntu Server 24.04\n\nI am eager for Ubuntu to get zfs in their release that contains the zfs data\ncorruption with encrypted datasets but I don't expect to see it until 26.04 at\nthe earliest _fingers crossed_.\n\n## KVM\n\nI recently purchased a [jetkvm](https://www.jetkvm.com/) and it's exactly what\nI need for both my main server and my backup off-site... An amazingly simple\nand elegant solution to remote KVM.\n\n## Applications\n\nCurrently I use `docker compose` to manage practically everything. Stay tuned\nfor more about those things\n\nI also have a few ansible playbooks for setting up my shell and some utilities\non my computers, including the server. They're in\n[github](https://github.com/pypeaday/ansible-playbooks)\n\nFind more at [[the-homelab]]\n",
      "summary": "Ghost is my primary application server. These are the specs...",
      "date_published": "2025-07-11T20:23:35Z",
      "date_modified": "2025-07-11T20:23:35Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/the-homelab/",
      "url": "https://pype.dev/the-homelab/",
      "title": "The Homelab",
      "content_text": "\n# The Lab\n\nThis is the landing page for my homelab posts. It isn't a feed because I will\nwrite things here and link out to relevant parts of the homelab.\n\nI'll probably have notes about the hardware mostly here.\n\n## Primary Application Server\n\nMy main server is called [[ghost]]\n\n## Current Homelab Setup\n\n\u003e I copied this our of [[homelab-journey-part-1#current-homelab-setup]] for now to stub out what this page will link to\n\n## Ad blocking | Pi-Hole\n\nHardware: pi-3\n\nI have a Raspberry Pi 3 hardwired in that is running pi-hole so that's been a\npart of my infrastructure now for a long time.\n\n## Router | OPNSense\n\n!!! note \"stats\"\n\n    CPU: i5-8700\n\n    Memory: 8GB of whatever was in the box\n\n    Storage: 1TB SSD\n\nMy router is an old Optiplex SFF 5060 I got from Amazon for less than $100.\nSo I'm running a x86 system for my router with\nOpenSense on it. Just seemed it to be another home lab standard and I'd like to\nsomeday bring pi-hole over there or use AdGuard or integrate those two things\nmaybe a little bit more completely but right now they are mostly separate.\n\n## Networking | VLANs\n\nThere's a\nmanaged switch in there for some VLAN tomfoolery for my cameras and an IOT\nnetwork type of a thing.\n\n## Networking | VPN | Tailscale\n\nThey're on tailscale as well so my DNS happens over tailscale.\n\n## My Desktop\n\n!!! note \"stats\"\n\n    CPU: Ryzen 7 5700X\n\n    GPU: Nvidia 3090\n\n    Memory: 64 GB\n\n    Storage: 4TB SSD + 2 TB HDD for zfs backup\n\n    OS: Universal Blue Aurora\n\nMy daily-driver desktop is somewhat apart of my homelab now as I have a 3090 in\nthere with 20 GB of VRAM so I can run some heavier LLMs for self-hosted AI\nworkloads. Everything in that space runs in a container and then I manage\ndocker containers with compose stacks and portainer for visibility.\n\n### Applications\n\nSome of the apps I run here are ollama, open-webui, automatic1111's stable diffusion webui, whisper-webui\n",
      "summary": "This is the landing page for my homelab posts. It isn't a feed because I will write things here and link out to relevant parts of the homelab.",
      "date_published": "2025-07-11T20:22:51Z",
      "date_modified": "2025-07-11T20:22:51Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-746/",
      "url": "https://pype.dev/thoughts-746/",
      "title": "💭 Docker Brings Compose to the AI Agent Era | Docker",
      "content_text": "\n\u003ca href=\"https://www.docker.com/blog/build-ai-agents-with-docker-compose/\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://www.docker.com/blog/build-ai-agents-with-docker-compose/\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - Docker Brings Compose to the AI Agent Era | Docker\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://www.docker.com/blog/build-ai-agents-with-docker-compose/\"\u003eDocker Brings Compose to the AI Agent Era | Docker\u003c/a\u003e\n\n---\n\nSeems like docker is leaning harder into compose - which is great for me as a heavy compose user. I had heard about some of the LLM enablements directly through docker desktop - for example taking fuller advantage of the host's compute power without paying the penalty of the nvidia runtime or something... I can't claim to have followed it all but I heard \"run LLMs in docker directly for a bigger boost\" and I'm in.\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "Seems like docker is leaning harder into compose - which is great for me as a heavy compose user. I had heard about some",
      "date_published": "2025-07-11T11:49:41Z",
      "date_modified": "2025-07-11T11:49:41Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "docker",
        "ai",
        "homelab",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-745/",
      "url": "https://pype.dev/thoughts-745/",
      "title": "💭 Tyblog | systemd has been a complete, utter, unmitigated success",
      "content_text": "\n\u003ca href=\"https://blog.tjll.net/the-systemd-revolution-has-been-a-success/\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://blog.tjll.net/the-systemd-revolution-has-been-a-success/\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - Tyblog | systemd has been a complete, utter, unmitigated success\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://blog.tjll.net/the-systemd-revolution-has-been-a-success/\"\u003eTyblog | systemd has been a complete, utter, unmitigated success\u003c/a\u003e\n\n---\n\nI found this post on systemd this morning, and although I've been a Linux user for around 6 years now, there's some levels of it that are pretty foreign to me. One of the things I never got was the drama around systemd - but that's because I wasn't around in the beforefore times, I don't use cron THAT MUCH, and I've only had to setup a few systemd unit files - not enough to generate a real opinion on it.\nBut lately I'm looking into more automation at home - and some stuff is fun to put into an overkill of a platform for a homelab, like temporal, but some stuff should probably be run in more hardened ways (backups for example) - so getting a little download this morning on systemd from a clearly seasoned Linux user is a nice addition to my hot cup of coffee.\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "I found this post on systemd this morning, and although I've been a Linux user for around 6 years now, there's some leve",
      "date_published": "2025-07-11T11:00:54Z",
      "date_modified": "2025-07-11T11:00:54Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "systemd",
        "linux",
        "blog",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/lua-type-hinting-undefined-global/",
      "url": "https://pype.dev/lua-type-hinting-undefined-global/",
      "title": "Lua type hinting - undefined global",
      "content_html": "\u003cp\u003eI have tons of linting errors in my nvim config, partly because I use Lazyvim\nplus a set of poorly written customizations that have traveled with me for a\nwhile. I try to re-work things and right now I\u0026rsquo;ve been revisiting my developer\nsetup. Well the LSP rrors as I\u0026rsquo;ve gone through my neovim config are ticking me\noff - and this was the biggest one \u0026ldquo;Undefined global: vim\u0026rdquo;. I saw \u003ccode\u003evim.fn\u003c/code\u003e\neverywhere but the LSP hated it\u0026hellip; turns out \u003ccode\u003evim\u003c/code\u003e is a given global and you\ncan help your lsp with this:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e---@diagnostic disable: undefined-global\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e-- vim is a global in Neovim Lua scripts\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eFor example:\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\"\u003e\u003cspan class=\"c1\"\u003e---@diagnostic disable: undefined-global\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e-- vim is a global in Neovim Lua scripts\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003ereturn\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=\"s2\"\u003e\u0026#34;pypeaday\u0026#34;\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=\"n\"\u003edir\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003evim.fn\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estdpath\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;config\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e..\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/lua/pypeaday\u0026#34;\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=\"n\"\u003econfig\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kr\"\u003efunction\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=\"kd\"\u003elocal\u003c/span\u003e \u003cspan class=\"n\"\u003edaily\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003erequire\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;pypeaday.daily\u0026#34;\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=\"n\"\u003evim.api\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003envim_create_user_command\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;DailyNote\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003edaily.check_and_open_daily_note\u003c/span\u003e\u003cspan class=\"p\"\u003e,\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=\"n\"\u003evim.api\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003envim_create_user_command\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Daily\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003edaily.check_and_open_daily_note\u003c/span\u003e\u003cspan class=\"p\"\u003e,\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=\"n\"\u003evim.api\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003envim_create_user_command\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;BackLinks\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003edaily.find_backlinks\u003c/span\u003e\u003cspan class=\"p\"\u003e,\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=\"n\"\u003evim.keymap\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;n\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026lt;leader\u0026gt;dn\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003edaily.check_and_open_daily_note\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"n\"\u003edesc\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Open daily note\u0026#34;\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=\"n\"\u003evim.keymap\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;n\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026lt;leader\u0026gt;df\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003edaily.find_daily_files\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"n\"\u003edesc\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Find daily files\u0026#34;\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=\"n\"\u003evim.keymap\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;n\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026lt;leader\u0026gt;dl\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003edaily.find_backlinks\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"n\"\u003edesc\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Find backlinks\u0026#34;\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=\"kr\"\u003eend\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",
      "content_text": "\nI have tons of linting errors in my nvim config, partly because I use Lazyvim\nplus a set of poorly written customizations that have traveled with me for a\nwhile. I try to re-work things and right now I've been revisiting my developer\nsetup. Well the LSP rrors as I've gone through my neovim config are ticking me\noff - and this was the biggest one \"Undefined global: vim\". I saw `vim.fn`\neverywhere but the LSP hated it... turns out `vim` is a given global and you\ncan help your lsp with this:\n\n```lua\n---@diagnostic disable: undefined-global\n-- vim is a global in Neovim Lua scripts\n```\n\nFor example:\n\n```lua\n\n---@diagnostic disable: undefined-global\n-- vim is a global in Neovim Lua scripts\nreturn {\n  \"pypeaday\",\n  dir = vim.fn.stdpath(\"config\") .. \"/lua/pypeaday\",\n  config = function()\n    local daily = require(\"pypeaday.daily\")\n    vim.api.nvim_create_user_command(\"DailyNote\", daily.check_and_open_daily_note, {})\n    vim.api.nvim_create_user_command(\"Daily\", daily.check_and_open_daily_note, {})\n    vim.api.nvim_create_user_command(\"BackLinks\", daily.find_backlinks, {})\n    vim.keymap.set(\"n\", \"\u003cleader\u003edn\", daily.check_and_open_daily_note, { desc = \"Open daily note\" })\n    vim.keymap.set(\"n\", \"\u003cleader\u003edf\", daily.find_daily_files, { desc = \"Find daily files\" })\n    vim.keymap.set(\"n\", \"\u003cleader\u003edl\", daily.find_backlinks, { desc = \"Find backlinks\" })\n  end,\n}\n```\n",
      "summary": "I have tons of linting errors in my nvim config, partly because I use Lazyvim plus a set of poorly written customizations that have traveled with me for a...",
      "date_published": "2025-07-11T06:08:39Z",
      "date_modified": "2025-07-11T06:08:39Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "lua",
        "til",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/2025-07-11-notes/",
      "url": "https://pype.dev/2025-07-11-notes/",
      "title": "2025-07-11 Notes",
      "content_text": "\nyesterday [[2025-07-10-notes]]\n\nI am continuing to work on my dev experience a little bit... it's been a long\ntime since I got into it but I'm very spread out now so I need to get some\nminimized commmonization going across my environments:\n\n1. 3 computers\n2. 2.5 editors: neovim, vs code, vs code + roo, windsurf\n3. scattered blogging utilities (links, graphs, etc)\n\nSo I'm using LLMs to help me clean up dotfiles, and then I'll probably try to\nget my keymaps from tmux working in windsurf... they work in vs code OK, i\nprobably have a few pain points, but when I'm in windsurf, although that's\nmostly the AI writing code, I need to edit things sometimes and my vim keymaps\nare all messed up. I usually open the file in neovim to make the edit but it'd\nbe nice to stay in whichever tool I'm in for the task I'm working on\n\n## Working on\n\n- [[thoughts-to-nostr]] is coming along great, I have the oldest thoughts being posted via temporal workflow and activities now\n- setup [[jellyfin]] post stub\n- I still want to clean up my dotfiles a bit and hone in on the vs code and\n  windsurf keymaps issues... plus a few settings issues with git and the project\n  manager extension\n\n## Wins\n\n- learned [[lua-type-hinting-undefined-global]]\n- wrote about [[the-homelab]] and [[ghost]]\n- my daily-notes nvim plugin is working really nicely - [[daily-notes-neovim-plugin]]\n",
      "summary": "yesterday 2025-07-10-notes",
      "date_published": "2025-07-11T05:43:47Z",
      "date_modified": "2025-07-11T05:43:47Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/2025-07-10-notes/",
      "url": "https://pype.dev/2025-07-10-notes/",
      "title": "2025-07-10 Notes",
      "content_text": "\n[[2025-07-09-notes]] from yesterday\n\nI have temporal stuff kind of going with postiz in a windsurf session working on [[thoughts-to-nostr]]\n\nBeen cleaning up my zshrc and tmux stuff... will be touching other dotfiles as well\n\nI could make links to those 3 things... zshrc, tmux, and my dotfiles\n\n---\n\nI explored some rust replacements for common things - and I've been using them\nloosely but trying to get some nice aliases into my zshrc\n\nI worked with windsurf and added this to just get started\n\n```bash\n# Rust-based utility replacements\n# File listing with eza (modern ls replacement, fork of exa)\nif command -v eza \u0026\u003e /dev/null\nthen\n    alias ls='eza'\n    alias ll='eza -la'\n    alias lt='eza -T --level=2'             # Tree view, 2 levels deep\n    alias ltt='eza -T --level=3'            # Tree view, 3 levels deep\n    alias lttt='eza -T'                     # Full tree view\n    alias lg='eza -la --git'                # List with git status\n    alias lm='eza -la --sort=modified'      # Sort by modified date\n    alias lsize='eza -la --sort=size'       # Sort by size\nfi\n\n# Disk usage with dust (du replacement)\nif command -v dust \u0026\u003e /dev/null\nthen\n    alias du='dust'\n    alias du1='dust -d 1'                   # Show only 1 level deep\n    alias du2='dust -d 2'                   # Show 2 levels deep\n    alias duh='dust -h'                     # Human readable\n    alias dus='dust -s'                     # Sort by size\nfi\n\n# Directory tree with broot (interactive tree)\nif command -v broot \u0026\u003e /dev/null\nthen\n    alias br='broot'\n    alias brs='broot --sizes'               # Show with sizes\n    alias brh='broot --hidden'              # Show hidden files\nfi\n\n# Disk space with duf (df replacement)\nif command -v duf \u0026\u003e /dev/null\nthen\n    alias df='duf'\n    alias dfa='duf -all'                    # Show all devices\nfi\n\n# Process viewer with procs (ps replacement)\nif command -v procs \u0026\u003e /dev/null\nthen\n    alias ps='procs'\n    alias pst='procs --tree'                # Show process tree\n    alias psc='procs --watch'               # Watch processes (like top)\nfi\n\n# Find with fd (find replacement)\nif command -v fd \u0026\u003e /dev/null\nthen\n    alias find='fd'\n    alias fh='fd --hidden'                  # Include hidden files\n    alias ft='fd --type f --exec-batch ls -la'  # Find files and show details\nfi\n```\n\n## Wins\n\n- rush tool exploration\n- tried zoxide - it's overkill for me\n",
      "summary": "2025-07-09-notes from yesterday",
      "date_published": "2025-07-10T06:54:26Z",
      "date_modified": "2025-07-10T06:54:26Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/pilgrims-creek/",
      "url": "https://pype.dev/pilgrims-creek/",
      "title": "Pilgrims Creek",
      "content_html": "\u003ch1 id=\"what\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhat\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003ePodcast with Cameron for weary theologians. We spend time discussing interesting topics, approaches to theology, etc. all from the perspective of travelers who are tired and need a place to just have good conversation. We\u0026rsquo;re not here to fight theological points or debate, but rather to explore the patterns in the Bible, equip ourselves and others with theological tools, and overall enjoy a good time with believers interacting with fun and challenging ideas about our faith\u003c/p\u003e\n\u003ciframe src=\"https://shows.element.fm/player?x=https://cdn.element.fm/2e873e93-be22-4bc0-a68f-2fed2810e169/8c1d9ebb-9e1b-4f81-80e7-9921a42d9ca8/rss.xml\u0026e=b4574c89-f521-43f8-80c1-9d8ad6c89fea\" width=\"100%\" height=\"90px\" style=\"border: none;\"\u003e\u003c/iframe\u003e\n",
      "content_text": "\n# What\n\nPodcast with Cameron for weary theologians. We spend time discussing interesting topics, approaches to theology, etc. all from the perspective of travelers who are tired and need a place to just have good conversation. We're not here to fight theological points or debate, but rather to explore the patterns in the Bible, equip ourselves and others with theological tools, and overall enjoy a good time with believers interacting with fun and challenging ideas about our faith\n\n\u003ciframe src=\"https://shows.element.fm/player?x=https://cdn.element.fm/2e873e93-be22-4bc0-a68f-2fed2810e169/8c1d9ebb-9e1b-4f81-80e7-9921a42d9ca8/rss.xml\u0026e=b4574c89-f521-43f8-80c1-9d8ad6c89fea\" width=\"100%\" height=\"90px\" style=\"border: none;\"\u003e\u003c/iframe\u003e\n",
      "summary": "Podcast with Cameron for weary theologians. We spend time discussing interesting topics, approaches to theology, etc. all from the perspective of travelers...",
      "date_published": "2025-07-09T08:00:25Z",
      "date_modified": "2025-07-09T08:00:25Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "projects",
        "podcast"
      ]
    },
    {
      "id": "https://pype.dev/2025-07-09-notes/",
      "url": "https://pype.dev/2025-07-09-notes/",
      "title": "2025-07-09 Notes",
      "content_text": "\n[[2025-07-08-notes]] from yesterday\n\n## [[thoughts-to-nostr]]\n\n- I feel a litte stuck on this... kind of blocked on temporal organization and not knowing what to do next\n\n## [[homelab-monitoring-agent]]\n\n- working still on basic tool call, idk how much longer I'm gonna care about this...\n\n## [[using-restic-to-backup-my-home-directory]]\n\n- desktop backup\n- it's in compose, but I might want to use the `restic` binary that comes with UBlue... systemd timer to run it or temporal?\n\n???+ success \"\"\n\n    This is setup as a user systemd service and only backing uping my dotfiles to /tank/sandbox for now... but it appears to be working\n\n## Writing\n\nThe python -m issue - \u003chttps://chatgpt.com/c/686d2a05-5b54-800f-8b84-1638c1b96840\u003e\n\n## Organization\n\nzfs-ops is in pypeaday github... should it be in doomlab7 with everything else? I kind of want a monorepo just so I can quit thinking about where to put stuff...\n\nfor example I have zfs-ops for zfs related things, but now I'm gonna use restic to backup from my desktop... so does that go in zfs-ops cause it's really more about backups? or shoudl that stay only for zfs things and put this restic/docker backup somewhere else... either a new repo or start a monorepo for all my homelab stuff...\n\n- homelab-compose\n- all terraform (including digital harbor stuff?)\n- zfs-ops\n- amcrest sync\n\n## [[pilgrims-creek]]\n\n- Meeting with Cam today\n\n## Wins\n\n- restic setup on systemd as a test - just doing dotfiles right now but it's working I think [[using-restic-to-backup-my-home-directory]]\n",
      "summary": "2025-07-08-notes from yesterday",
      "date_published": "2025-07-09T06:40:22Z",
      "date_modified": "2025-07-09T06:40:22Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-740/",
      "url": "https://pype.dev/thoughts-740/",
      "title": "💭 restic · Backups done right!",
      "content_text": "\n\u003ca href=\"https://restic.net/\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://restic.net/\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - restic · Backups done right!\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://restic.net/\"\u003erestic · Backups done right!\u003c/a\u003e\n\n---\n\nWelp, I need to be backing up my desktop home directory, specifically a directory of docker volume data... I thought duplicati made sense, but that mostly targets cloud-based backends, and rsync is great but I wasn't sure how i wanted to manage the job. \nThrough a little AI chat I learned about restic and am working on a compose stack to run restic in a container to regularly backup my home directory via sftp to my NAS to then be swept up in my NAS backup workflow\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "Welp, I need to be backing up my desktop home directory, specifically a directory of docker volume data... I thought dup",
      "date_published": "2025-07-08T11:53:41Z",
      "date_modified": "2025-07-08T11:53:41Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "nas",
        "homelab",
        "backups",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-739/",
      "url": "https://pype.dev/thoughts-739/",
      "title": "💭 Add confirmation for hard reset by stefanhaller · Pull Request…",
      "content_text": "\n\u003ca href=\"https://github.com/jesseduffield/lazygit/pull/4704\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://github.com/jesseduffield/lazygit/pull/4704\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - Add confirmation for hard reset by stefanhaller · Pull Request #4704 · jesseduffield/lazygit\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://github.com/jesseduffield/lazygit/pull/4704\"\u003eAdd confirmation for hard reset by stefanhaller · Pull Request #4704 · jesseduffield/lazygit\u003c/a\u003e\n\n---\n\nI float between lazygit and gitui still for my terminal-based git flow and I want to lean into lazygit more fully. One issue is that the keybinding for lazygit \u003cC-d\u003e brings up a menu there the first option is to nuke the entire working tree... in gitui this just resets the one file that's highlighted in the TUI. So that's obviously 100% my fault, however it's nice to see this PR open for adding confirmation for this potential blunder that has cost me several uncommitted scripts and changes...\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "I float between lazygit and gitui still for my terminal-based git flow and I want to lean into lazygit more fully. One i",
      "date_published": "2025-07-08T11:25:30Z",
      "date_modified": "2025-07-08T11:25:30Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "lazygit",
        "git",
        "github",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/2025-07-08-notes/",
      "url": "https://pype.dev/2025-07-08-notes/",
      "title": "2025-07-08 Notes",
      "content_text": "\nToday I consolidated homelab-social-media-pipelines into homelab-temporal,\nwhich is the app repo.\n\nI am tracking this stuff in a [kanboard\nticket](https://kanboard.paynepride.com/?controller=TaskViewController\u0026action=show\u0026task_id=235\u0026project_id=8)\nand also [[thoughts-to-nostr]]\n\nI also touched on my [[homelab-monitoring-agent]] bys witching to atomic-agents, but windsurf is struggling with it\n\nWorked on backup of my desktop - in dotfiles I have nas-back which will be a\ncompose stack I can move to homelab-compose that uses restic to backup files\nvia stp/ssh - seems easy enough to setup\n[[using-restic-to-backup-my-home-directory]]\n\nI learned some stuff about python from chat - \u003chttps://chatgpt.com/c/686d2a05-5b54-800f-8b84-1638c1b96840\u003e\n",
      "summary": "Today I consolidated homelab-social-media-pipelines into homelab-temporal, which is the app repo.",
      "date_published": "2025-07-08T09:03:01Z",
      "date_modified": "2025-07-08T09:03:01Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "daily-note"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-737/",
      "url": "https://pype.dev/thoughts-737/",
      "title": "💭 HomeBox",
      "content_text": "\n\u003ca href=\"https://homebox.software/en/\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://homebox.software/en/\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - HomeBox\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://homebox.software/en/\"\u003eHomeBox\u003c/a\u003e\n\n---\n\nI stumbled onto homebox this morning scrolling a newsletter and it looks like something I've been lightly thinking about for a while. I have wanted a way to track all the things in my house, but I haven't given it enough thought to come up with the specific manner in which to do it. I've seen other asset trackers but today this one excited me. \nI spun it up at home quick and it looks great - It'll take quite a lot of time to fill it out but here's a few features I love out of the gate:\n\n1. the default setup seems very useful - pre-populated locations and tags for cataloging assets reduces the barrier to entry for me\n2. it's pretty nice lookin\n3. there's a label generator including qr codes that take you to the record in your homebox... I had an idea for something like this a while ago - qr codes to link to instructions for things around the house (like cleaning the oven or something). So it's neat to see that similar idea played out in another more useful way!\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "I stumbled onto homebox this morning scrolling a newsletter and it looks like something I've been lightly thinking about",
      "date_published": "2025-07-07T10:48:12Z",
      "date_modified": "2025-07-07T10:48:12Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "asset-management",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-736/",
      "url": "https://pype.dev/thoughts-736/",
      "title": "💭 postmarketOS // v24.06: The One With Over 250 Devices",
      "content_text": "\n\u003ca href=\"https://postmarketos.org/blog/2024/06/16/v24.06-release/\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://postmarketos.org/blog/2024/06/16/v24.06-release/\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - postmarketOS // v24.06: The One With Over 250 Devices\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://postmarketos.org/blog/2024/06/16/v24.06-release/\"\u003epostmarketOS // v24.06: The One With Over 250 Devices\u003c/a\u003e\n\n---\n\nThis is the OS you can install onto an old phone to run linux on it - using this OS you could set-up a cluster of phones. I'm interested in this someday, although today the to-do list is too long to worry about it\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "This is the OS you can install onto an old phone to run linux on it - using this OS you could set-up a cluster of phones",
      "date_published": "2025-07-06T11:31:19Z",
      "date_modified": "2025-07-06T11:31:19Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "k8s",
        "mobile",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-735/",
      "url": "https://pype.dev/thoughts-735/",
      "title": "💭 Self-Hosting A Cluster On Old Phones | Hackaday",
      "content_text": "\n\u003ca href=\"https://hackaday.com/2025/04/09/self-hosting-a-cluster-on-old-phones/?ref=dailydev\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://hackaday.com/2025/04/09/self-hosting-a-cluster-on-old-phones/?ref=dailydev\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - Self-Hosting A Cluster On Old Phones | Hackaday\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://hackaday.com/2025/04/09/self-hosting-a-cluster-on-old-phones/?ref=dailydev\"\u003eSelf-Hosting A Cluster On Old Phones | Hackaday\u003c/a\u003e\n\n---\n\nCame across a blog and article on using a mobile OS to self-host a cluster on old phones... I happen to keep several old android phones lying around and although I'm not presently super interested in figuring out an android/arm based homelab, I am excited for the next coming years when I'm sure it'll only get easier, phones will only be more powerful, and perhaps we'll be running full blown CV pipeline in k8s clusters running on Pixel devices!\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "Came across a blog and article on using a mobile OS to self-host a cluster on old phones... I happen to keep several old",
      "date_published": "2025-07-06T11:30:17Z",
      "date_modified": "2025-07-06T11:30:17Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "k8s",
        "linux",
        "android",
        "homelab",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/testing-a-postiz-change-locally/",
      "url": "https://pype.dev/testing-a-postiz-change-locally/",
      "title": "Testing a Postiz Change Locally (IT WORKS!)",
      "content_text": "\n## Setup\n\nI am working on a pipeline at home to integrate my blog with social media a\nlittle more. One of the things I want to do is automatically post\n[[my-thoughts]] to [[nostr]]. [[postiz]] has nostr support that works just fine - login\nwith your [[nostr-hex-key]] and you're good to go to post notes to several of\nthe common relays. However for my testing I just wanted to post to a\n[self-hosetd nostr relay](https://github.com/scsibug/nostr-rs-relay)\nbut there wasn't a way to override which relays were used. Well I submitted [this pr](https://github.com/gitroomhq/postiz-app/pull/824)\nand hopefully it goes through. But before it did I was able to test the changes\nby simply building the postiz image from my feature branch and deploying it at\nhome in leiu of the published image. It was super cool to see it work\n\n## Build and Deploy\n\nThe build was easy after cloning the repo - I happened to already have `buildx` installed... it came with [aurora](https://docs.getaurora.dev/)\n\n`docker buildx build --platform linux/amd64 -f Dockerfile.dev -t registry.example.com/gitroomhq/postiz-app:nostr-test .`\n\nAfter building then I just update my compose file easy-peasy\n\n```yaml\nservices:\n  postiz:\n    # updated the image to my own from my registry\n    image: resitry.example.com/gitroomhq/postiz-app:latest\n    container_name: postiz\n    restart: always\n    env_file: .env\n#####################\n### REST OF COMPOSE FILE FROM THEIR REPO\n```\n\n## Pics\n\nTo test this my methodlogy was: 0. spin up nostr relay\n\n1. start postiz with my NOSTR_RELAY_OVERRIDES configuration for only my local relay\n2. use an existing script to schedule a nostr post via the postiz REST API\n3. use the UI to send the note to nostr\n4. validate the note came through my relay\n\nSo step 1 - does my script to schedule via the REST API work?\n\n```\npostiz  | [0] 1|backend  | {\npostiz  | [0] 1|backend  |   \"type\": \"draft\",\npostiz  | [0] 1|backend  |   \"shortLink\": false,\npostiz  | [0] 1|backend  |   \"tags\": [],\npostiz  | [0] 1|backend  |   \"posts\": [\npostiz  | [0] 1|backend  |     {\npostiz  | [0] 1|backend  |       \"integration\": {\npostiz  | [0] 1|backend  |         \"id\": \"cmbgf5oko0001ra99r9vzv1fj\"\npostiz  | [0] 1|backend  |       },\npostiz  | [0] 1|backend  |       \"value\": [\npostiz  | [0] 1|backend  |         {\npostiz  | [0] 1|backend  |           \"content\": \"\\nHere's a thought I had a while back:\\n\\n\u003e matduggan.com/what-would-a-kubernetes-2-0-look-like/\\n\\nThis article was longer than I had time to really consume but a heading caught my eye that I wanted to agree with - the author says k8s 2.0 may consider HCL instead of YAML. And as a recent terraform / open-tofu adopter I gotta say I would be ALL FOR THIS\\n\\nHere's the original link for more context: https://matduggan.com/what-would-a-kubernetes-2-0-look-like/\\n        \\n\\n# devops # tech #k8s #nostr #plebchain\",\npostiz  | [0] 1|backend  |           \"image\": []\npostiz  | [0] 1|backend  |         }\npostiz  | [0] 1|backend  |       ]\npostiz  | [0] 1|backend  |     }\npostiz  | [0] 1|backend  |   ],\npostiz  | [0] 1|backend  |   \"date\": \"2025-07-02T13:27:07.028Z\"\npostiz  | [0] 1|backend  | }\n```\n\n???+ success\n\n    After the first step my local build looks to have not broken this part of the app!\n\nNext was spinning up my own nostr relay - it's actually just `docker compose up`\n\n```yaml\nservices:\n  nostr-relay:\n    image: nostr-rs-relay:latest\n    container_name: nostr-relay\n    ports:\n      - \"7000:8080\"\n    environment:\n      TZ: America/Chicago\n    volumes:\n      - ./data:/usr/src/app/db\n      - ./config.toml:/usr/src/app/config.toml\n    restart: unless-stopped\n```\n\nFinally, can I send my note to my relay?\n\nI hit post in the UI and then checked coracle...\n\nYes! Using [coracle.social](https://coracle.social) I can verify that my note went to my relay only\n\n![20250706122123_47b06d96.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250706122123_47b06d96.png)\n\n## Fin\n\nSo that was a fun way to get into postiz a little more and start to flesh out\nwhat will be a testing-scenario for some pipelines I'm building at home\n",
      "summary": "I am working on a pipeline at home to integrate my blog with social media a little more. One of the things I want to do is automatically post my-thoughts to...",
      "date_published": "2025-07-06T08:42:44Z",
      "date_modified": "2025-07-06T08:42:44Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "postiz",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/july-4-freedom-from-protection/",
      "url": "https://pype.dev/july-4-freedom-from-protection/",
      "title": "July 4 - Freedom From Protection",
      "content_html": "\u003ch2 id=\"a-renewed-appreciation-for-independence-day\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eA Renewed Appreciation for Independence Day\u003c/span\u003e \u003ca href=\"#a-renewed-appreciation-for-independence-day\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIndependence Day has become more important to me as I\u0026rsquo;ve gained some\nperspective on the world, and learned that in the US of A we have it pretty\ndang good\u0026hellip; yes there\u0026rsquo;s corruption up the chain and the government is a wreck,\nbut at the day to day level for an individual setting 2 feet on God\u0026rsquo;s green\nearth\u0026hellip; there\u0026rsquo;s a LOT worse places on the earth to be. And so as we all\ncelebrate with cookouts and stuff I was getting ready to have a great time with\na few friends enjoying some that tastey freedom\u0026hellip;\u003c/p\u003e\n\u003ch2 id=\"friends-and-boundaries\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFriends and Boundaries\u003c/span\u003e \u003ca href=\"#friends-and-boundaries\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWe hosted this gathering and pretty clearly scheduled it until 630 PM which is\nwhen we typically get our daughters ready for bed (yes yes early bedtime\u0026hellip;\nthey\u0026rsquo;re up PLENTY early so don\u0026rsquo;t you worry). These friends know our kids and\nour early nightly routine, so nothing was unexpected here\u003c/p\u003e\n\u003cp\u003eHowever, my entire life as I\u0026rsquo;ve had some kind of boundary to keep personally,\nI\u0026rsquo;ve had to make sure that that boundary was respected very actively, or work\nto remind people of it\u0026hellip; Overstaying your welcome is a general example here.\u003c/p\u003e\n\u003cp\u003eSo I was definitely ready to start reminding people about the time come 6:15ish\u0026hellip;\u003c/p\u003e\n\u003cp\u003eWell I got pulled away needing to tend to my youngest daughter\u0026rsquo;s tantrum and in that time several minutes passed, but one key thing happened\u0026hellip;\u003c/p\u003e\n\u003cdetails class=\"admonition success\" open\u003e\n\u003csummary class=\"admonition-title\"\u003eeveryone got ready to go\u003c/summary\u003e\n\u003cp\u003eWhile I was tending to my kid, my friends got all ready to leave on time\u0026hellip;\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250705005214_a83dd563.png\" alt=\"20250705005214_a83dd563.png\"\u003e\u003c/p\u003e\n\u003c/details\u003e\n\u003cp\u003eGreat guests know when it\u0026rsquo;s time to leave and don\u0026rsquo;t make it your responsibility\nto end the time of hanging out. And honestly that\u0026rsquo;s the whole post\u0026hellip; Today all\nof our friends were mindful of the time, gave their kiddos adequate warnings,\nand everyone\u0026rsquo;s cars were gone by 6:38\u0026hellip;\u003c/p\u003e\n\u003cp\u003eI found myself SHOCKED and concerned that I had offended everyone and they couldn\u0026rsquo;t\nwait to leave. But no\u0026hellip; it was our friends knowing our boundary and not making\nit my responsibility to kick everyone out. They\u0026rsquo;re good friends who know our\ngirls go to bed early. The thing I am struck by is in mulling over the concern\nof having offended someone what I realized is\u0026hellip;\u003c/p\u003e\n\u003cdetails class=\"admonition note\" open\u003e\n\u003csummary class=\"admonition-title\"\u003eNote\u003c/summary\u003e\n\u003cp\u003eI realized that my friends here freed me from having to protect my own\nboundaries and it\u0026rsquo;s hard to put that into words\u0026hellip;\u003c/p\u003e\n\u003c/details\u003e\n\u003cp\u003eWithout the words to describe it - I am grateful to have a community that is\nconsiderate of others (ie. me and my family).\u003c/p\u003e\n",
      "content_text": "\n## A Renewed Appreciation for Independence Day\n\nIndependence Day has become more important to me as I've gained some\nperspective on the world, and learned that in the US of A we have it pretty\ndang good... yes there's corruption up the chain and the government is a wreck,\nbut at the day to day level for an individual setting 2 feet on God's green\nearth... there's a LOT worse places on the earth to be. And so as we all\ncelebrate with cookouts and stuff I was getting ready to have a great time with\na few friends enjoying some that tastey freedom...\n\n## Friends and Boundaries\n\nWe hosted this gathering and pretty clearly scheduled it until 630 PM which is\nwhen we typically get our daughters ready for bed (yes yes early bedtime...\nthey're up PLENTY early so don't you worry). These friends know our kids and\nour early nightly routine, so nothing was unexpected here\n\nHowever, my entire life as I've had some kind of boundary to keep personally,\nI've had to make sure that that boundary was respected very actively, or work\nto remind people of it... Overstaying your welcome is a general example here.\n\nSo I was definitely ready to start reminding people about the time come 6:15ish...\n\nWell I got pulled away needing to tend to my youngest daughter's tantrum and in that time several minutes passed, but one key thing happened...\n\n???+ success \"everyone got ready to go\"\n\n    While I was tending to my kid, my friends got all ready to leave on time...\n    ![20250705005214_a83dd563.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250705005214_a83dd563.png)\n\nGreat guests know when it's time to leave and don't make it your responsibility\nto end the time of hanging out. And honestly that's the whole post... Today all\nof our friends were mindful of the time, gave their kiddos adequate warnings,\nand everyone's cars were gone by 6:38...\n\nI found myself SHOCKED and concerned that I had offended everyone and they couldn't\nwait to leave. But no... it was our friends knowing our boundary and not making\nit my responsibility to kick everyone out. They're good friends who know our\ngirls go to bed early. The thing I am struck by is in mulling over the concern\nof having offended someone what I realized is...\n\n???+ note \"\"\n\n    I realized that my friends here freed me from having to protect my own\n    boundaries and it's hard to put that into words...\n\nWithout the words to describe it - I am grateful to have a community that is\nconsiderate of others (ie. me and my family).\n",
      "summary": "Independence Day has become more important to me as I've gained some perspective on the world, and learned that in the US of A we have it pretty dang good......",
      "date_published": "2025-07-04T19:41:30Z",
      "date_modified": "2025-07-04T19:41:30Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "reflectioin",
        "freedom"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-732/",
      "url": "https://pype.dev/thoughts-732/",
      "title": "💭 Build backend | uv",
      "content_text": "\n\u003ca href=\"https://docs.astral.sh/uv/concepts/build-backend/\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://docs.astral.sh/uv/concepts/build-backend/\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - Build backend | uv\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://docs.astral.sh/uv/concepts/build-backend/\"\u003eBuild backend | uv\u003c/a\u003e\n\n---\n\nuv build backend ready for production! Dang... I need to visit my hatch builds, I love hatch's simplicity specifically with versioning...  Not sure if it's worth actually switching to uv for my builds or not, but it is dang cool to see astral take on the python space with unbelievable improvements \n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "uv build backend ready for production! Dang... I need to visit my hatch builds, I love hatch's simplicity specifically w",
      "date_published": "2025-07-04T11:43:30Z",
      "date_modified": "2025-07-04T11:43:30Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "uv",
        "python",
        "dev",
        "tech",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/liquids-vs-liquid-and-how-my-wife-forgot-i-was-autistic/",
      "url": "https://pype.dev/liquids-vs-liquid-and-how-my-wife-forgot-i-was-autistic/",
      "title": "Liquids vs Liquid and How My Wife Forgot I was Autistic",
      "content_html": "\u003ch1 id=\"a-comical-story\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eA Comical Story\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eMy wife said a somewhat rhetorical question yesterday \u0026ldquo;is it liquid or liquids\nwhen\u0026hellip;\u0026rdquo; and I frankly don\u0026rsquo;t remember the exact ending. I thought it was a\ncurious statement so I launched into my own explanation\u0026hellip;\u003c/p\u003e\n\u003cdetails class=\"admonition note\" open\u003e\n\u003csummary class=\"admonition-title\"\u003e\\*_Liquids vs Liquid_\u003c/summary\u003e\n\u003cp\u003eLiquid is used regardless of the quantity of a single liquid, or if you are referring to a combination of different liquids that group together in a similar way\u0026hellip; So if you had a lot of apple juice, you could say \u0026ldquo;that\u0026rsquo;s a lot of liquid\u0026rdquo;, and if you had apple juice and orange juice, you could still say \u0026ldquo;that\u0026rsquo;s a lot of liquid\u0026rdquo; because the \u0026ldquo;liquid\u0026rdquo; isn\u0026rsquo;t the specific \u003cem\u003ekind\u003c/em\u003e of juice here, it\u0026rsquo;s the amount of \u003cem\u003ejuice\u003c/em\u003e.\u003c/p\u003e\n\u003c/details\u003e\n\u003cp\u003eShe cut me off right at the end to lovingly comment \u003cstrong\u003eI forgot for a second that you were autistic\u003c/strong\u003e.\u003c/p\u003e\n",
      "content_text": "\n# A Comical Story\n\nMy wife said a somewhat rhetorical question yesterday \"is it liquid or liquids\nwhen...\" and I frankly don't remember the exact ending. I thought it was a\ncurious statement so I launched into my own explanation...\n\n???+ note \"\\*_Liquids vs Liquid_\"\n\n    Liquid is used regardless of the quantity of a single liquid, or if you are referring to a combination of different liquids that group together in a similar way... So if you had a lot of apple juice, you could say \"that's a lot of liquid\", and if you had apple juice and orange juice, you could still say \"that's a lot of liquid\" because the \"liquid\" isn't the specific _kind_ of juice here, it's the amount of _juice_.\n\nShe cut me off right at the end to lovingly comment **I forgot for a second that you were autistic**.\n",
      "summary": "My wife said a somewhat rhetorical question yesterday \"is it liquid or liquids when...\" and I frankly don't remember the exact ending. I thought it was a...",
      "date_published": "2025-07-04T06:32:57Z",
      "date_modified": "2025-07-04T06:32:57Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "autism",
        "story"
      ]
    },
    {
      "id": "https://pype.dev/mcphub-with-windsurf/",
      "url": "https://pype.dev/mcphub-with-windsurf/",
      "title": "MCPHub with Windsurf",
      "content_html": "\u003cp\u003eI came across \u003ca href=\"https://github.com/samanhappy/mcphub\"\u003emcphub\u003c/a\u003e today and got the motivation to try it out\u0026hellip; I use AI\ntools like Windsurf and Roo across multiple devices and it\u0026rsquo;d be awesome to have\na simple mcp config - ie. a centralized hub to serve all my mcp servers and BAM\nenter this github project. It was easy to spin up in docker, and then according\nto Windsurf\u0026rsquo;s docs\n\u003ca href=\"https://docs.windsurf.com/windsurf/cascade/mcp#mcp-config-json\"\u003ehere\u003c/a\u003e the\nsetup is just naming a server and passing a serverUrl\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\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  \u003cspan class=\"nt\"\u003e\u0026#34;mcpServers\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\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=\"nt\"\u003e\u0026#34;hub\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\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=\"nt\"\u003e\u0026#34;serverUrl\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;http://localhost:3000/sse\u0026#34;\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  \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\u003cfigure\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250703134426_2c9dfa01.png\" alt=\"20250703134426_2c9dfa01.png\"\u003e\n\u003c/figure\u003e\n\u003cdetails class=\"admonition warning\" open\u003e\n\u003csummary class=\"admonition-title\"\u003eWarning\u003c/summary\u003e\n\u003cp\u003eThe sse endpoint stuff is getting deprecated eventually - I didn\u0026rsquo;t want to\nspend any time right now trying to get the newer things to work\u0026hellip; future\nme/you will solve that problem\u003c/p\u003e\n\u003c/details\u003e\n\u003ch2 id=\"setup\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSetup\u003c/span\u003e \u003ca href=\"#setup\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI ran this in compose with this file\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003e\u0002services\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\"\u003emcphub\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\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003esamanhappy/mcphub\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\"\u003eports\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=\"s2\"\u003e\u0026#34;3000:3000\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=\"nt\"\u003evolumes\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\"\u003e./mcp_settings.json:/app/mcp_settings.json\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\"\u003e./data:/app/data\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\"\u003eqdrant\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\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eqdrant/qdrant\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\"\u003econtainer_name\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eqdrant\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\"\u003erestart\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eunless-stopped\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\"\u003eports\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=\"s2\"\u003e\u0026#34;6333:6333\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=\"nt\"\u003edeploy\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\"\u003eresources\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\"\u003elimits\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\"\u003ememory\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;500m\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eAnd at present the \u003ccode\u003emcp_settings.json\u003c/code\u003e file looks like this mostly:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\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  \u003cspan class=\"nt\"\u003e\u0026#34;mcpServers\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\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=\"nt\"\u003e\u0026#34;docker-mcp\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\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=\"nt\"\u003e\u0026#34;command\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;uvx\u0026#34;\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=\"nt\"\u003e\u0026#34;args\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;docker-mcp\u0026#34;\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    \u003cspan class=\"nt\"\u003e\u0026#34;ragdocs\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\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=\"nt\"\u003e\u0026#34;command\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;node\u0026#34;\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=\"nt\"\u003e\u0026#34;args\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\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=\"s2\"\u003e\u0026#34;./node_modules/@qpd-v/mcp-server-ragdocs/build/index.js\u0026#34;\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      \u003cspan class=\"nt\"\u003e\u0026#34;env\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\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=\"nt\"\u003e\u0026#34;QDRANT_URL\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;http://localhost:6333\u0026#34;\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=\"nt\"\u003e\u0026#34;EMBEDDING_PROVIDER\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;ollama\u0026#34;\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=\"nt\"\u003e\u0026#34;OLLAMA_URL\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;http://localhost:11434\u0026#34;\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      \u003cspan class=\"nt\"\u003e\u0026#34;alwaysAllow\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\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=\"s2\"\u003e\u0026#34;search_documentation\u0026#34;\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=\"s2\"\u003e\u0026#34;list_sources\u0026#34;\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=\"s2\"\u003e\u0026#34;test_ollama\u0026#34;\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=\"s2\"\u003e\u0026#34;add_documentation\u0026#34;\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      \u003cspan class=\"nt\"\u003e\u0026#34;disabled\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\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    \u003cspan class=\"nt\"\u003e\u0026#34;sequential-thinking\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\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=\"nt\"\u003e\u0026#34;command\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;npx\u0026#34;\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=\"nt\"\u003e\u0026#34;args\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;-y\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;@modelcontextprotocol/server-sequential-thinking\u0026#34;\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  \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;users\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\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      \u003cspan class=\"nt\"\u003e\u0026#34;username\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;admin\u0026#34;\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=\"nt\"\u003e\u0026#34;password\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"err\"\u003eredacted\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=\"nt\"\u003e\u0026#34;isAdmin\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\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  \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\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cdetails class=\"admonition note\" open\u003e\n\u003csummary class=\"admonition-title\"\u003eNote\u003c/summary\u003e\n\u003cp\u003eI assume here you have ollama running for ragdocs (in my screenshot you see I actually don\u0026rsquo;t right now anyways)\u003c/p\u003e\n\u003c/details\u003e\n\u003cp\u003e\u003ccode\u003edocker compose up\u003c/code\u003e and we\u0026rsquo;re cooking at \u003ca href=\"http://localhost:3000\"\u003ehttp://localhost:3000\u003c/a\u003e\u003c/p\u003e\n",
      "content_text": "\nI came across [mcphub](https://github.com/samanhappy/mcphub) today and got the motivation to try it out... I use AI\ntools like Windsurf and Roo across multiple devices and it'd be awesome to have\na simple mcp config - ie. a centralized hub to serve all my mcp servers and BAM\nenter this github project. It was easy to spin up in docker, and then according\nto Windsurf's docs\n[here](https://docs.windsurf.com/windsurf/cascade/mcp#mcp-config-json) the\nsetup is just naming a server and passing a serverUrl\n\n```json\n{\n  \"mcpServers\": {\n    \"hub\": {\n      \"serverUrl\": \"http://localhost:3000/sse\"\n    }\n  }\n}\n```\n\n![20250703134426_2c9dfa01.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250703134426_2c9dfa01.png)\n\n???+ warning\n\n    The sse endpoint stuff is getting deprecated eventually - I didn't want to\n    spend any time right now trying to get the newer things to work... future\n    me/you will solve that problem\n\n## Setup\n\nI ran this in compose with this file\n\n```yaml\n\u0002services:\n  mcphub:\n    image: samanhappy/mcphub\n    ports:\n      - \"3000:3000\"\n    volumes:\n      - ./mcp_settings.json:/app/mcp_settings.json\n      - ./data:/app/data\n  qdrant:\n    image: qdrant/qdrant\n    container_name: qdrant\n    restart: unless-stopped\n    ports:\n      - \"6333:6333\"\n    deploy:\n      resources:\n        limits:\n          memory: \"500m\"\n```\n\nAnd at present the `mcp_settings.json` file looks like this mostly:\n\n```json\n{\n  \"mcpServers\": {\n    \"docker-mcp\": {\n      \"command\": \"uvx\",\n      \"args\": [\"docker-mcp\"]\n    },\n    \"ragdocs\": {\n      \"command\": \"node\",\n      \"args\": [\n        \"./node_modules/@qpd-v/mcp-server-ragdocs/build/index.js\"\n      ],\n      \"env\": {\n        \"QDRANT_URL\": \"http://localhost:6333\",\n        \"EMBEDDING_PROVIDER\": \"ollama\",\n        \"OLLAMA_URL\": \"http://localhost:11434\"\n      },\n      \"alwaysAllow\": [\n        \"search_documentation\",\n        \"list_sources\",\n        \"test_ollama\",\n        \"add_documentation\"\n      ],\n      \"disabled\": false\n    },\n    \"sequential-thinking\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@modelcontextprotocol/server-sequential-thinking\"]\n    }\n  },\n  \"users\": [\n    {\n      \"username\": \"admin\",\n      \"password\": redacted,\n      \"isAdmin\": true\n    }\n  ]\n}\n\n\n```\n\n???+ note\n\n    I assume here you have ollama running for ragdocs (in my screenshot you see I actually don't right now anyways)\n\n`docker compose up` and we're cooking at \u003chttp://localhost:3000\u003e\n",
      "summary": "I came across mcphub today and got the motivation to try it out... I use AI tools like Windsurf and Roo across multiple devices and it'd be awesome to have a...",
      "date_published": "2025-07-03T08:42:31Z",
      "date_modified": "2025-07-03T08:42:31Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "mcp",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/nostr/",
      "url": "https://pype.dev/nostr/",
      "title": "Nostr",
      "content_text": "\n???+ note \"How to start...\"\n\n    This isn't a getting started with nostr - see [[getting-started-with-nostr]] for that\n\n[The nostr docs](https://nostr.com/)\n\nNostr is a very intriguing protocol for communication that lends itself to a\ndecentrlized social media experience through the use of relays. I would love to\nunderstand it more fully someday, but I am inclined to be in line with\nalmost anything decentrlized, and although the primary content in the\nnostr-verse right now is bitcoin, I am sure that as time goes on, the need for\na truly free way to communicate will be necessary - and nostr won't solve every\nproblem, but I think it'll be a tool in the set of solutions we come up with.\nIt's secure, decentralized, actively worked on, and very flexible.\n\n???+ note \"NOSTR\"\n\n    Notes and Other Stuff Transmited over Relays\n\n## Decentralization\n\nWhy does decentralization matter? Put simply - censorship. A founding principal\nof America is free speech and in recent years our right to speak freely has\nbeen put under severe fire.\n\nI've crossed paths with people who very regularly talked about freedom of\nspeech but it wasn't until the last several years, mostly with covid that I\nstarted to pay a little closer attention. I'm not turning this post into any\nlong rant about anything specific, but I do know that many voices were silenced\non Facebook, Twitter/X, Insta, etc. Big Tech really threw the hammer down on\npeople - a simple example was the Ivermectin stuff... which in the last 2 years\nhas turned out to be a pretty effective treatment for many thousands of people!\n\nBut why does that matter? It's because the platforms that existed which made it\npossible for anyone to \"have an audience\" made harsh judgements about what\ncould and couldn't be on their platforms... There's pros and cons to this, but a\nprimary con I see is that the power to limit the spread of information was\npretty solely concentrated in the departments of these Big Tech firms that\nallowed or disallowed certain things to be said and expressed on their\nplatforms.\n\nNostr is different here in that there's no central command, no single data\ncenter or hub.... Nostr is a protocol, like HTTP is a protocol... anyone can\nsend \"Notes and Other Stuff over Relays\" so developers can build any kind of UI\nfor it, and you as the user can subscribe to relays that tend to have\ninformation you care about... in a sense it's kind of like subreddits but not\nquite as organized (yet).... but unlike reddit, there's no central authority.\nThe closest it gets is that a relay may go down or someone may choose to close\none - no big, you just subscribe to other relays, or don't subscribe to relays\nyou don't want to see\n\nAnother friend of mine likened this to RSS - and it's also not UNlike that, but\nthere's more to it - the notes are on the relays, there's encryption throughout\nthe protocol, and several other standards called NIPS that make nostr unique,\nand I think bulletproof as we go into a future clouded by big government and\nbig tech collaboration.\n\n## Brief Usage\n\nAs for a usage pattern with nostr I think you have to combine the ideas of\nreddit, rss, and twitter...\n\nSome apps like coracle.social have nice support for building \"feeds\" and\n\"lists\"... lists are combinations of tags (hashtags) and feeds are combinations\nof lists - at least in the coracle world. This means you can use lists of tags\nto discover content and users, create feeds of things you want to see regularly\n(like your RSS feed subscriptions), follow other users (using their pub keys\nsee [## Follow Me]), and curate your social media experience in whatever way\nyou want.\n\nThere's nostr apps specific to mobile (primal, snort) and desktop\n(coracle.social). They help you set yourself up in different ways and to learn\nmore about how I got started then checkout [[getting-started-with-nostr]].\nThere's also content-driven nostr apps, for example [fountain]() is great for\nmusic and podcasts that are distributed on the nostrverse, which feels like a\ntotally different world than when I use coracle to browse my tech or bible\nrelated feeds.\n\n## End\n\nNostr is a pretty cool thing taking shape... here's some related info\n\n[Thank God for nostr podcast](https://tgfb.com/podcasts/thank-god-for-nostr/)\n\n[nostr website](https://nostr.com/)\n\n\u003e Note these posts aren't available yet but they will show up on my RSS feed when they're published\n\nMy post on [[getting-started-with-nostr]]\n\nMy project on [[thoughts-to-nostr]]\n\n...\n\n## Follow Me\n\n![20250705122314_e9fbd0f7.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250705122314_e9fbd0f7.png)\n\n???+ note \"my public key\"\n\n    npub1q3fsec2vcv99v80ga72dlv90qwkqmuxqcr6mdyumcmpkgudlhrespyurfj\n",
      "summary": "???+ note \"How to start...\"",
      "date_published": "2025-07-02T21:22:03Z",
      "date_modified": "2025-07-02T21:22:03Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "nostr",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-730/",
      "url": "https://pype.dev/thoughts-730/",
      "title": "💭 TimoStahl/kanboard_plugin_bigboard: A Kanboard that can displa…",
      "content_text": "\n\u003ca href=\"https://github.com/TimoStahl/kanboard_plugin_bigboard\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://github.com/TimoStahl/kanboard_plugin_bigboard\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - TimoStahl/kanboard_plugin_bigboard: A Kanboard that can display multiple projects\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://github.com/TimoStahl/kanboard_plugin_bigboard\"\u003eTimoStahl/kanboard_plugin_bigboard: A Kanboard that can display multiple projects\u003c/a\u003e\n\n---\n\nI use kanboard to keep myself focused at home - it's great because it's simple enough but does have complex features (that I largely don't need). It's got a great REST API for integrations and looks decent.\nWell today I discovered \"plugins\" for it - and those make it even better - tis BigBoard plugin gives me a way better view of my projects, letting me minimize the ones I don't need to look at \"right now\" but not using any weird search filters or anything - a simple intuitive \"big board\" of my projects and their subsequent tasks.\nVery excited to find some more useful plugins!\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "I use kanboard to keep myself focused at home - it's great because it's simple enough but does have complex features (th",
      "date_published": "2025-07-02T11:31:34Z",
      "date_modified": "2025-07-02T11:31:34Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "kanboard",
        "productivity",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-729/",
      "url": "https://pype.dev/thoughts-729/",
      "title": "💭 { TechDufus } | Blog",
      "content_text": "\n\u003ca href=\"https://techdufus.com/blog/\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://techdufus.com/blog/\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - { TechDufus } | Blog\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://techdufus.com/blog/\"\u003e{ TechDufus } | Blog\u003c/a\u003e\n\n---\n\nJust came across TechDufus today... love his blog style... it's beautiful... definitely not gonna potentially rip this off...\n1. I like the estimated reading time\n2. the tree/ls like view of the posts is super cool\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "Just came across TechDufus today... love his blog style... it's beautiful... definitely not gonna potentially rip this o",
      "date_published": "2025-07-02T11:09:01Z",
      "date_modified": "2025-07-02T11:09:01Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "blog",
        "todo",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-728/",
      "url": "https://pype.dev/thoughts-728/",
      "title": "💭 { TechDufus } | Building a Talos Kubernetes Homelab with Terra…",
      "content_text": "\n\u003ca href=\"https://techdufus.com/tech/2025/06/30/building-a-talos-kubernetes-homelab-on-proxmox-with-terraform.html\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://techdufus.com/tech/2025/06/30/building-a-talos-kubernetes-homelab-on-proxmox-with-terraform.html\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - { TechDufus } | Building a Talos Kubernetes Homelab with Terraform on Proxmox\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://techdufus.com/tech/2025/06/30/building-a-talos-kubernetes-homelab-on-proxmox-with-terraform.html\"\u003e{ TechDufus } | Building a Talos Kubernetes Homelab with Terraform on Proxmox\u003c/a\u003e\n\n---\n\nCaught this blog post from Waylon - I added this guy to my RSS feed to star this post. I have tried talos with terraform and struggled myself... I was new to k8s when I first tried but definitely got NOWHERE with it... I don't use k8s at home for anything beyond playing, and I see the power in using it but for now I'm sticking with my pretty vanilla compose setup (plus a few just recipes for yeeting config files to a server)\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "Caught this blog post from Waylon - I added this guy to my RSS feed to star this post. I have tried talos with terraform",
      "date_published": "2025-07-02T11:00:52Z",
      "date_modified": "2025-07-02T11:00:52Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "todo",
        "review",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-727/",
      "url": "https://pype.dev/thoughts-727/",
      "title": "💭 Also done with second braining",
      "content_text": "\n\u003ca href=\"https://derekkedziora.com/notes/2025-06-30-also-done-with-second-braining\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://derekkedziora.com/notes/2025-06-30-also-done-with-second-braining\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - Also done with second braining\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://derekkedziora.com/notes/2025-06-30-also-done-with-second-braining\"\u003eAlso done with second braining\u003c/a\u003e\n\n---\n\nOddly enough I am just now really getting into the second brain idea... a zettlekasten has been taking shape in my life through the use of markata and some markdown plugins for neovim... Interesting to see Derek here giving up on the idea... I wonder what my second brain will look like in the next few years... I certainly hope it remain valuable to me and doesn't become a burden...\n\nOne thing in this post I find interesting is that Derek said keeping his second brain might stop him from reading due to the pressure to take notes - but ironically, NOT having a second brain has stopped me from reading because I get paralyzed about where to keep notes, how to use them later, etc... I like the system taking shape in my life, and again I hope it only increases in value as time goes on.\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "Oddly enough I am just now really getting into the second brain idea... a zettlekasten has been taking shape in my life",
      "date_published": "2025-07-02T10:57:57Z",
      "date_modified": "2025-07-02T10:57:57Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "second-brain",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/nostr-hex-key/",
      "url": "https://pype.dev/nostr-hex-key/",
      "title": "Nostr hex key",
      "content_text": "\nyou can hexify your [[nostr]] key when you need to sometimes which I needed to for [[postiz]] (link with a thought I'm sure I have on postiz)\n\n```python\n\n# /// script\n# requires-python = \"\u003e=3.8\"\n# dependencies = [\n#     \"bech32\",\n# ]\n# ///\n#\nimport os\n\nimport bech32\n\n# Set your nsec... key to NOSTR_PRIVATE_KEY or bake it in...\nnsec_key = os.environ.get(\"NOSTR_PRIVATE_KEY\")\n\n\ndef decode_nsec(nsec_key):\n    hrp, data = bech32.bech32_decode(nsec_key)\n    if hrp != \"nsec\":\n        raise ValueError(\"Not a valid nsec key\")\n    decoded = bech32.convertbits(data, 5, 8, False)\n    return bytes(decoded).hex()\n\n\n# Example usage\nraw_hex = decode_nsec(nsec_key)\nprint(f\"Raw hex private key: {raw_hex}\")\n```\n",
      "summary": "you can hexify your nostr key when you need to sometimes which I needed to for postiz (link with a thought I'm sure I have on postiz)",
      "date_published": "2025-07-02T08:43:32Z",
      "date_modified": "2025-07-02T08:43:32Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "nostr",
        "til",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/github-star-sorter/",
      "url": "https://pype.dev/github-star-sorter/",
      "title": "Github Star Sorter",
      "content_html": "\u003cp\u003eI wrote a simple app to sort, tag, and create tickets at home for my github\nstars\u0026hellip; As of right now I have 1.3k stars and no convenient way to view them\nor remember which ones were ones I actually wanted to do something with. This\nsimple UI makes scrolling the stars list easy, updates is easy, and the kicker\nfor me is Kanboard integration so I can click a button from the stars UI and\nget a ticket made in my kanboard instance so that the work I want to do is in\nfront of me and not hidden by Github\u0026rsquo;s shockingly HORRIBLE UI.\u003c/p\u003e\n\u003cfigure\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250701125804_c41ec692.png\" alt=\"20250701125804_c41ec692.png\"\u003e\n\u003c/figure\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/pypeaday/gh-star-sorter\"\u003eGH Link\u003c/a\u003e\u003c/p\u003e\n",
      "content_text": "\nI wrote a simple app to sort, tag, and create tickets at home for my github\nstars... As of right now I have 1.3k stars and no convenient way to view them\nor remember which ones were ones I actually wanted to do something with. This\nsimple UI makes scrolling the stars list easy, updates is easy, and the kicker\nfor me is Kanboard integration so I can click a button from the stars UI and\nget a ticket made in my kanboard instance so that the work I want to do is in\nfront of me and not hidden by Github's shockingly HORRIBLE UI.\n\n![20250701125804_c41ec692.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250701125804_c41ec692.png)\n\n[GH Link](https://github.com/pypeaday/gh-star-sorter)\n",
      "summary": "I wrote a simple app to sort, tag, and create tickets at home for my github stars... As of right now I have 1.3k stars and no convenient way to view them or...",
      "date_published": "2025-07-01T08:01:31Z",
      "date_modified": "2025-07-01T08:01:31Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/gwl-margarita-tracker/",
      "url": "https://pype.dev/gwl-margarita-tracker/",
      "title": "gwl-margarita-tracker",
      "content_html": "\u003cp\u003eTrack discount on margarita refills over the lifetime of this mug\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/pypeaday/gwl-margarita-tracker\"\u003egithub repo\u003c/a\u003e\u003c/p\u003e\n\u003cfigure\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250701131846_9a61924b.png\" alt=\"20250701131846_9a61924b.png\"\u003e\n\u003c/figure\u003e\n",
      "content_text": "\nTrack discount on margarita refills over the lifetime of this mug\n\n[github repo](https://github.com/pypeaday/gwl-margarita-tracker)\n\n![20250701131846_9a61924b.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250701131846_9a61924b.png)\n",
      "summary": "Track discount on margarita refills over the lifetime of this mug",
      "date_published": "2025-06-30T21:33:28Z",
      "date_modified": "2025-06-30T21:33:28Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "projects",
        "great-wolf-lodge"
      ]
    },
    {
      "id": "https://pype.dev/great-wolf-lodge/",
      "url": "https://pype.dev/great-wolf-lodge/",
      "title": "Great Wolf Lodge",
      "content_text": "\n# Trips\n\n## 2026 (Dells)\n\n- walkie-talkies!\n\n### Notes\n\n- The Lodge's sheets were real scratchy - bring your own sheets and pillows\n  - The room we had in the condo had a King bed, we brought Queen sheets :face_palm:\n\n---\n\n## 2025 (Gurnee)\n\nWe returned to Gurnee in June of 2025 (so a summer trip) and had a great time.\n\nWe experienced the bigger slides on this grip - and they were a blast. We had\nour oldest sneakly get up on her toes when the door guard measured her height\nand we got her JUST up to 48\" for the GREEN bracelet which got us on the double\nwhirlwind amongst other super fun slides.\n\nThis trip I also got the idea for the [[gwl-margarita-tracker]]!\n\n???+ danger \"Magiquest Scam\"\n\n    If you buy the wand or a topper it seems like that includes a \"session\" of\n    the game. We brought our wands and toppers this time, and when we went to play\n    the game said our time expired... Turns out you have to pay $15 for another\n    session of playing even if you already bought all the gear!\n\n### Tips\n\n- I brought my lulu shirts but the wristband snags them and my sweatshirts like\n  crazy - bring athletic hoodies and regular cotton t-shirts to avoid the snag\n- There is a Culver's literally down the street, you could walk... so if you'\n  re starving at night and don't want to spend $29 on a personal pizza, you can\n  take a quick hike for a butter burger\n- Bringing a crock pot with pulled pork worked great for meals\n- Mini fridge is available for lunch meats and cheeses\n- There's an ice machine in the hallway if you want to keep anything on ice\n- We brought a griddle but it was brand new - got some smoke, will break in next time\n\n---\n\n## 2025 (Dells)\n\nAfter experiencing the Gurnee location we were excited to checkout the Dells as well.\n\nThe waterpark is organized a little differently - and the only real\nobservations are that the wave pool is a lot bigger than Gurnee's but the lazy\nriver is a lot smaller...\n\nWe stayed in a condo during this trip, which was great with a kitchenette -\nbuying groceries and just doing sandwiches or pasta for meals saved a boat load\nof money, probably enough to nearly off-set the cost of the condo over a\nregular room.\n\nAt this location the Magiquest setup is unique - it's in its own building,\nwhich is setup as like a 4 story high jungle gym. It's very cool, and the kids\ncan run around to play the magiquest game, or ditch the wands and just run\naround and slide down slides and stuff... our kids had a blast at 3 and 5 years\nold.\n\n---\n\n## 2023 (Gurnee)\n\nWe went to GWL in Gurnee in 2023 for the first time, and we didn't know exactly\nwhat to expect. We are also are not very experienced travelers, so packing for\na trip (particularly in the food department) is tough... which isn't a huge\ndeal - it just means we spent a LOT on food at the resort...\n\nFor this trip our kids were 2 and 4 and it was still a valuable trip. The\nwaterpark is organized in such a way that the littler kids have their own space\naway from the bigger ones, it's very safe, and the slides and stuff even for\nthe littles are great.\n\nI'm writing this in July after our 3rd trip, so I don't have all the memories\nfrom this first one, but here's a short list of things if traveling with kids\nsay younger than 5:\n\n1. water shoes would be a good purchase for the kids if they're going to be in the littles area. The ground there for some reason is murder on the feet (on a future visit we realzied the rest of the waterpark's ground isn't so bad... not sure why the kiddo's pool was so rough)\n2. you don't need to bring towels\n3. you don't need nearly as many clothes as you think, just underwear and enough swimming gear... no one is dressed in much more than swimwear and a cover-up like a t-shirt even at the restaurants pretty much\n\n---\n\n# Packing List\n\n## Pack\n\n- Coffee + mushroom stuff\n- Espresso + grinder (or ground beans)\n- Fairlife milk\n- Sheets (the Lodge's sheets were real scratchy)\n- Pillows\n- Sleeping Bags\n\n## Buy (Aldi)\n\n### Breakfast\n\n- Cereal + milk\n- Fruit\n- Frozen waffles (if toaster)\n\n### Snacks\n\n- \"Functional\" protein bars\n- clementines/apples\n\n### Lunch\n\n- Deli sandwiches\n- Chips\n\n### Dinner\n\n- Mac and Cheese + chicken nuggets\n- Pizza\n- Veggies\n\n### Misc\n\n- ziploc\n- napkins/paper towels\n- ketchup\n- mustard/mayo\n- drinks\n",
      "summary": "walkie-talkies!",
      "date_published": "2025-06-30T21:31:13Z",
      "date_modified": "2025-06-30T21:31:13Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "great-wolf-lodge"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-722/",
      "url": "https://pype.dev/thoughts-722/",
      "title": "💭 Switching pip to uv in a Dockerized Flask / Django App — Nick …",
      "content_text": "\n\u003ca href=\"https://nickjanetakis.com/blog/switching-pip-to-uv-in-a-dockerized-flask-or-django-app\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://nickjanetakis.com/blog/switching-pip-to-uv-in-a-dockerized-flask-or-django-app\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - Switching pip to uv in a Dockerized Flask / Django App — Nick Janetakis\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://nickjanetakis.com/blog/switching-pip-to-uv-in-a-dockerized-flask-or-django-app\"\u003eSwitching pip to uv in a Dockerized Flask / Django App — Nick Janetakis\u003c/a\u003e\n\n---\n\nIt's nice to see uv gaining popularity in so many places - and replacing vanilla pip with uv in containerized environments seems great due if for no other reason than the time you'll save in CI... A few years ago I refactored a disjointed container build process to use uv instead of pip, and due to the design of the build pipelines we went from 10-15 minute builds to 2-3 minutes... \n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "It's nice to see uv gaining popularity in so many places - and replacing vanilla pip with uv in containerized environmen",
      "date_published": "2025-06-27T11:18:16Z",
      "date_modified": "2025-06-27T11:18:16Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "python",
        "pip",
        "uv",
        "dev",
        "tech",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-721/",
      "url": "https://pype.dev/thoughts-721/",
      "title": "💭 Containers are available in public beta for simple, global, an…",
      "content_text": "\n\u003ca href=\"https://blog.cloudflare.com/containers-are-available-in-public-beta-for-simple-global-and-programmable/\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://blog.cloudflare.com/containers-are-available-in-public-beta-for-simple-global-and-programmable/\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - Containers are available in public beta for simple, global, and programmable compute\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://blog.cloudflare.com/containers-are-available-in-public-beta-for-simple-global-and-programmable/\"\u003eContainers are available in public beta for simple, global, and programmable compute\u003c/a\u003e\n\n---\n\nI've been learning a lot just about basic web-development as I work on my blog. I'm not actively learning the ins and outs to be honest - AI is both helpful and harmful in this regard for me I think - but in that knowledge-gathering and experience-gaining I've gotten my head around deploying a static site to a simple web server and how that's different than deploying a simple container with a backend. \nI use cloudflare for my DNS already, and I have an app or 2 on fly - but depending on the IaC support for container deployment that are now available with cloudflare I may look to switch...\n\nI suppose I should do a little PoC first, and so this thought will be a reminder to take a stab at it\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "I've been learning a lot just about basic web-development as I work on my blog. I'm not actively learning the ins and ou",
      "date_published": "2025-06-26T11:20:11Z",
      "date_modified": "2025-06-26T11:20:11Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "webdev",
        "cloudflare",
        "containers",
        "todo",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-720/",
      "url": "https://pype.dev/thoughts-720/",
      "title": "💭 Genesis 1 and Its ANE Polemic, Part 2 - Dr. Michael Heiser",
      "content_text": "\n\u003ca href=\"https://drmsh.com/genesis-1-and-its-ane-polemic-part-2/\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://drmsh.com/genesis-1-and-its-ane-polemic-part-2/\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - Genesis 1 and Its ANE Polemic, Part 2 - Dr. Michael Heiser\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://drmsh.com/genesis-1-and-its-ane-polemic-part-2/\"\u003eGenesis 1 and Its ANE Polemic, Part 2 - Dr. Michael Heiser\u003c/a\u003e\n\n---\n\nI'm preparing for a conversation on Genesis 1 this morning, and so I of course wanted to read through a few of Mike's old posts... I'm going to write a longer post about the impact Mike had on my life... he died in February of 2023 of pancreatic cancer and everytime I visit his site I get a little teary eyed...\n\nThe guy brought SO MUCH clarity to me regarding the Bible and some of the silly ideas I had about i growing up (and indeed MOST of the people in America that I have ever talked to about the Bible also have).\n\nSo this thought is a reminder to me to not forget to write more about him - Jesus touched so many people through Mike's ministry of studying the Bible for what it is, not what the arrogant Western mind wants it to be.\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "I'm preparing for a conversation on Genesis 1 this morning, and so I of course wanted to read through a few of Mike's ol",
      "date_published": "2025-06-25T11:29:10Z",
      "date_modified": "2025-06-25T11:29:10Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "reflection",
        "heiser",
        "ane",
        "genesis",
        "todo",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-719/",
      "url": "https://pype.dev/thoughts-719/",
      "title": "💭 Notes – 06:11 Sun 22 Jun 2025 – David Bushell – Web Dev (UK)",
      "content_text": "\n\u003ca href=\"https://dbushell.com/notes/2025-06-22T06:11Z/\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://dbushell.com/notes/2025-06-22T06:11Z/\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - Notes – 06:11 Sun 22 Jun 2025 – David Bushell – Web Dev (UK)\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://dbushell.com/notes/2025-06-22T06:11Z/\"\u003eNotes – 06:11 Sun 22 Jun 2025 – David Bushell – Web Dev (UK)\u003c/a\u003e\n\n---\n\nI see that most of the tech world, at least in public, leans left... which is fine. I think politically I'd have leaned left in the 90s/00s if I had been old enough to pay attention and understand.\n\nBut the sold-out hatred for Elon and Trump is wild to me... Nothing makes the reality of propganda in 2025 more clear to me than the manufactured hate of 2 guys who the Left USED to love... I'm not like all in on either guy - but the politically driven hatred which has led to physical violence against both of these guys is insane.... \n\nDave's ending thought here \"We're entering a Misinformation Age\" is funny to me... Misinformation has been around forever - the CIA has admitted to an absolutely hilarious amount of things that over the years the government (US Government) had denied and the news had been complicit in covering up - right up until it was just undeniable and finally \"ok ya everyone we did do that mind control experiment - BUT WE'LL NEVER DO IT AGAIN\"... \"ok ya everyone we did know the Taliban has been on the receiving end of millions of US dollars every year but don't worry about it\"... But for everyone to NOW get all up in arms over 2 guys the news will not shut up about, is just comically out of touch with history to me...\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "I see that most of the tech world, at least in public, leans left... which is fine. I think politically I'd have leaned",
      "date_published": "2025-06-25T11:04:29Z",
      "date_modified": "2025-06-25T11:04:29Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "ai",
        "politics",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/traefik-and-grpc-for-temporal-at-home/",
      "url": "https://pype.dev/traefik-and-grpc-for-temporal-at-home/",
      "title": "Traefik and gRPC for Temporal at home",
      "content_text": "\n# Temporal Networking Woes\n\nSomeday I will potentially write up some stuff about [[temporal]] but for now\nit's a workflow orchestrator that I'm interested in and I wanted to PoC it in\nmy homelab by replacing a simple cron job to build my blog with a temporal\nworkflow and activity. I was IMMEDIATELY thwarted by a networking error that\nfeels crazy to me but maybe won't be to others... so enjoy the problem and if\nyou're here from a Google search, I hope it's helpful.\n\nGetting started with Temporal I wanted to have the server and associated\ncomponents on my server, but I expected to be running workflows and workers\non another computer. \n\nFor most of my apps I slap some [[traefik]] labels on\nand we're good to go. But I got a wild set of errors trying to run a worker on\nmy desktop and connect it to the temporal server on my server over https.... it\nended up being because I needed to setup a special protocol in traefik for the\nreverse proxy to appropriately proxy the grpc call.\n\nSo I had a normal set of labels on my temporal container, went to run a worker\nand got this nasty work of art\n\n```\nRuntimeError: Failed client connect: `get_system_info` call error after connection: Status { code: Internal, message: \"protocol error: received message with invalid compression flag: 73 (valid flags are 0 and 1) while receiving response with status: 500 Internal Server Error\", metadata: MetadataMap { headers: {\"content-type\": \"text/plain; charset=utf-8\", \"content-length\": \"21\", \"date\": \"Wed, 25 Jun 2025 02:12:44 GMT\"} }, source: None }\n```\n\nThank God I had kind of seen this at work one other time in my life, and we\nnever fixed the issue there but I knew what it was... we had traefik acting as\na load balancer (as do I at home) and the traefik load balancer was \"balancing\ntraffic using https\"... no, I do not really know what I'm saying. But what I do\nknow is that in order for the Temporal Server and Worker to communicate,\ntraefik has to properly route the traffic for gRPC instead of https.\n\n!!! warning \"\"\n    I can't stress enough how little I know about the difference between https and grpc or why the load balancer cares... there's clearly something in the networking stack that is extremely relevant here\n\nBut the fix is NOT hard thankfully, and it's even on [traefik's website](https://doc.traefik.io/traefik/user-guides/grpc/#traefik-configuration) - the warning annotation there tells you what you need - which is one more traefik label...\n\n```yaml\ntraefik.http.services.\u003cmy-service-name\u003e.loadbalancer.server.scheme=h2c\n```\n\nSo after setting the loadbalancer.server.scheme to `h2c` I could run my worker just fine!\n\n![20250625021838_4d7104c2.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250625021838_4d7104c2.png)\n",
      "summary": "Someday I will potentially write up some stuff about temporal but for now it's a workflow orchestrator that I'm interested in and I wanted to PoC it in my...",
      "date_published": "2025-06-24T20:55:42Z",
      "date_modified": "2025-06-24T20:55:42Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "tech",
        "temporal",
        "grpc"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-713/",
      "url": "https://pype.dev/thoughts-713/",
      "title": "💭 Copilot Instructions",
      "content_text": "\n\u003ca href=\"https://www.copilotinstructions.xyz/\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://www.copilotinstructions.xyz/\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - Copilot Instructions\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://www.copilotinstructions.xyz/\"\u003eCopilot Instructions\u003c/a\u003e\n\n---\n\nI have tried a few different cursorrules/windsurfrules with windsurf, but I didn't even know you could give copilot custom instructions. I see python + fastapi on here, which I build with frequently at home, so I'll look forward to seeing if the results are any better with a custom prompt using copilot\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "I have tried a few different cursorrules/windsurfrules with windsurf, but I didn't even know you could give copilot cust",
      "date_published": "2025-06-23T11:14:02Z",
      "date_modified": "2025-06-23T11:14:02Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "ai",
        "copilot",
        "prompt",
        "agentic",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/nextcloud-php-opache-memory-consumption/",
      "url": "https://pype.dev/nextcloud-php-opache-memory-consumption/",
      "title": "Nextcloud PHP Opache Memory Consumption",
      "content_html": "\u003ch1 id=\"intro\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eIntro\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eToday I was combing through Nextcloud, just taking a gander at the apps, updates, etc.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe OPcache buffer is nearly full. To assure that all scripts can be hold in\ncache, it is recommended to apply \u0026ldquo;opcache.memory_consumption\u0026rdquo; to your PHP\nconfiguration with a value higher than \u0026ldquo;128\u0026rdquo;\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eSo I know \u003cem\u003enothing\u003c/em\u003e about \u003ccode\u003ephp\u003c/code\u003e and I had no idea where to set this\u0026hellip; Also I\u0026rsquo;m\nrunning Nextcloud in a container so any updates will be blown away when the\ncontainer is removed (say next time I update Nextcloud)\u0026hellip;\u003c/p\u003e\n\u003cp\u003eAfter a little duckduckgoing I came across \u003ca href=\"https://www.reddit.com/r/NextCloud/comments/1gpxl5b/need_help_with_php_opcache_module_warning/\"\u003ethis reddit\npost\u003c/a\u003e\nwhere a guy had the same issue\u0026hellip;\u003c/p\u003e\n\u003cp\u003eThe long and short of it is that on \u003cem\u003esingle instance nextcloud deployments\u003c/em\u003e\nthis php memory consumption value can be too low for Nextcloud to keep up with\nthe demand\u0026hellip; You can see in the message they just recommend upping the value.\u003c/p\u003e\n\u003cp\u003eSo I had to think about how to persist the change and have it take effect now\nideally without affecting any users too much\u0026hellip; So here\u0026rsquo;s what I did - made the\nchange in 2 places:\u003c/p\u003e\n\u003ch2 id=\"in-the-container\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eIn the container\u003c/span\u003e \u003ca href=\"#in-the-container\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI exec\u0026rsquo;d into the container and used this handy \u003ccode\u003esed\u003c/code\u003e command \u003ccode\u003esed -i 's/^opcache\\.memory_consumption\\s*=\\s*128$/opcache.memory_consumption=256/' /usr/local/etc/php/conf.d/opcache-recommended.ini\u003c/code\u003e to update the value in the\nrunning container - and I guess \u003ccode\u003ephp\u003c/code\u003e maybe is loaded up dynamically or\nsomething? but the warning did go away\u0026hellip;.\u003c/p\u003e\n\u003cp\u003eSo how to persist this change when the filesystem is blown away when the\ncontainer is updated?\u003c/p\u003e\n\u003ch2 id=\"in-the-config\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eIn the config\u003c/span\u003e \u003ca href=\"#in-the-config\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI set the env var \u003ccode\u003ePHP_OPCACHE_MEMORY_CONSUMPTION\u003c/code\u003e in the \u003ccode\u003edocker-compose.yml\u003c/code\u003e\nfile to 256 and voila\u0026hellip; the change should persist\u0026hellip;\u003c/p\u003e\n",
      "content_text": "\n# Intro\n\nToday I was combing through Nextcloud, just taking a gander at the apps, updates, etc.\n\n\u003e The OPcache buffer is nearly full. To assure that all scripts can be hold in\n\u003e cache, it is recommended to apply \"opcache.memory_consumption\" to your PHP\n\u003e configuration with a value higher than \"128\"\n\nSo I know _nothing_ about `php` and I had no idea where to set this... Also I'm\nrunning Nextcloud in a container so any updates will be blown away when the\ncontainer is removed (say next time I update Nextcloud)...\n\nAfter a little duckduckgoing I came across [this reddit\npost](https://www.reddit.com/r/NextCloud/comments/1gpxl5b/need_help_with_php_opcache_module_warning/)\nwhere a guy had the same issue...\n\nThe long and short of it is that on _single instance nextcloud deployments_\nthis php memory consumption value can be too low for Nextcloud to keep up with\nthe demand... You can see in the message they just recommend upping the value.\n\nSo I had to think about how to persist the change and have it take effect now\nideally without affecting any users too much... So here's what I did - made the\nchange in 2 places:\n\n## In the container\n\nI exec'd into the container and used this handy `sed` command `sed -i\n's/^opcache\\.memory_consumption\\s*=\\s*128$/opcache.memory_consumption=256/'\n/usr/local/etc/php/conf.d/opcache-recommended.ini` to update the value in the\nrunning container - and I guess `php` maybe is loaded up dynamically or\nsomething? but the warning did go away....\n\nSo how to persist this change when the filesystem is blown away when the\ncontainer is updated?\n\n## In the config\n\nI set the env var `PHP_OPCACHE_MEMORY_CONSUMPTION` in the `docker-compose.yml`\nfile to 256 and voila... the change should persist...\n",
      "summary": "Today I was combing through Nextcloud, just taking a gander at the apps, updates, etc.",
      "date_published": "2025-06-23T08:46:20Z",
      "date_modified": "2025-06-23T08:46:20Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "tech",
        "nextcloud"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-712/",
      "url": "https://pype.dev/thoughts-712/",
      "title": "💭 You asked, we built it: Firefox tab groups are here",
      "content_text": "\n\u003ca href=\"https://blog.mozilla.org/en/firefox/tab-groups-community/\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://blog.mozilla.org/en/firefox/tab-groups-community/\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - You asked, we built it: Firefox tab groups are here \"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://blog.mozilla.org/en/firefox/tab-groups-community/\"\u003eYou asked, we built it: Firefox tab groups are here \u003c/a\u003e\n\n---\n\nI stumbled into tab groups today when rearranging my tabs in firefox while bouncing between a few different things this morning. I'm thankful this article is from April of this year... otherwise this was a super boomer moment for me... As a heavy tech user I don't think a lot about my internet browsing experience except from a privacy standpoint. So thinking about automation and comfort within the browser - treating it like a first-class citizen in my development workflow and toolkit, will hopefully help me stay just a little bit more organized\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "I stumbled into tab groups today when rearranging my tabs in firefox while bouncing between a few different things this",
      "date_published": "2025-06-22T13:18:49Z",
      "date_modified": "2025-06-22T13:18:49Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "firefox",
        "organization",
        "browser",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/quit-issueing-200s-for-500s/",
      "url": "https://pype.dev/quit-issueing-200s-for-500s/",
      "title": "Quit issueing 200s for 500s",
      "content_html": "\u003ch1 id=\"stop-this-nonsense\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStop this nonsense\u003c/span\u003e\u003c/h1\u003e\n\u003cfigure\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250622115500_5bd3bc21.png\" alt=\"20250622115500_5bd3bc21.png\"\u003e\n\u003c/figure\u003e\n",
      "content_text": "\n# Stop this nonsense\n\n![20250622115500_5bd3bc21.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250622115500_5bd3bc21.png)\n",
      "date_published": "2025-06-22T06:55:21Z",
      "date_modified": "2025-06-22T06:55:21Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "tech",
        "nonsense",
        "google",
        "veo3"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-711/",
      "url": "https://pype.dev/thoughts-711/",
      "title": "💭 Control Your n8n Instance Remotely with Telegram Bot Commands …",
      "content_text": "\n\u003ca href=\"https://n8n.io/workflows/4928-control-your-n8n-instance-remotely-with-telegram-bot-commands/\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://n8n.io/workflows/4928-control-your-n8n-instance-remotely-with-telegram-bot-commands/\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - Control Your n8n Instance Remotely with Telegram Bot Commands | n8n workflow template\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://n8n.io/workflows/4928-control-your-n8n-instance-remotely-with-telegram-bot-commands/\"\u003eControl Your n8n Instance Remotely with Telegram Bot Commands | n8n workflow template\u003c/a\u003e\n\n---\n\nI'm doing a lot of thinking and brainstorming about how I want to run some pipelines I have in my head, at home... things like image gen for blog posts, posting to various social media, click to generate qr codes and send emails, etc... things that require a lot of integration. \n\nI tried n8n a while ago with 1 use case, it didn't work but times have changed and whatever was wrong for that use case is now just fixed with a few updates... so I'm strongly considering n8n as a platform I build my workflows on, and using telegram as a simple entry-point into workflow execution is kind of intriguing... imagine sending a message to telegram to generate an image with SD based on a picture you took with our phone, maybe do something else with that image (turn it into a qr code or something), and then email it? all with a text message and pic? that sounds pretty cool... not sure what I\"ll have spun up but I am excited to be making some progress on the automation ideas\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "I'm doing a lot of thinking and brainstorming about how I want to run some pipelines I have in my head, at home... thing",
      "date_published": "2025-06-22T00:38:53Z",
      "date_modified": "2025-06-22T00:38:53Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "n8n",
        "homelab",
        "todo",
        "telegram",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-710/",
      "url": "https://pype.dev/thoughts-710/",
      "title": "💭 matduggan.com/what-would-a-kubernetes-2-0-look-like/",
      "content_text": "\n\u003ca href=\"https://matduggan.com/what-would-a-kubernetes-2-0-look-like/\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://matduggan.com/what-would-a-kubernetes-2-0-look-like/\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - matduggan.com/what-would-a-kubernetes-2-0-look-like/\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://matduggan.com/what-would-a-kubernetes-2-0-look-like/\"\u003ematduggan.com/what-would-a-kubernetes-2-0-look-like/\u003c/a\u003e\n\n---\n\nThis article was longer than I had time to really consume but a heading caught my eye that I wanted to agree with - the author says k8s 2.0 may consider HCL instead of YAML. And as a recent terraform / open-tofu adopter I gotta say I would be ALL FOR THIS\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "This article was longer than I had time to really consume but a heading caught my eye that I wanted to agree with - the",
      "date_published": "2025-06-20T11:53:33Z",
      "date_modified": "2025-06-20T11:53:33Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "k8s",
        "tech",
        "devops",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/thinking-in-diagrams/",
      "url": "https://pype.dev/thinking-in-diagrams/",
      "title": "Thinking In Diagrams",
      "content_text": "\n# Intro\n\nSomething I didn't appreciate earlier on in my career (and I'm only 8 as far as\nthe age of that career goes anyways) was thinking through problems with\ndiagrams... I've often approached a problem with code first, and immediately\nstarted implementing a solution. There's nothing actually wrong with that especially when considering:\n\n1. people think differently\n2. some people think with their fingers\n3. recognizing that the first thing you build should be thrown away should give you freedom to \"just start\"\n\nNow with that said, let's chat about how awesome diagrams are though...\n\n1. they put context in front of you without details\n2. you can express many more components of a system in a consumable way when compared to code\n3. diagrams help prioritize work and bubble up maybe unforseen dependencies\n4. they force you to wireframe before getting lost in the details\n\n## Wireframing\n\nOne of my biggest issue when I \"just start coding\" is not having a direction...\nI can put a few place holders `def this:` `def that:` in a few python modules,\nbut without having every place holder in front of me it is hard to keep them\nstraight, know the order or dependencies, etc.\n\nDiagrams aren't beholden to a text file or series of them, and you can fit much\nmore on your screen because you have all the X-Y available to you instead of\nthe height of your monitor times your formatted lined length (usually 120 for\nme).\n\nDiagrams also make it easy to spew out onto a page the different components you\nneed for a solution, without committing to an order (something that I cannot\nexpress well in scripts)\n\n## A Plan\n\nDiagramming with purpose can get you to the place of having almost a\npaint-by-number experience building your app/system/etc. Beecause you separate\nthe implemetation from the design and when you implement BASED on a design\nrather than implement to DISCOVER a design you will be more efficient and in my\nexperience I've improved my ability to forsee issues that I wouldn't have seen,\nor have historically missed, by putting the design down in front of me, the\ndetails of any integrations, etc. before starting to \"just code\".\n\n## Good Enough\n\nA final note about diagrams for right now is that they're easy to leave as\n\"good enough\". The point was to get a guide for solving a problem.\n\nDiagrams don't have to be picture perfect, even for documentation's sake. They\ncan even remain somewhat unfinished (permitted you don't get yourself into a\nbind of treating diagrams as docs that you didn't clean up)\n\nHere's an example of what I mean - I'm working on a simple workflow to take [my-thoughts](/my-thoughts) and post them to [[nostr]]. I started with a diagram like this...\n\n![20250622112223_f1838d9b.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250622112223_f1838d9b.png)\n\n\u003e In parallel I'm working on posting my blog to other social media - this small\n\u003e workflow is apart of a larger initiative I'm working on at home\n\nAS you can see this diagram isn't super detailed or pretty. But what it does it\nhelp me see the high level points of bringing my published thoughts to nostr as\nposts.\n\nAfter I have the simple steps, I've started diagramming out more details of each step:\n\n![20250622112415_f18663e3.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250622112415_f18663e3.png)\n\nThe diagram is easy to put notes on, add some color to for problems not yet solved, etc.\n\nAnd then with this diagram in front of me, it's easy to begin building\nsmall-scoped components that will be assembled to my larger system, but without\nthe pressure of constructing every part of the system at once\n\n# Fin\n\nDiagrams help me break up a problem into manageable chunks so that I can put\nthe things I need later on the back-burner and can focus on one achievable\nthing at a time.\n",
      "summary": "Something I didn't appreciate earlier on in my career (and I'm only 8 as far as the age of that career goes anyways) was thinking through problems with...",
      "date_published": "2025-06-20T06:55:31Z",
      "date_modified": "2025-06-20T06:55:31Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "tech",
        "dev-ops",
        "planning"
      ]
    },
    {
      "id": "https://pype.dev/what-are-the-rewards-in-heaven/",
      "url": "https://pype.dev/what-are-the-rewards-in-heaven/",
      "title": "What Are The Rewards In Heaven?",
      "content_html": "\u003ch1 id=\"intro\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eIntro\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eI came across an article on the Bible Project on what it means to \u0026ldquo;store up\ntreasures in Heaven\u0026rdquo; and it brought some clarity to the meaning of this\nteaching for me\u0026hellip;\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve been walking with Jesus for around 2 decades now, and he\u0026rsquo;s taught me a lot\nabout life, love, and grace. I still feel the battle inside myself when faced\nwith a decision where I can act more or less in line with Jesus\u0026rsquo; desire and\nwill or I can make a choice that\u0026rsquo;s about me\u0026hellip; Anytime I\u0026rsquo;m able to choose the\npath I know is his, then praise the Lord and he\u0026rsquo;s been faithful to change me\nmore and more into his image and likeness.\u003c/p\u003e\n\u003ch2 id=\"tldr-the-treasures\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTLDR - The Treasures\u003c/span\u003e \u003ca href=\"#tldr-the-treasures\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe article goes on to argue that the rewards we are promised in Heaven, the\nones we are supposed to \u0026ldquo;store up\u0026rdquo;, are the rewards of living like Jesus today.\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eNote\u003c/p\u003e\n\u003cp\u003eThe reward becomes greater as our will is forged to align with the Lord. As\nwe grow in holiness, making holy decisions and living a holy life \u003cem\u003ebecomes\u003c/em\u003e the\nreward we store up for heaven\u003c/p\u003e\n\u003c/div\u003e\n\u003ch1 id=\"reflection\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eReflection\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eThe idea that the perspective of the rewards change as we change is actually\nnot that ground breaking to me\u0026hellip; Growth leads to perspective changes in other\naspects of life.\u003c/p\u003e\n\u003cp\u003eSay for my work, as I get more experience and learn what kinds of problems\n\u003cem\u003etend\u003c/em\u003e to arise, I can appreciate troubleshooting tactics I may have not\nconsidered before, approach problems with a different point of view, etc. And\nit\u0026rsquo;s in this growth that I can appreciate things like searching deep in logs\nfor 1 piece of info, or deciding to re-run something that takes hours and\nappreciating that it\u0026rsquo;s the best thing to do when I\u0026rsquo;d rather try to slam changes\nin that \u003cem\u003emight\u003c/em\u003e work or might make it worse\u0026hellip; The growth brings maturity and\ndeeper understanding to the problems.\u003c/p\u003e\n\u003cp\u003eHow about with children? As they grow and mature they learn more about the\nworld\u0026hellip; They appreciate things they didn\u0026rsquo;t like before - like having been\ndisciplined as a child or being taught a hard lesson that pays off down the\nline. Again, the growth brings a perspective change.\u003c/p\u003e\n\u003cp\u003eAnd so as I journey in my faith this quote from the article resonated with me\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eNote\u003c/p\u003e\n\u003cp\u003eJesus’ exhortation to store up for yourselves treasures in Heaven is an invitation to taste, right now, what life will be like in the renewed world later on.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eJesus brought Heaven back to earth, and invites his chosen people to live in Heaven today regardless of where we live on earth.\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eNote\u003c/p\u003e\n\u003cp\u003eAs we mature in the Lord, the things of God become more valuable to us, and these rewards not only become more apparent, but they become easier to appreciate\u0026hellip; ie. we store them up as we experience Heaven on earth\u003c/p\u003e\n\u003c/div\u003e\n\u003ch1 id=\"link\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLink\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003e\u003ca href=\"https://bibleproject.com/articles/what-are-rewards-heaven-bible\"\u003elink to article\u003c/a\u003e\u003c/p\u003e\n",
      "content_text": "\n# Intro \n\nI came across an article on the Bible Project on what it means to \"store up\ntreasures in Heaven\" and it brought some clarity to the meaning of this\nteaching for me...\n\nI've been walking with Jesus for around 2 decades now, and he's taught me a lot\nabout life, love, and grace. I still feel the battle inside myself when faced\nwith a decision where I can act more or less in line with Jesus' desire and\nwill or I can make a choice that's about me... Anytime I'm able to choose the\npath I know is his, then praise the Lord and he's been faithful to change me\nmore and more into his image and likeness.\n\n## TLDR - The Treasures\n\nThe article goes on to argue that the rewards we are promised in Heaven, the\nones we are supposed to \"store up\", are the rewards of living like Jesus today.\n\n!!! note \"\"\n    The reward becomes greater as our will is forged to align with the Lord. As\n    we grow in holiness, making holy decisions and living a holy life _becomes_ the\n    reward we store up for heaven\n\n# Reflection\n\nThe idea that the perspective of the rewards change as we change is actually\nnot that ground breaking to me... Growth leads to perspective changes in other\naspects of life.\n\nSay for my work, as I get more experience and learn what kinds of problems\n_tend_ to arise, I can appreciate troubleshooting tactics I may have not\nconsidered before, approach problems with a different point of view, etc. And\nit's in this growth that I can appreciate things like searching deep in logs\nfor 1 piece of info, or deciding to re-run something that takes hours and\nappreciating that it's the best thing to do when I'd rather try to slam changes\nin that _might_ work or might make it worse... The growth brings maturity and\ndeeper understanding to the problems.\n\nHow about with children? As they grow and mature they learn more about the\nworld... They appreciate things they didn't like before - like having been\ndisciplined as a child or being taught a hard lesson that pays off down the\nline. Again, the growth brings a perspective change.\n\nAnd so as I journey in my faith this quote from the article resonated with me\n\n!!! note \"\"\n    Jesus’ exhortation to store up for yourselves treasures in Heaven is an invitation to taste, right now, what life will be like in the renewed world later on.\n\nJesus brought Heaven back to earth, and invites his chosen people to live in Heaven today regardless of where we live on earth. \n\n!!! note \"\"\n    As we mature in the Lord, the things of God become more valuable to us, and these rewards not only become more apparent, but they become easier to appreciate... ie. we store them up as we experience Heaven on earth\n\n\n# Link\n\n[link to article](https://bibleproject.com/articles/what-are-rewards-heaven-bible)\n",
      "summary": "I came across an article on the Bible Project on what it means to \"store up treasures in Heaven\" and it brought some clarity to the meaning of this teaching...",
      "date_published": "2025-06-20T06:23:05Z",
      "date_modified": "2025-06-20T06:23:05Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "bible-project",
        "faith",
        "reflection"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-709/",
      "url": "https://pype.dev/thoughts-709/",
      "title": "💭 pypeaday/whose-turn-is-it: Simple uv webapp to determine order…",
      "content_text": "\n\u003ca href=\"https://github.com/pypeaday/whose-turn-is-it\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://github.com/pypeaday/whose-turn-is-it\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - pypeaday/whose-turn-is-it: Simple uv webapp to determine order fo players for an event\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://github.com/pypeaday/whose-turn-is-it\"\u003epypeaday/whose-turn-is-it: Simple uv webapp to determine order fo players for an event\u003c/a\u003e\n\n---\n\nWe pray together as a family every night, but every single flipping night my daughter's fight about the order we go in... well, NO MORE!\n\nI built a simple uv fastapi app that randomly sorts a list from an environment var `PLAYERS` and presents it in the web page at `/generate`.\n\nSuper easy `uv run` at home...\n\nI love that with enough knowledge, or the right kind of knowledge, you can build like anything you want!\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "We pray together as a family every night, but every single flipping night my daughter's fight about the order we go in..",
      "date_published": "2025-06-20T01:23:26Z",
      "date_modified": "2025-06-20T01:23:26Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "tech",
        "reflection",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-707/",
      "url": "https://pype.dev/thoughts-707/",
      "title": "💭 Microsoft planning thousands of job cuts aimed at salespeople,…",
      "content_text": "\n\u003ca href=\"https://www.reuters.com/business/world-at-work/microsoft-planning-thousands-job-cuts-aimed-salespeople-bloomberg-news-reports-2025-06-18/\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://www.reuters.com/business/world-at-work/microsoft-planning-thousands-job-cuts-aimed-salespeople-bloomberg-news-reports-2025-06-18/\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - Microsoft planning thousands of job cuts aimed at salespeople, Bloomberg News reports | Reuters\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://www.reuters.com/business/world-at-work/microsoft-planning-thousands-job-cuts-aimed-salespeople-bloomberg-news-reports-2025-06-18/\"\u003eMicrosoft planning thousands of job cuts aimed at salespeople, Bloomberg News reports | Reuters\u003c/a\u003e\n\n---\n\nmore cuts for the sake of AI investment... this is getting out of hand. I'm thankful that I don't work in a field that will be overtaken by AI in the sense of losing my job (I mean we're like 47 months into AI will end dev jobs tomorrow) - of course I have to learn about the tools and LLMs have increased my output in many ways. If I was fearful of losing my job, for example being in Sales at Microsoft, I would be using every on-the-clock hour to find a new job...\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "more cuts for the sake of AI investment... this is getting out of hand. I'm thankful that I don't work in a field that w",
      "date_published": "2025-06-19T10:51:59Z",
      "date_modified": "2025-06-19T10:51:59Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "layoffs",
        "microsoft",
        "tech",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-706/",
      "url": "https://pype.dev/thoughts-706/",
      "title": "💭 microsandbox/microsandbox: Self-Hosted Plaform for Secure Exec…",
      "content_text": "\n\u003ca href=\"https://github.com/microsandbox/microsandbox\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://github.com/microsandbox/microsandbox\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - microsandbox/microsandbox: Self-Hosted Plaform for Secure Execution of Untrusted User/AI Code\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://github.com/microsandbox/microsandbox\"\u003emicrosandbox/microsandbox: Self-Hosted Plaform for Secure Execution of Untrusted User/AI Code\u003c/a\u003e\n\n---\n\nThere's a ton of AI related tools I want to play with, and there are several I run in docker pretty willy nilly. However, the MCP server stuff as of late has felt fast and borderline reckless so I like seeing a project seeking to make it easy to sandbox code... I get blocked by this idea cause I'll want to setup a VM on a VLAN or something before just spinning up an mcp server idk if I should trust - but if I can do it with a library then that's amazing!\n\nWe just have to hope the motivation to try this stays strong enough to get started\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "There's a ton of AI related tools I want to play with, and there are several I run in docker pretty willy nilly. However",
      "date_published": "2025-06-19T10:46:03Z",
      "date_modified": "2025-06-19T10:46:03Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "github",
        "ai",
        "llm",
        "security",
        "sandbox",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/homelab-youtube-podcasts-to-audiobookshelf-pipeline/",
      "url": "https://pype.dev/homelab-youtube-podcasts-to-audiobookshelf-pipeline/",
      "title": "Homelab Youtube Podcasts to AudioBookShelf Pipeline",
      "content_text": "\nI wrote about using [[homelab-pinchflat]] for at-home mashup creation and a song flow\nfor church. But I use it for more than, that and here's another prime use case\n\nThere are podcasts on YouTube I want to follow - The Standup with Prime, or\nShawn Ryan's show. Basically I use pinchflat to download the audio and serve up\nthose files in ABS (audiobookshelf)\n",
      "summary": "I wrote about using homelab-pinchflat for at-home mashup creation and a song flow for church. But I use it for more than, that and here's another prime use case",
      "date_published": "2025-06-18T13:53:12Z",
      "date_modified": "2025-06-18T13:53:12Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "tech",
        "audiobookshelf",
        "pinchflat"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-705/",
      "url": "https://pype.dev/thoughts-705/",
      "title": "💭 neverjust",
      "content_text": "\n\u003ca href=\"https://www.neverjust.net/\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://www.neverjust.net/\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - neverjust\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://www.neverjust.net/\"\u003eneverjust\u003c/a\u003e\n\n---\n\nYour \"just\" comes from seeing only the surface of the problem. Like an iceberg, what's visible is just a fraction\n\nThis is a good reminder when discussing issues within a team or with your buddies... trivializing someone else's problem, in tech or out, it not a good look\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "Your \"just\" comes from seeing only the surface of the problem. Like an iceberg, what's visible is just a fraction This",
      "date_published": "2025-06-18T10:33:49Z",
      "date_modified": "2025-06-18T10:33:49Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "just",
        "dev",
        "tech",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/reflecting-on-bp-article-on-james-faith-and-works/",
      "url": "https://pype.dev/reflecting-on-bp-article-on-james-faith-and-works/",
      "title": "Reflecting on BP Article on James - Faith and Works",
      "content_text": "\n# Intro\n\n\u003e This started as one of [[my-thoughts]] and got long enough to warrant putting right in the blog\n\nFaith and works is a common point of conversation for Christians who like\ndebating things, and I'm at the point in my life where I'm kind of over the\ndebates and the simplistic thinking.... but this morning I saw this article and\nwanted to give it a read\n\n## Article\n\n[Article Link](https://bibleproject.com/articles/what-does-faith-without-works-dead-mean-james-214-26) - 11 minute read\n\nOne of the best pieces from the article is:\n\n!!! info \"\"\n    James illuminates and clarifies our understanding of faith by bypassing\n    questions about whether one has (or does not have) faith and focusing instead\n    on whether a person’s faith is living or dead.\n\n## Reflection\n\nThis snippet isn't incredibly profound on its own, but in my experience it hits hard\nI've been in many conversations about faith and works - and as I've written\nabout before in [[a-new-perspective-on-being-god-s-child]] Christians\ntoday have a deep desire to put things into neat and simple boxes but this is\noften a mistake. \nAnd in the case of faith and works I think it's just as\nprevalent for similar reasons I outlined in that post - a deep \"need\" to \"fully\nunderstand\" a system we participate in. \nHowever this usually comes lacking the accompanying nuance in understanding\n\"works\" and \"works of the law\" and \"work in order to be saved\".\n\n!!! warning \"To be very clear\"\n    The Bible is in no way contradictory in its teaching about faith and works\n    and salvation regardless of how wrong someone gets it... at the end of the day\n    Jesus picks who he picks. This in no way excuses the elect from performing good\n    works, but any good or bad \"works\" do nothing to change the reality of\n    salvation - the works merely reveal the truth\n\nI don't see tension in faith and works - James' statement \"faith without works\nis dead\" is so simple to me...\nJesus changes my life every day, and every day I make decisions based on that\nreality. \nIf I only talked about my faith, and never made a decision where I\nprioritized my faith over what I wanted - then do I really believe? \n\n!!! danger \"The answer is simple\"\n    Of course not.\n\n\n",
      "summary": "This started as one of my-thoughts and got long enough to warrant putting right in the blog",
      "date_published": "2025-06-18T06:00:15Z",
      "date_modified": "2025-06-18T06:00:15Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "bible-project",
        "faith",
        "reflection"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-701/",
      "url": "https://pype.dev/thoughts-701/",
      "title": "💭 A Brief History \u0026 Ethos of the Digital Garden",
      "content_text": "\n\u003ca href=\"https://maggieappleton.com/garden-history/\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://maggieappleton.com/garden-history/\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - A Brief History \u0026 Ethos of the Digital Garden\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://maggieappleton.com/garden-history/\"\u003eA Brief History \u0026 Ethos of the Digital Garden\u003c/a\u003e\n\n---\n\nI am interested in the topic of \"digital gardening\", and I didn't realize how long the term has been around. As a relatively new member of the blogging community I'd like to formulate my own understanding and continue to grow in practicing tending to what I put out their in the digi-space.\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "I am interested in the topic of \"digital gardening\", and I didn't realize how long the term has been around. As a relati",
      "date_published": "2025-06-17T11:56:10Z",
      "date_modified": "2025-06-17T11:56:10Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "digital-garden",
        "blog",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/source-up-for-nested-envrc/",
      "url": "https://pype.dev/source-up-for-nested-envrc/",
      "title": "source_up for nested .envrc",
      "content_html": "\u003ch1 id=\"tldr\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTLDR\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eI have a use case for nesting directories with cascading .envrc files. and ran\ninto an issue where the parent environment was being reset by the child\nenvironment. The fix is \u003ccode\u003esource_up\u003c/code\u003e\u003c/p\u003e\n\u003ch1 id=\"context\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eContext\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eI manage some infrastructure at home with a folder like this:\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\"\u003e├── homelab\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│   ├── .envrc\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│   └── stack1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│       ├── .envrc\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eI do this so that the \u0026ldquo;homelab-wide\u0026rdquo; terraform variables can be exported with\n\u003ccode\u003eTF_VAR_the_variable\u003c/code\u003e in the \u003ccode\u003ehomelab/.envrc\u003c/code\u003e and then the stack specific\nvariables in \u003ccode\u003estack1/.envrc\u003c/code\u003e get exported like \u003ccode\u003eTF_VAR_stack_specific_var\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eFor example, my cloudflare account id is needed in every stack, but the\ncloudflare zone id is different per stack - so instead of copying the account\nid var to every stack (however the vars are managed), I can set it in a parent\n.envrc and share it in nested stack directories\u003c/p\u003e\n\u003ch2 id=\"problem\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eProblem\u003c/span\u003e \u003ca href=\"#problem\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre\u003e\u003ccode\u003e# homelab/.envrc\n#!/bin/bash\nexport VAR_FOO=BAR\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eSo when I \u003ccode\u003ecd homelab\u003c/code\u003e I get\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003enic in /tmp/homelab   (dev) 󰒄 󱔎 NO PYTHON ENVIORNMENT SET\n⬢ [devbox] ❯ direnv allow\ndirenv: loading /tmp/homelab/.envrc\ndirenv: export +VAR_FOO\n\nnic in /tmp/homelab   (dev) 󰒄 󱔎 NO PYTHON ENVIORNMENT SET\n⬢ [devbox] ❯ env | grep VAR\nVAR_FOO=BAR\n\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eYou can see \u003ccode\u003eVAR_FOO\u003c/code\u003e is set\u0026hellip; but now I\u0026rsquo;ll \u003ccode\u003ecd stack1\u003c/code\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003enic in /tmp/homelab   (dev) 󰒄 󱔎 NO PYTHON ENVIORNMENT SET\n⬢ [devbox] ❯ cd stack1\ndirenv: error /tmp/homelab/stack1/.envrc is blocked. Run `direnv allow` to approve its content\n\nnic in /tmp/homelab/stack1   (dev) 󰒄 󱔎 NO PYTHON ENVIORNMENT SET\n⬢ [devbox] ❯ direnv allow\ndirenv: loading /tmp/homelab/stack1/.envrc\ndirenv: export +VAR_BAZ\n\nnic in /tmp/homelab/stack1   (dev) 󰒄 󱔎 NO PYTHON ENVIORNMENT SET\n⬢ [devbox] ❯ env | grep VAR\nVAR_BAZ=BAM\n\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eAs you can see \u003ccode\u003eVAR_FOO\u003c/code\u003e was unset, and \u003ccode\u003eVAR_BAZ\u003c/code\u003e is set\u0026hellip; so \u003ccode\u003ehomelab/.envrc\u003c/code\u003e was blown away!\u003c/p\u003e\n\u003ch2 id=\"fix\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFix\u003c/span\u003e \u003ca href=\"#fix\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eEdit \u003ccode\u003estack1/.envrc\u003c/code\u003e with a \u003ccode\u003esource_up\u003c/code\u003e command\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e# stack1/.envrc # NEW\n#!/bin/bash\nsource_up  # source the parent environment\nexport VAR_BAZ=BAM\n\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eAfter the edit\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003enic in /tmp/homelab/stack1   (dev) 󰒄 󱔎 NO PYTHON ENVIORNMENT SET\n⬢ [devbox] ❯ vim .envrc\ndirenv: error /tmp/homelab/stack1/.envrc is blocked. Run `direnv allow` to approve its content\n\nnic in /tmp/homelab/stack1   (dev) 󰒄 󱔎 NO PYTHON ENVIORNMENT SET  took 5s\n⬢ [devbox] ❯ direnv allow\ndirenv: loading /tmp/homelab/stack1/.envrc\ndirenv: loading /tmp/homelab/.envrc\ndirenv: export +VAR_BAZ +VAR_FOO\n\nnic in /tmp/homelab/stack1   (dev) 󰒄 󱔎 NO PYTHON ENVIORNMENT SET\n⬢ [devbox] ❯ env | grep VAR\nVAR_FOO=BAR\nVAR_BAZ=BAM\n\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eBoth vars are set!\u003c/p\u003e\n",
      "content_text": "\n# TLDR\n\nI have a use case for nesting directories with cascading .envrc files. and ran\ninto an issue where the parent environment was being reset by the child\nenvironment. The fix is `source_up`\n\n# Context\n\nI manage some infrastructure at home with a folder like this:\n\n```bash\n.\n├── homelab\n│   ├── .envrc\n│   └── stack1\n│       ├── .envrc\n```\n\nI do this so that the \"homelab-wide\" terraform variables can be exported with\n`TF_VAR_the_variable` in the `homelab/.envrc` and then the stack specific\nvariables in `stack1/.envrc` get exported like `TF_VAR_stack_specific_var`.\n\nFor example, my cloudflare account id is needed in every stack, but the\ncloudflare zone id is different per stack - so instead of copying the account\nid var to every stack (however the vars are managed), I can set it in a parent\n.envrc and share it in nested stack directories\n\n## Problem\n\n```\n# homelab/.envrc\n#!/bin/bash\nexport VAR_FOO=BAR\n```\n\nSo when I `cd homelab` I get\n\n```\nnic in /tmp/homelab   (dev) 󰒄 󱔎 NO PYTHON ENVIORNMENT SET\n⬢ [devbox] ❯ direnv allow\ndirenv: loading /tmp/homelab/.envrc\ndirenv: export +VAR_FOO\n\nnic in /tmp/homelab   (dev) 󰒄 󱔎 NO PYTHON ENVIORNMENT SET\n⬢ [devbox] ❯ env | grep VAR\nVAR_FOO=BAR\n\n```\n\nYou can see `VAR_FOO` is set... but now I'll `cd stack1`\n\n```\nnic in /tmp/homelab   (dev) 󰒄 󱔎 NO PYTHON ENVIORNMENT SET\n⬢ [devbox] ❯ cd stack1\ndirenv: error /tmp/homelab/stack1/.envrc is blocked. Run `direnv allow` to approve its content\n\nnic in /tmp/homelab/stack1   (dev) 󰒄 󱔎 NO PYTHON ENVIORNMENT SET\n⬢ [devbox] ❯ direnv allow\ndirenv: loading /tmp/homelab/stack1/.envrc\ndirenv: export +VAR_BAZ\n\nnic in /tmp/homelab/stack1   (dev) 󰒄 󱔎 NO PYTHON ENVIORNMENT SET\n⬢ [devbox] ❯ env | grep VAR\nVAR_BAZ=BAM\n\n```\n\nAs you can see `VAR_FOO` was unset, and `VAR_BAZ` is set... so `homelab/.envrc` was blown away!\n\n## Fix\n\nEdit `stack1/.envrc` with a `source_up` command\n\n```\n# stack1/.envrc # NEW\n#!/bin/bash\nsource_up  # source the parent environment\nexport VAR_BAZ=BAM\n\n```\n\nAfter the edit\n\n```\nnic in /tmp/homelab/stack1   (dev) 󰒄 󱔎 NO PYTHON ENVIORNMENT SET\n⬢ [devbox] ❯ vim .envrc\ndirenv: error /tmp/homelab/stack1/.envrc is blocked. Run `direnv allow` to approve its content\n\nnic in /tmp/homelab/stack1   (dev) 󰒄 󱔎 NO PYTHON ENVIORNMENT SET  took 5s\n⬢ [devbox] ❯ direnv allow\ndirenv: loading /tmp/homelab/stack1/.envrc\ndirenv: loading /tmp/homelab/.envrc\ndirenv: export +VAR_BAZ +VAR_FOO\n\nnic in /tmp/homelab/stack1   (dev) 󰒄 󱔎 NO PYTHON ENVIORNMENT SET\n⬢ [devbox] ❯ env | grep VAR\nVAR_FOO=BAR\nVAR_BAZ=BAM\n\n```\n\nBoth vars are set!\n",
      "summary": "I have a use case for nesting directories with cascading .envrc files. and ran into an issue where the parent environment was being reset by the child...",
      "date_published": "2025-06-17T09:52:17Z",
      "date_modified": "2025-06-17T09:52:17Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "tech",
        "direnv",
        "cli"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-700/",
      "url": "https://pype.dev/thoughts-700/",
      "title": "💭 Cross Account AWS Security Group ID Reference",
      "content_text": "\n\u003ca href=\"https://stackoverflow.com/questions/12465978/can-aws-security-groups-on-one-aws-account-reference-security-groups-in-another\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://stackoverflow.com/questions/12465978/can-aws-security-groups-on-one-aws-account-reference-security-groups-in-another\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - Cross Account AWS Security Group ID Reference\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://stackoverflow.com/questions/12465978/can-aws-security-groups-on-one-aws-account-reference-security-groups-in-another\"\u003eCross Account AWS Security Group ID Reference\u003c/a\u003e\n\n---\n\nI needed to update some ingress rules across several AWS accounts and ran into an issue when I had to reference a security group id in another account - turns out \u003caccountid\u003e/\u003csecuritygroupid\u003e is the money maker\n\nEDIT: this requires VPC Peering...\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "I needed to update some ingress rules across several AWS accounts and ran into an issue when I had to reference a securi",
      "date_published": "2025-06-16T20:56:57Z",
      "date_modified": "2025-06-16T20:56:57Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "aws",
        "infrastructure",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-699/",
      "url": "https://pype.dev/thoughts-699/",
      "title": "💭 Failed to load state: unsupported checkable object kind var - …",
      "content_text": "\n\u003ca href=\"https://discuss.hashicorp.com/t/failed-to-load-state-unsupported-checkable-object-kind-var/61844/2\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://discuss.hashicorp.com/t/failed-to-load-state-unsupported-checkable-object-kind-var/61844/2\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - Failed to load state: unsupported checkable object kind var - #2 by apparentlymart - Terraform - HashiCorp Discuss\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://discuss.hashicorp.com/t/failed-to-load-state-unsupported-checkable-object-kind-var/61844/2\"\u003eFailed to load state: unsupported checkable object kind var - #2 by apparentlymart - Terraform - HashiCorp Discuss\u003c/a\u003e\n\n---\n\nI have spacelift stacks managed with open tofu and stacks managed with terraform... Due to this very issue I think, I ran into a problem where a terraform-managed spacelift stack couldn't use the `terraform_remote_state` data resource to load the state of the open-tofu managed stacks because of state file differences\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "I have spacelift stacks managed with open tofu and stacks managed with terraform... Due to this very issue I think, I ra",
      "date_published": "2025-06-16T20:27:07Z",
      "date_modified": "2025-06-16T20:27:07Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "spacelift",
        "terraform",
        "infrastructure",
        "open-tofu",
        "tofu",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-698/",
      "url": "https://pype.dev/thoughts-698/",
      "title": "💭 Snowflake Status - Certificate Authority Update for AWS Regions",
      "content_text": "\n\u003ca href=\"https://status.snowflake.com/incidents/txclg2cyzq32\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://status.snowflake.com/incidents/txclg2cyzq32\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - Snowflake Status - Certificate Authority Update for AWS Regions\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://status.snowflake.com/incidents/txclg2cyzq32\"\u003eSnowflake Status - Certificate Authority Update for AWS Regions\u003c/a\u003e\n\n---\n\nA recent Snowflake issue borked some old pipelines - thankfully it appears to be a simple fix. Just goes to show you that you can't just deploy pipelines and expect them to live forever, they have to be maintained when there are ANY external dependencies\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "A recent Snowflake issue borked some old pipelines - thankfully it appears to be a simple fix. Just goes to show you tha",
      "date_published": "2025-06-16T16:37:12Z",
      "date_modified": "2025-06-16T16:37:12Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "snowflake",
        "tech",
        "python",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-697/",
      "url": "https://pype.dev/thoughts-697/",
      "title": "💭 Visualizing My Blog’s Internal Links - Jim Nielsen’s Blog",
      "content_text": "\n\u003ca href=\"https://blog.jim-nielsen.com/2022/visualizing-my-blogs-links/\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://blog.jim-nielsen.com/2022/visualizing-my-blogs-links/\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - Visualizing My Blog’s Internal Links - Jim Nielsen’s Blog\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://blog.jim-nielsen.com/2022/visualizing-my-blogs-links/\"\u003eVisualizing My Blog’s Internal Links - Jim Nielsen’s Blog\u003c/a\u003e\n\n---\n\nSomeday I will build a thing to see the relationship in my posts and notes. Right now I'm working on writing consistently, improving my tagging, using wikilinks, and just generally thinking about what I want my website to contain - and a mindmap like this would be just awesome\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "Someday I will build a thing to see the relationship in my posts and notes. Right now I'm working on writing consistentl",
      "date_published": "2025-06-16T11:26:29Z",
      "date_modified": "2025-06-16T11:26:29Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "blog",
        "mindmap",
        "links",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-696/",
      "url": "https://pype.dev/thoughts-696/",
      "title": "💭 Stable Diffusion QR Code 101",
      "content_text": "\n\u003ca href=\"https://antfu.me/posts/ai-qrcode-101\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://antfu.me/posts/ai-qrcode-101\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - Stable Diffusion QR Code 101\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://antfu.me/posts/ai-qrcode-101\"\u003eStable Diffusion QR Code 101\u003c/a\u003e\n\n---\n\nMy brother asked me to generate some QR codes for his link page that I manage. It's been a long time since I've used SD to make codes, and for the life of me I cannot find my notes anywhere... That unfortunate disorganization aside I think I followed Anthony's guides before, and they've only gotten better... \nTime to get prompting!\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "My brother asked me to generate some QR codes for his link page that I manage. It's been a long time since I've used SD",
      "date_published": "2025-06-16T11:24:46Z",
      "date_modified": "2025-06-16T11:24:46Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "stable-diffusion",
        "qr",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/father-s-day-2025/",
      "url": "https://pype.dev/father-s-day-2025/",
      "title": "Father’s Day 2025",
      "content_text": "\n# Intro\n\nI just wanted to capture some thoughts on Father's\nDay and how becoming a dad and raising two beautiful kids has affected my view\non, or matured my view of, my relationship with God and how He sees me.\nBecause, biblically speaking, the father metaphor is very common and prominent\nfor Yahweh. He's many things to His chosen people. But the theology of adoption\nmakes the father model and metaphor a really good one. And being a dad,\nI feel like I've learned a lot.\n\n# The Childlike Position Before God\n\nThis is pretty related to the last post of mine [[a-new-perspective-on-being-god-s-child]] \nwhere the crux of that post is that, as smart as we might think we\nare as educated theologians, in the eyes of God we're still just children. And\nI mean that we should think that our understanding of our complex topics, is\nstill the level of a child in relation to God. And so in that\nsame vein I'm asking \n\n!!! warning \"\"\n    \"In what other ways am I like a child to God?\" \n\nSo again today, I'm making sure to process some of these thoughts.\n\n## Babies and Who Am I?\n\nI remember both of my kids as babies would get overtired, and they'd be so\ntired that they couldn't fall asleep. And I would look at them and go - \"this\ndoesn't make sense. Your body knows you need sleep, you know you need sleep,\nbut what does it mean to be too tired? You can't fall asleep. And you just yell\nand scream at me.\" But that baby doesn't know that I'm their dad, they don't\nknow anything. They're just overtired, and they're yelling and screaming. It's\njust my job to protect them in that moment, comfort them, whatever. And I\nthought, \"man, this just has to be how God sees me sometimes.\" Even though I've\nbeen walking with the Lord for decades there's got to be\ntimes when I'm just throwing a tantrum. \n\n!!! info \"And that's how God sees me\"\n    as a creature he loves, who's just too tired to take a nap. And it's a\n    humbling thing to think that that's really sometimes how God sees me.\n\n# Unconditional Love \u0026 Disobedience\n\nAs my kids have gotten older, I think that I've picked up on other truths\nof the Lord - mainly how he can love me even when I sin... Even when my daughters\ndisobey, it doesn't change my love for them. I just had an experience today with\nmy daughter who climbed up too high on a swing set on a trapeze bar and\ncouldn't get herself down. And although it got tense and there was some shouting to handle, I eventually walked her through a few things:\n\n1. I told her not to get up there, and she disobeyed.\n2. By disobeying, she put herself into a dangerous and scary situation.\n3. I would help her in her scary situation, but my help might not look like how she wants it to look\n4. The help I can provide is to not remove her from the situation, i.e. to pick her up and just save her, but I could help her climb down and give her instruction.\n5. Finally, she needs to choose to trust me, even though she'll still be scared, and she needs to choose to trust me, even when I'm not standing where\nshe wants me to stand, or putting my hand where she wants me to put my hand, so\nthat she feels safe. \n\n!!! info \"Guidance Over Rescue \u0026 The Need for Trust\"\n    I need her to know that she is safe, and to trust that I tell her she is\n    safe, even when she doesn't see it or feel it. And that is what God requests\n    and demands of me, is to trust him more than I might be fearful of my future,\n    financially, or of relational security, or whatever.\n\n## Acting in Obedience Despite Fear\n\nThat trust doesn't necessarily take away the fear, but it does mean that you\nbehave obediently and act in accordance with the reality, not with the fear.\nThe reality is that Yahweh loves and protects me, just as I love and protect my\ndaughter, even when she was scared on the trapeze bar.\n\n# End\n\nSo Father's Day is, for me, a good time to just reflect on what that means to\nbe a dad. I'm not going to celebrate and do anything crazy. My family isn't\ngoing to, because I don't want us to. But this is a nice reminder, perhaps I\nshould do this more purposefully, more often, is reflect on how\nGod teaches me about his love for me through giving me a deep love for my\nchildren.\n",
      "summary": "I just wanted to capture some thoughts on Father's Day and how becoming a dad and raising two beautiful kids has affected my view on, or matured my view of,...",
      "date_published": "2025-06-15T09:02:09Z",
      "date_modified": "2025-06-15T09:02:09Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "reflection",
        "fathers-day"
      ]
    },
    {
      "id": "https://pype.dev/u-blue-aurora-upgrade-broke-hwa-docker/",
      "url": "https://pype.dev/u-blue-aurora-upgrade-broke-hwa-docker/",
      "title": "U-Blue Aurora Upgrade Broke HWA Docker",
      "content_html": "\u003cp\u003eI use Universal Blue\u0026rsquo;s \u003ca href=\"https://getaurora.dev/en\"\u003eAurora\u003c/a\u003e distribution on my daily driver desktop, and\nI rebooted today which led what I imagine is a kernel update. This broke all of\nmy docker containers using a GPU.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003envidia-container-cli: detection error: open failed: /usr/lib/libnvidia-tls.so.570.153.02: no such file or directory: unknown\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThankfully a reboot and booting into the older environment fixes everything\u0026hellip;\nLinux and immutability FTW\u003c/p\u003e\n\u003ch2 id=\"related\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRelated\u003c/span\u003e \u003ca href=\"#related\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://universal-blue.discourse.group/t/cannot-use-nvidia-runtime-in-docker-since-update-to-fedora-42/8812/3\"\u003eDiscorse Thread\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\nI use Universal Blue's [Aurora](https://getaurora.dev/en) distribution on my daily driver desktop, and\nI rebooted today which led what I imagine is a kernel update. This broke all of\nmy docker containers using a GPU.\n\n```\nnvidia-container-cli: detection error: open failed: /usr/lib/libnvidia-tls.so.570.153.02: no such file or directory: unknown\n```\n\nThankfully a reboot and booting into the older environment fixes everything...\nLinux and immutability FTW\n\n## Related\n\n* [Discorse Thread](https://universal-blue.discourse.group/t/cannot-use-nvidia-runtime-in-docker-since-update-to-fedora-42/8812/3)\n\n",
      "summary": "I use Universal Blue's Aurora distribution on my daily driver desktop, and I rebooted today which led what I imagine is a kernel update. This broke all of my...",
      "date_published": "2025-06-15T08:42:09Z",
      "date_modified": "2025-06-15T08:42:09Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "tech",
        "universal-blue"
      ]
    },
    {
      "id": "https://pype.dev/test-styles/",
      "url": "https://pype.dev/test-styles/",
      "title": "Test Styles",
      "content_html": "\u003ch1 id=\"test-title-heading\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTest Title Heading\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eContent fooo bar\u003c/p\u003e\n\u003ch2 id=\"test-sub-heading\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTest Sub Heading\u003c/span\u003e \u003ca href=\"#test-sub-heading\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"test-sub-sub-heading\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTest Sub Sub Heading\u003c/span\u003e \u003ca href=\"#test-sub-sub-heading\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch4 id=\"test-sub-sub-sub-heading\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTest Sub Sub Sub Heading\u003c/span\u003e \u003ca href=\"#test-sub-sub-sub-heading\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003ch5 id=\"test-sub-sub-sub-sub-heading\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTest Sub Sub Sub Sub Heading\u003c/span\u003e\u003c/h5\u003e\n\u003cblockquote\u003e\n\u003cp\u003eBlockquote\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003ccode\u003ein line code\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://pype.dev\"\u003eLink\u003c/a\u003e\u003c/p\u003e\n\u003cfigure\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250613203559_6470ff5a.png\" alt=\"20250613203559_6470ff5a.png\"\u003e\n\u003c/figure\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"nn\"\u003eos\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=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eos\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eenviron\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;PATH\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eresource\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;cloudflare_pages_domain\u0026#34; \u0026#34;cf_domain\u0026#34;\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003e  account_id\u003c/span\u003e   \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003elocal\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"k\"\u003eaccount_id\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003e  project_name\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003ecloudflare_pages_project\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"k\"\u003ebuild_config\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"k\"\u003ename\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003e  domain\u003c/span\u003e       \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;pype.dev\u0026#34;\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\u003c/code\u003e\u003c/pre\u003e\u003cdiv class=\"admonition success\"\u003e\n\u003cp class=\"admonition-title\"\u003ea success message\u003c/p\u003e\n\u003cp\u003eThis is a success message\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition info\"\u003e\n\u003cp class=\"admonition-title\"\u003ean info message\u003c/p\u003e\n\u003cp\u003eThis is an info message\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition warning\"\u003e\n\u003cp class=\"admonition-title\"\u003ea warning message\u003c/p\u003e\n\u003cp\u003eThis is a warning message\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition danger\"\u003e\n\u003cp class=\"admonition-title\"\u003ea danger message\u003c/p\u003e\n\u003cp\u003eThis is a danger message\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003e!!! question \u0026ldquo;a question message\u0026rdquo;\nThis is a question message\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003ea note message\u003c/p\u003e\n\u003cp\u003eThis is a note message\u003c/p\u003e\n\u003c/div\u003e\n\u003cdetails class=\"admonition info\"\u003e\n\u003csummary class=\"admonition-title\"\u003ean info message\u003c/summary\u003e\n\u003cp\u003eThis is an info message\u003c/p\u003e\n\u003c/details\u003e\n",
      "content_text": "\n\n# Test Title Heading\n\nContent fooo bar\n\n## Test Sub Heading\n\n### Test Sub Sub Heading\n\n#### Test Sub Sub Sub Heading\n\n##### Test Sub Sub Sub Sub Heading\n\n\n\u003e Blockquote\n\n`in line code`\n\n[Link](https://pype.dev)\n\n![20250613203559_6470ff5a.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250613203559_6470ff5a.png)\n\n```python\nimport os\n\nprint(os.environ['PATH'])\n```\n\n```hcl\nresource \"cloudflare_pages_domain\" \"cf_domain\" {\n  account_id   = local.account_id\n  project_name = cloudflare_pages_project.build_config.name\n  domain       = \"pype.dev\"\n}\n```\n\n!!! success \"a success message\"\n    This is a success message\n\n!!! info \"an info message\"\n    This is an info message\n\n!!! warning \"a warning message\"\n    This is a warning message\n\n!!! danger \"a danger message\"\n    This is a danger message\n\n!!! question \"a question message\"\n    This is a question message\n\n!!! note \"a note message\"\n    This is a note message\n\n??? info \"an info message\"\n    This is an info message",
      "summary": "Content fooo bar",
      "date_published": "2025-06-14T16:03:50Z",
      "date_modified": "2025-06-14T16:03:50Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "test"
      ]
    },
    {
      "id": "https://pype.dev/homelab-pinchflat/",
      "url": "https://pype.dev/homelab-pinchflat/",
      "title": "Homelab Pinchflat",
      "content_text": "\n# Why?\n\nI've written about [[self-hosted-media]] before and addressed some thoughts with YouTube. \n\nLately though I've had 2 use cases for offline YouTube media and I'm now\nsolving this problem by using [pinchflat](https://pinchflat.com/) as my `ytdl`\nsolution + file system organization for use throughout my homelab.\n\n## Use Case 1\n\nAt church we use pre-recorded music to sing along to, or at least we used to,\nthankfully as of June 2025 we're doing live-music every week. But in the before\ntimes I would strip the audio out of song files we had purchased and then made\nlyric videos with the instrumental tracks. As we wanted to try new songs out we\ndidn't want to purchase them in case they didn't work out for us to use and\nthat ends up being a waste (church budget is very tight). So using songs\navailable on YouTube is an easy solution, but the only way to strip the vocals\nand see if the song sounded right with our singers and equipment was to make\nthe lyric video and rehearse it... Chicken or Egg problem unless we can freely\ntry it before purchasing... So using Pinchflat we can download songs in that\nplaylist, I can edit the files, the team can try it out, and if we like it we\ncan use it without hitting the budget any harder than necessary.\n\n\u003e Pinchflat syncs that playlist to a folder on my NAS that another process\n\u003e watches and performs the audio stripping workflow\n\n## Use Case 2\n\nI just wrote about [[if-you-want-something-make-it-so-song-style]] which is the\nsecond use case - cutting mashups of my favorite songs on youtube and then\nhosting them myself for easy listening\n\n# The Setup\n\nI run it in docker compose like practically all my other services\n\n```yml\nservices:\n  pinchflat:\n    container_name: \"pinchflat\"\n    image: \"ghcr.io/kieraneglin/pinchflat:latest\"\n    ports:\n      - \"8945:8945\"\n    volumes:\n      - \"/tank/encrypted/docker/the-pit-zfs/pinchflat/config:/config:rw\"\n      - \"/tank/encrypted/nas/media/downloads/pinchflat/downloads:/downloads:rw\"\n    environment:\n      TZ: \"America/Chicago\"\n      PUID: \"1000\"\n      PGID: \"1000\"\n    restart: unless-stopped\n    deploy:\n      resources:\n        limits:\n          memory: \"4g\"\n```\n\n# The GUI\n\nThe WebUI is easy to navigate - you organize your downloads however you want with \"sources\", and here's how I setup the source for these mashups that I want to edit... I add them to my playlist and Pinchflat grabs them for me automatically\n![20250614144201_fa16e7ac.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250614144201_fa16e7ac.png)\n\n![20250614144307_bdf12ee0.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250614144307_bdf12ee0.png)\n\nThat's basically it - then as you can see in the compose file, I get the files in a folder on my NAS and from there I can edit them as I need.\n\n## Example\n\nThe church app that does the audio processing is in a compose stack with the\npinchflat download directory on the host mounted in - this is how containers in\ndifferent stacks can share data, by sharing a filesystem bind mount\n\n```yml\nservices:\n  olivet_watcher_app:\n    image: pypeaday/vocal-remover-watcher\n    container_name: olivet-youtube-watcher\n    volumes:\n      - /tank/encrypted/nas/media/downloads/pinchflat/downloads:/input:ro\n      - /tank/encrypted/docker/vocal_remover_app/watcher-app/processed_mp3s:/output\n      - /tank/encrypted/docker/vocal_remover_app/watcher-app/db:/data\n    working_dir: /app\n```\n\n",
      "summary": "I've written about self-hosted-media before and addressed some thoughts with YouTube.",
      "date_published": "2025-06-14T08:51:21Z",
      "date_modified": "2025-06-14T08:51:21Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/if-you-want-something-make-it-so-song-style/",
      "url": "https://pype.dev/if-you-want-something-make-it-so-song-style/",
      "title": "If You Want Something Make It So - Song Style",
      "content_text": "\nIn grad school a professor of mine, Mark Hunacek, said one of the most profound\nthings I've ever heard to the tune \"if you want it, then make it so\"... It's a\ngreat benefit to mathematicians at the bar to start a conversation with \"hey\nlet's assume X because we can\"...\n\nThis phrase has affected my work greatly to the work I do and how I go about it- \nit's literally changed how I design some of my code. But I also want this\nmantra to flow into other parts of my life...\n\n\u003e So here's a post about how I use Pinchflat and Davinci Resolve to tickle my\n\u003e brain with bespoke versions of beautifully crafted mashups\n\nIn this example I took a Goobsie mashup, cut the part I didn't like quite as\nmuch (though admittedly it's still beautiful) and spliced it with itself to\ngive me a longer running version of a musical piece that takes me to another\nworld...\n\n[OG Youtube Mashup](https://www.youtube.com/watch?v=7v7nreDnmDg)\n\n## Acquiring the Media\n\nPinchflat isn't really necessary here, anyone can use `youtubedl` or another\ntool to download from YouTube. I do use Pinchflat to subscribe to Youtube\nplaylists to automate this process for me. See more about that in\n[[homelab-pinchflat]]\n\n## Creating the Mashup\n\nSo Goobsie makes actually good mashups, and I'm not anything even remotely close to an audio engineer or whatever, but there's a segment of this song that just strikes my whole body in a unique way and I want to sometimes just listen to it conveniently... So enter Davinci Resolve... Basically I took the downloaded file, added it twice to a timeline, and then faded in and out until it sounded ok to me.\n\n![20250614135418_b75bc26a.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250614135418_b75bc26a.png)\n\n## Listening to the Mashup\n\nSo now how do I listen to this?\n\nFor the moment, it's a favorite in my Jellyfin library and I listen through\nthat client. It's a TODO item for me to set-up a more music-centric streaming\nservice\n\n\n!!! info \"Go Forth\"\n    So Go Forth - and if you want something, make it so",
      "summary": "In grad school a professor of mine, Mark Hunacek, said one of the most profound things I've ever heard to the tune \"if you want it, then make it so\"... It's...",
      "date_published": "2025-06-14T08:44:14Z",
      "date_modified": "2025-06-14T08:44:14Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "tech",
        "series-if-you-want-it-make-it-so",
        "music"
      ]
    },
    {
      "id": "https://pype.dev/slash-pages/",
      "url": "https://pype.dev/slash-pages/",
      "title": "About Me",
      "content_html": "\u003ch1 id=\"about-me\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAbout Me\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eHey, I\u0026rsquo;m Nic. Welcome to my little corner of the internet.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m a platform engineer who loves homelabbing, automation, and figuring out how things work. I also write about faith, life, and whatever\u0026rsquo;s on my mind.\u003c/p\u003e\n\u003ch2 id=\"what-is-this-site\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhat is this site?\u003c/span\u003e \u003ca href=\"#what-is-this-site\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThis is my public mental datalake—a space where I share thoughts on technology, faith, and life. The posts here range from technical tutorials to personal reflections.\u003c/p\u003e\n\u003ch2 id=\"slash-pages\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSlash Pages\u003c/span\u003e \u003ca href=\"#slash-pages\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eYou might have noticed URLs like \u003ccode\u003e/now\u003c/code\u003e, \u003ccode\u003e/uses\u003c/code\u003e, or \u003ccode\u003e/about\u003c/code\u003e. These are called \u003ca href=\"https://slashpages.net/\"\u003eslash pages\u003c/a\u003e — a simple, elegant way to share information about yourself using just a URL.\u003c/p\u003e\n\u003cp\u003eThey\u0026rsquo;re inspired by the \u0026ldquo;slash\u0026rdquo; convention popularized by people like Derek Sivers. Instead of having to navigate through menus, you can just share a link like \u003ccode\u003epype.dev/uses\u003c/code\u003e and people instantly see what tech I use.\u003c/p\u003e\n\u003ch3 id=\"my-slash-pages\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMy Slash Pages\u003c/span\u003e \u003ca href=\"#my-slash-pages\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eHere are some of my slash pages:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"/now\"\u003e/now\u003c/a\u003e\u003c/strong\u003e — What I\u0026rsquo;m currently focused on\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"/uses\"\u003e/uses\u003c/a\u003e\u003c/strong\u003e — My current setup and tools\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"/wants\"\u003e/wants\u003c/a\u003e\u003c/strong\u003e — Things I\u0026rsquo;m hoping to get/do\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"/about\"\u003e/about\u003c/a\u003e\u003c/strong\u003e — More about who I am\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"/contact\"\u003e/contact\u003c/a\u003e\u003c/strong\u003e — How to reach me\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"/feeds\"\u003e/feeds\u003c/a\u003e\u003c/strong\u003e — Other feeds I follow\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eYou can also browse all my slash pages at \u003ca href=\"/slash\"\u003e/slash\u003c/a\u003e.\u003c/p\u003e\n\u003ch2 id=\"how-to-reach-me\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHow to Reach Me\u003c/span\u003e \u003ca href=\"#how-to-reach-me\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eEmail: \u003ca href=\"mailto:nic@pype.dev\"\u003enic@pype.dev\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eGitHub: \u003ca href=\"https://github.com/pypeaday\"\u003epypeaday\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDigital Harbor: \u003ca href=\"https://mydigitalharbor.com/pypeaday\"\u003epypeaday\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cem\u003eThanks for stopping by!\u003c/em\u003e\u003c/p\u003e\n",
      "content_text": "\n# About Me\n\nHey, I'm Nic. Welcome to my little corner of the internet.\n\nI'm a platform engineer who loves homelabbing, automation, and figuring out how things work. I also write about faith, life, and whatever's on my mind.\n\n## What is this site?\n\nThis is my public mental datalake—a space where I share thoughts on technology, faith, and life. The posts here range from technical tutorials to personal reflections.\n\n## Slash Pages\n\nYou might have noticed URLs like `/now`, `/uses`, or `/about`. These are called [slash pages](https://slashpages.net/) — a simple, elegant way to share information about yourself using just a URL.\n\nThey're inspired by the \"slash\" convention popularized by people like Derek Sivers. Instead of having to navigate through menus, you can just share a link like `pype.dev/uses` and people instantly see what tech I use.\n\n### My Slash Pages\n\nHere are some of my slash pages:\n\n- **[/now](/now)** — What I'm currently focused on\n- **[/uses](/uses)** — My current setup and tools\n- **[/wants](/wants)** — Things I'm hoping to get/do\n- **[/about](/about)** — More about who I am\n- **[/contact](/contact)** — How to reach me\n- **[/feeds](/feeds)** — Other feeds I follow\n\nYou can also browse all my slash pages at [/slash](/slash).\n\n## How to Reach Me\n\n- Email: [nic@pype.dev](mailto:nic@pype.dev)\n- GitHub: [pypeaday](https://github.com/pypeaday)\n- Digital Harbor: [pypeaday](https://mydigitalharbor.com/pypeaday)\n\n---\n\n*Thanks for stopping by!*\n",
      "summary": "Hey, I'm Nic. Welcome to my little corner of the internet.",
      "date_published": "2025-06-13T20:58:00Z",
      "date_modified": "2025-06-13T20:58:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "slash"
      ]
    },
    {
      "id": "https://pype.dev/now/",
      "url": "https://pype.dev/now/",
      "title": "Now",
      "content_text": "\nStarted on [[2025-07-16-notes]] using this page for my \"don't lose sight of the projects you're touching\"\n\n## Writing\n\n- [x] [[gods-zeal-for-justice-amont-men-displayed-in-the-divine-counsel]]\n- [[desktop-crash-2026]]\n- [[desktop-setup-2026]]\n- [[dataops]]\n- [x] [[panicking-led-to-losing-my-desktop]]\n- note on [[blog-and-llm-knowledge-base]], should turn this into a plan\n  - doing it at work?\n\n## Lost but potentially recoverable\n\n- [[consider-the-point]]\n- [[self-hosting-a-code-forge-with-forgejo]]\n- [[should-data-models-be-fat]]\n\n- I want to start writing about some parenting concepts\n  - discipline vs consequences vs punishment is one concept\n    - [x] [[consequences-discipline-and-punishment]]\n  - love and the \"greater will\" for your child\n    - goes hand-in-hand with something like \"it's good for your child to suffer\"\n\n## Hot\n\n- bookorbit for Kassia\n- [[notifiq]]\n- [[soonish]]\n- [[mindful]]\n- [[quadtask]]\n- [[qr-harbor]]\n- [[cannalyze]]\n  - josh's site redirects still, it isn't his url so I still need to fix that\n\n## BUGS\n\n- repoflow bug... when my library is set to private, I can login and push from forgejo with my bot account. if I make the library public, then the push fails from forgejo with 401\n\n## Runescape\n\n- [x] [Monkey Madness 1](https://oldschool.runescape.wiki/w/Monkey_Madness_I)\n  - post on runelite plugins again\n  - safespot the gorillas in the temple\n    ![20251130112234_945c685a.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20251130112234_945c685a.png)\n    ![20251130122758_a8f58b1b.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20251130122758_a8f58b1b.png)\n\n- [ ] RTB Gnome quest\n  - can't get ice gloves until 50 mining\n  - got the cake\n\n- ## Migrating my homelab stuff to a mono repo\n\n  - [kanboard ticket for skm backup](https://kanboard.paynepride.com/?controller=TaskViewController\u0026action=show\u0026task_id=247\u0026project_id=8)\n  - [kanboard ticket for homelab mono migration](https://kanboard.paynepride.com/task/109)\n\n## Dev\n\n- [ ] need to clean up old repos like doomlab7/homelab-mono for example. I archived it but there's no point in keeping it around I think\n- [ ] [[thoughts-to-nostr]]\n\n## Auth\n\n- [LLDAP github repo](https://github.com/lldap/lldap/blob/main/docs/install.md#with-docker)\n- authelia?\n\n## Warm\n\n- epub audiobooks for Amanda\n\n- [[homelab-as-a-service]] -- product idea\n- started [[autism-and-steadfast-faith]]\n  - add repoflow post/writing in this same stream\n\n- [[compose-stack-example-repo-x-package-manager]]\n\n## Cold\n\nHaven't forgotten about [[cronicle]]\n\nI built a fun self-hosted weather app [[dad-can-i-wear-this]]\n",
      "summary": "Started on 2025-07-16-notes using this page for my \"don't lose sight of the projects you're touching\"",
      "date_published": "2025-06-13T20:58:00Z",
      "date_modified": "2025-06-13T20:58:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "now",
        "slash"
      ]
    },
    {
      "id": "https://pype.dev/feeds/",
      "url": "https://pype.dev/feeds/",
      "title": "Feeds",
      "content_html": "\u003cp\u003eI write about things I find interesting, here\u0026rsquo;s a list of my feeds:\u003c/p\u003e\n\u003cp\u003eQ: Jinja here over my markata feeds?\u003c/p\u003e\n",
      "content_text": "\nI write about things I find interesting, here's a list of my feeds:\n\nQ: Jinja here over my markata feeds?\n\n",
      "summary": "I write about things I find interesting, here's a list of my feeds:",
      "date_published": "2025-06-13T20:58:00Z",
      "date_modified": "2025-06-13T20:58:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "slash"
      ]
    },
    {
      "id": "https://pype.dev/contact/",
      "url": "https://pype.dev/contact/",
      "title": "Contact",
      "content_html": "\u003ch1 id=\"contact-me\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eContact Me\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eYou can find more places to find me at \u003ca href=\"https://mydigitalharbor.com/pypeaday\"\u003emy digital harbor\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"email\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEmail\u003c/span\u003e \u003ca href=\"#email\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eYou can also email me at \u003ca href=\"mailto:nic@pype.dev\"\u003enic@pype.dev\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"github\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGitHub\u003c/span\u003e \u003ca href=\"#github\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eYou can find me on GitHub at \u003ca href=\"https://github.com/pypeaday\"\u003epypeaday\u003c/a\u003e\u003c/p\u003e\n",
      "content_text": "\n# Contact Me\n\nYou can find more places to find me at [my digital harbor](https://mydigitalharbor.com/pypeaday)\n\n## Email\n\nYou can also email me at \u003cnic@pype.dev\u003e\n\n## GitHub\n\nYou can find me on GitHub at [pypeaday](https://github.com/pypeaday)\n",
      "summary": "You can find more places to find me at my digital harbor",
      "date_published": "2025-06-13T20:58:00Z",
      "date_modified": "2025-06-13T20:58:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "slash",
        "contact"
      ]
    },
    {
      "id": "https://pype.dev/about/",
      "url": "https://pype.dev/about/",
      "title": "About",
      "content_text": "\n# Me\n\nI'm a tech nerd who's been homelabbing since 2019 - I got started with pi-hole\nand it's been all downhill ever since... see [[the-homelab]] for more info. I\nwrite about things in the tech world as I've been thrust into it via hobbies\nand work, and I also write about things related to theology and Christianity.\nJesus changes my life everyday and I try to write about some of that for my own\nprocessing and perhaps my thoughts will be encouraging to someone who stumbles\nacross them\n\n## Work\n\nI work primarily as a platform engineer supporting data scientists and app\ndevelopers deploy their code on kubernetes based systems\n\n## Hobbies\n\n???+ note \"Homelabbing\"\n\n    - [[the-homelab]]\n    - [[homelab-journey-part-1]]\n\n???+ note \"BJJ\"\n\n    I got my blue belt in BJJ July 2023 (should blog about my BJJ experience...)\n\n## Family\n\nI have one.\n\n## More\n\nCheck out [[slash]] pages for more about-related info or hit up some feeds from the [homepage](https://pype.dev) to explore\n",
      "summary": "I'm a tech nerd who's been homelabbing since 2019 - I got started with pi-hole and it's been all downhill ever since... see the-homelab for more info. I...",
      "date_published": "2025-06-13T20:58:00Z",
      "date_modified": "2025-06-13T20:58:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "slash"
      ]
    },
    {
      "id": "https://pype.dev/quadtask/",
      "url": "https://pype.dev/quadtask/",
      "title": "QuadTask",
      "content_html": "\u003cp\u003eQuadTask is a simple productivity app that I\u0026rsquo;m sure will bring in $0 towards my retirement but a few friends use it and it\u0026rsquo;s a fun project to use as fodder for learning how to pair program with AI.\u003c/p\u003e\n\u003cp\u003e\u003cdel\u003eThe app is live here - \u003ca href=\"https://quadtask.app\"\u003equadtask.app\u003c/a\u003e\u003c/del\u003e\u003c/p\u003e\n\u003cp\u003eThe app is live here - \u003ca href=\"https://quadtask.fly.dev\"\u003equadtask.fly.dev\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"updates\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUpdates\u003c/span\u003e \u003ca href=\"#updates\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003eI can add SMS notifications with the SMTP trick\u003c/li\u003e\n\u003cli\u003eretire quadtask.app and just have it live on fly\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"new-updatess\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNew Updatess\u003c/span\u003e \u003ca href=\"#new-updatess\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eRebuild as a notifiq app\n\u003cul\u003e\n\u003cli\u003eincludes translating quadtask\u0026rsquo;s schema into event.content or adding tables to notifiq\u003c/li\u003e\n\u003cli\u003edb clean up to get rid of my DDOS artifacts\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\nQuadTask is a simple productivity app that I'm sure will bring in $0 towards my retirement but a few friends use it and it's a fun project to use as fodder for learning how to pair program with AI.\n\n~~The app is live here - [quadtask.app](https://quadtask.app)~~\n\nThe app is live here - [quadtask.fly.dev](https://quadtask.fly.dev)\n\n## Updates\n\n1. I can add SMS notifications with the SMTP trick\n2. retire quadtask.app and just have it live on fly\n\n## New Updatess\n\n- Rebuild as a notifiq app\n  - includes translating quadtask's schema into event.content or adding tables to notifiq\n  - db clean up to get rid of my DDOS artifacts\n",
      "summary": "Eisenhower Matrix based task manager",
      "date_published": "2025-06-13T20:58:00Z",
      "date_modified": "2025-06-13T20:58:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "projects"
      ]
    },
    {
      "id": "https://pype.dev/dad-can-i-wear-this/",
      "url": "https://pype.dev/dad-can-i-wear-this/",
      "title": "Dad, Can I Wear This?",
      "content_html": "\u003cp\u003e\u003ca href=\"https://github.com/pypeaday/dad-can-i-wear-this\"\u003eRepo\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThis is a simple FastAPI web app you can \u003ccode\u003edocker compose up\u003c/code\u003e alongside ollama and get some cute AI driven weather suggestions for the day.\u003c/p\u003e\n\u003cfigure\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250614121103_997fe18d.png\" alt=\"20250614121103_997fe18d.png\"\u003e\n\u003c/figure\u003e\n\u003cfigure\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250614121122_39376fa1.png\" alt=\"20250614121122_39376fa1.png\"\u003e\n\u003c/figure\u003e\n\u003ch2 id=\"version-2\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eVersion 2\u003c/span\u003e \u003ca href=\"#version-2\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cfigure\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250919212136_319c1006.png\" alt=\"20250919212136_319c1006.png\"\u003e\n\u003c/figure\u003e\n",
      "content_text": "\n[Repo](https://github.com/pypeaday/dad-can-i-wear-this)\n\nThis is a simple FastAPI web app you can `docker compose up` alongside ollama and get some cute AI driven weather suggestions for the day.\n\n![20250614121103_997fe18d.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250614121103_997fe18d.png)\n\n![20250614121122_39376fa1.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250614121122_39376fa1.png)\n\n## Version 2\n\n![20250919212136_319c1006.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250919212136_319c1006.png)\n",
      "summary": "Repo",
      "date_published": "2025-06-13T20:58:00Z",
      "date_modified": "2025-06-13T20:58:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "projects"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-691/",
      "url": "https://pype.dev/thoughts-691/",
      "title": "💭 Normal boyhood is ADHD",
      "content_text": "\n\u003ca href=\"https://world.hey.com/dhh/normal-boyhood-is-adhd-a9593488\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://world.hey.com/dhh/normal-boyhood-is-adhd-a9593488\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - Normal boyhood is ADHD\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://world.hey.com/dhh/normal-boyhood-is-adhd-a9593488\"\u003eNormal boyhood is ADHD\u003c/a\u003e\n\n---\n\nI may want to write a longer post about this or just capture some quick thoughts but I appreciate DHH's take here.... ADHD _diagnosis_ is an epidemic... Humans are different and I think we should seek to build society that makes space for differences, rather than medicating everyone into more or less the same robotic blog to work and pay taxes.\n\nHowever I came across this post on another platform with commenting, and most of the commentators were upset with the post saying things like \"tell me you have no idea what ADHD is without telling me\" and long explanation of honestly regurgitated talking points from a very pro-pharma worldview position... it's kind of a chicken or egg thing to me - because you don't have to be a doctor to read and do your own research, and to \"just trust the experts\" is the most unscientific saying in history... but the folks criticizing this post claiming DHH is speaking out of turn are taking JUST as arrogant approach to ADHD or mental health, only they put more faith in a medical community (which I've written about a little and am sus of due to the money), but they put ZERO faith in their own ability to think critically or observe patterns about the world...\n\nThanks DHH for the thoughts here, as a guy recently diagnosed with ADHD and Autism I've done my own reflection and simply agree with a lot of what he puts down here\n\n\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "I may want to write a longer post about this or just capture some quick thoughts but I appreciate DHH's take here.... AD",
      "date_published": "2025-06-13T10:58:01Z",
      "date_modified": "2025-06-13T10:58:01Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "dhh",
        "adhd",
        "mental-health",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/zsa-typing-challenge-issue/",
      "url": "https://pype.dev/zsa-typing-challenge-issue/",
      "title": "ZSA typing challenge issue",
      "content_html": "\u003ch1 id=\"zsa\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eZSA\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eI love \u003ca href=\"https://zsa.io\"\u003ezsa\u003c/a\u003e and have been using a moonlander for a few years now.\u003c/p\u003e\n\u003cp\u003eThey recently launched \u003ca href=\"https://typ.ing\"\u003etyp.ing\u003c/a\u003e as a way to train your typing skills - it\u0026rsquo;s a lot like \u003ca href=\"https://monkeytype.com\"\u003emonkeytype\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eI have a thought about it \u003ca href=\"https://thoughts.waylonwalker.com/post/682\"\u003ehere\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"today-s-challenge\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eToday’s Challenge\u003c/span\u003e \u003ca href=\"#today-s-challenge\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI went to do today\u0026rsquo;s daily challenge and have ran into an issue where part of\nthe challenge is to type \u003ccode\u003e/\u003c/code\u003e the forward slash character but it\u0026rsquo;s actually a\nkeybind on the website for navigation (well done btw!)\u003c/p\u003e\n\u003cfigure\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250613130724_06b0f9ef.png\" alt=\"20250613130724_06b0f9ef.png\"\u003e\n\u003c/figure\u003e\n\u003cp\u003eSo when I try to type the challenge I actually bring up the nav menu\u003c/p\u003e\n\u003cfigure\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250613131031_ce06cf48.png\" alt=\"20250613131031_ce06cf48.png\"\u003e\n\u003c/figure\u003e\n\u003cp\u003eSo for today I\u0026rsquo;ll take the error on the character to complete it and maybe ZSA\ncan look into this?\u003c/p\u003e\n",
      "content_text": "\n# ZSA\n\nI love [zsa](https://zsa.io) and have been using a moonlander for a few years now.\n\nThey recently launched [typ.ing](https://typ.ing) as a way to train your typing skills - it's a lot like [monkeytype](https://monkeytype.com).\n\nI have a thought about it [here](https://thoughts.waylonwalker.com/post/682)\n\n## Today's Challenge\n\nI went to do today's daily challenge and have ran into an issue where part of\nthe challenge is to type `/` the forward slash character but it's actually a\nkeybind on the website for navigation (well done btw!)\n\n![20250613130724_06b0f9ef.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250613130724_06b0f9ef.png)\n\nSo when I try to type the challenge I actually bring up the nav menu\n\n![20250613131031_ce06cf48.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250613131031_ce06cf48.png)\n\nSo for today I'll take the error on the character to complete it and maybe ZSA\ncan look into this?\n",
      "summary": "I love zsa and have been using a moonlander for a few years now.",
      "date_published": "2025-06-13T08:07:41Z",
      "date_modified": "2025-06-13T08:07:41Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "tech",
        "zsa",
        "typing"
      ]
    },
    {
      "id": "https://pype.dev/double-check-your-dns-records/",
      "url": "https://pype.dev/double-check-your-dns-records/",
      "title": "Double Check Your DNS Records",
      "content_html": "\u003ch1 id=\"my-blog\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMy Blog\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eI host \u003ca href=\"https://pype.dev\"\u003emy blog\u003c/a\u003e on cloudflare and manage my infra with\nterraform. I got a 522 when I went to \u003ccode\u003ehttps://www.pype.dev\u003c/code\u003e recently and I\nwondered why since \u003ccode\u003ehttps://pype.dev\u003c/code\u003e worked fine\u0026hellip;\u003c/p\u003e\n\u003ch2 id=\"terraform\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTerraform\u003c/span\u003e \u003ca href=\"#terraform\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI had this right in the terraform:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eresource\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;cloudflare_pages_domain\u0026#34; \u0026#34;cf_domain\u0026#34;\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003e  account_id\u003c/span\u003e   \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003elocal\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"k\"\u003eaccount_id\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003e  project_name\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003ecloudflare_pages_project\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"k\"\u003ebuild_config\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"k\"\u003ename\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003e  domain\u003c/span\u003e       \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;pype.dev\u0026#34;\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\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eBut turns out the \u003ccode\u003ewww\u003c/code\u003e record was commented out for some reason in my terraform code:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eresource\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;cloudflare_pages_domain\u0026#34; \u0026#34;cf_domain_www\u0026#34;\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003e  account_id\u003c/span\u003e   \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003elocal\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"k\"\u003eaccount_id\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003e  project_name\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003ecloudflare_pages_project\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"k\"\u003ebuild_config\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"k\"\u003ename\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003e  domain\u003c/span\u003e       \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;www.pype.dev\u0026#34;\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\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eA quick \u003ccode\u003eterraform apply -auto-approve\u003c/code\u003e (careful with this) and we\u0026rsquo;re up and\nrunning with the \u003ccode\u003ewww\u003c/code\u003e record now\u003c/p\u003e\n",
      "content_text": "\n# My Blog\n\nI host [my blog](https://pype.dev) on cloudflare and manage my infra with\nterraform. I got a 522 when I went to `https://www.pype.dev` recently and I\nwondered why since `https://pype.dev` worked fine...\n\n## Terraform\n\nI had this right in the terraform:\n\n```hcl\nresource \"cloudflare_pages_domain\" \"cf_domain\" {\n  account_id   = local.account_id\n  project_name = cloudflare_pages_project.build_config.name\n  domain       = \"pype.dev\"\n}\n```\n\nBut turns out the `www` record was commented out for some reason in my terraform code:\n\n```hcl\nresource \"cloudflare_pages_domain\" \"cf_domain_www\" {\n  account_id   = local.account_id\n  project_name = cloudflare_pages_project.build_config.name\n  domain       = \"www.pype.dev\"\n}\n```\n\nA quick `terraform apply -auto-approve` (careful with this) and we're up and\nrunning with the `www` record now\n\n",
      "summary": "I host my blog on cloudflare and manage my infra with terraform. I got a 522 when I went to recently and I wondered why since worked fine...",
      "date_published": "2025-06-13T06:53:50Z",
      "date_modified": "2025-06-13T06:53:50Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "tech",
        "dns",
        "terraform",
        "cloudflare"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-690/",
      "url": "https://pype.dev/thoughts-690/",
      "title": "💭 “We would be less confidential than Google” – Proton threatens…",
      "content_text": "\n\u003ca href=\"https://www.techradar.com/vpn/vpn-privacy-security/we-would-be-less-confidential-than-google-proton-threatens-to-quit-switzerland-over-new-surveillance-law?ref=dailydev\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://www.techradar.com/vpn/vpn-privacy-security/we-would-be-less-confidential-than-google-proton-threatens-to-quit-switzerland-over-new-surveillance-law?ref=dailydev\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - \"We would be less confidential than Google\" – Proton threatens to quit Switzerland over new surveillance law | TechRadar\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://www.techradar.com/vpn/vpn-privacy-security/we-would-be-less-confidential-than-google-proton-threatens-to-quit-switzerland-over-new-surveillance-law?ref=dailydev\"\u003e\"We would be less confidential than Google\" – Proton threatens to quit Switzerland over new surveillance law | TechRadar\u003c/a\u003e\n\n---\n\nI've been a proton user for several years now, and pay a decently hefty subscription fee for some of their services that I love having access to (multiple domains, email relay, simplelogin, etc.). This privacy impact in Switzerland is concerning and I am definitely biting my nails over the future of this platform\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "I've been a proton user for several years now, and pay a decently hefty subscription fee for some of their services that",
      "date_published": "2025-06-13T02:19:29Z",
      "date_modified": "2025-06-13T02:19:29Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "proton",
        "email",
        "security",
        "privacy",
        "tech",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-689/",
      "url": "https://pype.dev/thoughts-689/",
      "title": "💭 Exploiting Copilot AI for SharePoint | Pen Test Partners",
      "content_text": "\n\u003ca href=\"https://www.pentestpartners.com/security-blog/exploiting-copilot-ai-for-sharepoint/\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://www.pentestpartners.com/security-blog/exploiting-copilot-ai-for-sharepoint/\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - Exploiting Copilot AI for SharePoint | Pen Test Partners\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://www.pentestpartners.com/security-blog/exploiting-copilot-ai-for-sharepoint/\"\u003eExploiting Copilot AI for SharePoint | Pen Test Partners\u003c/a\u003e\n\n---\n\nIn hindsight this vulnerability isn't even that clever, hopefully the share holders of the companies that rushed to throw AI into everything will make it out ok\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "In hindsight this vulnerability isn't even that clever, hopefully the share holders of the companies that rushed to thro",
      "date_published": "2025-06-13T02:17:17Z",
      "date_modified": "2025-06-13T02:17:17Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "security",
        "infosec",
        "sharepoint",
        "microsoft",
        "ai",
        "copilot",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-688/",
      "url": "https://pype.dev/thoughts-688/",
      "title": "💭 slash pages",
      "content_text": "\n\u003ca href=\"https://slashpages.net/\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://slashpages.net/\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - slash pages\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://slashpages.net/\"\u003eslash pages\u003c/a\u003e\n\n---\n\nWaylon's mentioned slash pages before, but as I work on building my blog again and writing more regularly thanks to \"thoughts\" etc. I'd like to start putting together some meaningful slash pages for myself... I'm not sure what to put out there yet but this thought can serve as a todo for me\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "Waylon's mentioned slash pages before, but as I work on building my blog again and writing more regularly thanks to \"tho",
      "date_published": "2025-06-12T11:41:43Z",
      "date_modified": "2025-06-12T11:41:43Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "blog",
        "slash-pages",
        "til",
        "todo",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-687/",
      "url": "https://pype.dev/thoughts-687/",
      "title": "💭 The Meaning of “Mammon” in the Bible | Matthew 6:24",
      "content_text": "\n\u003ca href=\"https://bibleproject.com/videos/vocab-insight-mammon-wealth\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://bibleproject.com/videos/vocab-insight-mammon-wealth\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - The Meaning of “Mammon” in the Bible | Matthew 6:24\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://bibleproject.com/videos/vocab-insight-mammon-wealth\"\u003eThe Meaning of “Mammon” in the Bible | Matthew 6:24\u003c/a\u003e\n\n---\n\nI spend a fair amount of time thinking about the future, planning and saving, making sure to the best of my ability and capability right now, that my family is financially taken care of for my whole life and beyond.\nIt's a challenging thing to wrestle with building wealth while understanding Jesus' call to live a life focused on others and Heaven. He certainly never says having wealth is bad or sinful, but the point in this short 1 minute video on mammon was good for me be encouraged by. Mammon (or stuff, possessions, etc) has the tendency to lead people astray into trusting in it... how many times to people straight up freak out when the stock market dips?\nBut using mammon to care for others is one of the points of Christian living. God has been good to me, and as we seek to be good to others I pray we (my family and I) are bringing glory to his name and not doing anything for our own vanity\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "I spend a fair amount of time thinking about the future, planning and saving, making sure to the best of my ability and",
      "date_published": "2025-06-12T11:03:13Z",
      "date_modified": "2025-06-12T11:03:13Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "wealth",
        "faith",
        "bible-project",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-686/",
      "url": "https://pype.dev/thoughts-686/",
      "title": "💭 N.T. Wright on The Unseen Realm \u0026 Heiser - YouTube",
      "content_text": "\n\u003ca href=\"https://www.youtube.com/watch?v=StRxlVhjH_0\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://www.youtube.com/watch?v=StRxlVhjH_0\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - N.T. Wright on The Unseen Realm \u0026 Heiser - YouTube\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://www.youtube.com/watch?v=StRxlVhjH_0\"\u003eN.T. Wright on The Unseen Realm \u0026 Heiser - YouTube\u003c/a\u003e\n\n---\n\nI don't write enough short thoughts on theology stuff, I'm usually trying to have some longer thought to unpack or to summarize a longer teaching. I came across this video this morning after a Bible Project video - I love Michael Heiser, he's given me such a strong framework for understanding the Bible, and now to see an example of NT Wright talking about him and some of those ideas is really exciting. Wright nails it around 9 minutes in - that the primary point of the supremacy of Jesus, and his victory over the ruling powers from Deut 32, is a great short truth that more Christians needs to learn... Jesus doesn't magically your life better, he invites you to submit to his authority rather than the authority of the present ruling forces, and yes this does make your life better but only if you are truly submissive to him can you understand \"better\" appropriately.\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "I don't write enough short thoughts on theology stuff, I'm usually trying to have some longer thought to unpack or to su",
      "date_published": "2025-06-12T10:59:29Z",
      "date_modified": "2025-06-12T10:59:29Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "faith",
        "heiser",
        "nt-wright",
        "divine-council",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-685/",
      "url": "https://pype.dev/thoughts-685/",
      "title": "💭 qwen3",
      "content_text": "\n\u003ca href=\"https://ollama.com/library/qwen3\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://ollama.com/library/qwen3\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - qwen3\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://ollama.com/library/qwen3\"\u003eqwen3\u003c/a\u003e\n\n---\n\nI really don't know much about every self-hostable LLM out there... so much as happened. I am blessed at home with a pretty beefy GPU and so although I don't know all the deets, I can run a lot of the reasonably large \"open source\" models. The one I've been playing with lately is qwen3. The conversational flow has felt more natural with it compared to llama3.2 or dolphin3. Granted I might need to update something and my experience is limited. I've also had good experience with gemma3 as a noteworthy contender for my go-to LLM right now in open-webui\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "I really don't know much about every self-hostable LLM out there... so much as happened. I am blessed at home with a pre",
      "date_published": "2025-06-11T02:23:23Z",
      "date_modified": "2025-06-11T02:23:23Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "llm",
        "ollama",
        "homelab",
        "qwen",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-682/",
      "url": "https://pype.dev/thoughts-682/",
      "title": "💭 daily challenge leaderboard | typ.ing",
      "content_text": "\n\u003ca href=\"https://typ.ing/stats/daily-challenge\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://typ.ing/stats/daily-challenge\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - daily challenge leaderboard | typ.ing\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://typ.ing/stats/daily-challenge\"\u003edaily challenge leaderboard | typ.ing\u003c/a\u003e\n\n---\n\ntyp.ing is like monkeytype to a degree. it's made by ZSA, who makes my keyboard, and I love the idea of a simple training tool for getting fluent with my board and keymaps. The daily challenge is a nice little way to earn some internet points, and although I missed a day recently I want to stay consistent with it each morning... someday I'll hit 130 99% accuracy\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "typ.ing is like monkeytype to a degree. it's made by ZSA, who makes my keyboard, and I love the idea of a simple trainin",
      "date_published": "2025-06-09T13:45:07Z",
      "date_modified": "2025-06-09T13:45:07Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "zsa",
        "typing",
        "keyboard",
        "challenge",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-680/",
      "url": "https://pype.dev/thoughts-680/",
      "title": "💭 News - Apps - App Store - Nextcloud",
      "content_text": "\n\u003ca href=\"https://apps.nextcloud.com/apps/news\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://apps.nextcloud.com/apps/news\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - News - Apps - App Store - Nextcloud\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://apps.nextcloud.com/apps/news\"\u003eNews - Apps - App Store - Nextcloud\u003c/a\u003e\n\n---\n\nI just started using FreshRSS to get familiar with subscribing to RSS feeds and leaning into that as opposed to social media... Twitter has become basically just a news outlet for me, not a place to connect with devs (except for 2 or 3 who are active). RSS seems like such cool and ancient technology that is protected from the corporate tentacles that hold up every social media outlet save for nostr... \n\nSo as I look for an RSS reader and/or feed aggregator this Nextcloud plugin seems like a good choice to look at since I'm already hosting NC.. although do I really want to lean into it for more and more?\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "I just started using FreshRSS to get familiar with subscribing to RSS feeds and leaning into that as opposed to social m",
      "date_published": "2025-06-09T11:37:39Z",
      "date_modified": "2025-06-09T11:37:39Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "rss",
        "news",
        "nextcloud",
        "homelab",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-679/",
      "url": "https://pype.dev/thoughts-679/",
      "title": "💭 ELEMENT.FM - unlimited podcast hosting",
      "content_text": "\n\u003ca href=\"https://element.fm/\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://element.fm/\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - ELEMENT.FM - unlimited podcast hosting\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://element.fm/\"\u003eELEMENT.FM - unlimited podcast hosting\u003c/a\u003e\n\n---\n\nI heard about element.fm as a possible self-hosted podcast solution. They also have a service that looks pretty nice and reasonable. As I help Cameron with Pilgrim's Creek this might be a platform we lean into\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "I heard about element.fm as a possible self-hosted podcast solution. They also have a service that looks pretty nice and",
      "date_published": "2025-06-09T11:30:38Z",
      "date_modified": "2025-06-09T11:30:38Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "podcast",
        "self-hosted",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/thoughts/",
      "url": "https://pype.dev/thoughts/",
      "title": "Thoughts",
      "content_html": "\u003ch1 id=\"thoughts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThoughts\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eMy thoughts are found at \u003ca href=\"/my-thoughts\"\u003emy thoughts feed\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://thoughts.waylonwalker.com\"\u003ethoughts\u003c/a\u003e was built by Waylon and is a place where I drop things not ready for a blog but that I don\u0026rsquo;t want to forget. Waylon created \u003ca href=\"https://markata.dev\"\u003eMarkata\u003c/a\u003e and paired with thoughts I\u0026rsquo;m able to capture much more of my thinking than I could before.\u003c/p\u003e\n",
      "content_text": "\n# Thoughts\n\nMy thoughts are found at [my thoughts feed](/my-thoughts)\n\n[thoughts](https://thoughts.waylonwalker.com) was built by Waylon and is a place where I drop things not ready for a blog but that I don't want to forget. Waylon created [Markata](https://markata.dev) and paired with thoughts I'm able to capture much more of my thinking than I could before. \n",
      "summary": "My thoughts are found at my thoughts feed",
      "date_published": "2025-06-09T11:30:21Z",
      "date_modified": "2025-06-09T11:30:21Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-678/",
      "url": "https://pype.dev/thoughts-678/",
      "title": "💭 Keynote Speaker - Cory Doctorow - YouTube",
      "content_text": "\n\u003ca href=\"https://www.youtube.com/watch?v=ydVmzg_SJLw\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://www.youtube.com/watch?v=ydVmzg_SJLw\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - Keynote Speaker - Cory Doctorow - YouTube\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://www.youtube.com/watch?v=ydVmzg_SJLw\"\u003eKeynote Speaker - Cory Doctorow - YouTube\u003c/a\u003e\n\n---\n\nWhat a great talk - will pull this thought into a post someday but the guy hits like 9 out of 10 on this one, great stuff to consider in general\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "What a great talk - will pull this thought into a post someday but the guy hits like 9 out of 10 on this one, great stuf",
      "date_published": "2025-06-08T17:43:16Z",
      "date_modified": "2025-06-08T17:43:16Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "pycon",
        "keynote",
        "economics",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/example-for-andrew/",
      "url": "https://pype.dev/example-for-andrew/",
      "title": "Example For Andrew",
      "content_html": "\u003cfigure\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250608194801_809d5306.png\" alt=\"20250608194801_809d5306.png\"\u003e\n\u003c/figure\u003e\n",
      "content_text": "\n![20250608194801_809d5306.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250608194801_809d5306.png)\n",
      "date_published": "2025-06-08T14:48:53Z",
      "date_modified": "2025-06-08T14:48:53Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "homelab",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/i-built-a-simple-app-for-adding-images-to-my-blog/",
      "url": "https://pype.dev/i-built-a-simple-app-for-adding-images-to-my-blog/",
      "title": "I built a simple app for adding images to my blog",
      "content_text": "\n# Quick Deets\n\nI built a simple fastAPI app called \"shotput\" that I run locally inside a git repo where I save images for my blog. The app is simple:\n\n1. upload image from clipboard\n2. app commits image to repo (path is configurable)\n3. app pushes the commit (auto-push configurable)\n4. app returns a markdown link I can paste in my blog that uses statically.io (see [[statically-io-to-help-me-out]]) to serve the image from the repo to my blog\n\nSee the image repo with app details at [images.pype.dev](https://github.com/pypeaday/images.pype.dev)\n\n# Usage\n\nAnyone could copy the script and config to their own git repo to put images in\nand run this at home - instructions are in the readme but for simple running on localhost it's just `uv run`\n\n# Example\n\n![20250607130609_dadd33eb.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250607130609_dadd33eb.png)\n\npasting an image let's you copy the markdown link for easy pasting\n\n```markdown\n![20250607130609_dadd33eb.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250607130609_dadd33eb.png)\n```\n",
      "summary": "I built a simple fastAPI app called \"shotput\" that I run locally inside a git repo where I save images for my blog. The app is simple:",
      "date_published": "2025-06-07T13:30:28Z",
      "date_modified": "2025-06-07T13:30:28Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "tech",
        "python",
        "uv"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-670/",
      "url": "https://pype.dev/thoughts-670/",
      "title": "💭 Linux Explained: What is The Linux Kernel? - YouTube",
      "content_text": "\n\u003ca href=\"https://www.youtube.com/watch?si=CFRBAdjtI0x7Pmj7\u0026v=pJ607nDnyE0\u0026feature=youtu.be\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://www.youtube.com/watch?si=CFRBAdjtI0x7Pmj7\u0026v=pJ607nDnyE0\u0026feature=youtu.be\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - Linux Explained: What is The Linux Kernel? - YouTube\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://www.youtube.com/watch?si=CFRBAdjtI0x7Pmj7\u0026v=pJ607nDnyE0\u0026feature=youtu.be\"\u003eLinux Explained: What is The Linux Kernel? - YouTube\u003c/a\u003e\n\n---\n\nI'm getting sucked into the Linux is a kernel not an operating system crowd because tonight I realized I couldn't describe what a kernel is so I YouTubeda few things and before you know it you joined a decades old war before finishing loading the dishwasher\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "I'm getting sucked into the Linux is a kernel not an operating system crowd because tonight I realized I couldn't descri",
      "date_published": "2025-06-07T11:28:18Z",
      "date_modified": "2025-06-07T11:28:18Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "linux",
        "youtube",
        "kernel",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-669/",
      "url": "https://pype.dev/thoughts-669/",
      "title": "💭 What are these 100.x.y.z addresses? · Tailscale Docs",
      "content_text": "\n\u003ca href=\"https://tailscale.com/kb/1015/100.x-addresses\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://tailscale.com/kb/1015/100.x-addresses\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - What are these 100.x.y.z addresses? · Tailscale Docs\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://tailscale.com/kb/1015/100.x-addresses\"\u003eWhat are these 100.x.y.z addresses? · Tailscale Docs\u003c/a\u003e\n\n---\n\nI have had serious issues with a whitelist I set in my traefik config and then reaching some services on my tailnet... turns out I whitelisted 10.64.0.0/10 instead of 100.64.0.0/10 in my traefik configuration file... \n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "I have had serious issues with a whitelist I set in my traefik config and then reaching some services on my tailnet... t",
      "date_published": "2025-06-07T11:27:43Z",
      "date_modified": "2025-06-07T11:27:43Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "tailscale",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/double-check-your-cidr-blocks/",
      "url": "https://pype.dev/double-check-your-cidr-blocks/",
      "title": "Double check your CIDR blocks!",
      "content_html": "\u003ch1 id=\"tl-dr\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003etl;dr\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eCopy paste - don\u0026rsquo;t rely on typing correctly\u0026hellip;\u003c/p\u003e\n\u003ch1 id=\"the-issue\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThe Issue\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eI use tailscale at home and generally love it. One thing I use it for is\nwhitelisting - so I have some apps publically available and my homelab ones\nhave DNS with SSL certs by LE but I whitelist to only my private IPs so that I\ncan use https at home basically. However I have had a few issues\nwith a couple apps, and I kind of chaulked it up to \u0026ldquo;network protocol this\u0026rdquo;\n\u0026ldquo;need to figure out that header that\u0026rdquo; but ultimately I was being lazy and the\nissues weren\u0026rsquo;t catastrophic\u0026hellip; it was things like:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003ecouldn\u0026rsquo;t get to my NVR by DNS, so I\u0026rsquo;d have to use tailscale_ip:port\u003c/li\u003e\n\u003cli\u003ecouldn\u0026rsquo;t login with my user in jellyfin cause I lock me down to LAN only\nsince I dont\u0026rsquo; use a password\u003c/li\u003e\n\u003cli\u003egotify wouldn\u0026rsquo;t connect using DNS\u003c/li\u003e\n\u003c/ol\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThese things aren\u0026rsquo;t huge but they are annoying and today I decided to figure it out.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"typo\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTypo!\u003c/span\u003e \u003ca href=\"#typo\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI\u0026rsquo;m not an expert yet but I think the main problem was the CIDR block I was\nusing in my traefik config.\u003c/p\u003e\n\u003cp\u003eThis\u0026rsquo;ll shock some of you but \u003ccode\u003e10.64.0.0/10\u003c/code\u003e and \u003ccode\u003e100.64.0.0/10\u003c/code\u003e are not the\nsame blocks!\u003c/p\u003e\n\u003cdiv class=\"admonition warning\"\u003e\n\u003cp class=\"admonition-title\"\u003eCheck your CIDRs\u003c/p\u003e\n\u003cp\u003eIt\u0026rsquo;s always DNS, and even when it\u0026rsquo;s not, it\u0026rsquo;s still probably networking\u003c/p\u003e\n\u003c/div\u003e\n",
      "content_text": "\n# tl;dr\n\nCopy paste - don't rely on typing correctly...\n\n# The Issue\n\nI use tailscale at home and generally love it. One thing I use it for is\nwhitelisting - so I have some apps publically available and my homelab ones\nhave DNS with SSL certs by LE but I whitelist to only my private IPs so that I\ncan use https at home basically. However I have had a few issues\nwith a couple apps, and I kind of chaulked it up to \"network protocol this\"\n\"need to figure out that header that\" but ultimately I was being lazy and the\nissues weren't catastrophic... it was things like:\n\n1. couldn't get to my NVR by DNS, so I'd have to use tailscale_ip:port\n2. couldn't login with my user in jellyfin cause I lock me down to LAN only\n   since I dont' use a password\n3. gotify wouldn't connect using DNS\n\n\u003e These things aren't huge but they are annoying and today I decided to figure it out.\n\n## Typo!\n\nI'm not an expert yet but I think the main problem was the CIDR block I was\nusing in my traefik config.\n\nThis'll shock some of you but `10.64.0.0/10` and `100.64.0.0/10` are not the\nsame blocks!\n\n!!! warning \"Check your CIDRs\"\n    It's always DNS, and even when it's not, it's still probably networking\n",
      "summary": "Copy paste - don't rely on typing correctly...",
      "date_published": "2025-06-07T07:27:31Z",
      "date_modified": "2025-06-07T07:27:31Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "tech",
        "tailscale",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/i-love-an-expert-in-their-craft/",
      "url": "https://pype.dev/i-love-an-expert-in-their-craft/",
      "title": "I love an expert in their craft",
      "content_html": "\u003ch1 id=\"presence-of-an-expert\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePresence of an Expert\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eOur AC died, or has been showing signs of dying recently, and regardless of the\nfinality of its death, our house hasn\u0026rsquo;t been getting super cold\u0026hellip; The\ncondenser unit is from 1991, making it 34 years old at the time of this post\u0026hellip;\u003c/p\u003e\n\u003cp\u003eThe reason I\u0026rsquo;m writing though is that I was presented with a nice moment of\nreflection when the HVAC guy who came over to service our unit was talking to\nme about his diagnostic process. I wouldn\u0026rsquo;t even try to regurgiate everything\nbecause I barely understood it, something about a valve being stuck and not\nallowing enough refrigerant through was the root cause of the issue\u0026hellip;\u003c/p\u003e\n\u003cp\u003eAnyways, the root cause aside, this guy KNEW HVAC\u0026hellip; it was clear. He\nunderstood every aspect of my AC and furnace within a few minutes of being in\nthe basement. And that was a surreal moment, to realize I was in the presence\nof an absolute expert - just not in anything I could remotely understand.\u003c/p\u003e\n\u003ch2 id=\"the-rest\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThe Rest\u003c/span\u003e \u003ca href=\"#the-rest\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI don\u0026rsquo;t know what more there is to reflect\u0026hellip; I don\u0026rsquo;t want to make something all about how I\u0026rsquo;m actually an expert in my own fields\u0026hellip; because that\u0026rsquo;s not always true\u0026hellip; but it\u0026rsquo;s also not never true\u0026hellip;\u003c/p\u003e\n\u003cp\u003eSo without arguing myself into oblivion I just want to throw out there that you should try to be an expert in what you do - and you might even encourage someone simply by being that expert\u0026hellip; I think I\u0026rsquo;m often afraid I\u0026rsquo;m going to sound arrogant or something when explaining a concept in my field, and maybe it\u0026rsquo;s dependent on the audience, but listening to this guy just effortlessly step through the mechanics of my air-con problem was an enjoyable experience.\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eFind joy?\u003c/p\u003e\n\u003cp\u003eAs a final attempt to make this a blog post - a final comment might be that\nit\u0026rsquo;s ok to find joy in something, especially if you become an expert in it,\nand that expertise might itself bring joy to someone else\u003c/p\u003e\n\u003c/div\u003e\n",
      "content_text": "\n# Presence of an Expert\n\nOur AC died, or has been showing signs of dying recently, and regardless of the\nfinality of its death, our house hasn't been getting super cold... The\ncondenser unit is from 1991, making it 34 years old at the time of this post...\n\nThe reason I'm writing though is that I was presented with a nice moment of\nreflection when the HVAC guy who came over to service our unit was talking to\nme about his diagnostic process. I wouldn't even try to regurgiate everything\nbecause I barely understood it, something about a valve being stuck and not\nallowing enough refrigerant through was the root cause of the issue...\n\nAnyways, the root cause aside, this guy KNEW HVAC... it was clear. He\nunderstood every aspect of my AC and furnace within a few minutes of being in\nthe basement. And that was a surreal moment, to realize I was in the presence\nof an absolute expert - just not in anything I could remotely understand.\n\n## The Rest\n\nI don't know what more there is to reflect... I don't want to make something all about how I'm actually an expert in my own fields... because that's not always true... but it's also not never true...\n\nSo without arguing myself into oblivion I just want to throw out there that you should try to be an expert in what you do - and you might even encourage someone simply by being that expert... I think I'm often afraid I'm going to sound arrogant or something when explaining a concept in my field, and maybe it's dependent on the audience, but listening to this guy just effortlessly step through the mechanics of my air-con problem was an enjoyable experience.\n\n!!! note \"Find joy?\"\n    As a final attempt to make this a blog post - a final comment might be that\n    it's ok to find joy in something, especially if you become an expert in it,\n    and that expertise might itself bring joy to someone else\n",
      "summary": "Our AC died, or has been showing signs of dying recently, and regardless of the finality of its death, our house hasn't been getting super cold... The...",
      "date_published": "2025-06-06T19:38:13Z",
      "date_modified": "2025-06-06T19:38:13Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "reflection"
      ]
    },
    {
      "id": "https://pype.dev/homelab-journey-part-1/",
      "url": "https://pype.dev/homelab-journey-part-1/",
      "title": "homelab-journey-part-1",
      "content_text": "\n# Introduction\n\nI want to start writing about my homelab and this first post can be a short\nintroduction to how I got into homelabbing and a review of my current hardware.\nI'll hopefully write about the evolution of my homelab to get to this\ncurrent point and then start writing about updates as new things hit the lab.\n\n# The Journey\n\n## Applications | Pi-Hole\n\nI started with a pi-hole appliance running on a pi-0 I\nhad lying around. So, a little introduction into SSH and foreign operating\nsystems (I was loosely familiar with Linux and so Raspbian wasn't a huge deal\nto start with) and then you could just [install pi-hole](https://docs.pi-hole.net/main/basic-install/).\nAfter installing it I got to learn a little bit about networking, DNS, DHCP,\netc. all from just exploring and trying out the features of pi-hole.\n\n## Hardware\n\nFrom there I happened to come into a few computers kind of for free that a church was\nrecycling and so now with new-to-me x86 hardware and armed with a tiny bit of\ndocker experience at work - I thought \"well I wonder if I could run pi-hole in\ndocker on a Linux machine?\" and that opened the door to running other things in docker.\n\n# Applications | Free-NAS\n\nI quickly decided I wanted a NAS after talking with a friend at work, and one\nof those computers that I inherited was the perfect target for Freenas by iX\nsystems (Freenas has since morphed into a few things - primarily TrueNAS Core\nfor the homelabber). That got me somewhat familiar with jails (which is a BSD\nconcept as FreeNAS was based on FreeBSD, not Linux) and running\ncontainers in different ways and then I decided I wanted Linux so I rebuilt with\nUbuntu.\n\n!!! note \"\"\n\n    there's been several hardware changes and such in there but that\n    does more or less get me to arrive at where I'm at today which is I have a\n    few different boxes running pretty standard operating systems for their\n    purposes and they are as follows.\n\n# Current Homelab Setup\n\n!!! note \"Find updated information at [[the-homelab]]\"\n\n## Ad blocking | Pi-Hole\n\nHardware: pi-3\n\nI have a Raspberry Pi 3 hardwired in that is running pi-hole so that's been a\npart of my infrastructure now for a long time.\n\n## Router | OPNSense\n\n!!! note \"stats\"\n\n    CPU: i5-8700\n\n    Memory: 8GB of whatever was in the box\n\n    Storage: 1TB SSD\n\nMy router is an old Optiplex SFF 5060 I got from Amazon for less than $100.\nSo I'm running a x86 system for my router with\nOpenSense on it. Just seemed it to be another home lab standard and I'd like to\nsomeday bring pi-hole over there or use AdGuard or integrate those two things\nmaybe a little bit more completely but right now they are mostly separate.\n\n## Networking | VLANs\n\nThere's a\nmanaged switch in there for some VLAN tomfoolery for my cameras and an IOT\nnetwork type of a thing.\n\n## Networking | VPN | Tailscale\n\nThey're on tailscale as well so my DNS happens over tailscale.\n\n## My Desktop\n\n!!! note \"stats\"\n\n    CPU: Ryzen 7 5700X\n\n    GPU: Nvidia 3090\n\n    Memory: 64 GB\n\n    Storage: 4TB SSD + 2 TB HDD for zfs backup\n\n    OS: Universal Blue Aurora\n\nMy daily-driver desktop is somewhat apart of my homelab now as I have a 3090 in\nthere with 20 GB of VRAM so I can run some heavier LLMs for self-hosted AI\nworkloads. Everything in that space runs in a container and then I manage\ndocker containers with compose stacks and portainer for visibility.\n\n### Applications\n\nSome of the apps I run here are ollama, open-webui, automatic1111's stable diffusion webui, whisper-webui\n\n## NAS / Server\n\n!!! note \"stats\"\n\n    CPU: Ryzen 7 5700G\n\n    GPU: None right now\n\n    Memory: 128 GB\n\n    Storage: 2x12 TB ZFS Mirror + another 2x12 TB ZFS Mirror + 500GB disk for NVR\n\n    OS: Ubuntu Server 24.04\n\nAt the moment I am managing containers using Docker Compose stacks. Many\napplications have their own stack but then I also have stacks of many\napplications. The Compose files are all organized by host and they're in git\nand I use GitHub as my main get back and remote storage.\n\n### Applications\n\nThere are currently 74 containers running on my server, I will not list them all but here's some highlights:\n\n- traefik\n- portainer\n- nextcloud\n- jellyfin\n- \\*arr stack\n- code-server\n- kanboard\n\nI regularly spin up compose stacks to try new things as I hear about them in\nnewsletters and such - I will be making an attempt to write about them more\nfrequently in a homelabbing series\n",
      "summary": "I want to start writing about my homelab and this first post can be a short introduction to how I got into homelabbing and a review of my current hardware....",
      "date_published": "2025-06-05T08:19:57Z",
      "date_modified": "2025-06-05T08:19:57Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "tech",
        "series-homelab"
      ]
    },
    {
      "id": "https://pype.dev/autism-adhd-and-the-doshas/",
      "url": "https://pype.dev/autism-adhd-and-the-doshas/",
      "title": "Autism ADHD and the Doshas",
      "content_html": "\u003ch1 id=\"introduction\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eIntroduction\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eI was recently diagnosed with Autism Spectrum Disorder Level 1 and ADHD, the inattentive\ntype. I suppose, AuDHD for short.\nThere are many reasons why I now have this official label of AuDHD, not that I\nwas hoping for it, but due to a childhood behavioral disorder diagnosis and a\ndesire to understand myself better, I decided to start considering that something\nin my childhood issue was misunderstood.\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eNote\u003c/p\u003e\n\u003cp\u003eBut what started as simply considering some new diagnosis turned into a\nlarger worldview shift when it comes to medicine and how we treat people for\nthings we label disorderly.\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"personal-history\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePersonal History\u003c/span\u003e \u003ca href=\"#personal-history\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eA brief history lesson for context is that I was diagnosed with bipolar\ndisorder, but not specifically type 1 or type 2. This diagnosis came about two\ntimes, once in my late childhood and again when I was 19.\nThe diagnosis never made a ton of sense to me, but it seemed to almost match some of\nthe things that my mom specifically was concerned about.\nThere is another point for later on, which is that part of me wanted to be bipolar.\nI felt like it would be cool, but also it made me special.\u003c/p\u003e\n\u003cdiv class=\"admonition warning\"\u003e\n\u003cp class=\"admonition-title\"\u003ebias\u003c/p\u003e\n\u003cp\u003eThere\u0026rsquo;s no way that this desire didn\u0026rsquo;t turn into massive confirmation bias\nin getting this diagnosis as a kid and as a late teenager.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eOnce I started kind of thinking \u003cem\u003efor myself\u003c/em\u003e a little bit - the bipolar diagnosis\nwas one of my first spiritual challenges in understanding the brokenness of\nhumanity.\u003c/p\u003e\n\u003ch2 id=\"the-challenge\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThe Challenge\u003c/span\u003e \u003ca href=\"#the-challenge\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI believe in an orderly God, the creator of all things, who makes things both\nsoundly and reasonable. Mental health is complex because it\u0026rsquo;s not like a broken\narm, throw a cast on, and wait\u0026hellip; Taking medicine felt almost antithetical to\nmy worldview because I had a deep desire to see\nsomething miraculous. So, I backed myself into this odd worldview where I\ntaking medicine must be fighting something that God wants to do in me with this\nbrokenness. I felt like I was trying to do something maybe God didn\u0026rsquo;t want me to\ndo, but was also wrestling with \u0026ldquo;but if something\u0026rsquo;s really wrong (which is\npossible because we live in a broken world) God gifts these doctors to come up\nwith this medicine to help heal some of the brokenness.\u0026rdquo;\u003c/p\u003e\n\u003cp\u003eSo I had these two competing ideas that were very loud in my head.\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eNote\u003c/p\u003e\n\u003cp\u003eIn hindsight, an AuDHD diagnosis somewhat explains this behavior of mine.\nWherein I wanted to be sick, and I had these competing ideas about the\ncharacter of God.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eSo I\u0026rsquo;ve been more at less at peace with the idea that behavior disorders are\napart of life for many people - and that medical treatment can be helpful.\u003c/p\u003e\n\u003ch1 id=\"reflection\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eReflection\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eAs I\u0026rsquo;ve gotten older and reflected on being bi-polar I couldn\u0026rsquo;t help but notice\nthat hardly any part of the atypical\npieces of myself matched up with bi-polar at all\u0026hellip; Around the time I started\nto notice this my wife began wondering if I had something more akin to ADD. We\ndidn\u0026rsquo;t really understand what that meant, or how it has changed over the years,\nor any of it - but based on some initial stereotypes ADHD began to become a\ncommon thing we discussed\nAfter some more legitimate research we both became pretty convinced that I was\nmeasurably on the Autism Spectrum and that certainly there were ADHD tendencies\nthat negatively affected my life. I talked with my doctor and after several\npsych evaluations it turns out that my self-diagnosis was consistent with the\nconclusion of the evaluation. So if this was the end then my thought would\u0026rsquo;ve\nbeen\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eI'm not bi-polar\u003c/p\u003e\n\u003cp\u003eok I\u0026rsquo;m not bi-polar, I\u0026rsquo;m AuDHD - there\u0026rsquo;s some coping mechanisms I can\nlearn now and things make sense.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eHowever, this wasn\u0026rsquo;t the end for me - getting diagnosed with AuDHD\ndidn\u0026rsquo;t/hasn\u0026rsquo;t changed my life - it\u0026rsquo;s given me a framework by which I can\nunderstand myself in the context of our\nWestern world better.\nBut there\u0026rsquo;s a lot more here and as we look ahead, I want to be clear that I\ntake no special pride in the AuDHD label\u0026hellip;\nI\u0026rsquo;ll talk about myself with this label as a way of communicating with people who\nunderstand it, but the main point of this post will be in how understanding\nmyself as a human being more holistically led to a different point of view of\nwhat the West calls neurodivergencies.\u003c/p\u003e\n\u003ch1 id=\"treatment\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTreatment\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eI have been taking a light mood stabilizer for a while now per my former\nbi-polar diagnosis. There\u0026rsquo;s no doubt that it is coincidentally a helpful tool\nin coping with some debilitating aspects of AuDHD but the more I reflect the\nmore I want to get away from it - personally.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m not sure what to think about treatment overall\u0026hellip; I recognize that some folks are\nmuch more negatively affected by the tendencies we label as neurodivergent and\nthat there are meaningful changes that can come from modern western medicine.\nHowever, there\u0026rsquo;s also old/ancient and natural solutions to many problems that I\nthink are often overlooked\u003c/p\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003eSimple doesn't mean easy\u003c/p\u003e\n\u003cp\u003eoften exercise and cleaner eating can treat depression and anxiety for\nexample. That doesn\u0026rsquo;t mean the anxiety wasn\u0026rsquo;t significant or legitimate, but\nit\u0026rsquo;s not like a pharmaceutical is the only option for treating something\nlegitimate.\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition warning\"\u003e\n\u003cp class=\"admonition-title\"\u003eThe other side\u003c/p\u003e\n\u003cp\u003eI also see that obviously there are severe cases of Autism - I think we\nshould better understand where that comes from, and I wouldn\u0026rsquo;t ever claim\nthat just drinking some tea and figuring out an exercise regime can cure\nsomething that is fully debilitating.\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eLas drogas\u003c/p\u003e\n\u003cp\u003eI think where I have the biggest issues with \u0026ldquo;treatment\u0026rdquo; is that taking\nmental health medication is a fad today\u0026hellip; it doesn\u0026rsquo;t mean it\u0026rsquo;s not helpful,\nbut our culture glorifies taking drugs as long as they come from a\npharmaceutical company. I\u0026rsquo;ve personally come across this as I\u0026rsquo;ve shared my\nstruggles and official AuDHD diagnosis with some friends -  and it\u0026rsquo;s clear that\nsome of them give these ads and medicines every ounce of their faith and\nthat\u0026rsquo;s frankly concerning in its own way\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"two-systems-east-v-west\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTwo Systems | East v West\u003c/span\u003e \u003ca href=\"#two-systems-east-v-west\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI\u0026rsquo;ve become critical of the modern Western perspective on neurodivergence\nand mental/behavioral health. It\u0026rsquo;s primarily that I\u0026rsquo;d be much less skeptical if\nit wasn\u0026rsquo;t for all the money\u0026hellip; I notice patterns as well that I don\u0026rsquo;t find\ncomforting - such as the focus on symptoms and isolated treatment of them or\ngroups of symptoms rather than looking at a human-being as an entire organism or\nsystem.\nI know that certain pieces of a system can break, and sometimes treating\nthose isolated breakages is the way to go - but also we (in the West) seem to\navoid thinking about ourselves as 1 whole thing\u0026hellip; There\u0026rsquo;s language that\nyounger people use about their \u0026ldquo;whole self\u0026rdquo; but honestly I only see them talk\nabout sexuality as if that defined everything about a person\u0026hellip; that\u0026rsquo;s 100% not\nwhat I have in mind here\u0026hellip;\u003c/p\u003e\n\u003cp\u003eEvery one of my psychiatric appointments up through the last few years had never\nsought to get me off my medication\u0026hellip; It got me thinking the goal was for me to be\na customer for life. I don\u0026rsquo;t like being reliant on anything external and the\nfact that there was never a goal for me to be self-sufficient in my own health\nbecame troubling.\u003c/p\u003e\n\u003cp\u003eMy philosophical issues arising with our modern medical systems have led me\nto becoming more open to Eastern medicine and as I explore how those systems\nhave historically analyzed patterns and attributed those patterns to different\nways of thinking, I think the pattern-analysis and subsequent recommendations\ncan be extremely valuable. This is where adaptogens come in for me.\u003c/p\u003e\n\u003ch2 id=\"lifestyle-changes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLifestyle Changes\u003c/span\u003e \u003ca href=\"#lifestyle-changes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI\u0026rsquo;d heard of Lion\u0026rsquo;s Mane via some Joe Rogan clips (have become a bigger and\nbigger fan of him over the last few years), and then got a subscription to\nFourSigmatic which is a coffee company that offers mushroom-replacement and\nsupplements for coffee and tea basically. So I\u0026rsquo;m drinking coffee with Lion\u0026rsquo;s\nMane, and have added a few other mushroom tinctures with Reishi and Chaga\nspecifically, as well as Eleuthero and Turkey Tail as a means of introducing\nadaptogens into my routine and maybe it\u0026rsquo;s confirmation bias again, but as I\u0026rsquo;ve\ngone on and off the Lion\u0026rsquo;s Mane specifically I notice a significant difference\nin my cognitive function\u0026hellip; When I\u0026rsquo;m diligent about putting the Lion\u0026rsquo;s Mane\ntincture into my coffee in the morning it is like unlocking on-demand\nhyper-focus some mornings\u0026hellip;\u003c/p\u003e\n\u003ch1 id=\"wrapping-it-up\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWrapping It Up\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eThis post is mostly a stream-of-consciousness as I reflect on the atpypical\nnature of much of my life, how that fits into the modern Western discourse of\nmental health, and how the Western perspective might end up not being a helpful lens\nthrough which to process these behavioral issues.\u003c/p\u003e\n\u003cp\u003eWith sufficient context, a faithful summary of my journey is that I don\u0026rsquo;t mind being labeled as AuDHD - there\u0026rsquo;s plenty that\u0026rsquo;s helpful with it. However if an Ayuverdic Shaman \u0026ldquo;diagnosed\u0026rdquo; me as a person whose elemental make up was primarily earthy and watery with an odd flare of fire, and that elemental make-up is what explains some of my tendencies (needing to know the correct answer, tunnel-vision and hyper-focus, literal understanding of the world, etc.) then I want to understand that with the same amount of \u0026ldquo;weight\u0026rdquo; as being AuDHD..\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eTLDR\u003c/p\u003e\n\u003cp\u003eAt the end of the day there\u0026rsquo;s multiple ways to label people based on\nobservation - either at the micro or macro levels of humanity. I don\u0026rsquo;t think\nthat the Western systems of medicine get everything right, and the Eastern\nmodels have been around for thousands more years so I want to treat them with\nan equal amount of respect and validity\u003c/p\u003e\n\u003c/div\u003e\n",
      "content_text": "\n# Introduction\n\nI was recently diagnosed with Autism Spectrum Disorder Level 1 and ADHD, the inattentive\ntype. I suppose, AuDHD for short.\nThere are many reasons why I now have this official label of AuDHD, not that I\nwas hoping for it, but due to a childhood behavioral disorder diagnosis and a\ndesire to understand myself better, I decided to start considering that something\nin my childhood issue was misunderstood.\n\n!!! note \"\"\n    But what started as simply considering some new diagnosis turned into a\n    larger worldview shift when it comes to medicine and how we treat people for\n    things we label disorderly.\n\n## Personal History\n\nA brief history lesson for context is that I was diagnosed with bipolar\ndisorder, but not specifically type 1 or type 2. This diagnosis came about two\ntimes, once in my late childhood and again when I was 19.\nThe diagnosis never made a ton of sense to me, but it seemed to almost match some of\nthe things that my mom specifically was concerned about.\nThere is another point for later on, which is that part of me wanted to be bipolar.\nI felt like it would be cool, but also it made me special.\n\n!!! warning \"bias\"\n    There's no way that this desire didn't turn into massive confirmation bias\n    in getting this diagnosis as a kid and as a late teenager.\n\nOnce I started kind of thinking *for myself* a little bit - the bipolar diagnosis\nwas one of my first spiritual challenges in understanding the brokenness of\nhumanity.\n\n## The Challenge\n\nI believe in an orderly God, the creator of all things, who makes things both\nsoundly and reasonable. Mental health is complex because it's not like a broken\narm, throw a cast on, and wait... Taking medicine felt almost antithetical to\nmy worldview because I had a deep desire to see\nsomething miraculous. So, I backed myself into this odd worldview where I\ntaking medicine must be fighting something that God wants to do in me with this\nbrokenness. I felt like I was trying to do something maybe God didn't want me to\ndo, but was also wrestling with \"but if something's really wrong (which is\npossible because we live in a broken world) God gifts these doctors to come up\nwith this medicine to help heal some of the brokenness.\"\n\nSo I had these two competing ideas that were very loud in my head.\n\n!!! note \"\"\n    In hindsight, an AuDHD diagnosis somewhat explains this behavior of mine.\n    Wherein I wanted to be sick, and I had these competing ideas about the\n    character of God.\n\nSo I've been more at less at peace with the idea that behavior disorders are\napart of life for many people - and that medical treatment can be helpful.\n\n# Reflection\n\nAs I've gotten older and reflected on being bi-polar I couldn't help but notice\nthat hardly any part of the atypical\npieces of myself matched up with bi-polar at all... Around the time I started\nto notice this my wife began wondering if I had something more akin to ADD. We\ndidn't really understand what that meant, or how it has changed over the years,\nor any of it - but based on some initial stereotypes ADHD began to become a\ncommon thing we discussed\nAfter some more legitimate research we both became pretty convinced that I was\nmeasurably on the Autism Spectrum and that certainly there were ADHD tendencies\nthat negatively affected my life. I talked with my doctor and after several\npsych evaluations it turns out that my self-diagnosis was consistent with the\nconclusion of the evaluation. So if this was the end then my thought would've\nbeen \n\n!!! note \"I'm not bi-polar\"\n    ok I'm not bi-polar, I'm AuDHD - there's some coping mechanisms I can\n    learn now and things make sense.\n\nHowever, this wasn't the end for me - getting diagnosed with AuDHD\ndidn't/hasn't changed my life - it's given me a framework by which I can\nunderstand myself in the context of our\nWestern world better.\nBut there's a lot more here and as we look ahead, I want to be clear that I\ntake no special pride in the AuDHD label...\nI'll talk about myself with this label as a way of communicating with people who\nunderstand it, but the main point of this post will be in how understanding\nmyself as a human being more holistically led to a different point of view of\nwhat the West calls neurodivergencies.\n\n# Treatment\n\nI have been taking a light mood stabilizer for a while now per my former\nbi-polar diagnosis. There's no doubt that it is coincidentally a helpful tool\nin coping with some debilitating aspects of AuDHD but the more I reflect the\nmore I want to get away from it - personally.\n\nI'm not sure what to think about treatment overall... I recognize that some folks are\nmuch more negatively affected by the tendencies we label as neurodivergent and\nthat there are meaningful changes that can come from modern western medicine.\nHowever, there's also old/ancient and natural solutions to many problems that I\nthink are often overlooked \n\n!!! quote \"Simple doesn't mean easy\"\n    often exercise and cleaner eating can treat depression and anxiety for\n    example. That doesn't mean the anxiety wasn't significant or legitimate, but\n    it's not like a pharmaceutical is the only option for treating something\n    legitimate.\n\n!!! warning \"The other side\"\n    I also see that obviously there are severe cases of Autism - I think we\n    should better understand where that comes from, and I wouldn't ever claim\n    that just drinking some tea and figuring out an exercise regime can cure\n    something that is fully debilitating.\n\n!!! note \"Las drogas\"\n    I think where I have the biggest issues with \"treatment\" is that taking\n    mental health medication is a fad today... it doesn't mean it's not helpful,\n    but our culture glorifies taking drugs as long as they come from a\n    pharmaceutical company. I've personally come across this as I've shared my\n    struggles and official AuDHD diagnosis with some friends -  and it's clear that\n    some of them give these ads and medicines every ounce of their faith and\n    that's frankly concerning in its own way\n    \n## Two Systems | East v West\n\nI've become critical of the modern Western perspective on neurodivergence\nand mental/behavioral health. It's primarily that I'd be much less skeptical if\nit wasn't for all the money... I notice patterns as well that I don't find\ncomforting - such as the focus on symptoms and isolated treatment of them or\ngroups of symptoms rather than looking at a human-being as an entire organism or\nsystem. \nI know that certain pieces of a system can break, and sometimes treating\nthose isolated breakages is the way to go - but also we (in the West) seem to\navoid thinking about ourselves as 1 whole thing... There's language that\nyounger people use about their \"whole self\" but honestly I only see them talk\nabout sexuality as if that defined everything about a person... that's 100% not\nwhat I have in mind here... \n\nEvery one of my psychiatric appointments up through the last few years had never\nsought to get me off my medication... It got me thinking the goal was for me to be\na customer for life. I don't like being reliant on anything external and the\nfact that there was never a goal for me to be self-sufficient in my own health\nbecame troubling.\n\nMy philosophical issues arising with our modern medical systems have led me\nto becoming more open to Eastern medicine and as I explore how those systems\nhave historically analyzed patterns and attributed those patterns to different\nways of thinking, I think the pattern-analysis and subsequent recommendations\ncan be extremely valuable. This is where adaptogens come in for me.\n\n## Lifestyle Changes\n\nI'd heard of Lion's Mane via some Joe Rogan clips (have become a bigger and\nbigger fan of him over the last few years), and then got a subscription to\nFourSigmatic which is a coffee company that offers mushroom-replacement and\nsupplements for coffee and tea basically. So I'm drinking coffee with Lion's\nMane, and have added a few other mushroom tinctures with Reishi and Chaga\nspecifically, as well as Eleuthero and Turkey Tail as a means of introducing\nadaptogens into my routine and maybe it's confirmation bias again, but as I've\ngone on and off the Lion's Mane specifically I notice a significant difference\nin my cognitive function... When I'm diligent about putting the Lion's Mane\ntincture into my coffee in the morning it is like unlocking on-demand\nhyper-focus some mornings...\n\n# Wrapping It Up\n\nThis post is mostly a stream-of-consciousness as I reflect on the atpypical\nnature of much of my life, how that fits into the modern Western discourse of\nmental health, and how the Western perspective might end up not being a helpful lens\nthrough which to process these behavioral issues.\n\nWith sufficient context, a faithful summary of my journey is that I don't mind being labeled as AuDHD - there's plenty that's helpful with it. However if an Ayuverdic Shaman \"diagnosed\" me as a person whose elemental make up was primarily earthy and watery with an odd flare of fire, and that elemental make-up is what explains some of my tendencies (needing to know the correct answer, tunnel-vision and hyper-focus, literal understanding of the world, etc.) then I want to understand that with the same amount of \"weight\" as being AuDHD.. \n\n!!! note \"TLDR\"\n    At the end of the day there's multiple ways to label people based on\n    observation - either at the micro or macro levels of humanity. I don't think\n    that the Western systems of medicine get everything right, and the Eastern\n    models have been around for thousands more years so I want to treat them with\n    an equal amount of respect and validity\n",
      "summary": "I was recently diagnosed with Autism Spectrum Disorder Level 1 and ADHD, the inattentive type. I suppose, AuDHD for short. There are many reasons why I now...",
      "date_published": "2025-06-05T07:28:42Z",
      "date_modified": "2025-06-05T07:28:42Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "reflection",
        "health",
        "mental-health",
        "autism"
      ]
    },
    {
      "id": "https://pype.dev/backups-interrupted-by-full-disk-usage/",
      "url": "https://pype.dev/backups-interrupted-by-full-disk-usage/",
      "title": "Backups interrupted by full disk usage",
      "content_html": "\u003cp\u003eI just got a message from HCIO that my primary backup script is late\u0026hellip; This\nhappens every now and then but I decided to check on it\u0026hellip; Quickly \u003ccode\u003essh\u003c/code\u003e in and\nI notice it takes a long time to connect, but nothing errors out\u0026hellip; I\u0026rsquo;ve been\nin the game long enough to think this kind of latency is often disk IO. After\nwaiting a bit and haulting the zshrc sourcing, I hit a \u003ccode\u003esudo dust / -H\u003c/code\u003e and bam\u0026hellip;\nThere\u0026rsquo;s a container logfile that\u0026rsquo;s about 80GB sitting in \u003ccode\u003e/var\u003c/code\u003e\u0026hellip;\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e  75G   │ │ │ │   ┌── 57409a7f8d3168b368e0230babd08ec2e20aabb288806aa13652db1e653a0eee-json.log\n  75G   │ │ │ │ ┌─┴ 57409a7f8d3168b368e0230babd08ec2e20aabb288806aa13652db1e653a0eee           \n  76G   │ │ │ ├─┴ containers                                                                   \n  83G   │ │ ├─┴ docker                                                                         \n  85G   │ ├─┴ lib                                                                              \n  90G   ├─┴ var                                                                                \n 117G ┌─┴ /\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eEasy enough to remove, but I need to setup some alerts on disk usage, and\nidentify the container to limit the log file size\u003c/p\u003e\n\u003cdiv class=\"admonition info\"\u003e\n\u003cp class=\"admonition-title\"\u003eUseful Notifications\u003c/p\u003e\n\u003cp\u003eI use healthchecks.io to monitor several scripts. You can self-host it but\nI use the hosted service since he has simple Signal integration\u003c/p\u003e\n\u003c/div\u003e\n",
      "content_text": "\n\nI just got a message from HCIO that my primary backup script is late... This\nhappens every now and then but I decided to check on it... Quickly `ssh` in and\nI notice it takes a long time to connect, but nothing errors out... I've been\nin the game long enough to think this kind of latency is often disk IO. After\nwaiting a bit and haulting the zshrc sourcing, I hit a `sudo dust / -H` and bam...\nThere's a container logfile that's about 80GB sitting in `/var`...\n\n```\n  75G   │ │ │ │   ┌── 57409a7f8d3168b368e0230babd08ec2e20aabb288806aa13652db1e653a0eee-json.log\n  75G   │ │ │ │ ┌─┴ 57409a7f8d3168b368e0230babd08ec2e20aabb288806aa13652db1e653a0eee           \n  76G   │ │ │ ├─┴ containers                                                                   \n  83G   │ │ ├─┴ docker                                                                         \n  85G   │ ├─┴ lib                                                                              \n  90G   ├─┴ var                                                                                \n 117G ┌─┴ /\n```\n\nEasy enough to remove, but I need to setup some alerts on disk usage, and\nidentify the container to limit the log file size\n\n!!! info \"Useful Notifications\"\n\n    I use healthchecks.io to monitor several scripts. You can self-host it but\n    I use the hosted service since he has simple Signal integration\n\n\n",
      "summary": "I just got a message from HCIO that my primary backup script is late... This happens every now and then but I decided to check on it... Quickly in and I...",
      "date_published": "2025-06-03T21:08:50Z",
      "date_modified": "2025-06-03T21:08:50Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/windows-update-broke-wifi/",
      "url": "https://pype.dev/windows-update-broke-wifi/",
      "title": "Windows Update Broke Wifi",
      "content_html": "\u003ch1 id=\"windows-update-behind-my-back\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWindows Update Behind My Back\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eAfter an unapproved windows update on a machine I help administer for my church, the wifi\nbecame super finnicky. I had installed a pretty standard AX5400 WiFi 6 PCIe\nadapter and things were great for a while.\u003c/p\u003e\n\u003ch2 id=\"isp-and-top-tier-laziness\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eISP and Top-Tier Laziness\u003c/span\u003e \u003ca href=\"#isp-and-top-tier-laziness\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe ISP installed the modem and router/AP combo all in one room encased in CMU block in the basement\u0026hellip;\nThat is in the worst possible spot in the entire building and the Windows\ncomputer of note is as far away from it as possible - but we were cooking just fine with that PCIe card.\nSuddenly though, after the update and reboot the machine quit receiving an IPv4\naddress via that interface\u0026hellip; Many applications broke in odd ways, and the\nbrowser connected to some websites but not others.\u003c/p\u003e\n\u003ch2 id=\"state-matters\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eState Matters\u003c/span\u003e \u003ca href=\"#state-matters\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIt took a lot of troubleshooting because of 2 things in the mix\u0026hellip;\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eTailscale\u003c/li\u003e\n\u003cli\u003eA second Wi-Fi adapter via USB dongle that was installed while I was out of town (due to the WiFi issues)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eSo because of these 2 things, and mostly the USB adapter I think, we saw odd\nbehavior that was inconsistent and hard to explain. After having sorted through a bit, I think the intermittent nature of the problems was due to the USB dongle getting an IPv4 address when the connectivity via the default interface was messed up - I can\u0026rsquo;t claim to know if or how Windows would handle this, but it\u0026rsquo;s the only thing that makes sense to me as to why some of the appliations would work and then randomly fail - it\u0026rsquo;s the USB dongle losing connection\u0026hellip; The extra layer is that the bad NIC (the PCIe card) was getting an IPv6 address so the internet connectivity worked EXCEPT FOR THINGS ON MY TAILNET - for example the Nextcloud instance the church backs some data up to\u0026hellip; So the issues were hard to pin-point.\u003c/p\u003e\n\u003ch2 id=\"medium-term-plan\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMedium Term Plan…\u003c/span\u003e \u003ca href=\"#medium-term-plan\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eOur medium term plan is to move the AP of the church to somewhere more\nconvenient after we figure out busting through some concrete walls\u0026hellip;\u003c/p\u003e\n",
      "content_text": "\n# Windows Update Behind My Back\n\nAfter an unapproved windows update on a machine I help administer for my church, the wifi\nbecame super finnicky. I had installed a pretty standard AX5400 WiFi 6 PCIe\nadapter and things were great for a while.\n\n## ISP and Top-Tier Laziness\n\nThe ISP installed the modem and router/AP combo all in one room encased in CMU block in the basement...\nThat is in the worst possible spot in the entire building and the Windows\ncomputer of note is as far away from it as possible - but we were cooking just fine with that PCIe card. \nSuddenly though, after the update and reboot the machine quit receiving an IPv4\naddress via that interface... Many applications broke in odd ways, and the\nbrowser connected to some websites but not others. \n\n## State Matters\n\nIt took a lot of troubleshooting because of 2 things in the mix...\n\n* Tailscale\n* A second Wi-Fi adapter via USB dongle that was installed while I was out of town (due to the WiFi issues)\n\nSo because of these 2 things, and mostly the USB adapter I think, we saw odd\nbehavior that was inconsistent and hard to explain. After having sorted through a bit, I think the intermittent nature of the problems was due to the USB dongle getting an IPv4 address when the connectivity via the default interface was messed up - I can't claim to know if or how Windows would handle this, but it's the only thing that makes sense to me as to why some of the appliations would work and then randomly fail - it's the USB dongle losing connection... The extra layer is that the bad NIC (the PCIe card) was getting an IPv6 address so the internet connectivity worked EXCEPT FOR THINGS ON MY TAILNET - for example the Nextcloud instance the church backs some data up to... So the issues were hard to pin-point.\n\n## Medium Term Plan...\n\nOur medium term plan is to move the AP of the church to somewhere more\nconvenient after we figure out busting through some concrete walls...\n\n",
      "summary": "After an unapproved windows update on a machine I help administer for my church, the wifi became super finnicky. I had installed a pretty standard AX5400...",
      "date_published": "2025-06-01T14:30:43Z",
      "date_modified": "2025-06-01T14:30:43Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "tech",
        "windows"
      ]
    },
    {
      "id": "https://pype.dev/queso-notes/",
      "url": "https://pype.dev/queso-notes/",
      "title": "Queso Notes",
      "content_html": "\u003cp\u003eIt occured to me that this is my blog\u0026hellip; I can write about whatever the heck I want!\u003c/p\u003e\n\u003ch2 id=\"may-2025\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMay 2025\u003c/span\u003e \u003ca href=\"#may-2025\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eMade 2 quesos very similar - they consisted of:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e1.5 lbs ground beef\u003c/li\u003e\n\u003cli\u003e2 lbs Velveeta (queso blanco or original)\u003c/li\u003e\n\u003cli\u003e~ 0.75 lbs Pepper Jack\u003c/li\u003e\n\u003cli\u003e~ 0.75 lbs Chedder\u003c/li\u003e\n\u003cli\u003e16 oz diced tomatoes\u003c/li\u003e\n\u003cli\u003e8 oz diced chilis\u003c/li\u003e\n\u003cli\u003e6 oz. jar of sliced jalepenos (for the queso blanco)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eI basically browned the meat, and combined everything in a foil pan and smoked\nfor an hour or 2, stirring regularly.\u003c/p\u003e\n\u003cp\u003eThe Queso Blanco one was a little runnier, no doubt due to the added jalepenos.\nBoth queso\u0026rsquo;s turned out pretty good but could definitely use a lot more heat. I\nseasoned the meat with some salt, pepper, garlic, onion powder, cumin. We could\nadd jalepenos to regular queso for the flavor since there was almost no heat,\nand then add serrano or something to the queso blanco to turn the heat up next\ntime.\u003c/p\u003e\n\u003cp\u003eStay tuned to this post somehow for the next update!\u003c/p\u003e\n\u003cp\u003eQ: How to start a series?\nQ: Does RSS update if a post is updated?\u003c/p\u003e\n",
      "content_text": "\nIt occured to me that this is my blog... I can write about whatever the heck I want!\n\n## May 2025\n\nMade 2 quesos very similar - they consisted of:\n\n- 1.5 lbs ground beef\n- 2 lbs Velveeta (queso blanco or original)\n- ~ 0.75 lbs Pepper Jack\n- ~ 0.75 lbs Chedder\n- 16 oz diced tomatoes\n- 8 oz diced chilis\n- 6 oz. jar of sliced jalepenos (for the queso blanco)\n\nI basically browned the meat, and combined everything in a foil pan and smoked\nfor an hour or 2, stirring regularly.\n\nThe Queso Blanco one was a little runnier, no doubt due to the added jalepenos.\nBoth queso's turned out pretty good but could definitely use a lot more heat. I\nseasoned the meat with some salt, pepper, garlic, onion powder, cumin. We could\nadd jalepenos to regular queso for the flavor since there was almost no heat,\nand then add serrano or something to the queso blanco to turn the heat up next\ntime.\n\nStay tuned to this post somehow for the next update!\n\nQ: How to start a series?\nQ: Does RSS update if a post is updated?\n",
      "summary": "It occured to me that this is my blog... I can write about whatever the heck I want!",
      "date_published": "2025-05-31T19:14:30Z",
      "date_modified": "2025-05-31T19:14:30Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "queso",
        "cooking",
        "smoking"
      ]
    },
    {
      "id": "https://pype.dev/backups-are-dope/",
      "url": "https://pype.dev/backups-are-dope/",
      "title": "Backups are dope",
      "content_text": "\nI accidently chown'd -R an app directory and it totally screwed up the database\nfolder. Luckily I zfs replicate my docker volumes to another drive even on the\nsame host, so a quick [rsync] from /harbor/encrypted/docker/manyfold to\n/tank/encrypted/docker/manyfold got me back up and running since I hadn't\nreplicated the messed up permission set yet\n\nQ: How to link to my rsync like a pro post?\n\nA: Wikilinks `[[rsync-like-a-pro]]` [[rsync-like-a-pro]]\n",
      "summary": "I accidently chown'd -R an app directory and it totally screwed up the database folder. Luckily I zfs replicate my docker volumes to another drive even on...",
      "date_published": "2025-05-27T19:42:27Z",
      "date_modified": "2025-05-27T19:42:27Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "tech",
        "homelab",
        "zfs",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/aurora-u-blue-zram-config/",
      "url": "https://pype.dev/aurora-u-blue-zram-config/",
      "title": "Aurora U-Blue ZRAM Config",
      "content_html": "\u003cp\u003eI keep running out of space with my swap getting maxxed out\u0026hellip; I don\u0026rsquo;t know why but U-Blue uses Zram already and apparently I can easily override the defaults:\u003c/p\u003e\n\u003cp\u003ein \u003ccode\u003eusr/lib/systemd/zram-generator.conf\u003c/code\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"language-conf\"\u003e\n# This config file enables a /dev/zram0 device with the default settings:\n# — size — same as available RAM or 8GB, whichever is less\n# — compression — most likely lzo-rle\n#\n# To disable, uninstall zram-generator-defaults or create empty\n# /etc/systemd/zram-generator.conf file.\n[zram0]\nzram-size = min(ram, 8192)\n\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eAnd so I just made my own file in \u003ccode\u003e/etc/systemd/zram-generator.conf\u003c/code\u003e:\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"language-conf\"\u003e\n[zram0]\nzram-size = min(ram, 16384)\n\n\u003c/code\u003e\u003c/pre\u003e\n",
      "content_text": "\nI keep running out of space with my swap getting maxxed out... I don't know why but U-Blue uses Zram already and apparently I can easily override the defaults:\n\nin `usr/lib/systemd/zram-generator.conf`\n\n```conf\n\n# This config file enables a /dev/zram0 device with the default settings:\n# — size — same as available RAM or 8GB, whichever is less\n# — compression — most likely lzo-rle\n#\n# To disable, uninstall zram-generator-defaults or create empty\n# /etc/systemd/zram-generator.conf file.\n[zram0]\nzram-size = min(ram, 8192)\n\n```\n\nAnd so I just made my own file in `/etc/systemd/zram-generator.conf`:\n\n```conf\n\n[zram0]\nzram-size = min(ram, 16384)\n\n```\n",
      "summary": "I keep running out of space with my swap getting maxxed out... I don't know why but U-Blue uses Zram already and apparently I can easily override the defaults:",
      "date_published": "2025-05-27T13:51:27Z",
      "date_modified": "2025-05-27T13:51:27Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "infrastructure",
        "infrastructure",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/i-hate-corporate-america/",
      "url": "https://pype.dev/i-hate-corporate-america/",
      "title": "I Hate Corporate America",
      "content_html": "\u003ch1 id=\"rant\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRant\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eThe longer I\u0026rsquo;m in corporate America - and the longer I homelab and listen to\npodcasts - a cliché truth becomes more and more apparent to me, which\nis a lot of people are full of bullshit, and a lot of initiatives are built on\nnothing, and a lot of people feel the need to be/feel important.\u003c/p\u003e\n\u003cdiv class=\"admonition danger\"\u003e\n\u003cp class=\"admonition-title\"\u003eDanger\u003c/p\u003e\n\u003cp\u003eThat makes it hard to do things and find things that are actually valuable.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eSo, for this rant to be healthy I suppose I\u0026rsquo;ll muse for a little while on\nfinding things of value in these contexts that suck.\u003c/p\u003e\n\u003cp\u003eI want to be thankful for finding things that matter when I\u0026rsquo;m\nforced to participate in contexts that I think are stupid.\u003c/p\u003e\n\u003ch1 id=\"redemption\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRedemption\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eSo what good has come? The first is financial blessing - I hate that money runs\nthe worls, but God has given me a skill-set where the work does afford a\nmoderately comfortable life.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve met some good friends of faith through the machine that is corporate America,\nand the friendships are a source of regular encouragement via The Boys Chat.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve also met a couple friends of tech (so to speak) and through those\nfriendships I\u0026rsquo;ve discovered fun hobbies which have affected\nmy family life and home in very positive ways.\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eEnding the rant\u003c/p\u003e\n\u003cp\u003eThere can be good redeeming things anywhere, and it\u0026rsquo;s kind of a meme to hate\ncorporate America this much, but I really do and I look forward to Heaven\ncoming to Earth fully. Until then, gratitude is a good daily practice\u003c/p\u003e\n\u003c/div\u003e\n",
      "content_text": "\n# Rant\n\nThe longer I'm in corporate America - and the longer I homelab and listen to\npodcasts - a cliché truth becomes more and more apparent to me, which\nis a lot of people are full of bullshit, and a lot of initiatives are built on\nnothing, and a lot of people feel the need to be/feel important. \n\n!!! danger \"\"\n    That makes it hard to do things and find things that are actually valuable.\n\nSo, for this rant to be healthy I suppose I'll muse for a little while on\nfinding things of value in these contexts that suck.\n\nI want to be thankful for finding things that matter when I'm\nforced to participate in contexts that I think are stupid.\n\n# Redemption\n\nSo what good has come? The first is financial blessing - I hate that money runs\nthe worls, but God has given me a skill-set where the work does afford a\nmoderately comfortable life.\n\nI've met some good friends of faith through the machine that is corporate America,\nand the friendships are a source of regular encouragement via The Boys Chat.\n\nI've also met a couple friends of tech (so to speak) and through those\nfriendships I've discovered fun hobbies which have affected\nmy family life and home in very positive ways.\n\n!!! note \"Ending the rant\"\n    There can be good redeeming things anywhere, and it's kind of a meme to hate\n    corporate America this much, but I really do and I look forward to Heaven\n    coming to Earth fully. Until then, gratitude is a good daily practice\n",
      "summary": "The longer I'm in corporate America - and the longer I homelab and listen to podcasts - a cliché truth becomes more and more apparent to me, which is a lot...",
      "date_published": "2025-05-27T08:11:52Z",
      "date_modified": "2025-05-27T08:11:52Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "reflection",
        "rant"
      ]
    },
    {
      "id": "https://pype.dev/pandas-dataframe-info-always-answers-and-is-sometimes-right/",
      "url": "https://pype.dev/pandas-dataframe-info-always-answers-and-is-sometimes-right/",
      "title": "Pandas.DataFrame info always answers and is sometimes right",
      "content_html": "\u003ch1 id=\"til\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTIL\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eToday I learned that the \u003ccode\u003e.info()\u003c/code\u003e of a \u003ccode\u003epandas.DataFrame\u003c/code\u003e will always\ngive you an answer, but it is wildly difficult to know how accurate it is, because it depends\non the underlying data types.\nIf everything is a NumPy Dtype, then the result you get is the amount of memory NumPy is using\nunder the hood, which is very accurate.\nBut as soon as you have something like a Python string in the data frame, now pandas will\ntell you how much memory the NumPy data types are using, and it will give you some quick\nestimate of how much memory space the Python string types are using because numpy is just storing\na pointer to that data in memory, but this is far less\naccurate because it doesn\u0026rsquo;t actually know what the strings are.\u003c/p\u003e\n\u003ch2 id=\"memory-usage-deep-or-true\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMemory Usage Deep or True\u003c/span\u003e \u003ca href=\"#memory-usage-deep-or-true\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eTo get an honest answer about a DataFrame\u0026rsquo;s memory usage, you need to pass \u003ccode\u003ememory_usage='deep'\u003c/code\u003e to the \u003ccode\u003e.info()\u003c/code\u003e method.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# This is the default\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eIn \u003cspan class=\"o\"\u003e[\u003c/span\u003e50\u003cspan class=\"o\"\u003e]\u003c/span\u003e: df.info\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003ememory_usage\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003eTrue\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;class \u003cspan class=\"s1\"\u003e\u0026#39;pandas.core.frame.DataFrame\u0026#39;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eRangeIndex: \u003cspan class=\"m\"\u003e10\u003c/span\u003e entries, \u003cspan class=\"m\"\u003e0\u003c/span\u003e to \u003cspan class=\"m\"\u003e9\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eData columns \u003cspan class=\"o\"\u003e(\u003c/span\u003etotal \u003cspan class=\"m\"\u003e3\u003c/span\u003e columns\u003cspan class=\"o\"\u003e)\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e#   Column  Non-Null Count  Dtype \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=\"m\"\u003e0\u003c/span\u003e   s1      \u003cspan class=\"m\"\u003e10\u003c/span\u003e non-null     int64 \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"m\"\u003e1\u003c/span\u003e   s2      \u003cspan class=\"m\"\u003e10\u003c/span\u003e non-null     int64 \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e   s3      \u003cspan class=\"m\"\u003e10\u003c/span\u003e non-null     object\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edtypes: int64\u003cspan class=\"o\"\u003e(\u003c/span\u003e2\u003cspan class=\"o\"\u003e)\u003c/span\u003e, object\u003cspan class=\"o\"\u003e(\u003c/span\u003e1\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ememory usage: 372.0+ bytes\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNotice that the memory usage has a \u003ccode\u003e+\u003c/code\u003e in it? You can force a deeper analysis by passing \u003ccode\u003ememory_usage='deep'\u003c/code\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eIn \u003cspan class=\"o\"\u003e[\u003c/span\u003e51\u003cspan class=\"o\"\u003e]\u003c/span\u003e: df.info\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003ememory_usage\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;deep\u0026#39;\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\u0026lt;class \u003cspan class=\"s1\"\u003e\u0026#39;pandas.core.frame.DataFrame\u0026#39;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eRangeIndex: \u003cspan class=\"m\"\u003e10\u003c/span\u003e entries, \u003cspan class=\"m\"\u003e0\u003c/span\u003e to \u003cspan class=\"m\"\u003e9\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eData columns \u003cspan class=\"o\"\u003e(\u003c/span\u003etotal \u003cspan class=\"m\"\u003e3\u003c/span\u003e columns\u003cspan class=\"o\"\u003e)\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e#   Column  Non-Null Count  Dtype \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=\"m\"\u003e0\u003c/span\u003e   s1      \u003cspan class=\"m\"\u003e10\u003c/span\u003e non-null     int64 \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"m\"\u003e1\u003c/span\u003e   s2      \u003cspan class=\"m\"\u003e10\u003c/span\u003e non-null     int64 \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e   s3      \u003cspan class=\"m\"\u003e10\u003c/span\u003e non-null     object\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edtypes: int64\u003cspan class=\"o\"\u003e(\u003c/span\u003e2\u003cspan class=\"o\"\u003e)\u003c/span\u003e, object\u003cspan class=\"o\"\u003e(\u003c/span\u003e1\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ememory usage: 792.0 bytes\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\n# TIL\n\nToday I learned that the `.info()` of a `pandas.DataFrame` will always\ngive you an answer, but it is wildly difficult to know how accurate it is, because it depends\non the underlying data types.\nIf everything is a NumPy Dtype, then the result you get is the amount of memory NumPy is using\nunder the hood, which is very accurate.\nBut as soon as you have something like a Python string in the data frame, now pandas will\ntell you how much memory the NumPy data types are using, and it will give you some quick\nestimate of how much memory space the Python string types are using because numpy is just storing \na pointer to that data in memory, but this is far less\naccurate because it doesn't actually know what the strings are.\n\n## Memory Usage Deep or True\n\nTo get an honest answer about a DataFrame's memory usage, you need to pass `memory_usage='deep'` to the `.info()` method. \n\n```bash\n# This is the default\nIn [50]: df.info(memory_usage=True)\n\u003cclass 'pandas.core.frame.DataFrame'\u003e\nRangeIndex: 10 entries, 0 to 9\nData columns (total 3 columns):\n #   Column  Non-Null Count  Dtype \n---  ------  --------------  ----- \n 0   s1      10 non-null     int64 \n 1   s2      10 non-null     int64 \n 2   s3      10 non-null     object\ndtypes: int64(2), object(1)\nmemory usage: 372.0+ bytes\n```\n\nNotice that the memory usage has a `+` in it? You can force a deeper analysis by passing `memory_usage='deep'`\n\n```bash\nIn [51]: df.info(memory_usage='deep')\n\u003cclass 'pandas.core.frame.DataFrame'\u003e\nRangeIndex: 10 entries, 0 to 9\nData columns (total 3 columns):\n #   Column  Non-Null Count  Dtype \n---  ------  --------------  ----- \n 0   s1      10 non-null     int64 \n 1   s2      10 non-null     int64 \n 2   s3      10 non-null     object\ndtypes: int64(2), object(1)\nmemory usage: 792.0 bytes\n```\n\n\n",
      "summary": "Today I learned that the of a will always give you an answer, but it is wildly difficult to know how accurate it is, because it depends on the underlying...",
      "date_published": "2025-05-26T09:08:08Z",
      "date_modified": "2025-05-26T09:08:08Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "python",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-643/",
      "url": "https://pype.dev/thoughts-643/",
      "title": "💭 SearXNG | Open WebUI",
      "content_text": "\n\u003ca href=\"https://docs.openwebui.com/tutorials/web-search/searxng/\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://docs.openwebui.com/tutorials/web-search/searxng/\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - SearXNG | Open WebUI\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://docs.openwebui.com/tutorials/web-search/searxng/\"\u003eSearXNG | Open WebUI\u003c/a\u003e\n\n---\n\nI've been meaning to set searxng for a while - it comes out of the box with khoj but I want an instance for open-webui as I get serious about deciding on a self-hosted AI tool-chain solution. It look like the setup for open-webui is a touch more than \"docker compose up\" so it'll take probably 15-20 minutes of dedicated time to try this out\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "I've been meaning to set searxng for a while - it comes out of the box with khoj but I want an instance for open-webui a",
      "date_published": "2025-05-25T11:21:40Z",
      "date_modified": "2025-05-25T11:21:40Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "open-webui",
        "search",
        "ai",
        "self-hosted",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/searxng/",
      "url": "https://pype.dev/searxng/",
      "title": "SearXNG",
      "content_html": "\u003cp\u003eI heard about \u003ca href=\"https://searxng.org\"\u003eSearXNG\u003c/a\u003e on a couple podcasts and saw it trending on GitHub\nseveral times before I finally decided to stand it up.\nI used it transparently when trying out \u003ca href=\"https://khoj.dev/\"\u003ekhoj\u003c/a\u003e, a self-hosted AI LLM agent\nplayground kind of a thing, but I\u0026rsquo;ve also been messing around with \u003ca href=\"https://openwebui.com\"\u003eOpen-WebUI\u003c/a\u003e to\nhave a self-hosted ChatGPT-like experience.\nI don\u0026rsquo;t know if SearchXNG used to be harder to set up, but it was pretty simple with a Docker Compose up\nand a couple configuration options given my personal homelab setup. Using it feels\nvery nice.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eservices\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\"\u003eredis\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\"\u003econtainer_name\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eredis\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\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003edocker.io/valkey/valkey:8-alpine\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\"\u003ecommand\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003evalkey-server --save 30 1 --loglevel warning\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\"\u003erestart\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eunless-stopped\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\"\u003evolumes\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\"\u003e./data/redis:/data\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\"\u003elogging\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\"\u003edriver\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;json-file\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=\"nt\"\u003eoptions\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\"\u003emax-size\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;1m\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=\"nt\"\u003emax-file\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;1\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\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\"\u003esearxng\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\"\u003econtainer_name\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003esearxng\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\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003edocker.io/searxng/searxng:latest\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\"\u003erestart\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eunless-stopped\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\"\u003eports\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=\"s2\"\u003e\u0026#34;8080:8080\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=\"nt\"\u003evolumes\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\"\u003e./data/searxng:/etc/searxng:rw\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\"\u003eenv_file\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e.env\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\"\u003eenvironment\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=\"c\"\u003e# - SEARXNG_BASE_URL=https://${SEARXNG_HOSTNAME:-localhost}/\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\"\u003eUWSGI_WORKERS=${SEARXNG_UWSGI_WORKERS:-4}\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\"\u003eUWSGI_THREADS=${SEARXNG_UWSGI_THREADS:-4}\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\"\u003elogging\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\"\u003edriver\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;json-file\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=\"nt\"\u003eoptions\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\"\u003emax-size\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;1m\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=\"nt\"\u003emax-file\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;1\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eI love the self-hosted aspect. I love not seeing any ads on my search\nresults. I did a few searches where I know what results to expect and\nit did okay.\nIt is good right now at filtering out garbage in my results.\u003c/p\u003e\n\u003cfigure\u003e\n\u003cimg src=\"https://dropper.wayl.one/api/file/4ff5953c-bc8d-4978-8509-b43582460a0b.png\" alt=\"SearXNG\"\u003e\n\u003c/figure\u003e\n\u003cp\u003eSo I look forward to tweaking it and using it as a search\nbackend with open web UI. Next on my list is having enough resources to run\nOllama and a stable diffusion generator at the same time and have image\ngeneration working through open web UI.\u003c/p\u003e\n",
      "content_text": "\n\nI heard about [SearXNG](https://searxng.org) on a couple podcasts and saw it trending on GitHub\nseveral times before I finally decided to stand it up. \nI used it transparently when trying out [khoj](https://khoj.dev/), a self-hosted AI LLM agent\nplayground kind of a thing, but I've also been messing around with [Open-WebUI](https://openwebui.com) to\nhave a self-hosted ChatGPT-like experience. \nI don't know if SearchXNG used to be harder to set up, but it was pretty simple with a Docker Compose up\nand a couple configuration options given my personal homelab setup. Using it feels\nvery nice. \n\n```yaml\nservices:\n  redis:\n    container_name: redis\n    image: docker.io/valkey/valkey:8-alpine\n    command: valkey-server --save 30 1 --loglevel warning\n    restart: unless-stopped\n    volumes:\n      - ./data/redis:/data\n    logging:\n      driver: \"json-file\"\n      options:\n        max-size: \"1m\"\n        max-file: \"1\"\n\n  searxng:\n    container_name: searxng\n    image: docker.io/searxng/searxng:latest\n    restart: unless-stopped\n    ports:\n      - \"8080:8080\"\n    volumes:\n      - ./data/searxng:/etc/searxng:rw\n    env_file: .env\n    environment:\n      # - SEARXNG_BASE_URL=https://${SEARXNG_HOSTNAME:-localhost}/\n      - UWSGI_WORKERS=${SEARXNG_UWSGI_WORKERS:-4}\n      - UWSGI_THREADS=${SEARXNG_UWSGI_THREADS:-4}\n    logging:\n      driver: \"json-file\"\n      options:\n        max-size: \"1m\"\n        max-file: \"1\"\n```\n\nI love the self-hosted aspect. I love not seeing any ads on my search\nresults. I did a few searches where I know what results to expect and\nit did okay. \nIt is good right now at filtering out garbage in my results. \n\n![SearXNG](https://dropper.wayl.one/api/file/4ff5953c-bc8d-4978-8509-b43582460a0b.png)\n\nSo I look forward to tweaking it and using it as a search\nbackend with open web UI. Next on my list is having enough resources to run\nOllama and a stable diffusion generator at the same time and have image\ngeneration working through open web UI.\n\n",
      "summary": "I heard about SearXNG on a couple podcasts and saw it trending on GitHub several times before I finally decided to stand it up. I used it transparently when...",
      "date_published": "2025-05-25T08:33:10Z",
      "date_modified": "2025-05-25T08:33:10Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/a-new-perspective-on-being-god-s-child/",
      "url": "https://pype.dev/a-new-perspective-on-being-god-s-child/",
      "title": "A New Perspective on Being God’s Child",
      "content_html": "\u003ch2 id=\"intro\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eIntro\u003c/span\u003e \u003ca href=\"#intro\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI was in men\u0026rsquo;s group the other day, and one of the things that came up almost inevitably\nis a debate between God\u0026rsquo;s sovereignty and predestination, and then an idea of free will.\nI have been a part of these conversations for years - I\u0026rsquo;ve been in hundreds of them certainly,\nand they all go in a very similar direction. Almost irrespective of the theological prowess\nor training of the group of people I\u0026rsquo;m in the unspoken goal always is the same\u0026hellip;\n\u003cstrong\u003eto find a hard and fast line between the 2 things or to find some comfortable verbiage for the tension\u003c/strong\u003e\u003c/p\u003e\n\u003ch2 id=\"my-anecdotal-experience-with-other-believers\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMy Anecdotal Experience With Other Believers\u003c/span\u003e \u003ca href=\"#my-anecdotal-experience-with-other-believers\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003ePeople with no real theological background have very simple ideas and\nunderstandings of free will and God\u0026rsquo;s sovereignty.\nThey typically equate God\u0026rsquo;s sovereignty with \u0026ldquo;He willed everything to be, and so you don\u0026rsquo;t\nactually have any real choices.\u0026rdquo;\nThen they think that because God has ultimate sovereignty, but they have free will, they\ncan somehow contradict God\u0026rsquo;s will, but then they don\u0026rsquo;t understand that that is a violation\nof the doctrine of God\u0026rsquo;s sovereignty.\nSo those conversations are typically hard to sit through, and my historical thought\non that, ever since I believe I\u0026rsquo;ve come to a pretty mature position on the matter,\nhas been that in the Hebrew mind, these things aren\u0026rsquo;t at odds, and we create the division with our\nWestern ideals on what it means to make choices, and what it means to be free.\u003c/p\u003e\n\u003ch3 id=\"freedom\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFreedom\u003c/span\u003e \u003ca href=\"#freedom\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAs a quick parenthetical remark on that - freedom is not doing whatever you want.\nTrue freedom is living in accordance with your creation, bound by the things that create\norder, because it is within those boundaries that you were designed to live -\nand thus the life you live within the boundaries is the best the life could\nbe\u0026hellip; Freedom isn\u0026rsquo;t the ultimate goal, it\u0026rsquo;s a byproduct of living in accordance\nwith our design.\nWhen you break those boundaries though - then life is scary, and you are not\nfree but rather a slave to the environment you made for yourself - an\nenvironment not designed for you because you designed it for yourself, it isn\u0026rsquo;t\nwhat the Maker made for you\u003c/p\u003e\n\u003ch3 id=\"freedom-child-s-play\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFreedom - Child’s Play\u003c/span\u003e \u003ca href=\"#freedom-child-s-play\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAn easy example is kids on a playground.\nIf you give a bunch of little kids a playground with nice high fences, and you tell them to\ndo whatever they want in the playground, they\u0026rsquo;ll have a great time.\nBut if you take all the fences away from that playground, maybe even move it\nout further away from the school, kids tend to feel a lot less safe.\nBecause now, not only can they just wander as far away from it as they please, perhaps\nby accident, but dangers can now enter their playground\u0026hellip; The fences gave them\nthe freedom to enjoy the life appropriate for them.\u003c/p\u003e\n\u003ch2 id=\"back-to-the-debate\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBack To the Debate\u003c/span\u003e \u003ca href=\"#back-to-the-debate\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eReturning to the sovereignty and free will discussion\u0026hellip;\nWith no academic, theological, or honestly even critical thinking\napplied, we have this very silly juxtaposition of sovereignty - as if it means\nyou can\u0026rsquo;t make choices - and free will as if God\u0026rsquo;s sovereignty could be usurped\nby us.\nHowever, in groups where we have more theological training present, we really just have the\nsame (directionally speaking - the same) conversation, with a larger vocabulary.\nNow we have words like \u0026ldquo;agency\u0026rdquo;, and \u0026ldquo;scope of choice\u0026rdquo;, things that kind of seek to explain\naway the tension by introducing new dimension or element of abstraction to the argument.\u003c/p\u003e\n\u003cp\u003eAt the end of the day, we\u0026rsquo;re now just cutting the cake into smaller pieces.\nWe\u0026rsquo;re just filling in some of the gaps that we can see.\nThere\u0026rsquo;s still nuance.\nThere\u0026rsquo;s still the Western influence of needing to label everything.\nThere\u0026rsquo;s still, in my opinion, the ancient truth that in the Hebrew mind, Yahweh\u0026rsquo;s sovereignty\nand the human\u0026rsquo;s choice to live their life are not at odds with each other.\u003c/p\u003e\n\u003ch2 id=\"a-new-perspective\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eA New Perspective\u003c/span\u003e \u003ca href=\"#a-new-perspective\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eBut here\u0026rsquo;s a thought I started to formulate just recently\u0026hellip;\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003ea recent thought\u003c/p\u003e\n\u003cp\u003eEven for a PhD in theological studies or in theology or an expert in church history or\nchurch fathers or whatever - for somebody \u003cem\u003etoday\u003c/em\u003e to think that we can define these terms\nin a totally correct and understandable way is another manifestation of the\n\u003cstrong\u003ePEAK ARROGANCE\u003c/strong\u003e of the West  (Blog on Western v Eastern medicine in the works)\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eI don\u0026rsquo;t mean to claim here that I have the \u003cem\u003eright\u003c/em\u003e understanding of sovereignty and free will.\nBut Paul has some choice words for believers who love quarreling and debates, and he calls\nthem spiritual children who aren\u0026rsquo;t ready for real food.\u003c/p\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003e2 Timothy 2:23-24\u003c/p\u003e\n\u003cp\u003e23 But reject foolish and ignorant disputes, knowing that they breed quarrels.\n24 The Lord\u0026rsquo;s slave must not quarrel, but must be gentle to everyone, able to teach, and patient,\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003e1 Corinthians 3\u003c/p\u003e\n\u003cp\u003e1For my part, brothers and sisters, I was not able to speak to you as spiritual\npeople but as people of the flesh, as babies in Christ.a 2I gave you milk to\ndrink, not solid food, since you were not yet ready for it. In fact, you are\nstill not ready, 3because you are still worldly. For since there is envya and\nstrifea b among you, are you not worldly and behaving like mere humans? 4For\nwhenever someone says, “I belong to Paul,” and another, “I belong to Apollos,”a\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition warning\"\u003e\n\u003cp class=\"admonition-title\"\u003eIt's you\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve often heard the Corinthian church used as an example of a bad place to\nbe - and no doubt it was. But modern American Christianity may be much closer\nto Corinth than Thessolinca as far as maturity and Christ-like living goes.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eHe says things like \u0026ldquo;I gave you milk to drink, not solid food, since you were\nnot yet ready for it\u0026rdquo;\nI used to think that the \u0026ldquo;real food\u0026rdquo; was these theological debates, that you learn\nmore about the Bible, you learn more about humanity, and then you can have these more\nin-depth conversations.\nBut I think the real wisdom is easly seen with a metaphor\u003c/p\u003e\n\u003ch3 id=\"who-s-the-child-here\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWho’s the child here?\u003c/span\u003e \u003ca href=\"#who-s-the-child-here\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eI have two daughters in different developmental stages, and so we have 3 characters\u0026hellip;\nThere\u0026rsquo;s my young daughter, my older daughter, and me.\nRight away, I think we often talk about knowing God in this kind of a term where,\nyou know, I\u0026rsquo;m his child and I have children.\nSo there\u0026rsquo;s a parent-child relationship.\nAnd then in the God-human relationship, I understand my position better now as a parent\nof real children, of humans, which helps me understand my position as a child of God.\u003c/p\u003e\n\u003cp\u003e!!! failure \u0026quot;\u0026quot;\nI don\u0026rsquo;t think we take that very seriously.\u003c/p\u003e\n\u003cdiv class=\"admonition success\"\u003e\n\u003cp class=\"admonition-title\"\u003eSuccess\u003c/p\u003e\n\u003cp\u003eI think use this more as comforting language rather than a humbling truth - \u003cstrong\u003eI\u0026rsquo;m a child of God\u003c/strong\u003e\nBut really, I think the TLDR is that even the most highly trained theological individual - that person is not a grown-up in the eyes of God.\nHe or she is still a child, and our understanding is still limited to what a child can understand.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eLet\u0026rsquo;s continue with the metaphor\u0026hellip;\u003c/p\u003e\n\u003cp\u003eYou could ask either one of my daughters if they know me, and of course they would both\nsay yes, and they know me to different degrees.\nPerhaps because the older one knows more about me - does that mean that she knows me better than the younger?\nI think it would be silly to say yes.\nBoth of my kids know me to the fullest capacity that they can know me.\nSo what about love?\nDo they both love me?\nAnd do I love them?\nOf course.\nAnd do I show my love to both of them in the same ways?\nOf course not.\nNot only are they unique, but they\u0026rsquo;re at different stages in life\u0026hellip;\u003c/p\u003e\n\u003cp\u003eFor example - I don\u0026rsquo;t exercise the same amount of discipline towards my\nyoungest because she\u0026rsquo;s not ready for it - it\u0026rsquo;s not reasonable to expect the\nsame things of her as our older daughter.\nSpeaking of her - she absolutely is ready for some more discipline and for some\nhigher expectations, and so I will train her up in the ways that she is mature\nenough to understand.\nNow, does that mean I love my younger daughter less, or does it mean I love my older daughter\nmore?\nNo.\nIt means I\u0026rsquo;m loving them in a way that is appropriate for where they are at\ndevelopmentally, for their better good.\nSo that they grow up to be ordered, to be competent, to be self-controlled, and\nto not grow up to be wild adults with no regard for boundaries and rules.\u003c/p\u003e\n\u003cp\u003eSo to be specific about the metaphor and the example I just laid out: I don\u0026rsquo;t want my children\nto ever hurt or suffer, but I also know that suffering is required for learning and for them to grow to be mature individuals.\nI know how to control some of the inevitable suffering a child must endure, especially if it\u0026rsquo;s in the form of discipline, for my children so they are safe, protected, loved, but also corrected and molded into competent human beings.\u003c/p\u003e\n\u003ch3 id=\"the-kicker\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThe Kicker\u003c/span\u003e \u003ca href=\"#the-kicker\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eNow would it be appropriate for my older daughter (who understands that suffering is required\nfor learning) would it be appropriate for her to look at my younger daughter and tell\nher, \u0026ldquo;dad wants you to suffer\u0026rdquo;?\nThat\u0026rsquo;s tough, isn\u0026rsquo;t it\u0026hellip;\nBecause she\u0026rsquo;s not really lying, but more importantly she\u0026rsquo;s also not telling anything close to the whole\ntruth and she is also not talking to somebody who is capable of understanding the nuances\nof that truth.\u003c/p\u003e\n\u003cp\u003eIn the eyes of God, I\u0026rsquo;m still a five-year-old.\u003c/p\u003e\n\u003cp\u003eAnd for me as a five-year-old boy in the eyes of the Lord, to try and explain things that\nI think I understand or that I understand to the best capability that a five-year-old can -\nIf I go try to teach a three-year-old things about God in ways that they can\u0026rsquo;t understand,\nI am not loving that other person and I\u0026rsquo;m not even loving God very well.\nI\u0026rsquo;m just stuck in my own arrogance of understanding, thinking that I now get it because I\u0026rsquo;ve come\nto my own realization.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI recognize there\u0026rsquo;s a little irony now in writing this post because I\u0026rsquo;m\nsaying I think I kind of understand that I don\u0026rsquo;t/can\u0026rsquo;t understand the sovereignty\nand free will relationship. I wouldn\u0026rsquo;t say I can explain that away, but I\nthink I understand who I am better in the eyes of the Lord and what I could\nreasonably expect to understand from an academic standpoint.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"so-what\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSo What?\u003c/span\u003e \u003ca href=\"#so-what\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe lesson for me, and for my community of faith - is to calm down about the\ndebates\u0026hellip;. They\u0026rsquo;re fun over a drink and cigars, but when boots are on the\nground we need to remember that the Bible has information that we need to know,\nit doesn\u0026rsquo;t have all the information that we want to know - and the American\nChurch must drop its arrogant need to explain away every mystery and instead\nhold fast to the God of those mysteries.\u003c/p\u003e\n",
      "content_text": "\n## Intro\n\nI was in men's group the other day, and one of the things that came up almost inevitably\nis a debate between God's sovereignty and predestination, and then an idea of free will.\nI have been a part of these conversations for years - I've been in hundreds of them certainly,\nand they all go in a very similar direction. Almost irrespective of the theological prowess\nor training of the group of people I'm in the unspoken goal always is the same... \n**to find a hard and fast line between the 2 things or to find some comfortable verbiage for the tension**\n\n## My Anecdotal Experience With Other Believers\n\nPeople with no real theological background have very simple ideas and\nunderstandings of free will and God's sovereignty.\nThey typically equate God's sovereignty with \"He willed everything to be, and so you don't\nactually have any real choices.\"\nThen they think that because God has ultimate sovereignty, but they have free will, they\ncan somehow contradict God's will, but then they don't understand that that is a violation\nof the doctrine of God's sovereignty.\nSo those conversations are typically hard to sit through, and my historical thought\non that, ever since I believe I've come to a pretty mature position on the matter,\nhas been that in the Hebrew mind, these things aren't at odds, and we create the division with our\nWestern ideals on what it means to make choices, and what it means to be free.\n\n### Freedom\n\nAs a quick parenthetical remark on that - freedom is not doing whatever you want.\nTrue freedom is living in accordance with your creation, bound by the things that create\norder, because it is within those boundaries that you were designed to live -\nand thus the life you live within the boundaries is the best the life could\nbe... Freedom isn't the ultimate goal, it's a byproduct of living in accordance\nwith our design.\nWhen you break those boundaries though - then life is scary, and you are not\nfree but rather a slave to the environment you made for yourself - an\nenvironment not designed for you because you designed it for yourself, it isn't\nwhat the Maker made for you\n\n### Freedom - Child's Play\n\nAn easy example is kids on a playground.\nIf you give a bunch of little kids a playground with nice high fences, and you tell them to\ndo whatever they want in the playground, they'll have a great time.\nBut if you take all the fences away from that playground, maybe even move it\nout further away from the school, kids tend to feel a lot less safe.\nBecause now, not only can they just wander as far away from it as they please, perhaps\nby accident, but dangers can now enter their playground... The fences gave them\nthe freedom to enjoy the life appropriate for them.\n\n## Back To the Debate\n\nReturning to the sovereignty and free will discussion... \nWith no academic, theological, or honestly even critical thinking\napplied, we have this very silly juxtaposition of sovereignty - as if it means\nyou can't make choices - and free will as if God's sovereignty could be usurped\nby us.\nHowever, in groups where we have more theological training present, we really just have the\nsame (directionally speaking - the same) conversation, with a larger vocabulary.\nNow we have words like \"agency\", and \"scope of choice\", things that kind of seek to explain\naway the tension by introducing new dimension or element of abstraction to the argument.\n\nAt the end of the day, we're now just cutting the cake into smaller pieces.\nWe're just filling in some of the gaps that we can see.\nThere's still nuance.\nThere's still the Western influence of needing to label everything.\nThere's still, in my opinion, the ancient truth that in the Hebrew mind, Yahweh's sovereignty\nand the human's choice to live their life are not at odds with each other.\n\n## A New Perspective\n\nBut here's a thought I started to formulate just recently...\n\n!!! note a recent thought\n    Even for a PhD in theological studies or in theology or an expert in church history or\n    church fathers or whatever - for somebody _today_ to think that we can define these terms \n    in a totally correct and understandable way is another manifestation of the\n    __PEAK ARROGANCE__ of the West  (Blog on Western v Eastern medicine in the works)\n\nI don't mean to claim here that I have the _right_ understanding of sovereignty and free will.\nBut Paul has some choice words for believers who love quarreling and debates, and he calls\nthem spiritual children who aren't ready for real food.\n\n!!! quote 2 Timothy 2:23-24\n\n    23 But reject foolish and ignorant disputes, knowing that they breed quarrels.\n    24 The Lord's slave must not quarrel, but must be gentle to everyone, able to teach, and patient,\n\n!!! quote 1 Corinthians 3\n    1For my part, brothers and sisters, I was not able to speak to you as spiritual\n    people but as people of the flesh, as babies in Christ.a 2I gave you milk to\n    drink, not solid food, since you were not yet ready for it. In fact, you are\n    still not ready, 3because you are still worldly. For since there is envya and\n    strifea b among you, are you not worldly and behaving like mere humans? 4For\n    whenever someone says, “I belong to Paul,” and another, “I belong to Apollos,”a\n\n!!! warning It's you\n    I've often heard the Corinthian church used as an example of a bad place to\n    be - and no doubt it was. But modern American Christianity may be much closer\n    to Corinth than Thessolinca as far as maturity and Christ-like living goes.\n\nHe says things like \"I gave you milk to drink, not solid food, since you were\nnot yet ready for it\"\nI used to think that the \"real food\" was these theological debates, that you learn\nmore about the Bible, you learn more about humanity, and then you can have these more\nin-depth conversations.\nBut I think the real wisdom is easly seen with a metaphor\n\n### Who's the child here?\n\nI have two daughters in different developmental stages, and so we have 3 characters...\nThere's my young daughter, my older daughter, and me.\nRight away, I think we often talk about knowing God in this kind of a term where,\nyou know, I'm his child and I have children.\nSo there's a parent-child relationship.\nAnd then in the God-human relationship, I understand my position better now as a parent\nof real children, of humans, which helps me understand my position as a child of God.\n\n!!! failure \"\"\n    I don't think we take that very seriously.\n\n!!! success \"\"\n    I think use this more as comforting language rather than a humbling truth - __I'm a child of God__\n    But really, I think the TLDR is that even the most highly trained theological individual - that person is not a grown-up in the eyes of God.\n    He or she is still a child, and our understanding is still limited to what a child can understand.\n\nLet's continue with the metaphor...\n\nYou could ask either one of my daughters if they know me, and of course they would both\nsay yes, and they know me to different degrees.\nPerhaps because the older one knows more about me - does that mean that she knows me better than the younger?\nI think it would be silly to say yes.\nBoth of my kids know me to the fullest capacity that they can know me.\nSo what about love?\nDo they both love me?\nAnd do I love them?\nOf course.\nAnd do I show my love to both of them in the same ways?\nOf course not.\nNot only are they unique, but they're at different stages in life... \n\nFor example - I don't exercise the same amount of discipline towards my\nyoungest because she's not ready for it - it's not reasonable to expect the\nsame things of her as our older daughter.\nSpeaking of her - she absolutely is ready for some more discipline and for some\nhigher expectations, and so I will train her up in the ways that she is mature\nenough to understand.\nNow, does that mean I love my younger daughter less, or does it mean I love my older daughter\nmore?\nNo.\nIt means I'm loving them in a way that is appropriate for where they are at\ndevelopmentally, for their better good.\nSo that they grow up to be ordered, to be competent, to be self-controlled, and\nto not grow up to be wild adults with no regard for boundaries and rules.\n\nSo to be specific about the metaphor and the example I just laid out: I don't want my children\nto ever hurt or suffer, but I also know that suffering is required for learning and for them to grow to be mature individuals.\nI know how to control some of the inevitable suffering a child must endure, especially if it's in the form of discipline, for my children so they are safe, protected, loved, but also corrected and molded into competent human beings.\n\n### The Kicker\n\nNow would it be appropriate for my older daughter (who understands that suffering is required\nfor learning) would it be appropriate for her to look at my younger daughter and tell\nher, \"dad wants you to suffer\"?\nThat's tough, isn't it...\nBecause she's not really lying, but more importantly she's also not telling anything close to the whole\ntruth and she is also not talking to somebody who is capable of understanding the nuances\nof that truth.\n\nIn the eyes of God, I'm still a five-year-old.\n\nAnd for me as a five-year-old boy in the eyes of the Lord, to try and explain things that\nI think I understand or that I understand to the best capability that a five-year-old can -\nIf I go try to teach a three-year-old things about God in ways that they can't understand,\nI am not loving that other person and I'm not even loving God very well.\nI'm just stuck in my own arrogance of understanding, thinking that I now get it because I've come\nto my own realization.\n\n\u003e I recognize there's a little irony now in writing this post because I'm\n\u003e saying I think I kind of understand that I don't/can't understand the sovereignty\n\u003e and free will relationship. I wouldn't say I can explain that away, but I\n\u003e think I understand who I am better in the eyes of the Lord and what I could\n\u003e reasonably expect to understand from an academic standpoint.\n\n## So What?\n\nThe lesson for me, and for my community of faith - is to calm down about the\ndebates.... They're fun over a drink and cigars, but when boots are on the\nground we need to remember that the Bible has information that we need to know,\nit doesn't have all the information that we want to know - and the American\nChurch must drop its arrogant need to explain away every mystery and instead\nhold fast to the God of those mysteries.\n",
      "summary": "I was in men's group the other day, and one of the things that came up almost inevitably is a debate between God's sovereignty and predestination, and then...",
      "date_published": "2025-05-18T07:15:06Z",
      "date_modified": "2025-05-18T07:15:06Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "faith",
        "reflection",
        "free-will",
        "sovereignty"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-607/",
      "url": "https://pype.dev/thoughts-607/",
      "title": "💭 Installing Tailscale on JetKVM | Medium",
      "content_text": "\n\u003ca href=\"https://medium.com/@brandontuttle/installing-tailscale-on-a-jetkvm-3c72355b7eb0\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://medium.com/@brandontuttle/installing-tailscale-on-a-jetkvm-3c72355b7eb0\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - Installing Tailscale on JetKVM | Medium\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://medium.com/@brandontuttle/installing-tailscale-on-a-jetkvm-3c72355b7eb0\"\u003eInstalling Tailscale on JetKVM | Medium\u003c/a\u003e\n\n---\n\nMy jetKVM is a flipping dream - plug and play kvm that worked out of the box. I want to put tailscale on it so I can hit my server from anywhere no matter what - this article appears to walk through doing it. \n\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "My jetKVM is a flipping dream - plug and play kvm that worked out of the box. I want to put tailscale on it so I can hit",
      "date_published": "2025-04-28T14:07:51Z",
      "date_modified": "2025-04-28T14:07:51Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "tailscale",
        "jetkvm",
        "kvm",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-606/",
      "url": "https://pype.dev/thoughts-606/",
      "title": "💭 Installing Tailscale on JetKVM | Medium",
      "content_text": "\n\u003ca href=\"https://medium.com/@brandontuttle/installing-tailscale-on-a-jetkvm-3c72355b7eb0\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://medium.com/@brandontuttle/installing-tailscale-on-a-jetkvm-3c72355b7eb0\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - Installing Tailscale on JetKVM | Medium\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://medium.com/@brandontuttle/installing-tailscale-on-a-jetkvm-3c72355b7eb0\"\u003eInstalling Tailscale on JetKVM | Medium\u003c/a\u003e\n\n---\n\nMy jetKVM is a flipping dream - plug and play kvm that worked out of the box. I want to put tailscale on it so I can hit my server from anywhere no matter what - this article appears to walk through doing it. \n\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "My jetKVM is a flipping dream - plug and play kvm that worked out of the box. I want to put tailscale on it so I can hit",
      "date_published": "2025-04-28T14:07:50Z",
      "date_modified": "2025-04-28T14:07:50Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "tailscale",
        "jetkvm",
        "kvm",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-605/",
      "url": "https://pype.dev/thoughts-605/",
      "title": "💭 Installing Tailscale on JetKVM | Medium",
      "content_text": "\n\u003ca href=\"https://medium.com/@brandontuttle/installing-tailscale-on-a-jetkvm-3c72355b7eb0\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://medium.com/@brandontuttle/installing-tailscale-on-a-jetkvm-3c72355b7eb0\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - Installing Tailscale on JetKVM | Medium\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://medium.com/@brandontuttle/installing-tailscale-on-a-jetkvm-3c72355b7eb0\"\u003eInstalling Tailscale on JetKVM | Medium\u003c/a\u003e\n\n---\n\nMy jetKVM is a flipping dream - plug and play kvm that worked out of the box. I want to put tailscale on it so I can hit my server from anywhere no matter what - this article appears to walk through doing it. \n\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "My jetKVM is a flipping dream - plug and play kvm that worked out of the box. I want to put tailscale on it so I can hit",
      "date_published": "2025-04-28T14:07:48Z",
      "date_modified": "2025-04-28T14:07:48Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "tailscale",
        "jetkvm",
        "kvm",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-604/",
      "url": "https://pype.dev/thoughts-604/",
      "title": "💭 Installing Tailscale on JetKVM | Medium",
      "content_text": "\n\u003ca href=\"https://medium.com/@brandontuttle/installing-tailscale-on-a-jetkvm-3c72355b7eb0\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://medium.com/@brandontuttle/installing-tailscale-on-a-jetkvm-3c72355b7eb0\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - Installing Tailscale on JetKVM | Medium\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://medium.com/@brandontuttle/installing-tailscale-on-a-jetkvm-3c72355b7eb0\"\u003eInstalling Tailscale on JetKVM | Medium\u003c/a\u003e\n\n---\n\nMy jetKVM is a flipping dream - plug and play kvm that worked out of the box. I want to put tailscale on it so I can hit my server from anywhere no matter what - this article appears to walk through doing it. \n\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "My jetKVM is a flipping dream - plug and play kvm that worked out of the box. I want to put tailscale on it so I can hit",
      "date_published": "2025-04-28T14:07:48Z",
      "date_modified": "2025-04-28T14:07:48Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "tailscale",
        "jetkvm",
        "kvm",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-603/",
      "url": "https://pype.dev/thoughts-603/",
      "title": "💭 Installing Tailscale on JetKVM | Medium",
      "content_text": "\n\u003ca href=\"https://medium.com/@brandontuttle/installing-tailscale-on-a-jetkvm-3c72355b7eb0\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://medium.com/@brandontuttle/installing-tailscale-on-a-jetkvm-3c72355b7eb0\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - Installing Tailscale on JetKVM | Medium\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://medium.com/@brandontuttle/installing-tailscale-on-a-jetkvm-3c72355b7eb0\"\u003eInstalling Tailscale on JetKVM | Medium\u003c/a\u003e\n\n---\n\nMy jetKVM is a flipping dream - plug and play kvm that worked out of the box. I want to put tailscale on it so I can hit my server from anywhere no matter what - this article appears to walk through doing it. \n\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "My jetKVM is a flipping dream - plug and play kvm that worked out of the box. I want to put tailscale on it so I can hit",
      "date_published": "2025-04-28T14:07:43Z",
      "date_modified": "2025-04-28T14:07:43Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "tailscale",
        "jetkvm",
        "kvm",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-602/",
      "url": "https://pype.dev/thoughts-602/",
      "title": "💭 Installing Tailscale on JetKVM | Medium",
      "content_text": "\n\u003ca href=\"https://medium.com/@brandontuttle/installing-tailscale-on-a-jetkvm-3c72355b7eb0\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://medium.com/@brandontuttle/installing-tailscale-on-a-jetkvm-3c72355b7eb0\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - Installing Tailscale on JetKVM | Medium\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://medium.com/@brandontuttle/installing-tailscale-on-a-jetkvm-3c72355b7eb0\"\u003eInstalling Tailscale on JetKVM | Medium\u003c/a\u003e\n\n---\n\nMy jetKVM is a flipping dream - plug and play kvm that worked out of the box. I want to put tailscale on it so I can hit my server from anywhere no matter what - this article appears to walk through doing it. \n\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "My jetKVM is a flipping dream - plug and play kvm that worked out of the box. I want to put tailscale on it so I can hit",
      "date_published": "2025-04-28T14:07:43Z",
      "date_modified": "2025-04-28T14:07:43Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "tailscale",
        "jetkvm",
        "kvm",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-601/",
      "url": "https://pype.dev/thoughts-601/",
      "title": "💭 Installing Tailscale on JetKVM | Medium",
      "content_text": "\n\u003ca href=\"https://medium.com/@brandontuttle/installing-tailscale-on-a-jetkvm-3c72355b7eb0\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://medium.com/@brandontuttle/installing-tailscale-on-a-jetkvm-3c72355b7eb0\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - Installing Tailscale on JetKVM | Medium\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://medium.com/@brandontuttle/installing-tailscale-on-a-jetkvm-3c72355b7eb0\"\u003eInstalling Tailscale on JetKVM | Medium\u003c/a\u003e\n\n---\n\nMy jetKVM is a flipping dream - plug and play kvm that worked out of the box. I want to put tailscale on it so I can hit my server from anywhere no matter what - this article appears to walk through doing it. \n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "My jetKVM is a flipping dream - plug and play kvm that worked out of the box. I want to put tailscale on it so I can hit",
      "date_published": "2025-04-28T14:07:39Z",
      "date_modified": "2025-04-28T14:07:39Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "tailscale",
        "jetkvm",
        "kvm",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-600/",
      "url": "https://pype.dev/thoughts-600/",
      "title": "💭 Installing Tailscale on JetKVM | Medium",
      "content_text": "\n\u003ca href=\"https://medium.com/@brandontuttle/installing-tailscale-on-a-jetkvm-3c72355b7eb0\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://medium.com/@brandontuttle/installing-tailscale-on-a-jetkvm-3c72355b7eb0\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - Installing Tailscale on JetKVM | Medium\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://medium.com/@brandontuttle/installing-tailscale-on-a-jetkvm-3c72355b7eb0\"\u003eInstalling Tailscale on JetKVM | Medium\u003c/a\u003e\n\n---\n\nMy jetKVM is a flipping dream - plug and play kvm that worked out of the box. I want to put tailscale on it so I can hit my server from anywhere no matter what - this article appears to walk through doing it. \n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "My jetKVM is a flipping dream - plug and play kvm that worked out of the box. I want to put tailscale on it so I can hit",
      "date_published": "2025-04-28T14:07:38Z",
      "date_modified": "2025-04-28T14:07:38Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "tailscale",
        "jetkvm",
        "kvm",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-599/",
      "url": "https://pype.dev/thoughts-599/",
      "title": "💭 Installing Tailscale on JetKVM | Medium",
      "content_text": "\n\u003ca href=\"https://medium.com/@brandontuttle/installing-tailscale-on-a-jetkvm-3c72355b7eb0\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://medium.com/@brandontuttle/installing-tailscale-on-a-jetkvm-3c72355b7eb0\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - Installing Tailscale on JetKVM | Medium\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://medium.com/@brandontuttle/installing-tailscale-on-a-jetkvm-3c72355b7eb0\"\u003eInstalling Tailscale on JetKVM | Medium\u003c/a\u003e\n\n---\n\nMy jetKVM is a flipping dream - plug and play kvm that worked out of the box. I want to put tailscale on it so I can hit my server from anywhere no matter what - this article appears to walk through doing it. \n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "My jetKVM is a flipping dream - plug and play kvm that worked out of the box. I want to put tailscale on it so I can hit",
      "date_published": "2025-04-28T14:07:37Z",
      "date_modified": "2025-04-28T14:07:37Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "tailscale",
        "jetkvm",
        "kvm",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/my-mcp-configuration/",
      "url": "https://pype.dev/my-mcp-configuration/",
      "title": "My MCP Configuration",
      "content_html": "\u003ch1 id=\"my-mcp\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMy MCP\u003c/span\u003e\u003c/h1\u003e\n\u003ch2 id=\"the-tools\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThe Tools\u003c/span\u003e \u003ca href=\"#the-tools\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"docker\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDocker\u003c/span\u003e \u003ca href=\"#docker\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch3 id=\"ragdocs\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRAGDocs\u003c/span\u003e \u003ca href=\"#ragdocs\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch3 id=\"sequential-thinking\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSequential Thinking\u003c/span\u003e \u003ca href=\"#sequential-thinking\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch3 id=\"git\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGit\u003c/span\u003e \u003ca href=\"#git\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003ch3 id=\"not-tried-yet\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNot Tried Yet\u003c/span\u003e \u003ca href=\"#not-tried-yet\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/modelcontextprotocol/servers/tree/main/src/sqlite\"\u003ehttps://github.com/modelcontextprotocol/servers/tree/main/src/sqlite\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"the-config\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThe Config\u003c/span\u003e \u003ca href=\"#the-config\" 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\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  \u003cspan class=\"nt\"\u003e\u0026#34;mcpServers\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\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=\"nt\"\u003e\u0026#34;docker-mcp\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\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=\"nt\"\u003e\u0026#34;command\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;uvx\u0026#34;\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=\"nt\"\u003e\u0026#34;args\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\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=\"s2\"\u003e\u0026#34;docker-mcp\u0026#34;\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      \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;ragdocs\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\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=\"nt\"\u003e\u0026#34;command\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;node\u0026#34;\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=\"nt\"\u003e\u0026#34;args\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\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=\"s2\"\u003e\u0026#34;/home/nic/projects/personal/quadtask/node_modules/@qpd-v/mcp-server-ragdocs/build/index.js\u0026#34;\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      \u003cspan class=\"nt\"\u003e\u0026#34;env\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\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=\"nt\"\u003e\u0026#34;QDRANT_URL\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;http://babyblue-aurora:6333\u0026#34;\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=\"nt\"\u003e\u0026#34;EMBEDDING_PROVIDER\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;ollama\u0026#34;\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=\"nt\"\u003e\u0026#34;OLLAMA_URL\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;http://babyblue-aurora:11434\u0026#34;\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      \u003cspan class=\"nt\"\u003e\u0026#34;alwaysAllow\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\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=\"s2\"\u003e\u0026#34;search_documentation\u0026#34;\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=\"s2\"\u003e\u0026#34;list_sources\u0026#34;\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=\"s2\"\u003e\u0026#34;test_ollama\u0026#34;\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=\"s2\"\u003e\u0026#34;add_documentation\u0026#34;\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      \u003cspan class=\"nt\"\u003e\u0026#34;disabled\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\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    \u003cspan class=\"nt\"\u003e\u0026#34;sequentialthinking\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\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=\"nt\"\u003e\u0026#34;command\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;docker\u0026#34;\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=\"nt\"\u003e\u0026#34;args\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\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=\"s2\"\u003e\u0026#34;run\u0026#34;\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=\"s2\"\u003e\u0026#34;--rm\u0026#34;\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=\"s2\"\u003e\u0026#34;-i\u0026#34;\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=\"s2\"\u003e\u0026#34;--name\u0026#34;\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=\"s2\"\u003e\u0026#34;sequentialthinking\u0026#34;\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=\"s2\"\u003e\u0026#34;mcp/sequentialthinking\u0026#34;\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      \u003cspan class=\"nt\"\u003e\u0026#34;disabled\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\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=\"nt\"\u003e\u0026#34;alwaysAllow\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\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=\"s2\"\u003e\u0026#34;sequentialthinking\u0026#34;\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    \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;git\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\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=\"nt\"\u003e\u0026#34;command\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;uvx\u0026#34;\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=\"nt\"\u003e\u0026#34;args\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\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=\"s2\"\u003e\u0026#34;mcp-server-git\u0026#34;\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      \u003cspan class=\"nt\"\u003e\u0026#34;disabled\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\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=\"nt\"\u003e\u0026#34;alwaysAllow\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\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=\"s2\"\u003e\u0026#34;git_status\u0026#34;\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=\"s2\"\u003e\u0026#34;git_commit\u0026#34;\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=\"s2\"\u003e\u0026#34;git_add\u0026#34;\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=\"s2\"\u003e\u0026#34;git_log\u0026#34;\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=\"s2\"\u003e\u0026#34;git_diff\u0026#34;\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    \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\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\n# My MCP\n\n## The Tools\n\n### Docker\n\n### RAGDocs\n\n### Sequential Thinking\n\n### Git\n\n### Not Tried Yet\n\nhttps://github.com/modelcontextprotocol/servers/tree/main/src/sqlite\n\n\n## The Config\n\n```json\n\n{\n  \"mcpServers\": {\n    \"docker-mcp\": {\n        \"command\": \"uvx\",\n        \"args\": [\n          \"docker-mcp\"\n        ]\n      },\n    \"ragdocs\": {\n      \"command\": \"node\",\n      \"args\": [\n        \"/home/nic/projects/personal/quadtask/node_modules/@qpd-v/mcp-server-ragdocs/build/index.js\"\n      ],\n      \"env\": {\n        \"QDRANT_URL\": \"http://babyblue-aurora:6333\",\n        \"EMBEDDING_PROVIDER\": \"ollama\",\n        \"OLLAMA_URL\": \"http://babyblue-aurora:11434\"\n      },\n      \"alwaysAllow\": [\n        \"search_documentation\",\n        \"list_sources\",\n        \"test_ollama\",\n        \"add_documentation\"\n      ],\n      \"disabled\": false\n    },\n    \"sequentialthinking\": {\n      \"command\": \"docker\",\n      \"args\": [\n        \"run\",\n        \"--rm\",\n        \"-i\",\n        \"--name\",\n        \"sequentialthinking\",\n        \"mcp/sequentialthinking\"\n      ],\n      \"disabled\": false,\n      \"alwaysAllow\": [\n        \"sequentialthinking\"\n      ]\n    },\n    \"git\": {\n      \"command\": \"uvx\",\n      \"args\": [\n        \"mcp-server-git\"\n      ],\n      \"disabled\": false,\n      \"alwaysAllow\": [\n        \"git_status\",\n        \"git_commit\",\n        \"git_add\",\n        \"git_log\",\n        \"git_diff\"\n      ]\n    }\n  }\n}\n```\n\n",
      "summary": "https://github.com/modelcontextprotocol/servers/tree/main/src/sqlite",
      "date_published": "2025-04-27T05:29:54Z",
      "date_modified": "2025-04-27T05:29:54Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "python",
        "tech",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/i-was-wrecked-by-a-weird-combo-of-and-e/",
      "url": "https://pype.dev/i-was-wrecked-by-a-weird-combo-of-and-e/",
      "title": "I was wrecked by a weird combo of » and -e",
      "content_html": "\u003ch2 id=\"tl-dr\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTL;DR\u003c/span\u003e \u003ca href=\"#tl-dr\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIf state matters then check it in the beginning or handle it on a failure\u0026hellip; Let me explain\u003c/p\u003e\n\u003cp\u003eI ran into some trouble recently \u003cem\u003ealmost\u003c/em\u003e losing some encrypted data\u0026hellip; Now\nthis would be the second time I\u0026rsquo;ve had that happen, so I\u0026rsquo;m going to write a\nlittle bit about it now that I figured it out\u003c/p\u003e\n\u003ch2 id=\"the-stage\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThe Stage\u003c/span\u003e \u003ca href=\"#the-stage\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eHere\u0026rsquo;s the scenario - I use \u003ccode\u003eansible-vault\u003c/code\u003e to keep some sensitive data in a\nfew public repos, and I keep the keys I use in Bitwarden Secrets Manager.\u003c/p\u003e\n\u003cp\u003eI use \u003ccode\u003ejust\u003c/code\u003e as a command runner and have common \u003ccode\u003ejust encrypt\u003c/code\u003e and \u003ccode\u003ejust decrypt\u003c/code\u003e recipes throughout many justfiles. It might look something like this\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\"\u003eget-vault-key:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    bws secret get \u003cspan class=\"nv\"\u003e$HOMELAB_BOT_VAULT_KEY_ID\u003c/span\u003e  \u003cspan class=\"p\"\u003e|\u003c/span\u003e jq -r \u003cspan class=\"s1\"\u003e\u0026#39;.value\u0026#39;\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\"\u003eencrypt:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e#!/bin/bash\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eset\u003c/span\u003e +e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    just get-vault-key \u0026gt; key\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    ansible-vault encrypt ./secret-file --vault-password-file key\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    ansible-vault encrypt ./secret-file2 --vault-password-file key\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    rm key\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\"\u003edecrypt:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e#!/bin/bash\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eset\u003c/span\u003e +e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    just get-vault-key \u0026gt; key\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    ansible-vault decrypt ./secret-file --vault-password-file key\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    ansible-vault decrypt ./secret-file2 --vault-password-file key\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    rm key\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"spoiler\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSpoiler\u003c/span\u003e \u003ca href=\"#spoiler\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAbove is a good example of the 2 recipes, but prior to this morning they looked like this\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\"\u003eget-vault-key:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    bws secret get \u003cspan class=\"nv\"\u003e$HOMELAB_BOT_VAULT_KEY_ID\u003c/span\u003e  \u003cspan class=\"p\"\u003e|\u003c/span\u003e jq -r \u003cspan class=\"s1\"\u003e\u0026#39;.value\u0026#39;\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=\"c1\"\u003e# BAD EXAMPLES! DO NOT DO THIS\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\"\u003eencrypt:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eset\u003c/span\u003e -e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    just get-vault-key \u0026gt;\u0026gt; key\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    ansible-vault encrypt ./secret-file --vault-password-file key\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    ansible-vault encrypt ./secret-file2 --vault-password-file key\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    rm key\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\"\u003edecrypt:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eset\u003c/span\u003e -e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    just get-vault-key \u0026gt;\u0026gt; key\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    ansible-vault decrypt ./secret-file --vault-password-file key\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    ansible-vault decrypt ./secret-file2 --vault-password-file key\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    rm key\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"problem\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eProblem\u003c/span\u003e \u003ca href=\"#problem\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eSo here\u0026rsquo;s the story - in real life I started using distrobox when I ran into\nthis and I thought it was an issue with different versions of ansible installed\nin distrobox and on my desktop. After a few more odd deployment workflows I\nthink I\u0026rsquo;ve determined that the real problem is that \u003ccode\u003e\u0026gt;\u0026gt;\u003c/code\u003e appends to a file (see\nthe issue yet?), but if my recipes fail (say I try to encrypt an already\nencrypted file) then the command exits but what\u0026rsquo;s left on my disk? \u003ccode\u003ekey\u003c/code\u003e is\nstill there\u0026hellip; and the next time I go to run a command I\u0026rsquo;ll echo the real key\nto the \u003ccode\u003ekey\u003c/code\u003e file again and if I called \u003ccode\u003eencrypt\u003c/code\u003e when the first or more files\nin the list were \u003ccode\u003edecrypted\u003c/code\u003e then they\u0026rsquo;ll be encrypted not with my key, but\nwith my key repeated as many times as I ran a command with \u003ccode\u003ejust get-vault-key \u0026gt;\u0026gt; key\u003c/code\u003e\nbefore ever removing the key file!\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\"\u003enic in pype.dev   main   ×2  ×3  ×7 via   v3.11.10\u003cspan class=\"o\"\u003e(\u003c/span\u003epype-dev\u003cspan class=\"o\"\u003e)\u003c/span\u003e   \u003cspan class=\"o\"\u003e(\u003c/span\u003edev\u003cspan class=\"o\"\u003e)\u003c/span\u003e 󰒄 \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ cat secret-file\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDanger, Will Robinson\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\"\u003enic in pype.dev   main   ×2  ×3  ×7 via   v3.11.10\u003cspan class=\"o\"\u003e(\u003c/span\u003epype-dev\u003cspan class=\"o\"\u003e)\u003c/span\u003e   \u003cspan class=\"o\"\u003e(\u003c/span\u003edev\u003cspan class=\"o\"\u003e)\u003c/span\u003e 󰒄 \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ just encrypt\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebws secret get \u003cspan class=\"nv\"\u003e$HOMELAB_BOT_VAULT_KEY_ID\u003c/span\u003e  \u003cspan class=\"p\"\u003e|\u003c/span\u003e jq -r \u003cspan class=\"s1\"\u003e\u0026#39;.value\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eEncryption successful\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\"\u003enic in pype.dev   main   ×2  ×3  ×7 via   v3.11.10\u003cspan class=\"o\"\u003e(\u003c/span\u003epype-dev\u003cspan class=\"o\"\u003e)\u003c/span\u003e   \u003cspan class=\"o\"\u003e(\u003c/span\u003edev\u003cspan class=\"o\"\u003e)\u003c/span\u003e 󰒄 \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ cat secret-file\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$ANSIBLE_VAULT\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e1.1\u003cspan class=\"p\"\u003e;\u003c/span\u003eAES256\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e39616332393662346639633030633766666336323939346138633238626239363733316431333737\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e6463663763366434376437303335643431663431326135300a636261663636336139323033316232\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e37666439383131393631333332353731633661396431633834326432363936613331623135666565\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e6364363039663933620a326563323931643632323031396664646363613636613562366166386439\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e63653661653037393538356461323239396630643338393231306163343964623866\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\"\u003enic in pype.dev   main   ×2  ×3  ×7 via   v3.11.10\u003cspan class=\"o\"\u003e(\u003c/span\u003epype-dev\u003cspan class=\"o\"\u003e)\u003c/span\u003e   \u003cspan class=\"o\"\u003e(\u003c/span\u003edev\u003cspan class=\"o\"\u003e)\u003c/span\u003e 󰒄 \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ just decrypt\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebws secret get \u003cspan class=\"nv\"\u003e$HOMELAB_BOT_VAULT_KEY_ID\u003c/span\u003e  \u003cspan class=\"p\"\u003e|\u003c/span\u003e jq -r \u003cspan class=\"s1\"\u003e\u0026#39;.value\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDecryption successful\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\"\u003enic in pype.dev   main   ×2  ×3  ×7 via   v3.11.10\u003cspan class=\"o\"\u003e(\u003c/span\u003epype-dev\u003cspan class=\"o\"\u003e)\u003c/span\u003e   \u003cspan class=\"o\"\u003e(\u003c/span\u003edev\u003cspan class=\"o\"\u003e)\u003c/span\u003e 󰒄 \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ cat secret-file\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDanger, Will Robinson\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSo as you can see, I have \u003ccode\u003esecret-file\u003c/code\u003e here, and I can encrypt and decrypt\njust fine. But if I have that \u003ccode\u003e\u0026gt;\u0026gt;\u003c/code\u003e in the recipe, add a second file, and a\nfailure in a command - well then I\u0026rsquo;ll start getting confused\u0026hellip;\u003c/p\u003e\n\u003cp\u003eFollow along with the workflow of adding a file that I\u0026rsquo;ll need encrypted\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eOnly secret-file is in the just recipe here - I add secret-file2 after\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enic in pype.dev   main   ×2  ×3  ×7 via   v3.11.10\u003cspan class=\"o\"\u003e(\u003c/span\u003epype-dev\u003cspan class=\"o\"\u003e)\u003c/span\u003e   \u003cspan class=\"o\"\u003e(\u003c/span\u003edev\u003cspan class=\"o\"\u003e)\u003c/span\u003e 󰒄 \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ just decrypt\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebws secret get \u003cspan class=\"nv\"\u003e$HOMELAB_BOT_VAULT_KEY_ID\u003c/span\u003e  \u003cspan class=\"p\"\u003e|\u003c/span\u003e jq -r \u003cspan class=\"s1\"\u003e\u0026#39;.value\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eERROR! input is not vault encrypted data. /var/home/nic/projects/personal/pype.dev/secret-file is not a vault encrypted file \u003cspan class=\"k\"\u003efor\u003c/span\u003e /var/home/nic/projects/personal/pype.dev/secret-file\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eerror: Recipe \u003cspan class=\"sb\"\u003e`\u003c/span\u003edecrypt\u003cspan class=\"sb\"\u003e`\u003c/span\u003e failed with \u003cspan class=\"nb\"\u003eexit\u003c/span\u003e code \u003cspan class=\"m\"\u003e1\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\"\u003enic in pype.dev   main   ×2  ×3  ×8 via   v3.11.10\u003cspan class=\"o\"\u003e(\u003c/span\u003epype-dev\u003cspan class=\"o\"\u003e)\u003c/span\u003e   \u003cspan class=\"o\"\u003e(\u003c/span\u003edev\u003cspan class=\"o\"\u003e)\u003c/span\u003e 󰒄 \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e✗ \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Good - secret-file is already decrypted! So lets add another file\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGood - secret-file is already decrypted! So lets add another file\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\"\u003enic in pype.dev   main   ×2  ×3  ×7 via   v3.11.10\u003cspan class=\"o\"\u003e(\u003c/span\u003epype-dev\u003cspan class=\"o\"\u003e)\u003c/span\u003e   \u003cspan class=\"o\"\u003e(\u003c/span\u003edev\u003cspan class=\"o\"\u003e)\u003c/span\u003e 󰒄 \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Foo Bar Bam Baz\u0026#34;\u003c/span\u003e \u0026gt; secret-file2                                    \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\"\u003enic in pype.dev   main   ×2  ×3  ×8 via   v3.11.10\u003cspan class=\"o\"\u003e(\u003c/span\u003epype-dev\u003cspan class=\"o\"\u003e)\u003c/span\u003e   \u003cspan class=\"o\"\u003e(\u003c/span\u003edev\u003cspan class=\"o\"\u003e)\u003c/span\u003e 󰒄 \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Added secret-file2 to my Just recipes\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAdded secret-file2 to my Just recipes\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\"\u003enic in pype.dev   main   ×2  ×3  ×8 via   v3.11.10\u003cspan class=\"o\"\u003e(\u003c/span\u003epype-dev\u003cspan class=\"o\"\u003e)\u003c/span\u003e   \u003cspan class=\"o\"\u003e(\u003c/span\u003edev\u003cspan class=\"o\"\u003e)\u003c/span\u003e 󰒄 \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ just encrypt\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebws secret get \u003cspan class=\"nv\"\u003e$HOMELAB_BOT_VAULT_KEY_ID\u003c/span\u003e  \u003cspan class=\"p\"\u003e|\u003c/span\u003e jq -r \u003cspan class=\"s1\"\u003e\u0026#39;.value\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eEncryption successful\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eEncryption successful\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\"\u003enic in pype.dev   main   ×2  ×3  ×7 via   v3.11.10\u003cspan class=\"o\"\u003e(\u003c/span\u003epype-dev\u003cspan class=\"o\"\u003e)\u003c/span\u003e   \u003cspan class=\"o\"\u003e(\u003c/span\u003edev\u003cspan class=\"o\"\u003e)\u003c/span\u003e 󰒄 \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ just decrypt\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebws secret get \u003cspan class=\"nv\"\u003e$HOMELAB_BOT_VAULT_KEY_ID\u003c/span\u003e  \u003cspan class=\"p\"\u003e|\u003c/span\u003e jq -r \u003cspan class=\"s1\"\u003e\u0026#39;.value\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eERROR! Decryption failed \u003cspan class=\"o\"\u003e(\u003c/span\u003eno vault secrets were found that could decrypt\u003cspan class=\"o\"\u003e)\u003c/span\u003e on /var/home/nic/projects/personal/pype.dev/secret-file \u003cspan class=\"k\"\u003efor\u003c/span\u003e /var/home/nic/projects/personal/pype.dev/secret-file\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eerror: Recipe \u003cspan class=\"sb\"\u003e`\u003c/span\u003edecrypt\u003cspan class=\"sb\"\u003e`\u003c/span\u003e failed with \u003cspan class=\"nb\"\u003eexit\u003c/span\u003e code \u003cspan class=\"m\"\u003e1\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\"\u003enic in pype.dev   main   ×2  ×3  ×8 via   v3.11.10\u003cspan class=\"o\"\u003e(\u003c/span\u003epype-dev\u003cspan class=\"o\"\u003e)\u003c/span\u003e   \u003cspan class=\"o\"\u003e(\u003c/span\u003edev\u003cspan class=\"o\"\u003e)\u003c/span\u003e 󰒄 \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e✗ \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Oh no!\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSo what happened?\u003c/p\u003e\n\u003cp\u003eRecall that my recipes originally had \u003ccode\u003eset -e\u003c/code\u003e at the top and used \u003ccode\u003e\u0026gt;\u0026gt;\u003c/code\u003e to cat\nmy secret to a file \u003ccode\u003ekey\u003c/code\u003e. Well, when the fir| decryption recipe failed the\n\u003ccode\u003ekey\u003c/code\u003e file was left behind. Then when I went to encrypt both of my files the\nrecipe got the key again and made a keyfile like this:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esecretKey\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esecretKey\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe encryption recipe encrypted the files with this key, removed the key file,\nand then the next decryption recipe failed because when it got the key and made\nthe file it looked like\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003esecretKey\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eSo the solution in the end is to remake the \u003ccode\u003ekey\u003c/code\u003e file every time (\u003ccode\u003e\u0026gt;\u003c/code\u003e instead\nof \u003ccode\u003e\u0026gt;\u0026gt;\u003c/code\u003e), or check if it exists, or handle the error when the recipe fails, or\njust keep going (\u003ccode\u003eset +e\u003c/code\u003e)\u003c/p\u003e\n\u003ch2 id=\"fin\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFin\u003c/span\u003e \u003ca href=\"#fin\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAnd that\u0026rsquo;s how I lost some secrets in my homelab once, and how I almost lost a\nsecond time if I hadn\u0026rsquo;t noticed the \u003ccode\u003ekey\u003c/code\u003e file in my file tree\u003c/p\u003e\n",
      "content_text": "\n## TL;DR\n\nIf state matters then check it in the beginning or handle it on a failure... Let me explain\n\nI ran into some trouble recently _almost_ losing some encrypted data... Now\nthis would be the second time I've had that happen, so I'm going to write a\nlittle bit about it now that I figured it out\n\n## The Stage\n\nHere's the scenario - I use `ansible-vault` to keep some sensitive data in a\nfew public repos, and I keep the keys I use in Bitwarden Secrets Manager.\n\nI use `just` as a command runner and have common `just encrypt` and `just\ndecrypt` recipes throughout many justfiles. It might look something like this\n\n```bash\n\nget-vault-key:\n    bws secret get $HOMELAB_BOT_VAULT_KEY_ID  | jq -r '.value'\n\nencrypt:\n    #!/bin/bash\n    set +e\n    just get-vault-key \u003e key\n    ansible-vault encrypt ./secret-file --vault-password-file key\n    ansible-vault encrypt ./secret-file2 --vault-password-file key\n    rm key\n\ndecrypt:\n    #!/bin/bash\n    set +e\n    just get-vault-key \u003e key\n    ansible-vault decrypt ./secret-file --vault-password-file key\n    ansible-vault decrypt ./secret-file2 --vault-password-file key\n    rm key\n```\n\n## Spoiler\n\nAbove is a good example of the 2 recipes, but prior to this morning they looked like this\n\n```bash\n\nget-vault-key:\n    bws secret get $HOMELAB_BOT_VAULT_KEY_ID  | jq -r '.value'\n\n# BAD EXAMPLES! DO NOT DO THIS\n\nencrypt:\n    set -e\n    just get-vault-key \u003e\u003e key\n    ansible-vault encrypt ./secret-file --vault-password-file key\n    ansible-vault encrypt ./secret-file2 --vault-password-file key\n    rm key\n\ndecrypt:\n    set -e\n    just get-vault-key \u003e\u003e key\n    ansible-vault decrypt ./secret-file --vault-password-file key\n    ansible-vault decrypt ./secret-file2 --vault-password-file key\n    rm key\n```\n\n## Problem\n\nSo here's the story - in real life I started using distrobox when I ran into\nthis and I thought it was an issue with different versions of ansible installed\nin distrobox and on my desktop. After a few more odd deployment workflows I\nthink I've determined that the real problem is that `\u003e\u003e` appends to a file (see\nthe issue yet?), but if my recipes fail (say I try to encrypt an already\nencrypted file) then the command exits but what's left on my disk? `key` is\nstill there... and the next time I go to run a command I'll echo the real key\nto the `key` file again and if I called `encrypt` when the first or more files\nin the list were `decrypted` then they'll be encrypted not with my key, but\nwith my key repeated as many times as I ran a command with `just get-vault-key \u003e\u003e key`\nbefore ever removing the key file!\n\n```bash\n\nnic in pype.dev   main   ×2  ×3  ×7 via   v3.11.10(pype-dev)   (dev) 󰒄 \n❯ cat secret-file\nDanger, Will Robinson\n\nnic in pype.dev   main   ×2  ×3  ×7 via   v3.11.10(pype-dev)   (dev) 󰒄 \n❯ just encrypt\nbws secret get $HOMELAB_BOT_VAULT_KEY_ID  | jq -r '.value'\nEncryption successful\n\nnic in pype.dev   main   ×2  ×3  ×7 via   v3.11.10(pype-dev)   (dev) 󰒄 \n❯ cat secret-file\n$ANSIBLE_VAULT;1.1;AES256\n39616332393662346639633030633766666336323939346138633238626239363733316431333737\n6463663763366434376437303335643431663431326135300a636261663636336139323033316232\n37666439383131393631333332353731633661396431633834326432363936613331623135666565\n6364363039663933620a326563323931643632323031396664646363613636613562366166386439\n63653661653037393538356461323239396630643338393231306163343964623866\n\nnic in pype.dev   main   ×2  ×3  ×7 via   v3.11.10(pype-dev)   (dev) 󰒄 \n❯ just decrypt\nbws secret get $HOMELAB_BOT_VAULT_KEY_ID  | jq -r '.value'\nDecryption successful\n\nnic in pype.dev   main   ×2  ×3  ×7 via   v3.11.10(pype-dev)   (dev) 󰒄 \n❯ cat secret-file\nDanger, Will Robinson\n```\n\nSo as you can see, I have `secret-file` here, and I can encrypt and decrypt\njust fine. But if I have that `\u003e\u003e` in the recipe, add a second file, and a\nfailure in a command - well then I'll start getting confused...\n\nFollow along with the workflow of adding a file that I'll need encrypted\n\n\u003e Only secret-file is in the just recipe here - I add secret-file2 after\n\n```bash\nnic in pype.dev   main   ×2  ×3  ×7 via   v3.11.10(pype-dev)   (dev) 󰒄 \n❯ just decrypt\nbws secret get $HOMELAB_BOT_VAULT_KEY_ID  | jq -r '.value'\nERROR! input is not vault encrypted data. /var/home/nic/projects/personal/pype.dev/secret-file is not a vault encrypted file for /var/home/nic/projects/personal/pype.dev/secret-file\nerror: Recipe `decrypt` failed with exit code 1\n\nnic in pype.dev   main   ×2  ×3  ×8 via   v3.11.10(pype-dev)   (dev) 󰒄 \n✗ echo \"Good - secret-file is already decrypted! So lets add another file\"\nGood - secret-file is already decrypted! So lets add another file\n\nnic in pype.dev   main   ×2  ×3  ×7 via   v3.11.10(pype-dev)   (dev) 󰒄 \n❯ echo \"Foo Bar Bam Baz\" \u003e secret-file2                                    \n\nnic in pype.dev   main   ×2  ×3  ×8 via   v3.11.10(pype-dev)   (dev) 󰒄 \n❯ echo \"Added secret-file2 to my Just recipes\"\nAdded secret-file2 to my Just recipes\n\nnic in pype.dev   main   ×2  ×3  ×8 via   v3.11.10(pype-dev)   (dev) 󰒄 \n❯ just encrypt\nbws secret get $HOMELAB_BOT_VAULT_KEY_ID  | jq -r '.value'\nEncryption successful\nEncryption successful\n\nnic in pype.dev   main   ×2  ×3  ×7 via   v3.11.10(pype-dev)   (dev) 󰒄 \n❯ just decrypt\nbws secret get $HOMELAB_BOT_VAULT_KEY_ID  | jq -r '.value'\nERROR! Decryption failed (no vault secrets were found that could decrypt) on /var/home/nic/projects/personal/pype.dev/secret-file for /var/home/nic/projects/personal/pype.dev/secret-file\nerror: Recipe `decrypt` failed with exit code 1\n\nnic in pype.dev   main   ×2  ×3  ×8 via   v3.11.10(pype-dev)   (dev) 󰒄 \n✗ echo \"Oh no!\"\n```\n\nSo what happened?\n\nRecall that my recipes originally had `set -e` at the top and used `\u003e\u003e` to cat\nmy secret to a file `key`. Well, when the fir| decryption recipe failed the\n`key` file was left behind. Then when I went to encrypt both of my files the\nrecipe got the key again and made a keyfile like this:\n\n```bash\nsecretKey\nsecretKey\n```\n\nThe encryption recipe encrypted the files with this key, removed the key file,\nand then the next decryption recipe failed because when it got the key and made\nthe file it looked like\n\n```\nsecretKey\n```\n\nSo the solution in the end is to remake the `key` file every time (`\u003e` instead\nof `\u003e\u003e`), or check if it exists, or handle the error when the recipe fails, or\njust keep going (`set +e`)\n\n## Fin\n\nAnd that's how I lost some secrets in my homelab once, and how I almost lost a\nsecond time if I hadn't noticed the `key` file in my file tree\n",
      "summary": "If state matters then check it in the beginning or handle it on a failure... Let me explain",
      "date_published": "2025-04-23T08:44:59Z",
      "date_modified": "2025-04-23T08:44:59Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "linux",
        "cli",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/grafana-gotify-for-push-notifications/",
      "url": "https://pype.dev/grafana-gotify-for-push-notifications/",
      "title": "Grafana + Gotify for push notifications",
      "content_html": "\u003cp\u003eIt\u0026rsquo;s easy to configure push notifications through Gotify from Grafana by setting up a generic \u003ccode\u003eWebhook\u003c/code\u003e Alerting Contact Point\u0026hellip;\u003c/p\u003e\n\u003cp\u003eThe parameters are:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eHTTP Method: POST\u003c/li\u003e\n\u003cli\u003eURL: http://\u003cgotify url\u003e/message\u003c/li\u003e\n\u003cli\u003eAuthentication is done with an app token generated from Gotify, and you put it in \u003ccode\u003eAuthorization Header: Credentials\u003c/code\u003e in the Grafana configuration\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003ca href=\"https://dropper.wayl.one/api/file/610b4efb-b4c4-4930-ac63-499d501ba3c3.png\"\u003eSee image\u003c/a\u003e\u003c/p\u003e\n",
      "content_text": "\nIt's easy to configure push notifications through Gotify from Grafana by setting up a generic `Webhook` Alerting Contact Point...\n\nThe parameters are:\n\n* HTTP Method: POST\n* URL: http://\u003cgotify url\u003e/message\n* Authentication is done with an app token generated from Gotify, and you put it in `Authorization Header: Credentials` in the Grafana configuration \n\n[See image](https://dropper.wayl.one/api/file/610b4efb-b4c4-4930-ac63-499d501ba3c3.png)\n",
      "summary": "It's easy to configure push notifications through Gotify from Grafana by setting up a generic Alerting Contact Point...",
      "date_published": "2025-04-07T10:12:51Z",
      "date_modified": "2025-04-07T10:12:51Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "infrastructure",
        "homelab",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/monolith-download-and-save-site-as-html/",
      "url": "https://pype.dev/monolith-download-and-save-site-as-html/",
      "title": "Monolith - download and save site as html",
      "content_html": "\u003ch2 id=\"til-monolith\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTIL: Monolith\u003c/span\u003e \u003ca href=\"#til-monolith\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI needed to save a website earlier and this was just what I needed\u0026hellip;\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/Y2Z/monolith\"\u003ehttps://github.com/Y2Z/monolith\u003c/a\u003e\u003c/p\u003e\n",
      "content_text": "\n## TIL: Monolith\n\nI needed to save a website earlier and this was just what I needed...\n\nhttps://github.com/Y2Z/monolith\n",
      "summary": "I needed to save a website earlier and this was just what I needed...",
      "date_published": "2025-03-16T16:03:31Z",
      "date_modified": "2025-03-16T16:03:31Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "cli",
        "terminal",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/smb-with-zfs-on-ubuntu/",
      "url": "https://pype.dev/smb-with-zfs-on-ubuntu/",
      "title": "SMB with ZFS on Ubuntu",
      "content_html": "\u003cp\u003esudo apt-get install -y samba \\ then set sharesmb=on \\ chown the user \\ smbpasswd \u003cuser\u003e -a \\ then mount with user/password from other machine\u003c/p\u003e\n",
      "content_text": "\nsudo apt-get install -y samba \\\\ then set sharesmb=on \\\\ chown the user \\\\ smbpasswd \u003cuser\u003e -a \\\\ then mount with user/password from other machine\n",
      "summary": "sudo apt-get install -y samba \\\\ then set sharesmb=on \\\\ chown the user \\\\ smbpasswd -a \\\\ then mount with user/password from other machine",
      "date_published": "2025-02-20T09:18:35Z",
      "date_modified": "2025-02-20T09:18:35Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "zfs",
        "linux",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/someday/",
      "url": "https://pype.dev/someday/",
      "title": "Someday",
      "content_text": "\n## Purpose of the Page\n\nProjects, tools, and technologies I want to explore someday. This is my queue\nof things to check out, organized by category. Each item has a checkbox for\ntracking progress - once explored, I'll add a summary or link to a longer post.\n\n---\n\n## Self-Hosted Services\n\n- [x] **[Karakeep](https://docs.karakeep.app/)** (2025-07-19) Read-later and\n      bookmarking service to replace texting links to myself. Want to explore the app\n      and extension, set up RSS feeds for lists.\n\n  - I am running Karakeep, would like to hook it into my blog like `thoughts` but just haven't taken the time to do it\n\n- [ ] **[Rybbit](https://github.com/pypeaday/rybbit)** (2025-08-23)\n      Self-hosted Google Analytics alternative. Forked the repo, want to try on\n      quadtask.\n\n- [ ] **[Domain Locker](https://github.com/lissy93/domain-locker)**\n      (2025-12-09) Domain monitoring service. Stood it up and want to see how it\n      fits into the lab over the next year.\n\n---\n\n## Platform \u0026 DevOps\n\n- [ ] **[Komodo](https://github.com/pypeaday/komodo)** (2025-08-23)\n      Platform-as-a-product tool that aligns with my vision for \"platform as a\n      product\". Discovered it matches much of what I envisioned.\n\n- [x] **[IronCalc](https://github.com/ironcalc/IronCalc)** (2025-11-07)\n      Self-hosted spreadsheet solution. Need to manage the build, starting to think\n      about a reusable Forgejo action for Docker builds.\n\n  - Unfortunately there's not much to write about - neat project but I don't need it\n\n- [ ] **[LLDAP](https://github.com/lldap/lldap/blob/main/docs/install.md#with-docker)**\n      (2025-11-10) Lightweight LDAP for homelab SSO. Want to get SSO setup at home\n      for repoflow, considering LLDAP and Authelia for authentication.\n\n- [ ] **Repoflow** (2025-08-09) Artifactory replacement for artifact storage.\n      Requested a free license and experimenting with it for homelab platform\n      storage.\n  - _Note: Have blog posts but no dedicated project/glossary page yet_\n\n---\n\n## Storage Solutions\n\n- [ ] **[Garage](https://git.deuxfleurs.fr/Deuxfleurs/garage)** (2026-02-15)\n      Distributed object storage. MinIO is archived, so looking at Garage as a\n      replacement for object storage.\n\n- [ ] **[RustFS](https://github.com/rustfs/rustfs)** (2026-02-15) MinIO\n      alternative in Rust. Alternative to MinIO being considered alongside Garage.\n\n---\n\n## Mobile \u0026 Apps\n\n- [ ] **[Conduit](https://github.com/cogwheel0/conduit)** (2025-08-23)\n      Open-WebUI Android app. Found it but needs to build and sideload the APK.\n\n---\n\n## Desktop \u0026 Window Management\n\n- [x] **[AeroSpace](https://github.com/nikitabobko/AeroSpace)** (2025-11-26)\n      Tiling window manager for Mac. Want to try it out for window management.\n\n  - I am using AeroSpace on my Mac - it's beautiful\n\n- [ ] **[Fluid Tile](https://codeberg.org/Serroda/fluid-tile)** (2025-11-26)\n      Tiling window manager option. Saw it as a tiling window manager option to try\n      after getting tiling working on Mac with AeroSpace.\n\n---\n\n## Productivity \u0026 Utilities\n\n- [ ] **[ChoresRewards](https://github.com/matda59/ChoresRewards)**\n      (2025-08-10) Chore tracking with rewards for kids. Looking for a way to track\n      and reward chores for both myself and the kids; considering rewriting it in\n      FastAPI if the auth mechanisms don't work out.\n\n- [ ] **[Lazyjournal](https://github.com/Lifailon/lazyjournal)** (2025-11-15)\n      TUI for host logs. Lazydocker/git-inspired tool for viewing host logs that I\n      learned about.\n\n- [ ] **[Oh My Opencode](https://github.com/code-yeongyu/oh-my-opencode)**\n      (2025-12-31) Compare with OpenAgents. Need to compare OpenAgents with\n      oh-my-opencode.\n\n- [ ] **[Handy](https://github.com/cjpais/Handy)** (2026-02-03) STT tool for\n      voice control. Started using for speech-to-text on work Mac to talk to neovim\n      and opencode; excited to explore vocally conversing with agents.\n\n---\n\n## Already Explored (Have Pages)\n\nThese projects already have glossary entries or blog posts:\n\n- [x] **[Affine](https://docs.affine.pro/)** - Self-hosted Notion-like platform\n      (see [[affine]])\n- [x] **[Apprise](https://github.com/caronc/apprise)** - Centralized\n      notification service (see [[apprise]])\n- [x] **[Forgejo](https://forgejo.org/)** - Self-hosted Git forge (see\n      [[forgejo]])\n",
      "summary": "Projects, tools, and technologies I want to explore someday. This is my queue of things to check out, organized by category. Each item has a checkbox for...",
      "date_published": "2025-02-17T00:00:00Z",
      "date_modified": "2025-02-17T00:00:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "someday",
        "slash",
        "projects"
      ]
    },
    {
      "id": "https://pype.dev/recovering-from-zpool-corruption-when-you-re-short-a-drive/",
      "url": "https://pype.dev/recovering-from-zpool-corruption-when-you-re-short-a-drive/",
      "title": "Recovering from zpool corruption when you’re short a drive",
      "content_html": "\u003col\u003e\n\u003cli\u003ecan only mount tank RO\u003c/li\u003e\n\u003c/ol\u003e\n\u003cul\u003e\n\u003cli\u003eso can\u0026rsquo;t rename\u003c/li\u003e\n\u003cli\u003ealso can\u0026rsquo;t detach which is what I\u0026rsquo;d want\u003c/li\u003e\n\u003c/ul\u003e\n\u003col start=\"2\"\u003e\n\u003cli\u003eCould import pool witn -N to not mount any datasets\u003c/li\u003e\n\u003cli\u003edetach and attach\u003c/li\u003e\n\u003cli\u003eresilver\u0026hellip;\u003c/li\u003e\n\u003c/ol\u003e\n",
      "content_text": "\n1. can only mount tank RO\n  - so can't rename\n  - also can't detach which is what I'd want\n\n2. Could import pool witn -N to not mount any datasets\n3. detach and attach\n4. resilver...\n",
      "summary": "can only mount tank RO - so can't rename - also can't detach which is what I'd want",
      "date_published": "2025-02-03T21:08:56Z",
      "date_modified": "2025-02-03T21:08:56Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "infrastructure",
        "zfs",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/using-my-own-domain-on-nostr/",
      "url": "https://pype.dev/using-my-own-domain-on-nostr/",
      "title": "Using my own domain on nostr",
      "content_html": "\u003cp\u003eAfter generating a keypair on a nostr app (I started with primal) I copied my\npublic key to \u003ccode\u003e/.well-known/nostr.json\u003c/code\u003e and put that at the root of my site at\n\u003ccode\u003ehttps://pype.dev\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eThe file looks like this:\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\"\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=\"err\"\u003e“names”:\u003c/span\u003e \u003cspan class=\"err\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"err\"\u003e“nic”:\u003c/span\u003e \u003cspan class=\"err\"\u003e“npub1q3fsec2vcv99v80ga72dlv90qwkqmuxqcr6mdyumcmpkgudlhrespyurfj”\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\u003cspan class=\"err\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSo now I can use \u003ccode\u003enic@pype.dev\u003c/code\u003e as on nostr because the client will verify the\npubkey associated with my profile with my domain!\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ebig upgrade from \u003cwhatever\u003e@primal.net\u003c/p\u003e\n\u003c/blockquote\u003e\n",
      "content_text": "\nAfter generating a keypair on a nostr app (I started with primal) I copied my\npublic key to `/.well-known/nostr.json` and put that at the root of my site at\n`https://pype.dev`.\n\nThe file looks like this:\n\n```json\n\n{\n  “names”: {\n    “nic”: “npub1q3fsec2vcv99v80ga72dlv90qwkqmuxqcr6mdyumcmpkgudlhrespyurfj”\n  }\n}\n```\nSo now I can use `nic@pype.dev` as on nostr because the client will verify the\npubkey associated with my profile with my domain!\n\n\u003e big upgrade from \u003cwhatever\u003e@primal.net\n",
      "summary": "After generating a keypair on a nostr app (I started with primal) I copied my public key to and put that at the root of my site at .",
      "date_published": "2025-01-24T06:28:19Z",
      "date_modified": "2025-01-24T06:28:19Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "nostr",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/the-design-of-genesis-1-11/",
      "url": "https://pype.dev/the-design-of-genesis-1-11/",
      "title": "The Design of Genesis 1-11 pt 1",
      "content_html": "\u003ch2 id=\"genesis-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGenesis 1\u003c/span\u003e \u003ca href=\"#genesis-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThere is a cyclical pattern of Genesis 1-11.\u003c/p\u003e\n\u003cp\u003eIntroduction 1:1 may be a summary heading rather than the first \u0026ldquo;verse\u0026rdquo;.\u003c/p\u003e\n\u003ch3 id=\"chaos\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eChaos\u003c/span\u003e \u003ca href=\"#chaos\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe narrative begins in 1:2, and the start of everything is a \u0026ldquo;non-created\nworld\u0026rdquo;, which in the ancient mind we should think about as \u0026ldquo;non-ordered\nreality\u0026rdquo;.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e\nGenesis 1:2 (LEB): 2 Now the earth was formless and empty, and darkness was\nover the face of the deep. And the Spirit of God was hovering over the surface\nof the waters. \n\nHarris, W. H., III, Ritzema, E., Brannan, R., Mangum, D., Dunham, J., Reimer,\nJ. A., \u0026amp; Wierenga, M., eds. (2012). The Lexham English Bible (Ge 1:2). Lexham\nPress. \n\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eתֹּ֫הוּ | to-hu | formless בֹּ֫הוּ | ba-hu | empty, void\u003c/p\u003e\n\u003cp\u003eThe first image is that there is \u0026ldquo;unordered wild and waste (wasteland)\u0026rdquo; (we\ntypically see this as formless and void). There is also \u0026ldquo;darkness\u0026rdquo; and \u0026ldquo;deep\u0026rdquo;,\nwhich is a dark chaotic ocean - and this is the ANE person\u0026rsquo;s conception of\n\u0026ldquo;nothing\u0026rdquo;. Westerners think \u0026ldquo;nothing\u0026rdquo; means \u0026ldquo;no atmoic particles, no matter\u0026rdquo;\nbut the ANE person would\u0026rsquo;ve thought about creation as unordered chaos.\u003c/p\u003e\n\u003cp\u003eGod\u0026rsquo;s spirit is hovering over the dark, formless, wild, chaotic ocean.\u003c/p\u003e\n\u003ch3 id=\"day-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDay 1\u003c/span\u003e \u003ca href=\"#day-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre\u003e\u003ccode\u003e\n“Let there be light!” And there was light. 4 And God saw the light, that it\nwas good, and God caused there to be a separation between the light and between\nthe darkness. 5 And God called the light Day, and the darkness he called Night.\nAnd there was evening and there was morning, the first day.  \n\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eCreation starts by separating light from darkness. The darkness is now tamed,\nit is apart of an ordered cycle. The ordering of the days is now established\nand is repeated in every subsequent day of creation\u003c/p\u003e\n\u003ch3 id=\"day-2\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDay 2\u003c/span\u003e \u003ca href=\"#day-2\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre\u003e\u003ccode\u003e\n“Let there be a vaulted dome in the midst of the waters, and let it cause a\nseparation between the waters.” 7 So God made the vaulted dome, and he caused a\nseparation between the waters which were under the vaulted dome and between the\nwaters which were over the vaulted dome. And it was so. 8 And God called the\nvaulted dome “heaven.” \n\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThen on day 2 he separates \u0026ldquo;waters from the waters\u0026rdquo;. God \u0026ldquo;splits\u0026rdquo; (Exodus) the\nwaters, brining order to the chaotic waters.\u003c/p\u003e\n\u003ch3 id=\"day-3\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDay 3\u003c/span\u003e \u003ca href=\"#day-3\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre\u003e\u003ccode\u003e\n“Let the waters under heaven be gathered to one place, and let the dry\nground appear.”\n\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThe waters below are gathered together - so there is further order being\nbrought to the waters.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e\n“Let the earth produce green plants that will bear seed—fruit trees bearing\nfruit ⌊in which there is seed⌋—according to its kind, on the earth.” And it was\nso. 12 And the earth brought forth green plants bearing seed according to its\nkind, and trees bearing fruit ⌊in which there was seed⌋ according to its kind.\n\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch4 id=\"bonus\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBonus\u003c/span\u003e \u003ca href=\"#bonus\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eFruit trees (foreshadowing) are then brought up from the lands\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eNotice that there are things even in the first 3 days that will be apart of\nthe narrative going forward\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003chr\u003e\n\u003cp\u003eSo in the first 3 days God has handled the unordered wild and waste\u003c/p\u003e\n\u003cp\u003eWhat this cosmos needs now is inhabitants\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"day-4\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDay 4\u003c/span\u003e \u003ca href=\"#day-4\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre\u003e\u003ccode\u003e\n“Let there be lights in the vaulted dome of heaven ⌊to separate day from\nnight⌋, and let them be as signs and for appointed times, and for days and\nyears, \n\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThe \u0026ldquo;lights\u0026rdquo; are clearly the sun, moon, and stars. But they are not called by\nthose names, they are just called \u0026ldquo;lights\u0026rdquo;. Which is the descriptive word מָאוֹר\n| ma-or, used to describe the light from the lamp stands in the temple, which\nwas also a symbol of God\u0026rsquo;s presence.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eNotice this is \u003cstrong\u003enot\u003c/strong\u003e the same word for \u0026ldquo;light\u0026rdquo; in the separation of light\nand darkness, that is אוֹר | or, not ma-or\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cpre\u003e\u003ccode\u003e\nPsalm 90:8 (LEB): 8 You have put our iniquities before you,  our hidden\nsins into the light (מָאוֹר | ma-or) of your countenance.  \n\nHarris, W. H., III, Ritzema, E., Brannan, R., Mangum, D., Dunham, J., Reimer,\nJ. A., \u0026amp; Wierenga, M., eds. (2012). The Lexham English Bible (Ps 90:8). Lexham\nPress. \n\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003e\nExodus 35:14 (LEB): 14 and lampstand of the light (מָאוֹר | ma-or) and its\nequipment and its lamps and the oil for the light (מָאוֹר | ma-or); \n\nHarris, W. H., III, Ritzema, E., Brannan, R., Mangum, D., Dunham, J., Reimer,\nJ. A., \u0026amp; Wierenga, M., eds. (2012). The Lexham English Bible (Ex 35:14). Lexham\nPress. \n\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003e\nGenesis 1:16 (LEB): 16 And God made two great lights, the greater light to\nrule the day and the smaller light to rule the night, and the stars. \n\nHarris, W. H., III, Ritzema, E., Brannan, R., Mangum, D., Dunham, J., Reimer,\nJ. A., \u0026amp; Wierenga, M., eds. (2012). The Lexham English Bible (Ge 1:16). Lexham\nPress. \n\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThese lights have a job to rule\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eNotice the callback to day 1 - light and darkness were initially separated,\nand now there is further order brought to both the light (sun) and the dark\n(stars and moon)\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch3 id=\"day-5\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDay 5\u003c/span\u003e \u003ca href=\"#day-5\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre\u003e\u003ccode\u003e\nGenesis 1:20–21 (LEB): 20 And God said, “Let the waters swarm with swarms\nof living creatures, and let birds fly over the earth across the face of the\nvaulted dome of heaven.” 21 So God created the great sea creatures and every\nliving creature that moves, with which the waters swarm, according to their\nkind, and every bird with wings according to its kind. And God saw that it was\ngood. \n\nHarris, W. H., III, Ritzema, E., Brannan, R., Mangum, D., Dunham, J., Reimer,\nJ. A., \u0026amp; Wierenga, M., eds. (2012). The Lexham English Bible (Ge 1:20–21).\nLexham Press. \n\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eDay 2 was about the waters, they were separated from above and below, and now\nin Day 5, above and below, will be populated, will be ordered.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eGreat Sea Creatures - תַּנִּין | tan-nin is a rabbit-hole for another time, but\nit\u0026rsquo;s not insignificant\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch3 id=\"day-6\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDay 6\u003c/span\u003e \u003ca href=\"#day-6\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre\u003e\u003ccode\u003e\n“Let the earth bring forth living creatures according to their kind: cattle\nand moving things, and wild animals according to their kind.” And it was so.\n25 So God made wild animals according to their kind and the cattle according to\ntheir kind, and every creeping thing of the earth according to its kind.\n\nHarris, W. H., III, Ritzema, E., Brannan, R., Mangum, D., Dunham, J., Reimer,\nJ. A., \u0026amp; Wierenga, M., eds. (2012). The Lexham English Bible (Ge 1:24–25).\nLexham Press. \n\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eOn Day 6 the land, which was brought up on Day 3, is now populated with animals\naccording to their kinds, again further order\u003c/p\u003e\n\u003ch4 id=\"bonus-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBonus\u003c/span\u003e \u003ca href=\"#bonus-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003e\u003ccode\u003e“Let us make humankind in our image and according to our likeness\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eJust as fruit-trees were brought up, specifically with seed in them, now we\nhave humanity, given a job to rule the earth, subdue it, and multiply\u003c/p\u003e\n\u003cp\u003eHumanity are the rulers below (Day 4 with the rulers of the sky)\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eSo God created humankind in his image\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eHumanity are God\u0026rsquo;s idols\u0026hellip; Where do you put idols? In a temple\u0026hellip;\u003c/p\u003e\n\u003cp\u003eHumans are made to rule - God makes humans kings and queens\u003c/p\u003e\n\u003ch3 id=\"summary\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSummary\u003c/span\u003e \u003ca href=\"#summary\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eGod has just built for himself a temple of Creation.\u003c/p\u003e\n\u003ch3 id=\"day-7\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDay 7\u003c/span\u003e \u003ca href=\"#day-7\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eGod is clearly in charge, but he wants to rule the creation with his image\nbearers. So now he rests\u003c/p\u003e\n\u003ch2 id=\"genesis-3\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGenesis 3\u003c/span\u003e \u003ca href=\"#genesis-3\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe one thing, the first thing, that a creature in the narrative sees as \u0026ldquo;good\u0026rdquo;\nis the one thing God said would bring death\u0026hellip;\u003c/p\u003e\n\u003cp\u003e\u0026ldquo;So when the woman saw that the tree [of knowledge of good and bad] was\ngood\u0026hellip;\u0026rdquo;. God said to eat from every tree except this one\u0026hellip; The first\njudgement call humanity makes is contrary to God\u0026rsquo;s command\u003c/p\u003e\n",
      "content_text": "\n##  Genesis 1\n\nThere is a cyclical pattern of Genesis 1-11.\n\nIntroduction 1:1 may be a summary heading rather than the first \"verse\".\n\n### Chaos\n\nThe narrative begins in 1:2, and the start of everything is a \"non-created\nworld\", which in the ancient mind we should think about as \"non-ordered\nreality\".\n\n```\n\nGenesis 1:2 (LEB): 2 Now the earth was formless and empty, and darkness was\nover the face of the deep. And the Spirit of God was hovering over the surface\nof the waters. \n\nHarris, W. H., III, Ritzema, E., Brannan, R., Mangum, D., Dunham, J., Reimer,\nJ. A., \u0026 Wierenga, M., eds. (2012). The Lexham English Bible (Ge 1:2). Lexham\nPress. \n\n```\n\nתֹּ֫הוּ | to-hu | formless בֹּ֫הוּ | ba-hu | empty, void\n \nThe first image is that there is \"unordered wild and waste (wasteland)\" (we\ntypically see this as formless and void). There is also \"darkness\" and \"deep\",\nwhich is a dark chaotic ocean - and this is the ANE person's conception of\n\"nothing\". Westerners think \"nothing\" means \"no atmoic particles, no matter\"\nbut the ANE person would've thought about creation as unordered chaos.\n\nGod's spirit is hovering over the dark, formless, wild, chaotic ocean.\n\n### Day 1\n\n``` \n\n“Let there be light!” And there was light. 4 And God saw the light, that it\nwas good, and God caused there to be a separation between the light and between\nthe darkness. 5 And God called the light Day, and the darkness he called Night.\nAnd there was evening and there was morning, the first day.  \n\n```\n\nCreation starts by separating light from darkness. The darkness is now tamed,\nit is apart of an ordered cycle. The ordering of the days is now established\nand is repeated in every subsequent day of creation\n\n### Day 2\n\n``` \n\n“Let there be a vaulted dome in the midst of the waters, and let it cause a\nseparation between the waters.” 7 So God made the vaulted dome, and he caused a\nseparation between the waters which were under the vaulted dome and between the\nwaters which were over the vaulted dome. And it was so. 8 And God called the\nvaulted dome “heaven.” \n\n```\n\nThen on day 2 he separates \"waters from the waters\". God \"splits\" (Exodus) the\nwaters, brining order to the chaotic waters.\n\n### Day 3\n\n``` \n\n“Let the waters under heaven be gathered to one place, and let the dry\nground appear.”\n\n```\n\n\nThe waters below are gathered together - so there is further order being\nbrought to the waters.\n\n``` \n\n“Let the earth produce green plants that will bear seed—fruit trees bearing\nfruit ⌊in which there is seed⌋—according to its kind, on the earth.” And it was\nso. 12 And the earth brought forth green plants bearing seed according to its\nkind, and trees bearing fruit ⌊in which there was seed⌋ according to its kind.\n\n```\n\n#### Bonus\n\nFruit trees (foreshadowing) are then brought up from the lands\n\n\u003e Notice that there are things even in the first 3 days that will be apart of\n\u003e the narrative going forward\n\n---\n\nSo in the first 3 days God has handled the unordered wild and waste\n\nWhat this cosmos needs now is inhabitants \n\n---\n\n### Day 4\n\n``` \n\n“Let there be lights in the vaulted dome of heaven ⌊to separate day from\nnight⌋, and let them be as signs and for appointed times, and for days and\nyears, \n\n```\n\nThe \"lights\" are clearly the sun, moon, and stars. But they are not called by\nthose names, they are just called \"lights\". Which is the descriptive word מָאוֹר\n| ma-or, used to describe the light from the lamp stands in the temple, which\nwas also a symbol of God's presence.\n\n\u003e Notice this is __not__ the same word for \"light\" in the separation of light\n\u003e and darkness, that is אוֹר | or, not ma-or\n\n``` \n\nPsalm 90:8 (LEB): 8 You have put our iniquities before you,  our hidden\nsins into the light (מָאוֹר | ma-or) of your countenance.  \n\nHarris, W. H., III, Ritzema, E., Brannan, R., Mangum, D., Dunham, J., Reimer,\nJ. A., \u0026 Wierenga, M., eds. (2012). The Lexham English Bible (Ps 90:8). Lexham\nPress. \n\n```\n\n``` \n\nExodus 35:14 (LEB): 14 and lampstand of the light (מָאוֹר | ma-or) and its\nequipment and its lamps and the oil for the light (מָאוֹר | ma-or); \n\nHarris, W. H., III, Ritzema, E., Brannan, R., Mangum, D., Dunham, J., Reimer,\nJ. A., \u0026 Wierenga, M., eds. (2012). The Lexham English Bible (Ex 35:14). Lexham\nPress. \n\n```\n\n``` \n\nGenesis 1:16 (LEB): 16 And God made two great lights, the greater light to\nrule the day and the smaller light to rule the night, and the stars. \n\nHarris, W. H., III, Ritzema, E., Brannan, R., Mangum, D., Dunham, J., Reimer,\nJ. A., \u0026 Wierenga, M., eds. (2012). The Lexham English Bible (Ge 1:16). Lexham\nPress. \n\n```\n\nThese lights have a job to rule\n\n\u003e Notice the callback to day 1 - light and darkness were initially separated,\n\u003e and now there is further order brought to both the light (sun) and the dark\n\u003e (stars and moon)\n\n### Day 5\n\n``` \n\nGenesis 1:20–21 (LEB): 20 And God said, “Let the waters swarm with swarms\nof living creatures, and let birds fly over the earth across the face of the\nvaulted dome of heaven.” 21 So God created the great sea creatures and every\nliving creature that moves, with which the waters swarm, according to their\nkind, and every bird with wings according to its kind. And God saw that it was\ngood. \n\nHarris, W. H., III, Ritzema, E., Brannan, R., Mangum, D., Dunham, J., Reimer,\nJ. A., \u0026 Wierenga, M., eds. (2012). The Lexham English Bible (Ge 1:20–21).\nLexham Press. \n\n```\n\n\nDay 2 was about the waters, they were separated from above and below, and now\nin Day 5, above and below, will be populated, will be ordered.\n\n\u003e Great Sea Creatures - תַּנִּין | tan-nin is a rabbit-hole for another time, but\n\u003e it's not insignificant\n\n\n### Day 6\n\n``` \n\n“Let the earth bring forth living creatures according to their kind: cattle\nand moving things, and wild animals according to their kind.” And it was so.\n25 So God made wild animals according to their kind and the cattle according to\ntheir kind, and every creeping thing of the earth according to its kind.\n\nHarris, W. H., III, Ritzema, E., Brannan, R., Mangum, D., Dunham, J., Reimer,\nJ. A., \u0026 Wierenga, M., eds. (2012). The Lexham English Bible (Ge 1:24–25).\nLexham Press. \n\n```\n\nOn Day 6 the land, which was brought up on Day 3, is now populated with animals\naccording to their kinds, again further order\n\n#### Bonus\n\n``` “Let us make humankind in our image and according to our likeness ```\n\nJust as fruit-trees were brought up, specifically with seed in them, now we\nhave humanity, given a job to rule the earth, subdue it, and multiply\n\nHumanity are the rulers below (Day 4 with the rulers of the sky)\n\n`So God created humankind in his image`\n\nHumanity are God's idols... Where do you put idols? In a temple...\n\nHumans are made to rule - God makes humans kings and queens\n\n### Summary\n\nGod has just built for himself a temple of Creation.\n\n### Day 7\n\nGod is clearly in charge, but he wants to rule the creation with his image\nbearers. So now he rests\n\n## Genesis 3\n\nThe one thing, the first thing, that a creature in the narrative sees as \"good\"\nis the one thing God said would bring death...\n\n\"So when the woman saw that the tree [of knowledge of good and bad] was\ngood...\". God said to eat from every tree except this one... The first\njudgement call humanity makes is contrary to God's command\n\n\n",
      "summary": "There is a cyclical pattern of Genesis 1-11.",
      "date_published": "2025-01-18T04:54:03Z",
      "date_modified": "2025-01-18T04:54:03Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "bible-project",
        "faith",
        "design-of-genesis-1-11"
      ]
    },
    {
      "id": "https://pype.dev/deployments-are-not-statefulsets/",
      "url": "https://pype.dev/deployments-are-not-statefulsets/",
      "title": "Deployments are not StatefulSets",
      "content_html": "\u003cp\u003eI was debugging some ArgoCD stuff earlier today and I love using k9s to explore\nmy k8s resources.\u003c/p\u003e\n\u003cp\u003eThe TLDR is that I put some bad env vars in the \u003ccode\u003eglobal\u003c/code\u003e values for my ArgoCD\npods, this caused the webUI to hang. An easy way to push things through is to\nopen k9s, view the Deployments, and edit the env vars there so the pods can be\nin the right state to restart and pickup the changes (you\u0026rsquo;ve obviously fixed\nthe values file already right?)\u003c/p\u003e\n\u003cp\u003eWell the Notification Controller was the pod hanging, and I couldn\u0026rsquo;t find it in\nthe Deployments view! This blew my mind\u0026hellip; until I realized that it was a\nStateful Set.\u003c/p\u003e\n\u003cp\u003eSo, this is not a comparison of the 2 - this is just a note to say that all I\nhad to do was find the StatefulSets in k9s and do the same workflow for editing\nwhat I needed to edit to get the pods into workable state while working on the\nvalues file\u0026hellip;\u003c/p\u003e\n",
      "content_text": "\nI was debugging some ArgoCD stuff earlier today and I love using k9s to explore\nmy k8s resources.\n\nThe TLDR is that I put some bad env vars in the `global` values for my ArgoCD\npods, this caused the webUI to hang. An easy way to push things through is to\nopen k9s, view the Deployments, and edit the env vars there so the pods can be\nin the right state to restart and pickup the changes (you've obviously fixed\nthe values file already right?)\n\nWell the Notification Controller was the pod hanging, and I couldn't find it in\nthe Deployments view! This blew my mind... until I realized that it was a\nStateful Set.\n\nSo, this is not a comparison of the 2 - this is just a note to say that all I\nhad to do was find the StatefulSets in k9s and do the same workflow for editing\nwhat I needed to edit to get the pods into workable state while working on the\nvalues file...\n",
      "summary": "I was debugging some ArgoCD stuff earlier today and I love using k9s to explore my k8s resources.",
      "date_published": "2025-01-15T18:07:57Z",
      "date_modified": "2025-01-15T18:07:57Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "infrastructure",
        "tech",
        "k8s",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-528/",
      "url": "https://pype.dev/thoughts-528/",
      "title": "💭 Self-Hosting selfh.st/icons With Git-Sync",
      "content_text": "\n\u003ca href=\"https://selfh.st/selfhst-icons-git-sync/\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://selfh.st/selfhst-icons-git-sync/\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - Self-Hosting selfh.st/icons With Git-Sync\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://selfh.st/selfhst-icons-git-sync/\"\u003eSelf-Hosting selfh.st/icons With Git-Sync\u003c/a\u003e\n\n---\n\nI like a nice icon for dashboards I've put together and having a convenient way to load them up off line would be nice\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "I like a nice icon for dashboards I've put together and having a convenient way to load them up off line would be nice",
      "date_published": "2025-01-12T14:51:56Z",
      "date_modified": "2025-01-12T14:51:56Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "self-host",
        "icons",
        "dashboard",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-504/",
      "url": "https://pype.dev/thoughts-504/",
      "title": "💭 Mastering Argo CD image updater with Helm: a complete configur…",
      "content_text": "\n\u003ca href=\"https://www.cncf.io/blog/2024/11/05/mastering-argo-cd-image-updater-with-helm-a-complete-configuration-guide/\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://www.cncf.io/blog/2024/11/05/mastering-argo-cd-image-updater-with-helm-a-complete-configuration-guide/\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - Mastering Argo CD image updater with Helm: a complete configuration guide | CNCF\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://www.cncf.io/blog/2024/11/05/mastering-argo-cd-image-updater-with-helm-a-complete-configuration-guide/\"\u003eMastering Argo CD image updater with Helm: a complete configuration guide | CNCF\u003c/a\u003e\n\n---\n\nimage updater is a great little tool that I'm using at work and I want to use it in the best way. I'll come back to this blog as I revisit our applications\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "image updater is a great little tool that I'm using at work and I want to use it in the best way. I'll come back to this",
      "date_published": "2025-01-04T15:10:30Z",
      "date_modified": "2025-01-04T15:10:30Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "argocd k8s",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-498/",
      "url": "https://pype.dev/thoughts-498/",
      "title": "💭 Craig",
      "content_text": "\n\u003ca href=\"https://craig.chat/\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://craig.chat/\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - Craig\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://craig.chat/\"\u003eCraig\u003c/a\u003e\n\n---\n\nCraig is a discord bot to do multi-track recording, seems like a super easy way to get started with a podcast where the hosts are virtual. Excited to try this out for pilgrims creek!\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "Craig is a discord bot to do multi-track recording, seems like a super easy way to get started with a podcast where the",
      "date_published": "2025-01-03T20:39:25Z",
      "date_modified": "2025-01-03T20:39:25Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "pilgrims-creek",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-491/",
      "url": "https://pype.dev/thoughts-491/",
      "title": "💭 memory - Check which processes are eating swap on Linux? - Sup…",
      "content_text": "\n\u003ca href=\"https://superuser.com/questions/1677225/check-which-processes-are-eating-swap-on-linux\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://superuser.com/questions/1677225/check-which-processes-are-eating-swap-on-linux\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - memory - Check which processes are eating swap on Linux? - Super User\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://superuser.com/questions/1677225/check-which-processes-are-eating-swap-on-linux\"\u003ememory - Check which processes are eating swap on Linux? - Super User\u003c/a\u003e\n\n---\n\nI often max my swap on all my machines, and I still have no idea what I'm dong different than anyone else. But using `top` I guess it's easy to see swap usage by process after adding it to the menu by hitting `f`, finding `SWAP`, then hit `space` and the right arrow key to move it to a convenient spot in the column order... Helped me see that I had 1 python process using over a full GeeBee of swap today!\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "I often max my swap on all my machines, and I still have no idea what I'm dong different than anyone else. But using to",
      "date_published": "2025-01-01T16:04:56Z",
      "date_modified": "2025-01-01T16:04:56Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "linux.swap",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-490/",
      "url": "https://pype.dev/thoughts-490/",
      "title": "💭 🏡 Home | Open WebUI",
      "content_text": "\n\u003ca href=\"https://docs.openwebui.com/\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://docs.openwebui.com/\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - 🏡 Home | Open WebUI\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://docs.openwebui.com/\"\u003e🏡 Home | Open WebUI\u003c/a\u003e\n\n---\n\nI've been using openwebui at home, mostly with llama3.2, to do some basic things - meal planning and short script generation. One thing I want to do is generate shrotened versions of my favorite books to read to my kids. For example, the Narnia series. It's already a kid's book, but a 3 year old can't stay focused for even a whole chapter. I'd love for AI to shorten up the narrative to keep the jist of the story but in about 1000 words or so... I haven't gotten it perfect, but openwebui lets me upload documents (for example, a pdf of The Lion, The Witch, and The Wardrobe, and then use that for context... It's not quite RAG I don't think, and that's on the list of ideas to play with to this end.\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "I've been using openwebui at home, mostly with llama3.2, to do some basic things - meal planning and short script genera",
      "date_published": "2025-01-01T13:26:50Z",
      "date_modified": "2025-01-01T13:26:50Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "llm",
        "ai",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-480/",
      "url": "https://pype.dev/thoughts-480/",
      "title": "💭 Do you really need Kubernetes?",
      "content_text": "\n\u003ca href=\"https://doyoureallyneedkubernetes.com/\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://doyoureallyneedkubernetes.com/\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - Do you really need Kubernetes?\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://doyoureallyneedkubernetes.com/\"\u003eDo you really need Kubernetes?\u003c/a\u003e\n\n---\n\nThe other shoe just dropped\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "The other shoe just dropped",
      "date_published": "2024-12-30T02:06:41Z",
      "date_modified": "2024-12-30T02:06:41Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "k8s",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-479/",
      "url": "https://pype.dev/thoughts-479/",
      "title": "💭 audiobookshelf",
      "content_text": "\n\u003ca href=\"https://www.audiobookshelf.org/\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://www.audiobookshelf.org/\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - audiobookshelf\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://www.audiobookshelf.org/\"\u003eaudiobookshelf\u003c/a\u003e\n\n---\n\nAudiobookshelf looks like a solid competitor for booksonic. I've liked the simple subsonic api driven nature of booksonic but my wife would like some more appropriate and easy-to-use organization... booksonic is not a great \"library\"... I'm looking forward to putting this into my homelab soon \n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "Audiobookshelf looks like a solid competitor for booksonic. I've liked the simple subsonic api driven nature of booksoni",
      "date_published": "2024-12-29T20:53:19Z",
      "date_modified": "2024-12-29T20:53:19Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-477/",
      "url": "https://pype.dev/thoughts-477/",
      "title": "💭 Assistants API overview - OpenAI API",
      "content_text": "\n\u003ca href=\"https://platform.openai.com/docs/assistants/overview\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://platform.openai.com/docs/assistants/overview\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - Assistants API overview - OpenAI API\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://platform.openai.com/docs/assistants/overview\"\u003eAssistants API overview - OpenAI API\u003c/a\u003e\n\n---\n\nOpenAI assistants seem like a sweet idea... I wonder if I could use one as a project manager that manages my issues and prioritizes my day like a scrum master might\n\n\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "OpenAI assistants seem like a sweet idea... I wonder if I could use one as a project manager that manages my issues and",
      "date_published": "2024-12-29T20:26:01Z",
      "date_modified": "2024-12-29T20:26:01Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "ai",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/thoughts-476/",
      "url": "https://pype.dev/thoughts-476/",
      "title": "💭 Do you need Kubernetes?",
      "content_text": "\n\u003ca href=\"https://doyouneedkubernetes.com\"\u003e\n    \u003cimg\n        src=\"https://shots.wayl.one/shot/?url=https://doyouneedkubernetes.com\u0026height=450\u0026width=800\u0026scaled_width=800\u0026scaled_height=450\u0026selectors=\"\n        alt=\"shot of post - Do you need Kubernetes?\"\n        height=450\n        width=800\n    \u003e\n\u003c/a\u003e\n\nHere's my thought on \u003ca href=\"https://doyouneedkubernetes.com\"\u003eDo you need Kubernetes?\u003c/a\u003e\n\n---\n\ndo you though?\n\n---\n\n!!! note\n    This is one of [[ my-thoughts ]]. I picked this up from [Waylon Walker](https://waylonwalker.com)(https://thoughts.waylonwalker.com). It's a short note that I make about someone else's content online.  Learn more about the process [[ thoughts ]]\n",
      "summary": "do you though?",
      "date_published": "2024-12-29T16:15:43Z",
      "date_modified": "2024-12-29T16:15:43Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "k8s",
        "thoughts"
      ]
    },
    {
      "id": "https://pype.dev/docker-context-and-an-issue-to-question-your-sanity/",
      "url": "https://pype.dev/docker-context-and-an-issue-to-question-your-sanity/",
      "title": "docker context (and an issue to question your sanity)",
      "content_html": "\u003cp\u003edocker contexts are great, would recommend putting them in your prompt though (via starship or something else)\u0026hellip; here\u0026rsquo;s why\u003c/p\u003e\n\u003cp\u003eI like to manage my containers remotely - I have a nice development setup on my desktop and I try to keep my server as bare-bones as possible. For a while I\u0026rsquo;ve been using ansible which makes it easy to manage configuration etc on other machines. But I recently learned about docker contexts and I\u0026rsquo;m planning to scale down my homelab management to just docker-compose stacks rather than a bunch of super complicated ansible playbooks\u003c/p\u003e\n\u003cp\u003eSo, setting up a context is easy - it\u0026rsquo;s basically an ssh connection to another machine!\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003edocker context create koober --docker \u0026quot;host=ssh://nic@koober\u0026quot;\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003ekoober\u003c/code\u003e is one of my dev machines and my \u003ccode\u003e~/.ssh/config\u003c/code\u003e is setup such that I can \u003ccode\u003essh nic@koober\u003c/code\u003e, this makes the context work really seamlessly.\u003c/p\u003e\n\u003cp\u003eSo there\u0026rsquo;s the \u003ccode\u003edefault\u003c/code\u003e context (the machine you\u0026rsquo;re on) and now I have \u003ccode\u003ekoober\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eTo use it you run \u003ccode\u003edocker context use koober\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eAnd then to check we can \u003ccode\u003els\u003c/code\u003e the contexts\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003edocker context ls\nNAME       DESCRIPTION                               DOCKER ENDPOINT               ERROR\ndefault    Current DOCKER_HOST based configuration   unix:///var/run/docker.sock   \nkoober *                                             ssh://nic@koober\n\u003c/code\u003e\u003c/pre\u003e\n\u003cblockquote\u003e\n\u003cp\u003eNotice the * - that indicates that\u0026rsquo;s our current context.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"trouble\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTrouble\u003c/span\u003e \u003ca href=\"#trouble\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eNow here\u0026rsquo;s where things get hairy\u0026hellip; you\u0026rsquo;ve gotta be super-aware of what context you\u0026rsquo;re using. I have an indicator in my starship prompt that shows the current context, but since I\u0026rsquo;m new to using them I kind of didn\u0026rsquo;t notice it until I ran into this issue\u0026hellip;\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m working on a python application in docker but was not able to execute the entrypoint even though I KNEW the file was there\u0026hellip; let\u0026rsquo;s take a look\u003c/p\u003e\n\u003ch3 id=\"example\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExample\u003c/span\u003e \u003ca href=\"#example\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eHere\u0026rsquo;s a minimal hello world applycation in docker to illustrate the issue\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# main.py\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;hello world\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Use an official Python runtime as a parent image\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eFROM\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003epython:3.11-slim\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Set the working directory in the container\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eWORKDIR\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e/app\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Copy the current directory contents into the container at /app\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eCOPY\u003c/span\u003e . /app\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Run the main.py script as the container\u0026#39;s main process\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eCMD\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;python\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;main.py\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eservices\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\"\u003ehello-world\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\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\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\"\u003evolumes\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\"\u003e.:/app\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNotice volume mounting in my project directory \u003ccode\u003e.\u003c/code\u003e to \u003ccode\u003e/app\u003c/code\u003e as a common practice to develop inside the container\u003c/p\u003e\n\u003cp\u003eHere\u0026rsquo;s where I started to question my sanity\u0026hellip;\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e✗ docker compose up                                            \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e[\u003c/span\u003e+\u003cspan class=\"o\"\u003e]\u003c/span\u003e Running 1/0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e ✔ Container docker-context-example-hello-world-1  Created                                                                                                                                                                                                                                                              0.0s \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAttaching to hello-world-1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ehello-world-1  \u003cspan class=\"p\"\u003e|\u003c/span\u003e python: can\u003cspan class=\"s1\"\u003e\u0026#39;t open file \u0026#39;\u003c/span\u003e/app/main.py\u003cspan class=\"err\"\u003e\u0026#39;\u003c/span\u003e: \u003cspan class=\"o\"\u003e[\u003c/span\u003eErrno 2\u003cspan class=\"o\"\u003e]\u003c/span\u003e No such file or directory\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ehello-world-1 exited with code \u003cspan class=\"m\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003epython can't open file\u003c/code\u003e? hmm\u0026hellip; Let\u0026rsquo;s take a look at the image\u003c/p\u003e\n\u003cp\u003eFirst let\u0026rsquo;s make sure we get the image name right\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e✗ docker container ls -a              \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCONTAINER ID   IMAGE                                           COMMAND                  CREATED          STATUS                       PORTS                                                                                  NAMES\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e3d7285fc39e2   docker-context-example-hello-world              \u003cspan class=\"s2\"\u003e\u0026#34;python main.py\u0026#34;\u003c/span\u003e         \u003cspan class=\"m\"\u003e10\u003c/span\u003e minutes ago   Exited \u003cspan class=\"o\"\u003e(\u003c/span\u003e2\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"m\"\u003e44\u003c/span\u003e seconds ago                                                                                           docker-context-example-hello-world-1\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNow we can \u003ccode\u003edocker run --rm -it --entrypoint /bin/bash --name debug docker-context-example-hello-world\u003c/code\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ docker run --rm -it --entrypoint /bin/bash --name debug docker-context-example-hello-world  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eroot@ee46d0e22de8:/app# python main.py\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHello, World!\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eroot@ee46d0e22de8:/app# \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWHAT THE HECK??\u003c/p\u003e\n\u003ch2 id=\"what-happened\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhat happened…\u003c/span\u003e \u003ca href=\"#what-happened\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWhat happened turns out to be pretty simple once we realize I\u0026rsquo;m using contexts\u0026hellip;\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003ekoboer\u003c/code\u003e is a remote context, the \u003ccode\u003edocker run\u003c/code\u003e and \u003ccode\u003edocker compose up\u003c/code\u003e commands are interacting with the docker socket on that machine.\u003c/p\u003e\n\u003cp\u003eSo if I compose up the stack notice that there\u0026rsquo;s a volume bind mount in there - well those do \u003cem\u003enot\u003c/em\u003e work with contexts (or at least I\u0026rsquo;m not aware of hose to make it work) and so the \u003ccode\u003e/app\u003c/code\u003e directory was getting blown away essentially with an empty overlay\u0026hellip;\u003c/p\u003e\n\u003cp\u003eBut when running with just \u003ccode\u003edocker run\u003c/code\u003e with no volume mount, the code was copied in during the build and is right where we expect it\u0026hellip;\u003c/p\u003e\n\u003ch3 id=\"let-s-prove-it\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLet’s prove it\u003c/span\u003e \u003ca href=\"#let-s-prove-it\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ docker run --rm -it --entrypoint /bin/bash --name debug -v .:/app docker-context-example-hello-world\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eroot@903f591c0384:/app# python main.py\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython: can\u003cspan class=\"s1\"\u003e\u0026#39;t open file \u0026#39;\u003c/span\u003e/app/main.py\u003cspan class=\"err\"\u003e\u0026#39;\u003c/span\u003e: \u003cspan class=\"o\"\u003e[\u003c/span\u003eErrno 2\u003cspan class=\"o\"\u003e]\u003c/span\u003e No such file or directory\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eroot@903f591c0384:/app# \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cpre\u003e\u003ccode\u003eAdding a `-v .:/app` to match the compose file, we get the same error...\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eIf we switch to the default context we are back up and running as expected\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e✗ docker context use default\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edefault\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCurrent context is now \u003cspan class=\"s2\"\u003e\u0026#34;default\u0026#34;\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\"\u003enic in /tmp/docker-context-example  via   v3.13.0  \u003cspan class=\"o\"\u003e(\u003c/span\u003edev\u003cspan class=\"o\"\u003e)\u003c/span\u003e 󰒄 󱔎 NO PYTHON ENVIORNMENT SET \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ docker compose up         \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e[\u003c/span\u003e+\u003cspan class=\"o\"\u003e]\u003c/span\u003e Running 1/0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e ✔ Container docker-context-example-hello-world-1  Created                                                                                                                                                                                                                                                              0.0s \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAttaching to hello-world-1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ehello-world-1  \u003cspan class=\"p\"\u003e|\u003c/span\u003e Hello, World!\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ehello-world-1 exited with code \u003cspan class=\"m\"\u003e0\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\"\u003enic in /tmp/docker-context-example  via   v3.13.0  \u003cspan class=\"o\"\u003e(\u003c/span\u003edev\u003cspan class=\"o\"\u003e)\u003c/span\u003e 󰒄 󱔎 NO PYTHON ENVIORNMENT SET \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ docker run --rm -it --entrypoint /bin/bash --name debug -v .:/app docker-context-example-hello-world\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eroot@4045b6aa8883:/app# python main.py\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHello, World!\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eroot@4045b6aa8883:/app# \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSuccessful runs on both accounts with the volume mount\u003c/p\u003e\n\u003ch2 id=\"tldr\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTLDR\u003c/span\u003e \u003ca href=\"#tldr\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eContext is king\u003c/p\u003e\n",
      "content_text": "\ndocker contexts are great, would recommend putting them in your prompt though (via starship or something else)... here's why\n\nI like to manage my containers remotely - I have a nice development setup on my desktop and I try to keep my server as bare-bones as possible. For a while I've been using ansible which makes it easy to manage configuration etc on other machines. But I recently learned about docker contexts and I'm planning to scale down my homelab management to just docker-compose stacks rather than a bunch of super complicated ansible playbooks\n\nSo, setting up a context is easy - it's basically an ssh connection to another machine!\n\n`docker context create koober --docker \"host=ssh://nic@koober\"`\n\n`koober` is one of my dev machines and my `~/.ssh/config` is setup such that I can `ssh nic@koober`, this makes the context work really seamlessly.\n\nSo there's the `default` context (the machine you're on) and now I have `koober`\n\nTo use it you run `docker context use koober`\n\nAnd then to check we can `ls` the contexts\n\n```\ndocker context ls\nNAME       DESCRIPTION                               DOCKER ENDPOINT               ERROR\ndefault    Current DOCKER_HOST based configuration   unix:///var/run/docker.sock   \nkoober *                                             ssh://nic@koober\n```\n\n\u003e Notice the * - that indicates that's our current context.\n\n## Trouble\n\nNow here's where things get hairy... you've gotta be super-aware of what context you're using. I have an indicator in my starship prompt that shows the current context, but since I'm new to using them I kind of didn't notice it until I ran into this issue...\n\nI'm working on a python application in docker but was not able to execute the entrypoint even though I KNEW the file was there... let's take a look\n\n### Example\n\nHere's a minimal hello world applycation in docker to illustrate the issue\n\n```python\n# main.py\nprint(\"hello world\")\n```\n\n```Dockerfile\n# Use an official Python runtime as a parent image\nFROM python:3.11-slim\n\n# Set the working directory in the container\nWORKDIR /app\n\n# Copy the current directory contents into the container at /app\nCOPY . /app\n\n# Run the main.py script as the container's main process\nCMD [\"python\", \"main.py\"]\n```\n\n```yaml\nservices:\n  hello-world:\n    build: .\n    volumes:\n      - .:/app\n```\n\nNotice volume mounting in my project directory `.` to `/app` as a common practice to develop inside the container\n\nHere's where I started to question my sanity...\n\n```bash\n✗ docker compose up                                            \n[+] Running 1/0\n ✔ Container docker-context-example-hello-world-1  Created                                                                                                                                                                                                                                                              0.0s \nAttaching to hello-world-1\nhello-world-1  | python: can't open file '/app/main.py': [Errno 2] No such file or directory\nhello-world-1 exited with code 2\n```\n\n`python can't open file`? hmm... Let's take a look at the image\n\nFirst let's make sure we get the image name right\n\n```bash\n✗ docker container ls -a              \nCONTAINER ID   IMAGE                                           COMMAND                  CREATED          STATUS                       PORTS                                                                                  NAMES\n3d7285fc39e2   docker-context-example-hello-world              \"python main.py\"         10 minutes ago   Exited (2) 44 seconds ago                                                                                           docker-context-example-hello-world-1\n```\n\nNow we can `docker run --rm -it --entrypoint /bin/bash --name debug docker-context-example-hello-world`\n\n```bash\n❯ docker run --rm -it --entrypoint /bin/bash --name debug docker-context-example-hello-world  \nroot@ee46d0e22de8:/app# python main.py\nHello, World!\nroot@ee46d0e22de8:/app# \n```\n\nWHAT THE HECK??\n\n## What happened...\n\nWhat happened turns out to be pretty simple once we realize I'm using contexts...\n\n`koboer` is a remote context, the `docker run` and `docker compose up` commands are interacting with the docker socket on that machine.\n\nSo if I compose up the stack notice that there's a volume bind mount in there - well those do _not_ work with contexts (or at least I'm not aware of hose to make it work) and so the `/app` directory was getting blown away essentially with an empty overlay...\n\nBut when running with just `docker run` with no volume mount, the code was copied in during the build and is right where we expect it...\n\n### Let's prove it\n\n```bash\n❯ docker run --rm -it --entrypoint /bin/bash --name debug -v .:/app docker-context-example-hello-world\nroot@903f591c0384:/app# python main.py\npython: can't open file '/app/main.py': [Errno 2] No such file or directory\nroot@903f591c0384:/app# \n```\n```\nAdding a `-v .:/app` to match the compose file, we get the same error...\n```\n\nIf we switch to the default context we are back up and running as expected\n\n```bash\n✗ docker context use default\ndefault\nCurrent context is now \"default\"\n\nnic in /tmp/docker-context-example  via   v3.13.0  (dev) 󰒄 󱔎 NO PYTHON ENVIORNMENT SET \n❯ docker compose up         \n[+] Running 1/0\n ✔ Container docker-context-example-hello-world-1  Created                                                                                                                                                                                                                                                              0.0s \nAttaching to hello-world-1\nhello-world-1  | Hello, World!\nhello-world-1 exited with code 0\n\nnic in /tmp/docker-context-example  via   v3.13.0  (dev) 󰒄 󱔎 NO PYTHON ENVIORNMENT SET \n❯ docker run --rm -it --entrypoint /bin/bash --name debug -v .:/app docker-context-example-hello-world\nroot@4045b6aa8883:/app# python main.py\nHello, World!\nroot@4045b6aa8883:/app# \n```\n\nSuccessful runs on both accounts with the volume mount\n\n## TLDR\n\nContext is king\n",
      "summary": "docker contexts are great, would recommend putting them in your prompt though (via starship or something else)... here's why",
      "date_published": "2024-12-19T05:59:30Z",
      "date_modified": "2024-12-19T05:59:30Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "python",
        "terminal",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/add-a-healthcheck-to-your-fastapi-app/",
      "url": "https://pype.dev/add-a-healthcheck-to-your-fastapi-app/",
      "title": "Add a healthcheck to your FastAPI app",
      "content_html": "\u003cp\u003eI\u0026rsquo;m building a few FastAPI apps to throw in docker and run on my homelab\u0026hellip; I wanted to add healthchecks and here\u0026rsquo;s a simple way to do it\u003c/p\u003e\n\u003cp\u003eMake sure to install \u003ccode\u003ecurl\u003c/code\u003e in the dockerfile (near the top for effeciency)\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e# Install curl with minimal dependencies\nRUN apt-get update \u0026amp;\u0026amp; \\\n    apt-get install -y --no-install-recommends curl \u0026amp;\u0026amp; \\\n    apt-get clean \u0026amp;\u0026amp; \\\n    rm -rf /var/lib/apt/lists/*\n\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThen I recommend making compose files even for single image deployments\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eservices:\n  app:\n    build: .\n    volumes:\n      - type: bind\n        source: .\n        target: /app\n    environment:\n      - PYTHONPATH=/app\n      - DOCKER_ENV=true\n      - UV_VIRTUALENV=/opt/app-env\n    user: \u0026quot;1000:1000\u0026quot;\n    restart: unless-stopped\n    healthcheck:\n      test: [\u0026quot;CMD\u0026quot;, \u0026quot;curl\u0026quot;, \u0026quot;-f\u0026quot;, \u0026quot;http://localhost:8000/health\u0026quot;]\n      interval: 30s\n      timeout: 10s\n      retries: 3\n      start_period: 10s\n\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThen finally you\u0026rsquo;ll need a \u003ccode\u003e/health\u003c/code\u003e endpoint\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\"\u003e\u003cspan class=\"nd\"\u003e@app.get\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/health\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eresponse_class\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003eHTMLResponse\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\"\u003easync\u003c/span\u003e \u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003ehealth_check\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=\"s2\"\u003e\u0026#34;\u0026#34;\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e    A health check endpoint that returns a status message.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e    \u0026#34;\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026lt;html\u0026gt;\u0026lt;body\u0026gt;\u0026lt;h1\u0026gt;Service is healthy\u0026lt;/h1\u0026gt;\u0026lt;/body\u0026gt;\u0026lt;/html\u0026gt;\u0026#34;\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\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nI'm building a few FastAPI apps to throw in docker and run on my homelab... I wanted to add healthchecks and here's a simple way to do it\n\nMake sure to install `curl` in the dockerfile (near the top for effeciency)\n\n```\n# Install curl with minimal dependencies\nRUN apt-get update \u0026\u0026 \\\n    apt-get install -y --no-install-recommends curl \u0026\u0026 \\\n    apt-get clean \u0026\u0026 \\\n    rm -rf /var/lib/apt/lists/*\n\n```\n\nThen I recommend making compose files even for single image deployments\n\n```\nservices:\n  app:\n    build: .\n    volumes:\n      - type: bind\n        source: .\n        target: /app\n    environment:\n      - PYTHONPATH=/app\n      - DOCKER_ENV=true\n      - UV_VIRTUALENV=/opt/app-env\n    user: \"1000:1000\"\n    restart: unless-stopped\n    healthcheck:\n      test: [\"CMD\", \"curl\", \"-f\", \"http://localhost:8000/health\"]\n      interval: 30s\n      timeout: 10s\n      retries: 3\n      start_period: 10s\n\n```\n\nThen finally you'll need a `/health` endpoint\n\n```python\n\n@app.get(\"/health\", response_class=HTMLResponse)\nasync def health_check():\n    \"\"\"\n    A health check endpoint that returns a status message.\n    \"\"\"\n    return \"\u003chtml\u003e\u003cbody\u003e\u003ch1\u003eService is healthy\u003c/h1\u003e\u003c/body\u003e\u003c/html\u003e\"\n\n```\n",
      "summary": "I'm building a few FastAPI apps to throw in docker and run on my homelab... I wanted to add healthchecks and here's a simple way to do it",
      "date_published": "2024-12-15T15:41:36Z",
      "date_modified": "2024-12-15T15:41:36Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "python",
        "homelab",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/statically-io-to-help-me-out/",
      "url": "https://pype.dev/statically-io-to-help-me-out/",
      "title": "statically.io to help me out",
      "content_html": "\u003cp\u003e\u003ca href=\"https://statically.io\"\u003estatically.io\u003c/a\u003e offers a CDN that I\u0026rsquo;m going to try to lean into for images in my blog. My hope is that the builds get and stay fast, and that page loads are fast too.\u003c/p\u003e\n\u003cp\u003eExample:\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\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eimg\u003c/span\u003e \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/skimpy-zsh.png\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ealt\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Skimpy ZSH\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003etitle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;A fancy data summary in the shell\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/skimpy-zsh.png\" alt=\"Skimpy ZSH\" title=\"A fancy data summary in the shell\" /\u003e\n",
      "content_text": "\n[statically.io](https://statically.io) offers a CDN that I'm going to try to lean into for images in my blog. My hope is that the builds get and stay fast, and that page loads are fast too.\n\nExample:\n\n```html\n\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/skimpy-zsh.png\" alt=\"Skimpy ZSH\" title=\"A fancy data summary in the shell\" /\u003e\n```\n\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/skimpy-zsh.png\" alt=\"Skimpy ZSH\" title=\"A fancy data summary in the shell\" /\u003e\n",
      "summary": "statically.io offers a CDN that I'm going to try to lean into for images in my blog. My hope is that the builds get and stay fast, and that page loads are...",
      "date_published": "2024-12-14T13:35:31Z",
      "date_modified": "2024-12-14T13:35:31Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "infrastructure",
        "tech",
        "webdev",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/jellyfin-container-updates-for-hwe-amd/",
      "url": "https://pype.dev/jellyfin-container-updates-for-hwe-amd/",
      "title": "Jellyfin container updates for HWE + AMD",
      "content_html": "\u003cp\u003eI use LSIO Jelyfin container for the easy addon they provide for AMD GPUs but I couldn\u0026rsquo;t get trickplay to work with HWE\u0026hellip;\u003c/p\u003e\n\u003cp\u003eThere was almost NOTHING on the internet about the error, and all the threads were about BSD systems\u0026hellip;\u003c/p\u003e\n\u003cp\u003eThankfully someone posted \u003ca href=\"https://forum.jellyfin.org/t-jellyfin-amd-docker\"\u003eon the formum here\u003c/a\u003e but the only answer was to literally upgrade stuff in the container\u0026hellip;\u003c/p\u003e\n\u003cp\u003eSomeday maybe I\u0026rsquo;ll build off of LSIO to add this, but until then I shell\u0026rsquo;d in and homelab\u0026rsquo;d the hell out of it\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eTHIS IS INSIDE THE CONTAINER - I use Portianer to make it easy\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cpre\u003e\u003ccode\u003e\napt update \u0026amp;\u0026amp; apt install -y curl gpg\n\nmkdir -p /etc/apt/keyrings\n\ncurl -fsSL https://repo.radeon.com/rocm/rocm.gpg.key | gpg --dearmor -o /etc/apt/keyrings/rocm.gpg\n\ncat \u0026lt;\u0026lt;EOF | tee /etc/apt/sources.list.d/rocm.sources\n\nTypes: deb\n\nURIs: https://repo.radeon.com/rocm/apt/latest\n\nSuites: ubuntu\n\nComponents: main\n\nArchitectures: amd64\n\nSigned-By: /etc/apt/keyrings/rocm.gpg\n\nEOF\n\napt update \u0026amp;\u0026amp; apt install -y rocm-opencl-runtime\n\u003c/code\u003e\u003c/pre\u003e\n",
      "content_text": "\nI use LSIO Jelyfin container for the easy addon they provide for AMD GPUs but I couldn't get trickplay to work with HWE... \n\nThere was almost NOTHING on the internet about the error, and all the threads were about BSD systems...\n\nThankfully someone posted [on the formum here](https://forum.jellyfin.org/t-jellyfin-amd-docker) but the only answer was to literally upgrade stuff in the container...\n\nSomeday maybe I'll build off of LSIO to add this, but until then I shell'd in and homelab'd the hell out of it\n\n\u003e THIS IS INSIDE THE CONTAINER - I use Portianer to make it easy\n\n```\n\napt update \u0026\u0026 apt install -y curl gpg\n\nmkdir -p /etc/apt/keyrings\n\ncurl -fsSL https://repo.radeon.com/rocm/rocm.gpg.key | gpg --dearmor -o /etc/apt/keyrings/rocm.gpg\n\ncat \u003c\u003cEOF | tee /etc/apt/sources.list.d/rocm.sources\n\nTypes: deb\n\nURIs: https://repo.radeon.com/rocm/apt/latest\n\nSuites: ubuntu\n\nComponents: main\n\nArchitectures: amd64\n\nSigned-By: /etc/apt/keyrings/rocm.gpg\n\nEOF\n\napt update \u0026\u0026 apt install -y rocm-opencl-runtime\n```\n",
      "summary": "I use LSIO Jelyfin container for the easy addon they provide for AMD GPUs but I couldn't get trickplay to work with HWE...",
      "date_published": "2024-12-14T11:27:15Z",
      "date_modified": "2024-12-14T11:27:15Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "docker",
        "linux",
        "homelab",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/the-flood-story-types-and-baptism/",
      "url": "https://pype.dev/the-flood-story-types-and-baptism/",
      "title": "The Flood Story - Types and Baptism",
      "content_html": "\u003ch1 id=\"the-flood-story-and-jesus\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThe Flood Story and Jesus\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eJesus brings up the Flood story from Genesis just one time (in the recorded teachings we have).\u003c/p\u003e\n\u003cp\u003eFirst to set the scene, Jesus and his disciples are visiting the temple, and the disiples are kind of \u0026ldquo;ooo-ing\u0026rdquo; and \u0026ldquo;aaah-ing\u0026rdquo; when Jesus tells them about about the coming destruction\u0026hellip;\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eMatthew 24:1–2 (ESV):  24 Jesus left the temple and was going away, when his\ndisciples came to point out to him the buildings of the temple. 2 But he\nanswered them, “You see all these, do you not? Truly, I say to you, there will\nnot be left here one stone upon another that will not be thrown down.”  \n\nThe Holy Bible: English Standard Version (Mt 24:1–2). (2016). Crossway Bibles.\n\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eMatthew 24:37–39 (ESV): 37 For as were the days of Noah, so will be the coming\nof the Son of Man. 38 For as in those days before the flood they were eating\nand drinking, marrying and giving in marriage, until the day when Noah entered\nthe ark, 39 and they were unaware until the flood came and swept them all away,\nso will be the coming of the Son of Man. \n\nThe Holy Bible: English Standard Version (Mt 24:37–39). (2016). Crossway Bibles.\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eAt one point in Jesus\u0026rsquo; description of the destruction of the temple in\nJerusalem, he brings up the Son of Man and Noah\u0026hellip;\u003c/p\u003e\n\u003cp\u003eJesus says that the \u0026ldquo;coming of the Son of Man\u0026rdquo; will be like when Noah built the\nark, and no one understood until the flood (κατακλυσμός | kataklysmos) came and\ntook them away.\u003c/p\u003e\n\u003cp\u003eIn Jesus\u0026rsquo; mind the flood narrative gives him imagery and vocabulary to talk\nabout when God allows foreign powers to come and bring judgement\u0026hellip; This isn\u0026rsquo;t\nan interpretation of the flood narrative, but it clues us into the idea that\nthe Hebrew bible is full of imagery, like a quilt, that follows a (or several)\npattern(s).\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eJesus understood the flood story as a pattern - a theological category to talk\nabout God overthrowing the corrupt power systems of our world - Tim Mackie\n\u003c/code\u003e\u003c/pre\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI think sometimes we look at the flood and think God is so bad for taking out\nall of humanity, but we miss the point\u0026hellip; God is RESTORING humanity by\nremoving corruption\u0026hellip; that\u0026rsquo;s eventually the story we\u0026rsquo;re invited into via\nfaith in Jesus\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"types\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTypes\u003c/span\u003e \u003ca href=\"#types\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eA \u003ccode\u003etype\u003c/code\u003e is a category of prophecy, and an \u003ccode\u003eantitype\u003c/code\u003e is the revelation of the type.\u003c/p\u003e\n\u003cp\u003eEssentially - a \u003ccode\u003etype\u003c/code\u003e is a pattern, and the \u003ccode\u003eantytype\u003c/code\u003e is the revelation of\nthe meaning of the pattern - and without understanding the preceding types (in\nthis case, the flood) then the antitype cannot be understood (in this case\nbaptism)\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ea trivial example of how a type, or a pattern, can be noticed and even build\nanticipation is to think 2, 4, 6, 8\u0026hellip; what comes next? 10, and we all know\nthat immediately. Types in general, and types in the Bible are no different,\nalbeit not so simple\u0026hellip;\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"flood-and-baptism\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFlood and Baptism\u003c/span\u003e \u003ca href=\"#flood-and-baptism\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eBrace yourself\u0026hellip;\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e1 Peter 3:18–22 (ESV): 18 For Christ also suffered once for sins, the righteous\nfor the unrighteous, that he might bring us to God, being put to death in the\nflesh but made alive in the spirit, 19 in which he went and proclaimed to the\nspirits in prison, 20 because they formerly did not obey, when God’s patience\nwaited in the days of Noah, while the ark was being prepared, in which a few,\nthat is, eight persons, were brought safely through water. 21 Baptism, which\ncorresponds to this, now saves you, not as a removal of dirt from the body but\nas an appeal to God for a good conscience, through the resurrection of Jesus\nChrist, 22 who has gone into heaven and is at the right hand of God, with\nangels, authorities, and powers having been subjected to him.  \n\nThe Holy Bible: English Standard Version (1 Pe 3:18–22). (2016). Crossway\nBibles.\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eNotice verse 21 - \u0026ldquo;Baptism, which \u003cstrong\u003ecorresponds\u003c/strong\u003e to this\u0026rdquo;\u003c/p\u003e\n\u003cp\u003eCorresponds is the word ἀντίτυπος (antitupos) in Greek, which means \u0026ldquo;anti-type\u0026rdquo;\nThis means clearly that the \u003ccode\u003etype\u003c/code\u003e, or \u003cem\u003ea\u003c/em\u003e type, for baptism, is the flood\nnarrative\u0026hellip; or that baptism is the antitype for the flood\u003c/p\u003e\n\u003cp\u003eWhat does this mean for baptism?\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e21 Baptism, which\ncorresponds to this, now saves you, not as a removal of dirt from the body but\nas an appeal to God for a good conscience, through the resurrection of Jesus\nChrist, 22 who has gone into heaven and is at the right hand of God, with\nangels, authorities, and powers having been subjected to him\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThrough baptism, we experience with Jesus, resurrection and rule of the angels,\nauthorities, and power of the world\u0026hellip;\u003c/p\u003e\n\u003ch2 id=\"take-away\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTake Away\u003c/span\u003e \u003ca href=\"#take-away\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eFor the disciples listening\u0026hellip; are they arguing about when the flood happened?\nor if it was a global or local flood?\u003c/p\u003e\n\u003cp\u003eNo\u0026hellip; they are listening to Jesus unpack patterns in the Bible and they hear\nhim invite them, through a story they know very well, into rule and reign with\nhim\u003c/p\u003e\n",
      "content_text": "\n# The Flood Story and Jesus\n\nJesus brings up the Flood story from Genesis just one time (in the recorded teachings we have).\n\nFirst to set the scene, Jesus and his disciples are visiting the temple, and the disiples are kind of \"ooo-ing\" and \"aaah-ing\" when Jesus tells them about about the coming destruction...\n\n```\nMatthew 24:1–2 (ESV):  24 Jesus left the temple and was going away, when his\ndisciples came to point out to him the buildings of the temple. 2 But he\nanswered them, “You see all these, do you not? Truly, I say to you, there will\nnot be left here one stone upon another that will not be thrown down.”  \n\nThe Holy Bible: English Standard Version (Mt 24:1–2). (2016). Crossway Bibles.\n\n```\n\n```\nMatthew 24:37–39 (ESV): 37 For as were the days of Noah, so will be the coming\nof the Son of Man. 38 For as in those days before the flood they were eating\nand drinking, marrying and giving in marriage, until the day when Noah entered\nthe ark, 39 and they were unaware until the flood came and swept them all away,\nso will be the coming of the Son of Man. \n\nThe Holy Bible: English Standard Version (Mt 24:37–39). (2016). Crossway Bibles.\n```\n\nAt one point in Jesus' description of the destruction of the temple in\nJerusalem, he brings up the Son of Man and Noah...\n\nJesus says that the \"coming of the Son of Man\" will be like when Noah built the\nark, and no one understood until the flood (κατακλυσμός | kataklysmos) came and\ntook them away.\n\nIn Jesus' mind the flood narrative gives him imagery and vocabulary to talk\nabout when God allows foreign powers to come and bring judgement... This isn't\nan interpretation of the flood narrative, but it clues us into the idea that\nthe Hebrew bible is full of imagery, like a quilt, that follows a (or several)\npattern(s). \n\n```\nJesus understood the flood story as a pattern - a theological category to talk\nabout God overthrowing the corrupt power systems of our world - Tim Mackie\n```\n\n\u003e I think sometimes we look at the flood and think God is so bad for taking out\n\u003e all of humanity, but we miss the point... God is RESTORING humanity by\n\u003e removing corruption... that's eventually the story we're invited into via\n\u003e faith in Jesus\n\n## Types\n\n\nA `type` is a category of prophecy, and an `antitype` is the revelation of the type.\n\nEssentially - a `type` is a pattern, and the `antytype` is the revelation of\nthe meaning of the pattern - and without understanding the preceding types (in\nthis case, the flood) then the antitype cannot be understood (in this case\nbaptism)\n\n\u003e a trivial example of how a type, or a pattern, can be noticed and even build\n\u003e anticipation is to think 2, 4, 6, 8... what comes next? 10, and we all know\n\u003e that immediately. Types in general, and types in the Bible are no different,\n\u003e albeit not so simple...\n\n## Flood and Baptism\n\nBrace yourself...\n\n```\n1 Peter 3:18–22 (ESV): 18 For Christ also suffered once for sins, the righteous\nfor the unrighteous, that he might bring us to God, being put to death in the\nflesh but made alive in the spirit, 19 in which he went and proclaimed to the\nspirits in prison, 20 because they formerly did not obey, when God’s patience\nwaited in the days of Noah, while the ark was being prepared, in which a few,\nthat is, eight persons, were brought safely through water. 21 Baptism, which\ncorresponds to this, now saves you, not as a removal of dirt from the body but\nas an appeal to God for a good conscience, through the resurrection of Jesus\nChrist, 22 who has gone into heaven and is at the right hand of God, with\nangels, authorities, and powers having been subjected to him.  \n\nThe Holy Bible: English Standard Version (1 Pe 3:18–22). (2016). Crossway\nBibles.\n```\n\nNotice verse 21 - \"Baptism, which __corresponds__ to this\"\n\nCorresponds is the word ἀντίτυπος (antitupos) in Greek, which means \"anti-type\"\nThis means clearly that the `type`, or _a_ type, for baptism, is the flood\nnarrative... or that baptism is the antitype for the flood\n\nWhat does this mean for baptism? \n\n```\n21 Baptism, which\ncorresponds to this, now saves you, not as a removal of dirt from the body but\nas an appeal to God for a good conscience, through the resurrection of Jesus\nChrist, 22 who has gone into heaven and is at the right hand of God, with\nangels, authorities, and powers having been subjected to him\n```\n\nThrough baptism, we experience with Jesus, resurrection and rule of the angels,\nauthorities, and power of the world...\n\n## Take Away\n\nFor the disciples listening... are they arguing about when the flood happened?\nor if it was a global or local flood? \n\nNo... they are listening to Jesus unpack patterns in the Bible and they hear\nhim invite them, through a story they know very well, into rule and reign with\nhim\n\n\n",
      "summary": "Jesus brings up the Flood story from Genesis just one time (in the recorded teachings we have).",
      "date_published": "2024-12-14T06:06:38Z",
      "date_modified": "2024-12-14T06:06:38Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "bible-project",
        "faith",
        "flood-story"
      ]
    },
    {
      "id": "https://pype.dev/the-flood-story-quilt-analogy/",
      "url": "https://pype.dev/the-flood-story-quilt-analogy/",
      "title": "The Flood Story - Quilt Analogy",
      "content_html": "\u003ch1 id=\"the-flood-story-in-the-hebrew-bible\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThe Flood Story in the Hebrew Bible\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eI\u0026rsquo;m slowly making my way through some Bible Project classes online because Tim\nMackie is a fantastic teacher and BP has done be a \u003cem\u003egreat\u003c/em\u003e service by opening\nmy eyes to the reality of the Biblical narrative and what it means for my life\nof faith in Jesus.\u003c/p\u003e\n\u003cp\u003eThe second session is filled with great points and 10 minutes in I had to jot\nthis one down\u0026hellip;\u003c/p\u003e\n\u003ch2 id=\"a-quilt-as-history\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eA Quilt as History\u003c/span\u003e \u003ca href=\"#a-quilt-as-history\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eImagine your grandmother\u0026rsquo;s grandmother made a quilt, and passed it down the\nfamily tree. In a sense, that quilt contains history that would pre-date you\nbut would absolutely have meaning to you\u0026hellip; However, you might look for meaning\nthat was never intended to be present.\u003c/p\u003e\n\u003cp\u003eThe pieces of the quilt have their own history - there will be material that\nmight\u0026rsquo;ve been part of a dress, or curtains, or bedsheets, or anything else\nsomeone in the family tree found interesting and meaningful for the story they\nare telling with their quilt.\u003c/p\u003e\n\u003cp\u003eThe question of what each of the pieces mean on their own, or in where they\ncome from is interesting perhaps, but it\u0026rsquo;s not the same question as asking what\nthose pieces mean now that they have been curated into the family quilt\u0026hellip; The\ncreator(s) of the quilt may repurpose those pieces entirely, and it wouldn\u0026rsquo;t be\n\u0026ldquo;right\u0026rdquo; for you or me to be upset that one piece of the quilt came from an\narticle of clothing or cloth associated with something we might not like - the\nauthor (your grandma) \u003cstrong\u003erepurposed\u003c/strong\u003e it for that very reason, to change the\nmeaning and communicate something to you, perhaps something totally different\nthan what that cloth might\u0026rsquo;ve meant before it was added to the quilt.\u003c/p\u003e\n\u003ch2 id=\"creation-as-a-quilt\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCreation as a Quilt\u003c/span\u003e \u003ca href=\"#creation-as-a-quilt\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe quilt is a curated piece of pieces of fabric - and to bring the metaphor\nhome very abruptly, so is the Hebrew Bible\u0026hellip; the authors of the Hebrew\nscripture absolutely repurposed stories and images that were present in their\ntime and before, but not to make something that is a cheap copy, but to\ncommunicate the story of the \u003cem\u003eactual\u003c/em\u003e God of gods, ruling over the world.\u003c/p\u003e\n\u003cp\u003eFor example - the very beginning of the creationa ccount in Genesis 1 has the\nspirit of God hovering over the waters. Without getting into more details than\na short write-up warrants, the waters in ancient thought represent chaos. Not\nonly that, but there is an older creation account called the Enuma Elish where\ntheir savior god, Marduk, fights the chaos waters (Tiamat) and conquers her\neventually\u0026hellip; The thing about the Hebrew narrative is that Yahweh doesn\u0026rsquo;t have\nto fight the waters\u0026hellip; he subdues with his words because he isn\u0026rsquo;t in tension\nwith creation, or even with chaos, all things obey him and the chaos waters\nthat other gods had to fight and die over are no different. So the meaning of\nthe waters is somewhat consistent across lots of cultures, but Hebrews took the\nstories and in essence made them \u0026ldquo;more true\u0026rdquo;, but at the very least made them\nrelevant to the story they are/were communicating about the God of gods and\nLord of love - that he is the creator of all things and invites us to partner\nwith him (as his image-bearers).\u003c/p\u003e\n\u003ch2 id=\"calm-down\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCalm Down\u003c/span\u003e \u003ca href=\"#calm-down\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eA lot of Christians get upset or skiddish when other stories and cultures get\nbrought up - as if the Bible had to fall from heaven in their favorite English\ntranslation\u0026hellip; but in my opinion that is the silliest and cheapest view of the\nWord of God\u0026hellip; he chose people out of foreign lands to make an inheritence for\nhimself, his people, and those people tell his story using images that they\nknow.\u003c/p\u003e\n\u003cp\u003eIt\u0026rsquo;s important for us to answer interesting questions but not lose sight of\nwhat\u0026rsquo;s important\u0026hellip; The Enuma Elish is an interesting piece, and there\u0026rsquo;s\nparallels with the Hebrew bible, but the Hebrew creation account clearly\ncommunicates that Yahweh doesn\u0026rsquo;t have to labor and fight for order, he speaks\norder into chaos. That lesson is wholly different from other creation\nnarratives, but is it derivative of them\u0026hellip;\u003c/p\u003e\n\u003cp\u003eThat used to bother me, but understanding that the authors of the Bible,\ncarried forth by the guidance of God\u0026rsquo;s spirit, curated these stories and\nnarratives for God\u0026rsquo;s people to communicate the truest Truths about him and his\nlove for people help me understand the reality of God partnering with humanity\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ewhich starts in the Garden and is how Revelation ends\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n# The Flood Story in the Hebrew Bible\n\nI'm slowly making my way through some Bible Project classes online because Tim\nMackie is a fantastic teacher and BP has done be a _great_ service by opening\nmy eyes to the reality of the Biblical narrative and what it means for my life\nof faith in Jesus.\n\nThe second session is filled with great points and 10 minutes in I had to jot\nthis one down...\n\n## A Quilt as History\n\nImagine your grandmother's grandmother made a quilt, and passed it down the\nfamily tree. In a sense, that quilt contains history that would pre-date you\nbut would absolutely have meaning to you... However, you might look for meaning\nthat was never intended to be present.\n\nThe pieces of the quilt have their own history - there will be material that\nmight've been part of a dress, or curtains, or bedsheets, or anything else\nsomeone in the family tree found interesting and meaningful for the story they\nare telling with their quilt.\n\nThe question of what each of the pieces mean on their own, or in where they\ncome from is interesting perhaps, but it's not the same question as asking what\nthose pieces mean now that they have been curated into the family quilt... The\ncreator(s) of the quilt may repurpose those pieces entirely, and it wouldn't be\n\"right\" for you or me to be upset that one piece of the quilt came from an\narticle of clothing or cloth associated with something we might not like - the\nauthor (your grandma) __repurposed__ it for that very reason, to change the\nmeaning and communicate something to you, perhaps something totally different\nthan what that cloth might've meant before it was added to the quilt.\n\n## Creation as a Quilt\n\nThe quilt is a curated piece of pieces of fabric - and to bring the metaphor\nhome very abruptly, so is the Hebrew Bible... the authors of the Hebrew\nscripture absolutely repurposed stories and images that were present in their\ntime and before, but not to make something that is a cheap copy, but to\ncommunicate the story of the *actual* God of gods, ruling over the world. \n\nFor example - the very beginning of the creationa ccount in Genesis 1 has the\nspirit of God hovering over the waters. Without getting into more details than\na short write-up warrants, the waters in ancient thought represent chaos. Not\nonly that, but there is an older creation account called the Enuma Elish where\ntheir savior god, Marduk, fights the chaos waters (Tiamat) and conquers her\neventually... The thing about the Hebrew narrative is that Yahweh doesn't have\nto fight the waters... he subdues with his words because he isn't in tension\nwith creation, or even with chaos, all things obey him and the chaos waters\nthat other gods had to fight and die over are no different. So the meaning of\nthe waters is somewhat consistent across lots of cultures, but Hebrews took the\nstories and in essence made them \"more true\", but at the very least made them\nrelevant to the story they are/were communicating about the God of gods and\nLord of love - that he is the creator of all things and invites us to partner\nwith him (as his image-bearers).\n\n## Calm Down\n\nA lot of Christians get upset or skiddish when other stories and cultures get\nbrought up - as if the Bible had to fall from heaven in their favorite English\ntranslation... but in my opinion that is the silliest and cheapest view of the\nWord of God... he chose people out of foreign lands to make an inheritence for\nhimself, his people, and those people tell his story using images that they\nknow.\n\nIt's important for us to answer interesting questions but not lose sight of\nwhat's important... The Enuma Elish is an interesting piece, and there's\nparallels with the Hebrew bible, but the Hebrew creation account clearly\ncommunicates that Yahweh doesn't have to labor and fight for order, he speaks\norder into chaos. That lesson is wholly different from other creation\nnarratives, but is it derivative of them... \n\nThat used to bother me, but understanding that the authors of the Bible,\ncarried forth by the guidance of God's spirit, curated these stories and\nnarratives for God's people to communicate the truest Truths about him and his\nlove for people help me understand the reality of God partnering with humanity\n- which starts in the Garden and is how Revelation ends\n",
      "summary": "I'm slowly making my way through some Bible Project classes online because Tim Mackie is a fantastic teacher and BP has done be a _ service by opening my...",
      "date_published": "2024-12-14T05:43:43Z",
      "date_modified": "2024-12-14T05:43:43Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "bible-project",
        "faith",
        "flood-story"
      ]
    },
    {
      "id": "https://pype.dev/rsync-like-a-pro/",
      "url": "https://pype.dev/rsync-like-a-pro/",
      "title": "rsync like a pro",
      "content_html": "\u003cp\u003eI am moving a hefty amount of data to a new ZFS pool due to some corruption and I want to avoid using \u003ccode\u003ezfs send/recv\u003c/code\u003e for this just to make sure I don\u0026rsquo;t propagate any corrupted data to my new pool.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve used \u003ccode\u003ersync\u003c/code\u003e for simple things before but I needed this to be a little smarter and I wanted to see simple progress without flooding my terminal with a billion filenames.\u003c/p\u003e\n\u003ch2 id=\"tldr\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTLDR\u003c/span\u003e \u003ca href=\"#tldr\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eTLDR:\n\u003ccode\u003ersync -aHAX --chmod=Da+s --info=progress2 --inplace --exclude='encrypted/docker/frigate-media' /tank/ /harbor/\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"explanation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExplanation\u003c/span\u003e \u003ca href=\"#explanation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e-aHAX: Preserves attributes (archive mode, hard links, ACLs, extended attributes).\n\u0026ndash;chmod=Da+s: Ensures the setgid bit is applied to directories.\n\u0026ndash;info=progress2: Provides detailed progress information, including overall data transfer stats.\n\u0026ndash;inplace: Writes directly to the destination file, avoiding temporary files (useful for large files).\n\u0026ndash;exclude=\u0026lsquo;encrypted/docker/frigate-media\u0026rsquo;: Excludes the specified path (relative to the /tank root).\n/tank/ /harbor/: Ensures the contents of /tank are copied directly into /harbor.\u003c/p\u003e\n",
      "content_text": "\n\nI am moving a hefty amount of data to a new ZFS pool due to some corruption and I want to avoid using `zfs send/recv` for this just to make sure I don't propagate any corrupted data to my new pool.\n\nI've used `rsync` for simple things before but I needed this to be a little smarter and I wanted to see simple progress without flooding my terminal with a billion filenames.\n\n## TLDR\nTLDR: \n`rsync -aHAX --chmod=Da+s --info=progress2 --inplace --exclude='encrypted/docker/frigate-media' /tank/ /harbor/`\n\n## Explanation\n\n-aHAX: Preserves attributes (archive mode, hard links, ACLs, extended attributes).\n--chmod=Da+s: Ensures the setgid bit is applied to directories.\n--info=progress2: Provides detailed progress information, including overall data transfer stats.\n--inplace: Writes directly to the destination file, avoiding temporary files (useful for large files).\n--exclude='encrypted/docker/frigate-media': Excludes the specified path (relative to the /tank root).\n/tank/ /harbor/: Ensures the contents of /tank are copied directly into /harbor.\n\n\n",
      "summary": "I am moving a hefty amount of data to a new ZFS pool due to some corruption and I want to avoid using for this just to make sure I don't propagate any...",
      "date_published": "2024-12-11T10:52:23Z",
      "date_modified": "2024-12-11T10:52:23Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "linux",
        "terminal",
        "cli",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/d-and-uninterruptable-sleep/",
      "url": "https://pype.dev/d-and-uninterruptable-sleep/",
      "title": "D and uninterruptable sleep",
      "content_html": "\u003ch2 id=\"htop\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHtop\u003c/span\u003e \u003ca href=\"#htop\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI recently have been having significant home server issues, and that\u0026rsquo;s not the point of this - today I learned what \u003ccode\u003eD\u003c/code\u003e state is when looking at htop.\u003c/p\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/d-htop.png\" alt=\"htop-d\" title=\"htop with D state\" /\u003e\n\u003cp\u003eApparently this means \u0026ldquo;uninterruptable sleep\u0026rdquo; and it\u0026rsquo;s a dev\u0026rsquo;s nightmare\u0026hellip;\u003c/p\u003e\n\u003ch3 id=\"context\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eContext\u003c/span\u003e \u003ca href=\"#context\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe issue I was having was that some \u003ccode\u003ezfs rollback\u003c/code\u003e commands were hung - for hours\u0026hellip; I wasn\u0026rsquo;t sure what was going on, rollbacks should be instant but I figured it was just an artifact of these issues.\u003c/p\u003e\n\u003cp\u003eTurns out I still don\u0026rsquo;t know what locked the disks up but I learned why \u003ccode\u003e\u0026lt;C\u0026gt;-c\u003c/code\u003e did \u003cstrong\u003enothing\u003c/strong\u003e\u0026hellip;\nthe more you know\u003c/p\u003e\n",
      "content_text": "\n## Htop\n\nI recently have been having significant home server issues, and that's not the point of this - today I learned what `D` state is when looking at htop.\n\n\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/d-htop.png\" alt=\"htop-d\" title=\"htop with D state\" /\u003e\n\nApparently this means \"uninterruptable sleep\" and it's a dev's nightmare... \n\n### Context\n\nThe issue I was having was that some `zfs rollback` commands were hung - for hours... I wasn't sure what was going on, rollbacks should be instant but I figured it was just an artifact of these issues.\n\nTurns out I still don't know what locked the disks up but I learned why `\u003cC\u003e-c` did __nothing__...\nthe more you know\n",
      "summary": "I recently have been having significant home server issues, and that's not the point of this - today I learned what state is when looking at htop.",
      "date_published": "2024-12-11T10:48:10Z",
      "date_modified": "2024-12-11T10:48:10Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "linux",
        "zfs",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/advent-2024-peace/",
      "url": "https://pype.dev/advent-2024-peace/",
      "title": "Advent 2024 - Peace",
      "content_html": "\u003ch2 id=\"scripture\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eScripture\u003c/span\u003e \u003ca href=\"#scripture\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eLuke 2:14 (ESV): 14 “Glory to God in the highest, and on earth peace among those with whom he is pleased!”\u003c/p\u003e\n\u003ch2 id=\"edification\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEdification\u003c/span\u003e \u003ca href=\"#edification\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThere is a word we probably know - Shalom. It\u0026rsquo;s the Hebrew word we translate often as \u0026ldquo;peace\u0026rdquo;. But when I hear \u0026ldquo;peace\u0026rdquo; I often think about being calm - and that oversimplifies Shalom\u0026hellip; I think a more appropriate understanding is \u0026ldquo;things are as they are supposed to be\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003eIn the Garden, we see Shalom - the Lord partnering with humanity to steward the earth, to make things as they were supposed to be\u0026hellip;\u003c/p\u003e\n\u003cp\u003eYou all know we messed that up, Shalom was broken and humanity was exiled.\u003c/p\u003e\n\u003cp\u003eBut we have a Great Healer.\u003c/p\u003e\n\u003cp\u003eJesus is Lord of all, King of Heaven and Earth, Ruler of your lives and mine, and he is the Prince of Peace\u003c/p\u003e\n\u003cp\u003eThings in our lives are probably not often as they are supposed to be\u0026hellip; We get sick, worry about bills, experience tragedy, and weather the storms of life. But there is hope - confident expectation - that peace already has been, and will continue to be, restored to those whom Jesus chooses, the ones with whom he is pleased.\u003c/p\u003e\n\u003cp\u003eJohn records a lot before telling us about the cross, and I won\u0026rsquo;t recount that in this short edification. But he recalls a hopeful word from the Lord -\u003c/p\u003e\n\u003cp\u003eJohn 16:33 (LEB): 33 I [Jesus] have said these things to you so that in me you may have peace. In the world you have affliction, but have courage! I have conquered the world.”\u003c/p\u003e\n\u003cp\u003eThis season, and this week of Advent, I pray God presses the reality, and the hope for, peace, the expectation of Shalom, deeper into my heart. I pray the Spirit guides us all to bring the will of God to earth as it is in Heaven\u003c/p\u003e\n\u003cp\u003eFinally I pray we may all be given, and accept, the conviction of Paul -\u003c/p\u003e\n\u003cp\u003eRomans 8:18 For I consider that the sufferings of this present time are not worthy to be compared with the glory that is to be revealed to us.” Our present trials are not on an equal scale with the glory of heaven\u003c/p\u003e\n\u003cp\u003eMay the rest, the peace, the Shalom that Jesus gives to his followers be with you all. Amen.\u003c/p\u003e\n",
      "content_text": "\n## Scripture\n\nLuke 2:14 (ESV): 14 “Glory to God in the highest, and on earth peace among those with whom he is pleased!”\n\n## Edification\n\nThere is a word we probably know - Shalom. It's the Hebrew word we translate often as \"peace\". But when I hear \"peace\" I often think about being calm - and that oversimplifies Shalom... I think a more appropriate understanding is \"things are as they are supposed to be\".\n\nIn the Garden, we see Shalom - the Lord partnering with humanity to steward the earth, to make things as they were supposed to be...\n\nYou all know we messed that up, Shalom was broken and humanity was exiled.\n\nBut we have a Great Healer.\n\nJesus is Lord of all, King of Heaven and Earth, Ruler of your lives and mine, and he is the Prince of Peace\n\nThings in our lives are probably not often as they are supposed to be... We get sick, worry about bills, experience tragedy, and weather the storms of life. But there is hope - confident expectation - that peace already has been, and will continue to be, restored to those whom Jesus chooses, the ones with whom he is pleased.\n\nJohn records a lot before telling us about the cross, and I won't recount that in this short edification. But he recalls a hopeful word from the Lord -\n\nJohn 16:33 (LEB): 33 I \\[Jesus\\] have said these things to you so that in me you may have peace. In the world you have affliction, but have courage! I have conquered the world.”\n\nThis season, and this week of Advent, I pray God presses the reality, and the hope for, peace, the expectation of Shalom, deeper into my heart. I pray the Spirit guides us all to bring the will of God to earth as it is in Heaven\n\nFinally I pray we may all be given, and accept, the conviction of Paul -\n\nRomans 8:18 For I consider that the sufferings of this present time are not worthy to be compared with the glory that is to be revealed to us.” Our present trials are not on an equal scale with the glory of heaven\n\nMay the rest, the peace, the Shalom that Jesus gives to his followers be with you all. Amen.\n",
      "summary": "Luke 2:14 (ESV): 14 “Glory to God in the highest, and on earth peace among those with whom he is pleased!”",
      "date_published": "2024-12-06T15:26:15Z",
      "date_modified": "2024-12-06T15:26:15Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "faith",
        "advent"
      ]
    },
    {
      "id": "https://pype.dev/hostnamectl-to-easily-change-hostname/",
      "url": "https://pype.dev/hostnamectl-to-easily-change-hostname/",
      "title": "hostnamectl to easily change hostname",
      "content_html": "\u003cp\u003ehostnamectl is apparently a linux utility for easily changing your hostname in a variety of ways\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\"\u003e❯ hostnamectl --help\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ehostnamectl \u003cspan class=\"o\"\u003e[\u003c/span\u003eOPTIONS...\u003cspan class=\"o\"\u003e]\u003c/span\u003e COMMAND ...\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\"\u003eQuery or change system hostname.\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\"\u003eCommands:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  status                 Show current hostname settings\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  hostname \u003cspan class=\"o\"\u003e[\u003c/span\u003eNAME\u003cspan class=\"o\"\u003e]\u003c/span\u003e        Get/set system hostname\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  icon-name \u003cspan class=\"o\"\u003e[\u003c/span\u003eNAME\u003cspan class=\"o\"\u003e]\u003c/span\u003e       Get/set icon name \u003cspan class=\"k\"\u003efor\u003c/span\u003e host\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  chassis \u003cspan class=\"o\"\u003e[\u003c/span\u003eNAME\u003cspan class=\"o\"\u003e]\u003c/span\u003e         Get/set chassis \u003cspan class=\"nb\"\u003etype\u003c/span\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e host\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  deployment \u003cspan class=\"o\"\u003e[\u003c/span\u003eNAME\u003cspan class=\"o\"\u003e]\u003c/span\u003e      Get/set deployment environment \u003cspan class=\"k\"\u003efor\u003c/span\u003e host\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  location \u003cspan class=\"o\"\u003e[\u003c/span\u003eNAME\u003cspan class=\"o\"\u003e]\u003c/span\u003e        Get/set location \u003cspan class=\"k\"\u003efor\u003c/span\u003e host\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\"\u003eOptions:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -h --help              Show this \u003cspan class=\"nb\"\u003ehelp\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     --version           Show package version\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     --no-ask-password   Do not prompt \u003cspan class=\"k\"\u003efor\u003c/span\u003e password\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -H --host\u003cspan class=\"o\"\u003e=[\u003c/span\u003eUSER@\u003cspan class=\"o\"\u003e]\u003c/span\u003eHOST  Operate on remote host\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -M --machine\u003cspan class=\"o\"\u003e=\u003c/span\u003eCONTAINER Operate on \u003cspan class=\"nb\"\u003elocal\u003c/span\u003e container\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     --transient         Only \u003cspan class=\"nb\"\u003eset\u003c/span\u003e transient hostname\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     --static            Only \u003cspan class=\"nb\"\u003eset\u003c/span\u003e static hostname\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     --pretty            Only \u003cspan class=\"nb\"\u003eset\u003c/span\u003e pretty hostname\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     --json\u003cspan class=\"o\"\u003e=\u003c/span\u003epretty\u003cspan class=\"p\"\u003e|\u003c/span\u003eshort\u003cspan class=\"p\"\u003e|\u003c/span\u003eoff\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                         Generate JSON output\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\"\u003eSee the hostnamectl\u003cspan class=\"o\"\u003e(\u003c/span\u003e1\u003cspan class=\"o\"\u003e)\u003c/span\u003e man page \u003cspan class=\"k\"\u003efor\u003c/span\u003e details.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eI learned there\u0026rsquo;s transient and static hostnames, so that\u0026rsquo;s cool\u0026hellip;\u003c/p\u003e\n\u003cp\u003eThe thing I needed was \u003ccode\u003ehostnamectl --static hostname babyblue-aurora\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003epretty sweet tool\u003c/p\u003e\n",
      "content_text": "\nhostnamectl is apparently a linux utility for easily changing your hostname in a variety of ways\n\n```bash\n\n❯ hostnamectl --help\nhostnamectl [OPTIONS...] COMMAND ...\n\nQuery or change system hostname.\n\nCommands:\n  status                 Show current hostname settings\n  hostname [NAME]        Get/set system hostname\n  icon-name [NAME]       Get/set icon name for host\n  chassis [NAME]         Get/set chassis type for host\n  deployment [NAME]      Get/set deployment environment for host\n  location [NAME]        Get/set location for host\n\nOptions:\n  -h --help              Show this help\n     --version           Show package version\n     --no-ask-password   Do not prompt for password\n  -H --host=[USER@]HOST  Operate on remote host\n  -M --machine=CONTAINER Operate on local container\n     --transient         Only set transient hostname\n     --static            Only set static hostname\n     --pretty            Only set pretty hostname\n     --json=pretty|short|off\n                         Generate JSON output\n\nSee the hostnamectl(1) man page for details.\n```\n\nI learned there's transient and static hostnames, so that's cool...\n\nThe thing I needed was `hostnamectl --static hostname babyblue-aurora`\n\npretty sweet tool\n",
      "summary": "hostnamectl is apparently a linux utility for easily changing your hostname in a variety of ways",
      "date_published": "2024-12-06T07:25:59Z",
      "date_modified": "2024-12-06T07:25:59Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "linux",
        "terminal",
        "homelab",
        "cli",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/how-to-survive-the-flood/",
      "url": "https://pype.dev/how-to-survive-the-flood/",
      "title": "How To Survive The Flood",
      "content_html": "\u003cp\u003eThere a lot of flood stories throughout the history of the world, and the Bible\nis no different in this regard. God warns Noah of a de-creation event, whereby\nhe\u0026rsquo;ll start over with humanity via Noah and his family. Noah survives the flood\nby abiding in Yahweh and staying close to the One who loves him.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eNote this reflection doesn\u0026rsquo;t address \u003cem\u003eAT ALL\u003c/em\u003e if the flood narrative is a\n\u0026ldquo;real\u0026rdquo; historical event, whether it\u0026rsquo;s a global or local event, or anything\nlike that - regardless of those points the Biblical authors used this type of\nimagery of chaos waters to communicate themes of judgement and wrath.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eJesus, in the Sermon on the Mount with the 2 houses, calls back to the images\nof the chaos waters (the winds and the rains). His instruction is that the wise\nman who built his house on the rock will survive, but the foolish man builds\nhis house on the sand and the winds and the rains destroyed it.\u003c/p\u003e\n\u003cp\u003eSomewhat obviously this is metaphorical for basing your life on wisdom or\nfolly. The wisdom is Jesus\u0026rsquo; teaching which is all based on Yahweh\u0026rsquo;s love for\nhumanity and his desire to partner with humanity for the good of the whole\nearth.\u003c/p\u003e\n\u003cp\u003eThe simple take-away is for us to survive the winds and the rain, and to say it\nmore fully - to survive de-creation and destruction, we must live our lives in\na way that revolves around Jesus, the perfect human. He calls us to a greater\nhumanity, an unbroken humanity, which is unachievable apart from him (just look\naround if you doubt this truth).\u003c/p\u003e\n\u003cp\u003eIt\u0026rsquo;s important to notice though that abiding in the Lord, basing your life on\nthe rock, doesn\u0026rsquo;t spare you from the wind and the rain. Trials come, life gets\nhard, shit hits the fan. The last few weeks for me haven\u0026rsquo;t been my favorite and\nI\u0026rsquo;ve certainly experienced turmoil in my life but frankly Jesus makes those\nthings bearable\u0026hellip; in a way I can\u0026rsquo;t put enough words to I\u0026rsquo;ll just be reminded of\nPaul in Romans 8\u0026hellip;\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"language-Romans\"\u003eworthy to be compared with the glory that is to be revealed to us.” Our present\ntrials are not on an equal scale with the glory of heaven ```\n\nBy God's grace he's molded my heart to be nearly incapable of separating the\nLove God has for me from any trial I face - it's not a magic answer or silver\nbullet to fixing those problems, and it doesn't make them go away, but I know\nthe sufferings here aren't even worth comparing to the glory of the Lord. Amen.\n\u003c/code\u003e\u003c/pre\u003e\n",
      "content_text": "\nThere a lot of flood stories throughout the history of the world, and the Bible\nis no different in this regard. God warns Noah of a de-creation event, whereby\nhe'll start over with humanity via Noah and his family. Noah survives the flood\nby abiding in Yahweh and staying close to the One who loves him.\n\n\u003e Note this reflection doesn't address _AT ALL_ if the flood narrative is a\n\u003e \"real\" historical event, whether it's a global or local event, or anything\n\u003e like that - regardless of those points the Biblical authors used this type of\n\u003e imagery of chaos waters to communicate themes of judgement and wrath.\n\nJesus, in the Sermon on the Mount with the 2 houses, calls back to the images\nof the chaos waters (the winds and the rains). His instruction is that the wise\nman who built his house on the rock will survive, but the foolish man builds\nhis house on the sand and the winds and the rains destroyed it.\n\nSomewhat obviously this is metaphorical for basing your life on wisdom or\nfolly. The wisdom is Jesus' teaching which is all based on Yahweh's love for\nhumanity and his desire to partner with humanity for the good of the whole\nearth.\n\nThe simple take-away is for us to survive the winds and the rain, and to say it\nmore fully - to survive de-creation and destruction, we must live our lives in\na way that revolves around Jesus, the perfect human. He calls us to a greater\nhumanity, an unbroken humanity, which is unachievable apart from him (just look\naround if you doubt this truth).\n\nIt's important to notice though that abiding in the Lord, basing your life on\nthe rock, doesn't spare you from the wind and the rain. Trials come, life gets\nhard, shit hits the fan. The last few weeks for me haven't been my favorite and\nI've certainly experienced turmoil in my life but frankly Jesus makes those\nthings bearable... in a way I can't put enough words to I'll just be reminded of\nPaul in Romans 8...\n\n``` Romans 8:18 For I consider that the sufferings of this present time are not\nworthy to be compared with the glory that is to be revealed to us.” Our present\ntrials are not on an equal scale with the glory of heaven ```\n\nBy God's grace he's molded my heart to be nearly incapable of separating the\nLove God has for me from any trial I face - it's not a magic answer or silver\nbullet to fixing those problems, and it doesn't make them go away, but I know\nthe sufferings here aren't even worth comparing to the glory of the Lord. Amen.\n",
      "summary": "There a lot of flood stories throughout the history of the world, and the Bible is no different in this regard. God warns Noah of a de-creation event,...",
      "date_published": "2024-12-04T05:52:44Z",
      "date_modified": "2024-12-04T05:52:44Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "bible-project",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/stylus-for-custom-webpage-themes/",
      "url": "https://pype.dev/stylus-for-custom-webpage-themes/",
      "title": "Stylus for custom webpage themes",
      "content_html": "\u003cp\u003ethe Logos web app is DISGUSTINGY bright/white - enough to actually ruin your morning\u0026hellip;\u003c/p\u003e\n\u003cp\u003eThankfully there\u0026rsquo;s an extension called \u003ca href=\"https://addons.mozilla.org/en-US/firefox/addon/styl-us/\"\u003estylus\u003c/a\u003e and some kind folks in the Logos community created a nice dark theme \u003ca href=\"https://userstyles.world/style/18547/logos-web-app-dark-mode\"\u003ehere\u003c/a\u003e. You simply install the extension, then go to the userstyles link \u0026lt;\u0026ndash; and click \u003ccode\u003einstall\u003c/code\u003e. It only changes themes for the sites configured - in this case \u003ca href=\"app.logos.com\"\u003eapp.logos.com\u003c/a\u003e\u003c/p\u003e\n\u003ch1 id=\"todo-image\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTODO: image\u003c/span\u003e\u003c/h1\u003e\n",
      "content_text": "\nthe Logos web app is DISGUSTINGY bright/white - enough to actually ruin your morning...\n\nThankfully there's an extension called [stylus](https://addons.mozilla.org/en-US/firefox/addon/styl-us/) and some kind folks in the Logos community created a nice dark theme [here](https://userstyles.world/style/18547/logos-web-app-dark-mode). You simply install the extension, then go to the userstyles link \u003c-- and click `install`. It only changes themes for the sites configured - in this case [app.logos.com](app.logos.com)\n\n# TODO: image\n",
      "summary": "the Logos web app is DISGUSTINGY bright/white - enough to actually ruin your morning...",
      "date_published": "2024-11-27T06:07:39Z",
      "date_modified": "2024-11-27T06:07:39Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "tech",
        "logos",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/the-two-houses/",
      "url": "https://pype.dev/the-two-houses/",
      "title": "The Two Houses",
      "content_html": "\u003ch1 id=\"the-two-houses\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThe Two Houses\u003c/span\u003e\u003c/h1\u003e\n\u003ch2 id=\"context\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eContext\u003c/span\u003e \u003ca href=\"#context\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre\u003e\u003ccode\u003e24 “Everyone then who hears these words of mine and does them will be like a wise man who built his house on the rock. 25 And the rain fell, and the floods came, and the winds blew and beat on that house, but it did not fall, because it had been founded on the rock. 26 And everyone who hears these words of mine and does not do them will be like a foolish man who built his house on the sand. 27 And the rain fell, and the floods came, and the winds blew and beat against that house, and it fell, and great was the fall of it.\n\nThe Holy Bible: English Standard Version (Mt 7:24–27). (2016). Crossway Bibles.\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2 id=\"reflection\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eReflection\u003c/span\u003e \u003ca href=\"#reflection\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eFrom the visual commentary Tim calls out a few things:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003ethe rock\u003c/code\u003e is supposed to first call us back to earlier in the sermon when Jesus calls his people \u0026ldquo;the light of the world\u0026rdquo; and says \u0026ldquo;a city on a hill [mountain] cannot be hidden\u0026rdquo; (Matthew 5:14). The hill [ὄρος | oros] means \u0026ldquo;mountain\u0026rdquo; and is a hyperlink to OT teaching of God\u0026rsquo;s people living in the ideal Jerusalem on Mt. Zion. Lots of Hebrew imagery here.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThe rain and floods are a callback to the Chaos Waters of the OT (and general ANE thinking). It\u0026rsquo;s a reference to the destructive nature that we humans have unleashed on the world - but the wise man who listens to Jesus lives a life with some amount of protection from those hardships - and ultimate protection from God handing us over to Chaos (destruction).\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n",
      "content_text": "\n# The Two Houses\n\n## Context\n\n```\n24 “Everyone then who hears these words of mine and does them will be like a wise man who built his house on the rock. 25 And the rain fell, and the floods came, and the winds blew and beat on that house, but it did not fall, because it had been founded on the rock. 26 And everyone who hears these words of mine and does not do them will be like a foolish man who built his house on the sand. 27 And the rain fell, and the floods came, and the winds blew and beat against that house, and it fell, and great was the fall of it.\n\nThe Holy Bible: English Standard Version (Mt 7:24–27). (2016). Crossway Bibles.\n```\n\n## Reflection\n\nFrom the visual commentary Tim calls out a few things:\n\n1. `the rock` is supposed to first call us back to earlier in the sermon when Jesus calls his people \"the light of the world\" and says \"a city on a hill [mountain] cannot be hidden\" (Matthew 5:14). The hill [ὄρος | oros] means \"mountain\" and is a hyperlink to OT teaching of God's people living in the ideal Jerusalem on Mt. Zion. Lots of Hebrew imagery here.\n\n2. The rain and floods are a callback to the Chaos Waters of the OT (and general ANE thinking). It's a reference to the destructive nature that we humans have unleashed on the world - but the wise man who listens to Jesus lives a life with some amount of protection from those hardships - and ultimate protection from God handing us over to Chaos (destruction).\n",
      "summary": "From the visual commentary Tim calls out a few things:",
      "date_published": "2024-11-27T05:40:24Z",
      "date_modified": "2024-11-27T05:40:24Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "bible-project",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/dns-broke-after-reboot-ubuntu-22-04/",
      "url": "https://pype.dev/dns-broke-after-reboot-ubuntu-22-04/",
      "title": "DNS Broke After Reboot - Ubuntu 22.04",
      "content_html": "\u003cp\u003eI rebooted by server and DNS broke randomly. I have no idea if it was from a kernel update or what but that\u0026rsquo;s the issue with Ubuntu I guess\u0026hellip;\u003c/p\u003e\n\u003cp\u003eAfter much toil and none of the other options working for me (sorry to not have those documented here) this is what got me the vic from this \u003ca href=\"https://askubuntu.com/questions/1406827/how-to-set-dns-on-ubuntu-22-04-when-you-have-no-netplan-config\"\u003eSO Post\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003esudo mkdir /etc/systemd/resolved.conf.d/\nsudo $EDITOR /etc/systemd/resolved.conf.d/dns_servers.conf\u003c/p\u003e\n\u003cp\u003eMost folks probably are good with google (8.8.8.8) and cloudflare (1.1.1.1)\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e[Resolve]\nDNS=8.8.8.8 1.1.1.1\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eBut I decided to use tailscale\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e[Resolve]\nDNS=100.100.100.100\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThen restart systemd-resolved\u003c/p\u003e\n\u003cp\u003esudo systemctl restart systemd-resolved\u003c/p\u003e\n",
      "content_text": "\nI rebooted by server and DNS broke randomly. I have no idea if it was from a kernel update or what but that's the issue with Ubuntu I guess...\n\nAfter much toil and none of the other options working for me (sorry to not have those documented here) this is what got me the vic from this [SO Post](https://askubuntu.com/questions/1406827/how-to-set-dns-on-ubuntu-22-04-when-you-have-no-netplan-config)\n\nsudo mkdir /etc/systemd/resolved.conf.d/\nsudo $EDITOR /etc/systemd/resolved.conf.d/dns_servers.conf\n\nMost folks probably are good with google (8.8.8.8) and cloudflare (1.1.1.1)\n\n```\n[Resolve]\nDNS=8.8.8.8 1.1.1.1\n```\n\nBut I decided to use tailscale\n\n```\n[Resolve]\nDNS=100.100.100.100\n```\n\nThen restart systemd-resolved\n\nsudo systemctl restart systemd-resolved\n",
      "summary": "I rebooted by server and DNS broke randomly. I have no idea if it was from a kernel update or what but that's the issue with Ubuntu I guess...",
      "date_published": "2024-11-22T08:08:40Z",
      "date_modified": "2024-11-22T08:08:40Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "linux",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/restart-kde-plasma/",
      "url": "https://pype.dev/restart-kde-plasma/",
      "title": "Restart KDE Plasma",
      "content_html": "\u003cp\u003ePlasma shits the bed a little too often on Fedora for me right now but I finally have a quick fix\u0026hellip;\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e\nsudo killall plasmashell\n\nkstart plasmashell\n\n\u003c/code\u003e\u003c/pre\u003e\n",
      "content_text": "\nPlasma shits the bed a little too often on Fedora for me right now but I finally have a quick fix...\n\n```\n\nsudo killall plasmashell\n\nkstart plasmashell\n\n```\n",
      "summary": "Plasma shits the bed a little too often on Fedora for me right now but I finally have a quick fix...",
      "date_published": "2024-11-08T15:53:52Z",
      "date_modified": "2024-11-08T15:53:52Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "linux",
        "terminal",
        "cli",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/opnsense-bootstrap-recovery/",
      "url": "https://pype.dev/opnsense-bootstrap-recovery/",
      "title": "OPNSense Bootstrap Recovery",
      "content_html": "\u003cp\u003eenabling DHCP WAN port (\u003ccode\u003edhclient \u0026lt;iface\u0026gt;\u003c/code\u003e)- running the bootstrap script - \u003ccode\u003esh /usr/local/sbin/opnsense-bootstrap\u003c/code\u003e\u003c/p\u003e\n",
      "content_text": "\n\nenabling DHCP WAN port (`dhclient \u003ciface\u003e`)- running the bootstrap script - `sh /usr/local/sbin/opnsense-bootstrap`\n\n",
      "summary": "enabling DHCP WAN port ()- running the bootstrap script -",
      "date_published": "2024-11-07T08:40:19Z",
      "date_modified": "2024-11-07T08:40:19Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "infrastructure",
        "homelab",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/bp-the-golden-rule/",
      "url": "https://pype.dev/bp-the-golden-rule/",
      "title": "BP - The Golden Rule",
      "content_html": "\u003cp\u003eMatthew 7:12\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eSo then, everything you desire that people do to you, so also you do to them, for this is the Torah and the Prophets\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2 id=\"what-do-i-desire-that-people-do-to-me\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhat do I desire that people “do to [me]”?\u003c/span\u003e \u003ca href=\"#what-do-i-desire-that-people-do-to-me\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003eHelp if I need it - I want to live in a world where humans are helpful\u003c/li\u003e\n\u003cli\u003eListen to me and understand what I say\u003c/li\u003e\n\u003cli\u003eLeave me alone sometimes\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"what-is-the-torah-and-prophets\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhat is the Torah and Prophets?\u003c/span\u003e \u003ca href=\"#what-is-the-torah-and-prophets\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI know there\u0026rsquo;s a lot more to where the texts come from and the varying\ntraditions in Judaism. But I think at a very high level, Jesus is saying that\nwe all know, deep down, how to live in harmony but that it requires sacrifice.\nHe calls us to live sacrificially \u003cem\u003etowards each other\u003c/em\u003e, to live in Heaven\ntoday, so we can experience the coming reality if our own resurrection\u003c/p\u003e\n",
      "content_text": "\nMatthew 7:12\n\n```\nSo then, everything you desire that people do to you, so also you do to them, for this is the Torah and the Prophets\n```\n\n## What do I desire that people \"do to [me]\"?\n\n1. Help if I need it - I want to live in a world where humans are helpful\n2. Listen to me and understand what I say\n3. Leave me alone sometimes\n\n## What is the Torah and Prophets?\n\nI know there's a lot more to where the texts come from and the varying\ntraditions in Judaism. But I think at a very high level, Jesus is saying that\nwe all know, deep down, how to live in harmony but that it requires sacrifice.\nHe calls us to live sacrificially _towards each other_, to live in Heaven\ntoday, so we can experience the coming reality if our own resurrection\n\n",
      "summary": "Matthew 7:12",
      "date_published": "2024-11-06T05:54:32Z",
      "date_modified": "2024-11-06T05:54:32Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "bible-project",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/recovering-opnsense/",
      "url": "https://pype.dev/recovering-opnsense/",
      "title": "Recovering OPNSense",
      "content_html": "\u003cp\u003eI woke up to faulty internet and after some troubleshooting it turns out the\nroot zfs dataset that OPNSense boots from got corrupted\u0026hellip;\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ePRO-TIP - Auto backup your OPNSense config to Google Drive, git, or\nnextcloud\u0026hellip; But if you won\u0026rsquo;t then at least back up your OPNSense config\nsomewhere everytime you update it.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eIt\u0026rsquo;s too much to recount every issue, so here\u0026rsquo;s a bullet list what worked.\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eOn a fresh drive install OPNSense\u003c/li\u003e\n\u003cli\u003ePlug in the old drive through a USB enclosure - now I\u0026rsquo;m not sure what would\nhappen if you plugged it in along with the new drive and then booted up.\nBecause both drives will have a zfs pool \u003ccode\u003ezroot\u003c/code\u003e and the boot dataset is\nautomounted at \u003ccode\u003e/zroot/ROOT/default\u003c/code\u003e. My old \u003ccode\u003ezroot\u003c/code\u003e pool was \u003ccode\u003eSUSPENDED\u003c/code\u003e so it\ndidn\u0026rsquo;t automount\u003c/li\u003e\n\u003cli\u003eBecause the old \u003ccode\u003ezoot/ROOT/default\u003c/code\u003e was corrupted I did this to mount it RO:\n\u003ccode\u003ezpool import -d \u0026lt;path to zfs partition - /dev/stuff\u0026gt; -N zroot zrootrecovery\u003c/code\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cblockquote\u003e\n\u003cp\u003e-d is the zfs flag to import the pool by disk id, -N it to not mount any of\nthe datasets (we need to change mountpoints) and the \u003ccode\u003ezroot zrootrecovery\u003c/code\u003e\nimports the \u003ccode\u003ezroot\u003c/code\u003e pool with a new name\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003col start=\"4\"\u003e\n\u003cli\u003eChange the mountpoints for all the \u003ccode\u003ezrootrecovery\u003c/code\u003e datasets to somewhere\nlike \u003ccode\u003e/mnt/zrootrecovery\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eDepending on the mount point you set you\u0026rsquo;ll find a \u003ccode\u003econfig\u003c/code\u003e directory around\n\u003ccode\u003e/mnt/zrootrecovery/ROOT/default/config\u003c/code\u003e - copy the file you want to another\nmachine via scp or whatever\u003c/li\u003e\n\u003cli\u003eGo to OPNSense webui and recover from that config!\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eAll in all this process took me around 8 hours but I did run into about ever\nissue under the sun (several bad disks in the mix, a laptop that wouldn\u0026rsquo;t live\nboot into a BSD system, etc.)\u003c/p\u003e\n",
      "content_text": "\nI woke up to faulty internet and after some troubleshooting it turns out the\nroot zfs dataset that OPNSense boots from got corrupted...\n\n\u003e PRO-TIP - Auto backup your OPNSense config to Google Drive, git, or\n\u003e nextcloud... But if you won't then at least back up your OPNSense config\n\u003e somewhere everytime you update it.\n\n\nIt's too much to recount every issue, so here's a bullet list what worked.\n\n\n1. On a fresh drive install OPNSense\n2. Plug in the old drive through a USB enclosure - now I'm not sure what would\nhappen if you plugged it in along with the new drive and then booted up.\nBecause both drives will have a zfs pool `zroot` and the boot dataset is\nautomounted at `/zroot/ROOT/default`. My old `zroot` pool was `SUSPENDED` so it\ndidn't automount\n3. Because the old `zoot/ROOT/default` was corrupted I did this to mount it RO:\n`zpool import -d \u003cpath to zfs partition - /dev/stuff\u003e -N zroot zrootrecovery`\n\n\u003e -d is the zfs flag to import the pool by disk id, -N it to not mount any of\n\u003e the datasets (we need to change mountpoints) and the `zroot zrootrecovery`\n\u003e imports the `zroot` pool with a new name\n\n4. Change the mountpoints for all the `zrootrecovery` datasets to somewhere\nlike `/mnt/zrootrecovery`\n5. Depending on the mount point you set you'll find a `config` directory around\n`/mnt/zrootrecovery/ROOT/default/config` - copy the file you want to another\nmachine via scp or whatever\n6. Go to OPNSense webui and recover from that config!\n\nAll in all this process took me around 8 hours but I did run into about ever\nissue under the sun (several bad disks in the mix, a laptop that wouldn't live\nboot into a BSD system, etc.)\n",
      "summary": "I woke up to faulty internet and after some troubleshooting it turns out the root zfs dataset that OPNSense boots from got corrupted...",
      "date_published": "2024-11-06T00:00:00Z",
      "date_modified": "2024-11-06T00:00:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "blog",
        "homelab"
      ]
    },
    {
      "id": "https://pype.dev/reflection-wisdom-in-relationships-2/",
      "url": "https://pype.dev/reflection-wisdom-in-relationships-2/",
      "title": "Reflection - Wisdom in Relationships 2",
      "content_html": "\u003ch2 id=\"passage\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePassage\u003c/span\u003e \u003ca href=\"#passage\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre\u003e\u003ccode\u003eWhy do you see the speck in the eye of your brother, but you don't perceive the\nbeam in your own eye?\n\nOr how can you say to your brother, \u0026quot;Allow me to take out the speck from your\neye,\u0026quot; and look, the beam is in your eye!\n\nHypocrite! First take out the beam from your eye, and then you can see clearly\nthe speck in the eye of your brother.\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eAsk and it will be given to you. Seek and you will find. Knock and it will be\nhopend to you. For the one who asks will receive, and the one who seeks will\nfind. And to the one who knocks it will be opened. For what person is among\nyou, who when their son asks for break, will give him a rock? Or when he asks\nfor a fish will give him a snake? So then fi you all are bad, but you know how\nto give good gifts to your children, how much more will your Father in the\nskies give good things to those who ask.\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2 id=\"reflection\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eReflection\u003c/span\u003e \u003ca href=\"#reflection\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eJames builds on this with \u003ccode\u003eif any of you lacks wisdom then ask for wisdom it will be given to you\u003c/code\u003e. James is arming us with some specifics from the Sermon\non the Mount. We aren\u0026rsquo;t just to ask for anything that we think is good\u0026hellip;\nwisdom is the good we are to ask for.\u003c/p\u003e\n\u003cp\u003eTim: Prayer is important because wisdom will flow out of a deep interpersonal\nrelationship with God.\u003c/p\u003e\n\u003ch3 id=\"where-has-god-given-me-wisdom\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhere has God given me wisdom?\u003c/span\u003e \u003ca href=\"#where-has-god-given-me-wisdom\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eMarriage/relationships as Kassia and I have navigated many things (job changes, moving for family, family falling through, unhealthy parent relationships, church hunts, and our own self-development and discovery)\u003c/li\u003e\n\u003cli\u003eHe\u0026rsquo;s given me a lot of professional wisdom - potentially through AuDHD and the exposure he\u0026rsquo;s brought me through.\u003c/li\u003e\n\u003cli\u003eThrough Mark Forstrom, Andrew, Nick Z, etc. I was filled with wisdom on how to be a man in the life of a boy - how to talk with someone immature, let them be and feel heard, but also on how to challenge them to grow (up).\u003c/li\u003e\n\u003c/ol\u003e\n",
      "content_text": "\n## Passage\n\n```\nWhy do you see the speck in the eye of your brother, but you don't perceive the\nbeam in your own eye?\n\nOr how can you say to your brother, \"Allow me to take out the speck from your\neye,\" and look, the beam is in your eye!\n\nHypocrite! First take out the beam from your eye, and then you can see clearly\nthe speck in the eye of your brother.\n```\n\n```\nAsk and it will be given to you. Seek and you will find. Knock and it will be\nhopend to you. For the one who asks will receive, and the one who seeks will\nfind. And to the one who knocks it will be opened. For what person is among\nyou, who when their son asks for break, will give him a rock? Or when he asks\nfor a fish will give him a snake? So then fi you all are bad, but you know how\nto give good gifts to your children, how much more will your Father in the\nskies give good things to those who ask.\n```\n## Reflection\n\nJames builds on this with `if any of you lacks wisdom then ask for wisdom it\nwill be given to you`. James is arming us with some specifics from the Sermon\non the Mount. We aren't just to ask for anything that we think is good...\nwisdom is the good we are to ask for.\n\nTim: Prayer is important because wisdom will flow out of a deep interpersonal\nrelationship with God.\n\n### Where has God given me wisdom?\n\n1. Marriage/relationships as Kassia and I have navigated many things (job changes, moving for family, family falling through, unhealthy parent relationships, church hunts, and our own self-development and discovery)\n2. He's given me a lot of professional wisdom - potentially through AuDHD and the exposure he's brought me through. \n3. Through Mark Forstrom, Andrew, Nick Z, etc. I was filled with wisdom on how to be a man in the life of a boy - how to talk with someone immature, let them be and feel heard, but also on how to challenge them to grow (up).\n",
      "summary": "James builds on this with . James is arming us with some specifics from the Sermon on the Mount. We aren't just to ask for anything that we think is good......",
      "date_published": "2024-10-14T06:07:33Z",
      "date_modified": "2024-10-14T06:07:33Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "bible-project",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/reflection-wisdom-in-relationships/",
      "url": "https://pype.dev/reflection-wisdom-in-relationships/",
      "title": "Reflection - Wisdom in Relationships",
      "content_html": "\u003cp\u003eThis morning I finally felt some motivation for a short Bible Project video.\nThe app is great (💯 would recommend) and gives me daily reminders that are\nunobtrusive.\u003c/p\u003e\n\u003cp\u003eThe passage is Matthew 7:1-2\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"language-Do\"\u003ethat you judge, you will be judged.\n\nAnd with the measure that you measure, it will be measured to you. ```\n\nThere are some personal things going on for me as I wrestle and work through an\nAuDHD diagnosis and there's a lot for me having grown up as a (almost\ncertainly) undiagnosed mild-autistic. These 2 verses are in a larger section of\nScripture called \u0026quot;The Sermon on the Mount\u0026quot;, Jesus starts it by basically saying\nhe'll summarize the Law and Prophets in Matthew 5, then concludes it in Matthew\n7 by saying he summed them up with what we call the Golden Rule - `do unto\nothers as you would have them do unto you` is how my Souther Baptist Grandma\nused to say it.\n\nI've grown up into knowing it's simply silly to expect non-Christians to live\nBiblically - I do not understand the judgement some Christians throw at\nnon-believers for things like cohabitation or getting drunk... It's literally\nwhat I would do without Jesus guiding my lie. However I've always felt a pretty\nunreasonable responsibility to point out where Christians are living by double\nstandards. Jesus addresses this with another commonly known question - \u0026quot;Why do\nyou take the spec our of your brother's eye but ignore the log in your own\neye?\u0026quot;. I'm very personally aware, almost to a hyper degree, but I definitely\ndon't have perfect-awaremenss, and I don't know if I'm losing zeal as I get\nolder or actually growing into wisdom but I am sliding more and more into a\nposition of just not worrying about what other people are doing. As long as my\nfamily is safe I'm basically a full-blown libertarian when it comes to people\nliving their lives.\n\nThe BP message this morning was just great confirmation that this is\ndirectionally correct, at least right now for me. I spent a lot of time as a\nkid worrying about other Christians living appropriately (this was partly\ndriven by needing older Christians to help me live appropriately and so I felt\nresponsiblity to help provide that environment for myself... combination of\nGod's grace and undiagnosed AuDHD methinks). Now as an adult I spend most of my\ntime thanking Jesus for saving me from myself and I simply trust that he will\nsave who he saves. Because that's not up to me I can focus on what I can manage\n- my own life and family.\n\u003c/code\u003e\u003c/pre\u003e\n",
      "content_text": "\nThis morning I finally felt some motivation for a short Bible Project video.\nThe app is great (💯 would recommend) and gives me daily reminders that are\nunobtrusive.\n\nThe passage is Matthew 7:1-2\n\n``` Do not judge so tha tyou will not be judged. Because with the judgement\nthat you judge, you will be judged.\n\nAnd with the measure that you measure, it will be measured to you. ```\n\nThere are some personal things going on for me as I wrestle and work through an\nAuDHD diagnosis and there's a lot for me having grown up as a (almost\ncertainly) undiagnosed mild-autistic. These 2 verses are in a larger section of\nScripture called \"The Sermon on the Mount\", Jesus starts it by basically saying\nhe'll summarize the Law and Prophets in Matthew 5, then concludes it in Matthew\n7 by saying he summed them up with what we call the Golden Rule - `do unto\nothers as you would have them do unto you` is how my Souther Baptist Grandma\nused to say it.\n\nI've grown up into knowing it's simply silly to expect non-Christians to live\nBiblically - I do not understand the judgement some Christians throw at\nnon-believers for things like cohabitation or getting drunk... It's literally\nwhat I would do without Jesus guiding my lie. However I've always felt a pretty\nunreasonable responsibility to point out where Christians are living by double\nstandards. Jesus addresses this with another commonly known question - \"Why do\nyou take the spec our of your brother's eye but ignore the log in your own\neye?\". I'm very personally aware, almost to a hyper degree, but I definitely\ndon't have perfect-awaremenss, and I don't know if I'm losing zeal as I get\nolder or actually growing into wisdom but I am sliding more and more into a\nposition of just not worrying about what other people are doing. As long as my\nfamily is safe I'm basically a full-blown libertarian when it comes to people\nliving their lives.\n\nThe BP message this morning was just great confirmation that this is\ndirectionally correct, at least right now for me. I spent a lot of time as a\nkid worrying about other Christians living appropriately (this was partly\ndriven by needing older Christians to help me live appropriately and so I felt\nresponsiblity to help provide that environment for myself... combination of\nGod's grace and undiagnosed AuDHD methinks). Now as an adult I spend most of my\ntime thanking Jesus for saving me from myself and I simply trust that he will\nsave who he saves. Because that's not up to me I can focus on what I can manage\n- my own life and family.\n",
      "summary": "This morning I finally felt some motivation for a short Bible Project video. The app is great (💯 would recommend) and gives me daily reminders that are...",
      "date_published": "2024-10-12T05:40:11Z",
      "date_modified": "2024-10-12T05:40:11Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "bible-project",
        "faith",
        "reflection"
      ]
    },
    {
      "id": "https://pype.dev/docker-remote-add/",
      "url": "https://pype.dev/docker-remote-add/",
      "title": "docker-remote-add",
      "content_html": "\u003cp\u003eAdd from url??\u003c/p\u003e\n\u003cp\u003eADD \u003ca href=\"http://example.com/cars.csv\"\u003ehttp://example.com/cars.csv\u003c/a\u003e /tmp/cars.csv\u003c/p\u003e\n\u003cp\u003eUnpack automatically!? (.tar, .tar.gz, .tgz, .bz2, .tbz2, .txz, .zip)\u003c/p\u003e\n\u003cp\u003eADD myapp.tar.gz /opt/myapp/\u003c/p\u003e\n",
      "content_text": "\nAdd from url??\n\nADD http://example.com/cars.csv /tmp/cars.csv\n\nUnpack automatically!? (.tar, .tar.gz, .tgz, .bz2, .tbz2, .txz, .zip)\n\nADD myapp.tar.gz /opt/myapp/\n",
      "summary": "Add from url??",
      "date_published": "2024-09-17T06:19:00Z",
      "date_modified": "2024-09-17T06:19:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "linux",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/docker-copy-and-chown/",
      "url": "https://pype.dev/docker-copy-and-chown/",
      "title": "Docker copy and chown",
      "content_html": "\u003cp\u003eCOPY \u0026ndash;chown=myuser:mygroup source-file target-file\u003c/p\u003e\n",
      "content_text": "\nCOPY --chown=myuser:mygroup source-file target-file\n",
      "summary": "COPY --chown=myuser:mygroup source-file target-file",
      "date_published": "2024-09-17T06:18:09Z",
      "date_modified": "2024-09-17T06:18:09Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "linux",
        "homelab",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/switching-from-altacv-to-rendercv-for-my-resume/",
      "url": "https://pype.dev/switching-from-altacv-to-rendercv-for-my-resume/",
      "title": "Switching from AltaCV to RenderCV for my Resume",
      "content_html": "\u003cp\u003eI was using a fun LaTex-based project for managing my resume called \u003ca href=\"https://github.com/liantze/AltaCV\"\u003eAltaCV\u003c/a\u003e. I loved the customization and was familiar with Tek from school. However, I update my resume so infrequently that anytime I\u0026rsquo;d hop back to it I\u0026rsquo;d have to remember how to work with Tex and that was frustrating as I\u0026rsquo;ve lost touch with it over the years.\u003c/p\u003e\n\u003cp\u003eScrolling GitHub treding repos I saw \u003ca href=\"https://github.com/sinaatalay/rendercv\"\u003eRenderCV\u003c/a\u003e which let\u0026rsquo;s me just use YAML to write my resume and then it compiles to Tek through Python. There\u0026rsquo;s a sister project to make your own using this very easly call \u003ca href=\"https://github.com/sinaatalay/rendercv-pipeline\"\u003erendercv-pipeline\u003c/a\u003e. I forked that repo and translated my tek resume to the YAML. The included theme is nice enough is YAML is much easier to maintain long-term.\u003c/p\u003e\n\u003cp\u003eMy resume is behind a private GH repo but the example from rendercv-pipeline is \u003ca href=\"https://github.com/sinaatalay/rendercv-pipeline/blob/main/John_Doe_CV.pdf\"\u003ehere on GitHub\u003c/a\u003e\u003c/p\u003e\n",
      "content_text": "\nI was using a fun LaTex-based project for managing my resume called [AltaCV](https://github.com/liantze/AltaCV). I loved the customization and was familiar with Tek from school. However, I update my resume so infrequently that anytime I'd hop back to it I'd have to remember how to work with Tex and that was frustrating as I've lost touch with it over the years.\n\nScrolling GitHub treding repos I saw [RenderCV](https://github.com/sinaatalay/rendercv) which let's me just use YAML to write my resume and then it compiles to Tek through Python. There's a sister project to make your own using this very easly call [rendercv-pipeline](https://github.com/sinaatalay/rendercv-pipeline). I forked that repo and translated my tek resume to the YAML. The included theme is nice enough is YAML is much easier to maintain long-term.\n\n\nMy resume is behind a private GH repo but the example from rendercv-pipeline is [here on GitHub](https://github.com/sinaatalay/rendercv-pipeline/blob/main/John_Doe_CV.pdf)\n",
      "summary": "I was using a fun LaTex-based project for managing my resume called AltaCV. I loved the customization and was familiar with Tek from school. However, I...",
      "date_published": "2024-08-01T05:59:46Z",
      "date_modified": "2024-08-01T05:59:46Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "python",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/upgrading-your-kernel-can-f-you-up-whoops/",
      "url": "https://pype.dev/upgrading-your-kernel-can-f-you-up-whoops/",
      "title": "Upgrading your kernel can F you up… whoops",
      "content_html": "\u003cp\u003e\u003ca href=\"https://forum.proxmox.com/threads/update-error-with-coral-tpu-drivers.136888/#post-608975\"\u003ehttps://forum.proxmox.com/threads/update-error-with-coral-tpu-drivers.136888/#post-608975\u003c/a\u003e I lost TPU for frigate, this saved me ass\u003c/p\u003e\n",
      "content_text": "\nhttps://forum.proxmox.com/threads/update-error-with-coral-tpu-drivers.136888/#post-608975 I lost TPU for frigate, this saved me ass\n",
      "summary": "https://forum.proxmox.com/threads/update-error-with-coral-tpu-drivers.136888/#post-608975 I lost TPU for frigate, this saved me ass",
      "date_published": "2024-06-26T10:21:59Z",
      "date_modified": "2024-06-26T10:21:59Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "linux",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/fonts-in-vs-c-e/",
      "url": "https://pype.dev/fonts-in-vs-c-e/",
      "title": "Fonts in VS C**e",
      "content_html": "\u003cp\u003eJet Brains has to be specified \u0026lsquo;JetBrainsMono Nerd Font Mono\u0026rsquo;\u003c/p\u003e\n",
      "content_text": "\nJet Brains has to be specified 'JetBrainsMono Nerd Font Mono'\n",
      "summary": "Jet Brains has to be specified 'JetBrainsMono Nerd Font Mono'",
      "date_published": "2024-05-20T06:44:07Z",
      "date_modified": "2024-05-20T06:44:07Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "vscode",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/customize-k9s/",
      "url": "https://pype.dev/customize-k9s/",
      "title": "Customize K9s",
      "content_html": "\u003cp\u003eTo customize k9s use the skins from catppuccin or the ones k9s supplies\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eOUT\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eXDG_CONFIG_HOME\u003c/span\u003e\u003cspan class=\"k\"\u003e:-\u003c/span\u003e\u003cspan class=\"nv\"\u003e$HOME\u003c/span\u003e\u003cspan class=\"p\"\u003e/.config\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e/k9s/skins\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emkdir -p \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$OUT\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\"\u003ecurl -L https://github.com/catppuccin/k9s/archive/main.tar.gz \u003cspan class=\"p\"\u003e|\u003c/span\u003e tar xz -C \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$OUT\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e --strip-components\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"m\"\u003e2\u003c/span\u003e k9s-main/dist\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThen edit your k9s config\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e# ~/.config/k9s/config.yml\nk9s:\n  ui:\n    skin: catppuccin-mocha\n    # ...or another flavor:\n    # skin: catppuccin-macchiato\n    # skin: catppuccin-frappe\n    # skin: catppuccin-latte\n\n    # ...or the transparent variants:\n    # skin: catppuccin-mocha-transparent\n    # skin: catppuccin-macchiato-transparent\n    # skin: catppuccin-frappe-transparent\n    # skin: catppuccin-latte-transparent\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eOther k9s skins are available \u003ca href=\"https://github.com/derailed/k9s/tree/master/skins\"\u003ehere\u003c/a\u003e\u003c/p\u003e\n",
      "content_text": "\nTo customize k9s use the skins from catppuccin or the ones k9s supplies\n\n```bash\nOUT=\"${XDG_CONFIG_HOME:-$HOME/.config}/k9s/skins\"\nmkdir -p \"$OUT\"\ncurl -L https://github.com/catppuccin/k9s/archive/main.tar.gz | tar xz -C \"$OUT\" --strip-components=2 k9s-main/dist\n```\n\nThen edit your k9s config\n\n```\n# ~/.config/k9s/config.yml\nk9s:\n  ui:\n    skin: catppuccin-mocha\n    # ...or another flavor:\n    # skin: catppuccin-macchiato\n    # skin: catppuccin-frappe\n    # skin: catppuccin-latte\n\n    # ...or the transparent variants:\n    # skin: catppuccin-mocha-transparent\n    # skin: catppuccin-macchiato-transparent\n    # skin: catppuccin-frappe-transparent\n    # skin: catppuccin-latte-transparent\n```\n\nOther k9s skins are available [here](https://github.com/derailed/k9s/tree/master/skins)\n",
      "summary": "To customize k9s use the skins from catppuccin or the ones k9s supplies",
      "date_published": "2024-05-06T11:57:07Z",
      "date_modified": "2024-05-06T11:57:07Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "cli",
        "homelab",
        "tech",
        "k8s",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/git-fetch-failing-check-your-config/",
      "url": "https://pype.dev/git-fetch-failing-check-your-config/",
      "title": "Git fetch failing - check your config",
      "content_html": "\u003cp\u003eI started deploying a website to Cloudflare on a branch called \u003ccode\u003epages\u003c/code\u003e. Similar to one of the GH Pages deployment patterns. But when my CI was pushing the branch I couldn\u0026rsquo;t see it locally\u0026hellip;\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003egit fetch -a\u003c/code\u003e wasn\u0026rsquo;t pulling any new branches, and \u003ccode\u003egit branch -a\u003c/code\u003e was only showing my development and main branches at the remote\u0026hellip; so what gives?\u003c/p\u003e\n\u003cp\u003eI checked my git config, and to this moment I have no idea how this happened but check out my fetch config:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003egit config --get remote.origin.fetch\n+refs/tags/*:refs/tags/*\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eSo to fix this:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003egit config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eNow \u003ccode\u003egit fetch -a\u003c/code\u003e works again\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e\u0026gt; git fetch -a\n\nFrom github.com:DigitalHarbor7/DigitalHarbor\n   357a28a..969b027  develop    -\u0026gt; origin/develop\n   c052ac9..6d40210  main       -\u0026gt; origin/main\n * [new branch]      pages      -\u0026gt; origin/pages\n\u003c/code\u003e\u003c/pre\u003e\n",
      "content_text": "\nI started deploying a website to Cloudflare on a branch called `pages`. Similar to one of the GH Pages deployment patterns. But when my CI was pushing the branch I couldn't see it locally...\n\n`git fetch -a` wasn't pulling any new branches, and `git branch -a` was only showing my development and main branches at the remote... so what gives?\n\nI checked my git config, and to this moment I have no idea how this happened but check out my fetch config:\n```\ngit config --get remote.origin.fetch\n+refs/tags/*:refs/tags/*\n```\n\nSo to fix this:\n\n```\ngit config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'\n```\n\nNow `git fetch -a` works again\n```\n\u003e git fetch -a\n\nFrom github.com:DigitalHarbor7/DigitalHarbor\n   357a28a..969b027  develop    -\u003e origin/develop\n   c052ac9..6d40210  main       -\u003e origin/main\n * [new branch]      pages      -\u003e origin/pages\n```\n\n",
      "summary": "I started deploying a website to Cloudflare on a branch called . Similar to one of the GH Pages deployment patterns. But when my CI was pushing the branch I...",
      "date_published": "2024-04-18T08:32:33Z",
      "date_modified": "2024-04-18T08:32:33Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "cli",
        "git",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/git-repo-specific-ssh-key/",
      "url": "https://pype.dev/git-repo-specific-ssh-key/",
      "title": "Git repo specific SSH Key!",
      "content_html": "\u003cp\u003egit config \u0026ndash;add \u0026ndash;local core.sshCommand \u0026lsquo;ssh -i \u0026laquo;\u0026lt;PATH_TO_SSH_KEY\u0026raquo;\u0026gt;\u0026rsquo;\u003c/p\u003e\n",
      "content_text": "\ngit config --add --local core.sshCommand 'ssh -i \u003c\u003c\u003cPATH_TO_SSH_KEY\u003e\u003e\u003e'\n",
      "summary": "git config --add --local core.sshCommand 'ssh -i \u003e\u003e'",
      "date_published": "2024-01-04T15:42:15Z",
      "date_modified": "2024-01-04T15:42:15Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "cli",
        "git",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/on-earth-as-it-is-in-heaven/",
      "url": "https://pype.dev/on-earth-as-it-is-in-heaven/",
      "title": "On Earth as It Is in Heaven",
      "content_html": "\u003ch1 id=\"on-earth-as-it-is-in-heaven\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOn Earth as It Is in Heaven\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003e\u003ca href=\"https://bibleproject.com/explore/video/on-earth-as-it-is-in-heaven/\"\u003eVideo\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"sermon-on-the-mount\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSermon on the Mount\u003c/span\u003e \u003ca href=\"#sermon-on-the-mount\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e3 chapters filled with phrases that are very well-known in our culture\u003c/p\u003e\n\u003ch3 id=\"phrases\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePhrases\u003c/span\u003e \u003ca href=\"#phrases\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eLove your neighbor as yourself\u003c/li\u003e\n\u003cli\u003eDo to others what you would have them do to you\u003c/li\u003e\n\u003cli\u003eYou are the salt of the earth\u003c/li\u003e\n\u003cli\u003eYou can’t serve both God and money\u003c/li\u003e\n\u003cli\u003eTake the plank out of your eye before you take the speck out of another’s\u003c/li\u003e\n\u003cli\u003eIf anyone strikes you on the cheek, turn and offer him the other cheek\u003c/li\u003e\n\u003cli\u003eLove your enemy and bless those who persecute you\u003c/li\u003e\n\u003cli\u003eIf your hand causes you to sin, cut it… off\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"references\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eReferences\u003c/span\u003e \u003ca href=\"#references\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eMark 12:31\u003c/li\u003e\n\u003cli\u003eMatthew 7:12\u003c/li\u003e\n\u003cli\u003eMatthew 5:13\u003c/li\u003e\n\u003cli\u003eMatthew 6:24\u003c/li\u003e\n\u003cli\u003eMatthew 7:5\u003c/li\u003e\n\u003cli\u003eMatthew 5:39\u003c/li\u003e\n\u003cli\u003eMatthew 5:44\u003c/li\u003e\n\u003cli\u003eMatthew 5:30\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"meditation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMeditation\u003c/span\u003e \u003ca href=\"#meditation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eSermon on the mount is chiastic\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e3 main parts to the Sermon on the Mount\nThe middle part has 3 parts\nEach of those parts has 3 parts\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch3 id=\"climax\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eClimax\u003c/span\u003e \u003ca href=\"#climax\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe center of the chiasm is a famous prayer\u003c/p\u003e\n\u003cp\u003e“Our Father in Heaven, may your name be treated as holy. May your Kingdom come. May your will be done on Earth as it is in Heaven.”9\u003c/p\u003e\n\u003cblockquote\u003e\n\u003col start=\"9\"\u003e\n\u003cli\u003eMatthew 6:9-10\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"jewishness\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eJewishness\u003c/span\u003e \u003ca href=\"#jewishness\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eGod\u0026rsquo;s kingdom was to be ushered into the world by his creation, but Genesis\n3,6,10 tell us that humans choose wrong when we define good and bad by\nourselves. Yahweh chose Abraham and built up Israel as a second attempt of\nsorts to bring the his Kingdom to earth but the HB is filled with the story of\nhow they mostly failed.\u003c/p\u003e\n\u003cp\u003eNT time is where Jesus reveals the Kingdom to Jews who are oppressed by Roman\nEmpire and he reveals this to exactly the oppressed audience - \u0026ldquo;Blessed are the\npoor in spirit\u0026rdquo;\u003c/p\u003e\n",
      "content_text": "\n# On Earth as It Is in Heaven\n\n[Video](https://bibleproject.com/explore/video/on-earth-as-it-is-in-heaven/)\n\n## Sermon on the Mount\n\n3 chapters filled with phrases that are very well-known in our culture\n\n### Phrases\n\n1. Love your neighbor as yourself\n2. Do to others what you would have them do to you\n3. You are the salt of the earth\n4. You can’t serve both God and money\n5. Take the plank out of your eye before you take the speck out of another’s\n6. If anyone strikes you on the cheek, turn and offer him the other cheek\n7. Love your enemy and bless those who persecute you\n8. If your hand causes you to sin, cut it… off\n\n### References\n\n1. Mark 12:31\n2. Matthew 7:12\n3. Matthew 5:13\n4. Matthew 6:24\n5. Matthew 7:5\n6. Matthew 5:39\n7. Matthew 5:44\n8. Matthew 5:30\n\n## Meditation\n\nSermon on the mount is chiastic\n\n\u003e 3 main parts to the Sermon on the Mount\n\u003e The middle part has 3 parts\n\u003e Each of those parts has 3 parts\n\n### Climax\n\nThe center of the chiasm is a famous prayer\n\n“Our Father in Heaven, may your name be treated as holy. May your Kingdom come. May your will be done on Earth as it is in Heaven.”9\n\n\u003e 9. Matthew 6:9-10\n\n## Jewishness\n\nGod's kingdom was to be ushered into the world by his creation, but Genesis\n3,6,10 tell us that humans choose wrong when we define good and bad by\nourselves. Yahweh chose Abraham and built up Israel as a second attempt of\nsorts to bring the his Kingdom to earth but the HB is filled with the story of\nhow they mostly failed.\n\nNT time is where Jesus reveals the Kingdom to Jews who are oppressed by Roman\nEmpire and he reveals this to exactly the oppressed audience - \"Blessed are the\npoor in spirit\"\n",
      "summary": "Video",
      "date_published": "2024-01-02T06:31:21Z",
      "date_modified": "2024-01-02T06:31:21Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "bible-project",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/dhcp-restart-to-save-ubuntu-22-04-server-networking/",
      "url": "https://pype.dev/dhcp-restart-to-save-ubuntu-22-04-server-networking/",
      "title": "DHCP Restart to Save Ubuntu 22.04 Server Networking",
      "content_html": "\u003cp\u003eI moved a computer to a remote location for an off-site backup but when it was powered on it wouldn\u0026rsquo;t show up on any networks. A solution that got me back in was a friend restarting the dhcp client for me:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo dhclient -r -v \u0026lt;interface\u0026gt; \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e sudo dhclient -v \u0026lt;interface\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nI moved a computer to a remote location for an off-site backup but when it was powered on it wouldn't show up on any networks. A solution that got me back in was a friend restarting the dhcp client for me:\n\n```bash\nsudo dhclient -r -v \u003cinterface\u003e \u0026\u0026 sudo dhclient -v \u003cinterface\u003e\n```\n",
      "summary": "I moved a computer to a remote location for an off-site backup but when it was powered on it wouldn't show up on any networks. A solution that got me back in...",
      "date_published": "2023-12-31T20:26:50Z",
      "date_modified": "2023-12-31T20:26:50Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "linux",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/chaos-dragon/",
      "url": "https://pype.dev/chaos-dragon/",
      "title": "Chaos Dragon",
      "content_html": "\u003cp\u003eDragons are metaphorical images in the Bible\u003c/p\u003e\n\u003cp\u003eGoliath -\u0026gt; armor descriptions\nLeviathan\u003c/p\u003e\n\u003cp\u003eDragon slayers can be enticed to become dragons themselves\u003c/p\u003e\n\u003cp\u003eJesus is the great dragon slayer, who doesn\u0026rsquo;t give in to the inticing power of the dragon\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ecalming the sea\u003c/li\u003e\n\u003cli\u003econquering sickness in others\u003c/li\u003e\n\u003cli\u003etempter in the wilderness\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eJesus\u0026rsquo; victory came through the surrender of his life - which brings him deep\ninto the dragon\u0026rsquo;s realm, to deliver the ultimate blow\u003c/p\u003e\n\u003cp\u003eReflect\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eIn the Bible, why is it challenging for humans to slay the dragon? What risks are involved?\nThe dragon\u0026rsquo;s power is enticing\u0026hellip; back to Genesis 3, humans are easy to persuade to do things for personal gain\nIt\u0026rsquo;s challenging also becauset the dragon is powerful, and humans are not\n(without its power or the power of Jesus) so if we stand against it without\nthe Lord, what hope do we have of victory?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWhat are some of the ways that Jesus confronted the “dragon” in his ministry?\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ecalming the sea\u003c/li\u003e\n\u003cli\u003econquering sickness in others\u003c/li\u003e\n\u003cli\u003etempter in the wilderness\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eHow does Jesus ultimately defeat the “dragon”? How can we follow his example?\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSurrender\u003c/li\u003e\n\u003cli\u003eI think we do the same, but it doesn\u0026rsquo;t always look like death, sometimes it\u0026rsquo;s\nsubverting the temporary authorities we are under to comply in the least\npossible ways while always ultimately striving for the coming of the Kingdom\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n",
      "content_text": "\nDragons are metaphorical images in the Bible\n\nGoliath -\u003e armor descriptions\nLeviathan\n\nDragon slayers can be enticed to become dragons themselves\n\nJesus is the great dragon slayer, who doesn't give in to the inticing power of the dragon\n\n- calming the sea\n- conquering sickness in others\n- tempter in the wilderness\n\nJesus' victory came through the surrender of his life - which brings him deep\ninto the dragon's realm, to deliver the ultimate blow\n\nReflect\n\n1. In the Bible, why is it challenging for humans to slay the dragon? What risks are involved?\n   The dragon's power is enticing... back to Genesis 3, humans are easy to persuade to do things for personal gain\n   It's challenging also becauset the dragon is powerful, and humans are not\n   (without its power or the power of Jesus) so if we stand against it without\n   the Lord, what hope do we have of victory?\n\n2. What are some of the ways that Jesus confronted the “dragon” in his ministry?\n\n   - calming the sea\n   - conquering sickness in others\n   - tempter in the wilderness\n\n3. How does Jesus ultimately defeat the “dragon”? How can we follow his example?\n   - Surrender\n   - I think we do the same, but it doesn't always look like death, sometimes it's\n     subverting the temporary authorities we are under to comply in the least\n     possible ways while always ultimately striving for the coming of the Kingdom\n",
      "summary": "Dragons are metaphorical images in the Bible",
      "date_published": "2023-12-20T06:08:08Z",
      "date_modified": "2023-12-20T06:08:08Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "bible-project",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/simple-port-forwarding-opnsense/",
      "url": "https://pype.dev/simple-port-forwarding-opnsense/",
      "title": "Simple Port Forwarding OPNSense",
      "content_html": "\u003cp\u003e\u003ca href=\"https://forum.opnsense.org/index.php?topic=8783.0\"\u003ehttps://forum.opnsense.org/index.php?topic=8783.0\u003c/a\u003e\u003c/p\u003e\n",
      "content_text": "\nhttps://forum.opnsense.org/index.php?topic=8783.0\n",
      "summary": "https://forum.opnsense.org/index.php?topic=8783.0",
      "date_published": "2023-10-17T10:26:34Z",
      "date_modified": "2023-10-17T10:26:34Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/refresh-nextcloud-groupfolders-after-messing-around-on-the-filesystem/",
      "url": "https://pype.dev/refresh-nextcloud-groupfolders-after-messing-around-on-the-filesystem/",
      "title": "Refresh Nextcloud Groupfolders after messing around on the filesystem",
      "content_html": "\u003cp\u003eExec in as www-data and run ./occ groupfolders:scan folder_id -v (the -v to see what it\u0026rsquo;s doing)\u003c/p\u003e\n",
      "content_text": "\nExec in as www-data and run ./occ groupfolders:scan folder_id -v (the -v to see what it's doing)\n",
      "summary": "Exec in as www-data and run ./occ groupfolders:scan folder_id -v (the -v to see what it's doing)",
      "date_published": "2023-09-23T12:45:06Z",
      "date_modified": "2023-09-23T12:45:06Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "linux",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/lsof-to-find-what-s-using-your-filesystem/",
      "url": "https://pype.dev/lsof-to-find-what-s-using-your-filesystem/",
      "title": "lsof to find what’s using your filesystem",
      "content_html": "\u003cp\u003elsof | grep /tank/nas shows me what is using my nas at any time!\u003c/p\u003e\n",
      "content_text": "\nlsof | grep /tank/nas shows me what is using my nas at any time!\n",
      "summary": "lsof | grep /tank/nas shows me what is using my nas at any time!",
      "date_published": "2023-04-09T13:32:38Z",
      "date_modified": "2023-04-09T13:32:38Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "zfs",
        "homelab",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/changing-zfs-key-for-child-datasets-of-encrypted-dataset-after-migration/",
      "url": "https://pype.dev/changing-zfs-key-for-child-datasets-of-encrypted-dataset-after-migration/",
      "title": "Changing ZFS key for child datasets of encrypted dataset after migration",
      "content_html": "\u003cp\u003e➜ pihole sudo zfs load-key -L file:///path/to/.zfs.tank.key tank/encrypted/vms/arch-sandbox\n➜ pihole sudo zfs change-key -o keylocation=file:///path/to/.zfs.tank.key -o keyformat=raw tank/encrypted/vms/arch-sandbox\nNeed to load-key for each individual dataset, then change key location to be a file instead of the prompt\u003c/p\u003e\n",
      "content_text": "\n➜ pihole sudo zfs load-key -L file:///path/to/.zfs.tank.key tank/encrypted/vms/arch-sandbox\n➜ pihole sudo zfs change-key -o keylocation=file:///path/to/.zfs.tank.key -o keyformat=raw tank/encrypted/vms/arch-sandbox\nNeed to load-key for each individual dataset, then change key location to be a file instead of the prompt\n",
      "summary": "➜ pihole sudo zfs load-key -L file:///path/to/.zfs.tank.key tank/encrypted/vms/arch-sandbox ➜ pihole sudo zfs change-key -o...",
      "date_published": "2023-04-08T20:12:22Z",
      "date_modified": "2023-04-08T20:12:22Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "zfs",
        "homelab",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/convert-word-doc-to-pdf-with-headless-libreoffice/",
      "url": "https://pype.dev/convert-word-doc-to-pdf-with-headless-libreoffice/",
      "title": "Convert Word Doc to PDF with Headless Libreoffice",
      "content_html": "\u003cp\u003eI\u0026rsquo;ve been using paperless-ngx to manage all my documents, but every once in a while I\u0026rsquo;ll get a \u003ccode\u003e.docx\u003c/code\u003e file to deal with\u0026hellip;\u003c/p\u003e\n\u003cp\u003eTurns out Libreoffice has a headless mode a \u003ccode\u003epdf\u003c/code\u003e converter built-in!\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elibreoffice --headless --convert-to pdf /path/to/file.docx --outdir /path/to/output/directory\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cblockquote\u003e\n\u003cp\u003eNote that \u003ccode\u003e--outdir\u003c/code\u003e is in fact a directory, not the path to a file\u003c/p\u003e\n\u003c/blockquote\u003e\n",
      "content_text": "\nI've been using paperless-ngx to manage all my documents, but every once in a while I'll get a `.docx` file to deal with...\n\nTurns out Libreoffice has a headless mode a `pdf` converter built-in!\n\n```Bash\nlibreoffice --headless --convert-to pdf /path/to/file.docx --outdir /path/to/output/directory\n```\n\n\u003e Note that `--outdir` is in fact a directory, not the path to a file\n",
      "summary": "I've been using paperless-ngx to manage all my documents, but every once in a while I'll get a file to deal with...",
      "date_published": "2023-03-09T06:48:38Z",
      "date_modified": "2023-03-09T06:48:38Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "linux",
        "cli",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/olivet-mens-group-james-2023/",
      "url": "https://pype.dev/olivet-mens-group-james-2023/",
      "title": "olivet-mens-group-james-2023",
      "content_html": "\u003c!-- markdownlint-disable MD025 MD013 --\u003e\n\u003ch1 id=\"james\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eJames\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003e2023 study of the book of James\u003c/p\u003e\n\u003ch2 id=\"bp\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBP\u003c/span\u003e \u003ca href=\"#bp\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"the-guy\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThe Guy\u003c/span\u003e \u003ca href=\"#the-guy\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eGreek: Iakobos (Jacob in English)\u003c/p\u003e\n\u003cp\u003eJacob is one of Jesus\u0026rsquo; half-brothers who became a leader of the Jerusalem church post-resurrection\u003c/p\u003e\n\u003cp\u003eThe book of James is the legacy of this Jacob\u0026rsquo;s wisdom which was heavily influenced by two things:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eSermon on the Mount / Matthew 5-7\u003c/li\u003e\n\u003cli\u003eProverbs - expecially chapters 1-9\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"summary\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSummary\u003c/span\u003e \u003ca href=\"#summary\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThese are short challenging wisdom speeches full of metaphors and one-liners\u0026hellip; Live in a wise way, submitting to Jesus\u003c/p\u003e\n\u003cp\u003eChapters 2-5 teach about wholehearted devotion to Jesus - there are 12 teachings total\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003esection\u003c/th\u003e\n\u003cth\u003esummary\u003c/th\u003e\n\u003cth\u003esource\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e2:1-13\u003c/td\u003e\n\u003ctd\u003efavoritism vs love\u003c/td\u003e\n\u003ctd\u003e(Matthew 5:46-48)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2:14-26\u003c/td\u003e\n\u003ctd\u003egenuine faith\u003c/td\u003e\n\u003ctd\u003e(Matthew 7:21-27)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003eteaching about words\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e3:1-12\u003c/td\u003e\n\u003ctd\u003ethe tongue\u003c/td\u003e\n\u003ctd\u003e(Luke 6:43-45)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e4:11-12 fm condeming others\u003c/td\u003e\n\u003ctd\u003e(matthew 12:36-37)\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e5:12\u003c/td\u003e\n\u003ctd\u003etelling the truth\u003c/td\u003e\n\u003ctd\u003e(Matthew 5:37)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003ewealth\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e4:13-17\u003c/td\u003e\n\u003ctd\u003earrogance of wealth\u003c/td\u003e\n\u003ctd\u003e(Matthew 6:28-34)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e5:1-6\u003c/td\u003e\n\u003ctd\u003edanger of wealth\u003c/td\u003e\n\u003ctd\u003e(Matthew 6:19-21)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e5:7-11\u003c/td\u003e\n\u003ctd\u003epeace and endurance\u003c/td\u003e\n\u003ctd\u003e(Matthew 24:13)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e5:13-18\u003c/td\u003e\n\u003ctd\u003efaith-filled prayer\u003c/td\u003e\n\u003ctd\u003e(Mathew 21:21-22)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cblockquote\u003e\n\u003cp\u003eOther 4 are in the poster about James on BP\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eChapter 1 the introduction\u003c/p\u003e\n\u003cp\u003e2-4: life\u0026rsquo;s trials produce endurance and can make us \u003cem\u003eperfect\u003c/em\u003e and \u003cem\u003ecomplete\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eperect\u003c/em\u003e is repeated 7 times in the book - it refers to \u0026ldquo;wholeness\u0026rdquo; and integrity.\u003c/p\u003e\n\u003cp\u003eWe are all fractrued and inconsistent people\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eperfect\u003c/em\u003e: Hebrew: Tamim, Greek: Teleios\u003c/p\u003e\n\u003cp\u003e5-8: God gives wisdom to those who ask in faith\u003c/p\u003e\n\u003cp\u003e9-11: povety can force us tot rust on God alone; wealth will pass away\u003c/p\u003e\n\u003cp\u003e12-18: God is generous and gives us new birth through Jesus\u003c/p\u003e\n\u003cp\u003e19-27: Don\u0026rsquo;t just listen to God\u0026rsquo;s word but \u003cem\u003edo\u003c/em\u003e it. It\u0026rsquo;s the Torah of Freedom\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003espeak with love\u003c/li\u003e\n\u003cli\u003eserve the poor\u003c/li\u003e\n\u003cli\u003ebe wholly devoted to God\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"jan-21\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eJan 21\u003c/span\u003e \u003ca href=\"#jan-21\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003eJames 1:1\u003c/p\u003e\n\u003cp\u003eJames, a servant of God and of the Lord Jesus Christ, To the twelve tribes in the Dispersion: Greetings.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eDispersion: διασπορά - same word used by Peter to describe Jesus-followers as exiles\u003c/p\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003eJames 1:2-11\u003c/p\u003e\n\u003cp\u003e2 Count it all joy, my brothers, when you meet trials of various kinds,\n3 for you know that the testing of your faith produces steadfastness. 4 And\nlet steadfastness have its full effect, that you may be perfect and\ncomplete, lacking in nothing.  5 If any of you lacks wisdom, let him ask\nGod, who gives generously to all without reproach, and it will be given\nhim. 6 But let him ask in faith, with no doubting, for the one who doubts\nis like a wave of the sea that is driven and tossed by the wind. 7 For that\nperson must not suppose that he will receive anything from the Lord; 8 he\nis a double-minded man, unstable in all his ways.  9 Let the lowly brother\nboast in his exaltation, 10 and the rich in his humiliation, because like a\nflower of the grass he will pass away. 11 For the sun rises with its\nscorching heat and withers the grass; its flower falls, and its beauty\nperishes. So also will the rich man fade away in the midst of his pursuits.\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"july-15\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eJuly 15\u003c/span\u003e \u003ca href=\"#july-15\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003eMissed several meetings due to unfortunate travel circumstances\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003eJames 3:13-18\u003c/p\u003e\n\u003cp\u003e13 Who is wise and understanding among you? By his good conduct let him\nshow his works in the meekness of wisdom. 14 But if you have bitter jealousy\nand selfish ambition in your hearts, do not boast and be false to the truth.\n15 This is not the wisdom that comes down from above, but is earthly,\nunspiritual, demonic. 16 For where jealousy and selfish ambition exist, there\nwill be disorder and every vile practice. 17 But the wisdom from above is first\npure, then peaceable, gentle, open to reason, full of mercy and good fruits,\nimpartial and sincere. 18 And a harvest of righteousness is sown in peace by\nthose who make peace.\u003c/p\u003e\n\u003cp\u003eThe Holy Bible: English Standard Version (Jas 3:13–18). (2016). Crossway\nBibles.\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"december-16\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDecember 16\u003c/span\u003e \u003ca href=\"#december-16\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003eJames 5:13-20\u003c/p\u003e\n\u003cp\u003e13 Is anyone among you suffering misfortune? He should pray. Is anyone\ncheerful? He should sing praise. 14 Is anyone among you sick? He should\nsummon the elders of the church and they should pray over him, anointing\nhim with olive oil in the name of the Lord. 15 And the prayer of faith will\nsave the one who is sick, and the Lord will raise him up, and if he has\ncommitted sins ⌊he will be forgiven⌋. 16 Therefore confess your sins to one\nanother, and pray for one another, so that you may be healed. The effective\nprayer of a righteous person accomplishes much. 17 Elijah was a human being\nwith the same nature as us, and ⌊he prayed fervently⌋ for it not to rain,\nand it did not rain on the land for three years and six months. 18 And he\nprayed again, and the sky gave rain and the earth produced its fruit.\n19 My brothers, if anyone among you should wander away from the truth and\nsomeone turns him back, 20 he should know that the one who turns a sinner\nback from the error of his way will save that person’s soul from death, and\nwill cover over a great number of sins.\u003c/p\u003e\n\u003c/div\u003e\n\u003ch3 id=\"when-to-pray\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhen to pray\u003c/span\u003e \u003ca href=\"#when-to-pray\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eAll circumstances of life\u003c/li\u003e\n\u003cli\u003eSickness\u003c/li\u003e\n\u003cli\u003eConfession\u003c/li\u003e\n\u003cli\u003eWorking out the will of God\u003c/li\u003e\n\u003cli\u003eRetrieving wandering souls\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eJames ends his letter with prayer because it\u0026rsquo;s an exhortation of the Disapora\nand a life of faith must revolve around prayer\u003c/p\u003e\n\u003cp\u003eFor myself I think I pray in all circumstances, sickness, confession all ok. I\ndo not pray for long periods of time, and don\u0026rsquo;t feel very disiplined, but\nwhenever anything happens, by the Lord\u0026rsquo;s grace I am quick to turn my\nattention to Jesus, and hopefully turn the attention of my wife/kids to Jesus\nas well. Example: a person collapsed at the water park we went to this last\nweekend, Athalia and I were close-ish to that happening, so I told her we\nneeded to stop what we were doing and pray that Jesus would intervene.\u003c/p\u003e\n\u003cp\u003eI confess sin to Jesus but I\u0026rsquo;m not sure what that \u003cstrong\u003eshould\u003c/strong\u003e look like. I\u0026rsquo;ve\ntaken a Brother Lawrence approach to try and quickly confess and move on,\naccepting grace, but I struggle with intentional sinning in this area\u0026hellip; What\nis prayer if I knew what I was doing was wrong?\u003c/p\u003e\n\u003cp\u003eI am not more inclined to pray for suffering, but I think that\u0026rsquo;s because I\u0026rsquo;ve\nvery consciously been trying to pray in good circumstances more often because\nwhen we only pray in suffering that turns prayer into a Santa\u0026rsquo;s wish list\nsituation I think\u0026hellip; yes we need the Lord in suffering, but we display our need\nfor him NOT only in suffering, and if that is true then it begs the question,\nto me anyways, of whether or not the need is truly there\u003c/p\u003e\n\u003ch3 id=\"jc-ryle-s-quote\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eJC Ryle’s quote\u003c/span\u003e \u003ca href=\"#jc-ryle-s-quote\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eI disagree with the dude\u0026rsquo;s quote about the requirement of prayer, but only\nbecause the message is given in a direction that makes prayer look like\nsomething I have to do to get/keep/maintain my salvation\u0026hellip; Yahweh changes his\nchildren\u0026rsquo;s hearts and orients them towards him through prayer - if someone\ndoesn\u0026rsquo;t then I think that just means Yahweh has not worked or has not chosen\nthem, but them calling themselves a Christian is irrelevant, and no amount of\nforcing themselves to pray will change Yahweh\u0026rsquo;s will.\u003c/p\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003eIsaiah 1:6\u003c/p\u003e\n\u003cp\u003eFrom the sole of the foot and up to the head\nthere is no health in it;\nbruise and sore and bleeding wound have not been cleansed,\nand they have not been bound up\nand not softened with the oil.\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003ePsalm 23:5\u003c/p\u003e\n\u003cp\u003e5 You prepare before me a table\nin the presence of my oppressors.\nYou anoint my head with oil;\nmy cup is overflowing.\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003e1 Kings 17:1-16\u003c/p\u003e\n\u003cp\u003e17 Elijah the Tishbite from Tishbe of Gilead said to Ahab, “⌊As Yahweh\nlives⌋, the God of Israel before whom I stand, there shall surely not be\ndew nor rain these years ⌊except by my command⌋.” 2 Then the word of Yahweh\ncame to him, saying, 3 “Go from this place and turn to the east; you must\nhide yourself in the Wadi Kerith ⌊which faces the Jordan⌋. 4 It shall be\nthat you shall drink from the wadi, and I have commanded the crows to\nsustain you there.” 5 So he went and did according to the word of Yahweh.\nHe went and stayed in the Wadi Kerith ⌊which faces the Jordan⌋. 6 The crows\nwere bringing bread and meat in the morning for him and bread and meat in\nthe evening, and he drank from the wadi. 7 It happened ⌊after a while⌋ that\nthe wadi dried up, because there was no rain in the land.\u003c/p\u003e\n\u003cp\u003e8 Then the\nword of Yahweh came to him, saying, 9 “Get up and go to Zarephath which\nbelongs to Sidon and stay there. Look, I have commanded a woman there, a\nwidow, to sustain you.” 10 So he arose and went to Zarephath and came to\nthe gate of the city. There was a widow woman gathering wood, so he called\nto her, and he said, “Please bring a little water for me in a vessel so\nthat I can drink.” 11 She went to fetch it, and he called to her and said,\n“Please bring me a morsel of bread in your hand.” 12 She said, “⌊As Yahweh\nyour God lives⌋, surely I do not have a cake, ⌊but only a handful of flour⌋\nin the jar and a little olive oil in the jug. Here I am gathering a few\npieces of wood, and I will go and prepare it for me and my son, that we\nmight eat it and die.” 13 Elijah said to her, “Don’t be afraid. Go and do\naccording to your word; only make for me a small bread cake from it first,\nand bring it out to me. Make it for yourself and for your son afterward.\n14 For thus says Yahweh, the God of Israel: ‘The jar of flour will not be\nemptied and the jug of olive oil will not run out until the day Yahweh\ngives rain on the surface of the earth.’ ” 15 So she went and did according\nto the word of Elijah; then both she and he ate with her household for many\ndays. 16 The jar of flour was not emptied and the jug of olive oil did not\nrun out, according to the word of Yahweh which he spoke by the hand of\nElijah.\u003c/p\u003e\n\u003c/div\u003e\n",
      "content_text": "\n\u003c!-- markdownlint-disable MD025 MD013 --\u003e\n\n# James\n\n2023 study of the book of James\n\n## BP\n\n### The Guy\n\nGreek: Iakobos (Jacob in English)\n\nJacob is one of Jesus' half-brothers who became a leader of the Jerusalem church post-resurrection\n\nThe book of James is the legacy of this Jacob's wisdom which was heavily influenced by two things:\n\n1. Sermon on the Mount / Matthew 5-7\n2. Proverbs - expecially chapters 1-9\n\n### Summary\n\nThese are short challenging wisdom speeches full of metaphors and one-liners... Live in a wise way, submitting to Jesus\n\nChapters 2-5 teach about wholehearted devotion to Jesus - there are 12 teachings total\n\n| section                     | summary              | source            |\n| --------------------------- | -------------------- | ----------------- |\n| 2:1-13                      | favoritism vs love   | (Matthew 5:46-48) |\n| 2:14-26                     | genuine faith        | (Matthew 7:21-27) |\n|                             | teaching about words |                   |\n| 3:1-12                      | the tongue           | (Luke 6:43-45)    |\n| 4:11-12 fm condeming others | (matthew 12:36-37)   |\n| 5:12                        | telling the truth    | (Matthew 5:37)    |\n|                             | wealth               |                   |\n| 4:13-17                     | arrogance of wealth  | (Matthew 6:28-34) |\n| 5:1-6                       | danger of wealth     | (Matthew 6:19-21) |\n| 5:7-11                      | peace and endurance  | (Matthew 24:13)   |\n| 5:13-18                     | faith-filled prayer  | (Mathew 21:21-22) |\n\n\u003e Other 4 are in the poster about James on BP\n\nChapter 1 the introduction\n\n2-4: life's trials produce endurance and can make us _perfect_ and _complete_\n\n_perect_ is repeated 7 times in the book - it refers to \"wholeness\" and integrity.\n\nWe are all fractrued and inconsistent people\n\n_perfect_: Hebrew: Tamim, Greek: Teleios\n\n5-8: God gives wisdom to those who ask in faith\n\n9-11: povety can force us tot rust on God alone; wealth will pass away\n\n12-18: God is generous and gives us new birth through Jesus\n\n19-27: Don't just listen to God's word but _do_ it. It's the Torah of Freedom\n\n- speak with love\n- serve the poor\n- be wholly devoted to God\n\n## Jan 21\n\n!!! quote \"James 1:1\"\n\n    James, a servant of God and of the Lord Jesus Christ, To the twelve tribes in the Dispersion: Greetings.\n\nDispersion: διασπορά - same word used by Peter to describe Jesus-followers as exiles\n\n!!! quote \"James 1:2-11\"\n\n    2 Count it all joy, my brothers, when you meet trials of various kinds,\n    3 for you know that the testing of your faith produces steadfastness. 4 And\n    let steadfastness have its full effect, that you may be perfect and\n    complete, lacking in nothing.  5 If any of you lacks wisdom, let him ask\n    God, who gives generously to all without reproach, and it will be given\n    him. 6 But let him ask in faith, with no doubting, for the one who doubts\n    is like a wave of the sea that is driven and tossed by the wind. 7 For that\n    person must not suppose that he will receive anything from the Lord; 8 he\n    is a double-minded man, unstable in all his ways.  9 Let the lowly brother\n    boast in his exaltation, 10 and the rich in his humiliation, because like a\n    flower of the grass he will pass away. 11 For the sun rises with its\n    scorching heat and withers the grass; its flower falls, and its beauty\n    perishes. So also will the rich man fade away in the midst of his pursuits.\n\n## July 15\n\n\u003e Missed several meetings due to unfortunate travel circumstances\n\n!!! quote \"James 3:13-18\"\n\n    13 Who is wise and understanding among you? By his good conduct let him\n    show his works in the meekness of wisdom. 14 But if you have bitter jealousy\n    and selfish ambition in your hearts, do not boast and be false to the truth.\n    15 This is not the wisdom that comes down from above, but is earthly,\n    unspiritual, demonic. 16 For where jealousy and selfish ambition exist, there\n    will be disorder and every vile practice. 17 But the wisdom from above is first\n    pure, then peaceable, gentle, open to reason, full of mercy and good fruits,\n    impartial and sincere. 18 And a harvest of righteousness is sown in peace by\n    those who make peace.\n\n    The Holy Bible: English Standard Version (Jas 3:13–18). (2016). Crossway\n    Bibles.\n\n## December 16\n\n!!! quote \"James 5:13-20\"\n\n    13 Is anyone among you suffering misfortune? He should pray. Is anyone\n    cheerful? He should sing praise. 14 Is anyone among you sick? He should\n    summon the elders of the church and they should pray over him, anointing\n    him with olive oil in the name of the Lord. 15 And the prayer of faith will\n    save the one who is sick, and the Lord will raise him up, and if he has\n    committed sins ⌊he will be forgiven⌋. 16 Therefore confess your sins to one\n    another, and pray for one another, so that you may be healed. The effective\n    prayer of a righteous person accomplishes much. 17 Elijah was a human being\n    with the same nature as us, and ⌊he prayed fervently⌋ for it not to rain,\n    and it did not rain on the land for three years and six months. 18 And he\n    prayed again, and the sky gave rain and the earth produced its fruit.\n    19 My brothers, if anyone among you should wander away from the truth and\n    someone turns him back, 20 he should know that the one who turns a sinner\n    back from the error of his way will save that person’s soul from death, and\n    will cover over a great number of sins.\n\n### When to pray\n\n1. All circumstances of life\n2. Sickness\n3. Confession\n4. Working out the will of God\n5. Retrieving wandering souls\n\nJames ends his letter with prayer because it's an exhortation of the Disapora\nand a life of faith must revolve around prayer\n\nFor myself I think I pray in all circumstances, sickness, confession all ok. I\ndo not pray for long periods of time, and don't feel very disiplined, but\nwhenever anything happens, by the Lord's grace I am quick to turn my\nattention to Jesus, and hopefully turn the attention of my wife/kids to Jesus\nas well. Example: a person collapsed at the water park we went to this last\nweekend, Athalia and I were close-ish to that happening, so I told her we\nneeded to stop what we were doing and pray that Jesus would intervene.\n\nI confess sin to Jesus but I'm not sure what that **should** look like. I've\ntaken a Brother Lawrence approach to try and quickly confess and move on,\naccepting grace, but I struggle with intentional sinning in this area... What\nis prayer if I knew what I was doing was wrong?\n\nI am not more inclined to pray for suffering, but I think that's because I've\nvery consciously been trying to pray in good circumstances more often because\nwhen we only pray in suffering that turns prayer into a Santa's wish list\nsituation I think... yes we need the Lord in suffering, but we display our need\nfor him NOT only in suffering, and if that is true then it begs the question,\nto me anyways, of whether or not the need is truly there\n\n### JC Ryle's quote\n\nI disagree with the dude's quote about the requirement of prayer, but only\nbecause the message is given in a direction that makes prayer look like\nsomething I have to do to get/keep/maintain my salvation... Yahweh changes his\nchildren's hearts and orients them towards him through prayer - if someone\ndoesn't then I think that just means Yahweh has not worked or has not chosen\nthem, but them calling themselves a Christian is irrelevant, and no amount of\nforcing themselves to pray will change Yahweh's will.\n\n!!! quote \"Isaiah 1:6\"\n\n    From the sole of the foot and up to the head\n    there is no health in it;\n    bruise and sore and bleeding wound have not been cleansed,\n    and they have not been bound up\n    and not softened with the oil.\n\n!!! quote \"Psalm 23:5\"\n\n    5 You prepare before me a table\n    in the presence of my oppressors.\n    You anoint my head with oil;\n    my cup is overflowing.\n\n!!! quote \"1 Kings 17:1-16\"\n\n    17 Elijah the Tishbite from Tishbe of Gilead said to Ahab, “⌊As Yahweh\n    lives⌋, the God of Israel before whom I stand, there shall surely not be\n    dew nor rain these years ⌊except by my command⌋.” 2 Then the word of Yahweh\n    came to him, saying, 3 “Go from this place and turn to the east; you must\n    hide yourself in the Wadi Kerith ⌊which faces the Jordan⌋. 4 It shall be\n    that you shall drink from the wadi, and I have commanded the crows to\n    sustain you there.” 5 So he went and did according to the word of Yahweh.\n    He went and stayed in the Wadi Kerith ⌊which faces the Jordan⌋. 6 The crows\n    were bringing bread and meat in the morning for him and bread and meat in\n    the evening, and he drank from the wadi. 7 It happened ⌊after a while⌋ that\n    the wadi dried up, because there was no rain in the land.\n\n    8 Then the\n    word of Yahweh came to him, saying, 9 “Get up and go to Zarephath which\n    belongs to Sidon and stay there. Look, I have commanded a woman there, a\n    widow, to sustain you.” 10 So he arose and went to Zarephath and came to\n    the gate of the city. There was a widow woman gathering wood, so he called\n    to her, and he said, “Please bring a little water for me in a vessel so\n    that I can drink.” 11 She went to fetch it, and he called to her and said,\n    “Please bring me a morsel of bread in your hand.” 12 She said, “⌊As Yahweh\n    your God lives⌋, surely I do not have a cake, ⌊but only a handful of flour⌋\n    in the jar and a little olive oil in the jug. Here I am gathering a few\n    pieces of wood, and I will go and prepare it for me and my son, that we\n    might eat it and die.” 13 Elijah said to her, “Don’t be afraid. Go and do\n    according to your word; only make for me a small bread cake from it first,\n    and bring it out to me. Make it for yourself and for your son afterward.\n    14 For thus says Yahweh, the God of Israel: ‘The jar of flour will not be\n    emptied and the jug of olive oil will not run out until the day Yahweh\n    gives rain on the surface of the earth.’ ” 15 So she went and did according\n    to the word of Elijah; then both she and he ate with her household for many\n    days. 16 The jar of flour was not emptied and the jug of olive oil did not\n    run out, according to the word of Yahweh which he spoke by the hand of\n    Elijah.\n",
      "date_published": "2023-01-21T06:06:31Z",
      "date_modified": "2023-01-21T06:06:31Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "olivet",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/ffmpeg-10-bit-videos-to-8-bit/",
      "url": "https://pype.dev/ffmpeg-10-bit-videos-to-8-bit/",
      "title": "FFMPEG 10-bit videos to 8-bit",
      "content_html": "\u003cp\u003e\u003ccode\u003effmpeg -i input.mp4 -map 0 -c:v libx264 -vf format=yuv420p -c:a copy output.mp4\u003c/code\u003e\u003c/p\u003e\n",
      "content_text": "\n`ffmpeg -i input.mp4 -map 0 -c:v libx264 -vf format=yuv420p -c:a copy output.mp4`\n",
      "date_published": "2023-01-16T13:15:53Z",
      "date_modified": "2023-01-16T13:15:53Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "cli",
        "homelab",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/i3-like-keyboard-mapping-in-pop-os/",
      "url": "https://pype.dev/i3-like-keyboard-mapping-in-pop-os/",
      "title": "i3-Like keyboard mapping in Pop_OS",
      "content_html": "\u003cp\u003eI was introduced to tiling window managers through i3, which I use heavily on\none of my machines. I have switched to Pop_OS! at home though, which has a\ntiling window mode but the keybindings are not what I\u0026rsquo;m used to for i3. I\nwanted to at least navigate workspaces how I\u0026rsquo;m used to doing (cause I set\nworkspace 3 for communication apps, 1 for my terminal, etc\u0026hellip;)\u003c/p\u003e\n\u003cp\u003eHere\u0026rsquo;s how I set keybindings for:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e\u0026lt;Super\u0026gt; + \u0026lt;number\u0026gt;\u003c/code\u003e sends me to that numbered workspace\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e\u0026lt;Shift\u0026gt; + \u0026lt;Super\u0026gt; + \u0026lt;number\u0026gt;\u003c/code\u003e moves the window I\u0026rsquo;m focused on to workspace \u003ccode\u003enumber\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#!/bin/bash\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egsettings \u003cspan class=\"nb\"\u003eset\u003c/span\u003e org.gnome.mutter dynamic-workspaces \u003cspan class=\"nb\"\u003efalse\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egsettings \u003cspan class=\"nb\"\u003eset\u003c/span\u003e org.gnome.desktop.wm.preferences num-workspaces \u003cspan class=\"m\"\u003e8\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egsettings \u003cspan class=\"nb\"\u003eset\u003c/span\u003e org.gnome.shell.keybindings switch-to-application-1 \u003cspan class=\"o\"\u003e[]\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egsettings \u003cspan class=\"nb\"\u003eset\u003c/span\u003e org.gnome.shell.keybindings switch-to-application-2 \u003cspan class=\"o\"\u003e[]\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egsettings \u003cspan class=\"nb\"\u003eset\u003c/span\u003e org.gnome.shell.keybindings switch-to-application-3 \u003cspan class=\"o\"\u003e[]\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egsettings \u003cspan class=\"nb\"\u003eset\u003c/span\u003e org.gnome.shell.keybindings switch-to-application-4 \u003cspan class=\"o\"\u003e[]\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egsettings \u003cspan class=\"nb\"\u003eset\u003c/span\u003e org.gnome.shell.keybindings switch-to-application-5 \u003cspan class=\"o\"\u003e[]\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egsettings \u003cspan class=\"nb\"\u003eset\u003c/span\u003e org.gnome.shell.keybindings switch-to-application-6 \u003cspan class=\"o\"\u003e[]\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egsettings \u003cspan class=\"nb\"\u003eset\u003c/span\u003e org.gnome.shell.keybindings switch-to-application-7 \u003cspan class=\"o\"\u003e[]\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egsettings \u003cspan class=\"nb\"\u003eset\u003c/span\u003e org.gnome.shell.keybindings switch-to-application-8 \u003cspan class=\"o\"\u003e[]\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egsettings \u003cspan class=\"nb\"\u003eset\u003c/span\u003e org.gnome.shell.keybindings switch-to-application-9 \u003cspan class=\"o\"\u003e[]\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egsettings \u003cspan class=\"nb\"\u003eset\u003c/span\u003e org.gnome.desktop.wm.keybindings switch-to-workspace-1 \u003cspan class=\"s2\"\u003e\u0026#34;[\u0026#39;\u0026lt;Super\u0026gt;1\u0026#39;]\u0026#34;\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egsettings \u003cspan class=\"nb\"\u003eset\u003c/span\u003e org.gnome.desktop.wm.keybindings switch-to-workspace-2 \u003cspan class=\"s2\"\u003e\u0026#34;[\u0026#39;\u0026lt;Super\u0026gt;2\u0026#39;]\u0026#34;\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egsettings \u003cspan class=\"nb\"\u003eset\u003c/span\u003e org.gnome.desktop.wm.keybindings switch-to-workspace-3 \u003cspan class=\"s2\"\u003e\u0026#34;[\u0026#39;\u0026lt;Super\u0026gt;3\u0026#39;]\u0026#34;\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egsettings \u003cspan class=\"nb\"\u003eset\u003c/span\u003e org.gnome.desktop.wm.keybindings switch-to-workspace-4 \u003cspan class=\"s2\"\u003e\u0026#34;[\u0026#39;\u0026lt;Super\u0026gt;4\u0026#39;]\u0026#34;\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egsettings \u003cspan class=\"nb\"\u003eset\u003c/span\u003e org.gnome.desktop.wm.keybindings switch-to-workspace-5 \u003cspan class=\"s2\"\u003e\u0026#34;[\u0026#39;\u0026lt;Super\u0026gt;5\u0026#39;]\u0026#34;\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egsettings \u003cspan class=\"nb\"\u003eset\u003c/span\u003e org.gnome.desktop.wm.keybindings switch-to-workspace-6 \u003cspan class=\"s2\"\u003e\u0026#34;[\u0026#39;\u0026lt;Super\u0026gt;6\u0026#39;]\u0026#34;\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egsettings \u003cspan class=\"nb\"\u003eset\u003c/span\u003e org.gnome.desktop.wm.keybindings switch-to-workspace-7 \u003cspan class=\"s2\"\u003e\u0026#34;[\u0026#39;\u0026lt;Super\u0026gt;7\u0026#39;]\u0026#34;\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egsettings \u003cspan class=\"nb\"\u003eset\u003c/span\u003e org.gnome.desktop.wm.keybindings switch-to-workspace-8 \u003cspan class=\"s2\"\u003e\u0026#34;[\u0026#39;\u0026lt;Super\u0026gt;8\u0026#39;]\u0026#34;\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egsettings \u003cspan class=\"nb\"\u003eset\u003c/span\u003e org.gnome.desktop.wm.keybindings switch-to-workspace-9 \u003cspan class=\"s2\"\u003e\u0026#34;[\u0026#39;\u0026lt;Super\u0026gt;9\u0026#39;]\u0026#34;\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egsettings \u003cspan class=\"nb\"\u003eset\u003c/span\u003e org.gnome.desktop.wm.keybindings switch-to-workspace-10 \u003cspan class=\"s2\"\u003e\u0026#34;[\u0026#39;\u0026lt;Super\u0026gt;0\u0026#39;]\u0026#34;\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egsettings \u003cspan class=\"nb\"\u003eset\u003c/span\u003e org.gnome.desktop.wm.keybindings move-to-workspace-1 \u003cspan class=\"s2\"\u003e\u0026#34;[\u0026#39;\u0026lt;Super\u0026gt;\u0026lt;Shift\u0026gt;1\u0026#39;]\u0026#34;\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egsettings \u003cspan class=\"nb\"\u003eset\u003c/span\u003e org.gnome.desktop.wm.keybindings move-to-workspace-2 \u003cspan class=\"s2\"\u003e\u0026#34;[\u0026#39;\u0026lt;Super\u0026gt;\u0026lt;Shift\u0026gt;2\u0026#39;]\u0026#34;\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egsettings \u003cspan class=\"nb\"\u003eset\u003c/span\u003e org.gnome.desktop.wm.keybindings move-to-workspace-3 \u003cspan class=\"s2\"\u003e\u0026#34;[\u0026#39;\u0026lt;Super\u0026gt;\u0026lt;Shift\u0026gt;3\u0026#39;]\u0026#34;\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egsettings \u003cspan class=\"nb\"\u003eset\u003c/span\u003e org.gnome.desktop.wm.keybindings move-to-workspace-4 \u003cspan class=\"s2\"\u003e\u0026#34;[\u0026#39;\u0026lt;Super\u0026gt;\u0026lt;Shift\u0026gt;4\u0026#39;]\u0026#34;\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egsettings \u003cspan class=\"nb\"\u003eset\u003c/span\u003e org.gnome.desktop.wm.keybindings move-to-workspace-5 \u003cspan class=\"s2\"\u003e\u0026#34;[\u0026#39;\u0026lt;Super\u0026gt;\u0026lt;Shift\u0026gt;5\u0026#39;]\u0026#34;\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egsettings \u003cspan class=\"nb\"\u003eset\u003c/span\u003e org.gnome.desktop.wm.keybindings move-to-workspace-6 \u003cspan class=\"s2\"\u003e\u0026#34;[\u0026#39;\u0026lt;Super\u0026gt;\u0026lt;Shift\u0026gt;6\u0026#39;]\u0026#34;\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egsettings \u003cspan class=\"nb\"\u003eset\u003c/span\u003e org.gnome.desktop.wm.keybindings move-to-workspace-7 \u003cspan class=\"s2\"\u003e\u0026#34;[\u0026#39;\u0026lt;Super\u0026gt;\u0026lt;Shift\u0026gt;7\u0026#39;]\u0026#34;\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egsettings \u003cspan class=\"nb\"\u003eset\u003c/span\u003e org.gnome.desktop.wm.keybindings move-to-workspace-8 \u003cspan class=\"s2\"\u003e\u0026#34;[\u0026#39;\u0026lt;Super\u0026gt;\u0026lt;Shift\u0026gt;8\u0026#39;]\u0026#34;\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egsettings \u003cspan class=\"nb\"\u003eset\u003c/span\u003e org.gnome.desktop.wm.keybindings move-to-workspace-9 \u003cspan class=\"s2\"\u003e\u0026#34;[\u0026#39;\u0026lt;Super\u0026gt;\u0026lt;Shift\u0026gt;9\u0026#39;]\u0026#34;\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egsettings \u003cspan class=\"nb\"\u003eset\u003c/span\u003e org.gnome.desktop.wm.keybindings move-to-workspace-10 \u003cspan class=\"s2\"\u003e\u0026#34;[\u0026#39;\u0026lt;Super\u0026gt;\u0026lt;Shift\u0026gt;0\u0026#39;]\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nI was introduced to tiling window managers through i3, which I use heavily on\none of my machines. I have switched to Pop_OS! at home though, which has a\ntiling window mode but the keybindings are not what I'm used to for i3. I\nwanted to at least navigate workspaces how I'm used to doing (cause I set\nworkspace 3 for communication apps, 1 for my terminal, etc...)\n\nHere's how I set keybindings for:\n\n* `\u003cSuper\u003e + \u003cnumber\u003e` sends me to that numbered workspace\n* `\u003cShift\u003e + \u003cSuper\u003e + \u003cnumber\u003e` moves the window I'm focused on to workspace `number`\n\n```bash\n#!/bin/bash\ngsettings set org.gnome.mutter dynamic-workspaces false \ngsettings set org.gnome.desktop.wm.preferences num-workspaces 8 \ngsettings set org.gnome.shell.keybindings switch-to-application-1 [] \ngsettings set org.gnome.shell.keybindings switch-to-application-2 [] \ngsettings set org.gnome.shell.keybindings switch-to-application-3 [] \ngsettings set org.gnome.shell.keybindings switch-to-application-4 [] \ngsettings set org.gnome.shell.keybindings switch-to-application-5 [] \ngsettings set org.gnome.shell.keybindings switch-to-application-6 [] \ngsettings set org.gnome.shell.keybindings switch-to-application-7 [] \ngsettings set org.gnome.shell.keybindings switch-to-application-8 [] \ngsettings set org.gnome.shell.keybindings switch-to-application-9 [] \ngsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-1 \"['\u003cSuper\u003e1']\" \ngsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-2 \"['\u003cSuper\u003e2']\" \ngsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-3 \"['\u003cSuper\u003e3']\" \ngsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-4 \"['\u003cSuper\u003e4']\" \ngsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-5 \"['\u003cSuper\u003e5']\" \ngsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-6 \"['\u003cSuper\u003e6']\" \ngsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-7 \"['\u003cSuper\u003e7']\" \ngsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-8 \"['\u003cSuper\u003e8']\" \ngsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-9 \"['\u003cSuper\u003e9']\" \ngsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-10 \"['\u003cSuper\u003e0']\" \ngsettings set org.gnome.desktop.wm.keybindings move-to-workspace-1 \"['\u003cSuper\u003e\u003cShift\u003e1']\" \ngsettings set org.gnome.desktop.wm.keybindings move-to-workspace-2 \"['\u003cSuper\u003e\u003cShift\u003e2']\" \ngsettings set org.gnome.desktop.wm.keybindings move-to-workspace-3 \"['\u003cSuper\u003e\u003cShift\u003e3']\" \ngsettings set org.gnome.desktop.wm.keybindings move-to-workspace-4 \"['\u003cSuper\u003e\u003cShift\u003e4']\" \ngsettings set org.gnome.desktop.wm.keybindings move-to-workspace-5 \"['\u003cSuper\u003e\u003cShift\u003e5']\" \ngsettings set org.gnome.desktop.wm.keybindings move-to-workspace-6 \"['\u003cSuper\u003e\u003cShift\u003e6']\" \ngsettings set org.gnome.desktop.wm.keybindings move-to-workspace-7 \"['\u003cSuper\u003e\u003cShift\u003e7']\" \ngsettings set org.gnome.desktop.wm.keybindings move-to-workspace-8 \"['\u003cSuper\u003e\u003cShift\u003e8']\" \ngsettings set org.gnome.desktop.wm.keybindings move-to-workspace-9 \"['\u003cSuper\u003e\u003cShift\u003e9']\" \ngsettings set org.gnome.desktop.wm.keybindings move-to-workspace-10 \"['\u003cSuper\u003e\u003cShift\u003e0']\"\n```\n",
      "summary": "I was introduced to tiling window managers through i3, which I use heavily on one of my machines. I have switched to Pop_OS! at home though, which has a...",
      "date_published": "2023-01-12T05:51:25Z",
      "date_modified": "2023-01-12T05:51:25Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "linux",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/use-non-standard-named-ssh-keys-with-github/",
      "url": "https://pype.dev/use-non-standard-named-ssh-keys-with-github/",
      "title": "Use non-standard named ssh keys with github",
      "content_html": "\u003cp\u003eI was getting \u003ccode\u003e(publickey denied)\u003c/code\u003e when trying to push to GH using ssh. When I\ntested the connection I saw that a bunch of keys in ``~/.ssh/ were being\nattempted\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003e✗ ssh git@github.com -vv\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003e...\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003edebug1: Will attempt key: /home/nic/.ssh/id_rsa \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003edebug1: Will attempt key: /home/nic/.ssh/id_ecdsa \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003edebug1: Will attempt key: /home/nic/.ssh/id_ecdsa_sk \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003edebug1: Will attempt key: /home/nic/.ssh/id_ed25519 \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003edebug1: Will attempt key: /home/nic/.ssh/id_ed25519_sk \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003edebug1: Will attempt key: /home/nic/.ssh/id_xmss \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003edebug1: Will attempt key: /home/nic/.ssh/id_dsa \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003e...\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003edebug1: No more authentication methods to try.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003egit@github.com: Permission denied (publickey).\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNone of those were the key I setup with GH. So I added an entry\ninto \u003ccode\u003e~/.ssh/config\u003c/code\u003e:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHost\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egithub.com\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUser git\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePort 22\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHostname github.com\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eIdentityFile ~/.ssh/my_custom_github_key\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eTCPKeepAlive yes\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eIdentitiesOnly yes \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 was getting `(publickey denied)` when trying to push to GH using ssh. When I\ntested the connection I saw that a bunch of keys in ``~/.ssh/ were being\nattempted\n\n```console\n✗ ssh git@github.com -vv\n\n...\n\ndebug1: Will attempt key: /home/nic/.ssh/id_rsa \ndebug1: Will attempt key: /home/nic/.ssh/id_ecdsa \ndebug1: Will attempt key: /home/nic/.ssh/id_ecdsa_sk \ndebug1: Will attempt key: /home/nic/.ssh/id_ed25519 \ndebug1: Will attempt key: /home/nic/.ssh/id_ed25519_sk \ndebug1: Will attempt key: /home/nic/.ssh/id_xmss \ndebug1: Will attempt key: /home/nic/.ssh/id_dsa \n\n...\n\ndebug1: No more authentication methods to try.\ngit@github.com: Permission denied (publickey).\n\n```\n\nNone of those were the key I setup with GH. So I added an entry\ninto `~/.ssh/config`:\n\n```text\nHost\ngithub.com\nUser git\nPort 22\nHostname github.com\nIdentityFile ~/.ssh/my_custom_github_key\nTCPKeepAlive yes\nIdentitiesOnly yes \n\n```\n\n",
      "summary": "I was getting when trying to push to GH using ssh. When I tested the connection I saw that a bunch of keys in ``~/.ssh/ were being attempted",
      "date_published": "2023-01-03T08:34:50Z",
      "date_modified": "2023-01-03T08:34:50Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "linux",
        "cli",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/reminder-about-ssh-copy-id-for-ssh-and-ansible/",
      "url": "https://pype.dev/reminder-about-ssh-copy-id-for-ssh-and-ansible/",
      "title": "Reminder about ssh-copy-id for SSH and Ansible",
      "content_html": "\u003cp\u003e\u003ccode\u003essh-copy-id -i my.key.pub \u0026lt;hostname probably from tailscale\u0026gt;\u003c/code\u003e\nthis makes sure I can run ansible from my desktop against VMs on my server\neasily if they have tailscale for the hostname - otherwise use the IP\u003c/p\u003e\n",
      "content_text": "\n`ssh-copy-id -i my.key.pub \u003chostname probably from tailscale\u003e` \nthis makes sure I can run ansible from my desktop against VMs on my server\neasily if they have tailscale for the hostname - otherwise use the IP\n",
      "summary": "this makes sure I can run ansible from my desktop against VMs on my server easily if they have tailscale for the hostname - otherwise use the IP",
      "date_published": "2022-12-28T13:33:07Z",
      "date_modified": "2022-12-28T13:33:07Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "linux",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/systemd-timer-for-syncoid/",
      "url": "https://pype.dev/systemd-timer-for-syncoid/",
      "title": "Systemd timer for syncoid",
      "content_html": "\u003cp\u003eI have a bash script called \u003ccode\u003esyncoid-job\u003c/code\u003e which boils down to a barebones -\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#!/bin/bash\n\u003c/span\u003e\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\"\u003esyncoid --no-sync-snap --sendoptions\u003cspan class=\"o\"\u003e=\u003c/span\u003ew --no-privilege-elevation \u003cspan class=\"nv\"\u003e$SYNOIC_USER\u003c/span\u003e@\u003cspan class=\"nv\"\u003e$SERVER\u003c/span\u003e:tank/encrypted/nas tank/encrypted/nas\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eI want to run this script hourly but as my user (notice the no-privilege-elevation flag)\u003c/p\u003e\n\u003cp\u003eFirst - create a systemd unit file at \u003ccode\u003e/etc/systemd/system/syncoid-replication.service\u003c/code\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e[\u003c/span\u003eUnit\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eDescription\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003eZFS Replication With Syncoid\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=\"o\"\u003e[\u003c/span\u003eService\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eType\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003eoneshot\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eExecStart\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e/\u003cspan class=\"nv\"\u003e$HOME\u003c/span\u003e/dotfiles/syncoid-job\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eUser\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"nv\"\u003e$USER\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eGroup\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"nv\"\u003e$GROUP\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=\"o\"\u003e[\u003c/span\u003eInstall\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eWantedBy\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003emulti-user.target\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\u003eThen we save the unit file, enable the service, and then start it\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esystemctl enable syncoid-replication.service\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esystemctl start syncoid-replication.service\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cblockquote\u003e\n\u003cp\u003eNote this will run that script\u0026hellip; so be ready for syncoid to do its thing\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eNow for the timer\u0026hellip; We create \u003ccode\u003e/etc/systemd/system/syncoid-replication.timer\u003c/code\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e[\u003c/span\u003eUnit\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eDescription\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003eRun syncoid-replication every hour\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=\"o\"\u003e[\u003c/span\u003eTimer\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eOnCalendar\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ehourly\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=\"o\"\u003e[\u003c/span\u003eInstall\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eWantedBy\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003etimers.target\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\u003eHit it with a \u003ccode\u003esystemctl enable syncoid-replication.timer\u003c/code\u003e and you\u0026rsquo;re in business!\u003c/p\u003e\n",
      "content_text": "\nI have a bash script called `syncoid-job` which boils down to a barebones - \n\n```bash\n#!/bin/bash\n\nsyncoid --no-sync-snap --sendoptions=w --no-privilege-elevation $SYNOIC_USER@$SERVER:tank/encrypted/nas tank/encrypted/nas\n```\n\nI want to run this script hourly but as my user (notice the no-privilege-elevation flag)\n\nFirst - create a systemd unit file at `/etc/systemd/system/syncoid-replication.service`\n\n```bash\n[Unit]\nDescription=ZFS Replication With Syncoid\n\n[Service]\nType=oneshot\nExecStart=/$HOME/dotfiles/syncoid-job\nUser=$USER\nGroup=$GROUP\n\n[Install]\nWantedBy=multi-user.target\n\n```\n\nThen we save the unit file, enable the service, and then start it\n\n```console\nsystemctl enable syncoid-replication.service\nsystemctl start syncoid-replication.service\n\n```\n\n\u003e Note this will run that script... so be ready for syncoid to do its thing\n\nNow for the timer... We create `/etc/systemd/system/syncoid-replication.timer`\n\n```bash\n[Unit]\nDescription=Run syncoid-replication every hour\n\n[Timer]\nOnCalendar=hourly\n\n[Install]\nWantedBy=timers.target\n\n```\n\nHit it with a `systemctl enable syncoid-replication.timer` and you're in business!\n",
      "summary": "I have a bash script called which boils down to a barebones -",
      "date_published": "2022-12-21T11:38:27Z",
      "date_modified": "2022-12-21T11:38:27Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "zfs",
        "homelab",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/adding-docker-daemon-json-broke-docker/",
      "url": "https://pype.dev/adding-docker-daemon-json-broke-docker/",
      "title": "Adding docker daemon.json broke docker",
      "content_html": "\u003cp\u003ein /lib/systemd/system/docker.service there is an ExecStart command that got placed there when I setup Docker with Ansible - it threw the -H flag which told the daemon what hosts to setup. But I added the \u0026ldquo;hosts\u0026rdquo; key in my daemon.json and it broke - so removing the -H flag from the systemd unit fixed it\u003c/p\u003e\n",
      "content_text": "\nin /lib/systemd/system/docker.service there is an ExecStart command that got placed there when I setup Docker with Ansible - it threw the -H flag which told the daemon what hosts to setup. But I added the \"hosts\" key in my daemon.json and it broke - so removing the -H flag from the systemd unit fixed it\n",
      "summary": "in /lib/systemd/system/docker.service there is an ExecStart command that got placed there when I setup Docker with Ansible - it threw the -H flag which told...",
      "date_published": "2022-12-21T10:02:25Z",
      "date_modified": "2022-12-21T10:02:25Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "linux",
        "tech",
        "docker",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/suda-vim-for-sudo-access-to-files/",
      "url": "https://pype.dev/suda-vim-for-sudo-access-to-files/",
      "title": "suda.vim for sudo access to files",
      "content_html": "\u003cp\u003eI regularly need to edit system config files - take /etc/sanoid/sanoid.conf as\nan example\u0026hellip; I\u0026rsquo;ll want to play with something but if I don\u0026rsquo;t start Neovim as\nroot then I get in trouble making edits I can\u0026rsquo;t save! So\n\u003ca href=\"https://github.com/lambdalisue/suda.vim\"\u003esuda.vim\u003c/a\u003e gives me\n\u003ccode\u003e:SudaWrite\u003c/code\u003e which let\u0026rsquo;s me write that buffer with sudo privileges even though\nI\u0026rsquo;m Neovim is running with my login user!\u003c/p\u003e\n",
      "content_text": "\nI regularly need to edit system config files - take /etc/sanoid/sanoid.conf as\nan example... I'll want to play with something but if I don't start Neovim as\nroot then I get in trouble making edits I can't save! So\n[suda.vim](https://github.com/lambdalisue/suda.vim) gives me\n`:SudaWrite` which let's me write that buffer with sudo privileges even though\nI'm Neovim is running with my login user!\n",
      "summary": "I regularly need to edit system config files - take /etc/sanoid/sanoid.conf as an example... I'll want to play with something but if I don't start Neovim as...",
      "date_published": "2022-12-21T09:45:34Z",
      "date_modified": "2022-12-21T09:45:34Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "vim",
        "linux",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/pipe-to-a-pager-to-preserve-console-output-in-ssh-session/",
      "url": "https://pype.dev/pipe-to-a-pager-to-preserve-console-output-in-ssh-session/",
      "title": "Pipe to a pager to preserve console output in SSH session",
      "content_html": "\u003cp\u003eI\u0026rsquo;m playing with my ansible playbook in a remote tmux session, and I\u0026rsquo;m no wiz\nso I don\u0026rsquo;t know the ins and outs, but I can\u0026rsquo;t scroll up to get any console log\noutput that\u0026rsquo;s not already visible on my screen. So I\u0026rsquo;m starting to end my\ncommands with \u003ccode\u003e | less\u003c/code\u003e so I can page through the console output!\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eansible-playbook plays.yml -v --tags mytag | less\u003c/code\u003e\u003c/p\u003e\n",
      "content_text": "\nI'm playing with my ansible playbook in a remote tmux session, and I'm no wiz\nso I don't know the ins and outs, but I can't scroll up to get any console log\noutput that's not already visible on my screen. So I'm starting to end my\ncommands with ` | less` so I can page through the console output!\n\n`ansible-playbook plays.yml -v --tags mytag | less`\n",
      "summary": "I'm playing with my ansible playbook in a remote tmux session, and I'm no wiz so I don't know the ins and outs, but I can't scroll up to get any console log...",
      "date_published": "2022-12-18T15:04:02Z",
      "date_modified": "2022-12-18T15:04:02Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "linux",
        "cli",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/cron-for-nextcloud-in-docker/",
      "url": "https://pype.dev/cron-for-nextcloud-in-docker/",
      "title": "Cron for Nextcloud in Docker",
      "content_html": "\u003cp\u003eAJAX wasn\u0026rsquo;t cutting it, traditional crontab in containers doesn\u0026rsquo;t make much\nsense to me, webcron is recommended but I don\u0026rsquo;t want to register with anything\noutside my LAN\u0026hellip; Turns out you can just spin up an identical container with a\ndifferent entrypoint to /cron.sh that does what you need!\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eNote that this is a task in an Ansible playbook - but the docker-compose is straight forward\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eSo the only thing you need to make sure of is that \u003cem\u003eall\u003c/em\u003e the configuration\noptions - data volumes, user permissions, etc. are \u003cem\u003eidentical\u003c/em\u003e between the\ncontainers running the cron job and the one actually hosting NextCloud. This\nensures that the container running cron has proper access to the database and\nfilesystem - or at least the same access as NextCloud proper.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e- \u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eNextcloud Cron Docker Container\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\"\u003edocker_container\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\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003enextcloud-cron\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\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ nextcloud_image }}\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=\"nt\"\u003epull\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\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\"\u003elinks\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\"\u003enextcloud-mysql:mysql\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\"\u003eentrypoint\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e/cron.sh\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\"\u003evolumes\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=\"s2\"\u003e\u0026#34;{{ nextcloud_data_directory }}/nextcloud:/var/www/html:rw\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=\"nt\"\u003eenv\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\"\u003eMYSQL_HOST\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;mysql\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=\"nt\"\u003eMYSQL_DATABASE\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;nextcloud\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=\"nt\"\u003eMYSQL_USER\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ nextcloud_sql_user }}\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=\"nt\"\u003eMYSQL_PASSWORD\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ nextcloud_sql_password }}\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=\"nt\"\u003eNEXTCLOUD_TRUSTED_DOMAINS\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ nextcloud_hostname }}.{{ ansible_nas_domain }}\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=\"nt\"\u003ePUID\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ nextcloud_user_id }}\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=\"nt\"\u003ePGID\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ nextcloud_group_id }}\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=\"nt\"\u003eTZ\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ ansible_nas_timezone }}\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=\"nt\"\u003erestart_policy\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eunless-stopped\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\"\u003ememory\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ nextcloud_memory }}\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\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nAJAX wasn't cutting it, traditional crontab in containers doesn't make much\nsense to me, webcron is recommended but I don't want to register with anything\noutside my LAN... Turns out you can just spin up an identical container with a\ndifferent entrypoint to /cron.sh that does what you need!\n\n\u003e Note that this is a task in an Ansible playbook - but the docker-compose is straight forward\n\nSo the only thing you need to make sure of is that _all_ the configuration\noptions - data volumes, user permissions, etc. are _identical_ between the\ncontainers running the cron job and the one actually hosting NextCloud. This\nensures that the container running cron has proper access to the database and\nfilesystem - or at least the same access as NextCloud proper.\n\n```yaml\n- name: Nextcloud Cron Docker Container\n  docker_container:\n    name: nextcloud-cron\n    image: \"{{ nextcloud_image }}\"\n    pull: true\n    links:\n      - nextcloud-mysql:mysql\n    entrypoint: /cron.sh\n    volumes:\n      - \"{{ nextcloud_data_directory }}/nextcloud:/var/www/html:rw\"\n    env:\n      MYSQL_HOST: \"mysql\"\n      MYSQL_DATABASE: \"nextcloud\"\n      MYSQL_USER: \"{{ nextcloud_sql_user }}\"\n      MYSQL_PASSWORD: \"{{ nextcloud_sql_password }}\"\n      NEXTCLOUD_TRUSTED_DOMAINS: \"{{ nextcloud_hostname }}.{{ ansible_nas_domain }}\"\n      PUID: \"{{ nextcloud_user_id }}\"\n      PGID: \"{{ nextcloud_group_id }}\"\n      TZ: \"{{ ansible_nas_timezone }}\"\n    restart_policy: unless-stopped\n    memory: \"{{ nextcloud_memory }}\"\n\n```\n\n\n\n",
      "summary": "AJAX wasn't cutting it, traditional crontab in containers doesn't make much sense to me, webcron is recommended but I don't want to register with anything...",
      "date_published": "2022-12-13T06:43:45Z",
      "date_modified": "2022-12-13T06:43:45Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "docker",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/call-basicconfig-to-get-python-log-messages-in-ipython/",
      "url": "https://pype.dev/call-basicconfig-to-get-python-log-messages-in-ipython/",
      "title": "Call basicConfig to get Python log messages in iPython",
      "content_html": "\u003ch1 id=\"logging-instead-of-printing\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLogging instead of printing\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eI am trying to adopt \u003ccode\u003elogger.debug\u003c/code\u003e instead of \u003ccode\u003eprint\u003c/code\u003e but ran into a confusing\nthing in ipython during Advent of Code\u0026hellip; I riddled by script with\n\u003ccode\u003elogger.debug\u003c/code\u003e (yes after setting \u003ccode\u003elogging.setLevel('DEBUG')\u003c/code\u003e) but in ipython\nnone of my log messages showed up!\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"nn\"\u003elogging\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=\"n\"\u003elogger\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003elogging\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003egetLogger\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"vm\"\u003e__name__\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=\"n\"\u003elogger\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esetLevel\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;DEBUG\u0026#34;\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\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eTurns out what I was missing was a call to \u003ccode\u003ebasicConfig\u003c/code\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"nn\"\u003elogging\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=\"c1\"\u003e# forget this and your messages are in the ether! or at least not seen in ipython...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003elogging\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ebasicConfig\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003elogger\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003elogging\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003egetLogger\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"vm\"\u003e__name__\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=\"n\"\u003elogger\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esetLevel\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;DEBUG\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch1 id=\"bonus\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBonus\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eWant your new messages to show up while iterating on something without killing\nthe ipython kernel?\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003eimportlib\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003ereload\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ereload\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003elogging\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"c1\"\u003e# to make sure you get new log messages you add while developing!\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\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\n# Logging instead of printing\n\nI am trying to adopt `logger.debug` instead of `print` but ran into a confusing\nthing in ipython during Advent of Code... I riddled by script with\n`logger.debug` (yes after setting `logging.setLevel('DEBUG')`) but in ipython\nnone of my log messages showed up!\n\n```python\nimport logging\n\nlogger = logging.getLogger(__name__)\nlogger.setLevel(\"DEBUG\")\n\n```\n\nTurns out what I was missing was a call to `basicConfig`\n\n```python\nimport logging\n\n# forget this and your messages are in the ether! or at least not seen in ipython...\nlogging.basicConfig()\n\nlogger = logging.getLogger(__name__)\nlogger.setLevel(\"DEBUG\")\n```\n\n\n# Bonus\n\nWant your new messages to show up while iterating on something without killing\nthe ipython kernel?\n\n```python\nfrom importlib import reload\nreload(logging) # to make sure you get new log messages you add while developing!\n\n```\n",
      "summary": "I am trying to adopt instead of but ran into a confusing thing in ipython during Advent of Code... I riddled by script with (yes after setting ) but in...",
      "date_published": "2022-12-10T14:04:23Z",
      "date_modified": "2022-12-10T14:04:23Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "python",
        "cli",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/new-lines-in-markdown-tables/",
      "url": "https://pype.dev/new-lines-in-markdown-tables/",
      "title": "New lines in Markdown tables",
      "content_html": "\u003cp\u003eI wanted to break down some long lines in a Markdown table cell to make it look\nnicer on my blog but \\n didn\u0026rsquo;t do anything for me\u0026hellip; turns out \u003cbr/\u003e is the\nmagic sauce\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003e\u003cem\u003eColumn 1\u003c/em\u003e\u003c/th\u003e\n\u003cth\u003e\u003cem\u003eColumn 2\u003c/em\u003e\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eKey\u003c/td\u003e\n\u003ctd\u003eDoggo ipsum many pats. Borkdrive borking doggo doing me a frighten doggorino, noodle horse heckin. what a nice floof. Pupper borking doggo you are doing me a frighten, much ruin diet.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u0026mdash;\u003c/td\u003e\n\u003ctd\u003e\u0026mdash;\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003e\u003cem\u003eColumn 1\u003c/em\u003e\u003c/th\u003e\n\u003cth\u003e\u003cem\u003eColumn 2\u003c/em\u003e\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eKey\u003c/td\u003e\n\u003ctd\u003eDoggo ipsum many pats. \u003cbr/\u003e Borkdrive borking doggo doing me a frighten doggorino, noodle horse heckin. \u003cbr/\u003e what a nice floof. \u003cbr/\u003e Pupper borking doggo you are doing me a frighten, much ruin diet.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u0026mdash;\u003c/td\u003e\n\u003ctd\u003e\u0026mdash;\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n",
      "content_text": "\nI wanted to break down some long lines in a Markdown table cell to make it look\nnicer on my blog but \\n didn't do anything for me... turns out \u003cbr/\u003e is the\nmagic sauce\n\n| *Column 1* | *Column 2* |\n| --- | --- |\n| Key | Doggo ipsum many pats. Borkdrive borking doggo doing me a frighten doggorino, noodle horse heckin. what a nice floof. Pupper borking doggo you are doing me a frighten, much ruin diet. |\n| --- | --- |\n\n\n| *Column 1* | *Column 2* |\n| --- | --- |\n| Key | Doggo ipsum many pats. \u003cbr/\u003e Borkdrive borking doggo doing me a frighten doggorino, noodle horse heckin. \u003cbr/\u003e what a nice floof. \u003cbr/\u003e Pupper borking doggo you are doing me a frighten, much ruin diet. |\n| --- | --- |\n",
      "summary": "I wanted to break down some long lines in a Markdown table cell to make it look nicer on my blog but \\n didn't do anything for me... turns out is the magic...",
      "date_published": "2022-11-25T13:35:05Z",
      "date_modified": "2022-11-25T13:35:05Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "vim",
        "webdev",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/description-of-my-proposed-vimconf-2022-talk/",
      "url": "https://pype.dev/description-of-my-proposed-vimconf-2022-talk/",
      "title": "Description of my proposed vimconf 2022 talk",
      "content_html": "\u003cp\u003eSwitching to Vim opened a whole new world to me for interacting with a computer\nand for getting things done. Before I adopted Vim I used GUIs for everything\nbecause I thought that\u0026rsquo;s how it had to be done\u0026hellip; Notes in OneNote, code using\na GUI editor, different notes in TiddlyWiki, slides for work in PowerPoint,\nslides for church using Logos, etc\u0026hellip; Adopting Vim allowed me to disconnect a\nspecific tool from the problem that tool is solving - because usually I just\nneed to write text (notes, code, slides, etc.). Now, very nearly everything I\ndo is from a text-based and git-based workflow\u0026hellip; I put all my notes on\nbasically anything just in my blog, which is all markdown and deployed to GH\nwith Markata on every push (living dangerously pushing to main) - and that\u0026rsquo;s\nall done easily from Vim with nice syntax highlighting, fast response,\nintegrated git-plugins, etc.. I keep project-specific task lists just in\nmarkdown files and I have Vim/tmux shortcuts to quickly add todos for any\nproject (todo list is done with markata todoui) and I can get there fast\nbecause my Vim workflow dovetails with Tmux nicely. Also I can pull that list\nup right from the terminal, which I\u0026rsquo;m already in because Vim\u0026hellip;. Vim also\npushed me into the cli more - because Vim is so easily extended with cli tools\nand I\u0026rsquo;m already in the terminal\u0026hellip; The builtin functionality also made things\nmake more sense - no more right-click, find \u0026ldquo;refactor all\u0026rdquo; or \u0026ldquo;rename symbol\u0026rdquo;\n(for some stupid reason)\u0026hellip; Vim find-replace is so intuitive and if I need it\nextended then I learned what sed was because of Vim. Moving quickly in Vim also\nenables me to do my job incredibly fast because I hop into several projects a\nday in a coaching role - if I was bound by GUIs I\u0026rsquo;d be waiting forever for\nstartup, would lose which GUI instance was which project, etc\u0026hellip; Being in the\nterminal also made Tmux a trivial choice - now I have 90 tmux sessions, all\nnamed appropriately, ready for me to jump back to and all while keeping the\nmajority of RAM still free for Chrome. Vim as my IDE also forced me to learn\nway more about Python (I\u0026rsquo;m a python developer primarily), how LSP works, how to\nconfigure a development environment, etc\u0026hellip; things I took for granted in my GUI\nworkflows, or never knew, or worse - thought I knew but deeply misunderstood.\nNow that I understand them better, I can coach my peers more effectively even\nif they are still in a GUI-based ecosystem.\u003c/p\u003e\n\u003cp\u003eBasically, (Neo)Vim actually did change my life and I\u0026rsquo;m really thankful for it\n(maybe that should be the title?)\u003c/p\u003e\n",
      "content_text": "\nSwitching to Vim opened a whole new world to me for interacting with a computer\nand for getting things done. Before I adopted Vim I used GUIs for everything\nbecause I thought that's how it had to be done... Notes in OneNote, code using\na GUI editor, different notes in TiddlyWiki, slides for work in PowerPoint,\nslides for church using Logos, etc... Adopting Vim allowed me to disconnect a\nspecific tool from the problem that tool is solving - because usually I just\nneed to write text (notes, code, slides, etc.). Now, very nearly everything I\ndo is from a text-based and git-based workflow... I put all my notes on\nbasically anything just in my blog, which is all markdown and deployed to GH\nwith Markata on every push (living dangerously pushing to main) - and that's\nall done easily from Vim with nice syntax highlighting, fast response,\nintegrated git-plugins, etc.. I keep project-specific task lists just in\nmarkdown files and I have Vim/tmux shortcuts to quickly add todos for any\nproject (todo list is done with markata todoui) and I can get there fast\nbecause my Vim workflow dovetails with Tmux nicely. Also I can pull that list\nup right from the terminal, which I'm already in because Vim.... Vim also\npushed me into the cli more - because Vim is so easily extended with cli tools\nand I'm already in the terminal... The builtin functionality also made things\nmake more sense - no more right-click, find \"refactor all\" or \"rename symbol\"\n(for some stupid reason)... Vim find-replace is so intuitive and if I need it\nextended then I learned what sed was because of Vim. Moving quickly in Vim also\nenables me to do my job incredibly fast because I hop into several projects a\nday in a coaching role - if I was bound by GUIs I'd be waiting forever for\nstartup, would lose which GUI instance was which project, etc... Being in the\nterminal also made Tmux a trivial choice - now I have 90 tmux sessions, all\nnamed appropriately, ready for me to jump back to and all while keeping the\nmajority of RAM still free for Chrome. Vim as my IDE also forced me to learn\nway more about Python (I'm a python developer primarily), how LSP works, how to\nconfigure a development environment, etc... things I took for granted in my GUI\nworkflows, or never knew, or worse - thought I knew but deeply misunderstood.\nNow that I understand them better, I can coach my peers more effectively even\nif they are still in a GUI-based ecosystem.\n\nBasically, (Neo)Vim actually did change my life and I'm really thankful for it\n(maybe that should be the title?)\n",
      "summary": "Switching to Vim opened a whole new world to me for interacting with a computer and for getting things done. Before I adopted Vim I used GUIs for everything...",
      "date_published": "2022-11-12T19:39:19Z",
      "date_modified": "2022-11-12T19:39:19Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "linux",
        "vim",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/make-a-series-of-directories-fast/",
      "url": "https://pype.dev/make-a-series-of-directories-fast/",
      "title": "Make a series of directories fast!",
      "content_html": "\u003cp\u003emkdir s{1..10} will make directories s1, s2, \u0026hellip; s10 in one command!\u003c/p\u003e\n",
      "content_text": "\nmkdir s{1..10} will make directories s1, s2, ... s10 in one command!\n",
      "summary": "mkdir s{1..10} will make directories s1, s2, ... s10 in one command!",
      "date_published": "2022-11-10T15:27:50Z",
      "date_modified": "2022-11-10T15:27:50Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "linux",
        "cli",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/hebrew-bible-full-class/",
      "url": "https://pype.dev/hebrew-bible-full-class/",
      "title": "Hebrew Bible Full Class",
      "content_html": "\u003cp\u003e\u003ca href=\"https://bibleproject.com/classroom-alpha/education-videos/session-1-what-earth-hebrew-bible/\"\u003eClass link\u003c/a\u003e\n\u003ca href=\"http://paynepride.com:8010/documents/162\"\u003eClassroom notes (Must be on home network)\u003c/a\u003e\u003c/p\u003e\n\u003ch1 id=\"01-the-shape-of-the-hebrew-bible\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e01 The Shape of the Hebrew Bible\u003c/span\u003e\u003c/h1\u003e\n\u003ch2 id=\"session-1-what-on-earth-is-the-hebrew-bible\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSession 1: What on Earth is the Hebrew Bible?\u003c/span\u003e \u003ca href=\"#session-1-what-on-earth-is-the-hebrew-bible\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThis class is not so much a survey of the HB, it is Tim\u0026rsquo;s attempt to distil the\nmost helpful things for understanding it in a consumable way for laypeople.\u003c/p\u003e\n\u003cp\u003eA chunk of this is the other people giving some of their own background. One\nlady said something that might be helpful for ministry - \u0026ldquo;Maybe that thing that\nI saw as \u0026lsquo;you don\u0026rsquo;t love me\u0026rsquo; is \u0026lsquo;I don\u0026rsquo;t know how to love you\u0026rsquo;\u0026rdquo;\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003ehow to love\u003c/p\u003e\n\u003cp\u003eMaybe that thing that I saw as \u0026lsquo;you don\u0026rsquo;t love me\u0026rsquo; is \u0026lsquo;I don\u0026rsquo;t know how to love you\u0026rsquo;\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition danger\"\u003e\n\u003cp class=\"admonition-title\"\u003eChristian coping strategy for the Olt Testament\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eHero-example model\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eStories get isolated and distilled down into a simple moral model, where the hero is just the hero.\u003c/li\u003e\n\u003cli\u003eVeggie-Tales is uber-guilty of this nonsense\u003c/li\u003e\n\u003cli\u003eThere\u0026rsquo;s something correct about this - but the oversimplification usually comes out of a massive re-writting of the stories, then anyone raised on those versions of the story is scaldalized when they read it for real\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ePoltical-authority source\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ePolitical parties hijacking \u0026ldquo;The Bible says X about Y\u0026rdquo; as a means to harvest authority from a book that many people claim is authoritative.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTheology answer book model\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eTreating the Bible like a dictionary of key/value pairs where keys are questions and values are simple answers.\u003c/li\u003e\n\u003cli\u003eThis ignores narrative, and general literacy.\u003c/li\u003e\n\u003cli\u003eThe instinct may be right - the Bible should profoundly shape my view of everything, but it isn\u0026rsquo;t simple\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eInspirational-heart-warming model\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eVerse-a-day calendars\u003c/li\u003e\n\u003cli\u003eJermiah 29:11\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition warning\"\u003e\n\u003cp class=\"admonition-title\"\u003eWarning\u003c/p\u003e\n\u003cp\u003eAre we imposing a set of questions that are foreign to what the authors are\ntrying to communicate? do we need to set our cultural agendas aside to just\nlisten?\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eA result of asking the wrong questions is the common story of people\u0026rsquo;s faith being dismantled \u003cem\u003eby reading the Bible\u003c/em\u003e\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eDL Baker - Two Testaments - One Bible\u003c/p\u003e\n\u003cp\u003eOne of the most fundamental questions which has faced theology and the\nChurch in every age\u0026hellip; is whether or not Christianity also needs an Old\nTestament. Is the Old Testament to be thrown away as obsolete, or pre-\nserved as a relic from days of yore, or treasured as a classic and read by\nscholars, or used occasionally as a change from the New Testament, or\nkept in a box in case it should be needed some day? Or is the Old Testa-\nment an essential part of the Christian Bible, with continuing validity along-\nside the New Testament? —\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"session-2-how-jesus-and-the-apostle-readtheir-bibles\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSession 2: How Jesus and the Apostle ReadTheir Bibles\u003c/span\u003e \u003ca href=\"#session-2-how-jesus-and-the-apostle-readtheir-bibles\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe Bible most often refers to itself as \u003cem\u003ethe Writings\u003c/em\u003e\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eRoad to Emmaus\u003c/p\u003e\n\u003cp\u003eJesus confronts a couple guys walking to Emmaus after he is resurrected and\nmore or less calls them idiots/fools for not understanding that the\nWritings point to an annointed king who will suffer death for the sake of\nredemption. He\u0026rsquo;s recognized by them once their eyes are opened then he vanishes\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003e\u003cstrong\u003eWeird stuff\u003c/strong\u003e\u003c/p\u003e\n\u003ch3 id=\"paul-and-timothy\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePaul and Timothy\u003c/span\u003e \u003ca href=\"#paul-and-timothy\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003ePaul assumes when writing to Timothy that he, and probably believers in general, are in a community of people who are regularly learning about Yahweh through the Scriptures \u003cem\u003eas a family\u003c/em\u003e\u003c/p\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003e2 Timothy 3:15-16\u003c/p\u003e\n\u003cp\u003e\u0026hellip; and that from childhood you ahve known the sacred writings which are\nable to give you the wisdom that leas to salvation through faith which is\nin Christ Jesus. All Scripture is inspired by God and profitable for\nteaching, for reproof, for correction, for training in righteousness\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition success\"\u003e\n\u003cp class=\"admonition-title\"\u003eSuccess\u003c/p\u003e\n\u003cp\u003eFor Paul, the \u003ccode\u003eScriptures\u003c/code\u003e here are our OT, the Hebrew Bible. For Paul, the HB\nis entirely \u003cem\u003ewisdom literature\u003c/em\u003e that leads to salvation through Jesus\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eThe question of \u0026ldquo;What are the Scriptures?\u0026rdquo; is covered in the next session\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eTo answer the question \u0026lsquo;How do we read the HB?\u0026rsquo; we have to ask the question\n\u0026lsquo;Whose book is the HB?\u0026rsquo;\u003c/strong\u003e\u003c/p\u003e\n\u003ch2 id=\"session-3-shape-of-the-scriptures\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSession 3: Shape of the Scriptures\u003c/span\u003e \u003ca href=\"#session-3-shape-of-the-scriptures\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003eOld Testament\u003c/code\u003e is the Christian term for a set of writings that comprise about\n3/4 of the Christian Bible. The authors themselves though refer to those\nwritings as \u003ccode\u003ethe Scriptures\u003c/code\u003e. One time it is called \u003ccode\u003ethe Old Covenant\u003c/code\u003e by Paul\n, but he\u0026rsquo;s talking about Synagogue readings of the Torah portion in synagogues.\nTHe phrase \u003ccode\u003eHebrew Bible\u003c/code\u003e is a modern term that is a bit more neutral.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eSo, what is our Bible?\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003eLuke 24:25-27\u003c/p\u003e\n\u003cp\u003e25 And he said to them, “O foolish ones, and slow of\nheart to believe all that the prophets have spoken! 26 Was it not necessary\nthat the Christ should suffer these things and enter into his glory?”\n27 And beginning with Moses and all the Prophets, he interpreted to them in\nall the Scriptures the things concerning himself.\u003c/p\u003e\n\u003c/div\u003e\n\u003cblockquote\u003e\n\u003cp\u003eMoses and the Prophets\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch3 id=\"tanak\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTaNaK\u003c/span\u003e \u003ca href=\"#tanak\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eJweish reference to the books in our OT, in the Hebrew Bible, but the arangement is different\u0026hellip;\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eTaNaK\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eT = Torah (first 5 books)\u003c/li\u003e\n\u003cli\u003eN - Nevi\u0026rsquo;im (Prophets: Joshua - Kings) [Christians often call these the \u0026lsquo;historial books\u0026rsquo;]\u003c/li\u003e\n\u003cli\u003eK - Ketuvim\u003c/li\u003e\n\u003c/ol\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003e\u003cstrong\u003eTorah\u003c/strong\u003e\u003c/th\u003e\n\u003cth\u003e\u003cstrong\u003ePentateuch\u003c/strong\u003e\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eGenesis - Exodus - Leviticus - Numbers Deuteronomy\u003c/td\u003e\n\u003ctd\u003eGenesis - Exodus - Leviticus - Numbers - Deuteronomy\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eNevi\u0026rsquo;im - The Prophets\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003e\u003cstrong\u003eHistory\u003c/strong\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cem\u003eFormer Prophets\u003c/em\u003e \u003cbr/\u003e Joshua - Judges - Samueal - Kings\u003c/td\u003e\n\u003ctd\u003eJoshua - Judges - Ruth \u003cbr/\u003e 1-2 Samuel - 1-2 Kings \u003cbr/\u003e 1-2 Chronicles \u003cbr/\u003e Ezra - Nehemiah - Ester\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cem\u003eLater Prophets\u003c/em\u003e \u003cbr/\u003e Isaiah - Jeremiah - Ezekiel \u003cbr/\u003e Hosea - Joel - Amos - Obadiah - Jonah - Micah - Nahum - Habakkuk - Zephaniah - Haggai - Zechariah - Malachi\u003c/td\u003e\n\u003ctd\u003e\u003cstrong\u003ePoetry\u003c/strong\u003e \u003cbr/\u003e Job - Psalms - Proverbs - Ecclesiastes - Song of Solomon\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eKethuvim - The Writings\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003e\u003cstrong\u003eProphets\u003c/strong\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePsalms - Job - Proverbs \u003cbr/\u003e Ruth - Song of Songs - Ecclesiastes - Lamentations - Esther [The Megillot] \u003cbr/\u003e Daniel - Ezra - Nehemiah - Chronicles\u003c/td\u003e\n\u003ctd\u003eIsiah - Jeremiah - Lamentations \u003cbr/\u003e Ezekiel - Daniel \u003cbr/\u003e Hosea - Joel - Amos - Obadiah - Jonah - Micah - Nahum - Habakkuk - Zephaniah - Haggai - Zechariah - Malachi\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003eLuke 11:49–51 (ESV) \u003c/p\u003e\n\u003cp\u003e49 Therefore also the Wisdom of God said, ‘I will send them prophets and\napostles, some of whom they will kill and persecute,’ 50 so that the blood\nof all the prophets, shed from the foundation of the world, may be charged\nagainst this generation, 51 from the blood of Abel to the blood of\nZechariah, who perished between the altar and the sanctuary. Yes, I tell\nyou, it will be required of this generation.\u003c/p\u003e\n\u003c/div\u003e\n\u003cblockquote\u003e\n\u003cp\u003eBlood of Abel to the blood of Zechariah\u0026hellip;\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eWhy would Jesus pick these two events? Abel is murdered on page 4, Zechariah is\nmurdered in the last part of Chronicles, which in the TaNaK is significant\u0026hellip;\nJesus is saying that \u003cem\u003eall the prophets from the beginning of the Scriptures to\nthe end\u003c/em\u003e\u0026hellip; All the prophets from A-Z so to speak\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eScriptures\u003c/p\u003e\n\u003cp\u003e\u0026ldquo;Books\u0026rdquo; as we know it, bound papers with writing on it, called a \u0026lsquo;codex\u0026rsquo;\nwasn\u0026rsquo;t a thing until a couple hundred years post-Jesus\u0026hellip; so when the\nauthors say \u0026ldquo;The Scriptures\u0026rdquo; we need to keep in mind that Jews had the\nscriptures in their minds and hearts, not on paper (save for a couple very\nexpensive scrolls). So the structure of the scriptures is also apart of the\nJewish being\u0026hellip; This interaction with the Scriptures is \u003cem\u003every very very\ndifferent than how we interact with the Bible\u003c/em\u003e\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003e4QMMT\u003c/p\u003e\n\u003cp\u003e\u0026ldquo;The scrolls of Moses, the words of the prophets, and of David.\u0026rdquo;\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003ePhilo of Alexandria\u003c/p\u003e\n\u003cp\u003eThe laws and the oracles given by inspiration through the prophets and the\nPsalms, and the other scrolls whereby knowledge and piety are increased and\ncompleted\u0026hellip;\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eDe Vita Contemplatetiva, 25\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/div\u003e\n\u003ch3 id=\"melito-of-sardis\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMelito of Sardis\u003c/span\u003e \u003ca href=\"#melito-of-sardis\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eEarly 200s\u003c/li\u003e\n\u003cli\u003eOne of the earliest Christians to talk about the books/scrolls of Christian scriptures\u003c/li\u003e\n\u003cli\u003eSummarizes \u003cem\u003eChristian ordering\u003c/em\u003e of the Hebrew Bible with some logic\n\u003cul\u003e\n\u003cli\u003eFoundation narrative of the Pentateuch\u003c/li\u003e\n\u003cli\u003eHistory\u003c/li\u003e\n\u003cli\u003ePoetry\u003c/li\u003e\n\u003cli\u003eProphets then point forward to the coming Messiah, Jesus, and the NT writings\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"session-4-seams-between-texts-in-the-dead-sea-scrolls\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSession 4 - Seams between Texts in the Dead Sea Scrolls\u003c/span\u003e \u003ca href=\"#session-4-seams-between-texts-in-the-dead-sea-scrolls\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAround 100-200 AD there was a split in the Jewish community over things like\nhow the Temple and sacrifices were to be run, etc. A group got kicked out, so\nthey grabbed some scrolls and went to start what we\u0026rsquo;d think of as a Monastic\ncommunity. Qumran community is where they went, and the scrolls this group\nmanaged are called the Dead Sea Scrolls.\u003c/p\u003e\n\u003cp\u003eOut of DSS we have some of the oldest biblical scrolls, they have their own\nwritings and liturgies since they were all priests basically too.\u003c/p\u003e\n\u003cp\u003eThe scrolls were hidden in caves before the Romans marched on Qumran. They were\nfound in the 1940s by a bunch of shepherds. A few showed up online for sale and\nthat\u0026rsquo;s how we found out about their exitence\u0026hellip;. These scrolls give us\npre-Christian Jewish Bible nerds\u0026hellip;\u003c/p\u003e\n\u003cp\u003eQumran community didn\u0026rsquo;t know about Jesus - they thought the Messiah would be a\nman called \u003cem\u003eThe Teacher of Righteousness\u003c/em\u003e\u003c/p\u003e\n\u003ch3 id=\"scroll-making\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eScroll-making\u003c/span\u003e \u003ca href=\"#scroll-making\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe DSS preserved for us, not only ancient biblical texts, but also the method\nby which scrolls were created. They were well-preserved papyrus that was\nstiched together - literal stitches. We also have obvious additions from Qumran\ncommunity as well as notes from priests and corrections from missed\ntranscribing.\u003c/p\u003e\n\u003ch3 id=\"our-bible\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOur Bible\u003c/span\u003e \u003ca href=\"#our-bible\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThe DSS scrolls, being the oldest stitched together set of scrolls, teach us\nhow scrolls and collections of ancient holy texts were put together. We need to\nkeep this in mind when we think about where our Christian Bible came from\u003c/p\u003e\n\u003cp\u003eThe beginning and ending of our books might/are filled with hyperlinks that\ncall a reader\u0026rsquo;s mind back to other stories. It\u0026rsquo;s the way of linking context and\nstories to one another before the writings are in a codex\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eHyperlinks - language/syntax that remind a reader of antoher scroll - help us\nunderstand the structure of the Hebrew Bible\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eA favorite quote from Tim\u003c/p\u003e\n\u003cp\u003eSo, you can see I\u0026rsquo;m interested in a historical question of like the\ncollection [Hebrew Bible] was produced by a group of people. What did they\nmean by it? And we can actually know a lot about what they meant and locate\nthem and read it the way they wanted us to read it, and pick up what\nthey\u0026rsquo;re saying. And, lo and behold, you know, I hope to convince you\nthat—and this is all pre-Christian—what\u0026rsquo;s happening here and what this all\npoints to and means, fits hand in glove with how Jesus and Paul and the\napostles talk about these texts.\nSo that\u0026rsquo;s different from saying nobody\nknew what these texts meant. The events of Jesus happen, and then we go\nreread it, and it has a whole new meaning that no one has ever imagined. It\nseems to me what actually happened in history was a little more interesting\nand complicated than that.  [17:30-18:21]\u003c/p\u003e\n\u003c/div\u003e\n",
      "content_text": "\n[Class link](https://bibleproject.com/classroom-alpha/education-videos/session-1-what-earth-hebrew-bible/)\n[Classroom notes (Must be on home network)](http://paynepride.com:8010/documents/162)\n\n# 01 The Shape of the Hebrew Bible\n\n## Session 1: What on Earth is the Hebrew Bible?\n\nThis class is not so much a survey of the HB, it is Tim's attempt to distil the\nmost helpful things for understanding it in a consumable way for laypeople.\n\nA chunk of this is the other people giving some of their own background. One\nlady said something that might be helpful for ministry - \"Maybe that thing that\nI saw as 'you don't love me' is 'I don't know how to love you'\"\n\n!!! note \"how to love\"\n\n    Maybe that thing that I saw as 'you don't love me' is 'I don't know how to love you'\n\n!!! danger \"Christian coping strategy for the Olt Testament\"\n\n    1. Hero-example model\n        * Stories get isolated and distilled down into a simple moral model, where the hero is just the hero.\n        * Veggie-Tales is uber-guilty of this nonsense\n        * There's something correct about this - but the oversimplification usually comes out of a massive re-writting of the stories, then anyone raised on those versions of the story is scaldalized when they read it for real\n\n    2. Poltical-authority source\n        * Political parties hijacking \"The Bible says X about Y\" as a means to harvest authority from a book that many people claim is authoritative.\n\n    3. Theology answer book model\n        * Treating the Bible like a dictionary of key/value pairs where keys are questions and values are simple answers.\n        * This ignores narrative, and general literacy.\n        * The instinct may be right - the Bible should profoundly shape my view of everything, but it isn't simple\n\n    4. Inspirational-heart-warming model\n        * Verse-a-day calendars\n        * Jermiah 29:11\n\n!!! warning \"\"\n\n    Are we imposing a set of questions that are foreign to what the authors are\n    trying to communicate? do we need to set our cultural agendas aside to just\n    listen?\n\nA result of asking the wrong questions is the common story of people's faith being dismantled _by reading the Bible_\n\n!!! note \"DL Baker - Two Testaments - One Bible\"\n\n    One of the most fundamental questions which has faced theology and the\n    Church in every age... is whether or not Christianity also needs an Old\n    Testament. Is the Old Testament to be thrown away as obsolete, or pre-\n    served as a relic from days of yore, or treasured as a classic and read by\n    scholars, or used occasionally as a change from the New Testament, or\n    kept in a box in case it should be needed some day? Or is the Old Testa-\n    ment an essential part of the Christian Bible, with continuing validity along-\n    side the New Testament? —\n\n## Session 2: How Jesus and the Apostle ReadTheir Bibles\n\nThe Bible most often refers to itself as _the Writings_\n\n!!! note \"Road to Emmaus\"\n\n    Jesus confronts a couple guys walking to Emmaus after he is resurrected and\n    more or less calls them idiots/fools for not understanding that the\n    Writings point to an annointed king who will suffer death for the sake of\n    redemption. He's recognized by them once their eyes are opened then he vanishes\n\n**Weird stuff**\n\n### Paul and Timothy\n\nPaul assumes when writing to Timothy that he, and probably believers in general, are in a community of people who are regularly learning about Yahweh through the Scriptures _as a family_\n\n!!! quote \"2 Timothy 3:15-16\"\n\n    ... and that from childhood you ahve known the sacred writings which are\n    able to give you the wisdom that leas to salvation through faith which is\n    in Christ Jesus. All Scripture is inspired by God and profitable for\n    teaching, for reproof, for correction, for training in righteousness\n\n!!! success \"\"\n\n    For Paul, the `Scriptures` here are our OT, the Hebrew Bible. For Paul, the HB\n    is entirely _wisdom literature_ that leads to salvation through Jesus\n\nThe question of \"What are the Scriptures?\" is covered in the next session\n\n**To answer the question 'How do we read the HB?' we have to ask the question\n'Whose book is the HB?'**\n\n## Session 3: Shape of the Scriptures\n\n`Old Testament` is the Christian term for a set of writings that comprise about\n3/4 of the Christian Bible. The authors themselves though refer to those\nwritings as `the Scriptures`. One time it is called `the Old Covenant` by Paul\n, but he's talking about Synagogue readings of the Torah portion in synagogues.\nTHe phrase `Hebrew Bible` is a modern term that is a bit more neutral.\n\n\u003e So, what is our Bible?\n\n!!! quote \"Luke 24:25-27\"\n\n    25 And he said to them, “O foolish ones, and slow of\n    heart to believe all that the prophets have spoken! 26 Was it not necessary\n    that the Christ should suffer these things and enter into his glory?”\n    27 And beginning with Moses and all the Prophets, he interpreted to them in\n    all the Scriptures the things concerning himself.\n\n\u003e Moses and the Prophets\n\n### TaNaK\n\nJweish reference to the books in our OT, in the Hebrew Bible, but the arangement is different...\n\n!!! note \"TaNaK\"\n\n    1. T = Torah (first 5 books)\n    2. N - Nevi'im (Prophets: Joshua - Kings) [Christians often call these the 'historial books']\n    3. K - Ketuvim\n\n    | **Torah** | **Pentateuch** |\n    | --- | --- |\n    | Genesis - Exodus - Leviticus - Numbers Deuteronomy | Genesis - Exodus - Leviticus - Numbers - Deuteronomy |\n    | **Nevi'im - The Prophets** | **History** |\n    | *Former Prophets* \u003cbr/\u003e Joshua - Judges - Samueal - Kings | Joshua - Judges - Ruth \u003cbr/\u003e 1-2 Samuel - 1-2 Kings \u003cbr/\u003e 1-2 Chronicles \u003cbr/\u003e Ezra - Nehemiah - Ester |\n    | *Later Prophets* \u003cbr/\u003e Isaiah - Jeremiah - Ezekiel \u003cbr/\u003e Hosea - Joel - Amos - Obadiah - Jonah - Micah - Nahum - Habakkuk - Zephaniah - Haggai - Zechariah - Malachi | **Poetry** \u003cbr/\u003e Job - Psalms - Proverbs - Ecclesiastes - Song of Solomon |\n    | **Kethuvim - The Writings** | **Prophets** |\n    | Psalms - Job - Proverbs \u003cbr/\u003e Ruth - Song of Songs - Ecclesiastes - Lamentations - Esther [The Megillot] \u003cbr/\u003e Daniel - Ezra - Nehemiah - Chronicles | Isiah - Jeremiah - Lamentations \u003cbr/\u003e Ezekiel - Daniel \u003cbr/\u003e Hosea - Joel - Amos - Obadiah - Jonah - Micah - Nahum - Habakkuk - Zephaniah - Haggai - Zechariah - Malachi |\n\n!!! quote \"Luke 11:49–51 (ESV) \"\n\n    49 Therefore also the Wisdom of God said, ‘I will send them prophets and\n    apostles, some of whom they will kill and persecute,’ 50 so that the blood\n    of all the prophets, shed from the foundation of the world, may be charged\n    against this generation, 51 from the blood of Abel to the blood of\n    Zechariah, who perished between the altar and the sanctuary. Yes, I tell\n    you, it will be required of this generation.\n\n\u003e Blood of Abel to the blood of Zechariah...\n\nWhy would Jesus pick these two events? Abel is murdered on page 4, Zechariah is\nmurdered in the last part of Chronicles, which in the TaNaK is significant...\nJesus is saying that _all the prophets from the beginning of the Scriptures to\nthe end_... All the prophets from A-Z so to speak\n\n!!! note \"Scriptures\"\n\n    \"Books\" as we know it, bound papers with writing on it, called a 'codex'\n    wasn't a thing until a couple hundred years post-Jesus... so when the\n    authors say \"The Scriptures\" we need to keep in mind that Jews had the\n    scriptures in their minds and hearts, not on paper (save for a couple very\n    expensive scrolls). So the structure of the scriptures is also apart of the\n    Jewish being... This interaction with the Scriptures is _very very very\n    different than how we interact with the Bible_\n\n!!! note \"4QMMT\"\n\n    \"The scrolls of Moses, the words of the prophets, and of David.\"\n\n!!! note \"Philo of Alexandria\"\n\n    The laws and the oracles given by inspiration through the prophets and the\n    Psalms, and the other scrolls whereby knowledge and piety are increased and\n    completed...\n\n    - De Vita Contemplatetiva, 25\n\n### Melito of Sardis\n\n- Early 200s\n- One of the earliest Christians to talk about the books/scrolls of Christian scriptures\n- Summarizes _Christian ordering_ of the Hebrew Bible with some logic\n  - Foundation narrative of the Pentateuch\n  - History\n  - Poetry\n  - Prophets then point forward to the coming Messiah, Jesus, and the NT writings\n\n## Session 4 - Seams between Texts in the Dead Sea Scrolls\n\nAround 100-200 AD there was a split in the Jewish community over things like\nhow the Temple and sacrifices were to be run, etc. A group got kicked out, so\nthey grabbed some scrolls and went to start what we'd think of as a Monastic\ncommunity. Qumran community is where they went, and the scrolls this group\nmanaged are called the Dead Sea Scrolls.\n\nOut of DSS we have some of the oldest biblical scrolls, they have their own\nwritings and liturgies since they were all priests basically too.\n\nThe scrolls were hidden in caves before the Romans marched on Qumran. They were\nfound in the 1940s by a bunch of shepherds. A few showed up online for sale and\nthat's how we found out about their exitence.... These scrolls give us\npre-Christian Jewish Bible nerds...\n\nQumran community didn't know about Jesus - they thought the Messiah would be a\nman called _The Teacher of Righteousness_\n\n### Scroll-making\n\nThe DSS preserved for us, not only ancient biblical texts, but also the method\nby which scrolls were created. They were well-preserved papyrus that was\nstiched together - literal stitches. We also have obvious additions from Qumran\ncommunity as well as notes from priests and corrections from missed\ntranscribing.\n\n### Our Bible\n\nThe DSS scrolls, being the oldest stitched together set of scrolls, teach us\nhow scrolls and collections of ancient holy texts were put together. We need to\nkeep this in mind when we think about where our Christian Bible came from\n\nThe beginning and ending of our books might/are filled with hyperlinks that\ncall a reader's mind back to other stories. It's the way of linking context and\nstories to one another before the writings are in a codex\n\n\u003e Hyperlinks - language/syntax that remind a reader of antoher scroll - help us\n\u003e understand the structure of the Hebrew Bible\n\n!!! note \"A favorite quote from Tim\"\n\n    So, you can see I'm interested in a historical question of like the\n    collection [Hebrew Bible] was produced by a group of people. What did they\n    mean by it? And we can actually know a lot about what they meant and locate\n    them and read it the way they wanted us to read it, and pick up what\n    they're saying. And, lo and behold, you know, I hope to convince you\n    that—and this is all pre-Christian—what's happening here and what this all\n    points to and means, fits hand in glove with how Jesus and Paul and the\n    apostles talk about these texts.\n    So that's different from saying nobody\n    knew what these texts meant. The events of Jesus happen, and then we go\n    reread it, and it has a whole new meaning that no one has ever imagined. It\n    seems to me what actually happened in history was a little more interesting\n    and complicated than that.  [17:30-18:21]\n",
      "summary": "Class link Classroom notes (Must be on home network)",
      "date_published": "2022-11-05T06:27:40Z",
      "date_modified": "2022-11-05T06:27:40Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "bible-project",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/case-insensitive-search-in-vim/",
      "url": "https://pype.dev/case-insensitive-search-in-vim/",
      "title": "Case-insensitive search in Vim",
      "content_html": "\u003cp\u003e/mysearch\\c will match mysearch, MYSEARCH, mYSeArCh\u0026hellip;\u003c/p\u003e\n",
      "content_text": "\n/mysearch\\c will match mysearch, MYSEARCH, mYSeArCh... \n",
      "summary": "/mysearch\\c will match mysearch, MYSEARCH, mYSeArCh...",
      "date_published": "2022-10-21T06:40:21Z",
      "date_modified": "2022-10-21T06:40:21Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "vim",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/faithful/",
      "url": "https://pype.dev/faithful/",
      "title": "Faithful",
      "content_html": "\u003cp\u003e\u003ca href=\"https://bibleproject.com/bible-studies/faithful/\"\u003eLink\u003c/a\u003e\u003c/p\u003e\n\u003ch1 id=\"notes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNotes\u003c/span\u003e\u003c/h1\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003eExodus 34:6\u003c/p\u003e\n\u003cp\u003eCompassioante and gracious, slow to anger, overflowing with loyal love and faithfulness\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eFaithfulness - Emet (can be translated \u0026lsquo;Truth\u0026rsquo;)\nRelated to \u0026ldquo;Amen\u0026rdquo; which is untranslated Hebrew expression meaning \u0026ldquo;that\u0026rsquo;s truth\u0026rdquo;\u003c/p\u003e\n\u003ch2 id=\"stability\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStability\u003c/span\u003e \u003ca href=\"#stability\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eMoses has to hold his hands up when Israel faces the Amalekites. Joshua (and another) bring Moses a rock to sit on and hold is hands up so they could be Emet.\u003c/p\u003e\n\u003ch2 id=\"people\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePeople\u003c/span\u003e \u003ca href=\"#people\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eDescribs trustiworthiness\u003c/p\u003e\n\u003cp\u003eExodus 18:21 - Moses apoints leaders are to be \u0026ldquo;Emet\u0026rdquo;\u003c/p\u003e\n\u003ch2 id=\"god-and-promises\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGod and promises\u003c/span\u003e \u003ca href=\"#god-and-promises\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eGod is a rock - he is faithful, just, and upright\u003c/p\u003e\n\u003cp\u003eHebrew word for trust is He\u0026rsquo;Emin which is the verb form of Emet\u003c/p\u003e\n\u003cp\u003eAbraham considers God Emet, he He\u0026rsquo;Emin\u0026rsquo;s God and God blesses this by creating Isreal.\u003c/p\u003e\n\u003cp\u003eIsrael, In Exodus 14:31, He\u0026rsquo;Emin\u0026rsquo;s God (until they see the gians in Canaan that is)\u003c/p\u003e\n\u003cp\u003e1 Kings 1:6 says David walked in Emet with God\u003c/p\u003e\n\u003cp\u003e2 Samuel 7:16, God blesses David and says his kingdom will have Emet\u003c/p\u003e\n\u003cp\u003eRomans 15:8-9 says Jesus came on behalf of God\u0026rsquo;s faithfulness.\u003c/p\u003e\n\u003ch1 id=\"questions\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eQuestions\u003c/span\u003e\u003c/h1\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003e1\u003c/p\u003e\n\u003cp\u003eThe Hebrew word “emet” is translated with words like “faithful,”\n“reliable,” “sure,” “trustworthy,” and “amen.” Read aloud Psalm 36:5-6 ,\nPsalm 19:7 , and Psalm 41:13 and discuss what the psalmists are\ncommunicating in these passages when they use the word “emet.”\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003ePsalms 36:5-6\u003c/p\u003e\n\u003cp\u003e5Your lovingkindness, O Lord, extends to the heavens,\u003c/p\u003e\n\u003cp\u003eYour faithfulness reaches to the skies.\u003c/p\u003e\n\u003cp\u003e6Your righteousness is like the mountains of God;\u003c/p\u003e\n\u003cp\u003eYour judgments are like a great deep.\u003c/p\u003e\n\u003cp\u003eO Lord, You preserve man and beast.\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003ePsalms 19:7\u003c/p\u003e\n\u003cp\u003e7The law of the Lord is perfect, restoring the soul;\u003c/p\u003e\n\u003cp\u003eThe testimony of the Lord is sure, making wise the simple.\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003ePsalms 41:13\u003c/p\u003e\n\u003cp\u003e13Blessed be the Lord, the God of Israel,\u003c/p\u003e\n\u003cp\u003eFrom everlasting to everlasting.\u003c/p\u003e\n\u003cp\u003eAmen and Amen.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eI think the lesson here is pretty simple - God is faithful, full stop. His\nfaithfulness doesn\u0026rsquo;t look necessarily like how we might want\u0026hellip; when I was a\nkid I would be upset if my parents didn\u0026rsquo;t respond to me in the way I wanted,\nand my kids will certainly share that disappointment. But I am faithful to my\nchildren - sometimes the main issue is a child\u0026rsquo;s outlook on a situation or\nworldview. I think that metaphor holds true in relation to humans and Yahweh -\nhe sees the whole world, we see a part of it so we cannot understand\nfaithfulness fully, in the same way that my children can\u0026rsquo;t understand my\nfaithfulness to them fully - even to the point of being upset or thinking that\n\u003cem\u003eI\u0026rsquo;m not being faithful\u003c/em\u003e\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003e2\u003c/p\u003e\n\u003cp\u003eGod promised the Israelites that he would give them a king of peace that\nwould rule forever and ever (e.g. 2 Samuel 7:16). However, Israel’s kingdom\ncollapsed and they found themselves without a home or a king. Compare the\nbeginning of Psalm 89 (vv. 1-10) with the way it closes (vv. 46-52). What\ndo you think it practically looks like to trust God when all seems lost?\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003e2 Samuel 7:16\u003c/p\u003e\n\u003cp\u003e16Your house and your kingdom shall endure before Me forever; your throne shall be established forever.” ’ ”\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003ePSALM 89\u003c/p\u003e\n\u003cp\u003eThe Lord’s Covenant with David, and Israel’s Afflictions.\u003c/p\u003e\n\u003cp\u003eA Maskil of Ethan the Ezrahite.\u003c/p\u003e\n\u003cp\u003e1I will sing of the lovingkindness of the Lord forever;\u003c/p\u003e\n\u003cp\u003eTo all generations I will make known Your faithfulness with my mouth.\u003c/p\u003e\n\u003cp\u003e2For I have said, “Lovingkindness will be built up forever;\u003c/p\u003e\n\u003cp\u003eIn the heavens You will establish Your faithfulness.”\u003c/p\u003e\n\u003cp\u003e3“I have made a covenant with My chosen;\u003c/p\u003e\n\u003cp\u003eI have sworn to David My servant,\u003c/p\u003e\n\u003cp\u003e4I will establish your seed forever\u003c/p\u003e\n\u003cp\u003eAnd build up your throne to all generations.” Selah.\u003c/p\u003e\n\u003cp\u003e5The heavens will praise Your wonders, O Lord;\u003c/p\u003e\n\u003cp\u003eYour faithfulness also in the assembly of the holy ones.\u003c/p\u003e\n\u003cp\u003e6For who in the skies is comparable to the Lord?\u003c/p\u003e\n\u003cp\u003eWho among the sons of the mighty is like the Lord,\u003c/p\u003e\n\u003cp\u003e7A God greatly feared in the council of the holy ones,\u003c/p\u003e\n\u003cp\u003eAnd awesome above all those who are around Him?\u003c/p\u003e\n\u003cp\u003e8O Lord God of hosts, who is like You, O mighty Lord?\u003c/p\u003e\n\u003cp\u003eYour faithfulness also surrounds You.\u003c/p\u003e\n\u003cp\u003e9You rule the swelling of the sea;\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003e3\u003c/p\u003e\n\u003cp\u003eUltimately, God answers the psalmist’s cries in the person of Jesus. Compare 2 Samuel 7:16\n2 Samuel 7:16\u003c/p\u003e\n\u003cp\u003e16Your house and your kingdom shall endure before Me forever; your throne shall be established forever.” ’ ”\u003c/p\u003e\n\u003cp\u003eto Hebrews 1:8-9\nHebrews 1:8-9\u003c/p\u003e\n\u003cp\u003e8But of the Son He says,\u003c/p\u003e\n\u003cp\u003e“Your throne, O God, is forever and ever,\u003c/p\u003e\n\u003cp\u003eAnd the righteous scepter is the scepter of His kingdom.\u003c/p\u003e\n\u003cp\u003e9You have loved righteousness and hated lawlessness;\u003c/p\u003e\n\u003cp\u003eTherefore God, Your God, has anointed You\u003c/p\u003e\n\u003cp\u003eWith the oil of gladness above Your companions.”\u003c/p\u003e\n\u003cp\u003e. How does King Jesus embody and fulfill the ancient promises of God (e.g. John 1:14\nJohn 1:14\u003c/p\u003e\n\u003cp\u003eThe Word Made Flesh\u003c/p\u003e\n\u003cp\u003e14And the Word became flesh, and dwelt among us, and we saw His glory, glory as of the only begotten from the Father, full of grace and truth.\u003c/p\u003e\n\u003cp\u003e, Hebrews 3:5-6\nHebrews 3:5-6\u003c/p\u003e\n\u003cp\u003e5Now Moses was faithful in all His house as a servant, for a testimony of those things which were to be spoken later; 6but Christ was faithful as a Son over His house—whose house we are, if we hold fast our confidence and the boast of our hope firm until the end.\u003c/p\u003e\n\u003cp\u003e, and Romans 15:8-9\nRomans 15:8-9\u003c/p\u003e\n\u003cp\u003e8For I say that Christ has become a servant to the circumcision on behalf of the truth of God to confirm the promises given to the fathers, 9and for the Gentiles to glorify God for His mercy; as it is written,\u003c/p\u003e\n\u003cp\u003e“Therefore I will give praise to You among the Gentiles,\u003c/p\u003e\n\u003cp\u003eAnd I will sing to Your name.”\u003c/p\u003e\n\u003cp\u003e)?\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003e4\u003c/p\u003e\n\u003cp\u003eRead Hebrews 10:22-25\nHebrews 10:22-25\u003c/p\u003e\n\u003cp\u003e22let us draw near with a sincere heart in full assurance of faith, having our hearts sprinkled clean from an evil conscience and our bodies washed with pure water. 23Let us hold fast the confession of our hope without wavering, for He who promised is faithful; 24and let us consider how to stimulate one another to love and good deeds, 25not forsaking our own assembling together, as is the habit of some, but encouraging one another; and all the more as you see the day drawing near.\u003c/p\u003e\n\u003cp\u003e, Hebrews 11\nHebrews 11\u003c/p\u003e\n\u003cp\u003eThe Triumphs of Faith\u003c/p\u003e\n\u003cp\u003e1Now faith is the assurance of things hoped for, the conviction of things not seen. 2For by it the men of old gained approval.\u003c/p\u003e\n\u003cp\u003e3By faith we understand that the worlds were prepared by the word of God, so that what is seen was not made out of things which are visible. 4By faith Abel offered to God a better sacrifice than Cain, through which he obtained the testimony that he was righteous, God testifying about his gifts, and through faith, though he is dead, he still speaks. 5By faith Enoch was taken up so that he would not see death; and he was not found because God took him up; for he obtained the witness that before his being taken up he was pleasing to God. 6And without faith it is impossible to please Him, for he who comes to God must believe that He is and that He is a rewarder of those who seek Him. 7By faith Noah, being warned by God about things not yet seen, in reverence prepared an ark for the salvation of his household, by which he condemned the world, and became an heir of the righteousness which is according to faith.\u003c/p\u003e\n\u003cp\u003e8By faith Abraham, when he was called, obeyed by going out to a place which he was to receive for an inheritance; and he went out, not knowing where he was going. 9By faith he lived as an alien in the land of promise, as in a foreign land, dwelling in tents with Isaac and Jacob, fellow heirs of the same promise; 10for he was looking for the city which has foundations, whose architect and builder is God. 11By faith even Sarah herself received ability to conceive, even beyond the proper time of life, since she considered Him faithful who had promised. 12Therefore there was born even of one man, and him as good as dead at that, as many descendants as the stars of heaven in number, and innumerable as the sand which is by the seashore.\u003c/p\u003e\n\u003cp\u003e13All these died in faith, without receiving the promises, but having seen them and having welcomed them from a distance, and having confessed that they were strangers and exiles on the earth. 14For those who say such things make it clear that they are seeking a country of their own. 15And indeed if they had been thinking of that country from which they went out, they would have had opportunity to return. 16But as it is, they desire a better country, that is, a heavenly one. Therefore God is not ashamed to be called their God; for He has prepared a city for them.\u003c/p\u003e\n\u003cp\u003e17By faith Abraham, when he was tested, offered up Isaac, and he who had received the promises was offering up his only begotten son; 18it was he to whom it was said, “In Isaac your descendants shall be called.” 19He considered that God is able to raise people even from the dead, from which he also received him back as a type. 20By faith Isaac blessed Jacob and Esau, even regarding things to come. 21By faith Jacob, as he was dying, blessed each of the sons of Joseph, and worshiped, leaning on the top of his staff. 22By faith Joseph, when he was dying, made mention of the exodus of the sons of Israel, and gave orders concerning his bones.\u003c/p\u003e\n\u003cp\u003e23By faith Moses, when he was born, was hidden for three months by his parents, because they saw he was a beautiful child; and they were not afraid of the king’s edict. 24By faith Moses, when he had grown up, refused to be called the son of Pharaoh’s daughter, 25choosing rather to endure ill-treatment with the people of God than to enjoy the passing pleasures of sin, 26considering the reproach of Christ greater riches than the treasures of Egypt; for he was looking to the reward. 27By faith he left Egypt, not fearing the wrath of the king; for he endured, as seeing Him who is unseen. 28By faith he kept the Passover and the sprinkling of the blood, so that he who destroyed the firstborn would not touch them. 29By faith they passed through the Red Sea as though they were passing through dry land; and the Egyptians, when they attempted it, were drowned.\u003c/p\u003e\n\u003cp\u003e30By faith the walls of Jericho fell down after they had been encircled for seven days. 31By faith Rahab the harlot did not perish along with those who were disobedient, after she had welcomed the spies in peace.\u003c/p\u003e\n\u003cp\u003e32And what more shall I say? For time will fail me if I tell of Gideon, Barak, Samson, Jephthah, of David and Samuel and the prophets, 33who by faith conquered kingdoms, performed acts of righteousness, obtained promises, shut the mouths of lions, 34quenched the power of fire, escaped the edge of the sword, from weakness were made strong, became mighty in war, put foreign armies to flight. 35Women received back their dead by resurrection; and others were tortured, not accepting their release, so that they might obtain a better resurrection; 36and others experienced mockings and scourgings, yes, also chains and imprisonment. 37They were stoned, they were sawn in two, they were tempted, they were put to death with the sword; they went about in sheepskins, in goatskins, being destitute, afflicted, ill-treated 38(men of whom the world was not worthy), wandering in deserts and mountains and caves and holes in the ground.\u003c/p\u003e\n\u003cp\u003e39And all these, having gained approval through their faith, did not receive what was promised, 40because God had provided something better for us, so that apart from us they would not be made perfect.\u003c/p\u003e\n\u003cp\u003e, and Hebrews 12:1-3\nHebrews 12:1-3\u003c/p\u003e\n\u003cp\u003eJesus, the Example\u003c/p\u003e\n\u003cp\u003e1Therefore, since we have so great a cloud of witnesses surrounding us, let us also lay aside every encumbrance and the sin which so easily entangles us, and let us run with endurance the race that is set before us, 2fixing our eyes on Jesus, the author and perfecter of faith, who for the joy set before Him endured the cross, despising the shame, and has sat down at the right hand of the throne of God.\u003c/p\u003e\n\u003cp\u003e3For consider Him who has endured such hostility by sinners against Himself, so that you will not grow weary and lose heart.\u003c/p\u003e\n\u003cp\u003e. After reading these passages, name one example of what it looks like to put our trust in God.\u003c/p\u003e\n\u003c/div\u003e\n",
      "content_text": "\n[Link](https://bibleproject.com/bible-studies/faithful/)\n\n# Notes\n\n!!! quote \"Exodus 34:6\"\n\n    Compassioante and gracious, slow to anger, overflowing with loyal love and faithfulness\n\nFaithfulness - Emet (can be translated 'Truth')\nRelated to \"Amen\" which is untranslated Hebrew expression meaning \"that's truth\"\n\n## Stability\n\nMoses has to hold his hands up when Israel faces the Amalekites. Joshua (and another) bring Moses a rock to sit on and hold is hands up so they could be Emet.\n\n## People\n\nDescribs trustiworthiness \n\nExodus 18:21 - Moses apoints leaders are to be \"Emet\"\n\n## God and promises\n\nGod is a rock - he is faithful, just, and upright\n\nHebrew word for trust is He'Emin which is the verb form of Emet\n\nAbraham considers God Emet, he He'Emin's God and God blesses this by creating Isreal.\n\nIsrael, In Exodus 14:31, He'Emin's God (until they see the gians in Canaan that is)\n\n1 Kings 1:6 says David walked in Emet with God\n\n2 Samuel 7:16, God blesses David and says his kingdom will have Emet\n\nRomans 15:8-9 says Jesus came on behalf of God's faithfulness.\n\n# Questions\n\n!!! note \"1\"\n\n    The Hebrew word “emet” is translated with words like “faithful,”\n    “reliable,” “sure,” “trustworthy,” and “amen.” Read aloud Psalm 36:5-6 ,\n    Psalm 19:7 , and Psalm 41:13 and discuss what the psalmists are\n    communicating in these passages when they use the word “emet.”\n\n!!! quote \"Psalms 36:5-6\"\n\n    5Your lovingkindness, O Lord, extends to the heavens,\n\n    Your faithfulness reaches to the skies.\n\n    6Your righteousness is like the mountains of God;\n\n    Your judgments are like a great deep.\n\n    O Lord, You preserve man and beast.\n\n\n!!! quote \"Psalms 19:7\"\n\n    7The law of the Lord is perfect, restoring the soul;\n\n    The testimony of the Lord is sure, making wise the simple.\n\n\n!!! quote \"Psalms 41:13\"\n\n\n    13Blessed be the Lord, the God of Israel,\n\n    From everlasting to everlasting.\n\n    Amen and Amen.\n\n\nI think the lesson here is pretty simple - God is faithful, full stop. His\nfaithfulness doesn't look necessarily like how we might want... when I was a\nkid I would be upset if my parents didn't respond to me in the way I wanted,\nand my kids will certainly share that disappointment. But I am faithful to my\nchildren - sometimes the main issue is a child's outlook on a situation or\nworldview. I think that metaphor holds true in relation to humans and Yahweh -\nhe sees the whole world, we see a part of it so we cannot understand\nfaithfulness fully, in the same way that my children can't understand my\nfaithfulness to them fully - even to the point of being upset or thinking that\n_I'm not being faithful_\n\n!!! note \"2\"\n\n    God promised the Israelites that he would give them a king of peace that\n    would rule forever and ever (e.g. 2 Samuel 7:16). However, Israel’s kingdom\n    collapsed and they found themselves without a home or a king. Compare the\n    beginning of Psalm 89 (vv. 1-10) with the way it closes (vv. 46-52). What\n    do you think it practically looks like to trust God when all seems lost?\n\n!!! quote \"2 Samuel 7:16\"\n\n    16Your house and your kingdom shall endure before Me forever; your throne shall be established forever.” ’ ”\n\n!!! quote \"PSALM 89\"\n\n    The Lord’s Covenant with David, and Israel’s Afflictions.\n\n    A Maskil of Ethan the Ezrahite.\n\n    1I will sing of the lovingkindness of the Lord forever;\n\n    To all generations I will make known Your faithfulness with my mouth.\n\n    2For I have said, “Lovingkindness will be built up forever;\n\n    In the heavens You will establish Your faithfulness.”\n\n    3“I have made a covenant with My chosen;\n\n    I have sworn to David My servant,\n\n    4I will establish your seed forever\n\n    And build up your throne to all generations.” Selah.\n\n    5The heavens will praise Your wonders, O Lord;\n\n    Your faithfulness also in the assembly of the holy ones.\n\n    6For who in the skies is comparable to the Lord?\n\n    Who among the sons of the mighty is like the Lord,\n\n    7A God greatly feared in the council of the holy ones,\n\n    And awesome above all those who are around Him?\n\n    8O Lord God of hosts, who is like You, O mighty Lord?\n\n    Your faithfulness also surrounds You.\n\n    9You rule the swelling of the sea;\n\n\n!!! note \"3\"\n\n    Ultimately, God answers the psalmist’s cries in the person of Jesus. Compare 2 Samuel 7:16\n    2 Samuel 7:16\n\n    16Your house and your kingdom shall endure before Me forever; your throne shall be established forever.” ’ ”\n\n    to Hebrews 1:8-9\n    Hebrews 1:8-9\n\n    8But of the Son He says,\n\n    “Your throne, O God, is forever and ever,\n\n    And the righteous scepter is the scepter of His kingdom.\n\n    9You have loved righteousness and hated lawlessness;\n\n    Therefore God, Your God, has anointed You\n\n    With the oil of gladness above Your companions.”\n\n    . How does King Jesus embody and fulfill the ancient promises of God (e.g. John 1:14\n    John 1:14\n\n    The Word Made Flesh\n\n    14And the Word became flesh, and dwelt among us, and we saw His glory, glory as of the only begotten from the Father, full of grace and truth.\n\n    , Hebrews 3:5-6\n    Hebrews 3:5-6\n\n    5Now Moses was faithful in all His house as a servant, for a testimony of those things which were to be spoken later; 6but Christ was faithful as a Son over His house—whose house we are, if we hold fast our confidence and the boast of our hope firm until the end.\n\n    , and Romans 15:8-9\n    Romans 15:8-9\n\n    8For I say that Christ has become a servant to the circumcision on behalf of the truth of God to confirm the promises given to the fathers, 9and for the Gentiles to glorify God for His mercy; as it is written,\n\n    “Therefore I will give praise to You among the Gentiles,\n\n    And I will sing to Your name.”\n\n    )?\n!!! note \"4\"\n\n    Read Hebrews 10:22-25\n    Hebrews 10:22-25\n\n    22let us draw near with a sincere heart in full assurance of faith, having our hearts sprinkled clean from an evil conscience and our bodies washed with pure water. 23Let us hold fast the confession of our hope without wavering, for He who promised is faithful; 24and let us consider how to stimulate one another to love and good deeds, 25not forsaking our own assembling together, as is the habit of some, but encouraging one another; and all the more as you see the day drawing near.\n\n    , Hebrews 11\n    Hebrews 11\n\n    The Triumphs of Faith\n\n    1Now faith is the assurance of things hoped for, the conviction of things not seen. 2For by it the men of old gained approval.\n\n    3By faith we understand that the worlds were prepared by the word of God, so that what is seen was not made out of things which are visible. 4By faith Abel offered to God a better sacrifice than Cain, through which he obtained the testimony that he was righteous, God testifying about his gifts, and through faith, though he is dead, he still speaks. 5By faith Enoch was taken up so that he would not see death; and he was not found because God took him up; for he obtained the witness that before his being taken up he was pleasing to God. 6And without faith it is impossible to please Him, for he who comes to God must believe that He is and that He is a rewarder of those who seek Him. 7By faith Noah, being warned by God about things not yet seen, in reverence prepared an ark for the salvation of his household, by which he condemned the world, and became an heir of the righteousness which is according to faith.\n\n    8By faith Abraham, when he was called, obeyed by going out to a place which he was to receive for an inheritance; and he went out, not knowing where he was going. 9By faith he lived as an alien in the land of promise, as in a foreign land, dwelling in tents with Isaac and Jacob, fellow heirs of the same promise; 10for he was looking for the city which has foundations, whose architect and builder is God. 11By faith even Sarah herself received ability to conceive, even beyond the proper time of life, since she considered Him faithful who had promised. 12Therefore there was born even of one man, and him as good as dead at that, as many descendants as the stars of heaven in number, and innumerable as the sand which is by the seashore.\n\n    13All these died in faith, without receiving the promises, but having seen them and having welcomed them from a distance, and having confessed that they were strangers and exiles on the earth. 14For those who say such things make it clear that they are seeking a country of their own. 15And indeed if they had been thinking of that country from which they went out, they would have had opportunity to return. 16But as it is, they desire a better country, that is, a heavenly one. Therefore God is not ashamed to be called their God; for He has prepared a city for them.\n\n    17By faith Abraham, when he was tested, offered up Isaac, and he who had received the promises was offering up his only begotten son; 18it was he to whom it was said, “In Isaac your descendants shall be called.” 19He considered that God is able to raise people even from the dead, from which he also received him back as a type. 20By faith Isaac blessed Jacob and Esau, even regarding things to come. 21By faith Jacob, as he was dying, blessed each of the sons of Joseph, and worshiped, leaning on the top of his staff. 22By faith Joseph, when he was dying, made mention of the exodus of the sons of Israel, and gave orders concerning his bones.\n\n    23By faith Moses, when he was born, was hidden for three months by his parents, because they saw he was a beautiful child; and they were not afraid of the king’s edict. 24By faith Moses, when he had grown up, refused to be called the son of Pharaoh’s daughter, 25choosing rather to endure ill-treatment with the people of God than to enjoy the passing pleasures of sin, 26considering the reproach of Christ greater riches than the treasures of Egypt; for he was looking to the reward. 27By faith he left Egypt, not fearing the wrath of the king; for he endured, as seeing Him who is unseen. 28By faith he kept the Passover and the sprinkling of the blood, so that he who destroyed the firstborn would not touch them. 29By faith they passed through the Red Sea as though they were passing through dry land; and the Egyptians, when they attempted it, were drowned.\n\n    30By faith the walls of Jericho fell down after they had been encircled for seven days. 31By faith Rahab the harlot did not perish along with those who were disobedient, after she had welcomed the spies in peace.\n\n    32And what more shall I say? For time will fail me if I tell of Gideon, Barak, Samson, Jephthah, of David and Samuel and the prophets, 33who by faith conquered kingdoms, performed acts of righteousness, obtained promises, shut the mouths of lions, 34quenched the power of fire, escaped the edge of the sword, from weakness were made strong, became mighty in war, put foreign armies to flight. 35Women received back their dead by resurrection; and others were tortured, not accepting their release, so that they might obtain a better resurrection; 36and others experienced mockings and scourgings, yes, also chains and imprisonment. 37They were stoned, they were sawn in two, they were tempted, they were put to death with the sword; they went about in sheepskins, in goatskins, being destitute, afflicted, ill-treated 38(men of whom the world was not worthy), wandering in deserts and mountains and caves and holes in the ground.\n\n    39And all these, having gained approval through their faith, did not receive what was promised, 40because God had provided something better for us, so that apart from us they would not be made perfect.\n\n    , and Hebrews 12:1-3\n    Hebrews 12:1-3\n\n    Jesus, the Example\n\n    1Therefore, since we have so great a cloud of witnesses surrounding us, let us also lay aside every encumbrance and the sin which so easily entangles us, and let us run with endurance the race that is set before us, 2fixing our eyes on Jesus, the author and perfecter of faith, who for the joy set before Him endured the cross, despising the shame, and has sat down at the right hand of the throne of God.\n\n    3For consider Him who has endured such hostility by sinners against Himself, so that you will not grow weary and lose heart.\n\n    . After reading these passages, name one example of what it looks like to put our trust in God.\n",
      "summary": "Link",
      "date_published": "2022-10-21T06:31:33Z",
      "date_modified": "2022-10-21T06:31:33Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "bible-project",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/limit-zfs-list-to-avoid-docker-vomit/",
      "url": "https://pype.dev/limit-zfs-list-to-avoid-docker-vomit/",
      "title": "Limit zfs list to avoid docker vomit",
      "content_html": "\u003cp\u003ezfs list has a flag -r, but if you use zfs driver for docker then you\u0026rsquo;ll get\nflooded with every docker volume in the world. zfs list -r -d N will limit the\ndept of the print out, so zfs list -r -d 2 gives me tank, tank/encrypted,\ntank/encrypted/docker -\u0026gt; but then I don\u0026rsquo;t see all the continer volumes\u003c/p\u003e\n",
      "content_text": "\nzfs list has a flag -r, but if you use zfs driver for docker then you'll get\nflooded with every docker volume in the world. zfs list -r -d N will limit the\ndept of the print out, so zfs list -r -d 2 gives me tank, tank/encrypted,\ntank/encrypted/docker -\u003e but then I don't see all the continer volumes\n",
      "summary": "zfs list has a flag -r, but if you use zfs driver for docker then you'll get flooded with every docker volume in the world. zfs list -r -d N will limit the...",
      "date_published": "2022-10-20T06:39:18Z",
      "date_modified": "2022-10-20T06:39:18Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "zfs",
        "cli",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/use-the-right-lspsage-you-dope/",
      "url": "https://pype.dev/use-the-right-lspsage-you-dope/",
      "title": "Use the right lspsage, you dope!",
      "content_html": "\u003cp\u003eIf you think glepnir/lspsaga.nvim config will work with tali5/lspsaga.nvim installed\u0026hellip; you\u0026rsquo;re in for a rude awakening. Double check your forks folks!\u003c/p\u003e\n",
      "content_text": "\nIf you think glepnir/lspsaga.nvim config will work with tali5/lspsaga.nvim installed... you're in for a rude awakening. Double check your forks folks!\n",
      "summary": "If you think glepnir/lspsaga.nvim config will work with tali5/lspsaga.nvim installed... you're in for a rude awakening. Double check your forks folks!",
      "date_published": "2022-10-14T19:41:44Z",
      "date_modified": "2022-10-14T19:41:44Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "vim",
        "cli",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/sabbath/",
      "url": "https://pype.dev/sabbath/",
      "title": "Sabbath",
      "content_html": "\u003cp\u003e\u003ca href=\"https://bibleproject.com/bible-studies/sabbath/\"\u003eLink to study\u003c/a\u003e\u003c/p\u003e\n\u003ch1 id=\"creation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCreation\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eBrougt to completion on the seventh day in Genesis 1. It is the only day that\ndoes not end with \u0026rsquo;there evening and there was morning, the Nth day'\u003c/p\u003e\n\u003cp\u003eHumans were meant to rest with God in his creation forever, but in their\nrebllion they are sentenced to work as slaves to the land. The rest of the\nhsitory of God\u0026rsquo;s people consists of them looking for God\u0026rsquo;s rest, but\nconsistently falling back into slavery/(fallen) work.\u003c/p\u003e\n\u003ch2 id=\"sabbath\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSabbath\u003c/span\u003e \u003ca href=\"#sabbath\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eCelebated every week on the 7th day. The idea is to live in the eternal rest that God offered in creation.\u003c/p\u003e\n\u003ch2 id=\"jubilee\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eJubilee\u003c/span\u003e \u003ca href=\"#jubilee\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eEvery 7 * 7 years is the Ultimate Sabbath - the land is reset (or was supposed\nto be), everything was returned to the original owner, debt does not persist -\neverything resets so everyone can rest.\u003c/p\u003e\n\u003ch1 id=\"jesus\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eJesus\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eJesus calls himself the Lord of the Sabbath. He claimed to bring the ultimate\nrest of God. Jesus was crucified at a specific time - on Good Friday, and he\nrose again on the following Sunday\u0026hellip; which is the first day of the next week\n\u003cem\u003eor\u003c/em\u003e the 8th day\u0026hellip; the first day of a new age, a new rest, God\u0026rsquo;s ultimate\nsabbath that is symbolized in the 7th day of creation.\u003c/p\u003e\n\u003ch1 id=\"questions\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eQuestions\u003c/span\u003e\u003c/h1\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003e1\u003c/p\u003e\n\u003cp\u003eHow does the author of Genesis conclude each of the seven days of creation?\nConsider the seventh day of creation as an ultimate rest day. What do you\nthink it would be like to always live in that rest with God?\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003eGenesis 1:5,8,13,19,23,31; 2:1-3 5\u003c/p\u003e\n\u003cp\u003e5God called the light day, and the darkness He called night. And there was\nevening and there was morning, one day.\u003c/p\u003e\n\u003cp\u003e8God called the expanse heaven. And there was evening and there was\nmorning, a second day.\u003c/p\u003e\n\u003cp\u003e13There was evening and there was morning, a third day.\u003c/p\u003e\n\u003cp\u003e19There was evening and there was morning, a fourth day.\u003c/p\u003e\n\u003cp\u003e23There was evening and there was morning, a fifth day.\u003c/p\u003e\n\u003cp\u003e31God saw all that He had made, and behold, it was very good. And there was\nevening and there was morning, the sixth day.\u003c/p\u003e\n\u003cp\u003eThe Creation of Man and Woman\u003c/p\u003e\n\u003cp\u003e1Thus the heavens and the earth were completed, and all their hosts. 2By\nthe seventh day God completed His work which He had done, and He rested on\nthe seventh day from all His work which He had done. 3Then God blessed the\nseventh day and sanctified it, because in it He rested from all His work\nwhich God had created and made.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eI imagine it would\u0026rsquo;ve looked a lot like enjoying the creation\u0026hellip; I work at\nthings I love, and that can be restful to me - I find purpose and order in my\nhobbies and so I bet life would be like that. The work woudl be productive but\nnot toilsome.\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003e2\u003c/p\u003e\n\u003cp\u003eRead Genesis 3:1-7 and 3:21-24 What were the humans tempted to believe\nabout God and themselves? How did they act on these beliefs, and how did\nthis choice exile them from the place of rest? How do you think lies about\nGod and ourselves prevent us from resting with God today?\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003eGenesis 3:1-7,21-24\u003c/p\u003e\n\u003cp\u003eThe Fall of Man\u003c/p\u003e\n\u003cp\u003e1Now the serpent was more crafty than any beast of the field which the Lord\nGod had made. And he said to the woman, “Indeed, has God said, ‘You shall\nnot eat from any tree of the garden’?” 2The woman said to the serpent,\n“From the fruit of the trees of the garden we may eat; 3but from the fruit\nof the tree which is in the middle of the garden, God has said, ‘You shall\nnot eat from it or touch it, or you will die.’ ” 4The serpent said to the\nwoman, “You surely will not die! 5For God knows that in the day you eat\nfrom it your eyes will be opened, and you will be like God, knowing good\nand evil.” 6When the woman saw that the tree was good for food, and that it\nwas a delight to the eyes, and that the tree was desirable to make one\nwise, she took from its fruit and ate; and she gave also to her husband\nwith her, and he ate. 7Then the eyes of both of them were opened, and they\nknew that they were naked; and they sewed fig leaves together and made\nthemselves loin coverings.\u003c/p\u003e\n\u003cp\u003e21The Lord God made garments of skin for Adam\nand his wife, and clothed them. 22Then the Lord God said, “Behold, the man\nhas become like one of Us, knowing good and evil; and now, he might stretch\nout his hand, and take also from the tree of life, and eat, and live\nforever”— 23therefore the Lord God sent him out from the garden of Eden, to\ncultivate the ground from which he was taken. 24So He drove the man out;\nand at the east of the garden of Eden He stationed the cherubim and the\nflaming sword which turned every direction to guard the way to the tree of\nlife.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eHumans are templted to believe that God is witholding desirableble information\nthey are templted to \u003cem\u003ebe like God\u003c/em\u003e. They are templted to believe that they\nwould be right to knowing good and evil (ironic since they know it\u0026rsquo;s bad to eat\nof the Tree of Knowledge anyways)\u003c/p\u003e\n\u003cp\u003eThey acted by listening to the serpent, and to themselves\u0026hellip; essentially they\nchose to not listen and adhere to Yahweh. This choice represents stark and\nobvious rebellion. Yahweh, I think, sees that his creation are tempted to go\ntheir own way, and for their own protection exiles them from the Garden.\u003c/p\u003e\n\u003cp\u003eIt seems like lies haven\u0026rsquo;t changed; ultimately we are still tempted to define\ngood and evil/bad for ourselves. I take action by defining wicked things as\ngood - made obvious by the fact that I choose to sin often, choose to not\nlisten to Yahweh. Actively listening to myself is exhausting. I think there\u0026rsquo;s a\nlot to discussing \u0026ldquo;God\u0026rsquo;s rest\u0026rdquo;, but a high and almost trivial level, I am\nsimply less tired when my life is more in step with God\u0026rsquo;s definitions of good\nand bad\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003e3\u003c/p\u003e\n\u003cp\u003eGod wants to restore humanity to ultimate rest, so he chooses the\nIsraelites to reenact his seventh-day rest so they can share it with\nothers. Of all the ways he invites them to practice rest which practice are\nyou least familiar with today?\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003eExodus 20:8-11\u003c/p\u003e\n\u003cp\u003e8“Remember the sabbath day, to keep it holy. 9Six days you shall labor and\ndo all your work, 10but the seventh day is a sabbath of the Lord your God;\nin it you shall not do any work, you or your son or your daughter, your\nmale or your female servant or your cattle or your sojourner who stays with\nyou. 11For in six days the Lord made the heavens and the earth, the sea and\nall that is in them, and rested on the seventh day; therefore the Lord\nblessed the sabbath day and made it holy.\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003eLeviticus 23:1-3; 25:8-13\u003c/p\u003e\n\u003cp\u003eLaws of Religious Festivals\u003c/p\u003e\n\u003cp\u003e1The Lord spoke again to Moses, saying, 2“Speak to the sons of Israel and\nsay to them, ‘The Lord’s appointed times which you shall proclaim as holy\nconvocations—My appointed times are these:\u003c/p\u003e\n\u003cp\u003e3‘For six days work may be done, but on the seventh day there is a sabbath\nof complete rest, a holy convocation. You shall not do any work; it is a\nsabbath to the Lord in all your dwellings.\u003c/p\u003e\n\u003cp\u003e8‘You are also to count off seven sabbaths of years for yourself, seven\ntimes seven years, so that you have the time of the seven sabbaths of\nyears, namely, forty-nine years. 9You shall then sound a ram’s horn abroad\non the tenth day of the seventh month; on the day of atonement you shall\nsound a horn all through your land. 10You shall thus consecrate the\nfiftieth year and proclaim a release through the land to all its\ninhabitants. It shall be a jubilee for you, and each of you shall return to\nhis own property, and each of you shall return to his family. 11You shall\nhave the fiftieth year as a jubilee; you shall not sow, nor reap its\naftergrowth, nor gather in from its untrimmed vines. 12For it is a jubilee;\nit shall be holy to you. You shall eat its crops out of the field.\u003c/p\u003e\n\u003cp\u003e13‘On this year of jubilee each of you shall return to his own property.\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003e4\u003c/p\u003e\n\u003cp\u003eJesus comes to restore us to God’s eternal rest! How does Jesus launch his\npublic ministry? Read Luke 4:14-21, noting that the year of favor refers to\nthe ultimate Jubilee—Israel’s super-charged Sabbath\u003c/p\u003e\n\u003cp\u003eWhat do you observe?\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003eLuke 4:14-21\u003c/p\u003e\n\u003cp\u003eJesus’ Public Ministry\u003c/p\u003e\n\u003cp\u003e14And Jesus returned to Galilee in the power of the Spirit, and news about\nHim spread through all the surrounding district. 15And He began teaching in\ntheir synagogues and was praised by all.\u003c/p\u003e\n\u003cp\u003e16And He came to Nazareth, where He had been brought up; and as was His\ncustom, He entered the synagogue on the Sabbath, and stood up to read.\n17And the book of the prophet Isaiah was handed to Him. And He opened the\nbook and found the place where it was written,\u003c/p\u003e\n\u003cp\u003e18“The Spirit of the Lord is upon Me,\u003c/p\u003e\n\u003cp\u003eBecause He anointed Me to preach the gospel to the poor.\u003c/p\u003e\n\u003cp\u003eHe has sent Me to proclaim release to the captives,\u003c/p\u003e\n\u003cp\u003eAnd recovery of sight to the blind,\u003c/p\u003e\n\u003cp\u003eTo set free those who are oppressed,\u003c/p\u003e\n\u003cp\u003e19To proclaim the favorable year of the Lord.”\u003c/p\u003e\n\u003cp\u003e20And He closed the book, gave it back to the attendant and sat down; and\nthe eyes of all in the synagogue were fixed on Him. 21And He began to say\nto them, “Today this Scripture has been fulfilled in your hearing.”\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003eLeviticus 25\u003c/p\u003e\n\u003cp\u003eThe Sabbatic Year and Year of Jubilee\u003c/p\u003e\n\u003cp\u003e1The Lord then spoke to Moses at Mount Sinai, saying, 2“Speak to the sons\nof Israel and say to them, ‘When you come into the land which I shall give\nyou, then the land shall have a sabbath to the Lord. 3Six years you shall\nsow your field, and six years you shall prune your vineyard and gather in\nits crop, 4but during the seventh year the land shall have a sabbath rest,\na sabbath to the Lord; you shall not sow your field nor prune your\nvineyard. 5Your harvest’s aftergrowth you shall not reap, and your grapes\nof untrimmed vines you shall not gather; the land shall have a sabbatical\nyear. 6All of you shall have the sabbath products of the land for food;\nyourself, and your male and female slaves, and your hired man and your\nforeign resident, those who live as aliens with you. 7Even your cattle and\nthe animals that are in your land shall have all its crops to eat.\u003c/p\u003e\n\u003cp\u003e8‘You are also to count off seven sabbaths of years for yourself, seven\ntimes seven years, so that you have the time of the seven sabbaths of\nyears, namely, forty-nine years. 9You shall then sound a ram’s horn abroad\non the tenth day of the seventh month; on the day of atonement you shall\nsound a horn all through your land. 10You shall thus consecrate the\nfiftieth year and proclaim a release through the land to all its\ninhabitants. It shall be a jubilee for you, and each of you shall return to\nhis own property, and each of you shall return to his family. 11You shall\nhave the fiftieth year as a jubilee; you shall not sow, nor reap its\naftergrowth, nor gather in from its untrimmed vines. 12For it is a jubilee;\nit shall be holy to you. You shall eat its crops out of the field.\u003c/p\u003e\n\u003cp\u003e13‘On this year of jubilee each of you shall return to his own property.\n14If you make a sale, moreover, to your friend or buy from your friend’s\nhand, you shall not wrong one another. 15Corresponding to the number of\nyears after the jubilee, you shall buy from your friend; he is to sell to\nyou according to the number of years of crops. 16In proportion to the\nextent of the years you shall increase its price, and in proportion to the\nfewness of the years you shall diminish its price, for it is a number of\ncrops he is selling to you. 17So you shall not wrong one another, but you\nshall fear your God; for I am the Lord your God.\u003c/p\u003e\n\u003cp\u003e18‘You shall thus observe My statutes and keep My judgments, so as to carry\nthem out, that you may live securely on the land. 19Then the land will\nyield its produce, so that you can eat your fill and live securely on it.\n20But if you say, “What are we going to eat on the seventh year if we do\nnot sow or gather in our crops?” 21then I will so order My blessing for you\nin the sixth year that it will bring forth the crop for three years. 22When\nyou are sowing the eighth year, you can still eat old things from the crop,\neating the old until the ninth year when its crop comes in.\u003c/p\u003e\n\u003cp\u003eThe Law of Redemption\u003c/p\u003e\n\u003cp\u003e23‘The land, moreover, shall not be sold permanently, for the land is Mine;\nfor you are but aliens and sojourners with Me. 24Thus for every piece of\nyour property, you are to provide for the redemption of the land.\u003c/p\u003e\n\u003cp\u003e25‘If a fellow countryman of yours becomes so poor he has to sell part of\nhis property, then his nearest kinsman is to come and buy back what his\nrelative has sold. 26Or in case a man has no kinsman, but so recovers his\nmeans as to find sufficient for its redemption, 27then he shall calculate\nthe years since its sale and refund the balance to the man to whom he sold\nit, and so return to his property. 28But if he has not found sufficient\nmeans to get it back for himself, then what he has sold shall remain in the\nhands of its purchaser until the year of jubilee; but at the jubilee it\nshall revert, that he may return to his property.\u003c/p\u003e\n\u003cp\u003e29‘Likewise, if a man sells a dwelling house in a walled city, then his\nredemption right remains valid until a full year from its sale; his right\nof redemption lasts a full year. 30But if it is not bought back for him\nwithin the space of a full year, then the house that is in the walled city\npasses permanently to its purchaser throughout his generations; it does not\nrevert in the jubilee. 31The houses of the villages, however, which have no\nsurrounding wall shall be considered as open fields; they have redemption\nrights and revert in the jubilee. 32As for cities of the Levites, the\nLevites have a permanent right of redemption for the houses of the cities\nwhich are their possession. 33What, therefore, belongs to the Levites may\nbe redeemed and a house sale in the city of this possession reverts in the\njubilee, for the houses of the cities of the Levites are their possession\namong the sons of Israel. 34But pasture fields of their cities shall not be\nsold, for that is their perpetual possession.\u003c/p\u003e\n\u003cp\u003eOf Poor Countrymen\u003c/p\u003e\n\u003cp\u003e35‘Now in case a countryman of yours becomes poor and his means with regard\nto you falter, then you are to sustain him, like a stranger or a sojourner,\nthat he may live with you. 36Do not take usurious interest from him, but\nrevere your God, that your countryman may live with you. 37You shall not\ngive him your silver at interest, nor your food for gain. 38I am the Lord\nyour God, who brought you out of the land of Egypt to give you the land of\nCanaan and to be your God.\u003c/p\u003e\n\u003cp\u003e39‘If a countryman of yours becomes so poor with regard to you that he\nsells himself to you, you shall not subject him to a slave’s service. 40He\nshall be with you as a hired man, as if he were a sojourner; he shall serve\nwith you until the year of jubilee. 41He shall then go out from you, he and\nhis sons with him, and shall go back to his family, that he may return to\nthe property of his forefathers. 42For they are My servants whom I brought\nout from the land of Egypt; they are not to be sold in a slave sale. 43You\nshall not rule over him with severity, but are to revere your God. 44As for\nyour male and female slaves whom you may have—you may acquire male and\nfemale slaves from the pagan nations that are around you. 45Then, too, it\nis out of the sons of the sojourners who live as aliens among you that you\nmay gain acquisition, and out of their families who are with you, whom they\nwill have produced in your land; they also may become your possession.\n46You may even bequeath them to your sons after you, to receive as a\npossession; you can use them as permanent slaves. But in respect to your\ncountrymen, the sons of Israel, you shall not rule with severity over one\nanother.\u003c/p\u003e\n\u003cp\u003eOf Redeeming a Poor Man\u003c/p\u003e\n\u003cp\u003e47‘Now if the means of a stranger or of a sojourner with you becomes\nsufficient, and a countryman of yours becomes so poor with regard to him as\nto sell himself to a stranger who is sojourning with you, or to the\ndescendants of a stranger’s family, 48then he shall have redemption right\nafter he has been sold. One of his brothers may redeem him, 49or his uncle,\nor his uncle’s son, may redeem him, or one of his blood relatives from his\nfamily may redeem him; or if he prospers, he may redeem himself. 50He then\nwith his purchaser shall calculate from the year when he sold himself to\nhim up to the year of jubilee; and the price of his sale shall correspond\nto the number of years. It is like the days of a hired man that he shall be\nwith him. 51If there are still many years, he shall refund part of his\npurchase price in proportion to them for his own redemption; 52and if few\nyears remain until the year of jubilee, he shall so calculate with him. In\nproportion to his years he is to refund the amount for his redemption.\n53Like a man hired year by year he shall be with him; he shall not rule\nover him with severity in your sight. 54Even if he is not redeemed by these\nmeans, he shall still go out in the year of jubilee, he and his sons with\nhim. 55For the sons of Israel are My servants; they are My servants whom I\nbrought out from the land of Egypt. I am the Lord your God.\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003e5\u003c/p\u003e\n\u003cp\u003eWhat is one specific way Jesus invites us to receive and practice true rest\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003eMatthew 11:28-29\u003c/p\u003e\n\u003cp\u003e28“Come to Me, all who are weary and heavy-laden, and I will give you rest.\n29Take My yoke upon you and learn from Me, for I am gentle and humble in\nheart, and you will find rest for your souls.\u003c/p\u003e\n\u003c/div\u003e\n",
      "content_text": "\n[Link to study](https://bibleproject.com/bible-studies/sabbath/)\n\n# Creation\n\nBrougt to completion on the seventh day in Genesis 1. It is the only day that\ndoes not end with 'there evening and there was morning, the Nth day'\n\nHumans were meant to rest with God in his creation forever, but in their\nrebllion they are sentenced to work as slaves to the land. The rest of the\nhsitory of God's people consists of them looking for God's rest, but\nconsistently falling back into slavery/(fallen) work.\n\n## Sabbath\n\nCelebated every week on the 7th day. The idea is to live in the eternal rest that God offered in creation.\n\n## Jubilee\n\nEvery 7 * 7 years is the Ultimate Sabbath - the land is reset (or was supposed\nto be), everything was returned to the original owner, debt does not persist -\neverything resets so everyone can rest.\n\n# Jesus\n\nJesus calls himself the Lord of the Sabbath. He claimed to bring the ultimate\nrest of God. Jesus was crucified at a specific time - on Good Friday, and he\nrose again on the following Sunday... which is the first day of the next week\n_or_ the 8th day... the first day of a new age, a new rest, God's ultimate\nsabbath that is symbolized in the 7th day of creation.\n\n# Questions\n\n!!! note \"1\"\n\n    How does the author of Genesis conclude each of the seven days of creation?\n    Consider the seventh day of creation as an ultimate rest day. What do you\n    think it would be like to always live in that rest with God?\n\n!!! quote \"Genesis 1:5,8,13,19,23,31; 2:1-3 5\"\n\n    5God called the light day, and the darkness He called night. And there was\n    evening and there was morning, one day.\n\n    8God called the expanse heaven. And there was evening and there was\n    morning, a second day.\n\n    13There was evening and there was morning, a third day.\n\n    19There was evening and there was morning, a fourth day.\n\n    23There was evening and there was morning, a fifth day.\n\n    31God saw all that He had made, and behold, it was very good. And there was\n    evening and there was morning, the sixth day.\n\n    The Creation of Man and Woman\n\n    1Thus the heavens and the earth were completed, and all their hosts. 2By\n    the seventh day God completed His work which He had done, and He rested on\n    the seventh day from all His work which He had done. 3Then God blessed the\n    seventh day and sanctified it, because in it He rested from all His work\n    which God had created and made.\n\nI imagine it would've looked a lot like enjoying the creation... I work at\nthings I love, and that can be restful to me - I find purpose and order in my\nhobbies and so I bet life would be like that. The work woudl be productive but\nnot toilsome.\n\n\n!!! note \"2\"\n\n    Read Genesis 3:1-7 and 3:21-24 What were the humans tempted to believe\n    about God and themselves? How did they act on these beliefs, and how did\n    this choice exile them from the place of rest? How do you think lies about\n    God and ourselves prevent us from resting with God today?\n\n!!! quote \"Genesis 3:1-7,21-24\"\n\n    The Fall of Man\n\n    1Now the serpent was more crafty than any beast of the field which the Lord\n    God had made. And he said to the woman, “Indeed, has God said, ‘You shall\n    not eat from any tree of the garden’?” 2The woman said to the serpent,\n    “From the fruit of the trees of the garden we may eat; 3but from the fruit\n    of the tree which is in the middle of the garden, God has said, ‘You shall\n    not eat from it or touch it, or you will die.’ ” 4The serpent said to the\n    woman, “You surely will not die! 5For God knows that in the day you eat\n    from it your eyes will be opened, and you will be like God, knowing good\n    and evil.” 6When the woman saw that the tree was good for food, and that it\n    was a delight to the eyes, and that the tree was desirable to make one\n    wise, she took from its fruit and ate; and she gave also to her husband\n    with her, and he ate. 7Then the eyes of both of them were opened, and they\n    knew that they were naked; and they sewed fig leaves together and made\n    themselves loin coverings. \n\n    21The Lord God made garments of skin for Adam\n    and his wife, and clothed them. 22Then the Lord God said, “Behold, the man\n    has become like one of Us, knowing good and evil; and now, he might stretch\n    out his hand, and take also from the tree of life, and eat, and live\n    forever”— 23therefore the Lord God sent him out from the garden of Eden, to\n    cultivate the ground from which he was taken. 24So He drove the man out;\n    and at the east of the garden of Eden He stationed the cherubim and the\n    flaming sword which turned every direction to guard the way to the tree of\n    life.\n\nHumans are templted to believe that God is witholding desirableble information\nthey are templted to _be like God_. They are templted to believe that they\nwould be right to knowing good and evil (ironic since they know it's bad to eat\nof the Tree of Knowledge anyways)\n\nThey acted by listening to the serpent, and to themselves... essentially they\nchose to not listen and adhere to Yahweh. This choice represents stark and\nobvious rebellion. Yahweh, I think, sees that his creation are tempted to go\ntheir own way, and for their own protection exiles them from the Garden.\n\nIt seems like lies haven't changed; ultimately we are still tempted to define\ngood and evil/bad for ourselves. I take action by defining wicked things as\ngood - made obvious by the fact that I choose to sin often, choose to not\nlisten to Yahweh. Actively listening to myself is exhausting. I think there's a\nlot to discussing \"God's rest\", but a high and almost trivial level, I am\nsimply less tired when my life is more in step with God's definitions of good\nand bad\n\n!!! note \"3\"\n\n    God wants to restore humanity to ultimate rest, so he chooses the\n    Israelites to reenact his seventh-day rest so they can share it with\n    others. Of all the ways he invites them to practice rest which practice are\n    you least familiar with today?\n\n!!! quote \"Exodus 20:8-11\"\n\n    8“Remember the sabbath day, to keep it holy. 9Six days you shall labor and\n    do all your work, 10but the seventh day is a sabbath of the Lord your God;\n    in it you shall not do any work, you or your son or your daughter, your\n    male or your female servant or your cattle or your sojourner who stays with\n    you. 11For in six days the Lord made the heavens and the earth, the sea and\n    all that is in them, and rested on the seventh day; therefore the Lord\n    blessed the sabbath day and made it holy.\n\n!!! quote \"Leviticus 23:1-3; 25:8-13\"\n\n    Laws of Religious Festivals\n\n    1The Lord spoke again to Moses, saying, 2“Speak to the sons of Israel and\n    say to them, ‘The Lord’s appointed times which you shall proclaim as holy\n    convocations—My appointed times are these:\n\n    3‘For six days work may be done, but on the seventh day there is a sabbath\n    of complete rest, a holy convocation. You shall not do any work; it is a\n    sabbath to the Lord in all your dwellings.\n\n    8‘You are also to count off seven sabbaths of years for yourself, seven\n    times seven years, so that you have the time of the seven sabbaths of\n    years, namely, forty-nine years. 9You shall then sound a ram’s horn abroad\n    on the tenth day of the seventh month; on the day of atonement you shall\n    sound a horn all through your land. 10You shall thus consecrate the\n    fiftieth year and proclaim a release through the land to all its\n    inhabitants. It shall be a jubilee for you, and each of you shall return to\n    his own property, and each of you shall return to his family. 11You shall\n    have the fiftieth year as a jubilee; you shall not sow, nor reap its\n    aftergrowth, nor gather in from its untrimmed vines. 12For it is a jubilee;\n    it shall be holy to you. You shall eat its crops out of the field.\n\n    13‘On this year of jubilee each of you shall return to his own property.\n\n\n!!! note \"4\"\n\n    Jesus comes to restore us to God’s eternal rest! How does Jesus launch his\n    public ministry? Read Luke 4:14-21, noting that the year of favor refers to\n    the ultimate Jubilee—Israel’s super-charged Sabbath \n\n    What do you observe?\n\n!!! quote \"Luke 4:14-21\"\n\n    Jesus’ Public Ministry\n\n    14And Jesus returned to Galilee in the power of the Spirit, and news about\n    Him spread through all the surrounding district. 15And He began teaching in\n    their synagogues and was praised by all.\n\n    16And He came to Nazareth, where He had been brought up; and as was His\n    custom, He entered the synagogue on the Sabbath, and stood up to read.\n    17And the book of the prophet Isaiah was handed to Him. And He opened the\n    book and found the place where it was written,\n\n    18“The Spirit of the Lord is upon Me,\n\n    Because He anointed Me to preach the gospel to the poor.\n\n    He has sent Me to proclaim release to the captives,\n\n    And recovery of sight to the blind,\n\n    To set free those who are oppressed,\n\n    19To proclaim the favorable year of the Lord.”\n\n    20And He closed the book, gave it back to the attendant and sat down; and\n    the eyes of all in the synagogue were fixed on Him. 21And He began to say\n    to them, “Today this Scripture has been fulfilled in your hearing.”\n\n!!! quote \"Leviticus 25\"\n\n    The Sabbatic Year and Year of Jubilee\n\n    1The Lord then spoke to Moses at Mount Sinai, saying, 2“Speak to the sons\n    of Israel and say to them, ‘When you come into the land which I shall give\n    you, then the land shall have a sabbath to the Lord. 3Six years you shall\n    sow your field, and six years you shall prune your vineyard and gather in\n    its crop, 4but during the seventh year the land shall have a sabbath rest,\n    a sabbath to the Lord; you shall not sow your field nor prune your\n    vineyard. 5Your harvest’s aftergrowth you shall not reap, and your grapes\n    of untrimmed vines you shall not gather; the land shall have a sabbatical\n    year. 6All of you shall have the sabbath products of the land for food;\n    yourself, and your male and female slaves, and your hired man and your\n    foreign resident, those who live as aliens with you. 7Even your cattle and\n    the animals that are in your land shall have all its crops to eat.\n\n    8‘You are also to count off seven sabbaths of years for yourself, seven\n    times seven years, so that you have the time of the seven sabbaths of\n    years, namely, forty-nine years. 9You shall then sound a ram’s horn abroad\n    on the tenth day of the seventh month; on the day of atonement you shall\n    sound a horn all through your land. 10You shall thus consecrate the\n    fiftieth year and proclaim a release through the land to all its\n    inhabitants. It shall be a jubilee for you, and each of you shall return to\n    his own property, and each of you shall return to his family. 11You shall\n    have the fiftieth year as a jubilee; you shall not sow, nor reap its\n    aftergrowth, nor gather in from its untrimmed vines. 12For it is a jubilee;\n    it shall be holy to you. You shall eat its crops out of the field.\n\n    13‘On this year of jubilee each of you shall return to his own property.\n    14If you make a sale, moreover, to your friend or buy from your friend’s\n    hand, you shall not wrong one another. 15Corresponding to the number of\n    years after the jubilee, you shall buy from your friend; he is to sell to\n    you according to the number of years of crops. 16In proportion to the\n    extent of the years you shall increase its price, and in proportion to the\n    fewness of the years you shall diminish its price, for it is a number of\n    crops he is selling to you. 17So you shall not wrong one another, but you\n    shall fear your God; for I am the Lord your God.\n\n    18‘You shall thus observe My statutes and keep My judgments, so as to carry\n    them out, that you may live securely on the land. 19Then the land will\n    yield its produce, so that you can eat your fill and live securely on it.\n    20But if you say, “What are we going to eat on the seventh year if we do\n    not sow or gather in our crops?” 21then I will so order My blessing for you\n    in the sixth year that it will bring forth the crop for three years. 22When\n    you are sowing the eighth year, you can still eat old things from the crop,\n    eating the old until the ninth year when its crop comes in.\n\n    The Law of Redemption\n\n    23‘The land, moreover, shall not be sold permanently, for the land is Mine;\n    for you are but aliens and sojourners with Me. 24Thus for every piece of\n    your property, you are to provide for the redemption of the land.\n\n    25‘If a fellow countryman of yours becomes so poor he has to sell part of\n    his property, then his nearest kinsman is to come and buy back what his\n    relative has sold. 26Or in case a man has no kinsman, but so recovers his\n    means as to find sufficient for its redemption, 27then he shall calculate\n    the years since its sale and refund the balance to the man to whom he sold\n    it, and so return to his property. 28But if he has not found sufficient\n    means to get it back for himself, then what he has sold shall remain in the\n    hands of its purchaser until the year of jubilee; but at the jubilee it\n    shall revert, that he may return to his property.\n\n    29‘Likewise, if a man sells a dwelling house in a walled city, then his\n    redemption right remains valid until a full year from its sale; his right\n    of redemption lasts a full year. 30But if it is not bought back for him\n    within the space of a full year, then the house that is in the walled city\n    passes permanently to its purchaser throughout his generations; it does not\n    revert in the jubilee. 31The houses of the villages, however, which have no\n    surrounding wall shall be considered as open fields; they have redemption\n    rights and revert in the jubilee. 32As for cities of the Levites, the\n    Levites have a permanent right of redemption for the houses of the cities\n    which are their possession. 33What, therefore, belongs to the Levites may\n    be redeemed and a house sale in the city of this possession reverts in the\n    jubilee, for the houses of the cities of the Levites are their possession\n    among the sons of Israel. 34But pasture fields of their cities shall not be\n    sold, for that is their perpetual possession.\n\n    Of Poor Countrymen\n\n    35‘Now in case a countryman of yours becomes poor and his means with regard\n    to you falter, then you are to sustain him, like a stranger or a sojourner,\n    that he may live with you. 36Do not take usurious interest from him, but\n    revere your God, that your countryman may live with you. 37You shall not\n    give him your silver at interest, nor your food for gain. 38I am the Lord\n    your God, who brought you out of the land of Egypt to give you the land of\n    Canaan and to be your God.\n\n    39‘If a countryman of yours becomes so poor with regard to you that he\n    sells himself to you, you shall not subject him to a slave’s service. 40He\n    shall be with you as a hired man, as if he were a sojourner; he shall serve\n    with you until the year of jubilee. 41He shall then go out from you, he and\n    his sons with him, and shall go back to his family, that he may return to\n    the property of his forefathers. 42For they are My servants whom I brought\n    out from the land of Egypt; they are not to be sold in a slave sale. 43You\n    shall not rule over him with severity, but are to revere your God. 44As for\n    your male and female slaves whom you may have—you may acquire male and\n    female slaves from the pagan nations that are around you. 45Then, too, it\n    is out of the sons of the sojourners who live as aliens among you that you\n    may gain acquisition, and out of their families who are with you, whom they\n    will have produced in your land; they also may become your possession.\n    46You may even bequeath them to your sons after you, to receive as a\n    possession; you can use them as permanent slaves. But in respect to your\n    countrymen, the sons of Israel, you shall not rule with severity over one\n    another.\n\n    Of Redeeming a Poor Man\n\n    47‘Now if the means of a stranger or of a sojourner with you becomes\n    sufficient, and a countryman of yours becomes so poor with regard to him as\n    to sell himself to a stranger who is sojourning with you, or to the\n    descendants of a stranger’s family, 48then he shall have redemption right\n    after he has been sold. One of his brothers may redeem him, 49or his uncle,\n    or his uncle’s son, may redeem him, or one of his blood relatives from his\n    family may redeem him; or if he prospers, he may redeem himself. 50He then\n    with his purchaser shall calculate from the year when he sold himself to\n    him up to the year of jubilee; and the price of his sale shall correspond\n    to the number of years. It is like the days of a hired man that he shall be\n    with him. 51If there are still many years, he shall refund part of his\n    purchase price in proportion to them for his own redemption; 52and if few\n    years remain until the year of jubilee, he shall so calculate with him. In\n    proportion to his years he is to refund the amount for his redemption.\n    53Like a man hired year by year he shall be with him; he shall not rule\n    over him with severity in your sight. 54Even if he is not redeemed by these\n    means, he shall still go out in the year of jubilee, he and his sons with\n    him. 55For the sons of Israel are My servants; they are My servants whom I\n    brought out from the land of Egypt. I am the Lord your God.\n\n\n!!! note \"5\"\n\n    What is one specific way Jesus invites us to receive and practice true rest\n\n!!! quote \"Matthew 11:28-29\"\n\n    28“Come to Me, all who are weary and heavy-laden, and I will give you rest.\n    29Take My yoke upon you and learn from Me, for I am gentle and humble in\n    heart, and you will find rest for your souls.\n\n",
      "summary": "Link to study",
      "date_published": "2022-10-13T06:34:52Z",
      "date_modified": "2022-10-13T06:34:52Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "bible-project",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/you-can-embed-gifs/",
      "url": "https://pype.dev/you-can-embed-gifs/",
      "title": "You can embed gifs?!",
      "content_html": "\u003cp\u003eI learned you can embed gifs and stuch in things other than GH personal pages!\u003c/p\u003e\n\u003cp\u003eSo here I\u0026rsquo;ll keep ones I like and might use later\u003c/p\u003e\n\u003ciframe src=\"https://giphy.com/embed/jXBwoFfPsCCoE\" width=\"25px\" height=\"25px\" frameBorder=\"0\" class=\"giphy-embed\" allowFullScreen\u003e\u003c/iframe\u003e\u003cp\u003e\u003ca href=\"https://giphy.com/gifs/tech-rainbow-jXBwoFfPsCCoE\"\u003evia GIPHY\u003c/a\u003e\u003c/p\u003e\n",
      "content_text": "\nI learned you can embed gifs and stuch in things other than GH personal pages!\n\n\nSo here I'll keep ones I like and might use later\n\n\u003ciframe src=\"https://giphy.com/embed/jXBwoFfPsCCoE\" width=\"25px\" height=\"25px\" frameBorder=\"0\" class=\"giphy-embed\" allowFullScreen\u003e\u003c/iframe\u003e\u003cp\u003e\u003ca href=\"https://giphy.com/gifs/tech-rainbow-jXBwoFfPsCCoE\"\u003evia GIPHY\u003c/a\u003e\u003c/p\u003e\n",
      "summary": "I learned you can embed gifs and stuch in things other than GH personal pages!",
      "date_published": "2022-10-09T13:39:39Z",
      "date_modified": "2022-10-09T13:39:39Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "webdev",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/dont-forget-to-load-xmp/",
      "url": "https://pype.dev/dont-forget-to-load-xmp/",
      "title": "Don’t forget to load XMP!",
      "content_html": "\u003cp\u003eBought some DDR4-3600 speed RAM but only seeing 2666? Load up the BIOS, find DRAM config or something similar, and make sure to load the XMP profile to get that advertised RAM speed!\u003c/p\u003e\n",
      "content_text": "\nBought some DDR4-3600 speed RAM but only seeing 2666? Load up the BIOS, find DRAM config or something similar, and make sure to load the XMP profile to get that advertised RAM speed!\n",
      "summary": "Bought some DDR4-3600 speed RAM but only seeing 2666? Load up the BIOS, find DRAM config or something similar, and make sure to load the XMP profile to get...",
      "date_published": "2022-10-09T07:17:43Z",
      "date_modified": "2022-10-09T07:17:43Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "linux",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/my-passmark-scores/",
      "url": "https://pype.dev/my-passmark-scores/",
      "title": "My PassMark Scores",
      "content_html": "\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eBabyblue v2\u003c/p\u003e\n\u003cp\u003eRyzen 5700x + 32 GB 3200 CL16 RAM\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://www.passmark.com/baselines/V10/display.php?id=503041456656\"\u003e\u003cimg src=\"https://www.passmark.com/baselines/V10/media/503041456656.png\" alt=\"PassMark Rating\" border=\"0\" /\u003e\u003c/a\u003e\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eVenus \u003c/p\u003e\n\u003cp\u003eRyzen 3200G + 16GB 3600 CL16 RAM\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://www.passmark.com/baselines/V10/display.php?id=502360857958\"\u003e\u003cimg src=\"https://www.passmark.com/baselines/V10/media/502360857958.png\" height=120px alt=\"PassMark Rating\" border=\"0\" /\u003e\u003c/a\u003e\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eHogwarts\u003c/p\u003e\n\u003cp\u003eDual Xeon X5650 @2.67GHz | 90 GB 1883 DDR3 ECC RAM\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://www.passmark.com/baselines/V10/display.php?id=502361259420\"\u003e\u003cimg src=\"https://www.passmark.com/baselines/V10/media/502361259420.png\" height=120px alt=\"PassMark Rating\" border=\"0\" /\u003e\u003c/a\u003e\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eServer 2 ... Change the name\u003c/p\u003e\n\u003cp\u003eRyzen 5700G + 128GB 3200 CL18 RAM\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://www.passmark.com/baselines/V10/display.php?id=502361424410\"\u003e\u003cimg src=\"https://www.passmark.com/baselines/V10/media/502361424410.png\" height=120px alt=\"PassMark Rating\" border=\"0\" /\u003e\u003c/a\u003e\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eServer 2 with XMP enabled and undervolted from 1.35 to 1.2\u003c/p\u003e\n\u003cp\u003eRyzen 5700G + 128GB 3200 CL18 RAM\u003c/p\u003e\n\u003cp\u003eUndervolted to 1.2V (from 1.35)\nXMP enabled\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://www.passmark.com/baselines/V10/display.php?id=502363064921\"\u003e\u003cimg src=\"https://www.passmark.com/baselines/V10/media/502363064921.png\" height=120px alt=\"PassMark Rating\" border=\"0\" /\u003e\u003c/a\u003e\u003c/p\u003e\n\u003c/div\u003e\n",
      "content_text": "\n!!! note \"Babyblue v2\"\n\n    Ryzen 5700x + 32 GB 3200 CL16 RAM\n\n    \u003ca href=\"https://www.passmark.com/baselines/V10/display.php?id=503041456656\"\u003e\u003cimg src=\"https://www.passmark.com/baselines/V10/media/503041456656.png\" alt=\"PassMark Rating\" border=\"0\" /\u003e\u003c/a\u003e\n\n!!! note \"Venus \"\n\n    Ryzen 3200G + 16GB 3600 CL16 RAM\n\n    \u003ca href=\"https://www.passmark.com/baselines/V10/display.php?id=502360857958\"\u003e\u003cimg src=\"https://www.passmark.com/baselines/V10/media/502360857958.png\" height=120px alt=\"PassMark Rating\" border=\"0\" /\u003e\u003c/a\u003e\n\n!!! note \"Hogwarts\"\n\n    Dual Xeon X5650 @2.67GHz | 90 GB 1883 DDR3 ECC RAM\n\n    \u003ca href=\"https://www.passmark.com/baselines/V10/display.php?id=502361259420\"\u003e\u003cimg src=\"https://www.passmark.com/baselines/V10/media/502361259420.png\" height=120px alt=\"PassMark Rating\" border=\"0\" /\u003e\u003c/a\u003e\n\n\n!!! note \"Server 2 ... Change the name\"\n\n    Ryzen 5700G + 128GB 3200 CL18 RAM\n\n    \u003ca href=\"https://www.passmark.com/baselines/V10/display.php?id=502361424410\"\u003e\u003cimg src=\"https://www.passmark.com/baselines/V10/media/502361424410.png\" height=120px alt=\"PassMark Rating\" border=\"0\" /\u003e\u003c/a\u003e\n\n!!! note \"Server 2 with XMP enabled and undervolted from 1.35 to 1.2\"\n\n    Ryzen 5700G + 128GB 3200 CL18 RAM\n\n    Undervolted to 1.2V (from 1.35)\n    XMP enabled\n\n    \u003ca href=\"https://www.passmark.com/baselines/V10/display.php?id=502363064921\"\u003e\u003cimg src=\"https://www.passmark.com/baselines/V10/media/502363064921.png\" height=120px alt=\"PassMark Rating\" border=\"0\" /\u003e\u003c/a\u003e\n",
      "summary": "!!! note \"Babyblue v2\"",
      "date_published": "2022-10-08T18:43:29Z",
      "date_modified": "2022-10-08T18:43:29Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "linux",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/chara-joy/",
      "url": "https://pype.dev/chara-joy/",
      "title": "Chara-Joy",
      "content_html": "\u003cp\u003e\u003ca href=\"https://bibleprojectz.com/bible-studies/chara-joy/\"\u003elink\u003c/a\u003e\u003c/p\u003e\n\u003ch1 id=\"chara-joy\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eChara / Joy\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eThere are several words for similar feelings - example like \u003ccode\u003ejoy\u003c/code\u003e has several synonyms.\u003c/p\u003e\n\u003ch2 id=\"sources\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSources\u003c/span\u003e \u003ca href=\"#sources\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eGenesis tells us creation and life bring joy\nPsalm 104 - A good bottle of wine is God\u0026rsquo;s gift to bring joy to people\u0026rsquo;s hearts\nP#lm 65 - Beautiful things bring joy\nJeremiah 33:11 - Weddings\u003c/p\u003e\n\u003ch2 id=\"corruption\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCorruption\u003c/span\u003e \u003ca href=\"#corruption\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eBible shows us that humanity and brokenness mark our world by death and loss\u003c/p\u003e\n\u003ch2 id=\"joy-in-spite-of-corruption\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eJoy in spite of corruption\u003c/span\u003e \u003ca href=\"#joy-in-spite-of-corruption\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eGod\u0026rsquo;s people have reasons in God\u0026rsquo;s faithfulness to be joyful.\nJoy in the LORD is not determinmed by current struggles, but by future hope and deliverance\u003c/p\u003e\n\u003ch2 id=\"jesus\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eJesus\u003c/span\u003e \u003ca href=\"#jesus\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eHis birth gives good news and brings great joy\u003c/p\u003e\n\u003cp\u003eMatthew 5 - Jesus says to rejoice and be glad when we are persecuted for his Name\u003c/p\u003e\n\u003ch2 id=\"apostles\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eApostles\u003c/span\u003e \u003ca href=\"#apostles\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003ePaul says he chooses joy when he is in jail\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eNote\u003c/p\u003e\n\u003cp\u003eJoy is a \u003cem\u003echoice\u003c/em\u003e\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003e2 Corinthians 6:10 -\u0026gt; Paul is filled with sorrow and yet rejoicing\u003c/p\u003e\n\u003cdiv class=\"admonition success\"\u003e\n\u003cp class=\"admonition-title\"\u003eSuccess\u003c/p\u003e\n\u003cp\u003eChristian joy is rooted in future hope and expectation of a Messiah, of\nJesus, to come again. It is a profound choice, not the result of current\ncircumstances\u003c/p\u003e\n\u003c/div\u003e\n\u003ch1 id=\"questions\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eQuestions\u003c/span\u003e\u003c/h1\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003e1\u003c/p\u003e\n\u003cp\u003eThe Israelites choose a path apart from God. As a result, they get exiled\nfrom their land and dominated by foreign nations. But the prophet Isaiah\nknew that sorrow would not have the final word with these people. He looked\nforward to the day when Yahweh would end pain and corruption to lead them\ninto endless, joyful living. Read Isaiah 49:13 and Isaiah 51:11 . What does\nIsaiah tell us about God’s character in these passages? What does Isaiah\nsay will happen to God’s people?\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003eIsaiah 49:13\u003c/p\u003e\n\u003cp\u003e13Shout for joy, O heavens! And rejoice, O earth!\u003c/p\u003e\n\u003cp\u003eBreak forth into joyful shouting, O mountains!\u003c/p\u003e\n\u003cp\u003eFor the Lord has comforted His people\u003c/p\u003e\n\u003cp\u003eAnd will have compassion on His afflicted.\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003eIsaiah 51:11\u003c/p\u003e\n\u003cp\u003e11So the ransomed of the Lord will return\u003c/p\u003e\n\u003cp\u003eAnd come with joyful shouting to Zion,\u003c/p\u003e\n\u003cp\u003eAnd everlasting joy will be on their heads.\u003c/p\u003e\n\u003cp\u003eThey will obtain gladness and joy,\u003c/p\u003e\n\u003cp\u003eAnd sorrow and sighing will flee away.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eIsiah tells us that God is good and faithful. He mentions God\u0026rsquo;s past\nfaithfulness - \u003ccode\u003eFor the Lord _has_ comforted His people\u003c/code\u003e as well as future\nfaithfulness - \u003ccode\u003eSo the randomed of the Lord _will_ return...\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eIsiah leans in on Yahweh\u0026rsquo;s defining nature from Exodus 34:6. God\u0026rsquo;s \u003ccode\u003ehesed\u003c/code\u003e, his\n\u003cstrong\u003esteadfase love\u003c/strong\u003e, is what is our hope. Otherwise our God is no different than\nany powerful but fickle diety.\u003c/p\u003e\n\u003cp\u003eIsiah also doesn\u0026rsquo;t, in these short passages, promise or claim a promise of any\nkind of temporal happiness - the joy is historical-facing in reflecting on\nGod\u0026rsquo;s deliverance and future-facing inr reflecting also on God\u0026rsquo;s deliverance.\nGod\u0026rsquo;s people were still supposed to find this joy in the midst of their bondage.\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003e2\u003c/p\u003e\n\u003cp\u003eThe prophet Isaiah looked forward to the coming of Israel’s redeemer. His\nprophecies were fulfilled with the arrival of Jesus. Read Luke 2:9-11 . Why\nwere the shepherds afraid? What reasons did the angels give for them to\nrejoice instead?\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003eLuke 2:9-11\u003c/p\u003e\n\u003cp\u003e9And an angel of the Lord suddenly stood before them, and the glory of the\nLord shone around them; and they were terribly frightened. 10But the angel\nsaid to them, “Do not be afraid; for behold, I bring you good news of great\njoy which will be for all the people; 11for today in the city of David\nthere has been born for you a Savior, who is Christ the Lord.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003ePresumably the shepherds were afraid because of \u003ccode\u003ethe glory of the Lord\u003c/code\u003e. All\nthroughout the OT we have examples of God\u0026rsquo;s people fearing this glory,\nspecifically on Sinai. Yahweh even tells Moses that he can only be shown\nYahweh\u0026rsquo;s back due to his glory, and then Moses has to veil his face so that the\nglory of the Lord persisted on him would not terrify the Israelites.\u003c/p\u003e\n\u003cp\u003eThe angels outright said that a Savior has been born, the Messiah has come.\nThere is no greater cause for joy than the king of creation returning\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003e3\u003c/p\u003e\n\u003cp\u003eJoy can persist in the harshest of circumstances because it depends on God\nand his promises. Read Matthew 5:11-12 , Acts 13:50-52 , and Hebrews 12:1-3\n. According to these passages, what specific truths about God can sustain\njoy even through painful or dire situations?\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition success\"\u003e\n\u003cp class=\"admonition-title\"\u003eSuccess\u003c/p\u003e\n\u003cp\u003eJoy can persist in the harshest of circumstances because it depends on God\nand his promises.\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003eMatthew 5:11-12\u003c/p\u003e\n\u003cp\u003e11“Blessed are you when people insult you and persecute you, and falsely\nsay all kinds of evil against you because of Me. 12Rejoice and be glad, for\nyour reward in heaven is great; for in the same way they persecuted the\nprophets who were before you.\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003eActs 13:50-52\u003c/p\u003e\n\u003cp\u003e50But the Jews incited the devout women of prominence and the leading men\nof the city, and instigated a persecution against Paul and Barnabas, and\ndrove them out of their district. 51But they shook off the dust of their\nfeet in protest against them and went to Iconium. 52And the disciples were\ncontinually filled with joy and with the Holy Spirit.\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003eHebrews 12:1-3\u003c/p\u003e\n\u003cp\u003eJesus, the Example\u003c/p\u003e\n\u003cp\u003e1Therefore, since we have so great a cloud of witnesses surrounding us, let\nus also lay aside every encumbrance and the sin which so easily entangles\nus, and let us run with endurance the race that is set before us, 2fixing\nour eyes on Jesus, the author and perfecter of faith, who for the joy set\nbefore Him endured the cross, despising the shame, and has sat down at the\nright hand of the throne of God. 3For consider Him who has endured such\nhostility by sinners against Himself, so that you will not grow weary and\nlose heart.\u003c/p\u003e\n\u003c/div\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eHarsh treatment of us, particularly for faith, reflects Jesus\u0026rsquo; life. We stand\nwith God-incarnate in living for a different kingdom which has negative\nconsequences for us in the modern age, but obviously not in God\u0026rsquo;s age that\u0026rsquo;s\nalready here and yet coming.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eHoly Spirit gives us joy\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe have long list of people in history who lived faithful lives, struggled\nwith God, experienced pain, and yet were faithful the Lord by God\u0026rsquo;s own\ngrace. Similarly we are chosen and favored - the receipients of God\u0026rsquo;s\n\u003ccode\u003ehesed\u003c/code\u003e love.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003e4\u003c/p\u003e\n\u003cp\u003eWhen we see how Jesus’ loving way of life has overcome death itself, joy\nstarts to become strangely reasonable. But this doesn’t mean it is wise to\nignore or suppress sorrow. Read 2 Corinthians 6:3-10 . How did Paul\nintegrate both joy and sorrow?\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003e2 Corinthians 6:3-10\u003c/p\u003e\n\u003cp\u003e3giving no cause for offense in anything, so that the ministry will not be\ndiscredited, 4but in everything commending ourselves as servants of God, in\nmuch endurance, in afflictions, in hardships, in distresses, 5in beatings,\nin imprisonments, in tumults, in labors, in sleeplessness, in hunger, 6in\npurity, in knowledge, in patience, in kindness, in the Holy Spirit, in\ngenuine love, 7in the word of truth, in the power of God; by the weapons of\nrighteousness for the right hand and the left, 8by glory and dishonor, by\nevil report and good report; regarded as deceivers and yet true; 9as\nunknown yet well-known, as dying yet behold, we live; as punished yet not\nput to death, 10as sorrowful yet always rejoicing, as poor yet making many\nrich, as having nothing yet possessing all things.\u003c/p\u003e\n\u003c/div\u003e\n",
      "content_text": "\n[link](https://bibleprojectz.com/bible-studies/chara-joy/)\n\n# Chara / Joy\n\nThere are several words for similar feelings - example like `joy` has several synonyms.\n\n## Sources\n\nGenesis tells us creation and life bring joy\nPsalm 104 - A good bottle of wine is God's gift to bring joy to people's hearts\nP#lm 65 - Beautiful things bring joy\nJeremiah 33:11 - Weddings\n\n## Corruption\n\nBible shows us that humanity and brokenness mark our world by death and loss\n\n## Joy in spite of corruption\n\nGod's people have reasons in God's faithfulness to be joyful. \nJoy in the LORD is not determinmed by current struggles, but by future hope and deliverance\n\n## Jesus\n\nHis birth gives good news and brings great joy\n\nMatthew 5 - Jesus says to rejoice and be glad when we are persecuted for his Name\n\n## Apostles\n\nPaul says he chooses joy when he is in jail\n\n!!! note \"\"\n\n    Joy is a _choice_\n\n2 Corinthians 6:10 -\u003e Paul is filled with sorrow and yet rejoicing\n\n!!! success \"\"\n\n    Christian joy is rooted in future hope and expectation of a Messiah, of\n    Jesus, to come again. It is a profound choice, not the result of current\n    circumstances\n\n# Questions\n\n!!! note \"1\"\n\n    The Israelites choose a path apart from God. As a result, they get exiled\n    from their land and dominated by foreign nations. But the prophet Isaiah\n    knew that sorrow would not have the final word with these people. He looked\n    forward to the day when Yahweh would end pain and corruption to lead them\n    into endless, joyful living. Read Isaiah 49:13 and Isaiah 51:11 . What does\n    Isaiah tell us about God’s character in these passages? What does Isaiah\n    say will happen to God’s people?\n\n!!! quote \"Isaiah 49:13\"\n\n    \n\n    13Shout for joy, O heavens! And rejoice, O earth!\n\n    Break forth into joyful shouting, O mountains!\n\n    For the Lord has comforted His people\n\n    And will have compassion on His afflicted.\n\n!!! quote \"Isaiah 51:11\"\n\n    11So the ransomed of the Lord will return\n\n    And come with joyful shouting to Zion,\n\n    And everlasting joy will be on their heads.\n\n    They will obtain gladness and joy,\n\n    And sorrow and sighing will flee away.\n\nIsiah tells us that God is good and faithful. He mentions God's past\nfaithfulness - `For the Lord _has_ comforted His people` as well as future\nfaithfulness - `So the randomed of the Lord _will_ return...`\n\nIsiah leans in on Yahweh's defining nature from Exodus 34:6. God's `hesed`, his\n**steadfase love**, is what is our hope. Otherwise our God is no different than\nany powerful but fickle diety. \n\nIsiah also doesn't, in these short passages, promise or claim a promise of any\nkind of temporal happiness - the joy is historical-facing in reflecting on\nGod's deliverance and future-facing inr reflecting also on God's deliverance.\nGod's people were still supposed to find this joy in the midst of their bondage.\n\n\n!!! note \"2\"\n\n    The prophet Isaiah looked forward to the coming of Israel’s redeemer. His\n    prophecies were fulfilled with the arrival of Jesus. Read Luke 2:9-11 . Why\n    were the shepherds afraid? What reasons did the angels give for them to\n    rejoice instead?\n\n!!! quote \"Luke 2:9-11\"\n\n    9And an angel of the Lord suddenly stood before them, and the glory of the\n    Lord shone around them; and they were terribly frightened. 10But the angel\n    said to them, “Do not be afraid; for behold, I bring you good news of great\n    joy which will be for all the people; 11for today in the city of David\n    there has been born for you a Savior, who is Christ the Lord.\n\nPresumably the shepherds were afraid because of `the glory of the Lord`. All\nthroughout the OT we have examples of God's people fearing this glory,\nspecifically on Sinai. Yahweh even tells Moses that he can only be shown\nYahweh's back due to his glory, and then Moses has to veil his face so that the\nglory of the Lord persisted on him would not terrify the Israelites.\n\nThe angels outright said that a Savior has been born, the Messiah has come.\nThere is no greater cause for joy than the king of creation returning\n\n!!! note \"3\"\n\n    Joy can persist in the harshest of circumstances because it depends on God\n    and his promises. Read Matthew 5:11-12 , Acts 13:50-52 , and Hebrews 12:1-3\n    . According to these passages, what specific truths about God can sustain\n    joy even through painful or dire situations?\n\n!!! success \"\"\n\n    Joy can persist in the harshest of circumstances because it depends on God\n    and his promises.\n\n\n!!! quote \"Matthew 5:11-12\"\n\n    11“Blessed are you when people insult you and persecute you, and falsely\n    say all kinds of evil against you because of Me. 12Rejoice and be glad, for\n    your reward in heaven is great; for in the same way they persecuted the\n    prophets who were before you.\n\n!!! quote \"Acts 13:50-52\"\n\n    50But the Jews incited the devout women of prominence and the leading men\n    of the city, and instigated a persecution against Paul and Barnabas, and\n    drove them out of their district. 51But they shook off the dust of their\n    feet in protest against them and went to Iconium. 52And the disciples were\n    continually filled with joy and with the Holy Spirit.\n\n\n!!! quote \"Hebrews 12:1-3\"\n\n    Jesus, the Example\n\n    1Therefore, since we have so great a cloud of witnesses surrounding us, let\n    us also lay aside every encumbrance and the sin which so easily entangles\n    us, and let us run with endurance the race that is set before us, 2fixing\n    our eyes on Jesus, the author and perfecter of faith, who for the joy set\n    before Him endured the cross, despising the shame, and has sat down at the\n    right hand of the throne of God. 3For consider Him who has endured such\n    hostility by sinners against Himself, so that you will not grow weary and\n    lose heart.\n\n1. Harsh treatment of us, particularly for faith, reflects Jesus' life. We stand\nwith God-incarnate in living for a different kingdom which has negative\nconsequences for us in the modern age, but obviously not in God's age that's\nalready here and yet coming.\n\n2. Holy Spirit gives us joy\n\n3. We have long list of people in history who lived faithful lives, struggled\n   with God, experienced pain, and yet were faithful the Lord by God's own\n   grace. Similarly we are chosen and favored - the receipients of God's\n   `hesed` love.\n\n4. \n\n\n!!! note \"4\"\n\n    When we see how Jesus’ loving way of life has overcome death itself, joy\n    starts to become strangely reasonable. But this doesn’t mean it is wise to\n    ignore or suppress sorrow. Read 2 Corinthians 6:3-10 . How did Paul\n    integrate both joy and sorrow?\n\n!!! quote \"2 Corinthians 6:3-10\"\n\n    3giving no cause for offense in anything, so that the ministry will not be\n    discredited, 4but in everything commending ourselves as servants of God, in\n    much endurance, in afflictions, in hardships, in distresses, 5in beatings,\n    in imprisonments, in tumults, in labors, in sleeplessness, in hunger, 6in\n    purity, in knowledge, in patience, in kindness, in the Holy Spirit, in\n    genuine love, 7in the word of truth, in the power of God; by the weapons of\n    righteousness for the right hand and the left, 8by glory and dishonor, by\n    evil report and good report; regarded as deceivers and yet true; 9as\n    unknown yet well-known, as dying yet behold, we live; as punished yet not\n    put to death, 10as sorrowful yet always rejoicing, as poor yet making many\n    rich, as having nothing yet possessing all things.\n\n",
      "summary": "link",
      "date_published": "2022-10-07T06:46:48Z",
      "date_modified": "2022-10-07T06:46:48Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "bible-project",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/quick-setup-of-zfs-encrytped-datasets-with-sane-permissions/",
      "url": "https://pype.dev/quick-setup-of-zfs-encrytped-datasets-with-sane-permissions/",
      "title": "Quick setup of ZFS encrytped datasets with sane permissions",
      "content_html": "\u003cp\u003eAssuming you have a pool called \u003ccode\u003etank\u003c/code\u003e\u0026hellip;\u003c/p\u003e\n\u003cp\u003eAnd assuming you have an encrypted dataset (See \u003ca href=\"https://arstechnica.com/gadgets/2021/06/a-quick-start-guide-to-openzfs-native-encryption/\"\u003eJim Saltar\u0026rsquo;s short\nintro\u003c/a\u003e)\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eCreate a group for permissions - in my case I have one called \u003ccode\u003ehome\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eThen if there\u0026rsquo;s anything in \u003ccode\u003e/tank/encrypted\u003c/code\u003e his it with \u003ccode\u003echgrp -R home /tank/encrypted\u003c/code\u003e to give the \u003ccode\u003ehome\u003c/code\u003e group ownership\u003c/li\u003e\n\u003cli\u003eNext we need to make sure that the members of \u003ccode\u003ehome\u003c/code\u003e can do the writing\u0026hellip;\nso \u003ccode\u003echmod 775 -R /tank/encrypted\u003c/code\u003e will do the trick\u003c/li\u003e\n\u003cli\u003eFinally we want to make sure that all data created inside our dataset has\nthe same set of permissions with \u003ccode\u003echmod g+s /tank/encrypted\u003c/code\u003e and \u003ccode\u003echmod g+w /tank/encrypted\u003c/code\u003e\u003c/li\u003e\n\u003c/ol\u003e\n",
      "content_text": "\nAssuming you have a pool called `tank`...\n\nAnd assuming you have an encrypted dataset (See [Jim Saltar's short\nintro](https://arstechnica.com/gadgets/2021/06/a-quick-start-guide-to-openzfs-native-encryption/))\n\n1. Create a group for permissions - in my case I have one called `home`\n2. Then if there's anything in `/tank/encrypted` his it with `chgrp -R home\n   /tank/encrypted` to give the `home` group ownership\n3. Next we need to make sure that the members of `home` can do the writing...\n   so `chmod 775 -R /tank/encrypted` will do the trick\n4. Finally we want to make sure that all data created inside our dataset has\n   the same set of permissions with `chmod g+s /tank/encrypted` and `chmod g+w\n   /tank/encrypted`\n\n",
      "summary": "Assuming you have a pool called ...",
      "date_published": "2022-10-06T19:58:01Z",
      "date_modified": "2022-10-06T19:58:01Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "zfs",
        "homelab",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/check-your-bios-version-on-ubuntu/",
      "url": "https://pype.dev/check-your-bios-version-on-ubuntu/",
      "title": "Check Your BIOS Version On Ubuntu",
      "content_html": "\u003cp\u003esudo dmidecode -s bios-version\u003c/p\u003e\n",
      "content_text": "\nsudo dmidecode -s bios-version\n",
      "summary": "sudo dmidecode -s bios-version",
      "date_published": "2022-10-02T18:21:58Z",
      "date_modified": "2022-10-02T18:21:58Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "linux",
        "cli",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/abraham-and-melchizedek/",
      "url": "https://pype.dev/abraham-and-melchizedek/",
      "title": "Abraham and Melchizedek",
      "content_html": "\u003cp\u003e\u003ca href=\"https://bibleproject.com/bible-studies/abraham-and-melchizedek/\"\u003elink to study\u003c/a\u003e\u003c/p\u003e\n\u003ch1 id=\"video\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eVideo\u003c/span\u003e\u003c/h1\u003e\n\u003ch2 id=\"priests\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePriests\u003c/span\u003e \u003ca href=\"#priests\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eGod creates Eden in which he places humans to be his royal image - priests. God\nsets humans up to receive his blessing but humans choose their own way. The\npromise is for a priest and a sacrifice to come in Jesus.\u003c/p\u003e\n\u003cp\u003eGod chooses Abraham and Sarah as the first royal priesthood as they are chosen\nby God to bless all the nations.\u003c/p\u003e\n\u003ch2 id=\"melchizedek\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMelchizedek\u003c/span\u003e \u003ca href=\"#melchizedek\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eA priestly king of Salem. Melchizedek recognizes Yahweh as the God of gods -\nAbraham tithes to him and that\u0026rsquo;s about the end of the story\u003c/p\u003e\n\u003cp\u003eSalem is ancient short name for Jerusalem.\nAbraham\u0026rsquo;s tithe to Melchizedek is just like the Israelite call to tithe to the\nLevites (priests) to support them.\u003c/p\u003e\n\u003ch2 id=\"royal-family\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRoyal Family\u003c/span\u003e \u003ca href=\"#royal-family\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAbraham and Sarah are promised their own children but they take amtters into\ntheir own hands by scheming with Hagar. Eventually Sarah is given her own son,\nIssac, who God then calls for his life as a test of Abraham - it represents God\nchallenging Abraham to trust him with his own promise, and to not go his own\nway with Sarah\u003c/p\u003e\n\u003cp\u003eDUring the Isaac sacrifice narrative a ram is given in place and Abraham names the place \u0026ldquo;God will provide\u0026rdquo;.\u003c/p\u003e\n\u003ch2 id=\"types\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTypes\u003c/span\u003e \u003ca href=\"#types\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe story of God\u0026rsquo;s call to sacrifice Isaac is much like the story of Abraham\nmeeting Melchizedek. In the Melchizedek story Abraham meets a priest on a high\nplace and gives him an offering. In the Isaac story Abraham acts as the priest\nand a ram is given to him by the LORD that covers the sins of Abraham\u0026rsquo;s family.\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eAtonement and Covering\u003c/p\u003e\n\u003cp\u003eCovering the sin in this case looks much more like redemption and resolve\nrather than payment for gult, similar to a small-scale apology can cover a\ngrievance even though no payment is made to make anything \u0026lsquo;right\u0026rsquo;, the\n\u0026lsquo;covering\u0026rsquo; is simply a sign of forgiveness\u003c/p\u003e\n\u003c/div\u003e\n\u003ch1 id=\"questions\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eQuestions\u003c/span\u003e\u003c/h1\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003e1\u003c/p\u003e\n\u003cp\u003eShalem, or Salem, is later known as Jerusalem. Moriah, a mountainous region in\nJerusalem, is later called the “mount of the LORD” (Genesis 22:14) and the\n“temple mount” (2 Chronicles 3:1). With all of this in mind, compare Genesis\n14:17-20 with Genesis 22:1-14 . How do you see God providing for Abraham in\nthese similar settings?\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003eGenesis 22:14\u003c/p\u003e\n\u003cp\u003e14Abraham called the name of that place The Lord Will Provide, as it is\nsaid to this day, “In the mount of the Lord it will be provided.”\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003e2 Chronicles 3:1\u003c/p\u003e\n\u003cp\u003eThe Temple Construction in Jerusalem\u003c/p\u003e\n\u003cp\u003e1Then Solomon began to build the house of the Lord in Jerusalem on Mount\nMoriah, where the Lord had appeared to his father David, at the place that\nDavid had prepared on the threshing floor of Ornan the Jebusite.\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003eGenesis 14:17-20\u003c/p\u003e\n\u003cp\u003eGod’s Promise to Abram\u003c/p\u003e\n\u003cp\u003e17Then after his return from the defeat of Chedorlaomer and the kings who\nwere with him, the king of Sodom went out to meet him at the valley of\nShaveh (that is, the King’s Valley). 18And Melchizedek king of Salem\nbrought out bread and wine; now he was a priest of God Most High. 19He\nblessed him and said,\u003c/p\u003e\n\u003cp\u003e“Blessed be Abram of God Most High,\u003c/p\u003e\n\u003cp\u003ePossessor of heaven and earth;\u003c/p\u003e\n\u003cp\u003e20And blessed be God Most High,\u003c/p\u003e\n\u003cp\u003eWho has delivered your enemies into your hand.”\u003c/p\u003e\n\u003cp\u003eHe gave him a tenth of all.\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003eGenesis 22:1-14\u003c/p\u003e\n\u003cp\u003eThe Offering of Isaac\u003c/p\u003e\n\u003cp\u003e1Now it came about after these things, that God tested Abraham, and said to\nhim, “Abraham!” And he said, “Here I am.” 2He said, “Take now your son,\nyour only son, whom you love, Isaac, and go to the land of Moriah, and\noffer him there as a burnt offering on one of the mountains of which I will\ntell you.” 3So Abraham rose early in the morning and saddled his donkey,\nand took two of his young men with him and Isaac his son; and he split wood\nfor the burnt offering, and arose and went to the place of which God had\ntold him. 4On the third day Abraham raised his eyes and saw the place from\na distance. 5Abraham said to his young men, “Stay here with the donkey, and\nI and the lad will go over there; and we will worship and return to you.”\n6Abraham took the wood of the burnt offering and laid it on Isaac his son,\nand he took in his hand the fire and the knife. So the two of them walked\non together. 7Isaac spoke to Abraham his father and said, “My father!” And\nhe said, “Here I am, my son.” And he said, “Behold, the fire and the wood,\nbut where is the lamb for the burnt offering?” 8Abraham said, “God will\nprovide for Himself the lamb for the burnt offering, my son.” So the two of\nthem walked on together.\u003c/p\u003e\n\u003cp\u003e9Then they came to the place of which God had told\nhim; and Abraham built the altar there and arranged the wood, and bound his\nson Isaac and laid him on the altar, on top of the wood. 10Abraham\nstretched out his hand and took the knife to slay his son. 11But the angel\nof the Lord called to him from heaven and said, “Abraham, Abraham!” And he\nsaid, “Here I am.” 12He said, “Do not stretch out your hand against the\nlad, and do nothing to him; for now I know that you fear God, since you\nhave not withheld your son, your only son, from Me.” 13Then Abraham raised\nhis eyes and looked, and behold, behind him a ram caught in the thicket by\nhis horns; and Abraham went and took the ram and offered him up for a burnt\noffering in the place of his son. 14Abraham called the name of that place\nThe Lord Will Provide, as it is said to this day, “In the mount of the Lord\nit will be provided.”\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition success\"\u003e\n\u003cp class=\"admonition-title\"\u003eSuccess\u003c/p\u003e\n\u003cp\u003e5Abraham said to his young men, “Stay here with the donkey, and I and the\nlad will go over there; and we will worship and return to you.”\u003c/p\u003e\n\u003c/div\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eGenesis 14\u003c/th\u003e\n\u003cth\u003eGenesis 22\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eMelchizedek provides bread and wine\u003c/td\u003e\n\u003ctd\u003eYahweh provides the ram\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eYahweh gave Abram victory over Chedorlaomer\u003c/td\u003e\n\u003ctd\u003eYahweh gave Abraham Isaac\u0026rsquo;s safety\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003e3\u003c/p\u003e\n\u003cp\u003eAs you review Hebrews 7 , notice how the author assures their audience that\nJesus is better than any other priest. What are some of the reasons the\nauthor provides? How is this good news for everyone?\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003eHebrews 7\u003c/p\u003e\n\u003cp\u003eMelchizedek’s Priesthood Like Christ’s\u003c/p\u003e\n\u003cp\u003e1For this Melchizedek, king of Salem, priest of the Most High God, who met Abraham as he was returning from the slaughter of the kings and blessed him, 2to whom also Abraham apportioned a tenth part of all the spoils, was first of all, by the translation of his name, king of righteousness, and then also king of Salem, which is king of peace. 3Without father, without mother, without genealogy, having neither beginning of days nor end of life, but made like the Son of God, he remains a priest perpetually.\u003c/p\u003e\n\u003cp\u003e4Now observe how great this man was to whom Abraham, the patriarch, gave a tenth of the choicest spoils. 5And those indeed of the sons of Levi who receive the priest’s office have commandment in the Law to collect a tenth from the people, that is, from their brethren, although these are descended from Abraham. 6But the one whose genealogy is not traced from them collected a tenth from Abraham and blessed the one who had the promises. 7But without any dispute the lesser is blessed by the greater. 8In this case mortal men receive tithes, but in that case one receives them, of whom it is witnessed that he lives on. 9And, so to speak, through Abraham even Levi, who received tithes, paid tithes, 10for he was still in the loins of his father when Melchizedek met him.\u003c/p\u003e\n\u003cp\u003e11Now if perfection was through the Levitical priesthood (for on the basis of it the people received the Law), what further need was there for another priest to arise according to the order of Melchizedek, and not be designated according to the order of Aaron? 12For when the priesthood is changed, of necessity there takes place a change of law also. 13For the one concerning whom these things are spoken belongs to another tribe, from which no one has officiated at the altar. 14For it is evident that our Lord was descended from Judah, a tribe with reference to which Moses spoke nothing concerning priests. 15And this is clearer still, if another priest arises according to the likeness of Melchizedek, 16who has become such not on the basis of a law of physical requirement, but according to the power of an indestructible life. 17For it is attested of Him,\u003c/p\u003e\n\u003cp\u003e“You are a priest forever\u003c/p\u003e\n\u003cp\u003eAccording to the order of Melchizedek.”\u003c/p\u003e\n\u003cp\u003e18For, on the one hand, there is a setting aside of a former commandment because of its weakness and uselessness 19(for the Law made nothing perfect), and on the other hand there is a bringing in of a better hope, through which we draw near to God. 20And inasmuch as it was not without an oath 21(for they indeed became priests without an oath, but He with an oath through the One who said to Him,\u003c/p\u003e\n\u003cp\u003e“The Lord has sworn\u003c/p\u003e\n\u003cp\u003eAnd will not change His mind,\u003c/p\u003e\n\u003cp\u003e‘You are a priest forever’ ”);\u003c/p\u003e\n\u003cp\u003e22so much the more also Jesus has become the guarantee of a better covenant.\u003c/p\u003e\n\u003cp\u003e23The former priests, on the one hand, existed in greater numbers because they were prevented by death from continuing, 24but Jesus, on the other hand, because He continues forever, holds His priesthood permanently. 25Therefore He is able also to save forever those who draw near to God through Him, since He always lives to make intercession for them.\u003c/p\u003e\n\u003cp\u003e26For it was fitting for us to have such a high priest, holy, innocent, undefiled, separated from sinners and exalted above the heavens; 27who does not need daily, like those high priests, to offer up sacrifices, first for His own sins and then for the sins of the people, because this He did once for all when He offered up Himself. 28For the Law appoints men as high priests who are weak, but the word of the oath, which came after the Law, appoints a Son, made perfect forever.\u003c/p\u003e\n\u003c/div\u003e\n\u003col\u003e\n\u003cli\u003eMelchizedek was \u0026ldquo;king of righteousness\u0026rdquo; and \u0026ldquo;kind of peace\u0026rdquo;, Jesus is a priest according to \u0026ldquo;the order of Melchizedek\u0026rdquo; and so seems to be that Jesus is the continued reigning king of righteousness and peace\u003c/li\u003e\n\u003cli\u003eMelchizedek was priest of God Most High - the priestly order changed to Levi with the giving of the Law\u0026hellip; Jesus represents, and \u003cem\u003eis\u003c/em\u003e, another change in the priesthood which necessitates another change in law (verse 12). Jesus\u0026rsquo; kingship and priesthood is more similar to Melchizek\u0026rsquo;s than Levi\u0026rsquo;s (who was no king anyways).\u003c/li\u003e\n\u003cli\u003eLevitical priesthood was not bound by an oath - but Jesus\u0026rsquo; priesthood is bound by Yahweh\u0026rsquo;s oath to not change his mind, Jesus is priest forever\u003c/li\u003e\n\u003cli\u003eFormer priests, Levites, changed due to death, but Jesus persists forever (Melchizedek also presumably died)\u003c/li\u003e\n\u003c/ol\u003e\n",
      "content_text": "\n[link to study](https://bibleproject.com/bible-studies/abraham-and-melchizedek/)\n\n# Video\n\n## Priests\n\nGod creates Eden in which he places humans to be his royal image - priests. God\nsets humans up to receive his blessing but humans choose their own way. The\npromise is for a priest and a sacrifice to come in Jesus.\n\nGod chooses Abraham and Sarah as the first royal priesthood as they are chosen\nby God to bless all the nations.\n\n## Melchizedek\n\nA priestly king of Salem. Melchizedek recognizes Yahweh as the God of gods -\nAbraham tithes to him and that's about the end of the story\n\nSalem is ancient short name for Jerusalem. \nAbraham's tithe to Melchizedek is just like the Israelite call to tithe to the\nLevites (priests) to support them.\n\n## Royal Family\n\nAbraham and Sarah are promised their own children but they take amtters into\ntheir own hands by scheming with Hagar. Eventually Sarah is given her own son,\nIssac, who God then calls for his life as a test of Abraham - it represents God\nchallenging Abraham to trust him with his own promise, and to not go his own\nway with Sarah\n\nDUring the Isaac sacrifice narrative a ram is given in place and Abraham names the place \"God will provide\".\n\n## Types\n\nThe story of God's call to sacrifice Isaac is much like the story of Abraham\nmeeting Melchizedek. In the Melchizedek story Abraham meets a priest on a high\nplace and gives him an offering. In the Isaac story Abraham acts as the priest\nand a ram is given to him by the LORD that covers the sins of Abraham's family.\n\n!!! note \"Atonement and Covering\"\n\n    Covering the sin in this case looks much more like redemption and resolve\n    rather than payment for gult, similar to a small-scale apology can cover a\n    grievance even though no payment is made to make anything 'right', the\n    'covering' is simply a sign of forgiveness\n\n\n# Questions\n\n!!! note \"1\"\n\n    Shalem, or Salem, is later known as Jerusalem. Moriah, a mountainous region in\n    Jerusalem, is later called the “mount of the LORD” (Genesis 22:14) and the\n    “temple mount” (2 Chronicles 3:1). With all of this in mind, compare Genesis\n    14:17-20 with Genesis 22:1-14 . How do you see God providing for Abraham in\n    these similar settings?\n\n\n!!! quote \"Genesis 22:14\"\n\n    14Abraham called the name of that place The Lord Will Provide, as it is\n    said to this day, “In the mount of the Lord it will be provided.”\n\n!!! quote \"2 Chronicles 3:1\"\n\n    The Temple Construction in Jerusalem\n\n    1Then Solomon began to build the house of the Lord in Jerusalem on Mount\n    Moriah, where the Lord had appeared to his father David, at the place that\n    David had prepared on the threshing floor of Ornan the Jebusite.\n\n!!! quote \"Genesis 14:17-20\"\n\n    God’s Promise to Abram\n\n    17Then after his return from the defeat of Chedorlaomer and the kings who\n    were with him, the king of Sodom went out to meet him at the valley of\n    Shaveh (that is, the King’s Valley). 18And Melchizedek king of Salem\n    brought out bread and wine; now he was a priest of God Most High. 19He\n    blessed him and said,\n\n    “Blessed be Abram of God Most High,\n\n    Possessor of heaven and earth;\n\n    20And blessed be God Most High,\n\n    Who has delivered your enemies into your hand.”\n\n    He gave him a tenth of all.\n\n\n!!! quote \"Genesis 22:1-14\"\n\n    The Offering of Isaac\n\n    1Now it came about after these things, that God tested Abraham, and said to\n    him, “Abraham!” And he said, “Here I am.” 2He said, “Take now your son,\n    your only son, whom you love, Isaac, and go to the land of Moriah, and\n    offer him there as a burnt offering on one of the mountains of which I will\n    tell you.” 3So Abraham rose early in the morning and saddled his donkey,\n    and took two of his young men with him and Isaac his son; and he split wood\n    for the burnt offering, and arose and went to the place of which God had\n    told him. 4On the third day Abraham raised his eyes and saw the place from\n    a distance. 5Abraham said to his young men, “Stay here with the donkey, and\n    I and the lad will go over there; and we will worship and return to you.”\n    6Abraham took the wood of the burnt offering and laid it on Isaac his son,\n    and he took in his hand the fire and the knife. So the two of them walked\n    on together. 7Isaac spoke to Abraham his father and said, “My father!” And\n    he said, “Here I am, my son.” And he said, “Behold, the fire and the wood,\n    but where is the lamb for the burnt offering?” 8Abraham said, “God will\n    provide for Himself the lamb for the burnt offering, my son.” So the two of\n    them walked on together. \n\n    9Then they came to the place of which God had told\n    him; and Abraham built the altar there and arranged the wood, and bound his\n    son Isaac and laid him on the altar, on top of the wood. 10Abraham\n    stretched out his hand and took the knife to slay his son. 11But the angel\n    of the Lord called to him from heaven and said, “Abraham, Abraham!” And he\n    said, “Here I am.” 12He said, “Do not stretch out your hand against the\n    lad, and do nothing to him; for now I know that you fear God, since you\n    have not withheld your son, your only son, from Me.” 13Then Abraham raised\n    his eyes and looked, and behold, behind him a ram caught in the thicket by\n    his horns; and Abraham went and took the ram and offered him up for a burnt\n    offering in the place of his son. 14Abraham called the name of that place\n    The Lord Will Provide, as it is said to this day, “In the mount of the Lord\n    it will be provided.”\n\n!!! success \"\"\n\n    5Abraham said to his young men, “Stay here with the donkey, and I and the\n    lad will go over there; and we will worship and return to you.”\n\n| Genesis 14 | Genesis 22 | \n| --- | --- | \n| Melchizedek provides bread and wine | Yahweh provides the ram | \n| Yahweh gave Abram victory over Chedorlaomer | Yahweh gave Abraham Isaac's safety | \n\n!!! note \"3\"\n\n    As you review Hebrews 7 , notice how the author assures their audience that\n    Jesus is better than any other priest. What are some of the reasons the\n    author provides? How is this good news for everyone?\n\n!!! quote \"Hebrews 7\"\n\n    Melchizedek’s Priesthood Like Christ’s\n\n    1For this Melchizedek, king of Salem, priest of the Most High God, who met Abraham as he was returning from the slaughter of the kings and blessed him, 2to whom also Abraham apportioned a tenth part of all the spoils, was first of all, by the translation of his name, king of righteousness, and then also king of Salem, which is king of peace. 3Without father, without mother, without genealogy, having neither beginning of days nor end of life, but made like the Son of God, he remains a priest perpetually.\n\n    4Now observe how great this man was to whom Abraham, the patriarch, gave a tenth of the choicest spoils. 5And those indeed of the sons of Levi who receive the priest’s office have commandment in the Law to collect a tenth from the people, that is, from their brethren, although these are descended from Abraham. 6But the one whose genealogy is not traced from them collected a tenth from Abraham and blessed the one who had the promises. 7But without any dispute the lesser is blessed by the greater. 8In this case mortal men receive tithes, but in that case one receives them, of whom it is witnessed that he lives on. 9And, so to speak, through Abraham even Levi, who received tithes, paid tithes, 10for he was still in the loins of his father when Melchizedek met him.\n\n    11Now if perfection was through the Levitical priesthood (for on the basis of it the people received the Law), what further need was there for another priest to arise according to the order of Melchizedek, and not be designated according to the order of Aaron? 12For when the priesthood is changed, of necessity there takes place a change of law also. 13For the one concerning whom these things are spoken belongs to another tribe, from which no one has officiated at the altar. 14For it is evident that our Lord was descended from Judah, a tribe with reference to which Moses spoke nothing concerning priests. 15And this is clearer still, if another priest arises according to the likeness of Melchizedek, 16who has become such not on the basis of a law of physical requirement, but according to the power of an indestructible life. 17For it is attested of Him,\n\n    “You are a priest forever\n\n    According to the order of Melchizedek.”\n\n    18For, on the one hand, there is a setting aside of a former commandment because of its weakness and uselessness 19(for the Law made nothing perfect), and on the other hand there is a bringing in of a better hope, through which we draw near to God. 20And inasmuch as it was not without an oath 21(for they indeed became priests without an oath, but He with an oath through the One who said to Him,\n\n    “The Lord has sworn\n\n    And will not change His mind,\n\n    ‘You are a priest forever’ ”);\n\n    22so much the more also Jesus has become the guarantee of a better covenant.\n\n    23The former priests, on the one hand, existed in greater numbers because they were prevented by death from continuing, 24but Jesus, on the other hand, because He continues forever, holds His priesthood permanently. 25Therefore He is able also to save forever those who draw near to God through Him, since He always lives to make intercession for them.\n\n    26For it was fitting for us to have such a high priest, holy, innocent, undefiled, separated from sinners and exalted above the heavens; 27who does not need daily, like those high priests, to offer up sacrifices, first for His own sins and then for the sins of the people, because this He did once for all when He offered up Himself. 28For the Law appoints men as high priests who are weak, but the word of the oath, which came after the Law, appoints a Son, made perfect forever.\n\n1. Melchizedek was \"king of righteousness\" and \"kind of peace\", Jesus is a priest according to \"the order of Melchizedek\" and so seems to be that Jesus is the continued reigning king of righteousness and peace\n2. Melchizedek was priest of God Most High - the priestly order changed to Levi with the giving of the Law... Jesus represents, and _is_, another change in the priesthood which necessitates another change in law (verse 12). Jesus' kingship and priesthood is more similar to Melchizek's than Levi's (who was no king anyways).\n3. Levitical priesthood was not bound by an oath - but Jesus' priesthood is bound by Yahweh's oath to not change his mind, Jesus is priest forever\n4. Former priests, Levites, changed due to death, but Jesus persists forever (Melchizedek also presumably died)\n\n",
      "summary": "link to study",
      "date_published": "2022-09-23T06:10:28Z",
      "date_modified": "2022-09-23T06:10:28Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "bible-project",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/append-string-to-list-of-files-with-xarg/",
      "url": "https://pype.dev/append-string-to-list-of-files-with-xarg/",
      "title": "Append string to list of files with xarg",
      "content_html": "\u003cp\u003e❯ find . -name \u0026ldquo;requirements.in\u0026rdquo; -print0 | xargs -0 sh -c \u0026lsquo;for arg in \u0026ldquo;$@\u0026rdquo;; do echo \u0026ldquo;awscli\u0026rdquo; \u0026raquo;\u0026quot;$arg\u0026quot;; done\u0026rsquo;\u003c/p\u003e\n",
      "content_text": "\n❯ find . -name \"requirements.in\" -print0 | xargs -0 sh -c 'for arg in \"$@\"; do echo \"awscli\" \u003e\u003e\"$arg\"; done'\n\n",
      "summary": "❯ find . -name \"requirements.in\" -print0 | xargs -0 sh -c 'for arg in \"$@\"; do echo \"awscli\" \u003e\u003e\"$arg\"; done'",
      "date_published": "2022-09-21T11:26:02Z",
      "date_modified": "2022-09-21T11:26:02Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "linux",
        "bash",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/tree-of-life/",
      "url": "https://pype.dev/tree-of-life/",
      "title": "Tree of Life",
      "content_html": "\u003ch1 id=\"video\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eVideo\u003c/span\u003e\u003c/h1\u003e\n\u003ch2 id=\"eden\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEden\u003c/span\u003e \u003ca href=\"#eden\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eBiblical story begins in a garden, which is presented as a type of Temple. The\ntop (center) is the Tree of Life, which represents God\u0026rsquo;s life and creative\npower. Humans \u003cstrong\u003ewere supposed to eat from the Tree of Life\u003c/strong\u003e but there\u0026rsquo;s\nanother tree, the Tree of Knowledge of \u0026ldquo;good\u0026rdquo; and \u0026ldquo;bad\u0026rdquo; which represents\nassuming the authority to define good and bad for one\u0026rsquo;s own life rather than\ntrusting God\u0026rsquo;s defintion. Human eat of that tree and are thus exiled from the\ngarden.\u003c/p\u003e\n\u003ch2 id=\"burning-bush\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBurning Bush\u003c/span\u003e \u003ca href=\"#burning-bush\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eMoses meets God at a burning tree, a plant on a mountain radiating with God\u0026rsquo;s\npower just like the Tree of Life. Yahweh charges Moses to bring the same choice\nto the Israelites that Adam and Eve had, which is to trust God or define\nmorality for themselves.\u003c/p\u003e\n\u003ch2 id=\"jesus\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eJesus\u003c/span\u003e \u003ca href=\"#jesus\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eJesus announced that God\u0026rsquo;s eternal life is available through him now -\noriginally in Eden given through the Tree of Life. Jesus invites other people\nto \u0026ldquo;eat of him\u0026rdquo; to be transformed by God\u0026rsquo;s own life. The invitation is the same\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eto trust Yahweh or not. But Jesus\u0026rsquo; life exposes humanity\u0026rsquo;s brokenness in that\nhumans crucified him. Jesus is hung on a cross (a tree) on the top of a\nhill (like Mt. Sinai) and humans not only eat of a different false tree of\nlife, but they chopped down the real Tree of Life - Jesus.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch1 id=\"questions\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eQuestions\u003c/span\u003e\u003c/h1\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003e1\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eWhat is one practical example of what it means to eat from the tree of\nlife? How is it different from eating from the false tree of life?\n\u003c/code\u003e\u003c/pre\u003e\n\u003c/div\u003e\n\u003cp\u003eGiving money away I think is one practical example of eating from the tree of\nlife. Jesus calls us to share our blessings, and choosing to live by his\nauthority rather than decide for myself what to do with my money (meaning to\nspend it on my desires only rather than invest in the Kingdom) then I make the\nsame choice humanity always makes - to not trust God\u0026rsquo;s definition of good and\nbad\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003e2\u003c/p\u003e\n\u003cp\u003eCompare John 15:5-13\nwith Matthew 7:15-20\n. How does the true vine give life? How do we recognize a false tree of life?\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003eJohn 15:5-13\u003c/p\u003e\n\u003cp\u003e5I am the vine, you are the branches; he who abides in Me and I in him, he\nbears much fruit, for apart from Me you can do nothing. 6If anyone does not\nabide in Me, he is thrown away as a branch and dries up; and they gather\nthem, and cast them into the fire and they are burned. 7If you abide in Me,\nand My words abide in you, ask whatever you wish, and it will be done for\nyou. 8My Father is glorified by this, that you bear much fruit, and so\nprove to be My disciples. 9Just as the Father has loved Me, I have also\nloved you; abide in My love. 10If you keep My commandments, you will abide\nin My love; just as I have kept My Father’s commandments and abide in His\nlove. 11These things I have spoken to you so that My joy may be in you, and\nthat your joy may be made full. Disciples’ Relation to Each Other 12“This\nis My commandment, that you love one another, just as I have loved you.\n13Greater love has no one than this, that one lay down his life for his\nfriends.\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003eMatthew 7:15-20\u003c/p\u003e\n\u003cp\u003e15“Beware of the false prophets, who come to you in sheep’s clothing, but\ninwardly are ravenous wolves. 16You will know them by their fruits. Grapes\nare not gathered from thorn bushes nor figs from thistles, are they? 17So\nevery good tree bears good fruit, but the bad tree bears bad fruit. 18A\ngood tree cannot produce bad fruit, nor can a bad tree produce good fruit.\n19Every tree that does not bear good fruit is cut down and thrown into the\nfire. 20So then, you will know them by their fruits.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eThe true vine gives life through communion and connection. Jesus says to \u0026ldquo;abide\nin [him]\u0026rdquo; which is represented by a choice to believe him about kingdom, love,\nrelationships, brokenness, etc\u0026hellip; By meditating on the Word of God, communing\nwith Jesus, being washed and guided by the Spirit we are transformed more and more into\nthe image of Jesus which is real and true life.\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003e3\u003c/p\u003e\n\u003cp\u003eWhat are some examples of good fruit and bad fruit (see Galatians 5:16-25)?\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003eGalations 5:16-25\u003c/p\u003e\n\u003cp\u003e16But I say, walk by the Spirit, and you will not carry out the desire of\nthe flesh. 17For the flesh sets its desire against the Spirit, and the\nSpirit against the flesh; for these are in opposition to one another, so\nthat you may not do the things that you please. 18But if you are led by the\nSpirit, you are not under the Law. 19Now the deeds of the flesh are\nevident, which are: immorality, impurity, sensuality, 20idolatry, sorcery,\nenmities, strife, jealousy, outbursts of anger, disputes, dissensions,\nfactions, 21envying, drunkenness, carousing, and things like these, of\nwhich I forewarn you, just as I have forewarned you, that those who\npractice such things will not inherit the kingdom of God. 22But the fruit\nof the Spirit is love, joy, peace, patience, kindness, goodness,\nfaithfulness, 23gentleness, self-control; against such things there is no\nlaw. 24Now those who belong to Christ Jesus have crucified the flesh with\nits passions and desires. 25If we live by the Spirit, let us also walk by\nthe Spirit.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eGood fruit:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e- choosing to guard my eyes and thoughts against sexual immorality\n- remaining calm when things aren't going my way at work\n- drinking water instead of _another_ drink at night\n- giving money away out of love\n- seeking unity and charity especially in any time of conflict\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eBad fruit:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e- outbursts at work - for me this is basically giving up hope for someone to be successful. By God's grace I have a desire to help peopl learn and succeed, but I can exhaust that desire and instead of prioritize an individual's well-being/growth I place my frustration above that and let my annoyance guide me more than a spirit of teaching and gentleness\n- having that second, or third, drink \n\u003c/code\u003e\u003c/pre\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIf you are led byt he Spirit, you are not under the Law\u0026hellip; This isn\u0026rsquo;t saying\nthat the Law doesn\u0026rsquo;t apply, but that by the Spirit\u0026rsquo;s guidance we will never\nbe found guilty by anything in the Law!\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003e4\u003c/p\u003e\n\u003cp\u003eWhen Jesus talks about what his death will accomplish, he talks about a\nseed going into the ground before it bears fruit (see John 12:23-26). What\ncould it look like to live in the ways of Jesus and bear the fruit of life?\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003eJohn 12:23-26\u003c/p\u003e\n\u003cp\u003e23And Jesus *answered them, saying, “The hour has come for the Son of Man\nto be glorified. 24Truly, truly, I say to you, unless a grain of wheat\nfalls into the earth and dies, it remains alone; but if it dies, it bears\nmuch fruit. 25He who loves his life loses it, and he who hates his life in\nthis world will keep it to life eternal. 26If anyone serves Me, he must\nfollow Me; and where I am, there My servant will be also; if anyone serves\nMe, the Father will honor him.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eMeditating on God\u0026rsquo;s faithfulness to humanity in spite of our disobedience I\nthink is an avenue by which the Spirit changes our hearts and as we are changed\nby him we live lives that reflect Jesus\u0026rsquo; own life\u003c/p\u003e\n\u003cp\u003eI think there can be many facets to the seed dying aspect, one relevant piece\nseems fairly self-evident in the passage\u0026hellip; if we hold onto our life (ie. be a\nseed that never dies) then we will never flourish, but if we give up the life\nwe have now and live like Jesus did, we will blessed with life\u003c/p\u003e\n",
      "content_text": "\n# Video\n\n## Eden\n\nBiblical story begins in a garden, which is presented as a type of Temple. The\ntop (center) is the Tree of Life, which represents God's life and creative\npower. Humans **were supposed to eat from the Tree of Life** but there's\nanother tree, the Tree of Knowledge of \"good\" and \"bad\" which represents\nassuming the authority to define good and bad for one's own life rather than\ntrusting God's defintion. Human eat of that tree and are thus exiled from the\ngarden.\n\n## Burning Bush\n\nMoses meets God at a burning tree, a plant on a mountain radiating with God's\npower just like the Tree of Life. Yahweh charges Moses to bring the same choice\nto the Israelites that Adam and Eve had, which is to trust God or define\nmorality for themselves.\n\n## Jesus\n\nJesus announced that God's eternal life is available through him now -\noriginally in Eden given through the Tree of Life. Jesus invites other people\nto \"eat of him\" to be transformed by God's own life. The invitation is the same\n- to trust Yahweh or not. But Jesus' life exposes humanity's brokenness in that\n    humans crucified him. Jesus is hung on a cross (a tree) on the top of a\n    hill (like Mt. Sinai) and humans not only eat of a different false tree of\n    life, but they chopped down the real Tree of Life - Jesus.\n\n# Questions\n\n!!! note \"1\"\n\n        What is one practical example of what it means to eat from the tree of\n        life? How is it different from eating from the false tree of life?\n\nGiving money away I think is one practical example of eating from the tree of\nlife. Jesus calls us to share our blessings, and choosing to live by his\nauthority rather than decide for myself what to do with my money (meaning to\nspend it on my desires only rather than invest in the Kingdom) then I make the\nsame choice humanity always makes - to not trust God's definition of good and\nbad\n\n!!! note \"2\"\n    \n    Compare John 15:5-13\n    with Matthew 7:15-20\n    . How does the true vine give life? How do we recognize a false tree of life?\n\n!!! quote \"John 15:5-13\"\n\n    5I am the vine, you are the branches; he who abides in Me and I in him, he\n    bears much fruit, for apart from Me you can do nothing. 6If anyone does not\n    abide in Me, he is thrown away as a branch and dries up; and they gather\n    them, and cast them into the fire and they are burned. 7If you abide in Me,\n    and My words abide in you, ask whatever you wish, and it will be done for\n    you. 8My Father is glorified by this, that you bear much fruit, and so\n    prove to be My disciples. 9Just as the Father has loved Me, I have also\n    loved you; abide in My love. 10If you keep My commandments, you will abide\n    in My love; just as I have kept My Father’s commandments and abide in His\n    love. 11These things I have spoken to you so that My joy may be in you, and\n    that your joy may be made full. Disciples’ Relation to Each Other 12“This\n    is My commandment, that you love one another, just as I have loved you.\n    13Greater love has no one than this, that one lay down his life for his\n    friends.\n\n\n!!! quote \"Matthew 7:15-20\"\n\n    15“Beware of the false prophets, who come to you in sheep’s clothing, but\n    inwardly are ravenous wolves. 16You will know them by their fruits. Grapes\n    are not gathered from thorn bushes nor figs from thistles, are they? 17So\n    every good tree bears good fruit, but the bad tree bears bad fruit. 18A\n    good tree cannot produce bad fruit, nor can a bad tree produce good fruit.\n    19Every tree that does not bear good fruit is cut down and thrown into the\n    fire. 20So then, you will know them by their fruits.\n\nThe true vine gives life through communion and connection. Jesus says to \"abide\nin [him]\" which is represented by a choice to believe him about kingdom, love,\nrelationships, brokenness, etc... By meditating on the Word of God, communing\nwith Jesus, being washed and guided by the Spirit we are transformed more and more into\nthe image of Jesus which is real and true life.\n\n!!! note \"3\"\n\n    What are some examples of good fruit and bad fruit (see Galatians 5:16-25)?\n\n!!! quote \"Galations 5:16-25\"\n\n    16But I say, walk by the Spirit, and you will not carry out the desire of\n    the flesh. 17For the flesh sets its desire against the Spirit, and the\n    Spirit against the flesh; for these are in opposition to one another, so\n    that you may not do the things that you please. 18But if you are led by the\n    Spirit, you are not under the Law. 19Now the deeds of the flesh are\n    evident, which are: immorality, impurity, sensuality, 20idolatry, sorcery,\n    enmities, strife, jealousy, outbursts of anger, disputes, dissensions,\n    factions, 21envying, drunkenness, carousing, and things like these, of\n    which I forewarn you, just as I have forewarned you, that those who\n    practice such things will not inherit the kingdom of God. 22But the fruit\n    of the Spirit is love, joy, peace, patience, kindness, goodness,\n    faithfulness, 23gentleness, self-control; against such things there is no\n    law. 24Now those who belong to Christ Jesus have crucified the flesh with\n    its passions and desires. 25If we live by the Spirit, let us also walk by\n    the Spirit.\n\nGood fruit:\n\n    - choosing to guard my eyes and thoughts against sexual immorality\n    - remaining calm when things aren't going my way at work\n    - drinking water instead of _another_ drink at night\n    - giving money away out of love\n    - seeking unity and charity especially in any time of conflict\n\nBad fruit:\n\n    - outbursts at work - for me this is basically giving up hope for someone to be successful. By God's grace I have a desire to help peopl learn and succeed, but I can exhaust that desire and instead of prioritize an individual's well-being/growth I place my frustration above that and let my annoyance guide me more than a spirit of teaching and gentleness\n    - having that second, or third, drink \n\n\u003e If you are led byt he Spirit, you are not under the Law... This isn't saying\n\u003e that the Law doesn't apply, but that by the Spirit's guidance we will never\n\u003e be found guilty by anything in the Law!\n\n!!! note \"4\"\n\n    When Jesus talks about what his death will accomplish, he talks about a\n    seed going into the ground before it bears fruit (see John 12:23-26). What\n    could it look like to live in the ways of Jesus and bear the fruit of life?\n\n!!! quote \"John 12:23-26\"\n\n\n    23And Jesus *answered them, saying, “The hour has come for the Son of Man\n    to be glorified. 24Truly, truly, I say to you, unless a grain of wheat\n    falls into the earth and dies, it remains alone; but if it dies, it bears\n    much fruit. 25He who loves his life loses it, and he who hates his life in\n    this world will keep it to life eternal. 26If anyone serves Me, he must\n    follow Me; and where I am, there My servant will be also; if anyone serves\n    Me, the Father will honor him.\n\nMeditating on God's faithfulness to humanity in spite of our disobedience I\nthink is an avenue by which the Spirit changes our hearts and as we are changed\nby him we live lives that reflect Jesus' own life\n\nI think there can be many facets to the seed dying aspect, one relevant piece\nseems fairly self-evident in the passage... if we hold onto our life (ie. be a\nseed that never dies) then we will never flourish, but if we give up the life\nwe have now and live like Jesus did, we will blessed with life\n\n\n",
      "summary": "Biblical story begins in a garden, which is presented as a type of Temple. The top (center) is the Tree of Life, which represents God's life and creative...",
      "date_published": "2022-09-21T06:21:19Z",
      "date_modified": "2022-09-21T06:21:19Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "bible-project",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/shalom-and-peace/",
      "url": "https://pype.dev/shalom-and-peace/",
      "title": "Shalom and Peace",
      "content_html": "\u003cp\u003e\u003ca href=\"https://bibleproject.com/bible-studies/shalom-peace/\"\u003estudy link\u003c/a\u003e\u003c/p\u003e\n\u003ch1 id=\"peace\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePeace\u003c/span\u003e\u003c/h1\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eNote\u003c/p\u003e\n\u003cp\u003egenerally means absnese of war\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eIn Hebrew the word is \u003ccode\u003eShalom\u003c/code\u003e (Greek: Eirene). Basic biblical meeting of\nShalom is \u0026ldquo;complete\u0026rdquo; or \u0026ldquo;whole\u0026rdquo;. ie. a stone with no cracks, or stone wall with\nnogaps or missing grips\u003c/p\u003e\n\u003cp\u003eReferences a complex situation with nothing missing\u003c/p\u003e\n\u003cp\u003eShalom can refer to a person\u0026rsquo;s well-being\u0026hellip; Life is complex and when anything\nis out of alignment our Shalom breaks down and needs to be restored\u003c/p\u003e\n\u003cp\u003eTo bring shalom is to make complete or restore\u003c/p\u003e\n\u003cp\u003eIn Proverbs, to reconcile a broken relationship is to make shalom\u003c/p\u003e\n\u003ch2 id=\"isaiah\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eIsaiah\u003c/span\u003e \u003ca href=\"#isaiah\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003eIsaiah 9:6-7\u003c/p\u003e\n\u003cp\u003e6 For a child will be born to us, a son will be given to us;\nAnd the government will rest on His shoulders;\nAnd His name will be called Wonderful Counselor, Mighty God,\nEternal Father, Prince of Peace.\n7 There will be no end to the increase of His government or of peace,\nOn the throne of David and over his kingdom,\nTo establish it and to uphold it with justice and righteousness\nFrom then on and forevermore.\nThe zeal of the Lord of hosts will accomplish this.\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"jesus\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eJesus\u003c/span\u003e \u003ca href=\"#jesus\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eJesus restores the broken relationship between humans and our creator.\u003c/p\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003eQuote\u003c/p\u003e\n\u003cp\u003eEphesians 2:14-15\u003c/p\u003e\n\u003cp\u003eJesus himeself is our \u003cem\u003eEirene\u003c/em\u003e\u003c/p\u003e\n\u003c/div\u003e\n\u003ch1 id=\"questions\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eQuestions\u003c/span\u003e\u003c/h1\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003e1\u003c/p\u003e\n\u003cp\u003eThe prophet Isaiah looked forward to the arrival of a future king who would\nmake a covenant of shalom (peace, well-being) with his people. This king\nwould set the world right and heal all that has been harmed. Read Isaiah\n9:6-7 aloud together. What specific words or phrases stand out to you as\nyou observe this passage and why?\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003eIsaiah 9:6-7 6\u003c/p\u003e\n\u003cp\u003eFor a child will be born to us, a son will be given to\nus; And the government will rest on His shoulders; And His name will be\ncalled Wonderful Counselor, Mighty God, Eternal Father, Prince of Peace.\n7There will be no end to the increase of His government or of peace, On the\nthrone of David and over his kingdom, To establish it and to uphold it with\njustice and righteousness From then on and forevermore. The zeal of the\nLord of hosts will accomplish this.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eWords that stick out:\n- child\n- given to us\n- government will rest\n- no end to the increase\n- zeal\u0026hellip;will accomplish this\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003e2\u003c/p\u003e\n\u003cp\u003eThe prophet Isaiah looked forward to the arrival of the Prince of Peace, whose\nreign would lead to eternal shalom. Jesus’ arrival fulfilled Isaiah’s words.\nRead and reflect on Luke 2:9-15 as a group. Why do you think God announced the\nKing’s arrival to no-name shepherds? What does this tell you about the nature\nof God and his Kingdom?\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003eLuke 2:9-15\u003c/p\u003e\n\u003cp\u003e9And an angel of the Lord suddenly stood before them, and the glory of the\nLord shone around them; and they were terribly frightened. 10But the angel\nsaid to them, “Do not be afraid; for behold, I bring you good news of great\njoy which will be for all the people; 11for today in the city of David\nthere has been born for you a Savior, who is Christ the Lord. 12This will\nbe a sign for you: you will find a baby wrapped in cloths and lying in a\nmanger.” 13And suddenly there appeared with the angel a multitude of the\nheavenly host praising God and saying,\u003c/p\u003e\n\u003cp\u003e14“Glory to God in the highest,\u003c/p\u003e\n\u003cp\u003eAnd on earth peace among men with whom He is pleased.”\u003c/p\u003e\n\u003cp\u003e15When the angels had gone away from them into heaven, the shepherds began\nsaying to one another, “Let us go straight to Bethlehem then, and see this\nthing that has happened which the Lord has made known to us.”\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eAt thsi point it seems obvious that the reason God came to the undesirable\ncompany of teh time was to illustrate that the Kingdom of Heaven was to be an\nupside down kingdom. Status and power are hinderences under Jesus\u0026rsquo; reign, so he\nbuilds his kingdom (from our perspective) from the ground up.\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003e3\u003c/p\u003e\n\u003cp\u003eThe biblical story shows how humanity often chooses a way of life apart\nfrom God and suffers as a result. According to Colossians 1:19-23 , what\ndid God want to do to remedy this pain, and how did he accomplish his\ndesire through Jesus?\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003eQuote\u003c/p\u003e\n\u003cp\u003eColossians 1:19-23\u003c/p\u003e\n\u003cp\u003e19For it was the Father’s good pleasure for all the fullness to dwell in\nHim, 20and through Him to reconcile all things to Himself, having made\npeace (εἰρηνοποιέω) through the blood of His cross; through Him, I say, whether things on\nearth or things in heaven.\u003c/p\u003e\n\u003cp\u003e21And although you were formerly alienated and hostile in mind, engaged in\nevil deeds, 22yet He has now reconciled you in His fleshly body through\ndeath, in order to present you before Him holy and blameless and beyond\nreproach— 23if indeed you continue in the faith firmly established and\nsteadfast, and not moved away from the hope of the gospel that you have\nheard, which was proclaimed in all creation under heaven, and of which I,\nPaul, was made a minister.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eGod interacted with Creation as a created being himself, holding back\n\u003cem\u003esomething\u003c/em\u003e in the person of Jesus. On our turf, God showed up to revive our\nlifeless souls and call us to live as citizens in his kingdom.\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003e4\u003c/p\u003e\n\u003cp\u003eJesus offers his peace to all people as a gift. Read Ephesians 2:11-16 .\nHow did Jesus make peace between two sharply divided people groups (Jews\nand Gentiles), and why did he do it (see Eph. 2:16)?\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003eEphesians 2:11-16\u003c/p\u003e\n\u003cp\u003e11Therefore remember that formerly you, the Gentiles in the flesh, who are\ncalled “Uncircumcision” by the so-called “Circumcision,” which is performed\nin the flesh by human hands— 12remember that you were at that time separate\nfrom Christ, excluded from the commonwealth of Israel, and strangers to the\ncovenants of promise, having no hope and without God in the world. 13But\nnow in Christ Jesus you who formerly were far off have been brought near by\nthe blood of Christ. 14For He Himself is our peace, who made both groups\ninto one and broke down the barrier of the dividing wall, 15by abolishing\nin His flesh the enmity, which is the Law of commandments contained in\nordinances, so that in Himself He might make the two into one new man, thus\nestablishing peace,\u003c/p\u003e\n\u003cp\u003e16and might reconcile them both in one body to God\nthrough the cross, by it having put to death the enmity.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eJesus broke down the dividing wall of Circumcision by fulfilling Torah. No\nlonger do the people of God need to be circumcized into the covenant (we have\nbaptism), and no longer are God\u0026rsquo;s people separate from the world via outward\nappearances but instead by living lives loyal to a different God - to Yahweh\u003c/p\u003e\n\u003cdiv class=\"admonition success\"\u003e\n\u003cp class=\"admonition-title\"\u003eSuccess\u003c/p\u003e\n\u003cp\u003eJesus \u0026ldquo;put to death the enmity\u0026rdquo; by removing all \u003cem\u003espiritually/covenantally relevant\u003c/em\u003e barriers that separated Jews from Gentiles\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003e5\u003c/p\u003e\n\u003cp\u003eNow, let’s carefully read Ephesians 4:1-3 How can humility, gentleness,\npatience, and love help maintain the unity Jesus calls his followers to?\nWhat happens to unity when one of these virtues is missing?\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003eEphesians 4:1-3\u003c/p\u003e\n\u003cp\u003e1Therefore I, the prisoner of the Lord, implore you to walk in a manner\nworthy of the calling with which you have been called, 2with all humility\nand gentleness, with patience, showing tolerance for one another in love,\n3being diligent to preserve the unity of the Spirit in the bond of peace.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eThese things don\u0026rsquo;t just help maintain unity - they are the postures of life\nJesus builds his Kingdom around (second to himself I suppose). Jesus levels the\nplaying field for all people, and no one has anymore right to anything than\nanyone else. Things like humility (right view of oneself), gentleness,\npatience, love, etc. are necessary for Jesus\u0026rsquo; kingdom to look how he wants it\nto look\u003c/p\u003e\n",
      "content_text": "\n[study link](https://bibleproject.com/bible-studies/shalom-peace/)\n\n\n# Peace \n\n!!! note \"\"\n\n    generally means absnese of war\n\nIn Hebrew the word is `Shalom` (Greek: Eirene). Basic biblical meeting of\nShalom is \"complete\" or \"whole\". ie. a stone with no cracks, or stone wall with\nnogaps or missing grips\n\nReferences a complex situation with nothing missing\n\nShalom can refer to a person's well-being... Life is complex and when anything\nis out of alignment our Shalom breaks down and needs to be restored\n\nTo bring shalom is to make complete or restore\n\nIn Proverbs, to reconcile a broken relationship is to make shalom\n\n## Isaiah\n\n\n!!! quote \"Isaiah 9:6-7\"\n\n\n    6 For a child will be born to us, a son will be given to us;\n    And the government will rest on His shoulders;\n    And His name will be called Wonderful Counselor, Mighty God,\n    Eternal Father, Prince of Peace.\n    7 There will be no end to the increase of His government or of peace,\n    On the throne of David and over his kingdom,\n    To establish it and to uphold it with justice and righteousness\n    From then on and forevermore.\n    The zeal of the Lord of hosts will accomplish this. \n\n## Jesus\n\nJesus restores the broken relationship between humans and our creator.\n\n!!! quote\n\n    Ephesians 2:14-15\n\n    Jesus himeself is our _Eirene_\n\n\n# Questions\n\n!!! note \"1\"\n\n    The prophet Isaiah looked forward to the arrival of a future king who would\n    make a covenant of shalom (peace, well-being) with his people. This king\n    would set the world right and heal all that has been harmed. Read Isaiah\n    9:6-7 aloud together. What specific words or phrases stand out to you as\n    you observe this passage and why?\n\n!!! quote \"Isaiah 9:6-7 6\"\n\n    For a child will be born to us, a son will be given to\n    us; And the government will rest on His shoulders; And His name will be\n    called Wonderful Counselor, Mighty God, Eternal Father, Prince of Peace.\n    7There will be no end to the increase of His government or of peace, On the\n    throne of David and over his kingdom, To establish it and to uphold it with\n    justice and righteousness From then on and forevermore. The zeal of the\n    Lord of hosts will accomplish this.\n\n\nWords that stick out: \n    - child\n    - given to us\n    - government will rest\n    - no end to the increase\n    - zeal...will accomplish this\n\n!!! note \"2\"\n\n    The prophet Isaiah looked forward to the arrival of the Prince of Peace, whose\n    reign would lead to eternal shalom. Jesus’ arrival fulfilled Isaiah’s words.\n    Read and reflect on Luke 2:9-15 as a group. Why do you think God announced the\n    King’s arrival to no-name shepherds? What does this tell you about the nature\n    of God and his Kingdom?\n\n!!! quote \"Luke 2:9-15\"\n\n    9And an angel of the Lord suddenly stood before them, and the glory of the\n    Lord shone around them; and they were terribly frightened. 10But the angel\n    said to them, “Do not be afraid; for behold, I bring you good news of great\n    joy which will be for all the people; 11for today in the city of David\n    there has been born for you a Savior, who is Christ the Lord. 12This will\n    be a sign for you: you will find a baby wrapped in cloths and lying in a\n    manger.” 13And suddenly there appeared with the angel a multitude of the\n    heavenly host praising God and saying,\n\n    14“Glory to God in the highest,\n\n    And on earth peace among men with whom He is pleased.”\n\n    15When the angels had gone away from them into heaven, the shepherds began\n    saying to one another, “Let us go straight to Bethlehem then, and see this\n    thing that has happened which the Lord has made known to us.”\n\nAt thsi point it seems obvious that the reason God came to the undesirable\ncompany of teh time was to illustrate that the Kingdom of Heaven was to be an\nupside down kingdom. Status and power are hinderences under Jesus' reign, so he\nbuilds his kingdom (from our perspective) from the ground up.\n\n\n!!! note \"3\"\n\n    The biblical story shows how humanity often chooses a way of life apart\n    from God and suffers as a result. According to Colossians 1:19-23 , what\n    did God want to do to remedy this pain, and how did he accomplish his\n    desire through Jesus?\n\n!!! quote\n\n    Colossians 1:19-23\n\n    19For it was the Father’s good pleasure for all the fullness to dwell in\n    Him, 20and through Him to reconcile all things to Himself, having made\n    peace (εἰρηνοποιέω) through the blood of His cross; through Him, I say, whether things on\n    earth or things in heaven.\n\n    21And although you were formerly alienated and hostile in mind, engaged in\n    evil deeds, 22yet He has now reconciled you in His fleshly body through\n    death, in order to present you before Him holy and blameless and beyond\n    reproach— 23if indeed you continue in the faith firmly established and\n    steadfast, and not moved away from the hope of the gospel that you have\n    heard, which was proclaimed in all creation under heaven, and of which I,\n    Paul, was made a minister.\n\nGod interacted with Creation as a created being himself, holding back\n_something_ in the person of Jesus. On our turf, God showed up to revive our\nlifeless souls and call us to live as citizens in his kingdom.\n\n!!! note \"4\"\n\n    Jesus offers his peace to all people as a gift. Read Ephesians 2:11-16 .\n    How did Jesus make peace between two sharply divided people groups (Jews\n    and Gentiles), and why did he do it (see Eph. 2:16)?\n\n!!! quote \"Ephesians 2:11-16\"\n\n\n    11Therefore remember that formerly you, the Gentiles in the flesh, who are\n    called “Uncircumcision” by the so-called “Circumcision,” which is performed\n    in the flesh by human hands— 12remember that you were at that time separate\n    from Christ, excluded from the commonwealth of Israel, and strangers to the\n    covenants of promise, having no hope and without God in the world. 13But\n    now in Christ Jesus you who formerly were far off have been brought near by\n    the blood of Christ. 14For He Himself is our peace, who made both groups\n    into one and broke down the barrier of the dividing wall, 15by abolishing\n    in His flesh the enmity, which is the Law of commandments contained in\n    ordinances, so that in Himself He might make the two into one new man, thus\n    establishing peace, \n\n    16and might reconcile them both in one body to God\n    through the cross, by it having put to death the enmity.\n\nJesus broke down the dividing wall of Circumcision by fulfilling Torah. No\nlonger do the people of God need to be circumcized into the covenant (we have\nbaptism), and no longer are God's people separate from the world via outward\nappearances but instead by living lives loyal to a different God - to Yahweh\n\n!!! success \"\"\n\n    Jesus \"put to death the enmity\" by removing all *spiritually/covenantally relevant* barriers that separated Jews from Gentiles\n\n\n!!! note \"5\"\n\n    Now, let’s carefully read Ephesians 4:1-3 How can humility, gentleness,\n    patience, and love help maintain the unity Jesus calls his followers to?\n    What happens to unity when one of these virtues is missing?\n\n!!! quote \"Ephesians 4:1-3\"\n\n    1Therefore I, the prisoner of the Lord, implore you to walk in a manner\n    worthy of the calling with which you have been called, 2with all humility\n    and gentleness, with patience, showing tolerance for one another in love,\n    3being diligent to preserve the unity of the Spirit in the bond of peace.\n\nThese things don't just help maintain unity - they are the postures of life\nJesus builds his Kingdom around (second to himself I suppose). Jesus levels the\nplaying field for all people, and no one has anymore right to anything than\nanyone else. Things like humility (right view of oneself), gentleness,\npatience, love, etc. are necessary for Jesus' kingdom to look how he wants it\nto look\n",
      "summary": "study link",
      "date_published": "2022-09-18T06:38:32Z",
      "date_modified": "2022-09-18T06:38:32Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "bible-project",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/destroying-tmux-sessions-with-fzf/",
      "url": "https://pype.dev/destroying-tmux-sessions-with-fzf/",
      "title": "Destroying Tmux sessions with fzf",
      "content_html": "\u003cp\u003eI use Tmux and Vim for most of my workflow, but I end up with a lot of dangling\ntmux sessions that dont\u0026rsquo; really need to persist\u0026hellip; but killing them one at a\ntime is a pain so I wrote a little script-kitty nonsense to pipe multiple\nchoices from fzf into \u003ccode\u003etmux kill-session\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eI defined a little function in my \u003ccode\u003e.zshrc\u003c/code\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edestroy\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    tmux list-sessions -F \u003cspan class=\"s1\"\u003e\u0026#39;#{session_name}\u0026#39;\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e fzf -m \u003cspan class=\"p\"\u003e|\u003c/span\u003e xargs -d \u003cspan class=\"s1\"\u003e$\u0026#39;\\n\u0026#39;\u003c/span\u003e sh -c \u003cspan class=\"s1\"\u003e\u0026#39;echo \u0026#34;killing $0\u0026#34;; tmux kill-session -t \u0026#34;$0\u0026#34;; for arg;do echo \u0026#34;killing $arg\u0026#34;;tmux kill-session -t \u0026#34;$arg\u0026#34;; done\u0026#39;\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\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebindkey -s \u003cspan class=\"s1\"\u003e\u0026#39;^d\u0026#39;\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;destroy \\n\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003etmux list-sessions -F '#{session_name}' \u003c/code\u003e prints all my active tmux sessions to the console with the format of just their name\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epype.dev   main   ×1 via   v3.8.11\u003cspan class=\"o\"\u003e(\u003c/span\u003epype.dev\u003cspan class=\"o\"\u003e)\u003c/span\u003e  on  \u003cspan class=\"o\"\u003e(\u003c/span\u003eus-east-1\u003cspan class=\"o\"\u003e)\u003c/span\u003e proxy\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ tmux list-sessions -F \u003cspan class=\"s1\"\u003e\u0026#39;#{session_name}\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esession-01\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esession-02\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esession-03\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\u003ePipe that to \u003ccode\u003efzf -m\u003c/code\u003e to allow multiple choices to be made using tab\u003c/p\u003e\n\u003cp\u003eThen the nasty bit in \u003ccode\u003exargs\u003c/code\u003e\u0026hellip; I echo \u003ccode\u003ekilling @0\u003c/code\u003e and \u003ccode\u003ekilling $arg\u003c/code\u003e because the \u003ccode\u003esh -c\u003c/code\u003e passes the first tmux session name to \u003ccode\u003e@0\u003c/code\u003e (it\u0026rsquo;s just what bash does) and then the rest get handled in the for loop.\u003c/p\u003e\n\u003cp\u003eBasically then I get an fzf list to choose multiple tmux sessions to destroy to clean up some RAM!\u003c/p\u003e\n",
      "content_text": "\nI use Tmux and Vim for most of my workflow, but I end up with a lot of dangling\ntmux sessions that dont' really need to persist... but killing them one at a\ntime is a pain so I wrote a little script-kitty nonsense to pipe multiple\nchoices from fzf into `tmux kill-session`\n\nI defined a little function in my `.zshrc`\n```bash \ndestroy() { \n    tmux list-sessions -F '#{session_name}' | fzf -m | xargs -d $'\\n' sh -c 'echo \"killing $0\"; tmux kill-session -t \"$0\"; for arg;do echo \"killing $arg\";tmux kill-session -t \"$arg\"; done'\n}\nbindkey -s '^d' 'destroy \\n'\n```\n\n`tmux list-sessions -F '#{session_name}' ` prints all my active tmux sessions to the console with the format of just their name\n\n```bash \npype.dev   main   ×1 via   v3.8.11(pype.dev)  on  (us-east-1) proxy\n❯ tmux list-sessions -F '#{session_name}'\nsession-01\nsession-02\nsession-03\n...\n```\n\nPipe that to `fzf -m` to allow multiple choices to be made using tab\n\nThen the nasty bit in `xargs`... I echo `killing @0` and `killing $arg` because the `sh -c` passes the first tmux session name to `@0` (it's just what bash does) and then the rest get handled in the for loop.\n\nBasically then I get an fzf list to choose multiple tmux sessions to destroy to clean up some RAM!\n",
      "summary": "I use Tmux and Vim for most of my workflow, but I end up with a lot of dangling tmux sessions that dont' really need to persist... but killing them one at a...",
      "date_published": "2022-09-15T10:27:58Z",
      "date_modified": "2022-09-15T10:27:58Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "cli",
        "bash",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/078-silent-years-essenes/",
      "url": "https://pype.dev/078-silent-years-essenes/",
      "title": "078 Silent Years - Essenes",
      "content_html": "\u003cp\u003e\u003ca href=\"https://bemadiscipleship.s3.us-east-2.amazonaws.com/BEMA+078+Silent+Years+Essenes-v2.pdf\"\u003elink to presentation\u003c/a\u003e\u003c/p\u003e\n\u003ch1 id=\"hellenism\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHellenism\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eDuring the \u0026ldquo;silent years\u0026rdquo; Hellenism was on the rise, even among several Jewish circles.\u003c/p\u003e\n\u003ch1 id=\"essenes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEssenes\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eAnother Jewish group (like Pharisees, Herodians, etc.) with a lot of debate\nsurrounding them. They were largely men, maybe a few women (which is\nconfusing), that were largely driven by priests. They claim God has abandoned\nthe system the corrupt Pharisees had come to adopt and so they went out into\nthe desert (very sepratist) and basically just prepared for the end times. They\ncondemned the Temple system - because of the corruption - however some Essenes\ncontinued to serve in the Temple because they felt they couldn\u0026rsquo;t abandon God\u0026rsquo;s\ncalling on their lives\u003c/p\u003e\n\u003ch2 id=\"scripture\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eScripture\u003c/span\u003e \u003ca href=\"#scripture\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003eQuote\u003c/p\u003e\n\u003cp\u003e16  Thus says the Lord:\n“Stand by the roads, and look,\nand ask for the ancient paths,\nwhere the good way is; and walk in it,\nand find rest for your souls.\nBut they said, ‘We will not walk in it.’\u003c/p\u003e\n\u003cp\u003eThe Holy Bible: English Standard Version (Je 6:16). (2016). Crossway Bibles.\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"dead-sea-scrolls\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDead Sea Scrolls\u003c/span\u003e \u003ca href=\"#dead-sea-scrolls\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eEssenes are credeited with writing the DSS.\u003c/p\u003e\n\u003cp\u003eThese served to validate basically all of what we have in our modern translated Bibles\u003c/p\u003e\n\u003ch2 id=\"living-water\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLiving Water\u003c/span\u003e \u003ca href=\"#living-water\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eCan only come from a spring or rain. Living water is what \u003cem\u003emust\u003c/em\u003e be used to\nfill the baptistrys that the Essenes used. So they would dig canals from wadis\n(pools of water in the desert) to fill their mikvahs (baptistrys).\u003c/p\u003e\n\u003ch2 id=\"scripture-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eScripture\u003c/span\u003e \u003ca href=\"#scripture-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAnother passage Essenes hold to is Isaiah 40:\u003c/p\u003e\n\u003cdiv class=\"admonition quote\"\u003e\n\u003cp class=\"admonition-title\"\u003eQuote\u003c/p\u003e\n\u003cp\u003e40 Comfort, comfort my people, says your God.\n2  Speak tenderly to Jerusalem,\nand cry to her\nthat her warfare is ended,\nthat her iniquity is pardoned,\nthat she has received from the Lord’s hand\ndouble for all her sins.\n3  A voice cries:﻿\n“In the wilderness prepare the way of the Lord;\nmake straight in the desert a highway for our God.\n4  Every valley shall be lifted up,\nand every mountain and hill be made low;\nthe uneven ground shall become level,\nand the rough places a plain.\n5  And the glory of the Lord shall be revealed,\nand all flesh shall see it together,\nfor the mouth of the Lord has spoken.”\u003c/p\u003e\n\u003cp\u003eThe Holy Bible: English Standard Version (Is 40:1–5). (2016). Crossway Bibles.\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eJohn the Baptist\u003c/p\u003e\n\u003cp\u003eLikely that Zacharia had connections to Essenes movement, and that John was\ndedicated to the LORD via being raised in an Essene community. The only\nnon-Essene thing he really did was to \u003cem\u003ego out\u003c/em\u003e and baptize people whereas\nEssene-like action is to wait for other to come to them\u003c/p\u003e\n\u003c/div\u003e\n\u003ch1 id=\"sepratists\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSepratists\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eUnlike Herodians who went out and engaged the world (not that everything they\ndid was good), this is in stark contrast to the Essenes community which is that\nthey are out in the desert, away from everyone, no \u0026ldquo;crossroads of the earth\u0026rdquo;\nidea, and did not go out into the world - one of the negatives\u003c/p\u003e\n",
      "content_text": "\n[link to presentation](https://bemadiscipleship.s3.us-east-2.amazonaws.com/BEMA+078+Silent+Years+Essenes-v2.pdf)\n\n# Hellenism\n\nDuring the \"silent years\" Hellenism was on the rise, even among several Jewish circles.\n\n# Essenes\n\nAnother Jewish group (like Pharisees, Herodians, etc.) with a lot of debate\nsurrounding them. They were largely men, maybe a few women (which is\nconfusing), that were largely driven by priests. They claim God has abandoned\nthe system the corrupt Pharisees had come to adopt and so they went out into\nthe desert (very sepratist) and basically just prepared for the end times. They\ncondemned the Temple system - because of the corruption - however some Essenes\ncontinued to serve in the Temple because they felt they couldn't abandon God's\ncalling on their lives\n\n## Scripture\n\n!!! quote\n\n    16  Thus says the Lord: \n      “Stand by the roads, and look, \n    and ask for the ancient paths, \n      where the good way is; and walk in it, \n    and find rest for your souls. \n      But they said, ‘We will not walk in it.’ \n\n    The Holy Bible: English Standard Version (Je 6:16). (2016). Crossway Bibles.\n\n## Dead Sea Scrolls\n\nEssenes are credeited with writing the DSS.\n\nThese served to validate basically all of what we have in our modern translated Bibles\n\n## Living Water\n\nCan only come from a spring or rain. Living water is what _must_ be used to\nfill the baptistrys that the Essenes used. So they would dig canals from wadis\n(pools of water in the desert) to fill their mikvahs (baptistrys).\n\n## Scripture\n\nAnother passage Essenes hold to is Isaiah 40:\n\n!!! quote\n\n    40 Comfort, comfort my people, says your God. \n     2  Speak tenderly to Jerusalem, \n    and cry to her \n      that her warfare is ended, \n    that her iniquity is pardoned, \n      that she has received from the Lord’s hand \n    double for all her sins. \n     3  A voice cries:﻿ \n      “In the wilderness prepare the way of the Lord; \n    make straight in the desert a highway for our God. \n     4  Every valley shall be lifted up, \n    and every mountain and hill be made low; \n      the uneven ground shall become level, \n    and the rough places a plain. \n     5  And the glory of the Lord shall be revealed, \n    and all flesh shall see it together, \n    for the mouth of the Lord has spoken.” \n\n    The Holy Bible: English Standard Version (Is 40:1–5). (2016). Crossway Bibles.\n\n\n!!! note John the Baptist\n\n    Likely that Zacharia had connections to Essenes movement, and that John was\n    dedicated to the LORD via being raised in an Essene community. The only\n    non-Essene thing he really did was to _go out_ and baptize people whereas\n    Essene-like action is to wait for other to come to them\n\n# Sepratists\n\nUnlike Herodians who went out and engaged the world (not that everything they\ndid was good), this is in stark contrast to the Essenes community which is that\nthey are out in the desert, away from everyone, no \"crossroads of the earth\"\nidea, and did not go out into the world - one of the negatives\n\n\n\n\n",
      "summary": "link to presentation",
      "date_published": "2022-09-15T06:49:27Z",
      "date_modified": "2022-09-15T06:49:27Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "bema"
      ]
    },
    {
      "id": "https://pype.dev/077-silent-years-herodians/",
      "url": "https://pype.dev/077-silent-years-herodians/",
      "title": "077 Silent Years - Herodians",
      "content_html": "\u003cp\u003eHerodians show up twice in the Gospels, Josephus talks about them a bit as\nwell. There is a lot of hsitorical debate that surrounds the Herodians.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eLike Republicans and Democracts meant one thing in American history, but\nthose positions and words mean something different today - the same is true\nin history, and with Herodians.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThey were believed to be the political party, however formal, to be alligned with Kind Herod.\u003c/p\u003e\n\u003cp\u003eWe are also, presently, very hellenistic and even herodian. We are into the\nluxury, we like convenience, we have entertainment/theaters. There\u0026rsquo;s nothing\nwrong with luxury, entertainment, plumbing, wealth, etc\u0026hellip; The Saducees misused\nHellenism to their own detrement - they turned amoral Hellenism into a\nworldview that pushed Yahweh out of the center and put human and self into the\ncenter of the worldview\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eHerodians toed the line between \u003cem\u003ereluctantly\u003c/em\u003e becoming hellenistic and\ncorrupting their worship with hellenism\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cdiv class=\"admonition warning\"\u003e\n\u003cp class=\"admonition-title\"\u003eWarning\u003c/p\u003e\n\u003cp\u003eI am (hopefully \u003cem\u003ereluctantly\u003c/em\u003e) hellenistic as well\u0026hellip;\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eEmbracing hellenism is not black and white, it is amoral\u0026hellip; To spend money on\nlife, enjoy entertainment, decorate our homes, etc\u0026hellip; can we appreciate\nluxuries without compromising on Yahweh worship?\u003c/p\u003e\n\u003cp\u003etimestamp: 21:45\u003c/p\u003e\n",
      "content_text": "\nHerodians show up twice in the Gospels, Josephus talks about them a bit as\nwell. There is a lot of hsitorical debate that surrounds the Herodians.\n\n\u003e Like Republicans and Democracts meant one thing in American history, but\n\u003e those positions and words mean something different today - the same is true\n\u003e in history, and with Herodians.\n\nThey were believed to be the political party, however formal, to be alligned with Kind Herod. \n\nWe are also, presently, very hellenistic and even herodian. We are into the\nluxury, we like convenience, we have entertainment/theaters. There's nothing\nwrong with luxury, entertainment, plumbing, wealth, etc... The Saducees misused\nHellenism to their own detrement - they turned amoral Hellenism into a\nworldview that pushed Yahweh out of the center and put human and self into the\ncenter of the worldview\n\n\u003e Herodians toed the line between _reluctantly_ becoming hellenistic and\n\u003e corrupting their worship with hellenism\n\n!!! warning\n    I am (hopefully _reluctantly_) hellenistic as well...\n\nEmbracing hellenism is not black and white, it is amoral... To spend money on\nlife, enjoy entertainment, decorate our homes, etc... can we appreciate\nluxuries without compromising on Yahweh worship?\n\ntimestamp: 21:45\n\n",
      "summary": "Herodians show up twice in the Gospels, Josephus talks about them a bit as well. There is a lot of hsitorical debate that surrounds the Herodians.",
      "date_published": "2022-09-04T06:49:27Z",
      "date_modified": "2022-09-04T06:49:27Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "bema"
      ]
    },
    {
      "id": "https://pype.dev/076-silent-years-sadducees/",
      "url": "https://pype.dev/076-silent-years-sadducees/",
      "title": "076 Silent Years - Sadducees",
      "content_html": "\u003cp\u003e\u003ca href=\"https://bemadiscipleship.s3.us-east-2.amazonaws.com/BEMA+076+Silent+Years+Sadducees.pdf\"\u003eLink to presentation\u003c/a\u003e\u003c/p\u003e\n\u003ch1 id=\"sadducees\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSadducees\u003c/span\u003e\u003c/h1\u003e\n\u003cblockquote\u003e\n\u003cp\u003eOften we in the modern time totally conflate Sadducees and Pharisees but they\nare as Republicans and Democrats today\u0026hellip; very much not the same\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"origin\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOrigin\u003c/span\u003e \u003ca href=\"#origin\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eBack in the Davidic kingdom they are the group that sought to restore the\npriesthood by way of lineage. A goal was figuring out who the High Priest was.\nLots are cast and Zaddok is chosen at some point - his line becomes the\nJesus-era Saducees. They are the \u003ccode\u003ezaddokim\u003c/code\u003e (Hebrew pronounciation) which when\nsomwhat anglosized becomes \u003ccode\u003esadducees\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"hasmonean\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHasmonean\u003c/span\u003e \u003ca href=\"#hasmonean\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eDuring Seleucids destruction of the Temple the Maccabeans revolt and expel\nSelecuis and Ptolemies. The Hasmonean kingdom follows this, which are priests\nthat the Maccabeans turned the kingdom over to in an effort to be \u0026lsquo;people of\nthe text\u0026rsquo;\u003c/p\u003e\n\u003cp\u003eHasmoneans are 7 famlies that have descended from Zaddok. Over the course of\n2-3 decades they become entirely Hellenistic. These ones are known in the\nGospels as the \u003ccode\u003eChief Priests\u003c/code\u003e which is a different group than \u003ccode\u003eteachers of the Law\u003c/code\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe Chief Priests are a corrupt religious Mafia\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eOriginally \u0026ldquo;Saducee\u0026rdquo; referred to direct descendents of Zaddok, which are a\nsubset of Levitical descendents. Come Jesus-time \u003ccode\u003eSaduccee\u003c/code\u003e becomes anyone who\nagrees with the priestly system\u0026hellip; Not all priests were Saducees (See Zachariah\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003efather of John the Baptist. He was a \u003ccode\u003erighteous priest\u003c/code\u003e which didn\u0026rsquo;t exist in\ntheir day - he was not a Saducee, he was faithful to Torah not Hellenism)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"rome-s-influence\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRome’s Influence\u003c/span\u003e \u003ca href=\"#rome-s-influence\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eHerod essentially controlled the world\u0026rsquo;s wealth due to his own position as king\n(of where?). Hasmonean\u0026rsquo;s persued Herod and asked him to marry a Hasmonean\ndaughter in order to be called Jewish. Hasmoneans did this as they saw their\ntime coming to an end with the rising power of Rome. Herod saw the opportunity,\ntook it, and then he extends an olive branch to Caesar - and Caesar accepts the\npartnership which turns Herod into basically a puppet king of Judea\u003c/p\u003e\n\u003cp\u003eHerod then begins to auction off the High Priesthood - furthering priestly\ncorruption. Annas (Caiphas is Annas\u0026rsquo; son) is the one who buys the priesthood -\nand the priesthood stays with this family until the destruction of Jerusalem in\nAD 70.\u003c/p\u003e\n\u003ch1 id=\"timeline\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTimeline\u003c/span\u003e\u003c/h1\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eyear\u003c/th\u003e\n\u003cth\u003ething\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e586 BC\u003c/td\u003e\n\u003ctd\u003eBabylonian captivity of Judah\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e538 BC\u003c/td\u003e\n\u003ctd\u003eReturn to Israel (Decree of Cyrus)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e332 BC\u003c/td\u003e\n\u003ctd\u003eAlexander the Great conquers Palestine\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e330–198 BC\u003c/td\u003e\n\u003ctd\u003eRule of Hellenistic Ptolemies over Jews\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e198–167 BC\u003c/td\u003e\n\u003ctd\u003eOppression under Hellenistic Seleucids\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e167 BC\u003c/td\u003e\n\u003ctd\u003eMaccabean revolt\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e167–63 BC\u003c/td\u003e\n\u003ctd\u003eHasmonean (Maccabean) kingdom\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e63 BC\u003c/td\u003e\n\u003ctd\u003eRoman conquest of Judea\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e37 BC\u003c/td\u003e\n\u003ctd\u003eReign of Herod begins\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ec. 6 BC\u003c/td\u003e\n\u003ctd\u003eBirth of Jesus\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e4 BC\u003c/td\u003e\n\u003ctd\u003eHerod’s death\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n",
      "content_text": "\n[Link to presentation](https://bemadiscipleship.s3.us-east-2.amazonaws.com/BEMA+076+Silent+Years+Sadducees.pdf)\n\n# Sadducees\n\n\u003eOften we in the modern time totally conflate Sadducees and Pharisees but they\n\u003eare as Republicans and Democrats today... very much not the same\n\n## Origin\n\nBack in the Davidic kingdom they are the group that sought to restore the\npriesthood by way of lineage. A goal was figuring out who the High Priest was.\nLots are cast and Zaddok is chosen at some point - his line becomes the\nJesus-era Saducees. They are the `zaddokim` (Hebrew pronounciation) which when\nsomwhat anglosized becomes `sadducees`.\n\n## Hasmonean\n\nDuring Seleucids destruction of the Temple the Maccabeans revolt and expel\nSelecuis and Ptolemies. The Hasmonean kingdom follows this, which are priests\nthat the Maccabeans turned the kingdom over to in an effort to be 'people of\nthe text'\n\nHasmoneans are 7 famlies that have descended from Zaddok. Over the course of\n2-3 decades they become entirely Hellenistic. These ones are known in the\nGospels as the `Chief Priests` which is a different group than `teachers of the\nLaw`\n\n\u003e The Chief Priests are a corrupt religious Mafia\n\nOriginally \"Saducee\" referred to direct descendents of Zaddok, which are a\nsubset of Levitical descendents. Come Jesus-time `Saduccee` becomes anyone who\nagrees with the priestly system... Not all priests were Saducees (See Zachariah\n- father of John the Baptist. He was a `righteous priest` which didn't exist in\n    their day - he was not a Saducee, he was faithful to Torah not Hellenism)\n\n## Rome's Influence\n\nHerod essentially controlled the world's wealth due to his own position as king\n(of where?). Hasmonean's persued Herod and asked him to marry a Hasmonean\ndaughter in order to be called Jewish. Hasmoneans did this as they saw their\ntime coming to an end with the rising power of Rome. Herod saw the opportunity,\ntook it, and then he extends an olive branch to Caesar - and Caesar accepts the\npartnership which turns Herod into basically a puppet king of Judea\n\nHerod then begins to auction off the High Priesthood - furthering priestly\ncorruption. Annas (Caiphas is Annas' son) is the one who buys the priesthood -\nand the priesthood stays with this family until the destruction of Jerusalem in\nAD 70.\n\n\n\n\n# Timeline\n\n| year | thing | \n| --- | --- |\n| 586 BC      | Babylonian captivity of Judah           |\n| 538 BC      | Return to Israel (Decree of Cyrus)      |\n| 332 BC      | Alexander the Great conquers Palestine  |\n| 330–198 BC  | Rule of Hellenistic Ptolemies over Jews |\n| 198–167 BC  | Oppression under Hellenistic Seleucids  |\n| 167 BC      | Maccabean revolt                        |\n| 167–63 BC   | Hasmonean (Maccabean) kingdom           |\n| 63 BC       | Roman conquest of Judea                 |\n| 37 BC       | Reign of Herod begins                   |\n| c. 6 BC     | Birth of Jesus                          |\n| 4 BC        | Herod’s death                           |\n",
      "summary": "Link to presentation",
      "date_published": "2022-09-02T06:21:21Z",
      "date_modified": "2022-09-02T06:21:21Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "bema"
      ]
    },
    {
      "id": "https://pype.dev/075-silent-years-welcome-to-hellenism/",
      "url": "https://pype.dev/075-silent-years-welcome-to-hellenism/",
      "title": "075 Silent Years - Welcome to Hellenism",
      "content_html": "\u003ch1 id=\"hellenism\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHellenism\u003c/span\u003e\u003c/h1\u003e\n\u003cblockquote\u003e\n\u003cp\u003eFor the first time in history, Greeks redefined worldfiew to be cenetered\naround the individual. Prior to Hellenism, worldviews centered around\npleasing the gods\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003ccode\u003eAlexander the Great\u003c/code\u003e had his own \u003cem\u003egospel\u003c/em\u003e (εὐαγγέλιον - euangelion: predates biblical authors. \u0026ldquo;Good news to share\u0026rdquo; as an idea is not uniquely biblical)\u003c/p\u003e\n\u003cp\u003eHe conqoured the world, not with a huge army but with 4 things:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eEducation\u003c/li\u003e\n\u003cli\u003eHealthcare\u003c/li\u003e\n\u003cli\u003eEntertainment\u003c/li\u003e\n\u003cli\u003eAthletics\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eThese 4 things pull on basically all people\u0026rsquo;s values, Andrew the Great used them to control people\u0026hellip;\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eEducation - control what people know\u003c/li\u003e\n\u003cli\u003eHealthcare - make people dependent on the state\u0026rsquo;s provision\u003c/li\u003e\n\u003cli\u003eEntertainment - control what people do with their time (theater was invented in this time)\u003c/li\u003e\n\u003cli\u003eAthletics - similar to entertainment - this becomes a pillar of culture\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch1 id=\"jewish-history\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eJewish History\u003c/span\u003e\u003c/h1\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003e\u003cstrong\u003eyear\u003c/strong\u003e\u003c/th\u003e\n\u003cth\u003e\u003cstrong\u003eevent\u003c/strong\u003e\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e586 BC\u003c/td\u003e\n\u003ctd\u003eBabylonian captivity of Judah\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e538 BC\u003c/td\u003e\n\u003ctd\u003eReturn to Israel (Decree of Cyrus)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e332 BC\u003c/td\u003e\n\u003ctd\u003eAlexander the Great conquers Palestine\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e330–198 BC\u003c/td\u003e\n\u003ctd\u003eRule of Hellenistic Ptolemies over Jews\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e198–167 BC\u003c/td\u003e\n\u003ctd\u003eOppression under Hellenistic Seleucids\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e167 BC\u003c/td\u003e\n\u003ctd\u003eMaccabean revolt\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e167–63 BC\u003c/td\u003e\n\u003ctd\u003eHasmonean (Maccabean) kingdom\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e63 BC\u003c/td\u003e\n\u003ctd\u003eRoman conquest of Judea\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e37 BC\u003c/td\u003e\n\u003ctd\u003eReign of Herod begins\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ec. 6 BC\u003c/td\u003e\n\u003ctd\u003eBirth of Jesus\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e4 BC\u003c/td\u003e\n\u003ctd\u003eHerod’s death\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e4 BC–AD 6\u003c/td\u003e\n\u003ctd\u003eRule of Archelaus\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e4 BC–AD 39\u003c/td\u003e\n\u003ctd\u003eRule of Antipas\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ec. AD 27–30\u003c/td\u003e\n\u003ctd\u003eJesus’s public ministry\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ec. AD 30\u003c/td\u003e\n\u003ctd\u003eCrucifixion of Jesus\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eAD 66–73\u003c/td\u003e\n\u003ctd\u003eFirst Jewish revolt against Rome\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eAD 70\u003c/td\u003e\n\u003ctd\u003eDestruction of Jerusalem/Temple\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eAD 73\u003c/td\u003e\n\u003ctd\u003eMasada falls\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eAD 131–135\u003c/td\u003e\n\u003ctd\u003eBar Kochba Revolt (Second Jewish revolt)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"post-alexander-the-great-s-death\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePost-Alexander the Great’s death\u003c/span\u003e \u003ca href=\"#post-alexander-the-great-s-death\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e4 rulers take over the Greek kingdom\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eSynichus\u003c/li\u003e\n\u003cli\u003e?\u003c/li\u003e\n\u003cli\u003eSeleucis\u003c/li\u003e\n\u003cli\u003ePtolemy\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"ptolemy-rules-the-jewish-region\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePtolemy rules the Jewish region\u003c/span\u003e \u003ca href=\"#ptolemy-rules-the-jewish-region\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eLeadership style - very Hellenistic\u003c/p\u003e\n\u003cp\u003eSome Jews dove in, others remained faithful to Judaism\u0026hellip; Psolemy made it just simply ahrd to \u003cem\u003enot be Greek\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"selucids-take-over-psolemies-and-jewish-region\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSelucids take over Psolemies and Jewish region\u003c/span\u003e \u003ca href=\"#selucids-take-over-psolemies-and-jewish-region\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eSelucis sacrifices a pig on the altar in Judea - ruthless take over of Jewish\nland which leads to the Maccabean revolt (Hanukkah)\u003c/p\u003e\n\u003ch3 id=\"hanukkah\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHanukkah\u003c/span\u003e \u003ca href=\"#hanukkah\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eJews wins the Maccabean revolts, story of Hanukkah arises\u003c/p\u003e\n\u003ch2 id=\"hasmonean-rule\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHasmonean rule\u003c/span\u003e \u003ca href=\"#hasmonean-rule\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eMaccabean\u0026rsquo;s are people of the text and see that Yahweh wanted priests to rule,\nnot kings. So they hand the kingdom over to the Hasmoneans (priests), and their\nYahweh-centric rule eventually turns back to Hellenism\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eJosephus (perhaps a little hyperbolically) said at this time there weren\u0026rsquo;t enough priests to run Sabbath services cause they were all at the naked mud wrestling tournaments\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"hasadim\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHasadim\u003c/span\u003e \u003ca href=\"#hasadim\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eMaccabeans who leave the Hasmonean group, go north, and build a fundamentalist Jewish culture in Galilee which is where Jesus grew up and did his ministry\u003c/p\u003e\n\u003cp\u003eThey split into 2 groups - Zealots who use the sword, Pharisees who obedience to the text\u003c/p\u003e\n\u003ch2 id=\"rome\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRome\u003c/span\u003e \u003ca href=\"#rome\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eJews (Saducees) persue Herod the Great in order to work things in light of Roman conquest, to remain good for the Jews\u003c/p\u003e\n\u003cp\u003eHerod and Ceasar end up having a tight political relationship\u003c/p\u003e\n\u003ch3 id=\"herod-s-kingdom\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHerod’s kingdom\u003c/span\u003e \u003ca href=\"#herod-s-kingdom\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eHerod split his kingdom to his sons after his death\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eHerod Archelaus (rules for a short time and is replaced by Pontius Pilot)\u003c/li\u003e\n\u003cli\u003eHerod Philip 2\u003c/li\u003e\n\u003cli\u003eHerod Antipad\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eSometime in this period, Jesus was born\u003c/p\u003e\n\u003ch2 id=\"post-herod\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePost-Herod\u003c/span\u003e \u003ca href=\"#post-herod\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eJesus\u0026rsquo; public ministry is during this time\u003c/p\u003e\n\u003cp\u003eJews eventually revolt against Rome which leads to destruction of Jerusalem and the Temple\u003c/p\u003e\n",
      "content_text": "\n# Hellenism\n\n\u003e For the first time in history, Greeks redefined worldfiew to be cenetered\n\u003e around the individual. Prior to Hellenism, worldviews centered around\n\u003e pleasing the gods\n\n`Alexander the Great` had his own _gospel_ (εὐαγγέλιον - euangelion: predates biblical authors. \"Good news to share\" as an idea is not uniquely biblical)\n\nHe conqoured the world, not with a huge army but with 4 things:\n\n1. Education\n2. Healthcare\n3. Entertainment\n4. Athletics\n\nThese 4 things pull on basically all people's values, Andrew the Great used them to control people...\n\n1. Education - control what people know\n2. Healthcare - make people dependent on the state's provision\n3. Entertainment - control what people do with their time (theater was invented in this time)\n4. Athletics - similar to entertainment - this becomes a pillar of culture\n\n# Jewish History\n\n| **year** | **event** |\n| --- | --- |\n| 586 BC       | Babylonian captivity of Judah           | \n| 538 BC       | Return to Israel (Decree of Cyrus)      | \n| 332 BC       | Alexander the Great conquers Palestine  | \n| 330–198 BC   | Rule of Hellenistic Ptolemies over Jews | \n| 198–167 BC   | Oppression under Hellenistic Seleucids  | \n| 167 BC       | Maccabean revolt                        | \n| 167–63 BC    | Hasmonean (Maccabean) kingdom           | \n| 63 BC        | Roman conquest of Judea                 | \n| 37 BC        | Reign of Herod begins                   | \n| c. 6 BC      | Birth of Jesus                          | \n| 4 BC         | Herod’s death                           | \n| 4 BC–AD 6    | Rule of Archelaus        | \n| 4 BC–AD 39   | Rule of Antipas          | \n| c. AD 27–30  | Jesus’s public ministry  | \n| c. AD 30     | Crucifixion of Jesus     | \n| AD 66–73     | First Jewish revolt against Rome | \n| AD 70        | Destruction of Jerusalem/Temple  | \n| AD 73        | Masada falls                     | \n| AD 131–135   | Bar Kochba Revolt (Second Jewish revolt) |\n\n## Post-Alexander the Great's death\n\n4 rulers take over the Greek kingdom\n\n1. Synichus\n2. ?\n3. Seleucis\n4. Ptolemy\n\n## Ptolemy rules the Jewish region\n\nLeadership style - very Hellenistic\n\nSome Jews dove in, others remained faithful to Judaism... Psolemy made it just simply ahrd to _not be Greek_\n\n## Selucids take over Psolemies and Jewish region\n\nSelucis sacrifices a pig on the altar in Judea - ruthless take over of Jewish\nland which leads to the Maccabean revolt (Hanukkah)\n\n### Hanukkah\n\nJews wins the Maccabean revolts, story of Hanukkah arises\n\n## Hasmonean rule\n\nMaccabean's are people of the text and see that Yahweh wanted priests to rule,\nnot kings. So they hand the kingdom over to the Hasmoneans (priests), and their\nYahweh-centric rule eventually turns back to Hellenism\n\n_Josephus (perhaps a little hyperbolically) said at this time there weren't enough priests to run Sabbath services cause they were all at the naked mud wrestling tournaments_\n\n## Hasadim\n\nMaccabeans who leave the Hasmonean group, go north, and build a fundamentalist Jewish culture in Galilee which is where Jesus grew up and did his ministry\n\nThey split into 2 groups - Zealots who use the sword, Pharisees who obedience to the text\n\n## Rome\n\nJews (Saducees) persue Herod the Great in order to work things in light of Roman conquest, to remain good for the Jews\n\n\nHerod and Ceasar end up having a tight political relationship\n\n### Herod's kingdom\n\nHerod split his kingdom to his sons after his death\n\n1. Herod Archelaus (rules for a short time and is replaced by Pontius Pilot)\n2. Herod Philip 2\n3. Herod Antipad\n\nSometime in this period, Jesus was born\n\n## Post-Herod\n\nJesus' public ministry is during this time\n\nJews eventually revolt against Rome which leads to destruction of Jerusalem and the Temple\n",
      "summary": "For the first time in history, Greeks redefined worldfiew to be cenetered \u003e around the individual. Prior to Hellenism, worldviews centered around \u003e pleasing...",
      "date_published": "2022-09-01T06:08:10Z",
      "date_modified": "2022-09-01T06:08:10Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "bema"
      ]
    },
    {
      "id": "https://pype.dev/check-your-smart-status-with-smartctl/",
      "url": "https://pype.dev/check-your-smart-status-with-smartctl/",
      "title": "Check your SMART status with smartctl",
      "content_html": "\u003cp\u003e\u003ca href=\"https://www.simplified.guide/linux/disk-health-check\"\u003ehttps://www.simplified.guide/linux/disk-health-check\u003c/a\u003e\u003c/p\u003e\n\u003ch1 id=\"install\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eInstall\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eFor ubuntu/debian based distros (which is what I primarly use presently)\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003esudo apt update -y \u0026amp;\u0026amp; sudo apt install smartmontools -y\u003c/code\u003e\u003c/p\u003e\n\u003ch1 id=\"list-hard-drives\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eList hard drives\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003e\u003ccode\u003elsblk | grep disk\u003c/code\u003e is one way or \u003ccode\u003esudo lshw -c disk\u003c/code\u003e is another\u003c/p\u003e\n\u003ch1 id=\"smartctl\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003esmartctl\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eUse a device\u0026rsquo;s logical name such as \u003ccode\u003edev/sda\u003c/code\u003e, not a partition of the disk\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003esudo smartctl -t short /dev/sda\u003c/code\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003edotfiles   home   ×3  ×2  ×2 via   v3.10.6(dotfiles)  took 11s\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003e❯ sudo smartctl -t short /dev/sda\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esmartctl 7.1 2019-12-30 r5022 [x86_64-linux-5.15.0-48-generic] (local build)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003eCopyright (C) 2002-19, Bruce Allen, Christian Franke, www.smartmontools.org\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003e=== START OF OFFLINE IMMEDIATE AND SELF-TEST SECTION ===\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003eSending command: \u0026#34;Execute SMART Short self-test routine immediately in off-line mode\u0026#34;.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003eDrive command \u0026#34;Execute SMART Short self-test routine immediately in off-line mode\u0026#34; successful.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003eTesting has begun.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003ePlease wait 2 minutes for test to complete.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003eTest will complete after Fri Sep 23 05:59:39 2022 CDT\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003eUse smartctl -X to abort test.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch1 id=\"check-status\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003echeck status\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003e\u003ccode\u003esudo smartctl -H /dev/sda\u003c/code\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003edotfiles   home   ×3  ×2  ×2 via   v3.10.6(dotfiles)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003e❯ sudo smartctl -H /dev/sda\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esmartctl 7.1 2019-12-30 r5022 [x86_64-linux-5.15.0-48-generic] (local build)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003eCopyright (C) 2002-19, Bruce Allen, Christian Franke, www.smartmontools.org\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003e=== START OF READ SMART DATA SECTION ===\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003eSMART overall-health self-assessment test result: PASSED\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nhttps://www.simplified.guide/linux/disk-health-check\n\n# Install\nFor ubuntu/debian based distros (which is what I primarly use presently)\n\n`sudo apt update -y \u0026\u0026 sudo apt install smartmontools -y`\n\n# List hard drives\n\n`lsblk | grep disk` is one way or `sudo lshw -c disk` is another\n\n# smartctl \n\nUse a device's logical name such as `dev/sda`, not a partition of the disk\n\n`sudo smartctl -t short /dev/sda`\n\n```console\ndotfiles   home   ×3  ×2  ×2 via   v3.10.6(dotfiles)  took 11s\n❯ sudo smartctl -t short /dev/sda\nsmartctl 7.1 2019-12-30 r5022 [x86_64-linux-5.15.0-48-generic] (local build)\nCopyright (C) 2002-19, Bruce Allen, Christian Franke, www.smartmontools.org\n\n=== START OF OFFLINE IMMEDIATE AND SELF-TEST SECTION ===\nSending command: \"Execute SMART Short self-test routine immediately in off-line mode\".\nDrive command \"Execute SMART Short self-test routine immediately in off-line mode\" successful.\nTesting has begun.\nPlease wait 2 minutes for test to complete.\nTest will complete after Fri Sep 23 05:59:39 2022 CDT\nUse smartctl -X to abort test.\n```\n\n# check status\n\n`sudo smartctl -H /dev/sda`\n\n```console\n\ndotfiles   home   ×3  ×2  ×2 via   v3.10.6(dotfiles)\n❯ sudo smartctl -H /dev/sda\nsmartctl 7.1 2019-12-30 r5022 [x86_64-linux-5.15.0-48-generic] (local build)\nCopyright (C) 2002-19, Bruce Allen, Christian Franke, www.smartmontools.org\n\n=== START OF READ SMART DATA SECTION ===\nSMART overall-health self-assessment test result: PASSED\n\n\n```\n",
      "summary": "https://www.simplified.guide/linux/disk-health-check",
      "date_published": "2022-08-29T06:30:27Z",
      "date_modified": "2022-08-29T06:30:27Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "cli",
        "linux",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/074-silent-years-synagogue/",
      "url": "https://pype.dev/074-silent-years-synagogue/",
      "title": "074 - Silent Years - Synagogue",
      "content_html": "\u003cp\u003e\u003ca href=\"https://bemadiscipleship.s3.us-east-2.amazonaws.com/BEMA+074+Silent+Years+Synagogue-v2.pdf\"\u003eLink to presentation\u003c/a\u003e\u003c/p\u003e\n\u003ch1 id=\"judaism\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eJudaism\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eModern Judaism is very different from Jesus\u0026rsquo; Judaism which was distinct from\nDavid\u0026rsquo;s Judaism, etc\u0026hellip; We, as modern westerners, need to be aware of the\nreligious evolution and history of Judaism to properly understand the\nScriptures.\u003c/p\u003e\n\u003ch1 id=\"synagogue\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSynagogue\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003e\u003ccode\u003eSynagogue\u003c/code\u003e started with groups of people at homes, not in a big building,\nafter Exile, exploring a way to express their faith. Synagogue has 7 main\nelements. But note that all 7 are not found in every Synagogue building, but\nthe 7 show up consistently\u003c/p\u003e\n\u003ch2 id=\"mikveh\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMikveh\u003c/span\u003e \u003ca href=\"#mikveh\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eBasically a baptistry.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eSynagogue was never meant to replace the Temple\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003ePrior to AD 70, the doors to a Synagogue never faced Jerusalem in order to keep\nin mind that Temple was distinct. However, after AD 70 doors to Synagogues were\nbuilt to face Jerusalem as a means of mourning the loss of the Temple\u003c/p\u003e\n\u003cp\u003eMikveh was a ritualistic cleansing (not a conversion like baptism) basically\nevery day, every time before you enter Synagogue.\u003c/p\u003e\n\u003ch2 id=\"basilica\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBasilica\u003c/span\u003e \u003ca href=\"#basilica\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe pillared section of the Synagogue which held up the roof.\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eThey didn\u0026rsquo;t have the technology to span the desired length of the roof, so the columns/pillars were structural\u003c/li\u003e\n\u003cli\u003eHad embedded windows to allow light into the center of the Synagogue in order to \u003ccode\u003eread God's light by God's light\u003c/code\u003e (sunlight)\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"bema\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBema\u003c/span\u003e \u003ca href=\"#bema\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eDead center is the Bema seat. (Bay-mah or Bee-mah but this isn\u0026rsquo;t the bima seat of judgement in the NT)\u003c/p\u003e\n\u003cp\u003eUsually was just a slightly raised platform that someone would stand on as they read the text.\u003c/p\u003e\n\u003cp\u003eThe Bema seat starts to move closer to a side of the room, as a stage, as\nSynagogues are influenced by Western culture. But in the Second Temple period\nthe seat was always at the center so that God\u0026rsquo;s people gather \u003cem\u003earound\u003c/em\u003e the\ntext.\u003c/p\u003e\n\u003cp\u003eModern day churches have us gather more as an audience to see a performer\nrather than to gather around the text\u003c/p\u003e\n\u003ch2 id=\"chief-seats\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eChief Seats\u003c/span\u003e \u003ca href=\"#chief-seats\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eEveryone sat on the floor to hear God\u0026rsquo;s word, but around the perimeter were\nseats for those who were \u0026ldquo;seasoned\u0026rdquo;, \u0026ldquo;wise\u0026rdquo;\u0026hellip; really it\u0026rsquo;s that they were older\nand known as wise men in the community\u003c/p\u003e\n\u003ch2 id=\"torah-closet\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTorah Closet\u003c/span\u003e \u003ca href=\"#torah-closet\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWhere Torah was kept. Modern times there were more expensive and ornate art put\nhere - the Torah Closet was the place where the valuable things were kept\u003c/p\u003e\n\u003cp\u003eThis was introduced because prior to Exile the Jews might have been a people\nwho didn\u0026rsquo;t know the rules\u0026hellip; yes they didn\u0026rsquo;t follow them, but there wasn\u0026rsquo;t a\ngreat system for making sure everyone knew them. So the Torah Closet existed to\nkeep God\u0026rsquo;s law safe and accessible by all of God\u0026rsquo;s people\u003c/p\u003e\n\u003cp\u003etimestamp: 21 ish minutes - need to listen to Moses Seat again\u003c/p\u003e\n",
      "content_text": "\n[Link to presentation](https://bemadiscipleship.s3.us-east-2.amazonaws.com/BEMA+074+Silent+Years+Synagogue-v2.pdf)\n\n# Judaism\n\nModern Judaism is very different from Jesus' Judaism which was distinct from\nDavid's Judaism, etc... We, as modern westerners, need to be aware of the\nreligious evolution and history of Judaism to properly understand the\nScriptures.\n\n# Synagogue\n\n`Synagogue` started with groups of people at homes, not in a big building,\nafter Exile, exploring a way to express their faith. Synagogue has 7 main\nelements. But note that all 7 are not found in every Synagogue building, but\nthe 7 show up consistently\n\n## Mikveh\n\nBasically a baptistry.\n\n_Synagogue was never meant to replace the Temple_\n\nPrior to AD 70, the doors to a Synagogue never faced Jerusalem in order to keep\nin mind that Temple was distinct. However, after AD 70 doors to Synagogues were\nbuilt to face Jerusalem as a means of mourning the loss of the Temple\n\nMikveh was a ritualistic cleansing (not a conversion like baptism) basically\nevery day, every time before you enter Synagogue.\n\n## Basilica\n\nThe pillared section of the Synagogue which held up the roof.\n\n1. They didn't have the technology to span the desired length of the roof, so the columns/pillars were structural\n2. Had embedded windows to allow light into the center of the Synagogue in order to `read God's light by God's light` (sunlight)\n\n## Bema\n\nDead center is the Bema seat. (Bay-mah or Bee-mah but this isn't the bima seat of judgement in the NT)\n\nUsually was just a slightly raised platform that someone would stand on as they read the text. \n\nThe Bema seat starts to move closer to a side of the room, as a stage, as\nSynagogues are influenced by Western culture. But in the Second Temple period\nthe seat was always at the center so that God's people gather _around_ the\ntext.\n\nModern day churches have us gather more as an audience to see a performer\nrather than to gather around the text\n\n## Chief Seats\n\nEveryone sat on the floor to hear God's word, but around the perimeter were\nseats for those who were \"seasoned\", \"wise\"... really it's that they were older\nand known as wise men in the community\n\n## Torah Closet\n\nWhere Torah was kept. Modern times there were more expensive and ornate art put\nhere - the Torah Closet was the place where the valuable things were kept\n\nThis was introduced because prior to Exile the Jews might have been a people\nwho didn't know the rules... yes they didn't follow them, but there wasn't a\ngreat system for making sure everyone knew them. So the Torah Closet existed to\nkeep God's law safe and accessible by all of God's people\n\ntimestamp: 21 ish minutes - need to listen to Moses Seat again\n\n\n\n",
      "summary": "Link to presentation",
      "date_published": "2022-08-29T06:26:42Z",
      "date_modified": "2022-08-29T06:26:42Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "bema"
      ]
    },
    {
      "id": "https://pype.dev/session-3-intro/",
      "url": "https://pype.dev/session-3-intro/",
      "title": "Session 3 Intro",
      "content_html": "\u003ch1 id=\"intro\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eIntro\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eSession 1: Torah\u003c/p\u003e\n\u003cp\u003eSession 2: Prophets and Writings\u003c/p\u003e\n\u003ch1 id=\"review\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eReview\u003c/span\u003e\u003c/h1\u003e\n\u003ch2 id=\"torah\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTorah\u003c/span\u003e \u003ca href=\"#torah\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eBig idea: partnership\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eBasis of partnership / meet the characters (Genesis)\u003c/li\u003e\n\u003cli\u003eGod chooses a partner / the partner chooses God (Exodus)\u003c/li\u003e\n\u003cli\u003eGod defines the partnership (Leviticus)\u003c/li\u003e\n\u003cli\u003eGod shapes his partner (Numbers)\u003c/li\u003e\n\u003cli\u003eGod asks his partner to remember (Deuteronomy)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"history\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHistory\u003c/span\u003e \u003ca href=\"#history\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eBig idea: Redemption cycle; God\u0026rsquo;s patience\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eGod places His people in the middle of the action for mission (Joshua)\u003c/li\u003e\n\u003cli\u003eGod’s people struggle to walk the path and trust the story (Judges \u0026amp; Ruth)\u003c/li\u003e\n\u003cli\u003eGod’s people struggle with identity and obedience (Samuel/Kings)\u003c/li\u003e\n\u003cli\u003eGod’s people struggle with empire and becoming the anti-story (Chronicles)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"wisdom\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWisdom\u003c/span\u003e \u003ca href=\"#wisdom\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eBig idea: Tools\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eIf we are going to survive the cycle, we are going to need\u0026hellip;\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eArt and song for worship and expression (Psalms)\u003c/li\u003e\n\u003cli\u003eNuggets of conventional wisdom (Proverbs)\u003c/li\u003e\n\u003cli\u003ePurpose and a reason to get up every morning (Ecclesiastes)\u003c/li\u003e\n\u003cli\u003eRelationships and intimacy with others (Song of Songs)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"prophets\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eProphets\u003c/span\u003e \u003ca href=\"#prophets\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eBig idea: Warnings, woes, and hope\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eGod sends warning in Pre-Assyrian/Pre-Babylonian prophets (Amos, Hosea, Micah, 1 Isaiah, Zephaniah, 2 Isaiah)\u003c/li\u003e\n\u003cli\u003eGod pronounces woe and judgment (Jonah, Nahum, Jeremiah, Lamentations, Habakkuk, Obadiah, Joel)\u003c/li\u003e\n\u003cli\u003eGod gives hope and encouragement to an exiled people (Ezekiel, Daniel, Job, 3 Isaiah)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"remnant\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRemnant\u003c/span\u003e \u003ca href=\"#remnant\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eBig idea: Returning, yearning, learning\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eGod’s people return to rebuild and restore what once was (4 Isaiah, Ezra/Nehemiah)\u003c/li\u003e\n\u003cli\u003eGod’s people yearn for what used to be (Haggai, Zechariah)\u003c/li\u003e\n\u003cli\u003eGod’s people learn that this new world demands a new approach (Malachi, Esther)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"the-silent-years\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThe Silent Years\u003c/span\u003e \u003ca href=\"#the-silent-years\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWe run out of Biblical text but there\u0026rsquo;s centuries of histories between the\nending of the OT and Jesus coming onto the scene\u003c/p\u003e\n",
      "content_text": "\n# Intro \n\nSession 1: Torah\n\nSession 2: Prophets and Writings\n\n# Review\n\n## Torah\n\nBig idea: partnership\n\n* Basis of partnership / meet the characters (Genesis)\n* God chooses a partner / the partner chooses God (Exodus)\n* God defines the partnership (Leviticus)\n* God shapes his partner (Numbers)\n* God asks his partner to remember (Deuteronomy)\n\n## History\n\nBig idea: Redemption cycle; God's patience\n\n* God places His people in the middle of the action for mission (Joshua)\n* God’s people struggle to walk the path and trust the story (Judges \u0026 Ruth)\n* God’s people struggle with identity and obedience (Samuel/Kings)\n* God’s people struggle with empire and becoming the anti-story (Chronicles)\n\n## Wisdom\n\nBig idea: Tools\n\n__If we are going to survive the cycle, we are going to need...__\n\n* Art and song for worship and expression (Psalms)\n* Nuggets of conventional wisdom (Proverbs)\n* Purpose and a reason to get up every morning (Ecclesiastes)\n* Relationships and intimacy with others (Song of Songs)\n\n## Prophets \n\nBig idea: Warnings, woes, and hope\n\n* God sends warning in Pre-Assyrian/Pre-Babylonian prophets (Amos, Hosea, Micah, 1 Isaiah, Zephaniah, 2 Isaiah)\n* God pronounces woe and judgment (Jonah, Nahum, Jeremiah, Lamentations, Habakkuk, Obadiah, Joel)\n* God gives hope and encouragement to an exiled people (Ezekiel, Daniel, Job, 3 Isaiah)\n\n## Remnant\n\nBig idea: Returning, yearning, learning\n\n* God’s people return to rebuild and restore what once was (4 Isaiah, Ezra/Nehemiah)\n* God’s people yearn for what used to be (Haggai, Zechariah)\n* God’s people learn that this new world demands a new approach (Malachi, Esther)\n\n## The Silent Years\n\nWe run out of Biblical text but there's centuries of histories between the\nending of the OT and Jesus coming onto the scene\n",
      "summary": "Session 1: Torah",
      "date_published": "2022-08-29T00:00:00Z",
      "date_modified": "2022-08-29T00:00:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "bema"
      ]
    },
    {
      "id": "https://pype.dev/benchmark-your-disks-with-fio/",
      "url": "https://pype.dev/benchmark-your-disks-with-fio/",
      "title": "Benchmark your disks with fio",
      "content_html": "\u003ch1 id=\"intro\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eIntro\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eI use ZFS at home in my homelab for basically all of my storage\u0026hellip; Docker uses\nZFS backend, all my VMs have their \u003ccode\u003e.qcow2\u003c/code\u003e images in their own zfs datasets,\nand all my shares are ZFS datasets. I love ZFS but my home hardware presently\nis the opposite of expensive or new\u0026hellip; Thankfully I\u0026rsquo;ve had a lot of my orginal\nhomelab simply given to me but the cost of this is that I didn\u0026rsquo;t put my\nmachines together, I didn\u0026rsquo;t choose the disks, and I definitely didn\u0026rsquo;t do the\nresearch I would\u0026rsquo;ve otherwise done had I bankrolled my server personally\u0026hellip;\u003c/p\u003e\n\u003ch2 id=\"the-problem\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThe Problem\u003c/span\u003e \u003ca href=\"#the-problem\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI run \u003ccode\u003eglances\u003c/code\u003e on basically all my machines and for the longest time I have\nbeen seeing big time \u003ccode\u003eiowait\u003c/code\u003e issues. Now, since everything was free I\u0026rsquo;ve\nlargely been able to ignore that however I\u0026rsquo;m now after some better performance\nwhich I think means new hardware!\u003c/p\u003e\n\u003cp\u003eHere is a random screenshot of my glances homepage at time of writing - The\nonly major load on my server is some \u003ccode\u003effmpeg\u003c/code\u003e transcoding (about 60% CPU\nutilization)\u0026hellip;\u003c/p\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/glances-iowait.png\" alt=\"glances\" title=\"glances with iowait\" /\u003e\n\u003cp\u003eAs you can see\u0026hellip; there\u0026rsquo;s a lot of issues and \u003cem\u003eI don\u0026rsquo;t even know what they mean\u003c/em\u003e.\u003c/p\u003e\n\u003ch1 id=\"fio\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003efio\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eI heard about \u003ca href=\"https://fio.readthedocs.io/en/latest/\"\u003efio\u003c/a\u003e through a friend and\ndecided to try it out quick. It installs with \u003ccode\u003eapt\u003c/code\u003e on ubuntu quick and easy\u0026hellip;\u003c/p\u003e\n\u003cp\u003eJim Saltar has a good blog post on it \u003ca href=\"https://arstechnica.com/gadgets/2020/02/how-fast-are-your-disks-find-out-the-open-source-way-with-fio/\"\u003ehere\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eBasically it\u0026rsquo;s a handy tool for benchmarking your disks and the blog dives into\nwhat types of metrics matter - it\u0026rsquo;s not just throughput, but also latency,\niops, etc.\u003c/p\u003e\n\u003ch2 id=\"tests\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTests\u003c/span\u003e \u003ca href=\"#tests\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI ran a few basic commands inside a new zfs dataset on my server \u003ccode\u003etank/fio\u003c/code\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efio --name\u003cspan class=\"o\"\u003e=\u003c/span\u003erandom-write --ioengine\u003cspan class=\"o\"\u003e=\u003c/span\u003eposixaio --rw\u003cspan class=\"o\"\u003e=\u003c/span\u003erandwrite --bs\u003cspan class=\"o\"\u003e=\u003c/span\u003e4k --size\u003cspan class=\"o\"\u003e=\u003c/span\u003e4g --numjobs\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e --runtime\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"m\"\u003e60\u003c/span\u003e --time_based --end_fsync\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e \u0026gt; single-4KiB-random-write.txt\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efio --name\u003cspan class=\"o\"\u003e=\u003c/span\u003erandom-write --ioengine\u003cspan class=\"o\"\u003e=\u003c/span\u003eposixaio --rw\u003cspan class=\"o\"\u003e=\u003c/span\u003erandwrite --bs\u003cspan class=\"o\"\u003e=\u003c/span\u003e64k --size\u003cspan class=\"o\"\u003e=\u003c/span\u003e256m --numjobs\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"m\"\u003e16\u003c/span\u003e --iodepth\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"m\"\u003e16\u003c/span\u003e --runtime\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"m\"\u003e60\u003c/span\u003e --time_based --end_fsync\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e \u0026gt; 16-parallel-64KiB-random-write.txt\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efio --name\u003cspan class=\"o\"\u003e=\u003c/span\u003erandom-write --ioengine\u003cspan class=\"o\"\u003e=\u003c/span\u003eposixaio --rw\u003cspan class=\"o\"\u003e=\u003c/span\u003erandwrite --bs\u003cspan class=\"o\"\u003e=\u003c/span\u003e1m --size\u003cspan class=\"o\"\u003e=\u003c/span\u003e16g --numjobs\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e --iodepth\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e --runtime\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"m\"\u003e60\u003c/span\u003e --time_based --end_fsync\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e \u0026gt; single-1MiB-random-write.txt\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"results\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eResults\u003c/span\u003e \u003ca href=\"#results\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe single 4 KiB random write:\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eWRITE: bw=7836KiB/s (8024kB/s), 7836KiB/s-7836KiB/s (8024kB/s-8024kB/s), io=523MiB (548MB), run=68317-68317msec\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eThe 16 parallel 64KiB random writes:\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eWRITE: bw=93.9MiB/s (98.4MB/s), 5599KiB/s-6303KiB/s (5734kB/s-6454kB/s), io=7642MiB (8013MB), run=81310-81418msec\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eThe single 1MiB random write:\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eWRITE: bw=81.2MiB/s (85.1MB/s), 81.2MiB/s-81.2MiB/s (85.1MB/s-85.1MB/s), io=8177MiB (8574MB), run=100699-100699msec\u003c/code\u003e\u003c/p\u003e\n\u003ch1 id=\"summary\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSummary\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eSo I don\u0026rsquo;t fully understand these numbers yet\u0026hellip; 80-100 MiB/s isn\u0026rsquo;t super fast\nand that\u0026rsquo;s across a parallelized workload\u0026hellip; The single threaded workloads have\nawful performance so this tells me something is wrong\u0026hellip; I have a few ideas\u0026hellip;\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eZFS dataset config options such as \u003ccode\u003eashift\u003c/code\u003e or the blocksize might be way misconfigured\u003c/li\u003e\n\u003cli\u003eThe disks/pool which came from a TrueNAS/FreeBSD machine may have some artifacts that I need to clean up\u003c/li\u003e\n\u003cli\u003eThe SAS controller I am using, which I flashed with IT firmware to get it into JBOD mode might be messed up\u003c/li\u003e\n\u003cli\u003eThe data cables themselves could be a problem\u0026hellip;\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003ePoints 3 and 4 are less likely given that the write speed does increase in the parallelized job but I\u0026rsquo;m a newbie so it\u0026rsquo;s time to dive in!\u003c/p\u003e\n",
      "content_text": "\n# Intro\n\nI use ZFS at home in my homelab for basically all of my storage... Docker uses\nZFS backend, all my VMs have their `.qcow2` images in their own zfs datasets,\nand all my shares are ZFS datasets. I love ZFS but my home hardware presently\nis the opposite of expensive or new... Thankfully I've had a lot of my orginal\nhomelab simply given to me but the cost of this is that I didn't put my\nmachines together, I didn't choose the disks, and I definitely didn't do the\nresearch I would've otherwise done had I bankrolled my server personally... \n\n## The Problem\n\nI run `glances` on basically all my machines and for the longest time I have\nbeen seeing big time `iowait` issues. Now, since everything was free I've\nlargely been able to ignore that however I'm now after some better performance\nwhich I think means new hardware!\n\nHere is a random screenshot of my glances homepage at time of writing - The\nonly major load on my server is some `ffmpeg` transcoding (about 60% CPU\nutilization)...\n\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/glances-iowait.png\" alt=\"glances\" title=\"glances with iowait\" /\u003e\n\n\nAs you can see... there's a lot of issues and _I don't even know what they mean_.\n\n# fio\n\nI heard about [fio](https://fio.readthedocs.io/en/latest/) through a friend and\ndecided to try it out quick. It installs with `apt` on ubuntu quick and easy...\n\nJim Saltar has a good blog post on it [here](https://arstechnica.com/gadgets/2020/02/how-fast-are-your-disks-find-out-the-open-source-way-with-fio/)\n\nBasically it's a handy tool for benchmarking your disks and the blog dives into\nwhat types of metrics matter - it's not just throughput, but also latency,\niops, etc.\n\n## Tests\n\nI ran a few basic commands inside a new zfs dataset on my server `tank/fio`\n\n```bash\nfio --name=random-write --ioengine=posixaio --rw=randwrite --bs=4k --size=4g --numjobs=1 --runtime=60 --time_based --end_fsync=1 \u003e single-4KiB-random-write.txt\nfio --name=random-write --ioengine=posixaio --rw=randwrite --bs=64k --size=256m --numjobs=16 --iodepth=16 --runtime=60 --time_based --end_fsync=1 \u003e 16-parallel-64KiB-random-write.txt\nfio --name=random-write --ioengine=posixaio --rw=randwrite --bs=1m --size=16g --numjobs=1 --iodepth=1 --runtime=60 --time_based --end_fsync=1 \u003e single-1MiB-random-write.txt\n```\n\n## Results\n\nThe single 4 KiB random write:\n\n`WRITE: bw=7836KiB/s (8024kB/s), 7836KiB/s-7836KiB/s (8024kB/s-8024kB/s), io=523MiB (548MB), run=68317-68317msec`\n\nThe 16 parallel 64KiB random writes:\n\n`WRITE: bw=93.9MiB/s (98.4MB/s), 5599KiB/s-6303KiB/s (5734kB/s-6454kB/s), io=7642MiB (8013MB), run=81310-81418msec`\n\nThe single 1MiB random write:\n\n`WRITE: bw=81.2MiB/s (85.1MB/s), 81.2MiB/s-81.2MiB/s (85.1MB/s-85.1MB/s), io=8177MiB (8574MB), run=100699-100699msec`\n\n# Summary\n\nSo I don't fully understand these numbers yet... 80-100 MiB/s isn't super fast\nand that's across a parallelized workload... The single threaded workloads have\nawful performance so this tells me something is wrong... I have a few ideas...\n\n1. ZFS dataset config options such as `ashift` or the blocksize might be way misconfigured\n2. The disks/pool which came from a TrueNAS/FreeBSD machine may have some artifacts that I need to clean up\n3. The SAS controller I am using, which I flashed with IT firmware to get it into JBOD mode might be messed up\n4. The data cables themselves could be a problem...\n\nPoints 3 and 4 are less likely given that the write speed does increase in the parallelized job but I'm a newbie so it's time to dive in!\n",
      "summary": "I use ZFS at home in my homelab for basically all of my storage... Docker uses ZFS backend, all my VMs have their images in their own zfs datasets, and all...",
      "date_published": "2022-08-27T13:43:22Z",
      "date_modified": "2022-08-27T13:43:22Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "python",
        "zfs",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/screwtape/",
      "url": "https://pype.dev/screwtape/",
      "title": "Screwtape",
      "content_html": "\u003ch1 id=\"chapters\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eChapters\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eBelow are just quick notes or quotes from each chapter as a reminder of what to\ngo back to chat about. This isn\u0026rsquo;t intended to be in-depth by any stretch.\u003c/p\u003e\n\u003ch2 id=\"chapter-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eChapter 1\u003c/span\u003e \u003ca href=\"#chapter-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u0026ldquo;Your man has been accustomed, ever since he was a boy, to have a dozen\nincompatible philosophies dancing about together inside his head. He doesn\u0026rsquo;t\nthink of doctrines as primarily \u0026rsquo;true\u0026rsquo; or \u0026lsquo;false\u0026rsquo;, but as \u0026lsquo;academic\u0026rsquo; or\n\u0026lsquo;practical\u0026rsquo;, \u0026lsquo;outworn\u0026rsquo; or \u0026lsquo;contemporary\u0026rsquo;, \u0026lsquo;conventional\u0026rsquo; or \u0026lsquo;ruthless\u0026rsquo;\u0026rdquo;\u003c/p\u003e\n\u003ch2 id=\"chapter-2\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eChapter 2\u003c/span\u003e \u003ca href=\"#chapter-2\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch2 id=\"chapter-3\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eChapter 3\u003c/span\u003e \u003ca href=\"#chapter-3\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003epg 11. Keeping the patient\u0026rsquo;s mind focused on the \u0026lsquo;inner life\u0026rsquo; so his actions do\nnot ever reflect his conversion\u003c/p\u003e\n\u003cp\u003epg 12. Creating an imaginary person for whom to pray\u0026hellip; \u0026ldquo;In time, you may get\nthe cleavage so wide that no thought or feeling from his prayers for the\nimagined mother will ever flow over into his treatment of the real one\u0026rdquo;\u003c/p\u003e\n\u003cp\u003epg 13-14. \u0026ldquo;Let him assume that she knows how annoying it is and does it to\nannoy - if you know your job he will not notice the immense improbability of\nthe assumption\u0026rdquo; -\u0026gt; This point is particularly convicting to me\u003c/p\u003e\n\u003cdiv class=\"admonition abstract\"\u003e\n\u003cp class=\"admonition-title\"\u003eAbstract\u003c/p\u003e\n\u003cp\u003eThe last point about encouraging the patient to interpret the mother\u0026rsquo;s every\nmove in an over-sensitive fashion is actually very relatable for me\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"chapter-4\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eChapter 4\u003c/span\u003e \u003ca href=\"#chapter-4\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003epg 15. Convincing the patient that scheduled prayer is wrong and that he must\ncreate a \u003cem\u003emood\u003c/em\u003e within himself for real prayer reminds me of high school youth\ngroups talking about \u0026ldquo;praying in the spirit\u0026rdquo; and silly conversation \u0026ldquo;combating\nsalvation by works\u0026rdquo; ideas like scheduled prayer times.\u003c/p\u003e\n\u003cp\u003epg 16. \u0026ldquo;they constantly forget, what you must always remember, that they are\nanimals and that whatever their bodies do affects their souls\u0026rdquo; 👈 feels a lot\nlike Genesis 3, and humans are never more human than when we exercise\nself-control.\u003c/p\u003e\n\u003cp\u003epg. 16. \u0026ldquo;Keep them watching their own minds and trying to produce \u003cem\u003efeelings\u003c/em\u003e\nthere by the action of their own wills\u0026rdquo;\u003c/p\u003e\n\u003cdiv class=\"admonition abstract\"\u003e\n\u003cp class=\"admonition-title\"\u003eAbstract\u003c/p\u003e\n\u003cp\u003eI totally remember feeling like I needed to want to pray in order for my\nprayers to matter\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003epg 17. \u0026ldquo;When they say they re praying for forgiveness, let them be trying to\nfeel forgiven\u0026rdquo;\u003c/p\u003e\n\u003cp\u003epg 18. \u0026ldquo;But whatever the nature of the composite object, you must keep him\npraying to \u003cem\u003eit\u003c/em\u003e - to the thing that he has made, not to the Person who has made\nhim\u0026rdquo;\u003c/p\u003e\n\u003cdiv class=\"admonition abstract\"\u003e\n\u003cp class=\"admonition-title\"\u003eAbstract\u003c/p\u003e\n\u003cp\u003eLewis talking actual idolatry with meaningful consequences\u0026hellip; not the \u0026ldquo;money\nis my idol\u0026rdquo; take most pastors preach\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"chapter-5\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eChapter 5\u003c/span\u003e \u003ca href=\"#chapter-5\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003epg 23. \u0026ldquo;\u0026hellip;while tens of thousands who do not go so far as that will\nnevertheless have their attention diverted from themselves to values and causes\nwhich they believe to be higher than the self. I know that the Enemy\ndisapproves many of these causes. But that is where He is so unfair. He often\nmakes prizes of humans who have given their lives for causes He think bad on\nthe monstrously sophistical ground that the humans thought them good and were\nfollowing the best they knew\u0026rdquo;\u003c/p\u003e\n\u003cdiv class=\"admonition warning\"\u003e\n\u003cp class=\"admonition-title\"\u003eWARNING TITLE\u003c/p\u003e\n\u003cp\u003eThis reminds me of the young Tarkan in Narnia: The Last Battle, who Aslan\nascribes all his good deeds done to Tash as done to himself - effectively\nsaying the Tarkan\u0026rsquo;s loyalty to the wrong god is honored by Aslan? Definitely\nwant to know more about Lewis\u0026rsquo; thoughts there and here in Screwtape\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"chapter-6\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eChapter 6\u003c/span\u003e \u003ca href=\"#chapter-6\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003epg 25. \u0026ldquo;There is nothing like suspense and anxiety for barricading a human\u0026rsquo;s\nmind against the Enemy.\u0026rdquo;\u003c/p\u003e\n\u003cdiv class=\"admonition warning\"\u003e\n\u003cp class=\"admonition-title\"\u003eWarning\u003c/p\u003e\n\u003cp\u003eScrewtape\u0026rsquo;s point in the beinning of the chapter confuses me\u0026hellip; He instructs\nWormwood to keep the man thinking that the things he is anxious about, the\nthings themselves, are his trials/cross to bear, rather than the anxiety\nitself. So from the Christian perspective, Lewis seems to be saying that the\nreal-time, present, acute anxiety and suspense in the man\u0026rsquo;s heart regarding the\nwar is the actual trial and cross\u0026hellip; not the things the man is anxious about. I\ndon\u0026rsquo;t know what to do with this but it \u003cem\u003efeels\u003c/em\u003e convicting to me. Growing up I\noften had the thought that nothing could be wrong because \u0026ldquo;I have Jesus\u0026rdquo;, and I\nwould look at my circumstances as things to bear - for me the biggest one was\nsingleness. So would Lewis say my outlook on my singleness as the thing to\nbear, rather than the anxiety about being single, was the enemy twisting my\nconvictions to be inward rather than God-ward? It clearly looks like my\nconvictions were inward, but I\u0026rsquo;m not sure I understand how seeing the anxiety\nitself as my \u0026ldquo;cross to bare\u0026rdquo; is any more Biblical\u0026hellip;\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"chapter-7\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eChapter 7\u003c/span\u003e \u003ca href=\"#chapter-7\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003epage 32. \u0026ldquo;The fact that \u0026lsquo;devils\u0026rsquo; are predominately \u003cem\u003ecomic\u003c/em\u003e figures in the\nmodern imagination will help you\u0026rdquo;\u003c/p\u003e\n\u003cdiv class=\"admonition abstract\"\u003e\n\u003cp class=\"admonition-title\"\u003eAbstract\u003c/p\u003e\n\u003cp\u003eI think It\u0026rsquo;s funny because I bet most people, myself included, reading this book (at\nleast the first time) have a red-devil type figure in mind for Screwtape or\nWormwood\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003epage 31-32. \u0026ldquo;If once we can produce our perfect work \u0026ndash; the Materialist\nMagician, the man, not using, but veritably worshipping, what he vaguely called\n\u0026lsquo;Froces\u0026rsquo; while denying the existence of \u0026lsquo;spirits\u0026rsquo; \u0026ndash; then the end of the war\nwill be in sight.\u0026rdquo;\u003c/p\u003e\n\u003cdiv class=\"admonition abstract\"\u003e\n\u003cp class=\"admonition-title\"\u003eAbstract\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eI hear some non-Christian friends say things like \u0026ldquo;I\u0026rsquo;m spiritual so I\nappreciate your prayers\u0026rdquo;. In a sense they believe in some kind of\nnon-physical \u0026ldquo;thing\u0026rdquo; but not in any real sense so it looks, to me, similar to\nwhat Screwtape longs for in his letter to Wormwood.\u003c/p\u003e\n\u003cp\u003epage 32. \u0026ldquo;All extremes, except extreme deviotion to the Enemy, are to be\nencouraged\u0026hellip; Other ages, of which the present is one, are unbalanced and prone\nto faction, and it is our business to inflame them\u0026rdquo;\u003c/p\u003e\n\u003cdiv class=\"admonition abstract\"\u003e\n\u003cp class=\"admonition-title\"\u003eAbstract\u003c/p\u003e\n\u003cp\u003eUsing Christianity to justify political positions or judgement seems right\nhere. Extreme devotion to our God I don\u0026rsquo;t think should offend people as often\nor to the degree that many Christians think is right\u0026hellip; People flocked to\nJesus, only the religious elite and politically powerful hated him. When\nChristianity is mixed with anything other than itself, that\u0026rsquo;s when it becomes\noffensive. I think I see people hold to something like Christian Nationalism,\nand the offensive nature of it justifies the position because \u0026ldquo;we were always\ngoing to be persecured for loving Jesus\u0026rdquo;\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition danger\"\u003e\n\u003cp class=\"admonition-title\"\u003epage 34\u003c/p\u003e\n\u003cp\u003eLet him begin by treating the Patriotism or the Pacifism as a part of his\nreligion. Then let him, under then influence of partisan spirit, come to\nregard it as the most important part\u0026hellip;\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"chapter-8\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eChapter 8\u003c/span\u003e \u003ca href=\"#chapter-8\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cdiv class=\"admonition success\"\u003e\n\u003cp class=\"admonition-title\"\u003epage 39\u003c/p\u003e\n\u003cp\u003eFor He cannot ravish. He can only woo.\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003epage 40\u003c/p\u003e\n\u003cp\u003eHe wants them to learn to walk and must therefore take away His hand; and\nif only the will to walk is really there He is pleased even with their\nstumbles\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"chapter-9\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eChapter 9\u003c/span\u003e \u003ca href=\"#chapter-9\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003epage 43. \u0026ldquo;In the first place I have always found that the trough periods of the\nhuman undulation provide excellen opportunity for all sensual tempations,\nparticularly those of sex\u0026hellip; The attack has a much better chance of success\nwhen the man\u0026rsquo;s whole innter world is drab and cold and empty.\u0026rdquo;\u003c/p\u003e\n\u003cdiv class=\"admonition abstract\"\u003e\n\u003cp class=\"admonition-title\"\u003eAbstract\u003c/p\u003e\n\u003cp\u003eI feel this observation in my own life deeply - in my \u0026rsquo;troughs\u0026rsquo; I\u0026rsquo;m drawn to\npleasurable things in a very unpleasurable way\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition success\"\u003e\n\u003cp class=\"admonition-title\"\u003epage 44\u003c/p\u003e\n\u003cp\u003eNever forget that when we are dealing with any pleasure in its healthy and\nnormal and satisfying form, we are, in a sense, on the Enemy\u0026rsquo;s ground.\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition danger\"\u003e\n\u003cp class=\"admonition-title\"\u003ejargon not wisdom\u003c/p\u003e\n\u003cp\u003eOf course there is no conceivable way of getting by reason from the\nproposition \u0026lsquo;I am losing interest in this\u0026rsquo; to the proposition \u0026lsquo;This is\nfalse\u0026rsquo;/ But, as I said before, it is jargon, not reason, you must rely on.\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"chapter-10\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eChapter 10\u003c/span\u003e \u003ca href=\"#chapter-10\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003epage 49. \u0026ldquo;Did he commit himself deeply? I don\u0026rsquo;t mean the words. There is a\nsubtle play of looks and tons and laughs by which a mortal can imply that he is\nof the same party as those to whom he is speaking\u0026rdquo;\u003c/p\u003e\n\u003cdiv class=\"admonition abstract\"\u003e\n\u003cp class=\"admonition-title\"\u003eAbstract\u003c/p\u003e\n\u003cp\u003eI resonate with the temptation Scretape is basically instructing Wormwood to\nemploy - two-facedness/double-life. In hs/college in particular I would \u0026lsquo;play\nthe part\u0026rsquo; to fit in to a particular crowd. I\u0026rsquo;d rarely confess Christianity\nearly on, would never deny it explicitly, but would act and talk in a\nway/about things to imply that I was not necessarily non-Christian, but\ninstead nothing to ask about.\u003c/p\u003e\n\u003cp\u003eChapter 10 in overall convicting as it just drives home the point I noted\njust now\u0026hellip;. that I\u0026rsquo;m very prone to \u0026lsquo;acting\u0026rsquo; in order to fit into a community\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"chatper-11\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eChatper 11\u003c/span\u003e \u003ca href=\"#chatper-11\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003epage 55. \u0026ldquo;The real use of Joke or Humour is in quite a different direction, and\nit is specially promising among the English who take their \u0026lsquo;sense of humour\u0026rsquo; so\nseriously that a deficiency in this sense is almost the only deficiency at\nwhich they feel shame. Humour is for them the all-consoling and (mark this) the\nall-excusing, grace of life\u0026rdquo;\u003c/p\u003e\n\u003cdiv class=\"admonition danger\"\u003e\n\u003cp class=\"admonition-title\"\u003eall-excusing grace of life\u003c/p\u003e\n\u003cp\u003eHumour is for them the all-consoling and (mark this) the all-excusing,\ngrace of life\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition abstract\"\u003e\n\u003cp class=\"admonition-title\"\u003eAbstract\u003c/p\u003e\n\u003cp\u003eBasically I understand Lewis to be saying here that men (or the English in\nparticular) take great pride in having a sense of humor - so much so that\nhumor becomes an excuse to laugh at anything. When anything is worth laughing\nat, then I think it\u0026rsquo;s very hard to prioritize things above others - becuase\nif everything is a joke, is anything really worthy of more than a joke?\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition warning\"\u003e\n\u003cp class=\"admonition-title\"\u003eFlippancy\u003c/p\u003e\n\u003cp\u003eI didn\u0026rsquo;t understand flippancy as first because I\u0026rsquo;ve always kind of equated\nit with \u0026ldquo;quick\u0026rdquo;. However, it\u0026rsquo;s more of a \u0026ldquo;quickness\u0026rdquo; paired with a total\nlack of respect/awareness for/of X.\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition warning\"\u003e\n\u003cp class=\"admonition-title\"\u003echurches\u003c/p\u003e\n\u003cp\u003eAre there areas in the church where we are flippant (specifically with humor I guess?)\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"chapter-12\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eChapter 12\u003c/span\u003e \u003ca href=\"#chapter-12\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cdiv class=\"admonition danger\"\u003e\n\u003cp class=\"admonition-title\"\u003epage 57-58\u003c/p\u003e\n\u003cp\u003eAs long as he retains externally the habits of a Christian he can still be\nmade to think of himself as one who has adopted a few new friends and\namusements but whose spiritual state is much the same as it was six weeks\nago.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003epage 58. [The dim uneasiness about \u003ccode\u003ebacksliding\u003c/code\u003e Screwtape describes in the\nchapter] increases the patient\u0026rsquo;s reluctance to think about the Enemy.\u003c/p\u003e\n\u003cdiv class=\"admonition abstract\"\u003e\n\u003cp class=\"admonition-title\"\u003eAbstract\u003c/p\u003e\n\u003cp\u003eThis is too real for me - in seasons of rebellion, and honestly anytime I\nfall away from \u0026ldquo;Christian habits\u0026rdquo; I notice that I am actually reluctant to\npray or meditate. Often the only thing that (or the initial thing in\nappearance) that brings me back is my kids and praying with them or singing\nDoxology. A choice I wouldnt\u0026rsquo; make alone, but make for their sake - perhaps\nthis is God\u0026rsquo;s grace poured out on me\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition danger\"\u003e\n\u003cp class=\"admonition-title\"\u003epage 58\u003c/p\u003e\n\u003cp\u003eThey hate every idea that suggests Him, just as men in financial\nembarrassment hate the very sight of a pass-book.\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"chapter-13\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eChapter 13\u003c/span\u003e \u003ca href=\"#chapter-13\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eParticularly a challenging chapter. It\u0026rsquo;s interesting to think about pleasurable\nthings, for their own sake and not enjoyed outside the boundaires set for\npleasure by God, are harmful to our enemy\u0026rsquo;s tactics. I do not know if I enjoy\nthings for their own sake enough or rightly\u0026hellip;.\u003c/p\u003e\n\u003cdiv class=\"admonition warning\"\u003e\n\u003cp class=\"admonition-title\"\u003eWarning\u003c/p\u003e\n\u003cp\u003eDo my tech hobbies make me more human or less by distracting me from holier\nthings\u0026hellip;\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"chapter-14\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eChapter 14\u003c/span\u003e \u003ca href=\"#chapter-14\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cdiv class=\"admonition warning\"\u003e\n\u003cp class=\"admonition-title\"\u003epage 69\u003c/p\u003e\n\u003cp\u003eAll virtues are less formidable to us once the man is aware that he has\nthem, but this is specially true of humility.\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"chapter-16\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eChapter 16\u003c/span\u003e \u003ca href=\"#chapter-16\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003epage 81\u003c/p\u003e\n\u003cp\u003eIn the first place the parochial organisation [Church] should always be\nattacked, because, being a \u003cem\u003eunity of place and not of likings\u003c/em\u003e, it brings\npeople of different classes and psychology together in the kind of unity\nthe Enemy desires\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition danger\"\u003e\n\u003cp class=\"admonition-title\"\u003epage 82-83\u003c/p\u003e\n\u003cp\u003eIn order to spare the laity all \u0026lsquo;difficulties\u0026rsquo; he has deserted both the\nlectionary and the appointed psalms and now, without noticing it, revoles\nendlessly round the little treadmill of his fifteen favourite psalms and\ntwenty favorite lessons.\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"chapter-17\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eChapter 17\u003c/span\u003e \u003ca href=\"#chapter-17\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cdiv class=\"admonition abstract\"\u003e\n\u003cp class=\"admonition-title\"\u003eAbstract\u003c/p\u003e\n\u003cp\u003eGluttony of Delicacy, not gluttony of Excess\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition danger\"\u003e\n\u003cp class=\"admonition-title\"\u003epage 88\u003c/p\u003e\n\u003cp\u003eYou see? Because what she wants is smaller and less costly than what has\nbeen set before her, she never recognises as gluttony her determination to\nget what she wants, however troublesome it may be to others\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"chapter-18\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eChapter 18\u003c/span\u003e \u003ca href=\"#chapter-18\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eScrewtape\u0026rsquo;s lack of understanding,and arrogant questioning, of the Enemy\u0026rsquo;s\n\u003cem\u003elove\u003c/em\u003e is a hilarious commentary on humans who stand staunchly opposed to\nYahweh. Academic peers of mine, with such amazing pride, speaking aginst the\nBiblical narrative because \u003cem\u003eit doesn\u0026rsquo;t make sense\u003c/em\u003e\u0026hellip; Lewis makes a good point\nthrough Screwtape \u0026ldquo;Members of His faction have frequently admitted that if ever\nwe [demons] came to understand what He means by love, the war would be over and\nwe should re-enter Heaven\u0026rdquo;. I think Lewis\u0026rsquo; point dovetails with the idea that\nJesus is actually very compelling and the rubbish about him being offensive is\na replay of the Gospels - where the rich and elite are the ones offended, not\nthe people he calls to the kingdom. Jesus\u0026rsquo; love doesn\u0026rsquo;t make sense to those who\nhave everything they think they need\u0026hellip; His love is for those who know they are\nlowly\u003c/p\u003e\n\u003ch2 id=\"chapter-19\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eChapter 19\u003c/span\u003e \u003ca href=\"#chapter-19\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003eTODO: Go through and make notes\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"chapter-20\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eChapter 20\u003c/span\u003e \u003ca href=\"#chapter-20\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003eTODO: Go through and make notes\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"chapter-21\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eChapter 21\u003c/span\u003e \u003ca href=\"#chapter-21\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003eTODO: Go through and make notes\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"chatper-22\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eChatper 22\u003c/span\u003e \u003ca href=\"#chatper-22\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003eTODO: Go through and make notes\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"chatper-23\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eChatper 23\u003c/span\u003e \u003ca href=\"#chatper-23\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003eTODO: Go through and make notes\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"chatper-24\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eChatper 24\u003c/span\u003e \u003ca href=\"#chatper-24\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003epage 130 - It\u0026rsquo;s always the novice who exaggerates\u0026hellip;\u003c/p\u003e\n\u003cdiv class=\"admonition abstract\"\u003e\n\u003cp class=\"admonition-title\"\u003eAbstract\u003c/p\u003e\n\u003cp\u003eI think about Summit in particular, where I got to meet a lot of big names in\napologetics, and I\u0026rsquo;d talk about them to others like we were friends\u0026hellip; The\ndifference between \u0026ldquo;I know X\u0026rdquo; and \u0026ldquo;X knows me\u0026rdquo; is a thing I kept hidden so I\ncould feel important\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"chatper-25\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eChatper 25\u003c/span\u003e \u003ca href=\"#chatper-25\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cdiv class=\"admonition danger\"\u003e\n\u003cp class=\"admonition-title\"\u003eChristianity And...\u003c/p\u003e\n\u003cp\u003eWhat we want, if men becomes Christians at all, is to koeep them in the\nstate of mind I call \u0026lsquo;Christianity And\u0026rsquo;. You know - Christianity and the\nCrisis,Christianity and the New Order, \u0026hellip;\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition abstract\"\u003e\n\u003cp class=\"admonition-title\"\u003eAbstract\u003c/p\u003e\n\u003cp\u003eI don\u0026rsquo;t know\u0026hellip; smells more and more like Christian Nationalism is the\nmodern-day \u003ccode\u003eChristinaity And\u003c/code\u003e\u0026hellip; So much focus on policy, behavior, order\n(patriarchy even)\u0026hellip;. Not a lot about Jesus \u003cem\u003ein the conversation about\nChristian Nationalism\u003c/em\u003e (not that Christians in this mindset don\u0026rsquo;t genuinely\nlove Jesus or talk about him - but I don\u0026rsquo;t hear Jesus often in the\nconversation, I only hear the politics). But I suppose to be fair there\u0026rsquo;s\nevery chance in the world that I misunderstand the position and people.\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition danger\"\u003e\n\u003cp class=\"admonition-title\"\u003eDanger\u003c/p\u003e\n\u003cp\u003eBut if I do misunderstand\u0026hellip; A fairly educated, theologically competent,\nBiblically literate person\u0026hellip; then what do Christian Nationalists expect of\npeople who never heard of Jesus, or already were introduced to Republican\nJesus or something\u0026hellip; I\u0026rsquo;m not the cream of the crop, but if I don\u0026rsquo;t\nproperly understand what the position is about then the world, unbelievers\nI mean, will be even more turned off to the Gospel\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003ePage 139 - \u0026ldquo;We have trained them to think of the Future as a promised land\nwhich favoured heroes attain - not as something which everyone reaches at the\nrate of sixety minutes an hour, whatever he does, whoever he is\u0026hellip;\u0026rdquo;\u003c/p\u003e\n\u003ch2 id=\"chatper-26\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eChatper 26\u003c/span\u003e \u003ca href=\"#chatper-26\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cdiv class=\"admonition danger\"\u003e\n\u003cp class=\"admonition-title\"\u003e_Unselfishness_\u003c/p\u003e\n\u003cp\u003eNote, once again, the admirable work of our Philological Arm in\nsubstituting the negative unselfishness for the Enemy\u0026rsquo;s positive Charity\u003c/p\u003e\n\u003c/div\u003e\n\u003cblockquote\u003e\n\u003cp\u003eBig one for me\u0026hellip; hard to even process\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cdiv class=\"admonition warning\"\u003e\n\u003cp class=\"admonition-title\"\u003epage 143\u003c/p\u003e\n\u003cp\u003eIn discussing any joint action, it becomes obligatory thta A should argue\nin favour of B\u0026rsquo;s supposed wishes and against his own, while B does the\nopposite\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition abstract\"\u003e\n\u003cp class=\"admonition-title\"\u003eAbstract\u003c/p\u003e\n\u003cp\u003eGoing out to eat, what to do tonight, etc\u0026hellip; simple things, not big ones\n(like how to discipline our kids), is where this is just rampant in my\nlife\u0026hellip; I constantly and consciously say in my head \u0026ldquo;X will make my wife\nhappier even though I don\u0026rsquo;t want to\u0026rdquo; then after whatever \u0026ldquo;X\u0026rdquo; is, turns out\nshe didn\u0026rsquo;t really care or want it \u003cem\u003eOR\u003c/em\u003e she\u0026rsquo;s upset because she feels like a\nnuisance to me\u0026hellip; Then the reality is I don\u0026rsquo;t actually know if I saw her as a\nnuisance in that moment, or if I genuinely wanted to do what she wanted out\nof love and charity\u0026hellip;\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition warning\"\u003e\n\u003cp class=\"admonition-title\"\u003epage 144\u003c/p\u003e\n\u003cp\u003eHe insists on doing \u0026lsquo;what the others want\u0026rsquo;. They insist on doing what he\nwants. Passions are roused. Soon someone is saying \u0026lsquo;Very well then, I won\u0026rsquo;t\nhave any tea at all!\u0026rsquo;, and a real quarrel ensues with bitter resentment on\nboth sides.\u003c/p\u003e\n\u003c/div\u003e\n\u003cblockquote\u003e\n\u003cp\u003eHappens all the freaking time, and at the end of it I\u0026rsquo;m left with \u0026ldquo;wtf just happened?\u0026rdquo;\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"chatper-27\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eChatper 27\u003c/span\u003e \u003ca href=\"#chatper-27\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003eTODO: Go through and make notes\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"chatper-28\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eChatper 28\u003c/span\u003e \u003ca href=\"#chatper-28\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n",
      "content_text": "\n# Chapters\n\nBelow are just quick notes or quotes from each chapter as a reminder of what to\ngo back to chat about. This isn't intended to be in-depth by any stretch.\n\n## Chapter 1\n\n\"Your man has been accustomed, ever since he was a boy, to have a dozen\nincompatible philosophies dancing about together inside his head. He doesn't\nthink of doctrines as primarily 'true' or 'false', but as 'academic' or\n'practical', 'outworn' or 'contemporary', 'conventional' or 'ruthless'\"\n\n## Chapter 2\n\n## Chapter 3\n\npg 11. Keeping the patient's mind focused on the 'inner life' so his actions do\nnot ever reflect his conversion\n\npg 12. Creating an imaginary person for whom to pray... \"In time, you may get\nthe cleavage so wide that no thought or feeling from his prayers for the\nimagined mother will ever flow over into his treatment of the real one\"\n\npg 13-14. \"Let him assume that she knows how annoying it is and does it to\nannoy - if you know your job he will not notice the immense improbability of\nthe assumption\" -\u003e This point is particularly convicting to me\n\n!!! abstract \"\"\n\n    The last point about encouraging the patient to interpret the mother's every\n    move in an over-sensitive fashion is actually very relatable for me\n\n## Chapter 4\n\npg 15. Convincing the patient that scheduled prayer is wrong and that he must\ncreate a _mood_ within himself for real prayer reminds me of high school youth\ngroups talking about \"praying in the spirit\" and silly conversation \"combating\nsalvation by works\" ideas like scheduled prayer times.\n\npg 16. \"they constantly forget, what you must always remember, that they are\nanimals and that whatever their bodies do affects their souls\" 👈 feels a lot\nlike Genesis 3, and humans are never more human than when we exercise\nself-control.\n\npg. 16. \"Keep them watching their own minds and trying to produce _feelings_\nthere by the action of their own wills\"\n\n!!! abstract \"\"\n\n    I totally remember feeling like I needed to want to pray in order for my\n    prayers to matter\n\npg 17. \"When they say they re praying for forgiveness, let them be trying to\nfeel forgiven\"\n\npg 18. \"But whatever the nature of the composite object, you must keep him\npraying to _it_ - to the thing that he has made, not to the Person who has made\nhim\"\n\n!!! abstract \"\"\n\n    Lewis talking actual idolatry with meaningful consequences... not the \"money\n    is my idol\" take most pastors preach\n\n## Chapter 5\n\npg 23. \"...while tens of thousands who do not go so far as that will\nnevertheless have their attention diverted from themselves to values and causes\nwhich they believe to be higher than the self. I know that the Enemy\ndisapproves many of these causes. But that is where He is so unfair. He often\nmakes prizes of humans who have given their lives for causes He think bad on\nthe monstrously sophistical ground that the humans thought them good and were\nfollowing the best they knew\"\n\n!!! warning \"WARNING TITLE\"\n\n    This reminds me of the young Tarkan in Narnia: The Last Battle, who Aslan\n    ascribes all his good deeds done to Tash as done to himself - effectively\n    saying the Tarkan's loyalty to the wrong god is honored by Aslan? Definitely\n    want to know more about Lewis' thoughts there and here in Screwtape\n\n## Chapter 6\n\npg 25. \"There is nothing like suspense and anxiety for barricading a human's\nmind against the Enemy.\"\n\n!!! warning \"\"\n\n    Screwtape's point in the beinning of the chapter confuses me... He instructs\n    Wormwood to keep the man thinking that the things he is anxious about, the\n    things themselves, are his trials/cross to bear, rather than the anxiety\n    itself. So from the Christian perspective, Lewis seems to be saying that the\n    real-time, present, acute anxiety and suspense in the man's heart regarding the\n    war is the actual trial and cross... not the things the man is anxious about. I\n    don't know what to do with this but it _feels_ convicting to me. Growing up I\n    often had the thought that nothing could be wrong because \"I have Jesus\", and I\n    would look at my circumstances as things to bear - for me the biggest one was\n    singleness. So would Lewis say my outlook on my singleness as the thing to\n    bear, rather than the anxiety about being single, was the enemy twisting my\n    convictions to be inward rather than God-ward? It clearly looks like my\n    convictions were inward, but I'm not sure I understand how seeing the anxiety\n    itself as my \"cross to bare\" is any more Biblical...\n\n## Chapter 7\n\npage 32. \"The fact that 'devils' are predominately _comic_ figures in the\nmodern imagination will help you\"\n\n!!! abstract \"\"\n\n    I think It's funny because I bet most people, myself included, reading this book (at\n    least the first time) have a red-devil type figure in mind for Screwtape or\n    Wormwood\n\npage 31-32. \"If once we can produce our perfect work -- the Materialist\nMagician, the man, not using, but veritably worshipping, what he vaguely called\n'Froces' while denying the existence of 'spirits' -- then the end of the war\nwill be in sight.\"\n\n!!! abstract \"\"\n\n  I hear some non-Christian friends say things like \"I'm spiritual so I\n  appreciate your prayers\". In a sense they believe in some kind of\n  non-physical \"thing\" but not in any real sense so it looks, to me, similar to\n  what Screwtape longs for in his letter to Wormwood.\n\npage 32. \"All extremes, except extreme deviotion to the Enemy, are to be\nencouraged... Other ages, of which the present is one, are unbalanced and prone\nto faction, and it is our business to inflame them\"\n\n!!! abstract \"\"\n\n    Using Christianity to justify political positions or judgement seems right\n    here. Extreme devotion to our God I don't think should offend people as often\n    or to the degree that many Christians think is right... People flocked to\n    Jesus, only the religious elite and politically powerful hated him. When\n    Christianity is mixed with anything other than itself, that's when it becomes\n    offensive. I think I see people hold to something like Christian Nationalism,\n    and the offensive nature of it justifies the position because \"we were always\n    going to be persecured for loving Jesus\"\n\n!!! danger \"page 34\"\n\n    Let him begin by treating the Patriotism or the Pacifism as a part of his\n    religion. Then let him, under then influence of partisan spirit, come to\n    regard it as the most important part...\n\n## Chapter 8\n\n!!! success \"page 39\"\n\n    For He cannot ravish. He can only woo.\n\n!!! note \"page 40\"\n\n    He wants them to learn to walk and must therefore take away His hand; and\n    if only the will to walk is really there He is pleased even with their\n    stumbles\n\n## Chapter 9\n\npage 43. \"In the first place I have always found that the trough periods of the\nhuman undulation provide excellen opportunity for all sensual tempations,\nparticularly those of sex... The attack has a much better chance of success\nwhen the man's whole innter world is drab and cold and empty.\"\n\n!!! abstract \"\"\n\n    I feel this observation in my own life deeply - in my 'troughs' I'm drawn to\n    pleasurable things in a very unpleasurable way\n\n!!! success \"page 44\"\n\n    Never forget that when we are dealing with any pleasure in its healthy and\n    normal and satisfying form, we are, in a sense, on the Enemy's ground.\n\n!!! danger \"jargon not wisdom\"\n\n    Of course there is no conceivable way of getting by reason from the\n    proposition 'I am losing interest in this' to the proposition 'This is\n    false'/ But, as I said before, it is jargon, not reason, you must rely on.\n\n## Chapter 10\n\npage 49. \"Did he commit himself deeply? I don't mean the words. There is a\nsubtle play of looks and tons and laughs by which a mortal can imply that he is\nof the same party as those to whom he is speaking\"\n\n!!! abstract \"\"\n\n    I resonate with the temptation Scretape is basically instructing Wormwood to\n    employ - two-facedness/double-life. In hs/college in particular I would 'play\n    the part' to fit in to a particular crowd. I'd rarely confess Christianity\n    early on, would never deny it explicitly, but would act and talk in a\n    way/about things to imply that I was not necessarily non-Christian, but\n    instead nothing to ask about.\n\n    Chapter 10 in overall convicting as it just drives home the point I noted\n    just now.... that I'm very prone to 'acting' in order to fit into a community\n\n## Chatper 11\n\npage 55. \"The real use of Joke or Humour is in quite a different direction, and\nit is specially promising among the English who take their 'sense of humour' so\nseriously that a deficiency in this sense is almost the only deficiency at\nwhich they feel shame. Humour is for them the all-consoling and (mark this) the\nall-excusing, grace of life\"\n\n!!! danger \"all-excusing grace of life\"\n\n    Humour is for them the all-consoling and (mark this) the all-excusing,\n    grace of life\n\n!!! abstract \"\"\n\n    Basically I understand Lewis to be saying here that men (or the English in\n    particular) take great pride in having a sense of humor - so much so that\n    humor becomes an excuse to laugh at anything. When anything is worth laughing\n    at, then I think it's very hard to prioritize things above others - becuase\n    if everything is a joke, is anything really worthy of more than a joke?\n\n!!! warning \"Flippancy\"\n\n    I didn't understand flippancy as first because I've always kind of equated\n    it with \"quick\". However, it's more of a \"quickness\" paired with a total\n    lack of respect/awareness for/of X.\n\n!!! warning \"churches\"\n\n    Are there areas in the church where we are flippant (specifically with humor I guess?)\n\n## Chapter 12\n\n!!! danger \"page 57-58\"\n\n    As long as he retains externally the habits of a Christian he can still be\n    made to think of himself as one who has adopted a few new friends and\n    amusements but whose spiritual state is much the same as it was six weeks\n    ago.\n\npage 58. [The dim uneasiness about `backsliding` Screwtape describes in the\nchapter] increases the patient's reluctance to think about the Enemy.\n\n!!! abstract \"\"\n\n    This is too real for me - in seasons of rebellion, and honestly anytime I\n    fall away from \"Christian habits\" I notice that I am actually reluctant to\n    pray or meditate. Often the only thing that (or the initial thing in\n    appearance) that brings me back is my kids and praying with them or singing\n    Doxology. A choice I wouldnt' make alone, but make for their sake - perhaps\n    this is God's grace poured out on me\n\n!!! danger \"page 58\"\n\n    They hate every idea that suggests Him, just as men in financial\n    embarrassment hate the very sight of a pass-book.\n\n## Chapter 13\n\nParticularly a challenging chapter. It's interesting to think about pleasurable\nthings, for their own sake and not enjoyed outside the boundaires set for\npleasure by God, are harmful to our enemy's tactics. I do not know if I enjoy\nthings for their own sake enough or rightly....\n\n!!! warning \"\"\n\n    Do my tech hobbies make me more human or less by distracting me from holier\n    things...\n\n## Chapter 14\n\n!!! warning \"page 69\"\n\n    All virtues are less formidable to us once the man is aware that he has\n    them, but this is specially true of humility.\n\n## Chapter 16\n\n!!! note \"page 81\"\n\n    In the first place the parochial organisation [Church] should always be\n    attacked, because, being a _unity of place and not of likings_, it brings\n    people of different classes and psychology together in the kind of unity\n    the Enemy desires\n\n!!! danger \"page 82-83\"\n\n    In order to spare the laity all 'difficulties' he has deserted both the\n    lectionary and the appointed psalms and now, without noticing it, revoles\n    endlessly round the little treadmill of his fifteen favourite psalms and\n    twenty favorite lessons.\n\n## Chapter 17\n\n!!! abstract \"\"\n\n    Gluttony of Delicacy, not gluttony of Excess\n\n!!! danger \"page 88\"\n\n    You see? Because what she wants is smaller and less costly than what has\n    been set before her, she never recognises as gluttony her determination to\n    get what she wants, however troublesome it may be to others\n\n## Chapter 18\n\nScrewtape's lack of understanding,and arrogant questioning, of the Enemy's\n_love_ is a hilarious commentary on humans who stand staunchly opposed to\nYahweh. Academic peers of mine, with such amazing pride, speaking aginst the\nBiblical narrative because _it doesn't make sense_... Lewis makes a good point\nthrough Screwtape \"Members of His faction have frequently admitted that if ever\nwe [demons] came to understand what He means by love, the war would be over and\nwe should re-enter Heaven\". I think Lewis' point dovetails with the idea that\nJesus is actually very compelling and the rubbish about him being offensive is\na replay of the Gospels - where the rich and elite are the ones offended, not\nthe people he calls to the kingdom. Jesus' love doesn't make sense to those who\nhave everything they think they need... His love is for those who know they are\nlowly\n\n## Chapter 19\n\n\u003e TODO: Go through and make notes\n\n## Chapter 20\n\n\u003e TODO: Go through and make notes\n\n## Chapter 21\n\n\u003e TODO: Go through and make notes\n\n## Chatper 22\n\n\u003e TODO: Go through and make notes\n\n## Chatper 23\n\n\u003e TODO: Go through and make notes\n\n## Chatper 24\n\npage 130 - It's always the novice who exaggerates...\n\n!!! abstract \"\"\n\n    I think about Summit in particular, where I got to meet a lot of big names in\n    apologetics, and I'd talk about them to others like we were friends... The\n    difference between \"I know X\" and \"X knows me\" is a thing I kept hidden so I\n    could feel important\n\n## Chatper 25\n\n!!! danger \"Christianity And...\"\n\n    What we want, if men becomes Christians at all, is to koeep them in the\n    state of mind I call 'Christianity And'. You know - Christianity and the\n    Crisis,Christianity and the New Order, ...\n\n!!! abstract \"\"\n\n    I don't know... smells more and more like Christian Nationalism is the\n    modern-day `Christinaity And`... So much focus on policy, behavior, order\n    (patriarchy even).... Not a lot about Jesus _in the conversation about\n    Christian Nationalism_ (not that Christians in this mindset don't genuinely\n    love Jesus or talk about him - but I don't hear Jesus often in the\n    conversation, I only hear the politics). But I suppose to be fair there's\n    every chance in the world that I misunderstand the position and people.\n\n!!! danger \"\"\n\n    But if I do misunderstand... A fairly educated, theologically competent,\n    Biblically literate person... then what do Christian Nationalists expect of\n    people who never heard of Jesus, or already were introduced to Republican\n    Jesus or something... I'm not the cream of the crop, but if I don't\n    properly understand what the position is about then the world, unbelievers\n    I mean, will be even more turned off to the Gospel\n\nPage 139 - \"We have trained them to think of the Future as a promised land\nwhich favoured heroes attain - not as something which everyone reaches at the\nrate of sixety minutes an hour, whatever he does, whoever he is...\"\n\n## Chatper 26\n\n!!! danger \"_Unselfishness_\"\n\n    Note, once again, the admirable work of our Philological Arm in\n    substituting the negative unselfishness for the Enemy's positive Charity\n\n\u003e Big one for me... hard to even process\n\n!!! warning \"page 143\"\n\n    In discussing any joint action, it becomes obligatory thta A should argue\n    in favour of B's supposed wishes and against his own, while B does the\n    opposite\n\n!!! abstract \"\"\n\n    Going out to eat, what to do tonight, etc... simple things, not big ones\n    (like how to discipline our kids), is where this is just rampant in my\n    life... I constantly and consciously say in my head \"X will make my wife\n    happier even though I don't want to\" then after whatever \"X\" is, turns out\n    she didn't really care or want it _OR_ she's upset because she feels like a\n    nuisance to me... Then the reality is I don't actually know if I saw her as a\n    nuisance in that moment, or if I genuinely wanted to do what she wanted out\n    of love and charity...\n\n!!! warning \"page 144\"\n\n    He insists on doing 'what the others want'. They insist on doing what he\n    wants. Passions are roused. Soon someone is saying 'Very well then, I won't\n    have any tea at all!', and a real quarrel ensues with bitter resentment on\n    both sides.\n\n\u003e Happens all the freaking time, and at the end of it I'm left with \"wtf just happened?\"\n\n## Chatper 27\n\n\u003e TODO: Go through and make notes\n\n## Chatper 28\n",
      "summary": "Below are just quick notes or quotes from each chapter as a reminder of what to go back to chat about. This isn't intended to be in-depth by any stretch.",
      "date_published": "2022-08-22T00:00:00Z",
      "date_modified": "2022-08-22T00:00:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "books",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/paperless-ngx-filtering-on-ids-instead-of-values/",
      "url": "https://pype.dev/paperless-ngx-filtering-on-ids-instead-of-values/",
      "title": "Paperless-NGX filtering on IDs instead of values",
      "content_html": "\u003cp\u003eTo filter for saved views from the admin console you have to use the \u003ccode\u003eid\u003c/code\u003e of\nthe tag you are using to filter on\u0026hellip;\u003c/p\u003e\n\u003cp\u003eEx: filtering for tags \u0026ldquo;Inbox\u0026rdquo; doesn\u0026rsquo;t work, but for tag 18 does (the id fo the\nInbox tag). I can find that ID by clicking on the tag and looking at the url\nbar\u003c/p\u003e\n",
      "content_text": "\nTo filter for saved views from the admin console you have to use the `id` of\nthe tag you are using to filter on...\n\nEx: filtering for tags \"Inbox\" doesn't work, but for tag 18 does (the id fo the\nInbox tag). I can find that ID by clicking on the tag and looking at the url\nbar\n",
      "summary": "To filter for saved views from the admin console you have to use the of the tag you are using to filter on...",
      "date_published": "2022-08-09T08:28:51Z",
      "date_modified": "2022-08-09T08:28:51Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/mounting-exfat-usb-in-linux/",
      "url": "https://pype.dev/mounting-exfat-usb-in-linux/",
      "title": "Mounting exFAT USB in Linux",
      "content_html": "\u003ch1 id=\"steps\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSteps\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003e\u003ccode\u003esudo fdisk -l\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003ethen look for the device and partition\u003c/p\u003e\n\u003cp\u003eget the Type column\u003c/p\u003e\n\u003cp\u003emount\u003c/p\u003e\n\u003ch2 id=\"example\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExample\u003c/span\u003e \u003ca href=\"#example\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre\u003e\u003ccode\u003e\ndumbledore in /media  NO PYTHON VENV SET \n❯ sudo fdisk -l\n\n...\n\nDevice     Boot    Start      End  Sectors  Size Id Type\n/dev/sdk1  *        2048 60371951 60369904 28.8G  7 HPFS/NTFS/exFAT\n/dev/sdk2       60371952 60437487    65536   32M ef EFI (FAT-12/16/32)\n\n\ndumbledore in /media  NO PYTHON VENV SET \n❯ sudo mount -t ntfs /dev/sdk1 /media/ventoy-usb -o uid=1000                       \nNTFS signature is missing.\nFailed to mount '/dev/sdk1': Invalid argument\nThe device '/dev/sdk1' doesn't seem to have a valid NTFS.\nMaybe the wrong device is used? Or the whole disk instead of a\npartition (e.g. /dev/sda, not /dev/sda1)? Or the other way around?\n\ndumbledore in /media  NO PYTHON VENV SET \n✗ sudo mount -t exfat /dev/sdk1 /media/ventoy-usb -o uid=1000\n\n\u003c/code\u003e\u003c/pre\u003e\n",
      "content_text": "\n# Steps\n\n`sudo fdisk -l`\n\nthen look for the device and partition\n\nget the Type column\n\nmount\n\n## Example\n\n```\n\ndumbledore in /media  NO PYTHON VENV SET \n❯ sudo fdisk -l\n\n...\n\nDevice     Boot    Start      End  Sectors  Size Id Type\n/dev/sdk1  *        2048 60371951 60369904 28.8G  7 HPFS/NTFS/exFAT\n/dev/sdk2       60371952 60437487    65536   32M ef EFI (FAT-12/16/32)\n\n\ndumbledore in /media  NO PYTHON VENV SET \n❯ sudo mount -t ntfs /dev/sdk1 /media/ventoy-usb -o uid=1000                       \nNTFS signature is missing.\nFailed to mount '/dev/sdk1': Invalid argument\nThe device '/dev/sdk1' doesn't seem to have a valid NTFS.\nMaybe the wrong device is used? Or the whole disk instead of a\npartition (e.g. /dev/sda, not /dev/sda1)? Or the other way around?\n\ndumbledore in /media  NO PYTHON VENV SET \n✗ sudo mount -t exfat /dev/sdk1 /media/ventoy-usb -o uid=1000\n\n```\n",
      "date_published": "2022-07-31T07:38:43Z",
      "date_modified": "2022-07-31T07:38:43Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "linux",
        "homelab",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/xrdp-authentication-required-to-create-managed-color-device/",
      "url": "https://pype.dev/xrdp-authentication-required-to-create-managed-color-device/",
      "title": "Xrdp-Authentication-Required-To-Create-Managed-Color-Device",
      "content_html": "\u003cp\u003eI just need to RDP into an Ubuntu box via Remmina and everytime I login I have\nto authenticate to create a color managed device\u0026hellip; which I don\u0026rsquo;t even know\nwhat that is!\u003c/p\u003e\n\u003cp\u003eTo fix it?\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003evim /etc/polkit-1/localauthority.conf.d/02-allow-colord.conf\u003c/code\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003epolkit.addRule(function(action, subject) {\n if ((action.id == \u0026quot;org.freedesktop.color-manager.create-device\u0026quot; ||\n action.id == \u0026quot;org.freedesktop.color-manager.create-profile\u0026quot; ||\n action.id == \u0026quot;org.freedesktop.color-manager.delete-device\u0026quot; ||\n action.id == \u0026quot;org.freedesktop.color-manager.delete-profile\u0026quot; ||\n action.id == \u0026quot;org.freedesktop.color-manager.modify-device\u0026quot; ||\n action.id == \u0026quot;org.freedesktop.color-manager.modify-profile\u0026quot;) \u0026amp;\u0026amp;\n subject.isInGroup(\u0026quot;{users}\u0026quot;)) {\n return polkit.Result.YES;\n }\n });\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eGive\u0026rsquo;r the \u003ccode\u003e:x\u003c/code\u003e, logout, and you\u0026rsquo;re good to go\u003c/p\u003e\n",
      "content_text": "\nI just need to RDP into an Ubuntu box via Remmina and everytime I login I have\nto authenticate to create a color managed device... which I don't even know\nwhat that is!\n\n\nTo fix it?\n\n`vim /etc/polkit-1/localauthority.conf.d/02-allow-colord.conf`\n\n```\npolkit.addRule(function(action, subject) {\n if ((action.id == \"org.freedesktop.color-manager.create-device\" ||\n action.id == \"org.freedesktop.color-manager.create-profile\" ||\n action.id == \"org.freedesktop.color-manager.delete-device\" ||\n action.id == \"org.freedesktop.color-manager.delete-profile\" ||\n action.id == \"org.freedesktop.color-manager.modify-device\" ||\n action.id == \"org.freedesktop.color-manager.modify-profile\") \u0026\u0026\n subject.isInGroup(\"{users}\")) {\n return polkit.Result.YES;\n }\n });\n```\n\nGive'r the `:x`, logout, and you're good to go\n",
      "summary": "I just need to RDP into an Ubuntu box via Remmina and everytime I login I have to authenticate to create a color managed device... which I don't even know...",
      "date_published": "2022-07-18T00:00:00Z",
      "date_modified": "2022-07-18T00:00:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/zfs-permissions-for-sanoid/",
      "url": "https://pype.dev/zfs-permissions-for-sanoid/",
      "title": "ZFS Permissions for Sanoid/Syncoid",
      "content_html": "\u003cp\u003e\u003ccode\u003ezfs allow -u $USER clone,load-key,create,destroy,mount,mountpoint,receive,send,rollback,compression,snapshot,hold,keylocation,bookmark tank\u003c/code\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eload-key only needed if using encrypted datasets\u003c/p\u003e\n\u003c/blockquote\u003e\n",
      "content_text": "\n\n`zfs allow -u $USER clone,load-key,create,destroy,mount,mountpoint,receive,send,rollback,compression,snapshot,hold,keylocation,bookmark tank`\n\n\u003e load-key only needed if using encrypted datasets\n",
      "date_published": "2022-07-08T15:54:58Z",
      "date_modified": "2022-07-08T15:54:58Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "zfs",
        "homelab",
        "cli",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/kvm-network-interface-via-nat-ubuntu-20/",
      "url": "https://pype.dev/kvm-network-interface-via-nat-ubuntu-20/",
      "title": "kvm-network-interface-via-nat-ubuntu-20",
      "content_html": "\u003cp\u003eI have started using VMs more and more in my development workflow and it\u0026rsquo;s\nimpossible to work in a VM without an internet connection for me most of the\ntime. Setting up the KVM networking is kind of confusing to me and I\u0026rsquo;ve done it\ntwo different ways. Here is how I set it up on my home desktop using NAT.\u003c/p\u003e\n\u003ch1 id=\"credit\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCredit\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eFirst thing\u0026rsquo;s first: \u003ca href=\"https://computingforgeeks.com/managing-kvm-network-interfaces-in-linux/\"\u003ecredit to this post\u003c/a\u003e\u003c/p\u003e\n\u003ch1 id=\"commands\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCommands\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eThere was a \u003ccode\u003edefault\u003c/code\u003e network already made by virt-manager but my VM couldn\u0026rsquo;t connect over it at all\u0026hellip;\u003c/p\u003e\n\u003cp\u003eThese commands got me up and running without even turning the VM off\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI went full on \u003ccode\u003esudo -i\u003c/code\u003e for this just to make it easier - be careful\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"dump-an-existint-network-config\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDump an existint network config\u003c/span\u003e \u003ca href=\"#dump-an-existint-network-config\" 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=\"c1\"\u003e# as root\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\"\u003evirsh net-dumpxml default \u0026gt; br1.xml\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\"\u003evim br1.xml\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\u003ch2 id=\"edit-it\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEdit it\u003c/span\u003e \u003ca href=\"#edit-it\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI was unsure what the ip range should be so I just stuck with the original blog.\nThe \u003ccode\u003edefault\u003c/code\u003e network had the CIDR block defined as \u003ccode\u003e192.168.122.0/24\u003c/code\u003e which is different from my home network so I guess it\u0026rsquo;s fine?\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003e\u0026lt;network\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026lt;name\u0026gt;\u003c/span\u003ebr1\u003cspan class=\"nt\"\u003e\u0026lt;/name\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026lt;forward\u003c/span\u003e \u003cspan class=\"na\"\u003emode=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#39;nat\u0026#39;\u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;nat\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026lt;port\u003c/span\u003e \u003cspan class=\"na\"\u003estart=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#39;1024\u0026#39;\u003c/span\u003e \u003cspan class=\"na\"\u003eend=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#39;65535\u0026#39;\u003c/span\u003e\u003cspan class=\"nt\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;/nat\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026lt;/forward\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026lt;bridge\u003c/span\u003e \u003cspan class=\"na\"\u003ename=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#39;br1\u0026#39;\u003c/span\u003e \u003cspan class=\"na\"\u003estp=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#39;on\u0026#39;\u003c/span\u003e \u003cspan class=\"na\"\u003edelay=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#39;0\u0026#39;\u003c/span\u003e\u003cspan class=\"nt\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026lt;ip\u003c/span\u003e \u003cspan class=\"na\"\u003eaddress=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#39;192.168.10.1\u0026#39;\u003c/span\u003e \u003cspan class=\"na\"\u003enetmask=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#39;255.255.255.0\u0026#39;\u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;dhcp\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026lt;range\u003c/span\u003e \u003cspan class=\"na\"\u003estart=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#39;192.168.10.10\u0026#39;\u003c/span\u003e \u003cspan class=\"na\"\u003eend=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#39;192.168.10.100\u0026#39;\u003c/span\u003e\u003cspan class=\"nt\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;/dhcp\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026lt;/ip\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003e\u0026lt;/network\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"define-a-network\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDefine a network\u003c/span\u003e \u003ca href=\"#define-a-network\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003evirsh net-define br1.xml\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003evirsh net-autostart br1\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThen to check\u0026hellip;\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003evirsh net-list --all\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 Name      State    Autostart   Persistent\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 br1       active   yes         yes\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e default   active   yes         yes\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"uuid\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUUID\u003c/span\u003e \u003ca href=\"#uuid\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003evirsh net-uuid br1\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"magic\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMagic\u003c/span\u003e \u003ca href=\"#magic\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003evirsh attach-interface --domain \u0026lt;NAME OF VM\u0026gt; --type bridge --source br1 --model virtio --config --live\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eMy VM, \u003ccode\u003eubuntu20.04\u003c/code\u003e was running and immediately connected to the newly attached device!\u003c/p\u003e\n\u003ch1 id=\"credit-again\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCredit again\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eVisit the original post for more details - this serves more as as a quicker set of notes for future me\u003c/p\u003e\n",
      "content_text": "\nI have started using VMs more and more in my development workflow and it's\nimpossible to work in a VM without an internet connection for me most of the\ntime. Setting up the KVM networking is kind of confusing to me and I've done it\ntwo different ways. Here is how I set it up on my home desktop using NAT.\n\n# Credit\n\nFirst thing's first: [credit to this post](https://computingforgeeks.com/managing-kvm-network-interfaces-in-linux/)\n\n# Commands\n\nThere was a `default` network already made by virt-manager but my VM couldn't connect over it at all...\n\nThese commands got me up and running without even turning the VM off\n\n\u003e I went full on `sudo -i` for this just to make it easier - be careful\n\n## Dump an existint network config\n\n```bash\n# as root\n\nvirsh net-dumpxml default \u003e br1.xml\n\nvim br1.xml\n\n```\n\n## Edit it\n\nI was unsure what the ip range should be so I just stuck with the original blog. \nThe `default` network had the CIDR block defined as `192.168.122.0/24` which is different from my home network so I guess it's fine?\n\n```xml\n\u003cnetwork\u003e\n  \u003cname\u003ebr1\u003c/name\u003e\n  \u003cforward mode='nat'\u003e\n    \u003cnat\u003e\n      \u003cport start='1024' end='65535'/\u003e\n    \u003c/nat\u003e\n  \u003c/forward\u003e\n  \u003cbridge name='br1' stp='on' delay='0'/\u003e\n  \u003cip address='192.168.10.1' netmask='255.255.255.0'\u003e\n    \u003cdhcp\u003e\n      \u003crange start='192.168.10.10' end='192.168.10.100'/\u003e\n    \u003c/dhcp\u003e\n  \u003c/ip\u003e\n\u003c/network\u003e\n```\n\n## Define a network\n\n```bash\nvirsh net-define br1.xml\nvirsh net-autostart br1\n```\n\nThen to check...\n\n```bash\nvirsh net-list --all\n\n Name      State    Autostart   Persistent\n--------------------------------------------\n br1       active   yes         yes\n default   active   yes         yes\n```\n\n## UUID\n\n`virsh net-uuid br1`\n\n\n## Magic\n\n`virsh attach-interface --domain \u003cNAME OF VM\u003e --type bridge --source br1 --model virtio --config --live`\n\nMy VM, `ubuntu20.04` was running and immediately connected to the newly attached device!\n\n\n# Credit again\n\nVisit the original post for more details - this serves more as as a quicker set of notes for future me\n\n",
      "summary": "I have started using VMs more and more in my development workflow and it's impossible to work in a VM without an internet connection for me most of the time....",
      "date_published": "2022-06-25T07:20:41Z",
      "date_modified": "2022-06-25T07:20:41Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "linux",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/cheat-on-your-man/",
      "url": "https://pype.dev/cheat-on-your-man/",
      "title": "cheat on your man",
      "content_html": "\u003cp\u003e\u003ccode\u003eman\u003c/code\u003e can be a pain to read\u0026hellip; and there\u0026rsquo;s lots of alternatives out there and one I\u0026rsquo;ve just started playing with is \u003ca href=\"https://github.com/cheat/cheat\"\u003echeat\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eman man\u003c/code\u003e will give you this plus a billion more lines of docs, which is useful when you need it\u0026hellip;\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eMAN\u003cspan class=\"o\"\u003e(\u003c/span\u003e1\u003cspan class=\"o\"\u003e)\u003c/span\u003e                                                                                                                       Manual pager utils                                                                                                                      MAN\u003cspan class=\"o\"\u003e(\u003c/span\u003e1\u003cspan class=\"o\"\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\"\u003eNAME\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e       man - an interface to the on-line reference manuals\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\"\u003eSYNOPSIS\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e       man  \u003cspan class=\"o\"\u003e[\u003c/span\u003e-C  file\u003cspan class=\"o\"\u003e]\u003c/span\u003e  \u003cspan class=\"o\"\u003e[\u003c/span\u003e-d\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e-D\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e--warnings\u003cspan class=\"o\"\u003e[=\u003c/span\u003ewarnings\u003cspan class=\"o\"\u003e]]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e-R encoding\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e-L locale\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e-m system\u003cspan class=\"o\"\u003e[\u003c/span\u003e,...\u003cspan class=\"o\"\u003e]]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e-M path\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e-S list\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e-e extension\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e-i\u003cspan class=\"p\"\u003e|\u003c/span\u003e-I\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e--regex\u003cspan class=\"p\"\u003e|\u003c/span\u003e--wildcard\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e--names-only\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e-a\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e-u\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e--no-subpages\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e-P pager\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e-r prompt\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e-7\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e-E encoding\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e--no-hyphenation\u003cspan class=\"o\"\u003e]\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--no-justification\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e-p string\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e-t\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e-T\u003cspan class=\"o\"\u003e[\u003c/span\u003edevice\u003cspan class=\"o\"\u003e]]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e-H\u003cspan class=\"o\"\u003e[\u003c/span\u003ebrowser\u003cspan class=\"o\"\u003e]]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e-X\u003cspan class=\"o\"\u003e[\u003c/span\u003edpi\u003cspan class=\"o\"\u003e]]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e-Z\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[[\u003c/span\u003esection\u003cspan class=\"o\"\u003e]\u003c/span\u003e page\u003cspan class=\"o\"\u003e[\u003c/span\u003e.section\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       man -k \u003cspan class=\"o\"\u003e[\u003c/span\u003eapropos options\u003cspan class=\"o\"\u003e]\u003c/span\u003e regexp ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e       man -K \u003cspan class=\"o\"\u003e[\u003c/span\u003e-w\u003cspan class=\"p\"\u003e|\u003c/span\u003e-W\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e-S list\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e-i\u003cspan class=\"p\"\u003e|\u003c/span\u003e-I\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e--regex\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003esection\u003cspan class=\"o\"\u003e]\u003c/span\u003e term ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e       man -f \u003cspan class=\"o\"\u003e[\u003c/span\u003ewhatis options\u003cspan class=\"o\"\u003e]\u003c/span\u003e page ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e       man -l \u003cspan class=\"o\"\u003e[\u003c/span\u003e-C file\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e-d\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e-D\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e--warnings\u003cspan class=\"o\"\u003e[=\u003c/span\u003ewarnings\u003cspan class=\"o\"\u003e]]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e-R encoding\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e-L locale\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e-P pager\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e-r prompt\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e-7\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e-E encoding\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e-p string\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e-t\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e-T\u003cspan class=\"o\"\u003e[\u003c/span\u003edevice\u003cspan class=\"o\"\u003e]]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e-H\u003cspan class=\"o\"\u003e[\u003c/span\u003ebrowser\u003cspan class=\"o\"\u003e]]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e-X\u003cspan class=\"o\"\u003e[\u003c/span\u003edpi\u003cspan class=\"o\"\u003e]]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e-Z\u003cspan class=\"o\"\u003e]\u003c/span\u003e file ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e       man -w\u003cspan class=\"p\"\u003e|\u003c/span\u003e-W \u003cspan class=\"o\"\u003e[\u003c/span\u003e-C file\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e-d\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e-D\u003cspan class=\"o\"\u003e]\u003c/span\u003e page ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e       man -c \u003cspan class=\"o\"\u003e[\u003c/span\u003e-C file\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e-d\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e-D\u003cspan class=\"o\"\u003e]\u003c/span\u003e page ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e       man \u003cspan class=\"o\"\u003e[\u003c/span\u003e-?V\u003cspan class=\"o\"\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\"\u003eDESCRIPTION\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e       man is the system\u003cspan class=\"err\"\u003e\u0026#39;\u003c/span\u003es manual pager.  Each page argument given to man is normally the name of a program, utility or \u003cspan class=\"k\"\u003efunction\u003c/span\u003e.  The manual page associated with each of these arguments is \u003cspan class=\"k\"\u003ethen\u003c/span\u003e found and displayed.  A section, \u003cspan class=\"k\"\u003eif\u003c/span\u003e provided, will direct  man  to  look\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e       only  in  that  section of the manual.  The default action is to search in all of the available sections following a pre-defined order \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;1 n l 8 3 2 3posix 3pm 3perl 3am 5 4 9 6 7\u0026#34;\u003c/span\u003e by default, unless overridden by the SECTION directive in /etc/manpath.config\u003cspan class=\"o\"\u003e)\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e       and to show only the first page found, even \u003cspan class=\"k\"\u003eif\u003c/span\u003e page exists in several sections.\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       The table below shows the section numbers of the manual followed by the types of pages they contain.\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=\"m\"\u003e1\u003c/span\u003e   Executable programs or shell commands\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e       \u003cspan class=\"m\"\u003e2\u003c/span\u003e   System calls \u003cspan class=\"o\"\u003e(\u003c/span\u003efunctions provided by the kernel\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e       \u003cspan class=\"m\"\u003e3\u003c/span\u003e   Library calls \u003cspan class=\"o\"\u003e(\u003c/span\u003efunctions within program libraries\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e       \u003cspan class=\"m\"\u003e4\u003c/span\u003e   Special files \u003cspan class=\"o\"\u003e(\u003c/span\u003eusually found in /dev\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e       \u003cspan class=\"m\"\u003e5\u003c/span\u003e   File formats and conventions eg /etc/passwd\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e       \u003cspan class=\"m\"\u003e6\u003c/span\u003e   Games\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e       \u003cspan class=\"m\"\u003e7\u003c/span\u003e   Miscellaneous \u003cspan class=\"o\"\u003e(\u003c/span\u003eincluding macro packages and conventions\u003cspan class=\"o\"\u003e)\u003c/span\u003e, e.g. man\u003cspan class=\"o\"\u003e(\u003c/span\u003e7\u003cspan class=\"o\"\u003e)\u003c/span\u003e, groff\u003cspan class=\"o\"\u003e(\u003c/span\u003e7\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e       \u003cspan class=\"m\"\u003e8\u003c/span\u003e   System administration commands \u003cspan class=\"o\"\u003e(\u003c/span\u003eusually only \u003cspan class=\"k\"\u003efor\u003c/span\u003e root\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e       \u003cspan class=\"m\"\u003e9\u003c/span\u003e   Kernel routines \u003cspan class=\"o\"\u003e[\u003c/span\u003eNon standard\u003cspan class=\"o\"\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       A manual page consists of several sections.\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       Conventional section names include NAME, SYNOPSIS, CONFIGURATION, DESCRIPTION, OPTIONS, EXIT STATUS, RETURN VALUE, ERRORS, ENVIRONMENT, FILES, VERSIONS, CONFORMING TO, NOTES, BUGS, EXAMPLE, AUTHORS, and SEE ALSO.\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       The following conventions apply to the SYNOPSIS section and can be used as a guide in other sections.\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       bold text          \u003cspan class=\"nb\"\u003etype\u003c/span\u003e exactly as shown.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e       italic text        replace with appropriate argument.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e       \u003cspan class=\"o\"\u003e[\u003c/span\u003e-abc\u003cspan class=\"o\"\u003e]\u003c/span\u003e             any or all arguments within \u003cspan class=\"o\"\u003e[\u003c/span\u003e \u003cspan class=\"o\"\u003e]\u003c/span\u003e are optional.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e       -a\u003cspan class=\"p\"\u003e|\u003c/span\u003e-b              options delimited by \u003cspan class=\"p\"\u003e|\u003c/span\u003e cannot be used together.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e       argument ...       argument is repeatable.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e       \u003cspan class=\"o\"\u003e[\u003c/span\u003eexpression\u003cspan class=\"o\"\u003e]\u003c/span\u003e ...   entire expression within \u003cspan class=\"o\"\u003e[\u003c/span\u003e \u003cspan class=\"o\"\u003e]\u003c/span\u003e is repeatable.\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       Exact rendering may vary depending on the output device.  For instance, man will usually not be able to render italics when running in a terminal, and will typically use underlined or coloured text instead.\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       The \u003cspan class=\"nb\"\u003ecommand\u003c/span\u003e or \u003cspan class=\"k\"\u003efunction\u003c/span\u003e illustration is a pattern that should match all possible invocations.  In some cases it is advisable to illustrate several exclusive invocations as is shown in the SYNOPSIS section of this manual page.\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\"\u003eEXAMPLES\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e       man ls\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e           Display the manual page \u003cspan class=\"k\"\u003efor\u003c/span\u003e the item \u003cspan class=\"o\"\u003e(\u003c/span\u003eprogram\u003cspan class=\"o\"\u003e)\u003c/span\u003e ls.\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       man man.7\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e           Display the manual page \u003cspan class=\"k\"\u003efor\u003c/span\u003e macro package man from section 7.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"but-what-if-you-don-t\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBut what if you don’t?\u003c/span\u003e \u003ca href=\"#but-what-if-you-don-t\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003echeat man\u003c/code\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# To convert a man page to pdf:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eman -t bash \u003cspan class=\"p\"\u003e|\u003c/span\u003e ps2pdf - bash.pdf\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=\"c1\"\u003e# To view the ascii chart:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eman \u003cspan class=\"m\"\u003e7\u003c/span\u003e ascii\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eYou get tiny examples to remind you of what you \u003cstrong\u003eprobably\u003c/strong\u003e are trying to do!\u003c/p\u003e\n",
      "content_text": "\n\n`man` can be a pain to read... and there's lots of alternatives out there and one I've just started playing with is [cheat](https://github.com/cheat/cheat)\n\n\n`man man` will give you this plus a billion more lines of docs, which is useful when you need it...\n\n```bash\nMAN(1)                                                                                                                       Manual pager utils                                                                                                                      MAN(1)\n\nNAME\n       man - an interface to the on-line reference manuals\n\nSYNOPSIS\n       man  [-C  file]  [-d] [-D] [--warnings[=warnings]] [-R encoding] [-L locale] [-m system[,...]] [-M path] [-S list] [-e extension] [-i|-I] [--regex|--wildcard] [--names-only] [-a] [-u] [--no-subpages] [-P pager] [-r prompt] [-7] [-E encoding] [--no-hyphenation]\n       [--no-justification] [-p string] [-t] [-T[device]] [-H[browser]] [-X[dpi]] [-Z] [[section] page[.section] ...] ...\n       man -k [apropos options] regexp ...\n       man -K [-w|-W] [-S list] [-i|-I] [--regex] [section] term ...\n       man -f [whatis options] page ...\n       man -l [-C file] [-d] [-D] [--warnings[=warnings]] [-R encoding] [-L locale] [-P pager] [-r prompt] [-7] [-E encoding] [-p string] [-t] [-T[device]] [-H[browser]] [-X[dpi]] [-Z] file ...\n       man -w|-W [-C file] [-d] [-D] page ...\n       man -c [-C file] [-d] [-D] page ...\n       man [-?V]\n\nDESCRIPTION\n       man is the system's manual pager.  Each page argument given to man is normally the name of a program, utility or function.  The manual page associated with each of these arguments is then found and displayed.  A section, if provided, will direct  man  to  look\n       only  in  that  section of the manual.  The default action is to search in all of the available sections following a pre-defined order (\"1 n l 8 3 2 3posix 3pm 3perl 3am 5 4 9 6 7\" by default, unless overridden by the SECTION directive in /etc/manpath.config),\n       and to show only the first page found, even if page exists in several sections.\n\n       The table below shows the section numbers of the manual followed by the types of pages they contain.\n\n       1   Executable programs or shell commands\n       2   System calls (functions provided by the kernel)\n       3   Library calls (functions within program libraries)\n       4   Special files (usually found in /dev)\n       5   File formats and conventions eg /etc/passwd\n       6   Games\n       7   Miscellaneous (including macro packages and conventions), e.g. man(7), groff(7)\n       8   System administration commands (usually only for root)\n       9   Kernel routines [Non standard]\n\n       A manual page consists of several sections.\n\n       Conventional section names include NAME, SYNOPSIS, CONFIGURATION, DESCRIPTION, OPTIONS, EXIT STATUS, RETURN VALUE, ERRORS, ENVIRONMENT, FILES, VERSIONS, CONFORMING TO, NOTES, BUGS, EXAMPLE, AUTHORS, and SEE ALSO.\n\n       The following conventions apply to the SYNOPSIS section and can be used as a guide in other sections.\n\n       bold text          type exactly as shown.\n       italic text        replace with appropriate argument.\n       [-abc]             any or all arguments within [ ] are optional.\n       -a|-b              options delimited by | cannot be used together.\n       argument ...       argument is repeatable.\n       [expression] ...   entire expression within [ ] is repeatable.\n\n       Exact rendering may vary depending on the output device.  For instance, man will usually not be able to render italics when running in a terminal, and will typically use underlined or coloured text instead.\n\n       The command or function illustration is a pattern that should match all possible invocations.  In some cases it is advisable to illustrate several exclusive invocations as is shown in the SYNOPSIS section of this manual page.\n\nEXAMPLES\n       man ls\n           Display the manual page for the item (program) ls.\n\n       man man.7\n           Display the manual page for macro package man from section 7.\n```\n\n\n## But what if you don't?\n\n`cheat man`\n\n```bash\n# To convert a man page to pdf:\nman -t bash | ps2pdf - bash.pdf\n\n# To view the ascii chart:\nman 7 ascii\n```\n\nYou get tiny examples to remind you of what you **probably** are trying to do!\n",
      "summary": "can be a pain to read... and there's lots of alternatives out there and one I've just started playing with is cheat",
      "date_published": "2022-06-23T09:35:31Z",
      "date_modified": "2022-06-23T09:35:31Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "linux",
        "cli",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/reset-ssh-key-passphrase/",
      "url": "https://pype.dev/reset-ssh-key-passphrase/",
      "title": "Reset SSH key passphrase",
      "content_html": "\u003cp\u003eI got into a pickle where I encrypted the ssh keys I use for my SSH connections on LAN, but then I couldn\u0026rsquo;t run my ansible playbook on my server! ssh-keygen -p and leave the new passphrase blank saved my day (although password protected key files are safer!)\u003c/p\u003e\n\u003ch1 id=\"tl-dr-just-reset-it-to-nothing\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTL;DR - just reset it to nothing\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003e\u003ccode\u003essh-keygen -p\u003c/code\u003e will let you reset the passphrase on your ssh keys (good for you! yay security!)\u003c/p\u003e\n\u003cp\u003eBut I needed to remove the passphrase to quickly deploy an ansible playbook 🤓\u003c/p\u003e\n",
      "content_text": "\nI got into a pickle where I encrypted the ssh keys I use for my SSH connections on LAN, but then I couldn't run my ansible playbook on my server! ssh-keygen -p and leave the new passphrase blank saved my day (although password protected key files are safer!)\n\n# TL;DR - just reset it to nothing\n\n`ssh-keygen -p` will let you reset the passphrase on your ssh keys (good for you! yay security!)\n\nBut I needed to remove the passphrase to quickly deploy an ansible playbook 🤓\n",
      "summary": "I got into a pickle where I encrypted the ssh keys I use for my SSH connections on LAN, but then I couldn't run my ansible playbook on my server! ssh-keygen...",
      "date_published": "2022-06-13T06:55:32Z",
      "date_modified": "2022-06-13T06:55:32Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "cli",
        "linux",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/add-colored-indicators-to-your-dataframes-html-representation/",
      "url": "https://pype.dev/add-colored-indicators-to-your-dataframes-html-representation/",
      "title": "Add colored indicators to your dataframes html representation",
      "content_html": "\u003cp\u003e\u003ca href=\"https://twitter.com/driscollis\"\u003eMike Driscoll\u003c/a\u003e recently tweeted about making\ncolored out with pandas DataFrames and I just had to try it for myself\u003c/p\u003e\n\u003ch1 id=\"use-case\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUse Case\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eFirst though\u0026hellip; why?\nMy biggest use case is a monitoring pipeline of mine\u0026hellip; The details aside, the\noutput of my pipeline is a dataframe where each row has information about a\nfailed pipeline that I need to go look into. I dump that result to a simle html\nfile that\u0026rsquo;s hosted on an internal site and the file is updated every couple of\nhours. Adding some colored indicators automatically to the rows to help me\nassess severity of each record would be a handy way to quickly get an\nunderstanding the state of our pipelines.\u003c/p\u003e\n\u003ch1 id=\"how\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHow?\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eThe docs for the \u003ccode\u003eapplymap\u003c/code\u003e method state simply:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eApply a CSS-styling function elementwise.\n\nUpdates the HTML representation with the result.\n\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eSo we can write a function that returns \u003ccode\u003ecolor: {color}\u003c/code\u003e based on the dataframe\nvalues and when we drop that dataframe to html we\u0026rsquo;ll have some simple css\nstyling applied automagically!\u003c/p\u003e\n\u003cp\u003eBy default the function will be applied to all columns of the dataframe, but\nthat\u0026rsquo;s not useful if the columns are different types which is usually the case.\nLuckily there is a \u003ccode\u003esubset\u003c/code\u003e keyword to only apply to the columns you need!\u003c/p\u003e\n\u003cp\u003eConsider my example\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e \u003cspan class=\"err\"\u003e\u003c/span\u003e  \u003cspan class=\"n\"\u003emain\u003c/span\u003e \u003cspan class=\"n\"\u003evia\u003c/span\u003e \u003cspan class=\"mf\"\u003e3.8.11\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eipython\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e❯\u003c/span\u003e \u003cspan class=\"n\"\u003edf\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003epd\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eread_csv\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;cars.csv\u0026#34;\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e \u003cspan class=\"err\"\u003e\u003c/span\u003e  \u003cspan class=\"n\"\u003emain\u003c/span\u003e \u003cspan class=\"n\"\u003evia\u003c/span\u003e \u003cspan class=\"mf\"\u003e3.8.11\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eipython\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e❯\u003c/span\u003e \u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003empg_color\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eval\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003efloat\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=\"o\"\u003e...\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e     \u003cspan class=\"n\"\u003ecolor\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;red\u0026#34;\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003eval\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"mi\"\u003e21\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;green\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\u003cspan class=\"p\"\u003e:\u003c/span\u003e     \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;color: \u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e\u003cspan class=\"si\"\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e \u003cspan class=\"err\"\u003e\u003c/span\u003e  \u003cspan class=\"n\"\u003emain\u003c/span\u003e \u003cspan class=\"n\"\u003evia\u003c/span\u003e \u003cspan class=\"mf\"\u003e3.8.11\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eipython\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e❯\u003c/span\u003e \u003cspan class=\"n\"\u003edf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estyle\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eapplymap\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003empg_color\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003esubset\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;mpg\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eto_html\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;color.html\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eI want to quickly see if the \u003ccode\u003empg\u003c/code\u003e is any good for the cars in the cars dataset\nand I\u0026rsquo;ll define \u0026ldquo;good\u0026rdquo; as better than 21 mpg (not great I know but just for the\nsake of discussion\u0026hellip;)\u003c/p\u003e\n\u003cp\u003eThe function returns an appropriate css string and after I \u003ccode\u003estyle.applymap\u003c/code\u003e on just the \u003ccode\u003empg\u003c/code\u003e column we get this!\u003c/p\u003e\n\u003cstyle type=\"text/css\"\u003e\n#T_95e99_row0_col1, #T_95e99_row1_col1, #T_95e99_row2_col1, #T_95e99_row3_col1 {\n  color: green;\n}\n#T_95e99_row4_col1 {\n  color: red;\n}\n\u003c/style\u003e\n\u003ctable id=\"T_95e99\"\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\n      \u003cth class=\"blank level0\" \u003e\u0026nbsp;\u003c/th\u003e\n      \u003cth id=\"T_95e99_level0_col0\" class=\"col_heading level0 col0\" \u003eUnnamed: 0\u003c/th\u003e\n      \u003cth id=\"T_95e99_level0_col1\" class=\"col_heading level0 col1\" \u003empg\u003c/th\u003e\n      \u003cth id=\"T_95e99_level0_col2\" class=\"col_heading level0 col2\" \u003ecyl\u003c/th\u003e\n      \u003cth id=\"T_95e99_level0_col3\" class=\"col_heading level0 col3\" \u003edisp\u003c/th\u003e\n      \u003cth id=\"T_95e99_level0_col4\" class=\"col_heading level0 col4\" \u003ehp\u003c/th\u003e\n      \u003cth id=\"T_95e99_level0_col5\" class=\"col_heading level0 col5\" \u003edrat\u003c/th\u003e\n      \u003cth id=\"T_95e99_level0_col6\" class=\"col_heading level0 col6\" \u003ewt\u003c/th\u003e\n      \u003cth id=\"T_95e99_level0_col7\" class=\"col_heading level0 col7\" \u003eqsec\u003c/th\u003e\n      \u003cth id=\"T_95e99_level0_col8\" class=\"col_heading level0 col8\" \u003evs\u003c/th\u003e\n      \u003cth id=\"T_95e99_level0_col9\" class=\"col_heading level0 col9\" \u003eam\u003c/th\u003e\n      \u003cth id=\"T_95e99_level0_col10\" class=\"col_heading level0 col10\" \u003egear\u003c/th\u003e\n      \u003cth id=\"T_95e99_level0_col11\" class=\"col_heading level0 col11\" \u003ecarb\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth id=\"T_95e99_level0_row0\" class=\"row_heading level0 row0\" \u003e0\u003c/th\u003e\n      \u003ctd id=\"T_95e99_row0_col0\" class=\"data row0 col0\" \u003eMazda RX4\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row0_col1\" class=\"data row0 col1\" \u003e21.000000\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row0_col2\" class=\"data row0 col2\" \u003e6\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row0_col3\" class=\"data row0 col3\" \u003e160.000000\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row0_col4\" class=\"data row0 col4\" \u003e110\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row0_col5\" class=\"data row0 col5\" \u003e3.900000\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row0_col6\" class=\"data row0 col6\" \u003e2.620000\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row0_col7\" class=\"data row0 col7\" \u003e16.460000\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row0_col8\" class=\"data row0 col8\" \u003e0\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row0_col9\" class=\"data row0 col9\" \u003e1\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row0_col10\" class=\"data row0 col10\" \u003e4\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row0_col11\" class=\"data row0 col11\" \u003e4\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth id=\"T_95e99_level0_row1\" class=\"row_heading level0 row1\" \u003e1\u003c/th\u003e\n      \u003ctd id=\"T_95e99_row1_col0\" class=\"data row1 col0\" \u003eMazda RX4 Wag\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row1_col1\" class=\"data row1 col1\" \u003e21.000000\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row1_col2\" class=\"data row1 col2\" \u003e6\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row1_col3\" class=\"data row1 col3\" \u003e160.000000\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row1_col4\" class=\"data row1 col4\" \u003e110\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row1_col5\" class=\"data row1 col5\" \u003e3.900000\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row1_col6\" class=\"data row1 col6\" \u003e2.875000\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row1_col7\" class=\"data row1 col7\" \u003e17.020000\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row1_col8\" class=\"data row1 col8\" \u003e0\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row1_col9\" class=\"data row1 col9\" \u003e1\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row1_col10\" class=\"data row1 col10\" \u003e4\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row1_col11\" class=\"data row1 col11\" \u003e4\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth id=\"T_95e99_level0_row2\" class=\"row_heading level0 row2\" \u003e2\u003c/th\u003e\n      \u003ctd id=\"T_95e99_row2_col0\" class=\"data row2 col0\" \u003eDatsun 710\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row2_col1\" class=\"data row2 col1\" \u003e22.800000\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row2_col2\" class=\"data row2 col2\" \u003e4\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row2_col3\" class=\"data row2 col3\" \u003e108.000000\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row2_col4\" class=\"data row2 col4\" \u003e93\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row2_col5\" class=\"data row2 col5\" \u003e3.850000\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row2_col6\" class=\"data row2 col6\" \u003e2.320000\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row2_col7\" class=\"data row2 col7\" \u003e18.610000\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row2_col8\" class=\"data row2 col8\" \u003e1\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row2_col9\" class=\"data row2 col9\" \u003e1\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row2_col10\" class=\"data row2 col10\" \u003e4\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row2_col11\" class=\"data row2 col11\" \u003e1\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth id=\"T_95e99_level0_row3\" class=\"row_heading level0 row3\" \u003e3\u003c/th\u003e\n      \u003ctd id=\"T_95e99_row3_col0\" class=\"data row3 col0\" \u003eHornet 4 Drive\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row3_col1\" class=\"data row3 col1\" \u003e21.400000\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row3_col2\" class=\"data row3 col2\" \u003e6\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row3_col3\" class=\"data row3 col3\" \u003e258.000000\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row3_col4\" class=\"data row3 col4\" \u003e110\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row3_col5\" class=\"data row3 col5\" \u003e3.080000\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row3_col6\" class=\"data row3 col6\" \u003e3.215000\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row3_col7\" class=\"data row3 col7\" \u003e19.440000\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row3_col8\" class=\"data row3 col8\" \u003e1\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row3_col9\" class=\"data row3 col9\" \u003e0\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row3_col10\" class=\"data row3 col10\" \u003e3\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row3_col11\" class=\"data row3 col11\" \u003e1\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth id=\"T_95e99_level0_row4\" class=\"row_heading level0 row4\" \u003e4\u003c/th\u003e\n      \u003ctd id=\"T_95e99_row4_col0\" class=\"data row4 col0\" \u003eHornet Sportabout\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row4_col1\" class=\"data row4 col1\" \u003e18.700000\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row4_col2\" class=\"data row4 col2\" \u003e8\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row4_col3\" class=\"data row4 col3\" \u003e360.000000\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row4_col4\" class=\"data row4 col4\" \u003e175\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row4_col5\" class=\"data row4 col5\" \u003e3.150000\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row4_col6\" class=\"data row4 col6\" \u003e3.440000\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row4_col7\" class=\"data row4 col7\" \u003e17.020000\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row4_col8\" class=\"data row4 col8\" \u003e0\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row4_col9\" class=\"data row4 col9\" \u003e0\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row4_col10\" class=\"data row4 col10\" \u003e3\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row4_col11\" class=\"data row4 col11\" \u003e2\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n",
      "content_text": "\n[Mike Driscoll](https://twitter.com/driscollis) recently tweeted about making\ncolored out with pandas DataFrames and I just had to try it for myself\n\n# Use Case\n\nFirst though... why?\nMy biggest use case is a monitoring pipeline of mine... The details aside, the\noutput of my pipeline is a dataframe where each row has information about a\nfailed pipeline that I need to go look into. I dump that result to a simle html\nfile that's hosted on an internal site and the file is updated every couple of\nhours. Adding some colored indicators automatically to the rows to help me\nassess severity of each record would be a handy way to quickly get an\nunderstanding the state of our pipelines.\n\n# How?\n\nThe docs for the `applymap` method state simply:\n\n```\nApply a CSS-styling function elementwise.\n\nUpdates the HTML representation with the result.\n\n```\n\nSo we can write a function that returns `color: {color}` based on the dataframe\nvalues and when we drop that dataframe to html we'll have some simple css\nstyling applied automagically!\n\nBy default the function will be applied to all columns of the dataframe, but\nthat's not useful if the columns are different types which is usually the case.\nLuckily there is a `subset` keyword to only apply to the columns you need!\n\nConsider my example\n\n```python \nsandbox   main via 3.8.11(sandbox) ipython\n❯ df = pd.read_csv(\"cars.csv\")\n\nsandbox   main via 3.8.11(sandbox) ipython\n❯ def mpg_color(val: float):\n...:     color = \"red\" if val \u003c 21 else \"green\"\n...:     return f\"color: {color}\"\n\nsandbox   main via 3.8.11(sandbox) ipython\n❯ df.style.applymap(mpg_color, subset=\"mpg\").to_html(\"color.html\")\n```\n\nI want to quickly see if the `mpg` is any good for the cars in the cars dataset\nand I'll define \"good\" as better than 21 mpg (not great I know but just for the\nsake of discussion...)\n\nThe function returns an appropriate css string and after I `style.applymap` on just the `mpg` column we get this!\n\n\n\u003cstyle type=\"text/css\"\u003e\n#T_95e99_row0_col1, #T_95e99_row1_col1, #T_95e99_row2_col1, #T_95e99_row3_col1 {\n  color: green;\n}\n#T_95e99_row4_col1 {\n  color: red;\n}\n\u003c/style\u003e\n\u003ctable id=\"T_95e99\"\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\n      \u003cth class=\"blank level0\" \u003e\u0026nbsp;\u003c/th\u003e\n      \u003cth id=\"T_95e99_level0_col0\" class=\"col_heading level0 col0\" \u003eUnnamed: 0\u003c/th\u003e\n      \u003cth id=\"T_95e99_level0_col1\" class=\"col_heading level0 col1\" \u003empg\u003c/th\u003e\n      \u003cth id=\"T_95e99_level0_col2\" class=\"col_heading level0 col2\" \u003ecyl\u003c/th\u003e\n      \u003cth id=\"T_95e99_level0_col3\" class=\"col_heading level0 col3\" \u003edisp\u003c/th\u003e\n      \u003cth id=\"T_95e99_level0_col4\" class=\"col_heading level0 col4\" \u003ehp\u003c/th\u003e\n      \u003cth id=\"T_95e99_level0_col5\" class=\"col_heading level0 col5\" \u003edrat\u003c/th\u003e\n      \u003cth id=\"T_95e99_level0_col6\" class=\"col_heading level0 col6\" \u003ewt\u003c/th\u003e\n      \u003cth id=\"T_95e99_level0_col7\" class=\"col_heading level0 col7\" \u003eqsec\u003c/th\u003e\n      \u003cth id=\"T_95e99_level0_col8\" class=\"col_heading level0 col8\" \u003evs\u003c/th\u003e\n      \u003cth id=\"T_95e99_level0_col9\" class=\"col_heading level0 col9\" \u003eam\u003c/th\u003e\n      \u003cth id=\"T_95e99_level0_col10\" class=\"col_heading level0 col10\" \u003egear\u003c/th\u003e\n      \u003cth id=\"T_95e99_level0_col11\" class=\"col_heading level0 col11\" \u003ecarb\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth id=\"T_95e99_level0_row0\" class=\"row_heading level0 row0\" \u003e0\u003c/th\u003e\n      \u003ctd id=\"T_95e99_row0_col0\" class=\"data row0 col0\" \u003eMazda RX4\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row0_col1\" class=\"data row0 col1\" \u003e21.000000\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row0_col2\" class=\"data row0 col2\" \u003e6\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row0_col3\" class=\"data row0 col3\" \u003e160.000000\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row0_col4\" class=\"data row0 col4\" \u003e110\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row0_col5\" class=\"data row0 col5\" \u003e3.900000\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row0_col6\" class=\"data row0 col6\" \u003e2.620000\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row0_col7\" class=\"data row0 col7\" \u003e16.460000\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row0_col8\" class=\"data row0 col8\" \u003e0\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row0_col9\" class=\"data row0 col9\" \u003e1\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row0_col10\" class=\"data row0 col10\" \u003e4\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row0_col11\" class=\"data row0 col11\" \u003e4\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth id=\"T_95e99_level0_row1\" class=\"row_heading level0 row1\" \u003e1\u003c/th\u003e\n      \u003ctd id=\"T_95e99_row1_col0\" class=\"data row1 col0\" \u003eMazda RX4 Wag\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row1_col1\" class=\"data row1 col1\" \u003e21.000000\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row1_col2\" class=\"data row1 col2\" \u003e6\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row1_col3\" class=\"data row1 col3\" \u003e160.000000\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row1_col4\" class=\"data row1 col4\" \u003e110\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row1_col5\" class=\"data row1 col5\" \u003e3.900000\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row1_col6\" class=\"data row1 col6\" \u003e2.875000\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row1_col7\" class=\"data row1 col7\" \u003e17.020000\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row1_col8\" class=\"data row1 col8\" \u003e0\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row1_col9\" class=\"data row1 col9\" \u003e1\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row1_col10\" class=\"data row1 col10\" \u003e4\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row1_col11\" class=\"data row1 col11\" \u003e4\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth id=\"T_95e99_level0_row2\" class=\"row_heading level0 row2\" \u003e2\u003c/th\u003e\n      \u003ctd id=\"T_95e99_row2_col0\" class=\"data row2 col0\" \u003eDatsun 710\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row2_col1\" class=\"data row2 col1\" \u003e22.800000\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row2_col2\" class=\"data row2 col2\" \u003e4\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row2_col3\" class=\"data row2 col3\" \u003e108.000000\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row2_col4\" class=\"data row2 col4\" \u003e93\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row2_col5\" class=\"data row2 col5\" \u003e3.850000\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row2_col6\" class=\"data row2 col6\" \u003e2.320000\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row2_col7\" class=\"data row2 col7\" \u003e18.610000\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row2_col8\" class=\"data row2 col8\" \u003e1\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row2_col9\" class=\"data row2 col9\" \u003e1\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row2_col10\" class=\"data row2 col10\" \u003e4\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row2_col11\" class=\"data row2 col11\" \u003e1\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth id=\"T_95e99_level0_row3\" class=\"row_heading level0 row3\" \u003e3\u003c/th\u003e\n      \u003ctd id=\"T_95e99_row3_col0\" class=\"data row3 col0\" \u003eHornet 4 Drive\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row3_col1\" class=\"data row3 col1\" \u003e21.400000\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row3_col2\" class=\"data row3 col2\" \u003e6\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row3_col3\" class=\"data row3 col3\" \u003e258.000000\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row3_col4\" class=\"data row3 col4\" \u003e110\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row3_col5\" class=\"data row3 col5\" \u003e3.080000\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row3_col6\" class=\"data row3 col6\" \u003e3.215000\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row3_col7\" class=\"data row3 col7\" \u003e19.440000\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row3_col8\" class=\"data row3 col8\" \u003e1\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row3_col9\" class=\"data row3 col9\" \u003e0\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row3_col10\" class=\"data row3 col10\" \u003e3\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row3_col11\" class=\"data row3 col11\" \u003e1\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth id=\"T_95e99_level0_row4\" class=\"row_heading level0 row4\" \u003e4\u003c/th\u003e\n      \u003ctd id=\"T_95e99_row4_col0\" class=\"data row4 col0\" \u003eHornet Sportabout\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row4_col1\" class=\"data row4 col1\" \u003e18.700000\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row4_col2\" class=\"data row4 col2\" \u003e8\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row4_col3\" class=\"data row4 col3\" \u003e360.000000\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row4_col4\" class=\"data row4 col4\" \u003e175\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row4_col5\" class=\"data row4 col5\" \u003e3.150000\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row4_col6\" class=\"data row4 col6\" \u003e3.440000\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row4_col7\" class=\"data row4 col7\" \u003e17.020000\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row4_col8\" class=\"data row4 col8\" \u003e0\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row4_col9\" class=\"data row4 col9\" \u003e0\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row4_col10\" class=\"data row4 col10\" \u003e3\u003c/td\u003e\n      \u003ctd id=\"T_95e99_row4_col11\" class=\"data row4 col11\" \u003e2\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n\n",
      "summary": "Mike Driscoll recently tweeted about making colored out with pandas DataFrames and I just had to try it for myself",
      "date_published": "2022-06-04T06:12:33Z",
      "date_modified": "2022-06-04T06:12:33Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "python",
        "data",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/filtering-emails-with-core-utils/",
      "url": "https://pype.dev/filtering-emails-with-core-utils/",
      "title": "Filtering emails with core utils",
      "content_html": "\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eemail1@me.com\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esomebody_else@gmail.com\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\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#! /bin/bash\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# pick multiple emails from list and combine into comma seperated array\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eemails\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"sb\"\u003e`\u003c/span\u003ecat .../emails \u003cspan class=\"p\"\u003e|\u003c/span\u003e fzf -m \u003cspan class=\"p\"\u003e|\u003c/span\u003e sed \u003cspan class=\"s1\"\u003e\u0026#39;s/^\\|$/\u0026#34;/g\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e|\u003c/span\u003epaste -sd,\u003cspan class=\"sb\"\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=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"nv\"\u003e$emails\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\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\n```text\nemail1@me.com\nsomebody_else@gmail.com\n\n```\n\n```bash\n#! /bin/bash\n# pick multiple emails from list and combine into comma seperated array\nemails=`cat .../emails | fzf -m | sed 's/^\\|$/\"/g'|paste -sd,` \n\necho $emails\n\n```\n",
      "date_published": "2022-05-30T06:09:27Z",
      "date_modified": "2022-05-30T06:09:27Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "linux",
        "cli",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/reindex-nextcloud-after-adding-data-via-cli/",
      "url": "https://pype.dev/reindex-nextcloud-after-adding-data-via-cli/",
      "title": "Reindex Nextcloud After Adding Data via CLI",
      "content_html": "\u003ch1 id=\"my-nextcloud-woes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMy Nextcloud woes\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eI wrote \u003ca href=\"%22nextcloud-permissions-with-zfs-and-ansible-nas%22\"\u003ehere\u003c/a\u003e about setting\nup \u003ccode\u003ewww-data\u003c/code\u003e as the owner of any directories you want nextcloud to manage.\nHowever, I regularly struggle wtih permissions issues on my NAS because of the\nexternal storage app anyways so I\u0026rsquo;ve decided to just put our photos in the spot\nNextcloud would otherwise put them, and use this as healthy pressure on our\nfamily to organize our photos and put the ones we care about with the rest of\nour family media.\u003c/p\u003e\n\u003ch1 id=\"migration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMigration\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eBecause I had a ton of photos on the NAS anyways that I wanted moved over to\nNextcloud I just rsync\u0026rsquo;d the photos directory on my NAS to the user\u0026rsquo;s photos\ndirectory in nextcloud but they weren\u0026rsquo;t showing up in the web UI!\u003c/p\u003e\n\u003ch1 id=\"the-fix\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThe Fix?\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eAs www-data I needed to \u003ccode\u003ephp /var/www/nextcloud/occ files:scan --all\u003c/code\u003e inside my\nnextcloud docker container AFTER moving a bunch of photos off my \u0026ldquo;NAS\u0026rdquo; into the\nfolder mounted to the nextcloud container as its data folder! Before I did this\nthey weren\u0026rsquo;t showing up in the web UI/\u003c/p\u003e\n",
      "content_text": "\n# My Nextcloud woes\n\nI wrote [here](\"nextcloud-permissions-with-zfs-and-ansible-nas\") about setting\nup `www-data` as the owner of any directories you want nextcloud to manage.\nHowever, I regularly struggle wtih permissions issues on my NAS because of the\nexternal storage app anyways so I've decided to just put our photos in the spot\nNextcloud would otherwise put them, and use this as healthy pressure on our\nfamily to organize our photos and put the ones we care about with the rest of\nour family media.\n\n# Migration\n\nBecause I had a ton of photos on the NAS anyways that I wanted moved over to\nNextcloud I just rsync'd the photos directory on my NAS to the user's photos\ndirectory in nextcloud but they weren't showing up in the web UI!\n\n# The Fix?\n\nAs www-data I needed to `php /var/www/nextcloud/occ files:scan --all` inside my\nnextcloud docker container AFTER moving a bunch of photos off my \"NAS\" into the\nfolder mounted to the nextcloud container as its data folder! Before I did this\nthey weren't showing up in the web UI/\n",
      "summary": "I wrote here about setting up as the owner of any directories you want nextcloud to manage. However, I regularly struggle wtih permissions issues on my NAS...",
      "date_published": "2022-05-29T15:34:33Z",
      "date_modified": "2022-05-29T15:34:33Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "linux",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/arr-download-client-config/",
      "url": "https://pype.dev/arr-download-client-config/",
      "title": "arr client config",
      "content_html": "\u003cp\u003eTIL that when setting up download clients for\nradarr/sonarr/lidarr/readarr/bazarr/prowlarr that you can utilize internal DNS\nand instead of hardcoding an IP address of your download client server, can use\njust the CNAME record (ie. instead of 172.10.14.13 I can use\ntransmission.mydomain.com\u0026hellip; notice the lact of http(s)://\u0026hellip; adding that won\u0026rsquo;t\nallow the connection to work/\u003c/p\u003e\n\u003cp\u003eFurthermore, you can use internal DNS to lookup the domain, not the subdomain,\nand expose the port, like \u003ccode\u003emydomain.com:7878\u003c/code\u003e for sonarr. This was simpler to\nmaintain because I don\u0026rsquo;t change which ports an application exposes or utilizes\nhardly ever, plus I don\u0026rsquo;t need to maintain CNAME records for every service!\u003c/p\u003e\n",
      "content_text": "\nTIL that when setting up download clients for\nradarr/sonarr/lidarr/readarr/bazarr/prowlarr that you can utilize internal DNS\nand instead of hardcoding an IP address of your download client server, can use\njust the CNAME record (ie. instead of 172.10.14.13 I can use\ntransmission.mydomain.com... notice the lact of http(s)://... adding that won't\nallow the connection to work/\n\nFurthermore, you can use internal DNS to lookup the domain, not the subdomain,\nand expose the port, like `mydomain.com:7878` for sonarr. This was simpler to\nmaintain because I don't change which ports an application exposes or utilizes\nhardly ever, plus I don't need to maintain CNAME records for every service!\n",
      "summary": "TIL that when setting up download clients for radarr/sonarr/lidarr/readarr/bazarr/prowlarr that you can utilize internal DNS and instead of hardcoding an IP...",
      "date_published": "2022-05-28T13:29:28Z",
      "date_modified": "2022-05-28T13:29:28Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/add-space-to-your-lvm-on-ubuntu/",
      "url": "https://pype.dev/add-space-to-your-lvm-on-ubuntu/",
      "title": "Add space to your LVM on Ubuntu",
      "content_html": "\u003cp\u003eI ran out of space on the SSD in my server when doing some file transfers but only 100GB was used of a 256 GB SSD?\u003c/p\u003e\n\u003ch1 id=\"lvm\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLVM\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eWhen installing Ubuntu live server the default option for how to partition the\ndisk (in my experience) has been to setup an LVM group that defaults to less\nthan the available space. Most recently I put Ubuntu server on a 256 GB SSD but\nthe main partition was formatted as an LVM group with 100GB of storage\u0026hellip; I\ndidn\u0026rsquo;t think anything of this even though I\u0026rsquo;m mostly used to EXT4.\u003c/p\u003e\n\u003cp\u003eI think the reason for LVMs is performance, but in hindsight, I don\u0026rsquo;t really\ncare much about the performance differences, I really just want all my storage\nthat\u0026rsquo;s fast enough\u003c/p\u003e\n\u003ch1 id=\"extending-the-lvm\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExtending the LVM\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eA moment of googling brought me to Ubuntu\u0026rsquo;s wiki and I\nlearned that I can expand my LVM to the space I need\u0026hellip;\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003esudo lvdisplay\u003c/code\u003e and \u003ccode\u003esudo pvdisplay\u003c/code\u003e show detailed views of the logical volumes and physical volumes respectively.\u003c/p\u003e\n\u003cp\u003eTake a look at those and find the volume you need to extend. For me I found this:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --- Logical volume ---\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  LV Path                /dev/ubuntu-vg/ubuntu-lv\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  LV Name                ubuntu-lv\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  VG Name                ubuntu-vg\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  LV Write Access        read/write\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  LV Status              available\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\u003eThere\u0026rsquo;s more that you\u0026rsquo;ll see but this is what\u0026rsquo;s relevant - I need to extend the\n\u003ccode\u003eubuntu-lv\u003c/code\u003e logical volume in the \u003ccode\u003eubuntu-vg\u003c/code\u003e volume group.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003esudo lvextend -L +50g ubuntu-vg/ubuntu-lv\u003c/code\u003e gives me 50 more GB of storage which should be enough for at least tonight 🤓\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://wiki.ubuntu.com/Lvm\"\u003eRTFM\u003c/a\u003e\u003c/p\u003e\n",
      "content_text": "\nI ran out of space on the SSD in my server when doing some file transfers but only 100GB was used of a 256 GB SSD?\n\n# LVM\n\nWhen installing Ubuntu live server the default option for how to partition the\ndisk (in my experience) has been to setup an LVM group that defaults to less\nthan the available space. Most recently I put Ubuntu server on a 256 GB SSD but\nthe main partition was formatted as an LVM group with 100GB of storage... I\ndidn't think anything of this even though I'm mostly used to EXT4.\n\nI think the reason for LVMs is performance, but in hindsight, I don't really\ncare much about the performance differences, I really just want all my storage\nthat's fast enough\n\n# Extending the LVM\n\nA moment of googling brought me to Ubuntu's wiki and I\nlearned that I can expand my LVM to the space I need...\n\n`sudo lvdisplay` and `sudo pvdisplay` show detailed views of the logical volumes and physical volumes respectively.\n\nTake a look at those and find the volume you need to extend. For me I found this:\n\n```bash\n  --- Logical volume ---\n  LV Path                /dev/ubuntu-vg/ubuntu-lv\n  LV Name                ubuntu-lv\n  VG Name                ubuntu-vg\n  LV Write Access        read/write\n  LV Status              available\n  ...\n```\n\nThere's more that you'll see but this is what's relevant - I need to extend the\n`ubuntu-lv` logical volume in the `ubuntu-vg` volume group.\n\n`sudo lvextend -L +50g ubuntu-vg/ubuntu-lv` gives me 50 more GB of storage which should be enough for at least tonight 🤓\n\n[RTFM](https://wiki.ubuntu.com/Lvm)\n",
      "summary": "I ran out of space on the SSD in my server when doing some file transfers but only 100GB was used of a 256 GB SSD?",
      "date_published": "2022-05-26T21:33:55Z",
      "date_modified": "2022-05-26T21:33:55Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "linux",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/local-dns-with-pi-hole/",
      "url": "https://pype.dev/local-dns-with-pi-hole/",
      "title": "Local DNS with Pi-hole",
      "content_html": "\u003ch2 id=\"spoilers\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSpoilers\u003c/span\u003e \u003ca href=\"#spoilers\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eTailscale is way easier than this\u0026hellip; I was doing this local DNS overwrite in\nPi-hole before running tailscale and I haven\u0026rsquo;t just totally \u0026ldquo;kicked the habit\u0026rdquo;\nyet, so for anyone NOT running tailcale, but wanting local HTTPS and using\nPi-Hole this method would work fine\u003c/p\u003e\n\u003ch2 id=\"intro\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eIntro\u003c/span\u003e \u003ca href=\"#intro\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI use \u003ca href=\"https://pi-hole.net/\"\u003epihole\u003c/a\u003e as my DNS server at home. I run unbound as\nwell and have a pretty standard setup from their docs.\u003c/p\u003e\n\u003cp\u003ePi-hole does 2 primary things for me:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003edns sink-hold, the primary use case I believe\u003c/li\u003e\n\u003cli\u003elocal SSL for all my self-hosted apps\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"caveat\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCaveat\u003c/span\u003e \u003ca href=\"#caveat\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI know for sure there are better ways to do this, but there\u0026rsquo;s also worse\nones\u0026hellip; so for now this has been my pattern, and it\u0026rsquo;s only bitten me in the\nbutt when I\u0026rsquo;ve forgotten to add the final CNAME record\u0026hellip; which\u0026rsquo;ll make sense\nin a sec.\u003c/p\u003e\n\u003ch2 id=\"process\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eProcess\u003c/span\u003e \u003ca href=\"#process\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIt\u0026rsquo;s really quite simple - in pihole I have a DNS record for my domain pointing\nto my primary server\u003c/p\u003e\n\u003cfigure\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250706114501_8c34a31e.png\" alt=\"20250706114501_8c34a31e.png\"\u003e\n\u003c/figure\u003e\n\u003cp\u003eThen for each service that I want to keep everything resolved locally for I add a CNAME\u003c/p\u003e\n\u003cfigure\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250706114557_916fb4c4.png\" alt=\"20250706114557_916fb4c4.png\"\u003e\n\u003c/figure\u003e\n\u003cp\u003eWith DNS resolving this way for clients using my pihole, the networking all\nstays local and I still get HTTPS for my wildcard cert in cloudflare\u003c/p\u003e\n\u003ch2 id=\"why\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhy?\u003c/span\u003e \u003ca href=\"#why\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe reasons I do this are simple:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eI\u0026rsquo;ve been doing it since I started homelabbing and it started out of misunderstanding of how networking works \u003cem\u003eat all\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003eI use a home dashboard with https:// links, and it\u0026rsquo;s nice to just use that\nsame dashbaord publically or at home. With local DNS resolution then I can\nwhitelist some services, but conveniently access over the public url with https\nbut routing such that my whitelist let\u0026rsquo;s me in when it wouldn\u0026rsquo;t if I tried to\naccess the service from an external client\u003c/li\u003e\n\u003cli\u003eit\u0026rsquo;s my homelab - I can do what I want\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"it-s-too-complicated\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eIt’s too complicated\u003c/span\u003e \u003ca href=\"#it-s-too-complicated\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eHonestly, as simple as this is, it is tedious and kind of complicated\u0026hellip;\nThere\u0026rsquo;s options to make it better\u0026hellip;\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003escript any service deployment to update the pihole /etc/host file\u003c/li\u003e\n\u003cli\u003ejust use tailscale\u0026hellip;\u003c/li\u003e\n\u003c/ol\u003e\n",
      "content_text": "\n## Spoilers\n\nTailscale is way easier than this... I was doing this local DNS overwrite in\nPi-hole before running tailscale and I haven't just totally \"kicked the habit\"\nyet, so for anyone NOT running tailcale, but wanting local HTTPS and using\nPi-Hole this method would work fine\n\n## Intro\n\nI use [pihole](https://pi-hole.net/) as my DNS server at home. I run unbound as\nwell and have a pretty standard setup from their docs.\n\nPi-hole does 2 primary things for me:\n\n1. dns sink-hold, the primary use case I believe\n2. local SSL for all my self-hosted apps\n\n## Caveat\n\nI know for sure there are better ways to do this, but there's also worse\nones... so for now this has been my pattern, and it's only bitten me in the\nbutt when I've forgotten to add the final CNAME record... which'll make sense\nin a sec.\n\n## Process\n\nIt's really quite simple - in pihole I have a DNS record for my domain pointing\nto my primary server\n\n![20250706114501_8c34a31e.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250706114501_8c34a31e.png)\n\nThen for each service that I want to keep everything resolved locally for I add a CNAME\n\n![20250706114557_916fb4c4.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20250706114557_916fb4c4.png)\n\nWith DNS resolving this way for clients using my pihole, the networking all\nstays local and I still get HTTPS for my wildcard cert in cloudflare\n\n## Why?\n\nThe reasons I do this are simple:\n\n1. I've been doing it since I started homelabbing and it started out of misunderstanding of how networking works _at all_\n2. I use a home dashboard with https:// links, and it's nice to just use that\n   same dashbaord publically or at home. With local DNS resolution then I can\n   whitelist some services, but conveniently access over the public url with https\n   but routing such that my whitelist let's me in when it wouldn't if I tried to\n   access the service from an external client\n3. it's my homelab - I can do what I want\n\n## It's too complicated\n\nHonestly, as simple as this is, it is tedious and kind of complicated...\nThere's options to make it better...\n\n1. script any service deployment to update the pihole /etc/host file\n2. just use tailscale...\n",
      "summary": "Tailscale is way easier than this... I was doing this local DNS overwrite in Pi-hole before running tailscale and I haven't just totally \"kicked the habit\"...",
      "date_published": "2022-05-23T09:40:59Z",
      "date_modified": "2022-05-23T09:40:59Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/netplan-change-from-focal-to-jammy/",
      "url": "https://pype.dev/netplan-change-from-focal-to-jammy/",
      "title": "Netplan change from Focal to Jammy",
      "content_html": "\u003cp\u003eI am revamping my home server and bumped myself early up to Jammy Jellyfish\u0026hellip;\nhowever to my peril I reused my netplan config and after hitting my server with\nthe \u0026lsquo;ol \u003ccode\u003enetplan apply\u003c/code\u003e I lost connection\u0026hellip;\nDNS still seemed to kinda work externally, but internally nothing was up\u0026hellip;\u003c/p\u003e\n\u003cp\u003eTurns out Netplan got a little change in how to express the \u003ccode\u003egateway\u003c/code\u003e key in the netplan config!\u003c/p\u003e\n\u003cp\u003eOld Ubuntu 20.04 way\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003enetwork\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\"\u003eversion\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e2\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\"\u003eethernets\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\"\u003eenp0s4\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\"\u003eaddresses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e192.168.1\u003c/span\u003e\u003cspan class=\"l\"\u003e.{Static IP}/24]\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\"\u003egateway4\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e192.168.1.1\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# \u0026lt;-- This changes!\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\"\u003enameservers\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\"\u003eaddresses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e192.168.1.1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e1.1.1.1\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNew jammin way for Jammy Jellyfish (\u003cstrong\u003eat least that worked for me\u003c/strong\u003e)\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003enetwork\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\"\u003eversion\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e2\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\"\u003eethernets\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\"\u003eenp0s4\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\"\u003eaddresses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e192.168.1\u003c/span\u003e\u003cspan class=\"l\"\u003e.{Static IP}/24]\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\"\u003eroutes\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\"\u003eto\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003edefault\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\"\u003evia\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e192.168.1.1\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\"\u003enameservers\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\"\u003eaddresses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e192.168.1.1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e1.1.1.1\u003c/span\u003e\u003cspan class=\"p\"\u003e]\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 am revamping my home server and bumped myself early up to Jammy Jellyfish...\nhowever to my peril I reused my netplan config and after hitting my server with\nthe 'ol `netplan apply` I lost connection...\nDNS still seemed to kinda work externally, but internally nothing was up... \n\nTurns out Netplan got a little change in how to express the `gateway` key in the netplan config!\n\nOld Ubuntu 20.04 way\n\n```yaml\nnetwork:\n  version: 2\n  ethernets:\n    enp0s4:\n      addresses: [192.168.1.{Static IP}/24]\n      gateway4: 192.168.1.1  # \u003c-- This changes!\n      nameservers:\n        addresses: [192.168.1.1, 1.1.1.1]\n```\n\nNew jammin way for Jammy Jellyfish (__at least that worked for me__)\n```yaml\nnetwork:\n  version: 2\n  ethernets:\n    enp0s4:\n      addresses: [192.168.1.{Static IP}/24]\n      routes:\n        - to: default\n          via: 192.168.1.1 \n      nameservers:\n        addresses: [192.168.1.1, 1.1.1.1]\n```\n",
      "summary": "I am revamping my home server and bumped myself early up to Jammy Jellyfish... however to my peril I reused my netplan config and after hitting my server...",
      "date_published": "2022-05-22T13:23:17Z",
      "date_modified": "2022-05-22T13:23:17Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "linux",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/nextcloud-permissions-with-zfs-and-ansible-nas/",
      "url": "https://pype.dev/nextcloud-permissions-with-zfs-and-ansible-nas/",
      "title": "Nextcloud permissions with ZFS and Ansible-NAS",
      "content_html": "\u003ch1 id=\"tl-dr\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTL;DR\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eAs the nextcloud docs say\u0026hellip; if you want to write to an external volume that\nlocation has to be writeable by the user/group \u003ccode\u003ewww-data\u003c/code\u003e on the host system\u0026hellip;\nso if that makes sense to you then this TIL probably isn\u0026rsquo;t a ton of value.. if\nnot however, read on :)\u003c/p\u003e\n\u003ch1 id=\"case-study\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCase Study\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eYou want to self-host your own cloud and use a smart file system for convenience\u0026hellip;\nNextcloud and ZFS are pretty common goto answers for each of those problems.\u003c/p\u003e\n\u003cp\u003eMy home NAS is built on ZFS and among other things I have a \u003ccode\u003ezpool\u003c/code\u003e named\n\u003ccode\u003etank\u003c/code\u003e and nested in there is a \u003ccode\u003etank/nas\u003c/code\u003e dataset with several child zfs\ndatasets under that.\u003c/p\u003e\n\u003cp\u003eI want to use nextcloud mainly for auto-uploading photos from my wife\u0026rsquo;s and my phones for automatic backups.\nThe issue is that the nextcloud application (I run in Docker) is fixed as the\n\u003ccode\u003ewww-data\u003c/code\u003e user and so any volume/folder that you want nextcloud to write to\nneeds to be permissioned such that \u003ccode\u003ewww-data\u003c/code\u003e owns it\u0026hellip; but I don\u0026rsquo;t want\n\u003ccode\u003ewww-data\u003c/code\u003e to own everything in my NAS\u0026hellip; so what\u0026rsquo;s a girl to do?\u003c/p\u003e\n\u003ch1 id=\"solution\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSolution\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eWell, one way to go is to just utilize docker volumes, write the data in the\ncontainer to \u003ccode\u003e/var/www/html\u003c/code\u003e and let that be the place your data backsup to.\u003c/p\u003e\n\u003cp\u003eI still wanted nextcloud to automatically write right to my NAS so I created a\n\u003ccode\u003enextcloud-upload\u003c/code\u003e directory inside of \u003ccode\u003etank/nas/media/photos\u003c/code\u003e (photos cause\nthat\u0026rsquo;s all that gets automatically uploaded)\u003c/p\u003e\n\u003cp\u003eThen I \u003ccode\u003echown -R www-data:www-data /tank/nas/media/photos/nextcloud-upload\u003c/code\u003e so\nthat just that sub-folder is owned by \u003ccode\u003ewww-data\u003c/code\u003e. Now everyone\u0026rsquo;s happy!\u003c/p\u003e\n",
      "content_text": "\n# TL;DR\n\nAs the nextcloud docs say... if you want to write to an external volume that\nlocation has to be writeable by the user/group `www-data` on the host system...\nso if that makes sense to you then this TIL probably isn't a ton of value.. if\nnot however, read on :)\n\n\n\n# Case Study\n\nYou want to self-host your own cloud and use a smart file system for convenience...\nNextcloud and ZFS are pretty common goto answers for each of those problems.\n\nMy home NAS is built on ZFS and among other things I have a `zpool` named\n`tank` and nested in there is a `tank/nas` dataset with several child zfs\ndatasets under that.\n\nI want to use nextcloud mainly for auto-uploading photos from my wife's and my phones for automatic backups.\nThe issue is that the nextcloud application (I run in Docker) is fixed as the\n`www-data` user and so any volume/folder that you want nextcloud to write to\nneeds to be permissioned such that `www-data` owns it... but I don't want\n`www-data` to own everything in my NAS... so what's a girl to do?\n\n# Solution\n\nWell, one way to go is to just utilize docker volumes, write the data in the\ncontainer to `/var/www/html` and let that be the place your data backsup to.\n\nI still wanted nextcloud to automatically write right to my NAS so I created a\n`nextcloud-upload` directory inside of `tank/nas/media/photos` (photos cause\nthat's all that gets automatically uploaded)\n\nThen I `chown -R www-data:www-data /tank/nas/media/photos/nextcloud-upload` so\nthat just that sub-folder is owned by `www-data`. Now everyone's happy!\n\n\n\n",
      "summary": "As the nextcloud docs say... if you want to write to an external volume that location has to be writeable by the user/group on the host system... so if that...",
      "date_published": "2022-05-19T13:55:20Z",
      "date_modified": "2022-05-19T13:55:20Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "zfs",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/see-zfs-snapshot-disk-usage/",
      "url": "https://pype.dev/see-zfs-snapshot-disk-usage/",
      "title": "See ZFS snapshot disk usage",
      "content_html": "\u003cp\u003eAs I was cleaning up my NAS recently I noticed that I ran out of storage even\nthough my disk usage looked pretty low\u0026hellip; turns out I was keeping a mega-ton of\nZFS snapshots and due to my own ignorance at the time didn\u0026rsquo;t realize the\nstorage cost of this!\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003ezfs list-o space tank/home\u003c/code\u003e will show the disk usage of the dataset and snapshots in \u003ccode\u003etank/home\u003c/code\u003e\u003c/p\u003e\n",
      "content_text": "\nAs I was cleaning up my NAS recently I noticed that I ran out of storage even\nthough my disk usage looked pretty low... turns out I was keeping a mega-ton of\nZFS snapshots and due to my own ignorance at the time didn't realize the\nstorage cost of this!\n\n`zfs list-o space tank/home` will show the disk usage of the dataset and snapshots in `tank/home`\n",
      "summary": "As I was cleaning up my NAS recently I noticed that I ran out of storage even though my disk usage looked pretty low... turns out I was keeping a mega-ton of...",
      "date_published": "2022-05-19T06:05:23Z",
      "date_modified": "2022-05-19T06:05:23Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "zfs",
        "homelab",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/remove-zfs-dataset-specific-snapshots/",
      "url": "https://pype.dev/remove-zfs-dataset-specific-snapshots/",
      "title": "Remove ZFS Dataset Specific Snapshots",
      "content_html": "\u003cp\u003eI started my homelab journey being super naive about ZFS and how to manage the\nfilesystem\u0026hellip; that bit me in the butt when transfering a ton of files out of\nfolders and into datasets because ZFS is copy on write so I was essentially\nduplicating my storage until I got a hair smarter about removing files after\nthey\u0026rsquo;re moved (rsync \u0026ndash;remove-source-file ftw). But I had a ton of snapshots of\nchild datasets with a ton of data that I just never will need, so I learned\n\u003ccode\u003ezfs list -H -o name -t snapshot tank/dataset1/dataset2\u003c/code\u003e will list just the\nsnapshots for dataset2 and if you pipe that into \u003ccode\u003exargs -n1 zfs destroy\u003c/code\u003e then\nyou have a way to clear out some snapshots you don\u0026rsquo;t need!\u003c/p\u003e\n",
      "content_text": "\nI started my homelab journey being super naive about ZFS and how to manage the\nfilesystem... that bit me in the butt when transfering a ton of files out of\nfolders and into datasets because ZFS is copy on write so I was essentially\nduplicating my storage until I got a hair smarter about removing files after\nthey're moved (rsync --remove-source-file ftw). But I had a ton of snapshots of\nchild datasets with a ton of data that I just never will need, so I learned\n`zfs list -H -o name -t snapshot tank/dataset1/dataset2` will list just the\nsnapshots for dataset2 and if you pipe that into `xargs -n1 zfs destroy` then\nyou have a way to clear out some snapshots you don't need!\n",
      "summary": "I started my homelab journey being super naive about ZFS and how to manage the filesystem... that bit me in the butt when transfering a ton of files out of...",
      "date_published": "2022-05-19T05:49:16Z",
      "date_modified": "2022-05-19T05:49:16Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "linux",
        "zfs",
        "cli",
        "bash",
        "homelab",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/plug-snapshot/",
      "url": "https://pype.dev/plug-snapshot/",
      "title": "Plug Snapshot!",
      "content_html": "\u003cp\u003e:PlugSnapshot, :w ~/dotfiles/nvim/snapshot.vim\u0026hellip; keep your config safe with git!\u003c/p\u003e\n",
      "content_text": "\n:PlugSnapshot, :w ~/dotfiles/nvim/snapshot.vim... keep your config safe with git!\n",
      "summary": ":PlugSnapshot, :w ~/dotfiles/nvim/snapshot.vim... keep your config safe with git!",
      "date_published": "2022-05-17T15:45:49Z",
      "date_modified": "2022-05-17T15:45:49Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "vim",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/filepath-completion-in-neovim/",
      "url": "https://pype.dev/filepath-completion-in-neovim/",
      "title": "Filepath Completion in Neovim",
      "content_html": "\u003cp\u003eI\u0026rsquo;ve had \u003ccode\u003ePlug 'hrsh7th/cmp-path'\u003c/code\u003e in my plugins for ever but didn\u0026rsquo;t notice\nuntil recently that I wasn\u0026rsquo;t getting any filepath completion in vim!\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eFuller setup instructions below the TLDR\u003c/strong\u003e\u003c/p\u003e\n\u003ch1 id=\"tl-dr\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTL;DR\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eTurns out I need to not be a dope and configure nvim-cmp to actually use it\u0026hellip;\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003elocal\u003c/span\u003e \u003cspan class=\"n\"\u003ecmp\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003erequire\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;cmp\u0026#39;\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=\"n\"\u003ecmp.setup\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=\"c1\"\u003e-- removed rest of setup - see the rest in my dotfiles\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"n\"\u003esources\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ecmp.config\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esources\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 \u003cspan class=\"n\"\u003ename\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;path\u0026#39;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e  \u003cspan class=\"c1\"\u003e-- This needs to be here!\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\u003cspan class=\"p\"\u003e})\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch1 id=\"my-setup\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMy Setup\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eFor the sake of completeness here is how I currently (May 2022) configure completion in Neovim usin \u003ccode\u003envim-cmp\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"plugins\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePlugins\u003c/span\u003e \u003ca href=\"#plugins\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI keep all my plugins in \u003ccode\u003eplugins.vim\u003c/code\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecall\u003c/span\u003e \u003cspan class=\"nx\"\u003eplug\u003c/span\u003e#\u003cspan class=\"nx\"\u003ebegin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003es\u003c/span\u003e:\u003cspan class=\"nx\"\u003eplug_dir\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=\"nx\"\u003ePlug\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;neovim/nvim-lspconfig\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ePlug\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;hrsh7th/cmp-nvim-lsp\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ePlug\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;hrsh7th/cmp-buffer\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ePlug\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;hrsh7th/cmp-path\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ePlug\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;hrsh7th/cmp-cmdline\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ePlug\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;hrsh7th/nvim-cmp\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026#34; For ultisnips users.\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=\"c\"\u003e\u0026#34; Plug \u0026#39;SirVer/ultisnips\u0026#39; --\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=\"c\"\u003e\u0026#34; Plug \u0026#39;quangnguyen30192/cmp-nvim-ultisnips\u0026#39; --\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=\"nx\"\u003ecall\u003c/span\u003e \u003cspan class=\"nx\"\u003eplug\u003c/span\u003e#\u003cspan class=\"nx\"\u003eend\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\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"vim-settings\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eVim Settings\u003c/span\u003e \u003ca href=\"#vim-settings\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eMy vim settings are also kept in their own file, \u003ccode\u003esettings.vim\u003c/code\u003e\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\"\u003e\u003cspan class=\"k\"\u003eset\u003c/span\u003e \u003cspan class=\"nx\"\u003ecompleteopt\u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"nx\"\u003emenu\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"nx\"\u003emenuone\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"nx\"\u003enoselect\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\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"nvim-cmp-configuration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003envim-cmp configuration\u003c/span\u003e \u003ca href=\"#nvim-cmp-configuration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI have a \u003ccode\u003ecmp.lua\u003c/code\u003e file that gets sourced in \u003ccode\u003einit.lua\u003c/code\u003e (file structure explained below) for configuring cmp.\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\"\u003e  \u003cspan class=\"c1\"\u003e-- Setup nvim-cmp.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003elocal\u003c/span\u003e \u003cspan class=\"n\"\u003ecmp\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003erequire\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;cmp\u0026#39;\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=\"n\"\u003ecmp.setup\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=\"n\"\u003esnippet\u003c/span\u003e \u003cspan class=\"o\"\u003e=\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=\"c1\"\u003e-- REQUIRED - you must specify a snippet engine\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eexpand\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kr\"\u003efunction\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eargs\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=\"c1\"\u003e-- For `ultisnips` user.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"n\"\u003evim.fn\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;UltiSnips#Anon\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e](\u003c/span\u003e\u003cspan class=\"n\"\u003eargs.body\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=\"kr\"\u003eend\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  \u003cspan class=\"n\"\u003ewindow\u003c/span\u003e \u003cspan class=\"o\"\u003e=\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=\"n\"\u003ecompletion\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ecmp.config\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ewindow.bordered\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  \u003cspan class=\"n\"\u003emapping\u003c/span\u003e \u003cspan class=\"o\"\u003e=\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\u003cspan class=\"s1\"\u003e\u0026#39;\u0026lt;Down\u0026gt;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ecmp.mapping\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eselect_next_item\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e \u003cspan class=\"n\"\u003ebehavior\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ecmp.SelectBehavior\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eSelect\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\u003cspan class=\"s1\"\u003e\u0026#39;\u0026lt;Up\u0026gt;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ecmp.mapping\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eselect_prev_item\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e \u003cspan class=\"n\"\u003ebehavior\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ecmp.SelectBehavior\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eSelect\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\u003cspan class=\"s1\"\u003e\u0026#39;\u0026lt;C-d\u0026gt;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ecmp.mapping\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003escroll_docs\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e4\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\u003cspan class=\"s1\"\u003e\u0026#39;\u0026lt;C-f\u0026gt;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ecmp.mapping\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003escroll_docs\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e4\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\u003cspan class=\"s1\"\u003e\u0026#39;\u0026lt;C-Space\u0026gt;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ecmp.mapping\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecomplete\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\u003cspan class=\"s1\"\u003e\u0026#39;\u0026lt;C-e\u0026gt;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ecmp.mapping\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eclose\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\u003cspan class=\"s1\"\u003e\u0026#39;\u0026lt;Tab\u0026gt;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ecmp.mapping\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecmp.mapping\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eselect_next_item\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;i\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;s\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[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\u0026lt;CR\u0026gt;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ecmp.mapping\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003econfirm\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=\"n\"\u003ebehavior\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ecmp.ConfirmBehavior\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eReplace\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=\"n\"\u003eselect\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\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  \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"n\"\u003esources\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ecmp.config\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esources\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 \u003cspan class=\"n\"\u003ename\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;nvim_lsp\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{\u003c/span\u003e \u003cspan class=\"n\"\u003ename\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;ultisnips\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{\u003c/span\u003e \u003cspan class=\"n\"\u003ename\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;buffer\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{\u003c/span\u003e \u003cspan class=\"n\"\u003ename\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;path\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{\u003c/span\u003e \u003cspan class=\"n\"\u003ename\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;tmux\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})\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\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe \u003ccode\u003esources\u003c/code\u003e section is what was key for this post\u0026hellip;\u003c/p\u003e\n\u003ch1 id=\"piecing-it-together\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePiecing it together!\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eMy \u003ccode\u003einit.vim\u003c/code\u003e sources plugins and then settings and then finally calls \u003ccode\u003einit.lua\u003c/code\u003e.\n\u003ccode\u003einit.lua\u003c/code\u003e sources my \u003ccode\u003ecmp.lua\u003c/code\u003e file and BANG! auto-completion.\u003c/p\u003e\n\u003ch2 id=\"more-sources\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMore sources\u003c/span\u003e \u003ca href=\"#more-sources\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003ehrsh7th\u0026rsquo;s wiki for \u003ccode\u003envim-cmp\u003c/code\u003e is \u003ca href=\"https://github.com/hrsh7th/nvim-cmp/wiki/List-of-sources\"\u003ehere\u003c/a\u003e and has example configs as well as a list of sources\u0026hellip;\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eDon\u0026rsquo;t forget to configure and not just install!\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/nicpayne713/dotfiles\"\u003emy dotfiles\u003c/a\u003e\u003c/p\u003e\n",
      "content_text": "\n\nI've had `Plug 'hrsh7th/cmp-path'` in my plugins for ever but didn't notice\nuntil recently that I wasn't getting any filepath completion in vim!\n\n__Fuller setup instructions below the TLDR__\n\n# TL;DR\n\nTurns out I need to not be a dope and configure nvim-cmp to actually use it...\n\n\n```lua\nlocal cmp = require'cmp'\n\ncmp.setup({\n    -- removed rest of setup - see the rest in my dotfiles\n  sources = cmp.config.sources({\n    { name = 'path' },  -- This needs to be here!\n    })\n})\n```\n\n# My Setup\n\nFor the sake of completeness here is how I currently (May 2022) configure completion in Neovim usin `nvim-cmp`\n\n## Plugins\n\nI keep all my plugins in `plugins.vim`\n\n```vim\ncall plug#begin(s:plug_dir)\nPlug 'neovim/nvim-lspconfig'\nPlug 'hrsh7th/cmp-nvim-lsp'\nPlug 'hrsh7th/cmp-buffer'\nPlug 'hrsh7th/cmp-path'\nPlug 'hrsh7th/cmp-cmdline'\nPlug 'hrsh7th/nvim-cmp'\n\n\" For ultisnips users.\n\u003c!-- \" Plug 'SirVer/ultisnips' --\u003e\n\u003c!-- \" Plug 'quangnguyen30192/cmp-nvim-ultisnips' --\u003e\n\ncall plug#end()\n\n```\n\n## Vim Settings\n\nMy vim settings are also kept in their own file, `settings.vim`\n\n```vim\n\nset completeopt=menu,menuone,noselect\n\n```\n\n## nvim-cmp configuration\n\nI have a `cmp.lua` file that gets sourced in `init.lua` (file structure explained below) for configuring cmp.\n\n```lua\n\n  -- Setup nvim-cmp.\nlocal cmp = require'cmp'\n\ncmp.setup({\n  snippet = {\n    -- REQUIRED - you must specify a snippet engine\n    expand = function(args)\n      -- For `ultisnips` user.\n      vim.fn[\"UltiSnips#Anon\"](args.body)\n    end,\n  },\n  window = {\n      completion = cmp.config.window.bordered(),\n  },\n  mapping = {\n    ['\u003cDown\u003e'] = cmp.mapping.select_next_item({ behavior = cmp.SelectBehavior.Select }),\n    ['\u003cUp\u003e'] = cmp.mapping.select_prev_item({ behavior = cmp.SelectBehavior.Select }),\n    ['\u003cC-d\u003e'] = cmp.mapping.scroll_docs(-4),\n    ['\u003cC-f\u003e'] = cmp.mapping.scroll_docs(4),\n    ['\u003cC-Space\u003e'] = cmp.mapping.complete(),\n    ['\u003cC-e\u003e'] = cmp.mapping.close(),\n    ['\u003cTab\u003e'] = cmp.mapping(cmp.mapping.select_next_item(), { 'i', 's' }),\n    ['\u003cCR\u003e'] = cmp.mapping.confirm({\n      behavior = cmp.ConfirmBehavior.Replace,\n      select = true,\n    })\n  },\n  sources = cmp.config.sources({\n    { name = 'nvim_lsp' },\n    { name = 'ultisnips' },\n    { name = 'buffer' },\n    { name = 'path' },\n    { name = 'tmux' },\n    })\n})\n\n```\n\n\nThe `sources` section is what was key for this post...\n\n# Piecing it together!\n\nMy `init.vim` sources plugins and then settings and then finally calls `init.lua`.\n`init.lua` sources my `cmp.lua` file and BANG! auto-completion.\n\n## More sources\n\nhrsh7th's wiki for `nvim-cmp` is [here](https://github.com/hrsh7th/nvim-cmp/wiki/List-of-sources) and has example configs as well as a list of sources...\n\n__Don't forget to configure and not just install!__\n\n[my dotfiles](https://github.com/nicpayne713/dotfiles)\n",
      "summary": "I've had in my plugins for ever but didn't notice until recently that I wasn't getting any filepath completion in vim!",
      "date_published": "2022-05-17T14:03:27Z",
      "date_modified": "2022-05-17T14:03:27Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "vim",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/plug-snapshot-to-save-your-life/",
      "url": "https://pype.dev/plug-snapshot-to-save-your-life/",
      "title": "Plug-Snapshot-To-Save-Your-Life",
      "content_html": "\u003cp\u003eIf you use vim-plug for managing your vim plugins, do yourself a favor and snapshot your plugins before upgrading!\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e:PlugSnapshot\u003c/code\u003e  creates a vim.snapshot file that you can use to restore your plugin versions with \u003ccode\u003evim -S snapshot.vim\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eThe snapshot file looks like this:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003e❯ cat snapshot.vim\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003e\u0026#34; Generated by vim-plug\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003e\u0026#34; Tue 17 May 2022 03:44:29 PM CDT\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003e\u0026#34; :source this file in vim to restore the snapshot\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003e\u0026#34; or execute: vim -S snapshot.vim\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;Telegraph.nvim\u0026#39;].commit = \u0026#39;92e472f4e83acd60eb3766168e66d02718bfefe0\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;TrueZen.nvim\u0026#39;].commit = \u0026#39;508b977d71650da5c9243698614a9a1416f116d4\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;ariake-vim-colors\u0026#39;].commit = \u0026#39;9fb35f1255e475631c9df24ecc5485a40360cc7b\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;auto-pairs\u0026#39;].commit = \u0026#39;39f06b873a8449af8ff6a3eee716d3da14d63a76\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;bufutils.vim\u0026#39;].commit = \u0026#39;4634feb1312fd73fab66cfaa860e7af3abde935b\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;cmp-buffer\u0026#39;].commit = \u0026#39;12463cfcd9b14052f9effccbf1d84caa7a2d57f0\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;cmp-cmdline\u0026#39;].commit = \u0026#39;c36ca4bc1dedb12b4ba6546b96c43896fd6e7252\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;cmp-nvim-lsp\u0026#39;].commit = \u0026#39;e6b5feb2e6560b61f31c756fb9231a0d7b10c73d\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;cmp-nvim-ultisnips\u0026#39;].commit = \u0026#39;21f02b62deb409ce69928a23406076bd0043ddbc\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;cmp-path\u0026#39;].commit = \u0026#39;466b6b8270f7ba89abd59f402c73f63c7331ff6e\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;cmp-spell\u0026#39;].commit = \u0026#39;5602f1a0de7831f8dad5b0c6db45328fbd539971\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;compe-tabnine\u0026#39;].commit = \u0026#39;33e4af509c27da9ef2c9c3002c01e3ec031797d4\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;coverage-highlight.vim\u0026#39;].commit = \u0026#39;864e03679ea4168661501246147893cc82020917\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;diffurcate.vim\u0026#39;].commit = \u0026#39;b804675072220ff7c7ebcd24a028aa4aa35f09cc\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;fzf\u0026#39;].commit = \u0026#39;6dcf5c3d7d6c321b17e6a5673f1533d6e8350462\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;fzf.vim\u0026#39;].commit = \u0026#39;d5f1f8641b24c0fd5b10a299824362a2a1b20ae0\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;git-blame.vim\u0026#39;].commit = \u0026#39;9d144b7bed5d8f1c9259551768b7f3b3d1294917\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;harpoon\u0026#39;].commit = \u0026#39;d3d3d22b6207f46f8ca64946f4d781e975aec0fc\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;instant.nvim\u0026#39;].commit = \u0026#39;c02d72267b12130609b7ad39b76cf7f4a3bc9554\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;lsp-colors.nvim\u0026#39;].commit = \u0026#39;517fe3ab6b63f9907b093bc9443ef06b56f804f3\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;lsp_extensions.nvim\u0026#39;].commit = \u0026#39;4011f4aec61ba59c734f5dbf52e91f258b99d985\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;lspkind-nvim\u0026#39;].commit = \u0026#39;57e5b5dfbe991151b07d272a06e365a77cc3d0e7\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;lspsaga.nvim\u0026#39;].commit = \u0026#39;8dde091a61ab07f639baaa82b456d3508d0aa7e8\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;neoformat\u0026#39;].commit = \u0026#39;409ebbba9f4b568ea87ab4f2de90a645cf5d000a\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;neovim-fuzzy\u0026#39;].commit = \u0026#39;0bef4e1a81c65fc05d31380dd74454bd67733837\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;nerdtree\u0026#39;].commit = \u0026#39;eed488b1cd1867bd25f19f90e10440c5cc7d6424\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;nerdtree-visual-selection\u0026#39;].commit = \u0026#39;05427635ff053a2c542fcf8d7c3744c72575e76c\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;nvim-cmp\u0026#39;].commit = \u0026#39;a226b6a4ff72e5e809ed17734318233fb25c87f3\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;nvim-compe\u0026#39;].commit = \u0026#39;d186d739c54823e0b010feb205c6f97792322c08\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;nvim-lspconfig\u0026#39;].commit = \u0026#39;9ff2a06cebd4c8c3af5259d713959ab310125bec\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;nvim-lspinstall\u0026#39;].commit = \u0026#39;79ec2425d6b39cdcb69d379f3e56847f49be73eb\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;nvim-treesitter\u0026#39;].commit = \u0026#39;10d57b3ec14cac0b6b759e1eb5594617b8a7e883\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;nvim-treesitter-textobjects\u0026#39;].commit = \u0026#39;094e8ad3cc839e825f8dcc91352837653e365a8f\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;nvim-web-devicons\u0026#39;].commit = \u0026#39;bdd43421437f2ef037e0dafeaaaa62b31d35ef2f\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;playground\u0026#39;].commit = \u0026#39;71b00a3c665298e5155ad64a9020135808d4e3e8\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;plenary.nvim\u0026#39;].commit = \u0026#39;25b3475b97f241e6f76249747bc209e70c5d2ec8\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;popup.nvim\u0026#39;].commit = \u0026#39;b7404d35d5d3548a82149238289fa71f7f6de4ac\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;syntastic\u0026#39;].commit = \u0026#39;b7f4f71539038d33f173bfa72631737da049575a\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;tabular\u0026#39;].commit = \u0026#39;339091ac4dd1f17e225fe7d57b48aff55f99b23a\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;targets.vim\u0026#39;].commit = \u0026#39;8d6ff2984cdfaebe5b7a6eee8f226a6dd1226f2d\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;telescope-fzy-native.nvim\u0026#39;].commit = \u0026#39;7b3d2528102f858036627a68821ccf5fc1d78ce4\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;telescope.nvim\u0026#39;].commit = \u0026#39;39b12d84e86f5054e2ed98829b367598ae53ab41\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;termopen.vim\u0026#39;].commit = \u0026#39;3194a991a18a9be2fd9fcf8c4c55fe990c04b2bd\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;tokyonight.nvim\u0026#39;].commit = \u0026#39;8223c970677e4d88c9b6b6d81bda23daf11062bb\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;trouble.nvim\u0026#39;].commit = \u0026#39;da61737d860ddc12f78e638152834487eabf0ee5\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;ultisnips\u0026#39;].commit = \u0026#39;f5ccf0977c611ffd774ca180774959301baaffad\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;undotree\u0026#39;].commit = \u0026#39;08e259be24d4476c1ee745dc735eefd44f90efdc\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;vim-airline\u0026#39;].commit = \u0026#39;c4655701431a9c79704c827fd88a4783ec946879\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;vim-airline-themes\u0026#39;].commit = \u0026#39;97cf3e6e638f936187d5f6e9b5eb1bdf0a4df256\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;vim-be-good\u0026#39;].commit = \u0026#39;bc499a06c14c729b22a6cc7e730a9fbc44d4e737\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;vim-commentary\u0026#39;].commit = \u0026#39;3654775824337f466109f00eaf6759760f65be34\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;vim-devicons\u0026#39;].commit = \u0026#39;a2258658661e42dd4cdba4958805dbad1fe29ef4\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;vim-dispatch\u0026#39;].commit = \u0026#39;00e77d90452e3c710014b26dc61ea919bc895e92\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;vim-flake8\u0026#39;].commit = \u0026#39;a99054ef98e8fdaefa1315af4649138bcadbfdf7\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;vim-floaterm\u0026#39;].commit = \u0026#39;ab7876f86c05c1935eb23a193f4f276132902ac1\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;vim-fugitive\u0026#39;].commit = \u0026#39;f529acef74b4266d94f22414c60b4a8930c1e0f3\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;vim-gitbranch\u0026#39;].commit = \u0026#39;1a8ba866f3eaf0194783b9f8573339d6ede8f1ed\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;vim-indent-object\u0026#39;].commit = \u0026#39;5c5b24c959478929b54a9e831a8e2e651a465965\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;vim-nerdtree-syntax-highlight\u0026#39;].commit = \u0026#39;5178ee4d7f4e7761187df30bb709f703d91df18a\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;vim-polyglot\u0026#39;].commit = \u0026#39;38282d58387cff48ac203f6912c05e4c8686141b\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;vim-pydocstring\u0026#39;].commit = \u0026#39;f6e3c52bfaf4b4f76dab4d84e75b94199d5f3b9c\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;vim-quicklink\u0026#39;].commit = \u0026#39;021167741588555501594e1fc31f130b16acefa0\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;vim-repeat\u0026#39;].commit = \u0026#39;24afe922e6a05891756ecf331f39a1f6743d3d5a\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;vim-signify\u0026#39;].commit = \u0026#39;69498f6d49f3eeac06870012416dd9bf867b84f3\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;vim-sneak\u0026#39;].commit = \u0026#39;94c2de47ab301d476a2baec9ffda07367046bec9\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;vim-snippets\u0026#39;].commit = \u0026#39;6f270bb2d26c38765ff2243e9337c65f8a96a28b\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;vim-startify\u0026#39;].commit = \u0026#39;81e36c352a8deea54df5ec1e2f4348685569bed2\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;vim-surround\u0026#39;].commit = \u0026#39;bf3480dc9ae7bea34c78fbba4c65b4548b5b1fea\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;vim-test\u0026#39;].commit = \u0026#39;2240d7a4b868cb594b7d83544e1b6db4df806e5e\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;vim-tmux-runner\u0026#39;].commit = \u0026#39;54767911fd5e6e2d8e493847149e315ac2e6531a\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;vim-ultest\u0026#39;].commit = \u0026#39;6978fd32e3ca2c1c5591884eea0d57a7ee43d212\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;vim-visualstar\u0026#39;].commit = \u0026#39;a18cd0e7a03311ac709595c1d261ed44b45c9098\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;vimtex\u0026#39;].commit = \u0026#39;dfaca59bbbf0079ab1b4f159337ae7f17d1b5289\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003esilent! let g:plugs[\u0026#39;which-key.nvim\u0026#39;].commit = \u0026#39;bd4411a2ed4dd8bb69c125e339d837028a6eea71\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"go\"\u003ePlugUpdate!\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nIf you use vim-plug for managing your vim plugins, do yourself a favor and snapshot your plugins before upgrading!\n\n\n`:PlugSnapshot`  creates a vim.snapshot file that you can use to restore your plugin versions with `vim -S snapshot.vim`\n\nThe snapshot file looks like this:\n\n```console\n❯ cat snapshot.vim\n\" Generated by vim-plug\n\" Tue 17 May 2022 03:44:29 PM CDT\n\" :source this file in vim to restore the snapshot\n\" or execute: vim -S snapshot.vim\n\nsilent! let g:plugs['Telegraph.nvim'].commit = '92e472f4e83acd60eb3766168e66d02718bfefe0'\nsilent! let g:plugs['TrueZen.nvim'].commit = '508b977d71650da5c9243698614a9a1416f116d4'\nsilent! let g:plugs['ariake-vim-colors'].commit = '9fb35f1255e475631c9df24ecc5485a40360cc7b'\nsilent! let g:plugs['auto-pairs'].commit = '39f06b873a8449af8ff6a3eee716d3da14d63a76'\nsilent! let g:plugs['bufutils.vim'].commit = '4634feb1312fd73fab66cfaa860e7af3abde935b'\nsilent! let g:plugs['cmp-buffer'].commit = '12463cfcd9b14052f9effccbf1d84caa7a2d57f0'\nsilent! let g:plugs['cmp-cmdline'].commit = 'c36ca4bc1dedb12b4ba6546b96c43896fd6e7252'\nsilent! let g:plugs['cmp-nvim-lsp'].commit = 'e6b5feb2e6560b61f31c756fb9231a0d7b10c73d'\nsilent! let g:plugs['cmp-nvim-ultisnips'].commit = '21f02b62deb409ce69928a23406076bd0043ddbc'\nsilent! let g:plugs['cmp-path'].commit = '466b6b8270f7ba89abd59f402c73f63c7331ff6e'\nsilent! let g:plugs['cmp-spell'].commit = '5602f1a0de7831f8dad5b0c6db45328fbd539971'\nsilent! let g:plugs['compe-tabnine'].commit = '33e4af509c27da9ef2c9c3002c01e3ec031797d4'\nsilent! let g:plugs['coverage-highlight.vim'].commit = '864e03679ea4168661501246147893cc82020917'\nsilent! let g:plugs['diffurcate.vim'].commit = 'b804675072220ff7c7ebcd24a028aa4aa35f09cc'\nsilent! let g:plugs['fzf'].commit = '6dcf5c3d7d6c321b17e6a5673f1533d6e8350462'\nsilent! let g:plugs['fzf.vim'].commit = 'd5f1f8641b24c0fd5b10a299824362a2a1b20ae0'\nsilent! let g:plugs['git-blame.vim'].commit = '9d144b7bed5d8f1c9259551768b7f3b3d1294917'\nsilent! let g:plugs['harpoon'].commit = 'd3d3d22b6207f46f8ca64946f4d781e975aec0fc'\nsilent! let g:plugs['instant.nvim'].commit = 'c02d72267b12130609b7ad39b76cf7f4a3bc9554'\nsilent! let g:plugs['lsp-colors.nvim'].commit = '517fe3ab6b63f9907b093bc9443ef06b56f804f3'\nsilent! let g:plugs['lsp_extensions.nvim'].commit = '4011f4aec61ba59c734f5dbf52e91f258b99d985'\nsilent! let g:plugs['lspkind-nvim'].commit = '57e5b5dfbe991151b07d272a06e365a77cc3d0e7'\nsilent! let g:plugs['lspsaga.nvim'].commit = '8dde091a61ab07f639baaa82b456d3508d0aa7e8'\nsilent! let g:plugs['neoformat'].commit = '409ebbba9f4b568ea87ab4f2de90a645cf5d000a'\nsilent! let g:plugs['neovim-fuzzy'].commit = '0bef4e1a81c65fc05d31380dd74454bd67733837'\nsilent! let g:plugs['nerdtree'].commit = 'eed488b1cd1867bd25f19f90e10440c5cc7d6424'\nsilent! let g:plugs['nerdtree-visual-selection'].commit = '05427635ff053a2c542fcf8d7c3744c72575e76c'\nsilent! let g:plugs['nvim-cmp'].commit = 'a226b6a4ff72e5e809ed17734318233fb25c87f3'\nsilent! let g:plugs['nvim-compe'].commit = 'd186d739c54823e0b010feb205c6f97792322c08'\nsilent! let g:plugs['nvim-lspconfig'].commit = '9ff2a06cebd4c8c3af5259d713959ab310125bec'\nsilent! let g:plugs['nvim-lspinstall'].commit = '79ec2425d6b39cdcb69d379f3e56847f49be73eb'\nsilent! let g:plugs['nvim-treesitter'].commit = '10d57b3ec14cac0b6b759e1eb5594617b8a7e883'\nsilent! let g:plugs['nvim-treesitter-textobjects'].commit = '094e8ad3cc839e825f8dcc91352837653e365a8f'\nsilent! let g:plugs['nvim-web-devicons'].commit = 'bdd43421437f2ef037e0dafeaaaa62b31d35ef2f'\nsilent! let g:plugs['playground'].commit = '71b00a3c665298e5155ad64a9020135808d4e3e8'\nsilent! let g:plugs['plenary.nvim'].commit = '25b3475b97f241e6f76249747bc209e70c5d2ec8'\nsilent! let g:plugs['popup.nvim'].commit = 'b7404d35d5d3548a82149238289fa71f7f6de4ac'\nsilent! let g:plugs['syntastic'].commit = 'b7f4f71539038d33f173bfa72631737da049575a'\nsilent! let g:plugs['tabular'].commit = '339091ac4dd1f17e225fe7d57b48aff55f99b23a'\nsilent! let g:plugs['targets.vim'].commit = '8d6ff2984cdfaebe5b7a6eee8f226a6dd1226f2d'\nsilent! let g:plugs['telescope-fzy-native.nvim'].commit = '7b3d2528102f858036627a68821ccf5fc1d78ce4'\nsilent! let g:plugs['telescope.nvim'].commit = '39b12d84e86f5054e2ed98829b367598ae53ab41'\nsilent! let g:plugs['termopen.vim'].commit = '3194a991a18a9be2fd9fcf8c4c55fe990c04b2bd'\nsilent! let g:plugs['tokyonight.nvim'].commit = '8223c970677e4d88c9b6b6d81bda23daf11062bb'\nsilent! let g:plugs['trouble.nvim'].commit = 'da61737d860ddc12f78e638152834487eabf0ee5'\nsilent! let g:plugs['ultisnips'].commit = 'f5ccf0977c611ffd774ca180774959301baaffad'\nsilent! let g:plugs['undotree'].commit = '08e259be24d4476c1ee745dc735eefd44f90efdc'\nsilent! let g:plugs['vim-airline'].commit = 'c4655701431a9c79704c827fd88a4783ec946879'\nsilent! let g:plugs['vim-airline-themes'].commit = '97cf3e6e638f936187d5f6e9b5eb1bdf0a4df256'\nsilent! let g:plugs['vim-be-good'].commit = 'bc499a06c14c729b22a6cc7e730a9fbc44d4e737'\nsilent! let g:plugs['vim-commentary'].commit = '3654775824337f466109f00eaf6759760f65be34'\nsilent! let g:plugs['vim-devicons'].commit = 'a2258658661e42dd4cdba4958805dbad1fe29ef4'\nsilent! let g:plugs['vim-dispatch'].commit = '00e77d90452e3c710014b26dc61ea919bc895e92'\nsilent! let g:plugs['vim-flake8'].commit = 'a99054ef98e8fdaefa1315af4649138bcadbfdf7'\nsilent! let g:plugs['vim-floaterm'].commit = 'ab7876f86c05c1935eb23a193f4f276132902ac1'\nsilent! let g:plugs['vim-fugitive'].commit = 'f529acef74b4266d94f22414c60b4a8930c1e0f3'\nsilent! let g:plugs['vim-gitbranch'].commit = '1a8ba866f3eaf0194783b9f8573339d6ede8f1ed'\nsilent! let g:plugs['vim-indent-object'].commit = '5c5b24c959478929b54a9e831a8e2e651a465965'\nsilent! let g:plugs['vim-nerdtree-syntax-highlight'].commit = '5178ee4d7f4e7761187df30bb709f703d91df18a'\nsilent! let g:plugs['vim-polyglot'].commit = '38282d58387cff48ac203f6912c05e4c8686141b'\nsilent! let g:plugs['vim-pydocstring'].commit = 'f6e3c52bfaf4b4f76dab4d84e75b94199d5f3b9c'\nsilent! let g:plugs['vim-quicklink'].commit = '021167741588555501594e1fc31f130b16acefa0'\nsilent! let g:plugs['vim-repeat'].commit = '24afe922e6a05891756ecf331f39a1f6743d3d5a'\nsilent! let g:plugs['vim-signify'].commit = '69498f6d49f3eeac06870012416dd9bf867b84f3'\nsilent! let g:plugs['vim-sneak'].commit = '94c2de47ab301d476a2baec9ffda07367046bec9'\nsilent! let g:plugs['vim-snippets'].commit = '6f270bb2d26c38765ff2243e9337c65f8a96a28b'\nsilent! let g:plugs['vim-startify'].commit = '81e36c352a8deea54df5ec1e2f4348685569bed2'\nsilent! let g:plugs['vim-surround'].commit = 'bf3480dc9ae7bea34c78fbba4c65b4548b5b1fea'\nsilent! let g:plugs['vim-test'].commit = '2240d7a4b868cb594b7d83544e1b6db4df806e5e'\nsilent! let g:plugs['vim-tmux-runner'].commit = '54767911fd5e6e2d8e493847149e315ac2e6531a'\nsilent! let g:plugs['vim-ultest'].commit = '6978fd32e3ca2c1c5591884eea0d57a7ee43d212'\nsilent! let g:plugs['vim-visualstar'].commit = 'a18cd0e7a03311ac709595c1d261ed44b45c9098'\nsilent! let g:plugs['vimtex'].commit = 'dfaca59bbbf0079ab1b4f159337ae7f17d1b5289'\nsilent! let g:plugs['which-key.nvim'].commit = 'bd4411a2ed4dd8bb69c125e339d837028a6eea71'\n\nPlugUpdate!\n\n```\n",
      "summary": "If you use vim-plug for managing your vim plugins, do yourself a favor and snapshot your plugins before upgrading!",
      "date_published": "2022-05-13T00:00:00Z",
      "date_modified": "2022-05-13T00:00:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/dataframe-to-styled-html/",
      "url": "https://pype.dev/dataframe-to-styled-html/",
      "title": "Dataframe-To-Styled-Html",
      "content_html": "\u003cp\u003eI wrote up a little on exporting DataFrames to markdown and html \u003ca href=\"/dataframe-to-markdown\"\u003ehere\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eBut I\u0026rsquo;ve been playing with a web app for with lists and while I\u0026rsquo;m toying around I learned you can actually give your tables some style with some simple css classes!\u003c/p\u003e\n\u003ch1 id=\"to-html\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTo HTML\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eReminder that if you have a dataframe, \u003ccode\u003edf\u003c/code\u003e, you can \u003ccode\u003edf.to_html()\u003c/code\u003e to get an HTML table of your dataframe.\u003c/p\u003e\n\u003cp\u003eWell you can pass some \u003ccode\u003eclasses\u003c/code\u003e to make it look super nice!\u003c/p\u003e\n\u003ch1 id=\"classes-and-css\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eClasses and CSS\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eI don\u0026rsquo;t know anything really about CSS so I won\u0026rsquo;t pretend otherwise, but as I was learning about bootstrap that\u0026rsquo;s where I stumbled upon this\u0026hellip;\u003c/p\u003e\n\u003cp\u003eThere are several classes you can pass but I found really good luck with \u003ccode\u003etable-bordered\u003c/code\u003e and \u003ccode\u003etable-dark\u003c/code\u003e for my use case\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003edf.to_html(classes=[\u0026quot;table table-bordered table-dark\u0026quot;])\u003c/code\u003e\u003c/p\u003e\n\u003ctable border=\"1\" class=\"dataframe table table-bordered table-dark\"\u003e  \u003cthead\u003e\n\u003ctr style=\"text-align: right;\"\u003e      \u003cth\u003eUnnamed: 0\u003c/th\u003e      \u003cth\u003empg\u003c/th\u003e\n\u003cth\u003ecyl\u003c/th\u003e      \u003cth\u003edisp\u003c/th\u003e      \u003cth\u003ehp\u003c/th\u003e      \u003cth\u003edrat\u003c/th\u003e\n\u003cth\u003ewt\u003c/th\u003e      \u003cth\u003eqsec\u003c/th\u003e      \u003cth\u003evs\u003c/th\u003e      \u003cth\u003eam\u003c/th\u003e\n\u003cth\u003egear\u003c/th\u003e      \u003cth\u003ecarb\u003c/th\u003e    \u003c/tr\u003e  \u003c/thead\u003e  \u003ctbody\u003e    \u003ctr\u003e\n\u003ctd\u003eMazda RX4\u003c/td\u003e      \u003ctd\u003e21.0\u003c/td\u003e      \u003ctd\u003e6\u003c/td\u003e      \u003ctd\u003e160.0\u003c/td\u003e\n\u003ctd\u003e110\u003c/td\u003e      \u003ctd\u003e3.90\u003c/td\u003e      \u003ctd\u003e2.620\u003c/td\u003e      \u003ctd\u003e16.46\u003c/td\u003e\n\u003ctd\u003e0\u003c/td\u003e      \u003ctd\u003e1\u003c/td\u003e      \u003ctd\u003e4\u003c/td\u003e      \u003ctd\u003e4\u003c/td\u003e    \u003c/tr\u003e    \u003ctr\u003e\n\u003ctd\u003eMazda RX4 Wag\u003c/td\u003e      \u003ctd\u003e21.0\u003c/td\u003e      \u003ctd\u003e6\u003c/td\u003e      \u003ctd\u003e160.0\u003c/td\u003e\n\u003ctd\u003e110\u003c/td\u003e      \u003ctd\u003e3.90\u003c/td\u003e      \u003ctd\u003e2.875\u003c/td\u003e      \u003ctd\u003e17.02\u003c/td\u003e\n\u003ctd\u003e0\u003c/td\u003e      \u003ctd\u003e1\u003c/td\u003e      \u003ctd\u003e4\u003c/td\u003e      \u003ctd\u003e4\u003c/td\u003e    \u003c/tr\u003e    \u003ctr\u003e\n\u003ctd\u003eDatsun 710\u003c/td\u003e      \u003ctd\u003e22.8\u003c/td\u003e      \u003ctd\u003e4\u003c/td\u003e      \u003ctd\u003e108.0\u003c/td\u003e\n\u003ctd\u003e93\u003c/td\u003e      \u003ctd\u003e3.85\u003c/td\u003e      \u003ctd\u003e2.320\u003c/td\u003e      \u003ctd\u003e18.61\u003c/td\u003e\n\u003ctd\u003e1\u003c/td\u003e      \u003ctd\u003e1\u003c/td\u003e      \u003ctd\u003e4\u003c/td\u003e      \u003ctd\u003e1\u003c/td\u003e    \u003c/tr\u003e    \u003ctr\u003e\n\u003ctd\u003eHornet 4 Drive\u003c/td\u003e      \u003ctd\u003e21.4\u003c/td\u003e      \u003ctd\u003e6\u003c/td\u003e      \u003ctd\u003e258.0\u003c/td\u003e\n\u003ctd\u003e110\u003c/td\u003e      \u003ctd\u003e3.08\u003c/td\u003e      \u003ctd\u003e3.215\u003c/td\u003e      \u003ctd\u003e19.44\u003c/td\u003e\n\u003ctd\u003e1\u003c/td\u003e      \u003ctd\u003e0\u003c/td\u003e      \u003ctd\u003e3\u003c/td\u003e      \u003ctd\u003e1\u003c/td\u003e    \u003c/tr\u003e    \u003ctr\u003e\n\u003ctd\u003eHornet Sportabout\u003c/td\u003e      \u003ctd\u003e18.7\u003c/td\u003e      \u003ctd\u003e8\u003c/td\u003e\n\u003ctd\u003e360.0\u003c/td\u003e      \u003ctd\u003e175\u003c/td\u003e      \u003ctd\u003e3.15\u003c/td\u003e      \u003ctd\u003e3.440\u003c/td\u003e\n\u003ctd\u003e17.02\u003c/td\u003e      \u003ctd\u003e0\u003c/td\u003e      \u003ctd\u003e0\u003c/td\u003e      \u003ctd\u003e3\u003c/td\u003e      \u003ctd\u003e2\u003c/td\u003e\n\u003c/tr\u003e  \u003c/tbody\u003e\u003c/table\u003e\n\u003ch1 id=\"you-try-it\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eYou try it!\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eCrack open ipython and make a dataframe, then \u003ccode\u003edf.to_html(classes=[\u0026quot;table table-bordered table-dark\u0026quot;])\u003c/code\u003e, copy the output (minus the quote marks ipython uses to denote the string type) that into \u003ccode\u003emy-file.html\u003c/code\u003e, open that up in a browser and be amazed!\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eFor added effeciency try using pyperclip to copy the output right to your clipboard!\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003ccode\u003epip install pyperclip\u003c/code\u003e and then \u003ccode\u003epyperclip.copy(df.to_html(classes=[\u0026quot;table table-bordered table-dark\u0026quot;]))\u003c/code\u003e\u003c/p\u003e\n",
      "content_text": "\nI wrote up a little on exporting DataFrames to markdown and html [here](/dataframe-to-markdown)\n\nBut I've been playing with a web app for with lists and while I'm toying around I learned you can actually give your tables some style with some simple css classes! \n\n# To HTML\n\nReminder that if you have a dataframe, `df`, you can `df.to_html()` to get an HTML table of your dataframe.\n\nWell you can pass some `classes` to make it look super nice!\n\n# Classes and CSS\n\nI don't know anything really about CSS so I won't pretend otherwise, but as I was learning about bootstrap that's where I stumbled upon this...\n\nThere are several classes you can pass but I found really good luck with `table-bordered` and `table-dark` for my use case\n\n`df.to_html(classes=[\"table table-bordered table-dark\"])`\n\n\u003ctable border=\"1\" class=\"dataframe table table-bordered table-dark\"\u003e  \u003cthead\u003e\n\u003ctr style=\"text-align: right;\"\u003e      \u003cth\u003eUnnamed: 0\u003c/th\u003e      \u003cth\u003empg\u003c/th\u003e\n\u003cth\u003ecyl\u003c/th\u003e      \u003cth\u003edisp\u003c/th\u003e      \u003cth\u003ehp\u003c/th\u003e      \u003cth\u003edrat\u003c/th\u003e\n\u003cth\u003ewt\u003c/th\u003e      \u003cth\u003eqsec\u003c/th\u003e      \u003cth\u003evs\u003c/th\u003e      \u003cth\u003eam\u003c/th\u003e\n\u003cth\u003egear\u003c/th\u003e      \u003cth\u003ecarb\u003c/th\u003e    \u003c/tr\u003e  \u003c/thead\u003e  \u003ctbody\u003e    \u003ctr\u003e\n\u003ctd\u003eMazda RX4\u003c/td\u003e      \u003ctd\u003e21.0\u003c/td\u003e      \u003ctd\u003e6\u003c/td\u003e      \u003ctd\u003e160.0\u003c/td\u003e\n\u003ctd\u003e110\u003c/td\u003e      \u003ctd\u003e3.90\u003c/td\u003e      \u003ctd\u003e2.620\u003c/td\u003e      \u003ctd\u003e16.46\u003c/td\u003e\n\u003ctd\u003e0\u003c/td\u003e      \u003ctd\u003e1\u003c/td\u003e      \u003ctd\u003e4\u003c/td\u003e      \u003ctd\u003e4\u003c/td\u003e    \u003c/tr\u003e    \u003ctr\u003e\n\u003ctd\u003eMazda RX4 Wag\u003c/td\u003e      \u003ctd\u003e21.0\u003c/td\u003e      \u003ctd\u003e6\u003c/td\u003e      \u003ctd\u003e160.0\u003c/td\u003e\n\u003ctd\u003e110\u003c/td\u003e      \u003ctd\u003e3.90\u003c/td\u003e      \u003ctd\u003e2.875\u003c/td\u003e      \u003ctd\u003e17.02\u003c/td\u003e\n\u003ctd\u003e0\u003c/td\u003e      \u003ctd\u003e1\u003c/td\u003e      \u003ctd\u003e4\u003c/td\u003e      \u003ctd\u003e4\u003c/td\u003e    \u003c/tr\u003e    \u003ctr\u003e\n\u003ctd\u003eDatsun 710\u003c/td\u003e      \u003ctd\u003e22.8\u003c/td\u003e      \u003ctd\u003e4\u003c/td\u003e      \u003ctd\u003e108.0\u003c/td\u003e\n\u003ctd\u003e93\u003c/td\u003e      \u003ctd\u003e3.85\u003c/td\u003e      \u003ctd\u003e2.320\u003c/td\u003e      \u003ctd\u003e18.61\u003c/td\u003e\n\u003ctd\u003e1\u003c/td\u003e      \u003ctd\u003e1\u003c/td\u003e      \u003ctd\u003e4\u003c/td\u003e      \u003ctd\u003e1\u003c/td\u003e    \u003c/tr\u003e    \u003ctr\u003e\n\u003ctd\u003eHornet 4 Drive\u003c/td\u003e      \u003ctd\u003e21.4\u003c/td\u003e      \u003ctd\u003e6\u003c/td\u003e      \u003ctd\u003e258.0\u003c/td\u003e\n\u003ctd\u003e110\u003c/td\u003e      \u003ctd\u003e3.08\u003c/td\u003e      \u003ctd\u003e3.215\u003c/td\u003e      \u003ctd\u003e19.44\u003c/td\u003e\n\u003ctd\u003e1\u003c/td\u003e      \u003ctd\u003e0\u003c/td\u003e      \u003ctd\u003e3\u003c/td\u003e      \u003ctd\u003e1\u003c/td\u003e    \u003c/tr\u003e    \u003ctr\u003e\n\u003ctd\u003eHornet Sportabout\u003c/td\u003e      \u003ctd\u003e18.7\u003c/td\u003e      \u003ctd\u003e8\u003c/td\u003e\n\u003ctd\u003e360.0\u003c/td\u003e      \u003ctd\u003e175\u003c/td\u003e      \u003ctd\u003e3.15\u003c/td\u003e      \u003ctd\u003e3.440\u003c/td\u003e\n\u003ctd\u003e17.02\u003c/td\u003e      \u003ctd\u003e0\u003c/td\u003e      \u003ctd\u003e0\u003c/td\u003e      \u003ctd\u003e3\u003c/td\u003e      \u003ctd\u003e2\u003c/td\u003e\n\u003c/tr\u003e  \u003c/tbody\u003e\u003c/table\u003e\n\n\n# You try it!\n\nCrack open ipython and make a dataframe, then `df.to_html(classes=[\"table table-bordered table-dark\"])`, copy the output (minus the quote marks ipython uses to denote the string type) that into `my-file.html`, open that up in a browser and be amazed!\n\n\u003e For added effeciency try using pyperclip to copy the output right to your clipboard!\n\n`pip install pyperclip` and then `pyperclip.copy(df.to_html(classes=[\"table table-bordered table-dark\"]))`\n",
      "summary": "I wrote up a little on exporting DataFrames to markdown and html here",
      "date_published": "2022-05-07T00:00:00Z",
      "date_modified": "2022-05-07T00:00:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "python",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/dataframe-to-markdown/",
      "url": "https://pype.dev/dataframe-to-markdown/",
      "title": "Dataframe-To-Markdown",
      "content_html": "\u003ch1 id=\"pandas\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePandas\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003e\u003ccode\u003epandas.DataFrame\u003c/code\u003es are pretty sweet data structures in Python.\u003c/p\u003e\n\u003cp\u003eI do a lot of work with tabular data and one thing I have incorporated into some of that work is automatic data summary reports by throwing the first few, or several relevant, rows of a dataframe at a point in a pipeline into a markdown file.\u003c/p\u003e\n\u003cp\u003ePandas has a method on DataFrames that makes this 100% trivial!\u003c/p\u003e\n\u003ch1 id=\"the-method\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThe Method\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eSay we have a dataframe, \u003ccode\u003edf\u003c/code\u003e\u0026hellip; then it\u0026rsquo;s literally just: \u003ccode\u003edf.to_markdown()\u003c/code\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e❯\u003c/span\u003e \u003cspan class=\"n\"\u003edf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ehead\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"n\"\u003eUnnamed\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e   \u003cspan class=\"n\"\u003empg\u003c/span\u003e  \u003cspan class=\"n\"\u003ecyl\u003c/span\u003e   \u003cspan class=\"n\"\u003edisp\u003c/span\u003e   \u003cspan class=\"n\"\u003ehp\u003c/span\u003e  \u003cspan class=\"n\"\u003edrat\u003c/span\u003e     \u003cspan class=\"n\"\u003ewt\u003c/span\u003e   \u003cspan class=\"n\"\u003eqsec\u003c/span\u003e  \u003cspan class=\"n\"\u003evs\u003c/span\u003e  \u003cspan class=\"n\"\u003eam\u003c/span\u003e  \u003cspan class=\"n\"\u003egear\u003c/span\u003e  \u003cspan class=\"n\"\u003ecarb\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e          \u003cspan class=\"n\"\u003eMazda\u003c/span\u003e \u003cspan class=\"n\"\u003eRX4\u003c/span\u003e  \u003cspan class=\"mf\"\u003e21.0\u003c/span\u003e    \u003cspan class=\"mi\"\u003e6\u003c/span\u003e  \u003cspan class=\"mf\"\u003e160.0\u003c/span\u003e  \u003cspan class=\"mi\"\u003e110\u003c/span\u003e  \u003cspan class=\"mf\"\u003e3.90\u003c/span\u003e  \u003cspan class=\"mf\"\u003e2.620\u003c/span\u003e  \u003cspan class=\"mf\"\u003e16.46\u003c/span\u003e   \u003cspan class=\"mi\"\u003e0\u003c/span\u003e   \u003cspan class=\"mi\"\u003e1\u003c/span\u003e     \u003cspan class=\"mi\"\u003e4\u003c/span\u003e     \u003cspan class=\"mi\"\u003e4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e      \u003cspan class=\"n\"\u003eMazda\u003c/span\u003e \u003cspan class=\"n\"\u003eRX4\u003c/span\u003e \u003cspan class=\"n\"\u003eWag\u003c/span\u003e  \u003cspan class=\"mf\"\u003e21.0\u003c/span\u003e    \u003cspan class=\"mi\"\u003e6\u003c/span\u003e  \u003cspan class=\"mf\"\u003e160.0\u003c/span\u003e  \u003cspan class=\"mi\"\u003e110\u003c/span\u003e  \u003cspan class=\"mf\"\u003e3.90\u003c/span\u003e  \u003cspan class=\"mf\"\u003e2.875\u003c/span\u003e  \u003cspan class=\"mf\"\u003e17.02\u003c/span\u003e   \u003cspan class=\"mi\"\u003e0\u003c/span\u003e   \u003cspan class=\"mi\"\u003e1\u003c/span\u003e     \u003cspan class=\"mi\"\u003e4\u003c/span\u003e     \u003cspan class=\"mi\"\u003e4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e         \u003cspan class=\"n\"\u003eDatsun\u003c/span\u003e \u003cspan class=\"mi\"\u003e710\u003c/span\u003e  \u003cspan class=\"mf\"\u003e22.8\u003c/span\u003e    \u003cspan class=\"mi\"\u003e4\u003c/span\u003e  \u003cspan class=\"mf\"\u003e108.0\u003c/span\u003e   \u003cspan class=\"mi\"\u003e93\u003c/span\u003e  \u003cspan class=\"mf\"\u003e3.85\u003c/span\u003e  \u003cspan class=\"mf\"\u003e2.320\u003c/span\u003e  \u003cspan class=\"mf\"\u003e18.61\u003c/span\u003e   \u003cspan class=\"mi\"\u003e1\u003c/span\u003e   \u003cspan class=\"mi\"\u003e1\u003c/span\u003e     \u003cspan class=\"mi\"\u003e4\u003c/span\u003e     \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"mi\"\u003e3\u003c/span\u003e     \u003cspan class=\"n\"\u003eHornet\u003c/span\u003e \u003cspan class=\"mi\"\u003e4\u003c/span\u003e \u003cspan class=\"n\"\u003eDrive\u003c/span\u003e  \u003cspan class=\"mf\"\u003e21.4\u003c/span\u003e    \u003cspan class=\"mi\"\u003e6\u003c/span\u003e  \u003cspan class=\"mf\"\u003e258.0\u003c/span\u003e  \u003cspan class=\"mi\"\u003e110\u003c/span\u003e  \u003cspan class=\"mf\"\u003e3.08\u003c/span\u003e  \u003cspan class=\"mf\"\u003e3.215\u003c/span\u003e  \u003cspan class=\"mf\"\u003e19.44\u003c/span\u003e   \u003cspan class=\"mi\"\u003e1\u003c/span\u003e   \u003cspan class=\"mi\"\u003e0\u003c/span\u003e     \u003cspan class=\"mi\"\u003e3\u003c/span\u003e     \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"mi\"\u003e4\u003c/span\u003e  \u003cspan class=\"n\"\u003eHornet\u003c/span\u003e \u003cspan class=\"n\"\u003eSportabout\u003c/span\u003e  \u003cspan class=\"mf\"\u003e18.7\u003c/span\u003e    \u003cspan class=\"mi\"\u003e8\u003c/span\u003e  \u003cspan class=\"mf\"\u003e360.0\u003c/span\u003e  \u003cspan class=\"mi\"\u003e175\u003c/span\u003e  \u003cspan class=\"mf\"\u003e3.15\u003c/span\u003e  \u003cspan class=\"mf\"\u003e3.440\u003c/span\u003e  \u003cspan class=\"mf\"\u003e17.02\u003c/span\u003e   \u003cspan class=\"mi\"\u003e0\u003c/span\u003e   \u003cspan class=\"mi\"\u003e0\u003c/span\u003e     \u003cspan class=\"mi\"\u003e3\u003c/span\u003e     \u003cspan class=\"mi\"\u003e2\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\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eIn ipython I can call the method and get a markdown table back as a string\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\"\u003e\u003cspan class=\"n\"\u003emental\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003edata\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003elake\u003c/span\u003e \u003cspan class=\"err\"\u003e\u003c/span\u003e  \u003cspan class=\"n\"\u003enew\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eposts\u003c/span\u003e \u003cspan class=\"n\"\u003evia\u003c/span\u003e \u003cspan class=\"mf\"\u003e3.8.11\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003emental\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003edata\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003elake\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eipython\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e❯\u003c/span\u003e \u003cspan class=\"n\"\u003edf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ehead\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eto_markdown\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=\"s1\"\u003e\u0026#39;|    | Unnamed: 0        |   mpg |   cyl |   disp |   hp |   drat |    wt |   qsec |   vs |   am |   gear |   carb |\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s1\"\u003e|---:|:------------------|------:|------:|-------:|-----:|-------:|------:|-------:|-----:|-----:|-------:|-------:|\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s1\"\u003e|  0 | Mazda RX4         |  21   |     6 |    160 |  110 |   3.9  | 2.62  |  16.46 |    0 |    1 |      4 |      4 |\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s1\"\u003e|  1 | Mazda RX4 Wag     |  21   |     6 |    160 |  110 |   3.9  | 2.875 |  17.02 |    0 |    1 |      4 |      4 |\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s1\"\u003e|  2 | Datsun 710        |  22.8 |     4 |    108 |   93 |   3.85 | 2.32  |  18.61 |    1 |    1 |      4 |      1 |\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s1\"\u003e|  3 | Hornet 4 Drive    |  21.4 |     6 |    258 |  110 |   3.08 | 3.215 |  19.44 |    1 |    0 |      3 |      1 |\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s1\"\u003e|  4 | Hornet Sportabout |  18.7 |     8 |    360 |  175 |   3.15 | 3.44  |  17.02 |    0 |    0 |      3 |      2 |\u0026#39;\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\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eYou can drop that string into a markdown file and using any reader that supports the rendering you\u0026rsquo;ll have a nicely formated table of example data in whatever report you\u0026rsquo;re making!\u003c/p\u003e\n\u003ch1 id=\"bonus-method\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBonus method\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eJust like markdown, you can export a dataframe to html with \u003ccode\u003edf.to_html()\u003c/code\u003e and use that if it\u0026rsquo;s more appropriate for your use case:\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\"\u003e\u0026#39;\u0026lt;table border=\u0026#34;1\u0026#34; class=\u0026#34;dataframe\u0026#34;\u0026gt;\\n  \u0026lt;thead\u0026gt;\\n    \u0026lt;tr style=\u0026#34;text-align: right;\u0026#34;\u0026gt;\\n      \u0026lt;th\u0026gt;\u0026lt;/th\u0026gt;\\n      \u0026lt;th\u0026gt;Unnamed: 0\u0026lt;/th\u0026gt;\\n      \u0026lt;th\u0026gt;mpg\u0026lt;/th\u0026gt;\\n      \u0026lt;th\u0026gt;cyl\u0026lt;/th\u0026gt;\\n      \u0026lt;th\u0026gt;disp\u0026lt;/th\u0026gt;\\n      \u0026lt;th\u0026gt;hp\u0026lt;/th\u0026gt;\\n      \u0026lt;th\u0026gt;drat\u0026lt;/th\u0026gt;\\n      \u0026lt;th\u0026gt;wt\u0026lt;/th\u0026gt;\\n      \u0026lt;th\u0026gt;qsec\u0026lt;/th\u0026gt;\\n      \u0026lt;th\u0026gt;vs\u0026lt;/th\u0026gt;\\n      \u0026lt;th\u0026gt;am\u0026lt;/th\u0026gt;\\n      \u0026lt;th\u0026gt;gear\u0026lt;/th\u0026gt;\\n      \u0026lt;th\u0026gt;carb\u0026lt;/th\u0026gt;\\n    \u0026lt;/tr\u0026gt;\\n  \u0026lt;/thead\u0026gt;\\n  \u0026lt;tbody\u0026gt;\\n    \u0026lt;tr\u0026gt;\\n      \u0026lt;th\u0026gt;0\u0026lt;/th\u0026gt;\\n      \u0026lt;td\u0026gt;Mazda RX4\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;21.0\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;6\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;160.0\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;110\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;3.90\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;2.620\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;16.46\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;0\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;1\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;4\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;4\u0026lt;/td\u0026gt;\\n    \u0026lt;/tr\u0026gt;\\n    \u0026lt;tr\u0026gt;\\n      \u0026lt;th\u0026gt;1\u0026lt;/th\u0026gt;\\n      \u0026lt;td\u0026gt;Mazda RX4 Wag\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;21.0\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;6\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;160.0\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;110\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;3.90\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;2.875\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;17.02\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;0\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;1\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;4\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;4\u0026lt;/td\u0026gt;\\n    \u0026lt;/tr\u0026gt;\\n    \u0026lt;tr\u0026gt;\\n      \u0026lt;th\u0026gt;2\u0026lt;/th\u0026gt;\\n      \u0026lt;td\u0026gt;Datsun 710\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;22.8\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;4\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;108.0\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;93\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;3.85\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;2.320\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;18.61\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;1\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;1\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;4\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;1\u0026lt;/td\u0026gt;\\n    \u0026lt;/tr\u0026gt;\\n    \u0026lt;tr\u0026gt;\\n      \u0026lt;th\u0026gt;3\u0026lt;/th\u0026gt;\\n      \u0026lt;td\u0026gt;Hornet 4 Drive\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;21.4\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;6\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;258.0\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;110\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;3.08\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;3.215\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;19.44\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;1\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;0\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;3\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;1\u0026lt;/td\u0026gt;\\n    \u0026lt;/tr\u0026gt;\\n    \u0026lt;tr\u0026gt;\\n      \u0026lt;th\u0026gt;4\u0026lt;/th\u0026gt;\\n      \u0026lt;td\u0026gt;Hornet Sportabout\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;18.7\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;8\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;360.0\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;175\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;3.15\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;3.440\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;17.02\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;0\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;0\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;3\u0026lt;/td\u0026gt;\\n      \u0026lt;td\u0026gt;2\u0026lt;/td\u0026gt;\\n    \u0026lt;/tr\u0026gt;\\n  \u0026lt;/tbody\u0026gt;\\n\u0026lt;/table\u0026gt;\u0026#39;\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\u003eMy blog will render that html into a nice table! (After removing new line characters)\u003c/p\u003e\n\u003ctable border=\"1\" class=\"dataframe\"\u003e  \u003cthead\u003e    \u003ctr style=\"text-align: right;\"\u003e      \u003cth\u003eUnnamed: 0\u003c/th\u003e      \u003cth\u003empg\u003c/th\u003e      \u003cth\u003ecyl\u003c/th\u003e      \u003cth\u003edisp\u003c/th\u003e      \u003cth\u003ehp\u003c/th\u003e      \u003cth\u003edrat\u003c/th\u003e      \u003cth\u003ewt\u003c/th\u003e      \u003cth\u003eqsec\u003c/th\u003e      \u003cth\u003evs\u003c/th\u003e      \u003cth\u003eam\u003c/th\u003e      \u003cth\u003egear\u003c/th\u003e      \u003cth\u003ecarb\u003c/th\u003e    \u003c/tr\u003e  \u003c/thead\u003e  \u003ctbody\u003e    \u003ctr\u003e      \u003ctd\u003eMazda RX4\u003c/td\u003e      \u003ctd\u003e21.0\u003c/td\u003e      \u003ctd\u003e6\u003c/td\u003e      \u003ctd\u003e160.0\u003c/td\u003e      \u003ctd\u003e110\u003c/td\u003e      \u003ctd\u003e3.90\u003c/td\u003e      \u003ctd\u003e2.620\u003c/td\u003e      \u003ctd\u003e16.46\u003c/td\u003e      \u003ctd\u003e0\u003c/td\u003e      \u003ctd\u003e1\u003c/td\u003e      \u003ctd\u003e4\u003c/td\u003e      \u003ctd\u003e4\u003c/td\u003e    \u003c/tr\u003e    \u003ctr\u003e      \u003ctd\u003eMazda RX4 Wag\u003c/td\u003e      \u003ctd\u003e21.0\u003c/td\u003e      \u003ctd\u003e6\u003c/td\u003e      \u003ctd\u003e160.0\u003c/td\u003e      \u003ctd\u003e110\u003c/td\u003e      \u003ctd\u003e3.90\u003c/td\u003e      \u003ctd\u003e2.875\u003c/td\u003e      \u003ctd\u003e17.02\u003c/td\u003e      \u003ctd\u003e0\u003c/td\u003e      \u003ctd\u003e1\u003c/td\u003e      \u003ctd\u003e4\u003c/td\u003e      \u003ctd\u003e4\u003c/td\u003e    \u003c/tr\u003e    \u003ctr\u003e      \u003ctd\u003eDatsun 710\u003c/td\u003e      \u003ctd\u003e22.8\u003c/td\u003e      \u003ctd\u003e4\u003c/td\u003e      \u003ctd\u003e108.0\u003c/td\u003e      \u003ctd\u003e93\u003c/td\u003e      \u003ctd\u003e3.85\u003c/td\u003e      \u003ctd\u003e2.320\u003c/td\u003e      \u003ctd\u003e18.61\u003c/td\u003e      \u003ctd\u003e1\u003c/td\u003e      \u003ctd\u003e1\u003c/td\u003e      \u003ctd\u003e4\u003c/td\u003e      \u003ctd\u003e1\u003c/td\u003e    \u003c/tr\u003e    \u003ctr\u003e      \u003ctd\u003eHornet 4 Drive\u003c/td\u003e      \u003ctd\u003e21.4\u003c/td\u003e      \u003ctd\u003e6\u003c/td\u003e      \u003ctd\u003e258.0\u003c/td\u003e      \u003ctd\u003e110\u003c/td\u003e      \u003ctd\u003e3.08\u003c/td\u003e      \u003ctd\u003e3.215\u003c/td\u003e      \u003ctd\u003e19.44\u003c/td\u003e      \u003ctd\u003e1\u003c/td\u003e      \u003ctd\u003e0\u003c/td\u003e      \u003ctd\u003e3\u003c/td\u003e      \u003ctd\u003e1\u003c/td\u003e    \u003c/tr\u003e    \u003ctr\u003e      \u003ctd\u003eHornet Sportabout\u003c/td\u003e      \u003ctd\u003e18.7\u003c/td\u003e      \u003ctd\u003e8\u003c/td\u003e      \u003ctd\u003e360.0\u003c/td\u003e      \u003ctd\u003e175\u003c/td\u003e      \u003ctd\u003e3.15\u003c/td\u003e      \u003ctd\u003e3.440\u003c/td\u003e      \u003ctd\u003e17.02\u003c/td\u003e      \u003ctd\u003e0\u003c/td\u003e      \u003ctd\u003e0\u003c/td\u003e      \u003ctd\u003e3\u003c/td\u003e      \u003ctd\u003e2\u003c/td\u003e    \u003c/tr\u003e  \u003c/tbody\u003e\u003c/table\u003e\n",
      "content_text": "\n# Pandas\n\n`pandas.DataFrame`s are pretty sweet data structures in Python.\n\nI do a lot of work with tabular data and one thing I have incorporated into some of that work is automatic data summary reports by throwing the first few, or several relevant, rows of a dataframe at a point in a pipeline into a markdown file.\n\nPandas has a method on DataFrames that makes this 100% trivial!\n\n# The Method\n\nSay we have a dataframe, `df`... then it's literally just: `df.to_markdown()`\n\n```python\n❯ df.head()\n\n          Unnamed: 0   mpg  cyl   disp   hp  drat     wt   qsec  vs  am  gear  carb\n0          Mazda RX4  21.0    6  160.0  110  3.90  2.620  16.46   0   1     4     4\n1      Mazda RX4 Wag  21.0    6  160.0  110  3.90  2.875  17.02   0   1     4     4\n2         Datsun 710  22.8    4  108.0   93  3.85  2.320  18.61   1   1     4     1\n3     Hornet 4 Drive  21.4    6  258.0  110  3.08  3.215  19.44   1   0     3     1\n4  Hornet Sportabout  18.7    8  360.0  175  3.15  3.440  17.02   0   0     3     2\n\n```\n\nIn ipython I can call the method and get a markdown table back as a string\n\n```python\n\nmental-data-lake   new-posts via 3.8.11(mental-data-lake) ipython\n❯ df.head().to_markdown()\n'|    | Unnamed: 0        |   mpg |   cyl |   disp |   hp |   drat |    wt |   qsec |   vs |   am |   gear |   carb |\\n|---:|:------------------|------:|------:|-------:|-----:|-------:|------:|-------:|-----:|-----:|-------:|-------:|\\n|  0 | Mazda RX4         |  21   |     6 |    160 |  110 |   3.9  | 2.62  |  16.46 |    0 |    1 |      4 |      4 |\\n|  1 | Mazda RX4 Wag     |  21   |     6 |    160 |  110 |   3.9  | 2.875 |  17.02 |    0 |    1 |      4 |      4 |\\n|  2 | Datsun 710        |  22.8 |     4 |    108 |   93 |   3.85 | 2.32  |  18.61 |    1 |    1 |      4 |      1 |\\n|  3 | Hornet 4 Drive    |  21.4 |     6 |    258 |  110 |   3.08 | 3.215 |  19.44 |    1 |    0 |      3 |      1 |\\n|  4 | Hornet Sportabout |  18.7 |     8 |    360 |  175 |   3.15 | 3.44  |  17.02 |    0 |    0 |      3 |      2 |'\n\n```\n\nYou can drop that string into a markdown file and using any reader that supports the rendering you'll have a nicely formated table of example data in whatever report you're making!\n\n# Bonus method\n\nJust like markdown, you can export a dataframe to html with `df.to_html()` and use that if it's more appropriate for your use case:\n\n```text\n\n'\u003ctable border=\"1\" class=\"dataframe\"\u003e\\n  \u003cthead\u003e\\n    \u003ctr style=\"text-align: right;\"\u003e\\n      \u003cth\u003e\u003c/th\u003e\\n      \u003cth\u003eUnnamed: 0\u003c/th\u003e\\n      \u003cth\u003empg\u003c/th\u003e\\n      \u003cth\u003ecyl\u003c/th\u003e\\n      \u003cth\u003edisp\u003c/th\u003e\\n      \u003cth\u003ehp\u003c/th\u003e\\n      \u003cth\u003edrat\u003c/th\u003e\\n      \u003cth\u003ewt\u003c/th\u003e\\n      \u003cth\u003eqsec\u003c/th\u003e\\n      \u003cth\u003evs\u003c/th\u003e\\n      \u003cth\u003eam\u003c/th\u003e\\n      \u003cth\u003egear\u003c/th\u003e\\n      \u003cth\u003ecarb\u003c/th\u003e\\n    \u003c/tr\u003e\\n  \u003c/thead\u003e\\n  \u003ctbody\u003e\\n    \u003ctr\u003e\\n      \u003cth\u003e0\u003c/th\u003e\\n      \u003ctd\u003eMazda RX4\u003c/td\u003e\\n      \u003ctd\u003e21.0\u003c/td\u003e\\n      \u003ctd\u003e6\u003c/td\u003e\\n      \u003ctd\u003e160.0\u003c/td\u003e\\n      \u003ctd\u003e110\u003c/td\u003e\\n      \u003ctd\u003e3.90\u003c/td\u003e\\n      \u003ctd\u003e2.620\u003c/td\u003e\\n      \u003ctd\u003e16.46\u003c/td\u003e\\n      \u003ctd\u003e0\u003c/td\u003e\\n      \u003ctd\u003e1\u003c/td\u003e\\n      \u003ctd\u003e4\u003c/td\u003e\\n      \u003ctd\u003e4\u003c/td\u003e\\n    \u003c/tr\u003e\\n    \u003ctr\u003e\\n      \u003cth\u003e1\u003c/th\u003e\\n      \u003ctd\u003eMazda RX4 Wag\u003c/td\u003e\\n      \u003ctd\u003e21.0\u003c/td\u003e\\n      \u003ctd\u003e6\u003c/td\u003e\\n      \u003ctd\u003e160.0\u003c/td\u003e\\n      \u003ctd\u003e110\u003c/td\u003e\\n      \u003ctd\u003e3.90\u003c/td\u003e\\n      \u003ctd\u003e2.875\u003c/td\u003e\\n      \u003ctd\u003e17.02\u003c/td\u003e\\n      \u003ctd\u003e0\u003c/td\u003e\\n      \u003ctd\u003e1\u003c/td\u003e\\n      \u003ctd\u003e4\u003c/td\u003e\\n      \u003ctd\u003e4\u003c/td\u003e\\n    \u003c/tr\u003e\\n    \u003ctr\u003e\\n      \u003cth\u003e2\u003c/th\u003e\\n      \u003ctd\u003eDatsun 710\u003c/td\u003e\\n      \u003ctd\u003e22.8\u003c/td\u003e\\n      \u003ctd\u003e4\u003c/td\u003e\\n      \u003ctd\u003e108.0\u003c/td\u003e\\n      \u003ctd\u003e93\u003c/td\u003e\\n      \u003ctd\u003e3.85\u003c/td\u003e\\n      \u003ctd\u003e2.320\u003c/td\u003e\\n      \u003ctd\u003e18.61\u003c/td\u003e\\n      \u003ctd\u003e1\u003c/td\u003e\\n      \u003ctd\u003e1\u003c/td\u003e\\n      \u003ctd\u003e4\u003c/td\u003e\\n      \u003ctd\u003e1\u003c/td\u003e\\n    \u003c/tr\u003e\\n    \u003ctr\u003e\\n      \u003cth\u003e3\u003c/th\u003e\\n      \u003ctd\u003eHornet 4 Drive\u003c/td\u003e\\n      \u003ctd\u003e21.4\u003c/td\u003e\\n      \u003ctd\u003e6\u003c/td\u003e\\n      \u003ctd\u003e258.0\u003c/td\u003e\\n      \u003ctd\u003e110\u003c/td\u003e\\n      \u003ctd\u003e3.08\u003c/td\u003e\\n      \u003ctd\u003e3.215\u003c/td\u003e\\n      \u003ctd\u003e19.44\u003c/td\u003e\\n      \u003ctd\u003e1\u003c/td\u003e\\n      \u003ctd\u003e0\u003c/td\u003e\\n      \u003ctd\u003e3\u003c/td\u003e\\n      \u003ctd\u003e1\u003c/td\u003e\\n    \u003c/tr\u003e\\n    \u003ctr\u003e\\n      \u003cth\u003e4\u003c/th\u003e\\n      \u003ctd\u003eHornet Sportabout\u003c/td\u003e\\n      \u003ctd\u003e18.7\u003c/td\u003e\\n      \u003ctd\u003e8\u003c/td\u003e\\n      \u003ctd\u003e360.0\u003c/td\u003e\\n      \u003ctd\u003e175\u003c/td\u003e\\n      \u003ctd\u003e3.15\u003c/td\u003e\\n      \u003ctd\u003e3.440\u003c/td\u003e\\n      \u003ctd\u003e17.02\u003c/td\u003e\\n      \u003ctd\u003e0\u003c/td\u003e\\n      \u003ctd\u003e0\u003c/td\u003e\\n      \u003ctd\u003e3\u003c/td\u003e\\n      \u003ctd\u003e2\u003c/td\u003e\\n    \u003c/tr\u003e\\n  \u003c/tbody\u003e\\n\u003c/table\u003e'\n\n```\n\nMy blog will render that html into a nice table! (After removing new line characters)\n\n\u003ctable border=\"1\" class=\"dataframe\"\u003e  \u003cthead\u003e    \u003ctr style=\"text-align: right;\"\u003e      \u003cth\u003eUnnamed: 0\u003c/th\u003e      \u003cth\u003empg\u003c/th\u003e      \u003cth\u003ecyl\u003c/th\u003e      \u003cth\u003edisp\u003c/th\u003e      \u003cth\u003ehp\u003c/th\u003e      \u003cth\u003edrat\u003c/th\u003e      \u003cth\u003ewt\u003c/th\u003e      \u003cth\u003eqsec\u003c/th\u003e      \u003cth\u003evs\u003c/th\u003e      \u003cth\u003eam\u003c/th\u003e      \u003cth\u003egear\u003c/th\u003e      \u003cth\u003ecarb\u003c/th\u003e    \u003c/tr\u003e  \u003c/thead\u003e  \u003ctbody\u003e    \u003ctr\u003e      \u003ctd\u003eMazda RX4\u003c/td\u003e      \u003ctd\u003e21.0\u003c/td\u003e      \u003ctd\u003e6\u003c/td\u003e      \u003ctd\u003e160.0\u003c/td\u003e      \u003ctd\u003e110\u003c/td\u003e      \u003ctd\u003e3.90\u003c/td\u003e      \u003ctd\u003e2.620\u003c/td\u003e      \u003ctd\u003e16.46\u003c/td\u003e      \u003ctd\u003e0\u003c/td\u003e      \u003ctd\u003e1\u003c/td\u003e      \u003ctd\u003e4\u003c/td\u003e      \u003ctd\u003e4\u003c/td\u003e    \u003c/tr\u003e    \u003ctr\u003e      \u003ctd\u003eMazda RX4 Wag\u003c/td\u003e      \u003ctd\u003e21.0\u003c/td\u003e      \u003ctd\u003e6\u003c/td\u003e      \u003ctd\u003e160.0\u003c/td\u003e      \u003ctd\u003e110\u003c/td\u003e      \u003ctd\u003e3.90\u003c/td\u003e      \u003ctd\u003e2.875\u003c/td\u003e      \u003ctd\u003e17.02\u003c/td\u003e      \u003ctd\u003e0\u003c/td\u003e      \u003ctd\u003e1\u003c/td\u003e      \u003ctd\u003e4\u003c/td\u003e      \u003ctd\u003e4\u003c/td\u003e    \u003c/tr\u003e    \u003ctr\u003e      \u003ctd\u003eDatsun 710\u003c/td\u003e      \u003ctd\u003e22.8\u003c/td\u003e      \u003ctd\u003e4\u003c/td\u003e      \u003ctd\u003e108.0\u003c/td\u003e      \u003ctd\u003e93\u003c/td\u003e      \u003ctd\u003e3.85\u003c/td\u003e      \u003ctd\u003e2.320\u003c/td\u003e      \u003ctd\u003e18.61\u003c/td\u003e      \u003ctd\u003e1\u003c/td\u003e      \u003ctd\u003e1\u003c/td\u003e      \u003ctd\u003e4\u003c/td\u003e      \u003ctd\u003e1\u003c/td\u003e    \u003c/tr\u003e    \u003ctr\u003e      \u003ctd\u003eHornet 4 Drive\u003c/td\u003e      \u003ctd\u003e21.4\u003c/td\u003e      \u003ctd\u003e6\u003c/td\u003e      \u003ctd\u003e258.0\u003c/td\u003e      \u003ctd\u003e110\u003c/td\u003e      \u003ctd\u003e3.08\u003c/td\u003e      \u003ctd\u003e3.215\u003c/td\u003e      \u003ctd\u003e19.44\u003c/td\u003e      \u003ctd\u003e1\u003c/td\u003e      \u003ctd\u003e0\u003c/td\u003e      \u003ctd\u003e3\u003c/td\u003e      \u003ctd\u003e1\u003c/td\u003e    \u003c/tr\u003e    \u003ctr\u003e      \u003ctd\u003eHornet Sportabout\u003c/td\u003e      \u003ctd\u003e18.7\u003c/td\u003e      \u003ctd\u003e8\u003c/td\u003e      \u003ctd\u003e360.0\u003c/td\u003e      \u003ctd\u003e175\u003c/td\u003e      \u003ctd\u003e3.15\u003c/td\u003e      \u003ctd\u003e3.440\u003c/td\u003e      \u003ctd\u003e17.02\u003c/td\u003e      \u003ctd\u003e0\u003c/td\u003e      \u003ctd\u003e0\u003c/td\u003e      \u003ctd\u003e3\u003c/td\u003e      \u003ctd\u003e2\u003c/td\u003e    \u003c/tr\u003e  \u003c/tbody\u003e\u003c/table\u003e\n",
      "summary": "s are pretty sweet data structures in Python.",
      "date_published": "2022-05-07T00:00:00Z",
      "date_modified": "2022-05-07T00:00:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "python",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/wish-list-with-fastapi/",
      "url": "https://pype.dev/wish-list-with-fastapi/",
      "title": "Wish-List-With-Fastapi",
      "content_html": "\u003cp\u003eAmazon has crossed the line with me just one too many times now so we are looking to drop them like every other Big Tech provider\u0026hellip;.\u003c/p\u003e\n\u003cp\u003eHowever, one key feature of Amazon that has been so useful for us is Lists\u0026hellip; We can just maintain a list for each of us and then family members can login anytime and check it out\u0026hellip;\nThis really alleviates any last minute gift idea stress right before a birthday or something.\u003c/p\u003e\n\u003cp\u003eSo I need a nice gift list service but I don\u0026rsquo;t want to be locked into one company (like a Target registry or something) and I\u0026rsquo;d like to host it myself\u003c/p\u003e\n\u003cp\u003eThe internets had a few options but nothing looked/felt like I wanted to I decided to build my own.\u003c/p\u003e\n\u003ch1 id=\"the-frontend\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThe Frontend\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003e\u003cstrong\u003eI have no idea how to do front end so stay tuned\u003c/strong\u003e\u003c/p\u003e\n\u003ch1 id=\"the-backend\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThe Backend\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eFastAPI for the win on this one\u0026hellip; I followed a few examples online and what I was able to build in just a few minutes is pretty impressive thanks to the design of FastAPI.\u003c/p\u003e\n\u003cp\u003eSome key features are:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eAuto doc generation\u003c/li\u003e\n\u003cli\u003eRequired typing (which makes #1 possible)\u003c/li\u003e\n\u003cli\u003eBuilt-in api testing in the browser\u003c/li\u003e\n\u003cli\u003eEasy integration with sqlalchemy\u003c/li\u003e\n\u003cli\u003eDevelopment time so short you won\u0026rsquo;t be done with your coffee before having something up and running!\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"database\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDatabase\u003c/span\u003e \u003ca href=\"#database\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eStarting with a simple \u003ccode\u003edatabase.py\u003c/code\u003e we can create a sqlalchemy session with a base model with about 7 lines of code\u0026hellip;\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\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003esqlalchemy\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003ecreate_engine\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003esqlalchemy.ext.declarative\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003edeclarative_base\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003esqlalchemy.orm\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003esessionmaker\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eSQLALCHEMY_DATABASE_URL\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;sqlite:///wishes.sqlite3\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eengine\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ecreate_engine\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eSQLALCHEMY_DATABASE_URL\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=\"n\"\u003eSessionLocal\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003esessionmaker\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eautocommit\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"kc\"\u003eFalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eautoflush\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"kc\"\u003eFalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ebind\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003eengine\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=\"n\"\u003eBase\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003edeclarative_base\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"model\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eModel\u003c/span\u003e \u003ca href=\"#model\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eFor my wish list I needed just a simple table:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth style=\"text-align:right\"\u003eid\u003c/th\u003e\n\u003cth style=\"text-align:left\"\u003eperson\u003c/th\u003e\n\u003cth style=\"text-align:left\"\u003eitem\u003c/th\u003e\n\u003cth style=\"text-align:left\"\u003elink\u003c/th\u003e\n\u003cth style=\"text-align:left\"\u003epurchased\u003c/th\u003e\n\u003cth style=\"text-align:left\"\u003epurchased_by\u003c/th\u003e\n\u003cth style=\"text-align:left\"\u003edate_added\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"text-align:right\"\u003e1\u003c/td\u003e\n\u003ctd style=\"text-align:left\"\u003epypeaday\u003c/td\u003e\n\u003ctd style=\"text-align:left\"\u003eA sweet item\u003c/td\u003e\n\u003ctd style=\"text-align:left\"\u003e\u003ca href=\"http://www.mystore.store\"\u003ewww.mystore.store\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align:left\"\u003eFalse\u003c/td\u003e\n\u003ctd style=\"text-align:left\"\u003edad\u003c/td\u003e\n\u003ctd style=\"text-align:left\"\u003e2022-05-05 21:55:09\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"text-align:right\"\u003e2\u003c/td\u003e\n\u003ctd style=\"text-align:left\"\u003epypeaday\u003c/td\u003e\n\u003ctd style=\"text-align:left\"\u003eA bitter item\u003c/td\u003e\n\u003ctd style=\"text-align:left\"\u003e\u003ca href=\"http://www.bitterstore.com\"\u003ewww.bitterstore.com\u003c/a\u003e\u003c/td\u003e\n\u003ctd style=\"text-align:left\"\u003eTrue\u003c/td\u003e\n\u003ctd style=\"text-align:left\"\u003eMrs. pypeaday\u003c/td\u003e\n\u003ctd style=\"text-align:left\"\u003e2022-05-06 06:55:54\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eThe table is simple enough\u0026hellip; A unique key, the person who the wish belongs to, the item (or wish), a link to the item, whether it\u0026rsquo;s been purchased or not and by whom, and the date it was added.\u003c/p\u003e\n\u003cp\u003eTo make this model with sqlalchemy we can make a \u003ccode\u003emodel.py\u003c/code\u003e like so:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003edatabase\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eBase\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003esqlalchemy.schema\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eColumn\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003esqlalchemy.types\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eBoolean\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eInteger\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eText\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003eWishes\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eBase\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=\"n\"\u003e__tablename__\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Wishes\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eid\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eColumn\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eInteger\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eprimary_key\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"kc\"\u003eTrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eindex\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"kc\"\u003eTrue\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=\"n\"\u003eperson\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eColumn\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e20\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=\"n\"\u003eitem\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eColumn\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eText\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=\"n\"\u003elink\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eColumn\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eText\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=\"n\"\u003epurchased\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eColumn\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eBoolean\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=\"n\"\u003epurchased_by\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eColumn\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e90\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=\"n\"\u003edate_added\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eColumn\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e15\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"schema\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSchema\u003c/span\u003e \u003ca href=\"#schema\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eOne of the best things about FastAPI is trivial integration with pydantic.\nWe can define a schema to ensure any data posted is not missing anything!\u003c/p\u003e\n\u003cp\u003eMake a \u003ccode\u003eschema.py\u003c/code\u003e with the following:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003epydantic\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eBaseModel\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"nn\"\u003etime\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003etyping\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eOptional\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003ewish_schema\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eBaseModel\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eperson\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003estr\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eitem\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003estr\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003elink\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003estr\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003epurchased\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003ebool\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003eFalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003epurchased_by\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eOptional\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nb\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003eNone\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003edate_added\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eOptional\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nb\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003etime\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estrftime\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;%Y-%m-\u003c/span\u003e\u003cspan class=\"si\"\u003e%d\u003c/span\u003e\u003cspan class=\"s2\"\u003e %H:%M:%S\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003etime\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003elocaltime\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003eConfig\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=\"n\"\u003eorm_mode\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003eTrue\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003epatch_schema\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eBaseModel\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003epurchased\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003ebool\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003epurchased_by\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eOptional\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nb\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003eNone\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=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003eConfig\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=\"n\"\u003eorm_mode\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003eTrue\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\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eI have 2 schemas - one for a \u003ccode\u003ewish\u003c/code\u003e which you\u0026rsquo;ll see down below is used to validate any \u003ccode\u003epost\u003c/code\u003e requests.\u003c/p\u003e\n\u003cp\u003eTo simplify things for me I made another schema, \u003ccode\u003epatch_schema\u003c/code\u003e which I use for the route that updates the table (ie. marking an existing wish as purchased)\u003c/p\u003e\n\u003ch2 id=\"session\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSession\u003c/span\u003e \u003ca href=\"#session\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eOne of the last things we need is a Session\u003c/p\u003e\n\u003cp\u003eSo make a \u003ccode\u003esession.py\u003c/code\u003e\u0026hellip;\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003edatabase\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eSessionLocal\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eengine\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"nn\"\u003emodel\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=\"n\"\u003emodel\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eBase\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003emetadata\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecreate_all\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ebind\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003eengine\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\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=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003ecreate_get_session\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\"\u003etry\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=\"n\"\u003edb\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eSessionLocal\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\"\u003eyield\u003c/span\u003e \u003cspan class=\"n\"\u003edb\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efinally\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=\"n\"\u003edb\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eclose\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOur routes will depend on this \u003ccode\u003ecreate_get_session\u003c/code\u003e function that will yield a \u003ccode\u003edb\u003c/code\u003e object through which we\u0026rsquo;ll udpate our database\u003c/p\u003e\n\u003ch1 id=\"ok-just-do-it-already\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOk just do it already!\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eSo our \u003ccode\u003emain.py\u003c/code\u003e will have a few routes in it\u0026hellip;\u003c/p\u003e\n\u003cp\u003eWhat do we want to support?\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eGetting all wishes\u003c/li\u003e\n\u003cli\u003eGetting a specific wish\u003c/li\u003e\n\u003cli\u003eUpdating a specific wish\u003c/li\u003e\n\u003cli\u003eDeleting a wish\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eI think the script is fairly self explanatory but here\u0026rsquo;s a few notes\u0026hellip;\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eWe decorate each function with \u003ccode\u003e@app.\u0026lt;method\u0026gt;\u003c/code\u003e and define \u003ccode\u003eresponse_model\u003c/code\u003e as well as \u003ccode\u003estatus_code\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eThe functions are defined with \u003ccode\u003easync\u003c/code\u003e (this was my first exposure to this so I can\u0026rsquo;t go in depth on it yet)\u003c/li\u003e\n\u003cli\u003eThe functions all take a \u003ccode\u003edb\u003c/code\u003e which is from \u003ccode\u003esession.py\u003c/code\u003e and that \u003ccode\u003edb\u003c/code\u003e depends on the \u003ccode\u003ecreate_get_session\u003c/code\u003e function\u003c/li\u003e\n\u003cli\u003eIf the db is being updtes then we type the object used for the update with the appropriate schema (either \u003ccode\u003ewish_schema\u003c/code\u003e or \u003ccode\u003epatch_schema\u003c/code\u003e)\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eFrom there we\u0026rsquo;re in true python-land where you can basically guess the methods on \u003ccode\u003edb\u003c/code\u003e and you\u0026rsquo;d probably be right\u0026hellip; (like \u003ccode\u003equery\u003c/code\u003e, \u003ccode\u003eupddate\u003c/code\u003e, \u003ccode\u003edelete\u003c/code\u003e etc.)\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003efastapi\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eFastAPI\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eDepends\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eHTTPException\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003esqlalchemy.orm\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eSession\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003etyping\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eList\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003emodel\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eWishes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003eschema\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003ewish_schema\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003epatch_schema\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003esession\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003ecreate_get_session\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=\"n\"\u003eapp\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eFastAPI\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\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=\"nd\"\u003e@app.get\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/\u0026#34;\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\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003eread_root\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\"\u003ereturn\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;message\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;server is up!\u0026#34;\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\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=\"nd\"\u003e@app.get\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/wishes\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eresponse_model\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003eList\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ewish_schema\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"n\"\u003estatus_code\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e200\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\"\u003easync\u003c/span\u003e \u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003eread_wishes\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eSession\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eDepends\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecreate_get_session\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=\"n\"\u003ewishes\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003edb\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003equery\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eWishes\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eall\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\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003ewishes\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nd\"\u003e@app.post\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/wishes\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eresponse_model\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003ewish_schema\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003estatus_code\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e201\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\"\u003easync\u003c/span\u003e \u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003eadd_wish\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ewish\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003ewish_schema\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eSession\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eDepends\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecreate_get_session\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=\"n\"\u003enew_wish\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eWishes\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=\"n\"\u003eperson\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003ewish\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eperson\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=\"n\"\u003eitem\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003ewish\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eitem\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=\"n\"\u003elink\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003ewish\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003elink\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=\"n\"\u003epurchased\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003ewish\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epurchased\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=\"n\"\u003epurchased_by\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003ewish\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epurchased_by\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=\"n\"\u003edate_added\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003ewish\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003edate_added\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    \u003cspan class=\"n\"\u003edb\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eadd\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003enew_wish\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=\"n\"\u003edb\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecommit\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003enew_wish\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nd\"\u003e@app.get\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/wishes/\u003c/span\u003e\u003cspan class=\"si\"\u003e{id}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eresponse_model\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003ewish_schema\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003estatus_code\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e200\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\"\u003easync\u003c/span\u003e \u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003eget_wish\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003eint\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eSession\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eDepends\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecreate_get_session\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=\"n\"\u003ewish\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003edb\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003equery\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eWishes\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003eid\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\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003ewish\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nd\"\u003e@app.patch\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/wishes/\u003c/span\u003e\u003cspan class=\"si\"\u003e{id}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eresponse_model\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003ewish_schema\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003estatus_code\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e200\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\"\u003easync\u003c/span\u003e \u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003eupdate_wish\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=\"nb\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003eint\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003epatch\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003epatch_schema\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eSession\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eDepends\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecreate_get_session\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    \u003cspan class=\"n\"\u003edb_wish\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003edb\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003equery\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eWishes\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003eid\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=\"n\"\u003edb_wish\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epurchased\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003epatch\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epurchased\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003edb_wish\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epurchased_by\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003epatch\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epurchased_by\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003edb\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecommit\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=\"n\"\u003edb\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003erefresh\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edb_wish\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003edb_wish\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nd\"\u003e@app.delete\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/wishes/\u003c/span\u003e\u003cspan class=\"si\"\u003e{id}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003estatus_code\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e200\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\"\u003easync\u003c/span\u003e \u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003edelete_wish\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003eint\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eSession\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eDepends\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecreate_get_session\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=\"n\"\u003edb_wish\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003edb\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003equery\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eWishes\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003eid\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\"\u003eif\u003c/span\u003e \u003cspan class=\"ow\"\u003enot\u003c/span\u003e \u003cspan class=\"n\"\u003edb_wish\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\"\u003eraise\u003c/span\u003e \u003cspan class=\"n\"\u003eHTTPException\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003estatus_code\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;404\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003edetail\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Wish id does not exist\u0026#34;\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003edb\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003edelete\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edb_wish\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=\"n\"\u003edb\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecommit\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"kc\"\u003eNone\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\u003c/code\u003e\u003c/pre\u003e\u003ch1 id=\"my-code\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMy Code\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eYou can find my repo \u003ca href=\"https://github.com/nicpayne713/wish-lists\"\u003ehere\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ll plan to update and maintain for as long as I use it\u003c/p\u003e\n",
      "content_text": "\nAmazon has crossed the line with me just one too many times now so we are looking to drop them like every other Big Tech provider....\n\nHowever, one key feature of Amazon that has been so useful for us is Lists... We can just maintain a list for each of us and then family members can login anytime and check it out... \nThis really alleviates any last minute gift idea stress right before a birthday or something.\n\nSo I need a nice gift list service but I don't want to be locked into one company (like a Target registry or something) and I'd like to host it myself\n\nThe internets had a few options but nothing looked/felt like I wanted to I decided to build my own.\n\n# The Frontend\n\n__I have no idea how to do front end so stay tuned__\n\n# The Backend\n\nFastAPI for the win on this one... I followed a few examples online and what I was able to build in just a few minutes is pretty impressive thanks to the design of FastAPI.\n\nSome key features are:\n1. Auto doc generation\n2. Required typing (which makes #1 possible)\n3. Built-in api testing in the browser\n4. Easy integration with sqlalchemy\n5. Development time so short you won't be done with your coffee before having something up and running!\n\n## Database\n\nStarting with a simple `database.py` we can create a sqlalchemy session with a base model with about 7 lines of code...\n\n```python\n\nfrom sqlalchemy import create_engine\nfrom sqlalchemy.ext.declarative import declarative_base\nfrom sqlalchemy.orm import sessionmaker\n\n\nSQLALCHEMY_DATABASE_URL = \"sqlite:///wishes.sqlite3\"\nengine = create_engine(SQLALCHEMY_DATABASE_URL)\nSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)\nBase = declarative_base()\n```\n\n## Model\n\nFor my wish list I needed just a simple table:\n\n|   id | person   | item         | link         | purchased   | purchased_by   | date_added          |\n|-----:|:---------|:-------------|:-------------|:------------|:---------------|:--------------------|\n|    1 | pypeaday | A sweet item | www.mystore.store | False        | dad| 2022-05-05 21:55:09 |\n|    2 | pypeaday   | A bitter item| www.bitterstore.com | True       |Mrs. pypeaday |  2022-05-06 06:55:54 |\n\n\nThe table is simple enough... A unique key, the person who the wish belongs to, the item (or wish), a link to the item, whether it's been purchased or not and by whom, and the date it was added.\n\nTo make this model with sqlalchemy we can make a `model.py` like so:\n\n```python\nfrom database import Base\nfrom sqlalchemy.schema import Column\nfrom sqlalchemy.types import Boolean, Integer, String, Text\n\n\nclass Wishes(Base):\n    __tablename__ = \"Wishes\"\n    id = Column(Integer, primary_key=True, index=True)\n    person = Column(String(20))\n    item = Column(Text())\n    link = Column(Text())\n    purchased = Column(Boolean())\n    purchased_by = Column(String(90))\n    date_added = Column(String(15))\n```\n\n## Schema\n\nOne of the best things about FastAPI is trivial integration with pydantic.\nWe can define a schema to ensure any data posted is not missing anything!\n\nMake a `schema.py` with the following:\n\n```python\nfrom pydantic import BaseModel\nimport time\nfrom typing import Optional\n\n\nclass wish_schema(BaseModel):\n\n    person: str\n    item: str\n    link: str\n    purchased: bool = False\n    purchased_by: Optional[str] = None\n    date_added: Optional[str] = time.strftime(\"%Y-%m-%d %H:%M:%S\", time.localtime())\n\n    class Config:\n        orm_mode = True\n\n\nclass patch_schema(BaseModel):\n\n    purchased: bool\n    purchased_by: Optional[str] = None\n\n    class Config:\n        orm_mode = True\n\n```\n\nI have 2 schemas - one for a `wish` which you'll see down below is used to validate any `post` requests.\n\nTo simplify things for me I made another schema, `patch_schema` which I use for the route that updates the table (ie. marking an existing wish as purchased) \n\n## Session\n\nOne of the last things we need is a Session\n\nSo make a `session.py`...\n\n```python\nfrom database import SessionLocal, engine\nimport model\n\nmodel.Base.metadata.create_all(bind=engine)\n\n\ndef create_get_session():\n    try:\n        db = SessionLocal()\n        yield db\n    finally:\n        db.close()\n```\n\nOur routes will depend on this `create_get_session` function that will yield a `db` object through which we'll udpate our database\n\n# Ok just do it already!\n\nSo our `main.py` will have a few routes in it...\n\nWhat do we want to support?\n\n1. Getting all wishes\n2. Getting a specific wish\n3. Updating a specific wish\n4. Deleting a wish\n\nI think the script is fairly self explanatory but here's a few notes...\n\n1. We decorate each function with `@app.\u003cmethod\u003e` and define `response_model` as well as `status_code`\n2. The functions are defined with `async` (this was my first exposure to this so I can't go in depth on it yet)\n3. The functions all take a `db` which is from `session.py` and that `db` depends on the `create_get_session` function\n4. If the db is being updtes then we type the object used for the update with the appropriate schema (either `wish_schema` or `patch_schema`)\n\nFrom there we're in true python-land where you can basically guess the methods on `db` and you'd probably be right... (like `query`, `upddate`, `delete` etc.)\n\n\n```python\nfrom fastapi import FastAPI, Depends, HTTPException\nfrom sqlalchemy.orm import Session\nfrom typing import List\nfrom model import Wishes\nfrom schema import wish_schema, patch_schema\nfrom session import create_get_session\n\napp = FastAPI()\n\n\n@app.get(\"/\")\ndef read_root():\n    return {\"message\": \"server is up!\"}\n\n\n@app.get(\"/wishes\", response_model=List[wish_schema], status_code=200)\nasync def read_wishes(db: Session = Depends(create_get_session)):\n    wishes = db.query(Wishes).all()\n    return wishes\n\n\n@app.post(\"/wishes\", response_model=wish_schema, status_code=201)\nasync def add_wish(wish: wish_schema, db: Session = Depends(create_get_session)):\n    new_wish = Wishes(\n        person=wish.person,\n        item=wish.item,\n        link=wish.link,\n        purchased=wish.purchased,\n        purchased_by=wish.purchased_by,\n        date_added=wish.date_added,\n    )\n    db.add(new_wish)\n    db.commit()\n\n    return new_wish\n\n\n@app.get(\"/wishes/{id}\", response_model=wish_schema, status_code=200)\nasync def get_wish(id: int, db: Session = Depends(create_get_session)):\n    wish = db.query(Wishes).get(id)\n    return wish\n\n\n@app.patch(\"/wishes/{id}\", response_model=wish_schema, status_code=200)\nasync def update_wish(\n    id: int, patch: patch_schema, db: Session = Depends(create_get_session)\n):\n    db_wish = db.query(Wishes).get(id)\n    db_wish.purchased = patch.purchased\n    db_wish.purchased_by = patch.purchased_by\n    db.commit()\n    db.refresh(db_wish)\n\n    return db_wish\n\n\n@app.delete(\"/wishes/{id}\", status_code=200)\nasync def delete_wish(id: int, db: Session = Depends(create_get_session)):\n    db_wish = db.query(Wishes).get(id)\n    if not db_wish:\n        raise HTTPException(status_code=\"404\", detail=\"Wish id does not exist\")\n\n    db.delete(db_wish)\n    db.commit()\n\n    return None\n\n```\n\n# My Code\n\nYou can find my repo [here](https://github.com/nicpayne713/wish-lists).\n\nI'll plan to update and maintain for as long as I use it\n",
      "summary": "Amazon has crossed the line with me just one too many times now so we are looking to drop them like every other Big Tech provider....",
      "date_published": "2022-05-06T00:00:00Z",
      "date_modified": "2022-05-06T00:00:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "python",
        "blog",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/git-bisect/",
      "url": "https://pype.dev/git-bisect/",
      "title": "Git-Bisect",
      "content_html": "\u003cp\u003eI try to commit a lot, and I also try to write useful tests appropriate for the scope of work I\u0026rsquo;m focusing on, but sometimes I drop the ball\u0026hellip;\u003c/p\u003e\n\u003cp\u003eWhether by laziness, ignorance, or accepted tech debt I don\u0026rsquo;t always code perfectly and recently I was dozens of commits into a new feature before realizing I broke something along the way that none of my tests caught\u0026hellip;\u003c/p\u003e\n\u003cp\u003eBefore today I would\u0026rsquo;ve manually reviewed every commit to see if something obvious slipped by me (talk about a time suck 😩)\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eThere must be a better way\u003c/strong\u003e\u003c/p\u003e\n\u003ch1 id=\"bisect\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBisect?\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003e\u003ccode\u003egit bisect\u003c/code\u003e is the magic sauce for this exact problem\u0026hellip;\u003c/p\u003e\n\u003cp\u003eYou essentially create a range of commits to consider and let \u003ccode\u003egit bisect\u003c/code\u003e guide you through them in a manner akin to Newton\u0026rsquo;s method for finding the root of a continuous function.\u003c/p\u003e\n\u003ch1 id=\"how-to-do-it\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHow to do it?\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eStart with \u003ccode\u003egit bisect start\u003c/code\u003e and then choose the first \u003ccode\u003egood\u003c/code\u003e commit (ie. a commit you know the bug isn\u0026rsquo;t present in)\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\"\u003esandbox   bisect-post   ×1 via   v3.8.11\u003cspan class=\"o\"\u003e(\u003c/span\u003esandbox\u003cspan class=\"o\"\u003e)\u003c/span\u003e  on  \u003cspan class=\"o\"\u003e(\u003c/span\u003eus-east-1\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ git bisect start\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\"\u003esandbox   bisect-post \u003cspan class=\"o\"\u003e(\u003c/span\u003eBISECTING\u003cspan class=\"o\"\u003e)\u003c/span\u003e   ×1 via   v3.8.11\u003cspan class=\"o\"\u003e(\u003c/span\u003esandbox\u003cspan class=\"o\"\u003e)\u003c/span\u003e  on  \u003cspan class=\"o\"\u003e(\u003c/span\u003eus-east-1\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ git bisect good 655332b\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebisect-post  HEAD         main         ORIG_HEAD\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e5b31e1e  -- \u003cspan class=\"o\"\u003e[\u003c/span\u003eHEAD\u003cspan class=\"o\"\u003e]\u003c/span\u003e    add successful print \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e52\u003c/span\u003e seconds ago\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e308247b  -- \u003cspan class=\"o\"\u003e[\u003c/span\u003eHEAD^\u003cspan class=\"o\"\u003e]\u003c/span\u003e   init another loop \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e77\u003c/span\u003e seconds ago\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e4555c59  -- \u003cspan class=\"o\"\u003e[\u003c/span\u003eHEAD^^\u003cspan class=\"o\"\u003e]\u003c/span\u003e  introduce bug \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e2\u003c/span\u003e minutes ago\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e9cf6d55  -- \u003cspan class=\"o\"\u003e[\u003c/span\u003eHEAD~3\u003cspan class=\"o\"\u003e]\u003c/span\u003e  add successful loop \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e3\u003c/span\u003e minutes ago\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebcb41c3  -- \u003cspan class=\"o\"\u003e[\u003c/span\u003eHEAD~4\u003cspan class=\"o\"\u003e]\u003c/span\u003e  change x to \u003cspan class=\"m\"\u003e10\u003c/span\u003e \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e4\u003c/span\u003e minutes ago\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e3c34aac  -- \u003cspan class=\"o\"\u003e[\u003c/span\u003eHEAD~5\u003cspan class=\"o\"\u003e]\u003c/span\u003e  init x to \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e4\u003c/span\u003e minutes ago\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e12e53bd  -- \u003cspan class=\"o\"\u003e[\u003c/span\u003eHEAD~6\u003cspan class=\"o\"\u003e]\u003c/span\u003e  print cwd \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e4\u003c/span\u003e minutes ago\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e655332b  -- \u003cspan class=\"o\"\u003e[\u003c/span\u003eHEAD~7\u003cspan class=\"o\"\u003e]\u003c/span\u003e  add example.py \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e10\u003c/span\u003e minutes ago\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \u003cspan class=\"c1\"\u003e# \u0026lt;- I want to start at this commit\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e59e0048  -- \u003cspan class=\"o\"\u003e[\u003c/span\u003eHEAD~8\u003cspan class=\"o\"\u003e]\u003c/span\u003e  gitignore \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e23\u003c/span\u003e hours ago\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efb9e1fb  -- \u003cspan class=\"o\"\u003e[\u003c/span\u003eHEAD~9\u003cspan class=\"o\"\u003e]\u003c/span\u003e  add reqs \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e23\u003c/span\u003e hours ago\u003cspan class=\"o\"\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\u003c/code\u003e\u003c/pre\u003e\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\"\u003esandbox   bisect-post \u003cspan class=\"o\"\u003e(\u003c/span\u003eBISECTING\u003cspan class=\"o\"\u003e)\u003c/span\u003e   ×1 via   v3.8.11\u003cspan class=\"o\"\u003e(\u003c/span\u003esandbox\u003cspan class=\"o\"\u003e)\u003c/span\u003e  on  \u003cspan class=\"o\"\u003e(\u003c/span\u003eus-east-1\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ git bisect bad 5b31e1e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebisect-post                                                ORIG_HEAD\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHEAD                                                       refs/bisect/good-655332b6c384934c2c00c3d4aba3011ccc1e5b57\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emain\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e5b31e1e  -- \u003cspan class=\"o\"\u003e[\u003c/span\u003eHEAD\u003cspan class=\"o\"\u003e]\u003c/span\u003e    add successful print \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e5\u003c/span\u003e minutes ago\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \u003cspan class=\"c1\"\u003e# \u0026lt;- I start here with the \u0026#34;bad\u0026#34; commit\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e308247b  -- \u003cspan class=\"o\"\u003e[\u003c/span\u003eHEAD^\u003cspan class=\"o\"\u003e]\u003c/span\u003e   init another loop \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e6\u003c/span\u003e minutes ago\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e4555c59  -- \u003cspan class=\"o\"\u003e[\u003c/span\u003eHEAD^^\u003cspan class=\"o\"\u003e]\u003c/span\u003e  introduce bug \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e6\u003c/span\u003e minutes ago\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e9cf6d55  -- \u003cspan class=\"o\"\u003e[\u003c/span\u003eHEAD~3\u003cspan class=\"o\"\u003e]\u003c/span\u003e  add successful loop \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e7\u003c/span\u003e minutes ago\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebcb41c3  -- \u003cspan class=\"o\"\u003e[\u003c/span\u003eHEAD~4\u003cspan class=\"o\"\u003e]\u003c/span\u003e  change x to \u003cspan class=\"m\"\u003e10\u003c/span\u003e \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e8\u003c/span\u003e minutes ago\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e3c34aac  -- \u003cspan class=\"o\"\u003e[\u003c/span\u003eHEAD~5\u003cspan class=\"o\"\u003e]\u003c/span\u003e  init x to \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e9\u003c/span\u003e minutes ago\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e12e53bd  -- \u003cspan class=\"o\"\u003e[\u003c/span\u003eHEAD~6\u003cspan class=\"o\"\u003e]\u003c/span\u003e  print cwd \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e9\u003c/span\u003e minutes ago\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e655332b  -- \u003cspan class=\"o\"\u003e[\u003c/span\u003eHEAD~7\u003cspan class=\"o\"\u003e]\u003c/span\u003e  add example.py \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e14\u003c/span\u003e minutes ago\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e59e0048  -- \u003cspan class=\"o\"\u003e[\u003c/span\u003eHEAD~8\u003cspan class=\"o\"\u003e]\u003c/span\u003e  gitignore \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e23\u003c/span\u003e hours ago\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efb9e1fb  -- \u003cspan class=\"o\"\u003e[\u003c/span\u003eHEAD~9\u003cspan class=\"o\"\u003e]\u003c/span\u003e  add reqs \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e23\u003c/span\u003e hours ago\u003cspan class=\"o\"\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\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eAfter starting bisect with a \u0026ldquo;good\u0026rdquo; start commit and a \u0026ldquo;bad\u0026rdquo; ending commit we can let git to it\u0026rsquo;s thing!\u003c/p\u003e\n\u003cp\u003eGit checksout a commit somewhere about halfway between the good and bad commit so you can see if your bug is there or not.\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\"\u003esandbox   bisect-post \u003cspan class=\"o\"\u003e(\u003c/span\u003eBISECTING\u003cspan class=\"o\"\u003e)\u003c/span\u003e   ×1 via   v3.8.11\u003cspan class=\"o\"\u003e(\u003c/span\u003esandbox\u003cspan class=\"o\"\u003e)\u003c/span\u003e  on  \u003cspan class=\"o\"\u003e(\u003c/span\u003eus-east-1\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ git bisect bad 5b31e1e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eBisecting: \u003cspan class=\"m\"\u003e3\u003c/span\u003e revisions left to \u003cspan class=\"nb\"\u003etest\u003c/span\u003e after this \u003cspan class=\"o\"\u003e(\u003c/span\u003eroughly \u003cspan class=\"m\"\u003e2\u003c/span\u003e steps\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e[\u003c/span\u003ebcb41c3854e343eade85353683f2c1c4ddde4e04\u003cspan class=\"o\"\u003e]\u003c/span\u003e change x to \u003cspan class=\"m\"\u003e10\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\"\u003esandbox   HEAD \u003cspan class=\"o\"\u003e(\u003c/span\u003ebcb41c38\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e(\u003c/span\u003eBISECTING\u003cspan class=\"o\"\u003e)\u003c/span\u003e   ×1 via   v3.8.11\u003cspan class=\"o\"\u003e(\u003c/span\u003esandbox\u003cspan class=\"o\"\u003e)\u003c/span\u003e  on  \u003cspan class=\"o\"\u003e(\u003c/span\u003eus-east-1\u003cspan class=\"o\"\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\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eIn my example here I have a python script with some loops and print statements - they aren\u0026rsquo;t really relevant, I just wanted an easy to follow git history.\u003c/p\u003e\n\u003cp\u003eSo I check to see if the bug is present or not either by running/writing tests or replicating the bug somehow.\u003c/p\u003e\n\u003cp\u003eIn this session commit \u003ccode\u003ebcb41c38\u003c/code\u003e is actually just fine, so I do \u003ccode\u003egit bisect good\u003c/code\u003e\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\"\u003esandbox   HEAD \u003cspan class=\"o\"\u003e(\u003c/span\u003ebcb41c38\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e(\u003c/span\u003eBISECTING\u003cspan class=\"o\"\u003e)\u003c/span\u003e   ×1 via   v3.8.11\u003cspan class=\"o\"\u003e(\u003c/span\u003esandbox\u003cspan class=\"o\"\u003e)\u003c/span\u003e  on  \u003cspan class=\"o\"\u003e(\u003c/span\u003eus-east-1\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ git bisect good\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eBisecting: \u003cspan class=\"m\"\u003e1\u003c/span\u003e revision left to \u003cspan class=\"nb\"\u003etest\u003c/span\u003e after this \u003cspan class=\"o\"\u003e(\u003c/span\u003eroughly \u003cspan class=\"m\"\u003e1\u003c/span\u003e step\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e[\u003c/span\u003e4555c5979268dff6c475365fdc5ce1d4a12bd820\u003cspan class=\"o\"\u003e]\u003c/span\u003e introduce bug\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\u003eAnd we see that git moves on to checkout another commit\u0026hellip;\u003c/p\u003e\n\u003cp\u003eIn this case the next commit is the one where I introduced a bug\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003egit bisect bad\u003c/code\u003e then gives me:\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\"\u003esandbox   HEAD \u003cspan class=\"o\"\u003e(\u003c/span\u003e4555c597\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e(\u003c/span\u003eBISECTING\u003cspan class=\"o\"\u003e)\u003c/span\u003e   ×1 via   v3.8.11\u003cspan class=\"o\"\u003e(\u003c/span\u003esandbox\u003cspan class=\"o\"\u003e)\u003c/span\u003e  on  \u003cspan class=\"o\"\u003e(\u003c/span\u003eus-east-1\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ git bisect bad\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eBisecting: \u003cspan class=\"m\"\u003e0\u003c/span\u003e revisions left to \u003cspan class=\"nb\"\u003etest\u003c/span\u003e after this \u003cspan class=\"o\"\u003e(\u003c/span\u003eroughly \u003cspan class=\"m\"\u003e0\u003c/span\u003e steps\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e[\u003c/span\u003e9cf6d55301560c51e2f55404d0d80b1f1e22a33d\u003cspan class=\"o\"\u003e]\u003c/span\u003e add successful loop\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eAt \u003ccode\u003e4555c597\u003c/code\u003e the script works as expected so one more \u003ccode\u003egit bisect good\u003c/code\u003e yields\u0026hellip;\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esandbox   HEAD \u003cspan class=\"o\"\u003e(\u003c/span\u003e9cf6d553\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e(\u003c/span\u003eBISECTING\u003cspan class=\"o\"\u003e)\u003c/span\u003e   ×1 via   v3.8.11\u003cspan class=\"o\"\u003e(\u003c/span\u003esandbox\u003cspan class=\"o\"\u003e)\u003c/span\u003e  on  \u003cspan class=\"o\"\u003e(\u003c/span\u003eus-east-1\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ git bisect good\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e4555c5979268dff6c475365fdc5ce1d4a12bd820 is the first bad commit\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecommit 4555c5979268dff6c475365fdc5ce1d4a12bd820\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAuthor: \u003cspan class=\"c1\"\u003e########################### \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDate:   Tue May \u003cspan class=\"m\"\u003e3\u003c/span\u003e 09:00:00 \u003cspan class=\"m\"\u003e2022\u003c/span\u003e -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    introduce bug\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 example.py \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e +-\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"m\"\u003e1\u003c/span\u003e file changed, \u003cspan class=\"m\"\u003e1\u003c/span\u003e insertion\u003cspan class=\"o\"\u003e(\u003c/span\u003e+\u003cspan class=\"o\"\u003e)\u003c/span\u003e, \u003cspan class=\"m\"\u003e1\u003c/span\u003e deletion\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\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\u003ch1 id=\"what-happened\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhat happened?\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eGit sliced up a range of commits based on me saying of the next one was good or bad and localized the commit that introduced a bug into my workflow!\u003c/p\u003e\n\u003cp\u003eI didn\u0026rsquo;t have to manually review commits, click through logs, etc\u0026hellip; I just let git checkout relevant commits and I ran whatever was appropriate for reproducing the bug to learn when it was comitted!\u003c/p\u003e\n",
      "content_text": "\nI try to commit a lot, and I also try to write useful tests appropriate for the scope of work I'm focusing on, but sometimes I drop the ball...\n\nWhether by laziness, ignorance, or accepted tech debt I don't always code perfectly and recently I was dozens of commits into a new feature before realizing I broke something along the way that none of my tests caught...\n\nBefore today I would've manually reviewed every commit to see if something obvious slipped by me (talk about a time suck 😩)\n\n__There must be a better way__\n\n# Bisect?\n\n`git bisect` is the magic sauce for this exact problem...\n\nYou essentially create a range of commits to consider and let `git bisect` guide you through them in a manner akin to Newton's method for finding the root of a continuous function.\n\n# How to do it?\n\nStart with `git bisect start` and then choose the first `good` commit (ie. a commit you know the bug isn't present in)\n\n```bash\n\nsandbox   bisect-post   ×1 via   v3.8.11(sandbox)  on  (us-east-1)\n❯ git bisect start\n\nsandbox   bisect-post (BISECTING)   ×1 via   v3.8.11(sandbox)  on  (us-east-1)\n❯ git bisect good 655332b\nbisect-post  HEAD         main         ORIG_HEAD\n5b31e1e  -- [HEAD]    add successful print (52 seconds ago)\n308247b  -- [HEAD^]   init another loop (77 seconds ago)\n4555c59  -- [HEAD^^]  introduce bug (2 minutes ago)\n9cf6d55  -- [HEAD~3]  add successful loop (3 minutes ago)\nbcb41c3  -- [HEAD~4]  change x to 10 (4 minutes ago)\n3c34aac  -- [HEAD~5]  init x to 1 (4 minutes ago)\n12e53bd  -- [HEAD~6]  print cwd (4 minutes ago)\n655332b  -- [HEAD~7]  add example.py (10 minutes ago)  # \u003c- I want to start at this commit\n59e0048  -- [HEAD~8]  gitignore (23 hours ago)\nfb9e1fb  -- [HEAD~9]  add reqs (23 hours ago)\n\n```\n\n```bash\n\nsandbox   bisect-post (BISECTING)   ×1 via   v3.8.11(sandbox)  on  (us-east-1)\n❯ git bisect bad 5b31e1e\nbisect-post                                                ORIG_HEAD\nHEAD                                                       refs/bisect/good-655332b6c384934c2c00c3d4aba3011ccc1e5b57\nmain\n5b31e1e  -- [HEAD]    add successful print (5 minutes ago)  # \u003c- I start here with the \"bad\" commit\n308247b  -- [HEAD^]   init another loop (6 minutes ago)\n4555c59  -- [HEAD^^]  introduce bug (6 minutes ago)\n9cf6d55  -- [HEAD~3]  add successful loop (7 minutes ago)\nbcb41c3  -- [HEAD~4]  change x to 10 (8 minutes ago)\n3c34aac  -- [HEAD~5]  init x to 1 (9 minutes ago)\n12e53bd  -- [HEAD~6]  print cwd (9 minutes ago)\n655332b  -- [HEAD~7]  add example.py (14 minutes ago)\n59e0048  -- [HEAD~8]  gitignore (23 hours ago)\nfb9e1fb  -- [HEAD~9]  add reqs (23 hours ago)\n\n```\n\nAfter starting bisect with a \"good\" start commit and a \"bad\" ending commit we can let git to it's thing!\n\nGit checksout a commit somewhere about halfway between the good and bad commit so you can see if your bug is there or not.\n\n```bash\n\nsandbox   bisect-post (BISECTING)   ×1 via   v3.8.11(sandbox)  on  (us-east-1)\n❯ git bisect bad 5b31e1e\nBisecting: 3 revisions left to test after this (roughly 2 steps)\n[bcb41c3854e343eade85353683f2c1c4ddde4e04] change x to 10\n\nsandbox   HEAD (bcb41c38) (BISECTING)   ×1 via   v3.8.11(sandbox)  on  (us-east-1)\n❯\n```\n\nIn my example here I have a python script with some loops and print statements - they aren't really relevant, I just wanted an easy to follow git history.\n\nSo I check to see if the bug is present or not either by running/writing tests or replicating the bug somehow.\n\nIn this session commit `bcb41c38` is actually just fine, so I do `git bisect good`\n\n```bash\n\nsandbox   HEAD (bcb41c38) (BISECTING)   ×1 via   v3.8.11(sandbox)  on  (us-east-1)\n❯ git bisect good\nBisecting: 1 revision left to test after this (roughly 1 step)\n[4555c5979268dff6c475365fdc5ce1d4a12bd820] introduce bug\n\n```\n\nAnd we see that git moves on to checkout another commit...\n\nIn this case the next commit is the one where I introduced a bug\n\n`git bisect bad` then gives me:\n\n```bash\n\nsandbox   HEAD (4555c597) (BISECTING)   ×1 via   v3.8.11(sandbox)  on  (us-east-1)\n❯ git bisect bad\nBisecting: 0 revisions left to test after this (roughly 0 steps)\n[9cf6d55301560c51e2f55404d0d80b1f1e22a33d] add successful loop\n```\n\nAt `4555c597` the script works as expected so one more `git bisect good` yields...\n\n```bash\nsandbox   HEAD (9cf6d553) (BISECTING)   ×1 via   v3.8.11(sandbox)  on  (us-east-1)\n❯ git bisect good\n4555c5979268dff6c475365fdc5ce1d4a12bd820 is the first bad commit\ncommit 4555c5979268dff6c475365fdc5ce1d4a12bd820\nAuthor: ########################### \nDate:   Tue May 3 09:00:00 2022 -0500\n\n    introduce bug\n\n example.py | 2 +-\n 1 file changed, 1 insertion(+), 1 deletion(-)\n\n\n```\n\n# What happened?\n\nGit sliced up a range of commits based on me saying of the next one was good or bad and localized the commit that introduced a bug into my workflow!\n\nI didn't have to manually review commits, click through logs, etc... I just let git checkout relevant commits and I ran whatever was appropriate for reproducing the bug to learn when it was comitted!\n",
      "summary": "I try to commit a lot, and I also try to write useful tests appropriate for the scope of work I'm focusing on, but sometimes I drop the ball...",
      "date_published": "2022-05-03T00:00:00Z",
      "date_modified": "2022-05-03T00:00:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "git",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/pandas-string-contains/",
      "url": "https://pype.dev/pandas-string-contains/",
      "title": "Pandas-String-Contains",
      "content_html": "\u003ch1 id=\"tl-dr\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTL;DR\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003e\u003ccode\u003epandas.Series.str.contains\u003c/code\u003e accepts regular expressions and this is turned on by \u003cstrong\u003edefault\u003c/strong\u003e!\u003c/p\u003e\n\u003ch1 id=\"use-case\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUse case\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eWe often need to filter pandas DataFrames based on several string values in a Series.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eNotice that sweet pyflyby import 😁!\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e \u003cspan class=\"err\"\u003e\u003c/span\u003e  \u003cspan class=\"n\"\u003emain\u003c/span\u003e \u003cspan class=\"n\"\u003evia\u003c/span\u003e \u003cspan class=\"mf\"\u003e3.8.11\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eipython\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e❯\u003c/span\u003e \u003cspan class=\"n\"\u003edf\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003epd\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eDataFrame\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;A\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;string1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;string2\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;string3\u0026#34;\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\u003cspan class=\"n\"\u003ePYFLYBY\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"nn\"\u003epandas\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"nn\"\u003epd\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=\"n\"\u003esandbox\u003c/span\u003e \u003cspan class=\"err\"\u003e\u003c/span\u003e  \u003cspan class=\"n\"\u003emain\u003c/span\u003e \u003cspan class=\"n\"\u003evia\u003c/span\u003e \u003cspan class=\"mf\"\u003e3.8.11\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eipython\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e❯\u003c/span\u003e \u003cspan class=\"n\"\u003edf\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=\"n\"\u003eA\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e  \u003cspan class=\"n\"\u003estring1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e  \u003cspan class=\"n\"\u003estring2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e  \u003cspan class=\"n\"\u003estring3\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=\"n\"\u003esandbox\u003c/span\u003e \u003cspan class=\"err\"\u003e\u003c/span\u003e  \u003cspan class=\"n\"\u003emain\u003c/span\u003e \u003cspan class=\"n\"\u003evia\u003c/span\u003e \u003cspan class=\"mf\"\u003e3.8.11\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eipython\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e❯\u003c/span\u003e \u003cspan class=\"n\"\u003edf\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003edf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eA\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estr\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003econtains\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;1\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003edf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eA\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estr\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003econtains\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;2\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e         \u003cspan class=\"n\"\u003eA\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e  \u003cspan class=\"n\"\u003estring1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e  \u003cspan class=\"n\"\u003estring2\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\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eAnd this isn\u0026rsquo;t the worst thing in the world, especially for such a tiny example\u0026hellip;\u003c/p\u003e\n\u003cp\u003eBut what if we had dozens or more values to filter on?\u003c/p\u003e\n\u003cp\u003eThen it looks so much nicer to create an iterable of the values we want to filter on and join them with an apropriate regex operator (in this case \u003ccode\u003e|\u003c/code\u003e for \u003cem\u003einclusive or\u003c/em\u003e)\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\"\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e \u003cspan class=\"err\"\u003e\u003c/span\u003e  \u003cspan class=\"n\"\u003emain\u003c/span\u003e \u003cspan class=\"n\"\u003evia\u003c/span\u003e \u003cspan class=\"mf\"\u003e3.8.11\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eipython\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e❯\u003c/span\u003e \u003cspan class=\"n\"\u003evals\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;2\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e  \u003cspan class=\"c1\"\u003e# iterable with whatever is appropriate for your use case\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=\"n\"\u003esandbox\u003c/span\u003e \u003cspan class=\"err\"\u003e\u003c/span\u003e  \u003cspan class=\"n\"\u003emain\u003c/span\u003e \u003cspan class=\"n\"\u003evia\u003c/span\u003e \u003cspan class=\"mf\"\u003e3.8.11\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eipython\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e❯\u003c/span\u003e \u003cspan class=\"n\"\u003edf\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003edf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eA\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estr\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003econtains\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;|\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ejoin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003evals\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e \u003cspan class=\"n\"\u003eregex\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"kc\"\u003eTrue\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e         \u003cspan class=\"n\"\u003eA\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e  \u003cspan class=\"n\"\u003estring1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e  \u003cspan class=\"n\"\u003estring2\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\u003c/code\u003e\u003c/pre\u003e\u003ch1 id=\"fin\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFin\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eThis is a super nice and concise way to do the kind of filtering my team does on a daily basis!\u003c/p\u003e\n",
      "content_text": "\n# TL;DR \n\n`pandas.Series.str.contains` accepts regular expressions and this is turned on by __default__!\n\n# Use case\n\nWe often need to filter pandas DataFrames based on several string values in a Series.\n\n\u003e Notice that sweet pyflyby import 😁!\n\n```python\nsandbox   main via 3.8.11(sandbox) ipython\n❯ df = pd.DataFrame({\"A\": [\"string1\", \"string2\", \"string3\"]})\n[PYFLYBY] import pandas as pd\n\nsandbox   main via 3.8.11(sandbox) ipython\n❯ df\n\n         A\n0  string1\n1  string2\n2  string3\n\nsandbox   main via 3.8.11(sandbox) ipython\n❯ df[df.A.str.contains('1') | df.A.str.contains('2')]\n\n         A\n0  string1\n1  string2\n\n```\n\nAnd this isn't the worst thing in the world, especially for such a tiny example...\n\nBut what if we had dozens or more values to filter on?\n\nThen it looks so much nicer to create an iterable of the values we want to filter on and join them with an apropriate regex operator (in this case `|` for _inclusive or_)\n\n```python\n\nsandbox   main via 3.8.11(sandbox) ipython\n❯ vals = [\"1\", \"2\"]  # iterable with whatever is appropriate for your use case\n\nsandbox   main via 3.8.11(sandbox) ipython\n❯ df[df.A.str.contains(\"|\".join(vals), regex=True)]\n\n         A\n0  string1\n1  string2\n\n```\n\n# Fin\n\nThis is a super nice and concise way to do the kind of filtering my team does on a daily basis!\n",
      "summary": "accepts regular expressions and this is turned on by __!",
      "date_published": "2022-05-02T00:00:00Z",
      "date_modified": "2022-05-02T00:00:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "python",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/unpack-anywhere-with-star/",
      "url": "https://pype.dev/unpack-anywhere-with-star/",
      "title": "Unpack-Anywhere-With-Star",
      "content_html": "\u003cp\u003eUnpacking iterables in python with \u003ccode\u003e*\u003c/code\u003e is a pretty handy trick for writing code that is just a tiny bit more pythonic than not.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003earr\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eTuple\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eUnion\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nb\"\u003eint\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nb\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;a\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;b\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;c\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\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=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003earr\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=\"o\"\u003e\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;a\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;b\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;c\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# the * unpacks the tuple into the individual elements\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003earr\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=\"o\"\u003e\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;a\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;b\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;c\u0026#39;\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=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003ealphas\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003earr\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=\"c1\"\u003e# x = 1, y = 2, z = 3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# alphas = [ \u0026#39;a\u0026#39;, \u0026#39;b\u0026#39;, \u0026#39;c\u0026#39; ]\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\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eBut \u003ca href=\"https://twitter.com/nedbat\"\u003e@Ned Batchelder\u003c/a\u003e showed me via Twitter than you can arbitrarily unpack arguments based on position - it doesn\u0026rsquo;t have to be done at the beginning or the end!\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003emixed\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ealpha\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003earr\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=\"c1\"\u003e# x = 1, y = 2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# mixed = [3, \u0026#39;a\u0026#39;, \u0026#39;b\u0026#39;]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# alpha = \u0026#39;c\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eI\u0026rsquo;m not entirely sure when I\u0026rsquo;ll need this but it definitley shows me another example of how flexible python is!\u003c/p\u003e\n",
      "content_text": "\n\nUnpacking iterables in python with `*` is a pretty handy trick for writing code that is just a tiny bit more pythonic than not.\n\n```python\narr: Tuple[Union[int, str]] = (1, 2, 3, 'a', 'b', 'c')\n\n\nprint(arr)\n\u003e\u003e\u003e (1, 2, 3, 'a', 'b', 'c')\n\n# the * unpacks the tuple into the individual elements\nprint(*arr)\n\u003e\u003e\u003e 1, 2, 3, 'a', 'b', 'c'\n\nx, y, z, *alphas = arr\n\n# x = 1, y = 2, z = 3\n# alphas = [ 'a', 'b', 'c' ]\n\n```\n\nBut [@Ned Batchelder](https://twitter.com/nedbat) showed me via Twitter than you can arbitrarily unpack arguments based on position - it doesn't have to be done at the beginning or the end!\n\n```python\nx, y, *mixed, alpha = arr\n\n# x = 1, y = 2\n# mixed = [3, 'a', 'b']\n# alpha = 'c'\n```\n\nI'm not entirely sure when I'll need this but it definitley shows me another example of how flexible python is!\n",
      "summary": "Unpacking iterables in python with is a pretty handy trick for writing code that is just a tiny bit more pythonic than not.",
      "date_published": "2022-04-24T00:00:00Z",
      "date_modified": "2022-04-24T00:00:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "python",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/htop/",
      "url": "https://pype.dev/htop/",
      "title": "Htop",
      "content_html": "\u003cp\u003e\u003ccode\u003ehtop\u003c/code\u003e is a common command line tool for seeing interactive output of your system resource utilization, running processes, etc.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve always been super confused about htop showing seemingly the same process several times though\u0026hellip;\u003c/p\u003e\n\u003ch2 id=\"the-fix\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThe Fix…\u003c/span\u003e \u003ca href=\"#the-fix\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eJust hit \u003ccode\u003eH\u003c/code\u003e\u0026hellip;. makes the view a lot nicer 😀\u003c/p\u003e\n",
      "content_text": "\n`htop` is a common command line tool for seeing interactive output of your system resource utilization, running processes, etc.\n\nI've always been super confused about htop showing seemingly the same process several times though...\n\n## The Fix...\n\nJust hit `H`.... makes the view a lot nicer 😀\n",
      "summary": "is a common command line tool for seeing interactive output of your system resource utilization, running processes, etc.",
      "date_published": "2022-04-24T00:00:00Z",
      "date_modified": "2022-04-24T00:00:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "til",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/pipx/",
      "url": "https://pype.dev/pipx/",
      "title": "Pipx",
      "content_html": "\u003cp\u003e\u003ccode\u003epipx\u003c/code\u003e is a tool I\u0026rsquo;ve been using to solve a few problems of mine\u0026hellip;\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003epinning formatting tools like \u003ccode\u003eblack\u003c/code\u003e, \u003ccode\u003eflake8\u003c/code\u003e, \u003ccode\u003eisort\u003c/code\u003e, etc. to the same version for all my projects\u003c/li\u003e\n\u003cli\u003ekeeping virtual environments clean of things like \u003ccode\u003ecookiecutter\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003epython utilities I want system wide but not in the global environment, like \u003ccode\u003evisidata\u003c/code\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"what-is-it\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhat is it?\u003c/span\u003e \u003ca href=\"#what-is-it\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003epip\u003c/code\u003e itself is just a package manager like \u003ccode\u003ehomebrew\u003c/code\u003e, \u003ccode\u003eapt\u003c/code\u003e, etc. But it is tied to a python environment.\nIf you aren\u0026rsquo;t using a virtual environment then \u003ccode\u003epip\u003c/code\u003e will operate inside the global installation of python.\u003c/p\u003e\n\u003cp\u003eOperating within that environment has burned me several times and now I have a strict virtual environment usage policy.\u003c/p\u003e\n\u003cp\u003eBut there are still things I don\u0026rsquo;t want to have to put in every virtual environment - enter \u003ccode\u003epipx\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"what-s-it-do\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhat’s it do?\u003c/span\u003e \u003ca href=\"#what-s-it-do\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWhen you \u003ccode\u003epipx install {package}\u003c/code\u003e a stand alone virtual environment gets created (by default in \u003ccode\u003e~/.local/pipx/venvs\u003c/code\u003e).\nTHen you can install extra dependencies with \u003ccode\u003epipx inject {package} {dependency}\u003c/code\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eex. After \u003ccode\u003epipx install visidata\u003c/code\u003e in order to open Excel files you need to \u003ccode\u003epipx inject visidata xlrd\u003c/code\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eIn the example with \u003ccode\u003evisidata\u003c/code\u003e, I can then use it anywhere, in any project, without re-installing with \u003ccode\u003epip\u003c/code\u003e in every env.\u003c/p\u003e\n\u003cp\u003eAlso for the formatting tools - I configure vim to run the \u003ccode\u003epipx\u003c/code\u003e versions of them on save - this way I don\u0026rsquo;t have to put them in every project\u0026rsquo;s virtual environment!\u003c/p\u003e\n\u003ch2 id=\"what-about-pip\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhat about pip?\u003c/span\u003e \u003ca href=\"#what-about-pip\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eSo obviously you can\u0026rsquo;t \u003ccode\u003epipx\u003c/code\u003e everything, nor do you want to.\nI see it as a safe and better alternative to global package installation.\u003c/p\u003e\n\u003cp\u003eHow can you then be sure that you never \u003ccode\u003epip install\u003c/code\u003e into the global env?\u003c/p\u003e\n\u003cp\u003eAdd \u003ccode\u003erequire-virtualenv = True\u003c/code\u003e to your \u003ccode\u003epip.conf\u003c/code\u003e and you\u0026rsquo;re good to go!\u003c/p\u003e\n\u003cp\u003eWith that set, if you try to \u003ccode\u003epip install pandas\u003c/code\u003e into the global env you\u0026rsquo;ll get a message like this:\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\"\u003e~ on  \u003cspan class=\"o\"\u003e(\u003c/span\u003eus-east-1\u003cspan class=\"o\"\u003e)\u003c/span\u003e  NO PYTHON VENV SET\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ pip install pandas\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eERROR: Could not find an activated virtualenv \u003cspan class=\"o\"\u003e(\u003c/span\u003erequired\u003cspan class=\"o\"\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\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"end\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEnd\u003c/span\u003e \u003ca href=\"#end\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003eDisable your system \u003ccode\u003epip\u003c/code\u003e to keep your base python safe\u003c/li\u003e\n\u003cli\u003eUse \u003ccode\u003epipx\u003c/code\u003e for tools you want available everywhere or don\u0026rsquo;t have to need in a virtual environment!\u003c/li\u003e\n\u003c/ol\u003e\n",
      "content_text": "\n\n`pipx` is a tool I've been using to solve a few problems of mine...\n\n1. pinning formatting tools like `black`, `flake8`, `isort`, etc. to the same version for all my projects\n2. keeping virtual environments clean of things like `cookiecutter`\n3. python utilities I want system wide but not in the global environment, like `visidata`\n\n## What is it?\n\n`pip` itself is just a package manager like `homebrew`, `apt`, etc. But it is tied to a python environment.\nIf you aren't using a virtual environment then `pip` will operate inside the global installation of python.\n\nOperating within that environment has burned me several times and now I have a strict virtual environment usage policy.\n\nBut there are still things I don't want to have to put in every virtual environment - enter `pipx`\n\n## What's it do?\n\nWhen you `pipx install {package}` a stand alone virtual environment gets created (by default in `~/.local/pipx/venvs`).\nTHen you can install extra dependencies with `pipx inject {package} {dependency}`\n\n\u003e ex. After `pipx install visidata` in order to open Excel files you need to `pipx inject visidata xlrd`\n\nIn the example with `visidata`, I can then use it anywhere, in any project, without re-installing with `pip` in every env.\n\nAlso for the formatting tools - I configure vim to run the `pipx` versions of them on save - this way I don't have to put them in every project's virtual environment!\n\n## What about pip?\n\nSo obviously you can't `pipx` everything, nor do you want to. \nI see it as a safe and better alternative to global package installation.\n\nHow can you then be sure that you never `pip install` into the global env?\n\nAdd `require-virtualenv = True` to your `pip.conf` and you're good to go!\n\nWith that set, if you try to `pip install pandas` into the global env you'll get a message like this:\n\n\n```bash\n\n~ on  (us-east-1)  NO PYTHON VENV SET\n❯ pip install pandas\nERROR: Could not find an activated virtualenv (required).\n\n\n```\n\n## End\n\n1. Disable your system `pip` to keep your base python safe\n2. Use `pipx` for tools you want available everywhere or don't have to need in a virtual environment!\n",
      "summary": "is a tool I've been using to solve a few problems of mine...",
      "date_published": "2022-04-22T00:00:00Z",
      "date_modified": "2022-04-22T00:00:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "til",
        "python",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/fx-json/",
      "url": "https://pype.dev/fx-json/",
      "title": "Fx-Json",
      "content_html": "\u003cp\u003e\u003ca href=\"https://github.com/antonmedv/fx\"\u003efx\u003c/a\u003e is an interactaive JSON viewer for the terminal.\u003c/p\u003e\n\u003cp\u003eIt\u0026rsquo;s a simple tool built with Charmcli\u0026rsquo;s Bubble Tea.\u003c/p\u003e\n\u003ch2 id=\"installation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eInstallation\u003c/span\u003e \u003ca href=\"#installation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe installation with go was broken for me - both via the link and direct from the repo.\nNow I\u0026rsquo;m not a gopher so I don\u0026rsquo;t really know how to fix that.\u003c/p\u003e\n\u003cp\u003eLuckily \u003ccode\u003enpm install fx\u003c/code\u003e also works and got me what I needed!\u003c/p\u003e\n\u003ch2 id=\"usage\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsage\u003c/span\u003e \u003ca href=\"#usage\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eUsage is simple\u0026hellip; \u003ccode\u003efx \u0026lt;json file\u0026gt;\u003c/code\u003e.\nThe Github has a few other ways such as \u003ccode\u003ecurl ... | fx\u003c/code\u003e etc.\u003c/p\u003e\n",
      "content_text": "\n[fx](https://github.com/antonmedv/fx) is an interactaive JSON viewer for the terminal.\n\nIt's a simple tool built with Charmcli's Bubble Tea.\n\n## Installation\n\nThe installation with go was broken for me - both via the link and direct from the repo.\nNow I'm not a gopher so I don't really know how to fix that.\n\nLuckily `npm install fx` also works and got me what I needed!\n\n## Usage\n\nUsage is simple... `fx \u003cjson file\u003e`.\nThe Github has a few other ways such as `curl ... | fx` etc.\n",
      "summary": "fx is an interactaive JSON viewer for the terminal.",
      "date_published": "2022-04-19T00:00:00Z",
      "date_modified": "2022-04-19T00:00:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "til",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/jellyfin-media-players/",
      "url": "https://pype.dev/jellyfin-media-players/",
      "title": "Jellyfin-Media-Players",
      "content_html": "\u003cp\u003eI use Jellyfin at home for serving up most of our media - movies and shows etc.\u003c/p\u003e\n\u003cp\u003eMy dream is to have a GPU capable of transcoding any and all of our media for smooth playback on any device\u0026hellip;\nNow, I thought I\u0026rsquo;d have that by now with my Nvidia Quadro P400 however I have issues left and right with 4k content.\u003c/p\u003e\n\u003cp\u003eWhat can I do to still use Jellyfin but get smooth playback?\u003c/p\u003e\n\u003cp\u003eTHe first answer is figure out why I suck with GPUs, but pausing that there\u0026rsquo;s shorter solutions -\u0026gt; namely, use a media player that\u0026rsquo;s compatabile with the encoded content!\u003c/p\u003e\n\u003ch2 id=\"vlc\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eVLC\u003c/span\u003e \u003ca href=\"#vlc\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI\u0026rsquo;ll keep this one short - VLC is great and if you don\u0026rsquo;t need a netflix like experience, I\u0026rsquo;d recommend just using it to browse your network drives and play whatever you have\u003c/p\u003e\n\u003ch2 id=\"jellyfin-web-player\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eJellyfin Web Player\u003c/span\u003e \u003ca href=\"#jellyfin-web-player\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThis is the reason I\u0026rsquo;m writing this post\u0026hellip; the web player is great but not everything is supported on all devices\u003c/p\u003e\n\u003ch2 id=\"jellyfin-mpv-shim\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eJellyfin MPV Shim\u003c/span\u003e \u003ca href=\"#jellyfin-mpv-shim\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThis cross-platform cast client is my answer now.\nYou can find the project \u003ca href=\"https://github.com/jellyfin/jellyfin-mpv-shim/blob/master/README.md#linux-installation\"\u003ehere\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThe installation instrauctions are super straightforward for Windows, Mac OS, or Linux.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m on Linux and so my install went like this:\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\"\u003esudo apt update\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo apt install mpv \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\"\u003epipx install jellyfin-mpv-shim\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epipx inject jellyfin-mpv-shim pystray\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=\"c1\"\u003e#profit\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\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eI used \u003ccode\u003epipx\u003c/code\u003e to install the player as I prefer it for stand alone utilities over pip installing anything globally.\u003c/p\u003e\n\u003cp\u003eAfer that I just start the player at the terminal with \u003ccode\u003ejellyfin-mpv-shim\u003c/code\u003e\nThen in the web browser I can cast my content to the player and bypass the web player (and thus solve much of my transcoding issues) trivially!\u003c/p\u003e\n",
      "content_text": "\n\nI use Jellyfin at home for serving up most of our media - movies and shows etc.\n\nMy dream is to have a GPU capable of transcoding any and all of our media for smooth playback on any device...\nNow, I thought I'd have that by now with my Nvidia Quadro P400 however I have issues left and right with 4k content.\n\nWhat can I do to still use Jellyfin but get smooth playback?\n\nTHe first answer is figure out why I suck with GPUs, but pausing that there's shorter solutions -\u003e namely, use a media player that's compatabile with the encoded content!\n\n## VLC\n\nI'll keep this one short - VLC is great and if you don't need a netflix like experience, I'd recommend just using it to browse your network drives and play whatever you have\n\n## Jellyfin Web Player\n\nThis is the reason I'm writing this post... the web player is great but not everything is supported on all devices\n\n## Jellyfin MPV Shim\n\nThis cross-platform cast client is my answer now.\nYou can find the project [here](https://github.com/jellyfin/jellyfin-mpv-shim/blob/master/README.md#linux-installation)\n\nThe installation instrauctions are super straightforward for Windows, Mac OS, or Linux.\n\nI'm on Linux and so my install went like this:\n\n```bash\n\nsudo apt update\nsudo apt install mpv \n\npipx install jellyfin-mpv-shim\npipx inject jellyfin-mpv-shim pystray\n\n#profit\n\n```\n\nI used `pipx` to install the player as I prefer it for stand alone utilities over pip installing anything globally.\n\nAfer that I just start the player at the terminal with `jellyfin-mpv-shim`\nThen in the web browser I can cast my content to the player and bypass the web player (and thus solve much of my transcoding issues) trivially!\n",
      "summary": "I use Jellyfin at home for serving up most of our media - movies and shows etc.",
      "date_published": "2022-04-17T00:00:00Z",
      "date_modified": "2022-04-17T00:00:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/typeddict/",
      "url": "https://pype.dev/typeddict/",
      "title": "Typeddict",
      "content_html": "\u003cp\u003eType hinting has helped me write code almost as much, if not more, than unit testing.\u003c/p\u003e\n\u003cp\u003eOne thing I love is that with complete type hinting you get a lot more out of your LSP.\nTyping dictionaries can be tricky and I recently learned about \u003ccode\u003eTypedDict\u003c/code\u003e to do exactly what I needed!\u003c/p\u003e\n\u003ch2 id=\"the-problem\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThe Problem\u003c/span\u003e \u003ca href=\"#the-problem\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIt might not be straight up obvious what the problem is, especially if you don\u0026rsquo;t utilize tools like \u003ccode\u003emypy\u003c/code\u003e or \u003ccode\u003eflake8\u003c/code\u003e in your development.\u003c/p\u003e\n\u003cp\u003eMy handy-dandy \u003ccode\u003envim-lsp\u003c/code\u003e gives me a lot of feedback when I\u0026rsquo;m coding and it\u0026rsquo;s immensely helpful.\u003c/p\u003e\n\u003cp\u003eSo with the LSP giving me constant feedback here\u0026rsquo;s the issue:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003etyping\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eDict\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eList\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eUnion\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=\"n\"\u003emy_dict\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eDict\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nb\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eUnion\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eList\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nb\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"nb\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e]]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\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=\"s2\"\u003e\u0026#34;key_1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;val_1\u0026#34;\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=\"s2\"\u003e\u0026#34;key_2\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;ls_1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;ls_2\u0026#34;\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=\"n\"\u003emy_dict\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;key_2\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epop\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWith the above script you\u0026rsquo;ll get an annoying warning about using \u003ccode\u003epop\u003c/code\u003e on \u003ccode\u003ekey_2\u003c/code\u003e.\u003c/p\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/typed-dict-warning.png\" alt=\"typeddict\" title=\"Warning in TypedDict\" /\u003e\n\u003ch2 id=\"the-solution\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThe Solution\u003c/span\u003e \u003ca href=\"#the-solution\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eMaybe you can stomach getting yelled at by your LSP but I like complete silence if at all possible.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eTypedDict\u003c/code\u003e  was the saving grace.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003etyping\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eTypedDict\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=\"n\"\u003eMyDict\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eTypedDict\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;MyDict\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;key_1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;key_2\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eList\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nb\"\u003estr\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003emy_typed_dict\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eMyDict\u003c/span\u003e \u003cspan class=\"o\"\u003e=\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=\"s2\"\u003e\u0026#34;key_1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;val_1\u0026#34;\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=\"s2\"\u003e\u0026#34;key_2\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;ls_1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;ls_2\u0026#34;\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003emy_typed_dict\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;key_2\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epop\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/typed-dict.png\" alt=\"typeddict\" title=\"A TypedDict\" /\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI was able to import TypedDict from typing, mypy_extensions, and typing_extensions\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eWith \u003ccode\u003eTypedDict\u003c/code\u003e you define your custom type, match the first argument to \u003ccode\u003eTypedDict\u003c/code\u003e with the name of the variable (idk why), then type hint each key you expect in the dict!\nIt\u0026rsquo;s super easy and I think puts you into a position of being extremely explicit with your dictionary variables.\nThis isn\u0026rsquo;t always desired or appropriate but in most of my use cases it is.\u003c/p\u003e\n\u003ch2 id=\"rtfm\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRTFM\u003c/span\u003e \u003ca href=\"#rtfm\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThere\u0026rsquo;s other implementation of \u003ccode\u003eTypedDict\u003c/code\u003e and while writing this I saw that most of the docs define a \u003ccode\u003eclass\u003c/code\u003e for the type like this:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003etyping\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eTypedDict\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003eMyDict\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eTypedDict\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=\"n\"\u003ekey_1\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003estr\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ekey_2\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eList\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nb\"\u003estr\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003emy_dict\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eMyDict\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;key_1\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;val_1\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;key_2\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;ls_1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;ls_2\u0026#34;\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\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ca href=\"https://peps.python.org/pep-0589/\"\u003epep docs\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://mypy.readthedocs.io/en/latest/more_types.html#typeddict\"\u003emypy docs\u003c/a\u003e\u003c/p\u003e\n",
      "content_text": "\nType hinting has helped me write code almost as much, if not more, than unit testing.\n\nOne thing I love is that with complete type hinting you get a lot more out of your LSP.\nTyping dictionaries can be tricky and I recently learned about `TypedDict` to do exactly what I needed!\n\n\n## The Problem\n\nIt might not be straight up obvious what the problem is, especially if you don't utilize tools like `mypy` or `flake8` in your development.\n\nMy handy-dandy `nvim-lsp` gives me a lot of feedback when I'm coding and it's immensely helpful.\n\nSo with the LSP giving me constant feedback here's the issue:\n\n```python\nfrom typing import Dict, List, Union\n\nmy_dict: Dict[str, Union[List[str], str]] = {\n    \"key_1\": \"val_1\",\n    \"key_2\": [\"ls_1\", \"ls_2\"],\n}\n\nmy_dict[\"key_2\"].pop()\n```\n\nWith the above script you'll get an annoying warning about using `pop` on `key_2`.\n\n\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/typed-dict-warning.png\" alt=\"typeddict\" title=\"Warning in TypedDict\" /\u003e\n\n\n## The Solution\n\nMaybe you can stomach getting yelled at by your LSP but I like complete silence if at all possible.\n\n`TypedDict`  was the saving grace.\n\n```python\nfrom typing import TypedDict\n\nMyDict = TypedDict(\"MyDict\", {\"key_1\": str, \"key_2\": List[str]})\n\nmy_typed_dict: MyDict = {\n    \"key_1\": \"val_1\",\n    \"key_2\": [\"ls_1\", \"ls_2\"],\n}\n\n\nmy_typed_dict[\"key_2\"].pop()\n```\n\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/typed-dict.png\" alt=\"typeddict\" title=\"A TypedDict\" /\u003e\n\n\u003e I was able to import TypedDict from typing, mypy_extensions, and typing_extensions\n\nWith `TypedDict` you define your custom type, match the first argument to `TypedDict` with the name of the variable (idk why), then type hint each key you expect in the dict!\nIt's super easy and I think puts you into a position of being extremely explicit with your dictionary variables. \nThis isn't always desired or appropriate but in most of my use cases it is.\n\n## RTFM\n\nThere's other implementation of `TypedDict` and while writing this I saw that most of the docs define a `class` for the type like this:\n\n```python\nfrom typing import TypedDict\nclass MyDict(TypedDict):\n    key_1: str\n    key_2: List[str]\n\nmy_dict : MyDict = {'key_1': 'val_1', 'key_2': [\"ls_1\", \"ls_2\"]}\n\n```\n\n[pep docs](https://peps.python.org/pep-0589/)\n\n[mypy docs](https://mypy.readthedocs.io/en/latest/more_types.html#typeddict)\n",
      "summary": "Type hinting has helped me write code almost as much, if not more, than unit testing.",
      "date_published": "2022-04-15T00:00:00Z",
      "date_modified": "2022-04-15T00:00:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "til",
        "python",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/and-vs/",
      "url": "https://pype.dev/and-vs/",
      "title": "And-vs-\u0026",
      "content_html": "\u003cp\u003eI often struggle to remember the correct way to do \u003ccode\u003eand\u003c/code\u003e type comparisons when working in pandas.\u003c/p\u003e\n\u003cp\u003eI remember learning long long ago that \u003ccode\u003eand\u003c/code\u003e and \u003ccode\u003e\u0026amp;\u003c/code\u003e are different, the former being lazy boolean evaluation whereas the latter is a bitwise operation.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eI learned a lot from \u003ca href=\"https://stackoverflow.com/questions/22646463/and-boolean-vs-bitwise-why-difference-in-behavior-with-lists-vs-nump\"\u003ethis SO post\u003c/a\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003ch2 id=\"lists\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eLists\u003c/span\u003e \u003ca href=\"#lists\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003ePython \u003ccode\u003elist\u003c/code\u003e objects can contain unlike elements - ie. \u003ccode\u003e[True, 'foo', 1, '1', [1,2,3]]\u003c/code\u003e is a valid list with booleans, strings, integers, and another list.\nBecause of this, we can\u0026rsquo;t use \u003ccode\u003e\u0026amp;\u003c/code\u003e to compare two lists since they can\u0026rsquo;t be combined in a consistent and meaningful way.\u003c/p\u003e\n\u003cp\u003eHowever we can use \u003ccode\u003eand\u003c/code\u003e since it doesn\u0026rsquo;t do bitwise operations, it just evaluates the boolean value of the list (basically if it\u0026rsquo;s non-empty then \u003ccode\u003ebool(my_list)\u003c/code\u003e evaluates to \u003ccode\u003eTrue\u003c/code\u003e)\u003c/p\u003e\n\u003cp\u003eHere\u0026rsquo;s an example:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e \u003cspan class=\"n\"\u003eNO\u003c/span\u003e \u003cspan class=\"n\"\u003eVCS\u003c/span\u003e  \u003cspan class=\"n\"\u003evia\u003c/span\u003e \u003cspan class=\"mf\"\u003e3.8.11\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eipython\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e❯\u003c/span\u003e \u003cspan class=\"n\"\u003emy_list\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;2\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;foo\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"kc\"\u003eTrue\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"kc\"\u003eFalse\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e \u003cspan class=\"n\"\u003eNO\u003c/span\u003e \u003cspan class=\"n\"\u003eVCS\u003c/span\u003e  \u003cspan class=\"n\"\u003evia\u003c/span\u003e \u003cspan class=\"mf\"\u003e3.8.11\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eipython\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e❯\u003c/span\u003e \u003cspan class=\"nb\"\u003ebool\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003emy_list\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=\"kc\"\u003eTrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eIf we compare \u003ccode\u003emy_list\u003c/code\u003e with \u003ccode\u003eanother_list\u003c/code\u003e using \u003ccode\u003eand\u003c/code\u003e then the comparision will go:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eif bool(my_list):\n    if bool(another_list):\n       \u0026lt;operation\u0026gt; \n    else:\n       break\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eLet\u0026rsquo;s see another example:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e \u003cspan class=\"n\"\u003eNO\u003c/span\u003e \u003cspan class=\"n\"\u003eVCS\u003c/span\u003e  \u003cspan class=\"n\"\u003evia\u003c/span\u003e \u003cspan class=\"mf\"\u003e3.8.11\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eipython\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e❯\u003c/span\u003e \u003cspan class=\"n\"\u003eanother_list\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"kc\"\u003eFalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\u003eFalse\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e \u003cspan class=\"n\"\u003eNO\u003c/span\u003e \u003cspan class=\"n\"\u003eVCS\u003c/span\u003e  \u003cspan class=\"n\"\u003evia\u003c/span\u003e \u003cspan class=\"mf\"\u003e3.8.11\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eipython\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e❯\u003c/span\u003e \u003cspan class=\"n\"\u003emy_list\u003c/span\u003e \u003cspan class=\"ow\"\u003eand\u003c/span\u003e \u003cspan class=\"n\"\u003eanother_list\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\u003cspan class=\"kc\"\u003eFalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\u003eFalse\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003ebool(my_list)\u003c/code\u003e evaluated to \u003ccode\u003eTrue\u003c/code\u003e, and \u003ccode\u003ebool(another_list)\u003c/code\u003e \u003cem\u003ealso\u003c/em\u003e evaluated to \u003ccode\u003eTrue\u003c/code\u003e even though it\u0026rsquo;s full of \u003ccode\u003eFalse\u003c/code\u003e values because the object is non-empty.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e \u003cspan class=\"n\"\u003eNO\u003c/span\u003e \u003cspan class=\"n\"\u003eVCS\u003c/span\u003e  \u003cspan class=\"n\"\u003evia\u003c/span\u003e \u003cspan class=\"mf\"\u003e3.8.11\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eipython\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e❯\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003emy_list\u003c/span\u003e \u003cspan class=\"ow\"\u003eand\u003c/span\u003e \u003cspan class=\"n\"\u003eanother_list\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=\"o\"\u003e...\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e     \u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;foo\u0026#34;\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=\"n\"\u003efoo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSo using \u003ccode\u003eand\u003c/code\u003e in this case results in a \u003ccode\u003eTrue\u003c/code\u003e conditional, so the \u003ccode\u003eprint\u003c/code\u003e statement is executed.\u003c/p\u003e\n\u003cp\u003eFeels kind of counter-intuitive at first glance, to me anyways\u0026hellip;\u003c/p\u003e\n\u003cp\u003eHowever, we can\u0026rsquo;t use \u003ccode\u003e\u0026amp;\u003c/code\u003e because there isn\u0026rsquo;t a meaningful to do bitwise operations over these two lists:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e \u003cspan class=\"n\"\u003eNO\u003c/span\u003e \u003cspan class=\"n\"\u003eVCS\u003c/span\u003e  \u003cspan class=\"n\"\u003evia\u003c/span\u003e \u003cspan class=\"mf\"\u003e3.8.11\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eipython\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e❯\u003c/span\u003e \u003cspan class=\"n\"\u003emy_list\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e \u003cspan class=\"n\"\u003eanother_list\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e╭───────────────────────────────\u003c/span\u003e \u003cspan class=\"n\"\u003eTraceback\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003emost\u003c/span\u003e \u003cspan class=\"n\"\u003erecent\u003c/span\u003e \u003cspan class=\"n\"\u003ecall\u003c/span\u003e \u003cspan class=\"n\"\u003elast\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"err\"\u003e────────────────────────────────╮\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e│\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eipython\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nb\"\u003einput\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e19\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ea2a16cebb3da\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecell\u003c/span\u003e \u003cspan class=\"n\"\u003eline\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e                                              \u003cspan class=\"err\"\u003e│\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e╰──────────────────────────────────────────────────────────────────────────────────────────────────╯\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"ne\"\u003eTypeError\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eunsupported\u003c/span\u003e \u003cspan class=\"n\"\u003eoperand\u003c/span\u003e \u003cspan class=\"nb\"\u003etype\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;list\u0026#39;\u003c/span\u003e \u003cspan class=\"ow\"\u003eand\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;list\u0026#39;\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\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"numpy\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNumpy\u003c/span\u003e \u003ca href=\"#numpy\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003enumpy\u003c/code\u003e arrays are special and they have a lot of fancy vectorization utilities built-in which make them great and fast for mathematical operations but now our logical comparisons need to be handled with a different kind of care.\u003c/p\u003e\n\u003cp\u003eFirst thing though - without some trickery they do not hold mixed data types like a \u003ccode\u003elist\u003c/code\u003e does (necessary, I think, for the vectorized optimization that numpy is built on top of)\u003c/p\u003e\n\u003cp\u003eWith that out of the way here\u0026rsquo;s the main thing for this post, we can\u0026rsquo;t just evaluate the \u003ccode\u003ebool\u003c/code\u003e of an array - numpy says no no no.\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\"\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e \u003cspan class=\"n\"\u003eNO\u003c/span\u003e \u003cspan class=\"n\"\u003eVCS\u003c/span\u003e  \u003cspan class=\"n\"\u003evia\u003c/span\u003e \u003cspan class=\"mf\"\u003e3.8.11\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eipython\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e❯\u003c/span\u003e \u003cspan class=\"n\"\u003earr\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003enp\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003earray\u003c/span\u003e\u003cspan class=\"p\"\u003e([\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\u003eTrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\u003eFalse\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e \u003cspan class=\"n\"\u003eNO\u003c/span\u003e \u003cspan class=\"n\"\u003eVCS\u003c/span\u003e  \u003cspan class=\"n\"\u003evia\u003c/span\u003e \u003cspan class=\"mf\"\u003e3.8.11\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eipython\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e❯\u003c/span\u003e \u003cspan class=\"n\"\u003earr\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003earray\u003c/span\u003e\u003cspan class=\"p\"\u003e([\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;1\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;2\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;True\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;False\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"n\"\u003edtype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\u0026lt;U21\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e \u003cspan class=\"n\"\u003eNO\u003c/span\u003e \u003cspan class=\"n\"\u003eVCS\u003c/span\u003e  \u003cspan class=\"n\"\u003evia\u003c/span\u003e \u003cspan class=\"mf\"\u003e3.8.11\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eipython\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e❯\u003c/span\u003e \u003cspan class=\"nb\"\u003ebool\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003earr\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=\"err\"\u003e╭───────────────────────────────\u003c/span\u003e \u003cspan class=\"n\"\u003eTraceback\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003emost\u003c/span\u003e \u003cspan class=\"n\"\u003erecent\u003c/span\u003e \u003cspan class=\"n\"\u003ecall\u003c/span\u003e \u003cspan class=\"n\"\u003elast\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"err\"\u003e────────────────────────────────╮\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e│\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eipython\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nb\"\u003einput\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e25\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mf\"\u003e4e8\u003c/span\u003e\u003cspan class=\"n\"\u003ec5dd85b93\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecell\u003c/span\u003e \u003cspan class=\"n\"\u003eline\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e                                              \u003cspan class=\"err\"\u003e│\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e╰──────────────────────────────────────────────────────────────────────────────────────────────────╯\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"ne\"\u003eValueError\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eThe\u003c/span\u003e \u003cspan class=\"n\"\u003etruth\u003c/span\u003e \u003cspan class=\"n\"\u003evalue\u003c/span\u003e \u003cspan class=\"n\"\u003eof\u003c/span\u003e \u003cspan class=\"n\"\u003ean\u003c/span\u003e \u003cspan class=\"n\"\u003earray\u003c/span\u003e \u003cspan class=\"k\"\u003ewith\u003c/span\u003e \u003cspan class=\"n\"\u003emore\u003c/span\u003e \u003cspan class=\"n\"\u003ethan\u003c/span\u003e \u003cspan class=\"n\"\u003eone\u003c/span\u003e \u003cspan class=\"n\"\u003eelement\u003c/span\u003e \u003cspan class=\"ow\"\u003eis\u003c/span\u003e \u003cspan class=\"n\"\u003eambiguous\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"n\"\u003eUse\u003c/span\u003e \u003cspan class=\"n\"\u003ea\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eany\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"ow\"\u003eor\u003c/span\u003e \u003cspan class=\"n\"\u003ea\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eall\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\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cblockquote\u003e\n\u003cp\u003eThis means that using \u003ccode\u003eand\u003c/code\u003e with \u003ccode\u003enumpy\u003c/code\u003e arrays doesn\u0026rsquo;t really make sense because we probably care about the truth value of each element (bitwise), not the truth value of the array.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eNotice that when I print \u003ccode\u003earr\u003c/code\u003e all the elements are a string - and the \u003ccode\u003edtype\u003c/code\u003e is \u003ccode\u003e\u0026lt;U21\u003c/code\u003e for all elements.\u003c/p\u003e\n\u003cp\u003eThis is not how I instantiated the array so be aware of that behavior with numpy.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003ccode\u003e\u0026lt;U21\u003c/code\u003e is a dtype expressing the values are \u0026lsquo;Little Endian\u0026rsquo;, Unicode, 12 characters. See \u003ca href=\"https://numpy.org/doc/stable/reference/arrays.dtypes.html#specifying-and-constructing-data-types\"\u003ehere\u003c/a\u003e for docs for docs\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eSo for logical comparisions we should look at the error message then\u0026hellip;\nOur handy error message says to try \u003ccode\u003eany\u003c/code\u003e or \u003ccode\u003eall\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eBecause the datatypes in this example are basically strings, using \u003ccode\u003earr.any()\u003c/code\u003e will result in an error that I do not fully understand, but \u003ccode\u003eany(arr)\u003c/code\u003e and \u003ccode\u003eall(arr)\u003c/code\u003e work\u0026hellip;\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e \u003cspan class=\"n\"\u003eNO\u003c/span\u003e \u003cspan class=\"n\"\u003eVCS\u003c/span\u003e  \u003cspan class=\"n\"\u003evia\u003c/span\u003e \u003cspan class=\"mf\"\u003e3.8.11\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eipython\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e❯\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003earr\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eany\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=\"o\"\u003e...\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e     \u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;foo\u0026#34;\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=\"err\"\u003e╭───────────────────────────────\u003c/span\u003e \u003cspan class=\"n\"\u003eTraceback\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003emost\u003c/span\u003e \u003cspan class=\"n\"\u003erecent\u003c/span\u003e \u003cspan class=\"n\"\u003ecall\u003c/span\u003e \u003cspan class=\"n\"\u003elast\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"err\"\u003e────────────────────────────────╮\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e│\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eipython\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nb\"\u003einput\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e48\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e25\u003c/span\u003e\u003cspan class=\"n\"\u003eecac52db96\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecell\u003c/span\u003e \u003cspan class=\"n\"\u003eline\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e                                              \u003cspan class=\"err\"\u003e│\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e│\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ehome\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eu_paynen3\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003epersonal\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e\u003cspan class=\"o\"\u003e/.\u003c/span\u003e\u003cspan class=\"n\"\u003evenv\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003elib\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003epython3\u003c/span\u003e\u003cspan class=\"mf\"\u003e.8\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003esite\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003epackages\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003enumpy\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ecore\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003e_methods\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ep\u003c/span\u003e \u003cspan class=\"err\"\u003e│\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e│\u003c/span\u003e \u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e57\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003e_any\u003c/span\u003e                                                                                     \u003cspan class=\"err\"\u003e│\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e│\u003c/span\u003e                                                                                                  \u003cspan class=\"err\"\u003e│\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e│\u003c/span\u003e    \u003cspan class=\"mi\"\u003e54\u003c/span\u003e \u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003e_any\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eaxis\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"kc\"\u003eNone\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003edtype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"kc\"\u003eNone\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eout\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"kc\"\u003eNone\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ekeepdims\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"kc\"\u003eFalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ewhere\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"kc\"\u003eTrue\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e               \u003cspan class=\"err\"\u003e│\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e│\u003c/span\u003e    \u003cspan class=\"mi\"\u003e55\u003c/span\u003e \u003cspan class=\"err\"\u003e│\u003c/span\u003e   \u003cspan class=\"c1\"\u003e# Parsing keyword arguments is currently fairly slow, so avoid it for now              │\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e│\u003c/span\u003e    \u003cspan class=\"mi\"\u003e56\u003c/span\u003e \u003cspan class=\"err\"\u003e│\u003c/span\u003e   \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003ewhere\u003c/span\u003e \u003cspan class=\"ow\"\u003eis\u003c/span\u003e \u003cspan class=\"kc\"\u003eTrue\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e                                                                      \u003cspan class=\"err\"\u003e│\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e│\u003c/span\u003e \u003cspan class=\"err\"\u003e❱\u003c/span\u003e  \u003cspan class=\"mi\"\u003e57\u003c/span\u003e \u003cspan class=\"err\"\u003e│\u003c/span\u003e   \u003cspan class=\"err\"\u003e│\u003c/span\u003e   \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eumr_any\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eaxis\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003edtype\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eout\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ekeepdims\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e                                      \u003cspan class=\"err\"\u003e│\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e│\u003c/span\u003e    \u003cspan class=\"mi\"\u003e58\u003c/span\u003e \u003cspan class=\"err\"\u003e│\u003c/span\u003e   \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eumr_any\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eaxis\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003edtype\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eout\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ekeepdims\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ewhere\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003ewhere\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e                             \u003cspan class=\"err\"\u003e│\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e│\u003c/span\u003e    \u003cspan class=\"mi\"\u003e59\u003c/span\u003e                                                                                            \u003cspan class=\"err\"\u003e│\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e│\u003c/span\u003e    \u003cspan class=\"mi\"\u003e60\u003c/span\u003e \u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003e_all\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eaxis\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"kc\"\u003eNone\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003edtype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"kc\"\u003eNone\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eout\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"kc\"\u003eNone\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ekeepdims\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"kc\"\u003eFalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ewhere\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"kc\"\u003eTrue\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e               \u003cspan class=\"err\"\u003e│\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e╰──────────────────────────────────────────────────────────────────────────────────────────────────╯\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eUFuncTypeError\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eufunc\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;logical_or\u0026#39;\u003c/span\u003e \u003cspan class=\"n\"\u003edid\u003c/span\u003e \u003cspan class=\"ow\"\u003enot\u003c/span\u003e \u003cspan class=\"n\"\u003econtain\u003c/span\u003e \u003cspan class=\"n\"\u003ea\u003c/span\u003e \u003cspan class=\"n\"\u003eloop\u003c/span\u003e \u003cspan class=\"k\"\u003ewith\u003c/span\u003e \u003cspan class=\"n\"\u003esignature\u003c/span\u003e \u003cspan class=\"n\"\u003ematching\u003c/span\u003e \u003cspan class=\"n\"\u003etypes\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kc\"\u003eNone\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"err\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"nc\"\u003enumpy\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003edtype\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003estr_\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\u0026gt;) -\u0026gt; None\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=\"n\"\u003esandbox\u003c/span\u003e \u003cspan class=\"n\"\u003eNO\u003c/span\u003e \u003cspan class=\"n\"\u003eVCS\u003c/span\u003e  \u003cspan class=\"n\"\u003evia\u003c/span\u003e \u003cspan class=\"mf\"\u003e3.8.11\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eipython\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=\"err\"\u003e❯\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"nb\"\u003eall\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003earr\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=\"o\"\u003e...\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e     \u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;foo\u0026#34;\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=\"n\"\u003efoo\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=\"n\"\u003esandbox\u003c/span\u003e \u003cspan class=\"n\"\u003eNO\u003c/span\u003e \u003cspan class=\"n\"\u003eVCS\u003c/span\u003e  \u003cspan class=\"n\"\u003evia\u003c/span\u003e \u003cspan class=\"mf\"\u003e3.8.11\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eipython\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e❯\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"nb\"\u003eany\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003earr\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=\"o\"\u003e...\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e     \u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;foo\u0026#34;\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=\"n\"\u003efoo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eLet\u0026rsquo;s change the example to just use integers and see what happens:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e \u003cspan class=\"n\"\u003eNO\u003c/span\u003e \u003cspan class=\"n\"\u003eVCS\u003c/span\u003e  \u003cspan class=\"n\"\u003evia\u003c/span\u003e \u003cspan class=\"mf\"\u003e3.8.11\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eipython\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e❯\u003c/span\u003e \u003cspan class=\"n\"\u003earr2\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003enp\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003earray\u003c/span\u003e\u003cspan class=\"p\"\u003e([\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\u003eTrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\u003eFalse\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e \u003cspan class=\"n\"\u003eNO\u003c/span\u003e \u003cspan class=\"n\"\u003eVCS\u003c/span\u003e  \u003cspan class=\"n\"\u003evia\u003c/span\u003e \u003cspan class=\"mf\"\u003e3.8.11\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eipython\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e❯\u003c/span\u003e \u003cspan class=\"n\"\u003earr2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003earray\u003c/span\u003e\u003cspan class=\"p\"\u003e([\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e \u003cspan class=\"n\"\u003eNO\u003c/span\u003e \u003cspan class=\"n\"\u003eVCS\u003c/span\u003e  \u003cspan class=\"n\"\u003evia\u003c/span\u003e \u003cspan class=\"mf\"\u003e3.8.11\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eipython\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e❯\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003earr2\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eany\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=\"o\"\u003e...\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e     \u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;foo\u0026#34;\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=\"n\"\u003efoo\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=\"n\"\u003esandbox\u003c/span\u003e \u003cspan class=\"n\"\u003eNO\u003c/span\u003e \u003cspan class=\"n\"\u003eVCS\u003c/span\u003e  \u003cspan class=\"n\"\u003evia\u003c/span\u003e \u003cspan class=\"mf\"\u003e3.8.11\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eipython\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e❯\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003earr2\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eall\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=\"o\"\u003e...\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e     \u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;foo\u0026#34;\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\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eAh, now some sanity\u0026hellip;\nFirst, the booleans are stored as integers, which based on this discussion makes sense.\nNext we check if \u003ccode\u003eany\u003c/code\u003e values (this is a bitwise operation) are \u003ccode\u003eTrue\u003c/code\u003e, which we see they are so the conditional evaluates to \u003ccode\u003eTrue\u003c/code\u003e.\nHowver, if we check that \u003ccode\u003eall\u003c/code\u003e values are \u003ccode\u003eTrue\u003c/code\u003e we see they aren\u0026rsquo;t, the last value is \u003ccode\u003eFalse\u003c/code\u003e or \u003ccode\u003e0\u003c/code\u003e so the conditional fails.\u003c/p\u003e\n\u003cp\u003eThis is a different way to evaluate logical conditions than with lists and it\u0026rsquo;s because of the special nature of numpy arrays that allows them to be compared bitwise but on the flip side, there isn\u0026rsquo;t a meaningful way to evaluate the \u003ccode\u003etruth value\u003c/code\u003e of an array.\u003c/p\u003e\n\u003ch2 id=\"pandas\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePandas\u003c/span\u003e \u003ca href=\"#pandas\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eNow for \u003ccode\u003epandas\u003c/code\u003e, which under the hood is a lot of \u003ccode\u003enumpy\u003c/code\u003e but not fully.\n\u003ccode\u003epandas.Series\u003c/code\u003e objects can hold mixed data types like lists, however to logically evaluate truth values we have to treat them like numpy arrays.\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\"\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e \u003cspan class=\"n\"\u003eNO\u003c/span\u003e \u003cspan class=\"n\"\u003eVCS\u003c/span\u003e  \u003cspan class=\"n\"\u003evia\u003c/span\u003e \u003cspan class=\"mf\"\u003e3.8.11\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eipython\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e❯\u003c/span\u003e \u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003epd\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eSeries\u003c/span\u003e\u003cspan class=\"p\"\u003e([\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;foo\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\u003eTrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\u003eFalse\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e \u003cspan class=\"n\"\u003eNO\u003c/span\u003e \u003cspan class=\"n\"\u003eVCS\u003c/span\u003e  \u003cspan class=\"n\"\u003evia\u003c/span\u003e \u003cspan class=\"mf\"\u003e3.8.11\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eipython\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e❯\u003c/span\u003e \u003cspan class=\"n\"\u003es\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=\"mi\"\u003e0\u003c/span\u003e        \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e      \u003cspan class=\"n\"\u003efoo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e     \u003cspan class=\"kc\"\u003eTrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"mi\"\u003e3\u003c/span\u003e    \u003cspan class=\"kc\"\u003eFalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003edtype\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003eobject\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=\"n\"\u003esandbox\u003c/span\u003e \u003cspan class=\"n\"\u003eNO\u003c/span\u003e \u003cspan class=\"n\"\u003eVCS\u003c/span\u003e  \u003cspan class=\"n\"\u003evia\u003c/span\u003e \u003cspan class=\"mf\"\u003e3.8.11\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eipython\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e❯\u003c/span\u003e \u003cspan class=\"nb\"\u003ebool\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003es\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=\"err\"\u003e╭───────────────────────────────\u003c/span\u003e \u003cspan class=\"n\"\u003eTraceback\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003emost\u003c/span\u003e \u003cspan class=\"n\"\u003erecent\u003c/span\u003e \u003cspan class=\"n\"\u003ecall\u003c/span\u003e \u003cspan class=\"n\"\u003elast\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"err\"\u003e────────────────────────────────╮\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e│\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eipython\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nb\"\u003einput\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e60\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mf\"\u003e68e48\u003c/span\u003e\u003cspan class=\"n\"\u003ee81da14\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecell\u003c/span\u003e \u003cspan class=\"n\"\u003eline\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e                                              \u003cspan class=\"err\"\u003e│\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e│\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ehome\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eu_paynen3\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003epersonal\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e\u003cspan class=\"o\"\u003e/.\u003c/span\u003e\u003cspan class=\"n\"\u003evenv\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003elib\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003epython3\u003c/span\u003e\u003cspan class=\"mf\"\u003e.8\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003esite\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003epackages\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003epandas\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ecore\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003egeneric\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ep\u003c/span\u003e \u003cspan class=\"err\"\u003e│\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e│\u003c/span\u003e \u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e1527\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003e__nonzero__\u003c/span\u003e                                                                            \u003cspan class=\"err\"\u003e│\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e│\u003c/span\u003e                                                                                                  \u003cspan class=\"err\"\u003e│\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e│\u003c/span\u003e    \u003cspan class=\"mi\"\u003e1524\u003c/span\u003e \u003cspan class=\"err\"\u003e│\u003c/span\u003e                                                                                        \u003cspan class=\"err\"\u003e│\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e│\u003c/span\u003e    \u003cspan class=\"mi\"\u003e1525\u003c/span\u003e \u003cspan class=\"err\"\u003e│\u003c/span\u003e   \u003cspan class=\"nd\"\u003e@final\u003c/span\u003e                                                                               \u003cspan class=\"err\"\u003e│\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e│\u003c/span\u003e    \u003cspan class=\"mi\"\u003e1526\u003c/span\u003e \u003cspan class=\"err\"\u003e│\u003c/span\u003e   \u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003e__nonzero__\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e                                                               \u003cspan class=\"err\"\u003e│\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e│\u003c/span\u003e \u003cspan class=\"err\"\u003e❱\u003c/span\u003e  \u003cspan class=\"mi\"\u003e1527\u003c/span\u003e \u003cspan class=\"err\"\u003e│\u003c/span\u003e   \u003cspan class=\"err\"\u003e│\u003c/span\u003e   \u003cspan class=\"k\"\u003eraise\u003c/span\u003e \u003cspan class=\"ne\"\u003eValueError\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e                                                                \u003cspan class=\"err\"\u003e│\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e│\u003c/span\u003e    \u003cspan class=\"mi\"\u003e1528\u003c/span\u003e \u003cspan class=\"err\"\u003e│\u003c/span\u003e   \u003cspan class=\"err\"\u003e│\u003c/span\u003e   \u003cspan class=\"err\"\u003e│\u003c/span\u003e   \u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;The truth value of a \u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"nb\"\u003etype\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"vm\"\u003e__name__\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e is ambiguous. \u0026#34;\u003c/span\u003e                 \u003cspan class=\"err\"\u003e│\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e│\u003c/span\u003e    \u003cspan class=\"mi\"\u003e1529\u003c/span\u003e \u003cspan class=\"err\"\u003e│\u003c/span\u003e   \u003cspan class=\"err\"\u003e│\u003c/span\u003e   \u003cspan class=\"err\"\u003e│\u003c/span\u003e   \u003cspan class=\"s2\"\u003e\u0026#34;Use a.empty, a.bool(), a.item(), a.any() or a.all().\u0026#34;\u003c/span\u003e                       \u003cspan class=\"err\"\u003e│\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e│\u003c/span\u003e    \u003cspan class=\"mi\"\u003e1530\u003c/span\u003e \u003cspan class=\"err\"\u003e│\u003c/span\u003e   \u003cspan class=\"err\"\u003e│\u003c/span\u003e   \u003cspan class=\"p\"\u003e)\u003c/span\u003e                                                                                \u003cspan class=\"err\"\u003e│\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e╰──────────────────────────────────────────────────────────────────────────────────────────────────╯\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"ne\"\u003eValueError\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eThe\u003c/span\u003e \u003cspan class=\"n\"\u003etruth\u003c/span\u003e \u003cspan class=\"n\"\u003evalue\u003c/span\u003e \u003cspan class=\"n\"\u003eof\u003c/span\u003e \u003cspan class=\"n\"\u003ea\u003c/span\u003e \u003cspan class=\"n\"\u003eSeries\u003c/span\u003e \u003cspan class=\"ow\"\u003eis\u003c/span\u003e \u003cspan class=\"n\"\u003eambiguous\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"n\"\u003eUse\u003c/span\u003e \u003cspan class=\"n\"\u003ea\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eempty\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ea\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ebool\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e \u003cspan class=\"n\"\u003ea\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eitem\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e \u003cspan class=\"n\"\u003ea\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eany\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"ow\"\u003eor\u003c/span\u003e \u003cspan class=\"n\"\u003ea\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eall\u003c/span\u003e\u003cspan class=\"p\"\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\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eJust like with numpy, we can\u0026rsquo;t evaluate the truth value of the series in a meaningful way, but bitwise operations make perfect sense\u0026hellip;\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\"\u003e\u003cspan class=\"err\"\u003e❯\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003es\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eany\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=\"o\"\u003e...\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e     \u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;foo\u0026#34;\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=\"n\"\u003efoo\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=\"n\"\u003esandbox\u003c/span\u003e \u003cspan class=\"n\"\u003eNO\u003c/span\u003e \u003cspan class=\"n\"\u003eVCS\u003c/span\u003e  \u003cspan class=\"n\"\u003evia\u003c/span\u003e \u003cspan class=\"mf\"\u003e3.8.11\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eipython\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e❯\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003es\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eall\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=\"o\"\u003e...\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e     \u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;foo\u0026#34;\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\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eI thought this was about \u003ccode\u003eand\u003c/code\u003e and \u003ccode\u003e\u0026amp;\u003c/code\u003e\u0026hellip;\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eRight, so recall that \u003ccode\u003eand\u003c/code\u003e is a lazy boolean evaluation (ie. it evaluates the \u0026rsquo;truth value\u0026rsquo; an object) whereas \u003ccode\u003e\u0026amp;\u003c/code\u003e does bitwise comparison.\u003c/p\u003e\n\u003cp\u003eWhat we see then with \u003ccode\u003epandas\u003c/code\u003e and \u003ccode\u003enumpy\u003c/code\u003e is that if we want to do logical comparisons, we need to do them bitwise, ie. use \u003ccode\u003e\u0026amp;\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eKeep in mind though that the data types make a big deal - we can\u0026rsquo;t use \u003ccode\u003e\u0026amp;\u003c/code\u003e with strings  because the bitwise operation isn\u0026rsquo;t supported, for strings we need to use the boolean evaluation.\u003c/p\u003e\n\u003ch2 id=\"the-original-point\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThe Original Point\u003c/span\u003e \u003ca href=\"#the-original-point\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eMy main use case for this is finding elements in a dataframe/series based on 2 or more columns aligning row values\u0026hellip;\u003c/p\u003e\n\u003cp\u003eSay I have a dataframe like this:\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\"\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e \u003cspan class=\"n\"\u003eNO\u003c/span\u003e \u003cspan class=\"n\"\u003eVCS\u003c/span\u003e  \u003cspan class=\"n\"\u003evia\u003c/span\u003e \u003cspan class=\"mf\"\u003e3.8.11\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eipython\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e❯\u003c/span\u003e \u003cspan class=\"n\"\u003edf\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=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"n\"\u003es2\u003c/span\u003e   \u003cspan class=\"n\"\u003es3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e  \u003cspan class=\"mi\"\u003e1\u003c/span\u003e  \u003cspan class=\"mi\"\u003e0\u003c/span\u003e  \u003cspan class=\"n\"\u003efoo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e  \u003cspan class=\"mi\"\u003e1\u003c/span\u003e  \u003cspan class=\"n\"\u003ea\u003c/span\u003e  \u003cspan class=\"n\"\u003ebar\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e  \u003cspan class=\"mi\"\u003e1\u003c/span\u003e  \u003cspan class=\"n\"\u003eb\u003c/span\u003e  \u003cspan class=\"n\"\u003ebaz\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"mi\"\u003e3\u003c/span\u003e  \u003cspan class=\"mi\"\u003e2\u003c/span\u003e  \u003cspan class=\"n\"\u003ea\u003c/span\u003e  \u003cspan class=\"n\"\u003efee\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"mi\"\u003e4\u003c/span\u003e  \u003cspan class=\"mi\"\u003e2\u003c/span\u003e  \u003cspan class=\"mi\"\u003e0\u003c/span\u003e   \u003cspan class=\"n\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eExample use case is I want to get the values in \u003ccode\u003es3\u003c/code\u003e where \u003ccode\u003es\u003c/code\u003e is 1 and \u003ccode\u003es2\u003c/code\u003e is \u0026lsquo;a\u0026rsquo;. ie. I\u0026rsquo;m just after \u003ccode\u003ebar\u003c/code\u003e for now\u0026hellip;\u003c/p\u003e\n\u003cp\u003eUp until now I\u0026rsquo;ve always just tried \u003ccode\u003edf.s3[(df.s == 1) and (df.s2 == \u0026quot;a\u0026quot;)]\u003c/code\u003e the first time and every single time I\u0026rsquo;ve gotten this error that I just haven\u0026rsquo;t ever fully understood:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"ne\"\u003eValueError\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eThe\u003c/span\u003e \u003cspan class=\"n\"\u003etruth\u003c/span\u003e \u003cspan class=\"n\"\u003evalue\u003c/span\u003e \u003cspan class=\"n\"\u003eof\u003c/span\u003e \u003cspan class=\"n\"\u003ea\u003c/span\u003e \u003cspan class=\"n\"\u003eSeries\u003c/span\u003e \u003cspan class=\"ow\"\u003eis\u003c/span\u003e \u003cspan class=\"n\"\u003eambiguous\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"n\"\u003eUse\u003c/span\u003e \u003cspan class=\"n\"\u003ea\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eempty\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ea\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ebool\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e \u003cspan class=\"n\"\u003ea\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eitem\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e \u003cspan class=\"n\"\u003ea\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eany\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"ow\"\u003eor\u003c/span\u003e \u003cspan class=\"n\"\u003ea\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eall\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eBut after this deep dive I think I\u0026rsquo;ve grasped that \u003ccode\u003eand\u003c/code\u003e doesn\u0026rsquo;t actually do what I want here, and in order to do the bitwise comparision I need to use \u003ccode\u003e\u0026amp;\u003c/code\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e \u003cspan class=\"n\"\u003eNO\u003c/span\u003e \u003cspan class=\"n\"\u003eVCS\u003c/span\u003e  \u003cspan class=\"n\"\u003evia\u003c/span\u003e \u003cspan class=\"mf\"\u003e3.8.11\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eipython\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e❯\u003c/span\u003e \u003cspan class=\"n\"\u003edf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003es3\u003c/span\u003e\u003cspan class=\"p\"\u003e[(\u003c/span\u003e\u003cspan class=\"n\"\u003edf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003es2\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;a\u0026#34;\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e    \u003cspan class=\"n\"\u003ebar\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eName\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003es3\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003edtype\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003eobject\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"end\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEnd\u003c/span\u003e \u003ca href=\"#end\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eHopefully this set of ramblings brings some clarity to \u003ccode\u003eand\u003c/code\u003e and \u003ccode\u003e\u0026amp;\u003c/code\u003e and you can Google one less error in the future in your logical comparison workflows 😄\u003c/p\u003e\n",
      "content_text": "\nI often struggle to remember the correct way to do `and` type comparisons when working in pandas.\n\nI remember learning long long ago that `and` and `\u0026` are different, the former being lazy boolean evaluation whereas the latter is a bitwise operation.\n\n__I learned a lot from [this SO post](https://stackoverflow.com/questions/22646463/and-boolean-vs-bitwise-why-difference-in-behavior-with-lists-vs-nump)__\n\n## Lists \n\nPython `list` objects can contain unlike elements - ie. `[True, 'foo', 1, '1', [1,2,3]]` is a valid list with booleans, strings, integers, and another list.\nBecause of this, we can't use `\u0026` to compare two lists since they can't be combined in a consistent and meaningful way.\n\nHowever we can use `and` since it doesn't do bitwise operations, it just evaluates the boolean value of the list (basically if it's non-empty then `bool(my_list)` evaluates to `True`)\n\nHere's an example:\n\n```python\nsandbox NO VCS  via 3.8.11(sandbox) ipython\n❯ my_list = [1, \"2\", \"foo\", [True], False]\n\nsandbox NO VCS  via 3.8.11(sandbox) ipython\n❯ bool(my_list)\nTrue\n```\n\n\nIf we compare `my_list` with `another_list` using `and` then the comparision will go:\n\n```\nif bool(my_list):\n    if bool(another_list):\n       \u003coperation\u003e \n    else:\n       break\n```\n\nLet's see another example:\n\n```python\nsandbox NO VCS  via 3.8.11(sandbox) ipython\n❯ another_list = [False, False]\n\nsandbox NO VCS  via 3.8.11(sandbox) ipython\n❯ my_list and another_list\n[False, False]\n```\n\n\n`bool(my_list)` evaluated to `True`, and `bool(another_list)` _also_ evaluated to `True` even though it's full of `False` values because the object is non-empty.\n\n\n```python\nsandbox NO VCS  via 3.8.11(sandbox) ipython\n❯ if my_list and another_list:\n...:     print(\"foo\")\nfoo\n```\n\nSo using `and` in this case results in a `True` conditional, so the `print` statement is executed.\n\nFeels kind of counter-intuitive at first glance, to me anyways...\n\nHowever, we can't use `\u0026` because there isn't a meaningful to do bitwise operations over these two lists:\n\n```python\nsandbox NO VCS  via 3.8.11(sandbox) ipython\n❯ my_list \u0026 another_list\n╭─────────────────────────────── Traceback (most recent call last) ────────────────────────────────╮\n│ \u003cipython-input-19-a2a16cebb3da\u003e:1 in \u003ccell line: 1\u003e                                              │\n╰──────────────────────────────────────────────────────────────────────────────────────────────────╯\nTypeError: unsupported operand type(s) for \u0026: 'list' and 'list'\n\n```\n\n## Numpy\n\n`numpy` arrays are special and they have a lot of fancy vectorization utilities built-in which make them great and fast for mathematical operations but now our logical comparisons need to be handled with a different kind of care.\n\nFirst thing though - without some trickery they do not hold mixed data types like a `list` does (necessary, I think, for the vectorized optimization that numpy is built on top of)\n\nWith that out of the way here's the main thing for this post, we can't just evaluate the `bool` of an array - numpy says no no no.\n\n```python\n\nsandbox NO VCS  via 3.8.11(sandbox) ipython\n❯ arr = np.array([\"1\", 2, True, False])\n\nsandbox NO VCS  via 3.8.11(sandbox) ipython\n❯ arr\narray(['1', '2', 'True', 'False'], dtype='\u003cU21')\n\nsandbox NO VCS  via 3.8.11(sandbox) ipython\n❯ bool(arr)\n╭─────────────────────────────── Traceback (most recent call last) ────────────────────────────────╮\n│ \u003cipython-input-25-4e8c5dd85b93\u003e:1 in \u003ccell line: 1\u003e                                              │\n╰──────────────────────────────────────────────────────────────────────────────────────────────────╯\nValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()\n\n```\n\n\u003e This means that using `and` with `numpy` arrays doesn't really make sense because we probably care about the truth value of each element (bitwise), not the truth value of the array.\n\nNotice that when I print `arr` all the elements are a string - and the `dtype` is `\u003cU21` for all elements.\n\nThis is not how I instantiated the array so be aware of that behavior with numpy.\n\n\u003e `\u003cU21` is a dtype expressing the values are 'Little Endian', Unicode, 12 characters. See [here](https://numpy.org/doc/stable/reference/arrays.dtypes.html#specifying-and-constructing-data-types) for docs for docs\n\nSo for logical comparisions we should look at the error message then...\nOur handy error message says to try `any` or `all`\n\nBecause the datatypes in this example are basically strings, using `arr.any()` will result in an error that I do not fully understand, but `any(arr)` and `all(arr)` work...\n\n```python\nsandbox NO VCS  via 3.8.11(sandbox) ipython\n❯ if arr.any():\n...:     print(\"foo\")\n╭─────────────────────────────── Traceback (most recent call last) ────────────────────────────────╮\n│ \u003cipython-input-48-25ecac52db96\u003e:1 in \u003ccell line: 1\u003e                                              │\n│ /home/u_paynen3/personal/sandbox/.venv/sandbox/lib/python3.8/site-packages/numpy/core/_methods.p │\n│ y:57 in _any                                                                                     │\n│                                                                                                  │\n│    54 def _any(a, axis=None, dtype=None, out=None, keepdims=False, *, where=True):               │\n│    55 │   # Parsing keyword arguments is currently fairly slow, so avoid it for now              │\n│    56 │   if where is True:                                                                      │\n│ ❱  57 │   │   return umr_any(a, axis, dtype, out, keepdims)                                      │\n│    58 │   return umr_any(a, axis, dtype, out, keepdims, where=where)                             │\n│    59                                                                                            │\n│    60 def _all(a, axis=None, dtype=None, out=None, keepdims=False, *, where=True):               │\n╰──────────────────────────────────────────────────────────────────────────────────────────────────╯\nUFuncTypeError: ufunc 'logical_or' did not contain a loop with signature matching types (None, \u003cclass 'numpy.dtype[str_]'\u003e) -\u003e None\n\nsandbox NO VCS  via 3.8.11(sandbox) ipython\n\n❯ if all(arr):\n...:     print(\"foo\")\nfoo\n\nsandbox NO VCS  via 3.8.11(sandbox) ipython\n❯ if any(arr):\n...:     print(\"foo\")\nfoo\n```\n\nLet's change the example to just use integers and see what happens:\n\n```python\nsandbox NO VCS  via 3.8.11(sandbox) ipython\n❯ arr2 = np.array([1, True, False])\n\nsandbox NO VCS  via 3.8.11(sandbox) ipython\n❯ arr2\narray([1, 1, 0])\n\nsandbox NO VCS  via 3.8.11(sandbox) ipython\n❯ if arr2.any():\n...:     print(\"foo\")\nfoo\n\nsandbox NO VCS  via 3.8.11(sandbox) ipython\n❯ if arr2.all():\n...:     print(\"foo\")\n\n```\n\nAh, now some sanity...\nFirst, the booleans are stored as integers, which based on this discussion makes sense.\nNext we check if `any` values (this is a bitwise operation) are `True`, which we see they are so the conditional evaluates to `True`.\nHowver, if we check that `all` values are `True` we see they aren't, the last value is `False` or `0` so the conditional fails.\n\nThis is a different way to evaluate logical conditions than with lists and it's because of the special nature of numpy arrays that allows them to be compared bitwise but on the flip side, there isn't a meaningful way to evaluate the `truth value` of an array.\n\n\n## Pandas\n\nNow for `pandas`, which under the hood is a lot of `numpy` but not fully. \n`pandas.Series` objects can hold mixed data types like lists, however to logically evaluate truth values we have to treat them like numpy arrays.\n\n```python\n\nsandbox NO VCS  via 3.8.11(sandbox) ipython\n❯ s = pd.Series([1, \"foo\", True, False])\n\nsandbox NO VCS  via 3.8.11(sandbox) ipython\n❯ s\n\n0        1\n1      foo\n2     True\n3    False\ndtype: object\n\nsandbox NO VCS  via 3.8.11(sandbox) ipython\n❯ bool(s)\n╭─────────────────────────────── Traceback (most recent call last) ────────────────────────────────╮\n│ \u003cipython-input-60-68e48e81da14\u003e:1 in \u003ccell line: 1\u003e                                              │\n│ /home/u_paynen3/personal/sandbox/.venv/sandbox/lib/python3.8/site-packages/pandas/core/generic.p │\n│ y:1527 in __nonzero__                                                                            │\n│                                                                                                  │\n│    1524 │                                                                                        │\n│    1525 │   @final                                                                               │\n│    1526 │   def __nonzero__(self):                                                               │\n│ ❱  1527 │   │   raise ValueError(                                                                │\n│    1528 │   │   │   f\"The truth value of a {type(self).__name__} is ambiguous. \"                 │\n│    1529 │   │   │   \"Use a.empty, a.bool(), a.item(), a.any() or a.all().\"                       │\n│    1530 │   │   )                                                                                │\n╰──────────────────────────────────────────────────────────────────────────────────────────────────╯\nValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().\n\n```\n\nJust like with numpy, we can't evaluate the truth value of the series in a meaningful way, but bitwise operations make perfect sense...\n\n```python\n\n❯ if s.any():\n...:     print(\"foo\")\nfoo\n\nsandbox NO VCS  via 3.8.11(sandbox) ipython\n❯ if s.all():\n...:     print(\"foo\")\n\n```\n\n__I thought this was about `and` and `\u0026`...__\n\nRight, so recall that `and` is a lazy boolean evaluation (ie. it evaluates the 'truth value' an object) whereas `\u0026` does bitwise comparison.\n\nWhat we see then with `pandas` and `numpy` is that if we want to do logical comparisons, we need to do them bitwise, ie. use `\u0026`.\n\nKeep in mind though that the data types make a big deal - we can't use `\u0026` with strings  because the bitwise operation isn't supported, for strings we need to use the boolean evaluation.\n\n\n## The Original Point\n\nMy main use case for this is finding elements in a dataframe/series based on 2 or more columns aligning row values...\n\n\nSay I have a dataframe like this:\n```python\n\nsandbox NO VCS  via 3.8.11(sandbox) ipython\n❯ df\n\n   s s2   s3\n0  1  0  foo\n1  1  a  bar\n2  1  b  baz\n3  2  a  fee\n4  2  0   fi\n```\n\nExample use case is I want to get the values in `s3` where `s` is 1 and `s2` is 'a'. ie. I'm just after `bar` for now...\n\nUp until now I've always just tried `df.s3[(df.s == 1) and (df.s2 == \"a\")]` the first time and every single time I've gotten this error that I just haven't ever fully understood:\n\n```python\nValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().\n```\n\nBut after this deep dive I think I've grasped that `and` doesn't actually do what I want here, and in order to do the bitwise comparision I need to use `\u0026`\n\n```python\nsandbox NO VCS  via 3.8.11(sandbox) ipython\n❯ df.s3[(df.s == 1) \u0026 (df.s2 == \"a\")]\n\n1    bar\nName: s3, dtype: object\n```\n\n## End\n\nHopefully this set of ramblings brings some clarity to `and` and `\u0026` and you can Google one less error in the future in your logical comparison workflows 😄\n",
      "summary": "I often struggle to remember the correct way to do type comparisons when working in pandas.",
      "date_published": "2022-04-06T00:00:00Z",
      "date_modified": "2022-04-06T00:00:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "python",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/file-length/",
      "url": "https://pype.dev/file-length/",
      "title": "File-Length",
      "content_html": "\u003cp\u003eI have a specific need for counting the number of lines in a file quickly.\nAt work we use S3 for data storage during our Kedro pipeline development, and in the development process we may end up orphaning several datasets.\nIn order to keep our workspace clean I have a short utility that compares the datasets in a Kedro DataCatalog with the files in the relevant S3 location.\u003c/p\u003e\n\u003cp\u003eTo get that list I run an internal tool like this:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ekedro our-liter \u003cspan class=\"p\"\u003e|\u003c/span\u003e grep s3 \u0026gt;\u0026gt; orphaned_datasets.txt\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis simply parses our internal linter for the lines releated to my s3 linter utility and pipes those lines to a file.\u003c/p\u003e\n\u003cp\u003eTo get a quick idea of how out of wack a pipeline is I could open the text file in vim, git it with the \u003ccode\u003eG\u003c/code\u003e and see what line number I\u0026rsquo;m on but I\u0026rsquo;m way too lazy for that\u0026hellip;\u003c/p\u003e\n\u003ch2 id=\"awk\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAWK\u003c/span\u003e \u003ca href=\"#awk\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003eawk 'END {print NR}' orphaned_datasets.txt\u003c/code\u003e gives me the number of lines and I can alias this to whatever feels appropriate in my \u003ccode\u003ezshrc\u003c/code\u003e!\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ebuilt-ins for the win!\u003c/strong\u003e\u003c/p\u003e\n",
      "content_text": "\nI have a specific need for counting the number of lines in a file quickly.\nAt work we use S3 for data storage during our Kedro pipeline development, and in the development process we may end up orphaning several datasets.\nIn order to keep our workspace clean I have a short utility that compares the datasets in a Kedro DataCatalog with the files in the relevant S3 location.\n\nTo get that list I run an internal tool like this:\n\n```bash\nkedro our-liter | grep s3 \u003e\u003e orphaned_datasets.txt\n```\n\nThis simply parses our internal linter for the lines releated to my s3 linter utility and pipes those lines to a file.\n\nTo get a quick idea of how out of wack a pipeline is I could open the text file in vim, git it with the `G` and see what line number I'm on but I'm way too lazy for that...\n\n## AWK\n\n`awk 'END {print NR}' orphaned_datasets.txt` gives me the number of lines and I can alias this to whatever feels appropriate in my `zshrc`!\n\n__built-ins for the win!__\n",
      "summary": "I have a specific need for counting the number of lines in a file quickly. At work we use S3 for data storage during our Kedro pipeline development, and in...",
      "date_published": "2022-04-04T00:00:00Z",
      "date_modified": "2022-04-04T00:00:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "linux",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/ipython-prompt/",
      "url": "https://pype.dev/ipython-prompt/",
      "title": "Ipython-Prompt",
      "content_html": "\u003cp\u003eI have a \u003ca href=\"/starship\"\u003epost on starship\u003c/a\u003e where I have some notes on how I use starship to make my zsh experience great with a sweet terminal prompt.\u003c/p\u003e\n\u003cp\u003eNow\u0026hellip; I spend quite a bit of time in ipython every day and I got kind of sick of the vanilla experience and wanted something that more closely matched my starship prompt.\u003c/p\u003e\n\u003cp\u003eThere\u0026rsquo;s more to customizing ipython I know for sure but here\u0026rsquo;s 2 things I have going for me\u0026hellip;\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eI use \u003ca href=\"https://pypi.org/project/rich/\"\u003e\u003ccode\u003erich\u003c/code\u003e\u003c/a\u003e authored by @\u003ca href=\"https://twitter.com/willmcgugan\"\u003eWill McGugan\u003c/a\u003e which makes much of my ipython experience great.\nI won\u0026rsquo;t write about that here but you can find my \u003ccode\u003erich\u003c/code\u003e config \u003ca href=\"https://github.com/nicpayne713/dotfiles/blob/main/ipython/.ipython/profile_default/startup/01-rich_init.py\"\u003ehere\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eI used \u003ccode\u003epygments\u003c/code\u003e to customize the ipython prompt with my \u003ccode\u003eipython_config.py\u003c/code\u003e and a startup script, next to my \u003ccode\u003erich\u003c/code\u003e one, called \u003ccode\u003e99-prompt.py\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe scripts inside \u003ccode\u003e~/.ipython/\u0026lt;profile\u0026gt;/startup\u003c/code\u003e are executed in lexigraphical order, so it\u0026rsquo;s nice to name things in the 10\u0026rsquo;s to give room for adding scripts in between others down the line.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"my-prompt\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMy prompt\u003c/span\u003e \u003ca href=\"#my-prompt\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eMy zsh prompt looks a little something like this:\u003c/p\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/zsh-starship-prompt.png\" alt=\"starship\" title=\"A starship prompt\" /\u003e\n\u003cp\u003eAnd after my ipython customiztion it currently (subject to much change but this is as of my dotfiles commit #d22088f6be81a58b5f7dfb73b7a4088cbdd9fece on \u003ccode\u003emain\u003c/code\u003e).\u003c/p\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/ipython-prompt.png\" alt=\"ipython\" title=\"A starship inspired ipython prompt\" /\u003e\n\u003cp\u003eNow in ipython I have an indicator of my working directory, git branch, python environment, and a note that I\u0026rsquo;m in \u003ccode\u003eipython\u003c/code\u003e and not \u003ccode\u003ezsh\u003c/code\u003e.\nI also configured my prompt to warn me if I\u0026rsquo;m \u003cem\u003enot\u003c/em\u003e in a git directory!\u003c/p\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/ipython-prompt-no-git.png\" alt=\"ipython-ng\" title=\"A starship inspired ipython prompt without git\" /\u003e\n\u003cp\u003eAll in all the customization isn\u0026rsquo;t too bad with just 2 specific files.\u003c/p\u003e\n\u003ch2 id=\"ipython_config-py\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eipython_config.py\u003c/span\u003e \u003ca href=\"#ipython_config-py\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThere\u0026rsquo;s several use cases for \u003ccode\u003eipython_config.py\u003c/code\u003e files in several areas on a pc - sometimes you want a common config across users, so you\u0026rsquo;d drop one in \u003ccode\u003e/etc/ipython\u003c/code\u003e and othertimes you have your own which is probably at \u003ccode\u003e~/.ipython\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eMy ipython config mostly has colors defined on \u003ccode\u003epygment tokens\u003c/code\u003e plus a few autorun commands and \u003ccode\u003epyflyby\u003c/code\u003e (see my friend Waylon\u0026rsquo;s post on pyflyby \u003ca href=\"https://waylonwalker.com/pyflyby/\"\u003ehere\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eI wanted to match my ipython somewhat to my tmux and vim color schemes, which I model after the vim-airline theme \u003ccode\u003enight owl\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAfter picking some some colors and saving variables it\u0026rsquo;s a matter of setting colors per token and then referencing those tokens in your version of \u003ccode\u003e99-prompt.py\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eYou can check out my \u003ccode\u003eipython_config.py\u003c/code\u003e \u003ca href=\"https://github.com/nicpayne713/dotfiles/blob/home/ipython/.ipython/profile_default/ipython_config.py\"\u003ehere\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eFor example, I can set \u003ccode\u003eToken.Name.Function\u003c/code\u003e to black, and in \u003ccode\u003eipython\u003c/code\u003e then a function\u0026rsquo;s definition will appear in black text. I set mine to cyan to match my theme.\u003c/p\u003e\n\u003cp\u003eFor the prompt colors just match the keyword in \u003ccode\u003ec.TerminalInteractiveShell.highlighting_style_overrides\u003c/code\u003e with what is referenced inside \u003ca href=\"https://github.com/nicpayne713/dotfiles/blob/home/ipython/.ipython/profile_default/startup/99-prompt.py\"\u003e99-prompt.py\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eFor example, \u003ccode\u003eToken.Prompt\u003c/code\u003e is set to \u003ccode\u003ebold grey\u003c/code\u003e which gives me the bold chevron symbol you see in the above image that looks like my zsh prompt\u003c/p\u003e\n\u003cp\u003eThen in \u003ccode\u003e99-prompt.py\u003c/code\u003e I have this set for the prompt:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eToken\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePrompt\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;❯ \u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"99-prompt-py\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e99-prompt.py\u003c/span\u003e \u003ca href=\"#99-prompt-py\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eYou don\u0026rsquo;t need to name your script \u003ccode\u003e99-prompt.py\u003c/code\u003e, but I wanted to know that it was for my prompt and I wanted it executed last so it made sense.\u003c/p\u003e\n\u003cp\u003eHere I have \u003ccode\u003eMyPrompt\u003c/code\u003e class with the prompt symbol defined as above and several other things\u0026hellip;\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003eMyPrompt\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ePrompts\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\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003ein_prompt_tokens\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ecli\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"kc\"\u003eNone\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\"\u003ereturn\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\u003cspan class=\"n\"\u003eToken\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\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\u003cspan class=\"n\"\u003eToken\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eOutPrompt\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ePath\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eabsolute\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estem\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\u003cspan class=\"n\"\u003eToken\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34; \u0026#34;\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\u003cspan class=\"n\"\u003eToken\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGeneric\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eSubheading\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eget_branch\u003c/span\u003e\u003cspan class=\"p\"\u003e()[\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\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\u003cspan class=\"n\"\u003eToken\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34; \u0026#34;\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\u003cspan class=\"n\"\u003eToken\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGeneric\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eHeading\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eget_branch\u003c/span\u003e\u003cspan class=\"p\"\u003e()[\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\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\u003cspan class=\"n\"\u003eToken\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34; \u0026#34;\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\u003cspan class=\"n\"\u003eToken\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eName\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eClass\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;via \u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"n\"\u003eget_venv\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\u003cspan class=\"n\"\u003eToken\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34; \u0026#34;\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\u003cspan class=\"n\"\u003eToken\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eName\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eEntity\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;ipython\u0026#34;\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\u003cspan class=\"n\"\u003eToken\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\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                \u003cspan class=\"n\"\u003eToken\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePrompt\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eshell\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003elast_execution_succeeded\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"n\"\u003eToken\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGeneric\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eError\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=\"s2\"\u003e\u0026#34;❯ \u0026#34;\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        \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\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNotice I have 2 custom functions here, \u003ccode\u003eget_branch\u003c/code\u003e and \u003ccode\u003eget_venv\u003c/code\u003e which grab some git info and python env info and return strings I can dump into my prompt as shown above.\u003c/p\u003e\n\u003cp\u003eTo finish you drop \u003ccode\u003eip = get_ipython()\u003c/code\u003e and \u003ccode\u003eip.prompts = MyPrompt(ip)\u003c/code\u003e at the bottom of your prompt script and you should be in custom prompt city!\u003c/p\u003e\n\u003ch2 id=\"end\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEnd\u003c/span\u003e \u003ca href=\"#end\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThis is more or less notes for myself on how this works - drop by my \u003ca href=\"https://github.com/nicpayne713/dotfiles/tree/home/ipython\"\u003eipython config\u003c/a\u003e in my dotfiles repo to see my full configs for ipython!\u003c/p\u003e\n",
      "content_text": "\nI have a [post on starship](/starship) where I have some notes on how I use starship to make my zsh experience great with a sweet terminal prompt.\n\nNow... I spend quite a bit of time in ipython every day and I got kind of sick of the vanilla experience and wanted something that more closely matched my starship prompt.\n\nThere's more to customizing ipython I know for sure but here's 2 things I have going for me...\n\n1. I use [`rich`](https://pypi.org/project/rich/) authored by @[Will McGugan](https://twitter.com/willmcgugan) which makes much of my ipython experience great.\nI won't write about that here but you can find my `rich` config [here](https://github.com/nicpayne713/dotfiles/blob/main/ipython/.ipython/profile_default/startup/01-rich_init.py)\n\n2. I used `pygments` to customize the ipython prompt with my `ipython_config.py` and a startup script, next to my `rich` one, called `99-prompt.py`.\n\n\u003e The scripts inside `~/.ipython/\u003cprofile\u003e/startup` are executed in lexigraphical order, so it's nice to name things in the 10's to give room for adding scripts in between others down the line.\n\n## My prompt\n\nMy zsh prompt looks a little something like this:\n\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/zsh-starship-prompt.png\" alt=\"starship\" title=\"A starship prompt\" /\u003e\n\n\nAnd after my ipython customiztion it currently (subject to much change but this is as of my dotfiles commit #d22088f6be81a58b5f7dfb73b7a4088cbdd9fece on `main`).\n\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/ipython-prompt.png\" alt=\"ipython\" title=\"A starship inspired ipython prompt\" /\u003e\n\nNow in ipython I have an indicator of my working directory, git branch, python environment, and a note that I'm in `ipython` and not `zsh`.\nI also configured my prompt to warn me if I'm _not_ in a git directory!\n\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/ipython-prompt-no-git.png\" alt=\"ipython-ng\" title=\"A starship inspired ipython prompt without git\" /\u003e\n\nAll in all the customization isn't too bad with just 2 specific files.\n\n## ipython_config.py\n\nThere's several use cases for `ipython_config.py` files in several areas on a pc - sometimes you want a common config across users, so you'd drop one in `/etc/ipython` and othertimes you have your own which is probably at `~/.ipython`\n\nMy ipython config mostly has colors defined on `pygment tokens` plus a few autorun commands and `pyflyby` (see my friend Waylon's post on pyflyby [here](https://waylonwalker.com/pyflyby/))\n\nI wanted to match my ipython somewhat to my tmux and vim color schemes, which I model after the vim-airline theme `night owl`.\n\nAfter picking some some colors and saving variables it's a matter of setting colors per token and then referencing those tokens in your version of `99-prompt.py`.\n\nYou can check out my `ipython_config.py` [here](https://github.com/nicpayne713/dotfiles/blob/home/ipython/.ipython/profile_default/ipython_config.py)\n\nFor example, I can set `Token.Name.Function` to black, and in `ipython` then a function's definition will appear in black text. I set mine to cyan to match my theme.\n\nFor the prompt colors just match the keyword in `c.TerminalInteractiveShell.highlighting_style_overrides` with what is referenced inside [99-prompt.py](https://github.com/nicpayne713/dotfiles/blob/home/ipython/.ipython/profile_default/startup/99-prompt.py)\n\nFor example, `Token.Prompt` is set to `bold grey` which gives me the bold chevron symbol you see in the above image that looks like my zsh prompt \n\nThen in `99-prompt.py` I have this set for the prompt:\n\n```python\nToken.Prompt \"❯ \"\n```\n\n## 99-prompt.py\n\nYou don't need to name your script `99-prompt.py`, but I wanted to know that it was for my prompt and I wanted it executed last so it made sense.\n\nHere I have `MyPrompt` class with the prompt symbol defined as above and several other things... \n\n```python\nclass MyPrompt(Prompts):\n    def in_prompt_tokens(self, cli=None):\n        return [\n            (Token, \"\"),\n            (Token.OutPrompt, Path().absolute().stem),\n            (Token, \" \"),\n            (Token.Generic.Subheading, get_branch()[0]),\n            (Token, \" \"),\n            (Token.Generic.Heading, get_branch()[1]),\n            (Token, \" \"),\n            (Token.Name.Class, \"via \" + get_venv()),\n            (Token, \" \"),\n            (Token.Name.Entity, \"ipython\"),\n            (Token, \"\\n\"),\n            (\n                Token.Prompt\n                if self.shell.last_execution_succeeded\n                else Token.Generic.Error,\n                \"❯ \",\n            ),\n        ]\n\n```\n\nNotice I have 2 custom functions here, `get_branch` and `get_venv` which grab some git info and python env info and return strings I can dump into my prompt as shown above.\n\nTo finish you drop `ip = get_ipython()` and `ip.prompts = MyPrompt(ip)` at the bottom of your prompt script and you should be in custom prompt city!\n\n## End\n\nThis is more or less notes for myself on how this works - drop by my [ipython config](https://github.com/nicpayne713/dotfiles/tree/home/ipython) in my dotfiles repo to see my full configs for ipython!\n",
      "summary": "I have a post on starship where I have some notes on how I use starship to make my zsh experience great with a sweet terminal prompt.",
      "date_published": "2022-04-02T00:00:00Z",
      "date_modified": "2022-04-02T00:00:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "python",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/vim-spell-check/",
      "url": "https://pype.dev/vim-spell-check/",
      "title": "Vim-Spell-Check",
      "content_html": "\u003cp\u003e\u003cstrong\u003eDid you know you can spell check in Vim?!\u003c/strong\u003e\u003c/p\u003e\n\u003c!DOCTYPE html\u003e\n\u003chtml\u003e\n   \u003chead\u003e\n      \u003ctitle\u003eVim Spell check\u003c/title\u003e\n   \u003c/head\u003e\n   \u003cbody\u003e\n      \u003ch3 id=\"without\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWithout...\u003c/span\u003e \u003ca href=\"#without\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n      \u003cp\u003eHere is a missspelled word.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e  \u0026lt;h3\u0026gt;With!\u0026lt;/h3\u0026gt;\n  \u0026lt;p\u0026gt;Here is a \u0026lt;u\u0026gt;missspelled\u0026lt;/u\u0026gt; word.\u0026lt;/p\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\n   \u003c/body\u003e\n\u003c/html\u003e\n\u003ch2 id=\"what-is-this-magic\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhat is this magic???\u003c/span\u003e \u003ca href=\"#what-is-this-magic\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003eset: spell spelllang=en_us\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"custom-words\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCustom words?\u003c/span\u003e \u003ca href=\"#custom-words\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eSometimes there\u0026rsquo;s things that are words to you but not the default spell checker\u0026hellip;\u003c/p\u003e\n\u003cp\u003eCommon example: package names!\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eplotly\u003c/code\u003e, \u003ccode\u003estreamlit\u003c/code\u003e, \u003ccode\u003epsutil\u003c/code\u003e, etc etc\u0026hellip;\u003c/p\u003e\n\u003cp\u003eYou can easily add these to your vim config by hitting \u003ccode\u003ezw\u003c/code\u003e ontop of the word!\u003c/p\u003e\n",
      "content_text": "\n__Did you know you can spell check in Vim?!__\n\n\n\u003c!DOCTYPE html\u003e\n\u003chtml\u003e\n   \u003chead\u003e\n      \u003ctitle\u003eVim Spell check\u003c/title\u003e\n   \u003c/head\u003e\n\n   \u003cbody\u003e\n      \u003ch3\u003eWithout...\u003c/h3\u003e\n      \u003cp\u003eHere is a missspelled word.\u003c/p\u003e\n\n      \u003ch3\u003eWith!\u003c/h3\u003e\n      \u003cp\u003eHere is a \u003cu\u003emissspelled\u003c/u\u003e word.\u003c/p\u003e\n\n   \u003c/body\u003e\n\u003c/html\u003e\n\n## What is this magic???\n\n`set: spell spelllang=en_us`\n\n\n## Custom words?\n\nSometimes there's things that are words to you but not the default spell checker...\n\nCommon example: package names!\n\n`plotly`, `streamlit`, `psutil`, etc etc...\n\n\nYou can easily add these to your vim config by hitting `zw` ontop of the word!\n",
      "summary": "__",
      "date_published": "2022-04-01T00:00:00Z",
      "date_modified": "2022-04-01T00:00:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "vim",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/polybar-01/",
      "url": "https://pype.dev/polybar-01/",
      "title": "Polybar-01",
      "content_html": "\u003cp\u003e\u003ca href=\"https://github.com/polybar/polybar\"\u003epolybar\u003c/a\u003e is an awesome and super customizable status bar for your desktop environment.\u003c/p\u003e\n\u003cp\u003eI use it with i3-gaps on Ubuntu for work and it makes my day just that much better to have a clean and elegant bar with the things in it that I care about.\u003c/p\u003e\n\u003cp\u003eThe GitHub has all the instructions you\u0026rsquo;d need to install and get started with an example.\u003c/p\u003e\n\u003cp\u003eI want to make some notes about how I use polybar and customize it.\u003c/p\u003e\n\u003ch2 id=\"organization\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOrganization\u003c/span\u003e \u003ca href=\"#organization\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eFirst of all, I recently moved my polybar config out of one config file into a modular structure that keeps my config files small and easiser to edit.\u003c/p\u003e\n\u003cp\u003eYou can find my config \u003ca href=\"https://github.com/nicpayne713/dotfiles/tree/main/polybar\"\u003ehere\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThe apps or services you put into polybar are called \u003ccode\u003emodules\u003c/code\u003e.\nI have moved all of my modules into their own config files and I source them with one centralized \u003ccode\u003einclude-modules.ini\u003c/code\u003e config.\u003c/p\u003e\n\u003cp\u003eThis separation also makes it easier for me to keep my home and work polybars as in sync as possible without duplicating a ton of config!\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e./polybar\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├── colors.ini\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├── config.ini\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├── fonts.ini\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├── home-modules.ini\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├── include-modules.ini\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├── launch.sh\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├── modules\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│   ├── aws.ini\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│   ├── battery.ini\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│   ├── bluetooth.ini\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│   ├── cisco.ini\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│   ├── cpu.ini\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│   ├── date.ini\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│   ├── eth.ini\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│   ├── eth_work.ini\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│   ├── i3.ini\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│   ├── memory.ini\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│   ├── nm-editor.ini\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│   ├── powermenu.ini\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│   ├── pulseaudio-control.ini\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│   ├── pulseaudio.ini\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│   ├── rofi.ini\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│   ├── vpn.ini\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│   └── wlan.ini\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e└── work-modules.ini\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=\"m\"\u003e1\u003c/span\u003e directory, \u003cspan class=\"m\"\u003e24\u003c/span\u003e files\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eTo break this down there are several configs to see:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003ccode\u003ecolors.ini\u003c/code\u003e is what you\u0026rsquo;d expect - a set of defined colors like \u003ccode\u003eforeground\u003c/code\u003e, \u003ccode\u003eunderline\u003c/code\u003e, etc.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003econfig.ini\u003c/code\u003e is the general polybar config file where bars are defined. Currently in mine there is a \u003ccode\u003ework\u003c/code\u003e and \u003ccode\u003ehome\u003c/code\u003e bar defined with the modules sourced in from the explicit config files.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efonts.ini \u003c/code\u003e is like \u003ccode\u003ecolors.ini\u003c/code\u003e -\u0026gt; you put fonts here. I recommend using a font patched with NerdFont so you get fancy icons! (I use JetBrains Mono)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003einclude-modules.ini\u003c/code\u003e is where I list out all the config files in \u003ccode\u003emodules/\u003c/code\u003e so I can basically source just the \u003ccode\u003einclude-modules.ini\u003c/code\u003e without explicitly sourcing every module\u0026rsquo;s config in every polybar defintion.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003elaunch.sh\u003c/code\u003e is a simple shell script to launch the polybar! You\u0026rsquo;ll see mine takes multiple monitors into consideration which I manage via environment variables setup in my \u003ccode\u003e.zshenv\u003c/code\u003e file that is different for my work and home setups.\u003c/li\u003e\n\u003cli\u003eFinally there are \u003ccode\u003ehome-modules.ini\u003c/code\u003e and \u003ccode\u003ework-modules.ini\u003c/code\u003e which is where, for each of my bars, I define which modules I want!\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"config\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfig\u003c/span\u003e \u003ca href=\"#config\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eMy \u003ccode\u003econfig.ini\u003c/code\u003e file has 2 bar definitions in it - here\u0026rsquo;s my home one:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003einclude-file\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e$DOTFILES/polybar/include-modules.ini\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=\"k\"\u003e[bar/home]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003emonitor\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e${env:MONITOR:}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003ewidth\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e100%\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003eheight\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e25\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003eradius\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e8.0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003efixed-center\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003ebottom\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003efalse\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=\"na\"\u003ebackground\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e${colors.background}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003eforeground\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e${colors.foreground}\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=\"na\"\u003einclude-file\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e$DOTFILES/polybar/fonts.ini\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003einclude-file\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e$DOTFILES/polybar/home-modules.ini\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eIt should be easy to follow - I bring in the \u003ccode\u003einclude-modules\u003c/code\u003e, set a few colors for the bar like \u003ccode\u003ebackground\u003c/code\u003e and \u003ccode\u003eforeground\u003c/code\u003e which are sourced by the \u003ccode\u003ecolors.ini\u003c/code\u003e, and finally bring in my fonts and home modules via their config files!\u003c/p\u003e\n\u003cp\u003eIt\u0026rsquo;s super easy to then change one or two things in the appropriate places rather than combing through one massive config. This also makes it easy for me to seperate my work and home setups.\u003c/p\u003e\n\u003ch2 id=\"modules\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eModules\u003c/span\u003e \u003ca href=\"#modules\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThere are several builtin modules, like \u003ccode\u003ewlan\u003c/code\u003e which gives your wifi status right there in polybar.\u003c/p\u003e\n\u003cp\u003eYou can also make custom ones.\nA big-time custom one for me is an indicator of whether or not I have an active AWS token for working with the \u003ccode\u003eaws\u003c/code\u003e cli.\u003c/p\u003e\n\u003cp\u003eThis is defined in\u003ccode\u003e modules/aws.ini\u003c/code\u003e and it looks like this:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e[module/aws]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003einterval\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e5.0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003etype\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003ecustom/script\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003eexec\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003ehas_aws_token\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003eclick-left\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e$HOME/.local/bin/auto_get_aws_token\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003eclick-right\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003erm -rf ~/.aws/credentials\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eEvery \u003ccode\u003e5\u003c/code\u003e seconds my \u003ccode\u003ehas_aws_token\u003c/code\u003e script is ran.\nThat script looks like this:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#!/bin/bash\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003esource\u003c/span\u003e auto_proxy\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eaws sts get-caller-identity \u003cspan class=\"p\"\u003e\u0026amp;\u003c/span\u003e\u0026gt; /dev/null \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;%{T5}%{F#00ff00}  %{F-}%{T-}\u0026#34;\u003c/span\u003e  \u003cspan class=\"o\"\u003e||(\u003c/span\u003e \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;%{T5}%{F#ff0000} %{F-}%{T-}\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSee how the script echos out a colored icon to indicate the status of my token -\u0026gt; that icon is displayed in the polybar so I have real-time (5 second latency) status of whether or not I can do things in my AWS environment.\u003c/p\u003e\n\u003cp\u003eIn the module I also configured actions for \u003ccode\u003eclick-left\u003c/code\u003e and \u003ccode\u003eclick-right\u003c/code\u003e which are as straight forward as could be.\u003c/p\u003e\n\u003ch2 id=\"my-issues-with-i3\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMy issues with i3\u003c/span\u003e \u003ca href=\"#my-issues-with-i3\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThere\u0026rsquo;s a few things to be considerate of if you use \u003ccode\u003ei3\u003c/code\u003e such as needing a workaround for a centered bar that \u003cstrong\u003eis not\u003c/strong\u003e the full width of the monitor.\nPolybar can look really nice by not taking up the full width of the bar which you can configure in \u003ccode\u003econfig.ini\u003c/code\u003e with these options:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003ewidth\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e90%\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003eoffset-x\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e5%  # set to (100 - width) / 2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eHowever due to an issue with polybar and i3 you need to also set \u003ccode\u003eoverride-redirect = true\u003c/code\u003e.\nBUT then you\u0026rsquo;ll notice that the bar overlaps your i3 windows\u0026hellip; ARGH! what do we do?\u003c/p\u003e\n\u003cp\u003eQuick work around is to set \u003ccode\u003egaps top\u003c/code\u003e in your i3 config if you use i3-gaps\u0026hellip; if not? well, idk\u0026hellip; use gaps\u0026hellip; lol\u003c/p\u003e\n\u003cp\u003eHowever this introduces another issue - which is then full screen windows will  have polybar sitting on top of them\u0026hellip;\u003c/p\u003e\n\u003cp\u003eThis isn\u0026rsquo;t necessarily a deal breaker, but for me it\u0026rsquo;s worth it to just have the bar go 100% width.\u003c/p\u003e\n\u003ch2 id=\"fin\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFIN\u003c/span\u003e \u003ca href=\"#fin\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThere\u0026rsquo;s a tiny intro to polybar and how I organize my config files so things are easy to edit and manage!\nFeel free to grab mine and try it out!\u003c/p\u003e\n",
      "content_text": "\n[polybar](https://github.com/polybar/polybar) is an awesome and super customizable status bar for your desktop environment.\n\nI use it with i3-gaps on Ubuntu for work and it makes my day just that much better to have a clean and elegant bar with the things in it that I care about.\n\nThe GitHub has all the instructions you'd need to install and get started with an example.\n\nI want to make some notes about how I use polybar and customize it.\n\n## Organization\n\nFirst of all, I recently moved my polybar config out of one config file into a modular structure that keeps my config files small and easiser to edit.\n\nYou can find my config [here](https://github.com/nicpayne713/dotfiles/tree/main/polybar)\n\nThe apps or services you put into polybar are called `modules`.\nI have moved all of my modules into their own config files and I source them with one centralized `include-modules.ini` config.\n\nThis separation also makes it easier for me to keep my home and work polybars as in sync as possible without duplicating a ton of config!\n\n```bash\n./polybar\n├── colors.ini\n├── config.ini\n├── fonts.ini\n├── home-modules.ini\n├── include-modules.ini\n├── launch.sh\n├── modules\n│   ├── aws.ini\n│   ├── battery.ini\n│   ├── bluetooth.ini\n│   ├── cisco.ini\n│   ├── cpu.ini\n│   ├── date.ini\n│   ├── eth.ini\n│   ├── eth_work.ini\n│   ├── i3.ini\n│   ├── memory.ini\n│   ├── nm-editor.ini\n│   ├── powermenu.ini\n│   ├── pulseaudio-control.ini\n│   ├── pulseaudio.ini\n│   ├── rofi.ini\n│   ├── vpn.ini\n│   └── wlan.ini\n└── work-modules.ini\n\n1 directory, 24 files\n```\n\nTo break this down there are several configs to see:\n\n1. `colors.ini` is what you'd expect - a set of defined colors like `foreground`, `underline`, etc.\n2. `config.ini` is the general polybar config file where bars are defined. Currently in mine there is a `work` and `home` bar defined with the modules sourced in from the explicit config files.\n3. `fonts.ini ` is like `colors.ini` -\u003e you put fonts here. I recommend using a font patched with NerdFont so you get fancy icons! (I use JetBrains Mono)\n4. `include-modules.ini` is where I list out all the config files in `modules/` so I can basically source just the `include-modules.ini` without explicitly sourcing every module's config in every polybar defintion.\n5. `launch.sh` is a simple shell script to launch the polybar! You'll see mine takes multiple monitors into consideration which I manage via environment variables setup in my `.zshenv` file that is different for my work and home setups.\n6. Finally there are `home-modules.ini` and `work-modules.ini` which is where, for each of my bars, I define which modules I want!\n\n## Config\n\nMy `config.ini` file has 2 bar definitions in it - here's my home one:\n\n```ini\ninclude-file = $DOTFILES/polybar/include-modules.ini\n\n[bar/home]\nmonitor = ${env:MONITOR:}\nwidth = 100%\nheight = 25\nradius = 8.0\nfixed-center = true\nbottom = false\n\nbackground = ${colors.background}\nforeground = ${colors.foreground}\n\ninclude-file = $DOTFILES/polybar/fonts.ini\ninclude-file = $DOTFILES/polybar/home-modules.ini\n```\n\nIt should be easy to follow - I bring in the `include-modules`, set a few colors for the bar like `background` and `foreground` which are sourced by the `colors.ini`, and finally bring in my fonts and home modules via their config files!\n\nIt's super easy to then change one or two things in the appropriate places rather than combing through one massive config. This also makes it easy for me to seperate my work and home setups.\n\n\n## Modules\n\nThere are several builtin modules, like `wlan` which gives your wifi status right there in polybar.\n\nYou can also make custom ones. \nA big-time custom one for me is an indicator of whether or not I have an active AWS token for working with the `aws` cli.\n\nThis is defined in` modules/aws.ini` and it looks like this:\n\n```ini\n[module/aws]\ninterval = 5.0\ntype = custom/script\nexec = has_aws_token\nclick-left = $HOME/.local/bin/auto_get_aws_token\nclick-right = rm -rf ~/.aws/credentials\n```\n\nEvery `5` seconds my `has_aws_token` script is ran.\nThat script looks like this:\n\n```bash\n#!/bin/bash\nsource auto_proxy\naws sts get-caller-identity \u0026\u003e /dev/null \u0026\u0026 echo \"%{T5}%{F#00ff00}  %{F-}%{T-}\"  ||( echo \"%{T5}%{F#ff0000} %{F-}%{T-}\" )\n```\n\nSee how the script echos out a colored icon to indicate the status of my token -\u003e that icon is displayed in the polybar so I have real-time (5 second latency) status of whether or not I can do things in my AWS environment.\n\nIn the module I also configured actions for `click-left` and `click-right` which are as straight forward as could be.\n\n## My issues with i3\n\n\nThere's a few things to be considerate of if you use `i3` such as needing a workaround for a centered bar that __is not__ the full width of the monitor.\nPolybar can look really nice by not taking up the full width of the bar which you can configure in `config.ini` with these options:\n\n```ini\nwidth = 90%\noffset-x = 5%  # set to (100 - width) / 2\n```\n\nHowever due to an issue with polybar and i3 you need to also set `override-redirect = true`. \nBUT then you'll notice that the bar overlaps your i3 windows... ARGH! what do we do?\n\nQuick work around is to set `gaps top` in your i3 config if you use i3-gaps... if not? well, idk... use gaps... lol\n\nHowever this introduces another issue - which is then full screen windows will  have polybar sitting on top of them...\n\nThis isn't necessarily a deal breaker, but for me it's worth it to just have the bar go 100% width.\n\n\n## FIN\n\nThere's a tiny intro to polybar and how I organize my config files so things are easy to edit and manage!\nFeel free to grab mine and try it out!\n",
      "summary": "polybar is an awesome and super customizable status bar for your desktop environment.",
      "date_published": "2022-04-01T00:00:00Z",
      "date_modified": "2022-04-01T00:00:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "linux",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/deques/",
      "url": "https://pype.dev/deques/",
      "title": "Deques",
      "content_html": "\u003cp\u003eI am working on a project to create a small system monitoring dashboard using the python \u003ccode\u003epsutil\u003c/code\u003e library.\u003c/p\u003e\n\u003cp\u003eThe repo is \u003ca href=\"https://github.com/nicpayne713/not-netdata\"\u003ehere\u003c/a\u003e (if you want actual system monitoring please use \u003ca href=\"https://www.netdata.cloud/\"\u003enetdata\u003c/a\u003e).\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m using \u003ccode\u003estreamlit\u003c/code\u003e and \u003ccode\u003eplotly\u003c/code\u003e for the webserver, design, and plotting at the moment.\u003c/p\u003e\n\u003ch2 id=\"my-use-case\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMy Use Case\u003c/span\u003e \u003ca href=\"#my-use-case\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI needed a way to refresh my plotly charts with a fixed window of time so that I\u0026rsquo;m able to just see relevant recent data instead of cramming all data for all time into one plot that\u0026rsquo;s 500 pixels wide\u0026hellip;\u003c/p\u003e\n\u003cp\u003eChecking the length of arrays or lists every time I get a new piece of data feels kind of dumb and I thought \u0026ldquo;python must have a way to do this\u0026rdquo;\u0026hellip;\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u0026ldquo;This\u0026rdquo; meaning, update values in a fixed length array without reallocating memory or recreating a copy of the list\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"deques\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDeques\u003c/span\u003e \u003ca href=\"#deques\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eEnter the \u003ccode\u003edeque\u003c/code\u003e.\nIt means \u0026ldquo;double ended queue\u0026rdquo; and is in general an \u003ccode\u003eIterable\u003c/code\u003e that you can append values to either side or pop values from either side.\u003c/p\u003e\n\u003cp\u003eThe init signature is straightforward enough and I\u0026rsquo;m sure there\u0026rsquo;s more to them than I know yet but here\u0026rsquo;s how I use it\u0026hellip;\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003ecollections\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003edeque\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=\"n\"\u003emy_deque\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003edeque\u003c/span\u003e\u003cspan class=\"p\"\u003e([\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis gives us \u003ccode\u003emy_deque\u003c/code\u003e, created from an iterable, with several familiar methods like \u003ccode\u003eindex\u003c/code\u003e, \u003ccode\u003eextend\u003c/code\u003e, \u003ccode\u003eappend\u003c/code\u003e, etc.\nHowever there\u0026rsquo;s some new ones too such as \u003ccode\u003eappendleft\u003c/code\u003e and \u003ccode\u003epopleft\u003c/code\u003e.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003emy_deque\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eappendleft\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;a\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=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003emy_dequqe\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=\"o\"\u003e\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003edeque\u003c/span\u003e\u003cspan class=\"p\"\u003e([\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;a\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003emy_deque\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epopleft\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=\"o\"\u003e\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;a\u0026#39;\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=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"err\"\u003e!\u003c/span\u003e\u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003emarkata\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eattribution\u003c/span\u003e\u003cspan class=\"o\"\u003e--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003emy_deque\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=\"o\"\u003e\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003edeque\u003c/span\u003e\u003cspan class=\"p\"\u003e([\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThese are handy ways to manipulate the iterable that I needed for the arrays I plot with plotly!\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSee my follow-up to this on using Deques with plotly and streamlit to create a quick \u0026ldquo;dashboard\u0026rdquo; with live streaming data!\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/plotly-and-streamlit\"\u003efollow-up\u003c/a\u003e\u003c/p\u003e\n",
      "content_text": "\nI am working on a project to create a small system monitoring dashboard using the python `psutil` library.\n\nThe repo is [here](https://github.com/nicpayne713/not-netdata) (if you want actual system monitoring please use [netdata](https://www.netdata.cloud/)).\n\nI'm using `streamlit` and `plotly` for the webserver, design, and plotting at the moment.\n\n## My Use Case\n\nI needed a way to refresh my plotly charts with a fixed window of time so that I'm able to just see relevant recent data instead of cramming all data for all time into one plot that's 500 pixels wide...\n\nChecking the length of arrays or lists every time I get a new piece of data feels kind of dumb and I thought \"python must have a way to do this\"...\n\n\u003e \"This\" meaning, update values in a fixed length array without reallocating memory or recreating a copy of the list\n\n## Deques\n\nEnter the `deque`. \nIt means \"double ended queue\" and is in general an `Iterable` that you can append values to either side or pop values from either side.\n\nThe init signature is straightforward enough and I'm sure there's more to them than I know yet but here's how I use it...\n\n```python\nfrom collections import deque\n\nmy_deque = deque([1,2,3])\n```\n\nThis gives us `my_deque`, created from an iterable, with several familiar methods like `index`, `extend`, `append`, etc.\nHowever there's some new ones too such as `appendleft` and `popleft`.\n\n```python\nmy_deque.appendleft('a')\nprint(my_dequqe)\n\u003e\u003e\u003e deque(['a', 1, 2, 3])\n\nmy_deque.popleft()\n\u003e\u003e\u003e 'a'\nprint(my_deque)\n\u003e\u003e\u003e deque([1, 2, 3])\n```\n\nThese are handy ways to manipulate the iterable that I needed for the arrays I plot with plotly!\n\n\n__See my follow-up to this on using Deques with plotly and streamlit to create a quick \"dashboard\" with live streaming data!__\n\n[follow-up](/plotly-and-streamlit)\n",
      "summary": "I am working on a project to create a small system monitoring dashboard using the python library.",
      "date_published": "2022-03-31T00:00:00Z",
      "date_modified": "2022-03-31T00:00:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "python",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/plotly-and-streamlit/",
      "url": "https://pype.dev/plotly-and-streamlit/",
      "title": "Plotly-And-Streamlit",
      "content_html": "\u003ch2 id=\"streamlit\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStreamlit\u003c/span\u003e \u003ca href=\"#streamlit\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI use \u003ccode\u003estreamlit\u003c/code\u003e for any EDA I ever have to do at work.\nIt\u0026rsquo;s super easy to spin up a small dashboard to filter and view dataframes in, live, without the fallbacks of Jupyter notebooks (kernels dying, memory bloat, a billion \u0026ldquo;Untitled N.ipynb\u0026rdquo; files, etc.)\u003c/p\u003e\n\u003cp\u003eAt the highest level, streamlit lets you write a python script and call \u003ccode\u003estreamlit run my_script.py\u003c/code\u003e which will open up a web server with your streamlit stuff.\nThe dashboard refreshes whenever you change the script so you can add capabilities in real time, super fast!\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ll show an example of using \u003ccode\u003estreamlit\u003c/code\u003e and \u003ccode\u003eplotly\u003c/code\u003e to make a live dashboard to monitor system memory usage with \u003ccode\u003epsutil\u003c/code\u003e.\nThis is apart of my posts on \u003ca href=\"/psutil\"\u003epsutil\u003c/a\u003e and \u003ca href=\"/deques\"\u003edeques\u003c/a\u003e\u0026hellip;\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eexample at the bottom!\u003c/strong\u003e\u003c/p\u003e\n\u003ch2 id=\"plotly\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePlotly\u003c/span\u003e \u003ca href=\"#plotly\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI\u0026rsquo;m not going to make a big time intro to plotly here - there\u0026rsquo;s a billion resources on the interwebs and the docs are really good.\u003c/p\u003e\n\u003cp\u003eSuffice it to say it\u0026rsquo;s my goto plotting library for basically any and all needs.\nI\u0026rsquo;m currently exploring it for live data streaming as I\u0026rsquo;m not sure it\u0026rsquo;s the best solution but it\u0026rsquo;s the one I\u0026rsquo;m familiar with.\u003c/p\u003e\n\u003cp\u003eFor my \u003ca href=\"https://github.com/nicpayne713/not-netdata\"\u003e not-netdata \u003c/a\u003e project of visualizing live system resource data I  first need a way of appending data and popping data in and out of an array at every data refresh cycle to keep my plots looking nice with a fixed time window.\u003c/p\u003e\n\u003cp\u003eSee \u003ca href=\"/deques\"\u003edeques\u003c/a\u003e for a short intro to the datatype I\u0026rsquo;m using.\u003c/p\u003e\n\u003cp\u003eFirst step is to initialize some objects to store data in.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eDict\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nb\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eMutableSequence\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eOptional\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nb\"\u003efloat\u003c/span\u003e\u003cspan class=\"p\"\u003e]]]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003edefaultdict\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edeque\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003earr_size\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e10\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=\"n\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;time\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003edeque\u003c/span\u003e\u003cspan class=\"p\"\u003e([\u003c/span\u003e\u003cspan class=\"kc\"\u003eNone\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003earr_size\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=\"n\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;used_memory\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003edeque\u003c/span\u003e\u003cspan class=\"p\"\u003e([\u003c/span\u003e\u003cspan class=\"kc\"\u003eNone\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003earr_size\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003edata\u003c/code\u003e is a dictionary that I\u0026rsquo;ll store deques in. The dictionary keys will be the type of data, in this case \u003ccode\u003etime\u003c/code\u003e and \u003ccode\u003eused_memory\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eI fix an array size, \u003ccode\u003earr_size\u003c/code\u003e to just 10 for now\u003c/p\u003e\n\u003cp\u003eThen I initialize the values for \u003ccode\u003etime\u003c/code\u003e and \u003ccode\u003eused_memory\u003c/code\u003e as \u003ccode\u003edeque\u003c/code\u003es of length \u003ccode\u003earr_size\u003c/code\u003e.\nSimple enough!\u003c/p\u003e\n\u003cp\u003eNext is to fill those deques with some relevant data.\nI\u0026rsquo;m not actually sure if this is the best way to do this but here\u0026rsquo;s what I have done so far:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003erefresh_data\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\"\u003eglobal\u003c/span\u003e \u003cspan class=\"n\"\u003edata\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ememory\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003epsutil\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003evirtual_memory\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;time\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etime\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estrftime\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;%Y-%m-\u003c/span\u003e\u003cspan class=\"si\"\u003e%d\u003c/span\u003e\u003cspan class=\"s2\"\u003e %H:%M:%S\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003etime\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003elocaltime\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=\"n\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;used_memory\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ememory\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eused\u003c/span\u003e \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e1024\u003c/span\u003e\u003cspan class=\"o\"\u003e**\u003c/span\u003e\u003cspan class=\"mi\"\u003e3\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;time\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epopleft\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=\"n\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;used_memory\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epopleft\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eIf you ignore my usage of \u003ccode\u003eglobal\u003c/code\u003e you\u0026rsquo;ll see that I can just \u003ccode\u003eappend\u003c/code\u003e to each deque like it was a list.\u003c/p\u003e\n\u003cp\u003eBut then to keep the relevant data in the deque, and to keep the length fixed, I simply \u003ccode\u003epopleft\u003c/code\u003e to remove the oldest datapoint!\u003c/p\u003e\n\u003ch2 id=\"a-trivial-dashboard\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eA trivial dashboard\u003c/span\u003e \u003ca href=\"#a-trivial-dashboard\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eNow I\u0026rsquo;ll prove just how easy it is to get a live data dashboard up and running with just a few lines of code thanks to streamlit!\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\"\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"vm\"\u003e__name__\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;__main__\u0026#34;\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=\"n\"\u003est\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eheader\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;memory chart\u0026#34;\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=\"n\"\u003estats\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003est\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eempty\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\"\u003ewhile\u003c/span\u003e \u003cspan class=\"kc\"\u003eTrue\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=\"n\"\u003erefresh_data\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=\"n\"\u003estats\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eplotly_chart\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=\"n\"\u003epx\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eline\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=\"n\"\u003edata\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=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;time\u0026#34;\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=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;used_memory\u0026#34;\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=\"n\"\u003etitle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Memory usage stored in a deque!\u0026#34;\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            \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003etime\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esleep\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mf\"\u003e0.5\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003est\u003c/code\u003e is the streamlit alias (imports shows at the bottom full example).\n\u003ccode\u003est.header\u003c/code\u003e puts a nice header on the page.\n\u003ccode\u003est.empty\u003c/code\u003e initializes an empty \u003ccode\u003estreamlit container\u003c/code\u003e in which we\u0026rsquo;ll put a \u003ccode\u003eplotly.express\u003c/code\u003e figure.\u003c/p\u003e\n\u003cp\u003eAt each iteration we\u0026rsquo;ll \u003ccode\u003erefresh_data()\u003c/code\u003e which \u003ccode\u003eappends\u003c/code\u003e and \u003ccode\u003epops\u003c/code\u003e data in the deques in the \u003ccode\u003edata\u003c/code\u003e dictionary.\nThen we update the \u003ccode\u003estats\u003c/code\u003e container with a plotly graph and the refresh happens seamlessly.\u003c/p\u003e\n\u003cp\u003eAll in all the script looks like this:\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\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003ecollections\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003edefaultdict\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003edeque\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"nn\"\u003etime\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003etyping\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eDict\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eMutableSequence\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eOptional\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=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003eplotly\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eexpress\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"n\"\u003epx\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"nn\"\u003epsutil\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"nn\"\u003estreamlit\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"nn\"\u003est\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=\"n\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eDict\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nb\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eMutableSequence\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eOptional\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nb\"\u003efloat\u003c/span\u003e\u003cspan class=\"p\"\u003e]]]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003edefaultdict\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edeque\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003earr_size\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e10\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=\"n\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;time\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003edeque\u003c/span\u003e\u003cspan class=\"p\"\u003e([\u003c/span\u003e\u003cspan class=\"kc\"\u003eNone\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003earr_size\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=\"n\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;used_memory\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003edeque\u003c/span\u003e\u003cspan class=\"p\"\u003e([\u003c/span\u003e\u003cspan class=\"kc\"\u003eNone\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003earr_size\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\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=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003erefresh_data\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\"\u003eglobal\u003c/span\u003e \u003cspan class=\"n\"\u003edata\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ememory\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003epsutil\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003evirtual_memory\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;time\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etime\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estrftime\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;%Y-%m-\u003c/span\u003e\u003cspan class=\"si\"\u003e%d\u003c/span\u003e\u003cspan class=\"s2\"\u003e %H:%M:%S\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003etime\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003elocaltime\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=\"n\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;used_memory\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ememory\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eused\u003c/span\u003e \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e1024\u003c/span\u003e\u003cspan class=\"o\"\u003e**\u003c/span\u003e\u003cspan class=\"mi\"\u003e3\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;time\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epopleft\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=\"n\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;used_memory\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epopleft\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\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=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003ememory_chart\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=\"n\"\u003efig\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003epx\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eline\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=\"n\"\u003edata\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=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;time\u0026#34;\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=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;used_memory\u0026#34;\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=\"n\"\u003etitle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Memory usage stored in a deque!\u0026#34;\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    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003efig\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"vm\"\u003e__name__\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;__main__\u0026#34;\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=\"n\"\u003est\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eheader\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;memory chart\u0026#34;\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=\"n\"\u003estats\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003est\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eempty\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\"\u003ewhile\u003c/span\u003e \u003cspan class=\"kc\"\u003eTrue\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=\"n\"\u003erefresh_data\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=\"n\"\u003estats\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eplotly_chart\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ememory_chart\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=\"n\"\u003etime\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esleep\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mf\"\u003e0.5\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eYou can save this as \u003ccode\u003emy_dash.py\u003c/code\u003e and run with \u003ccode\u003estreamlit run my_dash.py\u003c/code\u003e and should see something like the following!\u003c/p\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/plotly-streamlit.gif\" alt=\"plotly\" title=\"Plotly in Streamlit\" /\u003e\n",
      "content_text": "\n## Streamlit\n\n\nI use `streamlit` for any EDA I ever have to do at work.\nIt's super easy to spin up a small dashboard to filter and view dataframes in, live, without the fallbacks of Jupyter notebooks (kernels dying, memory bloat, a billion \"Untitled N.ipynb\" files, etc.)\n\nAt the highest level, streamlit lets you write a python script and call `streamlit run my_script.py` which will open up a web server with your streamlit stuff. \nThe dashboard refreshes whenever you change the script so you can add capabilities in real time, super fast!\n\n\nI'll show an example of using `streamlit` and `plotly` to make a live dashboard to monitor system memory usage with `psutil`.\nThis is apart of my posts on [psutil](/psutil) and [deques](/deques)...\n\n__example at the bottom!__\n\n\n\n## Plotly\n\nI'm not going to make a big time intro to plotly here - there's a billion resources on the interwebs and the docs are really good.\n\nSuffice it to say it's my goto plotting library for basically any and all needs.\nI'm currently exploring it for live data streaming as I'm not sure it's the best solution but it's the one I'm familiar with.\n\nFor my [ not-netdata ](https://github.com/nicpayne713/not-netdata) project of visualizing live system resource data I  first need a way of appending data and popping data in and out of an array at every data refresh cycle to keep my plots looking nice with a fixed time window.\n\nSee [deques](/deques) for a short intro to the datatype I'm using.\n\nFirst step is to initialize some objects to store data in.\n\n```python\ndata: Dict[str, MutableSequence[Optional[float]]] = defaultdict(deque)\n\narr_size = 10\n\ndata[\"time\"] = deque([None] * arr_size)\ndata[\"used_memory\"] = deque([None] * arr_size)\n```\n\n`data` is a dictionary that I'll store deques in. The dictionary keys will be the type of data, in this case `time` and `used_memory`.\n\nI fix an array size, `arr_size` to just 10 for now\n\nThen I initialize the values for `time` and `used_memory` as `deque`s of length `arr_size`.\nSimple enough!\n\nNext is to fill those deques with some relevant data.\nI'm not actually sure if this is the best way to do this but here's what I have done so far:\n\n```python\ndef refresh_data():\n    global data\n    memory = psutil.virtual_memory()\n\n    data[\"time\"].append(time.strftime(\"%Y-%m-%d %H:%M:%S\", time.localtime()))\n    data[\"used_memory\"].append(memory.used // (1024**3))\n\n    data[\"time\"].popleft()\n    data[\"used_memory\"].popleft()\n```\n\nIf you ignore my usage of `global` you'll see that I can just `append` to each deque like it was a list.\n\nBut then to keep the relevant data in the deque, and to keep the length fixed, I simply `popleft` to remove the oldest datapoint!\n\n\n## A trivial dashboard\n\nNow I'll prove just how easy it is to get a live data dashboard up and running with just a few lines of code thanks to streamlit!\n\n```python\n\nif __name__ == \"__main__\":\n    st.header(\"memory chart\")\n    stats = st.empty()\n    while True:\n        refresh_data()\n        stats.plotly_chart(\n            px.line(\n                data,\n                x=\"time\",\n                y=\"used_memory\",\n                title=f\"Memory usage stored in a deque!\",\n               )\n            )\n        time.sleep(0.5)\n```\n\n`st` is the streamlit alias (imports shows at the bottom full example).\n`st.header` puts a nice header on the page.\n`st.empty` initializes an empty `streamlit container` in which we'll put a `plotly.express` figure.\n\nAt each iteration we'll `refresh_data()` which `appends` and `pops` data in the deques in the `data` dictionary.\nThen we update the `stats` container with a plotly graph and the refresh happens seamlessly.\n\nAll in all the script looks like this:\n\n```python\n\nfrom collections import defaultdict, deque\nimport time\nfrom typing import Dict, MutableSequence, Optional\n\nfrom plotly import express as px\nimport psutil\nimport streamlit as st\n\ndata: Dict[str, MutableSequence[Optional[float]]] = defaultdict(deque)\n\narr_size = 10\n\ndata[\"time\"] = deque([None] * arr_size)\ndata[\"used_memory\"] = deque([None] * arr_size)\n\n\ndef refresh_data():\n    global data\n    memory = psutil.virtual_memory()\n\n    data[\"time\"].append(time.strftime(\"%Y-%m-%d %H:%M:%S\", time.localtime()))\n    data[\"used_memory\"].append(memory.used // (1024**3))\n\n    data[\"time\"].popleft()\n    data[\"used_memory\"].popleft()\n\n\ndef memory_chart():\n    fig = px.line(\n        data,\n        x=\"time\",\n        y=\"used_memory\",\n        title=f\"Memory usage stored in a deque!\",\n    )\n    return fig\n\n\nif __name__ == \"__main__\":\n    st.header(\"memory chart\")\n    stats = st.empty()\n    while True:\n        refresh_data()\n        stats.plotly_chart(memory_chart())\n        time.sleep(0.5)\n```\n\nYou can save this as `my_dash.py` and run with `streamlit run my_dash.py` and should see something like the following!\n\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/plotly-streamlit.gif\" alt=\"plotly\" title=\"Plotly in Streamlit\" /\u003e\n\n",
      "summary": "I use for any EDA I ever have to do at work. It's super easy to spin up a small dashboard to filter and view dataframes in, live, without the fallbacks of...",
      "date_published": "2022-03-31T00:00:00Z",
      "date_modified": "2022-03-31T00:00:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "python",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/starship/",
      "url": "https://pype.dev/starship/",
      "title": "Starship",
      "content_html": "\u003cp\u003eIf you spend time in the terminal then you\u0026rsquo;ll want it to look somewhat pleasing to the eye.\nI used to ssh into servers with no customization, use \u003ccode\u003evi\u003c/code\u003e  to edit a file or two, then get back to my regularly scheduled programming in VS C**e\u0026hellip;\u003c/p\u003e\n\u003cp\u003eOne of the first steps for me loving my terminal was a beautiful prompt\u0026hellip;\u003c/p\u003e\n\u003ch2 id=\"prompt\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePrompt\u003c/span\u003e \u003ca href=\"#prompt\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe default sh/bash/zsh prompts are\u0026hellip; to put it lightly\u0026hellip; garbage\u0026hellip; I can\u0026rsquo;t speak for other shells like fish simply because I do not use them but let me justify my trash talk.\u003c/p\u003e\n\u003cp\u003eHere\u0026rsquo;s the default \u003ccode\u003esh\u003c/code\u003e prompt\u0026hellip;\u003c/p\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/sh-prompt.png\" alt=\"sh\" title=\"A default sh prompt\" /\u003e\n\u003cp\u003eThen switching to \u003ccode\u003ezsh\u003c/code\u003e you get something marginally better (plus tab completion!)\u003c/p\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/zsh-prompt.png\" alt=\"zsh\" title=\"A default zsh prompt\" /\u003e\n\u003cp\u003eBut this still is super gross\u0026hellip; there\u0026rsquo;s nothing to indicate file types and no status information readily available (ie. \u003ccode\u003egit status\u003c/code\u003e etc.)\u003c/p\u003e\n\u003ch2 id=\"oh-my-zsh\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOh-My-Zsh!\u003c/span\u003e \u003ca href=\"#oh-my-zsh\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eNow there are several ways to make your prmompt nicer depending on your shell (terminal emulator plays a role too).\nNow I use \u003ccode\u003ezsh\u003c/code\u003e and there\u0026rsquo;s a great tool out there \u003ca href=\"https://ohmyz.sh/\"\u003eoh-my-zsh\u003c/a\u003e that brings a crazy amount of customization to the terminal experience.\u003c/p\u003e\n\u003cp\u003eI do not use \u003ccode\u003eoh-my-zsh\u003c/code\u003e for theming though and that\u0026rsquo;s simply because of my other choices - I use \u003ccode\u003ekitty\u003c/code\u003e themes since I understood the implementation better.\nKitty themes though - do not give me a nice prompt.\u003c/p\u003e\n\u003cp\u003eThe default prompt you get with \u003ccode\u003eoh-my-zsh\u003c/code\u003e themes isn\u0026rsquo;t bad though (and you can pick from several default themes)\u0026hellip;\u003c/p\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/zsh-oh-my-zsh-prompt.png\" alt=\"omz\" title=\"A default oh-my-zsh prompt\" /\u003e\n\u003cp\u003eNotice that you get some nice coloring and some default \u003ccode\u003egit\u003c/code\u003e status stuff, mainly the branch you are on.\nThere\u0026rsquo;s plugins to show you more and that\u0026rsquo;s all well and good, but again it\u0026rsquo;s not my choice\u0026hellip;\u003c/p\u003e\n\u003cp\u003eIf I don\u0026rsquo;t use this then what\u0026rsquo;s my goto?\u003c/p\u003e\n\u003ch2 id=\"starship\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eStarship\u003c/span\u003e \u003ca href=\"#starship\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://starship.rs/\"\u003estarship\u003c/a\u003e is a cross-shell prompt with nice default and super easy customizaton!\u003c/p\u003e\n\u003cp\u003eTo get started click that link and follow the \u0026ldquo;Getting Started\u0026rdquo; button - it\u0026rsquo;s incredibly fast to get up and running with sane defaults.\u003c/p\u003e\n\u003cp\u003eThe default starship config is plenty nice but I got a little tired of emojis in my prompt and wanted to switch to icons instead\u0026hellip;\u003c/p\u003e\n\u003cp\u003eTo get started with your own customizaton you add a \u003ccode\u003estarship.toml\u003c/code\u003e file to \u003ccode\u003e~/.config\u003c/code\u003e\nMy starship config is found \u003ca href=\"https://github.com/nicpayne713/dotfiles/blob/main/starship/.config/starship.toml\"\u003ehere\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eNote you need a font installed patched with nerdfonts - I use JetBrains Mono\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eNow I have a beautiful prompt with relevant information that\u0026rsquo;s a dream to look at!\u003c/p\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/zsh-starship-prompt.png\" alt=\"starship\" title=\"A starship prompt\" /\u003e\n\u003cp\u003eI have configured my starship to show me relevant \u003ccode\u003egit status\u003c/code\u003e options (stashes, untracked files, etc etc.)\nI also have starship show me if I\u0026rsquo;m in a git repo, what branch I\u0026rsquo;m on, if I\u0026rsquo;m in a python project and if so what virtual environment is active.\nI do some work in AWS at work and so I have starship show me if my \u003ccode\u003eaws cli\u003c/code\u003e is configured to the right region for whichever project I\u0026rsquo;m in!\u003c/p\u003e\n\u003cp\u003eThere\u0026rsquo;s a billion more options and after a few minutes of play it becomes really easy and intuitive to customize colors, icons, etc.\u003c/p\u003e\n",
      "content_text": "\nIf you spend time in the terminal then you'll want it to look somewhat pleasing to the eye.\nI used to ssh into servers with no customization, use `vi`  to edit a file or two, then get back to my regularly scheduled programming in VS C**e...\n\nOne of the first steps for me loving my terminal was a beautiful prompt... \n\n## Prompt\n\nThe default sh/bash/zsh prompts are... to put it lightly... garbage... I can't speak for other shells like fish simply because I do not use them but let me justify my trash talk.\n\nHere's the default `sh` prompt...\n\n\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/sh-prompt.png\" alt=\"sh\" title=\"A default sh prompt\" /\u003e\n\n\nThen switching to `zsh` you get something marginally better (plus tab completion!)\n\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/zsh-prompt.png\" alt=\"zsh\" title=\"A default zsh prompt\" /\u003e\n\nBut this still is super gross... there's nothing to indicate file types and no status information readily available (ie. `git status` etc.)\n\n## Oh-My-Zsh!\n\nNow there are several ways to make your prmompt nicer depending on your shell (terminal emulator plays a role too).\nNow I use `zsh` and there's a great tool out there [oh-my-zsh](https://ohmyz.sh/) that brings a crazy amount of customization to the terminal experience.\n\nI do not use `oh-my-zsh` for theming though and that's simply because of my other choices - I use `kitty` themes since I understood the implementation better.\nKitty themes though - do not give me a nice prompt.\n\nThe default prompt you get with `oh-my-zsh` themes isn't bad though (and you can pick from several default themes)...\n\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/zsh-oh-my-zsh-prompt.png\" alt=\"omz\" title=\"A default oh-my-zsh prompt\" /\u003e\n\nNotice that you get some nice coloring and some default `git` status stuff, mainly the branch you are on.\nThere's plugins to show you more and that's all well and good, but again it's not my choice...\n\nIf I don't use this then what's my goto?\n\n## Starship\n\n[starship](https://starship.rs/) is a cross-shell prompt with nice default and super easy customizaton!\n\nTo get started click that link and follow the \"Getting Started\" button - it's incredibly fast to get up and running with sane defaults.\n\nThe default starship config is plenty nice but I got a little tired of emojis in my prompt and wanted to switch to icons instead...\n\nTo get started with your own customizaton you add a `starship.toml` file to `~/.config` \nMy starship config is found [here](https://github.com/nicpayne713/dotfiles/blob/main/starship/.config/starship.toml).\n\n\u003eNote you need a font installed patched with nerdfonts - I use JetBrains Mono\n\nNow I have a beautiful prompt with relevant information that's a dream to look at!\n\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/zsh-starship-prompt.png\" alt=\"starship\" title=\"A starship prompt\" /\u003e\n\nI have configured my starship to show me relevant `git status` options (stashes, untracked files, etc etc.)\nI also have starship show me if I'm in a git repo, what branch I'm on, if I'm in a python project and if so what virtual environment is active.\nI do some work in AWS at work and so I have starship show me if my `aws cli` is configured to the right region for whichever project I'm in!\n\nThere's a billion more options and after a few minutes of play it becomes really easy and intuitive to customize colors, icons, etc.\n",
      "summary": "If you spend time in the terminal then you'll want it to look somewhat pleasing to the eye. I used to ssh into servers with no customization, use to edit a...",
      "date_published": "2022-03-25T00:00:00Z",
      "date_modified": "2022-03-25T00:00:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "linux",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/self-hosted-media/",
      "url": "https://pype.dev/self-hosted-media/",
      "title": "self-hosted-media",
      "content_html": "\u003cp\u003eSelf-hosting 1 or several media servers is another common homelab use-case.\nGetting content for your media servers is up to you, but I\u0026rsquo;ll show a few ways here to get content somewhat easily!\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eYouTube Disclaimer at Bottom\u003c/strong\u003e\u003c/p\u003e\n\u003ch2 id=\"you-get\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eyou-get\u003c/span\u003e \u003ca href=\"#you-get\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003eyou-get\u003c/code\u003e is a nice cli for grabbing media content off the web.\u003c/p\u003e\n\u003ch3 id=\"installation\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eInstallation\u003c/span\u003e \u003ca href=\"#installation\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003epip install you-get\u003c/code\u003e or use ad-hoc with \u003ccode\u003epipx run you-get \u0026lt;url\u0026gt;\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"usage\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsage\u003c/span\u003e \u003ca href=\"#usage\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFor example if I wanted to catch up on ancient Chinese military tactics I may go for \u003ccode\u003eThe Art of War\u003c/code\u003e off the Internet Archive\u0026hellip;\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esandbox  🌱 main 🗑️  ×3🛤️  ×6via 🐍 v3.8.11 \u003cspan class=\"o\"\u003e(\u003c/span\u003esandbox\u003cspan class=\"o\"\u003e)\u003c/span\u003e  took 15s\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ you-get https://archive.org/details/art_of_war_librivox -i\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSite:       Archive.org\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eTitle:      The Art of War : Sun Tzu : Free Download, Borrow, and Streaming : Internet Archive\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eType:       MP3 \u003cspan class=\"o\"\u003e(\u003c/span\u003eaudio/mpeg\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSize:       3.87 MiB \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e4055167\u003c/span\u003e Bytes\u003cspan class=\"o\"\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\u003c/code\u003e\u003c/pre\u003e\u003cp\u003ethe \u003ccode\u003e-i\u003c/code\u003e is showing me the info of what would be downloaded without the flag (it\u0026rsquo;s like a dry run)\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esandbox  🌱 main 🗑️  ×3🛤️  ×6via 🐍 v3.8.11 \u003cspan class=\"o\"\u003e(\u003c/span\u003esandbox\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ you-get https://archive.org/details/art_of_war_librivox\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSite:       Archive.org\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eTitle:      The Art of War : Sun Tzu : Free Download, Borrow, and Streaming : Internet Archive\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eType:       MP3 \u003cspan class=\"o\"\u003e(\u003c/span\u003eaudio/mpeg\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSize:       3.87 MiB \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e4055167\u003c/span\u003e Bytes\u003cspan class=\"o\"\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\"\u003eDownloading The Art of War : Sun Tzu : Free Download, Borrow, and Streaming : Internet Archi.mp3 ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e 100% \u003cspan class=\"o\"\u003e(\u003c/span\u003e  3.9/  3.9MB\u003cspan class=\"o\"\u003e)\u003c/span\u003e ├████████████████████████████████████████████████████████████┤\u003cspan class=\"o\"\u003e[\u003c/span\u003e1/1\u003cspan class=\"o\"\u003e]\u003c/span\u003e  \u003cspan class=\"m\"\u003e917\u003c/span\u003e kB/s\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\u003eNow I can toss that mp3 onto my \u003ccode\u003ebooksonic\u003c/code\u003e server and study for world domination while I do the dishes!\u003c/p\u003e\n\u003ch2 id=\"pytube\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003epytube\u003c/span\u003e \u003ca href=\"#pytube\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003epytube\u003c/code\u003e is a python implementation of a \u003ca href=\"##YouTube\"\u003eyoutube downloader \u003c/a\u003e that works at the command line or in python!\u003c/p\u003e\n\u003ch3 id=\"installation-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eInstallation\u003c/span\u003e \u003ca href=\"#installation-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003ca href=\"https://pytube.io/en/latest/\"\u003edocs\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003epip install pytube\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"usage-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUsage\u003c/span\u003e \u003ca href=\"#usage-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003epytube\u003c/code\u003e has a lot of functionality, but a quick one would be the \u003ccode\u003e--list\u003c/code\u003e so you can see what qualities are available\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esandbox   main ️  ×3️  ×7via  v3.8.11 \u003cspan class=\"o\"\u003e(\u003c/span\u003esandbox\u003cspan class=\"o\"\u003e)\u003c/span\u003e  took 2m49s\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ pytube https://www.youtube.com/watch\u003cspan class=\"se\"\u003e\\?\u003c/span\u003ev\u003cspan class=\"se\"\u003e\\=\u003c/span\u003eLDU_Txk06tM  --list\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eLoading video...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;Stream: \u003cspan class=\"nv\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;17\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video/3gpp\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;144p\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003efps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;8fps\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003evcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;mp4v.20.3\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eacodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;mp4a.40.2\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;True\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;Stream: \u003cspan class=\"nv\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;18\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video/mp4\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;360p\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003efps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;30fps\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003evcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;avc1.42001E\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eacodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;mp4a.40.2\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;True\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;Stream: \u003cspan class=\"nv\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;22\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video/mp4\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;720p\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003efps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;30fps\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003evcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;avc1.64001F\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eacodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;mp4a.40.2\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;True\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;Stream: \u003cspan class=\"nv\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;313\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video/webm\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;2160p\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003efps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;30fps\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003evcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;vp9\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;Stream: \u003cspan class=\"nv\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;401\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video/mp4\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;2160p\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003efps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;30fps\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003evcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;av01.0.12M.08\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;Stream: \u003cspan class=\"nv\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;271\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video/webm\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;1440p\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003efps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;30fps\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003evcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;vp9\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;Stream: \u003cspan class=\"nv\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;400\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video/mp4\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;1440p\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003efps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;30fps\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003evcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;av01.0.12M.08\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;Stream: \u003cspan class=\"nv\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;137\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video/mp4\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;1080p\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003efps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;30fps\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003evcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;avc1.640028\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;Stream: \u003cspan class=\"nv\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;248\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video/webm\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;1080p\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003efps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;30fps\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003evcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;vp9\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;Stream: \u003cspan class=\"nv\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;399\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video/mp4\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;1080p\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003efps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;30fps\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003evcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;av01.0.08M.08\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;Stream: \u003cspan class=\"nv\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;136\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video/mp4\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;720p\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003efps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;30fps\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003evcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;avc1.4d401f\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;Stream: \u003cspan class=\"nv\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;247\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video/webm\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;720p\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003efps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;30fps\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003evcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;vp9\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;Stream: \u003cspan class=\"nv\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;398\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video/mp4\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;720p\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003efps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;30fps\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003evcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;av01.0.05M.08\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;Stream: \u003cspan class=\"nv\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;135\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video/mp4\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;480p\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003efps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;30fps\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003evcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;avc1.4d401f\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;Stream: \u003cspan class=\"nv\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;244\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video/webm\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;480p\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003efps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;30fps\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003evcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;vp9\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;Stream: \u003cspan class=\"nv\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;397\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video/mp4\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;480p\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003efps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;30fps\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003evcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;av01.0.04M.08\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;Stream: \u003cspan class=\"nv\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;134\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video/mp4\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;360p\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003efps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;30fps\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003evcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;avc1.4d401e\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;Stream: \u003cspan class=\"nv\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;243\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video/webm\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;360p\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003efps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;30fps\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003evcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;vp9\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;Stream: \u003cspan class=\"nv\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;396\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video/mp4\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;360p\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003efps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;30fps\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003evcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;av01.0.01M.08\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;Stream: \u003cspan class=\"nv\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;133\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video/mp4\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;240p\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003efps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;30fps\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003evcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;avc1.4d4015\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;Stream: \u003cspan class=\"nv\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;242\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video/webm\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;240p\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003efps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;30fps\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003evcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;vp9\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;Stream: \u003cspan class=\"nv\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;395\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video/mp4\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;240p\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003efps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;30fps\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003evcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;av01.0.00M.08\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;Stream: \u003cspan class=\"nv\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;160\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video/mp4\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;144p\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003efps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;30fps\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003evcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;avc1.4d400c\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;Stream: \u003cspan class=\"nv\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;278\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video/webm\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;144p\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003efps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;30fps\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003evcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;vp9\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;Stream: \u003cspan class=\"nv\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;394\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video/mp4\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;144p\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003efps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;30fps\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003evcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;av01.0.00M.08\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;Stream: \u003cspan class=\"nv\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;139\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;audio/mp4\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eabr\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;48kbps\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eacodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;mp4a.40.5\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;audio\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;Stream: \u003cspan class=\"nv\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;140\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;audio/mp4\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eabr\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;128kbps\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eacodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;mp4a.40.2\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;audio\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;Stream: \u003cspan class=\"nv\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;249\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;audio/webm\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eabr\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;50kbps\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eacodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;opus\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;audio\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;Stream: \u003cspan class=\"nv\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;250\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;audio/webm\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eabr\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;70kbps\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eacodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;opus\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;audio\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;Stream: \u003cspan class=\"nv\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;251\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;audio/webm\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eabr\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;160kbps\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eacodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;opus\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nv\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;audio\u0026#34;\u003c/span\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\u003cp\u003e\u003ccode\u003epytube \u0026lt;url\u0026gt; --itag \u0026lt;\u0026gt;\u003c/code\u003e will download the specific \u003ccode\u003eitag\u003c/code\u003e from the list.\u003c/p\u003e\n\u003cp\u003eNotice that some \u003ccode\u003eitags\u003c/code\u003e are videos and others audio - so you can download just the music of a YT video.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003epytube\u003c/code\u003e also works in python\u0026hellip;\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003esandbox\u003c/span\u003e \u003cspan class=\"err\"\u003e↪\u003c/span\u003e \u003cspan class=\"n\"\u003emain\u003c/span\u003e \u003cspan class=\"n\"\u003ev3\u003c/span\u003e\u003cspan class=\"mf\"\u003e.8.11\u003c/span\u003e \u003cspan class=\"n\"\u003eipython\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e❯\u003c/span\u003e \u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003epytube\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eYouTube\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=\"n\"\u003esandbox\u003c/span\u003e \u003cspan class=\"err\"\u003e↪\u003c/span\u003e \u003cspan class=\"n\"\u003emain\u003c/span\u003e \u003cspan class=\"n\"\u003ev3\u003c/span\u003e\u003cspan class=\"mf\"\u003e.8.11\u003c/span\u003e \u003cspan class=\"n\"\u003eipython\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e❯\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ex\u003c/span\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003ex\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003eYouTube\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;https://www.youtube.com/watch?v=LDU_Txk06tM\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estreams\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\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    \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eStream\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;17\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video/3gpp\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;144p\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003efps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;8fps\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003evcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;mp4v.20.3\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eacodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;mp4a.40.2\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;True\u0026#34;\u003c/span\u003e \u003cspan class=\"nb\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\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=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eStream\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;18\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video/mp4\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;360p\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003efps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;30fps\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003evcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;avc1.42001E\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eacodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;mp4a.40.2\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;True\u0026#34;\u003c/span\u003e \u003cspan class=\"nb\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\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=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eStream\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;22\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video/mp4\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;720p\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003efps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;30fps\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003evcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;avc1.64001F\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eacodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;mp4a.40.2\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;True\u0026#34;\u003c/span\u003e \u003cspan class=\"nb\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\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=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eStream\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;313\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video/webm\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;2160p\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003efps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;30fps\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003evcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;vp9\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nb\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\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=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eStream\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;401\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video/mp4\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;2160p\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003efps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;30fps\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003evcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;av01.0.12M.08\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nb\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\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=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eStream\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;271\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video/webm\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;1440p\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003efps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;30fps\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003evcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;vp9\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nb\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\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=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eStream\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;400\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video/mp4\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;1440p\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003efps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;30fps\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003evcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;av01.0.12M.08\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nb\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\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=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eStream\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;137\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video/mp4\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;1080p\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003efps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;30fps\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003evcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;avc1.640028\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nb\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\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=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eStream\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;248\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video/webm\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;1080p\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003efps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;30fps\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003evcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;vp9\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nb\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\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=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eStream\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;399\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video/mp4\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;1080p\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003efps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;30fps\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003evcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;av01.0.08M.08\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nb\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\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=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eStream\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;136\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video/mp4\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;720p\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003efps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;30fps\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003evcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;avc1.4d401f\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nb\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\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=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eStream\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;247\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video/webm\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;720p\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003efps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;30fps\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003evcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;vp9\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nb\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\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=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eStream\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;398\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video/mp4\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;720p\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003efps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;30fps\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003evcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;av01.0.05M.08\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nb\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\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=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eStream\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;135\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video/mp4\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;480p\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003efps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;30fps\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003evcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;avc1.4d401f\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nb\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\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=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eStream\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;244\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video/webm\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;480p\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003efps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;30fps\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003evcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;vp9\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nb\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\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=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eStream\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;397\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video/mp4\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;480p\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003efps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;30fps\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003evcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;av01.0.04M.08\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nb\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\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=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eStream\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;134\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video/mp4\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;360p\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003efps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;30fps\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003evcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;avc1.4d401e\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nb\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\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=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eStream\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;243\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video/webm\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;360p\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003efps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;30fps\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003evcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;vp9\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nb\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\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=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eStream\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;396\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video/mp4\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;360p\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003efps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;30fps\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003evcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;av01.0.01M.08\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nb\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\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=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eStream\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;133\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video/mp4\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;240p\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003efps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;30fps\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003evcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;avc1.4d4015\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nb\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\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=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eStream\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;242\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video/webm\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;240p\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003efps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;30fps\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003evcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;vp9\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nb\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\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=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eStream\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;395\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video/mp4\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;240p\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003efps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;30fps\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003evcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;av01.0.00M.08\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nb\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\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=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eStream\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;160\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video/mp4\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;144p\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003efps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;30fps\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003evcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;avc1.4d400c\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nb\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\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=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eStream\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;278\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video/webm\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;144p\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003efps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;30fps\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003evcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;vp9\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nb\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\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=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eStream\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;394\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video/mp4\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;144p\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003efps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;30fps\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003evcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;av01.0.00M.08\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nb\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;video\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\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=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eStream\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;139\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;audio/mp4\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eabr\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;48kbps\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eacodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;mp4a.40.5\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nb\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;audio\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\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=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eStream\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;140\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;audio/mp4\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eabr\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;128kbps\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eacodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;mp4a.40.2\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nb\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;audio\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\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=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eStream\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;249\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;audio/webm\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eabr\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;50kbps\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eacodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;opus\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nb\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;audio\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\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=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eStream\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;250\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;audio/webm\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eabr\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;70kbps\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eacodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;opus\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nb\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;audio\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\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=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eStream\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eitag\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;251\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003emime_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;audio/webm\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eabr\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;160kbps\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eacodec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;opus\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eprogressive\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;False\u0026#34;\u003c/span\u003e \u003cspan class=\"nb\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;audio\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\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\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"youtube-frontends\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eYouTube Frontends\u003c/span\u003e \u003ca href=\"#youtube-frontends\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThere\u0026rsquo;s 2 really good options for self-hosting a YT front-end\u0026hellip;\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/bbilly1/tubearchivist\"\u003eTube Archivist\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/Tzahi12345/YoutubeDL-Material\"\u003eYouTubeDL-Material\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThey have their pros and cons.\nYou can also build yourself with the above utilities and use Plex or Jellyfin to serve up videos\u0026hellip;\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eYour self-hosting journey is up to you!\u003c/strong\u003e\u003c/p\u003e\n\u003ch2 id=\"youtube\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eYouTube\u003c/span\u003e \u003ca href=\"#youtube\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eDownloading YouTube videos is a bit of a sore topic\u0026hellip; Mainly you don\u0026rsquo;t to hurt creators who rely on YT ad revenue for their livlihood.\u003c/p\u003e\n\u003cp\u003eThen again, maybe you\u0026rsquo;re a vigilante who knows that YT also monetizes videos for their \u003cem\u003eown\u003c/em\u003e gain and that the creators don\u0026rsquo;t see that money either!\u003c/p\u003e\n\u003cp\u003eThe solution is pretty easy and is 2-fold\u0026hellip;\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eDownload YT videos\u003c/li\u003e\n\u003cli\u003ePersonally support the content creators you follow via paypall, patreon, or whatever else they might have set-up\u0026hellip;. even a buck or two a month is more than they\u0026rsquo;d get from your ad revenue explicitly plus it all goes to them!\u003c/li\u003e\n\u003c/ol\u003e\n",
      "content_text": "\nSelf-hosting 1 or several media servers is another common homelab use-case.\nGetting content for your media servers is up to you, but I'll show a few ways here to get content somewhat easily!\n\n__YouTube Disclaimer at Bottom__\n\n\n## you-get\n\n`you-get` is a nice cli for grabbing media content off the web. \n\n### Installation\n\n`pip install you-get` or use ad-hoc with `pipx run you-get \u003curl\u003e`\n\n\n### Usage\n\nFor example if I wanted to catch up on ancient Chinese military tactics I may go for `The Art of War` off the Internet Archive...\n\n```bash\nsandbox  🌱 main 🗑️  ×3🛤️  ×6via 🐍 v3.8.11 (sandbox)  took 15s\n❯ you-get https://archive.org/details/art_of_war_librivox -i\nSite:       Archive.org\nTitle:      The Art of War : Sun Tzu : Free Download, Borrow, and Streaming : Internet Archive\nType:       MP3 (audio/mpeg)\nSize:       3.87 MiB (4055167 Bytes)\n\n```\n\nthe `-i` is showing me the info of what would be downloaded without the flag (it's like a dry run)\n\n```bash\nsandbox  🌱 main 🗑️  ×3🛤️  ×6via 🐍 v3.8.11 (sandbox)\n❯ you-get https://archive.org/details/art_of_war_librivox\nSite:       Archive.org\nTitle:      The Art of War : Sun Tzu : Free Download, Borrow, and Streaming : Internet Archive\nType:       MP3 (audio/mpeg)\nSize:       3.87 MiB (4055167 Bytes)\n\nDownloading The Art of War : Sun Tzu : Free Download, Borrow, and Streaming : Internet Archi.mp3 ...\n 100% (  3.9/  3.9MB) ├████████████████████████████████████████████████████████████┤[1/1]  917 kB/s\n\n```\n\nNow I can toss that mp3 onto my `booksonic` server and study for world domination while I do the dishes!\n\n\n## pytube\n\n`pytube` is a python implementation of a [youtube downloader ](##YouTube) that works at the command line or in python!\n\n### Installation\n\n[docs](https://pytube.io/en/latest/)\n\n`pip install pytube`\n\n\n### Usage\n\n`pytube` has a lot of functionality, but a quick one would be the `--list` so you can see what qualities are available\n\n```bash\nsandbox   main ️  ×3️  ×7via  v3.8.11 (sandbox)  took 2m49s\n❯ pytube https://www.youtube.com/watch\\?v\\=LDU_Txk06tM  --list\nLoading video...\n\u003cStream: itag=\"17\" mime_type=\"video/3gpp\" res=\"144p\" fps=\"8fps\" vcodec=\"mp4v.20.3\" acodec=\"mp4a.40.2\" progressive=\"True\" type=\"video\"\u003e\n\u003cStream: itag=\"18\" mime_type=\"video/mp4\" res=\"360p\" fps=\"30fps\" vcodec=\"avc1.42001E\" acodec=\"mp4a.40.2\" progressive=\"True\" type=\"video\"\u003e\n\u003cStream: itag=\"22\" mime_type=\"video/mp4\" res=\"720p\" fps=\"30fps\" vcodec=\"avc1.64001F\" acodec=\"mp4a.40.2\" progressive=\"True\" type=\"video\"\u003e\n\u003cStream: itag=\"313\" mime_type=\"video/webm\" res=\"2160p\" fps=\"30fps\" vcodec=\"vp9\" progressive=\"False\" type=\"video\"\u003e\n\u003cStream: itag=\"401\" mime_type=\"video/mp4\" res=\"2160p\" fps=\"30fps\" vcodec=\"av01.0.12M.08\" progressive=\"False\" type=\"video\"\u003e\n\u003cStream: itag=\"271\" mime_type=\"video/webm\" res=\"1440p\" fps=\"30fps\" vcodec=\"vp9\" progressive=\"False\" type=\"video\"\u003e\n\u003cStream: itag=\"400\" mime_type=\"video/mp4\" res=\"1440p\" fps=\"30fps\" vcodec=\"av01.0.12M.08\" progressive=\"False\" type=\"video\"\u003e\n\u003cStream: itag=\"137\" mime_type=\"video/mp4\" res=\"1080p\" fps=\"30fps\" vcodec=\"avc1.640028\" progressive=\"False\" type=\"video\"\u003e\n\u003cStream: itag=\"248\" mime_type=\"video/webm\" res=\"1080p\" fps=\"30fps\" vcodec=\"vp9\" progressive=\"False\" type=\"video\"\u003e\n\u003cStream: itag=\"399\" mime_type=\"video/mp4\" res=\"1080p\" fps=\"30fps\" vcodec=\"av01.0.08M.08\" progressive=\"False\" type=\"video\"\u003e\n\u003cStream: itag=\"136\" mime_type=\"video/mp4\" res=\"720p\" fps=\"30fps\" vcodec=\"avc1.4d401f\" progressive=\"False\" type=\"video\"\u003e\n\u003cStream: itag=\"247\" mime_type=\"video/webm\" res=\"720p\" fps=\"30fps\" vcodec=\"vp9\" progressive=\"False\" type=\"video\"\u003e\n\u003cStream: itag=\"398\" mime_type=\"video/mp4\" res=\"720p\" fps=\"30fps\" vcodec=\"av01.0.05M.08\" progressive=\"False\" type=\"video\"\u003e\n\u003cStream: itag=\"135\" mime_type=\"video/mp4\" res=\"480p\" fps=\"30fps\" vcodec=\"avc1.4d401f\" progressive=\"False\" type=\"video\"\u003e\n\u003cStream: itag=\"244\" mime_type=\"video/webm\" res=\"480p\" fps=\"30fps\" vcodec=\"vp9\" progressive=\"False\" type=\"video\"\u003e\n\u003cStream: itag=\"397\" mime_type=\"video/mp4\" res=\"480p\" fps=\"30fps\" vcodec=\"av01.0.04M.08\" progressive=\"False\" type=\"video\"\u003e\n\u003cStream: itag=\"134\" mime_type=\"video/mp4\" res=\"360p\" fps=\"30fps\" vcodec=\"avc1.4d401e\" progressive=\"False\" type=\"video\"\u003e\n\u003cStream: itag=\"243\" mime_type=\"video/webm\" res=\"360p\" fps=\"30fps\" vcodec=\"vp9\" progressive=\"False\" type=\"video\"\u003e\n\u003cStream: itag=\"396\" mime_type=\"video/mp4\" res=\"360p\" fps=\"30fps\" vcodec=\"av01.0.01M.08\" progressive=\"False\" type=\"video\"\u003e\n\u003cStream: itag=\"133\" mime_type=\"video/mp4\" res=\"240p\" fps=\"30fps\" vcodec=\"avc1.4d4015\" progressive=\"False\" type=\"video\"\u003e\n\u003cStream: itag=\"242\" mime_type=\"video/webm\" res=\"240p\" fps=\"30fps\" vcodec=\"vp9\" progressive=\"False\" type=\"video\"\u003e\n\u003cStream: itag=\"395\" mime_type=\"video/mp4\" res=\"240p\" fps=\"30fps\" vcodec=\"av01.0.00M.08\" progressive=\"False\" type=\"video\"\u003e\n\u003cStream: itag=\"160\" mime_type=\"video/mp4\" res=\"144p\" fps=\"30fps\" vcodec=\"avc1.4d400c\" progressive=\"False\" type=\"video\"\u003e\n\u003cStream: itag=\"278\" mime_type=\"video/webm\" res=\"144p\" fps=\"30fps\" vcodec=\"vp9\" progressive=\"False\" type=\"video\"\u003e\n\u003cStream: itag=\"394\" mime_type=\"video/mp4\" res=\"144p\" fps=\"30fps\" vcodec=\"av01.0.00M.08\" progressive=\"False\" type=\"video\"\u003e\n\u003cStream: itag=\"139\" mime_type=\"audio/mp4\" abr=\"48kbps\" acodec=\"mp4a.40.5\" progressive=\"False\" type=\"audio\"\u003e\n\u003cStream: itag=\"140\" mime_type=\"audio/mp4\" abr=\"128kbps\" acodec=\"mp4a.40.2\" progressive=\"False\" type=\"audio\"\u003e\n\u003cStream: itag=\"249\" mime_type=\"audio/webm\" abr=\"50kbps\" acodec=\"opus\" progressive=\"False\" type=\"audio\"\u003e\n\u003cStream: itag=\"250\" mime_type=\"audio/webm\" abr=\"70kbps\" acodec=\"opus\" progressive=\"False\" type=\"audio\"\u003e\n\u003cStream: itag=\"251\" mime_type=\"audio/webm\" abr=\"160kbps\" acodec=\"opus\" progressive=\"False\" type=\"audio\"\u003e\n\n```\n\n`pytube \u003curl\u003e --itag \u003c\u003e` will download the specific `itag` from the list.\n\nNotice that some `itags` are videos and others audio - so you can download just the music of a YT video.\n\n\n`pytube` also works in python...\n\n```python\nsandbox ↪ main v3.8.11 ipython\n❯ from pytube import YouTube\n\nsandbox ↪ main v3.8.11 ipython\n❯ [x for x in YouTube(\"https://www.youtube.com/watch?v=LDU_Txk06tM\").streams]\n\n[\n    \u003cStream: itag=\"17\" mime_type=\"video/3gpp\" res=\"144p\" fps=\"8fps\" vcodec=\"mp4v.20.3\" acodec=\"mp4a.40.2\" progressive=\"True\" type=\"video\"\u003e,\n    \u003cStream: itag=\"18\" mime_type=\"video/mp4\" res=\"360p\" fps=\"30fps\" vcodec=\"avc1.42001E\" acodec=\"mp4a.40.2\" progressive=\"True\" type=\"video\"\u003e,\n    \u003cStream: itag=\"22\" mime_type=\"video/mp4\" res=\"720p\" fps=\"30fps\" vcodec=\"avc1.64001F\" acodec=\"mp4a.40.2\" progressive=\"True\" type=\"video\"\u003e,\n    \u003cStream: itag=\"313\" mime_type=\"video/webm\" res=\"2160p\" fps=\"30fps\" vcodec=\"vp9\" progressive=\"False\" type=\"video\"\u003e,\n    \u003cStream: itag=\"401\" mime_type=\"video/mp4\" res=\"2160p\" fps=\"30fps\" vcodec=\"av01.0.12M.08\" progressive=\"False\" type=\"video\"\u003e,\n    \u003cStream: itag=\"271\" mime_type=\"video/webm\" res=\"1440p\" fps=\"30fps\" vcodec=\"vp9\" progressive=\"False\" type=\"video\"\u003e,\n    \u003cStream: itag=\"400\" mime_type=\"video/mp4\" res=\"1440p\" fps=\"30fps\" vcodec=\"av01.0.12M.08\" progressive=\"False\" type=\"video\"\u003e,\n    \u003cStream: itag=\"137\" mime_type=\"video/mp4\" res=\"1080p\" fps=\"30fps\" vcodec=\"avc1.640028\" progressive=\"False\" type=\"video\"\u003e,\n    \u003cStream: itag=\"248\" mime_type=\"video/webm\" res=\"1080p\" fps=\"30fps\" vcodec=\"vp9\" progressive=\"False\" type=\"video\"\u003e,\n    \u003cStream: itag=\"399\" mime_type=\"video/mp4\" res=\"1080p\" fps=\"30fps\" vcodec=\"av01.0.08M.08\" progressive=\"False\" type=\"video\"\u003e,\n    \u003cStream: itag=\"136\" mime_type=\"video/mp4\" res=\"720p\" fps=\"30fps\" vcodec=\"avc1.4d401f\" progressive=\"False\" type=\"video\"\u003e,\n    \u003cStream: itag=\"247\" mime_type=\"video/webm\" res=\"720p\" fps=\"30fps\" vcodec=\"vp9\" progressive=\"False\" type=\"video\"\u003e,\n    \u003cStream: itag=\"398\" mime_type=\"video/mp4\" res=\"720p\" fps=\"30fps\" vcodec=\"av01.0.05M.08\" progressive=\"False\" type=\"video\"\u003e,\n    \u003cStream: itag=\"135\" mime_type=\"video/mp4\" res=\"480p\" fps=\"30fps\" vcodec=\"avc1.4d401f\" progressive=\"False\" type=\"video\"\u003e,\n    \u003cStream: itag=\"244\" mime_type=\"video/webm\" res=\"480p\" fps=\"30fps\" vcodec=\"vp9\" progressive=\"False\" type=\"video\"\u003e,\n    \u003cStream: itag=\"397\" mime_type=\"video/mp4\" res=\"480p\" fps=\"30fps\" vcodec=\"av01.0.04M.08\" progressive=\"False\" type=\"video\"\u003e,\n    \u003cStream: itag=\"134\" mime_type=\"video/mp4\" res=\"360p\" fps=\"30fps\" vcodec=\"avc1.4d401e\" progressive=\"False\" type=\"video\"\u003e,\n    \u003cStream: itag=\"243\" mime_type=\"video/webm\" res=\"360p\" fps=\"30fps\" vcodec=\"vp9\" progressive=\"False\" type=\"video\"\u003e,\n    \u003cStream: itag=\"396\" mime_type=\"video/mp4\" res=\"360p\" fps=\"30fps\" vcodec=\"av01.0.01M.08\" progressive=\"False\" type=\"video\"\u003e,\n    \u003cStream: itag=\"133\" mime_type=\"video/mp4\" res=\"240p\" fps=\"30fps\" vcodec=\"avc1.4d4015\" progressive=\"False\" type=\"video\"\u003e,\n    \u003cStream: itag=\"242\" mime_type=\"video/webm\" res=\"240p\" fps=\"30fps\" vcodec=\"vp9\" progressive=\"False\" type=\"video\"\u003e,\n    \u003cStream: itag=\"395\" mime_type=\"video/mp4\" res=\"240p\" fps=\"30fps\" vcodec=\"av01.0.00M.08\" progressive=\"False\" type=\"video\"\u003e,\n    \u003cStream: itag=\"160\" mime_type=\"video/mp4\" res=\"144p\" fps=\"30fps\" vcodec=\"avc1.4d400c\" progressive=\"False\" type=\"video\"\u003e,\n    \u003cStream: itag=\"278\" mime_type=\"video/webm\" res=\"144p\" fps=\"30fps\" vcodec=\"vp9\" progressive=\"False\" type=\"video\"\u003e,\n    \u003cStream: itag=\"394\" mime_type=\"video/mp4\" res=\"144p\" fps=\"30fps\" vcodec=\"av01.0.00M.08\" progressive=\"False\" type=\"video\"\u003e,\n    \u003cStream: itag=\"139\" mime_type=\"audio/mp4\" abr=\"48kbps\" acodec=\"mp4a.40.5\" progressive=\"False\" type=\"audio\"\u003e,\n    \u003cStream: itag=\"140\" mime_type=\"audio/mp4\" abr=\"128kbps\" acodec=\"mp4a.40.2\" progressive=\"False\" type=\"audio\"\u003e,\n    \u003cStream: itag=\"249\" mime_type=\"audio/webm\" abr=\"50kbps\" acodec=\"opus\" progressive=\"False\" type=\"audio\"\u003e,\n    \u003cStream: itag=\"250\" mime_type=\"audio/webm\" abr=\"70kbps\" acodec=\"opus\" progressive=\"False\" type=\"audio\"\u003e,\n    \u003cStream: itag=\"251\" mime_type=\"audio/webm\" abr=\"160kbps\" acodec=\"opus\" progressive=\"False\" type=\"audio\"\u003e\n]\n\n\n```\n\n## YouTube Frontends\n\nThere's 2 really good options for self-hosting a YT front-end...\n\n[Tube Archivist](https://github.com/bbilly1/tubearchivist)\n\n[YouTubeDL-Material](https://github.com/Tzahi12345/YoutubeDL-Material)\n\nThey have their pros and cons.\nYou can also build yourself with the above utilities and use Plex or Jellyfin to serve up videos...\n\n__Your self-hosting journey is up to you!__\n\n\n## YouTube\n\nDownloading YouTube videos is a bit of a sore topic... Mainly you don't to hurt creators who rely on YT ad revenue for their livlihood.\n\nThen again, maybe you're a vigilante who knows that YT also monetizes videos for their _own_ gain and that the creators don't see that money either!\n\nThe solution is pretty easy and is 2-fold...\n\n1. Download YT videos\n2. Personally support the content creators you follow via paypall, patreon, or whatever else they might have set-up.... even a buck or two a month is more than they'd get from your ad revenue explicitly plus it all goes to them!\n",
      "summary": "Self-hosting 1 or several media servers is another common homelab use-case. Getting content for your media servers is up to you, but I'll show a few ways...",
      "date_published": "2022-03-24T00:00:00Z",
      "date_modified": "2022-03-24T00:00:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "python",
        "homelab",
        "tech",
        "series-homelab"
      ]
    },
    {
      "id": "https://pype.dev/skimpy/",
      "url": "https://pype.dev/skimpy/",
      "title": "Skimpy",
      "content_html": "\u003ch2 id=\"eda\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eEDA\u003c/span\u003e \u003ca href=\"#eda\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI work with data a lot, but the nature of my job isn\u0026rsquo;t to dive super deep into a small amount of datasets,\nI\u0026rsquo;m often jumping between several projects every day and need to just get a super quick glance at some tables to get a high level view.\u003c/p\u003e\n\u003cp\u003eWhen I\u0026rsquo;m doing more interactive exploration I\u0026rsquo;ve graduated from Jupyter cells with \u003ccode\u003edf_N.head()\u003c/code\u003e to using an amazing tool called \u003ca href=\"https://www.visidata.org/\"\u003evisidata\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eHowever, Visidata is a terminal based application and I\u0026rsquo;m often in an iPython console\u0026hellip; so is there a way to move even faster for my super quick summary views?\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eyes!\u003c/strong\u003e\u003c/p\u003e\n\u003ch2 id=\"skimpy\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSkimpy\u003c/span\u003e \u003ca href=\"#skimpy\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eFirst thing to do is \u003ccode\u003epip install skimpy\u003c/code\u003e and then it\u0026rsquo;s as easy to get some summary stats with \u003ccode\u003eskimpy \u0026lt;data\u0026gt;\u003c/code\u003e\u003c/p\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/skimpy-zsh.png\" alt=\"Skimpy ZSH\" title=\"A fancy data summary in the shell\" /\u003e\n\u003cp\u003eThis is super nice for seeing missing values in particular as well as the distribution shape of the data.\u003c/p\u003e\n\u003ch2 id=\"ipython\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eiPython\u003c/span\u003e \u003ca href=\"#ipython\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eBut wait\u0026hellip; I just said I\u0026rsquo;m normally in an iPython session but that was called from zsh.. If I\u0026rsquo;m hoping back into zsh I might as well use visidata to have more powerful exploration at my fingertips.\nSo\u0026hellip; can I see this table quickly without breaking my iPython workflow?\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eOf course you can with magic!\u003c/strong\u003e\u003c/p\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/skimpy-ipython.png\" alt=\"Skimpy iPython\" title=\"A fancy data summary in iPython\" /\u003e\n\u003cp\u003eThe above assumes you\u0026rsquo;re looking at a file, like you would in the terminal.\n\u003ccode\u003eskimpy\u003c/code\u003e works even better in iPython with \u003ccode\u003efrom skimpy import skim\u003c/code\u003e then pass any DataFrame to \u003ccode\u003eskim\u003c/code\u003e!\u003c/p\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/skimpy-ipython2.png\" alt=\"Skimpy iPython2\" title=\"A fancy data summary in iPython\" /\u003e\n",
      "content_text": "\n## EDA\n\nI work with data a lot, but the nature of my job isn't to dive super deep into a small amount of datasets,\nI'm often jumping between several projects every day and need to just get a super quick glance at some tables to get a high level view.\n\nWhen I'm doing more interactive exploration I've graduated from Jupyter cells with `df_N.head()` to using an amazing tool called [visidata](https://www.visidata.org/)\n\nHowever, Visidata is a terminal based application and I'm often in an iPython console... so is there a way to move even faster for my super quick summary views?\n\n__yes!__ \n\n## Skimpy\n\nFirst thing to do is `pip install skimpy` and then it's as easy to get some summary stats with `skimpy \u003cdata\u003e`\n\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/skimpy-zsh.png\" alt=\"Skimpy ZSH\" title=\"A fancy data summary in the shell\" /\u003e\n\nThis is super nice for seeing missing values in particular as well as the distribution shape of the data.\n\n## iPython\n\nBut wait... I just said I'm normally in an iPython session but that was called from zsh.. If I'm hoping back into zsh I might as well use visidata to have more powerful exploration at my fingertips.\nSo... can I see this table quickly without breaking my iPython workflow?\n\n__Of course you can with magic!__\n\n\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/skimpy-ipython.png\" alt=\"Skimpy iPython\" title=\"A fancy data summary in iPython\" /\u003e\n\n\nThe above assumes you're looking at a file, like you would in the terminal. \n`skimpy` works even better in iPython with `from skimpy import skim` then pass any DataFrame to `skim`!\n\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/skimpy-ipython2.png\" alt=\"Skimpy iPython2\" title=\"A fancy data summary in iPython\" /\u003e\n",
      "summary": "I work with data a lot, but the nature of my job isn't to dive super deep into a small amount of datasets, I'm often jumping between several projects every...",
      "date_published": "2022-03-23T00:00:00Z",
      "date_modified": "2022-03-23T00:00:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "python",
        "homepage",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/truenas-and-wireguard/",
      "url": "https://pype.dev/truenas-and-wireguard/",
      "title": "Truenas-And-Wireguard",
      "content_html": "\u003ch2 id=\"nas\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNAS\u003c/span\u003e \u003ca href=\"#nas\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eOne of the most common use cases for self-hosting anything is a file share system.\nI have been a fan of \u003ca href=\"https://www.truenas.com/\"\u003eTrueNAS\u003c/a\u003e for a while.\nI currently use TrueNAS Core at home, and plan to consider transitioning to TrueNAS Scale soon.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eBlog post forthcoming on that!\u003c/strong\u003e\u003c/p\u003e\n\u003ch2 id=\"vpn\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eVPN\u003c/span\u003e \u003ca href=\"#vpn\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI don\u0026rsquo;t write a ton about homelabbing yet but one of the first things to set up whether you have a massive homelab or a little raspberry pi would be a self-hosted VPN.\nI have notes on wireguard \u003ca href=\"%22/wireguard%22\"\u003ehere\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eI finally have a need to put my TrueNAS box on my wireguard network in order to transfer files to other devices that are outside my LAN.\u003c/p\u003e\n\u003cp\u003eThere is a handy tutorial on setting this up via the GUI \u003ca href=\"https://www.truenas.com/docs/core/network/wireguard/\"\u003ehere\u003c/a\u003e.\nThey walk you through setting up 2 tunables wireguard. One to enable the the connection and one to setup the network interface.\nNext you create a \u003ccode\u003ePost Init\u003c/code\u003e script which will check that the right directories exist and will copy the wireguard config that hasn\u0026rsquo;t been made yet to the proper location and finally starts wireguard.\u003c/p\u003e\n\u003cp\u003eThe above is just copy/paste from the tutorial but the final step, although not super tricky, isn\u0026rsquo;t the same for everyone as it depends on your wireguard config and network setup.\u003c/p\u003e\n\u003cp\u003eThe final step is for you create the relevant wireguard config (see my post but I just use \u003ccode\u003epivpn -a\u003c/code\u003e) and send that config over to your TrueNAS box!\u003c/p\u003e\n\u003cp\u003eFor me this final work flow looked like this:\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\"\u003essh user@vpn-server\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\"\u003epivpn -a\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\u0026lt;follow prompts\u0026gt;\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\"\u003escp ~/configs/truenas.conf root@\u0026lt;truenas ip\u0026gt;:/root/wg0.conf\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\u003ch2 id=\"bug\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBug?\u003c/span\u003e \u003ca href=\"#bug\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe script in the tutorial for starting the wireguard service is straight forward enough however my TrueNAS box didn\u0026rsquo;t get the wireguard interface up and running on reboot.\u003c/p\u003e\n\u003cp\u003eEasy enough solution:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003essh root@\u0026lt;truenas ip\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/usr/local/etc/rc.d/wireguard start\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWe can check that the interface is now working with \u003ccode\u003eifconfig\u003c/code\u003e and should see something like the following:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ewg0: \u003cspan class=\"nv\"\u003eflags\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e8051\u0026lt;UP,POINTOPOINT,RUNNING,MULTICAST\u0026gt; metric \u003cspan class=\"m\"\u003e0\u003c/span\u003e mtu \u003cspan class=\"m\"\u003e1420\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nv\"\u003eoptions\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e80000\u0026lt;LINKSTATE\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        inet x.x.x.x --\u0026gt; x.x.x.x netmask 0xffffff00\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        groups: tun\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        nd6 \u003cspan class=\"nv\"\u003eoptions\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e101\u0026lt;PERFORMNUD,NO_DAD\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        Opened by PID \u003cspan class=\"m\"\u003e1325\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"gotcha\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eGotcha!\u003c/span\u003e \u003ca href=\"#gotcha\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eHere\u0026rsquo;s another thing I had to navigate when setting this up.\u003c/p\u003e\n\u003cp\u003eMy \u003ccode\u003epivpn\u003c/code\u003e configuration sets the endpoint for my wireguard clients to \u003ccode\u003epaynepride.com:\u0026lt;port forwarded to wireguard server\u0026gt;\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eWhat this means is that when I check the wireguard config for TrueNAS which is on my home network it resolves \u003ccode\u003epaynepride.com\u003c/code\u003e to the server I have running my reverse proxy.\nHowever! My reverse proxy is not responsible for my vpn traffic and so the traffic was just getting dropped - instead I needed to change the wireguard config just for my truenas box to piont to the local address of my vpn server.\nThis really threw me for a loop today but is just another reminder that if you have network problems it\u0026rsquo;s probably DNS\u0026hellip;\u003c/p\u003e\n\u003cp\u003eGive her the \u0026lsquo;ol reboot and now if I check \u003ccode\u003ewg\u003c/code\u003e I should see some traffic on my wireguard tunnel!\u003c/p\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/truenas-wireguard.png\" alt=\"TrueNAS Wireguard\" title=\"TrueNAS and Wireguard\" /\u003e\n",
      "content_text": "\n## NAS\n\nOne of the most common use cases for self-hosting anything is a file share system. \nI have been a fan of [TrueNAS](https://www.truenas.com/) for a while. \nI currently use TrueNAS Core at home, and plan to consider transitioning to TrueNAS Scale soon.\n\n__Blog post forthcoming on that!__ \n\n\n## VPN \n\nI don't write a ton about homelabbing yet but one of the first things to set up whether you have a massive homelab or a little raspberry pi would be a self-hosted VPN.\nI have notes on wireguard [here](\"/wireguard\").\n\nI finally have a need to put my TrueNAS box on my wireguard network in order to transfer files to other devices that are outside my LAN.\n\nThere is a handy tutorial on setting this up via the GUI [here](https://www.truenas.com/docs/core/network/wireguard/).\nThey walk you through setting up 2 tunables wireguard. One to enable the the connection and one to setup the network interface.\nNext you create a `Post Init` script which will check that the right directories exist and will copy the wireguard config that hasn't been made yet to the proper location and finally starts wireguard.\n\nThe above is just copy/paste from the tutorial but the final step, although not super tricky, isn't the same for everyone as it depends on your wireguard config and network setup.\n\nThe final step is for you create the relevant wireguard config (see my post but I just use `pivpn -a`) and send that config over to your TrueNAS box!\n\nFor me this final work flow looked like this:\n\n```bash\n\nssh user@vpn-server\n\npivpn -a\n\n\u003cfollow prompts\u003e\n\nscp ~/configs/truenas.conf root@\u003ctruenas ip\u003e:/root/wg0.conf\n\n```\n\n## Bug?\n\nThe script in the tutorial for starting the wireguard service is straight forward enough however my TrueNAS box didn't get the wireguard interface up and running on reboot.\n\nEasy enough solution:\n\n```bash\nssh root@\u003ctruenas ip\u003e\n/usr/local/etc/rc.d/wireguard start\n```\n\nWe can check that the interface is now working with `ifconfig` and should see something like the following:\n\n```bash \nwg0: flags=8051\u003cUP,POINTOPOINT,RUNNING,MULTICAST\u003e metric 0 mtu 1420\n        options=80000\u003cLINKSTATE\u003e\n        inet x.x.x.x --\u003e x.x.x.x netmask 0xffffff00\n        groups: tun\n        nd6 options=101\u003cPERFORMNUD,NO_DAD\u003e\n        Opened by PID 1325\n```\n\n\n## Gotcha!\n\nHere's another thing I had to navigate when setting this up.\n\nMy `pivpn` configuration sets the endpoint for my wireguard clients to `paynepride.com:\u003cport forwarded to wireguard server\u003e`\n\nWhat this means is that when I check the wireguard config for TrueNAS which is on my home network it resolves `paynepride.com` to the server I have running my reverse proxy.\nHowever! My reverse proxy is not responsible for my vpn traffic and so the traffic was just getting dropped - instead I needed to change the wireguard config just for my truenas box to piont to the local address of my vpn server.\nThis really threw me for a loop today but is just another reminder that if you have network problems it's probably DNS...\n\nGive her the 'ol reboot and now if I check `wg` I should see some traffic on my wireguard tunnel!\n\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/truenas-wireguard.png\" alt=\"TrueNAS Wireguard\" title=\"TrueNAS and Wireguard\" /\u003e\n",
      "summary": "One of the most common use cases for self-hosting anything is a file share system. I have been a fan of TrueNAS for a while. I currently use TrueNAS Core at...",
      "date_published": "2022-03-23T00:00:00Z",
      "date_modified": "2022-03-23T00:00:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/pyclean/",
      "url": "https://pype.dev/pyclean/",
      "title": "Pyclean",
      "content_html": "\u003cp\u003eI like to keep my workspace clean and one thing that I don\u0026rsquo;t personally love looking at is the \u003ccode\u003e__pycache__\u003c/code\u003e directory that pops up after running some code.\nThe \u003ccode\u003e*.pyc\u003c/code\u003e files that show up there are python bytecode and they are cached to make subsequent runs a tad faster.\nMy stuff never really needs this bonus speed boost and so I came across a neat tool called \u003ccode\u003epyclean\u003c/code\u003e!\u003c/p\u003e\n\u003ch2 id=\"pyclean\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePyclean\u003c/span\u003e \u003ca href=\"#pyclean\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe easiest way (\u003cstrong\u003ein my opinion\u003c/strong\u003e) to run \u003ccode\u003epyclean\u003c/code\u003e is to just use \u003ccode\u003epipx run\u003c/code\u003e.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esandbox/src  🌱 main 🗑️  ×3🛤️  ×2via 🐍 v3.8.11 \u003cspan class=\"o\"\u003e(\u003c/span\u003esandbox\u003cspan class=\"o\"\u003e)\u003c/span\u003e  took 9s\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ ls\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eabcmeta.py  __pycache__  python-print-align.py  system-monitor-psutils.py\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\"\u003esandbox/src  🌱 main 🗑️  ×3🛤️  ×2via 🐍 v3.8.11 \u003cspan class=\"o\"\u003e(\u003c/span\u003esandbox\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ pipx run pyclean .\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e⚠️  pyclean is already on your PATH and installed at /usr/bin/pyclean. Downloading and running anyway.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCleaning directory .\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eTotal \u003cspan class=\"m\"\u003e1\u003c/span\u003e files, \u003cspan class=\"m\"\u003e1\u003c/span\u003e directories removed.\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\"\u003esandbox/src  🌱 main 🗑️  ×3🛤️  ×2via 🐍 v3.8.11 \u003cspan class=\"o\"\u003e(\u003c/span\u003esandbox\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ ls\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eabcmeta.py  python-print-align.py  system-monitor-psutils.py\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\u003ch2 id=\"why-not-bash\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWhy not bash?\u003c/span\u003e \u003ca href=\"#why-not-bash\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eYou could accomplish something similar with \u003ccode\u003erm **/*.pyc\u003c/code\u003e or \u003ccode\u003efind -n '*.py?' -delete\u003c/code\u003e but there\u0026rsquo;s a chance you\u0026rsquo;ll find something you don\u0026rsquo;t love gone.\nAlso this won\u0026rsquo;t help our poor Windows friends out there!\n\u003ccode\u003epyclean\u003c/code\u003e is fully python so it\u0026rsquo;s OS independent.\u003c/p\u003e\n\u003ch2 id=\"credits\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCredits!\u003c/span\u003e \u003ca href=\"#credits\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/bittner/pyclean\"\u003erepo\u003c/a\u003e\u003c/p\u003e\n",
      "content_text": "\nI like to keep my workspace clean and one thing that I don't personally love looking at is the `__pycache__` directory that pops up after running some code.\nThe `*.pyc` files that show up there are python bytecode and they are cached to make subsequent runs a tad faster. \nMy stuff never really needs this bonus speed boost and so I came across a neat tool called `pyclean`!\n\n## Pyclean\n\nThe easiest way (**in my opinion**) to run `pyclean` is to just use `pipx run`.\n\n```bash\nsandbox/src  🌱 main 🗑️  ×3🛤️  ×2via 🐍 v3.8.11 (sandbox)  took 9s\n❯ ls\nabcmeta.py  __pycache__  python-print-align.py  system-monitor-psutils.py\n\nsandbox/src  🌱 main 🗑️  ×3🛤️  ×2via 🐍 v3.8.11 (sandbox)\n❯ pipx run pyclean .\n⚠️  pyclean is already on your PATH and installed at /usr/bin/pyclean. Downloading and running anyway.\nCleaning directory .\nTotal 1 files, 1 directories removed.\n\nsandbox/src  🌱 main 🗑️  ×3🛤️  ×2via 🐍 v3.8.11 (sandbox)\n❯ ls\nabcmeta.py  python-print-align.py  system-monitor-psutils.py\n\n```\n\n## Why not bash?\n\nYou could accomplish something similar with `rm **/*.pyc` or `find -n '*.py?' -delete` but there's a chance you'll find something you don't love gone.\nAlso this won't help our poor Windows friends out there!\n`pyclean` is fully python so it's OS independent.\n\n## Credits!\n\n[repo](https://github.com/bittner/pyclean)\n",
      "summary": "I like to keep my workspace clean and one thing that I don't personally love looking at is the directory that pops up after running some code. The files that...",
      "date_published": "2022-03-22T00:00:00Z",
      "date_modified": "2022-03-22T00:00:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "python",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/psutils-01/",
      "url": "https://pype.dev/psutils-01/",
      "title": "Psutil-01",
      "content_html": "\u003cp\u003e\u003ca href=\"https://twitter.com/driscollis\"\u003eMike Driscoll\u003c/a\u003e has been posting some awesome posts about \u003ccode\u003epsutil\u003c/code\u003e lately.\nI\u0026rsquo;m interested in making my own system monitoring dashboard now using this library.\nI don\u0026rsquo;t expect it to compete with Netdata or Glances but it\u0026rsquo;ll just be for fun to see how Python can solve this problem!\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eRepo coming soon\u003c/strong\u003e\u003c/p\u003e\n\u003ch2 id=\"example-code\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExample code:\u003c/span\u003e \u003ca href=\"#example-code\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eHere\u0026rsquo;s a short snippit to get used/available/total RAM and disk space (on partitions that you probably care about)\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\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"nn\"\u003epsutil\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"nn\"\u003esocket\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=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;System Memory used: \u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003epsutil\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003evirtual_memory\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eused\u003c/span\u003e \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e1024\u003c/span\u003e \u003cspan class=\"o\"\u003e**\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e GB\u0026#34;\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=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;System Memory available: \u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003epsutil\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003evirtual_memory\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eavailable\u003c/span\u003e \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e1024\u003c/span\u003e \u003cspan class=\"o\"\u003e**\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e GB\u0026#34;\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=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;System Memory total: \u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003epsutil\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003evirtual_memory\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003etotal\u003c/span\u003e \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e1024\u003c/span\u003e \u003cspan class=\"o\"\u003e**\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e GB\u0026#34;\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\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=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Hostname: \u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003esocket\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003egethostname\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003epartitions\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003epsutil\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003edisk_partitions\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003epart\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003epartitions\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=\"n\"\u003emnt\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003epart\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003emountpoint\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;snap\u0026#34;\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003emnt\u003c/span\u003e \u003cspan class=\"ow\"\u003eor\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;boot\u0026#34;\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003emnt\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\"\u003econtinue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003edisk\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003epsutil\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003edisk_usage\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003emnt\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=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Usage at \u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003emnt\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e on \u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003epart\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003edevice\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e: \u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003edisk\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eused\u003c/span\u003e \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e1024\u003c/span\u003e \u003cspan class=\"o\"\u003e**\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e GB\u0026#34;\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=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Free at \u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003emnt\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e on \u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003epart\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003edevice\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e: \u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003edisk\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003efree\u003c/span\u003e \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e1024\u003c/span\u003e \u003cspan class=\"o\"\u003e**\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003eGB\u0026#34;\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=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Total at \u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003emnt\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e on \u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003epart\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003edevice\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e: \u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003edisk\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003etotal\u003c/span\u003e \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e1024\u003c/span\u003e \u003cspan class=\"o\"\u003e**\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003eGB\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cblockquote\u003e\n\u003cp\u003eBonus Ipython tip! Save this to a script called my_script.py and in Ipython you can %run -m my_script to run it!\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eproject ↪ main v3.8.11 ipython\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ %run -m system-monitor-psutils\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSystem Memory used: \u003cspan class=\"m\"\u003e25\u003c/span\u003e GB\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSystem Memory available: \u003cspan class=\"m\"\u003e5\u003c/span\u003e GB\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSystem Memory total: \u003cspan class=\"m\"\u003e31\u003c/span\u003e GB\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHostname: ryzen-3600x\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUsage at / on /dev/nvme1n1p2: \u003cspan class=\"m\"\u003e81\u003c/span\u003e GB\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFree at / on /dev/nvme1n1p2: \u003cspan class=\"m\"\u003e351\u003c/span\u003e GB\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eTotal at / on /dev/nvme1n1p2: \u003cspan class=\"m\"\u003e456\u003c/span\u003e GB\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\n[Mike Driscoll](https://twitter.com/driscollis) has been posting some awesome posts about `psutil` lately.\nI'm interested in making my own system monitoring dashboard now using this library.\nI don't expect it to compete with Netdata or Glances but it'll just be for fun to see how Python can solve this problem!\n\n__Repo coming soon__\n\n## Example code:\nHere's a short snippit to get used/available/total RAM and disk space (on partitions that you probably care about)\n```python\n\nimport psutil\nimport socket\n\nprint(f\"System Memory used: {psutil.virtual_memory().used // (1024 ** 3)} GB\")\nprint(f\"System Memory available: {psutil.virtual_memory().available // (1024 ** 3)} GB\")\nprint(f\"System Memory total: {psutil.virtual_memory().total // (1024 ** 3)} GB\")\n\n\nprint(f\"Hostname: {socket.gethostname()}\")\n\npartitions = psutil.disk_partitions()\n\nfor part in partitions:\n    mnt = part.mountpoint\n    if \"snap\" in mnt or \"boot\" in mnt:\n        continue\n    disk = psutil.disk_usage(mnt)\n    print(f\"Usage at {mnt} on {part.device}: {disk.used // (1024 ** 3)} GB\")\n    print(f\"Free at {mnt} on {part.device}: {disk.free // (1024 ** 3)}GB\")\n    print(f\"Total at {mnt} on {part.device}: {disk.total // (1024 ** 3)}GB\")\n```\n\n\u003e Bonus Ipython tip! Save this to a script called my_script.py and in Ipython you can %run -m my_script to run it!\n\n```bash\nproject ↪ main v3.8.11 ipython\n❯ %run -m system-monitor-psutils\nSystem Memory used: 25 GB\nSystem Memory available: 5 GB\nSystem Memory total: 31 GB\nHostname: ryzen-3600x\nUsage at / on /dev/nvme1n1p2: 81 GB\nFree at / on /dev/nvme1n1p2: 351 GB\nTotal at / on /dev/nvme1n1p2: 456 GB\n```\n",
      "summary": "Mike Driscoll has been posting some awesome posts about lately. I'm interested in making my own system monitoring dashboard now using this library. I don't...",
      "date_published": "2022-03-16T00:00:00Z",
      "date_modified": "2022-03-16T00:00:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "python",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/mu/",
      "url": "https://pype.dev/mu/",
      "title": "Mu",
      "content_html": "\u003cp\u003eIf you work with a template for several projects then you might sometimes need to do the same action across all repos.\nA good example of this is updating a package in \u003ccode\u003erequirements.txt\u003c/code\u003e in every project, or refactoring a common module.\nIf you have several repos to do this across then it can be time consuming\u0026hellip; enter \u003ccode\u003emu-repo\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"mu\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMu\u003c/span\u003e \u003ca href=\"#mu\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://fabioz.github.io/mu-repo/\"\u003emu-repo\u003c/a\u003e is an awesome cli tool for working with multiple git repositories at the same time.\nThere are several things you can do:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003ccode\u003emu status\u003c/code\u003e will give you the \u003ccode\u003egit status\u003c/code\u003e of every registered repo (see below)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emu sh\u003c/code\u003e will let you execute system level commands in every repo\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emu stash\u003c/code\u003e will stash all changes across all registered repos\u003c/li\u003e\n\u003cli\u003eThere\u0026rsquo;s literally a ton more but these are some handy ones\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"registration\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRegistration\u003c/span\u003e \u003ca href=\"#registration\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003emu\u003c/code\u003e tracks its own \u003ccode\u003egroups\u003c/code\u003e, and there is a default group when no particular one is active.\nIt\u0026rsquo;s as simple as \u003ccode\u003emu register proj1 prog2 ...\u003c/code\u003e to get repos registered\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\"\u003e❯ mu register proj1 proj2\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eRepository: proj1 registered\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eRepository: proj2 registered\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❯ mu status\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  proj1 : git status\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    On branch main\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    No commits yet\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    Untracked files:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e(\u003c/span\u003euse \u003cspan class=\"s2\"\u003e\u0026#34;git add \u0026lt;file\u0026gt;...\u0026#34;\u003c/span\u003e to include in what will be committed\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    requirements.txt\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    nothing added to commit but untracked files present \u003cspan class=\"o\"\u003e(\u003c/span\u003euse \u003cspan class=\"s2\"\u003e\u0026#34;git add\u0026#34;\u003c/span\u003e to track\u003cspan class=\"o\"\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  proj2 : git status\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    On branch main\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    No commits yet\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    Changes to be committed:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e(\u003c/span\u003euse \u003cspan class=\"s2\"\u003e\u0026#34;git rm --cached \u0026lt;file\u0026gt;...\u0026#34;\u003c/span\u003e to unstage\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    new file:   requirements.txt\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\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"working-with-mu\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWorking with mu\u003c/span\u003e \u003ca href=\"#working-with-mu\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAs you can see above I have two projects each with a \u003ccode\u003erequirements.txt\u003c/code\u003e added but not committed yet.\nUsing \u003ccode\u003emu\u003c/code\u003e I can stage this change across both repos at once.\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\"\u003e❯ mu add requirements.txt\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  proj1 : git add requirements.txt\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  proj2 : git add requirements.txt\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThen as you might imagine, I can make the commit in each repo\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\"\u003e❯ mu commit -m \u003cspan class=\"s2\"\u003e\u0026#34;Add requirements.txts\u0026#34;\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  proj1 : git commit -m Add requirements.txts\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e[\u003c/span\u003emain \u003cspan class=\"o\"\u003e(\u003c/span\u003eroot-commit\u003cspan class=\"o\"\u003e)\u003c/span\u003e 18376d7\u003cspan class=\"o\"\u003e]\u003c/span\u003e Add requirements.txts\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"m\"\u003e1\u003c/span\u003e file changed, \u003cspan class=\"m\"\u003e1\u003c/span\u003e insertion\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    create mode \u003cspan class=\"m\"\u003e100644\u003c/span\u003e requirements.txt\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  proj2 : git commit -m Add requirements.txts\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e[\u003c/span\u003emain \u003cspan class=\"o\"\u003e(\u003c/span\u003eroot-commit\u003cspan class=\"o\"\u003e)\u003c/span\u003e 18376d7\u003cspan class=\"o\"\u003e]\u003c/span\u003e Add requirements.txts\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"m\"\u003e1\u003c/span\u003e file changed, \u003cspan class=\"m\"\u003e1\u003c/span\u003e insertion\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    create mode \u003cspan class=\"m\"\u003e100644\u003c/span\u003e requirements.txt\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"mu-groups\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003emu groups\u003c/span\u003e \u003ca href=\"#mu-groups\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe other thing I got a lot of use out of recently was \u003ccode\u003emu\u003c/code\u003e\u0026rsquo;s groups.\nAt work I have about 40 repos cloned that are all based on the same kedro pipeline template.\nSome of these projects have been deprecated.\nI also have several more repos that are not kedro template - custom libraries or something.\n\u003ccode\u003egroup\u003c/code\u003e let me utilize \u003ccode\u003emu\u003c/code\u003e across different groups of repos.\u003c/p\u003e\n\u003cp\u003eSay \u003ccode\u003eproj2\u003c/code\u003e is a deprecated project that I don\u0026rsquo;t need to worry about making changes to anymore.\nI don\u0026rsquo;t just have to unregister it, instead I can make a group called \u0026ldquo;active\u0026rdquo; and register \u003ccode\u003eproj1\u003c/code\u003e in that group\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\"\u003e❯ mu group add active --empty\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~/personal\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ mu group add deprecated --empty\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~/personal\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e❯ mu group\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  active\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e* deprecated\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\u003eThe \u003ccode\u003e*\u003c/code\u003e tells me which group is active.\nThe \u003ccode\u003e--empty\u003c/code\u003e flag tells \u003ccode\u003emu\u003c/code\u003e to not add all registered repos to that group.\nIf I don\u0026rsquo;t want to use any groups then \u003ccode\u003emu group reset\u003c/code\u003e will go back to the default group with all registered repos.\u003c/p\u003e\n\u003cp\u003eWith groups I can register only the repos that I want to be working across in their own group and not worry about affecting other repos with my batch changes!\u003c/p\u003e\n",
      "content_text": "\nIf you work with a template for several projects then you might sometimes need to do the same action across all repos.\nA good example of this is updating a package in `requirements.txt` in every project, or refactoring a common module.\nIf you have several repos to do this across then it can be time consuming... enter `mu-repo`\n\n\n## Mu\n\n[mu-repo](https://fabioz.github.io/mu-repo/) is an awesome cli tool for working with multiple git repositories at the same time. \nThere are several things you can do:\n\n1. `mu status` will give you the `git status` of every registered repo (see below)\n2. `mu sh` will let you execute system level commands in every repo\n3. `mu stash` will stash all changes across all registered repos\n4. There's literally a ton more but these are some handy ones\n\n\n## Registration\n\n`mu` tracks its own `groups`, and there is a default group when no particular one is active.\nIt's as simple as `mu register proj1 prog2 ...` to get repos registered\n\n```bash \n\n❯ mu register proj1 proj2\nRepository: proj1 registered\nRepository: proj2 registered\n\n❯ mu status\n\n  proj1 : git status\n    On branch main\n\n    No commits yet\n\n    Untracked files:\n    (use \"git add \u003cfile\u003e...\" to include in what will be committed)\n    requirements.txt\n\n    nothing added to commit but untracked files present (use \"git add\" to track)\n\n  proj2 : git status\n    On branch main\n\n    No commits yet\n\n    Changes to be committed:\n    (use \"git rm --cached \u003cfile\u003e...\" to unstage)\n    new file:   requirements.txt\n\n\n```\n\n## Working with mu\n\nAs you can see above I have two projects each with a `requirements.txt` added but not committed yet.\nUsing `mu` I can stage this change across both repos at once.\n\n```bash  \n\n❯ mu add requirements.txt\n\n  proj1 : git add requirements.txt\n\n  proj2 : git add requirements.txt\n```\n\nThen as you might imagine, I can make the commit in each repo\n\n\n```bash\n\n❯ mu commit -m \"Add requirements.txts\"\n\n  proj1 : git commit -m Add requirements.txts\n    [main (root-commit) 18376d7] Add requirements.txts\n    1 file changed, 1 insertion(+)\n    create mode 100644 requirements.txt\n\n  proj2 : git commit -m Add requirements.txts\n    [main (root-commit) 18376d7] Add requirements.txts\n    1 file changed, 1 insertion(+)\n    create mode 100644 requirements.txt\n```\n\n## mu groups\n\nThe other thing I got a lot of use out of recently was `mu`'s groups.\nAt work I have about 40 repos cloned that are all based on the same kedro pipeline template.\nSome of these projects have been deprecated.\nI also have several more repos that are not kedro template - custom libraries or something.\n`group` let me utilize `mu` across different groups of repos.\n\nSay `proj2` is a deprecated project that I don't need to worry about making changes to anymore.\nI don't just have to unregister it, instead I can make a group called \"active\" and register `proj1` in that group\n\n```bash\n\n❯ mu group add active --empty\n\n~/personal\n❯ mu group add deprecated --empty\n\n~/personal\n❯ mu group\n  active\n* deprecated\n\n```\n\n\nThe `*` tells me which group is active. \nThe `--empty` flag tells `mu` to not add all registered repos to that group.\nIf I don't want to use any groups then `mu group reset` will go back to the default group with all registered repos.\n\nWith groups I can register only the repos that I want to be working across in their own group and not worry about affecting other repos with my batch changes!\n",
      "summary": "If you work with a template for several projects then you might sometimes need to do the same action across all repos. A good example of this is updating a...",
      "date_published": "2022-03-15T00:00:00Z",
      "date_modified": "2022-03-15T00:00:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "python",
        "git",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/wireguard/",
      "url": "https://pype.dev/wireguard/",
      "title": "Wireguard",
      "content_html": "\u003ch2 id=\"vpn\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eVPN\u003c/span\u003e \u003ca href=\"#vpn\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eVirtual Private Networks are a big deal, and this shouldn\u0026rsquo;t be considered anything even close to a guide on using them.\nHere are just my notes and some setup for how I use \u003ca href=\"https://www.wireguard.com/\"\u003ewireguard\u003c/a\u003e at home.\u003c/p\u003e\n\u003ch2 id=\"wireguard\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWireguard\u003c/span\u003e \u003ca href=\"#wireguard\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWireguard is an awesome peer-to-peer VPN tunnel that makes it really easy for me to get into my home network when I\u0026rsquo;m out and about.\nMy main reasons for this are 1. I don\u0026rsquo;t trust public wi-fi and 2. I want to use pi-hole for ad blocking when I\u0026rsquo;m not at home\u003c/p\u003e\n\u003cp\u003eWireguard can be configured as a \u0026ldquo;peer-to-site\u0026rdquo; VPN tunnel as well.\nMy vpn setup let\u0026rsquo;s me jump to various machines on my network from anywhere!\u003c/p\u003e\n\u003cp\u003eI use \u003ca href=\"https://pivpn.io/\"\u003epivpn\u003c/a\u003e in a VM that\u0026rsquo;s already running \u003ccode\u003epi-hole\u003c/code\u003e to host my wireguard server.\nIt\u0026rsquo;s super easy to setup just by following the instructions on the pivpn site.\u003c/p\u003e\n\u003cp\u003eThe reason I like it is that I have a nice \u003ccode\u003ecli\u003c/code\u003e for managing wireguard configs.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edumbledore@pihole-vpn:~$ pivpn\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e::: Control all PiVPN specific functions!\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::: Usage: pivpn \u0026lt;command\u0026gt; \u003cspan class=\"o\"\u003e[\u003c/span\u003eoption\u003cspan class=\"o\"\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::: Commands:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::    -a, add              Create a client conf profile\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::    -c, clients          List any connected clients to the server\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::    -d, debug            Start a debugging session \u003cspan class=\"k\"\u003eif\u003c/span\u003e having trouble\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::    -l, list             List all clients\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::   -qr, qrcode           Show the qrcode of a client \u003cspan class=\"k\"\u003efor\u003c/span\u003e use with the mobile app\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::    -r, remove           Remove a client\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::  -off, off              Disable a user\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::   -on, on               Enable a user\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::    -h, \u003cspan class=\"nb\"\u003ehelp\u003c/span\u003e             Show this \u003cspan class=\"nb\"\u003ehelp\u003c/span\u003e dialog\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::    -u, uninstall        Uninstall pivpn from your system!\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::   -up, update           Updates PiVPN Scripts\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e:::   -bk, backup           Backup VPN configs and user profiles\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWhen I\u0026rsquo;m ready to add a new client to my \u003ccode\u003ewg\u003c/code\u003e network, it\u0026rsquo;s as easy as \u003ccode\u003epivpn add\u003c/code\u003e and follow the instructions.\nThe easiest part here is that you\u0026rsquo;ll be given a QR code in the terminal that you can just scan with the client (like a smart phone) and you\u0026rsquo;ll have your wireguard config handled by the app (oh right, download the wireguard app) in no time!\u003c/p\u003e\n",
      "content_text": "\n## VPN\n\nVirtual Private Networks are a big deal, and this shouldn't be considered anything even close to a guide on using them.\nHere are just my notes and some setup for how I use [wireguard](https://www.wireguard.com/) at home.\n\n## Wireguard\n\nWireguard is an awesome peer-to-peer VPN tunnel that makes it really easy for me to get into my home network when I'm out and about.\nMy main reasons for this are 1. I don't trust public wi-fi and 2. I want to use pi-hole for ad blocking when I'm not at home\n\nWireguard can be configured as a \"peer-to-site\" VPN tunnel as well.\nMy vpn setup let's me jump to various machines on my network from anywhere!\n\nI use [pivpn](https://pivpn.io/) in a VM that's already running `pi-hole` to host my wireguard server.\nIt's super easy to setup just by following the instructions on the pivpn site.\n\nThe reason I like it is that I have a nice `cli` for managing wireguard configs.\n\n```bash\ndumbledore@pihole-vpn:~$ pivpn\n::: Control all PiVPN specific functions!\n:::\n::: Usage: pivpn \u003ccommand\u003e [option]\n:::\n::: Commands:\n:::    -a, add              Create a client conf profile\n:::    -c, clients          List any connected clients to the server\n:::    -d, debug            Start a debugging session if having trouble\n:::    -l, list             List all clients\n:::   -qr, qrcode           Show the qrcode of a client for use with the mobile app\n:::    -r, remove           Remove a client\n:::  -off, off              Disable a user\n:::   -on, on               Enable a user\n:::    -h, help             Show this help dialog\n:::    -u, uninstall        Uninstall pivpn from your system!\n:::   -up, update           Updates PiVPN Scripts\n:::   -bk, backup           Backup VPN configs and user profiles\n```\n\n\nWhen I'm ready to add a new client to my `wg` network, it's as easy as `pivpn add` and follow the instructions.\nThe easiest part here is that you'll be given a QR code in the terminal that you can just scan with the client (like a smart phone) and you'll have your wireguard config handled by the app (oh right, download the wireguard app) in no time!\n",
      "summary": "Virtual Private Networks are a big deal, and this shouldn't be considered anything even close to a guide on using them. Here are just my notes and some setup...",
      "date_published": "2022-03-12T00:00:00Z",
      "date_modified": "2022-03-12T00:00:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "homepage",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/abstract-base-class/",
      "url": "https://pype.dev/abstract-base-class/",
      "title": "Abstract-Base-Class",
      "content_html": "\u003ch2 id=\"abcmeta\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eABCMeta\u003c/span\u003e \u003ca href=\"#abcmeta\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI don\u0026rsquo;t do a lot of OOP currently, but I have been on a few heavy OOP projects and this \u003ccode\u003eABCMeta\u003c/code\u003e and \u003ccode\u003eabstractmethod\u003c/code\u003e from \u003ccode\u003eabc\u003c/code\u003e would\u0026rsquo;ve been super nice to know about!\u003c/p\u003e\n\u003cp\u003eIf you are creating a library with classes that you expect your users to extend, but you want to ensure that any extension has explicit methods defined then this is for you!.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003eabc\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eABCMeta\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eabstractmethod\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003eFamily\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003emetaclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003eABCMeta\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=\"nd\"\u003e@abstractmethod\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003eget_dad\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\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=\"s2\"\u003e\u0026#34;\u0026#34;\u0026#34;Any extension of the Family class must implement a `get_dad` method\u0026#34;\u0026#34;\u0026#34;\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=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003eMyFamily\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eFamily\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\"\u003epass\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\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eIf I try to instantiate \u003ccode\u003eMyFamily\u003c/code\u003e I will not be allowed:\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\"\u003e\u003cspan class=\"err\"\u003e❯\u003c/span\u003e \u003cspan class=\"n\"\u003emy_fam\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eMyFamily\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=\"err\"\u003e╭───────────────────────────────\u003c/span\u003e \u003cspan class=\"n\"\u003eTraceback\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003emost\u003c/span\u003e \u003cspan class=\"n\"\u003erecent\u003c/span\u003e \u003cspan class=\"n\"\u003ecall\u003c/span\u003e \u003cspan class=\"n\"\u003elast\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"err\"\u003e────────────────────────────────╮\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e│\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eipython\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nb\"\u003einput\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e8\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eecb8e21ce815\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003emodule\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e                                                     \u003cspan class=\"err\"\u003e│\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e╰──────────────────────────────────────────────────────────────────────────────────────────────────╯\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"ne\"\u003eTypeError\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eCan\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;t instantiate abstract class MyFamily with abstract methods get_dad\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\u003c/code\u003e\u003c/pre\u003e\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/py-abc-meta.png\" alt=\"abcmetadata\" title=\"ABC Metadata\" /\u003e\n\u003cp\u003eIn order for me to extend \u003ccode\u003eFamily\u003c/code\u003e I have to implement the method \u003ccode\u003eget_dad\u003c/code\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003eMyFamily\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eFamily\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\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003eget_dad\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\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\"\u003ereturn\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Me\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNow everything works as expected and I can sleep well knowing no one can extend my base class without creating methods I know they need.\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\"\u003e\u003cspan class=\"n\"\u003emy_fam\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eMyFamily\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003emy_fam\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget_dad\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=\"s1\"\u003e\u0026#39;Me\u0026#39;\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\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\n## ABCMeta\n\nI don't do a lot of OOP currently, but I have been on a few heavy OOP projects and this `ABCMeta` and `abstractmethod` from `abc` would've been super nice to know about!\n\nIf you are creating a library with classes that you expect your users to extend, but you want to ensure that any extension has explicit methods defined then this is for you!.\n\n```python\nfrom abc import ABCMeta, abstractmethod\nclass Family(metaclass=ABCMeta):\n    @abstractmethod\n    def get_dad(self):\n        \"\"\"Any extension of the Family class must implement a `get_dad` method\"\"\"\n\nclass MyFamily(Family):\n    pass\n\n```\n\nIf I try to instantiate `MyFamily` I will not be allowed:\n```python\n\n❯ my_fam = MyFamily()\n╭─────────────────────────────── Traceback (most recent call last) ────────────────────────────────╮\n│ \u003cipython-input-8-ecb8e21ce815\u003e:1 in \u003cmodule\u003e                                                     │\n╰──────────────────────────────────────────────────────────────────────────────────────────────────╯\nTypeError: Can't instantiate abstract class MyFamily with abstract methods get_dad\n\n```\n\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/py-abc-meta.png\" alt=\"abcmetadata\" title=\"ABC Metadata\" /\u003e\n\nIn order for me to extend `Family` I have to implement the method `get_dad`\n\n```python\nclass MyFamily(Family):\n    def get_dad(self):\n        return \"Me\"\n```\n\nNow everything works as expected and I can sleep well knowing no one can extend my base class without creating methods I know they need.\n\n\n```python\n\nmy_fam = MyFamily()\n\nmy_fam.get_dad()\n'Me'\n\n```\n",
      "summary": "I don't do a lot of OOP currently, but I have been on a few heavy OOP projects and this and from would've been super nice to know about!",
      "date_published": "2022-03-09T00:00:00Z",
      "date_modified": "2022-03-09T00:00:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "python",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/python-f-string-align/",
      "url": "https://pype.dev/python-f-string-align/",
      "title": "Python-F-String-Align",
      "content_html": "\u003cp\u003eI am personally trying to use \u003ccode\u003elogger\u003c/code\u003e instead of \u003ccode\u003eprint\u003c/code\u003e in all of my code,\nhowever I learned from [@Python-Hub] that you can align printouts using \u003ccode\u003eprint\u003c/code\u003e with \u003ccode\u003ef\u003c/code\u003e-strings!.\u003c/p\u003e\n\u003cp\u003eThis little python script shows how options in the \u003ccode\u003ef\u003c/code\u003e-string can format the printout.\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\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"nn\"\u003erandom\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=\"n\"\u003evariables\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Foo Bar Baz Bing\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esplit\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=\"n\"\u003escores\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003erandom\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esample\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003erange\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e11\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e \u003cspan class=\"nb\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003evariables\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;*\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"mi\"\u003e30\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=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\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=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;With \u0026#39;varable\u0026#39; left aligned\u0026#34;\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\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003evarable\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003escore\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"nb\"\u003ezip\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003evariables\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003escores\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=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003evarable\u003c/span\u003e\u003cspan class=\"si\"\u003e:\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026lt;10\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e | \u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003escore\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;*\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"mi\"\u003e30\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=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\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=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;With \u0026#39;varable\u0026#39; right aligned\u0026#34;\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\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003evarable\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003escore\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"nb\"\u003ezip\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003evariables\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003escores\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=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003evarable\u003c/span\u003e\u003cspan class=\"si\"\u003e:\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026gt;15\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e | \u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003escore\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;*\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"mi\"\u003e30\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=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\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=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;With \u0026#39;varable\u0026#39; center aligned\u0026#34;\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\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003evarable\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003escore\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"nb\"\u003ezip\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003evariables\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003escores\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=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003evarable\u003c/span\u003e\u003cspan class=\"si\"\u003e:\u003c/span\u003e\u003cspan class=\"s2\"\u003e^5\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e | \u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003escore\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\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\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/py-print-align.png\" alt=\"pyprintalign\" title=\"Align f-string printing\" /\u003e\n",
      "content_text": "\n\nI am personally trying to use `logger` instead of `print` in all of my code, \nhowever I learned from [@Python-Hub] that you can align printouts using `print` with `f`-strings!.\n\nThis little python script shows how options in the `f`-string can format the printout.\n\n```python\n\nimport random\n\nvariables = \"Foo Bar Baz Bing\".split()\nscores = random.sample(range(1, 11), len(variables))\n\nprint(\"*\" * 30)\nprint(\"\\n\")\nprint(\"With 'varable' left aligned\")\nfor varable, score in zip(variables, scores):\n    print(f\"{varable:\u003c10} | {score}\")\n\nprint(\"*\" * 30)\nprint(\"\\n\")\nprint(\"With 'varable' right aligned\")\nfor varable, score in zip(variables, scores):\n    print(f\"{varable:\u003e15} | {score}\")\n\nprint(\"*\" * 30)\nprint(\"\\n\")\nprint(\"With 'varable' center aligned\")\nfor varable, score in zip(variables, scores):\n    print(f\"{varable:^5} | {score}\")\n\n```\n\n\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/py-print-align.png\" alt=\"pyprintalign\" title=\"Align f-string printing\" /\u003e\n",
      "summary": "I am personally trying to use instead of in all of my code, however I learned from [@Python-Hub] that you can align printouts using with -strings!.",
      "date_published": "2022-03-08T00:00:00Z",
      "date_modified": "2022-03-08T00:00:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "python",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/python-builtin-calendar/",
      "url": "https://pype.dev/python-builtin-calendar/",
      "title": "Python-Builtin-Calendar",
      "content_html": "\u003ch2 id=\"being-lazy\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBeing lazy\u003c/span\u003e \u003ca href=\"#being-lazy\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI almost exclusively use Python for my job and have been eye-balls deep in it for almost 5 years but I really lack in-depth knowledge of builtins.\nI recently learned of an awesome builtin called \u003ccode\u003ecalendar\u003c/code\u003e  that has way more than I know about for sure but I\u0026rsquo;m glad I know it\u0026rsquo;s here now!\u003c/p\u003e\n\u003cp\u003eI only needed it because I was too lazy to hard code the 7 weekdays into my module but it turns out there\u0026rsquo;s a lot of useful things like \u003ccode\u003ecalendar.isleap()\u003c/code\u003e!\u003c/p\u003e\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/builtin-calendar.png\" alt=\"builtin\" title=\"Python's builtin calendar\" /\u003e\n## Future use\n\u003cp\u003eI\u0026rsquo;m not exactly sure what will come my way where \u003ccode\u003ecalendar\u003c/code\u003e will be super relevant but like anything, I\u0026rsquo;m just glad to know it exists for when the time arises!\u003c/p\u003e\n",
      "content_text": "\n## Being lazy\n\nI almost exclusively use Python for my job and have been eye-balls deep in it for almost 5 years but I really lack in-depth knowledge of builtins.\nI recently learned of an awesome builtin called `calendar`  that has way more than I know about for sure but I'm glad I know it's here now!\n\nI only needed it because I was too lazy to hard code the 7 weekdays into my module but it turns out there's a lot of useful things like `calendar.isleap()`!\n\n\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/builtin-calendar.png\" alt=\"builtin\" title=\"Python's builtin calendar\" /\u003e\n## Future use\n\nI'm not exactly sure what will come my way where `calendar` will be super relevant but like anything, I'm just glad to know it exists for when the time arises!\n",
      "summary": "I almost exclusively use Python for my job and have been eye-balls deep in it for almost 5 years but I really lack in-depth knowledge of builtins. I recently...",
      "date_published": "2022-03-08T00:00:00Z",
      "date_modified": "2022-03-08T00:00:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "python",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/dataframe-memory-usage/",
      "url": "https://pype.dev/dataframe-memory-usage/",
      "title": "Dataframe-Memory-Usage",
      "content_html": "\u003cp\u003eI have often wanted to dive into memory usage for pandas DataFrames when it comes to cloud deployment.\nIf I have a python process running on a server at home I can use \u003ccode\u003eglances\u003c/code\u003e or a number of other tools to diagnose a memory issue\u0026hellip;\nHowever at work I normally deploy dockerized processes on AWS Batch and it\u0026rsquo;s much more challenging to get info on the dockerized process without more AWS integration that my team isn\u0026rsquo;t quite ready for.\nSo TIL that I can get some of the info I want from pandas directly!\u003c/p\u003e\n\u003ch1 id=\"dataframe-info\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDataFrame.info()\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eI didn\u0026rsquo;t realize that \u003ccode\u003edf.info()\u003c/code\u003e was able to give me more info than just dtypes and some summary stats\u0026hellip;\nThere is a kwarg \u003ccode\u003ememory_usage\u003c/code\u003e that can configure what you need to get back, so \u003ccode\u003edf.memory_usage=\u0026quot;deep\u0026quot;\u003c/code\u003e will give you how much RAM any given DataFrame is using!\nAmazing tool for finding issues with joins or renegade source data files.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003edf\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003epd\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eread_csv\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;cars.csv\u0026#34;\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003edf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003einfo\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ememory_usage\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;deep\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/df-memory-usage.png\" alt=\"DataFrame Memory Usage\" title=\"DataFrame Memory Usage\" /\u003e\n",
      "content_text": "\n\nI have often wanted to dive into memory usage for pandas DataFrames when it comes to cloud deployment.\nIf I have a python process running on a server at home I can use `glances` or a number of other tools to diagnose a memory issue...\nHowever at work I normally deploy dockerized processes on AWS Batch and it's much more challenging to get info on the dockerized process without more AWS integration that my team isn't quite ready for.\nSo TIL that I can get some of the info I want from pandas directly!\n\n# DataFrame.info()\n\nI didn't realize that `df.info()` was able to give me more info than just dtypes and some summary stats...\nThere is a kwarg `memory_usage` that can configure what you need to get back, so `df.memory_usage=\"deep\"` will give you how much RAM any given DataFrame is using!\nAmazing tool for finding issues with joins or renegade source data files.\n\n```python\ndf = pd.read_csv(\"cars.csv\")\n\ndf.info(memory_usage=\"deep\")\n```\n\n\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/df-memory-usage.png\" alt=\"DataFrame Memory Usage\" title=\"DataFrame Memory Usage\" /\u003e\n",
      "summary": "I have often wanted to dive into memory usage for pandas DataFrames when it comes to cloud deployment. If I have a python process running on a server at home...",
      "date_published": "2022-03-07T00:00:00Z",
      "date_modified": "2022-03-07T00:00:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "python",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/adblock-coverage/",
      "url": "https://pype.dev/adblock-coverage/",
      "title": "Adblock-Coverage",
      "content_html": "\u003cp\u003eI run pi-hole at home for ad blocking and some internal DNS/DHCP handling.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003epi hole posts on the way\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eOne thing I\u0026rsquo;ve never put too much thought in is asking \u0026ldquo;how well am I doing at blocking?\u0026rdquo;\nThere\u0026rsquo;s lots of ways to measure that depending on what you care about but I just learned of \u003ca href=\"https://d3ward.github.io/toolz/adblock\"\u003eadblock tester\u003c/a\u003e.\nIt\u0026rsquo;s awesome and gave me a quick glimpse into how my pi-hole is performing on keeping my webpages clean and my DNS history private!\u003c/p\u003e\n\u003cp\u003eCredits to \u003ca href=\"https://github.com/d3ward/toolz\"\u003ed3ward\u003c/a\u003e for the awesome tool!\u003c/p\u003e\n",
      "content_text": "\n\nI run pi-hole at home for ad blocking and some internal DNS/DHCP handling.\n\n__pi hole posts on the way__\n\nOne thing I've never put too much thought in is asking \"how well am I doing at blocking?\"\nThere's lots of ways to measure that depending on what you care about but I just learned of [adblock tester](https://d3ward.github.io/toolz/adblock).\nIt's awesome and gave me a quick glimpse into how my pi-hole is performing on keeping my webpages clean and my DNS history private!\n\nCredits to [d3ward](https://github.com/d3ward/toolz) for the awesome tool!\n",
      "summary": "I run pi-hole at home for ad blocking and some internal DNS/DHCP handling.",
      "date_published": "2022-03-07T00:00:00Z",
      "date_modified": "2022-03-07T00:00:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "til",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/webservers-and-indexes/",
      "url": "https://pype.dev/webservers-and-indexes/",
      "title": "Webservers-And-Indexes",
      "content_html": "\u003cp\u003eI host a lot of services in my homelab, but they\u0026rsquo;re mostly dockerized applications so I have never had to care much about how content gets served up.\nToday I had several little concepts click into place regarding webservers, and it was a similar experience to when I started homelabing and didn\u0026rsquo;t know what a \u0026ldquo;server\u0026rdquo; was in the first place.\u003c/p\u003e\n\u003ch1 id=\"servers\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eServers\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eA \u0026ldquo;server\u0026rdquo; can have a lot of different meanings but specifically in my world it was a physical server, like my PowerEdge R610 which acts as my main \u0026ldquo;home server\u0026rdquo;.\nBut then on my server, I have other servers\u0026hellip; Jellyfin is my main media server - but that\u0026rsquo;s obviously not a hardware thing, that\u0026rsquo;s software.\nThis is certainly not a groundbreaking thing but it was a tiny piece to the puzzle that I was missing\u0026hellip; that \u0026ldquo;server\u0026rdquo; is highly contextual.\u003c/p\u003e\n\u003ch1 id=\"webservers\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWebservers\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eSomething that confused the heck out of me when I first started down the road of having a server was what a webserver even was\u0026hellip;\nI always thought the \u0026ldquo;webserver\u0026rdquo; was just \u0026ldquo;a server that hosts a website\u0026rdquo;\u0026hellip; and yes, that\u0026rsquo;s true, but also it wasn\u0026rsquo;t true in how I understood \u0026ldquo;server\u0026rdquo;.\nIt turns out that across my 40-odd dockerized services I have at home that I must have about 40-odd web servers running, each docker container is spinning up its own!\u003c/p\u003e\n\u003cp\u003eSo something I have wanted to do for a long time is put my theology notes online for my small group to access whenever they might want\u0026hellip; it doesn\u0026rsquo;t need to be fancy or anything.\nMy issue was not knowing what to even Google. I tried \u0026ldquo;How to serve up static html\u0026rdquo; but that kind of search is for people who know what a \u0026ldquo;static\u0026rdquo; site is - I am not one of those people.\nI kept running across nginx and apache things, wordpress and other website building tools, etc.\nIn fact I only recently learned that JavaScript assets cann still be considered static so I am a complete baby in the web-dev space.\u003c/p\u003e\n\u003cp\u003eWhat I really wanted was just a simple landing page with a link to each of my \u0026ldquo;posts\u0026rdquo; which are in the form of a single html file each that I can easily export from my tiddlywiki (I have a post about tiddlywiki \u003ca href=\"/tiddly-wiki\"\u003ehere\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eThe first win \u003ccode\u003epython -m http.server\u003c/code\u003e right in the directory I kept my html files in and that got me what I wanted functionally.\nBut then I wanted just a hair more organization\u0026hellip;\nI started looking for a way to dynamically generate an index for a directory of html files but again the verbiage of that Google search just wasn\u0026rsquo;t helping me - I didn\u0026rsquo;t want anything complicated and I knew that what I wanted had to be easy\u0026hellip;\u003c/p\u003e\n\u003ch1 id=\"the-index\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThe Index\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eLuckily I randomly came across a SO that mentioned a Linux utility called \u003ccode\u003etree\u003c/code\u003e which does exactly what I wanted!\u003c/p\u003e\n\u003cp\u003eSee my TIL on \u003ccode\u003etree\u003c/code\u003e \u003ca href=\"'/tree'\"\u003ehere\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eSo now it goes like this:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eTake notes on X in my tiddlywiki\u003c/li\u003e\n\u003cli\u003eExport that tiddler to a html file\u003c/li\u003e\n\u003cli\u003ePut that html file into a \u003ccode\u003enotes\u003c/code\u003e folder in my github repo for small group notes\u003c/li\u003e\n\u003cli\u003eUse \u003ccode\u003etree\u003c/code\u003e to generate an \u003ccode\u003eindex.html\u003c/code\u003e of each of those files in the \u003ccode\u003enotes\u003c/code\u003e directory\u003c/li\u003e\n\u003cli\u003eUse \u003ccode\u003epython -m http.server\u003c/code\u003e to start a web server that lands me at the \u003ccode\u003eindex.html\u003c/code\u003e and now I can click through to any post!\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIt\u0026rsquo;s not fancy but it\u0026rsquo;s functional\u0026hellip;\nThis site/blog is built with markdown and \u003ca href=\"https://www.markata.dev\"\u003emarkata\u003c/a\u003e and I wanted way more functionality in my tech notes.\nBut for this simple use case I learned a ton about \u003cem\u003ehow\u003c/em\u003e content gets served up on a webpage and my small group benefits from the easy access as well!\u003c/p\u003e\n",
      "content_text": "\nI host a lot of services in my homelab, but they're mostly dockerized applications so I have never had to care much about how content gets served up.\nToday I had several little concepts click into place regarding webservers, and it was a similar experience to when I started homelabing and didn't know what a \"server\" was in the first place.\n\n# Servers\n\nA \"server\" can have a lot of different meanings but specifically in my world it was a physical server, like my PowerEdge R610 which acts as my main \"home server\".\nBut then on my server, I have other servers... Jellyfin is my main media server - but that's obviously not a hardware thing, that's software. \nThis is certainly not a groundbreaking thing but it was a tiny piece to the puzzle that I was missing... that \"server\" is highly contextual.\n\n# Webservers \n\nSomething that confused the heck out of me when I first started down the road of having a server was what a webserver even was...\nI always thought the \"webserver\" was just \"a server that hosts a website\"... and yes, that's true, but also it wasn't true in how I understood \"server\".\nIt turns out that across my 40-odd dockerized services I have at home that I must have about 40-odd web servers running, each docker container is spinning up its own!\n\nSo something I have wanted to do for a long time is put my theology notes online for my small group to access whenever they might want... it doesn't need to be fancy or anything.\nMy issue was not knowing what to even Google. I tried \"How to serve up static html\" but that kind of search is for people who know what a \"static\" site is - I am not one of those people.\nI kept running across nginx and apache things, wordpress and other website building tools, etc.\nIn fact I only recently learned that JavaScript assets cann still be considered static so I am a complete baby in the web-dev space.\n\nWhat I really wanted was just a simple landing page with a link to each of my \"posts\" which are in the form of a single html file each that I can easily export from my tiddlywiki (I have a post about tiddlywiki [here](/tiddly-wiki))\n\nThe first win `python -m http.server` right in the directory I kept my html files in and that got me what I wanted functionally. \nBut then I wanted just a hair more organization...\nI started looking for a way to dynamically generate an index for a directory of html files but again the verbiage of that Google search just wasn't helping me - I didn't want anything complicated and I knew that what I wanted had to be easy...\n\n# The Index \n\nLuckily I randomly came across a SO that mentioned a Linux utility called `tree` which does exactly what I wanted!\n\nSee my TIL on `tree` [here]('/tree')\n\nSo now it goes like this:\n\n* Take notes on X in my tiddlywiki\n* Export that tiddler to a html file \n* Put that html file into a `notes` folder in my github repo for small group notes \n* Use `tree` to generate an `index.html` of each of those files in the `notes` directory\n* Use `python -m http.server` to start a web server that lands me at the `index.html` and now I can click through to any post!\n\nIt's not fancy but it's functional... \nThis site/blog is built with markdown and [markata](https://www.markata.dev) and I wanted way more functionality in my tech notes.\nBut for this simple use case I learned a ton about _how_ content gets served up on a webpage and my small group benefits from the easy access as well!\n",
      "summary": "I host a lot of services in my homelab, but they're mostly dockerized applications so I have never had to care much about how content gets served up. Today I...",
      "date_published": "2022-03-06T00:00:00Z",
      "date_modified": "2022-03-06T00:00:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/tree/",
      "url": "https://pype.dev/tree/",
      "title": "Tree",
      "content_html": "\u003cp\u003eI wanted a quick way to generate an \u003ccode\u003eindex.html\u003c/code\u003e for a directory of html files that grows by 1 or 2 files a week.\nI don\u0026rsquo;t know any html (the files are exports from my \u003ca href=\"/tiddly-wiki\"\u003etiddlywiki\u003c/a\u003e)\u0026hellip;\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003etree\u003c/code\u003e is just the answer.\u003c/p\u003e\n\u003cp\u003eSay I have a file structure like this:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e./html-files\n├── file1.html\n└── file2.html\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eTo generate a barebones simple \u003ccode\u003eindex.html\u003c/code\u003e we can use tree as follows:\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003etree ./html-files -H \u0026quot;.\u0026quot; -L 1 -P \u0026quot;*.html\u0026quot;\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eand get the following:\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\"\u003e\u003cspan class=\"cp\"\u003e\u0026lt;!DOCTYPE html\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\"\u003ehtml\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\"\u003ehead\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\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003ehttp-equiv\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Content-Type\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;text/html; charset=UTF-8\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=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003ename\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Author\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Made by \u0026#39;tree\u0026#39;\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=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003emeta\u003c/span\u003e \u003cspan class=\"na\"\u003ename\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;GENERATOR\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;$Version: $ tree v1.8.0 (c) 1996 - 2018 by Steve Baker, Thomas Moore, Francesc Rocher, Florian Sesser, Kyosuke Tokoro $\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=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eDirectory Tree\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etitle\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\"\u003estyle\u003c/span\u003e \u003cspan class=\"na\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;text/css\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=\"o\"\u003e\u0026lt;!\u003c/span\u003e\u003cspan class=\"nt\"\u003e--\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003eBODY\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003efont-family\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eariel\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\u003emonospace\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\u003esans-serif\u003c/span\u003e\u003cspan class=\"p\"\u003e;\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=\"nt\"\u003eP\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003efont-weight\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003enormal\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003efont-family\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eariel\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\u003emonospace\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\u003esans-serif\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003eblack\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ebackground-color\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etransparent\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=\"nt\"\u003eB\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003efont-weight\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003enormal\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003eblack\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ebackground-color\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etransparent\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=\"nt\"\u003eA\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"nd\"\u003evisited\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003efont-weight\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003enormal\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003etext-decoration\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003enone\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ebackground-color\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etransparent\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003emargin\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003epadding\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003edisplay\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003einline\u003c/span\u003e\u003cspan class=\"p\"\u003e;\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=\"nt\"\u003eA\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"nd\"\u003elink\u003c/span\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003efont-weight\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003enormal\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003etext-decoration\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003enone\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003emargin\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003epadding\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003edisplay\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003einline\u003c/span\u003e\u003cspan class=\"p\"\u003e;\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=\"nt\"\u003eA\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"nd\"\u003ehover\u003c/span\u003e   \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#000000\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003efont-weight\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003enormal\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003etext-decoration\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003eunderline\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ebackground-color\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003eyellow\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003emargin\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003epadding\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003edisplay\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003einline\u003c/span\u003e\u003cspan class=\"p\"\u003e;\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=\"nt\"\u003eA\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"nd\"\u003eactive\u003c/span\u003e  \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#000000\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003efont-weight\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003enormal\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ebackground-color\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etransparent\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003emargin\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003epadding\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"kt\"\u003epx\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003edisplay\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003einline\u003c/span\u003e\u003cspan class=\"p\"\u003e;\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\u003cspan class=\"nc\"\u003eVERSION\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003efont-size\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003esmall\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003efont-family\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003earial\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\u003esans-serif\u003c/span\u003e\u003cspan class=\"p\"\u003e;\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\u003cspan class=\"nc\"\u003eNORM\u003c/span\u003e  \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003eblack\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e  \u003cspan class=\"k\"\u003ebackground-color\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etransparent\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\u003cspan class=\"nc\"\u003eFIFO\u003c/span\u003e  \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003epurple\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ebackground-color\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etransparent\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\u003cspan class=\"nc\"\u003eCHAR\u003c/span\u003e  \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003eyellow\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ebackground-color\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etransparent\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\u003cspan class=\"nc\"\u003eDIR\u003c/span\u003e   \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003eblue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e   \u003cspan class=\"k\"\u003ebackground-color\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etransparent\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\u003cspan class=\"nc\"\u003eBLOCK\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003eyellow\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003ebackground-color\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etransparent\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\u003cspan class=\"nc\"\u003eLINK\u003c/span\u003e  \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003eaqua\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e   \u003cspan class=\"k\"\u003ebackground-color\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etransparent\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\u003cspan class=\"nc\"\u003eSOCK\u003c/span\u003e  \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003efuchsia\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"k\"\u003ebackground-color\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etransparent\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\u003cspan class=\"nc\"\u003eEXEC\u003c/span\u003e  \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003egreen\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e  \u003cspan class=\"k\"\u003ebackground-color\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etransparent\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=\"nt\"\u003e--\u003c/span\u003e\u003cspan class=\"o\"\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\"\u003estyle\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\"\u003ehead\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\"\u003ebody\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\"\u003eh1\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eDirectory Tree\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003eh1\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\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\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;.\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e.\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ebr\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\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;./file1.html\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003efile1.html\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ebr\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\"\u003ea\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;./file2.html\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003efile2.html\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ebr\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\"\u003ebr\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ebr\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\"\u003ep\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\"\u003ep\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\"\u003e0 directories, 2 files\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\"\u003ebr\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ebr\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\"\u003ep\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\"\u003ehr\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\"\u003ep\u003c/span\u003e \u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;VERSION\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                 tree v1.8.0 © 1996 - 2018 by Steve Baker and Thomas Moore \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ebr\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                 HTML output hacked and copyleft © 1998 by Francesc Rocher \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ebr\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                 JSON output hacked and copyleft © 2014 by Florian Sesser \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ebr\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                 Charsets / OS/2 support © 2001 by Kyosuke Tokoro\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\"\u003ep\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\"\u003ebody\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\"\u003ehtml\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\u003c/code\u003e\u003c/pre\u003e\u003cp\u003ewhich \u003ca href=\"/tree-index-example.html\"\u003elooks like this\u003c/a\u003e when you serve it up with \u003ccode\u003epython -m http.server\u003c/code\u003e\u003c/p\u003e\n",
      "content_text": "\nI wanted a quick way to generate an `index.html` for a directory of html files that grows by 1 or 2 files a week.\nI don't know any html (the files are exports from my [tiddlywiki](/tiddly-wiki))...\n\n`tree` is just the answer.\n\nSay I have a file structure like this:\n\n```\n./html-files\n├── file1.html\n└── file2.html\n```\n\nTo generate a barebones simple `index.html` we can use tree as follows:\n\n`tree ./html-files -H \".\" -L 1 -P \"*.html\"`\n\nand get the following:\n\n```html\n\n\u003c!DOCTYPE html\u003e\n\u003chtml\u003e\n\u003chead\u003e\n \u003cmeta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"\u003e\n \u003cmeta name=\"Author\" content=\"Made by 'tree'\"\u003e\n \u003cmeta name=\"GENERATOR\" content=\"$Version: $ tree v1.8.0 (c) 1996 - 2018 by Steve Baker, Thomas Moore, Francesc Rocher, Florian Sesser, Kyosuke Tokoro $\"\u003e\n \u003ctitle\u003eDirectory Tree\u003c/title\u003e\n \u003cstyle type=\"text/css\"\u003e\n  \u003c!--\n  BODY { font-family : ariel, monospace, sans-serif; }\n  P { font-weight: normal; font-family : ariel, monospace, sans-serif; color: black; background-color: transparent;}\n  B { font-weight: normal; color: black; background-color: transparent;}\n  A:visited { font-weight : normal; text-decoration : none; background-color : transparent; margin : 0px 0px 0px 0px; padding : 0px 0px 0px 0px; display: inline; }\n  A:link    { font-weight : normal; text-decoration : none; margin : 0px 0px 0px 0px; padding : 0px 0px 0px 0px; display: inline; }\n  A:hover   { color : #000000; font-weight : normal; text-decoration : underline; background-color : yellow; margin : 0px 0px 0px 0px; padding : 0px 0px 0px 0px; display: inline; }\n  A:active  { color : #000000; font-weight: normal; background-color : transparent; margin : 0px 0px 0px 0px; padding : 0px 0px 0px 0px; display: inline; }\n  .VERSION { font-size: small; font-family : arial, sans-serif; }\n  .NORM  { color: black;  background-color: transparent;}\n  .FIFO  { color: purple; background-color: transparent;}\n  .CHAR  { color: yellow; background-color: transparent;}\n  .DIR   { color: blue;   background-color: transparent;}\n  .BLOCK { color: yellow; background-color: transparent;}\n  .LINK  { color: aqua;   background-color: transparent;}\n  .SOCK  { color: fuchsia;background-color: transparent;}\n  .EXEC  { color: green;  background-color: transparent;}\n  --\u003e\n \u003c/style\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n        \u003ch1\u003eDirectory Tree\u003c/h1\u003e\u003cp\u003e\n        \u003ca href=\".\"\u003e.\u003c/a\u003e\u003cbr\u003e\n        ├── \u003ca href=\"./file1.html\"\u003efile1.html\u003c/a\u003e\u003cbr\u003e\n        └── \u003ca href=\"./file2.html\"\u003efile2.html\u003c/a\u003e\u003cbr\u003e\n        \u003cbr\u003e\u003cbr\u003e\n        \u003c/p\u003e\n        \u003cp\u003e\n\n0 directories, 2 files\n        \u003cbr\u003e\u003cbr\u003e\n        \u003c/p\u003e\n        \u003chr\u003e\n        \u003cp class=\"VERSION\"\u003e\n                 tree v1.8.0 © 1996 - 2018 by Steve Baker and Thomas Moore \u003cbr\u003e\n                 HTML output hacked and copyleft © 1998 by Francesc Rocher \u003cbr\u003e\n                 JSON output hacked and copyleft © 2014 by Florian Sesser \u003cbr\u003e\n                 Charsets / OS/2 support © 2001 by Kyosuke Tokoro\n        \u003c/p\u003e\n\u003c/body\u003e\n\u003c/html\u003e\n\n```\n\n\nwhich [looks like this](/tree-index-example.html) when you serve it up with `python -m http.server`\n",
      "summary": "I wanted a quick way to generate an for a directory of html files that grows by 1 or 2 files a week. I don't know any html (the files are exports from my...",
      "date_published": "2022-03-06T00:00:00Z",
      "date_modified": "2022-03-06T00:00:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "linux",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/traefik/",
      "url": "https://pype.dev/traefik/",
      "title": "Traefik",
      "content_html": "\u003ch1 id=\"traefik\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTraefik\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eIf you don\u0026rsquo;t know about \u003ca href=\"https://doc.traefik.io/traefik/\"\u003etraefik\u003c/a\u003e and you need a reverse-proxy then you might want to check it out.\nI used to use nginx for my reverse proxy but the config was over my head, and once it was working I was afraid to touch it.\nTraefik brings a lot to the table, my main uses are reverse proxy and ip whitelisting, but it\u0026rsquo;s doing even more under the hood that I don\u0026rsquo;t have a full-grasp of yet.\u003c/p\u003e\n\u003cp\u003eI like Traefik a lot because once I get some basic config up it\u0026rsquo;s incredibly easy to add services into my homelab whether they run on my primary server or not.\nThis will not be exhaustive but I\u0026rsquo;ll outline my simple setup process of traefik and how I add services whether they are in docker or not.\u003c/p\u003e\n\u003ch1 id=\"docker\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDocker\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eIn 2022 I\u0026rsquo;m still a docker fan-boy and I run my traefik instance in a docker container.\nThis isn\u0026rsquo;t necessary but I love the portability since my homelab is very dynamic at the moment.\nAnd even if it wasn\u0026rsquo;t I\u0026rsquo;d still want to keep traefik in docker because deployment and updating are just so flipping easy\u003c/p\u003e\n\u003cp\u003eA simple docker-compose file for traefik might look like this:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003etraefik\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=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;traefik:v2.4\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=\"nt\"\u003enetwork_mode\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehost\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=\"nt\"\u003evolumes\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=\"s2\"\u003e\u0026#34;docker-data/traefik/traefik.toml:/etc/traefik/traefik.toml:ro\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=\"s2\"\u003e\u0026#34;docker-data/traefik/config.yml:/etc/traefik/config.yml:ro\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=\"s2\"\u003e\u0026#34;docker-data/traefik/letsencrypt:/letsencrypt:rw\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=\"s2\"\u003e\u0026#34;/var/run/docker.sock:/var/run/docker.sock:ro\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# for auto-discovery\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=\"nt\"\u003eenv\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ traefik_environment_variables }}\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=\"nt\"\u003erestart_policy\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eunless-stopped\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=\"nt\"\u003ememory\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;1g\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch1 id=\"ansible-deployment\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAnsible deployment\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003e\u003cstrong\u003eI plan to have more on my homelab and Ansible on this site eventually\u0026hellip;\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eI use Ansible to deploy most of my services at home, including traefik. My main homelab repo is \u003ca href=\"https://github.com/nicpayne713/ansible-nas\"\u003ehere\u003c/a\u003e which is a fork of \u003ca href=\"https://github.com/davestephens/ansible-nas\"\u003eAnsible NAS\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIf you want my stuff then be sure to go to the \u003ccode\u003euser/nic\u003c/code\u003e branch on my fork\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eYou can see the ansible stuff for traefik \u003ca href=\"https://github.com/davestephens/ansible-nas/tree/master/roles/traefik\"\u003ehere\u003c/a\u003e\u003c/p\u003e\n\u003ch1 id=\"config\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eConfig\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eI use a \u003ccode\u003etraefik.toml\u003c/code\u003e as the main config and it looks something like this.\nWith ansible a lot of this is done through template variables but this is the general idea.\nThis config tells traefik what ports to listen and forward on, and gives the names to be referenced by docker labels (down below).\u003c/p\u003e\n\u003cp\u003eTraefik also has a handy web ui that with this config you can find on port \u003ccode\u003e8080\u003c/code\u003e.\nThere is a \u003ccode\u003eproviders\u003c/code\u003e section - which is one of the biggest selling points of traefik for me.\nI have a docker provider configured  and a static file.\u003c/p\u003e\n\u003cp\u003eThe docker provider lets traefik auto-discover new services that I deploy and automatically handle the routing!\nThe static file lets me easily add non-dockerized service routing, or routing to dockerized services on another host (I think traefik has an easier way to do this automatically but I don\u0026rsquo;t do it often enough to need that kind of automation).\nThen at the bottom is the SSL cert stuff.\nUsing Let\u0026rsquo;s Encrypt is pretty easy and I use Cloudflare as my DNS provider\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\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eentryPoints\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\u003cspan class=\"nx\"\u003eentryPoints\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eweb\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=\"nx\"\u003eaddress\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;:80\u0026#34;\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=\"nx\"\u003eentryPoints\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eweb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ehttp\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eredirections\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eentryPoint\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=\"nx\"\u003eto\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;websecure\u0026#34;\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=\"nx\"\u003eentryPoints\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ewebsecure\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=\"nx\"\u003eaddress\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;:443\u0026#34;\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=\"nx\"\u003eentryPoints\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ewebsecure\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ehttp\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etls\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=\"nx\"\u003ecertResolver\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;letsencrypt\u0026#34;\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=\"nx\"\u003eentryPoints\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ewebsecure\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ehttp\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etls\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edomains\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=\"nx\"\u003emain\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;example.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esans\u003c/span\u003e \u003cspan class=\"p\"\u003e=\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=\"s2\"\u003e\u0026#34;*.example.com\u0026#34;\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=\"nx\"\u003eentryPoints\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etraefik\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=\"nx\"\u003eaddress\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;:8080\u0026#34;\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=\"nx\"\u003eproviders\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=\"nx\"\u003eprovidersThrottleDuration\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;1s\u0026#34;\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\u003cspan class=\"nx\"\u003eproviders\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edocker\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=\"nx\"\u003eexposedbydefault\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\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\u003cspan class=\"nx\"\u003eproviders\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efile\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=\"nx\"\u003efilename\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/etc/traefik/config.yml\u0026#34;\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=\"nx\"\u003eapi\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=\"nx\"\u003einsecure\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edashboard\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\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=\"nx\"\u003elog\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=\"nx\"\u003elevel\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;INFO\u0026#34;\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=\"nx\"\u003eping\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=\"nx\"\u003eterminatingStatusCode\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\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=\"nx\"\u003ecertificatesResolvers\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\u003cspan class=\"nx\"\u003ecertificatesResolvers\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eletsencrypt\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\u003cspan class=\"nx\"\u003ecertificatesResolvers\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eletsencrypt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eacme\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=\"nx\"\u003eemail\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;my_email@example.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003estorage\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/letsencrypt/acme.json\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecaserver\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://acme-staging-v02.api.letsencrypt.org/directory\u0026#34;\u003c/span\u003e  \u003cspan class=\"c\"\u003e# le staging, not prod\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=\"nx\"\u003ecertificatesResolvers\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eletsencrypt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eacme\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ednsChallenge\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=\"nx\"\u003eprovider\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;cloudflare\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch1 id=\"providers-file\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eProviders.file\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eTo my knowledge there isn\u0026rsquo;t much to configure on the docker provider side of things until you deploy a service.\nBut the provider config file should get a little screen time here.\u003c/p\u003e\n\u003cp\u003eThe file defines a traefik http router for each service you define, in this case just \u003ccode\u003epihole\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eHere I am adding my pihole instance which is not run inside docker but is inside a VM on another host.\nI want the \u003ccode\u003eentryPoints\u003c/code\u003e to be set to \u003ccode\u003ewebsecure\u003c/code\u003e which is configured above in the http redirects.\nI want some middlewares, \u003ccode\u003eaddprefix-pihole\u003c/code\u003e and \u003ccode\u003edefault-headers\u003c/code\u003e, which I\u0026rsquo;ll explain below.\nI set letsencrypt as the cert certResolver.\nFinally I name the service \u003ccode\u003epihole\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eThen in the \u003ccode\u003eservices\u003c/code\u003e section I configure where pihole is located by just giving the internal IP for traefik to route to.\nFinally I define my middlewares.\nTo get to the pihole homepage you need to use the route \u003ccode\u003e/admin\u003c/code\u003e so I want that added automatically when I go to \u003ccode\u003epihole.example.com\u003c/code\u003e so I come to \u003ccode\u003epihole.example.com/admin\u003c/code\u003e.\nAnd I wanted to restrict access to just my internal network and my wireguard network - this is done with the \u003ccode\u003edefault-whitelist\u003c/code\u003e.\nThe last thing is to configure a chain of middlewares that I called \u003ccode\u003esecured\u003c/code\u003e which is just easier for the docker labels later on.\u003c/p\u003e\n\u003cp\u003eWith this config in play though, traefik will know about the route \u003ccode\u003epihole.example.com\u003c/code\u003e and handle the ip whitelisting and load balancing for me.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ehttp\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=\"c\"\u003e#region routers \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\"\u003erouters\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\"\u003epihole\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\"\u003eentryPoints\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=\"s2\"\u003e\u0026#34;websecure\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=\"nt\"\u003erule\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Host(`pihole.example.com`)\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=\"nt\"\u003emiddlewares\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=\"c\"\u003e# - default-headers\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\"\u003eaddprefix-pihole\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\"\u003edefault-whitelist\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\"\u003etls\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\"\u003ecertResolver\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eletsencrypt\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\"\u003eservice\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epihole\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=\"c\"\u003e#region services\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\"\u003eservices\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\"\u003epihole\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\"\u003eloadBalancer\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\"\u003eservers\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\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;http://192.168.1.3: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=\"nt\"\u003epassHostHeader\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\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=\"c\"\u003e#endregion\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\"\u003emiddlewares\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\"\u003eaddprefix-pihole\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\"\u003eaddPrefix\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\"\u003eprefix\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/admin\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=\"nt\"\u003ehttps-redirect\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\"\u003eredirectScheme\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\"\u003escheme\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ehttps\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\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\"\u003edefault-headers\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\"\u003eheaders\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\"\u003eframeDeny\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\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\"\u003esslRedirect\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\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\"\u003ebrowserXssFilter\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\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\"\u003econtentTypeNosniff\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\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\"\u003eforceSTSHeader\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\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\"\u003estsIncludeSubdomains\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\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\"\u003estsPreload\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\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\"\u003estsSeconds\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e15552000\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\"\u003ecustomFrameOptionsValue\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eSAMEORIGIN\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\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\"\u003edefault-whitelist\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\"\u003eipWhiteList\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\"\u003esourceRange\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=\"s2\"\u003e\u0026#34;10.6.0.0/24\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# wg\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;192.168.1.0/24\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# lan\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;172.17.0.0/16\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c\"\u003e# docker\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\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\"\u003esecured\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\"\u003echain\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\"\u003emiddlewares\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\"\u003edefault-whitelist\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\"\u003edefault-headers\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch1 id=\"docker-labels\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDocker labels\u003c/span\u003e\u003c/h1\u003e\n\u003cp\u003eNow the real magic is with Docker.\nHere is an example docker-compose file for spinning up a \u003ca href=\"https://jellyfin.org/\"\u003ejellyfin\u003c/a\u003e server that you want to expose to the world, or at least access at home with \u003ccode\u003ejellyfin.example.com\u003c/code\u003e instead of \u003ccode\u003ehttp://192.168.1.N:8096\u003c/code\u003e\u0026hellip;\u003c/p\u003e\n\u003cp\u003eI left some of the ansible variable stuff in here, but the main part to be concerned with is the \u003ccode\u003elabels\u003c/code\u003e section\u0026hellip;\u003c/p\u003e\n\u003cp\u003eWe define just a few labels to throw onto this docker container which let\u0026rsquo;s traefik discover it automatically and apply any settings necessary (like my \u003ccode\u003eipWhiteList\u003c/code\u003e).\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003etraefik.enable\u003c/code\u003e is either True or False.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003etraefik.http.router.jellyfin.rule\u003c/code\u003e defines an http router called jellyfin and sets the url to \u003ccode\u003ejellyfin.example.com\u003c/code\u003e (if example.com was my \u003ccode\u003eansible_nas_domain\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003etraefik.http.routers.jellyfin.tls.certresolver\u003c/code\u003e is set to letsencrypt since I use LE for my wildcard certs.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003etraefik.http.routers.jellyfin.tls.domains[0].main\u003c/code\u003e will just be \u003ccode\u003eexample.com\u003c/code\u003e -\u0026gt; and this should remind you of the toml file above\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003etraefik.http.routers.jellyfin.tls.domains[0].sans\u003c/code\u003e is set to \u003ccode\u003e*.example.com\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003etraefik.http.services.jellyfin.loadbalancer.server.port\u003c/code\u003e is set to jellyfin\u0026rsquo;s default http port of 8096, which tells traefik which port to point to for this service.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ejellyfin\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=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003elinuxserver/jellyfin\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=\"nt\"\u003evolumes\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=\"s2\"\u003e\u0026#34;{{ jellyfin_config_directory }}:/config:rw\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=\"s2\"\u003e\u0026#34;{{ jellyfin_movies_directory }}:/movies:{{ jellyfin_movies_permissions }}\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=\"s2\"\u003e\u0026#34;{{ jellyfin_music_directory }}:/music:{{ jellyfin_music_permissions }}\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=\"s2\"\u003e\u0026#34;{{ jellyfin_photos_directory }}:/photos:{{ jellyfin_photos_permissions }}\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=\"s2\"\u003e\u0026#34;{{ jellyfin_tv_directory }}:/tv:{{ jellyfin_tv_permissions }}\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=\"s2\"\u003e\u0026#34;{{ jellyfin_books_directory }}:/books:{{ jellyfin_books_permissions }}\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=\"s2\"\u003e\u0026#34;{{ jellyfin_audiobooks_directory }}:/audiobooks:{{ jellyfin_audiobooks_permissions }}\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=\"nt\"\u003eports\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=\"s2\"\u003e\u0026#34;{{ jellyfin_port_http }}:8096\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=\"s2\"\u003e\u0026#34;{{ jellyfin_port_https }}:8920\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=\"nt\"\u003eenv\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\"\u003eTZ\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ ansible_nas_timezone }}\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=\"nt\"\u003ePUID\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ jellyfin_user_id }}\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=\"nt\"\u003ePGID\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ jellyfin_group_id }}\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=\"nt\"\u003erestart_policy\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eunless-stopped\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=\"nt\"\u003ememory\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e1g\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=\"nt\"\u003elabels\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\"\u003etraefik.enable\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ jellyfin_available_externally }}\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=\"nt\"\u003etraefik.http.routers.jellyfin.rule\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Host(`jellyfin.{{ ansible_nas_domain }}`)\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=\"nt\"\u003etraefik.http.routers.jellyfin.tls.certresolver\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;letsencrypt\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=\"nt\"\u003etraefik.http.routers.jellyfin.tls.domains[0].main\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ ansible_nas_domain }}\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=\"nt\"\u003etraefik.http.routers.jellyfin.tls.domains[0].sans\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;*.{{ ansible_nas_domain }}\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=\"nt\"\u003etraefik.http.services.jellyfin.loadbalancer.server.port\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;8096\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eAnd just like that traefik will automagically find your jellyfin container and route \u003ccode\u003ejellyfin.example.com\u003c/code\u003e to it!\u003c/p\u003e\n",
      "content_text": "\n# Traefik\n\nIf you don't know about [traefik](https://doc.traefik.io/traefik/) and you need a reverse-proxy then you might want to check it out.\nI used to use nginx for my reverse proxy but the config was over my head, and once it was working I was afraid to touch it.\nTraefik brings a lot to the table, my main uses are reverse proxy and ip whitelisting, but it's doing even more under the hood that I don't have a full-grasp of yet.\n\nI like Traefik a lot because once I get some basic config up it's incredibly easy to add services into my homelab whether they run on my primary server or not.\nThis will not be exhaustive but I'll outline my simple setup process of traefik and how I add services whether they are in docker or not.\n\n# Docker\n\nIn 2022 I'm still a docker fan-boy and I run my traefik instance in a docker container. \nThis isn't necessary but I love the portability since my homelab is very dynamic at the moment.\nAnd even if it wasn't I'd still want to keep traefik in docker because deployment and updating are just so flipping easy\n\nA simple docker-compose file for traefik might look like this:\n\n```yaml\nname: traefik\nimage: \"traefik:v2.4\"\nnetwork_mode: host\nvolumes:\n  - \"docker-data/traefik/traefik.toml:/etc/traefik/traefik.toml:ro\"\n  - \"docker-data/traefik/config.yml:/etc/traefik/config.yml:ro\"\n  - \"docker-data/traefik/letsencrypt:/letsencrypt:rw\"\n  - \"/var/run/docker.sock:/var/run/docker.sock:ro\"  # for auto-discovery\nenv: \"{{ traefik_environment_variables }}\"\nrestart_policy: unless-stopped\nmemory: \"1g\"\n```\n\n# Ansible deployment\n\n__I plan to have more on my homelab and Ansible on this site eventually...__\n\nI use Ansible to deploy most of my services at home, including traefik. My main homelab repo is [here](https://github.com/nicpayne713/ansible-nas) which is a fork of [Ansible NAS](https://github.com/davestephens/ansible-nas).\n\n\u003e If you want my stuff then be sure to go to the `user/nic` branch on my fork\n\nYou can see the ansible stuff for traefik [here](https://github.com/davestephens/ansible-nas/tree/master/roles/traefik)\n\n# Config\n\nI use a `traefik.toml` as the main config and it looks something like this.\nWith ansible a lot of this is done through template variables but this is the general idea.\nThis config tells traefik what ports to listen and forward on, and gives the names to be referenced by docker labels (down below). \n\nTraefik also has a handy web ui that with this config you can find on port `8080`.\nThere is a `providers` section - which is one of the biggest selling points of traefik for me.\nI have a docker provider configured  and a static file. \n\nThe docker provider lets traefik auto-discover new services that I deploy and automatically handle the routing!\nThe static file lets me easily add non-dockerized service routing, or routing to dockerized services on another host (I think traefik has an easier way to do this automatically but I don't do it often enough to need that kind of automation).\nThen at the bottom is the SSL cert stuff. \nUsing Let's Encrypt is pretty easy and I use Cloudflare as my DNS provider\n\n```toml\n\n[entryPoints]\n[entryPoints.web]\naddress = \":80\"\n\n[entryPoints.web.http.redirections.entryPoint]\nto = \"websecure\"\n\n[entryPoints.websecure]\naddress = \":443\"\n\n[entryPoints.websecure.http.tls]\ncertResolver = \"letsencrypt\"\n\n[entryPoints.websecure.http.tls.domains]\nmain = \"example.com\"\nsans = [\n\"*.example.com\"\n]\n\n[entryPoints.traefik]\naddress = \":8080\"\n\n[providers]\nprovidersThrottleDuration = \"1s\"\n[providers.docker]\nexposedbydefault = false\n[providers.file]\nfilename = \"/etc/traefik/config.yml\"\n\n[api]\ninsecure = true\ndashboard = true\n\n[log]\nlevel = \"INFO\"\n\n[ping]\nterminatingStatusCode = 0\n\n[certificatesResolvers]\n[certificatesResolvers.letsencrypt]\n[certificatesResolvers.letsencrypt.acme]\nemail = \"my_email@example.com\"\nstorage = \"/letsencrypt/acme.json\"\ncaserver = \"https://acme-staging-v02.api.letsencrypt.org/directory\"  # le staging, not prod\n\n[certificatesResolvers.letsencrypt.acme.dnsChallenge]\nprovider = \"cloudflare\"\n```\n\n# Providers.file\n\nTo my knowledge there isn't much to configure on the docker provider side of things until you deploy a service.\nBut the provider config file should get a little screen time here.\n\nThe file defines a traefik http router for each service you define, in this case just `pihole`. \n\nHere I am adding my pihole instance which is not run inside docker but is inside a VM on another host.\nI want the `entryPoints` to be set to `websecure` which is configured above in the http redirects.\nI want some middlewares, `addprefix-pihole` and `default-headers`, which I'll explain below.\nI set letsencrypt as the cert certResolver.\nFinally I name the service `pihole`.\n\nThen in the `services` section I configure where pihole is located by just giving the internal IP for traefik to route to.\nFinally I define my middlewares. \nTo get to the pihole homepage you need to use the route `/admin` so I want that added automatically when I go to `pihole.example.com` so I come to `pihole.example.com/admin`.\nAnd I wanted to restrict access to just my internal network and my wireguard network - this is done with the `default-whitelist`. \nThe last thing is to configure a chain of middlewares that I called `secured` which is just easier for the docker labels later on.\n\nWith this config in play though, traefik will know about the route `pihole.example.com` and handle the ip whitelisting and load balancing for me.\n\n```yaml\nhttp:\n #region routers \n  routers:\n    pihole:\n      entryPoints:\n        - \"websecure\"\n      rule: \"Host(`pihole.example.com`)\"\n      middlewares:\n        # - default-headers\n        - addprefix-pihole\n        - default-whitelist\n      tls: \n        certResolver: letsencrypt\n      service: pihole\n  #region services\n  services:\n    pihole:\n      loadBalancer:\n        servers:\n          - url: \"http://192.168.1.3:80\"\n        passHostHeader: true\n  #endregion\n  middlewares:\n    addprefix-pihole:\n      addPrefix:\n        prefix: \"/admin\"\n    https-redirect:\n      redirectScheme:\n        scheme: https\n\n    default-headers:\n      headers:\n        frameDeny: true\n        sslRedirect: true\n        browserXssFilter: true\n        contentTypeNosniff: true\n        forceSTSHeader: true\n        stsIncludeSubdomains: true\n        stsPreload: true\n        stsSeconds: 15552000\n        customFrameOptionsValue: SAMEORIGIN\n\n    default-whitelist:\n      ipWhiteList:\n        sourceRange:\n        - \"10.6.0.0/24\"  # wg\n        - \"192.168.1.0/24\"  # lan\n        - \"172.17.0.0/16\"  # docker\n\n    secured:\n      chain:\n        middlewares:\n        - default-whitelist\n        - default-headers\n```\n\n\n# Docker labels\n\nNow the real magic is with Docker.\nHere is an example docker-compose file for spinning up a [jellyfin](https://jellyfin.org/) server that you want to expose to the world, or at least access at home with `jellyfin.example.com` instead of `http://192.168.1.N:8096`...\n\nI left some of the ansible variable stuff in here, but the main part to be concerned with is the `labels` section...\n\nWe define just a few labels to throw onto this docker container which let's traefik discover it automatically and apply any settings necessary (like my `ipWhiteList`).\n\n* `traefik.enable` is either True or False. \n* `traefik.http.router.jellyfin.rule` defines an http router called jellyfin and sets the url to `jellyfin.example.com` (if example.com was my `ansible_nas_domain`)\n* `traefik.http.routers.jellyfin.tls.certresolver` is set to letsencrypt since I use LE for my wildcard certs.\n* `traefik.http.routers.jellyfin.tls.domains[0].main` will just be `example.com` -\u003e and this should remind you of the toml file above\n* `traefik.http.routers.jellyfin.tls.domains[0].sans` is set to `*.example.com`\n* `traefik.http.services.jellyfin.loadbalancer.server.port` is set to jellyfin's default http port of 8096, which tells traefik which port to point to for this service.\n\n```yaml\nname: jellyfin\nimage: linuxserver/jellyfin\nvolumes:\n  - \"{{ jellyfin_config_directory }}:/config:rw\"\n  - \"{{ jellyfin_movies_directory }}:/movies:{{ jellyfin_movies_permissions }}\"\n  - \"{{ jellyfin_music_directory }}:/music:{{ jellyfin_music_permissions }}\"\n  - \"{{ jellyfin_photos_directory }}:/photos:{{ jellyfin_photos_permissions }}\"\n  - \"{{ jellyfin_tv_directory }}:/tv:{{ jellyfin_tv_permissions }}\"\n  - \"{{ jellyfin_books_directory }}:/books:{{ jellyfin_books_permissions }}\"\n  - \"{{ jellyfin_audiobooks_directory }}:/audiobooks:{{ jellyfin_audiobooks_permissions }}\"\nports:\n  - \"{{ jellyfin_port_http }}:8096\"\n  - \"{{ jellyfin_port_https }}:8920\"\nenv:\n  TZ: \"{{ ansible_nas_timezone }}\"\n  PUID: \"{{ jellyfin_user_id }}\"\n  PGID: \"{{ jellyfin_group_id }}\"\nrestart_policy: unless-stopped\nmemory: 1g\nlabels:\n  traefik.enable: \"{{ jellyfin_available_externally }}\"\n  traefik.http.routers.jellyfin.rule: \"Host(`jellyfin.{{ ansible_nas_domain }}`)\"\n  traefik.http.routers.jellyfin.tls.certresolver: \"letsencrypt\"\n  traefik.http.routers.jellyfin.tls.domains[0].main: \"{{ ansible_nas_domain }}\"\n  traefik.http.routers.jellyfin.tls.domains[0].sans: \"*.{{ ansible_nas_domain }}\"\n  traefik.http.services.jellyfin.loadbalancer.server.port: \"8096\"\n```\n\n\nAnd just like that traefik will automagically find your jellyfin container and route `jellyfin.example.com` to it!\n",
      "summary": "If you don't know about traefik and you need a reverse-proxy then you might want to check it out. I used to use nginx for my reverse proxy but the config was...",
      "date_published": "2022-03-06T00:00:00Z",
      "date_modified": "2022-03-06T00:00:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "homelab",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/pandas-select-dtypes/",
      "url": "https://pype.dev/pandas-select-dtypes/",
      "title": "Pandas-Select-Dtypes",
      "content_html": "\u003cp\u003eOn my team we often have to change data types of columns in a \u003ccode\u003epandas.DataFrame\u003c/code\u003e for a variety of reasons.\nThe main one is it tends to be an artifact of EDA whereby a file is read in via \u003ccode\u003epandas\u003c/code\u003e but the data types are somewhat wonky (ie. dates show up as strings, or a column that \u003cem\u003eshould\u003c/em\u003e be a integer comes in as float, etc.).\nThe best solution I think is to leverage the \u003ccode\u003edtypes\u003c/code\u003e keyword argument in which \u003ccode\u003epd.read_X\u003c/code\u003e method is used.\nHowever there is another way which is to coerce the data types at runtime instead of loadtime.\u003c/p\u003e\n\u003cp\u003eA handy way to do this is by using \u003ccode\u003epandas.DataFrame.select_dtypes\u003c/code\u003e\u0026hellip;\u003c/p\u003e\n\u003cp\u003eHere is an example of finding columns read in as \u003ccode\u003edatetime64\u003c/code\u003e and the developer would prefer to use pandas datetimes.\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003edf\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003epd\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eread_csv\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;./file-with-confusing-dtypes.csv\u0026#34;\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\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003ec\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003edf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecolumns\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\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003edf\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003edtype\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;datetime64\u0026#34;\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=\"n\"\u003edf\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003epd\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eto_datetime\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ec\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\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eHere is the difference in code flow between \u003ccode\u003eselect_dtypes\u003c/code\u003e and manually finding the \u003ccode\u003edatetype64\u003c/code\u003e columns:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003edf\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003epd\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eread_csv\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;./file-with-confusing-dtypes.csv\u0026#34;\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\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003ec\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003edf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eselect_dtypes\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;datetime64\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=\"n\"\u003edf\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003epd\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eto_datetime\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ec\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\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe difference isn\u0026rsquo;t huge but it\u0026rsquo;s the little steps in leveling up that turn script-kitty scripts into clean looking functions.\u003c/p\u003e\n",
      "content_text": "\nOn my team we often have to change data types of columns in a `pandas.DataFrame` for a variety of reasons.\nThe main one is it tends to be an artifact of EDA whereby a file is read in via `pandas` but the data types are somewhat wonky (ie. dates show up as strings, or a column that *should* be a integer comes in as float, etc.).\nThe best solution I think is to leverage the `dtypes` keyword argument in which `pd.read_X` method is used. \nHowever there is another way which is to coerce the data types at runtime instead of loadtime.\n\nA handy way to do this is by using `pandas.DataFrame.select_dtypes`...\n\nHere is an example of finding columns read in as `datetime64` and the developer would prefer to use pandas datetimes.\n\n```python\ndf = pd.read_csv(\"./file-with-confusing-dtypes.csv\")\nfor c in df.columns:\n    if df[c].dtype == \"datetime64\":\n        df[c] = pd.to_datetime(df.c)\n\n```\n\nHere is the difference in code flow between `select_dtypes` and manually finding the `datetype64` columns:\n\n```python\ndf = pd.read_csv(\"./file-with-confusing-dtypes.csv\")\nfor c in df.select_dtypes('datetime64'):\n    df[c] = pd.to_datetime(df.c)\n\n```\n\n\nThe difference isn't huge but it's the little steps in leveling up that turn script-kitty scripts into clean looking functions.\n",
      "summary": "On my team we often have to change data types of columns in a for a variety of reasons. The main one is it tends to be an artifact of EDA whereby a file is...",
      "date_published": "2022-03-05T00:00:00Z",
      "date_modified": "2022-03-05T00:00:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "python",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/tiddly-wiki/",
      "url": "https://pype.dev/tiddly-wiki/",
      "title": "Tiddly-Wiki",
      "content_html": "\u003cp\u003e\u003ca href=\"https://tiddlywiki.com/\"\u003eTiddly Wiki\u003c/a\u003e is a great note taking utility for organizing non-linear notes.\nI used it to replace my OneNote workflow and my only complaint is I don\u0026rsquo;t have an easy way to access and edit my tiddlers (posts) if I\u0026rsquo;m not at home.\u003c/p\u003e\n\u003cp\u003eThe tiddlywiki is just an \u003ccode\u003ehtml\u003c/code\u003e file with a ton of stuff above my head baked in.\nI have a barebones repo with some notes and a nice starter tiddly wiki init on \u003ca href=\"https://github.com/nicpayne713/tiddlywiki-tutorial\"\u003emy github\u003c/a\u003e.\nUsage is pretty basic\u0026hellip; Just grab the \u003ccode\u003enotebook/template.htlm\u003c/code\u003e and save it to anywhere convenient on your computer.\nI put mine on my NAS to have the security of backups since I don\u0026rsquo;t keep my tidldlywiki in a git repo (I don\u0026rsquo;t really want to look at the diff).\u003c/p\u003e\n\u003cp\u003eTaking notes in the tidlywiki is nice because it supports a format similar to Markdown although it is specific to tidlywiki.\nTiddlers (each post in the wiki) can be tagged and linked together and it\u0026rsquo;s really easy to send notes to someone by just exporting an html file and emailing it since it\u0026rsquo;ll open up by default in a broswer with all the nice formatting already apart of it.\nI was using it primarily for taking notes for a small group I lead and sending those notes each week.\nThe group benefited from nicely formatted notes and I benefited from a centralized place to keep them all that Microsoft didn\u0026rsquo;t own!\u003c/p\u003e\n\u003cp\u003eHere\u0026rsquo;s an example of the body of a tiddler with some tiddlywiki specific formatting:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e! Static IPs on Linux\n\n//Ubuntu 20//\n\nSetting static IP on Ubuntu 20.04\n\n# Navigate to /etc/netplan\n# Open the yaml file (the name seems to be kind of random but it seems to starts with 00 or 05)\n# Change the file as below with your desired settings\n# Run `sudo netplan apply` to have changes reflected\n\n    ```yaml\n    network:\n      version: 2\n      ethernets:\n        enp0s4:\n          addresses: [192.168.1.{Static IP}/24]\n          gateway4: 192.168.1.1\n          nameservers:\n            addresses: [8.8.4.4, 8.8.8.8]\n    ```\n\n\n\n\u0026lt;img src=\u0026quot;https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/tiddlywiki-example.png\u0026quot; alt=\u0026quot;tiddlywiki\u0026quot; title=\u0026quot;A TiddlyWiki Example\u0026quot; /\u0026gt;\n\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThe \u003ccode\u003e#\u003c/code\u003e create a numbered list, \u003ccode\u003e//\u003c/code\u003e creates an italicized heading, and \u003ccode\u003e!\u003c/code\u003e creates headings similar to Markdown\u0026rsquo;s \u003ccode\u003e#\u003c/code\u003e. The differences aren\u0026rsquo;t too bad to keep in mind and what renders out is totally depenent on the tidlywiki itself.\nMy template has a nice nord feel to it, feel free to download from my github and try it out!\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI have moved away from my tiddlywiki workflow in favor of sites like this since I can git commit markdown files and build with \u003ca href=\"https://markata.dev/\"\u003emarkata\u003c/a\u003e pretty easily (credit \u003ca href=\"www.waylonwalker.com\"\u003ewaylon walker\u003c/a\u003e)\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI still use tiddlywiki for tracking some todo items and questions \u0026mdash; I may have another solution in the future\u003c/p\u003e\n\u003c/blockquote\u003e\n",
      "content_text": "\n[Tiddly Wiki](https://tiddlywiki.com/) is a great note taking utility for organizing non-linear notes.\nI used it to replace my OneNote workflow and my only complaint is I don't have an easy way to access and edit my tiddlers (posts) if I'm not at home.\n\nThe tiddlywiki is just an `html` file with a ton of stuff above my head baked in. \nI have a barebones repo with some notes and a nice starter tiddly wiki init on [my github](https://github.com/nicpayne713/tiddlywiki-tutorial).\nUsage is pretty basic... Just grab the `notebook/template.htlm` and save it to anywhere convenient on your computer.\nI put mine on my NAS to have the security of backups since I don't keep my tidldlywiki in a git repo (I don't really want to look at the diff).\n\nTaking notes in the tidlywiki is nice because it supports a format similar to Markdown although it is specific to tidlywiki. \nTiddlers (each post in the wiki) can be tagged and linked together and it's really easy to send notes to someone by just exporting an html file and emailing it since it'll open up by default in a broswer with all the nice formatting already apart of it.\nI was using it primarily for taking notes for a small group I lead and sending those notes each week.\nThe group benefited from nicely formatted notes and I benefited from a centralized place to keep them all that Microsoft didn't own!\n\nHere's an example of the body of a tiddler with some tiddlywiki specific formatting:\n\n```\n! Static IPs on Linux\n\n//Ubuntu 20//\n\nSetting static IP on Ubuntu 20.04\n\n# Navigate to /etc/netplan\n# Open the yaml file (the name seems to be kind of random but it seems to starts with 00 or 05)\n# Change the file as below with your desired settings\n# Run `sudo netplan apply` to have changes reflected\n\n    ```yaml\n    network:\n      version: 2\n      ethernets:\n        enp0s4:\n          addresses: [192.168.1.{Static IP}/24]\n          gateway4: 192.168.1.1\n          nameservers:\n            addresses: [8.8.4.4, 8.8.8.8]\n    ```\n\n\n\n\u003cimg src=\"https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/tiddlywiki-example.png\" alt=\"tiddlywiki\" title=\"A TiddlyWiki Example\" /\u003e\n\n```\nThe `#` create a numbered list, `//` creates an italicized heading, and `!` creates headings similar to Markdown's `#`. The differences aren't too bad to keep in mind and what renders out is totally depenent on the tidlywiki itself. \nMy template has a nice nord feel to it, feel free to download from my github and try it out!\n\n\u003e I have moved away from my tiddlywiki workflow in favor of sites like this since I can git commit markdown files and build with [markata](https://markata.dev/) pretty easily (credit [waylon walker](www.waylonwalker.com))\n\n\u003e I still use tiddlywiki for tracking some todo items and questions --- I may have another solution in the future\n",
      "summary": "Tiddly Wiki is a great note taking utility for organizing non-linear notes. I used it to replace my OneNote workflow and my only complaint is I don't have an...",
      "date_published": "2022-03-05T00:00:00Z",
      "date_modified": "2022-03-05T00:00:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/vim-auto-space/",
      "url": "https://pype.dev/vim-auto-space/",
      "title": "Vim-Auto-Space",
      "content_html": "\u003cp\u003eI ran into an issue where I had some copy-pasta markdown tables in a docstring but the generator I used to make the table gave me tabs instead of spaces in odd places which caused \u003ccode\u003eblack\u003c/code\u003e to throw a fit.\nInstead of manually changing all tabs to spaes, or trying some goofy \u003ccode\u003e:%s/\u0026lt;magic tab character\u0026gt;/\u0026lt;%20 maybe?\u0026gt;/g\u003c/code\u003e I learned that Vim has my back\u0026hellip;\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e:retab\n\u003c/code\u003e\u003c/pre\u003e\n",
      "content_text": "\nI ran into an issue where I had some copy-pasta markdown tables in a docstring but the generator I used to make the table gave me tabs instead of spaces in odd places which caused `black` to throw a fit.\nInstead of manually changing all tabs to spaes, or trying some goofy `:%s/\u003cmagic tab character\u003e/\u003c%20 maybe?\u003e/g` I learned that Vim has my back...\n\n```\n:retab\n```\n",
      "summary": "I ran into an issue where I had some copy-pasta markdown tables in a docstring but the generator I used to make the table gave me tabs instead of spaces in...",
      "date_published": "2022-03-04T00:00:00Z",
      "date_modified": "2022-03-04T00:00:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "vim",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/stow/",
      "url": "https://pype.dev/stow/",
      "title": "Stow",
      "content_html": "\u003cp\u003eStow is a great tool for managing dotfiles. My usage looks like cloning my dotfiles to my home directory, setting some environment variables via a script, then stowing relevant packages and boom my config is good to go\u0026hellip;\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ecd\u003c/span\u003e ~\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit clone \u0026lt;my dotfiles repo\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ecd\u003c/span\u003e dotfiles\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# env variable stuff ignored here\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003estow zsh  \u003cspan class=\"c1\"\u003e# This will symlink my .zshrc file which is in ~/dotfiles/zsh to ~/.zshrc\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eBy default stow will stow packages up one directory from the root directory.\nIn this example the root directory is \u003ccode\u003e~/dotfiles\u003c/code\u003e and the package is \u003ccode\u003ezsh\u003c/code\u003e.\nSo the files in the \u003ccode\u003ezsh\u003c/code\u003e package will symlinked into \u003ccode\u003e~/\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003estow\u003c/code\u003e makes it easy to share dotfiles across machines, or safely experiment with config changes while always being protected by \u003ccode\u003egit\u003c/code\u003e since your dotfiles are in a git repo!\n\u0026hellip;They are in a git repo\u0026hellip; right?\u003c/p\u003e\n",
      "content_text": "\nStow is a great tool for managing dotfiles. My usage looks like cloning my dotfiles to my home directory, setting some environment variables via a script, then stowing relevant packages and boom my config is good to go...\n\n```bash\ncd ~\ngit clone \u003cmy dotfiles repo\u003e\ncd dotfiles\n# env variable stuff ignored here\nstow zsh  # This will symlink my .zshrc file which is in ~/dotfiles/zsh to ~/.zshrc\n```\nBy default stow will stow packages up one directory from the root directory. \nIn this example the root directory is `~/dotfiles` and the package is `zsh`.\nSo the files in the `zsh` package will symlinked into `~/`.\n\n`stow` makes it easy to share dotfiles across machines, or safely experiment with config changes while always being protected by `git` since your dotfiles are in a git repo!\n...They are in a git repo... right?\n",
      "summary": "Stow is a great tool for managing dotfiles. My usage looks like cloning my dotfiles to my home directory, setting some environment variables via a script,...",
      "date_published": "2022-03-04T00:00:00Z",
      "date_modified": "2022-03-04T00:00:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "bash",
        "linux",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/stow-target/",
      "url": "https://pype.dev/stow-target/",
      "title": "Stow-Target",
      "content_html": "\u003cp\u003eCheck out \u003ca href=\"/stow\"\u003estow\u003c/a\u003e for a brief introduction to \u003ccode\u003estow\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eWhat if I want to stow a package somewhere else?\nBoom, that\u0026rsquo;s where \u003ccode\u003e-t\u003c/code\u003e comes in\u0026hellip;\u003c/p\u003e\n\u003cp\u003eMaybe I don\u0026rsquo;t like having my \u003ccode\u003edotfiles\u003c/code\u003e repo at \u003ccode\u003e$HOME\u003c/code\u003e and instead I want it in \u003ccode\u003e~/git\u003c/code\u003e or \u003ccode\u003e~/personal\u003c/code\u003e just to stay organized\u0026hellip;\nWell then I could have the same workflow except the \u003ccode\u003estow\u003c/code\u003e command looks like this:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003estow zsh -t ~/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#or\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003estow zsh -t \u003cspan class=\"nv\"\u003e$HOME\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nCheck out [stow](/stow) for a brief introduction to `stow`\n\nWhat if I want to stow a package somewhere else?\nBoom, that's where `-t` comes in...\n\nMaybe I don't like having my `dotfiles` repo at `$HOME` and instead I want it in `~/git` or `~/personal` just to stay organized...\nWell then I could have the same workflow except the `stow` command looks like this:\n\n```bash\nstow zsh -t ~/\n#or\nstow zsh -t $HOME\n```\n",
      "summary": "Check out stow for a brief introduction to",
      "date_published": "2022-03-04T00:00:00Z",
      "date_modified": "2022-03-04T00:00:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "bash",
        "linux",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/git-ammend-no-edit/",
      "url": "https://pype.dev/git-ammend-no-edit/",
      "title": "Git ammend to a commit",
      "content_html": "\u003cp\u003eAfter carefully staging only lines related to a specific change and comitting I suddenly realized I missed one\u0026hellip; darn, what do I do?\u003c/p\u003e\n\u003cp\u003eOld me would have soft reset my branch to the previous commit and redone all my careful staging\u0026hellip; what a PIA\u0026hellip;\u003c/p\u003e\n\u003cp\u003eNew me (credit: ThePrimeagen)\u0026hellip;\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# stage other changes I missed\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit commit --amend --no-edit\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e",
      "content_text": "\nAfter carefully staging only lines related to a specific change and comitting I suddenly realized I missed one... darn, what do I do?\n\nOld me would have soft reset my branch to the previous commit and redone all my careful staging... what a PIA...\n\nNew me (credit: ThePrimeagen)...\n\n```bash\n# stage other changes I missed\ngit commit --amend --no-edit\n```\n",
      "summary": "After carefully staging only lines related to a specific change and comitting I suddenly realized I missed one... darn, what do I do?",
      "date_published": "2022-03-04T00:00:00Z",
      "date_modified": "2022-03-04T00:00:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "git",
        "tech",
        "til"
      ]
    },
    {
      "id": "https://pype.dev/ubuntu-static-ip/",
      "url": "https://pype.dev/ubuntu-static-ip/",
      "title": "Ubuntu-Static-Ip",
      "content_html": "\u003cp\u003eSometimes I need to manually set a static IP of a Linux machine. I generally run the latest version of Ubuntu server in my VMs at home.\u003c/p\u003e\n\u003cp\u003eIn Ubuntu 20 I\u0026rsquo;m able to change up \u003ccode\u003e/etc/netplan/\u0026lt;something\u0026gt;.yml\u003c/code\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003enetwork\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\"\u003eversion\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e2\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\"\u003eethernets\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\"\u003eenp0s4\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\"\u003eaddresses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e192.168.1\u003c/span\u003e\u003cspan class=\"l\"\u003e.{Static IP}/24]\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\"\u003egateway4\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e192.168.1.1\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\"\u003enameservers\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\"\u003eaddresses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e192.168.1.1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e1.1.1.1\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003egateway4\u003c/code\u003e is your router address\n\u003ccode\u003enameservers\u003c/code\u003e is a list of desired DNS servers for that machine to use. I  usually use my router which is configured to use my pi-hole as my primary DNS, then set  \u003ccode\u003e1.1.1.1\u003c/code\u003e (CloudFlare) as a backup\u003c/p\u003e\n\u003cp\u003eHit it with the \u003ccode\u003esudo netplan apply\u003c/code\u003e and you should be good to go!\u003c/p\u003e\n",
      "content_text": "\nSometimes I need to manually set a static IP of a Linux machine. I generally run the latest version of Ubuntu server in my VMs at home.\n\nIn Ubuntu 20 I'm able to change up `/etc/netplan/\u003csomething\u003e.yml`\n\n```yaml\nnetwork:\n  version: 2\n  ethernets:\n    enp0s4:\n      addresses: [192.168.1.{Static IP}/24]\n      gateway4: 192.168.1.1\n      nameservers:\n        addresses: [192.168.1.1, 1.1.1.1]\n```\n\n`gateway4` is your router address\n`nameservers` is a list of desired DNS servers for that machine to use. I  usually use my router which is configured to use my pi-hole as my primary DNS, then set  `1.1.1.1` (CloudFlare) as a backup\n\nHit it with the `sudo netplan apply` and you should be good to go!\n",
      "summary": "Sometimes I need to manually set a static IP of a Linux machine. I generally run the latest version of Ubuntu server in my VMs at home.",
      "date_published": "2022-03-03T00:00:00Z",
      "date_modified": "2022-03-03T00:00:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "linux",
        "til"
      ]
    }
  ]
}