Personal website for Stephen McCullough, built with Astro and deployed to GitHub Pages.
- π Blog and notes sections with Markdown support
- π Dark/light mode toggle with system preference detection
- π¨ Clean, minimalist design using Tailwind CSS
- π Fast loading with minimal JavaScript
- π± Fully responsive
- π‘ RSS feed for blog posts and notes
- πΊοΈ Automatic sitemap generation
- π SEO optimised with meta tags and Open Graph support
- Node.js 20 or later
- npm or pnpm
- make (optional, for using Makefile commands)
make local.install
# or
npm installmake local.dev
# or
npm run devOpen http://localhost:4321 to see the site.
make local.build
# or
npm run buildThe built site will be in the dist/ directory.
make local.preview
# or
npm run previewmake local.check # Run Astro type checking
make local.clean # Clean build artifacts
make branch # Show current git branchEnd-to-end tests are written with Playwright and run against the built site.
npm run testnpm run test:ui- Homepage loads correctly
- Navigation links work
- Dark mode toggle
- Writing/Blog pages (list and individual posts)
- Notes pages (list and individual notes)
- Now page
- About page
- Projects page
- RSS feed accessibility
- Basic accessibility (heading hierarchy, image alt text)
Tests run automatically on pull requests via GitHub Actions.
Use the Makefile shortcut (recommended):
make content.writingThis will prompt you for the title, description, slug, and tags, then create the file with proper frontmatter and open it in your editor.
Or manually create a new Markdown file in src/content/writing/:
---
title: "Your Post Title"
description: "Brief description for SEO"
pubDate: 2025-11-05
tags: ["typescript", "astro"]
---
Your content here...Use the Makefile shortcut (recommended):
make content.noteThis will prompt you for the title, slug, and tags, then create the file with proper frontmatter and open it in your editor.
Or manually create a new Markdown file in src/content/notes/:
---
title: "Quick Note About X"
pubDate: 2025-11-05
tags: ["javascript"]
---
Brief content...Use the Makefile shortcut (recommended):
make content.thoughtThis will prompt you for the slug and optional tags, then create the file with proper frontmatter (including current time) and open it in your editor.
Or manually create a new Markdown file in src/content/thoughts/:
---
pubDate: 2025-11-05
pubTime: "18:30"
tags: ["meta"]
---
Your thought here...Edit src/content/now/current.md:
---
updatedDate: 2025-11-05
---
## What I'm up to
Currently working on...The site automatically deploys to GitHub Pages when you push to the main branch.
make production.deploy
# or
git push origin mainmake production.logs # View recent GitHub Actions runs
make production.status # View current deployment status- Go to your GitHub repository Settings β Pages
- Under "Build and deployment", select "GitHub Actions"
- Under "Custom domain", enter
swm.cc - Ensure DNS is configured with a CNAME record pointing to your GitHub Pages URL
/
βββ .github/workflows/ # GitHub Actions deployment
βββ public/ # Static assets
βββ src/
β βββ components/ # Reusable Astro components
β βββ content/ # Markdown content
β β βββ blog/
β β βββ notes/
β β βββ now/
β βββ layouts/ # Page layouts
β βββ pages/ # Routes (becomes URLs)
β βββ styles/ # Global styles
β βββ utils/ # Helper functions
βββ astro.config.mjs # Astro configuration
βββ claude.md # Project documentation
βββ package.json
- Framework: Astro v5
- Styling: Tailwind CSS v4
- Content: Markdown with frontmatter
- Deployment: GitHub Pages via GitHub Actions
- Domain: swm.cc (custom domain)
See claude.md for detailed project documentation, including:
- Architecture decisions
- Content workflow
- Maintenance guidelines
- Troubleshooting
Content: All rights reserved Code: MIT Licence