cmc/cleberg.net

My personal web garden & blog.

clone: git clone https://gitbay.org/cmc/cleberg.net.git

11a5ca2792cd0debb6b8f510ffd716e6f734dbd6

verified · cmc

author: Christian Cleberg <hello@cleberg.net> · 2026-03-13T20:56:35Z

fix *.org headers and revert to minimal site theme
 .github/FUNDING.yml                                |   1 +
 .github/dependabot.yml                             |   6 +
 .github/workflows/codeql.yml                       |  46 ++
 .github/workflows/deploy.yml                       |  68 +++
 .github/workflows/docker-build.yml                 |  41 ++
 .github/workflows/ruff.yml                         |  42 ++
 BRAND.md                                           |  98 ----
 README.org                                         |   6 -
 build.py                                           |  61 +--
 content/apps/index.org                             |  47 +-
 content/blog/2018-11-28-aes-encryption.org         |   8 +-
 content/blog/2018-11-28-cpp-compiler.org           |   8 +-
 content/blog/2019-01-07-useful-css.org             |   8 +-
 content/blog/2019-09-09-audit-analytics.org        |   8 +-
 content/blog/2019-12-03-the-ansoff-matrix.org      |   8 +-
 content/blog/2019-12-16-password-security.org      |   8 +-
 content/blog/2020-01-25-linux-software.org         |   8 +-
 content/blog/2020-01-26-steam-on-ntfs.org          |   8 +-
 content/blog/2020-02-09-cryptography-basics.org    |   8 +-
 content/blog/2020-03-25-session-messenger.org      |   8 +-
 content/blog/2020-05-03-homelab.org                |   8 +-
 content/blog/2020-05-19-customizing-ubuntu.org     |   8 +-
 content/blog/2020-07-20-video-game-sales.org       |   8 +-
 content/blog/2020-07-26-business-analysis.org      |   8 +-
 content/blog/2020-08-22-redirect-github-pages.org  |   8 +-
 content/blog/2020-08-29-php-auth-flow.org          |   8 +-
 content/blog/2020-09-01-visual-recognition.org     |   6 +-
 content/blog/2020-09-22-internal-audit.org         |   8 +-
 content/blog/2020-09-25-happiness-map.org          |   6 +-
 content/blog/2020-10-12-mediocrity.org             |   8 +-
 content/blog/2020-12-27-website-redesign.org       |   8 +-
 content/blog/2020-12-28-neon-drive.org             |   8 +-
 content/blog/2020-12-29-zork.org                   |   8 +-
 content/blog/2021-01-01-seum.org                   |   8 +-
 content/blog/2021-01-04-fediverse.org              |   8 +-
 content/blog/2021-01-07-ufw.org                    |   8 +-
 content/blog/2021-02-19-macos.org                  |   8 +-
 content/blog/2021-03-19-clone-github-repos.org     |   8 +-
 content/blog/2021-03-28-gemini-capsule.org         |   8 +-
 content/blog/2021-03-28-vaporwave-vs-outrun.org    |   8 +-
 content/blog/2021-03-30-vps-web-server.org         |   8 +-
 content/blog/2021-04-17-gemini-server.org          |   8 +-
 content/blog/2021-04-23-php-comment-system.org     |   8 +-
 content/blog/2021-04-28-photography.org            |   8 +-
 content/blog/2021-05-30-changing-git-authors.org   |   8 +-
 content/blog/2021-07-15-delete-gitlab-repos.org    |   8 +-
 content/blog/2021-08-25-audit-sampling.org         |   8 +-
 content/blog/2021-10-09-apache-redirect.org        |   8 +-
 content/blog/2021-12-04-cisa.org                   |   8 +-
 content/blog/2022-02-10-leaving-the-office.org     |   8 +-
 content/blog/2022-02-10-njalla-dns-api.org         |   8 +-
 content/blog/2022-02-16-debian-and-nginx.org       |   8 +-
 content/blog/2022-02-17-exiftool.org               |   8 +-
 content/blog/2022-02-20-nginx-caching.org          |   8 +-
 content/blog/2022-02-22-tuesday.org                |   8 +-
 content/blog/2022-03-02-reliable-notes.org         |   8 +-
 content/blog/2022-03-03-financial-database.org     |   8 +-
 content/blog/2022-03-08-plex-migration.org         |   8 +-
 content/blog/2022-03-23-cloudflare-dns-api.org     |   8 +-
 content/blog/2022-03-23-nextcloud-on-ubuntu.org    |   8 +-
 content/blog/2022-03-24-server-hardening.org       |   8 +-
 content/blog/2022-03-26-ssh-mfa.org                |   8 +-
 content/blog/2022-04-02-nginx-reverse-proxy.org    |   8 +-
 content/blog/2022-04-09-pinetime.org               |   8 +-
 content/blog/2022-06-01-ditching-cloudflare.org    |   8 +-
 content/blog/2022-06-07-self-hosting-freshrss.org  |   8 +-
 content/blog/2022-06-16-terminal-lifestyle.org     |   8 +-
 content/blog/2022-06-22-daily-poetry.org           |   8 +-
 content/blog/2022-06-24-fedora-i3.org              |   8 +-
 content/blog/2022-07-01-git-server.org             |   8 +-
 content/blog/2022-07-14-gnupg.org                  |   8 +-
 content/blog/2022-07-25-curseradio.org             |   8 +-
 content/blog/2022-07-30-flac-to-opus.org           |   8 +-
 content/blog/2022-07-31-bash-it.org                |   8 +-
 content/blog/2022-08-31-privacy-com-changes.org    |   8 +-
 content/blog/2022-09-17-serenity-os.org            |   8 +-
 content/blog/2022-09-21-graphene-os.org            |   8 +-
 content/blog/2022-10-04-mtp-linux.org              |   8 +-
 content/blog/2022-10-04-syncthing.org              |   8 +-
 content/blog/2022-10-22-alpine-linux.org           |   8 +-
 content/blog/2022-10-30-linux-display-manager.org  |   8 +-
 content/blog/2022-11-07-self-hosting-matrix.org    |   8 +-
 content/blog/2022-11-11-nginx-tmp-errors.org       |   8 +-
 content/blog/2022-11-27-server-build.org           |   8 +-
 .../blog/2022-11-29-nginx-referrer-ban-list.org    |   8 +-
 content/blog/2022-12-01-nginx-compression.org      |   8 +-
 .../blog/2022-12-07-nginx-wildcard-redirect.org    |   8 +-
 content/blog/2022-12-17-st.org                     |   8 +-
 content/blog/2022-12-23-alpine-desktop.org         |   8 +-
 content/blog/2023-01-03-recent-website-changes.org |   8 +-
 .../blog/2023-01-05-mass-unlike-tumblr-posts.org   |   8 +-
 content/blog/2023-01-08-fedora-login-manager.org   |   8 +-
 content/blog/2023-01-21-flatpak-symlinks.org       |   8 +-
 content/blog/2023-01-23-random-wireguard.org       |   8 +-
 content/blog/2023-01-28-self-hosting-wger.org      |   8 +-
 content/blog/2023-02-02-exploring-hare.org         |   8 +-
 content/blog/2023-05-22-burnout.org                |   8 +-
 content/blog/2023-06-08-goaccess-geoip.org         |   8 +-
 content/blog/2023-06-08-self-hosting-baikal.org    |   8 +-
 content/blog/2023-06-18-unifi-ip-blocklist.org     |   8 +-
 content/blog/2023-06-20-audit-review-template.org  |   8 +-
 content/blog/2023-06-23-byobu.org                  |   8 +-
 content/blog/2023-06-23-self-hosting-convos.org    |   8 +-
 content/blog/2023-06-28-backblaze-b2.org           |   8 +-
 content/blog/2023-06-30-self-hosting-voyager.org   |   8 +-
 content/blog/2023-07-12-wireguard-lan.org          |   8 +-
 content/blog/2023-07-19-plex-transcoder-errors.org |   8 +-
 content/blog/2023-08-18-agile-auditing.org         |   8 +-
 content/blog/2023-09-15-self-hosting-gitweb.org    |   8 +-
 content/blog/2023-09-19-audit-sql-scripts.org      |   8 +-
 content/blog/2023-10-04-digital-minimalism.org     |   8 +-
 content/blog/2023-10-11-self-hosting-authelia.org  |   8 +-
 content/blog/2023-10-15-alpine-ssh-hardening.org   |   8 +-
 .../2023-10-17-self-hosting-anonymousoverflow.org  |   8 +-
 content/blog/2023-11-08-scli.org                   |   8 +-
 content/blog/2023-12-03-unifi-nextdns.org          |   8 +-
 content/blog/2024-01-08-dont-say-hello.org         |   8 +-
 content/blog/2024-01-09-macos-customization.org    |   8 +-
 content/blog/2024-01-13-local-llm.org              |   8 +-
 content/blog/2024-01-26-audit-dashboard.org        |   8 +-
 content/blog/2024-01-27-tableau-dashboard.org      |   8 +-
 content/blog/2024-02-06-zfs.org                    |   8 +-
 content/blog/2024-02-13-ubuntu-emergency-mode.org  |   8 +-
 .../blog/2024-02-21-self-hosting-otter-wiki.org    |   8 +-
 content/blog/2024-03-13-doom-emacs.org             |   8 +-
 .../blog/2024-03-15-self-hosting-ddns-updater.org  |   8 +-
 content/blog/2024-03-29-org-blog.org               |   8 +-
 .../2024-04-06-convert-onenote-to-markdown.org     |   8 +-
 .../blog/2024-04-08-docker-local-web-server.org    |   8 +-
 content/blog/2024-04-18-mu4e.org                   |   8 +-
 content/blog/2024-05-03-ubuntu-on-macos.org        |   8 +-
 .../blog/2024-06-19-deprecated-trusted-gpg-fix.org |   8 +-
 content/blog/2024-07-11-emacs-on-ipad.org          |   8 +-
 content/blog/2024-08-11-org-mode-features.org      |   8 +-
 content/blog/2024-08-25-n8n-sentiment-analysis.org |   8 +-
 .../blog/2024-09-20-prometheus-grafana-cloud.org   |   8 +-
 .../blog/2024-09-23-self-hosting-transmission.org  |   8 +-
 .../2024-10-31-continue-ollama-code-assistant.org  |   8 +-
 .../blog/2024-12-27-self-hosting-the-lounge.org    |   8 +-
 content/blog/2025-01-23-self-hosting-tandoor.org   |   8 +-
 content/blog/2025-02-11-obscura-vpn.org            |   8 +-
 content/blog/2025-02-24-email-migration.org        |   8 +-
 content/blog/2025-04-05-git-mirror.org             |   8 +-
 content/blog/2025-05-02-asahi-linux.org            |   8 +-
 content/blog/2025-05-30-it-audit-career.org        |   8 +-
 content/blog/2025-06-02-private-ios-apps.org       |   8 +-
 content/blog/2025-09-04-website-redesign.org       |   8 +-
 .../2025-09-25-minimalist-website-redesign.org     |   8 +-
 content/blog/2025-10-03-privacy-toolkit.org        |   8 +-
 content/blog/2025-10-06-rocket-league-macos.org    |   8 +-
 content/blog/2025-10-24-digital-garden.org         |   8 +-
 content/blog/2025-11-02-aerc-macos.org             |   8 +-
 content/blog/2025-11-13-wcag.org                   |   8 +-
 content/blog/2025-11-23-it-audit-ai.org            |   8 +-
 content/blog/2025-12-06-self-hosting-tor.org       |   8 +-
 .../2025-12-20-self-hosting-home-assistant.org     |   8 +-
 ...-31-emacs-carnival-2026-01-this-year-i-will.org |   8 +-
 ...026-02-02-emacs-carnival-2026-02-completion.org |   8 +-
 ...web-carnival-2026-02-intersecting-interests.org |   8 +-
 content/blog/2026-02-08-gnu-stow.org               |   8 +-
 .../2026-02-12-automating-weblorg-deployments.org  |   8 +-
 content/blog/2026-02-21-auditing-aws-iam.org       |   8 +-
 content/blog/2026-02-21-auditing-aws-passwords.org |   8 +-
 content/blog/2026-03-03-auditing-aws-s3.org        |  10 +-
 content/guides/index.org                           |   2 +-
 content/salary/index.org                           |   2 +-
 screenshots/dark.png                               | Bin 157948 -> 0 bytes
 screenshots/light.png                              | Bin 147082 -> 0 bytes
 tag_preview.py                                     | 177 ------
 theme/static/favicon.svg                           |  14 -
 theme/static/koi-hr.svg                            |   7 -
 theme/static/styles.css                            | 607 +--------------------
 theme/static/tokens.css                            |  51 --
 theme/templates/base.html                          |  49 +-
 theme/templates/blog.html                          |  16 +-
 theme/templates/garden.html                        |  18 +-
 theme/templates/index.html                         |  38 +-
 theme/templates/page.html                          |   2 +-
 theme/templates/post.html                          |  10 +-
 utils/nginx-dev.conf                               |  17 -
 180 files changed, 927 insertions(+), 1729 deletions(-)

diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
new file mode 100644
index 0000000..4b822e5
--- /dev/null
+++ b/.github/FUNDING.yml
@@ -0,0 +1 @@
+github: [ccleberg]
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 0000000..6483b1d
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,6 @@
+version: 2
+updates:
+  - package-ecosystem: "uv"
+    directory: "/"
+    schedule:
+      interval: "weekly"
diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml
new file mode 100644
index 0000000..f857dda
--- /dev/null
+++ b/.github/workflows/codeql.yml
@@ -0,0 +1,46 @@
+name: "CodeQL Advanced"
+
+on:
+  push:
+    branches: [ "main" ]
+  pull_request:
+    branches: [ "main" ]
+
+jobs:
+  analyze:
+    name: Analyze (${{ matrix.language }})
+    runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }}
+    permissions:
+      security-events: write
+      packages: read
+      actions: read
+      contents: read
+
+    strategy:
+      fail-fast: false
+      matrix:
+        include:
+        - language: python
+          build-mode: none
+    steps:
+    - name: Checkout repository
+      uses: actions/checkout@v4
+    - name: Initialize CodeQL
+      uses: github/codeql-action/init@v4
+      with:
+        languages: ${{ matrix.language }}
+        build-mode: ${{ matrix.build-mode }}
+    - if: matrix.build-mode == 'manual'
+      shell: bash
+      run: |
+        echo 'If you are using a "manual" build mode for one or more of the' \
+          'languages you are analyzing, replace this with the commands to build' \
+          'your code, for example:'
+        echo '  make bootstrap'
+        echo '  make release'
+        exit 1
+
+    - name: Perform CodeQL Analysis
+      uses: github/codeql-action/analyze@v4
+      with:
+        category: "/language:${{matrix.language}}"
diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
new file mode 100644
index 0000000..310b432
--- /dev/null
+++ b/.github/workflows/deploy.yml
@@ -0,0 +1,68 @@
+name: Build and Deploy
+
+on:
+  push:
+    branches:
+      - main
+    paths-ignore:
+      - '.github/**'
+      - 'screenshots/**'
+      - 'utils/**'
+      - 'LICENSE'
+      - 'README.org'
+
+jobs:
+  build-job:
+    runs-on: ubuntu-latest
+    container:
+      image: ghcr.io/ccleberg/cleberg.net:main
+
+    steps:
+      - name: Checkout code
+        uses: actions/checkout@v4
+
+      - name: Run Build
+        env:
+          ENV: "prod"
+          BUILD: "true"
+          DEPLOY: "false"
+        run: |
+          echo "Environment is ready. Running build..."
+          uv run build.py
+
+      - name: Upload Build Artifacts
+        uses: actions/upload-artifact@v4
+        with:
+          name: build-output
+          path: ${{ github.workspace }}/.build/
+          include-hidden-files: true
+
+  deploy-job:
+    runs-on: ubuntu-latest
+    needs: build-job
+    environment: production
+    container:
+      image: ghcr.io/ccleberg/cleberg.net:main
+
+    steps:
+      - name: Checkout code
+        uses: actions/checkout@v4
+
+      - name: Download Build Artifacts
+        uses: actions/download-artifact@v4
+        with:
+          name: build-output
+          path: ${{ github.workspace }}/.build/
+
+      - name: Setup SSH and Deploy
+        env:
+          SERVER_IP: ${{ secrets.SERVER_IP }}
+          SERVER_USER: ${{ secrets.SERVER_USER }}
+          SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
+        run: |
+          eval $(ssh-agent -s)
+          echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
+          rsync -avz --delete \
+            -e "ssh -p ${{ secrets.SSH_PORT }} -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" \
+            .build/ \
+            $SERVER_USER@$SERVER_IP:/var/www/cleberg.net/
diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml
new file mode 100644
index 0000000..b3d0455
--- /dev/null
+++ b/.github/workflows/docker-build.yml
@@ -0,0 +1,41 @@
+name: Build and Push Docker Image
+
+on:
+  push:
+    branches: [ "main" ]
+    paths:
+      - 'Dockerfile'
+      - 'requirements.txt'
+      - '.github/workflows/docker-build.yml'
+
+jobs:
+  build:
+    runs-on: ubuntu-latest
+    permissions:
+      contents: read
+      packages: write
+
+    steps:
+      - name: Checkout repository
+        uses: actions/checkout@v4
+
+      - name: Log in to GHCR
+        uses: docker/login-action@v3
+        with:
+          registry: ghcr.io
+          username: ${{ github.actor }}
+          password: ${{ secrets.GITHUB_TOKEN }}
+
+      - name: Extract metadata
+        id: meta
+        uses: docker/metadata-action@v5
+        with:
+          images: ghcr.io/${{ github.repository }}
+
+      - name: Build and push
+        uses: docker/build-push-action@v5
+        with:
+          context: .
+          push: true
+          tags: ${{ steps.meta.outputs.tags }}
+          labels: ${{ steps.meta.outputs.labels }}
diff --git a/.github/workflows/ruff.yml b/.github/workflows/ruff.yml
new file mode 100644
index 0000000..1c0fbea
--- /dev/null
+++ b/.github/workflows/ruff.yml
@@ -0,0 +1,42 @@
+name: Ruff
+
+on:
+  push:
+    branches: [ "main" ]
+    paths:
+      - '**.py'
+  pull_request:
+    branches: [ "main" ]
+    paths:
+      - '**.py'
+
+jobs:
+  build:
+    runs-on: ubuntu-latest
+    strategy:
+      matrix:
+        python-version: ["3.x"]
+    steps:
+    - uses: actions/checkout@v4
+    - name: Set up Python ${{ matrix.python-version }}
+      uses: actions/setup-python@v5
+      with:
+        python-version: ${{ matrix.python-version }}
+        ref: ${{ github.event.pull_request.head.ref }}
+    - name: Install dependencies
+      run: |
+        python -m pip install --upgrade pip
+        pip install pandas dash plotly.express
+    - name: Install Ruff
+      uses: astral-sh/ruff-action@v3.2.2
+    - name: Ruff Actions
+      run: |
+        ruff check --fix
+        ruff format
+    - name: Add and Commit
+      uses: EndBug/add-and-commit@v9
+      env:
+        GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+      with:
+        default_author: github_actions
+        pathspec_error_handling: ignore
diff --git a/BRAND.md b/BRAND.md
deleted file mode 100644
index b0d3f9f..0000000
--- a/BRAND.md
+++ /dev/null
@@ -1,98 +0,0 @@
-# Brand Reference — cleberg.net
-
-Design decisions, usage rules, and porting checklist for this site and any
-future sites.
-
----
-
-## Color
-
-All tokens live in `theme/static/tokens.css`. Import it before any other
-stylesheet.
-
-### Palette
-
-| Token          | Light       | Dark        | Role                                      |
-|----------------|-------------|-------------|-------------------------------------------|
-| `--bg`         | `#F6F4F0`   | `#161412`   | Page background                           |
-| `--bg-soft`    | `#EDEAE4`   | `#1F1C1A`   | Subtle surfaces (code blocks, inputs)     |
-| `--fg`         | `#111111`   | `#F0EDE8`   | Primary text, hard borders, table headers |
-| `--fg-soft`    | `#555550`   | `#888580`   | Secondary text, metadata                  |
-| `--accent`     | `#c0392b`   | `#ee6f5c`   | Interactive elements only (see below)     |
-| `--salmon`     | `#ee6f5c`   | `#ee6f5c`   | Decorative only (see below)               |
-| `--border`     | `#111111`   | `#2C2825`   | Hard borders (nav, tables)                |
-| `--border-soft`| `#DDDAD4`   | `#2C2825`   | Dashed or subtle dividers                 |
-| `--code-bg`    | `#E8E4DE`   | `#0F0D0C`   | Code blocks, blockquotes                  |
-| `--meta`       | `#555550`   | `#888580`   | Timestamps, labels, footnote numbers      |
-
-### Usage Rules
-
-**`--accent` is for interactive elements only:** links, `h2` left border,
-footnote numbers, focus indicators. It is text-safe (WCAG AA: 4.6:1 on `--bg` in
-light mode; ~4.5:1 on `--bg` in dark mode).
-
-**`--salmon` is decorative only.** Never use it for body text on a light
-background — it fails WCAG AA there. In dark mode, `--accent` and `--salmon`
-resolve to the same value (`#ee6f5c`), which is intentional.
-
----
-
-## Typography
-
-- **Font stack:** `--font-mono` (ui-monospace, Cascadia Code, Source Code Pro,
-  Menlo, Consolas, monospace)
-- **Headings:** weight 900, uppercase, `line-height: 1.1`
-- **`h2` accent bar:** 10px left border in `--accent`
-- **Body:** `1rem`, `line-height: 1.6`
-- **Meta/labels:** `0.8–0.85rem`, uppercase, `--meta` color
-- **Date format:** `YYYY-MM-DD` everywhere, no exceptions
-
----
-
-## Logo
-
-Files live in `~/Documents/brand/logo/`.
-
-| Variant                 | Use case                                         |
-|-------------------------|--------------------------------------------------|
-| `koi_light.svg/png`     | Full logo on light backgrounds                   |
-| `koi_dark.svg/png`      | Full logo on dark backgrounds                    |
-| `koi_light_minimal.svg` | Favicon, nav, small UI contexts on light         |
-| `koi_dark_minimal.svg`  | Favicon, nav, small UI contexts on dark          |
-
-**Rule:** Use the minimal variant for anything under ~64px or in navigation
-contexts. Use the full variant for headers, OG images, or anywhere it has room
-to breathe.
-
----
-
-## Signature Patterns
-
-These are the things that make the site look like itself. Port all of them to
-any new site.
-
-1. **Grayscale images with color on hover** — `img { filter: grayscale(1) }
-   img:hover { filter: grayscale(0) }`. Apply to all content images by default.
-2. **Blockquote as raw org-mode markup** — `#+begin_quote` / `#+end_quote`
-   pseudo-elements. Extend the "visible markup" aesthetic to other block
-   elements where appropriate.
-3. **Nav: uppercase, weight 900, invert on hover** — `background: var(--fg);
-   color: var(--bg)` on hover. No underlines in nav.
-4. **Links: underline offset** — `text-underline-offset: 3px`, invert on hover
-   (same as nav pattern).
-5. **Hard borders on tables** — `3px solid var(--fg)` outer border, `1px solid var(--fg)` internal. Table headers use `background: var(--fg); color: var(--bg)`.
-
----
-
-## Porting Checklist (New Site)
-
-- [ ] Import `tokens.css` (or copy variables and update `tokens.css` as the
-      source)
-- [ ] Apply monospace font stack
-- [ ] Apply grayscale image treatment
-- [ ] Use minimal koi as favicon
-- [ ] Use `YYYY-MM-DD` date format
-- [ ] Confirm `--accent` WCAG contrast on new background colors if palette is
-      adjusted
-- [ ] Build or adapt OG/social card template using koi + palette + monospace
-      type
diff --git a/README.org b/README.org
index 8044fa6..33bbf75 100644
--- a/README.org
+++ b/README.org
@@ -27,12 +27,6 @@ The publishing system depends on:
 - The weblorg package, available at [[https://github.com/emacs-love/weblorg][emacs-love/weblorg]], which provides advanced
   Org publishing functionality and theming support.
 
-** Screenshots
-
-| Light Mode              | Dark Mode              |
-|-------------------------+------------------------|
-| [[./screenshots/light.png]] | [[./screenshots/dark.png]] |
-
 ** Configuration
 
 You can customize site settings can within the ~publish.el~ file. This file
diff --git a/build.py b/build.py
index e875e56..435a7ca 100644
--- a/build.py
+++ b/build.py
@@ -185,13 +185,9 @@ def get_recent_posts_html(content_dir="./content/blog", num_posts=3):
     lines = []
     current_year = None
     for post in recent:
-        year = post["date_obj"].year
-        if year != current_year:
-            current_year = year
-            lines.append(f'\t<li class="post-list-year">{year}</li>')
         lines.append('\t<li class="post-list-item">')
-        lines.append(f'\t\t<a href="/blog/{post["slug"]}.html">{post["title"]}</a>')
         lines.append(f'\t\t<time datetime="{post["date_str"]}">{post["date_full"]}</time>')
+        lines.append(f'\t\t<a href="/blog/{post["slug"]}.html">{post["title"]}</a>')
         lines.append("\t</li>")
 
     return "\n".join(lines)
@@ -454,58 +450,47 @@ def generate_tags_page(content_dir="./content/blog", build_dir="./.build"):
         posts = tag_map[tag]
         items = "\n".join(
             f'<li class="post-list-item">'
-            f'<a href="/blog/{p["slug"]}.html">{p["title"]}</a>'
             f'<time datetime="{p["date_str"]}">{p["date_str"]}</time>'
+            f'<a href="/blog/{p["slug"]}.html">{p["title"]}</a>'
             f'</li>'
             for p in posts
         )
         sections.append(f'<h2 id="{tag}">{tag}</h2>\n<ul class="post-list">\n{items}\n</ul>')
 
     html = f"""<!doctype html>
-<html lang="en-us">
+<html lang=en-us>
 <head>
-<meta charset="utf-8">
-<title>tags - seijaku</title>
-<meta name="viewport" content="width=device-width, initial-scale=1">
-<link rel="stylesheet" href="/styles.min.css" type="text/css">
-<link rel="icon" href="/favicon.svg" type="image/svg+xml">
+<meta charset=utf-8>
+<title>cleberg.net</title>
+<meta name=viewport content="width=device-width,initial-scale=1">
+<meta name=author content="Christian Cleberg <hello@cleberg.net>">
+<meta name=description content="Stillness amidst the chaos.">
+<link rel=stylesheet href=http://localhost:8000/styles.min.css>
+<link rel=icon href=data:,>
 </head>
 <body>
-<a href="#main-content" class="skip-link">Skip to content</a>
-<header class="masthead">
-<a href="/" class="masthead-title">seijaku</a>
-<p class="masthead-subtitle"><i>stillness amidst the chaos</i></p>
+<a href=#main-content class=skip-link>Skip to content</a>
 <nav aria-label="Site Navigation">
 <ul>
-<li><a href="/blog/">Blog</a></li>
-<li><a href="/tags/">Tags</a></li>
-<li><a href="/guides/index.html">Guides</a></li>
-<li><a href="/apps/">Apps</a></li>
-<li><a href="/garden/">Garden</a></li>
-<li><a href="/salary/">Salary</a></li>
+<li><a href=/>Home</a>
+<li><a href=/apps/>Apps</a>
+<li><a href=/blog/>Blog</a>
+<li><a href=/garden/>Garden</a>
+<li><a href=/guides/>Guides</a>
+<li><a href=/salary/>Salary</a>
+<li><a href=/tags/>Tags</a>
 </ul>
 </nav>
-</header>
-<main id="main-content">
+<main id=main-content>
 <h1>Tags</h1>
 <ul class="tag-toc">{toc_items}</ul>
 {"".join(f"<section>{s}</section>" for s in sections)}
 </main>
-<hr>
 <footer>
-<div>
-<a href="https://github.com/ccleberg/cleberg.net">Source</a> &middot;
-<a href="/feed.xml">RSS</a> &middot;
-<a href="http://paske4urhs6nttrtlkuwa5cowum3fjkc6yv6kl4ncx3mjxcd77764nqd.onion/">Onion</a> &middot;
-<a href="/now/">Now</a> &middot;
-<a href="/uses/">Uses</a> &middot;
-<a href="/tips/">Tips</a> &middot;
-<a href="https://cv.cleberg.net">CV</a>
-</div>
-<div>
-<a href="mailto:hello@cleberg.net">hello@cleberg.net</a> [<a href="/gpg.txt">PGP</a>] &middot;
-Signal: @cmc.01
-</div>
+<a href=https://github.com/ccleberg/cleberg.net>Source</a>&#183;
+<a href=/feed.xml>RSS</a>&#183;
+<a href=http://paske4urhs6nttrtlkuwa5cowum3fjkc6yv6kl4ncx3mjxcd77764nqd.onion/>Onion</a>&#183;
+<a href=/tips/>Tips</a>
 </footer>
 </body>
 </html>"""
diff --git a/content/apps/index.org b/content/apps/index.org
index 6655593..a8f0e82 100644
--- a/content/apps/index.org
+++ b/content/apps/index.org
@@ -1,4 +1,4 @@
-#+title: apps
+#+title: Apps
 #+slug: index
 #+options: toc:nil
 
@@ -7,43 +7,16 @@
 Small apps I've built for iOS. Fully offline. No ads, no accounts, no data
 collection.
 
-#+begin_export html
-<div class="app-card">
-  <a href="https://apps.apple.com/app/daybyday"><img class="app-icon" src="https://img.cleberg.net/apps/daybyday.png" alt="DayByDay icon"></a>
-  <div class="app-info">
-    <span class="app-title">Day By Day</span>
-    <span class="app-subtitle">Learn days, months & seasons!</span>
-    <div class="app-links">
-      <a href="https://apps.apple.com/app/daybyday">App Store</a> &middot;
-      <a href="https://github.com/ccleberg/DayByDay">GitHub</a>
-    </div>
-  </div>
-</div>
+#+begin_quote
+All 3 apps are currently in Apple's review queue and are not available on the
+App Store yet. I will update the links here as soon as Apple publishes them.
+#+end_quote
 
-<div class="app-card">
-  <a href="https://apps.apple.com/app/space-explorers"><img class="app-icon" src="https://img.cleberg.net/apps/spaceexplorers.png" alt="Space Explorers icon"></a>
-  <div class="app-info">
-    <span class="app-title">Space Explorers</span>
-    <span class="app-subtitle">Explore the galaxy and learn!</span>
-    <div class="app-links">
-      <a href="https://apps.apple.com/app/space-explorers">App Store</a> &middot;
-      <a href="https://github.com/ccleberg/SpaceExplorers">GitHub</a>
-    </div>
-  </div>
-</div>
-
-<div class="app-card">
-  <a href="https://apps.apple.com/app/domaindig"><img class="app-icon" src="https://img.cleberg.net/apps/domaindig.png" alt="DomainDig icon"></a>
-  <div class="app-info">
-    <span class="app-title">Domain Dig</span>
-    <span class="app-subtitle">DNS lookup & SSL certificate checker</span>
-    <div class="app-links">
-      <a href="https://apps.apple.com/app/domaindig">App Store</a> &middot;
-      <a href="https://github.com/ccleberg/DomainDig">GitHub</a>
-    </div>
-  </div>
-</div>
-#+end_export
+| App             | Description                          | GitHub |
+|-----------------+--------------------------------------+--------|
+| Day By Day      | Learn days, months & seasons!        | [[https://github.com/ccleberg/DayByDay][GitHub]] |
+| Domain Dig      | DNS lookup & SSL certificate checker | [[https://github.com/ccleberg/DomainDig][GitHub]] |
+| Space Explorers | Explore the galaxy and learn!        | [[https://github.com/ccleberg/SpaceExplorers][GitHub]] |
 
 * Web Projects
 
diff --git a/content/blog/2018-11-28-aes-encryption.org b/content/blog/2018-11-28-aes-encryption.org
index afadf97..03dcd3c 100644
--- a/content/blog/2018-11-28-aes-encryption.org
+++ b/content/blog/2018-11-28-aes-encryption.org
@@ -1,8 +1,8 @@
-#+date: [2018-11-28 Wed 00:00:00]
-#+title: aes encryption: what the math actually does
-#+description: Detailed explanation of AES encryption, including key handling, encryption modes, algorithm structure, and implementation considerations for secure data protection.
+#+date:        [2018-11-28 Wed 00:00:00]
+#+title:       AES Encryption
+#+description: Let's learn about AES encryption, its method, and how it can be used.
 #+slug:        aes-encryption
-#+filetags: :security:
+#+filetags:    :security:
 
 * Basic AES
 
diff --git a/content/blog/2018-11-28-cpp-compiler.org b/content/blog/2018-11-28-cpp-compiler.org
index be94aee..d15ca98 100644
--- a/content/blog/2018-11-28-cpp-compiler.org
+++ b/content/blog/2018-11-28-cpp-compiler.org
@@ -1,8 +1,8 @@
-#+date: [2018-11-28 Wed 00:00:00]
-#+title:       inside the c++ compiler
-#+description: Systematic presentation of the C++ compilation phases including preprocessing, compilation, assembly, and linking, with technical insights into each stage's function.
+#+date:        [2018-11-28 Wed 00:00:00]
+#+title:       The C++ Compiler
+#+description: A brief trip into the C++ compilation process.
 #+slug:        cpp-compiler
-#+filetags: :linux:
+#+filetags:    :linux:
 
 * A Brief Introduction
 
diff --git a/content/blog/2019-01-07-useful-css.org b/content/blog/2019-01-07-useful-css.org
index 7ecf5ea..5726af6 100644
--- a/content/blog/2019-01-07-useful-css.org
+++ b/content/blog/2019-01-07-useful-css.org
@@ -1,8 +1,8 @@
-#+date: [2019-01-07 Mon 00:00:00]
-#+title: css notes: flexbox, shadows, variables
-#+description: Practical guide on applying CSS rules and constructs such as flexbox, box shadows, and variable usage to achieve standard web styling and layout objectives.
+#+date:        [2019-01-07 Mon 00:00:00]
+#+title:       CSS Tips: Flexbox, Shadows, Variables
+#+description: A few quick tips on modern CSS features.
 #+slug:        useful-css
-#+filetags: :web:
+#+filetags:    :web:
 
 * Introduction to CSS
 
diff --git a/content/blog/2019-09-09-audit-analytics.org b/content/blog/2019-09-09-audit-analytics.org
index ab94fca..4fd0221 100644
--- a/content/blog/2019-09-09-audit-analytics.org
+++ b/content/blog/2019-09-09-audit-analytics.org
@@ -1,8 +1,8 @@
-#+date: [2019-09-09 Mon 00:00:00]
-#+title: audit analytics: pandas instead of pivot tables
-#+description: Examination of data analytical approaches applied within internal audit functions to improve risk evaluation, process efficiency, and decision support.
+#+date:        [2019-09-09 Mon 00:00:00]
+#+title:       Internal Audit Analytics
+#+description: Let's talk about data analytics and its use cases within the Internal Audit function.
 #+slug:        audit-analytics
-#+filetags: :audit:
+#+filetags:    :audit:
 
 * What Are Data Analytics?
 
diff --git a/content/blog/2019-12-03-the-ansoff-matrix.org b/content/blog/2019-12-03-the-ansoff-matrix.org
index 7740a23..5997f76 100644
--- a/content/blog/2019-12-03-the-ansoff-matrix.org
+++ b/content/blog/2019-12-03-the-ansoff-matrix.org
@@ -1,8 +1,8 @@
-#+date: [2019-12-03 Tue 00:00:00]
-#+title: ansoff matrix: business school diagram, limited shelf life
-#+description: Analytical description of the Ansoff Matrix, detailing market and product development strategies for measured business expansion and competitive positioning.
+#+date:        [2019-12-03 Tue 00:00:00]
+#+title:       The Ansoff Matrix
+#+description: A detailed description of the Ansoff Matrix business model.
 #+slug:        the-ansoff-matrix
-#+filetags: :audit:
+#+filetags:    :audit:
 
 * Overview
 
diff --git a/content/blog/2019-12-16-password-security.org b/content/blog/2019-12-16-password-security.org
index 928dcf4..f29d683 100644
--- a/content/blog/2019-12-16-password-security.org
+++ b/content/blog/2019-12-16-password-security.org
@@ -1,8 +1,8 @@
-#+date: [2019-12-16 Mon 00:00:00]
-#+title: nist passwords: the guidelines nobody implements
-#+description: Compilation of guidelines for password generation, storage, protection, and compliance with established standards such as NIST for maintaining digital security.
+#+date:        [2019-12-16 Mon 00:00:00]
+#+title:       NIST Password Security
+#+description: Let's look at what NIST currently recommends for passwords and secrets.
 #+slug:        password-security
-#+filetags: :security:
+#+filetags:    :security:
 
 * Users
 
diff --git a/content/blog/2020-01-25-linux-software.org b/content/blog/2020-01-25-linux-software.org
index 6238f09..17be3b8 100644
--- a/content/blog/2020-01-25-linux-software.org
+++ b/content/blog/2020-01-25-linux-software.org
@@ -1,8 +1,8 @@
-#+date: [2020-01-25 Sat 00:00:00]
-#+title: linux software: what i actually install first
-#+description: Inventory and description of key Linux applications including graphical and command-line tools, with installation instructions for various distributions.
+#+date:        [2020-01-25 Sat 00:00:00]
+#+title:       My Favorite Linux Software
+#+description: A quick list of my favorite apps on Linux.
 #+slug:        linux-software
-#+filetags: :linux:
+#+filetags:    :linux:
 
 * Graphical Applications
 
diff --git a/content/blog/2020-01-26-steam-on-ntfs.org b/content/blog/2020-01-26-steam-on-ntfs.org
index 5dfd6a9..f210b0e 100644
--- a/content/blog/2020-01-26-steam-on-ntfs.org
+++ b/content/blog/2020-01-26-steam-on-ntfs.org
@@ -1,8 +1,8 @@
-#+date: [2020-01-26 Sun 00:00:00]
-#+title: steam ntfs linux: it works, mostly
-#+description: Procedures for mounting NTFS drives using ntfs-3g to enable reliable execution of Steam gaming software on Linux environments.
+#+date:        [2020-01-26 Sun 00:00:00]
+#+title:       Steam NTFS Fix on Linux
+#+description: Procedures for mounting NTFS drives using ntfs-3g for Steam on Linux.
 #+slug:        steam-on-ntfs
-#+filetags: :linux:
+#+filetags:    :linux:
 
 * Auto-Mount Steam Drives
 
diff --git a/content/blog/2020-02-09-cryptography-basics.org b/content/blog/2020-02-09-cryptography-basics.org
index 7770e00..19952f5 100644
--- a/content/blog/2020-02-09-cryptography-basics.org
+++ b/content/blog/2020-02-09-cryptography-basics.org
@@ -1,8 +1,8 @@
-#+date: [2020-02-09 Sunday 00:00:00]
-#+title: cryptography basics: keys, certs, and why it matters
-#+description: Systematic overview of encryption methodologies, key categories, algorithmic frameworks, and their applications in data confidentiality and integrity.
+#+date:        [2020-02-09 Sunday 00:00:00]
+#+title:       Cryptography Basics
+#+description: An introduction to cryptographic methods for encryption.
 #+slug:        cryptography
-#+filetags: :security:
+#+filetags:    :security:
 
 * Similar Article Available
 
diff --git a/content/blog/2020-03-25-session-messenger.org b/content/blog/2020-03-25-session-messenger.org
index 02d3d1d..8ff0458 100644
--- a/content/blog/2020-03-25-session-messenger.org
+++ b/content/blog/2020-03-25-session-messenger.org
@@ -1,8 +1,8 @@
-#+date: [2020-03-25 Wed 00:00:00]
-#+title:       session messenger: is it secure?
-#+description: Technical description of the Session messaging protocol, including end-to-end encryption, metadata minimization, multi-device synchronization, and privacy-centric design.
+#+date:        [2020-03-25 Wed 00:00:00]
+#+title:       Review: Session Messenger
+#+description: A user review of the Session Messenger app on Linux, macOS, and iOS.
 #+slug:        session-messenger
-#+filetags: :privacy:
+#+filetags:    :privacy:
 
 * Privacy Warning
 
diff --git a/content/blog/2020-05-03-homelab.org b/content/blog/2020-05-03-homelab.org
index 599c5be..15a4d80 100644
--- a/content/blog/2020-05-03-homelab.org
+++ b/content/blog/2020-05-03-homelab.org
@@ -1,8 +1,8 @@
-#+date: [2020-05-03 Sun 00:00:00]
-#+title: homelab: rack, network, what broke
-#+description: Comprehensive instructions on assembling and configuring a homelab environment, emphasizing hardware selection, software deployment, and network setup for operational efficiency.
+#+date:        [2020-05-03 Sun 00:00:00]
+#+title:       A Look Inside My Homelab
+#+description: A retrospective guide after throwing together the first iteration of my home lab.
 #+slug:        homelab
-#+filetags: :self-hosting:
+#+filetags:    :self-hosting:
 
 * What is a Homelab?
 
diff --git a/content/blog/2020-05-19-customizing-ubuntu.org b/content/blog/2020-05-19-customizing-ubuntu.org
index aef0d7d..711065a 100644
--- a/content/blog/2020-05-19-customizing-ubuntu.org
+++ b/content/blog/2020-05-19-customizing-ubuntu.org
@@ -1,8 +1,8 @@
-#+date: [2020-05-19 Tue 00:00:00]
-#+title: ubuntu gnome customization: making it not look terrible
-#+description: Detailed instructions for modifying system appearance and interface elements in Ubuntu 20.04, including setting themes, icon packs, font adjustments, terminal configurations, and related customization parameters.
+#+date:        [2020-05-19 Tue 00:00:00]
+#+title:       Ubuntu GNOME Customization
+#+description: Some tips and tricks to customize GNOME on Ubuntu 20.04.
 #+slug:        customizing-ubuntu
-#+filetags: :linux:
+#+filetags:    :linux:
 
 * More Information
 
diff --git a/content/blog/2020-07-20-video-game-sales.org b/content/blog/2020-07-20-video-game-sales.org
index 796d994..bb81f52 100644
--- a/content/blog/2020-07-20-video-game-sales.org
+++ b/content/blog/2020-07-20-video-game-sales.org
@@ -1,8 +1,8 @@
-#+date: [2020-07-20 Mon 00:00:00]
-#+title: video game sales data: 40 years of numbers
-#+description: Presentation of analyzed data regarding global video game sales, covering platform distributions, genre classifications, and geographic market performance metrics.
+#+date:        [2020-07-20 Mon 00:00:00]
+#+title:       Data Analysis: Video Games Sales Data
+#+description: A simple data analysis of the video games sales dataset.
 #+slug:        video-game-sales
-#+filetags: :personal:
+#+filetags:    :personal:
 
 * Background Information
 
diff --git a/content/blog/2020-07-26-business-analysis.org b/content/blog/2020-07-26-business-analysis.org
index 7be3b2a..d787615 100644
--- a/content/blog/2020-07-26-business-analysis.org
+++ b/content/blog/2020-07-26-business-analysis.org
@@ -1,8 +1,8 @@
-#+date: [2020-07-26 Sun 00:00:00]
-#+title: business location analysis: python maps, urban data
-#+description: Methodology for utilizing data science techniques and Foursquare API data to analyze and select promising business sites within urban environments.
+#+date:        [2020-07-26 Sun 00:00:00]
+#+title:       Data Analysis: Finding the Best Location for a Business
+#+description: Part of my data analysis course, I built an algorithm to find the best location for a new business in Lincoln.
 #+slug:        business-analysis
-#+filetags: :audit:
+#+filetags:    :audit:
 
 * Background Information
 
diff --git a/content/blog/2020-08-22-redirect-github-pages.org b/content/blog/2020-08-22-redirect-github-pages.org
index 95848b1..21ba348 100644
--- a/content/blog/2020-08-22-redirect-github-pages.org
+++ b/content/blog/2020-08-22-redirect-github-pages.org
@@ -1,8 +1,8 @@
-#+date: [2020-08-22 Sat 00:00:00]
-#+title: github pages root domain: drop the www
-#+description: Stepwise instructions for configuring redirection of GitHub Pages sites from the www subdomain to the apex domain to improve domain resolution and access consistency.
+#+date:        [2020-08-22 Sat 00:00:00]
+#+title:       GitHub Pages Redirect Subdomain to TLD
+#+description: A quick recap of a Stack Overflow answer that I want to exist in perpetuity.
 #+slug:        redirect-github-pages
-#+filetags: :web:
+#+filetags:    :web:
 
 * Short answer
 
diff --git a/content/blog/2020-08-29-php-auth-flow.org b/content/blog/2020-08-29-php-auth-flow.org
index 8331be9..30a8158 100644
--- a/content/blog/2020-08-29-php-auth-flow.org
+++ b/content/blog/2020-08-29-php-auth-flow.org
@@ -1,8 +1,8 @@
-#+date: [2020-08-29 Sat 00:00:00]
-#+title: php auth: sessions from scratch
-#+description: Comprehensive guide to developing a secure user login system in PHP, including account creation, session management, and logout procedures.
+#+date:        [2020-08-29 Sat 00:00:00]
+#+title:       Learning PHP Auth
+#+description: A quick recap of my recent learning experience with PHP Auth.
 #+slug:        php-auth-flow
-#+filetags: :web:
+#+filetags:    :web:
 
 * Introduction
 
diff --git a/content/blog/2020-09-01-visual-recognition.org b/content/blog/2020-09-01-visual-recognition.org
index 21bb8ed..1ba7d3a 100644
--- a/content/blog/2020-09-01-visual-recognition.org
+++ b/content/blog/2020-09-01-visual-recognition.org
@@ -1,8 +1,8 @@
-#+date: [2020-09-01 Tue 00:00:00]
-#+title: ibm watson vision api: before they killed it
+#+date:        [2020-09-01 Tue 00:00:00]
+#+title:       IBM Watson Vision API
 #+description: Technical overview and application instructions for using IBM Watson Visual Recognition service, with focus on API configuration, image input processing, and classification output handling.
 #+slug:        visual-recognition
-#+filetags: :linux:
+#+filetags:    :linux:
 
 * What is IBM Watson?
 
diff --git a/content/blog/2020-09-22-internal-audit.org b/content/blog/2020-09-22-internal-audit.org
index e5803ce..c9e3d1d 100644
--- a/content/blog/2020-09-22-internal-audit.org
+++ b/content/blog/2020-09-22-internal-audit.org
@@ -1,8 +1,8 @@
-#+date: [2020-09-22 Tue 00:00:00]
-#+title: internal audit: what it does vs. what management thinks it does
-#+description: Analysis of internal audit processes, their contribution to risk management, governance frameworks, and compliance monitoring within corporate structures.
+#+date:        [2020-09-22 Tue 00:00:00]
+#+title:       Internal Audit: Who Are They?
+#+description: Learn who your Internal Audit partners actually are.
 #+slug:        internal-audit
-#+filetags: :audit:
+#+filetags:    :audit:
 
 * Definitions
 
diff --git a/content/blog/2020-09-25-happiness-map.org b/content/blog/2020-09-25-happiness-map.org
index f40dbf7..5f9138c 100644
--- a/content/blog/2020-09-25-happiness-map.org
+++ b/content/blog/2020-09-25-happiness-map.org
@@ -1,8 +1,8 @@
 #+date: [2020-09-25 Fri 00:00:00]
-#+title: happiness choropleth: folium map, world data
-#+description: Instructions for creating an interactive choropleth map visualizing international happiness data based on metrics such as GDP, social support, health indicators, freedom indices, generosity, and corruption levels.
+#+title:       Data Analysis: World Happiness Choropleth Map
+#+description: A quick dive into choropleth maps.
 #+slug:        happiness-map
-#+filetags: :personal:
+#+filetags:    :personal:
 
 * Background Information
 
diff --git a/content/blog/2020-10-12-mediocrity.org b/content/blog/2020-10-12-mediocrity.org
index 04c0f99..0028119 100644
--- a/content/blog/2020-10-12-mediocrity.org
+++ b/content/blog/2020-10-12-mediocrity.org
@@ -1,8 +1,8 @@
-#+date: [2020-10-12 Mon 00:00:00]
-#+title:       when good is good enough—and when it isn't
-#+description: Examination of decision-making principles relating to achieving sufficient quality levels, including trade-offs between perfection and adequacy in professional and operational contexts.
+#+date:        [2020-10-12 Mon 00:00:00]
+#+title:       On Mediocrity
+#+description: Thoughts on mediocrity and when perfect is the enemy of good.
 #+slug:        mediocrity
-#+filetags: :personal:
+#+filetags:    :personal:
 
 * Perfect is the Enemy of Good
 
diff --git a/content/blog/2020-12-27-website-redesign.org b/content/blog/2020-12-27-website-redesign.org
index 79db447..f2103fd 100644
--- a/content/blog/2020-12-27-website-redesign.org
+++ b/content/blog/2020-12-27-website-redesign.org
@@ -1,8 +1,8 @@
-#+date: [2020-12-27 Sun 00:00:00]
-#+title: website redesign: 5kb, 100s on lighthouse, no framework
-#+description: Detailed process outlining methods for reducing website page size to approximately 5 kilobytes, enhancing loading speed, search engine indexing efficiency, and user interface responsiveness.
+#+date:        [2020-12-27 Sun 00:00:00]
+#+title:       Minimalist Website Redesign (5kb)
+#+description: A retrospective summary of recent changes to minimize my site.
 #+slug:        website-redesign
-#+filetags: :web:
+#+filetags:    :web:
 
 * A Brief History
 
diff --git a/content/blog/2020-12-28-neon-drive.org b/content/blog/2020-12-28-neon-drive.org
index cf58f58..4a17637 100644
--- a/content/blog/2020-12-28-neon-drive.org
+++ b/content/blog/2020-12-28-neon-drive.org
@@ -1,8 +1,8 @@
-#+date: [2020-12-28 Mon 00:00:00]
-#+title: neon drive: review
-#+description: Description of game mechanics, graphical style, and level design in Neon Drive, an arcade racing game inspired by 1980s synthwave aesthetics.
+#+date:        [2020-12-28 Mon 00:00:00]
+#+title:       Neon Drive
+#+description: My thoughts on Neon Drive, a synthwave-inspired arcade racer.
 #+slug:        neon-drive
-#+filetags: :personal:
+#+filetags:    :personal:
 
 * Game Description
 
diff --git a/content/blog/2020-12-29-zork.org b/content/blog/2020-12-29-zork.org
index fd0dc52..cbc23ee 100644
--- a/content/blog/2020-12-29-zork.org
+++ b/content/blog/2020-12-29-zork.org
@@ -1,8 +1,8 @@
-#+date: [2020-12-29 Tue 00:00:00]
-#+title: zork: the text adventure that started it all
-#+description: Detailed operational guide for navigating Zork, a text-based interactive fiction game from the 1980s. Includes instructions for exploration, puzzle resolution, and item collection.
+#+date:        [2020-12-29 Tue 00:00:00]
+#+title:       The Zork Anthology
+#+description: My thoughts on Zork (plus, some tips and a map).
 #+slug:        zork
-#+filetags: :personal:
+#+filetags:    :personal:
 
 * Download (Free)
 
diff --git a/content/blog/2021-01-01-seum.org b/content/blog/2021-01-01-seum.org
index 161d9cf..7b766f0 100644
--- a/content/blog/2021-01-01-seum.org
+++ b/content/blog/2021-01-01-seum.org
@@ -1,8 +1,8 @@
-#+date: [2021-01-01 Fri 00:00:00]
-#+title:       seum: speedrunners from hell
-#+description: Technical overview for utilizing the game SEUM, focusing on speedrunning techniques, gravity manipulation, teleportation functions, and level completion criteria.
+#+date:        [2021-01-01 Fri 00:00:00]
+#+title:       SEUM: Speedrunners from Hell
+#+description: A quick look at one of my favorite speedrunning games.
 #+slug:        seum
-#+filetags: :personal:
+#+filetags:    :personal:
 
 * Game Description
 
diff --git a/content/blog/2021-01-04-fediverse.org b/content/blog/2021-01-04-fediverse.org
index 7893c8e..54c07d6 100644
--- a/content/blog/2021-01-04-fediverse.org
+++ b/content/blog/2021-01-04-fediverse.org
@@ -1,8 +1,8 @@
-#+date: [2021-01-04 Mon 00:00:00]
-#+title: fediverse: decentralized social, minus the algorithm
-#+description: Detailed introduction to the Fediverse network architecture, user registration procedures, platform navigation, and protocols ensuring content decentralization and censorship resistance.
+#+date:        [2021-01-04 Mon 00:00:00]
+#+title:       Fediverse: Decentralized Social
+#+description: A primer on the fediverse, how it works, and why I use it.
 #+slug:        fediverse
-#+filetags: :privacy:
+#+filetags:    :privacy:
 
 * What is the Fediverse?
 
diff --git a/content/blog/2021-01-07-ufw.org b/content/blog/2021-01-07-ufw.org
index 5398f57..700d9a2 100644
--- a/content/blog/2021-01-07-ufw.org
+++ b/content/blog/2021-01-07-ufw.org
@@ -1,8 +1,8 @@
-#+date: [2021-01-07 Thu 00:00:00]
-#+title: ufw hardening: firewall config you should have set up already
-#+description: Stepwise instructions for installation, configuration, enabling, and management of the Uncomplicated Firewall utility to secure network interfaces on Ubuntu server environments.
+#+date:        [2021-01-07 Thu 00:00:00]
+#+title:       UFW: Firewall Setup on Ubuntu
+#+description: How to install and configure UFW on Ubuntu.
 #+slug:        ufw
-#+filetags: :linux:security:
+#+filetags:    :linux:security:
 
 * Uncomplicated Firewall
 
diff --git a/content/blog/2021-02-19-macos.org b/content/blog/2021-02-19-macos.org
index 7e1bc78..044ea55 100644
--- a/content/blog/2021-02-19-macos.org
+++ b/content/blog/2021-02-19-macos.org
@@ -1,8 +1,8 @@
-#+date: [2021-02-19 Fri 00:00:00]
-#+title: macos for linux users: what to fix first
-#+description: Comprehensive overview for first-time macOS users transitioning from other OS platforms, including system setup, terminal usage, and user interface customization.
+#+date:        [2021-02-19 Fri 00:00:00]
+#+title:       macOS for Linux Users
+#+description: First steps for Linux users switching to macOS.
 #+slug:        macos
-#+filetags: :linux:
+#+filetags:    :linux:
 
 * Diving into macOS
 
diff --git a/content/blog/2021-03-19-clone-github-repos.org b/content/blog/2021-03-19-clone-github-repos.org
index 9c9904a..0bcad4f 100644
--- a/content/blog/2021-03-19-clone-github-repos.org
+++ b/content/blog/2021-03-19-clone-github-repos.org
@@ -1,8 +1,8 @@
-#+date: [2021-03-19 Fri 00:00:00]
-#+title:       github and sourcehut: scripting mass clones and remote updates
-#+description: Script-based methodology for cloning multiple repositories from GitHub and Sourcehut accounts. Includes automation techniques to streamline repository management and backups.
+#+date:        [2021-03-19 Fri 00:00:00]
+#+title:       Scripting Mass Clones from GitHub and Sourcehut
+#+description: Scripts to clone all your repos from GitHub or Sourcehut at once.
 #+slug:        clone-github-repos
-#+filetags: :personal:
+#+filetags:    :personal:
 
 * Cloning from GitHub
 
diff --git a/content/blog/2021-03-28-gemini-capsule.org b/content/blog/2021-03-28-gemini-capsule.org
index a2667f8..a8ffb57 100644
--- a/content/blog/2021-03-28-gemini-capsule.org
+++ b/content/blog/2021-03-28-gemini-capsule.org
@@ -1,8 +1,8 @@
-#+date: [2021-03-28 Sun 00:00:00]
-#+title: gemini capsule: deploy it, own your content
-#+description: Incremental procedural guide to initiate and maintain a Gemini capsule server. Covers installation, deployment, and operational best practices for beginners.
+#+date:        [2021-03-28 Sun 00:00:00]
+#+title:       Gemini Capsule: Deploy and Own Your Content
+#+description: How to set up and run your own Gemini capsule.
 #+slug:        gemini-capsule
-#+filetags: :linux:web:
+#+filetags:    :linux:web:
 
 * What is Gemini?
 
diff --git a/content/blog/2021-03-28-vaporwave-vs-outrun.org b/content/blog/2021-03-28-vaporwave-vs-outrun.org
index 266eeb0..2a97f0f 100644
--- a/content/blog/2021-03-28-vaporwave-vs-outrun.org
+++ b/content/blog/2021-03-28-vaporwave-vs-outrun.org
@@ -1,8 +1,8 @@
-#+date: [2021-03-28 Sun 00:00:00]
-#+title: vaporwave vs outrun: the aesthetic breakdown
-#+description: Systematic examination of Vaporwave and Outrun aesthetic frameworks, focusing on graphical elements, chromatic schemes, musical associations, and period-specific cultural influences.
+#+date:        [2021-03-28 Sun 00:00:00]
+#+title:       Vaporwave vs. Outrun
+#+description: Breaking down the differences between vaporwave and outrun aesthetics.
 #+slug:        vaporwave-vs-outrun
-#+filetags: :personal:
+#+filetags:    :personal:
 
 * Overview
 
diff --git a/content/blog/2021-03-30-vps-web-server.org b/content/blog/2021-03-30-vps-web-server.org
index 77ef4d2..e7fece1 100644
--- a/content/blog/2021-03-30-vps-web-server.org
+++ b/content/blog/2021-03-30-vps-web-server.org
@@ -1,8 +1,8 @@
-#+date: [2021-03-30 Tue 00:00:00]
-#+title: vps web server: get off shared hosting
-#+description: Instructional outline for setting up and maintaining a VPS environment configured for secure and scalable web hosting applications.
+#+date:        [2021-03-30 Tue 00:00:00]
+#+title:       VPS Web Server: Get Off Shared Hosting
+#+description: How to set up a VPS and host your own website.
 #+slug:        vps-web-server
-#+filetags: :linux:self-hosting:
+#+filetags:    :linux:self-hosting:
 
 * Shared Hosting vs. VPS (Virtual Private Server)
 
diff --git a/content/blog/2021-04-17-gemini-server.org b/content/blog/2021-04-17-gemini-server.org
index 5534b61..11636ec 100644
--- a/content/blog/2021-04-17-gemini-server.org
+++ b/content/blog/2021-04-17-gemini-server.org
@@ -1,8 +1,8 @@
-#+date: [2021-04-17 Sat 00:00:00]
-#+title:       agate gemini server installation and firewall configuration
-#+description: Detailed directives for installation and configuration of a Gemini protocol server on Ubuntu, including network security and firewall setup.
+#+date:        [2021-04-17 Sat 00:00:00]
+#+title:       Agate Gemini Server Setup
+#+description: Installing Agate and configuring a firewall for a Gemini server on Ubuntu.
 #+slug:        gemini-server
-#+filetags: :linux:web:
+#+filetags:    :linux:web:
 
 * Similar Article Available
 
diff --git a/content/blog/2021-04-23-php-comment-system.org b/content/blog/2021-04-23-php-comment-system.org
index 0976547..4e22b9d 100644
--- a/content/blog/2021-04-23-php-comment-system.org
+++ b/content/blog/2021-04-23-php-comment-system.org
@@ -1,8 +1,8 @@
-#+date: [2021-04-23 Fri 00:00:00]
-#+title:       building a lightweight php static commenting system without javascript
-#+description: Technical walkthrough for constructing a lightweight, privacy-oriented static comment system using PHP, with no client-side scripting or external dependencies.
+#+date:        [2021-04-23 Fri 00:00:00]
+#+title:       A Lightweight, Static PHP Comment System
+#+description: Building a simple PHP comment system with no JavaScript and no external dependencies.
 #+slug:        php-comment-system
-#+filetags: :linux:web:
+#+filetags:    :linux:web:
 
 * The Terrible-ness of Commenting Systems
 
diff --git a/content/blog/2021-04-28-photography.org b/content/blog/2021-04-28-photography.org
index 28072cf..0839c87 100644
--- a/content/blog/2021-04-28-photography.org
+++ b/content/blog/2021-04-28-photography.org
@@ -1,8 +1,8 @@
-#+date: [2021-04-28 Wed 00:00:00]
-#+title: photography: gear and what actually matters
-#+description: Instructional document covering basic techniques in photography, including equipment selection, operational best practices, and methods for capturing high-quality images.
+#+date:        [2021-04-28 Wed 00:00:00]
+#+title:       My Photography Gear
+#+description: My approach to photography and the gear I use.
 #+slug:        photography
-#+filetags: :personal:
+#+filetags:    :personal:
 
 * Why Photography?
 
diff --git a/content/blog/2021-05-30-changing-git-authors.org b/content/blog/2021-05-30-changing-git-authors.org
index 09b25f0..649a784 100644
--- a/content/blog/2021-05-30-changing-git-authors.org
+++ b/content/blog/2021-05-30-changing-git-authors.org
@@ -1,8 +1,8 @@
-#+date: [2021-05-30 Sun 00:00:00]
-#+title:       automated script for correcting git author details in multiple projects
-#+description: Detailed instructions for systematically updating the Git author name and email information in multiple repositories using command-line tools and scripts.
+#+date:        [2021-05-30 Sun 00:00:00]
+#+title:       Correcting Git Author Details Across Multiple Repos
+#+description: A script to update the git author name and email across multiple repos.
 #+slug:        changing-git-authors
-#+filetags: :personal:
+#+filetags:    :personal:
 
 * Changing Git Author/Email Based on Previously Committed Email
 
diff --git a/content/blog/2021-07-15-delete-gitlab-repos.org b/content/blog/2021-07-15-delete-gitlab-repos.org
index 4a0e432..fd6fc00 100644
--- a/content/blog/2021-07-15-delete-gitlab-repos.org
+++ b/content/blog/2021-07-15-delete-gitlab-repos.org
@@ -1,8 +1,8 @@
-#+date: [2021-07-15 Thu 00:00:00]
-#+title:       automated deletion of all gitlab repositories using python
-#+description: Stepwise instructions for executing a Python script to delete all repositories associated with a GitLab account. Includes authentication and error handling procedures.
+#+date:        [2021-07-15 Thu 00:00:00]
+#+title:       Deleting All GitLab Repositories with Python
+#+description: A Python script to delete all your GitLab repositories at once.
 #+slug:        delete-gitlab-repos
-#+filetags: :personal:
+#+filetags:    :personal:
 
 * Background
 
diff --git a/content/blog/2021-08-25-audit-sampling.org b/content/blog/2021-08-25-audit-sampling.org
index 85c0732..9ed9eb1 100644
--- a/content/blog/2021-08-25-audit-sampling.org
+++ b/content/blog/2021-08-25-audit-sampling.org
@@ -1,8 +1,8 @@
-#+date: [2021-08-25 Wed 00:00:00]
-#+title: audit sampling: pandas for random and stratified samples
-#+description: Presentation of methods for implementing audit sampling techniques including simple random, stratified, and systematic sampling using Python's Pandas library for precise audit outcomes.
+#+date:        [2021-08-25 Wed 00:00:00]
+#+title:       Audit Sampling with Pandas
+#+description: Using Python and Pandas to run random and stratified audit samples.
 #+slug:        audit-sampling
-#+filetags: :audit:
+#+filetags:    :audit:
 
 * Introduction
 
diff --git a/content/blog/2021-10-09-apache-redirect.org b/content/blog/2021-10-09-apache-redirect.org
index e0cec7d..829170a 100644
--- a/content/blog/2021-10-09-apache-redirect.org
+++ b/content/blog/2021-10-09-apache-redirect.org
@@ -1,8 +1,8 @@
-#+date: [2021-10-09 Sat 00:00:00]
-#+title:       setting up apache rewrite rules for extensionless urls
-#+description: Technical guide to applying Apache mod_rewrite directives for transforming .html file requests into clean directory-style URL structures to enhance website navigation and indexing.
+#+date:        [2021-10-09 Sat 00:00:00]
+#+title:       Apache Rewrite Rules for Extensionless URLs
+#+description: Using mod_rewrite to serve clean, extensionless URLs in Apache.
 #+slug:        apache-redirect
-#+filetags: :web:
+#+filetags:    :web:
 
 * The Problem
 
diff --git a/content/blog/2021-12-04-cisa.org b/content/blog/2021-12-04-cisa.org
index f1fa87c..b10271c 100644
--- a/content/blog/2021-12-04-cisa.org
+++ b/content/blog/2021-12-04-cisa.org
@@ -1,8 +1,8 @@
-#+date: [2021-12-04 Sat 00:00:00]
-#+title: cisa exam: what the test measures vs. what the job requires
-#+description: Comprehensive outline of study materials, preparation strategies, and procedural advice for passing the CISA examination on the initial attempt.
+#+date:        [2021-12-04 Sat 00:00:00]
+#+title:       I Passed the CISA Exam
+#+description: My take on the CISA exam: what it covers, and what it doesn't.
 #+slug:        cisa
-#+filetags: :audit:
+#+filetags:    :audit:
 
 * What is the CISA?
 
diff --git a/content/blog/2022-02-10-leaving-the-office.org b/content/blog/2022-02-10-leaving-the-office.org
index 456c1d2..366fccf 100644
--- a/content/blog/2022-02-10-leaving-the-office.org
+++ b/content/blog/2022-02-10-leaving-the-office.org
@@ -1,8 +1,8 @@
-#+date: [2022-02-10 Thu 00:00:00]
-#+title: leaving the office: remote work without the linkedin take
-#+description: Examination of factors influencing the shift from traditional office environments to remote work, including benefits, constraints, and implementation recommendations.
+#+date:        [2022-02-10 Thu 00:00:00]
+#+title:       Leaving the Office
+#+description: My honest thoughts on leaving the office and working remotely.
 #+slug:        leaving-the-office
-#+filetags: :personal:
+#+filetags:    :personal:
 
 * The Working World is Changing
 
diff --git a/content/blog/2022-02-10-njalla-dns-api.org b/content/blog/2022-02-10-njalla-dns-api.org
index 1588099..ec47917 100644
--- a/content/blog/2022-02-10-njalla-dns-api.org
+++ b/content/blog/2022-02-10-njalla-dns-api.org
@@ -1,8 +1,8 @@
-#+date: [2022-02-10 Thu 00:00:00]
-#+title:       automating dynamic dns record updates via njalla api using python
-#+description: Instructional material detailing automation of DNS record updates by interfacing with Njalla's API, suitable for environments with frequently changing IP addresses.
+#+date:        [2022-02-10 Thu 00:00:00]
+#+title:       Dynamic DNS Updates via the Njalla API
+#+description: A Python script to update DNS records automatically via the Njalla API.
 #+slug:        njalla-dns-api
-#+filetags: :security:
+#+filetags:    :security:
 
 * Njalla's API
 
diff --git a/content/blog/2022-02-16-debian-and-nginx.org b/content/blog/2022-02-16-debian-and-nginx.org
index ea0186e..f47e951 100644
--- a/content/blog/2022-02-16-debian-and-nginx.org
+++ b/content/blog/2022-02-16-debian-and-nginx.org
@@ -1,8 +1,8 @@
-#+date: [2022-02-16 Wed 00:00:00]
-#+title: debian nginx migration: ditch ubuntu, move the stack
-#+description: Step-by-step protocol for transitioning web server infrastructure to Debian operating system, including installation, configuration, and security hardening of Nginx and Agate services.
+#+date:        [2022-02-16 Wed 00:00:00]
+#+title:       Migrating from Ubuntu to Debian with Nginx
+#+description: Moving my web server from Ubuntu to Debian and reconfiguring Nginx.
 #+slug:        debian-and-nginx
-#+filetags: :linux:web:
+#+filetags:    :linux:web:
 
 * Server Operating System (OS): Debian
 
diff --git a/content/blog/2022-02-17-exiftool.org b/content/blog/2022-02-17-exiftool.org
index eb1c31e..305292f 100644
--- a/content/blog/2022-02-17-exiftool.org
+++ b/content/blog/2022-02-17-exiftool.org
@@ -1,8 +1,8 @@
-#+date: [2022-02-17 Thu 00:00:00]
-#+title: exiftool metadata: strip it before you post it
-#+description: Technical instructions for utilizing Exiftool to systematically strip metadata from image files to ensure privacy and reduce file size.
+#+date:        [2022-02-17 Thu 00:00:00]
+#+title:       ExifTool: Strip Metadata Before You Post
+#+description: How to use ExifTool to strip metadata from images before sharing them.
 #+slug:        exiftool
-#+filetags: :linux:privacy:
+#+filetags:    :linux:privacy:
 
 ** Why Strip Metadata?
 
diff --git a/content/blog/2022-02-20-nginx-caching.org b/content/blog/2022-02-20-nginx-caching.org
index 5134994..a76e035 100644
--- a/content/blog/2022-02-20-nginx-caching.org
+++ b/content/blog/2022-02-20-nginx-caching.org
@@ -1,8 +1,8 @@
-#+date: [2022-02-20 Sun 00:00:00]
-#+title: nginx caching: static content, cache config
-#+description: Detailed methods for configuring Nginx to cache static resources such as CSS, JavaScript, and images to improve website loading times and resource efficiency.
+#+date:        [2022-02-20 Sun 00:00:00]
+#+title:       Nginx Caching for Static Content
+#+description: Configuring Nginx to cache static assets like CSS, JS, and images.
 #+slug:        nginx-caching
-#+filetags: :linux:web:
+#+filetags:    :linux:web:
 
 * Update Your Nginx Config to Cache Static Files
 
diff --git a/content/blog/2022-02-22-tuesday.org b/content/blog/2022-02-22-tuesday.org
index 3207404..026db5a 100644
--- a/content/blog/2022-02-22-tuesday.org
+++ b/content/blog/2022-02-22-tuesday.org
@@ -1,8 +1,8 @@
-#+date: [2022-02-22 Tue 00:00:00]
-#+title: twosday: 2 22 22 was a real date
-#+description: Examination of the date Tuesday, February 22, 2022, highlighting the palindromic properties and expected observations on this specific calendar occurrence.
+#+date:        [2022-02-22 Tue 00:00:00]
+#+title:       Twosday: 2/22/22
+#+description: A brief note on Tuesday, February 22nd, 2022.
 #+slug:        tuesday
-#+filetags: :personal:
+#+filetags:    :personal:
 
 * Tuesday, Twosday
 
diff --git a/content/blog/2022-03-02-reliable-notes.org b/content/blog/2022-03-02-reliable-notes.org
index d5ee7de..7a6f15a 100644
--- a/content/blog/2022-03-02-reliable-notes.org
+++ b/content/blog/2022-03-02-reliable-notes.org
@@ -1,8 +1,8 @@
-#+date: [2022-03-02 Wed 00:00:00]
-#+title: notes in plaintext: portable, no app dependency
-#+description: Instructions on applying standardized note-taking procedures with Markdown format, including synchronization and cross-platform compatibility considerations.
+#+date:        [2022-03-02 Wed 00:00:00]
+#+title:       Create Reliable Notes with Plaintext
+#+description: Why I keep my notes in plaintext Markdown, synced across devices.
 #+slug:        reliable-notes
-#+filetags: :personal:
+#+filetags:    :personal:
 
 * Choosing Durable File Formats
 
diff --git a/content/blog/2022-03-03-financial-database.org b/content/blog/2022-03-03-financial-database.org
index c911165..7d89d30 100644
--- a/content/blog/2022-03-03-financial-database.org
+++ b/content/blog/2022-03-03-financial-database.org
@@ -1,8 +1,8 @@
-#+date: [2022-03-03 Thu 00:00:00]
-#+title: financial tracker: sqlite over spreadsheets
-#+description: Procedures for creating and maintaining a personal financial database utilizing SQLite, Python programming language, and Jupyter Notebook interface.
+#+date:        [2022-03-03 Thu 00:00:00]
+#+title:       Personal Finance Tracker with SQLite
+#+description: Building a personal finance tracker with SQLite, Python, and Jupyter.
 #+slug:        financial-database
-#+filetags: :self-hosting:
+#+filetags:    :self-hosting:
 
 * Personal Financial Tracking
 
diff --git a/content/blog/2022-03-08-plex-migration.org b/content/blog/2022-03-08-plex-migration.org
index 6f4c833..76b77d2 100644
--- a/content/blog/2022-03-08-plex-migration.org
+++ b/content/blog/2022-03-08-plex-migration.org
@@ -1,8 +1,8 @@
-#+date: [2022-03-08 Tue 00:00:00]
-#+title:       migrating plex media server to new hardware with nvidia gpu setup
-#+description: Stepwise instructions for transferring Plex Media Server to new hardware and enabling Nvidia GPU transcoding to optimize media processing performance.
+#+date:        [2022-03-08 Tue 00:00:00]
+#+title:       Migrating Plex to New Hardware with Nvidia GPU
+#+description: Moving Plex to new hardware and setting up Nvidia GPU transcoding.
 #+slug:        plex-migration
-#+filetags: :self-hosting:
+#+filetags:    :self-hosting:
 
 * Migration Phases
 
diff --git a/content/blog/2022-03-23-cloudflare-dns-api.org b/content/blog/2022-03-23-cloudflare-dns-api.org
index efe95ec..1588135 100644
--- a/content/blog/2022-03-23-cloudflare-dns-api.org
+++ b/content/blog/2022-03-23-cloudflare-dns-api.org
@@ -1,8 +1,8 @@
-#+date: [2022-03-23 Wed 00:00:00]
-#+title:       dynamic dns record updates via cloudflare api
-#+description: Command-line procedures to automate updating of DNS A and AAAA records by interfacing with the Cloudflare API, suitable for environments with variable IP addresses.
+#+date:        [2022-03-23 Wed 00:00:00]
+#+title:       Dynamic DNS Updates via the Cloudflare API
+#+description: Automatically updating DNS A and AAAA records via the Cloudflare API.
 #+slug:        cloudflare-dns-api
-#+filetags: :security:
+#+filetags:    :security:
 
 * DDNS: Dynamic DNS
 :PROPERTIES:
diff --git a/content/blog/2022-03-23-nextcloud-on-ubuntu.org b/content/blog/2022-03-23-nextcloud-on-ubuntu.org
index 2384844..e9d8470 100644
--- a/content/blog/2022-03-23-nextcloud-on-ubuntu.org
+++ b/content/blog/2022-03-23-nextcloud-on-ubuntu.org
@@ -1,8 +1,8 @@
-#+date: [2022-03-23 Wed 00:00:00]
-#+title:       self hosting guide: nextcloud
-#+description: Comprehensive guide for implementing Nextcloud as a self-hosted solution on an Ubuntu server, including installation steps, configuration parameters, and basic security measures.
+#+date:        [2022-03-23 Wed 00:00:00]
+#+title:       Self-Hosting Guide: Nextcloud
+#+description: How to install and configure Nextcloud on Ubuntu.
 #+slug:        nextcloud-on-ubuntu
-#+filetags: :linux:self-hosting:
+#+filetags:    :linux:self-hosting:
 
 * What is Nextcloud?
 :PROPERTIES:
diff --git a/content/blog/2022-03-24-server-hardening.org b/content/blog/2022-03-24-server-hardening.org
index 358d128..9ef548a 100644
--- a/content/blog/2022-03-24-server-hardening.org
+++ b/content/blog/2022-03-24-server-hardening.org
@@ -1,8 +1,8 @@
-#+date: [2022-03-24 Thu 00:00:00]
-#+title: server hardening: firewalls, ssh, vlans
-#+description: Detailed instructions to enhance the security posture of home servers exposed to public networks, including firewall setup, secure SSH configuration, fail2ban deployment, and network segmentation.
+#+date:        [2022-03-24 Thu 00:00:00]
+#+title:       Server Hardening: Firewalls, SSH, VLANs
+#+description: Hardening a home server with UFW, SSH config, fail2ban, and VLANs.
 #+slug:        server-hardening
-#+filetags: :linux:security:
+#+filetags:    :linux:security:
 
 * Planning Data Flows & Security
 
diff --git a/content/blog/2022-03-26-ssh-mfa.org b/content/blog/2022-03-26-ssh-mfa.org
index 1da01f1..17d1882 100644
--- a/content/blog/2022-03-26-ssh-mfa.org
+++ b/content/blog/2022-03-26-ssh-mfa.org
@@ -1,8 +1,8 @@
-#+date: [2022-03-26 Sat 00:00:00]
-#+title: ssh mfa: totp on top of keys
-#+description: Step-by-step deployment guide for enabling TOTP multi-factor authentication on SSH services using Google Authenticator and Pluggable Authentication Module (PAM) integration.
+#+date:        [2022-03-26 Sat 00:00:00]
+#+title:       SSH MFA: TOTP on Top of Keys
+#+description: Adding TOTP two-factor authentication on top of SSH key auth.
 #+slug:        ssh-mfa
-#+filetags: :security:
+#+filetags:    :security:
 
 * Why Do I Need Multi-Factor Authentication (MFA) for SSH (Secure Shell Protocol)?
 
diff --git a/content/blog/2022-04-02-nginx-reverse-proxy.org b/content/blog/2022-04-02-nginx-reverse-proxy.org
index 9a1aa3a..ed75e1a 100644
--- a/content/blog/2022-04-02-nginx-reverse-proxy.org
+++ b/content/blog/2022-04-02-nginx-reverse-proxy.org
@@ -1,8 +1,8 @@
-#+date: [2022-04-02 Sat 00:00:00]
-#+title: nginx reverse proxy: config and nothing else
-#+description: Technical guide for setting up Nginx server to operate as a reverse proxy on Ubuntu systems, including configuration files setup and operational parameters.
+#+date:        [2022-04-02 Sat 00:00:00]
+#+title:       Nginx Reverse Proxy Config
+#+description: Setting up Nginx as a reverse proxy on Ubuntu.
 #+slug:        nginx-reverse-proxy
-#+filetags: :linux:web:
+#+filetags:    :linux:web:
 
 * What is a Reverse Proxy?
 
diff --git a/content/blog/2022-04-09-pinetime.org b/content/blog/2022-04-09-pinetime.org
index ed0322c..0307d57 100644
--- a/content/blog/2022-04-09-pinetime.org
+++ b/content/blog/2022-04-09-pinetime.org
@@ -1,8 +1,8 @@
-#+date: [2022-04-09 Sat 00:00:00]
-#+title:       pinetime smartwatch: an open source hardware & software overview
-#+description: Technical description of PineTime smartwatch capabilities, including heart rate measurement, step counting, sleep monitoring, and smartphone connectivity functions.
+#+date:        [2022-04-09 Sat 00:00:00]
+#+title:       PineTime: Open Source Smartwatch Overview
+#+description: An overview of the PineTime open-source smartwatch and what it can do.
 #+slug:        pinetime
-#+filetags: :linux:
+#+filetags:    :linux:
 
 * PineTime Product Information
 
diff --git a/content/blog/2022-06-01-ditching-cloudflare.org b/content/blog/2022-06-01-ditching-cloudflare.org
index 6e7d978..f4d8fb6 100644
--- a/content/blog/2022-06-01-ditching-cloudflare.org
+++ b/content/blog/2022-06-01-ditching-cloudflare.org
@@ -1,8 +1,8 @@
-#+date: [2022-06-01 Wed 00:00:00]
-#+title: ditching cloudflare: dns under your own name, not theirs
-#+description: Evaluation and procedural explanation for migrating DNS management services from Cloudflare to Njalla, with emphasis on privacy controls and domain registration mechanics.
+#+date:        [2022-06-01 Wed 00:00:00]
+#+title:       Ditching Cloudflare
+#+description: Why I moved my DNS away from Cloudflare, and how I did it.
 #+slug:        ditching-cloudflare
-#+filetags: :privacy:security:
+#+filetags:    :privacy:security:
 
 * Registrar
 
diff --git a/content/blog/2022-06-07-self-hosting-freshrss.org b/content/blog/2022-06-07-self-hosting-freshrss.org
index 221b528..f988eb3 100644
--- a/content/blog/2022-06-07-self-hosting-freshrss.org
+++ b/content/blog/2022-06-07-self-hosting-freshrss.org
@@ -1,8 +1,8 @@
-#+date: [2022-06-07 Tue 00:00:00]
-#+title:       self hosting guide: freshrss
-#+description: Stepwise instructions for installing FreshRSS using Docker and configuring Nginx as a reverse proxy to enable secure and synchronized RSS feed access.
+#+date:        [2022-06-07 Tue 00:00:00]
+#+title:       Self-Hosting Guide: FreshRSS
+#+description: How to install FreshRSS with Docker and Nginx.
 #+slug:        self-hosting-freshrss
-#+filetags: :linux:self-hosting:
+#+filetags:    :linux:self-hosting:
 
 * Why Use Really Simple Syndication (RSS)?
 
diff --git a/content/blog/2022-06-16-terminal-lifestyle.org b/content/blog/2022-06-16-terminal-lifestyle.org
index 7b20ac9..c6b4483 100644
--- a/content/blog/2022-06-16-terminal-lifestyle.org
+++ b/content/blog/2022-06-16-terminal-lifestyle.org
@@ -1,8 +1,8 @@
-#+date: [2022-06-16 Thu 00:00:00]
-#+title: terminal first: why the gui is optional
-#+description: Detailed procedures for reducing digital interruptions and increasing efficiency through terminal-based utilities for web browsing, communication, electronic mail, RSS feeds, and programming tasks.
+#+date:        [2022-06-16 Thu 00:00:00]
+#+title:       Terminal First: Why the GUI Is Optional
+#+description: My setup for handling email, browsing, IRC, and RSS from the terminal.
 #+slug:        terminal-lifestyle
-#+filetags: :linux:
+#+filetags:    :linux:
 
 * Text-Based Simplicity
 
diff --git a/content/blog/2022-06-22-daily-poetry.org b/content/blog/2022-06-22-daily-poetry.org
index c980468..96f1a58 100644
--- a/content/blog/2022-06-22-daily-poetry.org
+++ b/content/blog/2022-06-22-daily-poetry.org
@@ -1,8 +1,8 @@
-#+date: [2022-06-22 Wed 00:00:00]
-#+title: daily poetry: cron job, no subscription required
-#+description: Instructional guide for scheduling and automating the distribution of classic and contemporary poetry in plaintext format to an electronic mail inbox using Python scripting and SMTP protocol.
+#+date:        [2022-06-22 Wed 00:00:00]
+#+title:       Daily Poetry via Cron
+#+description: A Python script that emails you a poem every morning via cron.
 #+slug:        daily-poetry
-#+filetags: :personal:
+#+filetags:    :personal:
 
 * Source Code
 
diff --git a/content/blog/2022-06-24-fedora-i3.org b/content/blog/2022-06-24-fedora-i3.org
index 90b7281..e26c64e 100644
--- a/content/blog/2022-06-24-fedora-i3.org
+++ b/content/blog/2022-06-24-fedora-i3.org
@@ -1,8 +1,8 @@
-#+date: [2022-06-24 Fri 00:00:00]
-#+title: fedora i3: back on linux, tiling wm
-#+description: Examination of the transition from macOS to Linux, including a detailed description of Fedora operating system installation and i3 window manager configuration.
+#+date:        [2022-06-24 Fri 00:00:00]
+#+title:       Fedora and i3: Back on Linux
+#+description: Moving back to Linux: installing Fedora and setting up i3.
 #+slug:        fedora-i3
-#+filetags: :linux:
+#+filetags:    :linux:
 
 * Leaving macOS
 
diff --git a/content/blog/2022-07-01-git-server.org b/content/blog/2022-07-01-git-server.org
index 3bb4b9f..b62a7f9 100644
--- a/content/blog/2022-07-01-git-server.org
+++ b/content/blog/2022-07-01-git-server.org
@@ -1,8 +1,8 @@
-#+date: [2022-07-01 Fri 00:00:00]
-#+title:       self hosting guide: git & cgit
-#+description: Comprehensive instructions for secure and efficient setup, hosting, and management of personal Git repositories to facilitate collaborative development and remote access.
+#+date:        [2022-07-01 Fri 00:00:00]
+#+title:       Self-Hosting Guide: Git and cgit
+#+description: How to self-host Git repos and browse them with cgit.
 #+slug:        git-server
-#+filetags: :linux:self-hosting:
+#+filetags:    :linux:self-hosting:
 
 * My Approach to Self-Hosting Git
 
diff --git a/content/blog/2022-07-14-gnupg.org b/content/blog/2022-07-14-gnupg.org
index 477d2dc..4ee883c 100644
--- a/content/blog/2022-07-14-gnupg.org
+++ b/content/blog/2022-07-14-gnupg.org
@@ -1,8 +1,8 @@
-#+date: [2022-07-14 Thu 00:00:00]
-#+title: gnupg: encryption, signing, web of trust
-#+description: Technical manual covering the architecture, cryptographic algorithms, vulnerability considerations, key management, and typical applications of GNU Privacy Guard for secure data and email encryption.
+#+date:        [2022-07-14 Thu 00:00:00]
+#+title:       GnuPG: Encryption, Signing, Web of Trust
+#+description: How GnuPG works and how I use it for encryption and signing.
 #+slug:        gnupg
-#+filetags: :linux:security:
+#+filetags:    :linux:security:
 
 * The History of GPG
 
diff --git a/content/blog/2022-07-25-curseradio.org b/content/blog/2022-07-25-curseradio.org
index c732db3..56da519 100644
--- a/content/blog/2022-07-25-curseradio.org
+++ b/content/blog/2022-07-25-curseradio.org
@@ -1,8 +1,8 @@
-#+date: [2022-07-25 Mon 00:00:00]
-#+title:       curseradio: a lightweight command line internet radio player for linux
-#+description: Stepwise instructions for installing and utilizing Curseradio, a lightweight command-line program for streaming radio stations within Linux environments.
+#+date:        [2022-07-25 Mon 00:00:00]
+#+title:       Curseradio: Internet Radio from the Terminal
+#+description: Installing and using Curseradio to stream internet radio from the terminal.
 #+slug:        curseradio
-#+filetags: :linux:
+#+filetags:    :linux:
 
 * Overview
 
diff --git a/content/blog/2022-07-30-flac-to-opus.org b/content/blog/2022-07-30-flac-to-opus.org
index dd29e3d..4e7a257 100644
--- a/content/blog/2022-07-30-flac-to-opus.org
+++ b/content/blog/2022-07-30-flac-to-opus.org
@@ -1,8 +1,8 @@
-#+date: [2022-07-30 Sat 00:00:00]
-#+title:       automating recursive flac to opus conversion with a bash script
-#+description: Instructions for automating the conversion of audio files from FLAC to Opus format recursively within directory structures, including performance considerations and script usage.
+#+date:        [2022-07-30 Sat 00:00:00]
+#+title:       Recursive FLAC to Opus Conversion
+#+description: A bash script to convert FLAC files to Opus recursively.
 #+slug:        flac-to-opus
-#+filetags: :linux:
+#+filetags:    :linux:
 
 * Converting FLAC to OPUS
 
diff --git a/content/blog/2022-07-31-bash-it.org b/content/blog/2022-07-31-bash-it.org
index 6e640be..07150bf 100644
--- a/content/blog/2022-07-31-bash-it.org
+++ b/content/blog/2022-07-31-bash-it.org
@@ -1,8 +1,8 @@
-#+date: [2022-07-31 Sun 00:00:00]
-#+title: bash it: plugins and autosuggestions for zsh refugees
-#+description: Guide to augmenting Bash shell features by integrating Bash-It framework along with ble.sh for input autosuggestions, improving command-line efficiency on Linux systems.
+#+date:        [2022-07-31 Sun 00:00:00]
+#+title:       Bash-It: Plugins and Autosuggestions
+#+description: Setting up Bash-It with ble.sh for a better shell experience.
 #+slug:        bash-it
-#+filetags: :linux:
+#+filetags:    :linux:
 
 * Bash
 
diff --git a/content/blog/2022-08-31-privacy-com-changes.org b/content/blog/2022-08-31-privacy-com-changes.org
index ef17576..118c2e8 100644
--- a/content/blog/2022-08-31-privacy-com-changes.org
+++ b/content/blog/2022-08-31-privacy-com-changes.org
@@ -1,8 +1,8 @@
-#+date: [2022-08-31 Wed 00:00:00]
-#+title: privacy com changes: they changed the product, not the name
-#+description: Detailed examination of modifications to Privacy.com service terms and their implications on user privacy and payment security protocols.
+#+date:        [2022-08-31 Wed 00:00:00]
+#+title:       Privacy.com Changed the Product, Not the Name
+#+description: Privacy.com changed their terms. Here's what that means.
 #+slug:        privacy-com-changes
-#+filetags: :privacy:
+#+filetags:    :privacy:
 
 * Privacy.com Changes Their Terms
 
diff --git a/content/blog/2022-09-17-serenity-os.org b/content/blog/2022-09-17-serenity-os.org
index 2899249..ed53515 100644
--- a/content/blog/2022-09-17-serenity-os.org
+++ b/content/blog/2022-09-17-serenity-os.org
@@ -1,8 +1,8 @@
-#+date: [2022-09-17 Sat 00:00:00]
-#+title:       building and exploring serenityos: a retro inspired unix like desktop
-#+description: Technical overview of Serenity OS including system architecture, building procedures, and operational instructions for this Unix-like operating system with a 1990s user interface style.
+#+date:        [2022-09-17 Sat 00:00:00]
+#+title:       Building and Exploring SerenityOS
+#+description: Building and running SerenityOS, a retro Unix-like desktop OS.
 #+slug:        serenity-os
-#+filetags: :linux:
+#+filetags:    :linux:
 
 * Overview
 
diff --git a/content/blog/2022-09-21-graphene-os.org b/content/blog/2022-09-21-graphene-os.org
index 043b835..cef1d00 100644
--- a/content/blog/2022-09-21-graphene-os.org
+++ b/content/blog/2022-09-21-graphene-os.org
@@ -1,8 +1,8 @@
-#+date: [2022-09-21 Wed 00:00:00]
-#+title:       installing grapheneos on pixel 6 pro
-#+description: Step-by-step instructions to perform secure installation of the GrapheneOS operating system on Google Pixel 6 Pro hardware platform.
+#+date:        [2022-09-21 Wed 00:00:00]
+#+title:       Installing GrapheneOS on Pixel 6 Pro
+#+description: How to install GrapheneOS on a Pixel 6 Pro.
 #+slug:        graphene-os
-#+filetags: :linux:privacy:
+#+filetags:    :linux:privacy:
 
 * Introduction
 
diff --git a/content/blog/2022-10-04-mtp-linux.org b/content/blog/2022-10-04-mtp-linux.org
index 6c00216..cb425b0 100644
--- a/content/blog/2022-10-04-mtp-linux.org
+++ b/content/blog/2022-10-04-mtp-linux.org
@@ -1,8 +1,8 @@
-#+date: [2022-10-04 Tue 00:00:00]
-#+title: mtp linux: mount your phone without a file manager
-#+description: Instructions for mounting and accessing Media Transfer Protocol (MTP) compatible mobile devices on Fedora Linux using jmtpfs for file transfer and management.
+#+date:        [2022-10-04 Tue 00:00:00]
+#+title:       MTP on Linux: Mount Your Phone Without a File Manager
+#+description: Mounting Android phones on Fedora Linux with jmtpfs.
 #+slug:        mtp-linux
-#+filetags: :linux:
+#+filetags:    :linux:
 
 I recently ran into trouble attempting to mount my GrapheneOS phone to my laptop
 running Fedora Linux via the [[https://en.wikipedia.org/wiki/Media_transfer_protocol][Media Transfer Protocol]] (MTP) and discovered a
diff --git a/content/blog/2022-10-04-syncthing.org b/content/blog/2022-10-04-syncthing.org
index c1620e6..5e84411 100644
--- a/content/blog/2022-10-04-syncthing.org
+++ b/content/blog/2022-10-04-syncthing.org
@@ -1,8 +1,8 @@
-#+date: [2022-10-04 Tue 00:00:00]
-#+title:       self hosting guide: syncthing
-#+description: Technical instructions for setting up Syncthing as a peer-to-peer self-hosted file synchronization system that preserves data privacy by eliminating third-party intermediaries.
+#+date:        [2022-10-04 Tue 00:00:00]
+#+title:       Self-Hosting Guide: Syncthing
+#+description: How to set up Syncthing for private, peer-to-peer file sync.
 #+slug:        syncthing
-#+filetags: :linux:self-hosting:
+#+filetags:    :linux:self-hosting:
 
 * An Overview of Syncthing
 
diff --git a/content/blog/2022-10-22-alpine-linux.org b/content/blog/2022-10-22-alpine-linux.org
index 019a25a..a5bc443 100644
--- a/content/blog/2022-10-22-alpine-linux.org
+++ b/content/blog/2022-10-22-alpine-linux.org
@@ -1,8 +1,8 @@
-#+date: [2022-10-22 Sat 00:00:00]
-#+title: alpine linux: minimal install, minimal attack surface
-#+description: Detailed procedure for deploying Alpine Linux to achieve a secure, lightweight server environment optimized for web hosting and containerization.
+#+date:        [2022-10-22 Sat 00:00:00]
+#+title:       Alpine Linux: Minimal Install, Minimal Attack Surface
+#+description: Installing Alpine Linux as a lightweight, secure server OS.
 #+slug:        alpine-linux
-#+filetags: :linux:
+#+filetags:    :linux:
 
 * Alpine Linux
 
diff --git a/content/blog/2022-10-30-linux-display-manager.org b/content/blog/2022-10-30-linux-display-manager.org
index 26a8511..464b3d7 100644
--- a/content/blog/2022-10-30-linux-display-manager.org
+++ b/content/blog/2022-10-30-linux-display-manager.org
@@ -1,8 +1,8 @@
-#+date: [2022-10-30 Sun 00:00:00]
-#+title:       managing display managers in void linux: disable, enable, and configure
-#+description: Stepwise instructions to manage and replace the display manager on a Void Linux installation, including service control and configuration editing.
+#+date:        [2022-10-30 Sun 00:00:00]
+#+title:       Void Linux: Remove the Display Manager
+#+description: Disabling the display manager on Void Linux and starting i3 manually.
 #+slug:        linux-display-manager
-#+filetags: :linux:
+#+filetags:    :linux:
 
 * Display Manager Services
 
diff --git a/content/blog/2022-11-07-self-hosting-matrix.org b/content/blog/2022-11-07-self-hosting-matrix.org
index 226a568..cacc9a1 100644
--- a/content/blog/2022-11-07-self-hosting-matrix.org
+++ b/content/blog/2022-11-07-self-hosting-matrix.org
@@ -1,8 +1,8 @@
-#+date: [2022-11-07 Mon 00:00:00]
-#+title:       self hosting guide: matrix synapse
-#+description: Systematic guide for deploying Matrix Synapse on Alpine Linux, covering dependency installation, reverse proxy setup, TLS certificate application, and user account management.
+#+date:        [2022-11-07 Mon 00:00:00]
+#+title:       Self-Hosting Guide: Matrix Synapse
+#+description: How to deploy Matrix Synapse on Alpine Linux with Nginx.
 #+slug:        self-hosting-matrix
-#+filetags: :linux:self-hosting:
+#+filetags:    :linux:self-hosting:
 
 * Synapse
 
diff --git a/content/blog/2022-11-11-nginx-tmp-errors.org b/content/blog/2022-11-11-nginx-tmp-errors.org
index 14e2f0d..9385486 100644
--- a/content/blog/2022-11-11-nginx-tmp-errors.org
+++ b/content/blog/2022-11-11-nginx-tmp-errors.org
@@ -1,8 +1,8 @@
-#+date: [2022-11-11 Fri 00:00:00]
-#+title:       troubleshooting and fixing nginx permission denied errors on /var/lib/nginx
-#+description: Step-by-step remediation for addressing permission denied errors encountered by Nginx in the /var/lib/nginx directory to restore temporary file caching functionality.
+#+date:        [2022-11-11 Fri 00:00:00]
+#+title:       Fixing Nginx Permission Denied Errors on /var/lib/nginx
+#+description: Fixing permission denied errors on /var/lib/nginx in Nginx.
 #+slug:        nginx-tmp-errors
-#+filetags: :web:
+#+filetags:    :web:
 
 /This is a brief post so that I personally remember the solution as it
 has occurred multiple times for me./
diff --git a/content/blog/2022-11-27-server-build.org b/content/blog/2022-11-27-server-build.org
index 20afebc..f282fcf 100644
--- a/content/blog/2022-11-27-server-build.org
+++ b/content/blog/2022-11-27-server-build.org
@@ -1,8 +1,8 @@
-#+date: [2022-11-27 Sun 00:00:00]
-#+title: server build: rack hardware, consumer parts, no enterprise markup
-#+description: Detailed instructions on selecting components, assembling, and configuring a rack-mounted server suitable for advanced computing tasks in a professional or laboratory setting.
+#+date:        [2022-11-27 Sun 00:00:00]
+#+title:       Server Build: Rack Hardware, Consumer Parts
+#+description: How I built a rack-mounted server with consumer parts.
 #+slug:        server-build
-#+filetags: :linux:
+#+filetags:    :linux:
 
 * The Dilemma
 
diff --git a/content/blog/2022-11-29-nginx-referrer-ban-list.org b/content/blog/2022-11-29-nginx-referrer-ban-list.org
index 706bc82..bc3d7b7 100644
--- a/content/blog/2022-11-29-nginx-referrer-ban-list.org
+++ b/content/blog/2022-11-29-nginx-referrer-ban-list.org
@@ -1,8 +1,8 @@
-#+date: [2022-11-29 Tue 00:00:00]
-#+title: nginx referrer ban: block the scrapers
-#+description: Technical guide to implementing a referrer ban list in Nginx configurations to prevent access from undesired domains and improve web server security.
+#+date:        [2022-11-29 Tue 00:00:00]
+#+title:       Nginx Referrer Ban List
+#+description: Blocking unwanted referrers in Nginx with a simple ban list.
 #+slug:        nginx-referrer-ban-list
-#+filetags: :linux:web:
+#+filetags:    :linux:web:
 
 * Creating the Ban List
 
diff --git a/content/blog/2022-12-01-nginx-compression.org b/content/blog/2022-12-01-nginx-compression.org
index f7992a3..13683cf 100644
--- a/content/blog/2022-12-01-nginx-compression.org
+++ b/content/blog/2022-12-01-nginx-compression.org
@@ -1,8 +1,8 @@
-#+date: [2022-12-01 Thu 00:00:00]
-#+title: nginx gzip: compress text, nothing else
-#+description: Procedures for activating and configuring GZIP compression in Nginx to decrease data transmission size, reduce bandwidth consumption, and accelerate page load times.
+#+date:        [2022-12-01 Thu 00:00:00]
+#+title:       Nginx Gzip: Compress Text, Nothing Else
+#+description: Enabling and configuring GZIP compression in Nginx.
 #+slug:        nginx-compression
-#+filetags: :linux:web:
+#+filetags:    :linux:web:
 
 * Text Compression
 
diff --git a/content/blog/2022-12-07-nginx-wildcard-redirect.org b/content/blog/2022-12-07-nginx-wildcard-redirect.org
index 7641ed2..bd56a62 100644
--- a/content/blog/2022-12-07-nginx-wildcard-redirect.org
+++ b/content/blog/2022-12-07-nginx-wildcard-redirect.org
@@ -1,8 +1,8 @@
-#+date: [2022-12-07 Wed 00:00:00]
-#+title: nginx wildcard redirect: domains, subdomains, trailing paths
-#+description: Instructional steps for applying regex-based redirects in Nginx to manage subdomain routing and trailing path modifications effectively.
+#+date:        [2022-12-07 Wed 00:00:00]
+#+title:       Nginx Wildcard Redirects
+#+description: Using regex-based redirects in Nginx for subdomain and path routing.
 #+slug:        nginx-wildcard-redirect
-#+filetags: :web:
+#+filetags:    :web:
 
 * Problem
 
diff --git a/content/blog/2022-12-17-st.org b/content/blog/2022-12-17-st.org
index 8f76a3f..590e99f 100644
--- a/content/blog/2022-12-17-st.org
+++ b/content/blog/2022-12-17-st.org
@@ -1,8 +1,8 @@
-#+date: [2022-12-17 Sat 00:00:00]
-#+title:       installing and customizing the suckless simple terminal (st) on fedora linux
-#+description: Comprehensive instructions to obtain source code, compile, apply patches, and install the Simple Terminal application on Fedora Linux systems.
+#+date:        [2022-12-17 Sat 00:00:00]
+#+title:       Suckless Simple Terminal on Fedora
+#+description: Compiling and patching the Suckless Simple Terminal on Fedora.
 #+slug:        st
-#+filetags: :linux:
+#+filetags:    :linux:
 
 * st
 
diff --git a/content/blog/2022-12-23-alpine-desktop.org b/content/blog/2022-12-23-alpine-desktop.org
index ea73fa4..61a81b5 100644
--- a/content/blog/2022-12-23-alpine-desktop.org
+++ b/content/blog/2022-12-23-alpine-desktop.org
@@ -1,8 +1,8 @@
-#+date: [2022-12-23 Fri 00:00:00]
-#+title: alpine desktop: sway on alpine, minimal by default
-#+description: Stepwise procedures for installing and setting up Alpine Linux as a desktop operating system, including window manager setup and relevant system adjustments.
+#+date:        [2022-12-23 Fri 00:00:00]
+#+title:       Alpine Desktop with Sway
+#+description: Setting up Alpine Linux as a desktop with Sway as the window manager.
 #+slug:        alpine-desktop
-#+filetags: :linux:
+#+filetags:    :linux:
 
 * Isn't Alpine Linux for Servers?
 
diff --git a/content/blog/2023-01-03-recent-website-changes.org b/content/blog/2023-01-03-recent-website-changes.org
index 8c581a9..25aea5b 100644
--- a/content/blog/2023-01-03-recent-website-changes.org
+++ b/content/blog/2023-01-03-recent-website-changes.org
@@ -1,8 +1,8 @@
-#+date: [2023-01-03 Tue 00:00:00]
-#+title: website updates 2023: what changed and why
-#+description: Documentation of significant changes applied to site design, layout, and accessibility features to enhance navigability and content clarity.
+#+date:        [2023-01-03 Tue 00:00:00]
+#+title:       Website Updates 2023
+#+description: A rundown of recent changes to the site design and structure.
 #+slug:        recent-website-changes
-#+filetags: :personal:web:
+#+filetags:    :personal:web:
 
 * The State of This Website
 
diff --git a/content/blog/2023-01-05-mass-unlike-tumblr-posts.org b/content/blog/2023-01-05-mass-unlike-tumblr-posts.org
index 74510cb..c3ce8fa 100644
--- a/content/blog/2023-01-05-mass-unlike-tumblr-posts.org
+++ b/content/blog/2023-01-05-mass-unlike-tumblr-posts.org
@@ -1,8 +1,8 @@
-#+date: [2023-01-05 Thu 00:00:00]
-#+title: tumblr unlike all: script, done, get out
-#+description: Instructions for executing a JavaScript script to automate the mass unlike operation for Tumblr posts without requiring additional software.
+#+date:        [2023-01-05 Thu 00:00:00]
+#+title:       Mass Unlike All Tumblr Posts
+#+description: A JavaScript snippet to mass-unlike all your Tumblr posts.
 #+slug:        mass-unlike-tumblr-posts
-#+filetags: :linux:personal:
+#+filetags:    :linux:personal:
 
 * The Dilemma
 
diff --git a/content/blog/2023-01-08-fedora-login-manager.org b/content/blog/2023-01-08-fedora-login-manager.org
index c9be0b4..f4e71dc 100644
--- a/content/blog/2023-01-08-fedora-login-manager.org
+++ b/content/blog/2023-01-08-fedora-login-manager.org
@@ -1,8 +1,8 @@
-#+date: [2023-01-08 Sun 00:00:00]
-#+title: fedora i3 no login manager: remove it, start manually
-#+description: Step-by-step guide for uninstalling the default Fedora i3 login manager and configuring system to launch i3 window manager manually.
+#+date:        [2023-01-08 Sun 00:00:00]
+#+title:       Fedora i3: Remove the Login Manager
+#+description: Removing the Fedora login manager and launching i3 manually.
 #+slug:        fedora-login-manager
-#+filetags: :linux:
+#+filetags:    :linux:
 
 * Fedora i3's Login Manager
 
diff --git a/content/blog/2023-01-21-flatpak-symlinks.org b/content/blog/2023-01-21-flatpak-symlinks.org
index 7b7466b..4649303 100644
--- a/content/blog/2023-01-21-flatpak-symlinks.org
+++ b/content/blog/2023-01-21-flatpak-symlinks.org
@@ -1,8 +1,8 @@
-#+date: [2023-01-21 Sat 00:00:00]
-#+title: flatpak symlinks: shorten the command
-#+description: Detailed instructions for establishing symbolic links for Flatpak applications to facilitate faster execution from terminal or application launcher environments.
+#+date:        [2023-01-21 Sat 00:00:00]
+#+title:       Flatpak Symlinks: Shorten the Command
+#+description: Creating symlinks for Flatpak apps to make them easier to launch.
 #+slug:        flatpak-symlinks
-#+filetags: :linux:
+#+filetags:    :linux:
 
 * Running Flatpak Apps Should Be Faster
 
diff --git a/content/blog/2023-01-23-random-wireguard.org b/content/blog/2023-01-23-random-wireguard.org
index 0c163ce..88345fa 100644
--- a/content/blog/2023-01-23-random-wireguard.org
+++ b/content/blog/2023-01-23-random-wireguard.org
@@ -1,8 +1,8 @@
-#+date: [2023-01-23 Mon 00:00:00]
-#+title:       automate random mullvad wireguard vpn connection on startup
-#+description: Stepwise method to configure system startup scripts for automatic connection to a randomly chosen Mullvad Wireguard VPN server to maintain privacy.
+#+date:        [2023-01-23 Mon 00:00:00]
+#+title:       Random Mullvad WireGuard on Startup
+#+description: A startup script to connect to a random Mullvad WireGuard server.
 #+slug:        random-wireguard
-#+filetags: :linux:security:self-hosting:
+#+filetags:    :linux:security:self-hosting:
 
 * Mullvad Wireguard
 
diff --git a/content/blog/2023-01-28-self-hosting-wger.org b/content/blog/2023-01-28-self-hosting-wger.org
index ce61558..2033e6b 100644
--- a/content/blog/2023-01-28-self-hosting-wger.org
+++ b/content/blog/2023-01-28-self-hosting-wger.org
@@ -1,8 +1,8 @@
-#+date: [2023-01-28 Sat 00:00:00]
-#+title:       self hosting guide: wger
-#+description: Comprehensive steps for installing, configuring, and operating the Wger workout management application on a dedicated server platform.
+#+date:        [2023-01-28 Sat 00:00:00]
+#+title:       Self-Hosting Guide: wger
+#+description: How to self-host wger, an open-source workout manager.
 #+slug:        self-hosting-wger
-#+filetags: :linux:self-hosting:
+#+filetags:    :linux:self-hosting:
 
 * Wger: The Self-Hosted Workout Manager
 
diff --git a/content/blog/2023-02-02-exploring-hare.org b/content/blog/2023-02-02-exploring-hare.org
index 34dcf5e..7305595 100644
--- a/content/blog/2023-02-02-exploring-hare.org
+++ b/content/blog/2023-02-02-exploring-hare.org
@@ -1,8 +1,8 @@
-#+date: [2023-02-02 Thu 00:00:00]
-#+title: hare lang: notes from first contact
-#+description: Overview of the Hare programming language features, installation procedure, and elementary programming examples targeting system-level development.
+#+date:        [2023-02-02 Thu 00:00:00]
+#+title:       Hare Lang: Notes from First Contact
+#+description: First impressions of the Hare programming language.
 #+slug:        exploring-hare
-#+filetags: :linux:
+#+filetags:    :linux:
 
 * A Quick Note
 
diff --git a/content/blog/2023-05-22-burnout.org b/content/blog/2023-05-22-burnout.org
index 04d1203..5e0e2d8 100644
--- a/content/blog/2023-05-22-burnout.org
+++ b/content/blog/2023-05-22-burnout.org
@@ -1,8 +1,8 @@
-#+date: [2023-05-22 Mon 00:00:00]
-#+title: burnout: audit and consulting will take everything you let them
-#+description: Examination of burnout phenomena accompanied by strategies and practical approaches for workload management and restoration of optimal functioning.
+#+date:        [2023-05-22 Mon 00:00:00]
+#+title:       Burnout
+#+description: Honest thoughts on burning out in audit and consulting.
 #+slug:        burnout
-#+filetags: :personal:
+#+filetags:    :personal:
 
 * RE: Burnout
 
diff --git a/content/blog/2023-06-08-goaccess-geoip.org b/content/blog/2023-06-08-goaccess-geoip.org
index 357f1a1..83f4982 100644
--- a/content/blog/2023-06-08-goaccess-geoip.org
+++ b/content/blog/2023-06-08-goaccess-geoip.org
@@ -1,8 +1,8 @@
-#+date: [2023-06-08 Thu 00:00:00]
-#+title:       real time traffic insights from nginx logs using goaccess + geoip
-#+description: Step-by-step instructions to utilize GoAccess tool incorporating MaxMind GeoIP integration for real-time geographic and traffic analysis of Nginx log files.
+#+date:        [2023-06-08 Thu 00:00:00]
+#+title:       Nginx Traffic Analysis with GoAccess and GeoIP
+#+description: Using GoAccess with MaxMind GeoIP to analyze Nginx traffic in real time.
 #+slug:        goaccess-geoip
-#+filetags: :self-hosting:web:
+#+filetags:    :self-hosting:web:
 
 * Overview
 
diff --git a/content/blog/2023-06-08-self-hosting-baikal.org b/content/blog/2023-06-08-self-hosting-baikal.org
index 30104ee..f9de031 100644
--- a/content/blog/2023-06-08-self-hosting-baikal.org
+++ b/content/blog/2023-06-08-self-hosting-baikal.org
@@ -1,8 +1,8 @@
-#+date: [2023-06-08 Thu 00:00:00]
-#+title:       self hosting guide: baikal
-#+description: Detailed procedure for deploying the Baikal server software to provide CalDAV and CardDAV services, including security considerations and Docker deployment.
+#+date:        [2023-06-08 Thu 00:00:00]
+#+title:       Self-Hosting Guide: Baikal
+#+description: How to deploy Baikal for self-hosted CalDAV and CardDAV.
 #+slug:        self-hosting-baikal
-#+filetags: :linux:self-hosting:
+#+filetags:    :linux:self-hosting:
 
 * What is Baikal?
 
diff --git a/content/blog/2023-06-18-unifi-ip-blocklist.org b/content/blog/2023-06-18-unifi-ip-blocklist.org
index 2872edf..44ae6eb 100644
--- a/content/blog/2023-06-18-unifi-ip-blocklist.org
+++ b/content/blog/2023-06-18-unifi-ip-blocklist.org
@@ -1,8 +1,8 @@
-#+date: [2023-06-18 Sun 00:00:00]
-#+title:       blocking malicious ips on unifi: manual firewall rule setup
-#+description: Instructions to identify and block harmful IP addresses and subnets through Unifi firewall settings to improve network security posture.
+#+date:        [2023-06-18 Sun 00:00:00]
+#+title:       Blocking Malicious IPs on Unifi
+#+description: Manually blocking malicious IPs via Unifi firewall rules.
 #+slug:        unifi-ip-blocklist
-#+filetags: :linux:self-hosting:
+#+filetags:    :linux:self-hosting:
 
 * Identifying Abusive IPs
 
diff --git a/content/blog/2023-06-20-audit-review-template.org b/content/blog/2023-06-20-audit-review-template.org
index 5d62344..43e238e 100644
--- a/content/blog/2023-06-20-audit-review-template.org
+++ b/content/blog/2023-06-20-audit-review-template.org
@@ -1,8 +1,8 @@
-#+date: [2023-06-20 Tue 00:00:00]
-#+title:       audit testing review checklist
-#+description: Practical audit testing review template with detailed steps to support comprehensive evaluation of financial audits and SOC reports.
+#+date:        [2023-06-20 Tue 00:00:00]
+#+title:       Audit Testing Review Checklist
+#+description: A practical checklist for reviewing audit testing on financial and SOC engagements.
 #+slug:        audit-review-template
-#+filetags: :audit:
+#+filetags:    :audit:
 
 * Overview
 
diff --git a/content/blog/2023-06-23-byobu.org b/content/blog/2023-06-23-byobu.org
index 2da8065..fe4841a 100644
--- a/content/blog/2023-06-23-byobu.org
+++ b/content/blog/2023-06-23-byobu.org
@@ -1,8 +1,8 @@
-#+date: [2023-06-23 Fri 00:00:00]
-#+title: byobu: tmux with less configuration overhead
-#+description: Detailed overview of Byobu terminal multiplexer features, configuration settings, session management, and keybindings to enhance command-line efficiency.
+#+date:        [2023-06-23 Fri 00:00:00]
+#+title:       Byobu: tmux with Less Configuration Overhead
+#+description: Using Byobu as a tmux wrapper with sane defaults out of the box.
 #+slug:        byobu
-#+filetags: :linux:self-hosting:
+#+filetags:    :linux:self-hosting:
 
 * Byobu
 
diff --git a/content/blog/2023-06-23-self-hosting-convos.org b/content/blog/2023-06-23-self-hosting-convos.org
index 33cd88b..8512f54 100644
--- a/content/blog/2023-06-23-self-hosting-convos.org
+++ b/content/blog/2023-06-23-self-hosting-convos.org
@@ -1,8 +1,8 @@
-#+date: [2023-06-23 Fri 00:00:00]
-#+title:       self hosting guide: convos
-#+description: Stepwise instructions for installation, Docker Compose configuration, Nginx reverse proxy setup, and IRC nickname registration for Convos web client hosting.
+#+date:        [2023-06-23 Fri 00:00:00]
+#+title:       Self-Hosting Guide: Convos
+#+description: How to self-host Convos, a web-based IRC client.
 #+slug:        self-hosting-convos
-#+filetags: :linux:self-hosting:
+#+filetags:    :linux:self-hosting:
 
 * Convos
 
diff --git a/content/blog/2023-06-28-backblaze-b2.org b/content/blog/2023-06-28-backblaze-b2.org
index d2ea53f..1a11ce3 100644
--- a/content/blog/2023-06-28-backblaze-b2.org
+++ b/content/blog/2023-06-28-backblaze-b2.org
@@ -1,8 +1,8 @@
-#+date: [2023-06-28 Wed 00:00:00]
-#+title: backblaze b2 backups: before i moved off it
-#+description: Methodical guide for configuring and utilizing Backblaze B2 cloud storage services to perform reliable and secure offsite data backups.
+#+date:        [2023-06-28 Wed 00:00:00]
+#+title:       Backblaze B2 Backups
+#+description: Setting up Backblaze B2 for offsite backups before I moved on.
 #+slug:        backblaze-b2
-#+filetags: :self-hosting:
+#+filetags:    :self-hosting:
 
 * Overview
 
diff --git a/content/blog/2023-06-30-self-hosting-voyager.org b/content/blog/2023-06-30-self-hosting-voyager.org
index 5b8f42d..e081834 100644
--- a/content/blog/2023-06-30-self-hosting-voyager.org
+++ b/content/blog/2023-06-30-self-hosting-voyager.org
@@ -1,8 +1,8 @@
-#+date: [2023-06-30 Fri 00:00:00]
-#+title:       self hosting guide: voyager for lemmy
-#+description: Instructions for building, running, and reverse proxying Voyager, a Lemmy web client, on a server environment utilizing Docker and Nginx components.
+#+date:        [2023-06-30 Fri 00:00:00]
+#+title:       Self-Hosting Guide: Voyager for Lemmy
+#+description: How to self-host Voyager, a web client for Lemmy.
 #+slug:        self-hosting-voyager
-#+filetags: :linux:self-hosting:
+#+filetags:    :linux:self-hosting:
 
 * Installation Guide
 
diff --git a/content/blog/2023-07-12-wireguard-lan.org b/content/blog/2023-07-12-wireguard-lan.org
index f086d0c..34ee46d 100644
--- a/content/blog/2023-07-12-wireguard-lan.org
+++ b/content/blog/2023-07-12-wireguard-lan.org
@@ -1,8 +1,8 @@
-#+date: [2023-07-12 Wed 00:00:00]
-#+title:       enabling local network access with mullvad wireguard configs
-#+description: Detailed procedure to modify Mullvad Wireguard VPN configuration files and iptables rules to allow Local Area Network access while maintaining VPN connectivity.
+#+date:        [2023-07-12 Wed 00:00:00]
+#+title:       Mullvad WireGuard with LAN Access
+#+description: Modifying Mullvad WireGuard configs to allow LAN access while connected.
 #+slug:        wireguard-lan
-#+filetags: :security:self-hosting:
+#+filetags:    :security:self-hosting:
 
 * Download Configuration Files from Mullvad
 
diff --git a/content/blog/2023-07-19-plex-transcoder-errors.org b/content/blog/2023-07-19-plex-transcoder-errors.org
index afcdffe..6f57d96 100644
--- a/content/blog/2023-07-19-plex-transcoder-errors.org
+++ b/content/blog/2023-07-19-plex-transcoder-errors.org
@@ -1,8 +1,8 @@
-#+date: [2023-07-19 Wed 00:00:00]
-#+title:       plex subtitle error: transcoder fails to start
-#+description: Technical procedures to identify and correct Plex transcoder failures at startup to maintain uninterrupted media conversion and playback.
+#+date:        [2023-07-19 Wed 00:00:00]
+#+title:       Plex Transcoder Errors: Subtitle Fix
+#+description: Fixing Plex transcoder startup failures caused by subtitle errors.
 #+slug:        plex-transcoder-errors
-#+filetags: :linux:self-hosting:
+#+filetags:    :linux:self-hosting:
 
 * Plex Transcoder Error
 
diff --git a/content/blog/2023-08-18-agile-auditing.org b/content/blog/2023-08-18-agile-auditing.org
index 8883a11..0cd336a 100644
--- a/content/blog/2023-08-18-agile-auditing.org
+++ b/content/blog/2023-08-18-agile-auditing.org
@@ -1,8 +1,8 @@
-#+date: [2023-08-18 Fri 00:00:00]
-#+title: agile auditing: consultants cosplaying as engineers
-#+description: Detailed examination of Agile auditing methodologies, including Scrum and Kanban frameworks, with practical steps for application in audit processes.
+#+date:        [2023-08-18 Fri 00:00:00]
+#+title:       Agile Auditing
+#+description: My take on agile auditing: what it is and how it actually plays out.
 #+slug:        agile-auditing
-#+filetags: :audit:
+#+filetags:    :audit:
 
 * What is Agile Auditing?
 
diff --git a/content/blog/2023-09-15-self-hosting-gitweb.org b/content/blog/2023-09-15-self-hosting-gitweb.org
index 0ff692b..1719136 100644
--- a/content/blog/2023-09-15-self-hosting-gitweb.org
+++ b/content/blog/2023-09-15-self-hosting-gitweb.org
@@ -1,8 +1,8 @@
-#+date: [2023-09-15 Fri 00:00:00]
-#+title:       self hosting guide: gitweb
-#+description: Stepwise instructions for deploying GitWeb on Linux servers using Nginx, configuring fastcgi, and managing git repositories effectively.
+#+date:        [2023-09-15 Fri 00:00:00]
+#+title:       Self-Hosting Guide: GitWeb
+#+description: Deploying GitWeb on Linux with Nginx and FastCGI.
 #+slug:        self-hosting-gitweb
-#+filetags: :linux:self-hosting:
+#+filetags:    :linux:self-hosting:
 
 * Overview
 
diff --git a/content/blog/2023-09-19-audit-sql-scripts.org b/content/blog/2023-09-19-audit-sql-scripts.org
index 369ab80..65e9570 100644
--- a/content/blog/2023-09-19-audit-sql-scripts.org
+++ b/content/blog/2023-09-19-audit-sql-scripts.org
@@ -1,8 +1,8 @@
-#+date: [2023-09-19 Tue 00:00:00]
-#+title:       auditing user privileges in oracle, sql server, and mysql
-#+description: Collection of SQL queries designed for auditing user access parameters on Oracle, Microsoft SQL Server, and MySQL database systems.
+#+date:        [2023-09-19 Tue 00:00:00]
+#+title:       SQL Scripts for Auditing User Privileges
+#+description: SQL queries for auditing user access in Oracle, SQL Server, and MySQL.
 #+slug:        audit-sql-scripts
-#+filetags: :audit:
+#+filetags:    :audit:
 
 * Overview
 
diff --git a/content/blog/2023-10-04-digital-minimalism.org b/content/blog/2023-10-04-digital-minimalism.org
index 756b1a0..90f8a81 100644
--- a/content/blog/2023-10-04-digital-minimalism.org
+++ b/content/blog/2023-10-04-digital-minimalism.org
@@ -1,8 +1,8 @@
-#+date: [2023-10-04 Wed 00:00:00]
-#+title: digital minimalism: fewer inputs, more signal
-#+description: Practical guide for minimizing digital clutter and optimizing work focus by applying digital minimalism tactics.
+#+date:        [2023-10-04 Wed 00:00:00]
+#+title:       Digital Minimalism: Fewer Inputs, More Signal
+#+description: How I reduce digital noise and stay focused.
 #+slug:        digital-minimalism
-#+filetags: :linux:privacy:
+#+filetags:    :linux:privacy:
 
 I've written [[https://cleberg.net/wiki/#digital-garden][a note about minimalism]]
 before, but I wanted to dedicate some time to reflect on digital
diff --git a/content/blog/2023-10-11-self-hosting-authelia.org b/content/blog/2023-10-11-self-hosting-authelia.org
index 97f31b2..785caaa 100644
--- a/content/blog/2023-10-11-self-hosting-authelia.org
+++ b/content/blog/2023-10-11-self-hosting-authelia.org
@@ -1,8 +1,8 @@
-#+date: [2023-10-11 Wed 00:00:00]
-#+title:       self hosting guide: authelia
-#+description: Instructional guide for setting up Authelia to provide secure two-factor authentication and access control in self-hosted environments.
+#+date:        [2023-10-11 Wed 00:00:00]
+#+title:       Self-Hosting Guide: Authelia
+#+description: Setting up Authelia for two-factor auth and access control on self-hosted apps.
 #+slug:        self-hosting-authelia
-#+filetags: :linux:security:self-hosting:
+#+filetags:    :linux:security:self-hosting:
 
 * Overview
 
diff --git a/content/blog/2023-10-15-alpine-ssh-hardening.org b/content/blog/2023-10-15-alpine-ssh-hardening.org
index 55f7887..5991775 100644
--- a/content/blog/2023-10-15-alpine-ssh-hardening.org
+++ b/content/blog/2023-10-15-alpine-ssh-hardening.org
@@ -1,8 +1,8 @@
-#+date: [2023-10-15 Sun 00:00:00]
-#+title:       alpine linux ssh hardening guide
-#+description: Detailed guide to enhance Alpine Linux SSH server security through configuration adjustments and vulnerability mitigation.
+#+date:        [2023-10-15 Sun 00:00:00]
+#+title:       Alpine Linux SSH Hardening
+#+description: Hardening SSH on Alpine Linux with config changes and key-only auth.
 #+slug:        alpine-ssh-hardening
-#+filetags: :linux:security:
+#+filetags:    :linux:security:
 
 * Overview
 
diff --git a/content/blog/2023-10-17-self-hosting-anonymousoverflow.org b/content/blog/2023-10-17-self-hosting-anonymousoverflow.org
index 518ee62..9ae47db 100644
--- a/content/blog/2023-10-17-self-hosting-anonymousoverflow.org
+++ b/content/blog/2023-10-17-self-hosting-anonymousoverflow.org
@@ -1,8 +1,8 @@
-#+date: [2023-10-17 Tue 00:00:00]
-#+title:       self hosting guide: anonymousoverflow
-#+description: Detailed installation and setup instructions for the AnonymousOverflow application using Docker Compose and Nginx reverse proxy.
+#+date:        [2023-10-17 Tue 00:00:00]
+#+title:       Self-Hosting Guide: AnonymousOverflow
+#+description: How to self-host AnonymousOverflow with Docker Compose and Nginx.
 #+slug:        self-hosting-anonymousoverflow
-#+filetags: :linux:self-hosting:
+#+filetags:    :linux:self-hosting:
 
 * Overview
 
diff --git a/content/blog/2023-11-08-scli.org b/content/blog/2023-11-08-scli.org
index 9038557..cfeee8e 100644
--- a/content/blog/2023-11-08-scli.org
+++ b/content/blog/2023-11-08-scli.org
@@ -1,8 +1,8 @@
-#+date: [2023-11-08 Wed 00:00:00]
-#+title:       signal cli (scli) installation on alpine
-#+description: Step-by-step instructions for installing the Signal messenger command-line client scli on Alpine Linux with musl libc, including dependencies and configuration.
+#+date:        [2023-11-08 Wed 00:00:00]
+#+title:       Signal CLI (scli) on Alpine
+#+description: Installing the Signal CLI client on Alpine Linux.
 #+slug:        scli
-#+filetags: :linux:
+#+filetags:    :linux:
 
 [[https://github.com/isamert/scli][scli]] is a command-line tool that
 allows you to connect to your Signal messenger account. This program
diff --git a/content/blog/2023-12-03-unifi-nextdns.org b/content/blog/2023-12-03-unifi-nextdns.org
index 258fb02..7c88b40 100644
--- a/content/blog/2023-12-03-unifi-nextdns.org
+++ b/content/blog/2023-12-03-unifi-nextdns.org
@@ -1,8 +1,8 @@
-#+date: [2023-12-03 Sun 00:00:00]
-#+title:       installing and configuring nextdns on unifi dream machine routers
-#+description: Procedural guide for installation and configuration of NextDNS on Unifi Dream Machine devices for network DNS filtering.
+#+date:        [2023-12-03 Sun 00:00:00]
+#+title:       NextDNS on Unifi Dream Machine
+#+description: Installing and configuring NextDNS on a Unifi Dream Machine.
 #+slug:        unifi-nextdns
-#+filetags: :linux:self-hosting:
+#+filetags:    :linux:self-hosting:
 
 * Overview
 
diff --git a/content/blog/2024-01-08-dont-say-hello.org b/content/blog/2024-01-08-dont-say-hello.org
index 61e327d..c949199 100644
--- a/content/blog/2024-01-08-dont-say-hello.org
+++ b/content/blog/2024-01-08-dont-say-hello.org
@@ -1,8 +1,8 @@
-#+date: [2024-01-08 Mon 00:00:00]
-#+title:       don't say hello
-#+description: Technical recommendations for improving professional communication by eliminating non-essential introductory phrases to enhance message clarity.
+#+date:        [2024-01-08 Mon 00:00:00]
+#+title:       Don't Say Hello
+#+description: Stop leading messages with 'hello' and nothing else.
 #+slug:        dont-say-hello
-#+filetags: :privacy:
+#+filetags:    :privacy:
 
 I recently came back from a winter break and have started working again... only
 to immediately run into the dilemma of people sending me cliffhanger messages
diff --git a/content/blog/2024-01-09-macos-customization.org b/content/blog/2024-01-09-macos-customization.org
index 1974522..723e2d6 100644
--- a/content/blog/2024-01-09-macos-customization.org
+++ b/content/blog/2024-01-09-macos-customization.org
@@ -1,8 +1,8 @@
-#+date: [2024-01-09 Tue 00:00:00]
-#+title: macos customization: terminal, tiling wm, widgets
-#+description: Detailed overview of methods and tools for modifying macOS system settings, including terminal usage, window management, and interface customization.
+#+date:        [2024-01-09 Tue 00:00:00]
+#+title:       macOS Customization: Terminal, Tiling WM, Widgets
+#+description: How I've customized macOS with a terminal, tiling WM, and widgets.
 #+slug:        macos-customization
-#+filetags: :linux:
+#+filetags:    :linux:
 
 I have been using macOS more than Linux lately, so I wrote this post to describe
 some simple options to customize macOS beyond the normal built-in settings menu.
diff --git a/content/blog/2024-01-13-local-llm.org b/content/blog/2024-01-13-local-llm.org
index 584e38e..7ed4f82 100644
--- a/content/blog/2024-01-13-local-llm.org
+++ b/content/blog/2024-01-13-local-llm.org
@@ -1,8 +1,8 @@
-#+date: [2024-01-13 Sat 00:00:00]
-#+title: local llm: run the model, keep the data
-#+description: Technical guide to deploying and running local large language models on macOS and iOS devices focusing on open-source implementations and privacy considerations.
+#+date:        [2024-01-13 Sat 00:00:00]
+#+title:       Local LLM: Run the Model, Keep the Data
+#+description: Running local language models on macOS and iOS with open-source tools.
 #+slug:        local-llm
-#+filetags: :linux:privacy:
+#+filetags:    :linux:privacy:
 
 * Requirements
 
diff --git a/content/blog/2024-01-26-audit-dashboard.org b/content/blog/2024-01-26-audit-dashboard.org
index 15884a3..aacd076 100644
--- a/content/blog/2024-01-26-audit-dashboard.org
+++ b/content/blog/2024-01-26-audit-dashboard.org
@@ -1,8 +1,8 @@
-#+date: [2024-01-26 Fri 00:00:00]
-#+title: audit dashboard: alteryx + power bi, the corporate stack
-#+description: Instructions for transforming audit data into dynamic dashboards via data preparation with Alteryx and visualization using Microsoft Power BI.
+#+date:        [2024-01-26 Fri 00:00:00]
+#+title:       Audit Dashboard: Alteryx and Power BI
+#+description: Building an audit dashboard with Alteryx for data prep and Power BI for visuals.
 #+slug:        audit-dashboard
-#+filetags: :audit:
+#+filetags:    :audit:
 
 Alteryx and Power BI are powerful tools that can help turn your old-school audit
 trackers into interactive tools that provide useful insights and potential
diff --git a/content/blog/2024-01-27-tableau-dashboard.org b/content/blog/2024-01-27-tableau-dashboard.org
index 716893c..548443a 100644
--- a/content/blog/2024-01-27-tableau-dashboard.org
+++ b/content/blog/2024-01-27-tableau-dashboard.org
@@ -1,8 +1,8 @@
-#+date: [2024-01-27 Sat 00:00:00]
-#+title: omaha crime data: tableau, 8 years of numbers
-#+description: Detailed procedure for data preparation and interactive visualization of crime trends in Omaha, using Tableau software from 2015 through 2023 data.
+#+date:        [2024-01-27 Sat 00:00:00]
+#+title:       Omaha Crime Data: 8 Years in Tableau
+#+description: Visualizing 8 years of Omaha crime data in Tableau.
 #+slug:        tableau-dashboard
-#+filetags: :web:
+#+filetags:    :web:
 
 In this project, I am going to show you how to use Tableau Public for free to
 create simple dashboards.
diff --git a/content/blog/2024-02-06-zfs.org b/content/blog/2024-02-06-zfs.org
index ce7ff9a..ebc9ec0 100644
--- a/content/blog/2024-02-06-zfs.org
+++ b/content/blog/2024-02-06-zfs.org
@@ -1,8 +1,8 @@
-#+date: [2024-02-06 Tue 00:00:00]
-#+title:       creating and managing zfs storage pools on ubuntu linux
-#+description: Stepwise guide to setting up ZFS storage pools on Ubuntu, including initial installation, pool creation, expansion, and maintenance.
+#+date:        [2024-02-06 Tue 00:00:00]
+#+title:       ZFS Storage Pools on Ubuntu
+#+description: Setting up and managing ZFS storage pools on Ubuntu.
 #+slug:        zfs
-#+filetags: :linux:
+#+filetags:    :linux:
 
 This post details the process I used to create ZFS pools, datasets, and
 snapshots on Ubuntu Server.
diff --git a/content/blog/2024-02-13-ubuntu-emergency-mode.org b/content/blog/2024-02-13-ubuntu-emergency-mode.org
index 04b0228..ccbe6dd 100644
--- a/content/blog/2024-02-13-ubuntu-emergency-mode.org
+++ b/content/blog/2024-02-13-ubuntu-emergency-mode.org
@@ -1,8 +1,8 @@
-#+date: [2024-02-13 Tue 00:00:00]
-#+title:       resolving ubuntu boot issues caused by invalid /etc/fstab mounts
-#+description: Detailed instructions to identify errors in the /etc/fstab file causing Ubuntu to enter emergency mode and steps to edit and restore normal boot operations.
+#+date:        [2024-02-13 Tue 00:00:00]
+#+title:       Ubuntu Emergency Mode: Bad /etc/fstab Fix
+#+description: Fixing an invalid /etc/fstab that put Ubuntu into emergency mode.
 #+slug:        ubuntu-emergency-mode
-#+filetags: :linux:
+#+filetags:    :linux:
 
 * The Problem
 
diff --git a/content/blog/2024-02-21-self-hosting-otter-wiki.org b/content/blog/2024-02-21-self-hosting-otter-wiki.org
index a83fe1b..3a22652 100644
--- a/content/blog/2024-02-21-self-hosting-otter-wiki.org
+++ b/content/blog/2024-02-21-self-hosting-otter-wiki.org
@@ -1,8 +1,8 @@
-#+date: [2024-02-21 Wed 00:00:00]
-#+title:       self hosting guide: an otter wiki
-#+description: Stepwise directions for installing Otter Wiki, configuring Docker Compose environment, and setting up Nginx reverse proxy for secure access.
+#+date:        [2024-02-21 Wed 00:00:00]
+#+title:       Self-Hosting Guide: Otter Wiki
+#+description: How to self-host Otter Wiki with Docker Compose and Nginx.
 #+slug:        self-hosting-otter-wiki
-#+filetags: :linux:self-hosting:
+#+filetags:    :linux:self-hosting:
 
 * An Otter Wiki
 
diff --git a/content/blog/2024-03-13-doom-emacs.org b/content/blog/2024-03-13-doom-emacs.org
index 197fb38..51521bc 100644
--- a/content/blog/2024-03-13-doom-emacs.org
+++ b/content/blog/2024-03-13-doom-emacs.org
@@ -1,8 +1,8 @@
-#+date: [2024-03-13 Wed 00:00:00]
-#+title:       doom emacs & org mode setup
-#+description: Technical manual covering installation, configuration files, and usage procedures for Doom Emacs and Org-Mode targeting note management and task organization.
+#+date:        [2024-03-13 Wed 00:00:00]
+#+title:       Doom Emacs and Org Mode Setup
+#+description: How I set up Doom Emacs and Org Mode for notes and task management.
 #+slug:        doom-emacs
-#+filetags: :emacs:
+#+filetags:    :emacs:
 
 ** Screenshots
 
diff --git a/content/blog/2024-03-15-self-hosting-ddns-updater.org b/content/blog/2024-03-15-self-hosting-ddns-updater.org
index 239a8e3..f7f6bdb 100644
--- a/content/blog/2024-03-15-self-hosting-ddns-updater.org
+++ b/content/blog/2024-03-15-self-hosting-ddns-updater.org
@@ -1,8 +1,8 @@
-#+date: [2024-03-15 Fri 00:00:00]
-#+title:       self hosting guide: ddns updater
-#+description: Step-by-step configuration guide for deploying a Dynamic DNS updater using Docker Compose, integrating with Cloudflare API, and securing with Nginx reverse proxy.
+#+date:        [2024-03-15 Fri 00:00:00]
+#+title:       Self-Hosting Guide: DDNS Updater
+#+description: Deploying a DDNS updater with Docker Compose and Cloudflare.
 #+slug:        self-hosting-ddns-updater
-#+filetags: :linux:self-hosting:
+#+filetags:    :linux:self-hosting:
 
 #+caption: DDNS Updater Web View
 #+attr_html: :alt An example of the DDNS Updater app running and showing that cleberg.net's IP has been updated on Cloudflare.
diff --git a/content/blog/2024-03-29-org-blog.org b/content/blog/2024-03-29-org-blog.org
index eea0623..814cd99 100644
--- a/content/blog/2024-03-29-org-blog.org
+++ b/content/blog/2024-03-29-org-blog.org
@@ -1,8 +1,8 @@
-#+date: [2024-03-29 Fri 00:00:00]
-#+title:       blogging with emacs org mode and weblorg
-#+description: Instructional content for preparing and publishing blogs using Emacs Org-Mode, including setup of static site generators and content management workflows.
+#+date:        [2024-03-29 Fri 00:00:00]
+#+title:       Blogging with Emacs Org Mode and weblorg
+#+description: How I set up this blog using Emacs Org Mode and weblorg.
 #+slug:        org-blog
-#+filetags: :emacs:web:
+#+filetags:    :emacs:web:
 
 First and foremost, apologies to those who subscribe via RSS as I know that my
 feed duplicated itself when I moved this blog over to org-mode last night.
diff --git a/content/blog/2024-04-06-convert-onenote-to-markdown.org b/content/blog/2024-04-06-convert-onenote-to-markdown.org
index 182aaf6..dd71238 100644
--- a/content/blog/2024-04-06-convert-onenote-to-markdown.org
+++ b/content/blog/2024-04-06-convert-onenote-to-markdown.org
@@ -1,8 +1,8 @@
-#+date: [2024-04-06 Sat 00:00:00]
-#+title: onenote to org: escape the microsoft format
-#+description: Detailed conversion instructions to transform OneNote document files into Markdown or Org-Mode formats using Pandoc command-line utility on Windows systems.
+#+date:        [2024-04-06 Sat 00:00:00]
+#+title:       OneNote to Org: Escape the Microsoft Format
+#+description: Converting OneNote files to Markdown or Org Mode with Pandoc.
 #+slug:        convert-onenote-to-markdown
-#+filetags: :emacs:
+#+filetags:    :emacs:
 
 If you're looking to convert your OneNote content to another format, such as
 Markdown or Org-Mode, you're in luck. I use a solution that doesn't require
diff --git a/content/blog/2024-04-08-docker-local-web-server.org b/content/blog/2024-04-08-docker-local-web-server.org
index 7c22c59..14c8e25 100644
--- a/content/blog/2024-04-08-docker-local-web-server.org
+++ b/content/blog/2024-04-08-docker-local-web-server.org
@@ -1,8 +1,8 @@
-#+date: [2024-04-08 Mon 00:00:00]
-#+title:       local web dev server setup with docker & nginx
-#+description: Instructions for setting up a local web development environment employing Docker Desktop and Nginx web server to facilitate development and testing workflows.
+#+date:        [2024-04-08 Mon 00:00:00]
+#+title:       Local Web Dev Server with Docker and Nginx
+#+description: Setting up a local web server for development with Docker and Nginx.
 #+slug:        docker-local-web-server
-#+filetags: :self-hosting:web:
+#+filetags:    :self-hosting:web:
 
 When developing websites locally, I often use a simple Python web server to
 observe the changes.
diff --git a/content/blog/2024-04-18-mu4e.org b/content/blog/2024-04-18-mu4e.org
index 9fb7940..62757c0 100644
--- a/content/blog/2024-04-18-mu4e.org
+++ b/content/blog/2024-04-18-mu4e.org
@@ -1,8 +1,8 @@
-#+date: [2024-04-18 Thu 00:00:00]
-#+title:       configuring mu4e with doom emacs on macos
-#+description: Stepwise procedure for installing, configuring, and using Mu4e email client within Doom Emacs on macOS for organized email management.
+#+date:        [2024-04-18 Thu 00:00:00]
+#+title:       mu4e with Doom Emacs on macOS
+#+description: Setting up mu4e for email inside Doom Emacs on macOS.
 #+slug:        mu4e
-#+filetags: :emacs:linux:
+#+filetags:    :emacs:linux:
 
 This post was heavily inspired by [[https://macowners.club/posts/email-emacs-mu4e-macos/][Email setup in Emacs with Mu4e on macOS]], but
 with my own tweaks for a single-account configuration and some Doom-specific
diff --git a/content/blog/2024-05-03-ubuntu-on-macos.org b/content/blog/2024-05-03-ubuntu-on-macos.org
index 346bc3a..de9459f 100644
--- a/content/blog/2024-05-03-ubuntu-on-macos.org
+++ b/content/blog/2024-05-03-ubuntu-on-macos.org
@@ -1,8 +1,8 @@
-#+date: [2024-05-03 Fri 00:00:00]
-#+title:       orbstack on macos: running a full ubuntu linux environment
-#+description: Technical guide outlining the installation and operation of OrbStack to run Ubuntu Linux containers natively on macOS systems with performance considerations.
+#+date:        [2024-05-03 Fri 00:00:00]
+#+title:       OrbStack on macOS: Running Ubuntu
+#+description: Running a full Ubuntu environment on macOS using OrbStack.
 #+slug:        ubuntu-on-macos
-#+filetags: :linux:
+#+filetags:    :linux:
 
 Being a macOS user who previously used Linux for many years, I often find myself
 searching for alternatives to the Linux-native tools and methods that I had
diff --git a/content/blog/2024-06-19-deprecated-trusted-gpg-fix.org b/content/blog/2024-06-19-deprecated-trusted-gpg-fix.org
index 3892fdc..9106382 100644
--- a/content/blog/2024-06-19-deprecated-trusted-gpg-fix.org
+++ b/content/blog/2024-06-19-deprecated-trusted-gpg-fix.org
@@ -1,8 +1,8 @@
-#+date: [2024-06-19 Wednesday 08:00:00]
-#+title:       migrating ubuntu gpg keys to trusted.gpg.d
-#+description: Technical instructions to relocate GPG keys from the deprecated trusted.gpg keyring to the supported trusted.gpg.d directory for system security maintenance.
+#+date:        [2024-06-19 Wed 08:00:00]
+#+title:       Ubuntu: Migrate GPG Keys to trusted.gpg.d
+#+description: Moving Ubuntu GPG keys from the deprecated trusted.gpg to trusted.gpg.d.
 #+slug:        deprecated-trusted-gpg-fix
-#+filetags: :linux:
+#+filetags:    :linux:
 
 ** System Warning
 
diff --git a/content/blog/2024-07-11-emacs-on-ipad.org b/content/blog/2024-07-11-emacs-on-ipad.org
index b82c44a..81484af 100644
--- a/content/blog/2024-07-11-emacs-on-ipad.org
+++ b/content/blog/2024-07-11-emacs-on-ipad.org
@@ -1,8 +1,8 @@
-#+date: [2024-07-11 Thursday 20:24:02]
-#+title:       running emacs natively on apple silicon ipad
-#+description: Procedural instructions for installing Emacs on iPadOS devices with Apple Silicon architecture, including configuration and operational guidance.
+#+date:        [2024-07-11 Thu 20:24:02]
+#+title:       Running Emacs Natively on an Apple Silicon iPad
+#+description: Installing and running Emacs natively on an iPad with Apple Silicon.
 #+slug:        emacs-on-ipad
-#+filetags: :emacs:
+#+filetags:    :emacs:
 
 This post describes the process to install and use Emacs on the iPad Air 13-inch
 (M2). The iPad used in this post is running iPadOS 17.6.
diff --git a/content/blog/2024-08-11-org-mode-features.org b/content/blog/2024-08-11-org-mode-features.org
index 0a42a64..f21b395 100644
--- a/content/blog/2024-08-11-org-mode-features.org
+++ b/content/blog/2024-08-11-org-mode-features.org
@@ -1,8 +1,8 @@
-#+date: [2024-08-11 Sun 12:48:00]
-#+title: org mode features: what i actually use
-#+description: Detailed overview of essential Org-Mode functionalities focusing on task organization, note-taking, and workflow optimization.
+#+date:        [2024-08-11 Sun 12:48:00]
+#+title:       Org Mode Features: What I Actually Use
+#+description: The Org Mode features I actually reach for, and how I use them.
 #+slug:        org-mode-features
-#+filetags: :emacs:
+#+filetags:    :emacs:
 
 * Cycling (Folding)
 
diff --git a/content/blog/2024-08-25-n8n-sentiment-analysis.org b/content/blog/2024-08-25-n8n-sentiment-analysis.org
index fa2d058..0c9717f 100644
--- a/content/blog/2024-08-25-n8n-sentiment-analysis.org
+++ b/content/blog/2024-08-25-n8n-sentiment-analysis.org
@@ -1,8 +1,8 @@
-#+date: [2024-08-25 Sunday 09:45:30]
-#+title:       automate email sentiment analysis with n8n
-#+description: Detailed procedural steps for configuring an n8n workflow to perform sentiment analysis on incoming email messages, enabling automated classification based on sentiment.
+#+date:        [2024-08-25 Sun 09:45:30]
+#+title:       Email Sentiment Analysis with n8n
+#+description: Using n8n to automatically classify incoming emails by sentiment.
 #+slug:        n8n-sentiment-analysis
-#+filetags: :self-hosting:
+#+filetags:    :self-hosting:
 
 * n8n
 
diff --git a/content/blog/2024-09-20-prometheus-grafana-cloud.org b/content/blog/2024-09-20-prometheus-grafana-cloud.org
index c6dbe3a..b74c69e 100644
--- a/content/blog/2024-09-20-prometheus-grafana-cloud.org
+++ b/content/blog/2024-09-20-prometheus-grafana-cloud.org
@@ -1,8 +1,8 @@
-#+date: [2024-09-20 Friday 13:38:52]
-#+title: prometheus grafana: monitoring without paying for the cloud tier
-#+description: Stepwise method for deploying Prometheus with Docker to monitor Linux servers and integrating Grafana Cloud for visualization and analysis of collected metrics.
+#+date:        [2024-09-20 Fri 13:38:52]
+#+title:       Prometheus and Grafana Cloud for Server Monitoring
+#+description: Monitoring Linux servers with Prometheus and visualizing in Grafana Cloud.
 #+slug:        prometheus-grafana-cloud
-#+filetags: :linux:self-hosting:
+#+filetags:    :linux:self-hosting:
 
 This tutorial will guide you through the process of:
 
diff --git a/content/blog/2024-09-23-self-hosting-transmission.org b/content/blog/2024-09-23-self-hosting-transmission.org
index 17ae06f..3bf3393 100644
--- a/content/blog/2024-09-23-self-hosting-transmission.org
+++ b/content/blog/2024-09-23-self-hosting-transmission.org
@@ -1,8 +1,8 @@
-#+date: [2024-09-23 Monday 19:52:20]
-#+title:       self hosting guide: transmission bittorrent client
-#+description: Comprehensive setup instructions for installing and configuring the Transmission BitTorrent client on a Linux server, including securing remote access through Nginx reverse proxy.
+#+date:        [2024-09-23 Mon 19:52:20]
+#+title:       Self-Hosting Guide: Transmission
+#+description: Setting up Transmission on a Linux server with Nginx for remote access.
 #+slug:        self-hosting-transmission
-#+filetags: :linux:self-hosting:
+#+filetags:    :linux:self-hosting:
 
 #+begin_quote
 If you're torrenting anything sensitive, I *highly* recommend you use a VPN.
diff --git a/content/blog/2024-10-31-continue-ollama-code-assistant.org b/content/blog/2024-10-31-continue-ollama-code-assistant.org
index e9b4bf3..6015d24 100644
--- a/content/blog/2024-10-31-continue-ollama-code-assistant.org
+++ b/content/blog/2024-10-31-continue-ollama-code-assistant.org
@@ -1,8 +1,8 @@
-#+date: [2024-10-31 Thursday 11:01:05]
-#+title:       ollama code assistant setup in vs codium
-#+description: Technical overview and configuration guide for incorporating Ollama as a code assistance tool within VS Codium and VS Code editors to enhance development workflows.
+#+date:        [2024-10-31 Thu 11:01:05]
+#+title:       Ollama Code Assistant in VS Codium
+#+description: Setting up Ollama as a local code assistant in VS Codium.
 #+slug:        continue-ollama-code-assistant
-#+filetags: :linux:
+#+filetags:    :linux:
 
 * Background
 
diff --git a/content/blog/2024-12-27-self-hosting-the-lounge.org b/content/blog/2024-12-27-self-hosting-the-lounge.org
index 213a737..cea8cf6 100644
--- a/content/blog/2024-12-27-self-hosting-the-lounge.org
+++ b/content/blog/2024-12-27-self-hosting-the-lounge.org
@@ -1,8 +1,8 @@
-#+date: [2024-12-29 Sun 17:45:00]
-#+title:       self hosting guide: the lounge (irc)
-#+description: Step-by-step instructions for installing and configuring The Lounge IRC web client on Linux systems utilizing Docker Compose to provide persistent and secure chat access.
+#+date:        [2024-12-29 Sun 17:45:00]
+#+title:       Self-Hosting Guide: The Lounge (IRC)
+#+description: How to self-host The Lounge IRC client with Docker Compose.
 #+slug:        self-hosting-the-lounge
-#+filetags: :linux:self-hosting:
+#+filetags:    :linux:self-hosting:
 
 * The Lounge
 
diff --git a/content/blog/2025-01-23-self-hosting-tandoor.org b/content/blog/2025-01-23-self-hosting-tandoor.org
index fecb5cf..e06966d 100644
--- a/content/blog/2025-01-23-self-hosting-tandoor.org
+++ b/content/blog/2025-01-23-self-hosting-tandoor.org
@@ -1,8 +1,8 @@
-#+date: [2025-01-23 Thursday 20:44:45]
-#+title:       self hosting guide: tandoor recipe manager
-#+description: Detailed tutorial on deploying Tandoor, an open-source recipe management application, including installation steps and configuration for self-hosted operation.
+#+date:        [2025-01-23 Thu 20:44:45]
+#+title:       Self-Hosting Guide: Tandoor
+#+description: Self-hosting Tandoor, an open-source recipe manager.
 #+slug:        self-hosting-tandoor
-#+filetags: :linux:self-hosting:
+#+filetags:    :linux:self-hosting:
 
 * Overview
 
diff --git a/content/blog/2025-02-11-obscura-vpn.org b/content/blog/2025-02-11-obscura-vpn.org
index 3a2954d..61823d3 100644
--- a/content/blog/2025-02-11-obscura-vpn.org
+++ b/content/blog/2025-02-11-obscura-vpn.org
@@ -1,8 +1,8 @@
-#+date: [2025-02-11 Tuesday 11:40:00]
-#+title:       obscura vpn: a two party protocol review
-#+description: Analytical review outlining the features, implementation, and security aspects of Obscura VPN's two-party protocol in conjunction with Mullvad VPN.
+#+date:        [2025-02-11 Tue 11:40:00]
+#+title:       Obscura VPN: A Two-Party Protocol Review
+#+description: A review of Obscura VPN and its two-party protocol with Mullvad.
 #+slug:        obscura-vpn
-#+filetags: :security:
+#+filetags:    :security:
 
 #+begin_quote
 This review is written at a high-level for users, not a technical deep-dive of
diff --git a/content/blog/2025-02-24-email-migration.org b/content/blog/2025-02-24-email-migration.org
index 3debca3..91c9e64 100644
--- a/content/blog/2025-02-24-email-migration.org
+++ b/content/blog/2025-02-24-email-migration.org
@@ -1,8 +1,8 @@
-#+date: [2025-02-25 Mon 19:20:05]
-#+title: email migration: 5000+ emails, proton to migadu
-#+description: Detailed instructions describing the process and considerations involved in transferring email data securely from Proton Mail to Migadu email hosting.
+#+date:        [2025-02-25 Mon 19:20:05]
+#+title:       Email Migration: 5,000+ Emails, Proton to Migadu
+#+description: Moving 5,000+ emails from Proton Mail to Migadu.
 #+slug:        email-migration
-#+filetags: :privacy:
+#+filetags:    :privacy:
 
 * The Setup
 
diff --git a/content/blog/2025-04-05-git-mirror.org b/content/blog/2025-04-05-git-mirror.org
index bd4c3d9..374384d 100644
--- a/content/blog/2025-04-05-git-mirror.org
+++ b/content/blog/2025-04-05-git-mirror.org
@@ -1,8 +1,8 @@
-#+date: [2025-04-05 Saturday 23:04:54]
-#+title:       automating github to gitlab repository sync
-#+description: Technical steps for setting up automated synchronization and mirroring of source code repositories from GitHub to GitLab for redundancy and repository management.
+#+date:        [2025-04-05 Sat 23:04:54]
+#+title:       Automating GitHub to GitLab Repository Sync
+#+description: Automatically mirroring GitHub repos to GitLab for redundancy.
 #+slug:        git-mirror
-#+filetags: :self-hosting:
+#+filetags:    :self-hosting:
 
 This is a short post detailing how I maintained repositories on GitHub and
 mirrors on GitLab - including both public and private repositories.
diff --git a/content/blog/2025-05-02-asahi-linux.org b/content/blog/2025-05-02-asahi-linux.org
index dc79eea..46edb14 100644
--- a/content/blog/2025-05-02-asahi-linux.org
+++ b/content/blog/2025-05-02-asahi-linux.org
@@ -1,8 +1,8 @@
-#+date: [2025-05-02 Friday 21:10:00]
-#+title: asahi linux: linux on apple silicon, current state
-#+description: Documented analysis of installation procedure, system performance, and software compatibility for running Asahi Linux on the Apple M2 MacBook Pro 16-inch model.
+#+date:        [2025-05-02 Fri 21:10:00]
+#+title:       Asahi Linux: Linux on Apple Silicon
+#+description: What it's actually like to run Asahi Linux on an Apple M2.
 #+slug:        asahi-linux
-#+filetags: :linux:
+#+filetags:    :linux:
 
 * Trying out Asahi Linux
 
diff --git a/content/blog/2025-05-30-it-audit-career.org b/content/blog/2025-05-30-it-audit-career.org
index c3e94ff..46620ae 100644
--- a/content/blog/2025-05-30-it-audit-career.org
+++ b/content/blog/2025-05-30-it-audit-career.org
@@ -1,8 +1,8 @@
-#+date: [2025-05-30 Friday 10:53:28]
-#+title: it audit career: skills that matter vs. skills that look good
-#+description: Instructional content detailing actionable knowledge areas including artificial intelligence, blockchain, cloud computing, DevOps, and automation relevant for audit professionals.
+#+date:        [2025-05-30 Fri 10:53:28]
+#+title:       IT Audit Career: Skills That Matter
+#+description: What skills actually matter in IT audit vs. what just looks good on paper.
 #+slug:        it-audit-career
-#+filetags: :audit:
+#+filetags:    :audit:
 
 * Introduction
 
diff --git a/content/blog/2025-06-02-private-ios-apps.org b/content/blog/2025-06-02-private-ios-apps.org
index 6bb93f4..0e4e638 100644
--- a/content/blog/2025-06-02-private-ios-apps.org
+++ b/content/blog/2025-06-02-private-ios-apps.org
@@ -1,8 +1,8 @@
-#+date: [2025-06-03 Tue 11:38:40]
-#+title: private ios apps: what i actually use
-#+description: Curated listing of iOS applications prioritized for privacy preservation and data security, targeted at users requiring minimal data exposure.
+#+date:        [2025-06-03 Tue 11:38:40]
+#+title:       Private iOS Apps: What I Actually Use
+#+description: The iOS apps I use that prioritize privacy.
 #+slug:        private-ios-apps
-#+filetags: :linux:privacy:
+#+filetags:    :linux:privacy:
 
 The world is evolving into a privacy nightmare, where our own devices are being
 used by numerous parties to constantly track and report on our activities. This
diff --git a/content/blog/2025-09-04-website-redesign.org b/content/blog/2025-09-04-website-redesign.org
index 82fceac..cf4c71b 100644
--- a/content/blog/2025-09-04-website-redesign.org
+++ b/content/blog/2025-09-04-website-redesign.org
@@ -1,8 +1,8 @@
-#+date: [2025-09-05 Fri 10:21:00]
-#+title: website redesign 2025: what changed
-#+description: Read this post to understand my latest website redesign and the context for the refresh.
+#+date:        [2025-09-05 Fri 10:21:00]
+#+title:       Website Redesign 2025
+#+description: An overview of the 2025 redesign of this site.
 #+slug: human-website-design
-#+filetags: :web:
+#+filetags:    :web:
 
 #+begin_quote
 /Please note that this redesign is a work-in-progress and is not complete. The
diff --git a/content/blog/2025-09-25-minimalist-website-redesign.org b/content/blog/2025-09-25-minimalist-website-redesign.org
index e88f3a8..0f4bccc 100644
--- a/content/blog/2025-09-25-minimalist-website-redesign.org
+++ b/content/blog/2025-09-25-minimalist-website-redesign.org
@@ -1,8 +1,8 @@
-#+date: [2025-09-25 Thu 21:08:00]
-#+title: minimalist site: strip it down
-#+description: This post details a complete redesign of a blog post, stripping away extraneous CSS and HTML elements to prioritize readability and user experience.
+#+date:        [2025-09-25 Thu 21:08:00]
+#+title:       Minimalist Site: Strip It Down
+#+description: A complete redesign stripping away extraneous CSS and HTML for readability.
 #+slug: minimalist-website-redesign
-#+filetags: :web:
+#+filetags:    :web:
 
 I know what you're thinking: "ANOTHER blog post about redesigning the website?"
 
diff --git a/content/blog/2025-10-03-privacy-toolkit.org b/content/blog/2025-10-03-privacy-toolkit.org
index 1160462..a213d0e 100644
--- a/content/blog/2025-10-03-privacy-toolkit.org
+++ b/content/blog/2025-10-03-privacy-toolkit.org
@@ -1,8 +1,8 @@
-#+date: [2025-10-03 Fri 4:23:00]
-#+title: my privacy toolkit
-#+description: Learn about the tools I use to keep my life private and data secure.
+#+date:        [2025-10-03 Fri 4:23:00]
+#+title:       My Privacy Toolkit
+#+description: The tools I use to keep my data private.
 #+slug: privacy-toolkit
-#+filetags: :privacy:
+#+filetags:    :privacy:
 
 * VPN
 
diff --git a/content/blog/2025-10-06-rocket-league-macos.org b/content/blog/2025-10-06-rocket-league-macos.org
index f28cd9a..c22456f 100644
--- a/content/blog/2025-10-06-rocket-league-macos.org
+++ b/content/blog/2025-10-06-rocket-league-macos.org
@@ -1,8 +1,8 @@
-#+date: [2025-10-06 Mon 13:11:00]
-#+title: playing rocket league on macos via crossover
-#+description: Learn how to play Rocket League on macOS via CrossOver.
+#+date:        [2025-10-06 Mon 13:11:00]
+#+title:       Rocket League on macOS via CrossOver
+#+description: Getting Rocket League running on macOS through CrossOver.
 #+slug: rocket-league-macos
-#+filetags: :linux:
+#+filetags:    :linux:
 
 #+caption: Rocket League on macOS
 #+attr_html: :alt The Rocket League launch screen on macOS.
diff --git a/content/blog/2025-10-24-digital-garden.org b/content/blog/2025-10-24-digital-garden.org
index 6894f48..6f5a1b1 100644
--- a/content/blog/2025-10-24-digital-garden.org
+++ b/content/blog/2025-10-24-digital-garden.org
@@ -1,8 +1,8 @@
-#+date: [2025-10-24 Fri 19:41:41]
-#+title: digital garden
-#+description: A post dedicated to digital gardens, an online space for personal knowledge management, creative exploration, and reflection.
+#+date:        [2025-10-24 Fri 19:41:41]
+#+title:       Digital Garden
+#+description: What a digital garden is and how I think about mine.
 #+slug: digital-garden
-#+filetags: :web:
+#+filetags:    :web:
 
 * What's a Digital Garden?
 
diff --git a/content/blog/2025-11-02-aerc-macos.org b/content/blog/2025-11-02-aerc-macos.org
index 5c5bdd3..320f7a9 100644
--- a/content/blog/2025-11-02-aerc-macos.org
+++ b/content/blog/2025-11-02-aerc-macos.org
@@ -1,8 +1,8 @@
-#+date: [2025-11-02 Sun 10:07:14]
-#+title: using aerc on macos
-#+description: Learn how I use aerc, a TUI email client, on macOS.
+#+date:        [2025-11-02 Sun 10:07:14]
+#+title:       Using aerc on macOS
+#+description: How I use aerc, a TUI email client, on macOS.
 #+slug: aerc-macos
-#+filetags: :linux:
+#+filetags:    :linux:
 
 #+caption: aerc-mail
 #+attr_html: :alt An image of aerc with an email opened in the reader window.
diff --git a/content/blog/2025-11-13-wcag.org b/content/blog/2025-11-13-wcag.org
index e21bfb5..cf77004 100644
--- a/content/blog/2025-11-13-wcag.org
+++ b/content/blog/2025-11-13-wcag.org
@@ -1,8 +1,8 @@
-#+date: [2025-11-14 Fri 19:46:30]
-#+title: wcag compliance: accessibility as a real constraint, not a checkbox
-#+description: Read on to learn more about how I've ensured my humble site is compliant with WCAG 2.
+#+date:        [2025-11-14 Fri 19:46:30]
+#+title:       WCAG Compliance: Accessibility as a Real Constraint
+#+description: How I've made this site compliant with WCAG 2.
 #+slug: wcag
-#+filetags: :audit:web:
+#+filetags:    :audit:web:
 
 * WCAG 2
 
diff --git a/content/blog/2025-11-23-it-audit-ai.org b/content/blog/2025-11-23-it-audit-ai.org
index e73b030..59626e5 100644
--- a/content/blog/2025-11-23-it-audit-ai.org
+++ b/content/blog/2025-11-23-it-audit-ai.org
@@ -1,8 +1,8 @@
-#+date: [2025-11-23 17:43:57]
-#+title: it audit ai: where it helps and where it's theater
-#+description: Learn how I'm currently using AI in my role in Technology Assurance (i.e., IT Audit) at KPMG.
+#+date:        [2025-11-23 Sun 17:43:57]
+#+title:       IT Audit and AI: Where It Helps and Where It's Theater
+#+description: How I'm currently using AI in my Technology Assurance role at KPMG.
 #+slug: it-audit-ai
-#+filetags: :audit:
+#+filetags:    :audit:
 
 * My AI Toolkit
 
diff --git a/content/blog/2025-12-06-self-hosting-tor.org b/content/blog/2025-12-06-self-hosting-tor.org
index ee95cf5..893d40b 100644
--- a/content/blog/2025-12-06-self-hosting-tor.org
+++ b/content/blog/2025-12-06-self-hosting-tor.org
@@ -1,8 +1,8 @@
-#+date: [2025-12-06 Sat 14:13:00]
-#+title: self hosting guide: tor websites
-#+description: Learn how to host your own website on Tor with an Onion Address in a few short steps!
+#+date:        [2025-12-06 Sat 14:13:00]
+#+title:       Self-Hosting Guide: Tor Websites
+#+description: How to host a website on Tor with an onion address.
 #+slug: self-hosting-tor
-#+filetags: :linux:self-hosting:
+#+filetags:    :linux:self-hosting:
 
 * Installation
 
diff --git a/content/blog/2025-12-20-self-hosting-home-assistant.org b/content/blog/2025-12-20-self-hosting-home-assistant.org
index 03aaef8..88f19b9 100644
--- a/content/blog/2025-12-20-self-hosting-home-assistant.org
+++ b/content/blog/2025-12-20-self-hosting-home-assistant.org
@@ -1,8 +1,8 @@
-#+date: [2025-12-20 Sat 20:27:08]
-#+title: self hosting guide: home assistant
-#+description: A guide to configuring and customizing Home Assistant.
+#+date:        [2025-12-20 Sat 20:27:08]
+#+title:       Self-Hosting Guide: Home Assistant
+#+description: Configuring and customizing Home Assistant.
 #+slug: self-hosting-home-assistant
-#+filetags: :linux:self-hosting:
+#+filetags:    :linux:self-hosting:
 
 * Overview
 
diff --git a/content/blog/2026-01-31-emacs-carnival-2026-01-this-year-i-will.org b/content/blog/2026-01-31-emacs-carnival-2026-01-this-year-i-will.org
index 44c7256..16650af 100644
--- a/content/blog/2026-01-31-emacs-carnival-2026-01-this-year-i-will.org
+++ b/content/blog/2026-01-31-emacs-carnival-2026-01-this-year-i-will.org
@@ -1,8 +1,8 @@
-#+date: [2026-01-31 Sat 20:32:11]
-#+title: emacs carnival: “this year, i will...”
-#+description: My response to the Emacs Carnival post for January 2026.
+#+date:        [2026-01-31 Sat 20:32:11]
+#+title:       Emacs Carnival: This Year, I Will...
+#+description: My response to the Emacs Carnival prompt for January 2026.
 #+slug: emacs-carnival-2026-01-this-year-i-will
-#+filetags: :emacs:personal:
+#+filetags:    :emacs:personal:
 
 This year in Emacs, I expect to do a lot. However, here are some actionable
 goals for myself that should have a positive impact as I start out 2026.
diff --git a/content/blog/2026-02-02-emacs-carnival-2026-02-completion.org b/content/blog/2026-02-02-emacs-carnival-2026-02-completion.org
index d45c82c..8f38cfa 100644
--- a/content/blog/2026-02-02-emacs-carnival-2026-02-completion.org
+++ b/content/blog/2026-02-02-emacs-carnival-2026-02-completion.org
@@ -1,8 +1,8 @@
-#+date: [2026-02-02 18:40:21]
-#+title: emacs carnival: "completion"
-#+description: My response to the Emacs Carnival post for February 2026.
+#+date:        [2026-02-02 Mon 18:40:21]
+#+title:       Emacs Carnival: Completion
+#+description: My response to the Emacs Carnival prompt for February 2026.
 #+slug: emacs-carnival-2026-02-completion
-#+filetags: :emacs:personal:
+#+filetags:    :emacs:personal:
 
 I'm having a great time with the Emacs Carnival, as it has inspired me to write
 two posts in such a short time. It's been a much needed inspiration to write
diff --git a/content/blog/2026-02-07-indieweb-carnival-2026-02-intersecting-interests.org b/content/blog/2026-02-07-indieweb-carnival-2026-02-intersecting-interests.org
index 9f4c0a4..059dc51 100644
--- a/content/blog/2026-02-07-indieweb-carnival-2026-02-intersecting-interests.org
+++ b/content/blog/2026-02-07-indieweb-carnival-2026-02-intersecting-interests.org
@@ -1,8 +1,8 @@
-#+date: [2026-02-07 Sat 17:46:00]
-#+title: indieweb carnival: "intersecting interests"
-#+description: Contrasting my passions with technology vs. natural hobbies.
+#+date:        [2026-02-07 Sat 17:46:00]
+#+title:       IndieWeb Carnival: Intersecting Interests
+#+description: Contrasting my passion for technology with my interest in natural hobbies.
 #+slug: indiweb-carnival-2026-02-intersecting-interests
-#+filetags: :personal:web:
+#+filetags:    :personal:web:
 
 I thought about this topic for a long time today before starting to write this
 post, as I don't think of myself as someone with intersecting interests. I
diff --git a/content/blog/2026-02-08-gnu-stow.org b/content/blog/2026-02-08-gnu-stow.org
index 2e6f203..0e9fccf 100644
--- a/content/blog/2026-02-08-gnu-stow.org
+++ b/content/blog/2026-02-08-gnu-stow.org
@@ -1,8 +1,8 @@
-#+date: [2026-02-08 Sun 12:17:42]
-#+title: managing my dotfiles with gnu stow and git
-#+description: Learn how I use GNU Stow to manage my user dotfiles and configurations.
+#+date:        [2026-02-08 Sun 12:17:42]
+#+title:       Managing Dotfiles with GNU Stow and Git
+#+description: How I use GNU Stow to manage my dotfiles and configs across machines.
 #+slug: gnu-stow
-#+filetags: :emacs:linux:
+#+filetags:    :emacs:linux:
 
 * What is GNU Stow?
 
diff --git a/content/blog/2026-02-12-automating-weblorg-deployments.org b/content/blog/2026-02-12-automating-weblorg-deployments.org
index 3735a24..9cb34cb 100644
--- a/content/blog/2026-02-12-automating-weblorg-deployments.org
+++ b/content/blog/2026-02-12-automating-weblorg-deployments.org
@@ -1,8 +1,8 @@
-#+date: [2026-02-12 Thu 20:26:32]
-#+title: weblorg deployments: automated, no github actions dependency
-#+description: Learn how I've automated all deployment for my org-mode blog with GitHub Actions and a custom Docker image.
+#+date:        [2026-02-12 Thu 20:26:32]
+#+title:       Automating weblorg Deployments
+#+description: How I automated deployment for this org-mode blog without GitHub Actions.
 #+slug: automating-weblorg-deployments
-#+filetags: :self-hosting:web:
+#+filetags:    :self-hosting:web:
 
 As I've mentioned in previous posts, I utilize a unique pipeline to draft posts,
 compose my website, and to build and deploy the static files.
diff --git a/content/blog/2026-02-21-auditing-aws-iam.org b/content/blog/2026-02-21-auditing-aws-iam.org
index f26f819..ddcb563 100644
--- a/content/blog/2026-02-21-auditing-aws-iam.org
+++ b/content/blog/2026-02-21-auditing-aws-iam.org
@@ -1,8 +1,8 @@
-#+date: [2026-02-21 Sat 18:58:39]
-#+title: auditing aws iam users
-#+description: Learn how to audit IAM user assignments in AWS.
+#+date:        [2026-02-21 Sat 18:58:39]
+#+title:       Auditing AWS IAM Users
+#+description: How to audit IAM user assignments in AWS.
 #+slug: auditing-aws-iam
-#+filetags: :audit:
+#+filetags:    :audit:
 
 If you've ever asked an IT team for a list of who has access to an AWS account,
 you've probably received a spreadsheet that was already out of date. Or worse,
diff --git a/content/blog/2026-02-21-auditing-aws-passwords.org b/content/blog/2026-02-21-auditing-aws-passwords.org
index c6e9cca..734dc9c 100644
--- a/content/blog/2026-02-21-auditing-aws-passwords.org
+++ b/content/blog/2026-02-21-auditing-aws-passwords.org
@@ -1,8 +1,8 @@
-#+date: [2026-02-21 Sat 21:13:45]
-#+title: auditing aws passwords
-#+description: Learn how to audit passwords in AWS.
+#+date:        [2026-02-21 Sat 21:13:45]
+#+title:       Auditing AWS Passwords
+#+description: How to audit password policies and usage in AWS.
 #+slug: auditing-aws-passwords
-#+filetags: :audit:
+#+filetags:    :audit:
 
 One of the first controls an IT Auditor learns is how to audit passwords in any
 number of IT systems. However, things have changed with the introduction of
diff --git a/content/blog/2026-03-03-auditing-aws-s3.org b/content/blog/2026-03-03-auditing-aws-s3.org
index 9108f91..553878b 100644
--- a/content/blog/2026-03-03-auditing-aws-s3.org
+++ b/content/blog/2026-03-03-auditing-aws-s3.org
@@ -1,8 +1,8 @@
-#+date: [2026-03-03 Tue 18:50:23]
-#+title: auditing aws s3 buckets
-#+description: Learn how to audit AWS S3 buckets for public access.
+#+date:        [2026-03-03 Tue 18:50:23]
+#+title:       Auditing AWS S3 Buckets
+#+description: How to audit AWS S3 buckets for public access and misconfigurations.
 #+slug: auditing-aws-s3
-#+filetags: :audit:
+#+filetags:    :audit:
 
 This is the latest in my series of posts on auditing AWS, a cloud platform that
 has existed for around two decades but can still be a mystery to auditors who
@@ -79,7 +79,7 @@ The reverse is also true. A bucket with no public policy and no public ACLs is
 still at risk if PAB is missing or incomplete, because nothing is in place to
 prevent a future policy or ACL change from exposing it.
 
-M* What the Script Does
+* What the Script Does
 
 The script lists every bucket in the account, determines each bucket's region,
 runs all three checks against it, and appends the results to a CSV file.
diff --git a/content/guides/index.org b/content/guides/index.org
index e2911a6..475d278 100644
--- a/content/guides/index.org
+++ b/content/guides/index.org
@@ -1,4 +1,4 @@
-#+title: guides
+#+title: Guides
 #+slug: index
 #+options: toc:nil
 
diff --git a/content/salary/index.org b/content/salary/index.org
index 046605b..4e875b8 100644
--- a/content/salary/index.org
+++ b/content/salary/index.org
@@ -1,4 +1,4 @@
-#+title: salary
+#+title: Salary
 #+slug: index
 #+options: toc:nil
 
diff --git a/screenshots/dark.png b/screenshots/dark.png
deleted file mode 100644
index a79846d..0000000
Binary files a/screenshots/dark.png and /dev/null differ
diff --git a/screenshots/light.png b/screenshots/light.png
deleted file mode 100644
index a5ffb1f..0000000
Binary files a/screenshots/light.png and /dev/null differ
diff --git a/tag_preview.py b/tag_preview.py
deleted file mode 100644
index d3e28c7..0000000
--- a/tag_preview.py
+++ /dev/null
@@ -1,177 +0,0 @@
-#!/usr/bin/env python3
-"""
-Preview tag assignments for all blog posts.
-Run with --write to actually add #+filetags to org files.
-"""
-import re
-import sys
-from pathlib import Path
-
-CONTENT_DIR = Path("./content/blog")
-
-# Explicit overrides take priority over rules
-OVERRIDES = {
-    "2018-11-28-cpp-compiler":                          ["linux"],
-    "2019-12-16-password-security":                     ["security"],
-    "2020-07-26-business-analysis":                     ["audit"],
-    "2020-08-22-redirect-github-pages":                 ["web"],
-    "2020-09-22-internal-audit":                        ["audit"],
-    "2020-12-28-neon-drive":                            ["personal"],
-    "2020-12-29-zork":                                  ["personal"],
-    "2021-08-25-audit-sampling":                        ["audit"],
-    "2021-12-04-cisa":                                  ["audit"],
-    "2023-05-22-burnout":                               ["personal"],
-    "2023-06-20-audit-review-template":                 ["audit"],
-    "2023-08-18-agile-auditing":                        ["audit"],
-    "2025-05-30-it-audit-career":                       ["audit"],
-    "2025-11-13-wcag":                                  ["audit", "web"],
-    "2025-11-23-it-audit-ai":                           ["audit"],
-    "2026-02-21-auditing-aws-iam":                      ["audit"],
-    "2026-02-21-auditing-aws-passwords":                ["audit"],
-    "2026-03-03-auditing-aws-s3":                       ["audit"],
-    "2020-09-01-visual-recognition":                    ["linux"],
-    "2024-01-26-audit-dashboard":                       ["audit"],
-    "2023-09-19-audit-sql-scripts":                     ["audit"],
-    "2021-04-28-photography":                           ["personal"],
-    "2022-06-22-daily-poetry":                          ["personal"],
-    "2020-09-25-happiness-map":                         ["personal"],
-    "2022-03-03-financial-database":                    ["self-hosting"],
-    "2023-01-03-recent-website-changes":                ["personal", "web"],
-    "2025-09-25-minimalist-website-redesign":           ["web"],
-    "2026-02-07-indieweb-carnival-2026-02-intersecting-interests": ["personal", "web"],
-}
-
-TAG_RULES = {
-    "audit": [
-        "audit", "cisa", "ansoff",
-    ],
-    "emacs": [
-        "emacs", "org-mode", "org-blog", "mu4e", "doom-emacs",
-        "emacs-carnival", "gnu-stow",
-    ],
-    "linux": [
-        "linux", "ubuntu", "debian", "fedora", "alpine",
-        "customizing-ubuntu", "linux-software", "linux-display",
-        "mtp-linux", "serenity-os", "fedora-i3", "fedora-login",
-        "flatpak", "zfs", "ubuntu-emergency", "ubuntu-on-macos",
-        "steam-on-ntfs", "bash-it", "byobu", "scli",
-        "terminal-lifestyle", "curseradio", "st", "flac-to-opus",
-        "pinetime", "server-build", "macos", "macos-customization",
-        "deprecated-trusted-gpg", "exiftool", "graphene",
-        "asahi", "aerc", "rocket-league",
-    ],
-    "self-hosting": [
-        "self-hosting", "homelab", "vps-web-server", "git-server",
-        "plex", "nextcloud", "wireguard", "backblaze", "syncthing",
-        "docker", "n8n", "prometheus-grafana", "transmission",
-        "goaccess", "unifi", "git-mirror", "automating-weblorg",
-    ],
-    "security": [
-        "aes-encryption", "cryptography", "gnupg", "password",
-        "server-hardening", "ssh-mfa", "ufw", "hardening",
-        "authelia", "wireguard", "njalla-dns", "cloudflare-dns",
-        "ditching-cloudflare", "obscura-vpn",
-    ],
-    "privacy": [
-        "privacy", "graphene-os", "session-messenger", "fediverse",
-        "digital-minimalism", "privacy-com", "local-llm",
-        "email-migration", "dont-say-hello",
-    ],
-    "web": [
-        "nginx", "apache", "php", "css", "redirect", "website-redesign",
-        "gemini", "indieweb", "weblorg", "html", "digital-garden",
-        "tableau",
-    ],
-    "personal": [
-        "mediocrity", "burnout", "tuesday", "leaving-the-office",
-        "vaporwave", "video-game-sales", "reliable-notes",
-        "mass-unlike-tumblr", "changing-git-authors", "delete-gitlab",
-        "clone-github", "this-year-i-will", "completion",
-        "seum", "neon-drive", "zork",
-    ],
-}
-
-def assign_tags(slug: str, title: str) -> list[str]:
-    if slug in OVERRIDES:
-        return OVERRIDES[slug]
-    slug_lower = slug.lower()
-    title_lower = title.lower()
-    tags = []
-    for tag, patterns in TAG_RULES.items():
-        for pattern in patterns:
-            if pattern in slug_lower or pattern in title_lower:
-                if tag not in tags:
-                    tags.append(tag)
-                break
-    return sorted(tags)
-
-def get_title(path: Path) -> str:
-    title_pat = re.compile(r"^#\+title:\s*(.+)$", re.IGNORECASE)
-    with path.open("r", encoding="utf-8") as f:
-        for line in f:
-            m = title_pat.match(line)
-            if m:
-                return m.group(1).strip()
-    return path.stem
-
-def has_filetags(path: Path) -> bool:
-    with path.open("r", encoding="utf-8") as f:
-        for line in f:
-            if re.match(r"^#\+filetags:", line, re.IGNORECASE):
-                return True
-    return False
-
-def write_filetags(path: Path, tags: list[str]):
-    tag_str = ":" + ":".join(tags) + ":"
-    content = path.read_text(encoding="utf-8")
-    slug_pat = re.compile(r"(#\+slug:\s*.+\n)", re.IGNORECASE)
-    m = slug_pat.search(content)
-    if m:
-        insert_at = m.end()
-        new_content = content[:insert_at] + f"#+filetags: {tag_str}\n" + content[insert_at:]
-        path.write_text(new_content, encoding="utf-8")
-        return True
-    return False
-
-write_mode = "--write" in sys.argv
-
-untagged = []
-rows = []
-for org_path in sorted(CONTENT_DIR.glob("*.org")):
-    slug = org_path.stem
-    title = get_title(org_path)
-    tags = assign_tags(slug, title)
-    if not tags:
-        untagged.append((slug, title))
-    rows.append((slug, title, tags))
-
-print(f"{'SLUG':<50} {'TAGS'}")
-print("-" * 85)
-for slug, title, tags in rows:
-    tag_str = ", ".join(tags) if tags else "-- UNTAGGED --"
-    print(f"{slug:<50} {tag_str}")
-
-print(f"\nTotal: {len(rows)} posts | Untagged: {len(untagged)}")
-if untagged:
-    print("\nUntagged posts:")
-    for slug, title in untagged:
-        print(f"  {slug}")
-
-if write_mode:
-    written = 0
-    skipped = 0
-    for org_path in sorted(CONTENT_DIR.glob("*.org")):
-        slug = org_path.stem
-        title = get_title(org_path)
-        tags = assign_tags(slug, title)
-        if not tags:
-            skipped += 1
-            continue
-        if has_filetags(org_path):
-            skipped += 1
-            continue
-        if write_filetags(org_path, tags):
-            written += 1
-    print(f"\nWrote filetags to {written} files, skipped {skipped}.")
-else:
-    print("\nRun with --write to apply filetags to org files.")
diff --git a/theme/static/favicon.svg b/theme/static/favicon.svg
deleted file mode 100644
index b6a89f2..0000000
--- a/theme/static/favicon.svg
+++ /dev/null
@@ -1,14 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1500 1499.999933">
-  <style>
-    path { fill: #111111; }
-    @media (prefers-color-scheme: dark) { path { fill: #ffffff; } }
-  </style>
-  <defs>
-    <clipPath id="c">
-      <path d="M 246.484375 243.425781 L 1253.730469 243.425781 L 1253.730469 1256.457031 L 246.484375 1256.457031 Z" clip-rule="nonzero"/>
-    </clipPath>
-  </defs>
-  <g clip-path="url(#c)">
-    <path fill-rule="nonzero" d="M 562.695312 907.28125 C 514.085938 881.21875 396.300781 818.089844 368.757812 795.410156 C 351.777344 781.4375 345.167969 771.671875 345.152344 765.117188 C 345.152344 762.648438 346.535156 760.578125 348.84375 758.890625 C 352.042969 756.558594 356.808594 754.898438 362.398438 753.796875 C 381.738281 750.015625 408.554688 753.210938 419.015625 759.636719 C 433.589844 783.507812 445.734375 801.542969 451.113281 804.4375 C 442.617188 780.46875 429.820312 749.761719 426.273438 724.375 C 422.824219 699.628906 421.839844 674.320312 423.527344 648.550781 C 424.203125 638.359375 425.214844 628.765625 426.183594 619.714844 C 431 574.277344 434.464844 541.792969 390.460938 495.28125 C 384.738281 489.226562 377.890625 482.316406 370.613281 474.960938 C 321.140625 424.960938 250.707031 353.765625 261.152344 267.800781 C 315.074219 306.644531 342.925781 327.1875 407.71875 334.761719 C 431.320312 337.511719 456.527344 336.820312 478.058594 329.164062 C 516.382812 315.507812 544.5625 284.574219 556.761719 269.183594 C 585.796875 331.273438 570.703125 413.90625 557.585938 485.699219 C 555.382812 497.800781 553.21875 509.597656 551.347656 520.890625 L 550.988281 518.554688 C 548.242188 492 533.292969 467.066406 523.683594 458.480469 C 543.953125 487.382812 544.246094 547.246094 546.410156 585.914062 C 548.929688 630.609375 564.742188 669.382812 589.390625 702.851562 C 598.3125 714.96875 608.402344 726.378906 619.417969 737.101562 C 631.074219 748.449219 648.730469 762.6875 668.375 775.730469 C 694.527344 793.078125 719.457031 807.15625 744.265625 818.808594 C 813.890625 851.503906 901.886719 873.054688 977.726562 889.058594 C 1010.898438 896.054688 1096.996094 920.363281 1158.511719 953.554688 C 1194.910156 973.207031 1222.335938 995.527344 1223.371094 1018.152344 C 1224.523438 1043.605469 1204.757812 1067.1875 1177.46875 1086.679688 C 1137.429688 1115.277344 1081.878906 1134.636719 1050.003906 1139.148438 C 1031.6875 1141.75 1013.195312 1143.371094 994.636719 1144.058594 C 982.558594 1144.5 970.476562 1144.539062 958.371094 1144.191406 C 968.617188 1130.5 979.1875 1114.320312 979.929688 1104.875 C 941.871094 1141.261719 909.90625 1170.003906 864.242188 1199.265625 C 825.28125 1224.238281 781.023438 1245.164062 744.679688 1242.683594 C 727.714844 1241.515625 717.398438 1236.394531 712.25 1228.964844 C 708.503906 1223.5625 707.335938 1216.6875 708.210938 1209.125 C 709.167969 1200.882812 712.5 1191.832031 717.585938 1182.796875 C 731.828125 1157.542969 759.238281 1133.378906 786.851562 1127.394531 C 807.09375 1134.054688 858.996094 1138.113281 869.710938 1127.019531 C 850.992188 1126.398438 825.226562 1126.160156 785.628906 1112.675781 C 726.160156 1092.4375 669.730469 1062.9375 619.5 1025.476562 C 570.769531 989.117188 527.917969 945.246094 493.855469 895.03125 C 490.457031 890.042969 487.257812 885.117188 484.230469 880.289062 C 512.519531 895.828125 553.472656 909.324219 562.695312 907.28125 Z M 849.492188 843.15625 C 822.199219 835.515625 746.46875 809.984375 712.699219 787.941406 C 727.59375 784.449219 741.570312 775.574219 755.640625 766.617188 C 778.648438 751.992188 801.984375 737.167969 827.550781 750.769531 C 865.59375 771.007812 855.625 821.660156 849.492188 843.15625 Z M 1187.714844 1095.996094 C 1193.289062 1108.085938 1206.632812 1127.722656 1213.546875 1132.421875 C 1206.738281 1121.804688 1197.832031 1107.753906 1195.359375 1090.117188 C 1220.78125 1069.574219 1238.171875 1044.957031 1236.910156 1017.554688 C 1236.273438 1003.515625 1228.519531 990.085938 1215.964844 977.492188 C 1227.179688 964.300781 1238.597656 955.117188 1253.757812 947.238281 C 1236.328125 950.964844 1222.746094 958.582031 1210.03125 971.890625 C 1197.898438 961.117188 1182.367188 950.980469 1165.015625 941.609375 C 1102.1875 907.703125 1014.351562 882.890625 980.527344 875.761719 C 940.914062 867.402344 901.410156 858.167969 862.488281 846.980469 C 869.40625 822.773438 880.914062 763.816406 833.9375 738.800781 C 801.347656 721.457031 774.664062 738.429688 748.339844 755.164062 C 714.078125 776.953125 704.867188 785.246094 675.054688 764.835938 C 645.808594 744.8125 620.042969 721.589844 600.316406 694.808594 C 569.453125 652.917969 553.351562 602.132812 561.96875 541.046875 C 564.328125 524.25 567.570312 506.546875 570.925781 488.140625 C 585.132812 410.402344 601.589844 320.296875 563.734375 253.046875 L 558.328125 243.4375 L 552.183594 252.632812 C 552.089844 252.765625 521.253906 299.34375 473.464844 316.371094 C 454.113281 323.269531 431.039062 323.839844 409.285156 321.292969 C 344.542969 313.730469 305.648438 285.066406 251.222656 245.695312 L 249.367188 255.355469 C 230.609375 352.796875 307.546875 430.535156 360.976562 484.542969 C 367.878906 491.511719 374.386719 498.078125 380.570312 504.636719 C 420.316406 546.636719 417.140625 576.492188 412.707031 618.253906 C 411.726562 627.359375 410.703125 637.019531 410.011719 647.636719 C 408.25 674.414062 409.269531 700.664062 412.839844 726.246094 C 413.664062 732.140625 414.621094 738.003906 415.707031 743.84375 C 400.136719 739 377.105469 737.089844 359.808594 740.472656 C 352.363281 741.933594 345.738281 744.363281 340.839844 747.929688 C 335.050781 752.152344 331.585938 757.804688 331.585938 765.128906 C 331.613281 775.546875 339.617188 789.015625 360.15625 805.921875 C 375.710938 818.742188 417.804688 843.34375 460.855469 867.351562 C 464.039062 873.097656 467.453125 878.921875 471.089844 884.828125 C 474.886719 890.996094 478.734375 896.941406 482.613281 902.675781 C 517.539062 954.148438 561.460938 999.121094 611.414062 1036.371094 C 658.433594 1071.457031 710.828125 1099.710938 766.101562 1120.132812 C 741.265625 1131.347656 718.578125 1153.363281 705.757812 1176.121094 C 699.824219 1186.632812 695.921875 1197.433594 694.738281 1207.558594 C 693.503906 1218.375 695.347656 1228.417969 701.085938 1236.699219 C 708.519531 1247.433594 722.175781 1254.761719 743.75 1256.234375 C 810.464844 1260.796875 899.523438 1194.117188 943.382812 1157.15625 C 960.628906 1158.085938 977.910156 1158.246094 995.15625 1157.621094 C 1014.125 1156.917969 1033.054688 1155.246094 1051.890625 1152.578125 C 1095.21875 1146.4375 1152.65625 1121.753906 1187.714844 1095.996094"/>
-  </g>
-</svg>
\ No newline at end of file
diff --git a/theme/static/koi-hr.svg b/theme/static/koi-hr.svg
deleted file mode 100644
index 1062b04..0000000
--- a/theme/static/koi-hr.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1500 1500">
-  <style>
-    path { fill: #111111; }
-    @media (prefers-color-scheme: dark) { path { fill: #F0EDE8; } }
-  </style>
-  <path fill-rule="nonzero" d="M 562.695312 907.28125 C 514.085938 881.21875 396.300781 818.089844 368.757812 795.410156 C 351.777344 781.4375 345.167969 771.671875 345.152344 765.117188 C 345.152344 762.648438 346.535156 760.578125 348.84375 758.890625 C 352.042969 756.558594 356.808594 754.898438 362.398438 753.796875 C 381.738281 750.015625 408.554688 753.210938 419.015625 759.636719 C 433.589844 783.507812 445.734375 801.542969 451.113281 804.4375 C 442.617188 780.46875 429.820312 749.761719 426.273438 724.375 C 422.824219 699.628906 421.839844 674.320312 423.527344 648.550781 C 424.203125 638.359375 425.214844 628.765625 426.183594 619.714844 C 431 574.277344 434.464844 541.792969 390.460938 495.28125 C 384.738281 489.226562 377.890625 482.316406 370.613281 474.960938 C 321.140625 424.960938 250.707031 353.765625 261.152344 267.800781 C 315.074219 306.644531 342.925781 327.1875 407.71875 334.761719 C 431.320312 337.511719 456.527344 336.820312 478.058594 329.164062 C 516.382812 315.507812 544.5625 284.574219 556.761719 269.183594 C 585.796875 331.273438 570.703125 413.90625 557.585938 485.699219 C 555.382812 497.800781 553.21875 509.597656 551.347656 520.890625 L 550.988281 518.554688 C 548.242188 492 533.292969 467.066406 523.683594 458.480469 C 543.953125 487.382812 544.246094 547.246094 546.410156 585.914062 C 548.929688 630.609375 564.742188 669.382812 589.390625 702.851562 C 598.3125 714.96875 608.402344 726.378906 619.417969 737.101562 C 631.074219 748.449219 648.730469 762.6875 668.375 775.730469 C 694.527344 793.078125 719.457031 807.15625 744.265625 818.808594 C 813.890625 851.503906 901.886719 873.054688 977.726562 889.058594 C 1010.898438 896.054688 1096.996094 920.363281 1158.511719 953.554688 C 1194.910156 973.207031 1222.335938 995.527344 1223.371094 1018.152344 C 1224.523438 1043.605469 1204.757812 1067.1875 1177.46875 1086.679688 C 1137.429688 1115.277344 1081.878906 1134.636719 1050.003906 1139.148438 C 1031.6875 1141.75 1013.195312 1143.371094 994.636719 1144.058594 C 982.558594 1144.5 970.476562 1144.539062 958.371094 1144.191406 C 968.617188 1130.5 979.1875 1114.320312 979.929688 1104.875 C 941.871094 1141.261719 909.90625 1170.003906 864.242188 1199.265625 C 825.28125 1224.238281 781.023438 1245.164062 744.679688 1242.683594 C 727.714844 1241.515625 717.398438 1236.394531 712.25 1228.964844 C 708.503906 1223.5625 707.335938 1216.6875 708.210938 1209.125 C 709.167969 1200.882812 712.5 1191.832031 717.585938 1182.796875 C 731.828125 1157.542969 759.238281 1133.378906 786.851562 1127.394531 C 807.09375 1134.054688 858.996094 1138.113281 869.710938 1127.019531 C 850.992188 1126.398438 825.226562 1126.160156 785.628906 1112.675781 C 726.160156 1092.4375 669.730469 1062.9375 619.5 1025.476562 C 570.769531 989.117188 527.917969 945.246094 493.855469 895.03125 C 490.457031 890.042969 487.257812 885.117188 484.230469 880.289062 C 512.519531 895.828125 553.472656 909.324219 562.695312 907.28125 Z M 849.492188 843.15625 C 822.199219 835.515625 746.46875 809.984375 712.699219 787.941406 C 727.59375 784.449219 741.570312 775.574219 755.640625 766.617188 C 778.648438 751.992188 801.984375 737.167969 827.550781 750.769531 C 865.59375 771.007812 855.625 821.660156 849.492188 843.15625 Z M 1187.714844 1095.996094 C 1193.289062 1108.085938 1206.632812 1127.722656 1213.546875 1132.421875 C 1206.738281 1121.804688 1197.832031 1107.753906 1195.359375 1090.117188 C 1220.78125 1069.574219 1238.171875 1044.957031 1236.910156 1017.554688 C 1236.273438 1003.515625 1228.519531 990.085938 1215.964844 977.492188 C 1227.179688 964.300781 1238.597656 955.117188 1253.757812 947.238281 C 1236.328125 950.964844 1222.746094 958.582031 1210.03125 971.890625 C 1197.898438 961.117188 1182.367188 950.980469 1165.015625 941.609375 C 1102.1875 907.703125 1014.351562 882.890625 980.527344 875.761719 C 940.914062 867.402344 901.410156 858.167969 862.488281 846.980469 C 869.40625 822.773438 880.914062 763.816406 833.9375 738.800781 C 801.347656 721.457031 774.664062 738.429688 748.339844 755.164062 C 714.078125 776.953125 704.867188 785.246094 675.054688 764.835938 C 645.808594 744.8125 620.042969 721.589844 600.316406 694.808594 C 569.453125 652.917969 553.351562 602.132812 561.96875 541.046875 C 564.328125 524.25 567.570312 506.546875 570.925781 488.140625 C 585.132812 410.402344 601.589844 320.296875 563.734375 253.046875 L 558.328125 243.4375 L 552.183594 252.632812 C 552.089844 252.765625 521.253906 299.34375 473.464844 316.371094 C 454.113281 323.269531 431.039062 323.839844 409.285156 321.292969 C 344.542969 313.730469 305.648438 285.066406 251.222656 245.695312 L 249.367188 255.355469 C 230.609375 352.796875 307.546875 430.535156 360.976562 484.542969 C 367.878906 491.511719 374.386719 498.078125 380.570312 504.636719 C 420.316406 546.636719 417.140625 576.492188 412.707031 618.253906 C 411.726562 627.359375 410.703125 637.019531 410.011719 647.636719 C 408.25 674.414062 409.269531 700.664062 412.839844 726.246094 C 413.664062 732.140625 414.621094 738.003906 415.707031 743.84375 C 400.136719 739 377.105469 737.089844 359.808594 740.472656 C 352.363281 741.933594 345.738281 744.363281 340.839844 747.929688 C 335.050781 752.152344 331.585938 757.804688 331.585938 765.128906 C 331.613281 775.546875 339.617188 789.015625 360.15625 805.921875 C 375.710938 818.742188 417.804688 843.34375 460.855469 867.351562 C 464.039062 873.097656 467.453125 878.921875 471.089844 884.828125 C 474.886719 890.996094 478.734375 896.941406 482.613281 902.675781 C 517.539062 954.148438 561.460938 999.121094 611.414062 1036.371094 C 658.433594 1071.457031 710.828125 1099.710938 766.101562 1120.132812 C 741.265625 1131.347656 718.578125 1153.363281 705.757812 1176.121094 C 699.824219 1186.632812 695.921875 1197.433594 694.738281 1207.558594 C 693.503906 1218.375 695.347656 1228.417969 701.085938 1236.699219 C 708.519531 1247.433594 722.175781 1254.761719 743.75 1256.234375 C 810.464844 1260.796875 899.523438 1194.117188 943.382812 1157.15625 C 960.628906 1158.085938 977.910156 1158.246094 995.15625 1157.621094 C 1014.125 1156.917969 1033.054688 1155.246094 1051.890625 1152.578125 C 1095.21875 1146.4375 1152.65625 1121.753906 1187.714844 1095.996094"/>
-</svg>
diff --git a/theme/static/styles.css b/theme/static/styles.css
index d6ffd0e..120f733 100644
--- a/theme/static/styles.css
+++ b/theme/static/styles.css
@@ -1,597 +1,12 @@
-@import url('tokens.css');
-
-/* ============================================================
-   HOMEPAGE INTRO
-   ============================================================ */
-.homepage-intro {
-  max-width: var(--prose-w);
-  margin: 3rem 0;
-  margin-top: 1rem;
-  font-family: var(--font-serif);
-  font-size: var(--text-body);
-  line-height: var(--lh-body);
-}
-.homepage-intro p { margin-bottom: 1.1rem; }
-.homepage-intro p:first-child {
-  font-size: 0.9rem;
-  text-transform: uppercase;
-  letter-spacing: 0.1em;
-  font-family: var(--font-sans);
-  color: var(--meta);
-  margin-bottom: 0.5rem;
-}
-.homepage-intro p:nth-child(2) {
-  font-size: 1.3rem;
-  font-weight: 700;
-  letter-spacing: -0.01em;
-  color: var(--fg);
-  margin-bottom: 1.5rem;
-}
-
-/* ============================================================
-   RESET & BASE
-   ============================================================ */
-*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
-
-body {
-  background: var(--bg);
-  color: var(--fg);
-  font-family: var(--font-sans);
-  font-size: var(--text-body);
-  line-height: var(--lh-body);
-  -webkit-font-smoothing: antialiased;
-  text-rendering: optimizeLegibility;
-}
-
-/* Full-bleed header — border and nav span 100vw */
-header {
-  width: 100%;
-}
-
-/* Centered content column */
-main,
-footer,
-header {
-  max-width: var(--outer-w);
-  margin: 0 auto;
-  padding-left: var(--pad);
-  padding-right: var(--pad);
-}
-footer { padding-bottom: 3rem; }
-
-/* Prose constraint — applied to article/page body text only */
-.prose {
-  max-width: var(--prose-w);
-}
-
-/* ============================================================
-   MASTHEAD
-   ============================================================ */
-.masthead {
-  border-top: 2px solid var(--fg);
-  padding-top: 1.5rem;
-  padding-bottom: 0;
-  padding-left: var(--pad);
-  padding-right: var(--pad);
-}
-
-.masthead-title {
-  display: block;
-  font-family: var(--font-serif);
-  font-size: var(--text-display);
-  font-weight: 700;
-  line-height: var(--lh-display);
-  letter-spacing: -0.03em;
-  text-decoration: none;
-  color: var(--fg);
-  margin-bottom: 1.25rem;
-}
-.masthead-title:hover { color: var(--accent); background: none; }
-
-.masthead-subtitle {
-  font-family: var(--font-sans);
-  font-size: var(--text-xs);
-  letter-spacing: 0.12em;
-  color: var(--meta);
-  text-transform: lowercase;
-  margin-bottom: 1rem;
-}
-
-/* ============================================================
-   NAV STRIP — full outer width, equal cells
-   ============================================================ */
-.masthead nav ul {
-  list-style: none;
-  display: flex;
-}
-.masthead nav li { flex: 1; }
-.masthead nav a {
-  display: block;
-  text-align: center;
-  padding: 0.55rem 0;
-  font-size: var(--text-xs);
-  font-weight: 700;
-  text-transform: uppercase;
-  letter-spacing: 0.16em;
-  text-decoration: none;
-  color: var(--meta);
-  border: 1px solid var(--border-soft);
-  transition: color 0.1s, background 0.1s;
-}
-.masthead nav a:hover { color: var(--bg); background: var(--fg); }
-
-/* ============================================================
-   MAIN CONTENT AREA
-   ============================================================ */
-main { padding-top: 2rem; }
-
-/* ============================================================
-   KOI HR
-   ============================================================ */
-hr {
-  border: none;
-  height: 2.5rem;
-  position: relative;
-  display: flex;
-  align-items: center;
-  justify-content: center;
-  background-image: url('koi-hr.svg');
-  background-repeat: no-repeat;
-  background-position: center;
-  background-size: auto 100%;
-  margin: 3rem 0;
-}
-hr::before, hr::after {
-  content: '';
-  position: absolute;
-  top: 50%;
-  transform: translateY(-50%);
-  width: calc(50% - 2rem);
-  height: 1px;
-  background: var(--border-soft);
-}
-hr::before { left: 0; }
-hr::after  { right: 0; }
-
-/* ============================================================
-   FOOTER
-   ============================================================ */
-footer {
-  font-size: var(--text-xs);
-  text-transform: uppercase;
-  letter-spacing: 0.14em;
-  color: var(--meta);
-  display: flex;
-  flex-direction: column;
-  gap: 0.4rem;
-}
-footer a { color: var(--meta); text-decoration: none; transition: color 0.1s; }
-footer a:hover { color: var(--fg); background: none; }
-
-/* ============================================================
-   TYPOGRAPHY
-   ============================================================ */
-h1, h2, h3, h4 {
-  font-family: var(--font-serif);
-  font-weight: 700;
-  letter-spacing: -0.02em;
-  line-height: 1.1;
-}
-
-/* Page-level h1 (blog list, garden, guides) */
-h1 {
-  font-size: var(--text-h1);
-  margin-bottom: 0.5rem;
-}
-
-/* Article display title — larger, tighter */
-.article-title {
-  font-family: var(--font-serif);
-  font-size: clamp(2.4rem, 5vw, 3.6rem);
-  font-weight: 700;
-  line-height: 1.05;
-  letter-spacing: -0.03em;
-  margin: 0.4rem 0 0;
-}
-
-h2 {
-  font-size: var(--text-h2);
-  border-left: 1px solid var(--accent);
-  padding-left: 0.75rem;
-  margin-top: 2.5rem;
-  margin-bottom: 0.4rem;
-}
-h3 { font-size: 1.05rem; margin-top: 2rem; margin-bottom: 0.3rem; }
-
-p { margin-bottom: 1.2rem; }
-
-/* Accent ONLY on links and h2 bar — nowhere else */
-a {
-  color: var(--accent);
-  text-decoration: underline;
-  text-underline-offset: 3px;
-  transition: background 0.1s, color 0.1s;
-}
-a:hover { background: var(--accent); color: var(--bg); text-decoration: none; }
-
-/* ============================================================
-   SECTION LABEL — uppercase eyebrow text
-   ============================================================ */
-.label {
-  display: block;
-  font-size: var(--text-xs);
-  font-weight: 700;
-  text-transform: uppercase;
-  letter-spacing: 0.16em;
-  color: var(--meta);
-  border-bottom: 1px solid var(--fg);
-  padding-bottom: 0.5rem;
-  margin-bottom: 0;
-}
-
-/* ============================================================
-   INFO STRIP — homepage identity block
-   ============================================================ */
-
-
-/* ============================================================
-   POST LIST — numbered, full outer width
-   ============================================================ */
-.post-list {
-  list-style: none;
-  counter-reset: posts;
-}
-.post-list-item {
-  counter-increment: posts;
-  display: grid;
-  grid-template-columns: 2.5rem 1fr 7rem;
-  align-items: baseline;
-  gap: 0 1rem;
-  padding: 0.75rem 0;
-  border-bottom: 1px solid var(--border-soft);
-}
-.post-list-item:first-child { border-top: 1px solid var(--border-soft); }
-.post-list-item::before {
-  content: counter(posts, decimal-leading-zero);
-  font-family: var(--font-mono);
-  font-size: var(--text-xs);
-  color: var(--meta);
-  letter-spacing: 0.04em;
-  grid-column: 1;
-}
-.post-list-item a {
-  font-size: var(--text-sm);
-  justify-self: start;
-}
-.post-list-item time {
-  font-size: var(--text-xs);
-  font-family: var(--font-mono);
-  color: var(--meta);
-  text-align: right;
-  white-space: nowrap;
-  letter-spacing: 0.04em;
-}
-
-/* Year separator — full-width label, resets counter display */
-.post-list-year {
-  display: block;
-  font-family: var(--font-sans);
-  font-size: var(--text-xs);
-  font-weight: 700;
-  text-transform: uppercase;
-  letter-spacing: 0.14em;
-  color: var(--meta);
-  padding: 1.5rem 0 0.4rem;
-  counter-increment: none;
-}
-
-.all-posts-link {
-  display: inline-block;
-  margin-top: 1.5rem;
-  font-size: var(--text-xs);
-  font-weight: 700;
-  text-transform: uppercase;
-  letter-spacing: 0.12em;
-}
-
-/* ============================================================
-   ARTICLE — post page
-   ============================================================ */
-.article-dateline {
-  font-family: var(--font-mono);
-  font-size: var(--text-xs);
-  text-transform: uppercase;
-  letter-spacing: 0.14em;
-  color: var(--meta);
-  margin-bottom: 0.35rem;
-}
-
-.article-standfirst {
-  font-family: var(--font-serif);
-  font-size: 1.15rem;
-  line-height: 1.55;
-  color: var(--fg-soft);
-  padding: 1.25rem 0;
-  border-top: 1px solid var(--border-soft);
-  border-bottom: 1px solid var(--fg);
-  margin-top: 1rem;
-  max-width: var(--prose-w);
-}
-
-.article-body {
-  font-family: var(--font-serif);
-  font-size: var(--text-body);
-  line-height: var(--lh-body);
-  max-width: var(--prose-w);
-  margin-top: 2.5rem;
-}
-.article-body p { margin-bottom: 1.3rem; }
-
-.reply-link {
-  max-width: var(--prose-w);
-  margin-top: 4rem;
-  padding-top: 1.5rem;
-  border-top: 1px solid var(--border-soft);
-  font-size: var(--text-xs);
-  font-family: var(--font-sans);
-  text-transform: uppercase;
-  letter-spacing: 0.12em;
-}
-
-/* ============================================================
-   GENERIC PAGE (about, uses, etc.)
-   ============================================================ */
-.page-body {
-  font-family: var(--font-serif);
-  font-size: var(--text-body);
-  line-height: var(--lh-body);
-  max-width: var(--prose-w);
-  margin-top: 2rem;
-}
-.page-body p { margin-bottom: 1.3rem; }
-
-/* ============================================================
-   BLOG ARCHIVE
-   ============================================================ */
-.blog-meta {
-  font-size: var(--text-sm);
-  color: var(--meta);
-  margin: 0.75rem 0 2rem;
-}
-.blog-meta code {
-  font-size: var(--text-xs);
-  background: var(--code-bg);
-  padding: 0.1rem 0.35rem;
-  font-family: var(--font-mono);
-}
-
-/* Year separators in post list */
-.post-list-year {
-  font-family: var(--font-serif);
-  font-size: var(--text-xs);
-  font-weight: 700;
-  text-transform: uppercase;
-  letter-spacing: 0.14em;
-  color: var(--meta);
-  padding: 1.25rem 0 0.5rem;
-  list-style: none;
-  grid-column: 1 / -1;
-}
-
-/* Restore list styling inside content areas */
-.article-body ul,
-.article-body ol,
-.page-body ul,
-.page-body ol {
-  padding-left: 1.5rem;
-  margin-bottom: 1.2rem;
-}
-.article-body li,
-.page-body li {
-  margin-bottom: 0.3rem;
-}
-.article-body ul ul,
-.article-body ol ol,
-.page-body ul ul,
-.page-body ol ol {
-  margin-bottom: 0;
-}
-
-/* ============================================================
-   GARDEN
-   ============================================================ */
-.garden-index { list-style: none; }
-.garden-index li {
-  display: flex;
-  flex-direction: column;
-  gap: 0.15rem;
-  padding: 0.8rem 0;
-  border-bottom: 1px solid var(--border-soft);
-}
-.garden-index li:first-child { border-top: 1px solid var(--border-soft); }
-.garden-index a { font-size: var(--text-sm); }
-.garden-desc { font-size: var(--text-xs); color: var(--meta); }
-
-/* ============================================================
-   APP CARDS
-   ============================================================ */
-.app-card {
-  display: flex;
-  gap: 1.25rem;
-  align-items: flex-start;
-  padding: 1.25rem 0;
-  border-bottom: 1px solid var(--border-soft);
-}
-.app-card:first-of-type { border-top: 1px solid var(--border-soft); }
-.app-icon { width: 52px; height: 52px; border-radius: 12px; flex-shrink: 0; filter: none !important; margin: 0; display: block; }
-.app-card a:has(.app-icon):hover { background: none; }
-.app-info { display: flex; flex-direction: column; gap: 0.2rem; }
-.app-title { font-family: var(--font-sans); font-weight: 700; font-size: var(--text-sm); }
-.app-subtitle { font-size: var(--text-xs); color: var(--meta); }
-.app-links { font-size: var(--text-xs); margin-top: 0.3rem; }
-
-/* ============================================================
-   CODE & PRE
-   ============================================================ */
-pre {
-  padding: 1.25rem;
-  border-left: 1px solid var(--border-soft);
-  background: var(--code-bg);
-  overflow-x: auto;
-  font-size: var(--text-sm);
-  margin: 1.75rem 0;
-  line-height: 1.6;
-}
-code {
-  font-family: var(--font-mono);
-  background: var(--code-bg);
-  padding: 0.15rem 0.4rem;
-  font-size: 0.875em;
-}
-pre code { background: none; padding: 0; font-size: inherit; }
-
-/* ============================================================
-   BLOCKQUOTE — intentional Org-mode delimiters
-   ============================================================ */
-blockquote {
-  font-style: italic;
-  margin: 1.75rem 0;
-  padding: 0.75rem 1rem;
-  border-left: 1px solid var(--border-soft);
-  background: var(--code-bg);
-}
-blockquote p:last-child { margin-bottom: 0; }
+body { max-width: 800px; margin: 0 auto; }
+nav ul { list-style: none; padding: 0; display: flex; flex-direction: row; }
+nav ul li { padding-right: 0.5rem;}
+img { max-width: 100%; }
+.post-list-item { display: flexbox; list-style: none; }
+.post-list-item time { padding-right: 0.5rem; }
+.post-list-year { list-style: none; margin-top: 1rem; margin-bottom: 0.5rem; font-weight: bold; }
+.skip-link { display: none; }
+footer { margin: 2rem 0;}
+pre, blockquote { margin: 1rem 0; padding: 0.5rem; background-color: lightgrey; }
 blockquote p { margin: 0; }
-blockquote::before {
-  content: "#+begin_quote";
-  display: block;
-  color: var(--meta);
-  font-style: normal;
-  font-size: var(--text-xs);
-  font-family: var(--font-mono);
-  letter-spacing: 0.04em;
-  margin-bottom: 0.5rem;
-}
-blockquote::after {
-  content: "#+end_quote";
-  display: block;
-  color: var(--meta);
-  font-style: normal;
-  font-size: var(--text-xs);
-  font-family: var(--font-mono);
-  letter-spacing: 0.04em;
-  margin-top: 0.5rem;
-}
-
-/* ============================================================
-   TABLES
-   ============================================================ */
-table {
-  display: block;
-  width: 100%;
-  max-width: 100%;
-  overflow-x: auto;
-  border: none;
-  border-collapse: collapse;
-  margin: 2rem 0;
-}
-
-table td, table th {
-  white-space: nowrap;
-  padding: 0.5rem 1rem;
-}
-th, td {
-  border-bottom: 1px solid var(--border-soft);
-  padding: 0.65rem 0.75rem;
-  text-align: left;
-  font-size: var(--text-sm);
-}
-th {
-  border-bottom: 1px solid var(--fg);
-  font-size: var(--text-xs);
-  text-transform: uppercase;
-  letter-spacing: 0.1em;
-  font-weight: 700;
-}
-tr:last-child td { border-bottom: none; }
-
-/* ============================================================
-   IMAGES
-   ============================================================ */
-img {
-  max-width: 100%;
-  height: auto;
-  filter: grayscale(1);
-  transition: filter 0.25s;
-  display: block;
-  margin: 2rem 0;
-}
-img:hover { filter: grayscale(0); }
-
-/* ============================================================
-   FOOTNOTES
-   ============================================================ */
-.footdef { display: flex; align-items: flex-start; gap: 1rem; margin-bottom: 0.5rem; }
-.footpara { margin: 0; flex: 1; font-size: var(--text-sm); }
-.footnum {
-  font-weight: 700;
-  min-width: 1.5rem;
-  text-align: right;
-  text-decoration: none;
-  font-size: var(--text-xs);
-  color: var(--meta);
-  font-family: var(--font-mono);
-}
-
-/* ============================================================
-   SKIP LINK
-   ============================================================ */
-.skip-link {
-  position: absolute;
-  top: -100px;
-  left: 50%;
-  transform: translateX(-50%);
-  background: var(--fg);
-  color: var(--bg);
-  padding: 0.75rem 1.5rem;
-  z-index: 999;
-  font-weight: 700;
-  font-size: var(--text-xs);
-  text-transform: uppercase;
-  letter-spacing: 0.12em;
-  text-decoration: none;
-  transition: top 0.2s;
-}
-.skip-link:focus { top: 0; outline: none; }
-#main-content:focus { outline: none; }
-
-/* ============================================================
-   RESPONSIVE
-   ============================================================ */
-@media (max-width: 700px) {
-  .masthead-title { font-size: clamp(3rem, 14vw, 5rem); }
-  .masthead nav ul { flex-wrap: wrap; }
-  .masthead nav li { flex: none; width: 50%; }
-  .masthead nav a { border-bottom: 1px solid var(--border-soft); }
-  .post-list-item { grid-template-columns: 2.25rem 1fr; }
-  .post-list-item time { display: none; }
-  .article-title { font-size: clamp(2rem, 9vw, 2.8rem); }
-}
-
-@media (max-width: 480px) {
-  .masthead nav li { width: 33.333%; }
-}
-
-/* Tags page */
-.tag-toc {
-  display: flex;
-  flex-wrap: wrap;
-  gap: 0.5rem 1.5rem;
-  list-style: none;
-  padding: 0;
-  margin: 0 0 3rem;
-}
-.tag-count {
-  color: var(--meta);
-  font-size: var(--text-xs);
-}
+code { color: darkred; }
\ No newline at end of file
diff --git a/theme/static/tokens.css b/theme/static/tokens.css
deleted file mode 100644
index 3f67b12..0000000
--- a/theme/static/tokens.css
+++ /dev/null
@@ -1,51 +0,0 @@
-/* =============================================================================
-   BRAND TOKENS — cleberg.net
-   ============================================================================= */
-:root {
-  color-scheme: light dark;
-
-  /* Light */
-  --bg:          #ffffff;
-  --bg-soft:     #f5f5f5;
-  --fg:          #0a0a0a;
-  --fg-soft:     #444444;
-  --accent:      #c0392b;
-  --border:      #0a0a0a;
-  --border-soft: #dedede;
-  --code-bg:     #f3f3f3;
-  --meta:        #999999;
-
-  /* Fonts */
-  --font-serif: Georgia, 'Times New Roman', serif;
-  --font-sans:  system-ui, -apple-system, 'Segoe UI', Helvetica, Arial, sans-serif;
-  --font-mono:  ui-monospace, 'Cascadia Code', 'Source Code Pro', Menlo, Consolas, monospace;
-
-  /* Type scale */
-  --text-display: clamp(4rem, 8vw, 6.5rem);
-  --text-h1:      clamp(2.2rem, 4vw, 3rem);
-  --text-h2:      1.2rem;
-  --text-body:    1.0625rem;
-  --text-sm:      0.875rem;
-  --text-xs:      0.6875rem;   /* 11px — label tier */
-  --lh-display:   0.95;
-  --lh-body:      1.75;
-
-  /* Layout */
-  --outer-w:  1000px;
-  --prose-w:  720px;
-  --pad:      clamp(1.25rem, 4vw, 2.5rem);
-}
-
-@media (prefers-color-scheme: dark) {
-  :root {
-    --bg:          #080808;
-    --bg-soft:     #111111;
-    --fg:          #eeebe6;
-    --fg-soft:     #aaa8a3;
-    --accent:      #e05a48;
-    --border:      #eeebe6;
-    --border-soft: #1e1e1e;
-    --code-bg:     #0d0d0d;
-    --meta:        #555555;
-  }
-}
diff --git a/theme/templates/base.html b/theme/templates/base.html
index 8eca335..65681e5 100644
--- a/theme/templates/base.html
+++ b/theme/templates/base.html
@@ -9,45 +9,36 @@
     {% if site_description is defined %}<meta name="description" content="{{ site_description }}">{% endif %}
     {% if site_keywords is defined %}<meta name="keywords" content="{{ site_keywords }}">{% endif %}
     <link rel="stylesheet" href="{{ url_for("static", file="styles.min.css") }}" type="text/css">
-    <link rel="icon" href="{{ url_for("static", file="favicon.svg") }}" type="image/svg+xml">
+    <link rel="icon" href="data:,">
     {% block meta %}{% endblock %}
     {% endblock %}
 </head>
 <body>
     <a href="#main-content" class="skip-link">Skip to content</a>
-    <header class="masthead">
-        <a href="/" class="masthead-title">seijaku</a>
-        <p class="masthead-subtitle"><i>stillness amidst the chaos</i></p>
-        <nav aria-label="Site Navigation">
-            <ul>
-                <li><a href="/blog/">Blog</a></li>
-                <li><a href="/tags/">Tags</a></li>
-                <li><a href="/guides/index.html">Guides</a></li>
-                <li><a href="/apps/">Apps</a></li>
-                <li><a href="/garden/">Garden</a></li>
-                <li><a href="/salary/">Salary</a></li>
-            </ul>
-        </nav>
-    </header>
+    
+    <nav aria-label="Site Navigation">
+        <ul>
+            <li><a href="/">Home</a></li>
+            <li><a href="/apps/">Apps</a></li>
+            <li><a href="/blog/">Blog</a></li>
+            <li><a href="/garden/">Garden</a></li>
+            <li><a href="/guides/">Guides</a></li>
+            <li><a href="/salary/">Salary</a></li>
+            <li><a href="/tags/">Tags</a></li>
+        </ul>
+    </nav>
+
     <main id="main-content">
         {% block main %}{% endblock %}
     </main>
-    <hr>
+
     <footer>
-        <div>
-            <a href="https://github.com/ccleberg/cleberg.net">Source</a> &middot;
-            <a href="/feed.xml">RSS</a> &middot;
-            <a href="http://paske4urhs6nttrtlkuwa5cowum3fjkc6yv6kl4ncx3mjxcd77764nqd.onion/">Onion</a> &middot;
-            <a href="/now/">Now</a> &middot;
-            <a href="/uses/">Uses</a> &middot;
-            <a href="/tips/">Tips</a> &middot;
-            <a href="https://cv.cleberg.net">CV</a>
-        </div>
-        <div>
-            <a href="mailto:hello@cleberg.net">hello@cleberg.net</a> [<a href="/gpg.txt">PGP</a>] &middot;
-            Signal: @cmc.01
-        </div>
+        <a href="https://github.com/ccleberg/cleberg.net">Source</a> &middot;
+        <a href="/feed.xml">RSS</a> &middot;
+        <a href="http://paske4urhs6nttrtlkuwa5cowum3fjkc6yv6kl4ncx3mjxcd77764nqd.onion/">Onion</a> &middot;
+        <a href="/tips/">Tips</a>
     </footer>
+    
     <section class="indieweb-links" style="display:none">
         <link href="https://github.com/ccleberg" rel="me">
         <link href="https://gitlab.com/ccleberg" rel="me">
diff --git a/theme/templates/blog.html b/theme/templates/blog.html
index 605d883..ba7beb3 100644
--- a/theme/templates/blog.html
+++ b/theme/templates/blog.html
@@ -1,13 +1,13 @@
 {% extends "base.html" %} {% block subtitle %}blog - {% endblock %} {% block main %}
 <h1>Blog</h1>
-<p class="blog-meta">Use <code>⌘ F</code> / <code>Ctrl F</code> to search &middot; <a href="/feed.xml">RSS Feed</a></p>
-<p class="label">All Posts</p>
+<p>Use <code>⌘ F</code> / <code>Ctrl F</code> to search &middot; <a href="/feed.xml">RSS Feed</a></p>
+<p>All Posts</p>
 <ul class="post-list">
-{% for post in posts %}
-<li class="post-list-item">
-    <a href='{{ url_for("blog", slug=post.slug) }}'>{{ post.title }}</a>
-    <time datetime='{{ post.date | strftime("%Y-%m-%d") }}'>{{ post.date|strftime("%Y-%m-%d") }}</time>
-</li>
-{% endfor %}
+    {% for post in posts %}
+    <li class="post-list-item">
+        <time datetime='{{ post.date | strftime("%Y-%m-%d") }}'>{{ post.date|strftime("%Y-%m-%d") }}</time>
+        <a href='{{ url_for("blog", slug=post.slug) }}'>{{ post.title }}</a>
+    </li>
+    {% endfor %}
 </ul>
 {% endblock %}
diff --git a/theme/templates/garden.html b/theme/templates/garden.html
index 79238f5..c546078 100644
--- a/theme/templates/garden.html
+++ b/theme/templates/garden.html
@@ -14,14 +14,14 @@ around.</p>
   <span><strong>🍂 Compost:</strong> Ideas you no longer agree with but want to
   keep for historical context.</span><br><br>
 </section>
-<ul class="garden-index">
-{% for post in posts %}
-<li>
-	<a href='{{ url_for("garden", slug=post.slug) }}'>{{ post.title }}</a>
-	{% if post.description %}
-	<span class="garden-desc">{{ post.description }}</span>
-	{% endif %}
-</li>
-{% endfor %}
+<ul>
+  {% for post in posts %}
+  <li>
+    <a href='{{ url_for("garden", slug=post.slug) }}'>{{ post.title }}</a>
+    {% if post.description %}
+    <span>{{ post.description }}</span>
+    {% endif %}
+  </li>
+  {% endfor %}
 </ul>
 {% endblock %}
diff --git a/theme/templates/index.html b/theme/templates/index.html
index d15eeca..de9fae3 100644
--- a/theme/templates/index.html
+++ b/theme/templates/index.html
@@ -1,22 +1,22 @@
 {% extends "base.html" %} {% block main %}
-<div class="homepage-intro">
-    <p>My name is Christian.</p>
-    <p>I’m a technology auditor who doesn’t trust technology companies.</p>
-    <p>I run my own infrastructure. I audit everyone else's.</p>
-    <p>The infrastructure is the point. Self-hosted, self-managed, minimal
-    dependencies. This site is part of it: plaintext, no trackers, no
-    frameworks, no corporate CDN.</p>
-    <p>The audit job funds it. KPMG. Technology Assurance. I spend 50-80 hours a
-    week inside the systems I refuse to use personally. The irony is the
-    business model.</p>
-    <p>GPG key, salary, and server stack are all public. That's the whole
-    introduction.</p>
-</div>
+<section>
+    <p><b>Hi, I'm Christian.</b></p>
+    <p>I'm a Technology Assurance Manager @ KPMG.</p>
+    <p>I use this site as a place to think out loud (see my <a href="/blog/">blog</a>, <a href="/garden/">garden</a>, or
+    <a href="/guides/">guides</a>), a place to publish information (see
+    my <a href="https://cv.cleberg.net">CV</a> and <a href="/salary/">salary</a>
+    pages), and a foundational URI to use for my projects (see
+    my <a href="/apps/">apps</a>).</p>
+    <p>If you want to chat, you can find me in the following spaces:</p>
+    <ul>
+        <li>hello [at] cleberg.net (<a href="/gpg.txt">PGP Key</a>)</li>
+        <li>@cmc.01 on <a href="https://signal.org">Signal</a></li>
+    </ul>
+    <p>Curious about the technology behind this website? Check out my <a href="/uses/">/uses</a> page.</p>
+    <p>Curious about what I've been up to lately in my personal life? Check out my <a href="/now/">/now</a> page.</p>
+</section>
 
-<p class="section-label">Recent Posts</p>
-<ul class="post-list">
-    <!-- BEGIN_POSTS -->
-    <!-- END_POSTS -->
-</ul>
-<a class="all-posts-link" href="/blog/">All Posts &rarr;</a>
+<p>Recent Posts</p>
+<!-- BEGIN_POSTS --><!-- END_POSTS -->
+<p><a href="/blog/">All Posts &rarr;</a></p>
 {% endblock %}
diff --git a/theme/templates/page.html b/theme/templates/page.html
index a302c4b..6c22589 100644
--- a/theme/templates/page.html
+++ b/theme/templates/page.html
@@ -3,6 +3,6 @@
 {% block main %}
 <article>
     <h1>{{ post.title }}</h1>
-    <div class="page-body">{{ post.html | safe }}</div>
+    <div>{{ post.html | safe }}</div>
 </article>
 {% endblock %}
diff --git a/theme/templates/post.html b/theme/templates/post.html
index 018068e..df6c3b7 100644
--- a/theme/templates/post.html
+++ b/theme/templates/post.html
@@ -10,12 +10,12 @@
 {% endblock %}
 {% block main %}
 <article>
-    <p class="article-dateline"><time datetime='{{ post.date|strftime("%Y-%m-%d") }}'>{{ post.date|strftime("%Y-%m-%d") }}</time></p>
-    <h1 class="article-title">{{ post.title }}</h1>
+    <p><time datetime='{{ post.date|strftime("%Y-%m-%d") }}'>{{ post.date|strftime("%Y-%m-%d") }}</time></p>
+    <h1>{{ post.title }}</h1>
     {% if post.description is defined %}
-    <p class="article-standfirst">{{ post.description }}</p>
+        <p>{{ post.description }}</p>
     {% endif %}
-    <div class="article-body">{{ post.html | safe }}</div>
-    <div class="reply-link"><a href="mailto:hello@cleberg.net">Reply via email &rarr;</a></div>
+    <div>{{ post.html | safe }}</div>
+    <div><a href="mailto:hello@cleberg.net">Reply via email &rarr;</a></div>
 </article>
 {% endblock %}
diff --git a/utils/nginx-dev.conf b/utils/nginx-dev.conf
deleted file mode 100644
index ed94af7..0000000
--- a/utils/nginx-dev.conf
+++ /dev/null
@@ -1,17 +0,0 @@
-server {
-	server_name cleberg.net www.cleberg.net;
-
-	root /usr/share/nginx/html;
-	index index.html;
-	autoindex on;
-
-	access_log  /var/log/nginx/cleberg.net.access.log;
-	error_log  /var/log/nginx/cleberg.net.error.log;
-
-	location / {
-		try_files $uri $uri/ =404;
-	}
-
-	listen [::]:80;
-	listen 80;
-}