RSSAmplifier

Blog

mattbrailsford.dev

Welcome to my personal blog where I mostly write about Umbraco.

mattbrailsford.devRSS feed ↗62 posts

Latest posts

Creating A Safe Space for Editors to Be Wrong

I spend most of my time these days working on Umbraco AI, bringing AI into the hands of content editors. So I think a lot about what actually makes...

Speech-to-Text in Umbraco.AI

Speech-to-text has landed in Umbraco.AI. Alongside chat and embeddings, transcription is now a first-class capability in the platform — with a new...

Letting Go: How My AI Workflow Has Evolved

Last year I wrote about SPECKL, a methodology I built to explore a human-first approach to AI-assisted development. The idea was lightweight specs...

What We Gained Building Umbraco AI on Microsoft.Extensions.AI and the Microsoft Agent Framework

When we set out to build AI capabilities for Umbraco, we had a choice every platform team faces: build your own abstractions, or bet on someone...

Guardrails in Umbraco AI

When you add AI to a CMS, you’re giving it the power to generate content, respond to visitors, and interact with editors. That’s powerful — but it...

Introducing Umbraco AI Search

If you’ve used the build in search in Umbraco, you’ll know it’s keyword-based. You type “deployment guide” and it finds pages containing those...

File Uploads in Umbraco.AI

File uploads have landed in Umbraco.AI. While the most visible change is in Copilot — where you can now drag and drop documents directly into the...

Why Umbraco 17.4.0 Is a Big Deal for AI

If you told most Umbraco developers to get excited about a minor release, you’d probably get a polite nod. Point releases aren’t usually the ones...

Umbraco AI Prompts: Template Syntax and Variables

Following on from my Introducing Umbraco AI post, I wanted to dig deeper into one of the add-on packages that I think has the most immediately...

Understanding Contexts in Umbraco AI

In my introductory post, I gave a high-level overview of how Umbraco AI is structured — providers, connections, profiles, and contexts. Of those,...

The Umbraco AI Kitchen Sink Install

Since we released Umbraco AI, one of the most common bits of feedback I’ve heard is: “I want to try it, but I’m not sure which packages to...

Replacing My Custom Git Worktree Skill with Claude Code Hooks

If you’ve been following along with my recent posts, you’ll know that git worktrees have become a fundamental part of how I work. One worktree per...

How Task Metadata Saved My Git History: Keeping Claude Code in the Right Git Worktree

One of the biggest boosts to my AI assisted development productivity has got to be the introduction of using git worktrees. With these it’s...

Introducing Umbraco AI

If you caught the Umbraco Winter keynote webinar, you’ll have seen us announce something I’ve been working on for a while now - Umbraco AI. I’ve...

Solving Port Conflicts in AI-Assisted Development: HTTP over Named Pipes

The way I work day to day has changed quite a lot over the last 6 months. AI coding assistants like Claude Code aren’t just speeding up individual...

SPECKL: Testing a Human-First Approach to AI-Assisted Development

I’m giving a talk at Umbraco in the City soon about Spec-Driven Development (SDD), which has had me deep in research on where AI tooling is taking...

UMB.FYI Celebrates it's 2nd Birthday with a Pulse Check

Two years ago, I launched UMB.FYI with a simple goal: to make it easier to follow the heartbeat of the Umbraco community. Every week, new blog...

UMB.FYI Gets a New Workflow Engine

Every week when I put together UMB.FYI, the weekly Umbraco community newsletter, I found myself repeating the same little tasks over and over...

Adding Scheduled Posts to My GitHub Discussions Powered Blog

When I first built my GitHub Discussions–powered blog and later created the Astro Discussions Blog Loader, one critical feature was still missing:...

UMB.FYI Celebrates it's 100th Issue

This week marks a special milestone for me as UMB.FYI, my Umbraco news aggregating newsletter side project, hits its 100th issue 🎉 What started as...

Building an MCP Server for Umbraco Commerce

It’s undeniable that the biggest story to come out of this year’s Codegarden was the MCP integration developed by Phil Whittaker and Matt Wise. The...

How I Saved 5GB of Storage Per Year for UMB.FYI

As the editor of UMB.FYI — the weekly newsletter for the Umbraco community — I try to deliver the news in a clean, easy-to-digest format without...

UMB.FYI Gets an iOS Tip Shortcut

It’s no secret that UMB.FYI is built around community. The whole point is to surface and share the best Umbraco-related content being posted across...

ND & Me: Running in Emulation

A late-diagnosed dev's journey through neurodivergence, self-doubt, and learning to run more natively

Installing K6 on a Raspberry Pi

I’ve recently been doing some performance testing at work using K6 and had the need to test a script locally. I could have run the script on the...

Getting Started on Bluesky for Umbraco Developers

