Projects and contributions

My Contributions

In addition to creating my own projects, I also enjoy contributing to other projects.

azbrowse - an interactive CLI for browsing azure resources

This is a fantastic project created by Lawrence Gripper - see the Getting Started docs for a taster of some of the functionality.

I’ve contributed various PRs, including:

  • Added Azure API spec parsing to allow digging deeper into Azure Resource Manager (ARM) endpoints
  • Enabling editing of JSON and submitting to ARM (where PUT/POST is supported) to make changes to Azure resources
  • Early work to export Azure resources as Terraform
  • Custom actions for nodes
  • Data-plane support for
    • Storage blobs
    • Container Registry
    • Kubernetes Service (allows drill-down into the Kubernetes API)
    • Cosmos DB (SQL Database endpoint)
    • Databricks (allows drill-down into the Databricks API)

VS Code Remote Containers (aka dev containers)

Contributed the initial work to enable dev containers to work with source code in WSL 2:

Terraform azurerm provider

I’ve made a few contributions to the azurerm provider for Terraform improving support for Azure Batch, Azure Storage, Application Insights, and setting ACLs in Azure Data Lake.

Terraform operator bridge

Another fun project from Lawrence Gripper, tfoperatorbridge allows you to create a Kubernetes operator from a Terraform provider. I enjoyed kicking around initial ideas for this with Lawrence, as well as adding integration tests and an initial implementation of referencing properties across objects.

Azure Resource Explorer - a site to explore and manage your ARM resources in style

The code for lives at and I’ve made a few contributions there to add and update API sets.

Azure Databricks Operator

A fellow team started the Azure Databricks Operator project to create a Kubernetes operator for working with Azure Databricks and as part of a customer engagement I’ve made several contributions to the project.

Terraform Databricks provider

After our team investigated and picked up the Databrickslabs Terraform provider for a project we were working on, I contributed back a few fixes and enhancements.


When working with multiple browser profiles, it can become cumbersome to have to manually switch profiles when opening links. The BrowserPicker project is an application that registers as your Windows Browser and then allows you to choose which browser/profile to open when clicking on a link. Rules can be configured to automate browser/profile selection base on the URL.

I contributed a number of PRs to add greater flexibility around URL matching in rules and to unwrap URLs in Outlook/Teams/Twitter links so that rules can work against the underlying URL rather than the wrapped URL.

My Projects

Dev container CLI

I’m quite a big fan of the dev containers feature of VS Code (especially with WSL 2) and included a whole chapter on them in my WSL 2 book.

I also spend quite a bit of time working in the Terminal, so created a dev container CLI. This CLI allows you to:

  • devcontainer open-in-code to open a folder in VS Code as a dev container (skipping the normal interim step where VS Code prompts you to reload as a dev container)
  • devcontainer exec to exec into a dev container (analagous to docker exec) - useful for dropping your terminal session into a dev container
  • devcontainer template add to copy a template dev container into your project to create a dev container - a handy way to get started
  • devcontainer template add-link to symlink a dev container template into your project with a .gitignore to exclude the folder - useful if you want to work with a dev container on a project that doesn’t want the dev container contributed

devcontainer-build-run - GitHub action and Azure DevOps task for using dev containers in CI/CD

This project provides both a GitHub action and an Azure DevOps task with the goal of making it easier to re-use your VS Code dev container definition in you GitHub and Azure DevOps pipelines. By doing this, your CI builds use the same environment that you use for local development, extending the benefits of dev containers to your CI pipelines.

Code at:

wsl-clock - automatically correct clock drift

There has been a long-running issue (now tracked here) with WSL 2 where the clock in WSL 2 ends up behind the main system time. This causes a wide range of issues (for example, access tokens may be issued that the system doesn’t think are valid).

After tracking this down to something that only seems to happen after sleep/hibernation, I created a PowerShell script that is triggered on system resume and automates applying the step to correct the clock. I later updated this to be a command line app written in Go - see

az group deployment watch - Azure CLI extension

An extension for the Azure CLI to give a live progress view of an ARM deployment, complete with colour-coding to indicate status (running, completed, errored).

Code at:

Posh-HumpCompletion - PowerShell tab completion for the Azure PowerShell cmdlets era

When working with some PowerShell modules, there can be a large number of cmdlets, and the cmdlet names can get quite long. posh-HumpCompletion adds support for “hump completion”. This means that it will use the capitals in the cmdlet name as the identifiers, i.e. Get-DC<tab> would complete for Get-DnsClient, Get-DnsClientCache, Get-DscConfiguration, Get-DomainController etc.

Code at

pi-bell - a Raspberry Pi powered networked doorbell

The pi-bell is a networked doorbell project written in Go for the Raspberry Pi. It allows multiple chimes to be connected over the network to a bellpush.

Kips-operator - an exploration of Kubernetes operators and Azure Relay Bridge

This project was an opportunity to explore building Kubernetes operators with Kubebuilder. It takes the Azure Relay Bridge that Clemens Vasters created and integrates it with an operator to provide a way to redirect services running in your Kubernetes cluster to applications running on your local machine.

Code at:


An exploration of an idea for how to improve the developer experience of working with Azure Durable Functions to gain productivity and compiler checking by using code generation to avoid the need for magic strings.

Code at:

Workshop material for “Building a provider for Virtual Kubelet”

Building a provider for Virtual Kubelet (with links to sample lab implementations in Go, Node.js, C# and Python as well as a UI to help see the status of the provider)

Delivered at KubeCon Seattle 2018 and Container Camp London 2018