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.
Posts for: #Git
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:
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 thedatefield 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: