blog

subscribe via RSS

  • Twelve months of agentic AI code-assist

    2025 was the year of agentic AI code assistants and programming will never be the same. For some, these tools have become a critical part of their daily workflow and produce most, if not all, of the code they write. For others, these tools remain experimental and unreliable, producing more frustration than value.

    [...1,037 words]

  • Steering the Vibe: Refactor

    This is the third post in a series about steering AI code assist (code-assist) towards producing maintainable code. In this post I'll discuss the refactor commands I've added to assist, the CLI tool I'm building to share deterministic patterns across code-assist workflows.

    [...857 words]

  • Porting Jekyll to Astro with Claude Code

    This blog has been on Jekyll for a decade. Over that time I've extended it with plugins and custom scripts, using liquid and Ruby, and hand-rolling it, prior to AI, locking me further into the ecosystem. I don't install Ruby or Jekyll and instead generate the site using docker containers, however recently those containers started throwing errors specifically in WSL on win11 (no problem on macOS or the linux-based GitHub runners). After failing a number of times to resolve my win11/WSL woes, I cracked it and began the port from Jekyll to Astro.

    [...957 words]

  • Steering the Vibe: Verify

    This is the second post in a series about tightening the loop and improving the output when programming using AI code assist tools. In the previous post I introduced assist, the CLI I'm building to enforce determinism on the LLM's output. In this post, we'll look at another command in the tool: assist verify

    [...971 words]

  • Steering the Vibe: Commits

    This is the first post in a series in which I'll write about tightening the loop and improving the output when programming using ai code assist. This year has seen remarkable improvement in the capabilities of AI code assist tools but often this is missed by users who don't know how to get the best out of them. I hope to share some of my experiences and techniques in this series of posts as I too continue to learn ways to extract value from these emerging tools.

    [...930 words]

  • AI Code Assistance: Are we talking about the same thing?

    With AI Code Assistance, the entry to building software has never been lower. Building software is now so easy that the vast majority of people who are building software have been doing so for less than a few years. This majority is reflected in software and AI communities online and in feedback shared by users of AI tools. Feedback on the helpfulness of AI-powered code-assist is extremely varied and often at polar opposites. Where some will profess amazing productivity gains, others will share that they are more productive without AI assistance. Unfortunately a lot context is missing from these discussions which makes taking the feedback at face value unhelpful to the reader.

    [...978 words]

  • Embrace Vibe Coding, Know Its Limits

    Earlier in the year I discovered an agentic workflow that enabled what was later termed vibe coding. The discovery was initially alarming and made me question the future. However, a couple months later I find the future of vibe coding to be very bright for both non-programmers and seasoned programmers alike.

    [...1,344 words]

  • You Might Not Need an AI Framework

    Say you have a manual, but useful, AI workflow and feel it's time to release it from your local machine and deploy it. "What AI Agent Framework should I use?" is a question often asked, and considering the current trajectory of both software development and AI tech the answer is of course: it depends.

    [...279 words]

  • Understanding AI-assisted Coding Workflows

    Not all AI-assisted coding workflows are created equal, and the variance across foundation models is substantial. With different available tool integrations and prompting strategies for each model, there's a lot of confusion around how to best use them, and, whether the benefits are real at all, or just hype.

    [...654 words]

  • Running DeepSeek R1 Locally

    As I'm both unable and unwilling to procure an RTX 5090, I ran DeepSeek R1 on my humble 4090 using koboldcpp.

    [...280 words]

  • LLM Agent Assisted Coding

    As a software developer of many years I'm rather enthusiastic in finding ways to improve the efficiency that I write code. I'm already using Copilot auto-complete for any line of code I write but I've struggled to find any tool that can go past auto-complete. That is, until I discovered Claude Sonnet 3.5 combined with Model Context Protocol (MCP) servers

    [...2,608 words]

  • Comparing Netlify and Azure Static Web Apps

    Static web hosts have come a long way since dropping your bundle into an S3 bucket. Netlify and Azure Static Web Apps (SWA) both offer a free tier and the two are surprisingly similar in terms of features. In this post I'll compare the two and

    [...943 words]

  • Evaluating ngrok

    After a colleague alerted me to ngrok, I've been using the tool regularly to expose local development services to the internet. During a trip out of the country I needed to access a number of services on my LAN so decided to evaluate the paid plan.

    [...577 words]

  • Getting Started Programming Spaceships

    What if I told you, you could learn to program by playing with spaceships? Well you can, and in this post I'll demonstrate how to get started quickly with SpaceTraders API and typescript.

    [...844 words]

  • Data Processing with Large Language Models

    In this post I'll use a Large Language Model (LLM) to process an existing dataset into a new dataset. What otherwise might be a complex parsing script that is time consuming to write is instead fairly simple code that takes advantage of the LLM's natural language processing capabilities.

    [...804 words]

  • An Introduction to Stable Diffusion

    Stable Diffusion is a latent text-to-image diffusion model capable of generating photo-realistic images given any text input. It's similar to tools like DALL-E 2 and Midjourney except it's open source and deterministic. This post will elaborate on the features offered by Stable Diffusion and provide guidance for running it on cloud provider GPU hosts.

    [...825 words]

  • Mobile Development with Vite and Capacitor

    The easiest way to get started with Ionic Capacitor with React is a one-liner via the Ionic CLI although doing so will scaffold a project using create-react-app. In this post, I'll explain the steps needed to scaffold a new Capacitor project with Vite.

    [...865 words]

  • Running Containers for Free on fly.io

    A while ago I migrated my Kubernetes cluster from Azure to Digital Ocean. Since then I've decreased the size of the workload however costs have stayed the same. Recently I discovered fly.io has a free tier for running containers and in this post I'll explain how easy it is to get containers up and running using this service.

    [...535 words]

  • Better HTTP Request Management with httpyac

    The state of http request management feels a bit disappointing to this developer. Postman is closed source, has an intrusive account requirement and an increasingly complex UI. Insomnia is open source, uses non-standard UI, and is missing features like inherited authentication.

    [...1,186 words]

  • Automating Versioning and Deployment to npm

    Recently I built and deployed a new package to the npm package repository. In this post I'll describe how to automate the process of building, versioning and publishing node packages to npm using GitHub Actions and Changesets

    [...1,027 words]

  • Building Tetris with GitHub Copilot

    After receiving an invite for the GitHub Copilot Technical Preview I decided to try out the feature by building a browser-based Tetris-clone. This post will look at how Copilot offers suggestions while building software.

    [...1,415 words]

  • Extending Serverless Framework for Alibaba Cloud

    With a continuing interest in Serverless Framework, I decided to leverage its provider-agnostic approach to explore building and deploying an application to Alibaba Cloud.

    [...1,252 words]

  • Building Applications with AWS CDK

    In a previous post I explained how to build a serverless application using Serverless Framework. In this post, I'll explain how to bring the same application to life using AWS CDK and I'll compare the two approaches.

    [...1,431 words]

  • More Serverless Framework on AWS

    Following on from my previous post I look further into developing on Serverless Framework, specifically around logging, function invocation and permissions.

    [...363 words]

  • Serverless Framework on AWS

    Recently I've been using Serverless Framework to manage CloudFormation stacks and the serverless functions that run on them. In this post I'll demonstrate how Serverless makes it easy to to deploy cloud resources and integrate them with code.

    [...933 words]

  • Commanding the Fleet with XState Actors

    In the previous post I introduced SpaceTraders API, a space trading a game for programmers exposed via REST API, and documented my first foray into using XState to automate a single spaceship. In this post I'll look into automating many spaceships with XState Actors.

    [...657 words]

  • Automating Spaceships with XState

    After my unwieldy reducers and middleware failed to give me the confidence I needed to automate spaceships, I looked into XState as a replacement for Redux in my React application. In this post, I'll describe my learning experience picking up XState.

    [...1,057 words]

  • Clip Navigator: Strategy Comparison Tool

    I've been playing a lot of Bubble Bobble recently and to improve my skill at the game I've written a React application.

    [...366 words]

  • Grafana in Kubernetes

    After messing with Elasticsearch I've decided that my Application Insights replacement could instead be PostgreSQL and Grafana. In this post I'll install Grafana and set up back-ups and restore functionality in my Kubernetes cluster.

    [...609 words]

  • Continuous Deployment to Kubernetes - Part 2

    In an earlier post I described continuous deployment to Kubernetes using Microsoft Tye to abstract most of the heavy lifting. In this post I'll describe a way of splitting application code from Infrastructure as Code (IaC) across repositories whilst maintaining continuous deployment.

    [...987 words]

  • Continuous Deployment to Kubernetes - Part 1

    Configuring a pipeline to autonomously deploy to Kubernetes does not have to be complex but will depend on your workload and expected integrations with the rest of your cluster. In this post I'll explain one of the simplest ways to automate Kubernetes deployment using Microsoft Tye.

    [...728 words]

  • Minimal Elasticsearch Resources in Kubernetes

    Now I've migrated off Azure I'm looking for a log aggregation solution to replace Application Insights. The ELK Stack is popular, but the default Elasticsearch helm chart alone is much too large for my cluster. Can I decrease Elasticsearch's footprint and have it run in my cluster?

    [...1,016 words]

  • Low-Cost Kubernetes on DigitalOcean

    In a previous post I was able to decrease my Azure AKS cost to ~$66AUD/month. In this post I'll migrate to Kubernetes on DigitalOcean in an attempt to reduce costs considerably more.

    [...563 words]

  • Static Blog Deployment to Netlify

    Netlify, Github and Cloudflare all offer generous free tiers which you can use for your static web hosting needs. This post describes the experience of moving hosts from S3 to Netlify.

    [...414 words]

  • Automated Browser Testing within GitHub Actions

    Have a single page application sitting on top of an ASP.NET Core project and want to run end-to-end tests on any pull request? In this post we'll start with nothing and finish with end-to-end tests using Playwright and Github Actions.

    [...715 words]

  • Using Environment Variables in .NET xUnit Tests

    I want dotnet test to handle environment variables. On nix systems I should be able to type MyEnvVar=Hello dotnet test and then be able to access that variable within my tests.

    [...309 words]

  • Writing code the easy way with TDD

    Often I need to write some complex code with multiple requirements that when stacked on top of each other require a larger cognitive load than I care for. Along with its other benefits, Test-driven Development makes it easier and quicker to write code of this nature.

    [...999 words]

  • Local .NET Development with Amazon S3

    When developing applications that integrate with cloud services, I find it to be a more pleasant experience if I can raise, debug and destroy instances of these services locally as I build my application. In the case of Amazon S3, I might have a number of files I need to be moving around during development, and I don't want to wait while transferring these files between my local machine and the cloud.

    [...580 words]

  • Using Secret Manager in .NET Console Apps

    Having written or contributed to a number ASP.NET Web projects, Secret Manager is a familiar tool for storing sensitive information. Using Secret Manager with a Console Application however wasn't as straight forward as I've come to expect with web projects. This post looks at what needed to occur for secrets to be accessible in a Console App, and how both the workaround and reasoning was discovered.

    [...534 words]

  • Browser Fingerprinting and Concealing Selenium

    I recently discovered a website that would respond to requests normally in Chrome, but failed to display anything when Chrome was being controlled by Selenium. Upon investigation, I discovered both Browser Fingerprinting and a way to have the site display correctly when accessed via Selenium WebDriver.

    [...515 words]

  • Static Code Analysis for .NET with SonarQube

    Whether it's your codebase or someone else's you're going to build on, SonarQube can quickly and easily highlight quality and security issues without having to eyeball every line of code yourself.

    [...579 words]

  • Optimising for Cost in Azure Kubernetes Service

    I've been trying for some time to run the cheapest single-node Kubernetes cluster I could on Azure Kubernetes Service (AKS). My target is to run it for a month at $70 (AUD) or below, but it takes some investigation to determine how to do this.

    [...506 words]

  • PostgreSQL in Kubernetes

    I want to run PostgreSQL in my Kubernetes cluster with automated backups, a UI to query and manage the database, and a means to easily transfer databases between the cluster and my other environments. This post discovers that such goals are not very difficult to achieve.

    [...1,216 words]

  • Grumbling on TypeScript

    I've been writing TypeScript since just before v1.8, which brought the killer feature JavaScript in TypeScript Compilation. Right now the latest version is v3.8.3 and there's been many great features added over the last few years. Staying on top of new features, how they work, and even changes to older ways of working can be time consuming and at times frustrating.

    [...2,113 words]

  • Gradually Refactoring Towards Utopia

    I can never write perfect code. Over time, an increasing knowledge of the domain, language syntax, design patterns, and even learning entirely outside and irrelevant to the project at hand contribute to an ongoing drift in how I solve problems with (or without) code. At any time, should I have reached a level of happiness with code I've just written, the window this level of happiness is sustained for caps out at about three months. At the three month mark I'll look at code I wrote and see an ill-informed mess.

    [...1,285 words]

  • This Social Image was Generated

    When sharing links from a website to social networks, meta tags are checked for summary data and these are used to build the little preview we see. This includes the image that will be displayed, and I'd like to automatically generate that image using data I already have.

    [...870 words]

  • Service and Container Orchestration for .NET with Tye

    Tye helps .NET Core developers build applications that are a collection of services and containers. On your local machine Tye runs your .NET services, any containers you need, and a dashboard you can use to inspect this environment. Tye can then deploy your services and containers to your Kubernetes cluster.

    [...1,385 words]

  • A Salesforce pipeline in Azure DevOps

    Having used Gearset in the past, I was looking for an option that would give me more control over Salesforce deployment, not to mention a better price.

    [...971 words]

  • Building a React Native pipeline for Android and iOS

    I'm familiar with React and Azure Pipelines but not with React Native and, I haven't touched mobile development since 2018. What better way to upskill on these items than by building a pipeline targeting both iOS and Android?

    [...1,576 words]

  • Fifty community events - The first ten

    This year one of my goals is to become more involved with the broader software community, and to achieve this I've set a target of attending 50 community events in 2020. Hanging around and meeting people at these events has the following benefits for me

    [...1,074 words]

  • Where to visit in New Zealand

    Working in software in Sydney I meet a lot of people from different parts of the planet who, upon learning I'm from New Zealand, ask me where in New Zealand they should visit while travelling. I'm no expert on the matter, however I'll share what I do know (mostly North Island) and I'll update this post whenever I can harass more information out of my compatriots.

    [...560 words]

  • A look back at NDC Sydney 2019

    Last month I had the opportunity to both attend and speak at NDC Sydney 2019. NDC is a conference for Software Developers that occurred this year on 14-18 October with 2 days of workshops followed by 3 days of speakers. This year was the first time I have attended an NDC conference and the first time I was a speaker at a conference.

    [...1,005 words]

  • An Azure Pipeline for Visual Studio Marketplace

    In a previous post I built a custom Azure Pipeline release task and manually uploaded it to the Visual Studio Marketplace. In this post I'll add new features and have DEV and PROD versions of the extension automatically deploy to the Marketplace on commit.

    [...797 words]

  • Monitoring the Web with Azure for Free

    With the deprecation of Multi-step Web Testing in Visual Studio and Azure, what approach can we now use to monitoring web properties, especially if we don't own them? In this post, I'll propose and demonstrate the leveraging of Azure to provide us a solution to this problem at no-to-little cost.

    [...1,282 words]

  • Auto-scaling Azure SignalR Service with Logic Apps

    Azure SignalR Service does not have auto-scale functionality out of the box. In this post I'll implement my own auto-scaling using Azure Logic Apps.

    [...935 words]

  • Load testing ASP.NET Core SignalR

    Last time around I messed with SignalR I touched briefly on load testing. This time around I'll deep dive into SignalR load testing, specifically to test the tool supplied in source, Crankier, and build my own load testing tools to investigate the limits of SignalR applications.

    [...1,957 words]

  • Docker containers aren't just for long running tasks

    Docker makes it easy to run long-running services like sql server or nzbget, but did you know that docker is also an excellent option for executing shorter workloads?

    [...798 words]

  • Publishing a custom Azure Pipelines release task

    I wanted to clear my Cloudflare cache during an Azure Pipeline deployment. Cloudflare offers a REST API to do this, but rather than poke around with scripts I decided to see how I could instead write a custom task to do this and publish it on the Visual Studio market place.

    [...471 words]

  • Executing custom scripts during VM deployment

    The Azure custom script virtual machine extension (2.0) allows script execution on virtual machines (VMs) during Azure Resource Manager (ARM) template deployment. During script development however, using the extension is slightly annoying due to the way scripts are referenced. I needed a workaround that would let me change script content easily, especially during development.

    [...653 words]

  • An overview of Azure SignalR Service

    I spent some time investigating Azure SignalR Service. I have an existing ASP.NET Core MVC application that uses SignalR, hosted on an Azure App Service. I'm interested in seeing whether I can move the web client to Azure Storage and replace the App Service with a SignalR Service.

    [...1,059 words]

  • Noob tips for Traefik

    In the past I've used jwilder's nginx-proxy for my reverse proxy needs but maintenance on that codebase seems to be struggling with several ideas hanging around as open PRs. One of these ideas that I'm interested is routing http requests to different docker containers based on path, something a more modern reverse proxy, Traefik, already does natively. For me however, ramping up on Traefik had some head-to-brick-wall moments that I'll document here so you, or more likely future me, doesn't have to make the same mistakes.

    [...356 words]

  • Github objects to my Chrome extension

    I got an email from Github today asking me to stop using their logo and the name _GitHub_ in my Chrome extension.

    [...544 words]

  • Getting started with neo4j

    Getting started with neo4j is very pleasant indeed.

    [...33 words]

  • ZigZag released

    [...78 words]

  • Honeyshot strategy

    I wrote a game and released it last week. My two brothers live in different countries and immediately a competition was spawned on the iOS leaderboards between us.

    [...627 words]

  • Honeyshot released

    [...58 words]

  • Building an HTML5-based multi-platform game

    I've been pretty quiet on the blogging front this year, the reason being I have been spending the majority of my time developing an HTML5 game that I have released on web, iOS and Android.

    [...1,465 words]

  • banandoh released

    [...76 words]

  • Migrating from Wordpress to Jekyll

    A couple of weeks ago I got an email from Amazon Webservices informing me that one of my EC2 instances was operating on degraded hardware and was to be retired. Technically I'm prepared for such an eventuality thanks to docker, however it was still going to take a few hours

    [...547 words]

  • Deploying ASP.NET 5 projects to MyGet

    MyGet is a package repository and feed host that you can push nuget packages (amongst other things) at. Their free tier allows you to have public feeds at no cost, and I've been using it to distribute my ASP.NET 5 EntityFramework 6 packages.

    [...103 words]

  • ASP.NET 5 on the Amazon (Linux) Cloud

    Yesterday ASP.NET 5 RC1 was released. Yesterday was also a milestone for me as I switched over from my shared hosting provider for eggsbenedict.info to Amazon Web Services. This post details some of the obstacles I needed to traverse in porting eggsbenedict.info over from a full Windows-based ASP.NET 4.5 application to full Linux-based ASP.NET 5 application, and offers some open-source libraries that I have created to enable such a transition.

    [...596 words]

  • Optimising WordPress and MySQL docker images for Amazon EC2 micro instances

    After seeing that my Amazon t2.micro EC2 instance would happily crash itself by quickly using all available memory when a few requests were coming in, I realised I needed a solution that did not involve me having to reboot the instance and bring the containers back up with so little traffic. The following outlines what I did to reduce the memory footprint to 160MB.

    [...415 words]

  • I've finally confirmed that LaTeX is awesome

    I finally got around to learning LaTeX this week, and after writing my first document in it, I hope I never write in Word again. All the technical documents I've written in the last ten years have been in Microsoft Word, but I've always felt that it wasn't the best tool for the job. It took a couple of hours to get started on a document, and the first day was a little slow, but after two or three days I felt not only that I was progressing faster than I would be with Word, but that the final output was of a much higher quality also.

    [...612 words]

  • Chrome Extension: Github Follow

    When files are moved or renamed in git their history is abruptly cut short.

    [...265 words]

  • Gnashing of Teeth on the Bleeding Edge

    Well I got eggsbenedict.info running on my (linux) dev box as a docker image, but it took some effort. The current stack is AWS EC2 + S3, MVC 6 on Kestrel, Entity Framework 7 + Postgres, AngularJs but there's still some Knockout templates lying around.

    [...385 words]

  • Migrating to ASP.NET 5

    Note - The libraries I indicate as not supported are specific to projects targeting dnxcore50 and the coreclr runtime. Some of these items are still supported by dnx451 and the clr and mono runtimes. I've had a lot of success with porting eggsbenedict.info to ASP.NET 5, a few days ago I confirmed and tested a full port on Windows.

    [...638 words]

  • .NET Development on Linux

    Last week in a rage regarding how shit my host is, I signed up to Amazon Web Services (AWS), found out how awesome Docker and moved the blog over to AWS. The blog now consists of three Docker containers; one for wordpress, one for MySql, and the last one which performs a backup of the MySql data to an S3 bucket.

    [...277 words]

  • Country tracking for eggsbenedict.info

    To help motivate me add content to eggsbendict.info I've added this page to keep track of the number of countries the site indexes thus far. The aim is to get as many countries added as possible, and then change the page to some kind of world map thing I can use for marketing purposes.

    [...100 words]

  • TrendBet now does multiple regions

    TrendBet is a little more lively now with multiple regions, meaning a new round is triggered every one minute rather than every five. I'll let this run for a few days to collect some data and then I'll extend tweddit to index the regions also.

    [...139 words]

  • Regions taking longer than expected

    I wasn't expecting the addition of multiple-region functionality to TrendBet to take so long, but it seems I underestimated the required effort. I had written the application to auto-update the UI with the resolution of each round when the timer reached zero, at which point updates to the stash would also be displayed to the user.

    [...111 words]

  • New Project - Tweddit

    I was going to add badges to Trend Bet on Tuesday, which would put it in a good position for me to move on to something else. However, I had an idea and spent the day building it anyway. The name is stupid, but hints at the functionality - it's a way to view current and past twitter trends, ranked in a similar fashion to reddit.

    [...162 words]

  • Entity Framework Code First makes Views unpleasant

    Getting an SQL View into Entity Framework Code First is a real bastard. Especially if said view doesn't expose any non-nullable fields you can combine to create a primary key. Here's how I ended up achieving it.

    [...188 words]

  • Sunday, 30 August 2015

    I've started this blog so I can look back over a given week and feel relaxed that although I might not be able to see any progress in a project, that learning and/or invisible steps have been made in the direction of the finish line. Here goes...

    [...284 words]