This whole site — the resume and this blog — cost less than $1 in LLM tokens to build. It used to take me a weekend to build, generate, deploy and verify.
It's a small Python pipeline that just dumps out static files.
What's in it
- Resume: a
resume.jsondata file, rendered through a Jinja2 template to HTML and PDF (via WeasyPrint). - Blog: each post is a single Markdown file. The build turns it into a clean URL, an RSS feed, and responsive images.
In the past, I'd usually try a static site generator, then adapt it heavily, and ultimately write a DIY setup.
It was always more fun to generate the build of the blog/resume/whatever than it was to write the actual content, which I'd eventually give up every few years.
The usual static-site generator stuff
The whole thing is just a few small files:
resume.json # resume data
posts/ # one markdown file per post
templates/ # jinja2 templates
scripts/ # the build pipeline
public/ # css, logos, favicon
.github/workflows/ # ci: build + deploy
Push to main, and GitHub Actions builds everything into dist/, then
deploys it to Cloudflare Pages.
There's the usual Markdown support, plus syntax highlighting. Python:
def cost_per_page(total_cents: float, pages: int) -> float:
return total_cents / pages
Rust:
fn cost_per_page(total_cents: f64, pages: usize) -> f64 {
total_cents / pages as f64
}
Even Markdown gets highlighted — like this post itself:
**Bold**, `inline code`, and ~~strikethrough~~ all work.
Mixed feelings
A weekend of a fun side project, now handled for the price of a can of soda. I have very mixed feelings about this, because it takes away the reward I get from building things — the dopamine hit of the reward loop that side projects give me.
In some areas, it's even done a better job than I ever could have in the same time. Maybe I should find new side projects.
Maybe this will make me focus on the content of the writing rather than building the thing that presents the writing itself?