A personal blog built with Hugo static site generator and hosted on GitHub Pages.
This repository contains the source code for mwartell.github.io, a personal blog featuring technical writing on Python, software development, and other programming topics.
The site is built using:
- Hugo - A fast, flexible static site generator written in Go
- GitHub Pages - For hosting the generated site
- just - Command runner for build automation
Note: This site was migrated from blag to Hugo in January 2026 to gain better Markdown support, including proper rendering of bulleted lists.
├── hugo.toml # Site configuration (title, description, author)
├── justfile # Build automation commands
├── content/ # Blog posts and pages (Markdown)
│ ├── posts/ # Blog posts with YAML frontmatter
│ └── about.md # Static pages
├── layouts/ # Hugo template files
│ ├── _default/ # Default layouts (baseof, single, list, etc.)
│ └── index.html # Homepage template
├── static/ # CSS, images, and static assets
├── docs/ # Generated HTML files (published to GitHub Pages)
└── archetypes/ # Content templates for new posts
This repository uses GitHub Pages with the following setup:
- Source: Deploy from the
/docsfolder on themainbranch - Custom Domain: None (uses default
mwartell.github.io) - Build Process: Manual builds using
blag(not GitHub Actions)
The workflow is:
- Write content in
content/directory - Run build command to generate HTML in
docs/ - Commit and push both source and generated files
- GitHub Pages automatically serves the content from
docs/
macOS (via Homebrew):
brew install hugo justOther platforms: See Hugo installation guide
-
Clone the repository:
git clone https://github.com/mwartell/mwartell.github.io.git cd mwartell.github.io -
Build the site:
just build
Or without
just:hugo --minify
-
View locally:
just serve
The generated site will be in the docs/ directory, ready for GitHub Pages deployment.
Using just (recommended):
just build # Build the site with minification
just serve # Start local development server with live reload
just clean # Clean the output directory-
Create a new post using Hugo:
hugo new posts/my-new-post.md
-
Edit
content/posts/my-new-post.mdwith frontmatter and content:--- title: "My New Blog Post" date: 2026-01-26 tags: ["python", "tutorial"] draft: false --- Your blog post content here with **full Markdown support**: - Bulleted lists work! - So do numbered lists - And all other Markdown features
-
Preview locally:
just serve
-
Build and deploy:
just build git add . git commit -m "Add new blog post: My New Blog Post" git push origin main
Static pages (like the About page) are created in the content/ directory:
# Create a new page
hugo new about.mdEdit with appropriate frontmatter and content.
Required/recommended fields for blog posts:
---
title: "Your Post Title" # Required: Post title (quoted)
subtitle: "Optional subtitle" # Optional: Appears on listing pages
date: 2026-01-26 # Required: Publication date
tags: ["tag1", "tag2"] # Optional: Array of tags for categorization
draft: false # Required: Set to false to publish
---Hugo includes a development server with live reload:
just serve
# Or: hugo server -D --port 8220Then visit http://localhost:8220. Changes to content, templates, or styles automatically refresh the browser.
Site-wide settings are in hugo.toml:
baseURL = "https://mwartell.github.io/"
languageCode = "en-us"
title = "mwartell maladies"
publishDir = "docs"
[params]
description = "the fourth most influential blog in the galaxy…"
author = "matt wartell"
[taxonomies]
tag = "tags"- Templates: Hugo Go templates in
layouts/control site structurelayouts/_default/baseof.html- Base templatelayouts/index.html- Homepagelayouts/_default/single.html- Individual postslayouts/_default/list.html- Archive/list pageslayouts/_default/terms.html- Tags index
- Styles: CSS files in
static/(automatically copied to output) - Static assets: Images, fonts, etc. in
static/
The build process is automated through the justfile:
just build # Generate the site from content/ to docs/
just serve # Serve locally at http://localhost:8220 with live reload
just clean # Remove all generated files from docs/Hugo's build process:
- Reads configuration from
hugo.toml - Processes Markdown files in
content/posts/ - Applies Go templates from
layouts/ - Copies static assets from
static/ - Generates optimized HTML files in
docs/ - Creates RSS feed (
docs/index.xml) and sitemap
Build times are typically 15-40ms for the full site.
Deployment is automatic once changes are pushed to the main branch:
- Make your changes (add content, modify templates, etc.)
- Run
just buildto generate updated HTML - Commit both source files and generated
docs/content - Push to GitHub
- GitHub Pages will automatically serve the updated content from
docs/
The site typically updates within a few minutes of pushing changes.
This project uses a fork of blag (mwartell/blag) instead of the upstream version. The fork adds support for markdown tables through the tables extension, which is not available in the upstream version.
Key difference: The fork adds "tables" to the markdown extensions list in blag/markdown.py, enabling proper rendering of markdown tables as HTML <table> elements.
This is a personal blog repository. Content and code are provided as-is for reference and learning purposes.