This site is a few hundred lines of shell, a stylesheet, and some markdown. There is no framework, no bundler, and nothing running on a server. Every page you are reading was written to a markdown file.
Pages are markdown files under src/. A build turns each one into HTML with lowdown and writes it to dst/:
./ssg6 src dst "ericpark.xyz" "https://ericpark.xyz"
ssg6 is a small POSIX shell static site generator. I run a lightly modified copy of the original: mine rewrites .md links to .html so a page can link to its neighbour the way it reads in the source, and it stamps each page with a date.
There is no template language. src/_header.html is prepended to every page, everything else is the markdown output, and the whole site shares one stylesheet. Anything that is not markdown or HTML gets copied across untouched, and a sitemap is written at the end.
The whisky page is generated rather than written. It starts as a folder of photos I took in bars, which never leave my machine — the source images are ignored by both git and the build.
A Swift program runs Apple’s Vision text recognition over each photo to read what it can off the label, and the results land in a tab-separated file that is committed alongside the code. OCR of a bottle held under bar lighting is about as reliable as that sounds, so anything I have confirmed by eye lives in an overrides table in the generator. From there, a Python script converts each photo to WebP, sorts the bottles, and rewrites the page below a marker; the prose above the marker is mine and is left alone.
The lineup shots on the bottles page go through the same conversion, plus a step that finds faces with Vision and blurs them before anything is published. They are photos taken in bars, so other people are in frame.
A deploy is a clean rebuild followed by an aws s3 sync to the bucket behind CloudFront. Pages, CSS, and the sitemap are sent with a short shared-cache lifetime and invalidated on the spot; images and PDFs are cached for a day and compared by size, so the hundreds of unchanged bottle photos are not re-uploaded every time I fix a typo.
The output directory is disposable. It is deleted and rebuilt from scratch on every deploy, and it is not in the repository at all — the markdown, the stylesheet, and the generator are the site.