All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog and this project adheres to Semantic Versioning.
- Baseline security headers plus context-aware CSP generation for Netlify deploys (enforced in production, report-only in deploy previews) via generated
dist/_headersfromscripts/netlify-headers.config.mjs - Externalized theme toggle and analytics scripts in
public/scripts/to support stricter CSP policies - Unit tests for summary utilities (
summarize/summarizeHtml) covering markdown/MDX cleanup and code-formatting edge cases - About page (
/about) with "Hello My Name Is" sticker, bio, and dynamic Topics section listing all blog tags alphabetically - About link in site header navigation
- Goodreads social link in Colophon
- Netlify
_headersfile for cache control: HTML pages always revalidate, hashed assets in/_astro/cached immutably for 1 year - Interactive
npm run post:newwizard to create new blog MDX posts insrc/content/blog/with GMT/UTC timestamps, title-based filenames, and category/tag selection from existing taxonomy - Post wizard support for mixed category/tag input (select existing options by number and/or type new values), plus tag normalization to lowercase kebab-case
- Post wizard optional prompts for
featuredImage_UrlandfeaturedImage_Altfrontmatter fields - Post wizard
--dry-runmode to preview filename and generated frontmatter without writing a file - Unit tests for post wizard helpers plus a fixture-based taxonomy harvesting test (
tests/unit/new-post-wizard.test.ts) - Shared blog data utilities and reusable
PostFeed/PaginationNavcomponents to centralize post sorting, taxonomy generation, and pagination rendering
- Consolidated duplicated post-list summary generation into shared
summarizeHtml()utility and reused it across homepage, pagination, tag, and category listing pages - Blog post meta descriptions now use plain-text summaries instead of slicing raw markdown/MDX bodies
Seo.astronow renders article-only Open Graph/article meta tags only for article pages and only when date values are present- Theme toggle behavior restored to match live-site look/actions after CSP script externalization; Tailwind safelist added for classes injected by
public/scripts/theme-toggle.js - Improved semantic HTML: replaced generic
<div>elements with<header>,<footer>,<section>, and<nav aria-label="Pagination">for better accessibility and document structure - Upgraded ESLint from v9 to v10; added
@eslint/jsas explicit dependency (unbundled in v10) and removed deprecated--extflag from lint script - Migrated Astro content collections to the Astro 6 API by moving
src/content/config.tstosrc/content.config.tsand switching the blog collection to the newglob()loader - Updated blog routes, RSS, and listing pages for Astro 6 content entry changes (
idreplacesslug,bodyis optional, and post rendering usesrender(post)) - Upgraded dev tooling dependencies:
@typescript-eslint/parserto8.57.0,eslintto10.0.3,postcssto8.5.8, andvitestto4.1.0 - Migrated site styling from Tailwind CSS v3 with
@astrojs/tailwindto Tailwind CSS v4 using@tailwindcss/vite - Updated Tailwind entry CSS to the v4 syntax, including
@import "tailwindcss",@config, a customdarkvariant, and@source inline()for theme-toggle utility classes - Simplified styling setup by removing the old PostCSS config and deprecated Astro Tailwind integration
- Refactored homepage, blog index, taxonomy pages, header navigation, About topics, and RSS feed to use shared blog/taxonomy utilities instead of duplicating collection queries and pagination logic
- Expanded the lint script/config to cover tests, scripts, and root config files instead of only
src/ - Updated dynamic route pages to use Astro's
GetStaticPathsand inferredAstro.propstyping utilities - Added Astro's recommended generator meta tag to the shared layout head
Figurecaptions are sanitized beforeset:htmlrendering and now inherit article text color for better dark-mode contrast- Blog post "Time to read" text now includes spacing between the number and unit
- Removed
/publicfrom.gitignore(Gatsby leftover - Astro usespublic/for static assets, not build output) - Theme toggle now initializes on the first full page load as well as on Astro client-side navigations, restoring the expected icon and
aria-pressedstate for E2E coverage - Removed non-standard Open Graph article fields from
Seo.astroand replaced them with standard article metadata plus a plain author meta tag
- Orphaned
manifest.webmanifestand unusedlargeGlassesProfile.pngfrompublic/folder
2.2.0 - 2026-01-31
- GitHub Actions workflow for code quality checks (
code-quality.yml) including type checking, linting, formatting, and Node version validation - Post summaries in RSS feed using new
summarizeutility that extracts plain-text from markdown/MDX content - RSS feed link in Colophon (footer) for easy feed discovery
- Three-state theme toggle: light → system → dark, where system mode respects OS preference
- New system mode icon showing small sun (upper-left) and moon (lower-right) with diagonal divider
- E2E tests for theme toggle navigation persistence and three-state cycle
- Theme toggle not rendering correctly after client-side navigation (now uses
astro:page-loadevent to reinitialize)
- CI workflows now use
.nvmrcas single source of truth for Node version instead of hardcoded values - Moved type check and linter steps from
unit-tests.ymlto dedicatedcode-quality.ymlworkflow - Updated
jsdomdev dependency from v26 to v27 - Added
engines.nodeconstraint (>=24) topackage.json
2.1.0 - 2026-01-07
- RSS feed at
/rss.xmlusing@astrojs/rssfor feed readers - View Transitions via Astro's
<ClientRouter />for smooth page-to-page navigation - SEO utility module (
src/utils/seo.ts) with testable functions for URL building, keyword parsing, and image resolution - Expanded unit tests for
slugifyandformatTitleMlautilities covering edge cases - New test suite for SEO utilities (
tests/unit/seo.test.ts) - GitHub Actions workflows for CI: unit tests (
unit-tests.yml) and E2E tests (e2e-tests.yml)
- Refactored
Seo.astrocomponent to use extracted utility functions for better testability
- Removed header-link to non-existent webmanifest
2.0.0 - 2025-12-14
- Rebuilt site with Astro, Tailwind integration, and content collections for blog posts.
- New Astro components/layouts for header, footer/colophon, SEO metadata, analytics, and blog timestamp.
- MDX support and a reusable Figure component for accessible images with captions/links; posts converted to use it.
- Manifest and icon now served from
public/with trailing-slash routing. - Testing stack added: Vitest (jsdom) with Testing Library for units, Playwright for E2E, and npm scripts to run them.
- Added
npm run checkusage to workflows; Astro check validates content collections and types. - ESLint migrated to flat config for v9; new
eslint.config.mjswith Astro JS/TS support. - Tag listings with pagination (
/tag/[tag]/and/tag/[tag]/page/[page]/), plus “Tagged with” chips on posts linking to those pages. - Category navigation links in the header and category listing pages (with pagination) for each category.
- Migrated all Markdown posts and images into
src/content/blogusing Astro content schema. - Updated build/dev tooling (
npm run dev/build/preview/check) plus lint/format scripts for Astro and TypeScript. - Project now uses ES modules (package
"type": "module"); Tailwind/PostCSS configs moved to.cjsfor compatibility. - Refreshed project docs (
AGENTS.md,README.md) to describe the Astro setup. - Upgraded Astro to v5 (with @astrojs/mdx, react, tailwind, sitemap matching).
- Upgraded React/ReactDOM to v19 and refreshed lint/tooling (ESLint 9, @typescript-eslint, Astro lint plugin).
- Normalized
featuredImage_Urlpaths to local./images/...for content schema resolution. - Figure component now uses Astro Image for imports and supports optional format/sizing props.
- Pagination pages redirect unknown page numbers to 404.
- Header theme toggle redesigned for better accessibility (focus-visible styles, live status text, reduced-motion support) and updated sun icon.
- Dark-mode aware code styling uses Solarized light/dark via Shiki and respects explicit
data-theme. - Menu/link colors aligned in dark mode to match the site title.
- Added Tailwind Typography plugin with custom code/pre colors; applied
prosestyling to summaries and post content while scoping link styling to content areas.
- Gatsby-specific config, templates, and components; legacy static output and Gatsby build scripts.
1.7.0 - 2023-12-29
- Header with Twitter Card and Open Graph meta tags
- Migrated from
gatsby-plugin-next-seoandreact-helmetto built-in Gatsby tools:SEOandHeadrespectively. - Migrated from using Yarn to using npm primarily due to familiarity since I use npm at work. Consequently, this updated almost every package.
- Renamed "Last Edited" to "Updated" in blog timestamp
- Showing all timestamps in GMT time rather than unknown TZ
- Migrate from deprecated
StaticQueryto React'suseStaticQuery. This will make it easier to upgrade to Gatsby v6 when it comes out.
eslint-config-airbnbbecause it requires an older version ofeslinteslint-config-gatsby-standardbecause it requires an older version ofeslintgatsby-plugin-next-seois not compatible with Gatsby v5 so it is removed.react-helmetin favor of built-in Head componentreact-helmet-async
1.6.0 - 2023-04-16
- Upgraded to Gatsby 5
1.5.0 - 2022-01-17
- Installed
gatsby-plugin-next-seoandreact-helmet-asyncto make it easier to share links to posts via Twitter and other social media - Added markdown frontmatter for
featuredImage_UrlandfeaturedImage_Altto allow for including a non-default image in social media posts.
- Updated prettier to also style markdown files
- Use GatsbySeo instead of Helmet where appropriate
- Show last-edited date on blog posts that have a last-edited date
1.4.1 - 2021-12-29
- eslint was broken on
gatsby-*.jsfiles, fixed by replacingeslint-plugin-reactwitheslint-config-react-app
- Removed option for draft documents. I was not completing drafts, so this just adds to the complexity of the software.
1.4.0 - 2021-12-29
- Added
postcssto work withtailwindcssv3
- Upgraded
gatsbyto v4 - Upgraded
eslintand associated libraries to latest - Upgraded
prismjsand associated libraries to latest - Upgraded
reactand associated libraries to latest - Upgraded
tailwindcssto v3
- Fixed files based on new
eslintrules
- Removed
purgecsssince it is no longer used withtailwindcssv3
1.3.8 - 2020-04-27
- Set base version of node to fix build errors
- Upgraded
eslintto 6.8.0 - Upgraded
eslint-config-airbnbto 18.1.0 - Upgraded
eslint-config-prettierto 6.11.0 - Upgraded
eslint-plugin-importto 2.20.2 - Upgraded
eslint-plugin-prettierto 3.1.3 - Upgraded
eslint-plugin-reactto 7.19.0 - Upgraded
gatsbyto 2.21.0 - Upgraded
gatsby-plugin-google-analytics2.3.0 - Upgraded
gatsby-plugin-manifestto 2.4.0 - Upgraded
gatsby-plugin-offlineto 3.2.0 - Upgraded
gatsby-plugin-react-helmetto 3.3.0 - Upgraded
gatsby-plugin-sharpto 2.6.0 - Upgraded
gatsby-plugin-sitemapto 2.4.0 - Upgraded
gatsby-remark-imagesto 3.3.0 - Upgraded
gatsby-remark-prismjsto 3.5.0 - Upgraded
gatsby-source-filesystemto 2.3.0 - Upgraded
gatsby-transformer-remarkto 2.8.0 - Upgraded
prettierto 2.0.5 - Upgraded
prismjsto 1.20.0 - Upgraded
prism-themesto 1.4.0 - Upgraded
purgecssto 2.1.2 - Upgraded
reactto 16.13.1 - Upgraded
react-domto 16.13.1 - Upgraded
react-helmetto 6.0.0 - Upgraded
react-iconsto 3.10.0 - Upgraded
tailwindcssto 1.3.5
1.3.7 - 2019-09-22
- Upgraded
eslintto 6.4.0 - Upgraded
eslint-config-airbnbto 18.0.1 - Upgraded
eslint-config-prettierto 6.3.0 - Upgraded
eslint-plugin-prettierto 3.1.1 - Upgraded
gatsbyto 2.15.20 - Upgraded
gatsby-plugin-google-analyticsto 2.1.17 - Upgraded
gatsby-plugin-manifestto 2.2.18 - Upgraded
gatsby-plugin-offlineto 3.0.8 - Upgraded
gatsby-plugin-react-helmetto 3.1.8 - Upgraded
gatsby-plugin-sharpto 2.2.25 - Upgraded
gatsby-plugin-sitemapto 2.2.14 - Upgraded
gatsby-remark-imagesto 3.1.23 - Upgraded
gatsby-remark-prismjsto 3.3.14 - Upgraded
gatsby-source-filesystemto 2.1.26 - Upgraded
gatsby-transformer-remarkto 2.6.24 - Upgraded
purgecssto 1.4.0 - Upgraded
reactto 16.9.0 - Upgraded
react-domto 16.9.0 - Upgraded
tailwindcssto 1.1.2 - Switched React.Fragment to fragment shorthand as suggested by eslint-plugin-react
- Add json & jsx to files under the aegis of
prettier - Added a debug option to
yarn develop-- in VSCode, enable "Debug: Toggle Auto Attach"
- Added a Helmet statement to not defer showing the title when opening a new tab from a link (part of Helmet upgrade)
1.3.6 - 2019-07-14
- Upgraded
eslintto 5.16.0 - Upgraded
eslint-config-airbnbto 2.2.0 - Upgraded
eslint-config-prettierto 4.3.0 - Upgraded
eslint-plugin-importto 2.18.0 - Upgraded
eslint-plugin-jsx-a11yto 6.2.3 - Upgraded
eslint-plugin-prettierto 3.1.0 - Upgraded
eslint-plugin-reactto 7.14.2 - Upgraded
gatsbyto 2.13.20 - Upgraded
gatsby-plugin-google-analyticsto 2.1.4 - Upgraded
gatsby-plugin-manifestto 2.2.3 - Upgraded
gatsby-plugin-offlineto 2.2.4 - Upgraded
gatsby-plugin-react-helmetto 3.1.2 - Upgraded
gatsby-plugin-sharpto 2.2.7 - Upgraded
gatsby-plugin-sitemapto 2.2.3 - Upgraded
gatsby-remark-imagesto 3.1.6 - Upgraded
gatsby-remark-prismjsto 3.3.3 - Upgraded
gatsby-source-filesystemto 2.1.5 - Upgraded
gatsby-transformer-remarkto 2.6.5 - Upgraded
prettierto 1.18.2 - Upgraded
prism-themesto 1.1.0 - Upgraded
prismjsto 1.16.0 - Upgraded
purgecssto 1.3.0 - Upgraded
reactto 16.8.6 - Upgraded
react-domto 16.8.6 - Upgraded
react-helmetto 5.2.1 - Upgraded
react-iconsto 3.7.0 - Upgraded
tailwindcssto 1.0.5
- Added languages to language blocks missing languages
1.3.5 - 2019-02-05
- Upgraded [security]
webpack-dev-serverto 3.1.14 - Upgraded
eslintto 5.13.0 - Upgraded
gatsbyto 2.0.115 - Upgraded
prettierto 1.16.4 - Upgraded
tailwindcssto 0.7.4 - Upgraded
reactto 16.7.0 - Upgraded
react-domto 16.7.0 - Upgraded
react-iconsto 3.3.0 - Upgraded
eslint-config-gatsby-standardto 2.1.1 - Upgraded
eslint-config-prettierto 4.0.0 - Upgraded
eslint-plugin-importto 2.16.0 - Upgraded
eslint-plugin-jsx-a11yto 6.2.1 - Upgraded
eslint-plugin-prettierto 3.0.1 - Upgraded
gatsby-plugin-google-analyticsto 2.0.13 - Upgraded
gatsby-plugin-manifestto 2.0.17 - Upgraded
gatsby-plugin-offlineto 2.0.22 - Upgraded
gatsby-plugin-react-helmetto 3.0.6 - Upgraded
gatsby-plugin-sharpto 2.0.20 - Upgraded
gatsby-plugin-sitemapto 2.0.5 - Upgraded
gatsby-remark-imagesto 3.0.0 - Upgraded
gatsby-remark-prismjsto 3.2.4 - Upgraded
gatsby-source-filesystemto 2.0.20 - Upgraded
gatsby-transformer-remarkto 2.2.4
v1.3.4 - 2018-11-18
- Upgraded
eslintto 5.9.0 - Upgraded
eslint-config-gatsby-standardto 2.1.0 - Upgraded
eslint-config-prettierto 3.3.0 - upgraded
gatsbyto 2.0.50 - upgraded
gatsby-plugin-google-analyticsto 2.0.7 - upgraded
gatsby-plugin-manifestto 2.0.9 - upgraded
gatsby-plugin-offlineto 2.0.15 - upgraded
gatsby-plugin-react-helmetto 3.0.2 - upgraded
gatsby-plugin-sharpto 2.0.12 - upgraded
gatsby-plugin-sitemapto 2.0.2 - upgraded
gatsby-remark-images2.0.6 - upgraded
gatsby-remark-prismjsto 3.0.3 - upgraded
gatsby-source-filesystemto 2.0.8 - upgraded
gatsby-transformer-remarkto 2.1.12 - upgraded
prettierto 1.15.2 - upgraded
reactto 16.6.3 - upgraded
react-domto 16.6.3 - upgraded
tailwindcssto 0.7.2
v1.3.3 - 2018-10-25
- Upgraded
eslintto 5.7.0 - Upgraded
eslint-plugin-jsx-a11yto 6.1.2 - Upgraded
gatsbyto 2.0.31 - Upgraded
gatsby-plugin-manifestto 2.0.31 - Upgraded
gatsby-plugin-offlineto 2.0.6 - Upgraded
gatsby-plugin-sharpto 2.0.8 - Upgraded
gatsby-remark-imagesto 2.0.4 - Upgraded
gatsby-remark-prismjsto 3.0.2 - Upgraded
gatsby-source-filesystemto 2.0.5 - Upgraded
gatsby-transformer-remarkto 2.1.9 - Upgraded
reactto 16.6.0 - Upgraded
react-domto 16.6.0 - Upgraded
react-iconsto 3.2.2
v1.3.2 - 2018-10-01
- Upgraded
eslintto 5.6.1 - Upgraded
eslint-plugin-prettierto 3.0.0 - Upgraded
gatsbyto 2.0.14 - Upgraded
gatsby-plugin-manifestto 2.0.4 - Upgraded
gatsby-remark-imagesto 2.0.3 - Upgraded
gatsby-remark-prismjsto 3.0.1 - Upgraded
gatsby-transformer-remarkto 2.1.5
v1.3.1 - 2018-09-26
- Upgraded
reactto 16.5.2 - Upgraded
react-domto 16.5.2 - Upgraded
gatsbyto 2.0.8 - Upgraded
gatsby-transformer-remarkto 2.1.3 - Upgraded
gatsby-remark-imagesto 2.0.2 - Upgraded
gatsby-plugin-manifestto 2.0.3 - Upgraded
gatsby-plugin-google-analyticsto 2.0.6 - Upgraded
tailwindcssto 0.6.6 - Upgraded
prettierto 1.14.3 - Upgraded
eslint-config-prettierto 3.1.0
v1.3.0 - 2018-09-26
- Colophon - a location for social links & endmatter
- Renamed certain divs to their HTML5 semantic-web equivalents
- Merged styles
v1.2.4 - 2018-09-17
- Upgraded packages from rc to final version. Hooray Gatsby v2!
- Upgraded
eslintto 5.6.0 - Upgraded
gatsbyto 2.0.0 - Upgraded
gatsby-plugin-google-analyticsto 2.0.5 - Upgraded
gatsby-plugin-manifestto 2.0.2 - Upgraded
gatsby-plugin-offlineto 2.0.5 - Upgraded
gatsby-plugin-react-helmetto 3.0.0 - Upgraded
gatsby-plugin-sharpto 2.0.5 - Upgraded
gatsby-plugin-sitemapto 2.0.1 - Upgraded
gatsby-remark-imagesto 2.0.1 - Upgraded
gatsby-remark-prismjsto 3.0.0 - Upgraded
gatsby-source-filesystemto 2.0.1 - Upgraded
gatsby-transformer-remarkto 2.1.1 - Upgraded
reactto 16.5.1 - Upgraded
react-domto 16.5.1
v1.2.3 - 2018-09-17
- Personalized web manifest
v1.2.2 - 2018-09-16
- Unique metadata for each page's keywords
- Page's title now appears first in the <title> tag
- site metadata that should be unique for each page
v1.2.1 - 2018-09-12
- Upgraded
gatsbyto the latest v2 rc - Upgraded
gatsby-plugin-offlineto the latest v2 rc - Upgraded
gatsby-plugin-sharpto the latest v2 rc - Upgraded
gatsby-remark-imagesto the latest v2 rc - Upgraded
gatsby-source-filesystemto the latest v2 rc - Upgraded
gatsby-transformer-remarkto the latest v2 rc
v1.2.0 - 2018-09-11
- Changed styling to use TailwindCSS
tailwindcss- For CSS stylingpurgecss- To ensure the minimum amount of CSS is downloaded to the user's browser
v1.1.1 - 2018-09-09
- Upgraded
reactto 16.5.0 - Upgraded
react-domto 16.5.0
v1.1.0 - 2018-09-07
- Upgraded
gatsbyto latest v2 rc - Upgraded
gatsby-plugin-offlineto latest v2 rc - Upgraded
gatsby-source-filesystemto latest v2 rc - Upgraded
gatsby-transformer-remarkto latest v2 rc - Upgraded
gatsby-plugin-google-analyticsto latest v2 rc - Images that have title attributes now show that title as their captions
- Other minor image setting tweaks
gatsby-remark-imagesandgatsby-plugin-sharpto be able to use images in markdowngatsby-plug-sitemapfor SEO stuff
v1.0.2 - 2018-09-06
- Updated Gatsby to latest rc
- Updated
gatsby-plugin-offlineto the latest rc - Upgraded
eslintfrom 5.4 to 5.5 - Upgraded
eslint-config-gatsby-standardfrom 1.2.2 to 2.0.0- Takes care of the deprecation error messages while linting. Yay!
v1.0.1 - 2018-09-04
- Date format is converted to Zulu time and is displayed in Big Endian style. Today's date would be 2018-09-04 23:02
- Moved draft filter from generator to graphql
v1.0 - 2018-09-03
- Initialized default gatsby v2 project (based on
gatsby-starter-default) - License for code created specifically for this site
- eslint and rules for AirBnB style guide and Gatsby
- Testing out an a11y rule for eslint
editorconfigto help with whitespace in codegatsby-source-filesystemto read markdown files from the filesystemgatsby-transformer-remarkto transform those markdown files to HTMLgatsby-remark-prismjs&prismjsto have nice code highlighting- Existing markdown files from old blog - these are useful for testing the layout and design of the site
gatsby-plugin-google-analyticsto continue using Google Analytics
- Renamed license for gatsby content to show that it is for the gatsby-created content
- Replaced
gatsby-start-defaultbranded content inpackage.jsonto reflect the name and goal of this project - Renamed JS files that used jsx to have the
.jsxextension. - Renamed
.prettierrcconfig file to.prettierrc.jsonto remind me of its format - Removed h1 from header so that only one h1 per page will be available. This is for #a11y
- Allow a "draft: true" in the yml header of a markdown file to ensure that it won't get published
- npm-based lock file since this project is using yarn instead