Performing a v2 release of a Go module (1 mins read).

How to prepare your Go module for its first breaking change release.
Performing a v2 release of a Go module (1 mins read).
How to prepare your Go module for its first breaking change release.
Building resilient, runnable command-line demos with Asciinema and demo
(3 mins read).
How to use the demo
library alongside Asciinema to make it easier to build and maintain demos for your command-line tools.
Importing a subdirectory from one repo into another (1 mins read).
How to import a subdirectory of a given Git repository into another one, using git subtree
.
How we reduced oapi-codegen's dependency overhead by ~84% (6 mins read).
An example of how to reduce the size of a Go module's dependencies by taking advanage of Go module pruning.
Plea to Software Composition Analysis (SCA) providers and Software Bill of Materials (SBOMs) producers: give us more data! (2 mins read).
Why I think dependency scanning tooling should be providing as much data as possible about scanned projects, to allow other tooling to make better inferences about the data.
Which version of Go was used to compile this binary? (2 mins read).
How to use a few means to work out what version of Go a given binary was compiled with.
Utilising Renovate's local
platform to make renovate-graph
more efficient (2 mins read).
How using the local
platform with renovate-graph
can increase the performance of dependency extraction.
Gotcha: Using vCluster on Elastic Kubernetes Service requires a Container Storage Interface driver (2 mins read).
How to avoid PersistentVolumeClaim
s getting stuck in a Pending
state with vCluster and EKS when you've not set up the cluster with a Container Storage Interface driver for Elastic Block Store.
Listing environment variables used to trigger a Buildkite pipeline (1 mins read).
How to use Buildkite's GraphQL API to list the environment variables provided to trigger a pipeline.
Publishing My On-Call Compensation History (1 mins read).
Publishing a page detailing the on-call compensation I've received over the years.
Why should you blog? (12 mins read).
A writeup of my talk at DDD East Midlands around why you should start blogging.
Solving /usr/lib/Xorg.wrap: Only console users are allowed to run the X server
errors with tmux over SSH (1 mins read).
How to avoid Xorg errors when connecting to a Linux machine over SSH that tries to spawn startx
.
This talk should also be a blog post (3 mins read).
How you can improve your public speaking by also writing blog posts for your talks.
How blogging has affected me, as a neurodiverse person (5 mins read).
How I've used blogging to help with my ADHD.
Introducing tweetus-deletus π¦πͺπ - a tool to automate deleting your tweets, through the browser (3 mins read).
Announcing the release of tweetus-deletus, a tool to delete all your tweets, driven through the browser with Playwright.
Reusing a browser session with Playwright (1 mins read).
How to re-use your existing browser sessions with Playwright.
Using dependency-management-data with GitLab's Pipeline-specific CycloneDX SBOM exports (1 mins read).
How to take advantage of SBOM export functionality in GitLab 16.4 with dependency-management-data.
Gotchas with pointing Go modules to a fork, when building an installable module (3 mins read).
A gotcha around how to pin a Go module to a fork, if you're building a module that should be go install
able.
Building dynamic jobs with BuildKite (2 mins read).
How to dynamically generate job configuration for BuildKite, while running inside a pipeline.
Setting up a matrix for GitHub Actions with Go's go.mod
and specific versions (2 mins read).
How to use a Go setup matrix in GitHub Actions that can target the go.mod
version and arbitrary other version(s).
dependency-management-data now supports Software Bill of Materials (SBOMs) and has better Dependabot support (2 mins read).
Announcing improved support for Dependabot and support for Software Bill of Materials (SBOMs).
Prefer using the GitHub Software Bill of Materials (SBOMs) API over the Dependency Graph GraphQL API (2 mins read).
Why you should use GitHub's Software Bill of Materials API instead of the Dependency Graph GraphQL API.
Setting up your Maven settings.xml
to release a Jenkins plugin (1 mins read).
How to set up your crdentials to release a Jenkins plugin via Maven.
Removing ANSI escape codes in Vim (1 mins read).
How to remove ANSI escape codes in (Neo)Vim.
Creating global middleware for net/http
servers in Go (1 mins read).
How to wrap net/http
servers in Go with middleware(s) on every request.
What Go versions are my modules and dependencies targeting? (1 mins read).
Without using go mod vendor
, how you can look at the version of Go that each of your modules and dependencies target.
Why is Go trying to upgrade my go.mod
to Go 1.21? (1 mins read).
Why you may be seeing Go trying to upgrade the Go version in your go.mod
to Go 1.21.
Creating a Zoho Mail alias using the API (2 mins read).
How to use the Zoho Mail API to add an alias to your account.
Setting up Mend Renovate Community Edition for GitLab.com on Fly.io (2 mins read).
How to set up Mend Renovate Community Edition on Fly.io, when integrating with GitLab.com.
Custom Advisories: the unsung hero of dependency-management-data (3 mins read).
How to use custom advisories with dependency-management-data to track packages that your organisation may not want to use.
Turning on Caps Lock when the Caps Lock key is bound to a different key (1 mins read).
How to trigger a Caps Lock event when you've rebound the key to a differnet key.
Setting up real-time Slack notifications for GitHub (1 mins read).
How to get Slack's real-time notifications integrated with GitHub.
Managing Buildkite Agent Images with Renovate (1 mins read).
How to use Renovate to manage Buildkite Agent Images.
Running commands against every module in a Go multi-module project (1 mins read).
How to run commands like go test
when using a multi-module Go project.
Resolving Timeout
s when generating entropy when generating a new GPG key (1 mins read).
How I resolved an issue with a Timeout
error when generating a new GPG key.
Resolving black screen display with SDDM and NVIDIA GPUs (1 mins read).
How I resolved an issue with a black screen displaying when SDDM is used with an NVIDIA driver.
Analysing GitHub Pull Request review times with SQLite and Go (3 mins read).
How measuring how long code review took as a team lead to being able to change our processes, and then deliver much more effectively.
Getting started with Dependency Management Data (4 mins read).
How you can get started using Dependency Management Data in 3 commands.
Quantifying your reliance on Open Source software (24 mins read).
A writeup of my talk at DevOpsNotts, about the dependency-management-data project and how to use it to understand your internal and external dependencies.
LeadDev London 2023 (59 mins read).
A writeup of LeadDev London 2023 conference.
Merging a branch in GitHub - the hard way (4 mins read).
How to (kinda) merge two branches in GitHub using the underlying Git database API.
Validating Renovate configuration changes before merging (2 mins read).
How to perform a dry run to validate your Renovate config before it's merged.
Introducing dmd-web
, a web frontend for Dependency Management Data (DMD) (2 mins read).
Introducing a web frontend for the dependency-management-data project, to provide a better, centralised interface for interacting with the data.
Sharing state between net/http
method calls in Go (1 mins read).
How to construct a struct
in Go that can have its state shared between HTTP server handler functions.
Who do these Google (JSON file) credentials belong to? (1 mins read).
Given a JSON credentials file for Google APIs, are they still valid?
I'm joining Elastic (9 mins read).
Announcing my move to Elastic as a Senior Software Engineer, and looking back at my time at Deliveroo.
Using go.mod
versions to go install
a binary (1 mins read).
How to use go install
to install a binary from the version tracked in go.mod
.
Checking the migration status with golang-migrate
(1 mins read).
How to check what version of the schema is curently applied when using golang-migrate
.
Introducing openapi-sorbet
, a command-line tool for generating Sorbet types from OpenAPI (2 mins read).
How to generate Sorbet type-checked models from OpenAPI specifications.
Learn how to build tools (6 mins read).
A guest post on Letters to a New Developer about learning to automate and build tools to progress in your career.