Sander's Blurbs


GPG failed to sign the data

  • Follow
  • If everything fails, use GIT_TRACE=1 prefixed to the git commit command to try and see what git is actually doing
  • Key might have expired, run the GPG Keychain application to check, it offers to extend the key.
    • You must then export the new key, delete the expired key in your GitHub account, and upload the new key to GitHub. Unverified past commits then become verified.

Hot take: I feel the web needs an improved markup + styling system, but more practical and reduced in functionality. This way more browsers can participate. Web pages don’t need a realistic ray casting rendering system for CSS, despite of how nice this would look — it has zero business benefits and discriminates against low performing devices. Instead, have a look at a video game engine with html5 output, if that’s what you want.

Found a cool resource, WP Kama notes on Sitemap on the WordPress sitemap feature I helped create, including many scenarios and a performance optimisation! It’s really satisfying to see the care given to something they find has usefulness. 👍

Really like the site as well, it has more reference information than the official codex.

I was using macOS mail rules to sort mail into “Feed” and “Papertrail” inbox subfolders but iOS mail badges are frequently incorrect or delayed. Does it work better when using server rules?

Splitting up the example cuttlefish blog application from the cuttlefish framework, so that I can include more features to specialise both, as well as build multiple application types.

Found this cool Firefox Extension called Tab Stash, it’s a performant open source variety of OneTab (which is neither): Lets you switch tasks by managing group of tabs. Essential.

The trick to relative symlinks

I learned this week that relative symbolic links are relative to the link not the current working directory. What does this mean?

To remind ourselves, the format of ln is:

ln -s {{/path/to/file_or_directory}} {{path/to/symlink}}


Say we have the following structure:


Say we want to create a symlink to app/config.yaml. If we are familar with the cp command we would incorrectly do this:

$ ln -s config/config.yaml app/config.yaml  #this is incorrect

Here, we’re asking ln to create a symlink in app/config.yaml that points to app/config/config.yaml because the ‘source’ parameter is relative to the link being created, not the current working directory. As that file does not exist the command fails!

Correct example:

$ ln -s ../config/config.yaml app/config.yaml #this is correct
$ cd app; ln -s ../config/config.yaml config.yaml; cd - #this is clearer

The first correct example can be difficult to comprehend unless we’re familiar with this concept: From the perspective of the app/config.yaml file, we need to first go to the parent directory then into the config directory.

This is clarified by the third example: by changing into the destination directory, we align the current working directory with the path to the source.


  1. If we create absolute symbolic links by providing the full path to the source file, this is avoided, however these links are more fragile. For example when syncing links the absolute path to the source is likely different on another device.

Someone should really come up with an improved version of ln that works conceptually more similar to cp in terms of relative paths.

Syncing Wallpaper Images Spoon

As a macOS user with a multi monitor setup and a laptop I frequently switch between 1 to 3 screens. I use task related spaces (general, coding, organisation, social) and to reinforce this habit I installed some Unsplash wallpaper images relating to the task.

In some undefined situations I lose the wallpaper image on certain screens on certain desktops (I have already disabled reordering and removing spaces) but dragging wallpapers across multiple screens on multiple spaces is too much work; and why not see if this can be automated.

Thanks to Hammerspoon and a few minutes time you can benefit from my script:

function sync_wallpaper()
    wp = hs.screen.primaryScreen():desktopImageURL()
    for index,screen in ipairs(hs.screen.allScreens()) do
        if screen:desktopImageURL() ~= wp then
            print('Syncing Wallpaper')

Add this to your .hammerspoon/init.lua and switch spaces to sync wallpapers to all screens on that space!

By the way

I’m using the following wallpapers: