Skip to content
dgDavid Gray
Writing

I rebuilt this site so that publishing costs one file

· #astro #web #tooling

The previous version of this site was one index.html file, 41,000 characters long, with the CSS bolted on beside it. It worked. It had been working for years. That is exactly the problem — it worked well enough that I never rewrote it, and badly enough that I never added to it.

Every time I finished something worth showing, publishing it meant opening that file, finding the right nest of <div>s, and hand-copying the markup of the project above it. I did that maybe four times in three years. The friction did not stop me from building things. It stopped me from telling anyone about them.

The actual requirement

So the requirement was never “make it look better.” It was:

Adding something new should cost one file and no thinking.

Everything else followed from that. Static, because GitHub Pages is free and I do not want to operate a server for a personal site. Markdown, because I already write in it. Content collections with a schema, because I want the build to fail loudly when I forget a field rather than silently render an empty card.

What it runs on

Astro, building to static HTML. Content lives in src/content/ as markdown with typed frontmatter. Images get optimised at build time. Most pages ship no JavaScript at all — the mobile menu, the theme toggle and the copy-email button are the only exceptions, and each of them degrades to a working page if the script never loads.

The whole thing deploys through a GitHub Action on push to master. There is no build step I have to remember to run and no artifact I have to remember to commit.

The part I care about more

Rebuilding the site meant re-reading everything I had written about my own work, and most of it was written in the flattened voice of a résumé. “Developed a Go HTTPS server to streamline integration testing.” True, and it tells you nothing about the two weeks of finding out why the old process was slow, or the argument about whether it was worth fixing at all.

The interesting part of engineering is almost never the artifact. It is the constraint you were under and the thing you chose not to do. That is what I want this site to be for now.

Thoughts, corrections, or something I got wrong? I actually want to hear it —davidgraymi@gmail.com.

ESC

Home

Main landing page & highlights

Page

Work

All engineering projects & case studies

Page

Writing

Technical notes & engineering articles

Page

Photos

Photography & outdoor expeditions

Page

About

Background, career timeline & skills

Page

Contact

Email, inquiries & consultation

Page

Copy Email Address

davidgraymi@gmail.com

Action

Toggle Light / Dark Theme

Switch color theme

Action

Download Résumé

Word document (.docx)

Download

Play Wordlet

Launch the Flutter word puzzle in browser

Game

Visit GitHub

github.com/davidgraymi

External

Visit LinkedIn

linkedin.com/in/david-gray-mi

External

A processor built from the ground up

Kernel, task scheduler and communication protocol written from nothing, in C and Ada, now in production and distributed globally.

Professional

Sign Language Interpretation System

Control any smart device with American Sign Language — hand tracking, a gesture classifier and grammar correction, wired together over a client-server link.

Capstone

A system library that runs anywhere

One portable C++ library targeting any RTOS or bare-metal system, packaged with Docker, Bazel and GitLab CI — cutting porting work by 4×.

Professional

Patient Care Portal Triage

An NLP pipeline that routes patient portal messages to the right team and surfaces relevant evidence-based research while they wait for a human.

Research

Bindersnap

GitHub for everyone who doesn't use GitHub — document management, review lifecycle, team collaboration, search and an in-browser editor.

Personal

Wordlet

A word guessing game built in Flutter and compiled to the web — playable right here, no install, no account.

Personal

Reinforcement Learning applied to Tetris

An agent that learns to play Tetris — a genuinely fun excuse to get hands-on with reward shaping.

School

Handwritten digit recognition with weighted KNN

A KNN classifier for handwritten digits, plus a k-value optimizer that collapses repeated distance calculations into a single pass.

School

ID3 mushroom classification

A from-scratch ID3 decision tree that predicts whether a mushroom is edible or poisonous from its attributes.

School

Healthcare length-of-stay estimator

A data mining project predicting how long a patient will stay, from admission-time features.

School

This website

A static site built with Astro, hosted free on GitHub Pages, designed so writing a post costs one markdown file and nothing else.

Personal

I rebuilt this site so that publishing costs one file

The old site was a single 41,000-character index.html. Every change was archaeology. Here is what I replaced it with and why the constraint was maintenance, not design.

Post
to navigate to select
Linear / Raycast mode