Releases: mldangelo/personal-site
v4.1.0 (2026-01-03)
Features
- writing: add writing page with RSS feed (#776)
- blog: add local markdown blog posts (#779)
- footer: add view source link (#780)
- design: 2026 design refresh with modern branding & improved UX (#773)
- styles: migrate from SCSS to Tailwind CSS v4 (#772)
Bug Fixes
- email: resolve state transition bug in EmailLink animation (#783)
- hero: update hero section and fix link styling (#781)
Chores
- deps: update dev dependencies - Vitest v4, jsdom v27, Tailwind v4.1 (#782)
- test: migrate from Jest to Vitest with expanded test coverage (#778)
- config: modernize root config files and documentation (#770)
- cleanup: remove dead code and update LOC stat (#771)
- license: update copyright year range (#775)
Documentation
- update documentation for Tailwind CSS migration (#777)
Style
- remove blue outline from portrait photos (#774)
Full Changelog: v4.0.0...v4.1.0
v4.0.0 - Next.js App Router + React 19
Overview
This release marks the complete transformation of the personal-site template from an Express/Webpack application to a modern Next.js Jamstack site. This is a documentation release for the continuous deployment model—the live site always reflects the latest main branch.
411 commits since v1.5.0, with contributions from Ian Webster, Michael D'Angelo, Nick Spaargaren, Noah Trueblood, Ray Liu, Will, and Yang Zhou.
Architecture Evolution
| Component | v1.5.0 (2018) | v4.0.0 (2026) |
|---|---|---|
| Runtime | Express 4.x server | Static export (no server) |
| Framework | React 16 + Webpack 4 | Next.js 16 + React 19 |
| Language | JavaScript | TypeScript 5.9 (strict) |
| Routing | react-router | Next.js App Router |
| Linting | ESLint | Biome |
| Testing | — | Jest 30 + React Testing Library |
| Deployment | Manual | GitHub Actions → GitHub Pages |
| Node | 8.x | 20+ |
Highlights
🏗️ Framework Migrations
- v2.0 — Adopted React Hooks API
- v3.0 (Dec 2020) — Removed Express backend, migrated to Create React App
- v4.0 (Jul 2025) — Migrated to Next.js App Router with TypeScript
⚡ Performance
- Static export for instant page loads
- Next.js automatic font optimization
- Turbopack for fast development builds
- Removed 944KB
react-burger-menudependency → native 2KB slide menu
🛠️ Developer Experience
- TypeScript strict mode throughout
- Biome for fast, unified linting and formatting
- Jest + React Testing Library for component tests
- Comprehensive documentation in
/docs
♿ Accessibility
- Native slide menu with focus trapping and keyboard navigation
- ARIA attributes on interactive elements
prefers-reduced-motionsupport- Semantic HTML structure
For Forkers
If you're forking this project for your own personal site:
- See the Adapting Guide for step-by-step instructions
- All personal data is in
/src/data/— easy to swap out - Deployment is automatic via GitHub Pages on push to
main - Node 20+ required
What's Next
This project follows continuous deployment. Future releases will only be created for major architectural changes. Day-to-day improvements deploy automatically to the live site.
V1.5.0 2018-03-15
Improved:
- Updated dependencies to latest versions, including webpack 4
- Removed variable injection in favor of cookies
- updated about me section
Fixed:
- various typos
V1.4.0 2017-04-03
Added:
- Admin dashboard and accompanying middleware.
Improved:
- Route handling for redirects after login. Now using cookies.
- Refactored non-standard routes into separate components.
Fixed:
- Added a delay in mocha tests to prevent occasional race condition failures.
V1.3.0 2017-03-28
Added:
- Passport.js for user management with Google Oauth
- Hide /resume behind authentication system
Improved:
- Upgraded to react-router v4
- Refactored directory tree, most server related files are now in a /server folder.
Fixed:
- display: inline error on /resume that caused the page to not be fully responsive
- no longer serving entire repository directory. Now only /dist and /public are served.
V1.2.0 2017-03-24
Added:
- Tests with mocha and nightmare.js
Improved:
- Updated resume text.
Fixed:
- An error that caused Google Analytics to stop logging hits.
V1.1.1 2017-02-20
Fixed:
- Breaking error on /stats caused by safari not supporting Object.values() and polyfill not being included.
V1.1.0 2017-02-19
Added:
- A /music page that scrapes top played artists from last.fm.
- A full page layout that hides the left nav.
- A custom link renderer to react-markdown to navigate to other pages without performing a full refresh.
- more babel plugins to minimize react file size and decrease loading time.
Improved:
- Webpack config files rewritten in ES2015.
- Refactored API. Each route is now in its own file.
- Refactored SCSS file paths.
- Google Analytics now only logs hits when in production mode.
Fixed:
- Markdown was being rendered twice. Once by markdown-loader with webpack and once by react-markdown.
- Now calling clearInterval on timers when components are unmounted. This previously caused a set state error.
Known Issues:
- Artist tiles on page can be poorly formatted when artist names are too long.
V1.0.1 2017-02-15
Improvements:
- react-helmet to set document.title
- minifies html via html-minify-loader to save about 400kb (or 40 bytes after gzip compression)
- suffers ~25 seconds less downtime during deployments.
V1.0.0 2017-02-13
First tracked release: A changelog will be kept for future releases.
current pages include:
- index
- about
- resume
- projects
- stats
- contact
Known issues:
- resume is not well styled for mobile.
- some project links are currently down.
- some data fields need to be updated manually for /stats.
- scss is not linted.
- nginx gzip compression makes some files larger.