Logging is OF COURSE a critical part of applications however I often see it misunderstood / misused in ASP.NET applications. This is part post and part manifesto on how to effectively log in ASP.NET...
You may noticed my frantic frequency of posts (I was at two a day for a while month!) has slowed down of late so I thought I'd give a quick update.
NOTE: Translation seems to have broken along the...
I'm a versatile and accomplished developer and lead with an over 25 year track record building teams and platforms and revitalising startups.
Proficient in C#, ASP.NET, and modern web frameworks, with...
In this site I use Hightlight.js to render code snippets client side. I like this as it keeps my server side code clean and simple. However, I wanted to add a copy button to each code snippet so that...
It seems like everyone has a version of this code, I first came across this approach from Filip W and recently my old colleague Phil Haack has his version.
Just for completion this is how I do...
In part 1 of this series I showed you how I created a new Newsletter Subscription page. In this part I'll cover how I restructured the solution to allow for sharing of Services and Models between the...
While perusing other people's blogs I noticed a lot of them have a subscription service which allows users to sign up to have an email sent to them weekly with the posts from that blog.
I decided to...
In a previous post I detailed how I added Grafana to my docker-compose to provide insights into performance for this site. As I have Umami on here AND self host the database for that in this post I'l...
IF YOU'RE LOOKING FOR A DEVELOPER / LEADER PLEASE CONTACT ME
I've been a freelance developer for more than a decade now (since I left Microsoft really). For the most part it's been perfect for me. I...
Monitoring is an essential part of maintaining the health and performance of your applications. I already have this site monitoring user visits using Umami and exceptions and errors using Seq but now...
This is just a quick article as it builds on the others in the full text search series such as the typeahead dropdown and Postgres full text search.
In this post, I will show you how to implement a...
In a previous post I showed you how to create a search dropdown using Alpine.js and HTMX then I showed how we could enable Cross-Site Request Forgery protection using the AntiforgeryRequestToken in...
In this site I use HTMX extensively, this is a super easy way to make your site feel more responsive and smoother without having to write a lot of JavaScript.
NOTE: I'm not entirely happy with this...
Polly is a critical part of any .NET developer's toolkit. It is a library that allows you to define policies for handling exceptions and retries in your application. In this article, we will explore...
I've blogged many times about how I use Markdown to create my blog posts; I really like this approach but it has one major drawback - it means I have to do a complete Docker build cycle to update a...
Donut hole caching can be a useful technique where you want to cache certain elements of a page but not all. However it can be tricky to implement. In this post I will show you how to implement a...
So I've posted a LOT in the past on using Umami for analytics in a self-hosted environment and even published the Umami.Net Nuget pacakge. However I was having an issue where I wanted to track users...
One of my projects since starting this blog is an almost obsessive wish to track how many users look at my website. To do this I use Umami and have a BUNCH of posts around using and setting up Umami....
In the previous part of this series where I tested Umami.Net tracking methods
The Problem
In the previous part I used Moq to give me a Mock<HttpMessageHandler> and return the handler used in...
I'm a relative noob using Moq (yes I'm aware of the controversies) and I was trying to test a new service I'm adding to Umami.Net, UmamiData. This is a service this allows me to pull data from my...