Skip to main content

Personal Site

·622 words·3 mins
Author
Garrett Holland
Building reliable systems & teams.

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.

Meme expressing the dismay of not recognizing original code author.
Wow, this code is rough. Who wrote this? … Ah.

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
Linked from .github/workflows/hugo-build.yml

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.