Hey, I'm Ian and I make websites

This is my digital garden, where I write about making websites, creating games and other creative adventures.

Page code #392 orange / blue-navy / red
Fig. 1 · Ian, 96 × 96 pxDrawn in #392

Latest posts

All 41 posts
  1. GRD041

    #159Filed today

    I use AI at work, why not in my game

    Players review bomb games made with AI and the stores label them. I build software with AI at work, so I find it odd that my own game should be any different.

  2. GRD040

    #74AFiled 3 weeks ago

    Stati 2 started as four bug reports

    I filed four bug reports about Stati's templates in one afternoon, each with a fix. Two hours later I threw the fixes away and broke the template API instead.

  3. GRD039

    #319Filed 4 weeks ago

    @stati/images: responsive images and link preview cards for Stati

    AVIF and WebP at several widths, and an Open Graph card for every page drawn without a browser. It ships as a separate package, and I had my reasons.

  4. GRD038

    #238Filed 4 months ago

    The dev server got slower with every save

    Windows eating file writes, a watcher that watched too much, and the instruments I built into Stati so the next slowdown shows up on a pull request instead of in my hands.

  5. GRD037

    #6B1Filed 6 months ago

    What Stati is, and what it isn't

    Where a small, TypeScript-first static site generator fits next to Astro, Eleventy and Hugo, and when you should pick one of those instead.

Fig. 2

  • Link to or from the latest 5 · 5
  • Link between older posts · 16

Random snippets

  1. SNP059

    Sign your commits with your SSH key

    Verified badges on GitHub without setting up GPG.

    6 lines of sh in 2 blocks, 4 lines of explanation.

    #64B git ssh
  2. SNP094

    Upsert in PostgreSQL

    Insert a row, or update it if it already exists, in one statement.

    6 lines of sql in 2 blocks, 5 lines of explanation.

    #591 sql postgres
  3. SNP127

    LLM prompt for reviewing a pull request

    A second pair of eyes before you ask a human for theirs.

    22 lines of md in 1 block, 3 lines of explanation.

    #53B llm prompt
  4. SNP105

    Breadcrumbs from stati.nav

    getBreadcrumbs() starts at the page's own folder. findNode() gives the whole trail.

    27 lines of eta in 2 blocks, 9 lines of explanation.

    #591 stati eta
  5. SNP039

    MariaDB in Docker for local development

    A database for the project that you can throw away and recreate in a second.

    17 lines of yaml and sh in 2 blocks, 4 lines of explanation.

Fig. 3

  • Code · 78 lines in 9 blocks
  • Explanation · 25 lines
  • Notes · 0