The last post left me with a working Windows path for deploying code to a factory-standard Tessel 2. That raised the next question: was upgrading OpenWrt even worth it? It wasn’t a simple task. This is a device with no screen and no normal console. I understood the SAMD21 recovery design and had documented it on paper, but I had not personally exercised the recovery workflow. That is a good…
At the end of the last post I said the next question was whether I could talk to these boards at all. The first thing to do is just assess the current state of the tooling, and to do that we’ll install the t2-cli : 1 npm install t2-cli Their docs do state to use -g and install globally, but a) I’m not doing that and b) we don’t need to do that anymore thanks to npx . So the…
Last time I said these boards run Linux, and that I didn’t know that when I started. That sounds like a small thing but it changes everything about how you approach the problem. I’d spent years thinking of the Tessel 2 the way the marketing described it - a microcontroller you program in JavaScript. If that’s your mental model then a dead board is a firmware problem, and firmware…
When I first joined Microsoft, I was doing a lot with JavaScript and hacking around a bit with IoT. Because of this, one of my colleagues sent me a box of Tessel 2 boards and sensors they had lying around. I had never heard of Tessel before, but I was intrigued by the idea of a microcontroller that could be programmed in JavaScript (I’d dabbled a bit with that using NodeMCU in the past). I…
Recently I had to fix something that had become a bit too easy to ignore in the Aspire Community Toolkit : our NuGet publishing in CI had started failing, and the fix I wanted wasn’t “rotate the key and hope for the best.” If I was going to touch the release pipeline anyway, I wanted to move us onto NuGet’s newer trusted publishing model and stop depending on a long-lived…
The Aspire Community Toolkit has grown into a comprehensive collection of integrations to expand how developers can build and orchestrate distributed applications with Aspire . As the project has expanded, so has its test suite. With over 50 integrations, each with their own tests, running the full test suite in CI can take a significant amount of time. In this post, I’ll walk you through…
One of the things that comes with maintaining the Awesome Copilot repo is that people want to contribute to it. And that’s great! We’ve had community contributions since the repo was first created. But recently we’ve been getting a growing number of requests from people wanting to list their external plugins in the marketplace — plugins that live in repos we don’t own,…
I spend a lot of time hopping around folders in Explorer, especially when I’m bouncing between demos, samples, blog code, and whatever random side quest has captured my attention that day. And since I’ve also been using Copilot CLI as my primary interface to Copilot, I had one of those wonderfully lazy thoughts: why am I manually opening Windows Terminal and navigating to the folder…
Well, I missed my usual January post, and given that I hardly wrote anything in 2025 anyway, I don’t think it was much of a surprise. I mean, I wrote a grand total of two blog posts in 2025 (excluding my “in review” posts), and that is the first time in the nearly 20 years of blogging that I’ve done only a single digit number of posts in a year. The fact is, blogging, or at…
In the middle of November Aspire 13 was released and with that came quite a few large changes that we would need to tackle in the Aspire Community Toolkit . As the lead for the OSS project, I took on the responsibility of managing the release, which meant coordinating the various changes, ensuring compatibility with Aspire 13, and all the stuff that would go along with that. Ask any OSS maintainer…
What’s this, a blog post after not having written one all year? Look, I’m sure I could make up some excuses about being busy with work, life, and the general chaos of the world, but the truth is, I just lost my blogging mojo. However, as the year is coming to a close I decided to do at least some minor maintenance on my blog, and in doing so I thought it would be a great opportunity to…
With 2024 coming to a close I managed to just scrape through with my yearly goal of 1500km, having to go out on NYE for one last run (I had 7km to go, so I ran 10km just to be safe ). Compared to 2023 where I managed to hit my 1500km goal in November, hitting it on the last day of the year was… different. The raw stats Again, looking at my Strava profile , here’s the breakdown of what…
Would you look at that, I’m even early this year compared to my 2023 post which was earlier than 2022! I’m on a roll! It’s funny sitting down to write this post because, honestly, I haven’t really done much writing in the past year. In fact, if we exclude the “in review” posts I did, one about 2023 and the other about running (so… nothing to do with…
In the 2024.4 release of Home Assistant, the Labels feature was introduced. This feature allows you to add labels to entities, areas, and automations. This is a great feature for organisation as you can apply as many as you want and then perform actions based on those labels. Previously, I’d tackled this style of organisation (and the organisation that Categories introduced) by putting…
Like many people, I’ve been diving into Generative AI (GenAI) over the past 12 or so months and looking at how to use it in the sorts of solutions we can build. I’m also the kind of tinkerer that is looking for how to use technology in weird and wonderful ways. So, I’ve been looking at how to use GenAI in my smart home. Before we get into that part of the story, a little bit of…
I’m currently working on a project in which we are using Entra ID rather than a traditional Postgre username and password. This is a great way to secure your database and ensure that only the right people have access to it. Note: For the purpose of this article, I’m going to use Entra ID to refer to a user identity, as well as a managed identity such as a service principal, as the…
I’ve been exploring .NET Aspire as a pattern for how to build .NET apps, and when checking the features of the Preview 3 release I noticed something interesting, a new service connector for using OpenAI/Azure OpenAI. We knew this was coming, I was following the PR for it , and given I’ve been doing a lot of AI stuff it made sense to try it out. Before we can use the service connector…
This post is written against the .NET Aspire Preview 2 release, so it may change when the final version is released. Recently, I’ve been building an app using .NET Aspire which I’m using PostgreSQL as the database and Azure Storage Blobs and Queues in. .NET Aspire is awesome for this, as you can setup a developer inner loop super simply with the components that ship , and the nice…
Would you look at that, I’m early this year (well, compared to my 2022 post )! Admittedly, part of my was somewhat apathetic towards writing this post, mostly because I’m not sure that I have much “interesting” stuff from 2023 to share. But given that I’ve been doing this style of post consistently since 2017 (and sporadically prior to that), I figured I’d just…
Well, it was a goal of 1500km, just like in 2022 but again I’m gone and exceeded my plan. And as is becoming tradition, it’s time for me to reflect on the year that was in running and see what I’ve accomplished and what I’ve learned. The raw stats Using my Strava profile as the source of truth (for running only, I did track some activities such as walking, gym and stand up…
For the last six months I’ve been adding to my smart home the thing that makes it feel really futuristic, lights that turn on as you enter a room and then off when you leave. I’ve realised that I’ll go weeks without really using a light switch, at least not in our main living spaces as a result of this. So, let’s look at the three components to this, movement in a room,…
When we explored Chat Completions in Part 3 we used the asynchronous API to call our model, but it’s still somewhat a blocking call in that we wait for the model to generate a response before sending to the client. This is how we would traditionally get data back to a client from a data source, since the data source we’re requesting from, like a database, will have all the data we…
After text generation the most common thing you’re likely wanting to generate with an LLM is going to be images. We’ve all seen those awesome images generated with Midjourney, Stable Diffusion, DALL-E, and others. In this post we’ll look at how to generate images with .NET and an LLM, specifically the DALL-E models from OpenAI. We’ll use DALL-E 2 because at the time of…
A little over a year ago I wrote about dissecting some phishing attempts and while I still got the odd one here and there, nothing really was slipping through the M365 spam filters. Until yesterday that is. Over the last 24 hours I’ve gotten around a dozen phishing attempts to one of the sub-addresses on my domain, and given that there was so many I figured I’d take a look at them.…
If you followed the code sample in the last post you’ll have a console application that can generate chat completions, but what I didn’t do was explain what chat completions are or why we’d use them; that’s the purpose of this post. What is a Chat Completion A chat completion is a way of generating text based on a prompt. The prompt is a piece of text that you provide, and…
It’s time to have a look at how we can build the basics of an application using Azure OpenAI Services and the .NET SDK. Remember, while I will be using AOAI in here everything is going to be applicable to OpenAI itself as well, so if you’re using that you can still follow along (I just happen to use AOAI as then I can test it for the product team). Getting Started Before we install the…
I’ve missed a lot of the recent hype trains, I skipped over blockchain, I avoided web3, and I’m not dumb enough to have believed NFT’s were anything but a scam, but I’m not going to miss out on the AI hype train! Toot toot! Over the past few weeks I’ve been digging into how we can build stuff with .NET and AI, specifically Generative AI which we see with platforms…
I finally took the plunge and did the thing I’d been wanting to do for a while now. I built a wall mounted, well fridge mounted, dashboard for my smart home. I’ve been wanting to do this for a while now, but I’ve been putting it off because I didn’t want to spend the money on a tablet. After all, I looked at this problem just the same as I look at any other addition to the…
It’s just over 12 months since we moved into our house and I started properly running Home Assistant and designing our smart home. In that time I’ve been lucky that nothing has really “gone wrong”, sure there have been the odd bug here and there (see my last post on debugging tips ), but the system hasn’t “died”. But before we moved into this house I was…
When designing a smart home I’ve reiterated many times that the goal was to make it work regardless of who was there and that existing expectations of how things like switches work are maintained. But naturally as you start to evolve the smart home more you will end up doing customisations around your household routines. In our house we have a few, one example is the night time routine for…
This is the last in the three part sub-series looking at the newly launched Data API builder for Azure Databases (DAB) and while last time we looked at creating a React application, this time I wanted to look at how to do the same thing but in .NET using Blazor. So let’s jump in and learn about how to use SWA Data Connections with Blazor. Oh, and for something different, let’s try also…
In the last post I introduced you to a new project we’ve been working on, Data API builder for Azure Databases (DAB) and in this post I want to look at how we can use it in Azure, and that will be through one of my favourite Azure services, Azure Static Web Apps , for you see, as part of the announcement today of DAB, we’ve announced that it is available as a feature of SWA (called…
I’m really excited because today we launched the first public preview of Data API builder for Azure Databases or DAB for short (the official name is a bit of a mouthful 😅). The important links you’ll need are: SQL announcement Cosmos announcement Docs SWA integration announcement GitHub Repo What is DAB DAB is a joint effort from the Azure SQL, PostgreSQL, MySQL and Cosmos DB teams to…
When you get down to it, a smart home is partially a software solution, and like any good software solution there are bugs. I’ve recently been spending some time “debugging” my home, and I thought I’d share some of the things I’ve learned. Case sensitivity For home security, I have an automation that runs every night when my phone goes on the wireless charger to close…
I really like the idea of having a smart door lock on our front door, something about the peace of mind that I can know if they door is locked or not, control access and all those things, so getting a “smart” lock was something I started researching long before we moved into our new house (even before we had doors installed! 🤣). I’m going to refer to the locks as…
We’ve got a lot of windows in our new house, for example the main bedroom has four windows. This means we have an awesome amount of natural light (we rarely need to turn lights on during the day!) but we’re forever having to go around opening and closing them. Because of this, motorised blinds have always been an appealing idea to me so it’s time to tackle this aspect of the…
In building our new house we decided to add a motorised gate across our driveway. Unsurprisingly, this is a gate running off a remote, which upon first inspection I believed is using RF on some frequency, and this sounds like it’s something I can automate with Home Assistant! After all, I’ve previously done some RF automations , so let’s get started. The Controller The control…
As much as I love using devcontainers for all my local development (see here ) there’s often repeatable things that I want to do in them which means I go back and copy RUN steps from previous Dockerfiles that I’ve created. Enter devcontainer Features A few months ago a new proposal was added to the open dev container spec (the spec that supports devcontainers in vscode) for custom…
Would you look at that, 1 year to the day since I did my 2021 post so I’m consistently late, woo! Blogging Towards the end of last year I read this post by Scott Hanselman about his decreased blogging, and it really resonated with me and how I’ve been feeling about blogging. While I haven’t blogged for quite as long, my oldest post is from 2008 (but it’s not actually my…
When we got our new house built, we decided to hold off putting in feature lights because we wanted to see the space first and then decide what we wanted in each of the areas as features. Fast forward a few months of occupancy and we’d selected our feature lights and booked the electrician to come and install them. And since we had an electrician coming to do some work, I felt it was an…
To say that 2022 was a tough year is probably an oversimplification of things, but yeah, 2022 was tough. And it’s not just the case that we’re a few years into a global pandemic for me, 2022 was tougher than that. To put it simply, I’m burnt out. By and large I’m a pretty upbeat and laid back person. I remember in high school my mum commenting that she didn’t think…
Well, 1,565km’s to be exact, but who’s really counting (oh right, me, that’s the point of this post!). It’s another year down so I thought I’d share my running journey from 2022 as it was very much a year of milestones for me, not only is 1500km’s the most km’s I’ve done in a single year, I also managed to get PB’s on all races I entered and I…
Where I live, we have three bins that we can put out, depending on the week, red for household rubbish, yellow for mixed recycling and green for garden waste. The red bin goes out each week, but the yellow and green alternate every other week, so you need to know which one it is that week and like a lot of people, I never know which week it is, so I sneakily wait until my neighbours put their bins…
When we designed our new home, we decided to add ceiling fans to each of the bedrooms, mostly because, while we have a HVAC system in place that is ducted throughout the house, sometimes you just want some basic air movement in a room, especially when it’s humid but not hot, and a HVAC is a lot more expensive to run than a ceiling fan. But, ceiling fans tend to be pretty dumb, and I wanted…
Next.js is one of the most popular JavaScript frameworks for building complex, server-driven React applications, combining the features that make React a useful UI library with server-side rendering, built-in API support and SEO optimizations. With today’s preview release, we’re improving support for Next.js on Azure Static Web Apps. What’s new In this preview we’re focusing on making zero-config…
In the previous post in this series we added a new “virtual” field to our GraphQL schema for Post , related : 1 2 3 4 5 6 7 8 9 10 type Post { id : ID ! title : String ! url : Url ! date : Date tags : [ String !]! description : String content : String ! related ( tag : String ): [ Post !] } But in doing so, we added a problem, let’s take this query as an example: 1 2 3 4 5 6 7 8…
Last year I wrote a post on using the CosmosDB Docker-based emulator with devcontainers and since then I’ve used that pattern many times to build applications, but there was one thing that kept bothering me, having to disable SSL for Node.js. Sure, disabling SSL with NODE_TLS_REJECT_UNAUTHORIZED wasn’t a huge pain, but it did feel like a dirty little workaround, it also hit a snag -…
Well, that was quick, less than a week since my last one and here we go again. For transparency, this one did actually land in my junk mail, so I wouldn’t have seen it if I hadn’t been looking for an email that I should’ve received (totally unrelated to getting phished though 🤣), but since I did see it, it’s time to dig into it again! The premise of this one is the same as…
After exploring a bit of the thought process on the how and why with my journey to a smart home, it’s time to look at a what , and for that I’m going to tackle one of the problems I identified in the last post: Forgetting the washing machine was done to hang the laundry out To give a bit of context, my home office is upstairs while the laundry is downstairs, and what this means is that…
Earlier this year I did a post about a phishing attempt I received . While I get these somewhat frequently, I decided to have a dig into the one I received today for no reason other than it seemed interesting. The email Here’s the email I received: This is super low effort and very clear that it’s a phishing attempt. There’s a huge string of text and numbers in the…