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.
deploy-vps.sh runs these steps in order โ any failure before Hugo aborts the deploy without touching the live trees:
- Validate TASKS.md (
~/scripts/validate-tasks.sh) โ structural check, abort on error. - Validate skills (
~/scripts/validate-skills.sh) โ every SKILL.md frontmatter parses. - Regenerate
BEE_HUB_INDEX.md(scripts/build-index.py) โ walkscontent/, emits the ~76 KB greppable map at~/Sync/ED/BEE_HUB_INDEX.md. Also writescontent/recent/_index.mdwith the 40 most recently-edited pages, sorted by mtime descending. - 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 incontent/_index.mdwith current state (last deploy, briefing freshness, doc-sync status, active task count, ZFS pool capacities, container counts). - Build Ed’s dashboard (
content/ed/build-ed-page.sh) โ pulls latest briefing + diary + active tasks intocontent/ed/_index.md. - Hugo build in strict mode (
--panicOnWarning --printPathWarnings) โ aborts deploy on any error (unclosed shortcode, frontmatter parse, missing partial). Previous stalepublic/survives if the new build fails. - Pagefind indexes
public/intopublic/pagefind/โ drives the search box in the top-right. - rsync to VPS + CT103 โ only if all the above succeeded.
- Frontmatter:
title:required;subtitle:if it’s a section landing;page_links:for top-of-page nav (label + url, plusexternal: truefor off-site). - Sidebar: sections use
sidebar_sections:for a flat list, orsidebar_groups:for categorized groups (each withtitle+items: [{url, name}]). The home page (/homelab/) demonstratessidebar_groups. - Section shortcode: wrap discrete content blocks in section shortcodes with an
idandtitle. Theidbecomes the anchor; the title is what shows in the sidebar’s section list. - Mermaid diagrams: fenced
mermaidblocks render on the client. Use sparingly โ see /homelab/architecture/ for an example. - Taxonomies (new):
tags: [foo, bar]andstatus: active|retired|plannedin 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-DDfrontmatter field โ future Recently Updated views can prefer that signal over mtime.
| 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 |
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.
cd ~/Sync/ED/homelab/bee_hub
bash deploy-vps.sh
What it does:
hugo --quietbuilds the static site intopublic/tar czf - public/streams the build to each target- Extracts to
/var/www/bee-hub/on each host - 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.
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 |
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
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
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 }
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.
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:
- Create
content/new-section/_index.md - Add entry to
hugo.tomlwith aname,url, andweight - 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.
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/