Source and build tooling for brfid.github.io. Hugo renders the site, blog, and resume. A VAX and PDP-11 pipeline renders the landing-page bio published by the site.
Install these prerequisites:
- Git
- GitHub CLI (
gh), only for starting manual workflow runs - Python 3.11 or newer
- Hugo extended 0.156.0 or newer
- Docker, only for the vintage pipeline
- uv, only when you update the Python dependency locks
Initialize the checkout and its local Python environment:
git submodule update --init
python3 -m venv .venv
.venv/bin/python -m pip install --require-hashes -r requirements/build.lock
.venv/bin/python -m pip install --require-hashes -r requirements/dev.lock
.venv/bin/python -m pip install --no-deps --no-build-isolation -e .
.venv/bin/python -m playwright install chromium
make check_envThe repository vendors PaperMod as a Git submodule and serves self-hosted Newsreader and IBM Plex Mono fonts. It has no front-end package install or build step. CI installs Python dependencies from hash-locked files, verifies the Hugo package against requirements/hugo.sha256, and pins its job, service, and BuildKit images by digest.
make previewOpen http://localhost:1313/. The command clears deployment-only provenance inputs, builds the public resume page and phone-free site/resume.pdf, then starts Hugo with live reload. Restart it after changing resume.yaml, or after changing resume layout or print CSS.
Use make preview-drafts to include draft posts. Set PREVIEW_PORT to change the port:
make preview PREVIEW_PORT=1314- Copy
resume.private.example.yamlto the gitignoredresume.private.yaml. - Replace the example
basics.phonevalue. - Run
make resume-pdf-application.
The command leaves a complete phone-free public build under site/ and writes the private PDF to local/bradley-fidler-resume.pdf. It rejects a missing or invalid private overlay and any private PDF destination inside the public site tree.
make check
make verify-sitemake check runs Ruff, formatting checks, mypy, pytest, Pylint, and Vulture. make verify-site clears deployment-only provenance inputs, builds Hugo in a clean directory, and checks routes, feeds, linked artifacts, structured data, navigation state, and the site-wide indexing policy. CI runs both commands.
Use make test to run pytest without the other checks. Use make help to list all supported targets.
After changing pyproject.toml or the build requirements, regenerate every affected lock with uv from the repository root:
uv pip compile requirements/build.in --python-version 3.11 --universal --generate-hashes -o requirements/build.lock
uv pip compile pyproject.toml --python-version 3.11 --universal --generate-hashes --no-emit-package brfid-resume -o requirements/runtime.lock
uv pip compile pyproject.toml --extra pdf --python-version 3.11 --universal --generate-hashes --no-emit-package brfid-resume -o requirements/publish.lock
uv pip compile pyproject.toml --all-extras --python-version 3.11 --universal --generate-hashes --no-emit-package brfid-resume -o requirements/dev.lockRun make check from an environment installed from the regenerated dev.lock. CI cache keys use the lock contents, and pip verifies every downloaded Python distribution against the committed hashes.
make hugo-buildThe command clears deployment-only provenance inputs, syncs the public YAML inputs, and writes a clean build to site/. Use make resume-pdf to add the public PDF. Deployment uses the separate resume-pdf-public target, which fails unless the vintage bio, build log, and pipeline status have all been staged.
Every rendered HTML page contains noindex, nofollow, noarchive, nosnippet, noimageindex. Hugo emits no sitemap. robots.txt leaves HTML crawlable so crawlers can read the page-level directive and blocks the PDF, feeds, and pipeline status.
Create a draft page bundle:
make new-post POST_SLUG=maintenance-windowEdit hugo/content/posts/maintenance-window/index.md and place referenced assets beside it. Production publishes the post only after its front matter sets draft: false.
Working drafts stay outside this public repository. Add only approved copy and public assets.
The pipeline transforms three public strings into the landing bio:
site.yaml name and headline plus resume.yaml basics.summary -> VAX troff -> PDP-11 nroff -> brad.bio.txt -> Hugo data
For local execution, validation, implementation, and image promotion, see the vintage pipeline operations guide.
Before starting a manual workflow run, authenticate gh with gh auth login --hostname github.com and verify it with gh auth status.
A push to main uses standard mode: the publish.yml workflow runs the checks and secret scan, executes the vintage pipeline, builds Hugo and the public PDF, verifies the published contracts, and deploys to GitHub Pages. Add [nopublish] to the commit message to run checks without publishing.
For any change that does not affect the landing-page bio, such as a post, layout, or resume field other than basics.summary, add [fast] to the commit message to select fast mode:
git commit -m "Publish site-only change [fast]"
git push origin mainYou can request the same path manually:
gh workflow run publish.yml --ref main \
-f operation=publish \
-f publish_mode=fastFast mode reuses the exact bio, build log, and pipeline status from the newest matching successful standard publication, and keeps the GitHub Actions run link pointed at that source. GitHub retains the fingerprinted bundle artifact for 90 days. Fast mode still rebuilds the public PDF and Hugo site, runs the production verifier, and deploys a new Pages artifact. It fails without deploying if the retained result has expired, its manifest or provenance is invalid, or a bio input or vintage implementation file has changed.
Run standard mode to produce a fresh retained result:
gh workflow run publish.yml --ref main \
-f operation=publish \
-f publish_mode=standardIn standard mode, the vintage pipeline validates vintage/image-pair.json against the current image-owned source, then uses only that manifest’s immutable VAX and PDP-11 digests. Hosted execution disables local image fallback and Python-environment bootstrap.
| Path | Function |
|---|---|
site.yaml |
Public name, headline, and profile links |
resume.yaml |
Public resume data and shared bio summary |
resume.private.yaml |
Optional local phone overlay; gitignored |
hugo/ |
Site content, templates, configuration, styles, and fonts |
resume_generator/ |
Bio, vintage validation and reuse, image-manifest, build-log, and PDF generators |
requirements/ |
Hash-locked Python environments and the verified Hugo package checksum |
vintage/image-pair.json |
Promoted immutable emulator pair bound to its image-owned source |
.github/workflows/ |
GitHub Actions checks, publication, validation, and image-build workflows |
scripts/ |
Site verifier, GitHub job scripts, and SIMH orchestration |
STATUS.md |
Current operational state and queue |
docs/integration/INDEX.md |
Vintage pipeline operations |
docs/archive/ |
Retired-path registry; not operating guidance |