Posts for: #Git

CI/CD resume publication

I am terrible at word processors / editing so I build my resume with LaTeX templates. I gain a pretty, highly configurable resume, but it can be a pain to modify, build, share, etc. A couple weeks ago someone pointed out to me that I forgot to update my most recent role to reflect a promotion (staff software engineer, yeahh!!). I was not at home and I had to work quite a bit to only change a word in my resume. This has always been a pain to me so I figured, why not set up a CI/CD pipeline to build and publish my resume. These are the steps I took.

[Read more]

How Dates Work on This Site

Every page on this site has two dates: Created and Updated. Neither one is maintained by hand. Here’s the full flow.

Creating a new page

New content is created with the new.sh script:

./scripts/new.sh content/thissite/my-page.md

This sources .env for HUGO_IMAGE and SITE_DIR, then runs hugo new inside the Docker container.

Hugo reads the archetype template at archetypes/default.md:

+++
date = '{{ .Date }}'
draft = true
title = '{{ replace .File.ContentBaseName "-" " " | title }}'
tags = []
+++

At creation time, Hugo substitutes {{ .Date }} with the current timestamp and writes it into the new file’s front matter. The result looks like:

[Read more]

Automatic Dating with Git

Hugo can pull dates from Git history so you never have to update lastmod by hand.

Enable Git info

# hugo.toml
enableGitInfo = true

Configure front matter date resolution

[frontmatter]
  date = [':filename', ':default']
  publishDate = [':filename', ':default']
  lastmod = [':git', ':fileModTime']

How it works

  • .Date — tries the filename first (2026-04-03-post.md), then the date field in front matter.
  • .Lastmod — uses the Git author date of the last commit that touched the file, falling back to filesystem mtime.
  • .PublishDate — same resolution chain as .Date.

Filename date formats

Hugo recognizes these patterns:

[Read more]