cmc/cleberg.net

My personal web garden & blog.

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

e4fc1f14a255d0bcb961c056357ca7eff5467a13

verified · cmc

author: Christian Cleberg <hello@cleberg.net> · 2026-03-11T08:00:50Z

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

diff --git a/build.py b/build.py
index 29b8d44..57ad969 100644
--- a/build.py
+++ b/build.py
@@ -381,6 +381,141 @@ def inject_blog_year_separators(blog_index_path="./.build/blog/index.html"):
     print(f"Blog year separators injected into {blog_index_path}")
 
 
+def generate_tags_page(content_dir="./content/blog", build_dir="./.build"):
+    """
+    Scans all blog org files for #+filetags, then writes .build/tags/index.html
+    with one section per tag, each post listed under its tags, sorted newest first.
+    Tags link to anchor IDs on the same page.
+    """
+    TAG_ORDER = ["audit", "emacs", "linux", "personal", "privacy", "security", "self-hosting", "web"]
+
+    header_patterns = {
+        "title": re.compile(r"^#\+title:\s*(.+)$", re.IGNORECASE),
+        "date":  re.compile(r"^#\+date:\s*[\[<](\d{4}-\d{2}-\d{2})"),
+        "slug":  re.compile(r"^#\+slug:\s*(.+)$", re.IGNORECASE),
+        "tags":  re.compile(r"^#\+filetags:\s*(.+)$", re.IGNORECASE),
+        "draft": re.compile(r"^#\+draft:\s*(.+)$", re.IGNORECASE),
+    }
+
+    tag_map = {tag: [] for tag in TAG_ORDER}
+
+    for org_path in Path(content_dir).glob("*.org"):
+        title = date_str = slug = None
+        tags = []
+        is_draft = False
+
+        with org_path.open("r", encoding="utf-8") as f:
+            for line in f:
+                if not title:
+                    m = header_patterns["title"].match(line)
+                    if m: title = m.group(1).strip(); continue
+                if not date_str:
+                    m = header_patterns["date"].match(line)
+                    if m: date_str = m.group(1); continue
+                if not slug:
+                    m = header_patterns["slug"].match(line)
+                    if m: slug = m.group(1).strip(); continue
+                if not tags:
+                    m = header_patterns["tags"].match(line)
+                    if m:
+                        raw = m.group(1).strip().strip(":")
+                        tags = [t.strip() for t in raw.split(":") if t.strip()]
+                        continue
+                m = header_patterns["draft"].match(line)
+                if m and m.group(1).strip().lower() != "nil":
+                    is_draft = True; break
+                if title and date_str and slug and tags:
+                    break
+
+        if is_draft or not (title and date_str and slug):
+            continue
+
+        try:
+            date_obj = datetime.strptime(date_str, "%Y-%m-%d")
+        except ValueError:
+            continue
+
+        for tag in tags:
+            if tag in tag_map:
+                tag_map[tag].append({"title": title, "slug": slug, "date_obj": date_obj, "date_str": date_str})
+
+    for tag in tag_map:
+        tag_map[tag].sort(key=lambda x: x["date_obj"], reverse=True)
+
+    # Build TOC
+    toc_items = "".join(
+        f'<li><a href="#{tag}">{tag}</a> <span class="tag-count">({len(tag_map[tag])})</span></li>'
+        for tag in TAG_ORDER
+    )
+
+    # Build sections
+    sections = []
+    for tag in TAG_ORDER:
+        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'</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">
+<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">
+</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="/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>
+<main id="main-content">
+<h1>Tags</h1>
+<ul class="tag-toc">{toc_items}</ul>
+{"".join(f"<section>{s}</section>" for s in sections)}
+</main>
+<hr>
+<footer>
+<div>
+<a href="https://github.com/ccleberg/cleberg.net">Source</a> &middot;
+<a href="/feed.xml">RSS</a> &middot;
+<a href="http://paske4urhs6nttrtlkuwa5cowum3fjkc6yv6kl4ncx3mjxcd77764nqd.onion/">Onion</a> &middot;
+<a href="/now/">Now</a> &middot;
+<a href="/uses/">Uses</a> &middot;
+<a href="/tips/">Tips</a> &middot;
+<a href="https://cv.cleberg.net">CV</a>
+</div>
+<div>
+<a href="mailto:hello@cleberg.net">hello@cleberg.net</a> [<a href="/gpg.txt">PGP</a>] &middot;
+Signal: @cmc.01
+</div>
+</footer>
+</body>
+</html>"""
+
+    out_dir = Path(build_dir) / "tags"
+    out_dir.mkdir(parents=True, exist_ok=True)
+    out_path = out_dir / "index.html"
+    out_path.write_text(html, encoding="utf-8")
+    print(f"Tags page written to {out_path}")
+
+
 def deploy_to_server(build_dir, server):
     remote_path = f"{server}:/var/www/cleberg.net/"
     print(f"Deploying .build/ → {remote_path}")
@@ -430,6 +565,7 @@ def main():
             copy_org_sources()
             update_index_html(html_snippet)
             inject_blog_year_separators()
+            generate_tags_page()
             minify_html("./.build/index.html", "./.build/index.html")
             generate_sitemap()
         if deploy:
@@ -445,6 +581,7 @@ def main():
             copy_org_sources()
             update_index_html(html_snippet)
             inject_blog_year_separators()
+            generate_tags_page()
             minify_html("./.build/index.html", "./.build/index.html")
             generate_sitemap()
         if deploy:
diff --git a/content/blog/2018-11-28-aes-encryption.org b/content/blog/2018-11-28-aes-encryption.org
index 5a6c4d2..34d08dd 100644
--- a/content/blog/2018-11-28-aes-encryption.org
+++ b/content/blog/2018-11-28-aes-encryption.org
@@ -2,6 +2,7 @@
 #+title:       How AES Encryption Works
 #+description: Detailed explanation of AES encryption, including key handling, encryption modes, algorithm structure, and implementation considerations for secure data protection.
 #+slug:        aes-encryption
+#+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 3d30e7f..41989c9 100644
--- a/content/blog/2018-11-28-cpp-compiler.org
+++ b/content/blog/2018-11-28-cpp-compiler.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        cpp-compiler
+#+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 2527d30..7ebec94 100644
--- a/content/blog/2019-01-07-useful-css.org
+++ b/content/blog/2019-01-07-useful-css.org
@@ -2,6 +2,7 @@
 #+title:       Real‑World CSS Techniques: Flexbox, Shadows, and 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.
 #+slug:        useful-css
+#+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 c66c213..eb2e6cf 100644
--- a/content/blog/2019-09-09-audit-analytics.org
+++ b/content/blog/2019-09-09-audit-analytics.org
@@ -2,6 +2,7 @@
 #+title:       Bringing Data Analytics Into Internal Audit
 #+description: Examination of data analytical approaches applied within internal audit functions to improve risk evaluation, process efficiency, and decision support.
 #+slug:        audit-analytics
+#+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 3500504..de073b7 100644
--- a/content/blog/2019-12-03-the-ansoff-matrix.org
+++ b/content/blog/2019-12-03-the-ansoff-matrix.org
@@ -2,6 +2,7 @@
 #+title:       How the Ansoff Matrix Guides Business Growth
 #+description: Analytical description of the Ansoff Matrix, detailing market and product development strategies for measured business expansion and competitive positioning.
 #+slug:        the-ansoff-matrix
+#+filetags: :audit:
 
 * Overview
 
diff --git a/content/blog/2019-12-16-password-security.org b/content/blog/2019-12-16-password-security.org
index 2545953..37477aa 100644
--- a/content/blog/2019-12-16-password-security.org
+++ b/content/blog/2019-12-16-password-security.org
@@ -2,6 +2,7 @@
 #+title:       How to Secure Passwords: Best Practices and NIST Guidelines
 #+description: Compilation of guidelines for password generation, storage, protection, and compliance with established standards such as NIST for maintaining digital security.
 #+slug:        password-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 01a93f2..7e0c723 100644
--- a/content/blog/2020-01-25-linux-software.org
+++ b/content/blog/2020-01-25-linux-software.org
@@ -2,6 +2,7 @@
 #+title:       Linux Essentials: Top Tools and Easy Setup Tips
 #+description: Inventory and description of key Linux applications including graphical and command-line tools, with installation instructions for various distributions.
 #+slug:        linux-software
+#+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 73cd1d9..fc64abb 100644
--- a/content/blog/2020-01-26-steam-on-ntfs.org
+++ b/content/blog/2020-01-26-steam-on-ntfs.org
@@ -2,6 +2,7 @@
 #+title:       How to Get Steam Running Smoothly on NTFS Drives in Linux
 #+description: Procedures for mounting NTFS drives using ntfs-3g to enable reliable execution of Steam gaming software on Linux environments.
 #+slug:        steam-on-ntfs
+#+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 17d31d4..2d01374 100644
--- a/content/blog/2020-02-09-cryptography-basics.org
+++ b/content/blog/2020-02-09-cryptography-basics.org
@@ -2,6 +2,7 @@
 #+title:       A Practical Guide to Encryption, Keys, and Secure Communication
 #+description: Systematic overview of encryption methodologies, key categories, algorithmic frameworks, and their applications in data confidentiality and integrity.
 #+slug:        cryptography
+#+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 77c4547..abdc46a 100644
--- a/content/blog/2020-03-25-session-messenger.org
+++ b/content/blog/2020-03-25-session-messenger.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        session-messenger
+#+filetags: :privacy:
 
 * Privacy Warning
 
diff --git a/content/blog/2020-05-03-homelab.org b/content/blog/2020-05-03-homelab.org
index 3b4b68d..87dbd63 100644
--- a/content/blog/2020-05-03-homelab.org
+++ b/content/blog/2020-05-03-homelab.org
@@ -2,6 +2,7 @@
 #+title:       My Homelab Setup: Gear, Network, and Lessons Learned
 #+description: Comprehensive instructions on assembling and configuring a homelab environment, emphasizing hardware selection, software deployment, and network setup for operational efficiency.
 #+slug:        homelab
+#+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 58baf25..4e79a27 100644
--- a/content/blog/2020-05-19-customizing-ubuntu.org
+++ b/content/blog/2020-05-19-customizing-ubuntu.org
@@ -2,6 +2,7 @@
 #+title:       Tweak Your Ubuntu Look: A Beginner’s Guide to GNOME Customization
 #+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.
 #+slug:        customizing-ubuntu
+#+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 db10e98..b913f58 100644
--- a/content/blog/2020-07-20-video-game-sales.org
+++ b/content/blog/2020-07-20-video-game-sales.org
@@ -2,6 +2,7 @@
 #+title:       A Data-Driven Look at Video Game Sales (1980–2020)
 #+description: Presentation of analyzed data regarding global video game sales, covering platform distributions, genre classifications, and geographic market performance metrics.
 #+slug:        video-game-sales
+#+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 16c52bb..ef4c5c4 100644
--- a/content/blog/2020-07-26-business-analysis.org
+++ b/content/blog/2020-07-26-business-analysis.org
@@ -2,6 +2,7 @@
 #+title:       A Location Intelligence Framework: Mapping Urban Business Clusters with Python
 #+description: Methodology for utilizing data science techniques and Foursquare API data to analyze and select promising business sites within urban environments.
 #+slug:        business-analysis
+#+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 657f99f..364dd1e 100644
--- a/content/blog/2020-08-22-redirect-github-pages.org
+++ b/content/blog/2020-08-22-redirect-github-pages.org
@@ -2,6 +2,7 @@
 #+title:       Configure GitHub Pages to Use Your Root Domain Instead of 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.
 #+slug:        redirect-github-pages
+#+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 ede41a9..5fd3f5f 100644
--- a/content/blog/2020-08-29-php-auth-flow.org
+++ b/content/blog/2020-08-29-php-auth-flow.org
@@ -2,6 +2,7 @@
 #+title:       PHP User Authentication: Create, Validate, and Manage Sessions
 #+description: Comprehensive guide to developing a secure user login system in PHP, including account creation, session management, and logout procedures.
 #+slug:        php-auth-flow
+#+filetags: :web:
 
 * Introduction
 
diff --git a/content/blog/2020-09-01-visual-recognition.org b/content/blog/2020-09-01-visual-recognition.org
index d3d39a0..ccbe71a 100644
--- a/content/blog/2020-09-01-visual-recognition.org
+++ b/content/blog/2020-09-01-visual-recognition.org
@@ -2,6 +2,7 @@
 #+title:       How to Use IBM Watson Visual Recognition API for Image Analysis
 #+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:
 
 * 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 75b64cb..82b66ab 100644
--- a/content/blog/2020-09-22-internal-audit.org
+++ b/content/blog/2020-09-22-internal-audit.org
@@ -2,6 +2,7 @@
 #+title:       The Strategic Role of Internal Audit in Risk, Governance, and Compliance
 #+description: Analysis of internal audit processes, their contribution to risk management, governance frameworks, and compliance monitoring within corporate structures.
 #+slug:        internal-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 e7a1184..ef84104 100644
--- a/content/blog/2020-09-25-happiness-map.org
+++ b/content/blog/2020-09-25-happiness-map.org
@@ -2,6 +2,7 @@
 #+title:       Visualizing Global Happiness: A Choropleth Map with Python and Folium
 #+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.
 #+slug:        happiness-map
+#+filetags: :personal:
 
 * Background Information
 
diff --git a/content/blog/2020-10-12-mediocrity.org b/content/blog/2020-10-12-mediocrity.org
index 88015fd..347e6af 100644
--- a/content/blog/2020-10-12-mediocrity.org
+++ b/content/blog/2020-10-12-mediocrity.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        mediocrity
+#+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 53d12dc..c8995f0 100644
--- a/content/blog/2020-12-27-website-redesign.org
+++ b/content/blog/2020-12-27-website-redesign.org
@@ -2,6 +2,7 @@
 #+title:       Designing for Speed: A 5KB Site That Scores 100s on Lighthouse
 #+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.
 #+slug:        website-redesign
+#+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 ef3262f..e9489d2 100644
--- a/content/blog/2020-12-28-neon-drive.org
+++ b/content/blog/2020-12-28-neon-drive.org
@@ -2,6 +2,7 @@
 #+title:       Outrun the Future: A Review of Neon Drive's Gameplay and Style
 #+description: Description of game mechanics, graphical style, and level design in Neon Drive, an arcade racing game inspired by 1980s synthwave aesthetics.
 #+slug:        neon-drive
+#+filetags: :personal:
 
 * Game Description
 
diff --git a/content/blog/2020-12-29-zork.org b/content/blog/2020-12-29-zork.org
index e57d5bd..47bba75 100644
--- a/content/blog/2020-12-29-zork.org
+++ b/content/blog/2020-12-29-zork.org
@@ -2,6 +2,7 @@
 #+title:       Your First Grue: Getting Started with Zork, the Iconic Text Adventure
 #+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.
 #+slug:        zork
+#+filetags: :personal:
 
 * Download (Free)
 
diff --git a/content/blog/2021-01-01-seum.org b/content/blog/2021-01-01-seum.org
index 9ee3b61..1e908d4 100644
--- a/content/blog/2021-01-01-seum.org
+++ b/content/blog/2021-01-01-seum.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        seum
+#+filetags: :personal:
 
 * Game Description
 
diff --git a/content/blog/2021-01-04-fediverse.org b/content/blog/2021-01-04-fediverse.org
index 1a6f30d..4b2f2cf 100644
--- a/content/blog/2021-01-04-fediverse.org
+++ b/content/blog/2021-01-04-fediverse.org
@@ -2,6 +2,7 @@
 #+title:       Navigating the Fediverse: User Manual for Decentralized Social Media
 #+description: Detailed introduction to the Fediverse network architecture, user registration procedures, platform navigation, and protocols ensuring content decentralization and censorship resistance.
 #+slug:        fediverse
+#+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 f0ee202..f334cf8 100644
--- a/content/blog/2021-01-07-ufw.org
+++ b/content/blog/2021-01-07-ufw.org
@@ -2,6 +2,7 @@
 #+title:       Hardening Ubuntu Servers with UFW: A Step-by-Step Firewall Guide
 #+description: Stepwise instructions for installation, configuration, enabling, and management of the Uncomplicated Firewall utility to secure network interfaces on Ubuntu server environments.
 #+slug:        ufw
+#+filetags: :linux:security:
 
 * Uncomplicated Firewall
 
diff --git a/content/blog/2021-02-19-macos.org b/content/blog/2021-02-19-macos.org
index 994866e..6f61a08 100644
--- a/content/blog/2021-02-19-macos.org
+++ b/content/blog/2021-02-19-macos.org
@@ -2,6 +2,7 @@
 #+title:       macOS for Linux Users: Initial Setup and CLI Customization
 #+description: Comprehensive overview for first-time macOS users transitioning from other OS platforms, including system setup, terminal usage, and user interface customization.
 #+slug:        macos
+#+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 d0f906f..c641ea0 100644
--- a/content/blog/2021-03-19-clone-github-repos.org
+++ b/content/blog/2021-03-19-clone-github-repos.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        clone-github-repos
+#+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 03c09fb..a40464e 100644
--- a/content/blog/2021-03-28-gemini-capsule.org
+++ b/content/blog/2021-03-28-gemini-capsule.org
@@ -2,6 +2,7 @@
 #+title:       Getting Started with Gemini: Deploy Your First Capsule
 #+description: Incremental procedural guide to initiate and maintain a Gemini capsule server. Covers installation, deployment, and operational best practices for beginners.
 #+slug:        gemini-capsule
+#+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 921973d..9f1ce0d 100644
--- a/content/blog/2021-03-28-vaporwave-vs-outrun.org
+++ b/content/blog/2021-03-28-vaporwave-vs-outrun.org
@@ -2,6 +2,7 @@
 #+title:       Exploring Vaporwave and Outrun: Color, Culture, and Sound
 #+description: Systematic examination of Vaporwave and Outrun aesthetic frameworks, focusing on graphical elements, chromatic schemes, musical associations, and period-specific cultural influences.
 #+slug:        vaporwave-vs-outrun
+#+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 fe52559..62a22c1 100644
--- a/content/blog/2021-03-30-vps-web-server.org
+++ b/content/blog/2021-03-30-vps-web-server.org
@@ -2,6 +2,7 @@
 #+title:       From Shared Hosting to VPS: Web Server Setup Made Easy
 #+description: Instructional outline for setting up and maintaining a VPS environment configured for secure and scalable web hosting applications.
 #+slug:        vps-web-server
+#+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 6aabb0b..5812567 100644
--- a/content/blog/2021-04-17-gemini-server.org
+++ b/content/blog/2021-04-17-gemini-server.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        gemini-server
+#+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 43c15dd..8a8d26a 100644
--- a/content/blog/2021-04-23-php-comment-system.org
+++ b/content/blog/2021-04-23-php-comment-system.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        php-comment-system
+#+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 9caa0d4..85afbca 100644
--- a/content/blog/2021-04-28-photography.org
+++ b/content/blog/2021-04-28-photography.org
@@ -2,6 +2,7 @@
 #+title:       Getting Started with Photography: Gear and Best Practices
 #+description: Instructional document covering basic techniques in photography, including equipment selection, operational best practices, and methods for capturing high-quality images.
 #+slug:        photography
+#+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 7ec55dd..35a12aa 100644
--- a/content/blog/2021-05-30-changing-git-authors.org
+++ b/content/blog/2021-05-30-changing-git-authors.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        changing-git-authors
+#+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 9fcd5b6..5e33f4d 100644
--- a/content/blog/2021-07-15-delete-gitlab-repos.org
+++ b/content/blog/2021-07-15-delete-gitlab-repos.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        delete-gitlab-repos
+#+filetags: :personal:
 
 * Background
 
diff --git a/content/blog/2021-08-25-audit-sampling.org b/content/blog/2021-08-25-audit-sampling.org
index 7054acd..5d72ba7 100644
--- a/content/blog/2021-08-25-audit-sampling.org
+++ b/content/blog/2021-08-25-audit-sampling.org
@@ -2,6 +2,7 @@
 #+title:       Audit Sampling Made Easy: Using 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.
 #+slug:        audit-sampling
+#+filetags: :audit:
 
 * Introduction
 
diff --git a/content/blog/2021-10-09-apache-redirect.org b/content/blog/2021-10-09-apache-redirect.org
index d65de79..d532498 100644
--- a/content/blog/2021-10-09-apache-redirect.org
+++ b/content/blog/2021-10-09-apache-redirect.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        apache-redirect
+#+filetags: :web:
 
 * The Problem
 
diff --git a/content/blog/2021-12-04-cisa.org b/content/blog/2021-12-04-cisa.org
index 2025d49..c3683f5 100644
--- a/content/blog/2021-12-04-cisa.org
+++ b/content/blog/2021-12-04-cisa.org
@@ -2,6 +2,7 @@
 #+title:       How I Prepared for and Passed the CISA Exam: A Practical Study Guide
 #+description: Comprehensive outline of study materials, preparation strategies, and procedural advice for passing the CISA examination on the initial attempt.
 #+slug:        cisa
+#+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 519d744..b015a3e 100644
--- a/content/blog/2022-02-10-leaving-the-office.org
+++ b/content/blog/2022-02-10-leaving-the-office.org
@@ -2,6 +2,7 @@
 #+title:       From Cubicles to Home Offices: My Journey Through Changing Workspaces
 #+description: Examination of factors influencing the shift from traditional office environments to remote work, including benefits, constraints, and implementation recommendations.
 #+slug:        leaving-the-office
+#+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 0b30cca..980f5c6 100644
--- a/content/blog/2022-02-10-njalla-dns-api.org
+++ b/content/blog/2022-02-10-njalla-dns-api.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        njalla-dns-api
+#+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 fcafa3d..098eb05 100644
--- a/content/blog/2022-02-16-debian-and-nginx.org
+++ b/content/blog/2022-02-16-debian-and-nginx.org
@@ -2,6 +2,7 @@
 #+title:       Switching to Debian and Nginx: A Modern Web and Gemini Server Migration Walkthrough
 #+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.
 #+slug:        debian-and-nginx
+#+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 5534818..31ad292 100644
--- a/content/blog/2022-02-17-exiftool.org
+++ b/content/blog/2022-02-17-exiftool.org
@@ -2,6 +2,7 @@
 #+title:       Protect Your Privacy: Automating Image Metadata Removal Using Exiftool
 #+description: Technical instructions for utilizing Exiftool to systematically strip metadata from image files to ensure privacy and reduce file size.
 #+slug:        exiftool
+#+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 e6eb0ad..59f2ee6 100644
--- a/content/blog/2022-02-20-nginx-caching.org
+++ b/content/blog/2022-02-20-nginx-caching.org
@@ -2,6 +2,7 @@
 #+title:       How to Configure Nginx for Efficient Static Content Caching
 #+description: Detailed methods for configuring Nginx to cache static resources such as CSS, JavaScript, and images to improve website loading times and resource efficiency.
 #+slug:        nginx-caching
+#+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 eb385f4..143894e 100644
--- a/content/blog/2022-02-22-tuesday.org
+++ b/content/blog/2022-02-22-tuesday.org
@@ -2,6 +2,7 @@
 #+title:       Twosday: Exploring the Unique Palindromic Date of 2-22-22
 #+description: Examination of the date Tuesday, February 22, 2022, highlighting the palindromic properties and expected observations on this specific calendar occurrence.
 #+slug:        tuesday
+#+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 f9b8483..02a12b9 100644
--- a/content/blog/2022-03-02-reliable-notes.org
+++ b/content/blog/2022-03-02-reliable-notes.org
@@ -2,6 +2,7 @@
 #+title:       Reliable Note-Taking with Markdown: Methods for Efficient and Portable Notes
 #+description: Instructions on applying standardized note-taking procedures with Markdown format, including synchronization and cross-platform compatibility considerations.
 #+slug:        reliable-notes
+#+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 c82ebf5..ab30cb3 100644
--- a/content/blog/2022-03-03-financial-database.org
+++ b/content/blog/2022-03-03-financial-database.org
@@ -2,6 +2,7 @@
 #+title:       From Spreadsheets to Databases: Creating a Custom Financial Tracker with Python
 #+description: Procedures for creating and maintaining a personal financial database utilizing SQLite, Python programming language, and Jupyter Notebook interface.
 #+slug:        financial-database
+#+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 3926698..662919a 100644
--- a/content/blog/2022-03-08-plex-migration.org
+++ b/content/blog/2022-03-08-plex-migration.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        plex-migration
+#+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 9b205c7..d7c13f4 100644
--- a/content/blog/2022-03-23-cloudflare-dns-api.org
+++ b/content/blog/2022-03-23-cloudflare-dns-api.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        cloudflare-dns-api
+#+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 ba80dd8..607b625 100644
--- a/content/blog/2022-03-23-nextcloud-on-ubuntu.org
+++ b/content/blog/2022-03-23-nextcloud-on-ubuntu.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        nextcloud-on-ubuntu
+#+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 1295d31..71683db 100644
--- a/content/blog/2022-03-24-server-hardening.org
+++ b/content/blog/2022-03-24-server-hardening.org
@@ -2,6 +2,7 @@
 #+title:       Step-by-Step Guide to Securing Your Home Server with Firewalls, SSH, and 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.
 #+slug:        server-hardening
+#+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 9d58e08..38e2b20 100644
--- a/content/blog/2022-03-26-ssh-mfa.org
+++ b/content/blog/2022-03-26-ssh-mfa.org
@@ -2,6 +2,7 @@
 #+title:       Secure Your SSH Access: Deploying Time-Based One-Time Password Authentication
 #+description: Step-by-step deployment guide for enabling TOTP multi-factor authentication on SSH services using Google Authenticator and Pluggable Authentication Module (PAM) integration.
 #+slug:        ssh-mfa
+#+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 95e035e..8ae5e39 100644
--- a/content/blog/2022-04-02-nginx-reverse-proxy.org
+++ b/content/blog/2022-04-02-nginx-reverse-proxy.org
@@ -2,6 +2,7 @@
 #+title:       How to Configure Nginx as a Reverse Proxy on Ubuntu Server
 #+description: Technical guide for setting up Nginx server to operate as a reverse proxy on Ubuntu systems, including configuration files setup and operational parameters.
 #+slug:        nginx-reverse-proxy
+#+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 cb91d42..37402d1 100644
--- a/content/blog/2022-04-09-pinetime.org
+++ b/content/blog/2022-04-09-pinetime.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        pinetime
+#+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 8004108..4693bc5 100644
--- a/content/blog/2022-06-01-ditching-cloudflare.org
+++ b/content/blog/2022-06-01-ditching-cloudflare.org
@@ -2,6 +2,7 @@
 #+title:       Migrating from Cloudflare to Njalla: A Privacy-Focused DNS and Domain Management Transition
 #+description: Evaluation and procedural explanation for migrating DNS management services from Cloudflare to Njalla, with emphasis on privacy controls and domain registration mechanics.
 #+slug:        ditching-cloudflare
+#+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 62b1dee..32d954c 100644
--- a/content/blog/2022-06-07-self-hosting-freshrss.org
+++ b/content/blog/2022-06-07-self-hosting-freshrss.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        self-hosting-freshrss
+#+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 3c59e42..dad34fb 100644
--- a/content/blog/2022-06-16-terminal-lifestyle.org
+++ b/content/blog/2022-06-16-terminal-lifestyle.org
@@ -2,6 +2,7 @@
 #+title:       Living the Terminal Lifestyle: Efficient Workflows for Focused Computing
 #+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.
 #+slug:        terminal-lifestyle
+#+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 18292f3..52ba93d 100644
--- a/content/blog/2022-06-22-daily-poetry.org
+++ b/content/blog/2022-06-22-daily-poetry.org
@@ -2,6 +2,7 @@
 #+title:       How to Receive a Daily Dose of Poetry via Automated Email
 #+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.
 #+slug:        daily-poetry
+#+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 4bf5384..a9c97d1 100644
--- a/content/blog/2022-06-24-fedora-i3.org
+++ b/content/blog/2022-06-24-fedora-i3.org
@@ -2,6 +2,7 @@
 #+title:       My Journey Back to Linux: Setting Up Fedora with i3 Window Manager
 #+description: Examination of the transition from macOS to Linux, including a detailed description of Fedora operating system installation and i3 window manager configuration.
 #+slug:        fedora-i3
+#+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 d5d5159..984fdfd 100644
--- a/content/blog/2022-07-01-git-server.org
+++ b/content/blog/2022-07-01-git-server.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        git-server
+#+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 6a9d114..1398c49 100644
--- a/content/blog/2022-07-14-gnupg.org
+++ b/content/blog/2022-07-14-gnupg.org
@@ -2,6 +2,7 @@
 #+title:       Getting Started with GPG: Secure Encryption, Signing, and Key Usage
 #+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.
 #+slug:        gnupg
+#+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 811a1f6..1670d0b 100644
--- a/content/blog/2022-07-25-curseradio.org
+++ b/content/blog/2022-07-25-curseradio.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        curseradio
+#+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 9457001..544754e 100644
--- a/content/blog/2022-07-30-flac-to-opus.org
+++ b/content/blog/2022-07-30-flac-to-opus.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        flac-to-opus
+#+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 1fbc9d5..3b974a3 100644
--- a/content/blog/2022-07-31-bash-it.org
+++ b/content/blog/2022-07-31-bash-it.org
@@ -2,6 +2,7 @@
 #+title:       Boosting Bash Productivity: Using Bash-it and ble.sh for Plugins and Autosuggestions
 #+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.
 #+slug:        bash-it
+#+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 ff5814d..bf1a937 100644
--- a/content/blog/2022-08-31-privacy-com-changes.org
+++ b/content/blog/2022-08-31-privacy-com-changes.org
@@ -2,6 +2,7 @@
 #+title:       Privacy.com Shifts From Prepaid Debit to Charge Card: What Users Need to Know
 #+description: Detailed examination of modifications to Privacy.com service terms and their implications on user privacy and payment security protocols.
 #+slug:        privacy-com-changes
+#+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 3b01c54..e1eda1c 100644
--- a/content/blog/2022-09-17-serenity-os.org
+++ b/content/blog/2022-09-17-serenity-os.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        serenity-os
+#+filetags: :linux:
 
 * Overview
 
diff --git a/content/blog/2022-09-21-graphene-os.org b/content/blog/2022-09-21-graphene-os.org
index 9b84843..f831c36 100644
--- a/content/blog/2022-09-21-graphene-os.org
+++ b/content/blog/2022-09-21-graphene-os.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        graphene-os
+#+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 24afc76..53869de 100644
--- a/content/blog/2022-10-04-mtp-linux.org
+++ b/content/blog/2022-10-04-mtp-linux.org
@@ -2,6 +2,7 @@
 #+title:       How to Mount MTP Mobile Devices on Fedora Linux Using jmtpfs
 #+description: Instructions for mounting and accessing Media Transfer Protocol (MTP) compatible mobile devices on Fedora Linux using jmtpfs for file transfer and management.
 #+slug:        mtp-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 fa38546..226c5e0 100644
--- a/content/blog/2022-10-04-syncthing.org
+++ b/content/blog/2022-10-04-syncthing.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        syncthing
+#+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 977985d..629f6a3 100644
--- a/content/blog/2022-10-22-alpine-linux.org
+++ b/content/blog/2022-10-22-alpine-linux.org
@@ -2,6 +2,7 @@
 #+title:       Alpine Linux Essentials: Installing and Setting Up a Secure Minimal Server
 #+description: Detailed procedure for deploying Alpine Linux to achieve a secure, lightweight server environment optimized for web hosting and containerization.
 #+slug:        alpine-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 7a99ce4..a91998c 100644
--- a/content/blog/2022-10-30-linux-display-manager.org
+++ b/content/blog/2022-10-30-linux-display-manager.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        linux-display-manager
+#+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 a8df0e2..55dc50e 100644
--- a/content/blog/2022-11-07-self-hosting-matrix.org
+++ b/content/blog/2022-11-07-self-hosting-matrix.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        self-hosting-matrix
+#+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 420696a..3d471f7 100644
--- a/content/blog/2022-11-11-nginx-tmp-errors.org
+++ b/content/blog/2022-11-11-nginx-tmp-errors.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        nginx-tmp-errors
+#+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 df6b6df..ab700fd 100644
--- a/content/blog/2022-11-27-server-build.org
+++ b/content/blog/2022-11-27-server-build.org
@@ -2,6 +2,7 @@
 #+title:       Building a High-Performance Rack-Mounted Server with Consumer PC Components
 #+description: Detailed instructions on selecting components, assembling, and configuring a rack-mounted server suitable for advanced computing tasks in a professional or laboratory setting.
 #+slug:        server-build
+#+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 06689f7..406937e 100644
--- a/content/blog/2022-11-29-nginx-referrer-ban-list.org
+++ b/content/blog/2022-11-29-nginx-referrer-ban-list.org
@@ -2,6 +2,7 @@
 #+title:       How to Block Unwanted HTTP Referrers in Nginx Using a Ban List
 #+description: Technical guide to implementing a referrer ban list in Nginx configurations to prevent access from undesired domains and improve web server security.
 #+slug:        nginx-referrer-ban-list
+#+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 31a1742..3150589 100644
--- a/content/blog/2022-12-01-nginx-compression.org
+++ b/content/blog/2022-12-01-nginx-compression.org
@@ -2,6 +2,7 @@
 #+title:       Optimizing Nginx with GZIP: A Step-by-Step Guide to Text Compression
 #+description: Procedures for activating and configuring GZIP compression in Nginx to decrease data transmission size, reduce bandwidth consumption, and accelerate page load times.
 #+slug:        nginx-compression
+#+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 823966e..02f45da 100644
--- a/content/blog/2022-12-07-nginx-wildcard-redirect.org
+++ b/content/blog/2022-12-07-nginx-wildcard-redirect.org
@@ -2,6 +2,7 @@
 #+title:       Nginx Wildcard Redirects: Seamlessly Redirecting Domains and Subdomains with Trailing Paths
 #+description: Instructional steps for applying regex-based redirects in Nginx to manage subdomain routing and trailing path modifications effectively.
 #+slug:        nginx-wildcard-redirect
+#+filetags: :web:
 
 * Problem
 
diff --git a/content/blog/2022-12-17-st.org b/content/blog/2022-12-17-st.org
index 8413187..87a76b1 100644
--- a/content/blog/2022-12-17-st.org
+++ b/content/blog/2022-12-17-st.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        st
+#+filetags: :linux:
 
 * st
 
diff --git a/content/blog/2022-12-23-alpine-desktop.org b/content/blog/2022-12-23-alpine-desktop.org
index 8533cb7..b841d9d 100644
--- a/content/blog/2022-12-23-alpine-desktop.org
+++ b/content/blog/2022-12-23-alpine-desktop.org
@@ -2,6 +2,7 @@
 #+title:       How to Set Up Alpine Linux as a Desktop OS with Sway
 #+description: Stepwise procedures for installing and setting up Alpine Linux as a desktop operating system, including window manager setup and relevant system adjustments.
 #+slug:        alpine-desktop
+#+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 cc55e90..02f4f0b 100644
--- a/content/blog/2023-01-03-recent-website-changes.org
+++ b/content/blog/2023-01-03-recent-website-changes.org
@@ -2,6 +2,7 @@
 #+title:       2023 Website Updates: Minimalist Style, Accessibility Improvements, and Content Prioritization
 #+description: Documentation of significant changes applied to site design, layout, and accessibility features to enhance navigability and content clarity.
 #+slug:        recent-website-changes
+#+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 7489909..ef1aeda 100644
--- a/content/blog/2023-01-05-mass-unlike-tumblr-posts.org
+++ b/content/blog/2023-01-05-mass-unlike-tumblr-posts.org
@@ -2,6 +2,7 @@
 #+title:       How to Quickly Remove All Likes on Tumblr Desktop
 #+description: Instructions for executing a JavaScript script to automate the mass unlike operation for Tumblr posts without requiring additional software.
 #+slug:        mass-unlike-tumblr-posts
+#+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 5435a01..6ac79af 100644
--- a/content/blog/2023-01-08-fedora-login-manager.org
+++ b/content/blog/2023-01-08-fedora-login-manager.org
@@ -2,6 +2,7 @@
 #+title:       How to Remove Fedora i3's Login Manager and Start i3 Manually
 #+description: Step-by-step guide for uninstalling the default Fedora i3 login manager and configuring system to launch i3 window manager manually.
 #+slug:        fedora-login-manager
+#+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 08deff5..4ed67dd 100644
--- a/content/blog/2023-01-21-flatpak-symlinks.org
+++ b/content/blog/2023-01-21-flatpak-symlinks.org
@@ -2,6 +2,7 @@
 #+title:       Simplify Flatpak Commands: Making Symlinks for Easier App Launching
 #+description: Detailed instructions for establishing symbolic links for Flatpak applications to facilitate faster execution from terminal or application launcher environments.
 #+slug:        flatpak-symlinks
+#+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 0bc5d84..2e1d862 100644
--- a/content/blog/2023-01-23-random-wireguard.org
+++ b/content/blog/2023-01-23-random-wireguard.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        random-wireguard
+#+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 8c399d5..bf2ac61 100644
--- a/content/blog/2023-01-28-self-hosting-wger.org
+++ b/content/blog/2023-01-28-self-hosting-wger.org
@@ -2,6 +2,7 @@
 #+title:       Self-Hosting Guide: Wger
 #+description: Comprehensive steps for installing, configuring, and operating the Wger workout management application on a dedicated server platform.
 #+slug:        self-hosting-wger
+#+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 9173af7..a46b63e 100644
--- a/content/blog/2023-02-02-exploring-hare.org
+++ b/content/blog/2023-02-02-exploring-hare.org
@@ -2,6 +2,7 @@
 #+title:       Getting Started with the Hare Language
 #+description: Overview of the Hare programming language features, installation procedure, and elementary programming examples targeting system-level development.
 #+slug:        exploring-hare
+#+filetags: :linux:
 
 * A Quick Note
 
diff --git a/content/blog/2023-05-22-burnout.org b/content/blog/2023-05-22-burnout.org
index e8b25fc..6dccdc8 100644
--- a/content/blog/2023-05-22-burnout.org
+++ b/content/blog/2023-05-22-burnout.org
@@ -2,6 +2,7 @@
 #+title:       Navigating Burnout in Audit and Consulting: A Season Without Rest
 #+description: Examination of burnout phenomena accompanied by strategies and practical approaches for workload management and restoration of optimal functioning.
 #+slug:        burnout
+#+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 6cc41e3..4c6eac3 100644
--- a/content/blog/2023-06-08-goaccess-geoip.org
+++ b/content/blog/2023-06-08-goaccess-geoip.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        goaccess-geoip
+#+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 24578f5..0f75bc8 100644
--- a/content/blog/2023-06-08-self-hosting-baikal.org
+++ b/content/blog/2023-06-08-self-hosting-baikal.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        self-hosting-baikal
+#+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 7d114a5..6866f1a 100644
--- a/content/blog/2023-06-18-unifi-ip-blocklist.org
+++ b/content/blog/2023-06-18-unifi-ip-blocklist.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        unifi-ip-blocklist
+#+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 28eaaa5..c415cfc 100644
--- a/content/blog/2023-06-20-audit-review-template.org
+++ b/content/blog/2023-06-20-audit-review-template.org
@@ -2,6 +2,7 @@
 #+title:       Audit Testing Review Checklist
 #+description: Practical audit testing review template with detailed steps to support comprehensive evaluation of financial audits and SOC reports.
 #+slug:        audit-review-template
+#+filetags: :audit:
 
 * Overview
 
diff --git a/content/blog/2023-06-23-byobu.org b/content/blog/2023-06-23-byobu.org
index 09445a1..61585de 100644
--- a/content/blog/2023-06-23-byobu.org
+++ b/content/blog/2023-06-23-byobu.org
@@ -2,6 +2,7 @@
 #+title:       Using Byobu for Efficient Terminal Multiplexing
 #+description: Detailed overview of Byobu terminal multiplexer features, configuration settings, session management, and keybindings to enhance command-line efficiency.
 #+slug:        byobu
+#+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 4969097..caab6d9 100644
--- a/content/blog/2023-06-23-self-hosting-convos.org
+++ b/content/blog/2023-06-23-self-hosting-convos.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        self-hosting-convos
+#+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 8615b31..478fac5 100644
--- a/content/blog/2023-06-28-backblaze-b2.org
+++ b/content/blog/2023-06-28-backblaze-b2.org
@@ -2,6 +2,7 @@
 #+title:       Automating Secure Backups with Backblaze B2 and b2 CLI
 #+description: Methodical guide for configuring and utilizing Backblaze B2 cloud storage services to perform reliable and secure offsite data backups.
 #+slug:        backblaze-b2
+#+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 b40873d..6a7ff23 100644
--- a/content/blog/2023-06-30-self-hosting-voyager.org
+++ b/content/blog/2023-06-30-self-hosting-voyager.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        self-hosting-voyager
+#+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 4347963..e1cff23 100644
--- a/content/blog/2023-07-12-wireguard-lan.org
+++ b/content/blog/2023-07-12-wireguard-lan.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        wireguard-lan
+#+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 feb11b2..729e1a8 100644
--- a/content/blog/2023-07-19-plex-transcoder-errors.org
+++ b/content/blog/2023-07-19-plex-transcoder-errors.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        plex-transcoder-errors
+#+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 6885848..4282227 100644
--- a/content/blog/2023-08-18-agile-auditing.org
+++ b/content/blog/2023-08-18-agile-auditing.org
@@ -2,6 +2,7 @@
 #+title:       Agile Auditing Framework: Using Scrum and Kanban in Audit Projects
 #+description: Detailed examination of Agile auditing methodologies, including Scrum and Kanban frameworks, with practical steps for application in audit processes.
 #+slug:        agile-auditing
+#+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 69589aa..8b8488e 100644
--- a/content/blog/2023-09-15-self-hosting-gitweb.org
+++ b/content/blog/2023-09-15-self-hosting-gitweb.org
@@ -2,6 +2,7 @@
 #+title:       Self-Hosting Guide: GitWeb
 #+description: Stepwise instructions for deploying GitWeb on Linux servers using Nginx, configuring fastcgi, and managing git repositories effectively.
 #+slug:        self-hosting-gitweb
+#+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 8287d78..eb976cd 100644
--- a/content/blog/2023-09-19-audit-sql-scripts.org
+++ b/content/blog/2023-09-19-audit-sql-scripts.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        audit-sql-scripts
+#+filetags: :audit:
 
 * Overview
 
diff --git a/content/blog/2023-10-04-digital-minimalism.org b/content/blog/2023-10-04-digital-minimalism.org
index b376b61..056bbe1 100644
--- a/content/blog/2023-10-04-digital-minimalism.org
+++ b/content/blog/2023-10-04-digital-minimalism.org
@@ -2,6 +2,7 @@
 #+title:       Digital Minimalism: Reducing Distractions
 #+description: Practical guide for minimizing digital clutter and optimizing work focus by applying digital minimalism tactics.
 #+slug:        digital-minimalism
+#+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 8e10ea8..e48969f 100644
--- a/content/blog/2023-10-11-self-hosting-authelia.org
+++ b/content/blog/2023-10-11-self-hosting-authelia.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        self-hosting-authelia
+#+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 04a83cd..92250ec 100644
--- a/content/blog/2023-10-15-alpine-ssh-hardening.org
+++ b/content/blog/2023-10-15-alpine-ssh-hardening.org
@@ -2,6 +2,7 @@
 #+title:       Alpine Linux SSH Hardening Guide
 #+description: Detailed guide to enhance Alpine Linux SSH server security through configuration adjustments and vulnerability mitigation.
 #+slug:        alpine-ssh-hardening
+#+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 d2dc72e..fb2b8c1 100644
--- a/content/blog/2023-10-17-self-hosting-anonymousoverflow.org
+++ b/content/blog/2023-10-17-self-hosting-anonymousoverflow.org
@@ -2,6 +2,7 @@
 #+title:       Self-Hosting Guide: AnonymousOverflow
 #+description: Detailed installation and setup instructions for the AnonymousOverflow application using Docker Compose and Nginx reverse proxy.
 #+slug:        self-hosting-anonymousoverflow
+#+filetags: :linux:self-hosting:
 
 * Overview
 
diff --git a/content/blog/2023-11-08-scli.org b/content/blog/2023-11-08-scli.org
index 245ff89..661ef76 100644
--- a/content/blog/2023-11-08-scli.org
+++ b/content/blog/2023-11-08-scli.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        scli
+#+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 310b97b..7b86d27 100644
--- a/content/blog/2023-12-03-unifi-nextdns.org
+++ b/content/blog/2023-12-03-unifi-nextdns.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        unifi-nextdns
+#+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 df5fd48..dd9a14b 100644
--- a/content/blog/2024-01-08-dont-say-hello.org
+++ b/content/blog/2024-01-08-dont-say-hello.org
@@ -2,6 +2,7 @@
 #+title:       Don't Say Hello
 #+description: Technical recommendations for improving professional communication by eliminating non-essential introductory phrases to enhance message clarity.
 #+slug:        dont-say-hello
+#+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 d2d4b2c..05cd48c 100644
--- a/content/blog/2024-01-09-macos-customization.org
+++ b/content/blog/2024-01-09-macos-customization.org
@@ -2,6 +2,7 @@
 #+title:       A Guide to Customizing macOS with Terminal, Window Managers, and Widgets
 #+description: Detailed overview of methods and tools for modifying macOS system settings, including terminal usage, window management, and interface customization.
 #+slug:        macos-customization
+#+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 14e71ed..4c00670 100644
--- a/content/blog/2024-01-13-local-llm.org
+++ b/content/blog/2024-01-13-local-llm.org
@@ -2,6 +2,7 @@
 #+title:       Running Local Large Language Models on macOS and iOS: A Practical Guide
 #+description: Technical guide to deploying and running local large language models on macOS and iOS devices focusing on open-source implementations and privacy considerations.
 #+slug:        local-llm
+#+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 3a2f324..4499904 100644
--- a/content/blog/2024-01-26-audit-dashboard.org
+++ b/content/blog/2024-01-26-audit-dashboard.org
@@ -2,6 +2,7 @@
 #+title:       Building an Interactive Audit Dashboard with Alteryx and Power BI
 #+description: Instructions for transforming audit data into dynamic dashboards via data preparation with Alteryx and visualization using Microsoft Power BI.
 #+slug:        audit-dashboard
+#+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 3915a3b..056264b 100644
--- a/content/blog/2024-01-27-tableau-dashboard.org
+++ b/content/blog/2024-01-27-tableau-dashboard.org
@@ -2,6 +2,7 @@
 #+title:       Preparing and Visualizing Omaha Crime Data (2015-2023) in Tableau
 #+description: Detailed procedure for data preparation and interactive visualization of crime trends in Omaha, using Tableau software from 2015 through 2023 data.
 #+slug:        tableau-dashboard
+#+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 b1a2591..35c9769 100644
--- a/content/blog/2024-02-06-zfs.org
+++ b/content/blog/2024-02-06-zfs.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        zfs
+#+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 76f5d7f..6c24845 100644
--- a/content/blog/2024-02-13-ubuntu-emergency-mode.org
+++ b/content/blog/2024-02-13-ubuntu-emergency-mode.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        ubuntu-emergency-mode
+#+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 abd6ac9..bc10b20 100644
--- a/content/blog/2024-02-21-self-hosting-otter-wiki.org
+++ b/content/blog/2024-02-21-self-hosting-otter-wiki.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        self-hosting-otter-wiki
+#+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 720bb37..4ac665f 100644
--- a/content/blog/2024-03-13-doom-emacs.org
+++ b/content/blog/2024-03-13-doom-emacs.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        doom-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 c8de166..f5c27db 100644
--- a/content/blog/2024-03-15-self-hosting-ddns-updater.org
+++ b/content/blog/2024-03-15-self-hosting-ddns-updater.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        self-hosting-ddns-updater
+#+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 2f5a328..ee19ba5 100644
--- a/content/blog/2024-03-29-org-blog.org
+++ b/content/blog/2024-03-29-org-blog.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        org-blog
+#+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 4e1db0f..f86352d 100644
--- a/content/blog/2024-04-06-convert-onenote-to-markdown.org
+++ b/content/blog/2024-04-06-convert-onenote-to-markdown.org
@@ -2,6 +2,7 @@
 #+title:       Converting OneNote Exports to Markdown and Org-Mode
 #+description: Detailed conversion instructions to transform OneNote document files into Markdown or Org-Mode formats using Pandoc command-line utility on Windows systems.
 #+slug:        convert-onenote-to-markdown
+#+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 005add9..fbdbe3c 100644
--- a/content/blog/2024-04-08-docker-local-web-server.org
+++ b/content/blog/2024-04-08-docker-local-web-server.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        docker-local-web-server
+#+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 677fb1a..8375449 100644
--- a/content/blog/2024-04-18-mu4e.org
+++ b/content/blog/2024-04-18-mu4e.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        mu4e
+#+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 1b49bd0..c7d9ebe 100644
--- a/content/blog/2024-05-03-ubuntu-on-macos.org
+++ b/content/blog/2024-05-03-ubuntu-on-macos.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        ubuntu-on-macos
+#+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 e3bea4f..1bb647c 100644
--- a/content/blog/2024-06-19-deprecated-trusted-gpg-fix.org
+++ b/content/blog/2024-06-19-deprecated-trusted-gpg-fix.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        deprecated-trusted-gpg-fix
+#+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 5feb0d8..5ebcced 100644
--- a/content/blog/2024-07-11-emacs-on-ipad.org
+++ b/content/blog/2024-07-11-emacs-on-ipad.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        emacs-on-ipad
+#+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 fb297be..0f25c5d 100644
--- a/content/blog/2024-08-11-org-mode-features.org
+++ b/content/blog/2024-08-11-org-mode-features.org
@@ -2,6 +2,7 @@
 #+title:       Essential Org-Mode Features for Productivity
 #+description: Detailed overview of essential Org-Mode functionalities focusing on task organization, note-taking, and workflow optimization.
 #+slug:        org-mode-features
+#+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 8df98d1..25816e7 100644
--- a/content/blog/2024-08-25-n8n-sentiment-analysis.org
+++ b/content/blog/2024-08-25-n8n-sentiment-analysis.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        n8n-sentiment-analysis
+#+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 0f460ac..63ad1d4 100644
--- a/content/blog/2024-09-20-prometheus-grafana-cloud.org
+++ b/content/blog/2024-09-20-prometheus-grafana-cloud.org
@@ -2,6 +2,7 @@
 #+title:       Linux Server Monitoring with Prometheus & Grafana Cloud
 #+description: Stepwise method for deploying Prometheus with Docker to monitor Linux servers and integrating Grafana Cloud for visualization and analysis of collected metrics.
 #+slug:        prometheus-grafana-cloud
+#+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 92ae2d4..0a25a0a 100644
--- a/content/blog/2024-09-23-self-hosting-transmission.org
+++ b/content/blog/2024-09-23-self-hosting-transmission.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        self-hosting-transmission
+#+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 eeeaa5d..362951d 100644
--- a/content/blog/2024-10-31-continue-ollama-code-assistant.org
+++ b/content/blog/2024-10-31-continue-ollama-code-assistant.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        continue-ollama-code-assistant
+#+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 7737746..ec1abc8 100644
--- a/content/blog/2024-12-27-self-hosting-the-lounge.org
+++ b/content/blog/2024-12-27-self-hosting-the-lounge.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        self-hosting-the-lounge
+#+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 b1ac923..4e57c15 100644
--- a/content/blog/2025-01-23-self-hosting-tandoor.org
+++ b/content/blog/2025-01-23-self-hosting-tandoor.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        self-hosting-tandoor
+#+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 18c3d47..7b7ff32 100644
--- a/content/blog/2025-02-11-obscura-vpn.org
+++ b/content/blog/2025-02-11-obscura-vpn.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        obscura-vpn
+#+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 2b674b4..9db2044 100644
--- a/content/blog/2025-02-24-email-migration.org
+++ b/content/blog/2025-02-24-email-migration.org
@@ -2,6 +2,7 @@
 #+title:       How I Transferred 5000+ Emails from Proton Mail to Migadu
 #+description: Detailed instructions describing the process and considerations involved in transferring email data securely from Proton Mail to Migadu email hosting.
 #+slug:        email-migration
+#+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 889527d..2955944 100644
--- a/content/blog/2025-04-05-git-mirror.org
+++ b/content/blog/2025-04-05-git-mirror.org
@@ -2,6 +2,7 @@
 #+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.
 #+slug:        git-mirror
+#+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 42f2c71..03395d8 100644
--- a/content/blog/2025-05-02-asahi-linux.org
+++ b/content/blog/2025-05-02-asahi-linux.org
@@ -2,6 +2,7 @@
 #+title:       Running Asahi Linux on Apple M2 MacBook Pro: My Experience
 #+description: Documented analysis of installation procedure, system performance, and software compatibility for running Asahi Linux on the Apple M2 MacBook Pro 16-inch model.
 #+slug:        asahi-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 d02aeda..38bae52 100644
--- a/content/blog/2025-05-30-it-audit-career.org
+++ b/content/blog/2025-05-30-it-audit-career.org
@@ -2,6 +2,7 @@
 #+title:       Mastering Emerging Tech for IT Audit Career Growth
 #+description: Instructional content detailing actionable knowledge areas including artificial intelligence, blockchain, cloud computing, DevOps, and automation relevant for audit professionals.
 #+slug:        it-audit-career
+#+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 6aca618..46fc197 100644
--- a/content/blog/2025-06-02-private-ios-apps.org
+++ b/content/blog/2025-06-02-private-ios-apps.org
@@ -2,6 +2,7 @@
 #+title:       Privacy-First iOS Apps for Minimalists
 #+description: Curated listing of iOS applications prioritized for privacy preservation and data security, targeted at users requiring minimal data exposure.
 #+slug:        private-ios-apps
+#+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 3cecfe6..2eef68b 100644
--- a/content/blog/2025-09-04-website-redesign.org
+++ b/content/blog/2025-09-04-website-redesign.org
@@ -2,6 +2,7 @@
 #+title: Crafting a More Human-Centric Design for My Website
 #+description: Read this post to understand my latest website redesign and the context for the refresh.
 #+slug: human-website-design
+#+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 4e61502..000b982 100644
--- a/content/blog/2025-09-25-minimalist-website-redesign.org
+++ b/content/blog/2025-09-25-minimalist-website-redesign.org
@@ -2,6 +2,7 @@
 #+title: Simplifying the Site: A Minimalist Approach
 #+description: This post details a complete redesign of a blog post, stripping away extraneous CSS and HTML elements to prioritize readability and user experience.
 #+slug: minimalist-website-redesign
+#+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 d178847..4ffe8c8 100644
--- a/content/blog/2025-10-03-privacy-toolkit.org
+++ b/content/blog/2025-10-03-privacy-toolkit.org
@@ -2,6 +2,7 @@
 #+title: My Privacy Toolkit
 #+description: Learn about the tools I use to keep my life private and data secure.
 #+slug: privacy-toolkit
+#+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 52f94f9..5676ca1 100644
--- a/content/blog/2025-10-06-rocket-league-macos.org
+++ b/content/blog/2025-10-06-rocket-league-macos.org
@@ -2,6 +2,7 @@
 #+title: Playing Rocket League on macOS via CrossOver
 #+description: Learn how to play Rocket League on macOS via CrossOver.
 #+slug: rocket-league-macos
+#+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 7f68cc3..8bbb112 100644
--- a/content/blog/2025-10-24-digital-garden.org
+++ b/content/blog/2025-10-24-digital-garden.org
@@ -2,6 +2,7 @@
 #+title: Digital Garden
 #+description: A post dedicated to digital gardens, an online space for personal knowledge management, creative exploration, and reflection.
 #+slug: digital-garden
+#+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 b73bc10..6c0185a 100644
--- a/content/blog/2025-11-02-aerc-macos.org
+++ b/content/blog/2025-11-02-aerc-macos.org
@@ -2,6 +2,7 @@
 #+title: Using aerc on macOS
 #+description: Learn how I use aerc, a TUI email client, on macOS.
 #+slug: aerc-macos
+#+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 a40109b..e293018 100644
--- a/content/blog/2025-11-13-wcag.org
+++ b/content/blog/2025-11-13-wcag.org
@@ -2,6 +2,7 @@
 #+title: Striving for 100% WCAG 2 Compliance
 #+description: Read on to learn more about how I've ensured my humble site is compliant with WCAG 2.
 #+slug: wcag
+#+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 6029ff2..7a5713b 100644
--- a/content/blog/2025-11-23-it-audit-ai.org
+++ b/content/blog/2025-11-23-it-audit-ai.org
@@ -2,6 +2,7 @@
 #+title: Practical Uses for AI in IT Audit
 #+description: Learn how I'm currently using AI in my role in Technology Assurance (i.e., IT Audit) at KPMG.
 #+slug: it-audit-ai
+#+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 100bb02..1de7b9f 100644
--- a/content/blog/2025-12-06-self-hosting-tor.org
+++ b/content/blog/2025-12-06-self-hosting-tor.org
@@ -2,6 +2,7 @@
 #+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!
 #+slug: self-hosting-tor
+#+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 4dcbcae..8990a48 100644
--- a/content/blog/2025-12-20-self-hosting-home-assistant.org
+++ b/content/blog/2025-12-20-self-hosting-home-assistant.org
@@ -2,6 +2,7 @@
 #+title: Self-Hosting Guide: Home Assistant
 #+description: A guide to configuring and customizing Home Assistant.
 #+slug: self-hosting-home-assistant
+#+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 0cc1438..afd764d 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
@@ -2,6 +2,7 @@
 #+title: Emacs Carnival: “This Year, I Will...”
 #+description: My response to the Emacs Carnival post for January 2026.
 #+slug: emacs-carnival-2026-01-this-year-i-will
+#+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 52f4bef..0809851 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
@@ -2,6 +2,7 @@
 #+title: Emacs Carnival: "Completion"
 #+description: My response to the Emacs Carnival post for February 2026.
 #+slug: emacs-carnival-2026-02-completion
+#+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 f891507..c5f24b8 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
@@ -2,6 +2,7 @@
 #+title: IndieWeb Carnival: "Intersecting Interests"
 #+description: Contrasting my passions with technology vs. natural hobbies.
 #+slug: indiweb-carnival-2026-02-intersecting-interests
+#+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 142a140..898ff1a 100644
--- a/content/blog/2026-02-08-gnu-stow.org
+++ b/content/blog/2026-02-08-gnu-stow.org
@@ -2,6 +2,7 @@
 #+title: Managing My Dotfiles with GNU Stow and Git
 #+description: Learn how I use GNU Stow to manage my user dotfiles and configurations.
 #+slug: gnu-stow
+#+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 db6c99a..6462049 100644
--- a/content/blog/2026-02-12-automating-weblorg-deployments.org
+++ b/content/blog/2026-02-12-automating-weblorg-deployments.org
@@ -2,6 +2,7 @@
 #+title: Automating Weblorg Deployments with GitHub Actions
 #+description: Learn how I've automated all deployment for my org-mode blog with GitHub Actions and a custom Docker image.
 #+slug: automating-weblorg-deployments
+#+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 9dbd48c..32b232f 100644
--- a/content/blog/2026-02-21-auditing-aws-iam.org
+++ b/content/blog/2026-02-21-auditing-aws-iam.org
@@ -2,6 +2,7 @@
 #+title: Auditing AWS IAM Users
 #+description: Learn how to audit IAM user assignments in AWS.
 #+slug: auditing-aws-iam
+#+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 31a7a9b..bdde783 100644
--- a/content/blog/2026-02-21-auditing-aws-passwords.org
+++ b/content/blog/2026-02-21-auditing-aws-passwords.org
@@ -2,6 +2,7 @@
 #+title: Auditing AWS Passwords
 #+description: Learn how to audit passwords in AWS.
 #+slug: auditing-aws-passwords
+#+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 70fb503..beab7d8 100644
--- a/content/blog/2026-03-03-auditing-aws-s3.org
+++ b/content/blog/2026-03-03-auditing-aws-s3.org
@@ -2,6 +2,7 @@
 #+title: Auditing AWS S3 Buckets
 #+description: Learn how to audit AWS S3 buckets for public access.
 #+slug: auditing-aws-s3
+#+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
diff --git a/tag_preview.py b/tag_preview.py
new file mode 100644
index 0000000..d3e28c7
--- /dev/null
+++ b/tag_preview.py
@@ -0,0 +1,177 @@
+#!/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/styles.css b/theme/static/styles.css
index 36fbedf..3e4577b 100644
--- a/theme/static/styles.css
+++ b/theme/static/styles.css
@@ -581,3 +581,17 @@ img:hover { filter: grayscale(0); }
 @media (max-width: 480px) {
   .masthead nav li { width: 100%; }
 }
+
+/* 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);
+}
diff --git a/theme/templates/base.html b/theme/templates/base.html
index 6f585b2..8eca335 100644
--- a/theme/templates/base.html
+++ b/theme/templates/base.html
@@ -21,6 +21,7 @@
         <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>