Bee Hub (This Site) Hugo documentation hub โ€” how it works and how to edit it

BeeDifferent Hub is a Hugo-powered personal reference site. Source lives on the Mac Studio; deploy-vps.sh builds with Hugo and pushes to two live hosts โ€” the public VPS and the internal CT103.

Build pipeline (every 30 min via cron)

deploy-vps.sh runs these steps in order โ€” any failure before Hugo aborts the deploy without touching the live trees:

  1. Validate TASKS.md (~/scripts/validate-tasks.sh) โ€” structural check, abort on error.
  2. Validate skills (~/scripts/validate-skills.sh) โ€” every SKILL.md frontmatter parses.
  3. Regenerate BEE_HUB_INDEX.md (scripts/build-index.py) โ€” walks content/, emits the ~76 KB greppable map at ~/Sync/ED/BEE_HUB_INDEX.md. Also writes content/recent/_index.md with the 40 most recently-edited pages, sorted by mtime descending.
  4. Refresh the home-page status block (scripts/build-status.py) โ€” reads ~/Sync/ED/.homelab-snapshot.json, TASKS.md, the doc-sync logs, and the deploy log, then patches the <!-- STATUS-START -->/<!-- STATUS-END --> block in content/_index.md with current state (last deploy, briefing freshness, doc-sync status, active task count, ZFS pool capacities, container counts).
  5. Build Ed’s dashboard (content/ed/build-ed-page.sh) โ€” pulls latest briefing + diary + active tasks into content/ed/_index.md.
  6. Hugo build in strict mode (--panicOnWarning --printPathWarnings) โ€” aborts deploy on any error (unclosed shortcode, frontmatter parse, missing partial). Previous stale public/ survives if the new build fails.
  7. Pagefind indexes public/ into public/pagefind/ โ€” drives the search box in the top-right.
  8. rsync to VPS + CT103 โ€” only if all the above succeeded.
Conventions for new pages
  • Frontmatter: title: required; subtitle: if it’s a section landing; page_links: for top-of-page nav (label + url, plus external: true for off-site).
  • Sidebar: sections use sidebar_sections: for a flat list, or sidebar_groups: for categorized groups (each with title + items: [{url, name}]). The home page (/homelab/) demonstrates sidebar_groups.
  • Section shortcode: wrap discrete content blocks in section shortcodes with an id and title. The id becomes the anchor; the title is what shows in the sidebar’s section list.
  • Mermaid diagrams: fenced mermaid blocks render on the client. Use sparingly โ€” see /homelab/architecture/ for an example.
  • Taxonomies (new): tags: [foo, bar] and status: active|retired|planned in frontmatter generate /tags/<name>/ and /status/<name>/ index pages automatically. Opt-in per page.
  • “Last substantive update”: file mtime lies (auto-commits, typo fixes bump it). When a page gets a real content change worth signaling, add a last_substantive_update: YYYY-MM-DD frontmatter field โ€” future Recently Updated views can prefer that signal over mtime.
Companion files outside Hugo
Path What
~/Sync/ED/BEE_HUB_INDEX.md Greppable index โ€” every page with title + summary + mtime. Regenerated on every deploy.
~/Sync/ED/homelab/bee_hub/AUDIT-2026-05-25.md Per-section progress tracker from the 2026-05-25 deep-clean. Useful baseline if a future deep-edit pass picks up.
~/Sync/ED/homelab/bee_hub/scripts/build-index.py Generates the index + recent-updated page
~/Sync/ED/homelab/bee_hub/scripts/build-status.py Generates the home-page status block
~/scripts/arr-briefing-data.py SSH-Python-heredoc helper for the daily briefing’s media-imports section
~/scripts/homelab-backup-status.py Same pattern for the backup-status section
Deployment targets

The site is deployed to two places from the same source tree. Each is independently reachable:

Host URL Files at Reachable
VPS (edge01) https://troglodyteconsulting.com /var/www/bee-hub Public internet (currently limited โ€” see SSDNodes issue below)
CT103 (caddy) https://hub.edmd.me /var/www/bee-hub LAN + NetBird peers only

Deployment is one command and updates both in sequence. If one target is unreachable (VPS routing is occasionally flaky), the other still updates.

Deploy script
cd ~/Sync/ED/homelab/bee_hub
bash deploy-vps.sh

What it does:

  1. hugo --quiet builds the static site into public/
  2. tar czf - public/ streams the build to each target
  3. Extracts to /var/www/bee-hub/ on each host
  4. Logs to ~/Library/Logs/bee-hub-deploy.log

Automatic deploys: cron runs the script every 30 minutes.

*/30 * * * * /Users/bee/Sync/ED/homelab/bee_hub/deploy-vps.sh

Targets are configured in the script at TARGETS=(...). To add a new target, add user@host:/path to the array. SSH keys are pre-shared via ~/.ssh/id_ed25519.

Editing

