# The Bin My personal website, blog, and portfolio. Available at https://binning.net. ## Architecture This is an [mdbook](https://rust-lang.github.io/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`: ```bash 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: ```bash 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/`: ```markdown ![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](https://rust-lang.github.io/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][Github-Pages]. [Namecheap]: https://www.namecheap.com/ [Ruby]: https://www.ruby-lang.org/ [Jekyll]: https://jekyllrb.com/ [Github-Pages]: https://pages.github.com/