RSS Amplifier

Blog

Jamie Magee

Recent content on Jamie Magee

jamiemagee.co.ukRSS feed ↗28 posts

Latest posts

Beyond SBOMs: making license data actionable with ClearlyDefined

You’re about to ship a product. Legal asks for the third-party notices, so you generate an SBOM, and half the dependencies come back as NOASSERTION . You can’t put that in a NOTICE file, and legal won’t sign off on it. I’ve spent a lot of late nights writing those files by hand, so this is the talk I gave about the project that saves me from most of them: ClearlyDefined.

A new way to catch a vulnerable .NET SDK

When NuGet finds a vulnerable package in your project, it tells you. NU1901 through NU1904 have warned about CVEs in your dependencies for a while now. The SDK that runs the build, though? That’s been a blind spot. You can sit on a perfectly patched set of packages and still be running dotnet build with an SDK that went end of life last May. That always struck me as a gap worth closing. So I…

Specialized Turbo e-bikes in Home Assistant

I ride a Specialized Vado SL 4.0. It has a TCU (Turbo Connect Unit) that broadcasts telemetry over Bluetooth Low Energy — battery level, speed, motor power, cadence, temperature, the works. Specialized has their own Mission Control app for this, but I wanted the data in Home Assistant. So I built a custom integration. The protocol Specialized’s BLE protocol isn’t documented anywhere…

Wombat Dressing Room meets its match

Back in January 2020, Google open sourced Wombat Dressing Room , an npm proxy that solved a real problem: how do you maintain two-factor authentication for npm packages while still using automation? For teams managing dozens or hundreds of packages, manually entering 2FA codes for every publish wasn’t just inconvenient, it was a dealbreaker. Fast forward to 2025, and npm has finally…

Understanding .NET Base Class Library Vulnerabilities

When you create a new .NET project and start writing code, you might find yourself using classes like System.Text.Json.JsonSerializer without ever explicitly adding a reference to System.Text.Json in your .csproj file. This isn’t magic—it’s because these Base Class Libraries (BCLs) are shipped as part of the .NET runtime itself, making them implicit references that are automatically…

Honey, I shrunk the npm package

Have you ever wondered what lies beneath the surface of an npm package? At its heart, it’s nothing more than a gzipped tarball. Working in software development, source code and binary artifacts are nearly always shipped as .tar.gz or .tgz files. And gzip compression is supported by every HTTP server and web browser out there. caniuse.com doesn’t even give statistics for support, it just says “…

Container Plumbing Days 2023—Windows containers: The forgotten stepchild

When it comes to Linux containers, there are plenty of tools out there that can scan container images, generate Software Bill of Materials (SBOM), or list vulnerabilities. However, Windows container images are more like the forgotten stepchild in the container ecosystem. And that means we’re forgetting the countless developers using Windows containers, too. Instead of allowing this gap to widen…

Your Jest tests might be wrong

Is your Jest test suite failing you? You might not be using the testing framework’s full potential, especially when it comes to preventing state leakage between tests. The Jest settings clearMocks , resetMocks , restoreMocks , and resetModules are set to false by default. If you haven’t changed these defaults, your tests might be fragile, order-dependent, or just downright wrong. In this…

Maintaining AUR packages with Renovate

One big advantage that Arch Linux has over other distributions, apart from being able to say “BTW I use Arch.”, is the Arch User Repository (AUR). It’s a community-driven repository with over 80,000 packages. If you’re looking for a package, chances are you’ll find it in the AUR. Keeping all those packages up to date, takes a lot of manual effort by a lot of volunteers. People have created…

Scanning Windows container images is (surprisingly) easy!

When it comes to Linux containers, there are plenty of tools out there that can scan container images, generate Software Bill of Materials (SBOM), or list vulnerabilities. However, Windows container images are more like the forgotten stepchild in the container ecosystem. And that means we’re forgetting the countless developers using Windows containers, too. I wanted to see what I’d need to make…

Making the most of GitHub rate limits

The GitHub documentation has a lot of good advice about rate limits for its API, and how to make the most of them. However, since using the GitHub API, there are some things I’ve discovered that the documentation doesn’t cover, or doesn’t cover so well. Conditional requests This topic is actually covered very well in the GitHub documentation . To summarise, all REST API requests will return ETag…

Writing GitHub bots in .NET

For a while now the Octokit libraries for .NET have lagged behind the JavaScript libraries, especially when it comes to webhooks. Unfortunately, I needed a GitHub webhook client for an internal project, so I had to write my own. It wasn’t too much extra effort to open source it, and thus Octokit.Webhooks was born! I wanted to give a quick example of how to get up and running with Octokit.Webhooks…

Netlify billing Denial-of-Service

At its heart, Netlify is a platform for hosting static websites. I initially started using it as an alternative to GitHub Pages , and features like Netlify CMS and preview deploys really won me over. However, I recently got bit by preview deploys and the build minutes pricing. I had a few GitHub repos set up to automatically deploy to Netlify previews from pull requests. I had also configured…

Tech stack #10YearChallenge

