Personal website and blog of Isaac Lins — application developer and cybersecurity enthusiast. Built with Hugo (extended) and deployed to GitHub Pages behind Cloudflare at https://isaaclins.com.
- Hugo extended (the version is pinned in
.hugo-version, currently v0.164.0;config.tomlrequires Hugo 0.158.0 or newer). - Dart Sass for
assets/css/main.scss. - Content in
content/as Markdown with TOML frontmatter (+++delimiters).
| Path | What it is |
|---|---|
content/ |
Pages and posts. Blog posts live in content/blog/. content/blog/_TEMPLATE.md is the starting point for a new post. |
layouts/ |
Hugo templates: _default/, partials/, and shortcodes/. |
assets/ |
SCSS (css/main.scss), fonts, and social-card seed images. |
images/ |
Post images (mounted to /images/ at build time). |
static/ |
Files copied verbatim to the site root (JS, manifest, icons). |
data/menu.toml |
Homepage menu entries. |
scripts/ |
Python checks for frontmatter, image paths, draft status, and the installed Hugo version. |
.github/workflows/ |
CI: build/validate, deploy, image optimization, and Lighthouse. |
hugo server # live-reload dev server at http://localhost:1313
hugo --gc --minify # production build into ./public- Copy
content/blog/_TEMPLATE.mdtocontent/blog/<slug>.md. - Fill in the TOML frontmatter (
title,date,tags,complexity,description, optionalimage).descriptionshould be under 160 characters for SEO. - Drop images in
images/and reference them as/images/<file>. - Optionally install the local hooks:
pip install pre-commit && pre-commit install. They run markdownlint, cspell, and the validators inscripts/.
- build-test — builds the site, validates the generated HTML with
html5validator, and runscspellon non-draft content for pushes tomainand pull requests targetingmain. - pages-deploy — builds the production site and publishes it to the
gh-pagesbranch on push tomain. - PR previews — builds each pull request targeting
mainand publishes it athttps://isaaclins.com/pr-preview/pr-<number>/. The pull request preview workflow usesrossjrw/pr-preview-actionand removes the preview when the pull request closes while its head branch is still available. - PR preview reaper —
.github/workflows/pr-preview-reaper.ymlruns daily and can also be started withworkflow_dispatch. It checks everypr-preview/pr-<number>/directory against the pull request API and removes previews for closed or missing pull requests. It checks out onlygh-pages, never PR code, and makes one cleanup commit only when there is something to remove. The action documentation covers the normalpull_requestclose event, notpull_request_target, so the reaper is the safe fallback for a deleted head branch. - GitHub Pages must be set to Deploy from a branch, using
gh-pagesand the repository root. The site must keepstatic/CNAMEwith the exact contentsisaaclins.com; Hugo copies it topublic/CNAMEso branch deployments keep the custom domain. - Both Hugo workflows read the pinned version from
.hugo-versionand enforceconfig.toml's minimum withscripts/check-hugo-version.py; update the version file when upgrading Hugo. - optimize-images — losslessly optimizes committed images and generates WebP versions.
- Lighthouse CI — runs Lighthouse against the live URLs after a deploy and
writes the score table to
lighthousetest.md.
Content © Isaac Lins. Reach me at contact@isaaclins.com or github.com/isaaclins.