All content is plain Markdown with YAML frontmatter. Edit any _index.md file and save. The next deploy (manual or the 30-min cron) ships the change to both live hosts.

Item Value
Site root ~/Sync/ED/homelab/bee_hub/
Content ~/Sync/ED/homelab/bee_hub/content/
Theme themes/bee-theme/
Config hugo.toml
Build output public/ (gitignored, rebuilt every deploy)
Deploy script deploy-vps.sh
Deploy log ~/Library/Logs/bee-hub-deploy.log
Local Preview Server

A persistent Hugo dev server runs on the Mac Studio via launchd, providing live-preview at all times (rebuilds within ~1s on save):

Item Value
URL (local) http://localhost:1313
URL (LAN) http://192.168.8.180:1313
launchd agent com.bee.hugo-beehub
Plist ~/Library/LaunchAgents/com.bee.hugo-beehub.plist
Working dir ~/Sync/ED/homelab/bee_hub
Logs /tmp/hugo-beehub.log, /tmp/hugo-beehub.err
Behavior RunAtLoad + KeepAlive (always running, restarts on crash)

This is separate from the deployed versions at hub.edmd.me and troglodyteconsulting.com. Use it for active authoring and verification; deploy-vps.sh pushes to production.

# Restart the local preview server
launchctl kickstart -k gui/$(id -u)/com.bee.hugo-beehub

# Check status
launchctl print gui/$(id -u)/com.bee.hugo-beehub

# View logs
tail -f /tmp/hugo-beehub.log
Site Structure

Every page is a directory containing an _index.md file. The top-level nav is defined in hugo.toml:

Weight Tab URL
1 Mac Apps /mac-apps/
2 Terminal /terminal/
3 System Settings /system-settings/
4 Menu Bar /menu-bar/
5 Claude /claude/
6 Homelab /homelab/
7 Farm /farm/
8 Automation /automation/
9 Mac Studio /mac-studio/
10 Tana /tana/
11 Meshtastic /meshtastic/
12 Docs /docs/

Content tree (homelab section example):

content/homelab/
โ”œโ”€โ”€ _index.md              โ€” Category landing (sidebar list)
โ”œโ”€โ”€ proxmox/_index.md      โ€” Proxmox VE reference
โ”œโ”€โ”€ services/_index.md     โ€” Services directory
โ”œโ”€โ”€ music-pipeline/_index.md
โ”œโ”€โ”€ life-archive/_index.md
โ”œโ”€โ”€ mcp-servers/_index.md
โ”œโ”€โ”€ bee-hub/_index.md      โ€” This page
โ””โ”€โ”€ shelfmark/_index.md
Frontmatter Reference

Category landing page โ€” has a sidebar with sub-page links:

title: "Homelab"
subtitle: "Infrastructure, services, and remote access"
sidebar_sections:
  - { url: "/homelab/proxmox/", name: "Proxmox VE" }
sidebar_links:
  - { name: "External Link", url: "https://example.com" }

Individual page โ€” has quick-access link buttons at top:

title: "Music Pipeline"
page_links:
  - { label: "Lidarr", url: "http://192.168.8.100:8686", external: true }
  - { label: "Internal Link", url: "/homelab/services/", external: false }
Theme Shortcodes

The bee-theme provides shortcodes for structuring content. All shortcode files live in themes/bee-theme/layouts/shortcodes/.

Shortcode Purpose Parameters
section Collapsible content block id, title
app-card App info card with links title, page, docs, shortcuts, cheatsheet
app-grid Grid wrapper for app-cards none
cmd Styled terminal command block none (content is the command)
grid Two-column grid layout none
tip Tip/note callout box none

The app-card shortcode supports a docs parameter that renders a ๐Ÿ“– Docs โ†— link directly on the card โ€” already used throughout the Mac Apps pages.

Adding & Editing Pages

Edit an existing page: Open content/section/page/_index.md in any editor (BBEdit, VS Code, Obsidian). Hugo hot-reloads within ~1 second.

Add a new page:

mkdir -p ~/Sync/ED/homelab/bee_hub/content/homelab/new-page
# Create _index.md with frontmatter and content
# Add to parent _index.md sidebar_sections list

Add a new nav tab:

  1. Create content/new-section/_index.md
  2. Add entry to hugo.toml with a name, url, and weight
  3. Restart the Hugo service โ€” menu changes need a restart, content changes do not

Can I edit in Obsidian? Yes โ€” all Hugo content is plain Markdown. Open ~/Sync/ED/homelab/bee_hub/content/ as an Obsidian vault. The YAML frontmatter block must stay intact. Hugo shortcodes show as raw text in Obsidian’s preview but edit safely.

Rebuilding manually

For day-to-day edits, deploy-vps.sh handles builds automatically.

To regenerate the static /public/ folder without deploying:

cd ~/Sync/ED/homelab/bee_hub
hugo
# Output goes to /public/