#10YearChallenge has been trending for a while, so I thought it would be fun to do a 10 year challenge for programming and take a look at the technology I used back in 2010. 2010 10 years ago covers my final year in high school, and my first year in university. Both used completely different programming languages and tech stacks, so it’s an interesting place to look back at. I was running…

Common async pitfalls—part two

Following on from part one , here’s some more of the most common pitfalls I’ve come across—either myself, colleagues and friends, or examples in documentation—and how to avoid them. ‘Fake’-sync is not async If the method you are calling is synchronous, even in an async method, then call it like any other synchronous method. If you want to yield the thread, then you should…

Common async pitfalls—part one

The .NET Framework provides a great programming model that enables high performance code using an easy to understand syntax. However, this can often give developers a false sense of security, and the language and runtime aren’t without pitfalls. Ideally static analysers, like the Microsoft.VisualStudio.Threading.Analyzers Roslyn analysers , would catch all these issues at build time. While…

Zwift on Linux

Getting Zwift to run on Linux was a journey I started just over a year ago . I didn’t get very far with my effort, but since then a lot of progress has been made by the Wine developers and others in the community, and Zwift is now (mostly) playable on Linux. I’ll admit there are some workarounds required. Like having to use the Zwift companion app to connect sensors. But on the whole,…

How to host your Helm chart repository on GitHub

Since the release of Helm 3, the official helm/charts repository has been deprecated in favour of Helm Hub . While it’s great for decentralization and the long term sustainability of the project, I think there’s a lot more that is lost. Where is the best place to go for of the expert advice now? Installing Helm now requires you to manually add each repository you use. And there’s…

7 tips for converting C# code to async/await

Over the past year I’ve moved from working mainly in Java, to working mainly in C#. To be honest, Java and C# have more in common than not, but one of the major differences is async/await. It’s a really powerful tool if used correctly, but also a very quick way to shoot yourself in the foot. Asynchronous programming looks very similar to synchronous programming. However, there are some…

Automated Dependency Updates

At CopenhagenJS in August I was able to share my work on Renovate —a universal dependency update tool—and how you can use it to save time and improve security in software projects. If you want to find out more about Renovate you can find us on GitHub . Watch on YouTube: "Automated Dependency Updates with Renovate"

Access: Hack The Box writeup

Recently I discovered Hack The Box , an online platform to hone your cyber security skills by practising on vulnerable VMs. The first box I solved is called Access . In this blog post I’ll walk through how I solved it. If you don’t want any spoilers, look away now! Information gathering Let’s start with an nmap scan to see what services are running on the box. 1 # nmap -n -v -Pn…

Twitter Hashflags (_Hash-what?_)

Have you ever tweeted out a hastag, and discovered a small image attached to the side of it? It could be for #StPatricksDay , #MarchForOurLives , or whatever #白白白白白白白白白白 is meant to be. These are hashflags. A hashflag, sometimes called Twitter emoji, is a small image that appears after a #hashtag for special events. They are not regular emoji, and you can only use them on the Twitter website, or…

A survey of robots.txt - part two

In part one of this article, I collected robots.txt from the top 1 million sites on the web. In this article I’m going to do some analysis, and see if there’s anything interesting to find from all the files I’ve collected. First we’ll start with some setup. 1 % matplotlib inline 2 3 import pandas as pd 4 import numpy as np 5 import glob 6 import os 7 import matplotlib Next…

A survey of robots.txt - part one

After reading CollinMorris’s analysis of favicons of the top 1 million sites on the web, I thought it would be interesting to do the same for other common parts of websites that often get overlooked. The robots.txt file is a plain text file found at on most websites which communicates information to web crawlers and spiders about how to scan a website.. For example, here’s an excerpt…

Setting up nginx reverse proxy with Let's Encrypt on unRAID

Late last year I set about building a new NAS to replace my aging HP ProLiant MicroServer N36L (though that’s a story for a different post). I decided to go with unRAID as my OS, over FreeNAS that I’d been running previously, mostly due to the simpler configuration, ease of expanding an array, and support for Docker and KVM. Docker support makes it a lot easier to run some of the web…

Do you really want "bank grade" security in your SSL? Danish edition

I recently saw an article on /r/programming called Do you really want “bank grade” security in your SSL? Here’s how Aussie banks fare . The author used the Qualys SSL Labs test to determine how good Aussie banks’ SSL implementations really are. I thought the article was great, and gave good, actionable feedback. At the time of writing this two of the banks listed have…

Continuously deploy Jekyll to Azure Web Apps

I’ve been thinking about writing a blog for a while now, but there are just so many blogging platforms out there to choose from. I finally settled on Jekyll as it’s really lightweight (compared to platforms like Wordpress), it has an active development community, and you can write all your articles in Markdown. Many Jekyll users host their Jekyll sites through GitHub Pages, and there…

About

I’m a principal software engineer at Microsoft focusing on open source software and supply chain security. You can find me hanging out in the OpenSSF or working on Renovate in my spare time. This site is my online home for all things code, or otherwise… …but mainly code.

Jamie Magee · RSS Amplifier