{
  "version": "https://jsonfeed.org/version/1.1",
  "title": "drafts",
  "home_page_url": "https://pype.dev/drafts/",
  "feed_url": "https://pype.dev/drafts/feed.json",
  "description": "My thoughts and streams of consciousness organized into barely coherent posts about things",
  "authors": [
    {
      "name": "Nic Payne"
    }
  ],
  "items": [
    {
      "id": "https://pype.dev/markata-go-migration-research/",
      "url": "https://pype.dev/markata-go-migration-research/",
      "title": "markata-go Migration Research",
      "content_html": "\u003cp\u003eResearch on \u003ca href=\"https://github.com/WaylonWalker/markata-go\"\u003emarkata-go\u003c/a\u003e, the Go rewrite of the Python \u003ca href=\"https://markata.dev\"\u003emarkata\u003c/a\u003e static site generator, to support migrating pype.dev. All sources are primary: the GitHub repo (README, \u003ccode\u003edocs/\u003c/code\u003e, \u003ccode\u003espec/\u003c/code\u003e, releases, issues, commit history), pkg.go.dev, and Waylon\u0026rsquo;s own sites (waylonwalker.com now runs on markata-go; \u003ccode\u003ego.waylonwalker.com\u003c/code\u003e is the deployment).\u003c/p\u003e\n\u003cp\u003eRepo state as of research date: \u003cstrong\u003ev0.13.0, \u0026ldquo;Beta (0.x) - API may change between minor versions\u0026rdquo;\u003c/strong\u003e, created 2026-01-22, 2 stars, 51 open issues, essentially solo-maintained by WaylonWalker (853 contributions) + dependabot. \u003ca href=\"https://github.com/WaylonWalker/markata-go\"\u003eSource\u003c/a\u003e, \u003ca href=\"https://pkg.go.dev/github.com/WaylonWalker/markata-go\"\u003epkg.go.dev\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eImportant caveat:\u003c/strong\u003e the project is \u0026ldquo;open source but \u003cstrong\u003enot open contribution\u003c/strong\u003e\u0026rdquo; — PRs are not reviewed or merged; bugs/feature requests go through issues only. \u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/CONTRIBUTING.md\"\u003eCONTRIBUTING.md\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"1-installation-cli\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e1. Installation + CLI\u003c/span\u003e \u003ca href=\"#1-installation-cli\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"install-options\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eInstall options\u003c/span\u003e \u003ca href=\"#install-options\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/docs/installation.md\"\u003edocs/installation.md\u003c/a\u003e, \u003ca href=\"https://github.com/WaylonWalker/markata-go\"\u003eREADME\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# One-liner (Linux/macOS)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl -sSL https://raw.githubusercontent.com/WaylonWalker/markata-go/main/install.sh \u003cspan class=\"p\"\u003e|\u003c/span\u003e bash\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# (also published at https://waylonwalker.github.io/markata-go/install.sh)\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# jpillora installer\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl -sL https://i.jpillora.com/WaylonWalker/markata-go \u003cspan class=\"p\"\u003e|\u003c/span\u003e bash\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# eget\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eeget WaylonWalker/markata-go\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# mise (from GitHub releases)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emise use -g github:WaylonWalker/markata-go\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# Go install (Go 1.22+; v0.13.0 toolchain reports Go 1.26)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego install github.com/WaylonWalker/markata-go/cmd/markata-go@latest\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# or pinned: ...@v0.13.0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eDistributed as a single dependency-free binary. \u003ccode\u003emarkata-go update\u003c/code\u003e is a built-in self-update command. \u003ca href=\"https://github.com/WaylonWalker/markata-go/releases/tag/v0.5.0\"\u003ev0.5.0 release notes\u003c/a\u003e\u003c/p\u003e\n\u003ch3 id=\"cli-commands\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCLI commands\u003c/span\u003e \u003ca href=\"#cli-commands\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/cli.md\"\u003edocs/reference/cli.md\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eGlobal flags: \u003ccode\u003e-c/--config\u003c/code\u003e, \u003ccode\u003e-m/--merge-config\u003c/code\u003e (repeatable), \u003ccode\u003e-o/--output\u003c/code\u003e, \u003ccode\u003e-q/--quiet\u003c/code\u003e, \u003ccode\u003e-v/--verbose\u003c/code\u003e, \u003ccode\u003e--color/--no-color\u003c/code\u003e, \u003ccode\u003e--log-format\u003c/code\u003e, \u003ccode\u003e--no-input\u003c/code\u003e.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eCommand\u003c/th\u003e\n\u003cth\u003eWhat it does\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ebuild\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFull build. Flags: \u003ccode\u003e--clean\u003c/code\u003e, \u003ccode\u003e--dry-run\u003c/code\u003e, \u003ccode\u003e--fast\u003c/code\u003e (skip minify/CSS purge/Tailwind/Pagefind), \u003ccode\u003e--benchmark-json\u003c/code\u003e, \u003ccode\u003e--benchmark-detailed\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eserve\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDev server + live reload. \u003ccode\u003e-p/--port\u003c/code\u003e, \u003ccode\u003e-H/--host\u003c/code\u003e, \u003ccode\u003e--no-reload\u003c/code\u003e, \u003ccode\u003e--no-watch\u003c/code\u003e, \u003ccode\u003e--open\u003c/code\u003e, \u003ccode\u003e--fast\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003enew [title]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCreate post. \u003ccode\u003e--dir\u003c/code\u003e, \u003ccode\u003e--draft\u003c/code\u003e, \u003ccode\u003e--tags\u003c/code\u003e; interactive mode via charmbracelet/huh. Built-in content templates: post, page, docs, article, note, photo, video, link, quote, guide, inline, contact, author\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003einit\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eScaffold a new site\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003econfig show/get/set/validate/init\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eResolved config in YAML/JSON/TOML; dot-notation get (\u003ccode\u003efeeds.defaults.items_per_page\u003c/code\u003e); \u003ccode\u003eset\u003c/code\u003e preserves formatting\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emigrate\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003cstrong\u003ePython-markata migration tool\u003c/strong\u003e (see §2)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etui\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ek9s-style interactive TUI: posts/tags/feeds views, \u003ccode\u003e/\u003c/code\u003e filter expressions\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003elsp\u003c/code\u003e / \u003ccode\u003elsp setup --editor helix\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eLanguage server: wikilink completion, frontmatter completion/hover, diagnostics\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003elist\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eList posts/tags/feeds (`\u0026ndash;format table\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esearch\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eContent search: \u003ccode\u003e--filter\u003c/code\u003e, \u003ccode\u003e--fields\u003c/code\u003e, \u003ccode\u003e--fuzzy\u003c/code\u003e, \u003ccode\u003e--limit\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003elint\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFrontmatter/content checks with fixers (incl. natural-language datetime fixing)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eexplain \u0026lt;topic\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eBuilt-in docs, e.g. \u003ccode\u003emarkata-go explain feeds\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ebenchmark\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eBuild benchmarks + pprof\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eimport\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eImport external content (PESOS pattern)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eencryption\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003echeck\u003c/code\u003e, \u003ccode\u003egenerate-password\u003c/code\u003e, \u003ccode\u003eencrypt-posts\u003c/code\u003e subcommands\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eaesthetic\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTheme/aesthetic tooling\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eagent\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eInstall/doctor bundled agent-skill integrations (\u003ccode\u003eagent doctor\u003c/code\u003e drift-checks installed skill)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eblogroll\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eBlogroll commands incl. \u003ccode\u003eblogroll update\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eversion\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e--short\u003c/code\u003e supported\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"2-config-format\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e2. Config format\u003c/span\u003e \u003ca href=\"#2-config-format\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"file-discovery\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFile discovery\u003c/span\u003e \u003ca href=\"#file-discovery\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003emarkata-go does \u003cstrong\u003enot\u003c/strong\u003e auto-read \u003ccode\u003emarkata.toml\u003c/code\u003e. It looks for (first found wins): \u003ccode\u003e./markata-go.toml\u003c/code\u003e, \u003ccode\u003e./markata-go.yaml\u003c/code\u003e, \u003ccode\u003e./markata-go.yml\u003c/code\u003e, \u003ccode\u003e./markata-go.json\u003c/code\u003e, \u003ccode\u003e.markata-go.*\u003c/code\u003e, \u003ccode\u003e~/.config/markata-go/config.toml\u003c/code\u003e, or \u003ccode\u003e--config\u003c/code\u003e/\u003ccode\u003e--merge-config\u003c/code\u003e. \u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/docs/guides/configuration.md\"\u003econfiguration.md\u003c/a\u003e, \u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/cli.md\"\u003ecli.md\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eAll config is namespaced under \u003ccode\u003e[markata-go]\u003c/code\u003e (also accepts YAML/JSON). Env overrides use \u003ccode\u003eMARKATA_GO_\u003c/code\u003e prefix (e.g. \u003ccode\u003eMARKATA_GO_OUTPUT_DIR=dist\u003c/code\u003e). Config \u003ccode\u003einclude = [...]\u003c/code\u003e supports splitting config across files; \u003ccode\u003e[[markata-go.feeds]]\u003c/code\u003e merges by \u003ccode\u003eslug\u003c/code\u003e. \u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/docs/guides/configuration.md\"\u003econfiguration.md\u003c/a\u003e\u003c/p\u003e\n\u003ch3 id=\"core-schema-markata-go\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCore schema (\u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003e[markata-go]\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e)\u003c/span\u003e \u003ca href=\"#core-schema-markata-go\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eoutput_dir\u003c/code\u003e (default \u003ccode\u003e\u0026quot;output\u0026quot;\u003c/code\u003e), \u003ccode\u003eurl\u003c/code\u003e, \u003ccode\u003etitle\u003c/code\u003e, \u003ccode\u003edescription\u003c/code\u003e, \u003ccode\u003eauthor\u003c/code\u003e, \u003ccode\u003elicense\u003c/code\u003e, \u003ccode\u003eassets_dir\u003c/code\u003e (default \u003ccode\u003e\u0026quot;static\u0026quot;\u003c/code\u003e), \u003ccode\u003etemplates_dir\u003c/code\u003e (default \u003ccode\u003e\u0026quot;templates\u0026quot;\u003c/code\u003e), \u003ccode\u003ehooks\u003c/code\u003e (default \u003ccode\u003e[\u0026quot;default\u0026quot;]\u003c/code\u003e), \u003ccode\u003edisabled_hooks\u003c/code\u003e, \u003ccode\u003econcurrency\u003c/code\u003e (0=auto). PWA-ish fields also present in the schema: \u003ccode\u003eicon\u003c/code\u003e, \u003ccode\u003elang\u003c/code\u003e, \u003ccode\u003etheme_color\u003c/code\u003e, \u003ccode\u003ebackground_color\u003c/code\u003e, \u003ccode\u003estart_url\u003c/code\u003e, \u003ccode\u003edisplay\u003c/code\u003e, \u003ccode\u003eshort_name\u003c/code\u003e, \u003ccode\u003esite_name\u003c/code\u003e, \u003ccode\u003erepo_url\u003c/code\u003e, \u003ccode\u003erepo_branch\u003c/code\u003e, \u003ccode\u003etwitter_card\u003c/code\u003e, \u003ccode\u003etwitter_handle\u003c/code\u003e/\u003ccode\u003etwitter_site\u003c/code\u003e, \u003ccode\u003erss_description\u003c/code\u003e, \u003ccode\u003esite_version\u003c/code\u003e. \u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/docs/guides/configuration.md\"\u003econfiguration.md\u003c/a\u003e + this repo\u0026rsquo;s own \u003ccode\u003emarkata-go.toml\u003c/code\u003e which already carries them.\u003c/p\u003e\n\u003cp\u003eOther sections seen in docs: \u003ccode\u003e[markata-go.glob]\u003c/code\u003e (\u003ccode\u003epatterns\u003c/code\u003e default \u003ccode\u003e[\u0026quot;pages/**/*.md\u0026quot;,\u0026quot;posts/**/*.md\u0026quot;]\u003c/code\u003e, \u003ccode\u003euse_gitignore\u003c/code\u003e, \u003ccode\u003eslug_mode\u003c/code\u003e, \u003ccode\u003eslug_rules\u003c/code\u003e), \u003ccode\u003e[markata-go.markdown]\u003c/code\u003e + \u003ccode\u003e[markata-go.markdown.highlight]\u003c/code\u003e, \u003ccode\u003e[markata-go.wikilinks]\u003c/code\u003e (\u003ccode\u003ewarn_broken\u003c/code\u003e, \u003ccode\u003estrict_wikilinks\u003c/code\u003e under \u003ccode\u003e[markata-go]\u003c/code\u003e), \u003ccode\u003e[markata-go.theme]\u003c/code\u003e, \u003ccode\u003e[markata-go.feed_defaults]\u003c/code\u003e, \u003ccode\u003e[[markata-go.feeds]]\u003c/code\u003e, \u003ccode\u003e[[markata-go.nav]]\u003c/code\u003e (\u003ccode\u003elabel\u003c/code\u003e, \u003ccode\u003eurl\u003c/code\u003e, \u003ccode\u003eexternal\u003c/code\u003e), \u003ccode\u003e[markata-go.components.nav]\u003c/code\u003e, \u003ccode\u003e[markata-go.sidebar]\u003c/code\u003e/\u003ccode\u003e[[markata-go.sidebar.nav]]\u003c/code\u003e, \u003ccode\u003e[markata-go.encryption]\u003c/code\u003e, \u003ccode\u003e[embeds]\u003c/code\u003e, \u003ccode\u003e[markata-go.head]\u003c/code\u003e + \u003ccode\u003e[[markata-go.head.alternate_feeds]]\u003c/code\u003e, \u003ccode\u003e[markata-go.blogroll]\u003c/code\u003e, \u003ccode\u003e[content_templates]\u003c/code\u003e. \u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/docs/guides/configuration.md\"\u003econfiguration.md\u003c/a\u003e\u003c/p\u003e\n\u003ch3 id=\"migration-tooling-markata-go-migrate\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMigration tooling — \u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003emarkata-go migrate\u003c/span\u003e\u003c/code\u003e \u003ca href=\"#migration-tooling-markata-go-migrate\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/cli.md\"\u003ecli.md\u003c/a\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go migrate                          \u003cspan class=\"c1\"\u003e# full analysis\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go migrate --dry-run\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go migrate config -i markata.toml -o markata-go.toml   \u003cspan class=\"c1\"\u003e# also accepts pyproject.toml\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go migrate filter \u003cspan class=\"s2\"\u003e\u0026#34;templateKey in [\u0026#39;blog\u0026#39;, \u0026#39;til\u0026#39;]\u0026#34;\u003c/span\u003e     \u003cspan class=\"c1\"\u003e# check a filter expression\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emarkata-go migrate templates \u003cspan class=\"o\"\u003e[\u003c/span\u003epath\u003cspan class=\"o\"\u003e]\u003c/span\u003e                           \u003cspan class=\"c1\"\u003e# check pongo2 compat\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eExit codes: 0 clean, 1 warnings, 2 incompatibilities, 3 error. There is a \u003ccode\u003edocs/guides/migration.md\u003c/code\u003e in the repo.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eKnown bug:\u003c/strong\u003e the migrate tool has emitted invalid TOML (nested \u003ccode\u003e[markata-go.description.description]\u003c/code\u003e tables from a \u003ccode\u003e[markata.auto_description.description]\u003c/code\u003e-style Python config) — \u003ca href=\"https://github.com/WaylonWalker/waylonwalker.com/issues/20\"\u003eWaylonWalker/waylonwalker.com issue #20\u003c/a\u003e, supposedly fixed by \u003ccode\u003efix(migrate): generate valid TOML for string fields (#208)\u003c/code\u003e in \u003ca href=\"https://github.com/WaylonWalker/markata-go/releases/tag/v0.5.0\"\u003ev0.5.0\u003c/a\u003e. Always run \u003ccode\u003emarkata-go config validate\u003c/code\u003e after migrating.\u003c/p\u003e\n\u003cp\u003eThis repo\u0026rsquo;s \u003ccode\u003emarkata-go.toml\u003c/code\u003e already exists and appears to be migrate-tool output — feed filter strings carried over verbatim, \u003ccode\u003epage_size\u003c/code\u003e preserved.\u003c/p\u003e\n\u003ch2 id=\"3-markdown-features\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e3. Markdown features\u003c/span\u003e \u003ca href=\"#3-markdown-features\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eEngine: \u003cstrong\u003egoldmark\u003c/strong\u003e (deps include \u003ccode\u003eyuin/goldmark\u003c/code\u003e, \u003ccode\u003egoldmark-highlighting\u003c/code\u003e, \u003ccode\u003egoldmark-emoji\u003c/code\u003e, \u003ccode\u003egoldmark-figure\u003c/code\u003e, \u003ccode\u003egoldmark-anchor\u003c/code\u003e, CJK ext, \u003ccode\u003eabhg.dev/goldmark/*\u003c/code\u003e). \u003ca href=\"https://pkg.go.dev/github.com/WaylonWalker/markata-go\"\u003epkg.go.dev deps\u003c/a\u003e, \u003ca href=\"https://github.com/WaylonWalker/markata-go/compare/v0.9.0...v0.10.0\"\u003ev0.10.0 changelog\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eConfig: \u003ccode\u003e[markata-go.markdown] extensions = [\u0026quot;tables\u0026quot;,\u0026quot;strikethrough\u0026quot;,\u0026quot;autolinks\u0026quot;,\u0026quot;tasklist\u0026quot;]\u003c/code\u003e; spec also lists \u003ccode\u003etypographer\u003c/code\u003e (smart quotes, \u003cstrong\u003edefault true\u003c/strong\u003e), \u003ccode\u003edefinition_list\u003c/code\u003e, \u003ccode\u003efootnote\u003c/code\u003e. \u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/docs/guides/configuration.md\"\u003econfiguration.md\u003c/a\u003e, \u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/spec/spec/CONTENT.md\"\u003espec/CONTENT.md\u003c/a\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eAdmonitions \u003ccode\u003e!!!\u003c/code\u003e:\u003c/strong\u003e supported via a goldmark extension in the render stage. \u003cstrong\u003eVerified against source: types are a hardcoded whitelist\u003c/strong\u003e — \u003ccode\u003enote, info, tip, hint, success, warning, caution, important, danger, error, bug, example, quote, abstract, aside, seealso, reminder, attention, todo, settings, vsplit, chat, chat-reply\u003c/code\u003e (\u003ccode\u003eadmonitionTypes\u003c/code\u003e map in \u003ccode\u003epkg/plugins/admonitions.go\u003c/code\u003e). Unknown types are NOT parsed — they render as literal paragraphs. \u003ccode\u003e!!! scripture\u003c/code\u003e / \u003ccode\u003e!!! background-thought\u003c/code\u003e do \u003cstrong\u003enot\u003c/strong\u003e work. Confirmed live: \u003ccode\u003e???+ success\u003c/code\u003e in this repo rendered \u003ccode\u003e\u0026lt;details class=\u0026quot;admonition success\u0026quot; open\u0026gt;\u003c/code\u003e while \u003ccode\u003e!!! scripture\u003c/code\u003e rendered literal text. No config option for custom types exists. \u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/plugins.md\"\u003eplugins.md\u003c/a\u003e, \u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/docs/guides/markdown.md\"\u003emarkdown.md\u003c/a\u003e, \u003ccode\u003epkg/plugins/admonitions.go:17\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCollapsible \u003ccode\u003e???\u003c/code\u003e / \u003ccode\u003e???+\u003c/code\u003e:\u003c/strong\u003e supported (\u003ccode\u003e???\u003c/code\u003e collapsed, \u003ccode\u003e???+\u003c/code\u003e open), renders native \u003ccode\u003e\u0026lt;details\u0026gt;/\u0026lt;summary\u0026gt;\u003c/code\u003e. \u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/docs/guides/markdown.md\"\u003emarkdown.md\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eWikilinks:\u003c/strong\u003e \u003ccode\u003e[[slug]]\u003c/code\u003e, \u003ccode\u003e[[slug|text]]\u003c/code\u003e, \u003ccode\u003e[[slug#fragment]]\u003c/code\u003e, \u003ccode\u003e[[slug#frag|text]]\u003c/code\u003e; case-insensitive slug lookup, then \u003ccode\u003ealiases\u003c/code\u003e frontmatter (synonyms: \u003ccode\u003ealias\u003c/code\u003e, \u003ccode\u003ehandle\u003c/code\u003e, \u003ccode\u003ehandles\u003c/code\u003e); unresolved → rendered literal + \u003ccode\u003ewikilink_warnings\u003c/code\u003e in \u003ccode\u003epost.Extra\u003c/code\u003e; \u003ccode\u003estrict_wikilinks = true\u003c/code\u003e fails the build. \u003cstrong\u003e\u003ccode\u003e[[ slug ]]\u003c/code\u003e WITH SPACES WORKS\u003c/strong\u003e — \u003ccode\u003ewikilinks.go:151\u003c/code\u003e does \u003ccode\u003estrings.TrimSpace(groups[1])\u003c/code\u003e, verified against this repo\u0026rsquo;s build output (spaced daily-note links resolve with full hover-preview data attributes). \u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/plugins.md\"\u003eplugins.md\u003c/a\u003e, \u003ccode\u003epkg/plugins/wikilinks.go:151\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAttrs \u003ccode\u003e{#id .class}\u003c/code\u003e:\u003c/strong\u003e supported — spec shows \u003ccode\u003e![alt](img.png){.shadow .bordered}\u003c/code\u003e, \u003ccode\u003e*em*{.accent}\u003c/code\u003e, \u003ccode\u003e`code`{.inline-code}\u003c/code\u003e, \u003ccode\u003e[[link]]{.wikilink-pill}\u003c/code\u003e, \u003ccode\u003e{#hero-image}\u003c/code\u003e. \u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/spec/spec/CONTENT.md\"\u003espec/CONTENT.md\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCode highlighting:\u003c/strong\u003e goldmark-highlighting (chroma); \u003ccode\u003e[markata-go.markdown.highlight] theme = \u0026quot;dracula\u0026quot;\u003c/code\u003e, \u003ccode\u003eline_numbers\u003c/code\u003e. \u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/docs/guides/markdown.md\"\u003emarkdown.md\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTables:\u003c/strong\u003e via \u003ccode\u003etables\u003c/code\u003e extension. Typographer/smart quotes: \u003ccode\u003etypographer = true\u003c/code\u003e default in spec. \u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/docs/guides/configuration.md\"\u003econfiguration.md\u003c/a\u003e, \u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/spec/spec/CONTENT.md\"\u003espec/CONTENT.md\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eHeading anchors/permalinks:\u003c/strong\u003e \u003ccode\u003eheading_anchors\u003c/code\u003e plugin + \u003ccode\u003egoldmark-anchor\u003c/code\u003e; TOC plugin (\u003ccode\u003etoc\u003c/code\u003e, \u003ccode\u003epost.Extra.toc_html\u003c/code\u003e). \u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/plugins.md\"\u003eplugins.md\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eMarkdown containers:\u003c/strong\u003e generic \u003ccode\u003e::: name\u003c/code\u003e fenced divs with \u003ccode\u003e{#id .class data-attr}\u003c/code\u003e — a possible escape hatch for admonition-like custom blocks (no title/collapse semantics). \u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/docs/guides/markdown-containers.md\"\u003emarkdown-containers.md\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eExtras present:\u003c/strong\u003e mermaid (incl. lightbox/pan-zoom, CLI/Chromium pre-render), chartjs fenced blocks, \u003ccode\u003econtribution-graph\u003c/code\u003e fenced block, csv_fence, glossary, webawesome components, Obsidian-style \u003ccode\u003e\u0026lt;!-- embed not found: attachment --\u0026gt; ![[attachment]]\u003c/code\u003e embeds, oEmbed external link cards. \u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/plugins.md\"\u003eplugins.md\u003c/a\u003e, \u003ca href=\"https://github.com/WaylonWalker/markata-go/releases/tag/v0.7.0\"\u003ev0.7.0\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"4-frontmatter\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e4. Frontmatter\u003c/span\u003e \u003ca href=\"#4-frontmatter\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/docs/guides/frontmatter.md\"\u003efrontmatter.md\u003c/a\u003e, \u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/plugins.md\"\u003eplugins.md load section\u003c/a\u003e, \u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/spec/spec/DATA_MODEL.md\"\u003espec/DATA_MODEL.md\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eBuilt-in fields: \u003ccode\u003etitle\u003c/code\u003e, \u003ccode\u003eslug\u003c/code\u003e, \u003ccode\u003edate\u003c/code\u003e (+ \u003ccode\u003emodified\u003c/code\u003e, and date aliases for cross-SSG compat), \u003ccode\u003epublished\u003c/code\u003e (default \u003cstrong\u003efalse\u003c/strong\u003e), \u003ccode\u003edraft\u003c/code\u003e (never rendered), \u003ccode\u003eskip\u003c/code\u003e, \u003ccode\u003etags\u003c/code\u003e, \u003ccode\u003edescription\u003c/code\u003e (auto-generated if absent), \u003ccode\u003etemplate\u003c/code\u003e (default \u003ccode\u003epost.html\u003c/code\u003e; also object form \u003ccode\u003e{default:, card:, feed:}\u003c/code\u003e), \u003ccode\u003ealiases\u003c/code\u003e, \u003ccode\u003eauthors\u003c/code\u003e/\u003ccode\u003eauthor\u003c/code\u003e/\u003ccode\u003ewriter\u003c/code\u003e, \u003ccode\u003eimage\u003c/code\u003e/\u003ccode\u003evideo\u003c/code\u003e/\u003ccode\u003ecover_image\u003c/code\u003e/\u003ccode\u003ethumbnail\u003c/code\u003e/\u003ccode\u003eog_image\u003c/code\u003e/\u003ccode\u003ehero_video\u003c/code\u003e, \u003ccode\u003eprivate\u003c/code\u003e, \u003ccode\u003ejinja\u003c/code\u003e (bool gate for jinja_md), \u003ccode\u003econfig_overrides\u003c/code\u003e, \u003ccode\u003ecss_class\u003c/code\u003e. Unknown fields land in \u003ccode\u003eExtra\u003c/code\u003e and are filterable (\u003ccode\u003eExtra.series == 'X'\u003c/code\u003e).\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003epublished\u003c/code\u003e semantics match Python markata:\u003c/strong\u003e \u003ccode\u003efalse\u003c/code\u003e = rendered but excluded from feeds/sitemap/RSS (\u0026ldquo;shadow page\u0026rdquo;); \u003ccode\u003etrue\u003c/code\u003e = included. \u003ccode\u003edraft: true\u003c/code\u003e = not rendered at all.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003etemplateKey\u003c/code\u003e:\u003c/strong\u003e still a real field — filters like \u003ccode\u003etemplateKey in ['blog-post']\u003c/code\u003e are used in migrate docs, and \u003ccode\u003eencryption.private_tags\u003c/code\u003e matches against templateKey as well as tags. \u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/cli.md\"\u003ecli.md migrate section\u003c/a\u003e, \u003ca href=\"https://github.com/WaylonWalker/markata-go/releases/tag/v0.8.0\"\u003ev0.8.0 changelog\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSlugs:\u003c/strong\u003e auto-generated from filename by default (\u003ccode\u003eflat\u003c/code\u003e mode): lowercase, spaces→hyphens, strip special chars, collapse hyphens. \u003ccode\u003e[markata-go.glob] slug_mode = \u0026quot;flat\u0026quot; | \u0026quot;path\u0026quot;\u003c/code\u003e plus per-prefix \u003ccode\u003e[[markata-go.glob.slug_rules]]\u003c/code\u003e (longest prefix wins) — the \u0026ldquo;hybrid\u0026rdquo; v0.9.0 capability. \u003ccode\u003eindex.md\u003c/code\u003e/\u003ccode\u003eREADME.md\u003c/code\u003e map to directory root; \u003ccode\u003eslug: \u0026quot;\u0026quot;\u003c/code\u003e or \u003ccode\u003e/\u003c/code\u003e = homepage; frontmatter \u003ccode\u003eslug\u003c/code\u003e always wins; nested \u003ccode\u003eslug: \u0026quot;a/b\u0026quot;\u003c/code\u003e allowed; leading/trailing slashes stripped. \u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/docs/guides/configuration.md\"\u003econfiguration.md\u003c/a\u003e, \u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/spec/spec/DATA_MODEL.md\"\u003espec/DATA_MODEL.md\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDates:\u003c/strong\u003e accepts RFC3339, \u003ccode\u003eYYYY-MM-DD HH:MM:SS\u003c/code\u003e, \u003ccode\u003eYYYY-MM-DD\u003c/code\u003e, US \u003ccode\u003e01/15/2024\u003c/code\u003e, European \u003ccode\u003e15-01-2024\u003c/code\u003e, \u003ccode\u003eJanuary 15, 2024\u003c/code\u003e, \u003ccode\u003eJan 15, 2024\u003c/code\u003e. \u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/plugins.md\"\u003eplugins.md\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"5-feeds-filter-language\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e5. Feeds + filter language\u003c/span\u003e \u003ca href=\"#5-feeds-filter-language\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eFilters are Python-like expressions — the same syntax family as Python markata.\u003c/strong\u003e This site\u0026rsquo;s existing filters port verbatim. \u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/docs/guides/frontmatter.md\"\u003efrontmatter.md\u003c/a\u003e, \u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/spec/spec/DATA_MODEL.md\"\u003espec/DATA_MODEL.md\u003c/a\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;draft == False\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#39;go\u0026#39; in tags\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date \u0026gt;= \u0026#39;2024-01-01\u0026#39; and date \u0026lt; \u0026#39;2025-01-01\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;slug.startswith(\u0026#39;tutorials/\u0026#39;)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;template == \u0026#39;tutorial.html\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Extra.series == \u0026#39;Web Scraping with Go\u0026#39;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True and (\u0026#39;go\u0026#39; in tags or \u0026#39;python\u0026#39; in tags)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;not draft\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOperators: \u003ccode\u003e==\u003c/code\u003e \u003ccode\u003e!=\u003c/code\u003e \u003ccode\u003e\u0026gt;\u003c/code\u003e \u003ccode\u003e\u0026gt;=\u003c/code\u003e \u003ccode\u003e\u0026lt;\u003c/code\u003e \u003ccode\u003e\u0026lt;=\u003c/code\u003e \u003ccode\u003ein\u003c/code\u003e \u003ccode\u003eand\u003c/code\u003e \u003ccode\u003eor\u003c/code\u003e \u003ccode\u003enot\u003c/code\u003e; string methods \u003ccode\u003estartswith\u003c/code\u003e, \u003ccode\u003elower().contains(...)\u003c/code\u003e; built-ins \u003ccode\u003etoday\u003c/code\u003e, \u003ccode\u003enow\u003c/code\u003e, \u003ccode\u003eTrue\u003c/code\u003e, \u003ccode\u003eFalse\u003c/code\u003e, \u003ccode\u003eNone\u003c/code\u003e; \u003ccode\u003edate(2024,1,1)\u003c/code\u003e constructor in spec. (Python markata extras \u003ccode\u003etimedelta\u003c/code\u003e/\u003ccode\u003eparse\u003c/code\u003e not confirmed — check \u003ccode\u003emigrate filter\u003c/code\u003e.) Note the TUI/CLI search uses a slightly different dialect (\u003ccode\u003etags contains \u0026quot;go\u0026quot;\u003c/code\u003e, \u003ccode\u003etitle startswith \u0026quot;How\u0026quot;\u003c/code\u003e).\u003c/p\u003e\n\u003ch3 id=\"feed-config\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFeed config\u003c/span\u003e \u003ca href=\"#feed-config\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003ca href=\"https://pkg.go.dev/github.com/WaylonWalker/markata-go\"\u003epkg.go.dev README\u003c/a\u003e\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\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeed_defaults\u003c/span\u003e\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\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\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\u003cspan class=\"nx\"\u003eorphan_threshold\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\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\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeed_defaults\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\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\"\u003ehtml\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\"\u003erss\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\"\u003eatom\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=\"nx\"\u003ejson\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\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeed_defaults\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etemplates\u003c/span\u003e\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\"\u003ehtml\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;feed.html\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecard\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;card.html\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\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\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\"\u003eslug\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;blog\u0026#34;\u003c/span\u003e            \u003cspan class=\"c\"\u003e# slug = \u0026#34;\u0026#34; → homepage index.html\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Blog\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edescription\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;All blog posts\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;published == True\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003esort\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e            \u003cspan class=\"c\"\u003e# or \u0026#34;Extra.series_order\u0026#34; etc.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ereverse\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\"\u003eitems_per_page\u003c/span\u003e \u003cspan class=\"p\"\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\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003emarkata-go\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efeeds\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eformats\u003c/span\u003e\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\"\u003ehtml\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\"\u003erss\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\"\u003eatom\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\"\u003ejson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eFormats per feed: \u003ccode\u003ehtml\u003c/code\u003e → \u003ccode\u003e/{slug}/index.html\u003c/code\u003e (paginated), \u003ccode\u003erss\u003c/code\u003e → \u003ccode\u003e/{slug}/rss.xml\u003c/code\u003e, \u003ccode\u003eatom\u003c/code\u003e → \u003ccode\u003eatom.xml\u003c/code\u003e, \u003ccode\u003ejson\u003c/code\u003e → \u003ccode\u003efeed.json\u003c/code\u003e, \u003ccode\u003emarkdown\u003c/code\u003e → \u003ccode\u003eindex.md\u003c/code\u003e, \u003ccode\u003etext\u003c/code\u003e → \u003ccode\u003eindex.txt\u003c/code\u003e, plus a \u003ccode\u003esitemap\u003c/code\u003e per-feed format. Pagination via \u003ccode\u003eitems_per_page\u003c/code\u003e/\u003ccode\u003epage_size\u003c/code\u003e, \u003ccode\u003eorphan_threshold\u003c/code\u003e. \u003ccode\u003eauto_feeds\u003c/code\u003e generates per-tag feeds automatically. \u003ca href=\"https://pkg.go.dev/github.com/WaylonWalker/markata-go\"\u003epkg.go.dev\u003c/a\u003e, \u003ca href=\"https://github.com/WaylonWalker/markata-go/releases/tag/v0.10.0\"\u003ev0.10.0 changelog\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"6-templates\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e6. Templates\u003c/span\u003e \u003ca href=\"#6-templates\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eEngine: \u003cstrong\u003epongo2\u003c/strong\u003e (\u0026ldquo;Jinja2-like\u0026rdquo;) — \u003ccode\u003e{{ }}\u003c/code\u003e, \u003ccode\u003e{% %}\u003c/code\u003e syntax, \u003ccode\u003e|safe\u003c/code\u003e etc. \u003ca href=\"https://pkg.go.dev/github.com/WaylonWalker/markata-go\"\u003epkg.go.dev\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eLookup order for \u003ccode\u003epost.template\u003c/code\u003e: project \u003ccode\u003etemplates/\u003c/code\u003e dir → theme templates → default theme fallback. Missing template → raw \u003ccode\u003earticle_html\u003c/code\u003e. \u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/docs/guides/frontmatter.md\"\u003efrontmatter.md\u003c/a\u003e, \u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/plugins.md\"\u003eplugins.md\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eTemplate context: \u003ccode\u003epost\u003c/code\u003e, \u003ccode\u003ebody\u003c/code\u003e (= \u003ccode\u003epost.ArticleHTML\u003c/code\u003e), \u003ccode\u003econfig\u003c/code\u003e, \u003ccode\u003ecore\u003c/code\u003e; in jinja_md content templates also \u003ccode\u003eposts\u003c/code\u003e, \u003ccode\u003efilter\u003c/code\u003e, \u003ccode\u003emap\u003c/code\u003e, \u003ccode\u003etoday\u003c/code\u003e, \u003ccode\u003enow\u003c/code\u003e. Field access is Go-style exported names in examples (\u003ccode\u003epost.Title\u003c/code\u003e, \u003ccode\u003epost.Date.Format\u003c/code\u003e, \u003ccode\u003epost.Extra.toc_html\u003c/code\u003e) — but template-variable casing has been a moving target (documented in agent-skill commit c7923e3); pongo2 generally resolves case-insensitively. Custom filters: \u003ccode\u003emedia_url\u003c/code\u003e, \u003ccode\u003eis_video\u003c/code\u003e, \u003ccode\u003elength/first/last/sort/reverse/selectattr/map/join/default/upper/lower/title\u003c/code\u003e, \u003ccode\u003eforloop\u003c/code\u003e vars. Template helpers \u003ccode\u003erender_feed\u003c/code\u003e/\u003ccode\u003efeed_posts\u003c/code\u003e exist. \u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/plugins.md\"\u003eplugins.md\u003c/a\u003e, \u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/docs/guides/frontmatter.md\"\u003efrontmatter.md media fields\u003c/a\u003e, \u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/spec/spec/CONTENT.md\"\u003espec/CONTENT.md\u003c/a\u003e\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e{%\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"nv\"\u003epost.Extra.toc_html\u003c/span\u003e \u003cspan class=\"cp\"\u003e%}\u003c/span\u003e\u003cspan class=\"x\"\u003e\u0026lt;aside\u0026gt;\u003c/span\u003e\u003cspan class=\"cp\"\u003e{{\u003c/span\u003e \u003cspan class=\"nv\"\u003epost.Extra.toc_html\u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"nf\"\u003esafe\u003c/span\u003e \u003cspan class=\"cp\"\u003e}}\u003c/span\u003e\u003cspan class=\"x\"\u003e\u0026lt;/aside\u0026gt;\u003c/span\u003e\u003cspan class=\"cp\"\u003e{%\u003c/span\u003e \u003cspan class=\"k\"\u003eendif\u003c/span\u003e \u003cspan class=\"cp\"\u003e%}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e{%\u003c/span\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"nv\"\u003ep\u003c/span\u003e \u003cspan class=\"k\"\u003ein\u003c/span\u003e \u003cspan class=\"nv\"\u003efilter\u003c/span\u003e\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;published == true\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e)[:\u003c/span\u003e\u003cspan class=\"m\"\u003e5\u003c/span\u003e\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"cp\"\u003e%}\u003c/span\u003e\u003cspan class=\"x\"\u003e- \u003c/span\u003e\u003cspan class=\"cp\"\u003e{{\u003c/span\u003e \u003cspan class=\"nv\"\u003ep.Title\u003c/span\u003e \u003cspan class=\"cp\"\u003e}}{%\u003c/span\u003e \u003cspan class=\"k\"\u003eendfor\u003c/span\u003e \u003cspan class=\"cp\"\u003e%}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e{%\u003c/span\u003e \u003cspan class=\"k\"\u003ewith\u003c/span\u003e \u003cspan class=\"nv\"\u003epost.image\u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"nf\"\u003emedia_url\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\u003cspan class=\"nv\"\u003epost.video\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"nv\"\u003em\u003c/span\u003e \u003cspan class=\"cp\"\u003e%}{%\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"nv\"\u003em\u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"nf\"\u003eis_video\u003c/span\u003e \u003cspan class=\"cp\"\u003e%}\u003c/span\u003e\u003cspan class=\"x\"\u003e\u0026lt;video src=\u0026#34;\u003c/span\u003e\u003cspan class=\"cp\"\u003e{{\u003c/span\u003e \u003cspan class=\"nv\"\u003em\u003c/span\u003e \u003cspan class=\"cp\"\u003e}}\u003c/span\u003e\u003cspan class=\"x\"\u003e\u0026#34;\u0026gt;\u003c/span\u003e\u003cspan class=\"cp\"\u003e{%\u003c/span\u003e \u003cspan class=\"k\"\u003eendif\u003c/span\u003e \u003cspan class=\"cp\"\u003e%}{%\u003c/span\u003e \u003cspan class=\"k\"\u003eendwith\u003c/span\u003e \u003cspan class=\"cp\"\u003e%}\u003c/span\u003e\u003cspan class=\"x\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003ejinja_md\u003c/code\u003e plugin = jinja-in-markdown equivalent; gated per-post by \u003ccode\u003ejinja: true\u003c/code\u003e frontmatter. \u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/plugins.md\"\u003eplugins.md\u003c/a\u003e, \u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/spec/spec/CONTENT.md\"\u003espec/CONTENT.md\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eMigration note:\u003c/strong\u003e \u003ccode\u003emarkata-go migrate templates\u003c/code\u003e checks pongo2 compat, but Jinja2↔pongo2 differences (e.g. \u003ccode\u003e{% with %}\u003c/code\u003e, macro support gaps, different autoescape behavior) mean the 30 templates in \u003ccode\u003etemplates/\u003c/code\u003e need manual review. Verified live: \u003ccode\u003etemplates/base_head.html\u003c/code\u003e \u003ccode\u003e{% include \u0026quot;head.html\u0026quot; %}\u003c/code\u003e fails (file absent — Python markata may have supplied it) and poisons the whole project-template chain → 697 parse errors → every page falls back to built-in theme.\u003c/p\u003e\n\u003ch2 id=\"7-feature-parity-vs-this-site-s-python-plugins\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e7. Feature parity vs this site’s Python plugins\u003c/span\u003e \u003ca href=\"#7-feature-parity-vs-this-site-s-python-plugins\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003ePython markata feature/plugin\u003c/th\u003e\n\u003cth\u003emarkata-go equivalent\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\u003e\u003ccode\u003eplugins.password_protection\u003c/code\u003e (client-side decrypt)\u003c/td\u003e\n\u003ctd\u003e\u003cstrong\u003e\u003ccode\u003eencryption\u003c/code\u003e plugin + CLI.\u003c/strong\u003e \u003ccode\u003e[markata-go.encryption]\u003c/code\u003e, \u003ccode\u003eprivate_tags\u003c/code\u003e map tag/\u003cstrong\u003etemplateKey\u003c/strong\u003e→key name, keys from env vars, \u003ccode\u003eenforce_strength\u003c/code\u003e, \u003ccode\u003emin_password_length\u003c/code\u003e, \u003ccode\u003edefault_key\u003c/code\u003e; \u003ccode\u003emarkata-go encryption check/generate-password/encrypt-posts\u003c/code\u003e; \u003ccode\u003eprivate: true\u003c/code\u003e frontmatter + robots.txt; encrypted cards on feed pages; plaintext-leak sealing. Configured in this repo\u0026rsquo;s \u003ccode\u003emarkata-go.toml\u003c/code\u003e (\u003ccode\u003eprotected-post = \u0026quot;default\u0026quot;\u003c/code\u003e, key via \u003ccode\u003eMARKATA_GO_ENCRYPTION_KEY_DEFAULT\u003c/code\u003e); both protected posts verified encrypted in \u003ccode\u003emarkout-go\u003c/code\u003e.\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"https://github.com/WaylonWalker/markata-go/releases/tag/v0.7.0\"\u003ev0.7.0\u003c/a\u003e, \u003ca href=\"https://github.com/WaylonWalker/markata-go/releases/tag/v0.8.0\"\u003ev0.8.0\u003c/a\u003e, \u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/docs/guides/encryption.md\"\u003eencryption.md\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eplugins.wikilinks_hover\u003c/code\u003e (disabled here)\u003c/td\u003e\n\u003ctd\u003e\u003cstrong\u003e\u003ccode\u003ewikilink_hover\u003c/code\u003e — built-in, enabled by default\u003c/strong\u003e since v0.7.0; renders \u003ccode\u003edata-title\u003c/code\u003e/\u003ccode\u003edata-description\u003c/code\u003e/\u003ccode\u003edata-date\u003c/code\u003e on \u003ccode\u003e.wikilink\u003c/code\u003e anchors. Verified in this site\u0026rsquo;s build output.\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"https://github.com/WaylonWalker/markata-go/releases/tag/v0.7.0\"\u003ev0.7.0\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eplugins.md_video\u003c/code\u003e (\u003ccode\u003e![]()\u003c/code\u003e→\u003ccode\u003e\u0026lt;video\u0026gt;\u003c/code\u003e)\u003c/td\u003e\n\u003ctd\u003e\u003cstrong\u003eBuilt-in \u003ccode\u003emd_video\u003c/code\u003e plugin\u003c/strong\u003e (same name) exists in markata-go; also \u003ccode\u003eyoutube\u003c/code\u003e plugin (URL-on-own-line → lite/nocookie embed), \u003ccode\u003eembeds\u003c/code\u003e (oEmbed, Obsidian `\u003c!-- embed not found: file --\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e![[file]]\u003ccode\u003e), \u003c/code\u003eis_video\u003ccode\u003e/\u003c/code\u003emedia_url` filters.\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/plugins.md\"\u003eplugins.md\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eplugins.analytics\u003c/code\u003e (disabled here)\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003estats\u003c/code\u003e plugin (post/feed/site stats), \u003ccode\u003econtribution-graph\u003c/code\u003e fenced block, chartjs blocks; analytics guide at \u003ccode\u003edocs/guides/analytics.md\u003c/code\u003e.\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/plugins.md\"\u003eplugins.md\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eplugins.build_thoughts\u003c/code\u003e (custom: builds thoughts feed from external API)\u003c/td\u003e\n\u003ctd\u003e\u003cstrong\u003eNo equivalent.\u003c/strong\u003e \u003ccode\u003eimport\u003c/code\u003e command only does RSS/Atom/JSONFeed — thoughts API has no feed endpoint (verified: \u003ccode\u003e/feed.json\u003c/code\u003e → 404). Port as pre-build script generating \u003ccode\u003epages/thoughts/*.md\u003c/code\u003e (fix \u003ccode\u003escripts/sync-thoughts.py\u003c/code\u003e — wrong output dir, no frontmatter), or keep calling it before builds.\u003c/td\u003e\n\u003ctd\u003ethis repo \u003ccode\u003eplugins/build_thoughts.py\u003c/code\u003e, \u003ccode\u003escripts/sync-thoughts.py\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emarkata.plugins.prevnext\u003c/code\u003e (disabled here)\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eprevnext\u003c/code\u003e built-in (Collect stage).\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/plugins.md\"\u003eplugins.md\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emarkata.plugins.publish_source\u003c/code\u003e (enabled here — serves \u003ccode\u003e.md\u003c/code\u003e/\u003ccode\u003e.txt\u003c/code\u003e sources)\u003c/td\u003e\n\u003ctd\u003eFeed \u003ccode\u003emarkdown\u003c/code\u003e/\u003ccode\u003etext\u003c/code\u003e output formats cover per-feed sources; per-post \u003ccode\u003e.md\u003c/code\u003e source publishing unconfirmed.\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"https://pkg.go.dev/github.com/WaylonWalker/markata-go\"\u003epkg.go.dev feed formats\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emarkata.plugins.service_worker\u003c/code\u003e (disabled here)\u003c/td\u003e\n\u003ctd\u003eNot in built-in plugin list. \u003cstrong\u003eProbably absent.\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/plugins.md\"\u003eplugins.md\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emarkata.plugins.manifest\u003c/code\u003e / PWA fields\u003c/td\u003e\n\u003ctd\u003ePWA config keys exist (\u003ccode\u003etheme_color\u003c/code\u003e, \u003ccode\u003estart_url\u003c/code\u003e, \u003ccode\u003edisplay\u003c/code\u003e, \u003ccode\u003eshort_name\u003c/code\u003e…); a dedicated manifest.json writer not confirmed in plugin list.\u003c/td\u003e\n\u003ctd\u003ethis repo\u0026rsquo;s markata-go.toml, \u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/docs/guides/configuration.md\"\u003econfiguration.md\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eRSS\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003erss\u003c/code\u003e/\u003ccode\u003eatom\u003c/code\u003e/\u003ccode\u003ejsonfeed\u003c/code\u003e write-stage plugins + per-feed formats + head \u003ccode\u003ealternate_feeds\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/plugins.md\"\u003eplugins.md\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSitemap\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003esitemap\u003c/code\u003e plugin + per-feed sitemap format\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/plugins.md\"\u003eplugins.md\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e404 page\u003c/td\u003e\n\u003ctd\u003eBuilt-in 404 mechanism w/ slug suggestions + live-search fallback (v0.7.0); \u003ccode\u003edidyoumean\u003c/code\u003e-style suggestions\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"https://github.com/WaylonWalker/markata-go/releases/tag/v0.7.0\"\u003ev0.7.0\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eCovers / OG images\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003estructured_data\u003c/code\u003e (JSON-LD/OG/Twitter), \u003ccode\u003eog_image\u003c/code\u003e frontmatter, themed OG card templates, \u003ccode\u003eog_image_service\u003c/code\u003e screenshot-based OG images\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/plugins.md\"\u003eplugins.md\u003c/a\u003e, \u003ca href=\"https://github.com/WaylonWalker/markata-go/releases/tag/v0.7.0\"\u003ev0.7.0\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ejinja_md\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ejinja_md\u003c/code\u003e built-in (\u003ccode\u003ejinja: true\u003c/code\u003e frontmatter)\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/plugins.md\"\u003eplugins.md\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eredirects\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eredirects\u003c/code\u003e write plugin\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/plugins.md\"\u003eplugins.md\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emarkata summary\u003c/code\u003e TUI counts\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003emarkata-go tui\u003c/code\u003e + \u003ccode\u003elist\u003c/code\u003e/\u003ccode\u003esearch\u003c/code\u003e cover similar ground\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/cli.md\"\u003ecli.md\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eheading_link\u003c/code\u003e permalinks\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eheading_anchors\u003c/code\u003e built-in\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/plugins.md\"\u003eplugins.md\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSearch\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003epagefind\u003c/code\u003e built-in (skipped by \u003ccode\u003e--fast\u003c/code\u003e); optional bleve/searchcraft work in flight\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/plugins.md\"\u003eplugins.md\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eBundled agent skill for site repos\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003emarkata-go agent install\u003c/code\u003e ships a \u003ccode\u003emarkata-go-site\u003c/code\u003e skill (SKILL.md + topics/reference/examples)\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003espec/spec/AGENTS.md\u003c/code\u003e, \u003ccode\u003emarkata-go agent --help\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eExtras not in Python version\u003c/td\u003e\n\u003ctd\u003etailwind CDN automation, cdn_assets vendoring, mermaid, chartjs, glossary, series, webmentions, blogroll/reader, garden view w/ knowledge graph, mentions, link_collector/link graph, keyboard nav, view transitions, random_post, image optimization, LSP, serve control center\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/plugins.md\"\u003eplugins.md\u003c/a\u003e, release notes\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"8-extensibility\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e8. Extensibility\u003c/span\u003e \u003ca href=\"#8-extensibility\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eBuilt-in plugin set is large (30+) and configurable via \u003ccode\u003ehooks\u003c/code\u003e/\u003ccode\u003edisabled_hooks\u003c/code\u003e (\u003ccode\u003ehooks = [\u0026quot;default\u0026quot;, \u0026quot;python_docs\u0026quot;]\u003c/code\u003e style). \u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/plugins.md\"\u003eplugins.md\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTrue external plugins: Go-only and effectively compile-time.\u003c/strong\u003e \u003ccode\u003epkg/plugins/registry.go\u003c/code\u003e registers built-ins. The practical paths: \u003cstrong\u003efork + recompile\u003c/strong\u003e (we already build from source via \u003ccode\u003ego install\u003c/code\u003e), or template/jinja_md + config for most needs. There\u0026rsquo;s a \u003ccode\u003edocs/guides/plugin-development.md\u003c/code\u003e and an agent-skill topic \u003ccode\u003eplugin-creation.md\u003c/code\u003e. \u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/spec/spec/PLUGINS.md\"\u003espec/PLUGINS.md\u003c/a\u003e, \u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/CONTRIBUTING.md\"\u003eCONTRIBUTING.md\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ePolicy: PRs not accepted — so a needed feature means a fork or an issue request. \u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/CONTRIBUTING.md\"\u003eCONTRIBUTING.md\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eEscape hatches: \u003ccode\u003ejinja_md\u003c/code\u003e for computed content, \u003ccode\u003econfig_overrides\u003c/code\u003e per post, \u003ccode\u003eimport\u003c/code\u003e command, feed \u003ccode\u003emarkdown\u003c/code\u003e/\u003ccode\u003etext\u003c/code\u003e outputs, \u003ccode\u003e::: name\u003c/code\u003e containers, env-var-driven scripts pre-build.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"9-development-pace-maturity\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e9. Development pace \u0026amp; maturity\u003c/span\u003e \u003ca href=\"#9-development-pace-maturity\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eRepo created \u003cstrong\u003e2026-01-22\u003c/strong\u003e; releases: v0.4.0 (2026-01-24), v0.5.0 (~01-25), v0.6.0 (01-31), v0.7.0 (02-19), v0.8.0 (02-21), v0.9.0, v0.10.0 (04-20), … v0.13.0 (2026-10-02) — \u003cstrong\u003eroughly monthly minors, hundreds of commits each\u003c/strong\u003e (v0.9→v0.10 = 772 commits). \u003ca href=\"https://pkg.go.dev/github.com/WaylonWalker/markata-go\"\u003epkg.go.dev versions\u003c/a\u003e, \u003ca href=\"https://github.com/WaylonWalker/markata-go/releases\"\u003ereleases\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eSelf-described \u003cstrong\u003e\u0026ldquo;Beta (0.x) — API may change between minor versions\u0026rdquo;\u003c/strong\u003e; release notes explicitly warn to smoke-test custom templates/themes on upgrade. \u003ca href=\"https://github.com/WaylonWalker/markata-go\"\u003eREADME\u003c/a\u003e, \u003ca href=\"https://github.com/WaylonWalker/markata-go/releases\"\u003ev0.9.0 notes\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eWaylon dogfoods heavily:\u003c/strong\u003e waylonwalker.com homepage says \u0026ldquo;Building markata-go, the engine behind this site\u0026rdquo;; \u003ccode\u003ego.waylonwalker.com\u003c/code\u003e is live; repo \u003ccode\u003eWaylonWalker/waylonwalker.com\u003c/code\u003e has \u003ccode\u003emarkata-go.toml\u003c/code\u003e + split \u003ccode\u003econfig/*.toml\u003c/code\u003e; he runs a \u0026ldquo;builder admin\u0026rdquo; for live builds and edits via \u003ccode\u003emd.waylonwalker.com\u003c/code\u003e. \u003ca href=\"https://waylonwalker.com//\"\u003ehomepage\u003c/a\u003e, \u003ca href=\"https://github.com/WaylonWalker/waylonwalker.com\"\u003ewaylonwalker.com repo\u003c/a\u003e, \u003ca href=\"https://waylonwalker.com/shots/new-fast-mode-in-markata-go-is-fun/\"\u003efast-mode post\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eCommunity: 2 stars, 2 forks, 51 open issues, 2 contributors — \u003cstrong\u003esolo project\u003c/strong\u003e, not open to PRs. \u003ca href=\"https://github.com/WaylonWalker/markata-go\"\u003erepo\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eEcosystem extras already in flight: LSP (\u003ccode\u003emarkata-go lsp\u003c/code\u003e), TUI, agent-skill bundle, \u003ca href=\"/helm/\" class=\"glossary-term\" title=\"helm - package manager for k8s\" data-hover-title=\"helm\"\u003ehelm\u003c/a\u003e/k8s deploy docs, builder-admin service, local admin CMS issue (#986). \u003ca href=\"https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/cli.md\"\u003ecli.md\u003c/a\u003e, \u003ca href=\"https://github.com/WaylonWalker/markata-go/issues\"\u003eissues\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"10-known-gotchas-issues-observed\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e10. Known gotchas (issues + observed)\u003c/span\u003e \u003ca href=\"#10-known-gotchas-issues-observed\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003emarkata-go migrate\u003c/code\u003e can emit invalid TOML\u003c/strong\u003e for nested Python config sections (\u003ccode\u003eauto_description\u003c/code\u003e) — validate with \u003ccode\u003econfig validate\u003c/code\u003e. \u003ca href=\"https://github.com/WaylonWalker/waylonwalker.com/issues/20\"\u003ewaylonwalker.com#20\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSlug mode changes URLs\u003c/strong\u003e: \u003ccode\u003epath\u003c/code\u003e/\u003ccode\u003ehybrid\u003c/code\u003e modes change URL structure — \u0026ldquo;review links and redirects before switching\u0026rdquo;. \u003ca href=\"https://github.com/WaylonWalker/markata-go/releases\"\u003ev0.9.0 notes\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTailwind managed preflight off by default\u003c/strong\u003e since v0.9.0 — sites depending on it must re-enable. \u003ca href=\"https://github.com/WaylonWalker/markata-go/releases\"\u003ev0.9.0 notes\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e0.x breaking changes are routine\u003c/strong\u003e — pin the version (\u003ccode\u003eeget\u003c/code\u003e/mise pin, or \u003ccode\u003ego install …@vX.Y.Z\u003c/code\u003e), smoke-test templates on upgrade. \u003ca href=\"https://github.com/WaylonWalker/markata-go\"\u003eREADME\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eEncryption pitfalls were real (plaintext leaks, missing decryption assets on feed pages) — fixed in v0.8.0; keep the version ≥0.8 and read \u003ccode\u003edocs/guides/encryption.md\u003c/code\u003e before relying on it. \u003ca href=\"https://github.com/WaylonWalker/markata-go/releases/tag/v0.8.0\"\u003ev0.8.0\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eOptional theme assets (lite-yt CSS/JS, GLightbox, mermaid, webmentions, encryption) loaded site-wide rather than per-need — cosmetic/perf, open issue \u003ca href=\"https://github.com/WaylonWalker/markata-go/issues/980\"\u003e#980\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003epongo2 ≠ Jinja2: \u003ccode\u003emigrate templates\u003c/code\u003e is a checker, not a rewriter — expect manual edits to custom templates.\u003c/li\u003e\n\u003cli\u003eCase sensitivity in templates (\u003ccode\u003epost.Title\u003c/code\u003e vs \u003ccode\u003epost.title\u003c/code\u003e) has churned — check the agent-skill \u003ccode\u003etemplate-context\u003c/code\u003e reference and test.\u003c/li\u003e\n\u003cli\u003ePrivate posts stay out of \u003ccode\u003eauto_feeds\u003c/code\u003e public tag feeds — intended behavior, don\u0026rsquo;t be surprised if private-tagged posts are missing from tag pages. \u003ca href=\"https://github.com/WaylonWalker/markata-go/pull/979\"\u003ePR #979\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eEnv var for encryption keys is \u003ccode\u003eMARKATA_GO_ENCRYPTION_KEY_DEFAULT\u003c/code\u003e (not \u003ccode\u003e_DEFAULT_KEY\u003c/code\u003e as the spec table says) — verified by build error message.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"migration-risk-summary-for-pype-dev\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMIGRATION RISK SUMMARY (for pype.dev)\u003c/span\u003e \u003ca href=\"#migration-risk-summary-for-pype-dev\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003ePorts cleanly (verified in local markout-go build):\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eAll feed \u003ccode\u003efilter\u003c/code\u003e strings — same Python-like expression language; all 17 feeds generated (192 output dirs incl. archive/variants).\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003epublished\u003c/code\u003e/\u003ccode\u003edraft\u003c/code\u003e frontmatter semantics, \u003ccode\u003etags\u003c/code\u003e, \u003ccode\u003etemplateKey\u003c/code\u003e filtering, \u003ccode\u003eYYYY-MM-DD HH:MM:SS\u003c/code\u003e dates.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e!!!\u003c/code\u003e/\u003ccode\u003e???\u003c/code\u003e/\u003ccode\u003e???+\u003c/code\u003e admonitions for whitelisted types, \u003ccode\u003e[[slug]]\u003c/code\u003e \u003cstrong\u003eand\u003c/strong\u003e \u003ccode\u003e[[ slug ]]\u003c/code\u003e spaced wikilinks (resolve + hover previews), GFM tables, typographer, heading anchors, syntax highlighting.\u003c/li\u003e\n\u003cli\u003eNav, RSS/Atom/JSON per feed, sitemap, 404, prevnext, OG/structured data, pagefind search, tailwind automation.\u003c/li\u003e\n\u003cli\u003eEncryption: \u003ccode\u003etemplateKey: protected-post\u003c/code\u003e posts encrypted via \u003ccode\u003eprivate_tags\u003c/code\u003e map + \u003ccode\u003eMARKATA_GO_ENCRYPTION_KEY_DEFAULT\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eNeeds custom work:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eCustom admonition types\u003c/strong\u003e (\u003ccode\u003escripture\u003c/code\u003e ×70, \u003ccode\u003ebackground-thought\u003c/code\u003e ×14, \u003ccode\u003esource\u003c/code\u003e ×2) — hardcoded whitelist, no PRs accepted → file upstream issue and/or codemod to a supported type (e.g. \u003ccode\u003equote\u003c/code\u003e) with matching title.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eplugins/build_thoughts.py\u003c/code\u003e\u003c/strong\u003e — pre-build script writing \u003ccode\u003epages/thoughts/*.md\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e30 Jinja templates\u003c/strong\u003e — every \u003ccode\u003emarkata.config.*\u003c/code\u003e/\u003ccode\u003epost.*\u003c/code\u003e var reference needs rewriting to the go context; the \u003ccode\u003ehead.html\u003c/code\u003e include alone poisons the chain. Recommendation: adopt the default theme + palette/aesthetic CSS instead of porting.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAdmonition typos in content\u003c/strong\u003e: \u003ccode\u003ewaring\u003c/code\u003e, \u003ccode\u003eScripture\u003c/code\u003e, \u003ccode\u003eExodusds\u003c/code\u003e (were silently unstyled under Python markata too).\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eNo equivalent (probably):\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eCustom Python plugins generally — no Python plugin runtime.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eservice_worker\u003c/code\u003e plugin; per-post \u003ccode\u003epublish_source\u003c/code\u003e (feed-level markdown/text exists); PWA manifest writer unconfirmed.\u003c/li\u003e\n\u003cli\u003ePython-specific filter helpers (\u003ccode\u003etimedelta\u003c/code\u003e, \u003ccode\u003eparse\u003c/code\u003e) — verify in \u003ccode\u003emigrate filter\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\nResearch on [markata-go](https://github.com/WaylonWalker/markata-go), the Go rewrite of the Python [markata](https://markata.dev) static site generator, to support migrating pype.dev. All sources are primary: the GitHub repo (README, `docs/`, `spec/`, releases, issues, commit history), pkg.go.dev, and Waylon's own sites (waylonwalker.com now runs on markata-go; `go.waylonwalker.com` is the deployment).\n\nRepo state as of research date: **v0.13.0, \"Beta (0.x) - API may change between minor versions\"**, created 2026-01-22, 2 stars, 51 open issues, essentially solo-maintained by WaylonWalker (853 contributions) + dependabot. [Source](https://github.com/WaylonWalker/markata-go), [pkg.go.dev](https://pkg.go.dev/github.com/WaylonWalker/markata-go)\n\n**Important caveat:** the project is \"open source but **not open contribution**\" — PRs are not reviewed or merged; bugs/feature requests go through issues only. [CONTRIBUTING.md](https://github.com/WaylonWalker/markata-go/blob/main/CONTRIBUTING.md)\n\n## 1. Installation + CLI\n\n### Install options\n[docs/installation.md](https://github.com/WaylonWalker/markata-go/blob/main/docs/installation.md), [README](https://github.com/WaylonWalker/markata-go)\n\n```bash\n# One-liner (Linux/macOS)\ncurl -sSL https://raw.githubusercontent.com/WaylonWalker/markata-go/main/install.sh | bash\n# (also published at https://waylonwalker.github.io/markata-go/install.sh)\n\n# jpillora installer\ncurl -sL https://i.jpillora.com/WaylonWalker/markata-go | bash\n\n# eget\neget WaylonWalker/markata-go\n\n# mise (from GitHub releases)\nmise use -g github:WaylonWalker/markata-go\n\n# Go install (Go 1.22+; v0.13.0 toolchain reports Go 1.26)\ngo install github.com/WaylonWalker/markata-go/cmd/markata-go@latest\n# or pinned: ...@v0.13.0\n```\n\nDistributed as a single dependency-free binary. `markata-go update` is a built-in self-update command. [v0.5.0 release notes](https://github.com/WaylonWalker/markata-go/releases/tag/v0.5.0)\n\n### CLI commands\n[docs/reference/cli.md](https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/cli.md)\n\nGlobal flags: `-c/--config`, `-m/--merge-config` (repeatable), `-o/--output`, `-q/--quiet`, `-v/--verbose`, `--color/--no-color`, `--log-format`, `--no-input`.\n\n| Command | What it does |\n|---|---|\n| `build` | Full build. Flags: `--clean`, `--dry-run`, `--fast` (skip minify/CSS purge/Tailwind/Pagefind), `--benchmark-json`, `--benchmark-detailed` |\n| `serve` | Dev server + live reload. `-p/--port`, `-H/--host`, `--no-reload`, `--no-watch`, `--open`, `--fast` |\n| `new [title]` | Create post. `--dir`, `--draft`, `--tags`; interactive mode via charmbracelet/huh. Built-in content templates: post, page, docs, article, note, photo, video, link, quote, guide, inline, contact, author |\n| `init` | Scaffold a new site |\n| `config show/get/set/validate/init` | Resolved config in YAML/JSON/TOML; dot-notation get (`feeds.defaults.items_per_page`); `set` preserves formatting |\n| `migrate` | **Python-markata migration tool** (see §2) |\n| `tui` | k9s-style interactive TUI: posts/tags/feeds views, `/` filter expressions |\n| `lsp` / `lsp setup --editor helix` | Language server: wikilink completion, frontmatter completion/hover, diagnostics |\n| `list` | List posts/tags/feeds (`--format table|json|csv|path`, `--filter`, `--feed`) |\n| `search` | Content search: `--filter`, `--fields`, `--fuzzy`, `--limit` |\n| `lint` | Frontmatter/content checks with fixers (incl. natural-language datetime fixing) |\n| `explain \u003ctopic\u003e` | Built-in docs, e.g. `markata-go explain feeds` |\n| `benchmark` | Build benchmarks + pprof |\n| `import` | Import external content (PESOS pattern) |\n| `encryption` | `check`, `generate-password`, `encrypt-posts` subcommands |\n| `aesthetic` | Theme/aesthetic tooling |\n| `agent` | Install/doctor bundled agent-skill integrations (`agent doctor` drift-checks installed skill) |\n| `blogroll` | Blogroll commands incl. `blogroll update` |\n| `version` | `--short` supported |\n\n## 2. Config format\n\n### File discovery\nmarkata-go does **not** auto-read `markata.toml`. It looks for (first found wins): `./markata-go.toml`, `./markata-go.yaml`, `./markata-go.yml`, `./markata-go.json`, `.markata-go.*`, `~/.config/markata-go/config.toml`, or `--config`/`--merge-config`. [configuration.md](https://github.com/WaylonWalker/markata-go/blob/main/docs/guides/configuration.md), [cli.md](https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/cli.md)\n\nAll config is namespaced under `[markata-go]` (also accepts YAML/JSON). Env overrides use `MARKATA_GO_` prefix (e.g. `MARKATA_GO_OUTPUT_DIR=dist`). Config `include = [...]` supports splitting config across files; `[[markata-go.feeds]]` merges by `slug`. [configuration.md](https://github.com/WaylonWalker/markata-go/blob/main/docs/guides/configuration.md)\n\n### Core schema (`[markata-go]`)\n`output_dir` (default `\"output\"`), `url`, `title`, `description`, `author`, `license`, `assets_dir` (default `\"static\"`), `templates_dir` (default `\"templates\"`), `hooks` (default `[\"default\"]`), `disabled_hooks`, `concurrency` (0=auto). PWA-ish fields also present in the schema: `icon`, `lang`, `theme_color`, `background_color`, `start_url`, `display`, `short_name`, `site_name`, `repo_url`, `repo_branch`, `twitter_card`, `twitter_handle`/`twitter_site`, `rss_description`, `site_version`. [configuration.md](https://github.com/WaylonWalker/markata-go/blob/main/docs/guides/configuration.md) + this repo's own `markata-go.toml` which already carries them.\n\nOther sections seen in docs: `[markata-go.glob]` (`patterns` default `[\"pages/**/*.md\",\"posts/**/*.md\"]`, `use_gitignore`, `slug_mode`, `slug_rules`), `[markata-go.markdown]` + `[markata-go.markdown.highlight]`, `[markata-go.wikilinks]` (`warn_broken`, `strict_wikilinks` under `[markata-go]`), `[markata-go.theme]`, `[markata-go.feed_defaults]`, `[[markata-go.feeds]]`, `[[markata-go.nav]]` (`label`, `url`, `external`), `[markata-go.components.nav]`, `[markata-go.sidebar]`/`[[markata-go.sidebar.nav]]`, `[markata-go.encryption]`, `[embeds]`, `[markata-go.head]` + `[[markata-go.head.alternate_feeds]]`, `[markata-go.blogroll]`, `[content_templates]`. [configuration.md](https://github.com/WaylonWalker/markata-go/blob/main/docs/guides/configuration.md)\n\n### Migration tooling — `markata-go migrate`\n[cli.md](https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/cli.md)\n\n```bash\nmarkata-go migrate                          # full analysis\nmarkata-go migrate --dry-run\nmarkata-go migrate config -i markata.toml -o markata-go.toml   # also accepts pyproject.toml\nmarkata-go migrate filter \"templateKey in ['blog', 'til']\"     # check a filter expression\nmarkata-go migrate templates [path]                           # check pongo2 compat\n```\n\nExit codes: 0 clean, 1 warnings, 2 incompatibilities, 3 error. There is a `docs/guides/migration.md` in the repo.\n\n**Known bug:** the migrate tool has emitted invalid TOML (nested `[markata-go.description.description]` tables from a `[markata.auto_description.description]`-style Python config) — [WaylonWalker/waylonwalker.com issue #20](https://github.com/WaylonWalker/waylonwalker.com/issues/20), supposedly fixed by `fix(migrate): generate valid TOML for string fields (#208)` in [v0.5.0](https://github.com/WaylonWalker/markata-go/releases/tag/v0.5.0). Always run `markata-go config validate` after migrating.\n\nThis repo's `markata-go.toml` already exists and appears to be migrate-tool output — feed filter strings carried over verbatim, `page_size` preserved.\n\n## 3. Markdown features\n\nEngine: **goldmark** (deps include `yuin/goldmark`, `goldmark-highlighting`, `goldmark-emoji`, `goldmark-figure`, `goldmark-anchor`, CJK ext, `abhg.dev/goldmark/*`). [pkg.go.dev deps](https://pkg.go.dev/github.com/WaylonWalker/markata-go), [v0.10.0 changelog](https://github.com/WaylonWalker/markata-go/compare/v0.9.0...v0.10.0)\n\nConfig: `[markata-go.markdown] extensions = [\"tables\",\"strikethrough\",\"autolinks\",\"tasklist\"]`; spec also lists `typographer` (smart quotes, **default true**), `definition_list`, `footnote`. [configuration.md](https://github.com/WaylonWalker/markata-go/blob/main/docs/guides/configuration.md), [spec/CONTENT.md](https://github.com/WaylonWalker/markata-go/blob/main/spec/spec/CONTENT.md)\n\n- **Admonitions `!!!`:** supported via a goldmark extension in the render stage. **Verified against source: types are a hardcoded whitelist** — `note, info, tip, hint, success, warning, caution, important, danger, error, bug, example, quote, abstract, aside, seealso, reminder, attention, todo, settings, vsplit, chat, chat-reply` (`admonitionTypes` map in `pkg/plugins/admonitions.go`). Unknown types are NOT parsed — they render as literal paragraphs. `!!! scripture` / `!!! background-thought` do **not** work. Confirmed live: `???+ success` in this repo rendered `\u003cdetails class=\"admonition success\" open\u003e` while `!!! scripture` rendered literal text. No config option for custom types exists. [plugins.md](https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/plugins.md), [markdown.md](https://github.com/WaylonWalker/markata-go/blob/main/docs/guides/markdown.md), `pkg/plugins/admonitions.go:17`\n- **Collapsible `???` / `???+`:** supported (`???` collapsed, `???+` open), renders native `\u003cdetails\u003e/\u003csummary\u003e`. [markdown.md](https://github.com/WaylonWalker/markata-go/blob/main/docs/guides/markdown.md)\n- **Wikilinks:** `[[slug]]`, `[[slug|text]]`, `[[slug#fragment]]`, `[[slug#frag|text]]`; case-insensitive slug lookup, then `aliases` frontmatter (synonyms: `alias`, `handle`, `handles`); unresolved → rendered literal + `wikilink_warnings` in `post.Extra`; `strict_wikilinks = true` fails the build. **`[[ slug ]]` WITH SPACES WORKS** — `wikilinks.go:151` does `strings.TrimSpace(groups[1])`, verified against this repo's build output (spaced daily-note links resolve with full hover-preview data attributes). [plugins.md](https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/plugins.md), `pkg/plugins/wikilinks.go:151`\n- **Attrs `{#id .class}`:** supported — spec shows `![alt](img.png){.shadow .bordered}`, `*em*{.accent}`, `` `code`{.inline-code} ``, `[[link]]{.wikilink-pill}`, `{#hero-image}`. [spec/CONTENT.md](https://github.com/WaylonWalker/markata-go/blob/main/spec/spec/CONTENT.md)\n- **Code highlighting:** goldmark-highlighting (chroma); `[markata-go.markdown.highlight] theme = \"dracula\"`, `line_numbers`. [markdown.md](https://github.com/WaylonWalker/markata-go/blob/main/docs/guides/markdown.md)\n- **Tables:** via `tables` extension. Typographer/smart quotes: `typographer = true` default in spec. [configuration.md](https://github.com/WaylonWalker/markata-go/blob/main/docs/guides/configuration.md), [spec/CONTENT.md](https://github.com/WaylonWalker/markata-go/blob/main/spec/spec/CONTENT.md)\n- **Heading anchors/permalinks:** `heading_anchors` plugin + `goldmark-anchor`; TOC plugin (`toc`, `post.Extra.toc_html`). [plugins.md](https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/plugins.md)\n- **Markdown containers:** generic `::: name` fenced divs with `{#id .class data-attr}` — a possible escape hatch for admonition-like custom blocks (no title/collapse semantics). [markdown-containers.md](https://github.com/WaylonWalker/markata-go/blob/main/docs/guides/markdown-containers.md)\n- **Extras present:** mermaid (incl. lightbox/pan-zoom, CLI/Chromium pre-render), chartjs fenced blocks, `contribution-graph` fenced block, csv_fence, glossary, webawesome components, Obsidian-style `\u003c!-- embed not found: attachment --\u003e\n![[attachment]]` embeds, oEmbed external link cards. [plugins.md](https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/plugins.md), [v0.7.0](https://github.com/WaylonWalker/markata-go/releases/tag/v0.7.0)\n\n## 4. Frontmatter\n\n[frontmatter.md](https://github.com/WaylonWalker/markata-go/blob/main/docs/guides/frontmatter.md), [plugins.md load section](https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/plugins.md), [spec/DATA_MODEL.md](https://github.com/WaylonWalker/markata-go/blob/main/spec/spec/DATA_MODEL.md)\n\nBuilt-in fields: `title`, `slug`, `date` (+ `modified`, and date aliases for cross-SSG compat), `published` (default **false**), `draft` (never rendered), `skip`, `tags`, `description` (auto-generated if absent), `template` (default `post.html`; also object form `{default:, card:, feed:}`), `aliases`, `authors`/`author`/`writer`, `image`/`video`/`cover_image`/`thumbnail`/`og_image`/`hero_video`, `private`, `jinja` (bool gate for jinja_md), `config_overrides`, `css_class`. Unknown fields land in `Extra` and are filterable (`Extra.series == 'X'`).\n\n- **`published` semantics match Python markata:** `false` = rendered but excluded from feeds/sitemap/RSS (\"shadow page\"); `true` = included. `draft: true` = not rendered at all.\n- **`templateKey`:** still a real field — filters like `templateKey in ['blog-post']` are used in migrate docs, and `encryption.private_tags` matches against templateKey as well as tags. [cli.md migrate section](https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/cli.md), [v0.8.0 changelog](https://github.com/WaylonWalker/markata-go/releases/tag/v0.8.0)\n- **Slugs:** auto-generated from filename by default (`flat` mode): lowercase, spaces→hyphens, strip special chars, collapse hyphens. `[markata-go.glob] slug_mode = \"flat\" | \"path\"` plus per-prefix `[[markata-go.glob.slug_rules]]` (longest prefix wins) — the \"hybrid\" v0.9.0 capability. `index.md`/`README.md` map to directory root; `slug: \"\"` or `/` = homepage; frontmatter `slug` always wins; nested `slug: \"a/b\"` allowed; leading/trailing slashes stripped. [configuration.md](https://github.com/WaylonWalker/markata-go/blob/main/docs/guides/configuration.md), [spec/DATA_MODEL.md](https://github.com/WaylonWalker/markata-go/blob/main/spec/spec/DATA_MODEL.md)\n- **Dates:** accepts RFC3339, `YYYY-MM-DD HH:MM:SS`, `YYYY-MM-DD`, US `01/15/2024`, European `15-01-2024`, `January 15, 2024`, `Jan 15, 2024`. [plugins.md](https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/plugins.md)\n\n## 5. Feeds + filter language\n\n**Filters are Python-like expressions — the same syntax family as Python markata.** This site's existing filters port verbatim. [frontmatter.md](https://github.com/WaylonWalker/markata-go/blob/main/docs/guides/frontmatter.md), [spec/DATA_MODEL.md](https://github.com/WaylonWalker/markata-go/blob/main/spec/spec/DATA_MODEL.md)\n\n```toml\nfilter = \"published == True\"\nfilter = \"draft == False\"\nfilter = \"'go' in tags\"\nfilter = \"date \u003e= '2024-01-01' and date \u003c '2025-01-01'\"\nfilter = \"slug.startswith('tutorials/')\"\nfilter = \"template == 'tutorial.html'\"\nfilter = \"Extra.series == 'Web Scraping with Go'\"\nfilter = \"published == True and ('go' in tags or 'python' in tags)\"\nfilter = \"not draft\"\n```\n\nOperators: `==` `!=` `\u003e` `\u003e=` `\u003c` `\u003c=` `in` `and` `or` `not`; string methods `startswith`, `lower().contains(...)`; built-ins `today`, `now`, `True`, `False`, `None`; `date(2024,1,1)` constructor in spec. (Python markata extras `timedelta`/`parse` not confirmed — check `migrate filter`.) Note the TUI/CLI search uses a slightly different dialect (`tags contains \"go\"`, `title startswith \"How\"`).\n\n### Feed config\n[pkg.go.dev README](https://pkg.go.dev/github.com/WaylonWalker/markata-go)\n\n```toml\n[markata-go.feed_defaults]\nitems_per_page = 10\norphan_threshold = 3\n[markata-go.feed_defaults.formats]\nhtml = true\nrss = true\natom = false\njson = false\n[markata-go.feed_defaults.templates]\nhtml = \"feed.html\"\ncard = \"card.html\"\n\n[[markata-go.feeds]]\nslug = \"blog\"            # slug = \"\" → homepage index.html\ntitle = \"Blog\"\ndescription = \"All blog posts\"\nfilter = \"published == True\"\nsort = \"date\"            # or \"Extra.series_order\" etc.\nreverse = true\nitems_per_page = 10\n[markata-go.feeds.formats]\nhtml = true\nrss = true\natom = true\njson = true\n```\n\nFormats per feed: `html` → `/{slug}/index.html` (paginated), `rss` → `/{slug}/rss.xml`, `atom` → `atom.xml`, `json` → `feed.json`, `markdown` → `index.md`, `text` → `index.txt`, plus a `sitemap` per-feed format. Pagination via `items_per_page`/`page_size`, `orphan_threshold`. `auto_feeds` generates per-tag feeds automatically. [pkg.go.dev](https://pkg.go.dev/github.com/WaylonWalker/markata-go), [v0.10.0 changelog](https://github.com/WaylonWalker/markata-go/releases/tag/v0.10.0)\n\n## 6. Templates\n\nEngine: **pongo2** (\"Jinja2-like\") — `{{ }}`, `{% %}` syntax, `|safe` etc. [pkg.go.dev](https://pkg.go.dev/github.com/WaylonWalker/markata-go)\n\nLookup order for `post.template`: project `templates/` dir → theme templates → default theme fallback. Missing template → raw `article_html`. [frontmatter.md](https://github.com/WaylonWalker/markata-go/blob/main/docs/guides/frontmatter.md), [plugins.md](https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/plugins.md)\n\nTemplate context: `post`, `body` (= `post.ArticleHTML`), `config`, `core`; in jinja_md content templates also `posts`, `filter`, `map`, `today`, `now`. Field access is Go-style exported names in examples (`post.Title`, `post.Date.Format`, `post.Extra.toc_html`) — but template-variable casing has been a moving target (documented in agent-skill commit c7923e3); pongo2 generally resolves case-insensitively. Custom filters: `media_url`, `is_video`, `length/first/last/sort/reverse/selectattr/map/join/default/upper/lower/title`, `forloop` vars. Template helpers `render_feed`/`feed_posts` exist. [plugins.md](https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/plugins.md), [frontmatter.md media fields](https://github.com/WaylonWalker/markata-go/blob/main/docs/guides/frontmatter.md), [spec/CONTENT.md](https://github.com/WaylonWalker/markata-go/blob/main/spec/spec/CONTENT.md)\n\n```django\n{% if post.Extra.toc_html %}\u003caside\u003e{{ post.Extra.toc_html|safe }}\u003c/aside\u003e{% endif %}\n{% for p in filter(\"published == true\")[:5] %}- {{ p.Title }}{% endfor %}\n{% with post.image|media_url:post.video as m %}{% if m|is_video %}\u003cvideo src=\"{{ m }}\"\u003e{% endif %}{% endwith %}\n```\n\n`jinja_md` plugin = jinja-in-markdown equivalent; gated per-post by `jinja: true` frontmatter. [plugins.md](https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/plugins.md), [spec/CONTENT.md](https://github.com/WaylonWalker/markata-go/blob/main/spec/spec/CONTENT.md)\n\n**Migration note:** `markata-go migrate templates` checks pongo2 compat, but Jinja2↔pongo2 differences (e.g. `{% with %}`, macro support gaps, different autoescape behavior) mean the 30 templates in `templates/` need manual review. Verified live: `templates/base_head.html` `{% include \"head.html\" %}` fails (file absent — Python markata may have supplied it) and poisons the whole project-template chain → 697 parse errors → every page falls back to built-in theme.\n\n## 7. Feature parity vs this site's Python plugins\n\n| Python markata feature/plugin | markata-go equivalent | Source |\n|---|---|---|\n| `plugins.password_protection` (client-side decrypt) | **`encryption` plugin + CLI.** `[markata-go.encryption]`, `private_tags` map tag/**templateKey**→key name, keys from env vars, `enforce_strength`, `min_password_length`, `default_key`; `markata-go encryption check/generate-password/encrypt-posts`; `private: true` frontmatter + robots.txt; encrypted cards on feed pages; plaintext-leak sealing. Configured in this repo's `markata-go.toml` (`protected-post = \"default\"`, key via `MARKATA_GO_ENCRYPTION_KEY_DEFAULT`); both protected posts verified encrypted in `markout-go`. | [v0.7.0](https://github.com/WaylonWalker/markata-go/releases/tag/v0.7.0), [v0.8.0](https://github.com/WaylonWalker/markata-go/releases/tag/v0.8.0), [encryption.md](https://github.com/WaylonWalker/markata-go/blob/main/docs/guides/encryption.md) |\n| `plugins.wikilinks_hover` (disabled here) | **`wikilink_hover` — built-in, enabled by default** since v0.7.0; renders `data-title`/`data-description`/`data-date` on `.wikilink` anchors. Verified in this site's build output. | [v0.7.0](https://github.com/WaylonWalker/markata-go/releases/tag/v0.7.0) |\n| `plugins.md_video` (`![]()`→`\u003cvideo\u003e`) | **Built-in `md_video` plugin** (same name) exists in markata-go; also `youtube` plugin (URL-on-own-line → lite/nocookie embed), `embeds` (oEmbed, Obsidian `\u003c!-- embed not found: file --\u003e\n![[file]]`), `is_video`/`media_url` filters. | [plugins.md](https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/plugins.md) |\n| `plugins.analytics` (disabled here) | `stats` plugin (post/feed/site stats), `contribution-graph` fenced block, chartjs blocks; analytics guide at `docs/guides/analytics.md`. | [plugins.md](https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/plugins.md) |\n| `plugins.build_thoughts` (custom: builds thoughts feed from external API) | **No equivalent.** `import` command only does RSS/Atom/JSONFeed — thoughts API has no feed endpoint (verified: `/feed.json` → 404). Port as pre-build script generating `pages/thoughts/*.md` (fix `scripts/sync-thoughts.py` — wrong output dir, no frontmatter), or keep calling it before builds. | this repo `plugins/build_thoughts.py`, `scripts/sync-thoughts.py` |\n| `markata.plugins.prevnext` (disabled here) | `prevnext` built-in (Collect stage). | [plugins.md](https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/plugins.md) |\n| `markata.plugins.publish_source` (enabled here — serves `.md`/`.txt` sources) | Feed `markdown`/`text` output formats cover per-feed sources; per-post `.md` source publishing unconfirmed. | [pkg.go.dev feed formats](https://pkg.go.dev/github.com/WaylonWalker/markata-go) |\n| `markata.plugins.service_worker` (disabled here) | Not in built-in plugin list. **Probably absent.** | [plugins.md](https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/plugins.md) |\n| `markata.plugins.manifest` / PWA fields | PWA config keys exist (`theme_color`, `start_url`, `display`, `short_name`…); a dedicated manifest.json writer not confirmed in plugin list. | this repo's markata-go.toml, [configuration.md](https://github.com/WaylonWalker/markata-go/blob/main/docs/guides/configuration.md) |\n| RSS | `rss`/`atom`/`jsonfeed` write-stage plugins + per-feed formats + head `alternate_feeds` | [plugins.md](https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/plugins.md) |\n| Sitemap | `sitemap` plugin + per-feed sitemap format | [plugins.md](https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/plugins.md) |\n| 404 page | Built-in 404 mechanism w/ slug suggestions + live-search fallback (v0.7.0); `didyoumean`-style suggestions | [v0.7.0](https://github.com/WaylonWalker/markata-go/releases/tag/v0.7.0) |\n| Covers / OG images | `structured_data` (JSON-LD/OG/Twitter), `og_image` frontmatter, themed OG card templates, `og_image_service` screenshot-based OG images | [plugins.md](https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/plugins.md), [v0.7.0](https://github.com/WaylonWalker/markata-go/releases/tag/v0.7.0) |\n| jinja_md | `jinja_md` built-in (`jinja: true` frontmatter) | [plugins.md](https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/plugins.md) |\n| redirects | `redirects` write plugin | [plugins.md](https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/plugins.md) |\n| `markata summary` TUI counts | `markata-go tui` + `list`/`search` cover similar ground | [cli.md](https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/cli.md) |\n| `heading_link` permalinks | `heading_anchors` built-in | [plugins.md](https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/plugins.md) |\n| Search | `pagefind` built-in (skipped by `--fast`); optional bleve/searchcraft work in flight | [plugins.md](https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/plugins.md) |\n| Bundled agent skill for site repos | `markata-go agent install` ships a `markata-go-site` skill (SKILL.md + topics/reference/examples) | `spec/spec/AGENTS.md`, `markata-go agent --help` |\n| Extras not in Python version | tailwind CDN automation, cdn_assets vendoring, mermaid, chartjs, glossary, series, webmentions, blogroll/reader, garden view w/ knowledge graph, mentions, link_collector/link graph, keyboard nav, view transitions, random_post, image optimization, LSP, serve control center | [plugins.md](https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/plugins.md), release notes |\n\n## 8. Extensibility\n\n- Built-in plugin set is large (30+) and configurable via `hooks`/`disabled_hooks` (`hooks = [\"default\", \"python_docs\"]` style). [plugins.md](https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/plugins.md)\n- **True external plugins: Go-only and effectively compile-time.** `pkg/plugins/registry.go` registers built-ins. The practical paths: **fork + recompile** (we already build from source via `go install`), or template/jinja_md + config for most needs. There's a `docs/guides/plugin-development.md` and an agent-skill topic `plugin-creation.md`. [spec/PLUGINS.md](https://github.com/WaylonWalker/markata-go/blob/main/spec/spec/PLUGINS.md), [CONTRIBUTING.md](https://github.com/WaylonWalker/markata-go/blob/main/CONTRIBUTING.md)\n- Policy: PRs not accepted — so a needed feature means a fork or an issue request. [CONTRIBUTING.md](https://github.com/WaylonWalker/markata-go/blob/main/CONTRIBUTING.md)\n- Escape hatches: `jinja_md` for computed content, `config_overrides` per post, `import` command, feed `markdown`/`text` outputs, `::: name` containers, env-var-driven scripts pre-build.\n\n## 9. Development pace \u0026 maturity\n\n- Repo created **2026-01-22**; releases: v0.4.0 (2026-01-24), v0.5.0 (~01-25), v0.6.0 (01-31), v0.7.0 (02-19), v0.8.0 (02-21), v0.9.0, v0.10.0 (04-20), … v0.13.0 (2026-10-02) — **roughly monthly minors, hundreds of commits each** (v0.9→v0.10 = 772 commits). [pkg.go.dev versions](https://pkg.go.dev/github.com/WaylonWalker/markata-go), [releases](https://github.com/WaylonWalker/markata-go/releases)\n- Self-described **\"Beta (0.x) — API may change between minor versions\"**; release notes explicitly warn to smoke-test custom templates/themes on upgrade. [README](https://github.com/WaylonWalker/markata-go), [v0.9.0 notes](https://github.com/WaylonWalker/markata-go/releases)\n- **Waylon dogfoods heavily:** waylonwalker.com homepage says \"Building markata-go, the engine behind this site\"; `go.waylonwalker.com` is live; repo `WaylonWalker/waylonwalker.com` has `markata-go.toml` + split `config/*.toml`; he runs a \"builder admin\" for live builds and edits via `md.waylonwalker.com`. [homepage](https://waylonwalker.com//), [waylonwalker.com repo](https://github.com/WaylonWalker/waylonwalker.com), [fast-mode post](https://waylonwalker.com/shots/new-fast-mode-in-markata-go-is-fun/)\n- Community: 2 stars, 2 forks, 51 open issues, 2 contributors — **solo project**, not open to PRs. [repo](https://github.com/WaylonWalker/markata-go)\n- Ecosystem extras already in flight: LSP (`markata-go lsp`), TUI, agent-skill bundle, helm/k8s deploy docs, builder-admin service, local admin CMS issue (#986). [cli.md](https://github.com/WaylonWalker/markata-go/blob/main/docs/reference/cli.md), [issues](https://github.com/WaylonWalker/markata-go/issues)\n\n## 10. Known gotchas (issues + observed)\n\n- **`markata-go migrate` can emit invalid TOML** for nested Python config sections (`auto_description`) — validate with `config validate`. [waylonwalker.com#20](https://github.com/WaylonWalker/waylonwalker.com/issues/20)\n- **Slug mode changes URLs**: `path`/`hybrid` modes change URL structure — \"review links and redirects before switching\". [v0.9.0 notes](https://github.com/WaylonWalker/markata-go/releases)\n- **Tailwind managed preflight off by default** since v0.9.0 — sites depending on it must re-enable. [v0.9.0 notes](https://github.com/WaylonWalker/markata-go/releases)\n- **0.x breaking changes are routine** — pin the version (`eget`/mise pin, or `go install …@vX.Y.Z`), smoke-test templates on upgrade. [README](https://github.com/WaylonWalker/markata-go)\n- Encryption pitfalls were real (plaintext leaks, missing decryption assets on feed pages) — fixed in v0.8.0; keep the version ≥0.8 and read `docs/guides/encryption.md` before relying on it. [v0.8.0](https://github.com/WaylonWalker/markata-go/releases/tag/v0.8.0)\n- Optional theme assets (lite-yt CSS/JS, GLightbox, mermaid, webmentions, encryption) loaded site-wide rather than per-need — cosmetic/perf, open issue [#980](https://github.com/WaylonWalker/markata-go/issues/980).\n- pongo2 ≠ Jinja2: `migrate templates` is a checker, not a rewriter — expect manual edits to custom templates.\n- Case sensitivity in templates (`post.Title` vs `post.title`) has churned — check the agent-skill `template-context` reference and test.\n- Private posts stay out of `auto_feeds` public tag feeds — intended behavior, don't be surprised if private-tagged posts are missing from tag pages. [PR #979](https://github.com/WaylonWalker/markata-go/pull/979)\n- Env var for encryption keys is `MARKATA_GO_ENCRYPTION_KEY_DEFAULT` (not `_DEFAULT_KEY` as the spec table says) — verified by build error message.\n\n## MIGRATION RISK SUMMARY (for pype.dev)\n\n**Ports cleanly (verified in local markout-go build):**\n- All feed `filter` strings — same Python-like expression language; all 17 feeds generated (192 output dirs incl. archive/variants).\n- `published`/`draft` frontmatter semantics, `tags`, `templateKey` filtering, `YYYY-MM-DD HH:MM:SS` dates.\n- `!!!`/`???`/`???+` admonitions for whitelisted types, `[[slug]]` **and** `[[ slug ]]` spaced wikilinks (resolve + hover previews), GFM tables, typographer, heading anchors, syntax highlighting.\n- Nav, RSS/Atom/JSON per feed, sitemap, 404, prevnext, OG/structured data, pagefind search, tailwind automation.\n- Encryption: `templateKey: protected-post` posts encrypted via `private_tags` map + `MARKATA_GO_ENCRYPTION_KEY_DEFAULT`.\n\n**Needs custom work:**\n- **Custom admonition types** (`scripture` ×70, `background-thought` ×14, `source` ×2) — hardcoded whitelist, no PRs accepted → file upstream issue and/or codemod to a supported type (e.g. `quote`) with matching title.\n- **`plugins/build_thoughts.py`** — pre-build script writing `pages/thoughts/*.md`.\n- **30 Jinja templates** — every `markata.config.*`/`post.*` var reference needs rewriting to the go context; the `head.html` include alone poisons the chain. Recommendation: adopt the default theme + palette/aesthetic CSS instead of porting.\n- **Admonition typos in content**: `waring`, `Scripture`, `Exodusds` (were silently unstyled under Python markata too).\n\n**No equivalent (probably):**\n- Custom Python plugins generally — no Python plugin runtime.\n- `service_worker` plugin; per-post `publish_source` (feed-level markdown/text exists); PWA manifest writer unconfirmed.\n- Python-specific filter helpers (`timedelta`, `parse`) — verify in `migrate filter`.\n",
      "summary": "Research on markata-go, the Go rewrite of the Python markata static site generator, to support migrating pype.dev. All sources are primary: the GitHub repo...",
      "date_published": "2026-10-06T19:30:00Z",
      "date_modified": "2026-10-06T19:30:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "markata",
        "markata-go",
        "note"
      ]
    },
    {
      "id": "https://pype.dev/neovim-markdown-journaling-research/",
      "url": "https://pype.dev/neovim-markdown-journaling-research/",
      "title": "Neovim Markdown Journaling Research",
      "content_html": "\u003cp\u003eResearch on the current Neovim plugin landscape for writing/journaling in\nMarkdown, oriented around this site\u0026rsquo;s workflow: a markata blog with YAML\nfrontmatter, mkdocs-material-style \u003ccode\u003e!!! scripture\u003c/code\u003e / \u003ccode\u003e??? scripture\u003c/code\u003e\nadmonitions, \u003ccode\u003e[[ slug ]]\u003c/code\u003e wikilinks, and a custom \u003ccode\u003epypeaday.daily\u003c/code\u003e module\n(copier templates + telescope/fzf pickers + live_grep backlinks).\u003c/p\u003e\n\u003ch2 id=\"1-lazyvim-lang-markdown-extra-what-it-actually-does\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e1. LazyVim \u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003elang.markdown\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e extra — what it actually does\u003c/span\u003e \u003ca href=\"#1-lazyvim-lang-markdown-extra-what-it-actually-does\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eSource of truth (current \u003ccode\u003emain\u003c/code\u003e):\n\u003ca href=\"https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/plugins/extras/lang/markdown.lua\"\u003ehttps://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/plugins/extras/lang/markdown.lua\u003c/a\u003e\nDocs: \u003ca href=\"https://github.com/LazyVim/lazyvim.github.io/blob/main/docs/extras/lang/markdown.md\"\u003ehttps://github.com/LazyVim/lazyvim.github.io/blob/main/docs/extras/lang/markdown.md\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eAs of 2026, the extra installs/configures:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003emarksman\u003c/strong\u003e via nvim-lspconfig (\u003ccode\u003eservers = { marksman = {} }\u003c/code\u003e) — markdown\nLSP with \u003ccode\u003e[[wikilink]]\u003c/code\u003e completion, go-to-definition, references\n(backlinks), and dead-link diagnostics. Big deal: most of what\n\u003ccode\u003epypeaday.daily.find_backlinks()\u003c/code\u003e does via telescope live_grep, marksman\ngives via \u003ccode\u003egrr\u003c/code\u003e/\u003ccode\u003evim.lsp.buf.references\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003emarkdownlint-cli2\u003c/strong\u003e via nvim-lint (and none-ls if installed), plus\nconform.nvim formatters \u003ccode\u003eprettier\u003c/code\u003e, \u003ccode\u003emarkdownlint-cli2\u003c/code\u003e, and \u003ccode\u003emarkdown-toc\u003c/code\u003e\n(the last only runs when the buffer contains \u003ccode\u003e\u0026lt;!-- toc --\u0026gt;\u003c/code\u003e). Mason\nauto-installs \u003ccode\u003emarkdownlint-cli2\u003c/code\u003e + \u003ccode\u003emarkdown-toc\u003c/code\u003e. LazyVim switched from\nmarkdownlint-cli to cli2 in 2024:\n\u003ca href=\"https://github.com/LazyVim/LazyVim/pull/3843\"\u003ehttps://github.com/LazyVim/LazyVim/pull/3843\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003emarkdown-preview.nvim\u003c/strong\u003e (\u003ccode\u003eiamcco/markdown-preview.nvim\u003c/code\u003e) — browser\npreview on \u003ccode\u003e\u0026lt;leader\u0026gt;cp\u003c/code\u003e (markdown buffers only).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003erender-markdown.nvim\u003c/strong\u003e (\u003ccode\u003eMeanderingProgrammer/render-markdown.nvim\u003c/code\u003e) —\nin-buffer rendering. LazyVim replaced \u003ccode\u003eheadlines.nvim\u003c/code\u003e with this plugin\nback in 2024:\n\u003ca href=\"https://github.com/LazyVim/LazyVim/pull/4139\"\u003ehttps://github.com/LazyVim/LazyVim/pull/4139\u003c/a\u003e. LazyVim\u0026rsquo;s config disables\nheading icons and checkbox rendering, and maps a\n\u003ccode\u003e\u0026lt;leader\u0026gt;um\u003c/code\u003e toggle via \u003ccode\u003eSnacks.toggle\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThere is \u003cstrong\u003eno prose/spell/grammar extra\u003c/strong\u003e in LazyVim — the full extras list\ncontains nothing like a \u003ccode\u003elang.text\u003c/code\u003e or \u003ccode\u003eextras.spelling\u003c/code\u003e. Prose tooling has\nto be added by hand.\u003c/p\u003e\n\u003cp\u003eThe import already exists in \u003ccode\u003e~/.config/nvim/lua/config/lazy.lua\u003c/code\u003e (line 53)\nalongside ~15 other extras — verified 2026-10-04. If plugins look missing,\n\u003ccode\u003e:Lazy sync\u003c/code\u003e will reconcile; \u003ccode\u003e:LazyExtras\u003c/code\u003e shows what\u0026rsquo;s active.\u003c/p\u003e\n\u003cp\u003eBuilt-in LazyVim defaults that matter for prose (no plugin needed):\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eFileType autocmd already sets \u003ccode\u003ewrap\u003c/code\u003e and \u003ccode\u003espell\u003c/code\u003e for markdown:\n\u003ccode\u003elazyvim/config/autocmds.lua\u003c/code\u003e (\u003ccode\u003ewrap_spell\u003c/code\u003e augroup, patterns include\n\u003ccode\u003emarkdown\u003c/code\u003e). So spell+wrap are already on.\u003c/li\u003e\n\u003cli\u003eToggles already mapped: \u003ccode\u003e\u0026lt;leader\u0026gt;us\u003c/code\u003e spell, \u003ccode\u003e\u0026lt;leader\u0026gt;uw\u003c/code\u003e wrap,\n\u003ccode\u003e\u0026lt;leader\u0026gt;um\u003c/code\u003e render-markdown (with the extra), \u003ccode\u003e\u0026lt;leader\u0026gt;uz\u003c/code\u003e Snacks zen\nmode, \u003ccode\u003e\u0026lt;leader\u0026gt;uD\u003c/code\u003e Snacks dim — see \u003ccode\u003elazyvim/config/keymaps.lua\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"2-render-markdown-nvim-capabilities-and-the-admonition-gap\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e2. render-markdown.nvim — capabilities and the admonition gap\u003c/span\u003e \u003ca href=\"#2-render-markdown-nvim-capabilities-and-the-admonition-gap\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eRepo: \u003ca href=\"https://github.com/MeanderingProgrammer/render-markdown.nvim\"\u003ehttps://github.com/MeanderingProgrammer/render-markdown.nvim\u003c/a\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eRenders headings, code blocks, inline code, horizontal rules, list\nbullets, \u003cstrong\u003echeckboxes (with user-defined states)\u003c/strong\u003e, block quotes,\n\u003cstrong\u003ecallouts\u003c/strong\u003e, tables, links, LaTeX, per the README feature list.\u003c/li\u003e\n\u003cli\u003eCallouts: supports GitHub (\u003ccode\u003e[!NOTE]\u003c/code\u003e, \u003ccode\u003e[!TIP]\u003c/code\u003e, \u003ccode\u003e[!IMPORTANT]\u003c/code\u003e,\n\u003ccode\u003e[!WARNING]\u003c/code\u003e, \u003ccode\u003e[!CAUTION]\u003c/code\u003e) and the full Obsidian set (\u003ccode\u003e[!QUOTE]\u003c/code\u003e,\n\u003ccode\u003e[!TODO]\u003c/code\u003e, etc.). Custom callouts are fully supported — each entry is\n\u003ccode\u003ename = { raw = '[!SCRIPTURE]', rendered = ' Scripture', highlight = '...' }\u003c/code\u003e.\nWiki reference:\n\u003ca href=\"https://github.com/MeanderingProgrammer/render-markdown.nvim/wiki/Callouts\"\u003ehttps://github.com/MeanderingProgrammer/render-markdown.nvim/wiki/Callouts\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eCustom callout titles (\u003ccode\u003e\u0026gt; [!quote] Psalm 119\u003c/code\u003e) are supported:\n\u003ca href=\"https://github.com/MeanderingProgrammer/render-markdown.nvim/issues/109\"\u003ehttps://github.com/MeanderingProgrammer/render-markdown.nvim/issues/109\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eCheckboxes: \u003ccode\u003e- [ ]\u003c/code\u003e / \u003ccode\u003e- [x]\u003c/code\u003e render as icons, and arbitrary custom states\n(\u003ccode\u003e- [/]\u003c/code\u003e, \u003ccode\u003e- [\u0026gt;]\u003c/code\u003e, etc.) are configurable (\u003ccode\u003echeckbox.custom\u003c/code\u003e).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003emkdocs \u003ccode\u003e!!!\u003c/code\u003e/\u003ccode\u003e???\u003c/code\u003e admonitions are NOT supported.\u003c/strong\u003e The plugin is\ntreesitter-driven over the standard markdown parser; admonition blocks\nare just indented text to it. Callout support was added for the\n\u003ccode\u003e\u0026gt; [!x]\u003c/code\u003e blockquote syntax only\n(\u003ca href=\"https://github.com/MeanderingProgrammer/render-markdown.nvim/issues/20\"\u003ehttps://github.com/MeanderingProgrammer/render-markdown.nvim/issues/20\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003eThe main alternative, \u003ccode\u003eOXY2DEV/markview.nvim\u003c/code\u003e, also only renders\n\u003ccode\u003e\u0026gt; [!x]\u003c/code\u003e callouts for markdown — its \u0026ldquo;admonitions\u0026rdquo; support is for\n\u003cstrong\u003eAsciidoc\u003c/strong\u003e, not mkdocs:\n\u003ca href=\"https://github.com/OXY2DEV/markview.nvim/wiki/Markdown\"\u003ehttps://github.com/OXY2DEV/markview.nvim/wiki/Markdown\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eEven \u003ccode\u003emarkdown-preview.nvim\u003c/code\u003e can\u0026rsquo;t preview mkdocs admonitions — open\nfeature request: \u003ca href=\"https://github.com/iamcco/markdown-preview.nvim/issues/618\"\u003ehttps://github.com/iamcco/markdown-preview.nvim/issues/618\u003c/a\u003e.\nThe faithful preview for \u003ccode\u003e!!! scripture\u003c/code\u003e is the markata/mkdocs build\nitself, not an editor plugin.\u003c/li\u003e\n\u003cli\u003eConceal/anti-conceal: \u003ccode\u003eanti_conceal\u003c/code\u003e hides the plugin\u0026rsquo;s virtual text on\nthe cursor line so you can edit raw source; \u003ccode\u003ewin_options.conceallevel\u003c/code\u003e\nis managed per rendered/raw view. Known upstream limitation: concealed\ntext + \u003ccode\u003ewrap\u003c/code\u003e keeps stale line breaks (neovim issue #14409), documented\nin \u003ca href=\"https://github.com/MeanderingProgrammer/render-markdown.nvim/blob/HEAD/doc/limitations.md\"\u003ehttps://github.com/MeanderingProgrammer/render-markdown.nvim/blob/HEAD/doc/limitations.md\u003c/a\u003e.\nPractical tradeoff: rendered mode is great for reading/journaling review;\nexpect to live with \u003ccode\u003e\u0026lt;leader\u0026gt;um\u003c/code\u003e toggling or anti-conceal while editing.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"3-obsidian-nvim-fit-for-a-non-obsidian-vault\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e3. obsidian.nvim — fit for a non-Obsidian vault\u003c/span\u003e \u003ca href=\"#3-obsidian-nvim-fit-for-a-non-obsidian-vault\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eRepo (community fork, actively maintained; \u003ccode\u003eepwalsh/obsidian.nvim\u003c/code\u003e is the\nlegacy upstream): \u003ca href=\"https://github.com/obsidian-nvim/obsidian.nvim\"\u003ehttps://github.com/obsidian-nvim/obsidian.nvim\u003c/a\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eA \u0026ldquo;workspace\u0026rdquo; is just a directory of markdown — no \u003ccode\u003e.obsidian/\u003c/code\u003e config\nrequired. \u003ccode\u003eworkspaces = { { name = \u0026quot;pype.dev\u0026quot;, path = \u0026quot;~/projects/personal/pype.dev\u0026quot; } }\u003c/code\u003e\nis a valid setup.\u003c/li\u003e\n\u003cli\u003eProvides \u003ccode\u003e:Obsidian today [OFFSET]\u003c/code\u003e / \u003ccode\u003edailies\u003c/code\u003e, \u003ccode\u003enew_from_template\u003c/code\u003e,\n\u003ccode\u003etemplate\u003c/code\u003e (substitutions, date/time formats), \u003ccode\u003ebacklinks\u003c/code\u003e,\n\u003ccode\u003efollow_link\u003c/code\u003e, \u003ccode\u003esearch\u003c/code\u003e, \u003ccode\u003elink\u003c/code\u003e, \u003ccode\u003elinks\u003c/code\u003e. See command list in README.\u003c/li\u003e\n\u003cli\u003eCompletion of \u003ccode\u003e[[\u003c/code\u003e wiki links and \u003ccode\u003e#\u003c/code\u003e tags via blink.cmp or nvim-cmp;\nnewer versions do this through an in-process LSP so it works with any\ncompletion engine.\u003c/li\u003e\n\u003cli\u003eCaveats:\n\u003cul\u003e\n\u003cli\u003eSearch/backlinks require \u003ccode\u003eripgrep\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eOnly activates inside workspace paths; the whole pype.dev repo would be\none workspace, so \u003ccode\u003e:Obsidian search\u003c/code\u003e scans posts+pages together\n(probably fine).\u003c/li\u003e\n\u003cli\u003eDefault wikilink style is \u003ccode\u003e[[id|alias]]\u003c/code\u003e-ish (\u003ccode\u003ewiki_link_id_prefix\u003c/code\u003e);\nthe \u003ccode\u003e[[ slug ]]\u003c/code\u003e-with-spaces convention used by markata is configured\nvia \u003ccode\u003ewiki_link_func\u003c/code\u003e. Also \u003ccode\u003edisable_frontmatter\u003c/code\u003e/custom\n\u003ccode\u003enote_frontmatter_func\u003c/code\u003e matters since it would otherwise write\nObsidian-style frontmatter (\u003ccode\u003eid\u003c/code\u003e, \u003ccode\u003ealiases\u003c/code\u003e, \u003ccode\u003etags\u003c/code\u003e) that markata\ndoesn\u0026rsquo;t want.\u003c/li\u003e\n\u003cli\u003eIts built-in checkbox/conceal UI is deprecated in favor of\nrender-markdown.nvim — set \u003ccode\u003eui.enable = false\u003c/code\u003e and let\nrender-markdown handle visuals.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eVerdict: overlaps ~80% with the existing \u003ccode\u003epypeaday.daily\u003c/code\u003e module (daily\nnotes, templates, backlinks). The genuinely new capability is \u003ccode\u003e[[\u003c/code\u003e\ncompletion and structured wikilink following — but \u003cstrong\u003emarksman (already\nin lang.markdown) gives wikilink completion, \u003ccode\u003egd\u003c/code\u003e link following, and\n\u003ccode\u003egrr\u003c/code\u003e backlinks for free\u003c/strong\u003e, so obsidian.nvim is optional rather than\nfoundational. If adopted, keep \u003ccode\u003epypeaday.daily\u003c/code\u003e for copier template\ncreation and use obsidian.nvim only for links/completion.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"4-alternatives-brief-survey\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e4. Alternatives — brief survey\u003c/span\u003e \u003ca href=\"#4-alternatives-brief-survey\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003etelekasten.nvim\u003c/strong\u003e (\u003ca href=\"https://github.com/nvim-telekasten/telekasten.nvim\"\u003ehttps://github.com/nvim-telekasten/telekasten.nvim\u003c/a\u003e):\ntelescope-based zettelkasten + journal; daily/weekly notes, templates,\nbacklinks, calendar. Works, but low recent activity and it duplicates\nthe existing copier+telescope workflow. Not recommended here.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ezk-nvim\u003c/strong\u003e (\u003ca href=\"https://github.com/zk-org/zk-nvim\"\u003ehttps://github.com/zk-org/zk-nvim\u003c/a\u003e): Neovim frontend for\nthe \u003ccode\u003ezk\u003c/code\u003e CLI (a real LSP + note DB). Solid and maintained, but it wants\nthe \u003ccode\u003ezk\u003c/code\u003e binary and a \u003ccode\u003ezk\u003c/code\u003e-style notebook — another parallel system, not\na fit for markata frontmatter/slugs.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eneorg\u003c/strong\u003e (\u003ca href=\"https://github.com/nvim-neorg/neorg\"\u003ehttps://github.com/nvim-neorg/neorg\u003c/a\u003e): still releasing (9.x),\nbut it\u0026rsquo;s its own \u003ccode\u003e.norg\u003c/code\u003e file format — incompatible with a markdown\nblog. Maintainer activity is low (focus shifted to the \u003ccode\u003elux\u003c/code\u003e Lua package\nmanager): \u003ca href=\"https://github.com/nvim-neorg/neorg/discussions/1673\"\u003ehttps://github.com/nvim-neorg/neorg/discussions/1673\u003c/a\u003e. Skip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePreview\u003c/strong\u003e: \u003ccode\u003emarkdown-preview.nvim\u003c/code\u003e (browser, in the extra, \u003ccode\u003e\u0026lt;leader\u0026gt;cp\u003c/code\u003e)\nis the maintained option. \u003ccode\u003eglow.nvim\u003c/code\u003e is abandoned — its own README\npoints at render-markdown.nvim:\n\u003ca href=\"https://github.com/ellisonleao/glow.nvim/\"\u003ehttps://github.com/ellisonleao/glow.nvim/\u003c/a\u003e (fork \u003ccode\u003eshcode/nvim-glow\u003c/code\u003e\nexists but is a terminal renderer, no help for admonitions). For this\nsite, \u003ccode\u003emarkata\u003c/code\u003e\u0026rsquo;s own build/serve is the only faithful preview.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eFocus\u003c/strong\u003e: don\u0026rsquo;t install zen-mode/twilight. LazyVim already maps\n\u003ccode\u003eSnacks.zen()\u003c/code\u003e to \u003ccode\u003e\u0026lt;leader\u0026gt;uz\u003c/code\u003e and \u003ccode\u003eSnacks.toggle.dim()\u003c/code\u003e to \u003ccode\u003e\u0026lt;leader\u0026gt;uD\u003c/code\u003e\n(folke\u0026rsquo;s snacks.nvim replaced his standalone plugins:\n\u003ca href=\"https://github.com/folke/snacks.nvim/blob/main/docs/zen.md\"\u003ehttps://github.com/folke/snacks.nvim/blob/main/docs/zen.md\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTables\u003c/strong\u003e: \u003ccode\u003etabular\u003c/code\u003e is already installed (\u003ccode\u003e:Tabularize /|\u003c/code\u003e), and\nprettier (via conform \u003ccode\u003e\u0026lt;leader\u0026gt;cf\u003c/code\u003e) aligns markdown tables automatically.\nIf auto-growing tables are wanted, \u003ccode\u003eKicamon/markdown-table-mode.nvim\u003c/code\u003e or\n\u003ccode\u003edhruvasagar/vim-table-mode\u003c/code\u003e are the options — probably unnecessary.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eList/checkbox ergonomics\u003c/strong\u003e: \u003ccode\u003ebullets.vim\u003c/code\u003e\n(\u003ca href=\"https://github.com/bullets-vim/bullets.vim\"\u003ehttps://github.com/bullets-vim/bullets.vim\u003c/a\u003e) auto-continues lists on\n\u003ccode\u003e\u0026lt;CR\u0026gt;\u003c/code\u003e/\u003ccode\u003eo\u003c/code\u003e, renumbers with \u003ccode\u003egN\u003c/code\u003e, indents with \u003ccode\u003e\u0026gt;\u0026gt;\u003c/code\u003e/\u003ccode\u003e\u0026lt;\u0026lt;\u003c/code\u003e, and toggles\ncheckboxes with \u003ccode\u003e\u0026lt;leader\u0026gt;x\u003c/code\u003e — including partial-completion parent\ncheckboxes. Perfect fit for prayer-request checklists.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eLink editing nicety\u003c/strong\u003e: \u003ccode\u003eantonk52/markdowny.nvim\u003c/code\u003e adds vim-style\nsurround ops for \u003ccode\u003e[text](url)\u003c/code\u003e links. Optional quality-of-life.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"5-spell-wrap-prose-ergonomics\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e5. Spell / wrap / prose ergonomics\u003c/span\u003e \u003ca href=\"#5-spell-wrap-prose-ergonomics\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eAlready handled by LazyVim core: \u003ccode\u003espell\u003c/code\u003e + \u003ccode\u003ewrap\u003c/code\u003e FileType autocmd for\nmarkdown; \u003ccode\u003e\u0026lt;leader\u0026gt;us\u003c/code\u003e / \u003ccode\u003e\u0026lt;leader\u0026gt;uw\u003c/code\u003e toggles; \u003ccode\u003espelllang = \u0026quot;en\u0026quot;\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eWorth adding in an ftplugin/autocmd: \u003ccode\u003elinebreak\u003c/code\u003e (wrap at words, not\nmid-word), \u003ccode\u003ebreakindent\u003c/code\u003e (wrapped lines keep list indent), \u003ccode\u003ewrapmargin\u003c/code\u003e/\n\u003ccode\u003ecolorcolumn\u003c/code\u003e hygiene, and \u003ccode\u003econceallevel=2\u003c/code\u003e + \u003ccode\u003econcealcursor=nc\u003c/code\u003e if you\nwant rendered-markdown to look clean while keeping cursor-line raw.\nNote \u003ccode\u003esmoothscroll\u003c/code\u003e is globally disabled in this config\n(\u003ccode\u003evim.opt.smoothscroll = false\u003c/code\u003e) — re-enable it locally for markdown if\nlong wrapped paragraphs feel jumpy.\u003c/li\u003e\n\u003cli\u003eProse LSPs:\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eharper-ls\u003c/strong\u003e (\u003ca href=\"https://github.com/Automattic/harper\"\u003ehttps://github.com/Automattic/harper\u003c/a\u003e,\n\u003ca href=\"https://writewithharper.com\"\u003ehttps://writewithharper.com\u003c/a\u003e): Rust grammar/spelling LSP aimed at\ndevelopers; markdown-aware, fast, no Java. Installable via mason\n(\u003ccode\u003eharper_ls\u003c/code\u003e in lspconfig), every linter toggleable\n(\u003ccode\u003elinters.sentence_capitalization\u003c/code\u003e, \u003ccode\u003elong_sentences\u003c/code\u003e, etc.). Best\ncurrent default for prose grammar. Caution: it flags in every buffer\nit attaches to — scope it to \u003ccode\u003emarkdown\u003c/code\u003e filetype only.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eltex-ls is dead\u003c/strong\u003e — \u003ccode\u003evalentjn/ltex-ls\u003c/code\u003e is archived\n(\u003ca href=\"https://github.com/valentjn/ltex-ls\"\u003ehttps://github.com/valentjn/ltex-ls\u003c/a\u003e). Maintained fork:\n\u003cstrong\u003eltex-plus/ltex-ls-plus\u003c/strong\u003e (\u003ca href=\"https://github.com/ltex-plus/ltex-ls-plus\"\u003ehttps://github.com/ltex-plus/ltex-ls-plus\u003c/a\u003e),\nstill LanguageTool-based (heavy JVM, but deeper grammar rules).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003evale\u003c/strong\u003e (\u003ca href=\"https://vale.sh\"\u003ehttps://vale.sh\u003c/a\u003e): CLI style-guide linter; usable through\nnvim-lint\u0026rsquo;s \u003ccode\u003evale\u003c/code\u003e linter. Best if you want house-style rules\n(write-good/proselint packs), more setup than value for journaling.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eSoft punctuation niceties: \u003ccode\u003epensieve\u003c/code\u003e/\u003ccode\u003ecmp-dictionary\u003c/code\u003e are mostly dead\nends; the spell dictionary via \u003ccode\u003ezg\u003c/code\u003e + blink \u003ccode\u003ebuffer\u003c/code\u003e/\u003ccode\u003espell\u003c/code\u003e source\ncovers the practical case.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"recommended-additions-for-this-setup\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRecommended additions for this setup\u003c/span\u003e \u003ca href=\"#recommended-additions-for-this-setup\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eOrdered by value ÷ effort.\u003c/p\u003e\n\u003ch3 id=\"1-lang-markdown-extra-is-already-enabled-zero-new-code\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e1. lang.markdown extra is already enabled (zero new code)\u003c/span\u003e \u003ca href=\"#1-lang-markdown-extra-is-already-enabled-zero-new-code\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003e~/.config/nvim/lua/config/lazy.lua\u003c/code\u003e line 53 already imports it. Verify\nmarksman attaches with \u003ccode\u003e:LspInfo\u003c/code\u003e in a note buffer. Then:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003egd\u003c/code\u003e on \u003ccode\u003e\u0026lt;a href=\u0026quot;/2025-09-13-notes/\u0026quot; class=\u0026quot;wikilink\u0026quot; data-title=\u0026quot;2025-09-13 Notes\u0026quot; data-description=\u0026quot;yesterday: 2025-09-11-notes\u0026quot; data-date=\u0026quot;2025-09-13\u0026quot;\u0026gt;2025-09-13 Notes\u0026lt;/a\u0026gt;\u003c/code\u003e jumps to the note\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003egrr\u003c/code\u003e (LSP references) is a richer backlinks view than the live_grep\npattern in \u003ccode\u003efind_daily_files\u003c/code\u003e/\u003ccode\u003efind_backlinks\u003c/code\u003e — keep the telescope one,\nit searches the spaced \u003ccode\u003e[[ slug ]]\u003c/code\u003e convention regardless of whether\nmarksman resolves it.\u003c/li\u003e\n\u003cli\u003eCaveat: marksman treats the git root (\u003ccode\u003epype.dev\u003c/code\u003e) as the workspace, which\nis what we want. Verify it resolves the spaced \u003ccode\u003e[[ slug ]]\u003c/code\u003e form; if not,\ncompletion still works for \u003ccode\u003e[[slug]]\u003c/code\u003e and markata tolerates both.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"2-markdown-writing-mode-ftplugin-tiny-high-value\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e2. Markdown writing-mode ftplugin (tiny, high value)\u003c/span\u003e \u003ca href=\"#2-markdown-writing-mode-ftplugin-tiny-high-value\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003e~/.config/nvim/after/ftplugin/markdown.lua\u003c/code\u003e (LazyVim loads \u003ccode\u003eafter/ftplugin\u003c/code\u003e\nautomatically — no spec needed):\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003evim.opt_local\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003elinebreak\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e      \u003cspan class=\"c1\"\u003e-- wrap at word boundaries\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003evim.opt_local\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ebreakindent\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e    \u003cspan class=\"c1\"\u003e-- keep list indentation on wrapped lines\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003evim.opt_local\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esmoothscroll\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e   \u003cspan class=\"c1\"\u003e-- undo the global `false` for prose\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003evim.opt_local\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003econceallevel\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e      \u003cspan class=\"c1\"\u003e-- conceal markup for rendered view\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003evim.opt_local\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003econcealcursor\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;nc\u0026#34;\u003c/span\u003e  \u003cspan class=\"c1\"\u003e-- show raw text on the cursor line in insert\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003evim.opt_local\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003espell\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e          \u003cspan class=\"c1\"\u003e-- redundant w/ LazyVim autocmd, explicit is fine\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e-- map j/k to gj/gk for wrapped-line navigation (markdown buffers only)\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;x\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;j\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;gj\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"n\"\u003ebuffer\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\"\u003eremap\u003c/span\u003e \u003cspan class=\"o\"\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=\"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;x\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;k\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;gk\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"n\"\u003ebuffer\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\"\u003eremap\u003c/span\u003e \u003cspan class=\"o\"\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\u003ch3 id=\"3-render-markdown-tweaks-a-scripture-callout-checkbox-states\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e3. render-markdown tweaks + a \u003c/span\u003e\u003ccode\u003e\u003cspan class=\"heading-wear-glyph\"\u003escripture\u003c/span\u003e\u003c/code\u003e\u003cspan class=\"heading-wear-glyph\"\u003e callout + checkbox states\u003c/span\u003e \u003ca href=\"#3-render-markdown-tweaks-a-scripture-callout-checkbox-states\" 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\u003cspan class=\"c1\"\u003e-- lua/plugins/markdown.lua\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=\"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;MeanderingProgrammer/render-markdown.nvim\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\"\u003eopts\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-- re-enable what LazyVim\u0026#39;s extra disables\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"n\"\u003echeckbox\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\"\u003eenabled\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\"\u003eunchecked\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"n\"\u003eicon\u003c/span\u003e \u003cspan class=\"o\"\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=\"n\"\u003echecked\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"n\"\u003eicon\u003c/span\u003e \u003cspan class=\"o\"\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=\"n\"\u003ecustom\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\"\u003epraying\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"n\"\u003eraw\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;[/]\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003erendered\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;󱑂 \u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;RenderMarkdownWarn\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\"\u003ecallout\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-- !!! scripture has no renderer; if you ever write\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"c1\"\u003e-- \u0026gt; [!scripture] in blog posts this makes it pretty.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003escripture\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\"\u003eraw\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;[!SCRIPTURE]\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\"\u003erendered\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;󰗶 Scripture\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\"\u003ehighlight\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;RenderMarkdownHint\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\"\u003eanti_conceal\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"n\"\u003eenabled\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=\"c1\"\u003e-- cursor line shows raw markdown\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\u003cp\u003eReality check: \u003cstrong\u003enothing renders \u003ccode\u003e!!! scripture\u003c/code\u003e blocks in the editor\u003c/strong\u003e —\nthey\u0026rsquo;ll show as plain indented text (which is honest: markata is the only\nreal renderer). If visual distinction matters, \u003ccode\u003eutil.mini-hipatterns\u003c/code\u003e is\nalready enabled — add a pattern:\u003c/p\u003e\n\u003cpre class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e-- inside the existing mini.hipatterns spec\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\"\u003ehipatterns\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;mini.hipatterns\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\"\u003eopts\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\"\u003ehighlighters\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\"\u003eadmonition\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"n\"\u003epattern\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;^!?%?+ +%w+.*\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003egroup\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Special\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\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"4-bullets-vim-for-prayer-request-checklists-one-line-high-value\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e4. bullets.vim for prayer-request checklists (one line, high value)\u003c/span\u003e \u003ca href=\"#4-bullets-vim-for-prayer-request-checklists-one-line-high-value\" 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\u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;bullets-vim/bullets.vim\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eft\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;markdown\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\u003e\u003ccode\u003e\u0026lt;leader\u0026gt;x\u003c/code\u003e toggles \u003ccode\u003e- [ ]\u003c/code\u003e/\u003ccode\u003e- [x]\u003c/code\u003e, \u003ccode\u003e\u0026lt;CR\u0026gt;\u003c/code\u003e/\u003ccode\u003eo\u003c/code\u003e continue list items,\n\u003ccode\u003e\u0026gt;\u0026gt;\u003c/code\u003e/\u003ccode\u003e\u0026lt;\u0026lt;\u003c/code\u003e adjust nesting. Docs:\n\u003ca href=\"https://github.com/bullets-vim/bullets.vim\"\u003ehttps://github.com/bullets-vim/bullets.vim\u003c/a\u003e\u003c/p\u003e\n\u003ch3 id=\"5-optional-heavier-lifts-only-if-felt-needed\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003e5. Optional, heavier lifts (only if felt needed)\u003c/span\u003e \u003ca href=\"#5-optional-heavier-lifts-only-if-felt-needed\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eharper-ls\u003c/strong\u003e grammar checking, scoped to markdown:\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=\"s2\"\u003e\u0026#34;neovim/nvim-lspconfig\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\"\u003eopts\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\"\u003eservers\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\"\u003eharper_ls\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\"\u003efiletypes\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;markdown\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\"\u003esettings\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=\"s2\"\u003e\u0026#34;harper-ls\u0026#34;\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=\"n\"\u003elinters\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"n\"\u003esentence_capitalization\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\"\u003elong_sentences\u003c/span\u003e \u003cspan class=\"o\"\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=\"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=\"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\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eobsidian.nvim\u003c/strong\u003e for \u003ccode\u003e[[\u003c/code\u003e completion + \u003ccode\u003e:Obsidian backlinks\u003c/code\u003e — only if\nmarksman\u0026rsquo;s LSP completion of wikilinks proves insufficient. Keep\n\u003ccode\u003eui.enable = false\u003c/code\u003e and continue using \u003ccode\u003epypeaday.daily\u003c/code\u003e + copier for note\ncreation. Expect to write a \u003ccode\u003ewiki_link_func\u003c/code\u003e to emit \u003ccode\u003e[[ slug ]]\u003c/code\u003e and a\n\u003ccode\u003enote_frontmatter_func\u003c/code\u003e matching markata\u0026rsquo;s frontmatter.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"bottom-line\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eBottom line\u003c/span\u003e \u003ca href=\"#bottom-line\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe copier+telescope daily-notes system is already doing the job of an\nentire plugin category (telekasten/zk/obsidian daily notes). The real gaps\nare: marksman wikilink navigation (free, already enabled via lang.markdown),\nrendered checkboxes/callouts (render-markdown, in the extra), checkbox\ntoggling (bullets.vim), wrapped-line ergonomics (a 6-line ftplugin), and\noptional grammar checking (harper-ls). \u003ccode\u003e!!!\u003c/code\u003e admonitions are a markata-side\nconcern — no editor plugin renders them; at most, highlight the marker line.\u003c/p\u003e\n",
      "content_text": "\nResearch on the current Neovim plugin landscape for writing/journaling in\nMarkdown, oriented around this site's workflow: a markata blog with YAML\nfrontmatter, mkdocs-material-style `!!! scripture` / `??? scripture`\nadmonitions, `[[ slug ]]` wikilinks, and a custom `pypeaday.daily` module\n(copier templates + telescope/fzf pickers + live_grep backlinks).\n\n## 1. LazyVim `lang.markdown` extra — what it actually does\n\nSource of truth (current `main`):\n\u003chttps://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/plugins/extras/lang/markdown.lua\u003e\nDocs: \u003chttps://github.com/LazyVim/lazyvim.github.io/blob/main/docs/extras/lang/markdown.md\u003e\n\nAs of 2026, the extra installs/configures:\n\n- **marksman** via nvim-lspconfig (`servers = { marksman = {} }`) — markdown\n  LSP with `[[wikilink]]` completion, go-to-definition, references\n  (backlinks), and dead-link diagnostics. Big deal: most of what\n  `pypeaday.daily.find_backlinks()` does via telescope live_grep, marksman\n  gives via `grr`/`vim.lsp.buf.references`.\n- **markdownlint-cli2** via nvim-lint (and none-ls if installed), plus\n  conform.nvim formatters `prettier`, `markdownlint-cli2`, and `markdown-toc`\n  (the last only runs when the buffer contains `\u003c!-- toc --\u003e`). Mason\n  auto-installs `markdownlint-cli2` + `markdown-toc`. LazyVim switched from\n  markdownlint-cli to cli2 in 2024:\n  \u003chttps://github.com/LazyVim/LazyVim/pull/3843\u003e\n- **markdown-preview.nvim** (`iamcco/markdown-preview.nvim`) — browser\n  preview on `\u003cleader\u003ecp` (markdown buffers only).\n- **render-markdown.nvim** (`MeanderingProgrammer/render-markdown.nvim`) —\n  in-buffer rendering. LazyVim replaced `headlines.nvim` with this plugin\n  back in 2024:\n  \u003chttps://github.com/LazyVim/LazyVim/pull/4139\u003e. LazyVim's config disables\n  heading icons and checkbox rendering, and maps a\n  `\u003cleader\u003eum` toggle via `Snacks.toggle`.\n\nThere is **no prose/spell/grammar extra** in LazyVim — the full extras list\ncontains nothing like a `lang.text` or `extras.spelling`. Prose tooling has\nto be added by hand.\n\nThe import already exists in `~/.config/nvim/lua/config/lazy.lua` (line 53)\nalongside ~15 other extras — verified 2026-10-04. If plugins look missing,\n`:Lazy sync` will reconcile; `:LazyExtras` shows what's active.\n\nBuilt-in LazyVim defaults that matter for prose (no plugin needed):\n\n- FileType autocmd already sets `wrap` and `spell` for markdown:\n  `lazyvim/config/autocmds.lua` (`wrap_spell` augroup, patterns include\n  `markdown`). So spell+wrap are already on.\n- Toggles already mapped: `\u003cleader\u003eus` spell, `\u003cleader\u003euw` wrap,\n  `\u003cleader\u003eum` render-markdown (with the extra), `\u003cleader\u003euz` Snacks zen\n  mode, `\u003cleader\u003euD` Snacks dim — see `lazyvim/config/keymaps.lua`.\n\n## 2. render-markdown.nvim — capabilities and the admonition gap\n\nRepo: \u003chttps://github.com/MeanderingProgrammer/render-markdown.nvim\u003e\n\n- Renders headings, code blocks, inline code, horizontal rules, list\n  bullets, **checkboxes (with user-defined states)**, block quotes,\n  **callouts**, tables, links, LaTeX, per the README feature list.\n- Callouts: supports GitHub (`[!NOTE]`, `[!TIP]`, `[!IMPORTANT]`,\n  `[!WARNING]`, `[!CAUTION]`) and the full Obsidian set (`[!QUOTE]`,\n  `[!TODO]`, etc.). Custom callouts are fully supported — each entry is\n  `name = { raw = '[!SCRIPTURE]', rendered = ' Scripture', highlight = '...' }`.\n  Wiki reference:\n  \u003chttps://github.com/MeanderingProgrammer/render-markdown.nvim/wiki/Callouts\u003e\n- Custom callout titles (`\u003e [!quote] Psalm 119`) are supported:\n  \u003chttps://github.com/MeanderingProgrammer/render-markdown.nvim/issues/109\u003e\n- Checkboxes: `- [ ]` / `- [x]` render as icons, and arbitrary custom states\n  (`- [/]`, `- [\u003e]`, etc.) are configurable (`checkbox.custom`).\n- **mkdocs `!!!`/`???` admonitions are NOT supported.** The plugin is\n  treesitter-driven over the standard markdown parser; admonition blocks\n  are just indented text to it. Callout support was added for the\n  `\u003e [!x]` blockquote syntax only\n  (\u003chttps://github.com/MeanderingProgrammer/render-markdown.nvim/issues/20\u003e).\n- The main alternative, `OXY2DEV/markview.nvim`, also only renders\n  `\u003e [!x]` callouts for markdown — its \"admonitions\" support is for\n  **Asciidoc**, not mkdocs:\n  \u003chttps://github.com/OXY2DEV/markview.nvim/wiki/Markdown\u003e\n- Even `markdown-preview.nvim` can't preview mkdocs admonitions — open\n  feature request: \u003chttps://github.com/iamcco/markdown-preview.nvim/issues/618\u003e.\n  The faithful preview for `!!! scripture` is the markata/mkdocs build\n  itself, not an editor plugin.\n- Conceal/anti-conceal: `anti_conceal` hides the plugin's virtual text on\n  the cursor line so you can edit raw source; `win_options.conceallevel`\n  is managed per rendered/raw view. Known upstream limitation: concealed\n  text + `wrap` keeps stale line breaks (neovim issue #14409), documented\n  in \u003chttps://github.com/MeanderingProgrammer/render-markdown.nvim/blob/HEAD/doc/limitations.md\u003e.\n  Practical tradeoff: rendered mode is great for reading/journaling review;\n  expect to live with `\u003cleader\u003eum` toggling or anti-conceal while editing.\n\n## 3. obsidian.nvim — fit for a non-Obsidian vault\n\nRepo (community fork, actively maintained; `epwalsh/obsidian.nvim` is the\nlegacy upstream): \u003chttps://github.com/obsidian-nvim/obsidian.nvim\u003e\n\n- A \"workspace\" is just a directory of markdown — no `.obsidian/` config\n  required. `workspaces = { { name = \"pype.dev\", path = \"~/projects/personal/pype.dev\" } }`\n  is a valid setup.\n- Provides `:Obsidian today [OFFSET]` / `dailies`, `new_from_template`,\n  `template` (substitutions, date/time formats), `backlinks`,\n  `follow_link`, `search`, `link`, `links`. See command list in README.\n- Completion of `[[` wiki links and `#` tags via blink.cmp or nvim-cmp;\n  newer versions do this through an in-process LSP so it works with any\n  completion engine.\n- Caveats:\n  - Search/backlinks require `ripgrep`.\n  - Only activates inside workspace paths; the whole pype.dev repo would be\n    one workspace, so `:Obsidian search` scans posts+pages together\n    (probably fine).\n  - Default wikilink style is `[[id|alias]]`-ish (`wiki_link_id_prefix`);\n    the `[[ slug ]]`-with-spaces convention used by markata is configured\n    via `wiki_link_func`. Also `disable_frontmatter`/custom\n    `note_frontmatter_func` matters since it would otherwise write\n    Obsidian-style frontmatter (`id`, `aliases`, `tags`) that markata\n    doesn't want.\n  - Its built-in checkbox/conceal UI is deprecated in favor of\n    render-markdown.nvim — set `ui.enable = false` and let\n    render-markdown handle visuals.\n- Verdict: overlaps ~80% with the existing `pypeaday.daily` module (daily\n  notes, templates, backlinks). The genuinely new capability is `[[`\n  completion and structured wikilink following — but **marksman (already\n  in lang.markdown) gives wikilink completion, `gd` link following, and\n  `grr` backlinks for free**, so obsidian.nvim is optional rather than\n  foundational. If adopted, keep `pypeaday.daily` for copier template\n  creation and use obsidian.nvim only for links/completion.\n\n## 4. Alternatives — brief survey\n\n- **telekasten.nvim** (\u003chttps://github.com/nvim-telekasten/telekasten.nvim\u003e):\n  telescope-based zettelkasten + journal; daily/weekly notes, templates,\n  backlinks, calendar. Works, but low recent activity and it duplicates\n  the existing copier+telescope workflow. Not recommended here.\n- **zk-nvim** (\u003chttps://github.com/zk-org/zk-nvim\u003e): Neovim frontend for\n  the `zk` CLI (a real LSP + note DB). Solid and maintained, but it wants\n  the `zk` binary and a `zk`-style notebook — another parallel system, not\n  a fit for markata frontmatter/slugs.\n- **neorg** (\u003chttps://github.com/nvim-neorg/neorg\u003e): still releasing (9.x),\n  but it's its own `.norg` file format — incompatible with a markdown\n  blog. Maintainer activity is low (focus shifted to the `lux` Lua package\n  manager): \u003chttps://github.com/nvim-neorg/neorg/discussions/1673\u003e. Skip.\n- **Preview**: `markdown-preview.nvim` (browser, in the extra, `\u003cleader\u003ecp`)\n  is the maintained option. `glow.nvim` is abandoned — its own README\n  points at render-markdown.nvim:\n  \u003chttps://github.com/ellisonleao/glow.nvim/\u003e (fork `shcode/nvim-glow`\n  exists but is a terminal renderer, no help for admonitions). For this\n  site, `markata`'s own build/serve is the only faithful preview.\n- **Focus**: don't install zen-mode/twilight. LazyVim already maps\n  `Snacks.zen()` to `\u003cleader\u003euz` and `Snacks.toggle.dim()` to `\u003cleader\u003euD`\n  (folke's snacks.nvim replaced his standalone plugins:\n  \u003chttps://github.com/folke/snacks.nvim/blob/main/docs/zen.md\u003e).\n- **Tables**: `tabular` is already installed (`:Tabularize /|`), and\n  prettier (via conform `\u003cleader\u003ecf`) aligns markdown tables automatically.\n  If auto-growing tables are wanted, `Kicamon/markdown-table-mode.nvim` or\n  `dhruvasagar/vim-table-mode` are the options — probably unnecessary.\n- **List/checkbox ergonomics**: `bullets.vim`\n  (\u003chttps://github.com/bullets-vim/bullets.vim\u003e) auto-continues lists on\n  `\u003cCR\u003e`/`o`, renumbers with `gN`, indents with `\u003e\u003e`/`\u003c\u003c`, and toggles\n  checkboxes with `\u003cleader\u003ex` — including partial-completion parent\n  checkboxes. Perfect fit for prayer-request checklists.\n- **Link editing nicety**: `antonk52/markdowny.nvim` adds vim-style\n  surround ops for `[text](url)` links. Optional quality-of-life.\n\n## 5. Spell / wrap / prose ergonomics\n\n- Already handled by LazyVim core: `spell` + `wrap` FileType autocmd for\n  markdown; `\u003cleader\u003eus` / `\u003cleader\u003euw` toggles; `spelllang = \"en\"`.\n- Worth adding in an ftplugin/autocmd: `linebreak` (wrap at words, not\n  mid-word), `breakindent` (wrapped lines keep list indent), `wrapmargin`/\n  `colorcolumn` hygiene, and `conceallevel=2` + `concealcursor=nc` if you\n  want rendered-markdown to look clean while keeping cursor-line raw.\n  Note `smoothscroll` is globally disabled in this config\n  (`vim.opt.smoothscroll = false`) — re-enable it locally for markdown if\n  long wrapped paragraphs feel jumpy.\n- Prose LSPs:\n  - **harper-ls** (\u003chttps://github.com/Automattic/harper\u003e,\n    \u003chttps://writewithharper.com\u003e): Rust grammar/spelling LSP aimed at\n    developers; markdown-aware, fast, no Java. Installable via mason\n    (`harper_ls` in lspconfig), every linter toggleable\n    (`linters.sentence_capitalization`, `long_sentences`, etc.). Best\n    current default for prose grammar. Caution: it flags in every buffer\n    it attaches to — scope it to `markdown` filetype only.\n  - **ltex-ls is dead** — `valentjn/ltex-ls` is archived\n    (\u003chttps://github.com/valentjn/ltex-ls\u003e). Maintained fork:\n    **ltex-plus/ltex-ls-plus** (\u003chttps://github.com/ltex-plus/ltex-ls-plus\u003e),\n    still LanguageTool-based (heavy JVM, but deeper grammar rules).\n  - **vale** (\u003chttps://vale.sh\u003e): CLI style-guide linter; usable through\n    nvim-lint's `vale` linter. Best if you want house-style rules\n    (write-good/proselint packs), more setup than value for journaling.\n- Soft punctuation niceties: `pensieve`/`cmp-dictionary` are mostly dead\n  ends; the spell dictionary via `zg` + blink `buffer`/`spell` source\n  covers the practical case.\n\n## Recommended additions for this setup\n\nOrdered by value ÷ effort.\n\n### 1. lang.markdown extra is already enabled (zero new code)\n\n`~/.config/nvim/lua/config/lazy.lua` line 53 already imports it. Verify\nmarksman attaches with `:LspInfo` in a note buffer. Then:\n\n- `gd` on `\u003ca href=\"/2025-09-13-notes/\" class=\"wikilink\" data-title=\"2025-09-13 Notes\" data-description=\"yesterday: 2025-09-11-notes\" data-date=\"2025-09-13\"\u003e2025-09-13 Notes\u003c/a\u003e` jumps to the note\n- `grr` (LSP references) is a richer backlinks view than the live_grep\n  pattern in `find_daily_files`/`find_backlinks` — keep the telescope one,\n  it searches the spaced `[[ slug ]]` convention regardless of whether\n  marksman resolves it.\n- Caveat: marksman treats the git root (`pype.dev`) as the workspace, which\n  is what we want. Verify it resolves the spaced `[[ slug ]]` form; if not,\n  completion still works for `[[slug]]` and markata tolerates both.\n\n### 2. Markdown writing-mode ftplugin (tiny, high value)\n\n`~/.config/nvim/after/ftplugin/markdown.lua` (LazyVim loads `after/ftplugin`\nautomatically — no spec needed):\n\n```lua\nvim.opt_local.linebreak = true      -- wrap at word boundaries\nvim.opt_local.breakindent = true    -- keep list indentation on wrapped lines\nvim.opt_local.smoothscroll = true   -- undo the global `false` for prose\nvim.opt_local.conceallevel = 2      -- conceal markup for rendered view\nvim.opt_local.concealcursor = \"nc\"  -- show raw text on the cursor line in insert\nvim.opt_local.spell = true          -- redundant w/ LazyVim autocmd, explicit is fine\n-- map j/k to gj/gk for wrapped-line navigation (markdown buffers only)\nvim.keymap.set({ \"n\", \"x\" }, \"j\", \"gj\", { buffer = true, remap = false })\nvim.keymap.set({ \"n\", \"x\" }, \"k\", \"gk\", { buffer = true, remap = false })\n```\n\n### 3. render-markdown tweaks + a `scripture` callout + checkbox states\n\n```lua\n-- lua/plugins/markdown.lua\nreturn {\n  {\n    \"MeanderingProgrammer/render-markdown.nvim\",\n    opts = {\n      -- re-enable what LazyVim's extra disables\n      checkbox = {\n        enabled = true,\n        unchecked = { icon = \"󰄱 \" },\n        checked = { icon = \"󰱒 \" },\n        custom = {\n          praying = { raw = \"[/]\", rendered = \"󱑂 \", highlight = \"RenderMarkdownWarn\" },\n        },\n      },\n      callout = {\n        -- !!! scripture has no renderer; if you ever write\n        -- \u003e [!scripture] in blog posts this makes it pretty.\n        scripture = {\n          raw = \"[!SCRIPTURE]\",\n          rendered = \"󰗶 Scripture\",\n          highlight = \"RenderMarkdownHint\",\n        },\n      },\n      anti_conceal = { enabled = true }, -- cursor line shows raw markdown\n    },\n  },\n}\n```\n\nReality check: **nothing renders `!!! scripture` blocks in the editor** —\nthey'll show as plain indented text (which is honest: markata is the only\nreal renderer). If visual distinction matters, `util.mini-hipatterns` is\nalready enabled — add a pattern:\n\n```lua\n-- inside the existing mini.hipatterns spec\nlocal hipatterns = require(\"mini.hipatterns\")\nopts = {\n  highlighters = {\n    admonition = { pattern = \"^!?%?+ +%w+.*\", group = \"Special\" },\n  },\n}\n```\n\n### 4. bullets.vim for prayer-request checklists (one line, high value)\n\n```lua\n{ \"bullets-vim/bullets.vim\", ft = \"markdown\" },\n```\n\n`\u003cleader\u003ex` toggles `- [ ]`/`- [x]`, `\u003cCR\u003e`/`o` continue list items,\n`\u003e\u003e`/`\u003c\u003c` adjust nesting. Docs:\n\u003chttps://github.com/bullets-vim/bullets.vim\u003e\n\n### 5. Optional, heavier lifts (only if felt needed)\n\n- **harper-ls** grammar checking, scoped to markdown:\n\n  ```lua\n  {\n    \"neovim/nvim-lspconfig\",\n    opts = {\n      servers = {\n        harper_ls = {\n          filetypes = { \"markdown\" },\n          settings = {\n            [\"harper-ls\"] = {\n              linters = { sentence_capitalization = false, long_sentences = false },\n            },\n          },\n        },\n      },\n    },\n  }\n  ```\n\n- **obsidian.nvim** for `[[` completion + `:Obsidian backlinks` — only if\n  marksman's LSP completion of wikilinks proves insufficient. Keep\n  `ui.enable = false` and continue using `pypeaday.daily` + copier for note\n  creation. Expect to write a `wiki_link_func` to emit `[[ slug ]]` and a\n  `note_frontmatter_func` matching markata's frontmatter.\n\n## Bottom line\n\nThe copier+telescope daily-notes system is already doing the job of an\nentire plugin category (telekasten/zk/obsidian daily notes). The real gaps\nare: marksman wikilink navigation (free, already enabled via lang.markdown),\nrendered checkboxes/callouts (render-markdown, in the extra), checkbox\ntoggling (bullets.vim), wrapped-line ergonomics (a 6-line ftplugin), and\noptional grammar checking (harper-ls). `!!!` admonitions are a markata-side\nconcern — no editor plugin renders them; at most, highlight the marker line.\n",
      "summary": "Research on the current Neovim plugin landscape for writing/journaling in Markdown, oriented around this site's workflow: a markata blog with YAML...",
      "date_published": "2026-10-04T06:00:00Z",
      "date_modified": "2026-10-04T06:00:00Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "neovim",
        "markdown",
        "note"
      ]
    },
    {
      "id": "https://pype.dev/obc-networking/",
      "url": "https://pype.dev/obc-networking/",
      "title": "OBC Networking",
      "content_html": "\u003ch2 id=\"network\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003enetwork\u003c/span\u003e \u003ca href=\"#network\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eSpectrum brings internet in via coax to their modem. The modem feeds the Eero\n(acting as gateway, handing out 192.168.4.0/24). Downstream of the Eero is the\nold Spectrum router still emitting an SSID on 192.168.1.0/24 — needs turning\noff (requires Spectrum admin access).\u003c/p\u003e\n\u003ch2 id=\"printer\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eprinter\u003c/span\u003e \u003ca href=\"#printer\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe printer was originally self-assigned static IP 192.168.1.165. After\nswitching to Eero DHCP (192.168.4.0/24), it now gets 192.168.4.25. The admin\ndesktop has a static rule configured for it, but the port config on the desktop\nstill had the old 192.168.1.165 address — had to update it to point to\n192.168.4.25. The port name is stuck as IP_192.168.1.165 (couldn\u0026rsquo;t be changed).\u003c/p\u003e\n\u003cp\u003eThe DHCP-assigned 192.168.4.25 is subject to change — need to iron that out.\u003c/p\u003e\n\u003ch3 id=\"admin-password-reset\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eadmin password reset\u003c/span\u003e \u003ca href=\"#admin-password-reset\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eFrom the main menu, tap \u003cstrong\u003eCounter\u003c/strong\u003e → \u003cstrong\u003eDisplay Keyboard\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eEnter: \u003ccode\u003estop, 0, 0, stop, 0, 1\u003c/code\u003e via the on-display keypad\u003c/li\u003e\n\u003cli\u003eA password prompt appears — enter: \u003ccode\u003e9272 9272 9272 9272\u003c/code\u003e (9272 × 4)\u003c/li\u003e\n\u003cli\u003eTap \u003cstrong\u003eEnd\u003c/strong\u003e (this is \u0026ldquo;OK\u0026rdquo;)\u003c/li\u003e\n\u003cli\u003eFrom the new menu: \u003ccode\u003estop, 0\u003c/code\u003e on the on-display keypad, then \u003ccode\u003eC\u003c/code\u003e on the keypad\u003c/li\u003e\n\u003cli\u003eThis opens the admin password reset menu\u003c/li\u003e\n\u003cli\u003eSet new password to: \u003ccode\u003e12345678\u003c/code\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cblockquote\u003e\n\u003cp\u003eNOTE: I put a sticky note on the side of the printer with these instructions\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch3 id=\"how-to-get-to-network-settings\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ehow to get to network settings\u003c/span\u003e \u003ca href=\"#how-to-get-to-network-settings\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAfter the admin password reset, I navigated through the menus to find the\nnetwork settings and changed from static IP to \u003cstrong\u003eAuto (DHCP)\u003c/strong\u003e. Didn\u0026rsquo;t write\ndown the exact path — next time I\u0026rsquo;m at the printer I need to document it.\u003c/p\u003e\n\u003ch2 id=\"todo\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003etodo\u003c/span\u003e \u003ca href=\"#todo\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e turn off \u0026ldquo;Olivet Bible Church\u0026rdquo; SSID on the old Spectrum router (requires admin portal access)\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e wall-mount Eero 2 to extend range to kid\u0026rsquo;s wing\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e consider getting a 4th Eero for Fellowship Hall coverage\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e set the printer to a DHCP reservation on the Eero so its IP doesn\u0026rsquo;t change\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e fix the shared password between OBC-Admin and OBC-Guest (currently the same)\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e re-run the damaged ethernet cable from the networking closet to the sanctuary\n\u003cul\u003e\n\u003cli\u003eonce done, plug blue #4 into the switch, feeding Eero 3 at the tech bar\u003c/li\u003e\n\u003cli\u003eEero 3 can then feed Switch 3 for the tech bar devices\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eEero 3 might be able to do this without a new run depending on strength of their back-haul\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"topology\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003etopology\u003c/span\u003e \u003ca href=\"#topology\" 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/20260517133911_bfaa446e.png\" alt=\"20260517133911_bfaa446e.png\"\u003e\n\u003c/figure\u003e\n",
      "content_text": "\n## network\n\nSpectrum brings internet in via coax to their modem. The modem feeds the Eero\n(acting as gateway, handing out 192.168.4.0/24). Downstream of the Eero is the\nold Spectrum router still emitting an SSID on 192.168.1.0/24 — needs turning\noff (requires Spectrum admin access).\n\n## printer\n\nThe printer was originally self-assigned static IP 192.168.1.165. After\nswitching to Eero DHCP (192.168.4.0/24), it now gets 192.168.4.25. The admin\ndesktop has a static rule configured for it, but the port config on the desktop\nstill had the old 192.168.1.165 address — had to update it to point to\n192.168.4.25. The port name is stuck as IP_192.168.1.165 (couldn't be changed).\n\nThe DHCP-assigned 192.168.4.25 is subject to change — need to iron that out.\n\n### admin password reset\n\n1. From the main menu, tap **Counter** → **Display Keyboard**\n2. Enter: `stop, 0, 0, stop, 0, 1` via the on-display keypad\n3. A password prompt appears — enter: `9272 9272 9272 9272` (9272 × 4)\n4. Tap **End** (this is \"OK\")\n5. From the new menu: `stop, 0` on the on-display keypad, then `C` on the keypad\n6. This opens the admin password reset menu\n7. Set new password to: `12345678`\n\n\u003e NOTE: I put a sticky note on the side of the printer with these instructions\n\n### how to get to network settings\n\nAfter the admin password reset, I navigated through the menus to find the\nnetwork settings and changed from static IP to **Auto (DHCP)**. Didn't write\ndown the exact path — next time I'm at the printer I need to document it.\n\n## todo\n\n- [ ] turn off \"Olivet Bible Church\" SSID on the old Spectrum router (requires admin portal access)\n- [ ] wall-mount Eero 2 to extend range to kid's wing\n- [ ] consider getting a 4th Eero for Fellowship Hall coverage\n- [ ] set the printer to a DHCP reservation on the Eero so its IP doesn't change\n- [ ] fix the shared password between OBC-Admin and OBC-Guest (currently the same)\n- [ ] re-run the damaged ethernet cable from the networking closet to the sanctuary\n  - once done, plug blue #4 into the switch, feeding Eero 3 at the tech bar\n  - Eero 3 can then feed Switch 3 for the tech bar devices\n  - **Eero 3 might be able to do this without a new run depending on strength of their back-haul**\n\n## topology\n\n![20260517133911_bfaa446e.png](https://cdn.statically.io/gh/pypeaday/images.pype.dev/main/blog-media/20260517133911_bfaa446e.png)\n",
      "summary": "Spectrum brings internet in via coax to their modem. The modem feeds the Eero (acting as gateway, handing out 192.168.4.0/24). Downstream of the Eero is the...",
      "date_published": "2026-05-16T12:26:46Z",
      "date_modified": "2026-05-16T12:26:46Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "olivet-bible-church",
        "note"
      ]
    },
    {
      "id": "https://pype.dev/dataops/",
      "url": "https://pype.dev/dataops/",
      "title": "DataOps",
      "content_html": "\u003cp\u003eold: \u003ca href=\"/using-restic-to-backup-my-home-directory/\" class=\"wikilink\" data-title=\"Using restic to backup my home directory\" data-description=\"I need to backup my personal $HOME to my NAS cause there\u0026#39;s a lot in there, and mostly my git projects with .env files all over. Plus some docker data\" data-date=\"2025-07-16\" data-preview=\"I need to backup my personal $HOME to my NAS cause there\u0026#39;s a lot in there, and mostly my git projects with .env files all over. Plus some docker data\"\u003eUsing restic to backup my home directory\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eNOTE: zfs-ops is now in my \u003ca href=\"/forgejo/\" class=\"glossary-term\" title=\"self-hosted code forge - codeberg - fork of gittea\" data-hover-title=\"forgejo\"\u003eforgejo\u003c/a\u003e instance. ghost, ghost-vault, and my desktop clone from forgejo\nNOTE: zfs-ops and homelab-mono/dataops are separate, they could be combined\u003c/p\u003e\n\u003ch2 id=\"things-to-backup\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThings to Backup\u003c/span\u003e \u003ca href=\"#things-to-backup\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eDesktop\n\u003cul\u003e\n\u003cli\u003eprojects + workspaces\nsans .venv and other stuff\u003c/li\u003e\n\u003cli\u003ehome directory\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eServer\n\u003cul\u003e\n\u003cli\u003ezfs datasets in tank (nas, \u003ca href=\"/docker/\" class=\"glossary-term\" title=\"docker - container runtime\" data-hover-title=\"docker\"\u003edocker\u003c/a\u003e, etc.)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"aurora-desktop-disk-layout\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAurora (Desktop) Disk Layout\u003c/span\u003e \u003ca href=\"#aurora-desktop-disk-layout\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eDevice\u003c/th\u003e\n\u003cth\u003eSize\u003c/th\u003e\n\u003cth\u003ePool\u003c/th\u003e\n\u003cth\u003eDatasets\u003c/th\u003e\n\u003cth\u003eMounts\u003c/th\u003e\n\u003cth\u003eRole\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eSamsung 970 EVO NVMe\u003c/td\u003e\n\u003ctd\u003e500 GB\u003c/td\u003e\n\u003ctd\u003e—\u003c/td\u003e\n\u003ctd\u003e—\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/\u003c/code\u003e, \u003ccode\u003e/home\u003c/code\u003e, \u003ccode\u003e/boot\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eBoot + OS\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSamsung 870 EVO SATA\u003c/td\u003e\n\u003ctd\u003e1 TB\u003c/td\u003e\n\u003ctd\u003e—\u003c/td\u003e\n\u003ctd\u003e—\u003c/td\u003e\n\u003ctd\u003e—\u003c/td\u003e\n\u003ctd\u003eVMs / scratch / future\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eCrucial BX500 SATA\u003c/td\u003e\n\u003ctd\u003e2 TB\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003edocker-storage-zfs\u003c/code\u003e 🡒 \u003ccode\u003eorbit\u003c/code\u003e (planned)\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003evolumes/\u003c/code\u003e, \u003ccode\u003eprojects/\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/var/docker-storage-zfs\u003c/code\u003e, \u003ccode\u003e~/projects\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePrimary — Docker volumes + projects\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSeagate IronWolf HDD\u003c/td\u003e\n\u003ctd\u003e4 TB\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003edepot\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003esanoid/\u003c/code\u003e, \u003ccode\u003erestic/\u003c/code\u003e, \u003ccode\u003envme-rsync/\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e—\u003c/td\u003e\n\u003ctd\u003eBackup target\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"how\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHow\u003c/span\u003e \u003ca href=\"#how\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eDesktop\n\u003cul\u003e\n\u003cli\u003eWill use 2TB disk, renaming docker-storage-zfs to orbin for kicks, I knew I\u0026rsquo;d regret naming it docker-storage-zfs anyways from \u003ca href=\"/desktop-crash-2026/\" class=\"wikilink\" data-title=\"Desktop Crash 2026\" data-description=\"Desktop crashed days ago, apparently my primary drive has been going bad for a while and eventually it just died.\" data-date=\"2026-04-22\" data-preview=\"Desktop crashed days ago, apparently my primary drive has been going bad for a while and eventually it just died.\"\u003eDesktop Crash 2026\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eprojects\u003c/code\u003e\n\u003cul\u003e\n\u003cli\u003ezfs dataset mounted to ~/projects\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e will need to ignore it in the $HOME backup solution\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edocker-volumes\u003c/code\u003e will just be named \u003ccode\u003evolumes\u003c/code\u003e\n\u003cul\u003e\n\u003cli\u003emounted to \u003ccode\u003e/var/docker-storage-zfs/\u003c/code\u003e, might change mountpoint, only relevant to my compose files\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e$HOME\u003c/code\u003e directory is NOT zfs\n\u003cul\u003e\n\u003cli\u003ersync to a zfs dataset on an external SSD, same one that projects is on but the difference is that projects is mounted from there and the home directory is just backed up to it.\u003c/li\u003e\n\u003cli\u003efrom there backup to NAS just like projects\u0026hellip; so no matter what we\u0026rsquo;ll go from the 2 or 4 TB disk in my desktop to ghost:/tank/\u0026hellip; and then tank replicates to to the harbor zpool, and that\u0026rsquo;s all local in my house across 2 machines (desktop and NAS, NAS has tank and harbor)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eLocal backup to 4TB disk on device, pool will be \u003ccode\u003edepot\u003c/code\u003e and I can setup \u003ccode\u003edepot\u003c/code\u003e -\u0026gt; \u003ccode\u003etank\u003c/code\u003e if I find it relevant\u0026hellip;\n\u003cul\u003e\n\u003cli\u003ethe redundancy to my NAS would give me only redundancy, maybe for off-site set something up from \u003ccode\u003edepot\u003c/code\u003e -\u0026gt; \u003ccode\u003eghost-vault:/tank\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e ?? $HOME\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e ?? projects\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e ??docker volumes\n\u003cul\u003e\n\u003cli\u003especific volumes maybe?\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eServer\n\u003cul\u003e\n\u003cli\u003etank -\u0026gt; harbor is local redundancy\u003c/li\u003e\n\u003cli\u003esanoid sends configured zfs datasets from tank -\u0026gt; ghost-vault\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"todos\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTODOs\u003c/span\u003e \u003ca href=\"#todos\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cinput checked=\"\" disabled=\"\" type=\"checkbox\"\u003e rename \u003ccode\u003edocker-storage-zfs\u003c/code\u003e to \u003ccode\u003eorbit\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cinput checked=\"\" disabled=\"\" type=\"checkbox\"\u003e create \u003ccode\u003eprojects\u003c/code\u003e zfs dataset in \u003ccode\u003eorbit\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e setup zfs dataset for home directory backup on \u003ccode\u003eorbit\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cinput checked=\"\" disabled=\"\" type=\"checkbox\"\u003e set mountpoint for projects\u003c/li\u003e\n\u003cli\u003e\u003cinput checked=\"\" disabled=\"\" type=\"checkbox\"\u003e set mountpoint for docker volumes dataset\u003c/li\u003e\n\u003cli\u003e\u003cinput checked=\"\" disabled=\"\" type=\"checkbox\"\u003e restart the ai stack containers after validating compose file volume path is correct\n\u003cul\u003e\n\u003cli\u003ethe \u0026ldquo;\u0026hellip;/volume/\u0026rdquo; part will probably be wrong\u003c/li\u003e\n\u003cli\u003ejust kept the mountpoint as /var/docker-storage-zfs/\u003cem\u003efor orbit/volumes/\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e setup appropriate backup (rsync, restic, etc.) for home directory to \u003ccode\u003eorbit\u003c/code\u003e\u0026rsquo;s backup dataset\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e setup sanoid snapshot schedule in zfs-ops\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e setup syncoid script/systemd for \u003ccode\u003eorbit\u003c/code\u003e to \u003ccode\u003edepot\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e recover the rest of my projects from emergency or home-restore\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e remove orbit/emergency\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e remove orgit/home-restore\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e remove orbit/volumes/mcphub\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e remove orbit/volumes/tdarr maybe?\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\nold: \u003ca href=\"/using-restic-to-backup-my-home-directory/\" class=\"wikilink\" data-title=\"Using restic to backup my home directory\" data-description=\"I need to backup my personal $HOME to my NAS cause there\u0026#39;s a lot in there, and mostly my git projects with .env files all over. Plus some docker data\" data-date=\"2025-07-16\"\u003eUsing restic to backup my home directory\u003c/a\u003e\n\nNOTE: zfs-ops is now in my forgejo instance. ghost, ghost-vault, and my desktop clone from forgejo\nNOTE: zfs-ops and homelab-mono/dataops are separate, they could be combined\n\n## Things to Backup\n\n- Desktop\n  - projects + workspaces\n    sans .venv and other stuff\n  - home directory\n- Server\n  - zfs datasets in tank (nas, docker, etc.)\n\n## Aurora (Desktop) Disk Layout\n\n| Device               | Size   | Pool                                     | Datasets                            | Mounts                                  | Role                                |\n| -------------------- | ------ | ---------------------------------------- | ----------------------------------- | --------------------------------------- | ----------------------------------- |\n| Samsung 970 EVO NVMe | 500 GB | —                                        | —                                   | `/`, `/home`, `/boot`                   | Boot + OS                           |\n| Samsung 870 EVO SATA | 1 TB   | —                                        | —                                   | —                                       | VMs / scratch / future              |\n| Crucial BX500 SATA   | 2 TB   | `docker-storage-zfs` 🡒 `orbit` (planned) | `volumes/`, `projects/`             | `/var/docker-storage-zfs`, `~/projects` | Primary — Docker volumes + projects |\n| Seagate IronWolf HDD | 4 TB   | `depot`                                  | `sanoid/`, `restic/`, `nvme-rsync/` | —                                       | Backup target                       |\n\n## How\n\n- Desktop\n  - Will use 2TB disk, renaming docker-storage-zfs to orbin for kicks, I knew I'd regret naming it docker-storage-zfs anyways from \u003ca href=\"/desktop-crash-2026/\" class=\"wikilink\" data-title=\"Desktop Crash 2026\" data-description=\"Desktop crashed days ago, apparently my primary drive has been going bad for a while and eventually it just died.\" data-date=\"2026-04-22\"\u003eDesktop Crash 2026\u003c/a\u003e\n  - `projects`\n    - zfs dataset mounted to ~/projects\n    - [ ] will need to ignore it in the $HOME backup solution\n  - `docker-volumes` will just be named `volumes`\n    - mounted to `/var/docker-storage-zfs/`, might change mountpoint, only relevant to my compose files\n  - `$HOME` directory is NOT zfs\n    - rsync to a zfs dataset on an external SSD, same one that projects is on but the difference is that projects is mounted from there and the home directory is just backed up to it.\n    - from there backup to NAS just like projects... so no matter what we'll go from the 2 or 4 TB disk in my desktop to ghost:/tank/... and then tank replicates to to the harbor zpool, and that's all local in my house across 2 machines (desktop and NAS, NAS has tank and harbor)\n  - Local backup to 4TB disk on device, pool will be `depot` and I can setup `depot` -\u003e `tank` if I find it relevant...\n    - the redundancy to my NAS would give me only redundancy, maybe for off-site set something up from `depot` -\u003e `ghost-vault:/tank`\n    - [ ] ?? $HOME\n    - [ ] ?? projects\n    - [ ] ??docker volumes\n      - specific volumes maybe?\n- Server\n  - tank -\u003e harbor is local redundancy\n  - sanoid sends configured zfs datasets from tank -\u003e ghost-vault\n\n## TODOs\n\n- [x] rename `docker-storage-zfs` to `orbit`\n- [x] create `projects` zfs dataset in `orbit`\n- [ ] setup zfs dataset for home directory backup on `orbit`\n- [x] set mountpoint for projects\n- [x] set mountpoint for docker volumes dataset\n- [x] restart the ai stack containers after validating compose file volume path is correct\n  - the \".../volume/\" part will probably be wrong\n  - just kept the mountpoint as /var/docker-storage-zfs/_for orbit/volumes/_\n- [ ] setup appropriate backup (rsync, restic, etc.) for home directory to `orbit`'s backup dataset\n- [ ] setup sanoid snapshot schedule in zfs-ops\n- [ ] setup syncoid script/systemd for `orbit` to `depot`\n- [ ] recover the rest of my projects from emergency or home-restore\n- [ ] remove orbit/emergency\n- [ ] remove orgit/home-restore\n- [ ] remove orbit/volumes/mcphub\n- [ ] remove orbit/volumes/tdarr maybe?\n",
      "summary": "old: using-restic-to-backup-my-home-directory",
      "date_published": "2026-05-07T06:33:03Z",
      "date_modified": "2026-05-07T06:33:03Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "dataops",
        "jira",
        "doing"
      ]
    },
    {
      "id": "https://pype.dev/talking-with-jason-about-real-estate/",
      "url": "https://pype.dev/talking-with-jason-about-real-estate/",
      "title": "Talking with Jason about Real Estate",
      "content_html": "\u003cul\u003e\n\u003cli\u003elicense took 1 month, $1k, test, done.\u003c/li\u003e\n\u003cli\u003ehard part is getting started\n\u003cul\u003e\n\u003cli\u003eno client base\u003c/li\u003e\n\u003cli\u003eno knowledge\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e80% of agents fail\n\u003cul\u003e\n\u003cli\u003erenewal rates show 80% don\u0026rsquo;t renew every 3 years (national \u0026ldquo;clock\u0026rdquo;)\u003c/li\u003e\n\u003cli\u003eno leads\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eJason has a system for his agents\n\u003cul\u003e\n\u003cli\u003e14 people work for him\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"advice\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eAdvice\u003c/span\u003e \u003ca href=\"#advice\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003efind someone who is looking to grow agents\u003c/li\u003e\n\u003cli\u003ecommit or don\u0026rsquo;t do it, but don\u0026rsquo;t quit\u003c/li\u003e\n\u003cli\u003etakes a month to learn\n\u003cul\u003e\n\u003cli\u003e3 months to ramp up\u003c/li\u003e\n\u003cli\u003e2 months to close first house\u003c/li\u003e\n\u003cli\u003efirst 6 months without a paycheck\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003etakes 2 years to build it\u003c/li\u003e\n\u003cli\u003ewould never go back to the car business\u003c/li\u003e\n\u003cli\u003eCentury21 is in Appleton\n\u003cul\u003e\n\u003cli\u003ejamesville\u003c/li\u003e\n\u003cli\u003ealtuna\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n\n- license took 1 month, $1k, test, done.\n- hard part is getting started\n  - no client base\n  - no knowledge\n- 80% of agents fail\n  - renewal rates show 80% don't renew every 3 years (national \"clock\")\n  - no leads\n- Jason has a system for his agents\n  - 14 people work for him\n\n## Advice\n\n- find someone who is looking to grow agents\n- commit or don't do it, but don't quit\n- takes a month to learn\n  - 3 months to ramp up\n  - 2 months to close first house\n  - first 6 months without a paycheck\n- takes 2 years to build it\n- would never go back to the car business\n- Century21 is in Appleton\n  - jamesville\n  - altuna\n",
      "summary": "license took 1 month, $1k, test, done. - hard part is getting started - no client base - no knowledge - 80% of agents fail - renewal rates show 80% don't...",
      "date_published": "2026-04-28T14:12:53Z",
      "date_modified": "2026-04-28T14:12:53Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "careers",
        "note"
      ]
    },
    {
      "id": "https://pype.dev/desktop-setup-2026/",
      "url": "https://pype.dev/desktop-setup-2026/",
      "title": "Desktop Setup 2026",
      "content_html": "\u003ch2 id=\"overview\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOverview\u003c/span\u003e \u003ca href=\"#overview\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eafter \u003ca href=\"/desktop-crash-2026/\" class=\"wikilink\" data-title=\"Desktop Crash 2026\" data-description=\"Desktop crashed days ago, apparently my primary drive has been going bad for a while and eventually it just died.\" data-date=\"2026-04-22\" data-preview=\"Desktop crashed days ago, apparently my primary drive has been going bad for a while and eventually it just died.\"\u003eDesktop Crash 2026\u003c/a\u003e I need to set new things up, I\u0026rsquo;ll track work here\u003c/p\u003e\n\u003ch2 id=\"services\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eServices\u003c/span\u003e \u003ca href=\"#services\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e NEED TO SETUP \u003ca href=\"/docker/\" class=\"glossary-term\" title=\"docker - container runtime\" data-hover-title=\"docker\"\u003eDOCKER\u003c/a\u003e WAIT FOR ZFS\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e speakr\n\u003cul\u003e\n\u003cli\u003etook it, and all the \u0026ldquo;ai\u0026rdquo; stack off \u0026lsquo;phantomlink\u0026rsquo;\u003c/li\u003e\n\u003cli\u003eit came back with all my data after shifting it around disks\u003c/li\u003e\n\u003cli\u003e\u003cinput checked=\"\" disabled=\"\" type=\"checkbox\"\u003e need to reverify this after zfs dataset move\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cinput checked=\"\" disabled=\"\" type=\"checkbox\"\u003e ollama\n\u003cul\u003e\n\u003cli\u003elazydocker + \u003ccode\u003eE\u003c/code\u003e to pop a shell\u003c/li\u003e\n\u003cli\u003e\u003cinput checked=\"\" disabled=\"\" type=\"checkbox\"\u003e validate model migration from boot disk volumes path to zfs\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cinput checked=\"\" disabled=\"\" type=\"checkbox\"\u003e whisper_asr\n\u003cul\u003e\n\u003cli\u003eup just fine, speakr using it for transcription\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cinput checked=\"\" disabled=\"\" type=\"checkbox\"\u003e open-webui\n\u003cul\u003e\n\u003cli\u003ecorrupted database, not sure what to do\u003c/li\u003e\n\u003cli\u003enew instance\u0026hellip; just lose what I had\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e dad-can-i-wear-this model\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cinput checked=\"\" disabled=\"\" type=\"checkbox\"\u003e remove /var/docker-storage-zfs/volumes/ after ollama migration\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"ssh\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSSH\u003c/span\u003e \u003ca href=\"#ssh\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eNeed to update my new ssh config and handles keys. I\u0026rsquo;ll use this as an\nopportunity to not proliferate tons of keys on my machine. I was making new\nkeys per user per client machine per target machine\u0026hellip; I think I\u0026rsquo;ll just go\nback to ssh\u0026rsquo;ing as myself and only generate keys per client. ie. from my\ndesktop I\u0026rsquo;ll only need 1 key except in the case of some of my boxes where I\nsetup a different user, so maybe I\u0026rsquo;ll be cleaning up the users on some things\nas well\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cinput checked=\"\" disabled=\"\" type=\"checkbox\"\u003e \u003ca href=\"/forgejo/\" class=\"glossary-term\" title=\"self-hosted code forge - codeberg - fork of gittea\" data-hover-title=\"forgejo\"\u003eforgejo\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e pihole (I dont think this is around anymore, it\u0026rsquo;s the .3 in my old ssh config)\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e pihole-vpn (is this still around?)\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e opnsense\n\u003cul\u003e\n\u003cli\u003eupdate admin from dumbledore to nic?\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e ghost\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e ghost-vault\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e router (same config as opnsense, probably dont\u0026rsquo; need both)\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e pi3 (this is the real pihole I think)\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e rootpi3 (config for root user\u0026hellip; why not just sudo su when I login?)\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e miix\u003c/li\u003e\n\u003cli\u003e\u003cinput checked=\"\" disabled=\"\" type=\"checkbox\"\u003e jetkvm\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"data\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eData\u003c/span\u003e \u003ca href=\"#data\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003esee \u003ca href=\"/dataops/\" class=\"wikilink\" data-title=\"DataOps\" data-description=\"old: using-restic-to-backup-my-home-directory\" data-date=\"2026-05-07\" data-preview=\"old: using-restic-to-backup-my-home-directory\"\u003eDataOps\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"plans-to-build\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePlans to build\u003c/span\u003e \u003ca href=\"#plans-to-build\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003evibe code an observability thing that\n\u003cul\u003e\n\u003cli\u003eruns a restore in a container\u003c/li\u003e\n\u003cli\u003erun some \u003ca href=\"/kind/\" class=\"glossary-term\" title=\"kind - kubernetes in docker\" data-hover-title=\"kind\"\u003ekind\u003c/a\u003e of setup in that container at least for my shell and neovim and things\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003enetworking for babyblue-aurora -\u0026gt; aurora transition\u003c/li\u003e\n\u003cli\u003elament draft posts that are lost\u003c/li\u003e\n\u003cli\u003essh keys\u0026hellip; lost .skm directory, look if it\u0026rsquo;s copied anywhere otherwise rotate keys and simplify\u003c/li\u003e\n\u003cli\u003eworkspace backup everynight\u0026hellip; abuse git for this\n\u003cul\u003e\n\u003cli\u003eor rsync to external drive, you have zfs on aurora now\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eopencode to address neovim logs\u003c/li\u003e\n\u003cli\u003eswitch to zellij?\n\u003cul\u003e\n\u003cli\u003ewhat would have to translate from tmux? probably quite a few keybindings\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n## Overview\n\nafter \u003ca href=\"/desktop-crash-2026/\" class=\"wikilink\" data-title=\"Desktop Crash 2026\" data-description=\"Desktop crashed days ago, apparently my primary drive has been going bad for a while and eventually it just died.\" data-date=\"2026-04-22\"\u003eDesktop Crash 2026\u003c/a\u003e I need to set new things up, I'll track work here\n\n## Services\n\n- [ ] NEED TO SETUP DOCKER WAIT FOR ZFS\n- [ ] speakr\n  - took it, and all the \"ai\" stack off 'phantomlink'\n  - it came back with all my data after shifting it around disks\n  - [x] need to reverify this after zfs dataset move\n- [x] ollama\n  - lazydocker + `E` to pop a shell\n  - [x] validate model migration from boot disk volumes path to zfs\n- [x] whisper_asr\n  - up just fine, speakr using it for transcription\n- [x] open-webui\n  - corrupted database, not sure what to do\n  - new instance... just lose what I had\n  - [ ] dad-can-i-wear-this model\n- [x] remove /var/docker-storage-zfs/volumes/ after ollama migration\n\n## SSH\n\nNeed to update my new ssh config and handles keys. I'll use this as an\nopportunity to not proliferate tons of keys on my machine. I was making new\nkeys per user per client machine per target machine... I think I'll just go\nback to ssh'ing as myself and only generate keys per client. ie. from my\ndesktop I'll only need 1 key except in the case of some of my boxes where I\nsetup a different user, so maybe I'll be cleaning up the users on some things\nas well\n\n- [x] forgejo\n- [ ] pihole (I dont think this is around anymore, it's the .3 in my old ssh config)\n- [ ] pihole-vpn (is this still around?)\n- [ ] opnsense\n  - update admin from dumbledore to nic?\n- [ ] ghost\n- [ ] ghost-vault\n- [ ] router (same config as opnsense, probably dont' need both)\n- [ ] pi3 (this is the real pihole I think)\n- [ ] rootpi3 (config for root user... why not just sudo su when I login?)\n- [ ] miix\n- [x] jetkvm\n\n## Data\n\n- see \u003ca href=\"/dataops/\" class=\"wikilink\" data-title=\"DataOps\" data-description=\"old: using-restic-to-backup-my-home-directory\" data-date=\"2026-05-07\"\u003eDataOps\u003c/a\u003e\n\n## Plans to build\n\n- vibe code an observability thing that\n  - runs a restore in a container\n  - run some kind of setup in that container at least for my shell and neovim and things\n- networking for babyblue-aurora -\u003e aurora transition\n- lament draft posts that are lost\n- ssh keys... lost .skm directory, look if it's copied anywhere otherwise rotate keys and simplify\n- workspace backup everynight... abuse git for this\n  - or rsync to external drive, you have zfs on aurora now\n- opencode to address neovim logs\n- switch to zellij?\n  - what would have to translate from tmux? probably quite a few keybindings\n",
      "summary": "after desktop-crash-2026 I need to set new things up, I'll track work here",
      "date_published": "2026-04-26T07:09:48Z",
      "date_modified": "2026-04-26T07:09:48Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "pc",
        "jira",
        "doing"
      ]
    },
    {
      "id": "https://pype.dev/desktop-crash-2026/",
      "url": "https://pype.dev/desktop-crash-2026/",
      "title": "Desktop Crash 2026",
      "content_html": "\u003ch2 id=\"pc-crash\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePC Crash\u003c/span\u003e \u003ca href=\"#pc-crash\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eDesktop crashed days ago, apparently my primary drive has been going bad for a while and eventually it just died.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003elive-booted to ubuntu server\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003efound restic backup script to NAS\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eedited to be smaller, but did the backup to the NAS\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ersync\u0026rsquo;d \u003ca href=\"/docker/\" class=\"glossary-term\" title=\"docker - container runtime\" data-hover-title=\"docker\"\u003edocker\u003c/a\u003e volumes to BX500 SSD which is a zfs pool\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ecaptured what I did on ghost at /home/nic/aurora-recovery-report.md and /home/nic/aurora-crash-disk-health-report.md\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"plan\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePLAN\u003c/span\u003e \u003ca href=\"#plan\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cinput checked=\"\" disabled=\"\" type=\"checkbox\"\u003e install \u003csub\u003eubunto\u003c/sub\u003e Aurora on 500 GB Samsung\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e create zfs dataset for projects /tank/volumes/projects\n\u003cul\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e which disk?\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e mount zfs dataset /tank/volumes/projects to /home/nic/projects\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e zfs for home? probably not, keep home on ext4\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e mount old home and sync directly\n\u003cul\u003e\n\u003cli\u003erestoring old backups to 2TB disk, will selectively copy things over\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cinput checked=\"\" disabled=\"\" type=\"checkbox\"\u003e jetkvm key rotation\n\u003cul\u003e\n\u003cli\u003eI recovered the old id_rsa one but I\u0026rsquo;m going to simplify my ssh key usage, so sticking with my default key, updated this in the jetkvm /settings/advanced webui\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cinput checked=\"\" disabled=\"\" type=\"checkbox\"\u003e restore restic backup to a temp location \u003ccode\u003e/var/docker-storage-zfs/home-restore/\u003c/code\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e figure out what to keep\n\u003cul\u003e\n\u003cli\u003e.skm (or consolidate keys)\u003c/li\u003e\n\u003cli\u003e\u003c/li\u003e\n\u003cli\u003e???\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cinput checked=\"\" disabled=\"\" type=\"checkbox\"\u003e install windsurf in an ubuntu distrobox\n\u003cul\u003e\n\u003cli\u003e\u003cinput checked=\"\" disabled=\"\" type=\"checkbox\"\u003e \u003ccode\u003edistroboc create UbuntuDev --image=ubuntu:22.04\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cinput checked=\"\" disabled=\"\" type=\"checkbox\"\u003e \u003ca href=\"https://windsurf.com/download/editor?os=linux\"\u003ehttps://windsurf.com/download/editor?os=linux\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cinput checked=\"\" disabled=\"\" type=\"checkbox\"\u003e manual install method from distrobox\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e restore .windsurf? it\u0026rsquo;s super old\u0026hellip;\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"outcome\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eOutcome\u003c/span\u003e \u003ca href=\"#outcome\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eThis is going terribly\u0026hellip; blog post coming on what I should\u0026rsquo;ve done. What\u0026rsquo;s\nactually happening is that I basically just lost everything on that desktop\nexcept my homelab repo thank God\u0026hellip;\u003c/p\u003e\n\u003ch2 id=\"plans-to-build\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePlans to build\u003c/span\u003e \u003ca href=\"#plans-to-build\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003evibe code an observability thing that\n\u003cul\u003e\n\u003cli\u003eruns a restore in a container\u003c/li\u003e\n\u003cli\u003erun some \u003ca href=\"/kind/\" class=\"glossary-term\" title=\"kind - kubernetes in docker\" data-hover-title=\"kind\"\u003ekind\u003c/a\u003e of setup in that container at least for my shell and neovim and things\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003enetworking for babyblue-aurora -\u0026gt; aurora transition\u003c/li\u003e\n\u003cli\u003elament draft posts that are lost\u003c/li\u003e\n\u003cli\u003essh keys\u0026hellip; lost .skm directory, look if it\u0026rsquo;s copied anywhere otherwise rotate keys and simplify\u003c/li\u003e\n\u003cli\u003eworkspace backup everynight\u0026hellip; abuse git for this\n\u003cul\u003e\n\u003cli\u003eor rsync to external drive, you have zfs on aurora now\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eopencode to address neovim logs\u003c/li\u003e\n\u003cli\u003eswitch to zellij?\n\u003cul\u003e\n\u003cli\u003ewhat would have to translate from tmux? probably quite a few keybindings\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eI\u0026rsquo;ve been drowning in anxiety and depression over tech and AI, work and requirements, and my desktop SSD catastrophically failing while I didn\u0026rsquo;t have an up to date backup\u0026hellip; projects, ssh keys, ideas\u0026hellip; gone. And that\u0026rsquo;s ok, life goes on, so here\u0026rsquo;s my start of a hectic list of what I\u0026rsquo;m doing to setup my desktop again. This will turn into a small post, a sister-post to the one I need to write about how I should\u0026rsquo;ve recovered from my live boot environment\u003c/p\u003e\n",
      "content_text": "\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- [x] install ~ubunto~ Aurora on 500 GB Samsung\n- [ ] create zfs dataset for projects /tank/volumes/projects\n  - [ ] which disk?\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  - restoring old backups to 2TB disk, will selectively copy things over\n- [x] jetkvm key rotation\n  - I recovered the old id_rsa one but I'm going to simplify my ssh key usage, so sticking with my default key, updated this in the jetkvm /settings/advanced webui\n- [x] restore restic backup to a temp location `/var/docker-storage-zfs/home-restore/`\n  - [ ] figure out what to keep\n    - .skm (or consolidate keys)\n    -\n    - ???\n- [x] install windsurf in an ubuntu distrobox\n  - [x] `distroboc create UbuntuDev --image=ubuntu:22.04`\n  - [x] \u003chttps://windsurf.com/download/editor?os=linux\u003e\n  - [x] manual install method from distrobox\n  - [ ] restore .windsurf? it's super old...\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\n## Plans to build\n\n- vibe code an observability thing that\n  - runs a restore in a container\n  - run some kind of setup in that container at least for my shell and neovim and things\n- networking for babyblue-aurora -\u003e aurora transition\n- lament draft posts that are lost\n- ssh keys... lost .skm directory, look if it's copied anywhere otherwise rotate keys and simplify\n- workspace backup everynight... abuse git for this\n  - or rsync to external drive, you have zfs on aurora now\n- opencode to address neovim logs\n- switch to zellij?\n  - what would have to translate from tmux? probably quite a few keybindings\n\nI've been drowning in anxiety and depression over tech and AI, work and requirements, and my desktop SSD catastrophically failing while I didn't have an up to date backup... projects, ssh keys, ideas... gone. And that's ok, life goes on, so here's my start of a hectic list of what I'm doing to setup my desktop again. This will turn into a small post, a sister-post to the one I need to write about how I should've recovered from my live boot environment\n",
      "summary": "Desktop crashed days ago, apparently my primary drive has been going bad for a while and eventually it just died.",
      "date_published": "2026-04-22T05:57:40Z",
      "date_modified": "2026-04-22T05:57:40Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "advent",
        "note"
      ]
    },
    {
      "id": "https://pype.dev/fixing-firefox-launcher-on-kubuntu-22/",
      "url": "https://pype.dev/fixing-firefox-launcher-on-kubuntu-22/",
      "title": "Fixing Firefox Launcher on Kubuntu 22",
      "content_html": "\u003cul\u003e\n\u003cli\u003eProblem: Firefox installed but missing from KDE/Plasma app menu\u003c/li\u003e\n\u003cli\u003eRoot cause: No .desktop launcher file — Firefox only worked from terminal\u003c/li\u003e\n\u003cli\u003eSolution: Created desktop entry with standard KDE fields\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre\u003e\u003ccode\u003e\n[Desktop Entry]\nVersion=1.0\nName=Firefox\nGenericName=Web Browser\nComment=Web Browser\nExec=firefox %u\nTerminal=false\nIcon=firefox\nType=Application\nCategories=Network;WebBrowser;\nMimeType=x-scheme-handler/http;x-scheme-handler/https;\nStartupNotify=true\nStartupWMClass=firefox\n\n\u003c/code\u003e\u003c/pre\u003e\n\u003cul\u003e\n\u003cli\u003eLocation: ~/.local/share/applications/firefox.desktop (user-local, no sudo needed)\u003c/li\u003e\n\u003cli\u003eDiscovery step: Checked /usr/share/applications/ — empty for Firefox\u003c/li\u003e\n\u003cli\u003eApplied fix: Ran kbuildsycoca5 to rebuild Plasma\u0026rsquo;s menu cache\u003c/li\u003e\n\u003cli\u003eResult: Firefox now appears in app menu (Network category) and Alt+F2 autocomplete\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n- Problem: Firefox installed but missing from KDE/Plasma app menu\n- Root cause: No .desktop launcher file — Firefox only worked from terminal\n- Solution: Created desktop entry with standard KDE fields\n\n```\n\n[Desktop Entry]\nVersion=1.0\nName=Firefox\nGenericName=Web Browser\nComment=Web Browser\nExec=firefox %u\nTerminal=false\nIcon=firefox\nType=Application\nCategories=Network;WebBrowser;\nMimeType=x-scheme-handler/http;x-scheme-handler/https;\nStartupNotify=true\nStartupWMClass=firefox\n\n```\n\n- Location: ~/.local/share/applications/firefox.desktop (user-local, no sudo needed)\n- Discovery step: Checked /usr/share/applications/ — empty for Firefox\n- Applied fix: Ran kbuildsycoca5 to rebuild Plasma's menu cache\n- Result: Firefox now appears in app menu (Network category) and Alt+F2 autocomplete\n",
      "summary": "Problem: Firefox installed but missing from KDE/Plasma app menu - Root cause: No .desktop launcher file — Firefox only worked from terminal - Solution:...",
      "date_published": "2026-04-11T10:32:50Z",
      "date_modified": "2026-04-11T10:32:50Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "agents",
        "tech"
      ]
    },
    {
      "id": "https://pype.dev/florida-packing/",
      "url": "https://pype.dev/florida-packing/",
      "title": "Florida Packing",
      "content_html": "\u003ch2 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/h2\u003e\n\u003cul\u003e\n\u003cli\u003egirls don\u0026rsquo;t need their sleeping bags\u003c/li\u003e\n\u003cli\u003eI don\u0026rsquo;t need my BJJ stuff\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"my-inventory\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMy inventory\u003c/span\u003e \u003ca href=\"#my-inventory\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e4 pairs sleeping underwear + shorts\n= 4 t-shirts\u003c/li\u003e\n\u003cli\u003e2 hoodies (1 light 1 heavy)\u003c/li\u003e\n\u003cli\u003eorange 1/4 zip\u003c/li\u003e\n\u003cli\u003e2 pair socks (more if forecast is sub 70)\u003c/li\u003e\n\u003cli\u003e1 pair swimming trunks is probably enough\u003c/li\u003e\n\u003cli\u003e2 shorts\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n## Packing notes\n\n- girls don't need their sleeping bags\n- I don't need my BJJ stuff\n\n### My inventory\n\n- 4 pairs sleeping underwear + shorts\n  = 4 t-shirts\n- 2 hoodies (1 light 1 heavy)\n- orange 1/4 zip\n- 2 pair socks (more if forecast is sub 70)\n- 1 pair swimming trunks is probably enough\n- 2 shorts\n",
      "summary": "girls don't need their sleeping bags - I don't need my BJJ stuff",
      "date_published": "2026-03-20T07:26:28Z",
      "date_modified": "2026-03-20T07:26:28Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "florida",
        "note"
      ]
    },
    {
      "id": "https://pype.dev/oration-on-agents-and-being-crushed-by-responsibility/",
      "url": "https://pype.dev/oration-on-agents-and-being-crushed-by-responsibility/",
      "title": "Oration on Agents and being crushed by responsibility",
      "content_html": "\u003cp\u003eThe intention of this note is to become a blog post:\u003c/p\u003e\n\u003ch2 id=\"raw-recording\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eRaw Recording\u003c/span\u003e \u003ca href=\"#raw-recording\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eOkay, this is the oration for a blog post, maybe an open letter of sorts, as I am just wrestling with my new job and the responsibilities that either are put on me or that I\u0026rsquo;ve put on myself as the world is changing.\nAnd software development and software engineering and code writing\nis just changing, thanks to AI, thanks to agents and their introduction into the corporate environment.\nThe internet is full of opinions and ideas that push and pull and prod people in different directions.\nAnd every one of those ideas has contexts, which is necessary to keep in mind when filtering the ideas.\nAt a smaller startup where you can have a $200 a month Claude Code subscription for all of your engineers, that\u0026rsquo;s gonna\nyield certain results that\u0026rsquo;s going to encourage and invite certain people into that space to use those tools, the clawed tools, or Gemini or Codex.\nI work at a big company, Caterpillar.\nWe have a GitHub co-pilot, but through co-pilot we have access to the \u003ca href=\"/kind/\" class=\"glossary-term\" title=\"kind - kubernetes in docker\" data-hover-title=\"kind\"\u003ekind\u003c/a\u003e of frontier large language models.\nFrom there, we have access to the co-pilot harness, whether it\u0026rsquo;s co-pilot CLI or the co-pilot integration with Visual Studio code, or the other IDEs like JetBrains, et cetera.\nOut there in the world, he has certain opinions from some people.\nYou have people who are very pro agents like Steve Yeage, who has been a big influence to me over the last several months, as I\u0026rsquo;ve definitely jumped into the deep end of agentic coding.\nI haven\u0026rsquo;t even really opened my IDD in months, except for small things that I want to do by hand.\nenterprise grade work for the last three months or so and maybe a little longer has been fully written and produced by agents and i\u0026rsquo;ve been using AI to write code to some capacity or another since chad gpt came out really since like claude sonnet 3.5 but this thinking that i am doing is\nIt\u0026rsquo;s really supposed to be about me, so this blog post I want to write is me processing thoughts on the expectation change that\u0026rsquo;s placed on developers in certain environments for certain types of work.\nI guess even that, like that sounds kind of vague.\nSo I can only speak to myself.\nSo I need to put a big annotation and plaster this blog post with this big caveat message that this is me, this is my experience, this is my position, and this is not a truth that is wide reaching.\nIt\u0026rsquo;s not any kind of prediction on the, you know,\nthe larger change happening in the world.\nThis is just where I am at.\nSo maybe for the post to make sense, I need to give a brief amount of history about me and my work.\nI\u0026rsquo;m not a trained software engineer, but I\u0026rsquo;ve been, I guess I\u0026rsquo;ve been a pretty impressive asset in my employment.\nI\u0026rsquo;ve been at Caterpillar for nine years, and in that nine years or over in the last several years, I\u0026rsquo;ve moonlit, moonlighted a little bit.\nAnd at every place I\u0026rsquo;ve done any other amount of work, I\u0026rsquo;ve just consistently impressed people.\nNow, this really just leads me to have more imposter syndrome because I know or I have learned what impresses people,\nAnd it isn\u0026rsquo;t necessarily excellence, although I try to do things well and I want to solve problems and maintain the systems that I build to solve those problems.\nBut I don\u0026rsquo;t write the best code.\nI\u0026rsquo;m not the smartest developer.\nI don\u0026rsquo;t know the most.\nI get to know the things I work with and I learn a lot and I work fast because I have\nNot a super unique, but a rare ability to focus in, when the stars align, to focus and produce more than the next person.\nNot every next person, but a lot of the next people, a lot of the people I work with, I outperform.\nAnd that\u0026rsquo;s been true, or it has seemed true, from every review, pretty much every review I\u0026rsquo;ve ever received, that\u0026rsquo;s been true.\nAnd as I\u0026rsquo;ve had that just personal truth be reflected in my work, it\u0026rsquo;s been enhanced with AI because I\u0026rsquo;ve been an early adopter and even as a, even as somewhat of a skeptic, like I\u0026rsquo;ve tried to maintain a posture of skepticism.\nBut since Opus 4.5,\nEven though I might talk like a skeptic, I am leaning into agents hard.\nAnd I am practicing my own harness engineering with my nexus project.\nAnd I\u0026rsquo;m using it to do engineering work at Caterpillar that\u0026rsquo;s going into production for us, which is like data platform type of work.\nIt\u0026rsquo;s not custom, it\u0026rsquo;s not external customer facing.\nIt\u0026rsquo;s internal tooling, which is what I mostly built.\nAnd the thing I\u0026rsquo;m really trying to wrap my head around, or I guess I\u0026rsquo;m trying to explain, is without AI, I was out producing a lot of people.\nAnd with AI, you can produce just a shit ton of code.\nAnd I\u0026rsquo;m trying to do that part well, but in my own gifts and curses of hyper focus and\nWanting to meet expectations and solve problems, I\u0026rsquo;m jumping into the new frontier very quickly.\nBut something I\u0026rsquo;ve noticed is that as I\u0026rsquo;ve produced a lot, people are just impressed.\nAnd they\u0026rsquo;re not necessarily impressed with the excellence.\nThey\u0026rsquo;re impressed with how I talk about things.\nThey\u0026rsquo;re impressed with how much I do, and they\u0026rsquo;re impressed with the output they see.\nBut the result of a bunch of code isn\u0026rsquo;t all of the code itself.\nAnd I haven\u0026rsquo;t read all the code I\u0026rsquo;ve produced with agents.\nI\u0026rsquo;ve certainly tried to test most of it or had most of it tested.\nBut as I\u0026rsquo;ve sought to do this and as I\u0026rsquo;ve been working in this capacity of using agents very heavily, I just feel kind of torn.\nin trusting the agents and in working with the agents in the ways that I think are appropriate, but also collaborating with other humans who are also using AI.\nBut are they using AI in a trustworthy way?\nI don\u0026rsquo;t know, and I\u0026rsquo;m not sure how to validate it.\nBut my managers seem to think I know how to validate it, and they seem impressed with the work I do, and they seem impressed with my understanding of AI and agentic coding.\nAnd so I feel all of this pressure to continue to be a top performer like I have been since before AI.\nI feel a lot of pressure to, I don\u0026rsquo;t want to coach people in how I do things, but I\u0026rsquo;m being asked to coach people and how I do things because other people I work with notice me.\nAnd I guess I\u0026rsquo;m almost, I\u0026rsquo;m just kind of tired of being noticed.\nBecause being noticed is not resulting in me becoming rich.\nAnd money is not the most important thing.\nBut man, I\u0026rsquo;d love to just make enough money to fuck off for the rest of my life and never look at a computer ever again.\nI would love\u0026hellip;\nto not have to continue to maintain systems that I build or that other people build or to collaborate with people I don\u0026rsquo;t know, who might not even be long term.\nThat\u0026rsquo;s the one thing about Caterpillar is I\u0026rsquo;m working with a lot of contractors.\nAnd nothing wrong with contracting, I\u0026rsquo;ve done that.\nNothing wrong with being a contractor, but\nThey could disappear at any moment, and all the code that they write, and even today, all the code that they prompt and have an agent right becomes my problem, my maintenance issue, my responsibility.\nAnd it just is,\nIt\u0026rsquo;s just making me nervous to maintain and to understand and to continue to work under conditions that I can\u0026rsquo;t even tell if I\u0026rsquo;m making them for myself or if they\u0026rsquo;re real expectations.\nLike if I fell off the face of the earth or if I dropped agentic coding entirely and I just went back to coding by hand completely, would my output continue to impress people today?\nI don\u0026rsquo;t know the answer to that.\nBut I certainly wouldn\u0026rsquo;t be solving problems as fast, but would I be creating less problems?\nLike I\u0026rsquo;ve solved a lot of problems in three months in my new role here with Forge.\nBut I don\u0026rsquo;t know how many problems I\u0026rsquo;ve created.\nOnly time will tell.\nAnd the thing is, the guys I work with who are contractors, they might not be around long enough for time to tell, but because I\u0026rsquo;m not rich yet, I probably will be long enough, or be around long enough.\nto experience those bugs and those problems that I don\u0026rsquo;t know about yet.\nAnd I am just feeling so much pressure to be the best and to be the one to solve problems.\nAnd I don\u0026rsquo;t know if I\u0026rsquo;m putting it on me or if cat\u0026rsquo;s putting it on me or if my project manager is putting it on me.\nI\u0026rsquo;m just really struggling with the amount of responsibility I feel.\nAnd I\u0026rsquo;m feeling frustrated about it because that amount of responsibility feels like it has scaled a lot with agents, with AI, but not my paycheck.\nAnd in fact, my paycheck has gone down quite a bit.\nAnd I\u0026rsquo;m not more relaxed.\nI\u0026rsquo;m making about half of what I\u0026rsquo;ve made over the last couple of years.\nAnd I\u0026rsquo;m not more relaxed.\nI don\u0026rsquo;t feel freer.\nI don\u0026rsquo;t feel like I have 50% of the responsibility that I did.\nCal Autonomy awoke something in me for purpose, but that feels like it\u0026rsquo;s already starting to die.\nI\u0026rsquo;m already tired.\nI\u0026rsquo;m, I don\u0026rsquo;t know about burnt out, but I\u0026rsquo;m tired.\nI was reviewing some code that one of these contractors I\u0026rsquo;m working with.\nIt\u0026rsquo;s actually only an intern.\nHe\u0026rsquo;s not even a contractor.\nHe\u0026rsquo;s an intern.\nAnd I\u0026rsquo;m reviewing a pull request of his.\nAnd damn, it\u0026rsquo;s a lot of code.\nAnd it looks somewhat useful.\nBut I don\u0026rsquo;t know exactly how to test it.\nThat\u0026rsquo;s not true actually, I do know how to test it, but I don\u0026rsquo;t own enough of our infrastructure at Caterpillar to test it easily.\nSo do I trust him?\nDo I trust his prompt?\nDo I trust his harness?\nDo I trust the tests that I have already put in the code base to capture and block any breakages he might have introduced with this code for the code I\u0026rsquo;ve already been producing?\nIt\u0026rsquo;s different when I\u0026rsquo;m intimately familiar with the code base.\nAnd I\u0026rsquo;ve been, I don\u0026rsquo;t know, definitely two other places at least where I had very intimate familiarity with the system and with the code and with the platform.\nBut the one I\u0026rsquo;m on right now is new, and I built it.\nI built it with agents.\nI built it to replace a thing that was never even working.\nBut I built it.\nIt\u0026rsquo;s mine.\nIt\u0026rsquo;s not somebody else\u0026rsquo;s.\nIt\u0026rsquo;s not that we\u0026rsquo;ll document it.\nThere\u0026rsquo;s a lot of documentation, but it\u0026rsquo;s all been agent produced, and even though I\u0026rsquo;ve reviewed it, it\u0026rsquo;s hard for me to organize it in the right way in a way that makes sense.\nI\u0026rsquo;m just feeling so frustrated that it seems like, as the tools are getting better, as developers are able to move faster, it feels like I am expected to move faster.\nbut I\u0026rsquo;m not expected to make any more money.\nI\u0026rsquo;m not expected to be compensated anymore for the increase in velocity and responsibility.\nIt\u0026rsquo;s almost like if I could produce, this metric is not gonna be real, but let\u0026rsquo;s just, for the sake of argument, make it up.\nIf I can write 30,000 lines of code in a year and make $100,000, I feel fine about that, whatever that number means.\nBut now I can actually produce 300,000 lines of code in a year.\nI\u0026rsquo;m definitely producing 10 times more code than normal.\nI don\u0026rsquo;t know if I\u0026rsquo;m doing 10 times more engineering, but I am making exactly the same amount of money.\nAnd so why did I do it?\nWhy am I leaning into it so hard?\nWhy am I trying to still be the front runner to be on the bleeding edge when caterpillar is not going to pay anymore?\nAnd I could go somewhere else.\nI could go to Avant.\nI could make more.\nIt\u0026rsquo;s a system I\u0026rsquo;m familiar with.\nIt\u0026rsquo;s even people I know.\nAnd there\u0026rsquo;s AI there too.\nBut it\u0026rsquo;s a system I know.\nIt\u0026rsquo;s a system I know how to support and maintain.\nAnd there\u0026rsquo;s not an expectation that I\u0026rsquo;m going to produce 10,000 lines of code this week.\nBut right now at Caterpillar, it feels like I am expected to write 10,000 lines of code this week.\nAnd deploy it and maintain it and solve new problems.\nAll in an incredibly political and hectic, chaotic environment where there isn\u0026rsquo;t an appropriate amount of leadership over me.\nI am the expert in AI in my group.\nAnd that feels retarded.\nI am the professional agentic engineer and that is just scary because I\u0026rsquo;m not good enough to be that.\nI\u0026rsquo;m not Steve Yeagie, I\u0026rsquo;m not Simon Willison, I haven\u0026rsquo;t been a developer for 20 years.\nI\u0026rsquo;m just a guy who learned some Python to solve some problems and happen to work faster than a lot of people and that reputation has really\nIt\u0026rsquo;s treated me well for sure.\nAnd my disposition to problem solving has, up until recently, I felt like I had been, like I\u0026rsquo;ve been compensated well by my company, but then I\u0026rsquo;ve also been able to do more work outside of one job for me to feel the value of my own skills.\nBut now with AI changing everything,\nCan I show you what\u0026rsquo;s on the back of my story?\nIt feels like I\u0026rsquo;ve given up the personal gains.\nOne second, Alia.\nSo I\u0026rsquo;ve given up personally realizing the benefit of my own skill.\nAnd now I am like in a position where\nCaterpillar, and only Caterpillar, is reaping the benefit of my new scheme in agentic engineering.\nAnd I think that\u0026rsquo;s just ticking me off because I stayed with Catt to do something good for the world.\nAnd I think we can do something good for the world.\nBut I\u0026rsquo;m tired.\u003c/p\u003e\n\u003ch2 id=\"notes-and-summarization\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNotes and Summarization\u003c/span\u003e \u003ca href=\"#notes-and-summarization\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch2 id=\"possible-titles\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePossible Titles\u003c/span\u003e \u003ca href=\"#possible-titles\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eAgents, Responsibility, and the Cost of Going Faster\u003c/li\u003e\n\u003cli\u003eThe Irony of 10x\u003c/li\u003e\n\u003cli\u003eMore Output, Less Upside\u003c/li\u003e\n\u003cli\u003eWhen AI Made Me Faster and Poorer\u003c/li\u003e\n\u003cli\u003eBeing Crushed by Responsibility\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"working-angle\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWorking Angle\u003c/span\u003e \u003ca href=\"#working-angle\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThis should probably be a personal essay, not a manifesto about AI. The core tension:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eagents made me dramatically more productive\u003c/li\u003e\n\u003cli\u003ethat productivity increased the responsibility I carry\u003c/li\u003e\n\u003cli\u003ethe financial upside I used to realize personally has gone down, not up\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"section-stub-opening-scene\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSection Stub: Opening Scene\u003c/span\u003e \u003ca href=\"#section-stub-opening-scene\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003ePrompt:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eStart with a concrete moment. Maybe reviewing a massive PR from the intern / contractor side of the system.\u003c/li\u003e\n\u003cli\u003eWhat did I feel in that moment: confusion, dread, pressure, responsibility, skepticism?\u003c/li\u003e\n\u003cli\u003eWhat was the specific thought: \u0026ldquo;I might own all of this later, even if I did not really produce or validate all of it myself.\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eCan I open with one sharp sentence that names the tension right away?\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePossible opener idea:\u003c/p\u003e\n\u003cp\u003e\u0026ldquo;Agentic coding has made me faster than ever, but it has also made me feel responsible for more than I can honestly hold in my head.\u0026rdquo;\u003c/p\u003e\n\u003ch2 id=\"section-stub-this-is-about-me-not-everyone\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSection Stub: This Is About Me, Not Everyone\u003c/span\u003e \u003ca href=\"#section-stub-this-is-about-me-not-everyone\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003ePrompt:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eAdd a strong caveat early: this is not prediction, prescription, or universal truth.\u003c/li\u003e\n\u003cli\u003eName my context: big company, internal platform work, political environment, mixed team ownership, frontier models via Copilot.\u003c/li\u003e\n\u003cli\u003eWhat about my temperament matters here? Hyperfocus, initiative, problem solving, pressure sensitivity, desire to meet expectations.\u003c/li\u003e\n\u003cli\u003eWhat would I want a reader to not mishear?\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"section-stub-who-i-was-before-agents\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSection Stub: Who I Was Before Agents\u003c/span\u003e \u003ca href=\"#section-stub-who-i-was-before-agents\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003ePrompt:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eBriefly describe my work history and self-understanding.\u003c/li\u003e\n\u003cli\u003eI am not formally trained, so what made me valuable anyway?\u003c/li\u003e\n\u003cli\u003eWhat does it mean that people were impressed before AI too?\u003c/li\u003e\n\u003cli\u003ePull in relevant threads from \u003ccode\u003epages/blog/forge-ahead.md\u003c/code\u003e: prior projects, practical problem solving, being useful, learning systems by doing.\u003c/li\u003e\n\u003cli\u003eWhat gifts do I think God gave me that made me effective before this shift?\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eQuestions to answer:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eWhat kind of worker was I before agents entered my workflow?\u003c/li\u003e\n\u003cli\u003eWhat did I already know how to do well?\u003c/li\u003e\n\u003cli\u003eWhat part of my value came from focus rather than brilliance?\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"section-stub-why-i-leaned-into-agentic-coding\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSection Stub: Why I Leaned Into Agentic Coding\u003c/span\u003e \u003ca href=\"#section-stub-why-i-leaned-into-agentic-coding\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003ePrompt:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eExplain that I did not stumble into this accidentally; I chose to go hard.\u003c/li\u003e\n\u003cli\u003eWhy did it feel natural to me to adopt agents aggressively?\u003c/li\u003e\n\u003cli\u003eWhat about the mission at Caterpillar Autonomy made the leap feel worth it?\u003c/li\u003e\n\u003cli\u003ePull in \u003ccode\u003epages/blog/cat-autonomy-2-0.md\u003c/code\u003e: I stayed because the work felt meaningful, not merely because it was interesting.\u003c/li\u003e\n\u003cli\u003eMention harness engineering / Nexus / experimentation if it helps show this was a deliberate investment.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eQuestions to answer:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eWhy did I trust this direction enough to reorganize my work around it?\u003c/li\u003e\n\u003cli\u003eWas I chasing novelty, usefulness, recognition, mission, or all of the above?\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"section-stub-what-actually-changed\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSection Stub: What Actually Changed\u003c/span\u003e \u003ca href=\"#section-stub-what-actually-changed\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003ePrompt:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eDescribe the practical change in my day-to-day work.\u003c/li\u003e\n\u003cli\u003eI am no longer mainly writing code line by line; I am directing, reviewing, testing, and integrating generated work.\u003c/li\u003e\n\u003cli\u003eWhat changed about the quantity of output?\u003c/li\u003e\n\u003cli\u003eWhat changed about how coworkers and managers perceived me?\u003c/li\u003e\n\u003cli\u003eWhat changed about the kind of questions people started asking me?\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eQuestions to answer:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eWhen did I realize this was not just autocomplete, but a new mode of working?\u003c/li\u003e\n\u003cli\u003eWhat does \u0026ldquo;enterprise-grade work fully written and produced by agents\u0026rdquo; actually mean in practice?\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"section-stub-the-hidden-cost-of-speed\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSection Stub: The Hidden Cost of Speed\u003c/span\u003e \u003ca href=\"#section-stub-the-hidden-cost-of-speed\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003ePrompt:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eWrite about the gap between output and understanding.\u003c/li\u003e\n\u003cli\u003eI can ship more, but I do not always know the code as intimately as hand-written systems I built before.\u003c/li\u003e\n\u003cli\u003eTesting is not the same as ownership.\u003c/li\u003e\n\u003cli\u003eDocumentation existing is not the same as confidence.\u003c/li\u003e\n\u003cli\u003eWhat kinds of future problems does speed create?\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eQuestions to answer:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eWhat do I know I have not fully read?\u003c/li\u003e\n\u003cli\u003eWhat kinds of bugs or maintenance traps am I afraid I am creating?\u003c/li\u003e\n\u003cli\u003eWhat does it feel like to build something that works but still feels partially foreign?\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"section-stub-responsibility-without-clear-boundaries\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSection Stub: Responsibility Without Clear Boundaries\u003c/span\u003e \u003ca href=\"#section-stub-responsibility-without-clear-boundaries\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003ePrompt:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eThis may be the emotional center before the money section.\u003c/li\u003e\n\u003cli\u003eDescribe the contractor / intern dynamic and why it intensifies the burden.\u003c/li\u003e\n\u003cli\u003eTheir output can become my long-term maintenance problem.\u003c/li\u003e\n\u003cli\u003eThe organization sees me as someone who understands AI and agents, so responsibility pools onto me.\u003c/li\u003e\n\u003cli\u003eAsk whether the pressure is explicit or self-imposed, but note that the body feels it either way.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eQuestions to answer:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eWho is actually accountable when AI-assisted code breaks six months from now?\u003c/li\u003e\n\u003cli\u003eWhat does it mean to be treated like the local expert when I do not feel like one?\u003c/li\u003e\n\u003cli\u003eWhy is being noticed beginning to feel costly instead of rewarding?\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"section-stub-the-financial-irony\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSection Stub: The Financial Irony\u003c/span\u003e \u003ca href=\"#section-stub-the-financial-irony\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003ePrompt:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eState this clearly and concretely.\u003c/li\u003e\n\u003cli\u003eFor years, I realized more value from my output because I worked two jobs concurrently.\u003c/li\u003e\n\u003cli\u003eDue to the new role, new responsibility, and the demands of agentic coding in this environment, I had to go down to one job.\u003c/li\u003e\n\u003cli\u003eSo the irony is: the tools make me dramatically more productive, but I personally realize less economic upside from my own gifts and skills than I did before.\u003c/li\u003e\n\u003cli\u003eKeep this grounded and honest, not whiny.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eQuestions to answer:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eWhat exactly have I lost financially?\u003c/li\u003e\n\u003cli\u003eWhy does this feel bigger than \u0026ldquo;I want more money\u0026rdquo;?\u003c/li\u003e\n\u003cli\u003eWhere do the gains of AI go when an individual contributor gets faster?\u003c/li\u003e\n\u003cli\u003eIf I can now produce 10x more code, why does my life not feel lighter, freer, or better compensated?\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePossible thesis sentence:\u003c/p\u003e\n\u003cp\u003e\u0026ldquo;Agentic coding increased the value I create at work, while decreasing the share of that value I personally get to realize.\u0026rdquo;\u003c/p\u003e\n\u003ch2 id=\"section-stub-mission-meaning-and-fatigue\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSection Stub: Mission, Meaning, and Fatigue\u003c/span\u003e \u003ca href=\"#section-stub-mission-meaning-and-fatigue\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003ePrompt:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eReaffirm the good: this is meaningful work, and that matters to me.\u003c/li\u003e\n\u003cli\u003eTie back to autonomy, safety, and the reasons I stayed at Caterpillar.\u003c/li\u003e\n\u003cli\u003eThen tell the truth: meaning does not cancel fatigue.\u003c/li\u003e\n\u003cli\u003eWhat has already started to feel tired, dulled, or overdrawn in me?\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eQuestions to answer:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eWhat purpose did this role awaken in me?\u003c/li\u003e\n\u003cli\u003eWhy does that sense of purpose already feel threatened?\u003c/li\u003e\n\u003cli\u003eHow do I talk honestly about fatigue without pretending I am fully burned out if I am not sure?\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"section-stub-questions-i-cannot-yet-answer\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSection Stub: Questions I Cannot Yet Answer\u003c/span\u003e \u003ca href=\"#section-stub-questions-i-cannot-yet-answer\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003ePrompt:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eLet the essay breathe here instead of forcing a neat conclusion.\u003c/li\u003e\n\u003cli\u003eGather the real unresolved questions.\u003c/li\u003e\n\u003cli\u003eIf I stopped using agents, would I still impress people?\u003c/li\u003e\n\u003cli\u003eWould I solve fewer problems or create fewer future ones?\u003c/li\u003e\n\u003cli\u003eAm I carrying real expectations or anticipated ones?\u003c/li\u003e\n\u003cli\u003eIs this making me a better engineer, or just a faster source of output and responsibility?\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"section-stub-conclusion\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSection Stub: Conclusion\u003c/span\u003e \u003ca href=\"#section-stub-conclusion\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003ePrompt:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eEnd modestly, not with a manifesto.\u003c/li\u003e\n\u003cli\u003eI am not anti-AI.\u003c/li\u003e\n\u003cli\u003eI am not saying agents are bad.\u003c/li\u003e\n\u003cli\u003eI am trying to tell the truth about what this transition has cost me personally.\u003c/li\u003e\n\u003cli\u003eLand on the mismatch between speed, responsibility, and reward.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePossible closing direction:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eThe tools are real.\u003c/li\u003e\n\u003cli\u003eThe gains are real.\u003c/li\u003e\n\u003cli\u003eThe responsibility is real.\u003c/li\u003e\n\u003cli\u003eThe redistribution of value is also real.\u003c/li\u003e\n\u003cli\u003eI am still trying to understand what faithfulness looks like inside that tension.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"material-to-weave-in\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMaterial To Weave In\u003c/span\u003e \u003ca href=\"#material-to-weave-in\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eMy lack of formal software engineering background\u003c/li\u003e\n\u003cli\u003eMy history of being useful by solving practical problems quickly\u003c/li\u003e\n\u003cli\u003eMy tendency toward hyperfocus and over-responsibility\u003c/li\u003e\n\u003cli\u003eThe shift from hand-written confidence to agent-mediated uncertainty\u003c/li\u003e\n\u003cli\u003eThe contractor / intern maintenance concern\u003c/li\u003e\n\u003cli\u003eThe drop from two incomes to one\u003c/li\u003e\n\u003cli\u003eThe irony that Cat benefits more from my increased output than I do\u003c/li\u003e\n\u003cli\u003eThe Christian framing around calling, providence, stewardship, and fatigue\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"things-to-avoid\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThings To Avoid\u003c/span\u003e \u003ca href=\"#things-to-avoid\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003esounding like I am making universal claims about all AI use\u003c/li\u003e\n\u003cli\u003esounding bitter without being specific\u003c/li\u003e\n\u003cli\u003ecentering line-count metrics too much without translating them into responsibility\u003c/li\u003e\n\u003cli\u003epretending I have fully landed on a conclusion\u003c/li\u003e\n\u003cli\u003emaking this a complaint post about coworkers instead of a reflection on burden and change\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\nThe intention of this note is to become a blog post:\n\n## Raw Recording\n\nOkay, this is the oration for a blog post, maybe an open letter of sorts, as I am just wrestling with my new job and the responsibilities that either are put on me or that I've put on myself as the world is changing.\nAnd software development and software engineering and code writing\nis just changing, thanks to AI, thanks to agents and their introduction into the corporate environment.\nThe internet is full of opinions and ideas that push and pull and prod people in different directions.\nAnd every one of those ideas has contexts, which is necessary to keep in mind when filtering the ideas.\nAt a smaller startup where you can have a $200 a month Claude Code subscription for all of your engineers, that's gonna\nyield certain results that's going to encourage and invite certain people into that space to use those tools, the clawed tools, or Gemini or Codex.\nI work at a big company, Caterpillar.\nWe have a GitHub co-pilot, but through co-pilot we have access to the kind of frontier large language models.\nFrom there, we have access to the co-pilot harness, whether it's co-pilot CLI or the co-pilot integration with Visual Studio code, or the other IDEs like JetBrains, et cetera.\nOut there in the world, he has certain opinions from some people.\nYou have people who are very pro agents like Steve Yeage, who has been a big influence to me over the last several months, as I've definitely jumped into the deep end of agentic coding.\nI haven't even really opened my IDD in months, except for small things that I want to do by hand.\nenterprise grade work for the last three months or so and maybe a little longer has been fully written and produced by agents and i've been using AI to write code to some capacity or another since chad gpt came out really since like claude sonnet 3.5 but this thinking that i am doing is\nIt's really supposed to be about me, so this blog post I want to write is me processing thoughts on the expectation change that's placed on developers in certain environments for certain types of work.\nI guess even that, like that sounds kind of vague.\nSo I can only speak to myself.\nSo I need to put a big annotation and plaster this blog post with this big caveat message that this is me, this is my experience, this is my position, and this is not a truth that is wide reaching.\nIt's not any kind of prediction on the, you know,\nthe larger change happening in the world.\nThis is just where I am at.\nSo maybe for the post to make sense, I need to give a brief amount of history about me and my work.\nI'm not a trained software engineer, but I've been, I guess I've been a pretty impressive asset in my employment.\nI've been at Caterpillar for nine years, and in that nine years or over in the last several years, I've moonlit, moonlighted a little bit.\nAnd at every place I've done any other amount of work, I've just consistently impressed people.\nNow, this really just leads me to have more imposter syndrome because I know or I have learned what impresses people,\nAnd it isn't necessarily excellence, although I try to do things well and I want to solve problems and maintain the systems that I build to solve those problems.\nBut I don't write the best code.\nI'm not the smartest developer.\nI don't know the most.\nI get to know the things I work with and I learn a lot and I work fast because I have\nNot a super unique, but a rare ability to focus in, when the stars align, to focus and produce more than the next person.\nNot every next person, but a lot of the next people, a lot of the people I work with, I outperform.\nAnd that's been true, or it has seemed true, from every review, pretty much every review I've ever received, that's been true.\nAnd as I've had that just personal truth be reflected in my work, it's been enhanced with AI because I've been an early adopter and even as a, even as somewhat of a skeptic, like I've tried to maintain a posture of skepticism.\nBut since Opus 4.5,\nEven though I might talk like a skeptic, I am leaning into agents hard.\nAnd I am practicing my own harness engineering with my nexus project.\nAnd I'm using it to do engineering work at Caterpillar that's going into production for us, which is like data platform type of work.\nIt's not custom, it's not external customer facing.\nIt's internal tooling, which is what I mostly built.\nAnd the thing I'm really trying to wrap my head around, or I guess I'm trying to explain, is without AI, I was out producing a lot of people.\nAnd with AI, you can produce just a shit ton of code.\nAnd I'm trying to do that part well, but in my own gifts and curses of hyper focus and\nWanting to meet expectations and solve problems, I'm jumping into the new frontier very quickly.\nBut something I've noticed is that as I've produced a lot, people are just impressed.\nAnd they're not necessarily impressed with the excellence.\nThey're impressed with how I talk about things.\nThey're impressed with how much I do, and they're impressed with the output they see.\nBut the result of a bunch of code isn't all of the code itself.\nAnd I haven't read all the code I've produced with agents.\nI've certainly tried to test most of it or had most of it tested.\nBut as I've sought to do this and as I've been working in this capacity of using agents very heavily, I just feel kind of torn.\nin trusting the agents and in working with the agents in the ways that I think are appropriate, but also collaborating with other humans who are also using AI.\nBut are they using AI in a trustworthy way?\nI don't know, and I'm not sure how to validate it.\nBut my managers seem to think I know how to validate it, and they seem impressed with the work I do, and they seem impressed with my understanding of AI and agentic coding.\nAnd so I feel all of this pressure to continue to be a top performer like I have been since before AI.\nI feel a lot of pressure to, I don't want to coach people in how I do things, but I'm being asked to coach people and how I do things because other people I work with notice me.\nAnd I guess I'm almost, I'm just kind of tired of being noticed.\nBecause being noticed is not resulting in me becoming rich.\nAnd money is not the most important thing.\nBut man, I'd love to just make enough money to fuck off for the rest of my life and never look at a computer ever again.\nI would love...\nto not have to continue to maintain systems that I build or that other people build or to collaborate with people I don't know, who might not even be long term.\nThat's the one thing about Caterpillar is I'm working with a lot of contractors.\nAnd nothing wrong with contracting, I've done that.\nNothing wrong with being a contractor, but\nThey could disappear at any moment, and all the code that they write, and even today, all the code that they prompt and have an agent right becomes my problem, my maintenance issue, my responsibility.\nAnd it just is,\nIt's just making me nervous to maintain and to understand and to continue to work under conditions that I can't even tell if I'm making them for myself or if they're real expectations.\nLike if I fell off the face of the earth or if I dropped agentic coding entirely and I just went back to coding by hand completely, would my output continue to impress people today?\nI don't know the answer to that.\nBut I certainly wouldn't be solving problems as fast, but would I be creating less problems?\nLike I've solved a lot of problems in three months in my new role here with Forge.\nBut I don't know how many problems I've created.\nOnly time will tell.\nAnd the thing is, the guys I work with who are contractors, they might not be around long enough for time to tell, but because I'm not rich yet, I probably will be long enough, or be around long enough.\nto experience those bugs and those problems that I don't know about yet.\nAnd I am just feeling so much pressure to be the best and to be the one to solve problems.\nAnd I don't know if I'm putting it on me or if cat's putting it on me or if my project manager is putting it on me.\nI'm just really struggling with the amount of responsibility I feel.\nAnd I'm feeling frustrated about it because that amount of responsibility feels like it has scaled a lot with agents, with AI, but not my paycheck.\nAnd in fact, my paycheck has gone down quite a bit.\nAnd I'm not more relaxed.\nI'm making about half of what I've made over the last couple of years.\nAnd I'm not more relaxed.\nI don't feel freer.\nI don't feel like I have 50% of the responsibility that I did.\nCal Autonomy awoke something in me for purpose, but that feels like it's already starting to die.\nI'm already tired.\nI'm, I don't know about burnt out, but I'm tired.\nI was reviewing some code that one of these contractors I'm working with.\nIt's actually only an intern.\nHe's not even a contractor.\nHe's an intern.\nAnd I'm reviewing a pull request of his.\nAnd damn, it's a lot of code.\nAnd it looks somewhat useful.\nBut I don't know exactly how to test it.\nThat's not true actually, I do know how to test it, but I don't own enough of our infrastructure at Caterpillar to test it easily.\nSo do I trust him?\nDo I trust his prompt?\nDo I trust his harness?\nDo I trust the tests that I have already put in the code base to capture and block any breakages he might have introduced with this code for the code I've already been producing?\nIt's different when I'm intimately familiar with the code base.\nAnd I've been, I don't know, definitely two other places at least where I had very intimate familiarity with the system and with the code and with the platform.\nBut the one I'm on right now is new, and I built it.\nI built it with agents.\nI built it to replace a thing that was never even working.\nBut I built it.\nIt's mine.\nIt's not somebody else's.\nIt's not that we'll document it.\nThere's a lot of documentation, but it's all been agent produced, and even though I've reviewed it, it's hard for me to organize it in the right way in a way that makes sense.\nI'm just feeling so frustrated that it seems like, as the tools are getting better, as developers are able to move faster, it feels like I am expected to move faster.\nbut I'm not expected to make any more money.\nI'm not expected to be compensated anymore for the increase in velocity and responsibility.\nIt's almost like if I could produce, this metric is not gonna be real, but let's just, for the sake of argument, make it up.\nIf I can write 30,000 lines of code in a year and make $100,000, I feel fine about that, whatever that number means.\nBut now I can actually produce 300,000 lines of code in a year.\nI'm definitely producing 10 times more code than normal.\nI don't know if I'm doing 10 times more engineering, but I am making exactly the same amount of money.\nAnd so why did I do it?\nWhy am I leaning into it so hard?\nWhy am I trying to still be the front runner to be on the bleeding edge when caterpillar is not going to pay anymore?\nAnd I could go somewhere else.\nI could go to Avant.\nI could make more.\nIt's a system I'm familiar with.\nIt's even people I know.\nAnd there's AI there too.\nBut it's a system I know.\nIt's a system I know how to support and maintain.\nAnd there's not an expectation that I'm going to produce 10,000 lines of code this week.\nBut right now at Caterpillar, it feels like I am expected to write 10,000 lines of code this week.\nAnd deploy it and maintain it and solve new problems.\nAll in an incredibly political and hectic, chaotic environment where there isn't an appropriate amount of leadership over me.\nI am the expert in AI in my group.\nAnd that feels retarded.\nI am the professional agentic engineer and that is just scary because I'm not good enough to be that.\nI'm not Steve Yeagie, I'm not Simon Willison, I haven't been a developer for 20 years.\nI'm just a guy who learned some Python to solve some problems and happen to work faster than a lot of people and that reputation has really\nIt's treated me well for sure.\nAnd my disposition to problem solving has, up until recently, I felt like I had been, like I've been compensated well by my company, but then I've also been able to do more work outside of one job for me to feel the value of my own skills.\nBut now with AI changing everything,\nCan I show you what's on the back of my story?\nIt feels like I've given up the personal gains.\nOne second, Alia.\nSo I've given up personally realizing the benefit of my own skill.\nAnd now I am like in a position where\nCaterpillar, and only Caterpillar, is reaping the benefit of my new scheme in agentic engineering.\nAnd I think that's just ticking me off because I stayed with Catt to do something good for the world.\nAnd I think we can do something good for the world.\nBut I'm tired.\n\n## Notes and Summarization\n\n## Possible Titles\n\n- Agents, Responsibility, and the Cost of Going Faster\n- The Irony of 10x\n- More Output, Less Upside\n- When AI Made Me Faster and Poorer\n- Being Crushed by Responsibility\n\n## Working Angle\n\nThis should probably be a personal essay, not a manifesto about AI. The core tension:\n\n- agents made me dramatically more productive\n- that productivity increased the responsibility I carry\n- the financial upside I used to realize personally has gone down, not up\n\n## Section Stub: Opening Scene\n\nPrompt:\n\n- Start with a concrete moment. Maybe reviewing a massive PR from the intern / contractor side of the system.\n- What did I feel in that moment: confusion, dread, pressure, responsibility, skepticism?\n- What was the specific thought: \"I might own all of this later, even if I did not really produce or validate all of it myself.\"\n- Can I open with one sharp sentence that names the tension right away?\n\nPossible opener idea:\n\n\"Agentic coding has made me faster than ever, but it has also made me feel responsible for more than I can honestly hold in my head.\"\n\n## Section Stub: This Is About Me, Not Everyone\n\nPrompt:\n\n- Add a strong caveat early: this is not prediction, prescription, or universal truth.\n- Name my context: big company, internal platform work, political environment, mixed team ownership, frontier models via Copilot.\n- What about my temperament matters here? Hyperfocus, initiative, problem solving, pressure sensitivity, desire to meet expectations.\n- What would I want a reader to not mishear?\n\n## Section Stub: Who I Was Before Agents\n\nPrompt:\n\n- Briefly describe my work history and self-understanding.\n- I am not formally trained, so what made me valuable anyway?\n- What does it mean that people were impressed before AI too?\n- Pull in relevant threads from `pages/blog/forge-ahead.md`: prior projects, practical problem solving, being useful, learning systems by doing.\n- What gifts do I think God gave me that made me effective before this shift?\n\nQuestions to answer:\n\n- What kind of worker was I before agents entered my workflow?\n- What did I already know how to do well?\n- What part of my value came from focus rather than brilliance?\n\n## Section Stub: Why I Leaned Into Agentic Coding\n\nPrompt:\n\n- Explain that I did not stumble into this accidentally; I chose to go hard.\n- Why did it feel natural to me to adopt agents aggressively?\n- What about the mission at Caterpillar Autonomy made the leap feel worth it?\n- Pull in `pages/blog/cat-autonomy-2-0.md`: I stayed because the work felt meaningful, not merely because it was interesting.\n- Mention harness engineering / Nexus / experimentation if it helps show this was a deliberate investment.\n\nQuestions to answer:\n\n- Why did I trust this direction enough to reorganize my work around it?\n- Was I chasing novelty, usefulness, recognition, mission, or all of the above?\n\n## Section Stub: What Actually Changed\n\nPrompt:\n\n- Describe the practical change in my day-to-day work.\n- I am no longer mainly writing code line by line; I am directing, reviewing, testing, and integrating generated work.\n- What changed about the quantity of output?\n- What changed about how coworkers and managers perceived me?\n- What changed about the kind of questions people started asking me?\n\nQuestions to answer:\n\n- When did I realize this was not just autocomplete, but a new mode of working?\n- What does \"enterprise-grade work fully written and produced by agents\" actually mean in practice?\n\n## Section Stub: The Hidden Cost of Speed\n\nPrompt:\n\n- Write about the gap between output and understanding.\n- I can ship more, but I do not always know the code as intimately as hand-written systems I built before.\n- Testing is not the same as ownership.\n- Documentation existing is not the same as confidence.\n- What kinds of future problems does speed create?\n\nQuestions to answer:\n\n- What do I know I have not fully read?\n- What kinds of bugs or maintenance traps am I afraid I am creating?\n- What does it feel like to build something that works but still feels partially foreign?\n\n## Section Stub: Responsibility Without Clear Boundaries\n\nPrompt:\n\n- This may be the emotional center before the money section.\n- Describe the contractor / intern dynamic and why it intensifies the burden.\n- Their output can become my long-term maintenance problem.\n- The organization sees me as someone who understands AI and agents, so responsibility pools onto me.\n- Ask whether the pressure is explicit or self-imposed, but note that the body feels it either way.\n\nQuestions to answer:\n\n- Who is actually accountable when AI-assisted code breaks six months from now?\n- What does it mean to be treated like the local expert when I do not feel like one?\n- Why is being noticed beginning to feel costly instead of rewarding?\n\n## Section Stub: The Financial Irony\n\nPrompt:\n\n- State this clearly and concretely.\n- For years, I realized more value from my output because I worked two jobs concurrently.\n- Due to the new role, new responsibility, and the demands of agentic coding in this environment, I had to go down to one job.\n- So the irony is: the tools make me dramatically more productive, but I personally realize less economic upside from my own gifts and skills than I did before.\n- Keep this grounded and honest, not whiny.\n\nQuestions to answer:\n\n- What exactly have I lost financially?\n- Why does this feel bigger than \"I want more money\"?\n- Where do the gains of AI go when an individual contributor gets faster?\n- If I can now produce 10x more code, why does my life not feel lighter, freer, or better compensated?\n\nPossible thesis sentence:\n\n\"Agentic coding increased the value I create at work, while decreasing the share of that value I personally get to realize.\"\n\n## Section Stub: Mission, Meaning, and Fatigue\n\nPrompt:\n\n- Reaffirm the good: this is meaningful work, and that matters to me.\n- Tie back to autonomy, safety, and the reasons I stayed at Caterpillar.\n- Then tell the truth: meaning does not cancel fatigue.\n- What has already started to feel tired, dulled, or overdrawn in me?\n\nQuestions to answer:\n\n- What purpose did this role awaken in me?\n- Why does that sense of purpose already feel threatened?\n- How do I talk honestly about fatigue without pretending I am fully burned out if I am not sure?\n\n## Section Stub: Questions I Cannot Yet Answer\n\nPrompt:\n\n- Let the essay breathe here instead of forcing a neat conclusion.\n- Gather the real unresolved questions.\n- If I stopped using agents, would I still impress people?\n- Would I solve fewer problems or create fewer future ones?\n- Am I carrying real expectations or anticipated ones?\n- Is this making me a better engineer, or just a faster source of output and responsibility?\n\n## Section Stub: Conclusion\n\nPrompt:\n\n- End modestly, not with a manifesto.\n- I am not anti-AI.\n- I am not saying agents are bad.\n- I am trying to tell the truth about what this transition has cost me personally.\n- Land on the mismatch between speed, responsibility, and reward.\n\nPossible closing direction:\n\n- The tools are real.\n- The gains are real.\n- The responsibility is real.\n- The redistribution of value is also real.\n- I am still trying to understand what faithfulness looks like inside that tension.\n\n## Material To Weave In\n\n- My lack of formal software engineering background\n- My history of being useful by solving practical problems quickly\n- My tendency toward hyperfocus and over-responsibility\n- The shift from hand-written confidence to agent-mediated uncertainty\n- The contractor / intern maintenance concern\n- The drop from two incomes to one\n- The irony that Cat benefits more from my increased output than I do\n- The Christian framing around calling, providence, stewardship, and fatigue\n\n## Things To Avoid\n\n- sounding like I am making universal claims about all AI use\n- sounding bitter without being specific\n- centering line-count metrics too much without translating them into responsibility\n- pretending I have fully landed on a conclusion\n- making this a complaint post about coworkers instead of a reflection on burden and change\n",
      "summary": "The intention of this note is to become a blog post:",
      "date_published": "2026-03-16T20:18:23Z",
      "date_modified": "2026-03-16T20:18:23Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "ai",
        "note"
      ]
    },
    {
      "id": "https://pype.dev/i-was-saved-from-a-cult/",
      "url": "https://pype.dev/i-was-saved-from-a-cult/",
      "title": "I Was Saved From A Cult",
      "content_html": "\u003ch2 id=\"introduction\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eIntroduction\u003c/span\u003e \u003ca href=\"#introduction\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI\u0026rsquo;m getting coffee with a guy from church today, we\u0026rsquo;re planning to swap some\nstories about how the Lord has worked in our lives in a few specific ways. He\nhas some history in the New Age movement, and I\u0026rsquo;m very interested in that\nstory. My offering to him will be my own story, fairly short it might be, of\nhow God protected me from long-term involvement in a hypercharasmatic cult.\u003c/p\u003e\n\u003ch2 id=\"theological-context\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTheological Context\u003c/span\u003e \u003ca href=\"#theological-context\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThis dove-tails well with Andrew\u0026rsquo;s sermon yesterday, noting that in many\nCharasmatic circles the gift of the Holy Spirit becomes more important than the\nperson of Jesus who gives the Spirit, and who gives Salvation. This is the crux\nof my own experience as well.\u003c/p\u003e\n\u003ch2 id=\"the-group\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThe Group\u003c/span\u003e \u003ca href=\"#the-group\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eThe group was called \u0026ldquo;Wind and Fire Ministries\u0026rdquo; and they had their own purpose-built building out in the middle of nowhere,\nbut close enough for me to drive to. I grew up in Iowa, a 10 minute drive on\nthe interstate landed you pretty quick in the scene of any low-budget horror\nmovie. The building was definitely nice, there was even some land, but there\nwas nothing around it.\u003c/p\u003e\n\u003ch2 id=\"how-i-got-involved\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eHow I Got Involved\u003c/span\u003e \u003ca href=\"#how-i-got-involved\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI barely remember how I got involved - a kid I was in high school with went there regularly and then one adult who helped out in my\nchurch\u0026rsquo;s youth group did as well. I can still vividly remember him telling me\nabout an experience he had at this place - a \u0026ldquo;slayed in the spirit\u0026rdquo; \u003ca href=\"/kind/\" class=\"glossary-term\" title=\"kind - kubernetes in docker\" data-hover-title=\"kind\"\u003ekind\u003c/a\u003e of\nexperience.\u003c/p\u003e\n\u003ch2 id=\"my-experience\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMy Experience\u003c/span\u003e \u003ca href=\"#my-experience\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eI was hungry, desperate even, for spiritual experiences and this\n\u0026ldquo;ministry\u0026rdquo; was extremely welcoming and accessible. My parents didn\u0026rsquo;t know\nanything about what went on there, and to be fair they didn\u0026rsquo;t do a ton of\nultra-weird stuff when I was there\u0026hellip; flag-waving and tongues were enough to\nprobably ruffle some fundie feathers. I never fell to the ground shaking or\nspoke in tongues (not for lack of awkwardly trying upon the instruction of a\nmember there though). I remember going one night and staying for hours while\nthe head honcho was doing annointings with oil and I wanted to be annointed\nbecause I wanted to speak in tongues because I wanted an \u0026ldquo;experience\u0026rdquo;. By God\u0026rsquo;s\ngrace I was never given a super emotional experience there - the emphasis was\nalways on gifts and supernatural things, not on the person and work of the Lord\nJesus\u003c/p\u003e\n",
      "content_text": "\n## Introduction\n\nI'm getting coffee with a guy from church today, we're planning to swap some\nstories about how the Lord has worked in our lives in a few specific ways. He\nhas some history in the New Age movement, and I'm very interested in that\nstory. My offering to him will be my own story, fairly short it might be, of\nhow God protected me from long-term involvement in a hypercharasmatic cult.\n\n## Theological Context\n\nThis dove-tails well with Andrew's sermon yesterday, noting that in many\nCharasmatic circles the gift of the Holy Spirit becomes more important than the\nperson of Jesus who gives the Spirit, and who gives Salvation. This is the crux\nof my own experience as well.\n\n## The Group\n\nThe group was called \"Wind and Fire Ministries\" and they had their own purpose-built building out in the middle of nowhere,\nbut close enough for me to drive to. I grew up in Iowa, a 10 minute drive on\nthe interstate landed you pretty quick in the scene of any low-budget horror\nmovie. The building was definitely nice, there was even some land, but there\nwas nothing around it.\n\n## How I Got Involved\n\nI barely remember how I got involved - a kid I was in high school with went there regularly and then one adult who helped out in my\nchurch's youth group did as well. I can still vividly remember him telling me\nabout an experience he had at this place - a \"slayed in the spirit\" kind of\nexperience.\n\n## My Experience\n\nI was hungry, desperate even, for spiritual experiences and this\n\"ministry\" was extremely welcoming and accessible. My parents didn't know\nanything about what went on there, and to be fair they didn't do a ton of\nultra-weird stuff when I was there... flag-waving and tongues were enough to\nprobably ruffle some fundie feathers. I never fell to the ground shaking or\nspoke in tongues (not for lack of awkwardly trying upon the instruction of a\nmember there though). I remember going one night and staying for hours while\nthe head honcho was doing annointings with oil and I wanted to be annointed\nbecause I wanted to speak in tongues because I wanted an \"experience\". By God's\ngrace I was never given a super emotional experience there - the emphasis was\nalways on gifts and supernatural things, not on the person and work of the Lord\nJesus\n",
      "summary": "I'm getting coffee with a guy from church today, we're planning to swap some stories about how the Lord has worked in our lives in a few specific ways. He...",
      "date_published": "2026-03-02T05:30:25Z",
      "date_modified": "2026-03-02T05:30:25Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "cult",
        "note"
      ]
    },
    {
      "id": "https://pype.dev/premarital-session-3-april-2026/",
      "url": "https://pype.dev/premarital-session-3-april-2026/",
      "title": "Premarital Session 3 April 2026",
      "content_html": "\u003ch1 id=\"expectations-intimacy-and-shared-life\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExpectations, Intimacy, and Shared Life\u003c/span\u003e\u003c/h1\u003e\n\u003ch2 id=\"purpose\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePurpose\u003c/span\u003e \u003ca href=\"#purpose\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eTo surface unspoken expectations and ground shared life; emotionally, spiritually, and physically, in service to the Lord and each other.\u003c/p\u003e\n\u003ch2 id=\"key-scriptures\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eKey Scriptures\u003c/span\u003e \u003ca href=\"#key-scriptures\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e1 Corinthians 7:1–5; Hebrews 13:4; Proverbs 24:3–4; Ecclesiastes 4:9–12\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003e1 Corinthians 7:1–5 (LEB)\u003c/p\u003e\n\u003cp\u003e7Now concerning the things about which you wrote: “It is good for a man not to touch a woman.” 2 But because of sexual immorality, let each man have his own wife and let each woman have her own husband. 3 The husband must fulfill his obligation to his wife, and likewise also the wife to her husband. 4 The wife does not have authority over her own body, but her husband does. And likewise also the husband does not have authority over his own body, but his wife does. 5 Do not defraud one another, except perhaps by agreement, for a time, in order that you may devote yourselves to prayer, and then you should be together again, lest Satan tempt you because of your lack of self control.\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eHebrews 13:4\u003c/p\u003e\n\u003cp\u003eMarriage must be held in honor by all, and the marriage bed be undefiled, because God will judge sexually immoral people and adulterers.\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eProverbs 24:3-4\u003c/p\u003e\n\u003cp\u003e3 By wisdom a house is built,  and by understanding it is established.  4 And by knowledge, rooms are filled  with all riches, precious and pleasant.\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eEcclesiastes 4:9-12\u003c/p\u003e\n\u003cp\u003e9 Two are better than the one, for they enjoy a better reward for their toil. 10 For if they fall, one will help up his companion. But pity the one who falls and there is no one to help him up. 11 Also if two lie together, they can keep each other warm. But how can one person be warm? 12 Although an assailant may overpower one person, two may withstand him. A threefold cord is not easily broken!\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"themes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThemes\u003c/span\u003e \u003ca href=\"#themes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eMany marital wounds come from unspoken expectations.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eNot just unspoken, but a pattern of letting your expectations be unmet can lead to strife.\u003c/li\u003e\n\u003cli\u003eIt\u0026rsquo;s up to both people in the marriage to be on the lookout: remember, together you face unspoken expectations, you do not face each other\u0026rsquo;s expectations, be united\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIntimacy is covenantal and requires safety, communication, and grace.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eNo one is safer to talk to than your spouse (within reason, I think there\u0026rsquo;s a place for men\u0026rsquo;s/women\u0026rsquo;s group \u003ca href=\"/kind/\" class=\"glossary-term\" title=\"kind - kubernetes in docker\" data-hover-title=\"kind\"\u003ekind\u003c/a\u003e of stuff, pastoral counseling, etc. but in general no one should be safer to share something with than your spouse)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eFaithfulness is sustained through shared rhythms and priorities.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ePatterns are powerful\u003c/li\u003e\n\u003cli\u003eIn our lives, I for sure notice when we slip into patterns of lack-of-intimacy or communication, and the longer you \u0026ldquo;get by\u0026rdquo; the easier it is to live that way\u003c/li\u003e\n\u003cli\u003e\u0026ldquo;Missing something once is a mistake, missing something twice is the start of a new habit.\u0026rdquo; The point being that it takes work to communicate, and you should plan to communicate often. Missing a date, or an agreed-upon-time to talk about something once is just a mistake, but don\u0026rsquo;t let yourselves push off hard conversations (either together or individually)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"discussion-prompts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDiscussion Prompts\u003c/span\u003e \u003ca href=\"#discussion-prompts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"expectations\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eExpectations\u003c/span\u003e \u003ca href=\"#expectations\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eWhat are you most looking forward to in daily married life?\u003c/p\u003e\n\u003cp\u003eWhat concerns you about sharing life so closely?\u003c/p\u003e\n\u003ch3 id=\"intimacy\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eIntimacy\u003c/span\u003e \u003ca href=\"#intimacy\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eHow do you communicate needs, boundaries, and fears?\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ewith great trust in your spouse\u003c/li\u003e\n\u003cli\u003eopenly, hopefully.\u003c/li\u003e\n\u003cli\u003edo not assume the first thing said is what is meant, maybe you need to work through it together to figure out what one of you needs\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eHow will you protect intimacy after marriage?\u003c/p\u003e\n\u003ch3 id=\"shared-life\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eShared Life\u003c/span\u003e \u003ca href=\"#shared-life\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eHow do you approach money and financial decisions?\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eOur approach: God gives us everything and we recognize that any ordered system requires a hierarchy of decision makers. I \u0026ldquo;make the final decision\u0026rdquo; which is often to trust what Kassia wants to do with some money. Kassia asks me about financial things, not for permission, but for information. Then from the information, we decide together and if we disagree it\u0026rsquo;s up to me to put my foot down on it or defer to her in our disagreement (both circumstances happen)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eWhat rhythms help you remain spiritually grounded?\u003c/p\u003e\n\u003ch2 id=\"mentor-contribution\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMentor Contribution\u003c/span\u003e \u003ca href=\"#mentor-contribution\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eShare principles, not details, regarding intimacy and finances.\u003c/p\u003e\n\u003cp\u003eEmphasize patience, mutual service, and long-term faithfulness.\u003c/p\u003e\n",
      "content_text": "\n# Expectations, Intimacy, and Shared Life\n\n## Purpose\n\nTo surface unspoken expectations and ground shared life; emotionally, spiritually, and physically, in service to the Lord and each other.\n\n## Key Scriptures\n\n1 Corinthians 7:1–5; Hebrews 13:4; Proverbs 24:3–4; Ecclesiastes 4:9–12\n\n!!! note \"1 Corinthians 7:1–5 (LEB)\"\n\n    7Now concerning the things about which you wrote: “It is good for a man not to touch a woman.” 2 But because of sexual immorality, let each man have his own wife and let each woman have her own husband. 3 The husband must fulfill his obligation to his wife, and likewise also the wife to her husband. 4 The wife does not have authority over her own body, but her husband does. And likewise also the husband does not have authority over his own body, but his wife does. 5 Do not defraud one another, except perhaps by agreement, for a time, in order that you may devote yourselves to prayer, and then you should be together again, lest Satan tempt you because of your lack of self control.\n\n!!! note \"Hebrews 13:4\"\n\n    Marriage must be held in honor by all, and the marriage bed be undefiled, because God will judge sexually immoral people and adulterers.\n\n!!! note \"Proverbs 24:3-4\"\n\n    3 By wisdom a house is built,  and by understanding it is established.  4 And by knowledge, rooms are filled  with all riches, precious and pleasant.\n\n!!! note \"Ecclesiastes 4:9-12\"\n\n    9 Two are better than the one, for they enjoy a better reward for their toil. 10 For if they fall, one will help up his companion. But pity the one who falls and there is no one to help him up. 11 Also if two lie together, they can keep each other warm. But how can one person be warm? 12 Although an assailant may overpower one person, two may withstand him. A threefold cord is not easily broken!\n\n## Themes\n\nMany marital wounds come from unspoken expectations.\n\n- Not just unspoken, but a pattern of letting your expectations be unmet can lead to strife.\n- It's up to both people in the marriage to be on the lookout: remember, together you face unspoken expectations, you do not face each other's expectations, be united\n\nIntimacy is covenantal and requires safety, communication, and grace.\n\n- No one is safer to talk to than your spouse (within reason, I think there's a place for men's/women's group kind of stuff, pastoral counseling, etc. but in general no one should be safer to share something with than your spouse)\n\nFaithfulness is sustained through shared rhythms and priorities.\n\n- Patterns are powerful\n- In our lives, I for sure notice when we slip into patterns of lack-of-intimacy or communication, and the longer you \"get by\" the easier it is to live that way\n- \"Missing something once is a mistake, missing something twice is the start of a new habit.\" The point being that it takes work to communicate, and you should plan to communicate often. Missing a date, or an agreed-upon-time to talk about something once is just a mistake, but don't let yourselves push off hard conversations (either together or individually)\n\n## Discussion Prompts\n\n### Expectations\n\nWhat are you most looking forward to in daily married life?\n\nWhat concerns you about sharing life so closely?\n\n### Intimacy\n\nHow do you communicate needs, boundaries, and fears?\n\n- with great trust in your spouse\n- openly, hopefully.\n- do not assume the first thing said is what is meant, maybe you need to work through it together to figure out what one of you needs\n\nHow will you protect intimacy after marriage?\n\n### Shared Life\n\nHow do you approach money and financial decisions?\n\n- Our approach: God gives us everything and we recognize that any ordered system requires a hierarchy of decision makers. I \"make the final decision\" which is often to trust what Kassia wants to do with some money. Kassia asks me about financial things, not for permission, but for information. Then from the information, we decide together and if we disagree it's up to me to put my foot down on it or defer to her in our disagreement (both circumstances happen)\n\nWhat rhythms help you remain spiritually grounded?\n\n## Mentor Contribution\n\nShare principles, not details, regarding intimacy and finances.\n\nEmphasize patience, mutual service, and long-term faithfulness.\n",
      "summary": "To surface unspoken expectations and ground shared life; emotionally, spiritually, and physically, in service to the Lord and each other.",
      "date_published": "2026-02-26T05:14:37Z",
      "date_modified": "2026-02-26T05:14:37Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "marriage",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/premarital-session-2-march-2026/",
      "url": "https://pype.dev/premarital-session-2-march-2026/",
      "title": "Premarital Session 2 - March 2026",
      "content_html": "\u003ch1 id=\"communication-conflict-and-forgiveness\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCommunication, Conflict, and Forgiveness\u003c/span\u003e\u003c/h1\u003e\n\u003ch2 id=\"purpose\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePurpose\u003c/span\u003e \u003ca href=\"#purpose\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eTo normalize conflict and equip the couple to handle it with humility, clarity, and grace.\u003c/p\u003e\n\u003ch2 id=\"key-scriptures\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eKey Scriptures\u003c/span\u003e \u003ca href=\"#key-scriptures\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eJames 1:19–20; Proverbs 15:1; Ephesians 4:25–32; Matthew 18:21–35\u003c/p\u003e\n\u003cp\u003eJames 1:19–20 (LEB): 19 Understand this, my dear brothers: every person must\nbe quick to hear, slow to speak, slow to anger, 20 for human anger does not\naccomplish the righteousness of God.\u003c/p\u003e\n\u003cp\u003eProverbs 15:1 (LEB): A soft answer will turn away wrath, but a word of trouble will stir anger.\u003c/p\u003e\n\u003cp\u003eEphesians 4:25–32 (LEB): 25 Therefore, putting aside the lie, speak truth each one of you with his neighbor, because we are members of one another. 26 Be angry and do not sin; do not let the sun set on your anger, 27 nor give place to the devil. 28 The one who steals must steal no longer, but instead must labor, working with his own hands what is good, so that he may have something to share with the one who has need. 29 No rotten word must proceed from your mouth, but only something good for the building up of the need, in order that it may give grace to those who hear, 30 and do not grieve the Holy Spirit of God, by whom you were sealed for the day of redemption. 31 All bitterness, and rage, and wrath, and clamor, and abusive speech, must be removed from you, together with all wickedness. 32 Become \u003ca href=\"/kind/\" class=\"glossary-term\" title=\"kind - kubernetes in docker\" data-hover-title=\"kind\"\u003ekind\u003c/a\u003e toward one another, compassionate, forgiving one another, just as also God in Christ has forgiven you.\u003c/p\u003e\n\u003cp\u003eMatthew 18:21–35 (LEB): 21 Then Peter came up to him and said, “Lord, how many times will my brother sin against me and I will forgive him? Up to seven times?” 22 Jesus said to him, “I do not say to you up to seven times, but up to seventy times seven! 23 “For this reason the kingdom of heaven may be compared to a man—a king—who wanted to settle accounts with his slaves. 24 And when he began to settle them, someone was brought to him who owed ten thousand talents. 25 And because he did not have enough to repay it, the master ordered him to be sold, and his wife and his children and everything that he had, and to be repaid. 26 Then the slave threw himself to the ground and began to do obeisance to him, saying, ‘Be patient with me, and I will pay back everything to you!’ 27 So the master of that slave, because he had compassion, released him and forgave him the loan. 28 But that slave went out and found one of his fellow slaves who owed him a hundred denarii, and taking hold of him, he began to choke him, saying, ‘Pay back everything that you owe!’ 29 Then his fellow slave threw himself to the ground and began to implore him, saying, ‘Be patient with me and I will repay you!’ 30 But he did not want to, but rather he went and threw him into prison until he would repay what was owed. 31 So when his fellow slaves saw what had happened, they were extremely distressed, and went and reported to their master everything that had happened. 32 Then his master summoned him and said to him, ‘Wicked slave! I forgave you all that debt because you implored me! 33 Should you not also have shown mercy to your fellow slave as I also showed mercy to you?’ 34 And because he was angry, his master handed him over to the merciless jailers until he would repay everything that was owed. 35 So also my heavenly Father will do to you, unless each of you forgives his brother from your hearts!”\u003c/p\u003e\n\u003ch2 id=\"themes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThemes\u003c/span\u003e \u003ca href=\"#themes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eConflict reveals the heart; it does not create sin.\u003c/p\u003e\n\u003cp\u003ePatterns of hostility matter more than isolated arguments.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eBut do not allow yourself to over-generalize in your frustration: \u0026ldquo;He always \u0026hellip;\u0026rdquo;, \u0026ldquo;She never \u0026hellip;\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eI probably struggled with this in reading far too much into arguments and taking Kassia\u0026rsquo;s frustration with me way too personally, creating hostility when there was only frustration\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eTrue repentance and forgiveness are essential marital practices.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eYour stuck with your person, are you going to stay frustrated forever?\u003c/li\u003e\n\u003cli\u003eRemind yourself of the gospel at every argument, \u0026ldquo;Jesus has forgiven me so much more than I am/feel owed by my spouse right now\u0026rdquo;\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"discussion-prompts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDiscussion Prompts\u003c/span\u003e \u003ca href=\"#discussion-prompts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWhat is your instinct under tension: withdrawal, pursuit, defensiveness?\u003c/p\u003e\n\u003cp\u003eWhat makes it hard for you to apologize or forgive?\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eFor me it is correctness: I find it hard to apologize for trying to be correct (or understood) when that pursuit ends up hurting Kassia in some way\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"practical-emphasis\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePractical Emphasis\u003c/span\u003e \u003ca href=\"#practical-emphasis\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eListening before responding.\u003c/p\u003e\n\u003cp\u003eSpeaking clearly without accusation.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eClassic advice to avoid \u0026ldquo;you\u0026rdquo; statements, use \u0026ldquo;I\u0026rdquo; statements\u003c/li\u003e\n\u003cli\u003eI might recommend \u0026ldquo;reviewing\u0026rdquo; fights after the fact, as a team see what went well or poorly and what could use work for the next time\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eAddressing issues at appropriate times.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSometimes it has to wait a day\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"mentor-contribution\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMentor Contribution\u003c/span\u003e \u003ca href=\"#mentor-contribution\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eShare a recurring conflict you have faced and what you learned over time.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003edishes before bed\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eif you want something done, do it yourself pretty much\u003c/li\u003e\n\u003cli\u003eyou will also change over time\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ewhat it means to be a patient parent\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eEmphasize growth, patience, and the importance of humility.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/premarital-session-3-april-2026/\" class=\"wikilink\" data-title=\"Premarital Session 3 April 2026\" data-description=\"To surface unspoken expectations and ground shared life; emotionally, spiritually, and physically, in service to the Lord and each other.\" data-date=\"2026-02-26\" data-preview=\"To surface unspoken expectations and ground shared life; emotionally, spiritually, and physically, in service to the Lord and each other.\"\u003ePremarital Session 3 April 2026\u003c/a\u003e\u003c/p\u003e\n",
      "content_text": "\n# Communication, Conflict, and Forgiveness\n\n## Purpose\n\nTo normalize conflict and equip the couple to handle it with humility, clarity, and grace.\n\n## Key Scriptures\n\nJames 1:19–20; Proverbs 15:1; Ephesians 4:25–32; Matthew 18:21–35\n\nJames 1:19–20 (LEB): 19 Understand this, my dear brothers: every person must\nbe quick to hear, slow to speak, slow to anger, 20 for human anger does not\naccomplish the righteousness of God.\n\nProverbs 15:1 (LEB): A soft answer will turn away wrath, but a word of trouble will stir anger.\n\nEphesians 4:25–32 (LEB): 25 Therefore, putting aside the lie, speak truth each one of you with his neighbor, because we are members of one another. 26 Be angry and do not sin; do not let the sun set on your anger, 27 nor give place to the devil. 28 The one who steals must steal no longer, but instead must labor, working with his own hands what is good, so that he may have something to share with the one who has need. 29 No rotten word must proceed from your mouth, but only something good for the building up of the need, in order that it may give grace to those who hear, 30 and do not grieve the Holy Spirit of God, by whom you were sealed for the day of redemption. 31 All bitterness, and rage, and wrath, and clamor, and abusive speech, must be removed from you, together with all wickedness. 32 Become kind toward one another, compassionate, forgiving one another, just as also God in Christ has forgiven you.\n\nMatthew 18:21–35 (LEB): 21 Then Peter came up to him and said, “Lord, how many times will my brother sin against me and I will forgive him? Up to seven times?” 22 Jesus said to him, “I do not say to you up to seven times, but up to seventy times seven! 23 “For this reason the kingdom of heaven may be compared to a man—a king—who wanted to settle accounts with his slaves. 24 And when he began to settle them, someone was brought to him who owed ten thousand talents. 25 And because he did not have enough to repay it, the master ordered him to be sold, and his wife and his children and everything that he had, and to be repaid. 26 Then the slave threw himself to the ground and began to do obeisance to him, saying, ‘Be patient with me, and I will pay back everything to you!’ 27 So the master of that slave, because he had compassion, released him and forgave him the loan. 28 But that slave went out and found one of his fellow slaves who owed him a hundred denarii, and taking hold of him, he began to choke him, saying, ‘Pay back everything that you owe!’ 29 Then his fellow slave threw himself to the ground and began to implore him, saying, ‘Be patient with me and I will repay you!’ 30 But he did not want to, but rather he went and threw him into prison until he would repay what was owed. 31 So when his fellow slaves saw what had happened, they were extremely distressed, and went and reported to their master everything that had happened. 32 Then his master summoned him and said to him, ‘Wicked slave! I forgave you all that debt because you implored me! 33 Should you not also have shown mercy to your fellow slave as I also showed mercy to you?’ 34 And because he was angry, his master handed him over to the merciless jailers until he would repay everything that was owed. 35 So also my heavenly Father will do to you, unless each of you forgives his brother from your hearts!”\n\n## Themes\n\nConflict reveals the heart; it does not create sin.\n\nPatterns of hostility matter more than isolated arguments.\n\n- But do not allow yourself to over-generalize in your frustration: \"He always ...\", \"She never ...\"\n- I probably struggled with this in reading far too much into arguments and taking Kassia's frustration with me way too personally, creating hostility when there was only frustration\n\nTrue repentance and forgiveness are essential marital practices.\n\n- Your stuck with your person, are you going to stay frustrated forever?\n- Remind yourself of the gospel at every argument, \"Jesus has forgiven me so much more than I am/feel owed by my spouse right now\"\n\n## Discussion Prompts\n\nWhat is your instinct under tension: withdrawal, pursuit, defensiveness?\n\nWhat makes it hard for you to apologize or forgive?\n\n- For me it is correctness: I find it hard to apologize for trying to be correct (or understood) when that pursuit ends up hurting Kassia in some way\n\n## Practical Emphasis\n\nListening before responding.\n\nSpeaking clearly without accusation.\n\n- Classic advice to avoid \"you\" statements, use \"I\" statements\n- I might recommend \"reviewing\" fights after the fact, as a team see what went well or poorly and what could use work for the next time\n\nAddressing issues at appropriate times.\n\n- Sometimes it has to wait a day\n\n## Mentor Contribution\n\nShare a recurring conflict you have faced and what you learned over time.\n\n- dishes before bed\n\n  - if you want something done, do it yourself pretty much\n  - you will also change over time\n\n- what it means to be a patient parent\n\nEmphasize growth, patience, and the importance of humility.\n\n\u003ca href=\"/premarital-session-3-april-2026/\" class=\"wikilink\" data-title=\"Premarital Session 3 April 2026\" data-description=\"To surface unspoken expectations and ground shared life; emotionally, spiritually, and physically, in service to the Lord and each other.\" data-date=\"2026-02-26\"\u003ePremarital Session 3 April 2026\u003c/a\u003e\n",
      "summary": "To normalize conflict and equip the couple to handle it with humility, clarity, and grace.",
      "date_published": "2026-02-26T05:14:05Z",
      "date_modified": "2026-02-26T05:14:05Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "marriage",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/premarital-session-1-feb-2026/",
      "url": "https://pype.dev/premarital-session-1-feb-2026/",
      "title": "Premarital Session 1 - Feb 2026",
      "content_html": "\u003ch1 id=\"covenant-calling-and-friendship\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCovenant, Calling, and Friendship\u003c/span\u003e\u003c/h1\u003e\n\u003ch2 id=\"purpose\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003ePurpose\u003c/span\u003e \u003ca href=\"#purpose\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eTo establish a biblical vision of marriage that shapes expectations, priorities, and endurance.\u003c/p\u003e\n\u003ch2 id=\"key-scriptures\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eKey Scriptures\u003c/span\u003e \u003ca href=\"#key-scriptures\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eGenesis 2:18–25; Malachi 2:14; Ephesians 5:31–32; Proverbs 18:22\u003c/p\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eGenesis 2:18-25\u003c/p\u003e\n\u003cp\u003e18 Then the Lord God said, “It is not good for the man to be alone. I will\nmake a helper (עֵ֫זֶר |e-zer ) corresponding (נֶ֫גֶד | ne-ged) to him.” 19 The\nLord God formed out of the ground every wild animal and every bird of the\nsky, and brought each to the man to see what he would call it. And whatever the\nman called a living creature, that was its name. 20 The man gave names to all\nthe livestock, to the birds of the sky, and to every wild animal; but for the\nman no helper was found corresponding to him. 21 So the Lord God caused a deep\nsleep to come over the man, and he slept.\nGod took one of his ribs and closed the flesh at that place. 22 Then the Lord\nGod made the rib he had taken from the man into a woman and brought her to the\nman. 23 And the man said:  This one, at last, is bone of my bone  and flesh of\nmy flesh;  this one will be called “woman,”  for she was taken from man.\n24 This is why a man leaves his father and mother and bonds with his wife, and\nthey become one flesh. 25 Both the man and his wife were naked, yet felt no\nshame.\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition success\"\u003e\n\u003cp class=\"admonition-title\"\u003ehelper corresponding\u003c/p\u003e\n\u003cp\u003eThis is the helper opposite him - balance\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eMalachi 2:14\u003c/p\u003e\n\u003cp\u003eAnd you ask, “Why?” Because even though the Lord has been a witness between\nyou and the wife of your youth, you have acted treacherously against her. She\nwas your marriage partner and your wife by covenant.\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition warning\"\u003e\n\u003cp class=\"admonition-title\"\u003eGod as the witness\u003c/p\u003e\n\u003cp\u003e\u0026ldquo;the wife of your youth\u0026rdquo; Since a Jewish marriage was religious and involved a\ncovenant, God served as the witness (Mal 2:10). Thus, a Jewish man abandoning\nhis Jewish wife was tantamount to abandoning a vow to God Himself.\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eEphesians 5:31-32\u003c/p\u003e\n\u003cp\u003e31 For this reason a man will leave his father and mother and be joined to\nhis wife, and the two will become one flesh. 32 This mystery is profound, but I\nam talking about Christ and the church.\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"admonition note\"\u003e\n\u003cp class=\"admonition-title\"\u003eProverbs 18:22\u003c/p\u003e\n\u003cp\u003eA man who finds a wife finds a good thing  and obtains favor from the Lord.\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"themes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThemes\u003c/span\u003e \u003ca href=\"#themes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eMarriage is covenantal, not consumerism sustained by feelings.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eServing your spouse is serving the Lord, as long as you both seek to serve\nJesus then you will naturally (since it\u0026rsquo;s a natural consequence of serving the\nLord) serve one another \u003cstrong\u003ewith the right heart\u003c/strong\u003e. Your service is not to each\nother directly, it is to the Lord\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eGod uses marriage as a primary means of sanctification.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eParenting is hard because you are forced to put your needs on hold for the\nsake of your kids sometimes, but love makes it easier and kids are level 2.\nLevel 1 is your spouse - as you put your needs on hold for your spouse Jesus\nchanges your heart to help you really see that other person as equally as\nvaluable as yourself. Not necessarily \u003cstrong\u003emore valuable\u003c/strong\u003e, that isn\u0026rsquo;t the point,\nthe point is that the ground is level at the foot of the cross, and daily\nconsistent rendering of service to your spouse \u003cstrong\u003eas to the Lord\u003c/strong\u003e is a\ntransformative experience in the direction of seeing others how Jesus does.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eFriendship and unity go right along with roles, logistics, and preferences.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eDedicate yourselves to the Lord and friendship will follow.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"discussion-prompts\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDiscussion Prompts\u003c/span\u003e \u003ca href=\"#discussion-prompts\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWhat do you believe makes a marriage “successful”?\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ecalm and charitable disagreement\u003c/li\u003e\n\u003cli\u003eestablished and respected order\n\u003cul\u003e\n\u003cli\u003eDevin will be the head\u003c/li\u003e\n\u003cli\u003ethe head of the body should probably listen to the body quite intensely before making decisions\u0026hellip;\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003edo people outside your marriage see Jesus as a crucial player in your\nrelationship or is all about the 2 of you? Culture would have it look like 2\npuzzle pieces that fit together perfectly, but the reality is that a godly\nmarriage should frame the gospel. When people look at your relationship, they\nshouldn\u0026rsquo;t just see 2 best friends in love, they should somewhat immediately see\nand know about Jesus\u0026rsquo; role in your relationship\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eWhere do you think cultural ideas about marriage fall short?\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eliterally everywhere\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eWhat promises feel most weighty to you as you think about your vows?\u003c/p\u003e\n\u003cp\u003eHow do you currently cultivate friendship and closeness?\u003c/p\u003e\n\u003ch2 id=\"mentor-contribution\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMentor Contribution\u003c/span\u003e \u003ca href=\"#mentor-contribution\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eShare briefly how covenant faithfulness has shaped your own marriage.\u003c/p\u003e\n\u003cp\u003eShare how unity is built intentionally over time, not assumed.\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\u003eWhat do you hope God will form in you through marriage?\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/premarital-session-2-march-2026/\" class=\"wikilink\" data-title=\"Premarital Session 2 - March 2026\" data-description=\"To normalize conflict and equip the couple to handle it with humility, clarity, and grace.\" data-date=\"2026-02-26\" data-preview=\"To normalize conflict and equip the couple to handle it with humility, clarity, and grace.\"\u003ePremarital Session 2 - March 2026\u003c/a\u003e\n\u003ca href=\"/premarital-session-3-april-2026/\" class=\"wikilink\" data-title=\"Premarital Session 3 April 2026\" data-description=\"To surface unspoken expectations and ground shared life; emotionally, spiritually, and physically, in service to the Lord and each other.\" data-date=\"2026-02-26\" data-preview=\"To surface unspoken expectations and ground shared life; emotionally, spiritually, and physically, in service to the Lord and each other.\"\u003ePremarital Session 3 April 2026\u003c/a\u003e\u003c/p\u003e\n",
      "content_text": "\n# Covenant, Calling, and Friendship\n\n## Purpose\n\nTo establish a biblical vision of marriage that shapes expectations, priorities, and endurance.\n\n## Key Scriptures\n\nGenesis 2:18–25; Malachi 2:14; Ephesians 5:31–32; Proverbs 18:22\n\n!!! note \"Genesis 2:18-25\"\n\n    18 Then the Lord God said, “It is not good for the man to be alone. I will\n    make a helper (עֵ֫זֶר |e-zer ) corresponding (נֶ֫גֶד | ne-ged) to him.” 19 The\n    Lord God formed out of the ground every wild animal and every bird of the\n    sky, and brought each to the man to see what he would call it. And whatever the\n    man called a living creature, that was its name. 20 The man gave names to all\n    the livestock, to the birds of the sky, and to every wild animal; but for the\n    man no helper was found corresponding to him. 21 So the Lord God caused a deep\n    sleep to come over the man, and he slept.\n    God took one of his ribs and closed the flesh at that place. 22 Then the Lord\n    God made the rib he had taken from the man into a woman and brought her to the\n    man. 23 And the man said:  This one, at last, is bone of my bone  and flesh of\n    my flesh;  this one will be called “woman,”  for she was taken from man.\n    24 This is why a man leaves his father and mother and bonds with his wife, and\n    they become one flesh. 25 Both the man and his wife were naked, yet felt no\n    shame.\n\n!!! success \"helper corresponding\"\n\n    This is the helper opposite him - balance\n\n!!! note \"Malachi 2:14\"\n\n    And you ask, “Why?” Because even though the Lord has been a witness between\n    you and the wife of your youth, you have acted treacherously against her. She\n    was your marriage partner and your wife by covenant.\n\n!!! warning \"God as the witness\"\n\n    \"the wife of your youth\" Since a Jewish marriage was religious and involved a\n    covenant, God served as the witness (Mal 2:10). Thus, a Jewish man abandoning\n    his Jewish wife was tantamount to abandoning a vow to God Himself.\n\n!!! note \"Ephesians 5:31-32\"\n\n    31 For this reason a man will leave his father and mother and be joined to\n    his wife, and the two will become one flesh. 32 This mystery is profound, but I\n    am talking about Christ and the church.\n\n!!! note \"Proverbs 18:22\"\n\n    A man who finds a wife finds a good thing  and obtains favor from the Lord.\n\n## Themes\n\nMarriage is covenantal, not consumerism sustained by feelings.\n\n- Serving your spouse is serving the Lord, as long as you both seek to serve\n  Jesus then you will naturally (since it's a natural consequence of serving the\n  Lord) serve one another **with the right heart**. Your service is not to each\n  other directly, it is to the Lord\n\nGod uses marriage as a primary means of sanctification.\n\n- Parenting is hard because you are forced to put your needs on hold for the\n  sake of your kids sometimes, but love makes it easier and kids are level 2.\n  Level 1 is your spouse - as you put your needs on hold for your spouse Jesus\n  changes your heart to help you really see that other person as equally as\n  valuable as yourself. Not necessarily **more valuable**, that isn't the point,\n  the point is that the ground is level at the foot of the cross, and daily\n  consistent rendering of service to your spouse **as to the Lord** is a\n  transformative experience in the direction of seeing others how Jesus does.\n\nFriendship and unity go right along with roles, logistics, and preferences.\n\n- Dedicate yourselves to the Lord and friendship will follow.\n\n## Discussion Prompts\n\nWhat do you believe makes a marriage “successful”?\n\n- calm and charitable disagreement\n- established and respected order\n  - Devin will be the head\n  - the head of the body should probably listen to the body quite intensely before making decisions...\n- do people outside your marriage see Jesus as a crucial player in your\n  relationship or is all about the 2 of you? Culture would have it look like 2\n  puzzle pieces that fit together perfectly, but the reality is that a godly\n  marriage should frame the gospel. When people look at your relationship, they\n  shouldn't just see 2 best friends in love, they should somewhat immediately see\n  and know about Jesus' role in your relationship\n\nWhere do you think cultural ideas about marriage fall short?\n\n- literally everywhere\n\nWhat promises feel most weighty to you as you think about your vows?\n\nHow do you currently cultivate friendship and closeness?\n\n## Mentor Contribution\n\nShare briefly how covenant faithfulness has shaped your own marriage.\n\nShare how unity is built intentionally over time, not assumed.\n\n## Reflection\n\nWhat do you hope God will form in you through marriage?\n\n\u003ca href=\"/premarital-session-2-march-2026/\" class=\"wikilink\" data-title=\"Premarital Session 2 - March 2026\" data-description=\"To normalize conflict and equip the couple to handle it with humility, clarity, and grace.\" data-date=\"2026-02-26\"\u003ePremarital Session 2 - March 2026\u003c/a\u003e\n\u003ca href=\"/premarital-session-3-april-2026/\" class=\"wikilink\" data-title=\"Premarital Session 3 April 2026\" data-description=\"To surface unspoken expectations and ground shared life; emotionally, spiritually, and physically, in service to the Lord and each other.\" data-date=\"2026-02-26\"\u003ePremarital Session 3 April 2026\u003c/a\u003e\n",
      "summary": "To establish a biblical vision of marriage that shapes expectations, priorities, and endurance.",
      "date_published": "2026-02-26T05:10:53Z",
      "date_modified": "2026-02-26T05:10:53Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "marriage",
        "faith"
      ]
    },
    {
      "id": "https://pype.dev/cannalyze/",
      "url": "https://pype.dev/cannalyze/",
      "title": "Cannalyze",
      "content_html": "\u003cp\u003eA self-hostable habit tracker with special attention given to gardening habits\u003c/p\u003e\n",
      "content_text": "\nA self-hostable habit tracker with special attention given to gardening habits\n",
      "summary": "A self-hostable habit tracker with special attention given to gardening habits",
      "date_published": "2025-12-27T06:44:31Z",
      "date_modified": "2025-12-27T06:44:31Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "projects"
      ]
    },
    {
      "id": "https://pype.dev/qr-harbor/",
      "url": "https://pype.dev/qr-harbor/",
      "title": "QR Harbor",
      "content_html": "\u003cp\u003eThe QR side of \u003ca href=\"https://mydigitalharbor.com\"\u003eDigital Harbor\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"features\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFeatures\u003c/span\u003e \u003ca href=\"#features\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eself-service QR code generator\n\u003cul\u003e\n\u003cli\u003eframes\u003c/li\u003e\n\u003cli\u003ecolors\u003c/li\u003e\n\u003cli\u003ebrandingicons\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003edynamic link resolution\u003c/li\u003e\n\u003cli\u003eanalytics\u003c/li\u003e\n\u003cli\u003esimple API\n\u003cul\u003e\n\u003cli\u003esee \u003ca href=\"https://hovercode.com/api/\"\u003ehovercode\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.qrcode-monkey.com/qr-code-api-with-logo/?utm_source=google_c\u0026amp;utm_medium=cpc\u0026amp;utm_campaign=\u0026amp;utm_content=\u0026amp;utm_term=qr%20monkey_e\u0026amp;gad_source=1\u0026amp;gad_campaignid=12510385649\u0026amp;gclid=Cj0KCQiAgbnKBhDgARIsAGCDdldVoC-8vXDpWy1MZ_u0M--AtiCfEF7-ZCGS6KeCGoQ2nWzK_RmaOmkaAru0EALw_wcB\"\u003eQR Code Monkey\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"infra\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eInfra\u003c/span\u003e \u003ca href=\"#infra\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003edynamic qr codes\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003etunnel\u003c/li\u003e\n\u003cli\u003eUI for 302s\u003c/li\u003e\n\u003cli\u003eUI for QRs\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\nThe QR side of [Digital Harbor](https://mydigitalharbor.com)\n\n## Features\n\n- self-service QR code generator\n  - frames\n  - colors\n  - brandingicons\n- dynamic link resolution\n- analytics\n- simple API\n  - see [hovercode](https://hovercode.com/api/)\n  - [QR Code Monkey](https://www.qrcode-monkey.com/qr-code-api-with-logo/?utm_source=google_c\u0026utm_medium=cpc\u0026utm_campaign=\u0026utm_content=\u0026utm_term=qr%20monkey_e\u0026gad_source=1\u0026gad_campaignid=12510385649\u0026gclid=Cj0KCQiAgbnKBhDgARIsAGCDdldVoC-8vXDpWy1MZ_u0M--AtiCfEF7-ZCGS6KeCGoQ2nWzK_RmaOmkaAru0EALw_wcB)\n\n## Infra\n\n- dynamic qr codes\n\n  1. tunnel\n  2. UI for 302s\n  3. UI for QRs\n",
      "summary": "The QR side of Digital Harbor",
      "date_published": "2025-12-26T05:13:22Z",
      "date_modified": "2025-12-26T05:13:22Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "projects",
        "digitalharbor"
      ]
    },
    {
      "id": "https://pype.dev/mindful/",
      "url": "https://pype.dev/mindful/",
      "title": "Mindful",
      "content_html": "\u003cp\u003eReminder and alarm app\u003c/p\u003e\n\u003ch2 id=\"features\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFeatures\u003c/span\u003e \u003ca href=\"#features\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003equick templates\u003c/li\u003e\n\u003cli\u003eworks everywhere (mobile, desktop)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"todos\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTODOs\u003c/span\u003e \u003ca href=\"#todos\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003epremium sign-up\u003c/li\u003e\n\u003cli\u003etest password reset\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\nReminder and alarm app\n\n## Features\n\n- quick templates\n- works everywhere (mobile, desktop)\n\n## TODOs\n\n- premium sign-up\n- test password reset\n",
      "summary": "Reminder and alarm app",
      "date_published": "2025-12-26T05:10:27Z",
      "date_modified": "2025-12-26T05:10:27Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "projects",
        "notifiq"
      ]
    },
    {
      "id": "https://pype.dev/notifiq/",
      "url": "https://pype.dev/notifiq/",
      "title": "Notifiq",
      "content_html": "\u003cblockquote\u003e\n\u003cp\u003eNote: this began in \u003ca href=\"/event-details-updates-via-notifications-as-a-service/\" class=\"wikilink\" data-title=\"Event Details Updates via Notifications as a Service\" data-description=\"I\u0026#39;ve moved these notes to soonish\" data-date=\"2025-09-02\" data-preview=\"I\u0026#39;ve moved these notes to soonish\"\u003eEvent Details Updates via Notifications as a Service\u003c/a\u003e and is the first iteration of this idea\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"projects\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eProjects\u003c/span\u003e \u003ca href=\"#projects\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/soonish/\" class=\"wikilink\" data-title=\"Soonish\" data-description=\"Personal events tracker dashboard\" data-date=\"2025-09-13\" data-preview=\"Personal events tracker dashboard\"\u003eSoonish\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/mindful/\" class=\"wikilink\" data-title=\"Mindful\" data-description=\"Reminder and alarm app\" data-date=\"2025-12-26\" data-preview=\"Reminder and alarm app\"\u003eMindful\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"docs\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDocs\u003c/span\u003e \u003ca href=\"#docs\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eConsider the \u003ca href=\"https://support.pushover.net/i8-how-much-does-pushover-cost-is-there-a-subscription\"\u003ePushover Docs\u003c/a\u003e for inspiration on notifiq docs as well\u003c/li\u003e\n\u003c/ul\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\u003ch2 id=\"use-cases\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eUse Cases\u003c/span\u003e \u003ca href=\"#use-cases\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eEvent Details and updates\u003c/li\u003e\n\u003cli\u003eIT ticketing system\u003c/li\u003e\n\u003cli\u003eVolunteer reminder system\u003c/li\u003e\n\u003c/ul\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\u003e\n\u003cli\u003e\u003ca href=\"/apprise/\" class=\"glossary-term\" title=\"Apprise - github project that\u0026#39;s awesome about notifications\" data-hover-title=\"apprise\"\u003eapprise\u003c/a\u003e server/library\u003c/li\u003e\n\u003cli\u003eCMS with users and roles + a database\u003c/li\u003e\n\u003c/ol\u003e\n\u003cul\u003e\n\u003cli\u003eupdates need to POST to apprise\u003c/li\u003e\n\u003c/ul\u003e\n\u003col start=\"3\"\u003e\n\u003cli\u003enotification backbone\u003c/li\u003e\n\u003c/ol\u003e\n\u003cul\u003e\n\u003cli\u003eSMS\u003c/li\u003e\n\u003cli\u003eemail (requires domain to offer a real service)\n\u003cul\u003e\n\u003cli\u003emaybe managers could bring their own email server?\u003c/li\u003e\n\u003cli\u003eno, just make it configurable - people setup the whole thing or they pay me\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003col start=\"4\"\u003e\n\u003cli\u003einfra\u003c/li\u003e\n\u003c/ol\u003e\n\u003cul\u003e\n\u003cli\u003eTemporal instead of webserver patterns may lead to easier scaling\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"drafting\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eDrafting\u003c/span\u003e \u003ca href=\"#drafting\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eBeen working in Windsurf with gpt-5 mostly on outlining the requirements for soonish\u003c/li\u003e\n\u003cli\u003eMy immediate goal is to have very detailed specs for the project to best utilize AI while building it without allowing the AI to drive any meaningful aspect of the development\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"ideas\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eIdeas\u003c/span\u003e \u003ca href=\"#ideas\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eWorkOS for auth for B2B for soonish\u003c/li\u003e\n\u003cli\u003eremind.notifiq.net/\u003curl\u003e as a usecase for soonish\n\u003cul\u003e\n\u003cli\u003econfigured reading times, so just get reminded at the next one\u003c/li\u003e\n\u003cli\u003ephase 2 of this idea might be grabbing the content of the url and sending the notification with some of that content\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"message-priority\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMessage Priority\u003c/span\u003e \u003ca href=\"#message-priority\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eEvents should have a priority of some \u003ca href=\"/kind/\" class=\"glossary-term\" title=\"kind - kubernetes in docker\" data-hover-title=\"kind\"\u003ekind\u003c/a\u003e so that business hours can be considered easily\u003c/li\u003e\n\u003cli\u003eShould channels have similar types of preferences? I suppose I need to think about the different user flows\n\u003cul\u003e\n\u003cli\u003eautomated event makes critical ticket outside business hours - force update subscribers based on\u0026hellip;. whatever they\u0026rsquo;re subscribed with/desired channels\u003c/li\u003e\n\u003cli\u003eevent update is critical - all subscribers need to know on their desired channels\u003c/li\u003e\n\u003cli\u003ethose above 2 are the same\u003c/li\u003e\n\u003cli\u003eevent update is not critical - do the signal to everyone but channels take into consideration that it\u0026rsquo;s info only, so respect a business hours/quiet hours and notify during appropriate time.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"frontends\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFrontends\u003c/span\u003e \u003ca href=\"#frontends\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eUse NiceGUI for a default events front end as a toy example to demonstrate notifiq use cases\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUse react for something like pager duty maybe - just to see what kind of things windsurf can do with it\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"competitors\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eCompetitors\u003c/span\u003e \u003ca href=\"#competitors\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://zenduty.com/pricing/\"\u003ezenduty\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"progress\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eProgress\u003c/span\u003e \u003ca href=\"#progress\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"november-22-2025\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eNovember 22 2025\u003c/span\u003e \u003ca href=\"#november-22-2025\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eadded auto-sub of creator to event (visibility)\n\u003cul\u003e\n\u003cli\u003eauto subscription_selector made for autosub:default\u003c/li\u003e\n\u003cli\u003esubscription_selector for event.tag == channel.tag as well\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n\u003e Note: this began in \u003ca href=\"/event-details-updates-via-notifications-as-a-service/\" class=\"wikilink\" data-title=\"Event Details Updates via Notifications as a Service\" data-description=\"I\u0026#39;ve moved these notes to soonish\" data-date=\"2025-09-02\"\u003eEvent Details Updates via Notifications as a Service\u003c/a\u003e and is the first iteration of this idea\n\n## Projects\n\n- \u003ca href=\"/soonish/\" class=\"wikilink\" data-title=\"Soonish\" data-description=\"Personal events tracker dashboard\" data-date=\"2025-09-13\"\u003eSoonish\u003c/a\u003e\n- \u003ca href=\"/mindful/\" class=\"wikilink\" data-title=\"Mindful\" data-description=\"Reminder and alarm app\" data-date=\"2025-12-26\"\u003eMindful\u003c/a\u003e\n\n## Docs\n\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\n## Notes\n\n## Use Cases\n\n- Event Details and updates\n- IT ticketing system\n- Volunteer reminder system\n\n## Requirements\n\n1. apprise server/library\n2. CMS with users and roles + a database\n\n- updates need to POST to apprise\n\n3. notification backbone\n\n- SMS\n- email (requires domain to offer a real service)\n  - maybe managers could bring their own email server?\n  - no, just make it configurable - people setup the whole thing or they pay me\n\n4. infra\n\n- Temporal instead of webserver patterns may lead to easier scaling\n\n## Drafting\n\n- Been working in Windsurf with gpt-5 mostly on outlining the requirements for soonish\n- My immediate goal is to have very detailed specs for the project to best utilize AI while building it without allowing the AI to drive any meaningful aspect of the development\n\n## Ideas\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## Message Priority\n\n- Events should have a priority of some kind so that business hours can be considered easily\n- Should channels have similar types of preferences? I suppose I need to think about the different user flows\n  - automated event makes critical ticket outside business hours - force update subscribers based on.... whatever they're subscribed with/desired channels\n  - event update is critical - all subscribers need to know on their desired channels\n  - those above 2 are the same\n  - event update is not critical - do the signal to everyone but channels take into consideration that it's info only, so respect a business hours/quiet hours and notify during appropriate time.\n\n## Frontends\n\n- Use NiceGUI for a default events front end as a toy example to demonstrate notifiq use cases\n\n- Use react for something like pager duty maybe - just to see what kind of things windsurf can do with it\n\n## Competitors\n\n- [zenduty](https://zenduty.com/pricing/)\n\n## Progress\n\n### November 22 2025\n\n- added auto-sub of creator to event (visibility)\n  - auto subscription_selector made for autosub:default\n  - subscription_selector for event.tag == channel.tag as well\n",
      "summary": "Note: this began in event-details-updates-via-notifications-as-a-service and is the first iteration of this idea",
      "date_published": "2025-12-26T05:08:54Z",
      "date_modified": "2025-12-26T05:08:54Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "projects",
        "notifiq"
      ]
    },
    {
      "id": "https://pype.dev/work-compensation-note/",
      "url": "https://pype.dev/work-compensation-note/",
      "title": "Work Compensation Note",
      "content_html": "\u003ch2 id=\"work-compensation-notes\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWork Compensation Notes\u003c/span\u003e \u003ca href=\"#work-compensation-notes\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eAnthony asked me what I needed to be happy and I didn\u0026rsquo;t have a good answer,\nbut I did ask for clarity on the chaos at work. I\u0026rsquo;ve thought more about it and\nI think I\u0026rsquo;ll just be honest with him. I have moon-lit in the past, exceeded\nexpectations at Cat, and made double my salary. I don\u0026rsquo;t need to go back to\nthat, but I want to ask him what he makes in total comp and what the horizon\nlooks like for me at Cat. Not because I want prestige, but because I want to\nprioritize my family and if I can give financial freedom to them (and myself)\n\u003cstrong\u003emuch\u003c/strong\u003e earlier than if I was solo-loyal to Cat, that\u0026rsquo;s a real thing I need to\nwrestle with. So my question for him will be how much of that gap can Cat close\nover time?\u003c/li\u003e\n\u003c/ul\u003e\n",
      "content_text": "\n## Work Compensation Notes\n\n- Anthony asked me what I needed to be happy and I didn't have a good answer,\nbut I did ask for clarity on the chaos at work. I've thought more about it and\nI think I'll just be honest with him. I have moon-lit in the past, exceeded\nexpectations at Cat, and made double my salary. I don't need to go back to\nthat, but I want to ask him what he makes in total comp and what the horizon\nlooks like for me at Cat. Not because I want prestige, but because I want to\nprioritize my family and if I can give financial freedom to them (and myself)\n__much__ earlier than if I was solo-loyal to Cat, that's a real thing I need to\nwrestle with. So my question for him will be how much of that gap can Cat close\nover time?\n",
      "summary": "Anthony asked me what I needed to be happy and I didn't have a good answer, but I did ask for clarity on the chaos at work. I've thought more about it and I...",
      "date_published": "2025-12-01T05:57:40Z",
      "date_modified": "2025-12-01T05:57:40Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "work"
      ]
    },
    {
      "id": "https://pype.dev/advent-2025-calendar/",
      "url": "https://pype.dev/advent-2025-calendar/",
      "title": "Advent 2025 Calendar",
      "content_html": "\u003ch2 id=\"sunday\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSunday\u003c/span\u003e \u003ca href=\"#sunday\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre\u003e\u003ccode\u003eNov. 30\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eIsaiah\n8:17\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eAs you look at your life or the world around you, where does\nit seem like God is hiding his face? How do you hold onto\nhope in those situations?\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003ca href=\"/advent-isaiah-8-17/\" class=\"wikilink\" data-title=\"Advent - Isaiah 8:17\" data-description=\"!!! note \u0026#34;Isaiah 8:17\u0026#34;\" data-date=\"2025-12-01\" data-preview=\"!!! note \u0026#34;Isaiah 8:17\u0026#34;\"\u003eAdvent - Isaiah 8:17\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"monday\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMonday\u003c/span\u003e \u003ca href=\"#monday\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre\u003e\u003ccode\u003eDec. 1\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003ePsalm\n39:7\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eWhat are you looking or hoping for in this Advent season?\nConsider bringing those things to God.\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003ca href=\"/advent-psalm-39-7/\" class=\"wikilink\" data-title=\"Advent - Psalm 39:7\" data-description=\"!!! note \u0026#34;Psalm 39:7\u0026#34;\" data-date=\"2025-12-01\" data-preview=\"!!! note \u0026#34;Psalm 39:7\u0026#34;\"\u003eAdvent - Psalm 39:7\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"tuesday\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTuesday\u003c/span\u003e \u003ca href=\"#tuesday\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre\u003e\u003ccode\u003eDec. 2\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003ePsalm\n130:7\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eHow have you experienced God’s consistent,\ndependable love in the past? How does that ground\nyour hope for the future?\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003ca href=\"/advent-psalm-130-7/\" class=\"wikilink\" data-title=\"Advent - Psalm 130:7\" data-description=\"!!! note \u0026#34;Psalm 130:7\u0026#34;\" data-date=\"2025-12-02\" data-preview=\"!!! note \u0026#34;Psalm 130:7\u0026#34;\"\u003eAdvent - Psalm 130:7\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"wednesday\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWednesday\u003c/span\u003e \u003ca href=\"#wednesday\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre\u003e\u003ccode\u003eDec. 3\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eIsaiah\n40:31\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eConsider the parts of life that feel most exhausting right\nnow. What could it look like to put your hope in God for\nstrength and direction?\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2 id=\"thursday\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThursday\u003c/span\u003e \u003ca href=\"#thursday\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre\u003e\u003ccode\u003eDec. 4\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003e1 Peter\n1:3\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eHow does Jesus’ resurrection from death shape your hope\nfor both the future and life today?\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2 id=\"friday\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFriday\u003c/span\u003e \u003ca href=\"#friday\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre\u003e\u003ccode\u003eDec. 5\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eRomans\n8:20-21\n\u003c/code\u003e\u003c/pre\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\u003ch2 id=\"saturday\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSaturday\u003c/span\u003e \u003ca href=\"#saturday\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre\u003e\u003ccode\u003eDec. 6\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eRomans\n8:24-25\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eWhat does it look like for you to actively but patiently\nwait for God right now?\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eWatch the Hope Video\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eDAY VERSE REFLECTION QUESTION\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2 id=\"sunday-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSunday\u003c/span\u003e \u003ca href=\"#sunday-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre\u003e\u003ccode\u003eDec. 7\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eIsaiah\n26:3\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eWhat situations of conflict are you currently facing?\nWhere are you struggling to find internal peace?\nConsider inviting God into those situations.\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2 id=\"monday-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMonday\u003c/span\u003e \u003ca href=\"#monday-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre\u003e\u003ccode\u003eDec. 8\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eIsaiah\n9:6-7\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eAs you reflect on your relationships with others and the\nstate of the world, how does God’s promise to bring\nunending peace among all humankind make you feel?\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2 id=\"tuesday-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTuesday\u003c/span\u003e \u003ca href=\"#tuesday-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre\u003e\u003ccode\u003eDec. 9\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eZechariah 9:9-10\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eHow is God’s promised king different from the rulers of\nthis world, who often bring “peace” through domination\nand violence?\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2 id=\"wednesday-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWednesday\u003c/span\u003e \u003ca href=\"#wednesday-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre\u003e\u003ccode\u003eDec. 10\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eJohn\n16:33\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eWhat do you think Jesus means when he says that he has\n\u0026quot;overcome the world?\u0026quot; How might that understanding bring\npeace during times of trouble?\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2 id=\"thursday-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThursday\u003c/span\u003e \u003ca href=\"#thursday-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre\u003e\u003ccode\u003eDec. 11\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eColossians 1:19-20\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eWhen Paul says “all things” here, he means everything God\ncreated, including you. How does it feel to know that God is\nreconciling everything to himself?\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2 id=\"friday-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFriday\u003c/span\u003e \u003ca href=\"#friday-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre\u003e\u003ccode\u003eDec. 12\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003e\nEphesians 2:14-15\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eWhere in your world are peacemakers needed right now?\nWhat might it look like to bring Jesus’ kind of peace to\nthese places?\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2 id=\"saturday-1\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSaturday\u003c/span\u003e \u003ca href=\"#saturday-1\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre\u003e\u003ccode\u003eDec. 13\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eEphesians\n4:3\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eWhat might it look like for us to “keep the unity of the Spirit”\nas agents of God’s peace today?\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eWatch the Peace Video\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eDAY VERSE REFLECTION QUESTION\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2 id=\"sunday-2\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSunday\u003c/span\u003e \u003ca href=\"#sunday-2\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre\u003e\u003ccode\u003eDec. 14\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003ePsalm 105:43\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eThe ancient Israelites experienced inexpressible joy when\nGod brought them out of slavery in Egypt. When in your life\nhave you experienced moments of inexpressible joy?\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2 id=\"monday-2\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMonday\u003c/span\u003e \u003ca href=\"#monday-2\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre\u003e\u003ccode\u003eDec. 15\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eIsaiah 51:3\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eWhat would it be like for all of the broken-down, desolate\nplaces in your community to be made new, like a\nflourishing garden?\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2 id=\"tuesday-2\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTuesday\u003c/span\u003e \u003ca href=\"#tuesday-2\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre\u003e\u003ccode\u003eDec. 16\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eLuke 2:10-11\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eHow do you think you would feel if your people had been\nsuffering under foreign rule for centuries and you saw an\nangel appear, announcing that your long-awaited king\nhad finally come?\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2 id=\"wednesday-2\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWednesday\u003c/span\u003e \u003ca href=\"#wednesday-2\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre\u003e\u003ccode\u003eDec. 17\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eJohn 15:10-11\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eWhat’s the difference between commanding people with a\nmotivation to control them and commanding people with a\nmotivation to bless them and fill their lives with joy? How do\nJesus’ commands bring joy?\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2 id=\"thursday-2\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThursday\u003c/span\u003e \u003ca href=\"#thursday-2\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre\u003e\u003ccode\u003eDec. 18\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eMatthew 5:11-12\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eWhat’s your first impulse when you’re insulted or\npersecuted? Why do you think Jesus tells us to rejoice\nwhen people mistreat us for following his ways?\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2 id=\"friday-2\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eFriday\u003c/span\u003e \u003ca href=\"#friday-2\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre\u003e\u003ccode\u003eDec. 19\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003e2 Corinthians\n6:10\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eWhen we face difficult circumstances, how can we hold\nboth joy and grief together?\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2 id=\"saturday-2\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSaturday\u003c/span\u003e \u003ca href=\"#saturday-2\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre\u003e\u003ccode\u003eDec. 20\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eRomans 15:13\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eAs God fills us with hope, that hope spills out onto others.\nWhat words or actions could you offer in order to give\nhope to others?\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eWatch the Joy Video\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eDAY VERSE REFLECTION QUESTION\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2 id=\"sunday-3\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eSunday\u003c/span\u003e \u003ca href=\"#sunday-3\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre\u003e\u003ccode\u003eDec. 21\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eMark 12:29-30\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eWhat do you think it looks like to love God with everything\nyou’ve got, including your strength, affection, intellect, and\nentire being?\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2 id=\"monday-3\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eMonday\u003c/span\u003e \u003ca href=\"#monday-3\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre\u003e\u003ccode\u003eDec. 22\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eMark\n12:29-31\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eHow does loving your neighbor as yourself relate\nto loving God?\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2 id=\"tuesday-3\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eTuesday\u003c/span\u003e \u003ca href=\"#tuesday-3\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre\u003e\u003ccode\u003eDec. 23\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eLuke 6:35\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eWhen you read about God being kind to ungrateful and\nwicked people, how do you feel?\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2 id=\"wednesday-3\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eWednesday\u003c/span\u003e \u003ca href=\"#wednesday-3\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre\u003e\u003ccode\u003eDec. 24\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003e1 John 4:8-9\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eWhat do you think it means when the Bible says\nGod not only acts in love but is love?\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2 id=\"thursday-3\"\u003e\u003cspan class=\"heading-wear-glyph\"\u003eThursday\u003c/span\u003e \u003ca href=\"#thursday-3\" class=\"heading-anchor\"\u003e#\u003c/a\u003e\u003c/h2\u003e\n\u003cpre\u003e\u003ccode\u003eDec. 25\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003e1 John 4:17\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eHow would you describe the difference between Jesus’\nway of love and the common understanding of love as\nsomething you can fall in or out of?\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003eWatch the Love Video\n\u003c/code\u003e\u003c/pre\u003e\n",
      "content_text": "\n## Sunday\n\n```\nNov. 30\n```\n\n```\nIsaiah\n8:17\n```\n\n```\nAs you look at your life or the world around you, where does\nit seem like God is hiding his face? How do you hold onto\nhope in those situations?\n```\n\n\u003ca href=\"/advent-isaiah-8-17/\" class=\"wikilink\" data-title=\"Advent - Isaiah 8:17\" data-description=\"!!! note \u0026#34;Isaiah 8:17\u0026#34;\" data-date=\"2025-12-01\"\u003eAdvent - Isaiah 8:17\u003c/a\u003e\n\n## Monday\n\n```\nDec. 1\n```\n\n```\nPsalm\n39:7\n```\n\n```\nWhat are you looking or hoping for in this Advent season?\nConsider bringing those things to God.\n```\n\n\u003ca href=\"/advent-psalm-39-7/\" class=\"wikilink\" data-title=\"Advent - Psalm 39:7\" data-description=\"!!! note \u0026#34;Psalm 39:7\u0026#34;\" data-date=\"2025-12-01\"\u003eAdvent - Psalm 39:7\u003c/a\u003e\n\n## Tuesday\n\n```\nDec. 2\n```\n\n```\nPsalm\n130:7\n```\n\n```\nHow have you experienced God’s consistent,\ndependable love in the past? How does that ground\nyour hope for the future?\n```\n\n\u003ca href=\"/advent-psalm-130-7/\" class=\"wikilink\" data-title=\"Advent - Psalm 130:7\" data-description=\"!!! note \u0026#34;Psalm 130:7\u0026#34;\" data-date=\"2025-12-02\"\u003eAdvent - Psalm 130:7\u003c/a\u003e\n\n## Wednesday\n\n```\nDec. 3\n```\n\n```\nIsaiah\n40:31\n```\n\n```\nConsider the parts of life that feel most exhausting right\nnow. What could it look like to put your hope in God for\nstrength and direction?\n```\n\n## Thursday\n\n```\nDec. 4\n```\n\n```\n1 Peter\n1:3\n```\n\n```\nHow does Jesus’ resurrection from death shape your hope\nfor both the future and life today?\n```\n\n## Friday\n\n```\nDec. 5\n```\n\n```\nRomans\n8:20-21\n```\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\n## Saturday\n\n```\nDec. 6\n```\n\n```\nRomans\n8:24-25\n```\n\n```\nWhat does it look like for you to actively but patiently\nwait for God right now?\n```\n\n```\nWatch the Hope Video\n```\n\n```\nDAY VERSE REFLECTION QUESTION\n```\n\n## Sunday\n\n```\nDec. 7\n```\n\n```\nIsaiah\n26:3\n```\n\n```\nWhat situations of conflict are you currently facing?\nWhere are you struggling to find internal peace?\nConsider inviting God into those situations.\n```\n\n## Monday\n\n```\nDec. 8\n```\n\n```\nIsaiah\n9:6-7\n```\n\n```\nAs you reflect on your relationships with others and the\nstate of the world, how does God’s promise to bring\nunending peace among all humankind make you feel?\n```\n\n## Tuesday\n\n```\nDec. 9\n```\n\n```\nZechariah 9:9-10\n```\n\n```\nHow is God’s promised king different from the rulers of\nthis world, who often bring “peace” through domination\nand violence?\n```\n\n## Wednesday\n\n```\nDec. 10\n```\n\n```\nJohn\n16:33\n```\n\n```\nWhat do you think Jesus means when he says that he has\n\"overcome the world?\" How might that understanding bring\npeace during times of trouble?\n```\n\n## Thursday\n\n```\nDec. 11\n```\n\n```\nColossians 1:19-20\n```\n\n```\nWhen Paul says “all things” here, he means everything God\ncreated, including you. How does it feel to know that God is\nreconciling everything to himself?\n```\n\n## Friday\n\n```\nDec. 12\n```\n\n```\n\nEphesians 2:14-15\n```\n\n```\nWhere in your world are peacemakers needed right now?\nWhat might it look like to bring Jesus’ kind of peace to\nthese places?\n```\n\n## Saturday\n\n```\nDec. 13\n```\n\n```\nEphesians\n4:3\n```\n\n```\nWhat might it look like for us to “keep the unity of the Spirit”\nas agents of God’s peace today?\n```\n\n```\nWatch the Peace Video\n```\n\n```\nDAY VERSE REFLECTION QUESTION\n```\n\n## Sunday\n\n```\nDec. 14\n```\n\n```\nPsalm 105:43\n```\n\n```\nThe ancient Israelites experienced inexpressible joy when\nGod brought them out of slavery in Egypt. When in your life\nhave you experienced moments of inexpressible joy?\n```\n\n## Monday\n\n```\nDec. 15\n```\n\n```\nIsaiah 51:3\n```\n\n```\nWhat would it be like for all of the broken-down, desolate\nplaces in your community to be made new, like a\nflourishing garden?\n```\n\n## Tuesday\n\n```\nDec. 16\n```\n\n```\nLuke 2:10-11\n```\n\n```\nHow do you think you would feel if your people had been\nsuffering under foreign rule for centuries and you saw an\nangel appear, announcing that your long-awaited king\nhad finally come?\n```\n\n## Wednesday\n\n```\nDec. 17\n```\n\n```\nJohn 15:10-11\n```\n\n```\nWhat’s the difference between commanding people with a\nmotivation to control them and commanding people with a\nmotivation to bless them and fill their lives with joy? How do\nJesus’ commands bring joy?\n```\n\n## Thursday\n\n```\nDec. 18\n```\n\n```\nMatthew 5:11-12\n```\n\n```\nWhat’s your first impulse when you’re insulted or\npersecuted? Why do you think Jesus tells us to rejoice\nwhen people mistreat us for following his ways?\n```\n\n## Friday\n\n```\nDec. 19\n```\n\n```\n2 Corinthians\n6:10\n```\n\n```\nWhen we face difficult circumstances, how can we hold\nboth joy and grief together?\n```\n\n## Saturday\n\n```\nDec. 20\n```\n\n```\nRomans 15:13\n```\n\n```\nAs God fills us with hope, that hope spills out onto others.\nWhat words or actions could you offer in order to give\nhope to others?\n```\n\n```\nWatch the Joy Video\n```\n\n```\nDAY VERSE REFLECTION QUESTION\n```\n\n## Sunday\n\n```\nDec. 21\n```\n\n```\nMark 12:29-30\n```\n\n```\nWhat do you think it looks like to love God with everything\nyou’ve got, including your strength, affection, intellect, and\nentire being?\n```\n\n## Monday\n\n```\nDec. 22\n```\n\n```\nMark\n12:29-31\n```\n\n```\nHow does loving your neighbor as yourself relate\nto loving God?\n```\n\n## Tuesday\n\n```\nDec. 23\n```\n\n```\nLuke 6:35\n```\n\n```\nWhen you read about God being kind to ungrateful and\nwicked people, how do you feel?\n```\n\n## Wednesday\n\n```\nDec. 24\n```\n\n```\n1 John 4:8-9\n```\n\n```\nWhat do you think it means when the Bible says\nGod not only acts in love but is love?\n```\n\n## Thursday\n\n```\nDec. 25\n```\n\n```\n1 John 4:17\n```\n\n```\nHow would you describe the difference between Jesus’\nway of love and the common understanding of love as\nsomething you can fall in or out of?\n```\n\n```\nWatch the Love Video\n```\n",
      "summary": "advent-isaiah-8-17",
      "date_published": "2025-12-01T05:57:40Z",
      "date_modified": "2025-12-01T05:57:40Z",
      "authors": [
        {
          "name": "Nic Payne",
          "url": "https://pype.dev"
        }
      ],
      "tags": [
        "advent",
        "note"
      ]
    }
  ]
}