• I wonder if the split between the coding as a craft, verses coding as a means to a finished product, is a false dichotomy. There’s always a mix between the mundane and the interesting for any coding project. Moving and shuffling data between API, modal, and database is pretty rote at this point, and is something that a coding agent can pick-up pretty easily. But there are still problems out there that rely on craft to do well if you look for them. Updating and aggregating records within a transaction using optimistic locking and intelligent choices for retries, for example. That is interesting work, and the satisfaction that comes from hand-rolling it is worth the delayed gratification, not to mention the understanding thrown out as a by-product.

  • You see these car lifts or “stackers” everywhere in South Melbourne. Didn’t know they were as prevalent as they are until I knew someone who used one. Apparently they’re decent, if they’re working.

    An empty garage with industrial equipment and yellow safety bollards at the entrance, with a lift as a floor.
  • Grew frustrated with Android a few days ago and wondered if I would ever switch to iOS. But after setting up a pipeline for a Flutter Android app, being able to side load it directly from the build artefacts is way too good a feature to throw away. So I can’t see myself switching anytime soon.

  • πŸ“˜ Devlog

    Well Read - An Inkwell Client for Android

    When Manton mentioned that Inkwell has an API, I… um… may have vibe-coded an Android client. It's called "Well Read", which is not a great name but better than "Inkwell Client" which was the working title. Much like Inkwell, it follows the river approach to RSS. There's a Today tab and Recent tab, each showing a portion of the entries in reverse chronological order. Today shows all the posts from today, plus the last 6 hours of yesterday. Continue reading β†’

  • Degraves Street. I’ve lived in Melbourne my entire life, yet this is the first time here.

    A narrow alley lined with signs and lights leads to a distant building, featuring various shops and restaurants on either side.A cozy cafe setting with wooden tables and chairs, a shelving unit filled with glassware, and outdoor seating visible through an open doorway.

  • Oh, and make sure it’s Java 17. Tried building the APK with Java Temurin 25.0.2 and Gradle errored out with this super useful error message:

    FAILURE: Build failed with an exception.
    * What went wrong:
    25.0.2
    

    Great job, Gradle. Always helpful. πŸ˜›

  • For anyone else going mad that you’ve set JAVA_HOME but Flutter is not picking it up and reporting a different version, you need to configure the JDK path in Flutter itself. It may be getting confused with the version that comes with Android Studios. Use:

    flutter config --jdk-dir="$JAVA_HOME"
    
  • I’ve not yet used a REST endpoint tester that I liked. I have dreams of building one that would work for me, but I haven’t found a workflow that is any better. Something about using GUI tools for testing REST endpoints that just sucks.

  • We never got a satisfactory answer as to why a raven is like writing desk. Maybe it will prompt one to wonder why a crow is like a kitchen bench. Well, it’s probably not worth considering why, as the two are completely different things (that is, unless, you opt for a bench with black surfaces).

  • πŸ“˜ Devlog

    Weiro - Update 6th March 2026

    A small update on Weiro. I've been working on it over the past week, trying to get it in a state that is pleasant to use. I'm been trying to get something halfway usable before doubt scuppers my motivation and this project appears on the growing list of aborted attempts at making a CMS. There've been one or two close calls, but it hasn't caused me to stop yet. A large part of that was a feature I knew I wanted but was daunting to implement: uploads. Continue reading β†’

  • πŸ“˜ Devlog

    CSVTool - A Vibe-coded CSV Editor

    One of the fun aspects of these new code agents is seeing what they're capable of producing just form the prompt, so called "vibe-coding." There are some that are definitely all in on the concept: I'm thinking of Steve Yeggie and his Gas Town work. As for myself, I still prefer to be a bit more hands on. But it's still amusing to see what these agents are capable of just from the prompt. Continue reading β†’

  • Coffee at the cafe may cost around $6.50. But I’m not paying for just coffee: if I wanted coffee, I would’ve made it at home. I’m paying for “coffee at the cafe,” to have the ability to be out, sit, read, or write a post like this.

  • πŸ–ΌοΈ Gallery

    Newport Workshops Open Day

    Where we’re going we don’t need… roads. Continue reading β†’

  • On the train heading into the city. It’s like freaking peek hour.

  • My Coolify instance has been running really slowly over the last few days. I may start looking at alternatives, or maybe go back to using Dokku.

  • PostgreSQL Docker and "No space left on device"

    Dealing with PostgreSQL Docker complaining about “No space left on device” Continue reading β†’

  • Ooh, this is a nice new feature of Pocket Casts: the web player now includes chapter markers in the scrubber. You can mouse over them to get the chapter name, and click them to jump to the chapter.

    Auto-generated description: A music player interface shows the song Long Weekend by Hemispheric Views being played at 0:34 out of 5:11.
  • It’s apted and apklicable to brew something yum occasionally. #package-management-humour 😜

  • Go iterators don’t have a built in way to send errors back, so I borrowed something from Haskell and made a “maybe” type:

    type Maybe[T any] {
      Value T
      Err   error
    }
    
    func (m Maybe[T]) Get() (T, error) {
      return m.Value, m.Err
    }
    

    The iterator pushes values wrapped in this, which would have Value set if one is available, or Err set if not. The Get() method provides a convenient way to get both, allowing for patterns that look much like the following:

    func consume() error {
      for m := range myIter() {
        val, err := m.Get()
        if err != nil {
          return err
        }
      }
      doThingWithVal(val)
    }
    
  • Had a go (heh) at making a Go iterator. It was simpler than I expected, once I got my head around how they work. It’s a push model, the iterator pushes value to a yield function, which sends it to range, and receives a flag on whether to continue. The package docs do a good job explaining this.

  • Argh! Yeah, frickin’ tram replacement busses. Effin’ loving the Grand Prix. πŸ‘Ž

    Auto-generated description: A person stands at a tram stop watching a bus approach on a busy street lined with historic buildings.
  • Must say the MacBook Neo looks like an interesting offering. I don’t need a laptop β€” I use a desktop at home β€” but that may be where the strength of such a computer lies: a laptop for those that generally don’t use laptops. Could be useful for travel (I don’t travel that often either).

  • Are the sounds made by reversing EVs designed to be awful? Well, I guess they get my head turning so they must be doing something right. 😏

  • Really enjoying Inkwell, @manton’s RSS reader. Using it on the phone has been pretty good. Adjusting to the river approach to RSS has been interesting. I’ve been finding myself saving less and trying to get through more posts during the day, less they drop out of the Today view.

  • Here’s a pitch for the maintainers of Homebrew: make brew update and brew upgrade aliases of the same command, then add brew update brew (or brew upgrade brew) to upgrade Homebrew itself. End this confusion once and for all.