Skip to content

ethan-hawksley/ethan-hawksley.github.io

Folders and files

NameName
Last commit message
Last commit date

Latest commit

71fe766 · · May 31, 2026

History

665 Commits
May 30, 2026
Feb 1, 2026
May 17, 2026
May 29, 2026
May 31, 2026
May 30, 2026
Feb 5, 2026
Feb 1, 2026
May 23, 2026
May 23, 2026
May 23, 2026
May 23, 2026
May 24, 2026
May 31, 2026
May 29, 2026
May 29, 2026
May 23, 2026
Feb 1, 2026

Repository files navigation

hawksley.dev

I'm Ethan Hawksley, a CS student with a focus on systems and cybersecurity.

This repository hosts the source code for my personal portfolio & technical blog.log.

Ethan Hawksley's portfolio & blogblog


Features

  • Perfect 100/100 Google PageSpeed score
  • Mobile-first responsive design
  • Progressive enhancement using the latest CSS features
  • Optional JavaScript improvement
  • Light & Dark modemode

Tech Stack

Tool Purpose
Astro Has excellent performance and SEO with a no-JS-by-default approach
TypeScript Catches subtle type errors before compiling and running the code
Zod Ensures all posts have appropriate metadata
MDX Enables rich markup where required, whilst still supporting markdown
pnpm Fast package manager that reduces node_modules bloat through symlinks

Running Locally

Requires pnpm.

git clone https://github.com/ethan-hawksley/ethan-hawksley.github.io

cd ethan-hawksley.github.io
pnpm i
pnpm run devev

Then open http://localhost:4321 in your browser.

Font Subsetting

The site uses a subsetted version of the IBM Plex Sans and Mono fonts for increased performance. These are both available for download on Google Fonts.

To subset:

uv tool install pyftsubset

pyftsubset IBMPlexSans.ttf \
--output-file="IBMSans-Subset.woff2" \
--flavor="woff2" \
--unicodes="U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2190-2193,U+21A9,U+2212,U+2215,U+FEFF,U+FFFD" \
--layout-features="*" \
--no-hinting \
--desubroutinize
utinize

Do the same but with IBM Plex Mono as well to have both fully subsetted fonts.

License

Code is licensed under MIT.

Blog posts and written content are licensed under CC BY 4.0.

Code snippets embedded within blog posts are licensed under MIT.

Personal branding, logos, and photographs are All Rights Reserved (see the NOTICE file). Please remove these if you fork the repository.