garrettholland.com
#
A personal domain turned long-running experimentation ground.
Genesis#
This site showcases projects and professional experience. I also post occasional writing to avoid relearning the same things repeatedly.
The domain originally supported internal networking projects. Typing garrettholland.com
is more memorable than an internal IP address. Since then, I have hosted several iterations here.
I previously deployed fully hand-coded sites (Bootstrap plus light JavaScript) in Azure, Google Cloud Platform, and Amazon Web Services. That exploration predated consistent use of git
, so no history remains. I also experimented with static site generators (Jekyll and Hugo) across those clouds.
Current Iteration (Summer 2025)#
The site is now built with Hugo and published via GitHub Pages (URL redirect). Outsourcing hosting lets me focus on content rather than infrastructure overhead.
The most recent refresh focused on maintainability. I streamlined content organization so adding or updating entries does not require re-orienting to the codebase after a gap. This lowers friction and increases iteration speed.

CI/CD Pipeline#
The site uses GitHub Actions to automate deployment to GitHub Pages. This workflow triggers on two primary events:
- Pull requests targeting
main
(preview build only)- Subsequent commits to the PR trigger new preview builds
- Pushes to the
main
branch (merge)
# Simple workflow for deploying static content to GitHub Pages
name: Deploy static content to Pages
on:
# Runs on pushes targeting the default branch
push:
branches: ["main"]
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
pull_request:
branches: ["main"]
# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
permissions:
contents: write
pages: write
id-token: write
# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
concurrency:
group: "pages"
cancel-in-progress: false
jobs:
deploy:
runs-on: ubuntu-22.04
# Attach to GitHub Environment for protection rules & history
environment:
name: github-pages
url: https://garrettholland.com
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
steps:
- uses: actions/checkout@v4
with:
submodules: recursive # Fetch Hugo themes (true OR recursive)
fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod
- name: Setup Hugo
uses: peaceiris/actions-hugo@v3
with:
hugo-version: '0.148.2'
# extended: true
- name: Build
run: hugo build --minify
- name: Upload build (PR preview artifact)
if: github.event_name == 'pull_request'
uses: actions/upload-artifact@v4
with:
name: hugo-preview
path: public
- name: Deploy
uses: peaceiris/actions-gh-pages@v3
if: github.ref == 'refs/heads/main' && github.event_name != 'pull_request'
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./public
cname: garrettholland.com
This automation ensures every merge to main
deploys immediately, while pull requests continuously regenerate a downloadable preview artifact (hugo-preview
) until approval and merge.
Hugo Experience#
Extensive workplace usage of Hugo (with the Docsy theme) influenced how I structure and templatize this site. I opted for a minimal visual style here to emphasize readability and quick navigation.
Inspiration#
Repositories that may spark ideas — build something beautiful.
Hugo core (documentation: the official site). A static site generator is deceptively sophisticated.
Docsy theme for documentation sites (documentation linked in its repository).
Blowfish theme for Hugo (implemented on this site). Clean, feature-rich, and highly customizable.
I chose Blowfish for its excellent typography, responsive design, and thoughtful developer experience. The theme provides robust article components and layout options while maintaining high performance. Its documentation is comprehensive, making customization straightforward.
Contact#
Questions or feedback? Use the contact page. I’m always open to collaboration or a quick chat.