Bluesky, the decentralized social media platform gaining a lot traction of late, is becoming a vibrant space for the Umbraco community. Whether...

Introducing the Umbraco Bluesky Labeler

With the recent boom of Bluesky users comes a lot if interesting and exciting community initiatives born from it’s open API. One such interesting...

UMB.FYI links get Urchin Tracking Module (UTM) parameters

In a recent conversation with an Umbraco community member on Mastodon, they asked if it would be possible if we could add Urchin Tracking Module...

Creating a Bluesky bot in C#

I recently blogged about us adding a new Bluesky tips bot to UMB.FYI and so I thought I’d share a bit more detail on how I went about...

UMB.FYI gets a Bluesky tips bot

With the recent surge in Bluesky users and a growing Umbraco cohort on the platform, it seemed like an ideal time to bring a tips bot to the...

UMB.FYI gets Profiles, Tags and Topics

Since creating UMB.FYI newsletter a little over a year ago, I’ve slowly been tweaking and adding features as I’ve gone along and today I wanted to...

Launching the GitHub Discussions Blog Loader for Astro

In a recent post I shared my new blog setup using GitHub Discussions as a blogging engine combined with Astro’s new Content Layer API coming in v5,...

Building a GitHub Discussions Powered Blog

Discover how to build a blog powered by GitHub Discussions with full control over site markup, spam-free content, and an easy-to-maintain setup.

Deploying TypeScript Type Definitions for Umbraco v14 Packages

Learn how to deploy TypeScript type definitions for Umbraco v14 packages. This guide covers generating, bundling, and publishing type definitions, using tools like TypeScript CLI and API Extractor.

The Challenge of Versioning Expandable API's in Umbraco

Since Umbraco v12 there has been a big push towards making all the core Umbraco products headless. A cool feature of many of these API’s is the...

Using the Command Pattern to Re-Apply Changes to an Observable Model in Umbraco Bellissima

In Umbraco v14 one of the hot new approaches is observable models. You can think of observables as a long lived promise that can resolve multiple...

Enhancing Asynchronous Data Fetching in Umbraco v14 with Lit Async Directives

In Umbraco Commerce we have a number of interconnected models which pose a bit of a problem when it comes to rendering them for display in our...

Reusing Umbraco Properties in Umbraco v14

When building user interfaces in Umbraco v14, occasionally there comes a time when you need to build a form based on some dynamically defined...

Creating your own UI extension points in Umbraco v14 - Part 6: Filters & Conditions

So far in this series we have looked at creating a flexible and extendable “quick actions” feature. In this post we’ll take a look at how we can...

Creating your own UI extension points in Umbraco v14 - Part 5: Kinds

In the last posts in this series, we’ve looked at ways to allow developers to swap out behaviors and UI elements for our “quick action”...

Creating your own UI extension points in Umbraco v14 - Part 4: Interchangeable Elements

In the last post we looked at how we can swap out our “quick action” button behavior whenever a button is clicked. In this post we’ll take a look...

Creating your own UI extension points in Umbraco v14 - Part 3: Customizable APIs

In the last post in this series, we looked at componentizing the UI for our “quick action” elements. In this post we’ll take a look at how we can...

Creating your own UI extension points in Umbraco v14 - Part 2: Extension Slots

In our first post in this series, we looked at the basics of setting up our “quick actions” section for our UI. In that post we manually fetched...

Simplifying Imports with TypeScript Path Aliases in Umbraco v14

I recently attended the online Umbraco Manchester meetup where Rick Butterfield talked about Generating a TypeScript OpenAPI client from Umbraco’s...

Creating your own UI extension points in Umbraco v14 - Part 1: The Basics

In this mini series I’ll take a look at a progressively more advanced example of creating your own UI extensions in Umbraco v14. I’ll loosely base...

Back to the Front-end: Exploring the Future of the Umbraco UI (Part 10 - RxJS)

Next in this series of posts we take a look at what I think will likely be the thing that people struggle to get their head around the most (I know...

Back to the Front-end: Exploring the Future of the Umbraco UI (Part 9 - Context API)

Context API’s are an interesting new concept in the new backoffice UI, and really I think HQ themselves are still learning the best approach for...

Back to the Front-end: Exploring the Future of the Umbraco UI (Part 8 - Lit)

When HQ announced that a new backoffice UI was on the cards, by far the biggest question on everyones mind was “what framework will it be built...

Back to the Front-end: Exploring the Future of the Umbraco UI (Part 7 - TypeScript)

The next thing we’ll be taking a look at is TypeScript. This has been a bit of a divisive subject in Umbraco’s history as the community have tried...

Back to the Front-end: Exploring the Future of the Umbraco UI (Part 6 - ES Modules)

So in the last blog post we introduced Vite and briefly mentioned that it is based around ES Modules, however as this isn’t a concept most will be...