aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/FUNDING.yml1
-rw-r--r--.github/dependabot.yml6
-rw-r--r--.github/workflows/codeql.yml46
-rw-r--r--.github/workflows/deploy.yml68
-rw-r--r--.github/workflows/docker-build.yml41
-rw-r--r--.github/workflows/ruff.yml42
-rw-r--r--BRAND.md98
-rw-r--r--README.org6
-rw-r--r--build.py61
-rw-r--r--content/apps/index.org47
-rw-r--r--content/blog/2018-11-28-aes-encryption.org8
-rw-r--r--content/blog/2018-11-28-cpp-compiler.org8
-rw-r--r--content/blog/2019-01-07-useful-css.org8
-rw-r--r--content/blog/2019-09-09-audit-analytics.org8
-rw-r--r--content/blog/2019-12-03-the-ansoff-matrix.org8
-rw-r--r--content/blog/2019-12-16-password-security.org8
-rw-r--r--content/blog/2020-01-25-linux-software.org8
-rw-r--r--content/blog/2020-01-26-steam-on-ntfs.org8
-rw-r--r--content/blog/2020-02-09-cryptography-basics.org8
-rw-r--r--content/blog/2020-03-25-session-messenger.org8
-rw-r--r--content/blog/2020-05-03-homelab.org8
-rw-r--r--content/blog/2020-05-19-customizing-ubuntu.org8
-rw-r--r--content/blog/2020-07-20-video-game-sales.org8
-rw-r--r--content/blog/2020-07-26-business-analysis.org8
-rw-r--r--content/blog/2020-08-22-redirect-github-pages.org8
-rw-r--r--content/blog/2020-08-29-php-auth-flow.org8
-rw-r--r--content/blog/2020-09-01-visual-recognition.org6
-rw-r--r--content/blog/2020-09-22-internal-audit.org8
-rw-r--r--content/blog/2020-09-25-happiness-map.org6
-rw-r--r--content/blog/2020-10-12-mediocrity.org8
-rw-r--r--content/blog/2020-12-27-website-redesign.org8
-rw-r--r--content/blog/2020-12-28-neon-drive.org8
-rw-r--r--content/blog/2020-12-29-zork.org8
-rw-r--r--content/blog/2021-01-01-seum.org8
-rw-r--r--content/blog/2021-01-04-fediverse.org8
-rw-r--r--content/blog/2021-01-07-ufw.org8
-rw-r--r--content/blog/2021-02-19-macos.org8
-rw-r--r--content/blog/2021-03-19-clone-github-repos.org8
-rw-r--r--content/blog/2021-03-28-gemini-capsule.org8
-rw-r--r--content/blog/2021-03-28-vaporwave-vs-outrun.org8
-rw-r--r--content/blog/2021-03-30-vps-web-server.org8
-rw-r--r--content/blog/2021-04-17-gemini-server.org8
-rw-r--r--content/blog/2021-04-23-php-comment-system.org8
-rw-r--r--content/blog/2021-04-28-photography.org8
-rw-r--r--content/blog/2021-05-30-changing-git-authors.org8
-rw-r--r--content/blog/2021-07-15-delete-gitlab-repos.org8
-rw-r--r--content/blog/2021-08-25-audit-sampling.org8
-rw-r--r--content/blog/2021-10-09-apache-redirect.org8
-rw-r--r--content/blog/2021-12-04-cisa.org8
-rw-r--r--content/blog/2022-02-10-leaving-the-office.org8
-rw-r--r--content/blog/2022-02-10-njalla-dns-api.org8
-rw-r--r--content/blog/2022-02-16-debian-and-nginx.org8
-rw-r--r--content/blog/2022-02-17-exiftool.org8
-rw-r--r--content/blog/2022-02-20-nginx-caching.org8
-rw-r--r--content/blog/2022-02-22-tuesday.org8
-rw-r--r--content/blog/2022-03-02-reliable-notes.org8
-rw-r--r--content/blog/2022-03-03-financial-database.org8
-rw-r--r--content/blog/2022-03-08-plex-migration.org8
-rw-r--r--content/blog/2022-03-23-cloudflare-dns-api.org8
-rw-r--r--content/blog/2022-03-23-nextcloud-on-ubuntu.org8
-rw-r--r--content/blog/2022-03-24-server-hardening.org8
-rw-r--r--content/blog/2022-03-26-ssh-mfa.org8
-rw-r--r--content/blog/2022-04-02-nginx-reverse-proxy.org8
-rw-r--r--content/blog/2022-04-09-pinetime.org8
-rw-r--r--content/blog/2022-06-01-ditching-cloudflare.org8
-rw-r--r--content/blog/2022-06-07-self-hosting-freshrss.org8
-rw-r--r--content/blog/2022-06-16-terminal-lifestyle.org8
-rw-r--r--content/blog/2022-06-22-daily-poetry.org8
-rw-r--r--content/blog/2022-06-24-fedora-i3.org8
-rw-r--r--content/blog/2022-07-01-git-server.org8
-rw-r--r--content/blog/2022-07-14-gnupg.org8
-rw-r--r--content/blog/2022-07-25-curseradio.org8
-rw-r--r--content/blog/2022-07-30-flac-to-opus.org8
-rw-r--r--content/blog/2022-07-31-bash-it.org8
-rw-r--r--content/blog/2022-08-31-privacy-com-changes.org8
-rw-r--r--content/blog/2022-09-17-serenity-os.org8
-rw-r--r--content/blog/2022-09-21-graphene-os.org8
-rw-r--r--content/blog/2022-10-04-mtp-linux.org8
-rw-r--r--content/blog/2022-10-04-syncthing.org8
-rw-r--r--content/blog/2022-10-22-alpine-linux.org8
-rw-r--r--content/blog/2022-10-30-linux-display-manager.org8
-rw-r--r--content/blog/2022-11-07-self-hosting-matrix.org8
-rw-r--r--content/blog/2022-11-11-nginx-tmp-errors.org8
-rw-r--r--content/blog/2022-11-27-server-build.org8
-rw-r--r--content/blog/2022-11-29-nginx-referrer-ban-list.org8
-rw-r--r--content/blog/2022-12-01-nginx-compression.org8
-rw-r--r--content/blog/2022-12-07-nginx-wildcard-redirect.org8
-rw-r--r--content/blog/2022-12-17-st.org8
-rw-r--r--content/blog/2022-12-23-alpine-desktop.org8
-rw-r--r--content/blog/2023-01-03-recent-website-changes.org8
-rw-r--r--content/blog/2023-01-05-mass-unlike-tumblr-posts.org8
-rw-r--r--content/blog/2023-01-08-fedora-login-manager.org8
-rw-r--r--content/blog/2023-01-21-flatpak-symlinks.org8
-rw-r--r--content/blog/2023-01-23-random-wireguard.org8
-rw-r--r--content/blog/2023-01-28-self-hosting-wger.org8
-rw-r--r--content/blog/2023-02-02-exploring-hare.org8
-rw-r--r--content/blog/2023-05-22-burnout.org8
-rw-r--r--content/blog/2023-06-08-goaccess-geoip.org8
-rw-r--r--content/blog/2023-06-08-self-hosting-baikal.org8
-rw-r--r--content/blog/2023-06-18-unifi-ip-blocklist.org8
-rw-r--r--content/blog/2023-06-20-audit-review-template.org8
-rw-r--r--content/blog/2023-06-23-byobu.org8
-rw-r--r--content/blog/2023-06-23-self-hosting-convos.org8
-rw-r--r--content/blog/2023-06-28-backblaze-b2.org8
-rw-r--r--content/blog/2023-06-30-self-hosting-voyager.org8
-rw-r--r--content/blog/2023-07-12-wireguard-lan.org8
-rw-r--r--content/blog/2023-07-19-plex-transcoder-errors.org8
-rw-r--r--content/blog/2023-08-18-agile-auditing.org8
-rw-r--r--content/blog/2023-09-15-self-hosting-gitweb.org8
-rw-r--r--content/blog/2023-09-19-audit-sql-scripts.org8
-rw-r--r--content/blog/2023-10-04-digital-minimalism.org8
-rw-r--r--content/blog/2023-10-11-self-hosting-authelia.org8
-rw-r--r--content/blog/2023-10-15-alpine-ssh-hardening.org8
-rw-r--r--content/blog/2023-10-17-self-hosting-anonymousoverflow.org8
-rw-r--r--content/blog/2023-11-08-scli.org8
-rw-r--r--content/blog/2023-12-03-unifi-nextdns.org8
-rw-r--r--content/blog/2024-01-08-dont-say-hello.org8
-rw-r--r--content/blog/2024-01-09-macos-customization.org8
-rw-r--r--content/blog/2024-01-13-local-llm.org8
-rw-r--r--content/blog/2024-01-26-audit-dashboard.org8
-rw-r--r--content/blog/2024-01-27-tableau-dashboard.org8
-rw-r--r--content/blog/2024-02-06-zfs.org8
-rw-r--r--content/blog/2024-02-13-ubuntu-emergency-mode.org8
-rw-r--r--content/blog/2024-02-21-self-hosting-otter-wiki.org8
-rw-r--r--content/blog/2024-03-13-doom-emacs.org8
-rw-r--r--content/blog/2024-03-15-self-hosting-ddns-updater.org8
-rw-r--r--content/blog/2024-03-29-org-blog.org8
-rw-r--r--content/blog/2024-04-06-convert-onenote-to-markdown.org8
-rw-r--r--content/blog/2024-04-08-docker-local-web-server.org8
-rw-r--r--content/blog/2024-04-18-mu4e.org8
-rw-r--r--content/blog/2024-05-03-ubuntu-on-macos.org8
-rw-r--r--content/blog/2024-06-19-deprecated-trusted-gpg-fix.org8
-rw-r--r--content/blog/2024-07-11-emacs-on-ipad.org8
-rw-r--r--content/blog/2024-08-11-org-mode-features.org8
-rw-r--r--content/blog/2024-08-25-n8n-sentiment-analysis.org8
-rw-r--r--content/blog/2024-09-20-prometheus-grafana-cloud.org8
-rw-r--r--content/blog/2024-09-23-self-hosting-transmission.org8
-rw-r--r--content/blog/2024-10-31-continue-ollama-code-assistant.org8
-rw-r--r--content/blog/2024-12-27-self-hosting-the-lounge.org8
-rw-r--r--content/blog/2025-01-23-self-hosting-tandoor.org8
-rw-r--r--content/blog/2025-02-11-obscura-vpn.org8
-rw-r--r--content/blog/2025-02-24-email-migration.org8
-rw-r--r--content/blog/2025-04-05-git-mirror.org8
-rw-r--r--content/blog/2025-05-02-asahi-linux.org8
-rw-r--r--content/blog/2025-05-30-it-audit-career.org8
-rw-r--r--content/blog/2025-06-02-private-ios-apps.org8
-rw-r--r--content/blog/2025-09-04-website-redesign.org8
-rw-r--r--content/blog/2025-09-25-minimalist-website-redesign.org8
-rw-r--r--content/blog/2025-10-03-privacy-toolkit.org8
-rw-r--r--content/blog/2025-10-06-rocket-league-macos.org8
-rw-r--r--content/blog/2025-10-24-digital-garden.org8
-rw-r--r--content/blog/2025-11-02-aerc-macos.org8
-rw-r--r--content/blog/2025-11-13-wcag.org8
-rw-r--r--content/blog/2025-11-23-it-audit-ai.org8
-rw-r--r--content/blog/2025-12-06-self-hosting-tor.org8
-rw-r--r--content/blog/2025-12-20-self-hosting-home-assistant.org8
-rw-r--r--content/blog/2026-01-31-emacs-carnival-2026-01-this-year-i-will.org8
-rw-r--r--content/blog/2026-02-02-emacs-carnival-2026-02-completion.org8
-rw-r--r--content/blog/2026-02-07-indieweb-carnival-2026-02-intersecting-interests.org8
-rw-r--r--content/blog/2026-02-08-gnu-stow.org8
-rw-r--r--content/blog/2026-02-12-automating-weblorg-deployments.org8
-rw-r--r--content/blog/2026-02-21-auditing-aws-iam.org8
-rw-r--r--content/blog/2026-02-21-auditing-aws-passwords.org8
-rw-r--r--content/blog/2026-03-03-auditing-aws-s3.org10
-rw-r--r--content/guides/index.org2
-rw-r--r--content/salary/index.org2
-rw-r--r--screenshots/dark.pngbin157948 -> 0 bytes
-rw-r--r--screenshots/light.pngbin147082 -> 0 bytes
-rw-r--r--tag_preview.py177
-rw-r--r--theme/static/favicon.svg14
-rw-r--r--theme/static/koi-hr.svg7
-rw-r--r--theme/static/styles.css607
-rw-r--r--theme/static/tokens.css51
-rw-r--r--theme/templates/base.html49
-rw-r--r--theme/templates/blog.html16
-rw-r--r--theme/templates/garden.html18
-rw-r--r--theme/templates/index.html38
-rw-r--r--theme/templates/page.html2
-rw-r--r--theme/templates/post.html10
-rw-r--r--utils/nginx-dev.conf17
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/[email protected]
+ - 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 <[email protected]>">
+<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:[email protected]">[email protected]</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
--- a/screenshots/dark.png
+++ /dev/null
Binary files differ
diff --git a/screenshots/light.png b/screenshots/light.png
deleted file mode 100644
index a5ffb1f..0000000
--- a/screenshots/light.png
+++ /dev/null
Binary files 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:[email protected]">[email protected]</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:[email protected]">Reply via email &rarr;</a></div>
+ <div>{{ post.html | safe }}</div>
+ <div><a href="mailto:[email protected]">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;
-}