This is the public repository of my personal website's infrastructure and public content. https://www.binning.net
Find a file
Matthew Binning 9ecf9633f2
All checks were successful
CI / build (push) Successful in 12s
CI / deploy (push) Successful in 6s
feat: Move media assets outside of the git repository
Images and media referenced by the private Copper Chronicle section are no
longer tracked by git. They live at /assets/copper-chronicle/ on the server
(/srv/www/binning.net/assets/) and are managed independently. Updated all
image links in src/private/copper-chronicle to use absolute paths rooted at
/assets/. Added --filter='protect assets/' to all deploy rsync commands to
prevent accidental deletion during deploys.
2026-04-04 16:48:26 -07:00
.forgejo/workflows feat: Move media assets outside of the git repository 2026-04-04 16:48:26 -07:00
src feat: Move media assets outside of the git repository 2026-04-04 16:48:26 -07:00
.gitignore feat: Move media assets outside of the git repository 2026-04-04 16:48:26 -07:00
.gitmodules feat!: Split site into public and private sections 2026-04-04 13:32:09 -07:00
book.toml feat!: Split site into public and private sections 2026-04-04 13:32:09 -07:00
deploy.sh feat: Move media assets outside of the git repository 2026-04-04 16:48:26 -07:00
README.md feat: Move media assets outside of the git repository 2026-04-04 16:48:26 -07:00
www.code-workspace init: Restart blog 2026-01-01 16:44:07 -08:00

The Bin

My personal website, blog, and portfolio. Available at https://binning.net.

Architecture

This is an mdbook project. Source content lives in src/, and mdbook build produces the static site in book/, which is what gets deployed.

Directory structure

.
├── src/                    # mdbook source (markdown content)
│   ├── SUMMARY.md          # table of contents / navigation
│   ├── private/            # git submodule — see below
│   └── ...
├── book/                   # build output (not tracked)
├── content/                # assets and media not tracked by git — see below
├── book.toml               # mdbook configuration
└── .forgejo/workflows/     # CI/CD pipelines

Private content (git submodule)

src/private is a separate private git repository included here as a submodule. This keeps personal content out of the public repo history while still building into the same site. The submodule is hosted at https://forgejo.binning.net/www/private.

When working locally, the submodule URL can be overridden to SSH in .git/config:

git config submodule.src/private.url forgejo@forgejo.binning.net:/www/private.git
git submodule sync

CI uses HTTPS with an OAuth token via a URL rewrite (secrets.WWW_PRIVATE_TOKEN), so .gitmodules should always contain the HTTPS URL.

To update the submodule to the latest commit:

git submodule update --remote src/private
git add src/private
git commit -m "Update private submodule"

Assets

Images and media referenced by content in src/private/ are not tracked by this repo. They live on the server at /srv/www/binning.net/assets/ and are managed separately.

Markdown image links use absolute paths rooted at /assets/:

![alt text](/assets/copper-chronicle/chapter_1/image.jpg)

The deploy rsync uses --filter='protect assets/' to ensure the assets/ directory is never deleted during deployment.

CI/CD

Three Forgejo Actions workflows handle the build and deploy lifecycle:

  • ci.yml — builds on every push and uploads the artifact
  • cd.yml — manual workflow dispatch to deploy to staging or prod
  • nightly.yml — scheduled nightly build and deploy

All workflows run on a self-hosted runner and deploy to /srv/www/binning.net/ via rsync.

History

  • 2025-02-28: Restarted in mdbook after yet another data loss event.
  • 2024-06-21: Migrated from cgit to Forgejo and from Kubernetes to nginx.
  • 2023-10-07: Merged the deployment repository into this one and moved to self-hosting.
  • 2022-01-05: Moved hosting to Vultr and switched to Cobalt.
  • 2018-12-16: Started with Namecheap, Ruby, Jekyll, and Github Pages.