Skip to main content

Lab Notes

2026

Hosting a Static Site on GitHub Pages with a Custom Domain

·945 words·5 mins
GitHub Pages is a free static hosting service built into every GitHub repository. Combined with a custom domain and a handful of DNS records, you can serve a production site with HTTPS for nothing beyond the cost of the domain name. This note covers the full path: repo setup, Pages configuration, DNS records, and TLS enforcement. Prerequisites # A GitHub account and a repository containing your static site output (HTML/CSS/JS) A registered domain name managed at any DNS registrar (examples use Porkbun) gh CLI installed and authenticated (gh auth login) 1. Prepare the repository # Your repo needs to end up with built HTML at a known location. Two options:

Lab Note: Signing Hugo so macOS Firewall Allows LAN Access to the Dev Server

·344 words·2 mins
Overview # The Hugo dev server worked on localhost but was unreachable on the Mac’s LAN IP (<mac-ip>), even with the correct --bind flag. Root cause: the macOS application firewall identifies apps by code signature, and Homebrew’s hugo binary is shipped completely unsigned — so even an explicit firewall allow rule could not attach to it. Fix: ad-hoc sign the binary.

Lab Note: Docker Registry on Synology NAS with Browse UI

Overview # A private Docker registry running on the Synology NAS at <nas-ip>, used by the Jenkins CI/CD pipeline to store built images and available for pulling to any LAN machine. Includes the joxit/docker-registry-ui browse interface. Compose file lives at /volume1/docker/registry/docker-compose.yml on the NAS. Why This Is Useful # For CI/CD: Jenkins builds The Moment, pushes the image here, then pulls it on the ARM64 production node (Odroid N2+) to deploy. No GitHub or internet dependency in the build/deploy loop — the pipeline runs entirely on the LAN.

Lab Note: Jenkins Agent Setup — Go, MinGW, and NSSM on Windows

·600 words·3 mins
Overview # Notes for setting up Jenkins build agents across all three lab nodes (Oroid N2+/arm64, Beelink/Windows, MiniMac/macOS). Covers Go installation per platform, MinGW gcc on Windows for CGO builds, and running the Jenkins agent as a persistent Windows service via NSSM. Installing Go # Windows — beelink # winget install -e --id GoLang.Go Open a new cmd prompt after install (PATH won’t update in the existing window).

Docker_dev_vscode_improvements

·149 words·1 min
docker-compose.dev.yml — added build: context: . so Compose can rebuild the image itself with --build, no separate docker build needed. .vscode/tasks.json — 5 new tasks added: Task What it does Docker: Build Dev Image Standalone build + prune dangling Docker: Start Dev Stack Start stack using existing local image Docker: Build and Restart Dev Stack Primary task — rebuild, restart, prune Docker: Stop Dev Stack Bring the whole dev stack down Docker: Logs Stream the-moment logs in a dedicated panel Daily driver: Terminal → Run Task → Docker: Build and Restart Dev Stack. This is the replacement for your manual docker build command — it rebuilds the image, prunes the dangling old one, and restarts the container in one step.

Github_push_and_tag

·260 words·2 mins
Option A — Squash all commits into one before pushing # git checkout --orphan release git add -A git commit -m "Beta_1.0.1" git branch -D main git branch -m main git push origin main --force This replaces the entire history with a single clean commit. Option B — GitHub Releases (tag-based, history stays) # If the goal is just to publish a versioned release ZIP for users to download (not hide commits), use GitHub Releases:

Working_with_claude_and_vscode

·324 words·2 mins
User scope # ~/.claude/settings.json (user scope — applies to all projects) <project_folder>/.claude/settings.local.json (user scope — applies only to the project_folder) Why it’s there # It’s an explicit override you (or /model) set at some point — it is not a default. Without that line, Claude Code picks a model based on your plan/account. With it, every session in every project starts on Opus.

Automate HUGO labnotes

·177 words·1 min
Use a Shell function (recommended — zero dependencies) # Add this to ~/.zshrc: labnote() { local slug="${1:-}" if [[ -z "$slug" ]]; then read "slug?Lab note slug: " fi slug="${slug// /_}" # spaces → underscores (cd ~/code/thetasigma-site && hugo new "lab-notes/${slug}.md" && code "content/lab-notes/${slug}.md") } Then labnote thetasigma_labs_setup or just labnote and it prompts you. Opens it in VSCode immediately. This is almost certainly what you want — it’s a 30-second setup and you never leave the terminal.