Blog
All the posts I ever wrote!
2023
- January 1, 2023 - Using Application Insights with Bicep to monitor Azure Static Web Apps and Azure Functions
- January 5, 2023 - Azure Pipelines - Node.js 16 and custom pipelines task extensions
- January 15, 2023 - How I ruined my SEO
- January 18, 2023 - Docusaurus: improving Core Web Vitals with fetchpriority
- January 22, 2023 - Image Optimisation with the TinyPNG API
- January 28, 2023 - Docusaurus blogs: using the createFeedItems API with git commit date
- February 1, 2023 - Migrating from GitHub Pages to Azure Static Web Apps
- February 5, 2023 - Docusaurus blogs: adding breadcrumb Structured Data
- February 11, 2023 - In defence of pull requests
- March 9, 2023 - Node.js 18, Axios and unsafe legacy renegotiation disabled
- March 18, 2023 - Migrating from ts-node to Bun
- March 20, 2023 - Playwright, GitHub Actions and Azure Static Web Apps staging environments
- April 5, 2023 - Bicep user defined types and Bash single item arrays
- April 8, 2023 - Docusaurus: Structured Data FAQs with MDX
- May 4, 2023 - Teams Direct Message API with Power Automate
- May 8, 2023 - Migrating Azure Functions from JSDoc JavaScript to TypeScript
- May 9, 2023 - TypeScript 5: importsNotUsedAsValues replaced by ESLint consistent-type-imports
- May 20, 2023 - Static Web Apps CLI and Node.js 18: could not connect to API
- June 2, 2023 - Private Bicep registry authentication with AzureResourceManagerTemplateDeployment@3
- June 11, 2023 - Azure Container Apps, Easy Auth and .NET authentication
- June 18, 2023 - Azure Container Apps, Bicep, managed certificates and custom domains
- July 9, 2023 - TypeScript 5.1: declaring JSX element types
- July 20, 2023 - Azure Container Apps, Bicep, bring your own certificates and custom domains
- August 5, 2023 - Azure Pipelines meet Vitest
- August 17, 2023 - Azure Open AI: handling capacity and quota limits with Bicep
- September 20, 2023 - TypeScript: The Movie
- September 25, 2023 - Azure Open AI: generate article metadata with TypeScript
2022
- January 22, 2022 - Azure Container Apps: dapr, devcontainer, debug and deploy
- February 2, 2022 - Lazy loading images with Docusaurus
- February 8, 2022 - Azure Static Web Apps - a Netlify alternative
- March 6, 2022 - Swashbuckle & inheritance: Give. Me. The. Types
- March 20, 2022 - Lighthouse meet GitHub Actions
- March 30, 2022 - Azure DevOps: consume a private artifact feed
- April 6, 2022 - ESLint your C# in VS Code with Roslyn Analyzers
- April 16, 2022 - Type annotations: strong types, weakly held
- May 1, 2022 - Upgrading to React 18 with TypeScript
- May 7, 2022 - Azure Static Web Apps: named preview environments with Azure DevOps
- May 28, 2022 - Azure Static Web Apps: Node.js 16 / 18 and Oryx
- June 7, 2022 - TypeScript 4.7 and ECMAScript Module Support
- June 21, 2022 - Azure Container Apps: dapr pubsub
- July 7, 2022 - Azure Static Web Apps: Failed to deploy the Azure Functions
- July 10, 2022 - Get Build Validations with the Azure DevOps API
- July 23, 2022 - Terry Pratchett and the Azure Static Web Apps
- August 31, 2022 - Swashbuckle and schemaId is already used
- September 3, 2022 - Reverse engineering the Azure Application Insights Transactions URL
- September 20, 2022 - React: storing state in URL with URLSearchParams
- September 29, 2022 - Faster Docusaurus builds with swc-loader
- October 1, 2022 - TypeScript Unit Tests with Debug Support
- October 14, 2022 - Bicep: Static Web Apps and Linked Backends
- October 20, 2022 - Getting started with the Web Monetization API
- November 11, 2022 - Debugging Azure Functions in VS Code on Mac OS
- November 17, 2022 - Azure AD Claims with Static Web Apps and Azure Functions
- November 22, 2022 - XML: read and write with Node.js
- November 25, 2022 - Adding lastmod to sitemap based on git commits
- December 1, 2022 - Docusaurus: Using fontaine to reduce custom font cumulative layout shift
- December 4, 2022 - Deep linking with Azure Static Web Apps and Easy Auth
- December 11, 2022 - Publishing Docusaurus to dev.to with the dev.to API
- December 18, 2022 - Azure Static Web Apps: build app externally
- December 22, 2022 - Azure Static Web Apps: dynamic redirects with Azure Functions
- December 26, 2022 - Serving Docusaurus images with Cloudinary
2021
- January 2, 2021 - Create React App with ts-loader and CRACO
- January 3, 2021 - react-query: strongly typing useQueries
- January 14, 2021 - Azure App Service, Easy Auth and Roles with .NET
- January 17, 2021 - Azure App Service, Easy Auth and Roles with .NET and Microsoft.Identity.Web
- January 29, 2021 - Azure Pipelines Build Info in an ASP.NET React app
- January 30, 2021 - ASP.NET, Serilog and Application Insights
- February 8, 2021 - Azure RBAC: role assignments and ARM templates
- February 11, 2021 - Azure App Service, Health checks and zero downtime deployments
- February 16, 2021 - Making Easy Auth tokens survive releases on Linux Azure App Service
- February 27, 2021 - Goodbye Client Affinity, Hello Data Protection with Azure
- March 6, 2021 - NSwag: TypeScript and CSharp client generation based on an API
- March 10, 2021 - Managed Identity, Azure SQL and Entity Framework
- March 15, 2021 - The definitive guide to migrating from Blogger to Docusaurus
- March 17, 2021 - RSS update; we moved to Docusaurus
- March 20, 2021 - Bicep meet Azure Pipelines
- March 23, 2021 - Bicep meet Azure Pipelines 2
- April 10, 2021 - Hello World Bicep
- April 20, 2021 - ts-loader goes webpack 5
- April 24, 2021 - The Service Now API and TypeScript Conditional Types
- May 1, 2021 - Blog Archive for Docusaurus
- May 8, 2021 - Create a Pipeline with the Azure DevOps API
- May 15, 2021 - Azurite and Table Storage in a dev container
- June 11, 2021 - Azure Functions and .NET 5: Query params, Dependency Injection, Bicep & Build
- June 30, 2021 - React 18 and TypeScript
- July 1, 2021 - C# 9 in-process Azure Functions
- July 7, 2021 - Output connection strings and keys from Azure Bicep
- July 11, 2021 - webpack? esbuild? Why not both?
- July 14, 2021 - Directory.Build.props: C# 9 for all your projects
- August 1, 2021 - TypeScript, abstract classes, and constructors
- August 14, 2021 - TypeScript 4.4 and more readable code
- August 15, 2021 - Publish Azure Static Web Apps with Bicep and Azure DevOps
- August 19, 2021 - Bicep: syntax highlighting with PrismJS (and Docusaurus)
- September 10, 2021 - Google APIs: authentication with TypeScript
- September 12, 2021 - Permissioning Azure Pipelines with Bicep and Azure RBAC Role Assignments
- October 15, 2021 - Structured data, SEO and React
- October 18, 2021 - Docusaurus, meta tags and Google Discover
- October 31, 2021 - NSwag generated C# client: Open API property name clashes and decimal types rather than double
- November 18, 2021 - Azure standard availability tests with Bicep
- November 22, 2021 - TypeScript vs JSDoc JavaScript
- December 5, 2021 - Azure Static Web App Deploy Previews with Azure DevOps
- December 12, 2021 - Open Graph: a guide to sharable social media previews
- December 19, 2021 - Azure Container Apps, Bicep and GitHub Actions
- December 27, 2021 - Azure Container Apps: build and deploy with Bicep and GitHub Actions
- December 28, 2021 - Query deployment outputs with the Azure CLI
- December 29, 2021 - Preload fonts with Docusaurus (updated 03/11/2022)
2020
- January 2, 2020 - EF Core 3.1 breaks left join with no navigation property
- January 21, 2020 - LICENSE to kill your PWA
- January 31, 2020 - From create-react-app to PWA
- February 21, 2020 - Web Workers, comlink, TypeScript and React
- March 22, 2020 - Dual boot authentication with ASP.NET
- March 29, 2020 - Offline storage in a PWA
- April 4, 2020 - Up to the clouds!
- May 10, 2020 - From react-window to react-virtual
- May 21, 2020 - Autofac, WebApplicationFactory and integration tests
- June 21, 2020 - Task.WhenAll / Select is a footgun 👟🔫
- July 11, 2020 - Devcontainers and SSL interception
- August 9, 2020 - Devcontainers AKA performance in a secure sandbox
- September 4, 2020 - Why your team needs a newsfeed
- October 2, 2020 - Autofac 6, integration tests and .NET generic hosting
- October 19, 2020 - Safari: The Mysterious Case of the Empty Download
- October 31, 2020 - Azure DevOps Client for Node.js - GitApi / WikiApi limitations
- November 10, 2020 - Throttling data requests with React Hooks
- November 14, 2020 - Bulletproof uniq with TypeScript generics (yay code reviews!)
- November 28, 2020 - Visual Studio Marketplace: images in Markdown!
- December 9, 2020 - azure-pipelines-task-lib and isOutput setVariable
- December 20, 2020 - Nullable reference types; CSharp's very own strictNullChecks
- December 21, 2020 - Make Microsoft.Identity.Web respond with 403 forbidden instead of a 302 redirect
- December 22, 2020 - dotnet-format: Prettier your C# with lint-staged & husky
- December 30, 2020 - Azure Pipelines meet Jest
2019
- January 5, 2019 - GitHub Actions and Yarn
- January 13, 2019 - TypeScript and webpack: Watch It
- February 22, 2019 - ASP.NET Core: Proxying HTTP Requests with an AllowList
- March 6, 2019 - fork-ts-checker-webpack-plugin v1.0
- March 22, 2019 - Google Analytics API and ASP.Net Core
- March 24, 2019 - Template Tricks for a Dainty DOM
- April 27, 2019 - react-select with less typing lag
- May 23, 2019 - TypeScript and high CPU usage - watch don't stare!
- June 7, 2019 - TypeScript / webpack - you down with PnP? Yarn, you know me!
- July 13, 2019 - Using TypeScript and ESLint with webpack (fork-ts-checker-webpack-plugin new feature!)
- August 2, 2019 - ASP.NET Core authentication: hard-coding a claim in development
- August 17, 2019 - Symbiotic Definitely Typed
- September 14, 2019 - Coming Soon: Definitely Typed
- September 30, 2019 - Start Me Up: ts-loader meet .tsbuildinfo
- October 8, 2019 - Definitely Typed: The Movie
- December 18, 2019 - Teams notification webhooks
2018
- January 14, 2018 - Auth0, TypeScript and ASP.NET Core
- January 28, 2018 - webpack 4 - ts-loader / fork-ts-checker-webpack-plugin betas
- January 29, 2018 - Finding webpack 4 (use a Map)
- February 25, 2018 - ts-loader 4 / fork-ts-checker-webpack-plugin 0.4
- March 7, 2018 - It's Not Dead: webpack and dead code elimination limitations
- March 25, 2018 - Uploading Images to Cloudinary with the Fetch API
- March 26, 2018 - It's Not Dead 2: mobx-react-devtools and the undead
- April 28, 2018 - Using Reflection to Identify Unwanted Dependencies
- May 13, 2018 - Compromising: A Guide for Developers
- June 16, 2018 - VSTS... YAML up!
- June 24, 2018 - VSTS and EF Core Migrations
- July 9, 2018 - Cypress and Auth0
- July 28, 2018 - Azure App Service: nested configuration for ASP.NET running in Web App for Containers using Application Settings
- August 21, 2018 - Using TypeScript and webpack alias: goodbye relative paths
- September 15, 2018 - Semantic Versioning and Definitely Typed
- September 23, 2018 - ts-loader Project References: First Blood
- October 7, 2018 - Brand New Fonting Awesomeness
- October 27, 2018 - Making a Programmer
- November 17, 2018 - Snapshot Testing for C#
- December 10, 2018 - IMemoryCache and GetOrCreateForTimeSpanAsync
- December 22, 2018 - You Might Not Need thread-loader
2017
- January 1, 2017 - webpack: configuring a loader with query / options
- January 6, 2017 - webpack: resolveLoader / alias with query / options
- February 1, 2017 - Hands-free HTTPS
- February 14, 2017 - @types is rogue
- February 23, 2017 - Under the Duck: An Afternoon in Open Source
- March 28, 2017 - Debugging ASP.Net Core in VS or Code
- March 30, 2017 - I'm looking for work!
- April 25, 2017 - Setting Build Version Using AppVeyor and ASP.Net Core
- May 20, 2017 - TypeScript: Spare the Rod, Spoil the Code
- June 11, 2017 - Windows Defender Step Away From npm
- July 2, 2017 - Dynamic import: I've been awaiting you...
- July 29, 2017 - A Haiku on the Problem with SemVer: Us
- August 27, 2017 - Karma: From PhantomJS to Headless Chrome
- August 30, 2017 - Oh the Glamour of Open Source
- September 7, 2017 - TypeScript + webpack: Super Pursuit Mode
- September 12, 2017 - fork-ts-checker-webpack-plugin code clickability
- October 19, 2017 - Working with Extrahop on webpack and ts-loader
- October 20, 2017 - TypeScript Definitions, webpack and Module Types
- November 19, 2017 - The TypeScript webpack PWA
- December 24, 2017 - ts-loader 2017 retrospective
2016
- January 1, 2016 - UseStaticFiles for ASP.Net Framework
- January 14, 2016 - Coded UI and the Curse of the Docking Station
- February 1, 2016 - TFS 2012, .NET 4.5 and C# 6
- February 19, 2016 - Visual Studio, tsconfig.json and external TypeScript compilation
- February 29, 2016 - Creating Angular UI Routes in the Controller
- March 4, 2016 - TFS 2012 meet PowerShell, Karma and BuildNumber
- March 17, 2016 - Atom - Recovering from Corrupted Packages
- March 22, 2016 - Concatting IEnumerables in C#
- April 25, 2016 - Instant Stubs with JSON.Net (just add hot water)
- May 13, 2016 - Inlining Angular Templates with WebPack and TypeScript
- May 24, 2016 - The Mysterious Case of webpack, AngularJS and jQuery
- June 2, 2016 - Creating an ES2015 Map from an Array in TypeScript
- July 23, 2016 - Understanding webpack's DefinePlugin (and using with TypeScript)
- August 19, 2016 - The Ternary Operator <3 Destructuring
- September 12, 2016 - Integration Tests with SQL Server Database Snapshots
- September 22, 2016 - TypeScript 2.0, ES2016 and Babel
- October 5, 2016 - React Component Curry
- November 1, 2016 - But you can't die... I love you!
- November 12, 2016 - My Subconscious is a Better Developer Than I Am
- December 11, 2016 - webpack: syncing the enhanced-resolve
- December 19, 2016 - Using ts-loader with webpack 2
2015
- January 7, 2015 - Deploying from ASP.Net MVC to GitHub Pages using AppVeyor part 2
- January 20, 2015 - TypeScript: In Praise of Union Types
- February 11, 2015 - The Convent with Continuous Delivery
- February 17, 2015 - Using Gulp to inject scripts and styles tags directly into your HTML
- February 27, 2015 - Hey tsconfig.json, where have you been all my life?
- March 20, 2015 - PartialView.ToString()
- April 17, 2015 - How to activate your emoji keyboard on Android 5.0 (Lollipop)
- April 24, 2015 - Tonight I'll Start an Open Source Project...
- May 5, 2015 - A tale of Angular, html5mode, ASP.Net MVC and ASP.Net Web API
- May 11, 2015 - NgValidationFor Baby Steps
- May 23, 2015 - Angular UI Bootstrap Datepicker Weirdness
- June 19, 2015 - Back to the Future with Code First Migrations
- June 29, 2015 - npm please stop hurting Visual Studio
- July 30, 2015 - Upgrading to Globalize 1.x for Dummies
- August 13, 2015 - (Top One, Nice One) Get Sorted
- September 10, 2015 - Things Done Changed
- September 23, 2015 - Definitely Typed Shouldn't Exist
- October 5, 2015 - jQuery Validation Globalize hits 1.0
- October 23, 2015 - The Names Have Been Changed...
- November 30, 2015 - IQueryable... IEnumerable... Hmmm...
- December 16, 2015 - ES6 + TypeScript + Babel + React + Flux + Karma: The Secret Recipe
- December 20, 2015 - Live Reload Considered Harmful
2014
- January 9, 2014 - Upgrading to TypeScript 0.9.5 - A Personal Memoir
- January 24, 2014 - Integration Testing with Entity Framework and Snapshot Backups
- February 12, 2014 - WPF and Mystic Meg or Playing Futurologist
- February 27, 2014 - TypeScript and RequireJS (Keep It Simple)
- March 5, 2014 - Caching and cache-busting with RequireJS
- March 11, 2014 - Knockout + Globalize = valueNumber Binding Handler
- March 17, 2014 - The Surprisingly Happy Tale of Visual Studio Online, Continous Integration and Chutzpah
- April 1, 2014 - TypeScript this is what I want! (the unfortunate neglect of Instance Methods / callback functions)
- May 5, 2014 - TypeScript, JSDoc and Intellisense
- May 15, 2014 - Team Foundation Server, Continuous Integration and separate projects for JavaScript unit tests
- June 1, 2014 - Migrating from AngularJS to AngularTS - a walkthrough
- June 20, 2014 - A folk story wherein we shall find dates, DataAnnotations & data impedance mismatch
- July 3, 2014 - HotTowel-Angular meet TypeScript
- August 1, 2014 - AngularJS meet ASP.Net Server Validation
- August 8, 2014 - Getting more RESTful with Web API and IHttpActionResult
- August 12, 2014 - My Unrequited Love for Isolate Scope
- September 6, 2014 - Running JavaScript Unit Tests in AppVeyor
- September 10, 2014 - Unit Testing an Angular Controller with Jasmine
- September 13, 2014 - Journalling the Migration of Jasmine Tests to TypeScript
- October 3, 2014 - He tasks me; he heaps me.... I will wreak that MOQ upon him.
- October 6, 2014 - Caching and Cache-Busting in AngularJS with HTTP interceptors
- November 4, 2014 - Using Gulp in Visual Studio instead of Web Optimization
- November 26, 2014 - Pretending to be someone you're not and the dark pit of despair
- December 5, 2014 - What's in a (Domain) Name?
- December 12, 2014 - Gulp, npm, long paths and Visual Studio.... Fight!
- December 29, 2014 - Deploying from ASP.Net MVC to GitHub Pages using AppVeyor part 1
2013
- January 3, 2013 - HTML to PDF using a WCF Service
- January 9, 2013 - Twitter.Bootstrap.MVC4 meet Bootstrap Datepicker
- January 14, 2013 - Twitter.Bootstrap.MVC4 meet Bootstrap Datepicker *and* get your Internationalization on...
- February 13, 2013 - Using Expressions with Constructors
- February 18, 2013 - Unit testing MVC controllers / Mocking UrlHelper
- March 3, 2013 - Unit testing ModelState
- March 11, 2013 - DecimalModelBinder for nullable Decimals
- April 1, 2013 - Death to compatibility mode
- April 9, 2013 - Making IE 10's clear field (X) button and jQuery UI autocomplete play nice
- April 17, 2013 - IE 10 Install Torches JavaScript Debugging in Visual Studio 2012 Through Auto Update (Probably)
- April 26, 2013 - A navigation animation (for your users delectation)
- May 4, 2013 - How I'm Using Cassette part 1:Getting Up and Running
- June 6, 2013 - How I'm Using Cassette part 2:Get Cassette to Serve Scripts in Dependency Order
- June 26, 2013 - jQuery Validation - Native Unobtrusive Validation Support!
- July 6, 2013 - How I'm Using Cassette part 3:Cassette and TypeScript Integration
- August 8, 2013 - Announcing jQuery Validation Unobtrusive Native...
- August 17, 2013 - Using Bootstrap Tooltips to display jQuery Validation error messages
- October 4, 2013 - Migrating from jquery.validate.unobtrusive.js to jQuery.Validation.Unobtrusive.Native
- October 30, 2013 - Getting TypeScript Compile-on-Save and Continuous Integration to play nice
- November 4, 2013 - TypeScript: Don't forget Build Action for Implicit Referencing...
- November 26, 2013 - Rolling your own confirm mechanism using Promises and jQuery UI
- December 4, 2013 - Simple fading in and out using CSS transitions and classes
- December 13, 2013 - NuGet and WebMatrix: How to install a specific version of a package
2012
- January 7, 2012 - Standing on the Shoulders of Giants...
- January 14, 2012 - jqGrid - it's just a far better grid
- January 24, 2012 - What on earth is jQuery? And why should I care?
- January 30, 2012 - JavaScript - getting to know the beast...
- February 5, 2012 - A Potted History of using Ajax (on the Microsoft Stack of Love)
- February 15, 2012 - WCF Transport Windows authentication using NetTcpBinding in an Intranet environment
- February 23, 2012 - The Joy of JSON
- March 3, 2012 - jQuery Unobtrusive Remote Validation
- March 12, 2012 - Striving for (JavaScript) Convention
- March 17, 2012 - Using the PubSub / Observer pattern to emulate constructor chaining without cluttering up global scope
- March 22, 2012 - WCF - moving from Config to Code, a simple WCF service harness (plus implementing your own Authorization)
- April 5, 2012 - Making PDFs from HTML in C# using WKHTMLtoPDF
- April 16, 2012 - A Simple Technique for Initialising Properties with Internal Setters for Unit Testing
- April 23, 2012 - JSHint - Customising your hurt feelings
- April 28, 2012 - Beg, Steal or Borrow a Decent JavaScript DateTime Converter
- May 7, 2012 - Globalize.js - number and date localisation made easy
- May 30, 2012 - Dad Didn't Buy Any Games
- June 4, 2012 - Reasons to be Cheerful (why now is a good time to be a dev)
- July 1, 2012 - Optimally Serving Up JavaScript
- July 16, 2012 - Rendering Partial View to a String
- August 6, 2012 - jQuery Unobtrusive Validation (+ associated gotchas)
- August 16, 2012 - ClosedXML - the real SDK for Excel
- August 24, 2012 - How to attribute encode a PartialView in MVC (Razor)
- September 6, 2012 - Globalize and jQuery Validation
- September 24, 2012 - Giving OData to CRM 4.0
- October 3, 2012 - Unit Testing and Entity Framework: The Filth and the Fury
- October 5, 2012 - Using Web Optimization with MVC 3
- October 22, 2012 - MVC 3 meet Dictionary
- November 2, 2012 - XSD/XML Schema Generator + Xsd.exe:Taking the pain out of manual XML
- November 13, 2012 - Getting up to speed with Bloomberg's Open API...