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 40 posts
  1. GRD040

    #74AFiled today

    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.

  2. GRD039

    #319Filed 3 days 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.

  3. GRD038

    #238Filed 3 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.

  4. GRD037

    #6B1Filed 5 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.

  5. GRD036

    #A42Filed 8 months ago

    Why I'm building Stati

    I rebuilt this blog on a new framework every few years and the blog never changed. So I wrote a static site generator I intend to keep for ten years.

Fig. 2

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

Random snippets

  1. SNP005

    List all users and groups on linux

    Simple way to check your user list with your groups.

    3 lines of sh in 3 blocks, 3 lines of explanation.

    #962 cmd
  2. SNP019

    Kill the process that is using a port

    Find out what is squatting on port 3000 and get rid of it.

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

    #395 cmd linux
  3. SNP035

    Trim a video without re-encoding with ffmpeg

    Cut a clip out of a long recording in a second, with no quality loss.

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

    #397 ffmpeg cmd
  4. SNP068

    Exhaustive switch in TypeScript

    Make the compiler complain when you add a case to a union and forget to handle it.

    14 lines of ts in 1 block, 3 lines of explanation.

    #B26 typescript
  5. SNP067

    Redirect from a route middleware in Nuxt

    Send people who aren't logged in to the login page before the page even renders.

    10 lines of js and vue in 2 blocks, 6 lines of explanation.

    #694 js nuxt

Fig. 3

  • Code · 34 lines in 12 blocks
  • Explanation · 22 lines
  • Notes · 0