<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="/rss.xsl"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Umbraco Community Blogs</title><link>https://community.umbraco.com</link><description>Recent blog posts from members of the Umbraco community.</description><language>en</language><atom:link href="https://community.umbraco.com/feeds/community-blogs.xml" rel="self" type="application/rss+xml" /><item><title>Why Umbraco 17 Is More Than an End-of-Life Escape</title><link>https://www.wearediagram.com/blog/why-umbraco-17-is-more-than-an-end-of-life-escape</link><guid isPermaLink="false">dcacea68-432d-451d-9d86-f989ec58f85c</guid><pubDate>Wed, 29 Jul 2026 15:40:39 GMT</pubDate><dc:creator>Diagram</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/c3feff8b5d450bab2ccb4ee91c32d45fc3065272d0ab07dbaa8c5e9bb02ea958.png" type="image/jpeg" /></item><item><title>A reusable deploy pipeline for Umbraco Cloud</title><link>https://owain.codes/blog/2026/july/a-reusable-deploy-pipeline-for-umbraco-cloud/</link><guid isPermaLink="false">357b617d-1055-4710-bd50-02a3e26b2131</guid><pubDate>Mon, 27 Jul 2026 00:00:00 GMT</pubDate><description>Create a reusable deploy pipeline for Umbraco Cloud</description><dc:creator>Owain Williams</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/05e80792af79f7c19c8144bd5bcf4b1b61fec22bd15ffc6c36700f958a8f3efa.png" type="image/jpeg" /></item><item><title>Assume your software will outlive its end-of-life</title><link>https://blog.tsd.digital/assume-your-software-will-outlive-its-end-of-life/</link><guid isPermaLink="false">a2be94ef-6ff8-4be6-9fcc-aedca2cf94dc</guid><pubDate>Mon, 20 Jul 2026 00:00:00 GMT</pubDate><description>We still run an Umbraco v4 site, on purpose. End-of-life is a date on the vendor's calendar, not a fact about your customer's business. Why the version you ship is the one worth designing for, and how to tell a managed risk from plain neglect.</description><dc:creator>Tim Gaunt</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/226fba54b05f889864506f9934ba0db4d0491fc523d3c8ea48b4b5d8dbda06cd.png" type="image/jpeg" /></item><item><title>Build a custom Umbraco Automate action</title><link>https://owain.codes/blog/2026/july/build-a-custom-umbraco-automate-action/</link><guid isPermaLink="false">5deec284-a4d4-4555-a824-f05d6f8b2de8</guid><pubDate>Fri, 17 Jul 2026 00:00:00 GMT</pubDate><description>Creating a custom action in Umbraco Automate to pull tags from a blog and display them as hashtags in social connections.</description><dc:creator>Owain Williams</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/e24bdd9c7cc184c3aec7284df6afa4fe58df37f10d9a6185f1a88e64b4e1e305.png" type="image/jpeg" /></item><item><title>No Laptop, Still Learning: An Umbraco Developer's Holiday Checklist</title><link>https://www.dynamicdave.nl/blog/no-laptop-still-learning-an-umbraco-developers-holiday-checklist/</link><guid isPermaLink="false">c429075a-517e-44ab-88fd-c9d3cc561671</guid><pubDate>Tue, 14 Jul 2026 22:00:00 GMT</pubDate><description>In a few days, I'm packing my bags for a holiday, and for the first time in ages, my laptop will stay home. No Visual Studio. No Docker containers spinning up in the background. No sneaky last-minute Git commits. And, honestly, no more of those "let me just fix this one bug real quick" moments.And to be completely honest? I can't wait.But that doesn't mean I'm putting my developer brain entirely on pause. If you've been working with Umbraco for years—like me—you know it's much more than a tool you clock in and out of each day. It's a community, an ecosystem, and, let's be real, a craft that's always changing. Even if I don't write a line of code, there's no shortage of ways to stay inspired and come back from my break with fresh perspectives.Here's how I'm planning to keep the inspiration flowing while away.</description><dc:creator>Dave Jonker</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/56b7dec376f02605d8568f932e910d22d6ac81a54266cbb456ecc51c10fc5de7.jpg" type="image/jpeg" /></item><item><title>Migrating Umbraco 13 to Umbraco 17 on Umbraco Cloud</title><link>https://www.nevitech.co.uk/blog/migrating-umbraco-13-to-umbraco-17-on-umbraco-cloud/</link><guid isPermaLink="false">b517358b-24b5-4247-9e52-a5b64d48e0e1</guid><pubDate>Fri, 10 Jul 2026 23:00:00 GMT</pubDate><description>A developer guide to upgrading an Umbraco 13 site to Umbraco 17 on Umbraco Cloud by migrating locally and deploying into a fresh Cloud project, covering the full sequence through to a low downtime go live.</description><dc:creator>Justin Neville</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/f571f78706f1f838ee3860a31a26a9078c387a05750d0511273b6bb26ae64817.png" type="image/jpeg" /></item><item><title>Pinning docs.umbraco.com to a Specific Version with Tampermonkey</title><link>https://www.nathanielnunes.com/blog/pin-umbraco-docs-version-tampermonkey</link><guid isPermaLink="false">661f6699-ede1-4029-9fac-bcb2d92676b7</guid><pubDate>Fri, 10 Jul 2026 11:30:00 GMT</pubDate><description>Here is a Tampermonkey userscript that pins docs.umbraco.com to whatever version you are actually working on.</description><dc:creator>Nathaniel Nunes</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/4cbcd76179a95964580e75a6646a526dc841b1948269df32a0f91f087efda583.png" type="image/jpeg" /></item><item><title>How I upgraded Umbraco 13 to 17 in less than two hours!</title><link>https://cornehoskam.com/posts/how-i-upgraded-umbraco-13-to-17-in-less-than-two-hours/</link><guid isPermaLink="false">d2e4ca0c-4092-4f75-a558-dd1e52655c98</guid><pubDate>Fri, 10 Jul 2026 00:00:00 GMT</pubDate><description>I jumped straight from Umbraco 13 to 17 on Umbraco Cloud in under two hours, TinyMCE to Tiptap and all. Here's the full checklist of what I touched.</description><dc:creator>Corné Hoskam</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/c5dd6a748f3b9debd05451317330827ac1497e100aa2093b022822f23f8815ce.png" type="image/jpeg" /></item><item><title>Codegarden 2026 - a little late, because it gave me something to build</title><link>https://dev.to/mpisaacs/codegarden-2026-a-little-late-because-it-gave-me-something-to-build-2em6</link><guid isPermaLink="false">b2cd460a-a8de-4904-a420-b0b99067bbf3</guid><pubDate>Thu, 09 Jul 2026 00:00:00 GMT</pubDate><description>A few weeks ago I was in Copenhagen for my first Codegarden, and one quiet thought has stuck with me...</description><dc:creator>Mike Isaacs</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/35b04113dbd730f37337d1987dd530ecdf02c5e1ab4ad11b89e192b257401086.webp" type="image/jpeg" /></item><item><title>Make Razor Partials Navigable in VS Code</title><link>https://skttl.dev/blog/go-to-partial/</link><guid isPermaLink="false">932c9d2f-a2d6-4d62-b7d6-32c2644370b3</guid><pubDate>Thu, 09 Jul 2026 00:00:00 GMT</pubDate><description>A small VS Code extension that adds Go to Definition and live diagnostics for Razor partial view references in .cshtml files.</description><dc:creator>Søren Kottal</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/61a88dd15842576cfe9331cd072eebbe02d443aec67d806d07fb29ca5f1d517a.png" type="image/jpeg" /></item><item><title>Exploring Umbraco AI for end users</title><link>https://hayleymarkdigital.co.uk/blog/exploring-umbraco-ai-for-end-users/</link><guid isPermaLink="false">60e3094c-02b7-4781-a5cd-4de030148dea</guid><pubDate>Thu, 09 Jul 2026 00:00:00 GMT</pubDate><description>Providing reliable, proactive and personable freelance support for website updates, SEO, lead generation and ongoing marketing strategies.</description><dc:creator>Hayley Mark</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/a17c963882c395f4c602a4248f83d4c529e0c5688282c2efcbd691f2c9daa270.png" type="image/jpeg" /></item><item><title>Umbraco 18 Finally gives reusable content the home it deserves</title><link>https://www.dynamicdave.nl/blog/umbraco-18-elements/</link><guid isPermaLink="false">3e2293a7-111a-43f4-a269-938c7c820cd5</guid><pubDate>Tue, 07 Jul 2026 22:00:00 GMT</pubDate><description>There are flashy features that get everyone excited—new editors, AI integrations, shiny dashboards. They look great in a keynote and are fun to show off. But then there are those features that, quietly, just fix long-standing headaches. For me, the new Library and Elements in Umbraco 18 are absolutely in that second group.When I first saw these demoed at Codegarden, I immediately thought, "Here we go. This is definitely going to be one of my favorite updates since a long time." It's not a brand-new idea. In fact, it's almost more impressive because it turns something most experienced Umbraco developers have hacked together themselves into an actual, official feature.If you’ve built Umbraco websites for any length of time, you’ve probably done this: made a “Globals “ of “Various Content” node and hidden it, set up a Shared Content folder, tossed reusable stuff onto a Settings page, or kept a folder with call-to-actions, testimonials, author profiles, or banners. None of which are even real pages.Did it work? Yeah… most of the time. But let's be honest—it always felt like a kludge.That kind of content never really belonged alongside website pages. This “content” didn’t need URLs; users weren’t supposed to visit it. We only structured things this way because editors needed somewhere to manage reusable pieces. For years, we just pretended these were documents because Umbraco left us no other option.With Umbraco 18, the compromise disappears.</description><dc:creator>Dave Jonker</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/7704edbf7948350d3337d4fb865899e4280462b747e1b160b306dccb09daee34.jpg" type="image/jpeg" /></item><item><title>What Umbraco Codegarden 2026 Left on Me—Permanently | Marathon Consulting</title><link>https://marathonus.com/about/blog/what-umbraco-codegarden-2026-left-on-me-permanently/</link><guid isPermaLink="false">e0888e27-38b2-4a67-b142-8fd9d33c6df5</guid><pubDate>Mon, 06 Jul 2026 00:00:00 GMT</pubDate><description>Marathon's Scott Clevenger reflects on Umbraco Codegarden 2026 — an MVP, a tattoo, and a platform that's ready for whatever comes next.</description><dc:creator>Scott Clevenger</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/ccca46415beaa5cb25ee94ad738569682c95e61c8ac0eddbf90f2239c759816a.png" type="image/jpeg" /></item><item><title>Is AI signalling the end of the CMS as we know it? Or is it simply becoming something much bigger?</title><link>https://www.linkedin.com/pulse/ai-signalling-end-cms-we-know-simply-becoming-much-bigger-durrant-z3nme/</link><guid isPermaLink="false">ab02fa51-3f7c-4579-8e10-42505c73a77b</guid><pubDate>Mon, 06 Jul 2026 00:00:00 GMT</pubDate><dc:creator>Nick Durrant</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/f2f0c439d7db69a8e7a8e425d2c84241ec742875a4c66b121398c047a1519487.jpg" type="image/jpeg" /></item><item><title>Gibe goes to Codegarden (2026 edition)</title><link>https://gibe.digital/blog/gibe-goes-to-codegarden-2026-edition/</link><guid isPermaLink="false">493aed42-3675-449c-88bd-4277ac85a17c</guid><pubDate>Mon, 06 Jul 2026 00:00:00 GMT</pubDate><description>Gibe reflects on Codegarden 2026, covering the latest Umbraco announcements, standout sessions, community highlights, and our Package Award nomination.</description><dc:creator>Sam Forrest</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/e6d955802a9a6712b349edd84051f073e640236c2d6a2629d1cd59510d90120e.jpg" type="image/jpeg" /></item><item><title>New Giscus powered comments and H5YR widget!</title><link>https://owainjones.dev/blog/new-giscus-powered-comments-and-h5yr-widget/</link><guid isPermaLink="false">39c2627e-992d-4d0e-96cd-b86a87789053</guid><pubDate>Sat, 04 Jul 2026 19:18:36 GMT</pubDate><description>I've added a giscus powered comments, and the awesome H5YR widget, to my blog posts!</description><dc:creator>Owain Jones</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/955d3182b3577a729981ad6091027315d615755de2a36fc5baae09cd8bbbbb1b.png" type="image/jpeg" /></item><item><title>Introducing ImageSharp TrimCache for Umbraco</title><link>https://www.nevitech.co.uk/blog/introducing-imagesharp-trimcache-for-umbraco/</link><guid isPermaLink="false">e4683743-06e9-4e69-bdd0-0d540509f7ae</guid><pubDate>Fri, 03 Jul 2026 23:00:00 GMT</pubDate><description>A free Umbraco package that trims the ImageSharp.Web image cache by age on a schedule, for both the local physical cache and Azure Blob storage. Stop the media cache growing unbounded on Umbraco Cloud and self hosted sites.</description><dc:creator>Justin Neville</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/3b88251bbe6a384f5d7077bceea3ee38e98a26b8a43e8e2b6a643143b002c2b1.png" type="image/jpeg" /></item><item><title>Letting AI agents loose on Examine</title><link>https://shazwazza.com/post/letting-ai-agents-loose-on-examine/</link><guid isPermaLink="false">16dbb04e-fbe8-4f71-882a-efc8442a623c</guid><pubDate>Fri, 03 Jul 2026 17:45:20 GMT</pubDate><description>I've been maintaining Examine for a very long time now. It's the search and indexing library that sits underneath every Umbraco site, and like any project that's been around long enough, it has plenty of hot paths that could be faster, a steady trickle of issues that need triaging, and a backlog of "I'll get to that eventually" performance work that, well… I never actually get to.
So a couple of months ago I thought I'd try an experiment - what if I stopped doing all of that myself and instead let a bunch of AI agents do it for me, on a schedule, while I got on with everything else? This post is about how that went. I've shipped a few releases off the back of it and some of the hot-path improvements are genuinely a bit ridiculous.
So what are these "agentic workflows"?
The thing I installed is GitHub Next's Agentic Workflows - a set of markdown-defined workflows that run in GitHub Actions and drive an AI agent to do actual maintenance work on your repo. They're not chat bots. They run on a schedule, they have persistent memory, they open real pull requests, and they leave the "should this ship?" decision to me.
I ended up with a few of them running on Examine:

Perf Improver - runs daily, hunts for performance bottlenecks, writes benchmarks to actually prove the improvement, and opens a draft PR with the before/after numbers.
Efficiency Improver - its scrappier sibling, focused on the smaller allocation-and-LINQ-state-machine wins that add up over time.
Daily Issue Triage - goes through untriaged issues, sets types, applies labels, spots duplicates, and leaves a tidy triage report for me.
Agentic Maintenance - keeps the whole setup ticking along.

Each one is just a markdown file in .github/workflows/ with a description, a schedule, some safe-outputs limits (things like "you may open at most 4 PRs per run, and they must be drafts") and a big prompt describing how to behave. That's it. The nice part is that the guardrails are declarative, so the agent can't merge its own PRs, it can't touch protected files, and it can only comment so many times per run. All of that is baked in.
How it actually works day to day
The bit that makes this more than a gimmick is the persistent memory. Every run, the Perf Improver reads its own notes - which build/test/benchmark commands it validated, what's on its optimisation backlog, what it worked on last time, and which suggestions I've already ticked off. Then it does a couple of tasks in a round-robin fashion so it's not endlessly poking at the same corner of the codebase.
It also keeps a single rolling "Monthly Activity" issue open with a checklist of what needs my attention. So my side of it is pretty simple: the agent opens a draft PR with measured before/after numbers, I read it and run CI, and if I'm happy with it I merge. That's the whole loop. I'm the reviewer, the agent is the workhorse doing the grind I never had time for.
So what did they actually get done?
Over roughly the last two months, here's what these workflows actually got up to on Examine:

124 successful Perf Improver runs and 9 successful Efficiency Improver runs
20 successful Daily Issue Triage runs quietly keeping the issue tracker tidy
24 performance/efficiency PRs reviewed and merged (13 from Perf Improver, 11 from Efficiency Improver) between late May and the end of June
And the bit that actually matters - three releases shipped off this work: v3.8.0, v3.9.0 and the v4.0.0-beta.7 pre-release

That last point is really the whole thing. This isn't a pile of speculative branches rotting in a fork somewhere - it's code that went through my review, passed CI, and is now sitting in NuGet packages that real Umbraco sites are running.
Show me the numbers
Right, this is the part I actually get excited about. One of my favourite things about the Perf Improver is that its prompt tells it to only attempt improvements it can actually measure - establish a baseline first, make the change, then measure again and document both numbers. For the algorithmic hot-path stuff that means benchmarks, so along the way it built out a proper BenchmarkDotNet suite that compares the current source against the published NuGet packages (3.0.1 through 3.3.0), which means I can show you real, reproducible deltas instead of hand waving.
The full-text search hot path
ManagedQuery is the primary full-text search entry point in Examine - it's what runs on basically every search. The agent noticed it had no dedicated benchmark, wrote one, and then stacked up a series of small, individually measured changes: a volatile factory cache in SearchContext.GetFieldValueType, an early return in the extract-terms check, and killing off some redundant ConcurrentDictionary lookups in AddDocument.
Here's the current source vs the most recent 3.3.0 release, on a 1,000-document index:



Method
Version
Mean
Allocated




ManagedQueryAllFields
3.3.0
11.42 ms
1,323 KB


ManagedQueryAllFields
Source
2.17 ms
371 KB



That's about 5.3x faster and roughly 3.6x less memory allocated on the single most travelled code path in the whole library. On the busiest thing Examine does. I'll happily take that.
Building queries
GroupedAnd / GroupedOr / GroupedNot are the workhorses of the query builder. A little string[] fast-path (skipping a defensive .ToArray() copy when the caller already handed it a string[]) plus some allocation trimming got this:



Method
Version
Mean
Allocated




CreateQueryOnly
3.3.0
3,995 ns
8.34 KB


CreateQueryOnly
Source
319 ns
2.20 KB


GroupedAndStringArray
3.3.0
21,377 ns
21.10 KB


GroupedAndStringArray
Source
16,659 ns
14.34 KB



The CreateQuery() baseline dropping from 8.34 KB down to 2.2 KB is a lovely little win, and the grouped clauses are about 25% faster with a third of the allocation shaved off.
Constructing a ValueSet
Every single document you index goes through a ValueSet constructor. The old path allocated an intermediate dictionary and a generator state machine per field, which is exactly the kind of thing you don't notice until you're bulk indexing a big site. The agent got rid of both:



Method
Version
Mean
Allocated




FromDictionary5Fields
3.3.0
1,183 ns
2,200 B


FromDictionary5Fields
Source
226 ns
592 B


FromDictionary20Fields
3.3.0
4,007 ns
6,544 B


FromDictionary20Fields
Source
654 ns
1,520 B



That's roughly 5-6x faster and about 4x less allocated on indexing, and when you're rebuilding the index on a large Umbraco site that adds up fast.
The really nice touch is that these benchmark result tables now live in  doc-comments right next to the benchmark code, so the numbers are versioned in the repo alongside the thing they measure. The agent did that bit too.
Was it actually worth it?
For me the thing that makes it work is the measurement. Everything comes to me as a small, focused, draft PR with the numbers attached, so I can look at it, sanity check it, run CI, and decide in a couple of minutes. It's not zero effort - I still read every change before it goes anywhere near main - but the ratio is fantastic. I'm getting a steady stream of well-measured, single-purpose performance PRs on a library I care about, on paths I'd genuinely never have found the time to optimise by hand, and I've shipped real releases because of it. For a project I maintain around everything else, that's a pretty great deal.
If you maintain a repo with a backlog you never get to, especially performance work that needs benchmarks to justify it, I'd recommend giving GitHub Next's agentics a go.
You can see all of it out in the open on the Examine repo - the [perf-improver] and [efficiency-improver] PRs, the benchmark suite, and the releases they fed into. And there's a nice bonus here for me too: ExamineX, my managed, cloud-hosted Examine search offering, runs on this exact same internal plumbing. So all this work the agents have been doing to tighten up Examine's query and indexing hot paths feeds straight through into ExamineX - the underlying engine gets faster and leaner, and every ExamineX site gets those wins for free without changing a thing. If you'd rather have your search running as a managed service instead of hosting Lucene indexes on your own servers, that's what ExamineX is there for. 🙂</description><dc:creator>Shanon Thompson (Deminick)</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/ceb1651c4d8fe51f3a4cb5eb4313e001f2e90fbff5639335bce888e636d71625.jpg" type="image/jpeg" /></item><item><title>Umbraco London July Meetup .. the write- up</title><link>https://medium.com/@ravimotha/umbraco-london-july-meetup-the-write-up-b4ce49a37390?source=rss-8e76be83b03f------2</link><guid isPermaLink="false">793547bc-9db7-466a-8ccc-ece4dcca2df3</guid><pubDate>Fri, 03 Jul 2026 09:18:14 GMT</pubDate><dc:creator>Ravi Motha</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/ba81d0f8496ecaaa27c81e43be62f847985cbb05d1227cb2e5783f4cc8e39ee3.jpg" type="image/jpeg" /></item><item><title>Creating A Safe Space for Editors to Be Wrong</title><link>https://mattbrailsford.dev/creating-a-safe-space-for-editors-to-be-wrong</link><guid isPermaLink="false">aa85a56d-cdf0-4219-9201-7223f09fa3ac</guid><pubDate>Fri, 03 Jul 2026 00:00:00 GMT</pubDate><description>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...</description><dc:creator>Matt Brailsford</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/ca55935271a83dfecba8cfb56fdabb7c808dcee925a93df0006d4990429dcba5.png" type="image/jpeg" /></item><item><title>Codegarden 2026 - a little late, because it gave me something to build</title><link>https://dev.to/mpisaacs/codegarden-2026-a-little-late-because-it-gave-me-something-to-build-2em6</link><guid isPermaLink="false">2b868ccd-61d7-4977-a92b-44f4da1c548f</guid><pubDate>Wed, 01 Jul 2026 15:53:03 GMT</pubDate><description>A few weeks ago I was in Copenhagen for my first Codegarden, and one quiet thought has stuck with me since. It didn't come from a keynote. It came from the bit the keynote leaves out.

I've worked with Umbraco for years, but I'd never been to Codegarden, and I turned up without much of a fixed idea of what the two days would be. I kept that open on purpose. I wanted to take it in rather than measure it against something I'd decided in advance. What struck me most was that the value came from two places at once. The sessions were a fantastic source of inspiration; everything from keynotes to guest speakers all seemed to resonate in some way or another. The conversations in between the sessions - drifting around the event space and finding common ground with anyone and everyone - proved just as valuable. I came home more energised than I've been in a while, with a notebook full of half-formed ideas and a better feel for the community I'm part of.

But the thing I kept turning over afterwards was that bit the keynote leaves out. That's what I want to write about.


  
  
  The easy half and the hard half


Every major Umbraco release gets the same treatment. A polished keynote, a clean demo, a feature that looks effortless on stage. There's plenty in 18, and which part matters most depends on what you're building. For me it's Elements: a new Library section where you manage reusable content and reference it through a new element picker. Create once, use everywhere. It's a genuinely good direction. Reusable content has lived awkwardly in the content tree for years, and Library finally gives it a proper home.

What the demos don't show you is the part I've been playing around with for the past few weeks. Taking a real Umbraco 17 site, with content pickers threaded through block lists, block grids, rich text blocks and base document properties, and getting all of it to point at the new Library without an editor ever noticing anything moved underneath them.

The feature is the easy half. The migration is the half that decides whether anyone actually uses it.


  
  
  Why migration is where adoption lives


A new way of modelling content only matters if existing sites can get to it. New projects will use Library because it's there and it's the obvious choice. The much bigger pile of work is the sites already in production, built the old way, where reusable content was faked with content pickers pointing at hidden nodes because that was the best tool on offer at the time.

Upgrade conversations with clients are increasingly turning into "end of life is on the way, you need to upgrade!" but Umbraco have given us some genuinely useful new features that can turn those conversations from scaring clients away from security woes to improving their content management and supercharging their marketing activities.

There's a timing thing here. The migration path has to exist when the feature does, not three months later when the upgrade conversation has gone cold. A site that wants Library is at its most willing in the window right after release, while the appetite is fresh and the project is being planned anyway. Miss that window and you're asking someone to reopen a decision they've already made, which almost never happens.

That's the question I bring to every shiny thing on a keynote slide. Not "is this exciting", but "what's the real path from a live production site to it, and how much of that path can be made painless". The exciting idea is the easy part. The route onto it is the work.


  
  
  What the package actually does


This is the problem the Library Migrator package is built to solve, and the job is less glamorous than it sounds. It moves documents from Content into Library, so the things that were always meant to be reusable end up where they belong. It swaps every content picker on the relevant types for an element picker pointed at Library, so editors keep the same workflow and have nothing new to learn. And it rewrites the stored values, which is the part that earns its keep: every value held in an old content picker is updated to reference the new elements, across block lists, block grids, rich text blocks and base document properties. One reference left behind is a broken link an editor finds at the worst possible moment.

None of that shows up in a demo, using a brand new, tailored project designed to show the feature off at its best. Yet content is the centrepiece of all CMS solutions and the value in existing content is always at the forefront of our clients' minds. Whether it's a same-platform upgrade or a complete rebuild, the question of migration always gets raised.

The Library Migrator is out now. If you're looking at an Umbraco 17 site and wondering how on earth it's going to reach 18's (or 21 if you're LTS-conscious) Library, that's exactly what it's for.

Library Migrator on Umbraco Marketplace

Library Migrator repository</description><dc:creator>Mike Isaacs</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/35b04113dbd730f37337d1987dd530ecdf02c5e1ab4ad11b89e192b257401086.webp" type="image/jpeg" /></item><item><title>PostgreSQL provider for Umbraco Search</title><link>https://kjac.dev/posts/postgresql-provider-for-umbraco-search/</link><guid isPermaLink="false">99d70815-d362-4e64-b826-41d97d226935</guid><pubDate>Wed, 01 Jul 2026 00:00:00 GMT</pubDate><description>Introducing a PostgreSQL powered search provider for Umbraco Search.</description><dc:creator>Kenn Jacobsen</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/4723241d087da3a85dce222102f8108dd68e8da966f24f9ec5c2a362b532942b.webp" type="image/jpeg" /></item><item><title>Using Umbraco.Automate to populate content from an API</title><link>https://owain.codes/blog/2026/july/using-umbracoautomate-to-populate-content-from-an-api/</link><guid isPermaLink="false">1202d7cd-76aa-4aae-91a2-c1f60e2837a5</guid><pubDate>Wed, 01 Jul 2026 00:00:00 GMT</pubDate><description>Learn how to automatically populate Umbraco content from an external API using Umbraco.Automate, with a hands-on PokéAPI example and video demo.</description><dc:creator>Owain Williams</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/1d5cbeb178c05f3d1cd9e0d7809681b38765403fae7d22c1132aa174cabe24c4.png" type="image/jpeg" /></item><item><title>Advanced Permissions meets Umbraco 18!</title><link>https://dev.to/luukpeters/advanced-permissions-meets-umbraco-18-26g0</link><guid isPermaLink="false">c2698f50-4853-45fd-a3a3-106c0085fbc9</guid><pubDate>Sun, 28 Jun 2026 19:49:52 GMT</pubDate><description>A few days ago, the final version of Umbraco 18 was released! So it was time to update my Advanced Permissions package to support Umbraco 18.

This was not just a simple case of updating a few namespaces and dependencies and calling it done. The main new feature in Umbraco 18 was a perfect candidate for Advanced Permissions support, so that is exactly what I added!


  
  
  What is new in Umbraco 18


The Umbraco 18 release is (and I quote) "a short and sweet release". The main attraction is the new Library section and the first version of reusable Elements.



Reusable Elements in the Library section are essentially Content nodes without rendering and routing. Other than that, they behave a lot like Content: you can create, delete, move them, and so on. That made them the perfect candidate for support in v18 of the Advanced Permissions package.

Besides Library support, the package also has a few other improvements and additions. Let's talk about them!


  
  
  Library support!


The first obvious new feature is the Permissions Editor for the Library. Just like with Content, you can set permissions for a User Group using the same inheritance and scoping system as the Content Permissions Editor.



You'll notice that not every permission is applicable in every case, so N/A is displayed when a permission does not apply.

And just like with Content, the Library also has an Access Viewer where you can see the effective permissions for a User Group or an individual User.



I also added a Library Element Type Permissions Editor. Just like the Document Type Permissions Editor, you can set the insert options for Element Types for a specific User Group.



With this Permissions Editor, you can control whether a User Group can create instances of an Element Type. This acts as a filter on the "create" list in the Library. And when a User has multiple User Groups, the well-established resolver will determine the effective permissions.

Currently, because of a limitation in Umbraco, it is not yet possible to scope these permissions to a specific part of the Library tree like the Document Type Permissions Editor does.

And of course, the Element Type Permissions Editor also has an associated Access Viewer.




  
  
  Redesign


Because of all these new Permissions Editors and Access Viewers, the menu became harder to read at a glance. So the main menu has been redesigned around the scope of the editor and viewer.



All editors and viewers in the menu are now called Permissions Editor and Access Viewer respectively. Their purpose is determined by the menu header they are under: Content, Document Type, Library, or Library Element Type.

In the screenshot, you'll also notice a slight redesign of the workspaces for the editors and viewers. They now look more Umbraco native and display a one-line description of what the editor or viewer is for. And when you have not selected anything yet, it will now display a much nicer view. This will also be ported back to the Umbraco 17 version.


  
  
  To help or not to help


In the top-right corner of each editor or viewer, you'll also notice a "learn more" button. This button gives access to more detailed documentation. It describes what the editor or viewer is for, and it links to more generic documentation explaining the concepts.

Consider this a first version. It is already much better than nothing, but I think it can still be improved over time. This will also be ported back to the Umbraco 17 version.


  
  
  Localization support!


And lastly, apart from the expanded documentation, Advanced Permissions now has localization for all languages that the Backoffice supports. Obviously, these translations are automatically generated because I am not fluent in 28 languages, so if you find an error, please let me know!

All in all, I think this is a very nice and complete release. I'm happy that Advanced Permissions can support new Umbraco features as soon as they come out.

You can find Advanced Permissions for Umbraco here:

NuGet:
https://www.nuget.org/packages/Umbraco.Community.AdvancedPermissions/

The Umbraco Marketplace:
https://marketplace.umbraco.com/package/umbraco.community.advancedpermissions</description><dc:creator>Luuk Peters</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/3d796fbee73b88bd541e21d25672f9cdfe3832f2835a7d7c5061a40c5ef8cad3.webp" type="image/jpeg" /></item><item><title>OC.Automate update</title><link>https://owain.codes/blog/2026/june/ocautomatelinkedin-now-available/</link><guid isPermaLink="false">750bf608-35e4-4278-a43f-6df4b0b71eb1</guid><pubDate>Sun, 28 Jun 2026 00:00:00 GMT</pubDate><description>OC.Automate.LinkedIn is out of beta and OC.Automate.Bluesky and OC.Automate.Mastodon are all working on Umbraco 18</description><dc:creator>Owain Williams</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/34f65d8086960abb9fb9171aad9b4bad8e3421f4616ee9fdf1624c6144cc4732.png" type="image/jpeg" /></item><item><title>My First Codegarden Experience — A Journey from India to Copenhagen</title><link>https://anju-dev-notes.hashnode.dev/my-first-codegarden-experience-a-journey-from-india-to-copenhagen</link><guid isPermaLink="false">f9d31e16-0cf5-49b2-8d94-95fa147775f6</guid><pubDate>Fri, 26 Jun 2026 10:36:14 GMT</pubDate><description>Attending Codegarden for the first time was truly a milestone moment in my career — not just because of the event itself, but because it also became a very personal and memorable journey for me.
This</description><dc:creator>Anjumol Babu</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/ebaef0a762d017b6dfb8907a326334cc9546c9820fa8a98d1745a8ec67c87c33.png" type="image/jpeg" /></item><item><title>Umbraco Automate</title><link>https://owain.codes/blog/2026/june/umbraco-automate/</link><guid isPermaLink="false">c45fd6c8-f1b8-4201-a18c-4dadb25a4e56</guid><pubDate>Fri, 26 Jun 2026 00:00:00 GMT</pubDate><dc:creator>Owain Williams</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/015f054cba4ea522bb01cf1ce5db478331eac1bb57bab2b83e82d3340e330f50.png" type="image/jpeg" /></item><item><title>Umbraco Automate Workflows</title><link>https://owain.codes/blog/2026/june/umbraco-automate-workflows/</link><guid isPermaLink="false">6db4380d-1c82-421c-a3ab-3735efca3ceb</guid><pubDate>Fri, 26 Jun 2026 00:00:00 GMT</pubDate><dc:creator>Owain Williams</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/54890332d339079c57bb0515ae40a5b16b0a7674c54ab499145e3e7e7d7a8076.png" type="image/jpeg" /></item><item><title>I'm an Umbraco MVP for the fifth year running!</title><link>https://www.nurhakkaya.com/2026/06/im-umbraco-mvp-for-fifth-year-running.html</link><guid isPermaLink="false">f614fb4c-04c9-4211-8cf9-84f494650e0c</guid><pubDate>Wed, 24 Jun 2026 14:04:05 GMT</pubDate><description>Every year, Umbraco recognises the people who have gone above and beyond with their contributions to Umbraco projects and community, and I am pleased to announce that I am honoured to be renewed as an Umbraco MVP for the fifth consecutive year. To celebrate this achievement, I also wrote an article which you can read here. Thank you, Umbraco, and the Umbraco community, for their fantastic support in making this happen once more! #h5yr</description><dc:creator>Nurhak Kaya</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/2f866159981f82e7ca8eb7a22d730a4d20bb38f96b2ed514a515413b62aa4582.png" type="image/jpeg" /></item><item><title>Validating an Umbraco 13 to 17 Upgrade with a Sitemap Audit</title><link>https://www.johanreitsma.com/blogs/validating-an-umbraco-13-to-17-upgrade-with-a-sitemap-audit/</link><guid isPermaLink="false">3e35e468-54f4-4e63-9db5-b7b36f2c1dd0</guid><pubDate>Wed, 24 Jun 2026 10:54:04 GMT</pubDate><description>How I used a small .NET console tool to crawl a sitemap, compare Umbraco 13 and 17 environments, and quickly find broken pages after an upgrade....</description><dc:creator>Johan Reitsma</dc:creator></item><item><title>You Never Know What'll Stick</title><link>https://www.linkedin.com/pulse/you-never-know-whatll-stick-briony-mckenzie-2bjie/</link><guid isPermaLink="false">dd5f07fe-6316-4e4a-b8c7-74d034e7be84</guid><pubDate>Wed, 24 Jun 2026 00:00:00 GMT</pubDate><description>On unconventional career paths, accidental dev tools, and great people. There</description><dc:creator>Briony McKenzie</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/bd90231bbb04d05e36198a93512b0a21f9dcb8c454532bf8f18ff4764ca90445.jpg" type="image/jpeg" /></item><item><title>Boost Your Workflow with Umbraco 17: Developer Productivity Hacks</title><link>https://www.dynamicdave.nl/blog/developer-productivity-hacks/</link><guid isPermaLink="false">4a8a6e81-696a-4ae7-a8ae-03db1223ca33</guid><pubDate>Tue, 23 Jun 2026 22:00:00 GMT</pubDate><description>As developers, we’re always searching for ways to get our work done faster. New frameworks roll out and promise to make us blazing fast, AI tools keep booming with talk about writing half our code, and if you’ve ever sat through a developer conference lately, you know there’s always a session on “How to be More Productive.” But after working with Umbraco since version 4, I have to be honest: those massive productivity leaps don’t really come from the shiny, new, revolutionary tools. It all comes down to friction. And not the dramatic, show-stopping kind. I mean those hundreds of tiny speed bumps scattered all over your day. A few extra clicks in the Umbraco backoffice. Rebuilding the same component again and again. Always double-checking a property alias. Waiting for your solution to spin up. Poring over a monster Razor file, desperately trying to recall where you put that chunk of markup. None of these feel like deal-breakers on their own, but stacked together? Suddenly, you’re delivering features at a crawl. What’s won me over with the latest Umbraco versions, especially Umbraco 17, is just how much more aligned the platform is with standard .NET development. It feels less like you’re wrestling with a quirky CMS and more like you’re just building .NET applications. There’s a real payoff: less fighting the system means more time solving real business problems.Over the years I’ve picked up quite a few habits that speed up Umbraco development and make it less painful—some are tied directly to Umbraco 17, while others are just hard-earned lessons from a decade of building websites. Here’s what’s helped the most for me.</description><dc:creator>Dave Jonker</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/08a887b56cdd5947d339782e9566412468569b9f5d018af092e896ac601a1875.jpg" type="image/jpeg" /></item><item><title>Extending Tiptap in Umbraco – a real world list example</title><link>https://dev.to/bernadet/extending-tiptap-in-umbraco-a-real-world-list-example-1hd1</link><guid isPermaLink="false">b3f2f2d5-41e4-4377-8382-1d255bd6d9c0</guid><pubDate>Tue, 23 Jun 2026 07:37:36 GMT</pubDate><description>If you've spent any time migrating editors or building rich-text features, you'll know Tiptap looks great on paper but sometimes feels a little... minimal compared to what TinyMCE shipped out of the box. At ilionx we've been moving a few large sites to Umbraco 17 and bumped into the same feedback: list style options. Nothing dramatic, just the ability to pick Roman numerals, different bullet shapes, that sort of thing, but enough to make editors ask for the old behavior back.

So we wrote a small TypeScript extension that adds back list-style variants. It gets built to App_Plugins with Vite, plugs into the UmbTiptapExtensionApiBase and wires up extra toolbar menu items. The actual extension is tiny, it just adds a listStyleType attribute to the list nodes and renders it as inline CSS, but the surrounding bits (icons, toolbar menus, wiring) make the UX feel polished.

Tiptap has solid docs on extending and creating extensions, and Umbraco documents how to register a Tiptap extension, but stitching everything together took a little trial and error. Below is the extension configuration we used. It looks like a lot for a simple feature, but a fair chunk of the files are just icons and small glue code.



Let’s start with the actual extension definitions in Umbraco-package.json, where we define 4 extensions:



"extensions": [
  {
    "type": "icons",
    "alias": "My.Icons.TiptapListStyle",
    "js": "/App_Plugins/My.TiptapListStyle/list-style-icons.js"
  },
  {
    "type": "tiptapExtension",
    "alias": "My.Tiptap.ListStyle",
    "api": "/App_Plugins/My.TiptapListStyle/list-style.tiptap-api.js",
    "meta": {
      "icon": "icon-ordered-list",
      "label": "List style type",
      "group": "#tiptap_extGroup_formatting"
    }
  },
  {
    "type": "tiptapToolbarExtension",
    "kind": "menu",
    "alias": "My.Tiptap.Toolbar.OrderedList",
    "overwrites": "Umb.Tiptap.Toolbar.OrderedList",
    "api": "/App_Plugins/ My.TiptapListStyle/ordered-list-menu.tiptap-toolbar-api.js",
    "forExtensions": ["My.Tiptap.ListStyle", " My.Tiptap.OrderedList"],
    "items": [
      {
        "label": "Numbered list",
        "data": null,
        "appearance": { "icon": "icon-ordered-list" }
      },
      {
        "label": "Numbered list: i, ii, iii",
        "data": "lower-roman",
        "appearance": { "icon": "icon-list-style-lower-roman" }
      },
      // add other style definitions here
    ] 
  },
  {
    "type": "tiptapToolbarExtension",
    "kind": "menu",
    "alias": " My.Tiptap.Toolbar.BulletList",
    "overwrites": "Umb.Tiptap.Toolbar.BulletList",
    "api": "/App_Plugins/My.TiptapListStyle/bullet-list-menu.tiptap-toolbar-api.js",
    "forExtensions": ["My.Tiptap.ListStyle", "Umb.Tiptap.BulletList"],
    "items": [
      {
        "label": "Bullet list",
        "data": null,
        "appearance": { "icon": "icon-bulleted-list" }
      },
      {
        "label": "Bullet list: circle",
        "data": "circle",
        "appearance": { "icon": "icon-list-style-bullet-circle" }
      },
      // add other style definitions here
    ]
  }
]






Here’s what we register:


an icon set (a bunch of tiny SVGs showing what each list style looks like)
one Tiptap extension which carries the list-style attribute
two toolbar extensions that replace the ordered/bulleted list buttons with menus that expose the variants.



  
  
  The icon set


The icons are trivial: I asked an AI to generate SVGs for different list markers and put each one in a tiny TypeScript file that exports the SVG string.



/** Ordered list with lower-roman markers (i, ii, iii). */
export default `i.ii.iii.`;






And a small registry file maps the icon names to those files:



export default [
  {
    name: 'icon-list-style-lower-roman',
    path: () =&gt; import('./icons/svg-ordered-list-lower-roman.js'),
  },
    //...
];






These images are purely to make the toolbar menus readable — a little UX polish so editors instantly recognise the option they’re picking.

 


  
  
  The Tiptap extension


The extension itself is surprisingly compact. It adds a listStyleType attribute to the built-in orderedList and bulletList nodes and serialises it as inline list-style-type style so the HTML stays portable and renders the same in the backoffice and on the front end.



import { Extension, UmbTiptapExtensionApiBase } from '@umbraco-cms/backoffice/tiptap';

/**
 * Extends the built-in orderedList and bulletList nodes with a `listStyleType`
 * attribute that maps to the CSS `list-style-type` property.
 *
 * The attribute is serialised as an inline style so the stored HTML is portable
 * and renders correctly both in the backoffice editor and on the front end.
 */
const ListStyleExtension = Extension.create({
  name: 'listStyle',

  addGlobalAttributes() {
    return [
      {
        types: ['orderedList', 'bulletList'],
        attributes: {
          listStyleType: {
            default: null,
            parseHTML: (element) =&gt; element.style.listStyleType || null,
            renderHTML: (attributes) =&gt; {
              if (!attributes['listStyleType']) return {};
              return { style: `list-style-type: ${attributes['listStyleType']}` };
            },
          },
        },
      },
    ];
  },
});

export default class ListStyleTiptapExtensionApi extends UmbTiptapExtensionApiBase {
  constructor(...args: ConstructorParameters) {
    super(...args);
    this.getTiptapExtensions = () =&gt; [ListStyleExtension];
  }
}






That’s it, the extension maps an attribute to CSS and makes sure works in both front- and backoffice. Nothing scary.


  
  
  The toolbar extensions


Because ordered and unordered lists are separate toolbar buttons, we overwrite each one with a menu that exposes the style variants. To avoid duplicating logic we put the toolbar behaviour into a single helper and import it from the two small extension files.

Each toolbar menu has to do a few things:


create a list if the selection isn’t in one
switch between ordered and bullet lists
toggle or set a specific list-style-type and reflect the active state in the menu UI.


That last bit is where the logic concentrates, the UI needs to show which style is active and allow toggling back to the default behaviour.

The per-list-type extension files look like this:



import { createListStyleMenuToolbarApi } from './list-style-menu-toolbar-api.js';

export default createListStyleMenuToolbarApi('bulletList');






And the shared toolbar helper contains the actual implementation and state logic:



import type { Editor } from '@umbraco-cms/backoffice/tiptap';
import { UmbTiptapToolbarElementApiBase } from '@umbraco-cms/backoffice/tiptap';

type ListStyleMenuItem = { data?: string | null };

function getStyleType(item?: ListStyleMenuItem): string | null | undefined {
  return item?.data;
}

function applyListStyle(
  editor: Editor,
  listType: 'orderedList' | 'bulletList',
  styleType: string,
): void {
  if (editor.isActive(listType)) {
    const currentStyle = editor.getAttributes(listType)['listStyleType'] as string | null;
    const newStyle = currentStyle === styleType ? null : styleType;
    editor.chain().focus().updateAttributes(listType, { listStyleType: newStyle }).run();
    return;
  }

  if (listType === 'orderedList') {
    editor
      .chain()
      .focus()
      .toggleOrderedList()
      .updateAttributes('orderedList', { listStyleType: styleType })
      .run();
  } else {
    editor
      .chain()
      .focus()
      .toggleBulletList()
      .updateAttributes('bulletList', { listStyleType: styleType })
      .run();
  }
}

function applyDefaultList(editor: Editor, listType: 'orderedList' | 'bulletList'): void {
  if (editor.isActive(listType)) {
    const currentStyle = editor.getAttributes(listType)['listStyleType'] as string | null;
    if (currentStyle) {
      editor.chain().focus().updateAttributes(listType, { listStyleType: null }).run();
      return;
    }
    if (listType === 'orderedList') {
      editor.chain().focus().toggleOrderedList().run();
    } else {
      editor.chain().focus().toggleBulletList().run();
    }
    return;
  }

  if (listType === 'orderedList') {
    editor.chain().focus().toggleOrderedList().run();
  } else {
    editor.chain().focus().toggleBulletList().run();
  }
}

/**
 * Toolbar menu API for ordered/bullet list buttons with list-style-type variants.
 */
export function createListStyleMenuToolbarApi(listType: 'orderedList' | 'bulletList') {
  return class extends UmbTiptapToolbarElementApiBase {
    override isActive(editor?: Editor, item?: ListStyleMenuItem): boolean {
      if (!editor) return false;

      const styleType = getStyleType(item);
      if (styleType === undefined) {
        return editor.isActive(listType);
      }

      if (styleType === null) {
        const currentStyle = editor.getAttributes(listType)['listStyleType'] as string | null;
        return editor.isActive(listType) &amp;&amp; currentStyle === null;
      }

      return editor.isActive(listType, { listStyleType: styleType });
    }

    override execute(editor?: Editor, item?: ListStyleMenuItem): void {
      if (!editor) return;

      const styleType = getStyleType(item);
      if (styleType === undefined || styleType === null) {
        applyDefaultList(editor, listType);
        return;
      }

      applyListStyle(editor, listType, styleType);
    }
  };
}







  
  
  TODO / caveats


I’m still getting comfortable with TypeScript, so this isn't a 100%-polished extension. One known quirk: clicking a custom style button after setting a style will clear the style but not fully remove the list node the way the stock ordered/bullet button does. It's a small UX edge-case and likely fixable by tweaking the toggle logic, but I haven't had time for it yet.

If you want to copy this approach, the important bits are:


expose a listStyleType attribute on the list nodes,
serialize it in a way that works in both editor and front end (inline style is the simplest)
replace the toolbar buttons with menus that set/update that attribute.


Hopefully this saves you a few hours of experimentation. The overall idea is small, but the payoff for editors is surprisingly nice.</description><dc:creator>Bernadet Goey</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/dd5f5e3532785bf7b6242cfc14fa4b829e6da8cedd410f0439b2fb2668beb873.webp" type="image/jpeg" /></item><item><title>My First CodeGarden: AI, Umbraco 17 and 18, and Why I</title><link>https://www.linkedin.com/pulse/my-first-codegarden-ai-umbraco-17-18-why-im-excited-build-murthy-3ncxe/</link><guid isPermaLink="false">713122ee-d074-4285-9424-ea3cc7b4b1df</guid><pubDate>Tue, 23 Jun 2026 00:00:00 GMT</pubDate><description>This was my first time travelling to Copenhagen, and my first ever CodeGarden, and what a way to start. I went over with Luca Colella and Kat Dixon and we had a brilliant couple of days.</description><dc:creator>Raghavendra Murthy</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/382782e206cfb89af3d819cad2272450d2f8d5aeacd904c969d0554211782c0c.png" type="image/jpeg" /></item><item><title>What Codegarden Inspired Me to Build Next</title><link>https://markmcdonald.dev/writing/what-codegarden-inspired-me-to-build-next/</link><guid isPermaLink="false">ea4b1333-c829-4b2e-ad93-9bbae2cc4f09</guid><pubDate>Mon, 22 Jun 2026 00:00:00 GMT</pubDate><description>What I learned building an AI-assisted pipeline that maps existing sites into reusable Umbraco components.</description><dc:creator>Mark McDonald</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/33cb9a0c0f2eae76b7436cc531f1fda947d82e0720ecdf782df6d19350ac20e7.png" type="image/jpeg" /></item><item><title>Codegarden 2026: Ubuntu</title><link>https://umbuntu.uk/blog/codegarden-2026-ubuntu/</link><guid isPermaLink="false">bb7a591e-a613-4cee-9ac5-0c22167de8a4</guid><pubDate>Mon, 22 Jun 2026 00:00:00 GMT</pubDate><description>"I am because we are"</description><dc:creator>Mitchell Nortje</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/4d8eb616c0bc38953d8806d928c5f1ffccbb835ddc0ce9a53a8973c1fbe1378b.jpg" type="image/jpeg" /></item><item><title>Extending Umbraco's Extensions: A Codegarden Workshop You Can Try Yourself</title><link>https://cornehoskam.com/posts/extending-umbracos-extensions-a-codegarden-workshop-you-can-try-yourself/</link><guid isPermaLink="false">b2f14cc2-43e7-478a-9e53-facdcf1a61b7</guid><pubDate>Mon, 22 Jun 2026 00:00:00 GMT</pubDate><description>Clone and try our four-hour Codegarden workshop on extending Umbraco's extensions: an escape room of coding quests across Engage, Workflow and Deploy.</description><dc:creator>Corné Hoskam</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/e719a063d7311442ffd853c6eb8f3adfcfc50121e75b32699cd92304ef454ac3.jpg" type="image/jpeg" /></item><item><title>It's Coffee Time!</title><link>https://owain.codes/blog/2026/june/its-coffee-time/</link><guid isPermaLink="false">79fa4d08-39a0-4a36-b48d-51dd40b080b8</guid><pubDate>Mon, 22 Jun 2026 00:00:00 GMT</pubDate><dc:creator>Owain Williams</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/6c42db520e605588eccfe1618ee4b933e197d5721378b4cbe38655dfe4dda367.png" type="image/jpeg" /></item><item><title>The most interesting thing at CodeGarden wasn</title><link>https://www.linkedin.com/pulse/most-interesting-thing-codegarden-wasnt-feature-adam-shallcross-cmxwe/</link><guid isPermaLink="false">5bd4884b-490d-421c-82b3-c70f775d224b</guid><pubDate>Mon, 22 Jun 2026 00:00:00 GMT</pubDate><description>There were plenty of shiny things to look at this year. New content types, a workflow engine, hosted servers you can spin up in minutes.</description><dc:creator>Adam Shallcross</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/74590682484361c9567418afafc1e5b60b0c7b29093c9738b26d3931592e3419.png" type="image/jpeg" /></item><item><title>Codegarden 2026 and the next chapter for Umbraco | Shout Digital</title><link>https://www.shoutdigital.com/insights/codegarden-2026-and-the-next-chapter-for-umbraco/</link><guid isPermaLink="false">7b944c30-5a7b-4539-8320-248be30300c6</guid><pubDate>Fri, 19 Jun 2026 00:00:00 GMT</pubDate><description>AI, automation, community - Umbraco MVP Ian Grieve talks about his key takeaways from Copenhagen.</description><dc:creator>Ian Grieve</dc:creator></item><item><title>Copenhagen, Codegarden, and My First Year as an Umbraco MVP</title><link>https://www.nathanielnunes.com/blog/umbraco-mvp-codegarden-2026</link><guid isPermaLink="false">ae4adfcd-8c06-4fca-b034-8c296daaf49f</guid><pubDate>Thu, 18 Jun 2026 11:30:00 GMT</pubDate><description>My first year as an Umbraco MVP: receiving the award at Codegarden 2026 in Copenhagen, the MVP Summit, the sessions, the people, and the moments between.</description><dc:creator>Nathaniel Nunes</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/783a2042aae4acb811b002668d5a59eda93726d0f0283ff05cd26cd927365f5b.png" type="image/jpeg" /></item><item><title>Tilbake fra København og Umbraco Codegarden 2026! 🇩🇰</title><link>https://frytom.org/2026/06/13/tilbake-fra-kobenhavn-og-umbraco-codegarden-2026-%F0%9F%87%A9%F0%9F%87%B0/</link><guid isPermaLink="false">d1f2a0d6-ac9a-44c6-acc7-325a1f5a6fba</guid><pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate><description>Noen dager fylt med faglig påfyll, gode samtaler og sterke relasjoner — det er alltid noe eget med Codegarden. Umbraco-communityet er ikke en kult, men… det er kanskje det nærmeste vi kommer …</description><dc:creator>Tom Erik Rozmara Frydenlund</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/4383dd60893847885b522cb9ad59e2f24f03f65aae3a768a45160f0c428a92fb.jpg" type="image/jpeg" /></item><item><title>My First Umbraco Codegarden: More Than Stickers and T-Shirts</title><link>https://www.linkedin.com/pulse/my-first-umbraco-codegarden-more-than-stickers-t-shirts-dave-jonker-tew6e/?trackingId=QknJFmSATw6wxaZj0VosrA%3D%3D</link><guid isPermaLink="false">66af1f8d-2b97-444d-9b14-7aa3bb12f72d</guid><pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate><description>After my blog was recently featured on umb.fyi — thanks to Matt Brailsford for that — I felt like I also owed the community a proper write-up about my very first Codegarden experience.</description><dc:creator>Dave Jonker</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/d655750f281bd6568cbecd53411e9d7110feb86783de401b6f17edfb21f3fa40.png" type="image/jpeg" /></item><item><title>Codegarden 2026 recap</title><link>https://owain.codes/blog/2026/june/codegarden-2026/</link><guid isPermaLink="false">5afc451a-08dc-4458-8704-f5d30edb012a</guid><pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate><dc:creator>Owain Williams</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/7b83e690f804de992e07317d629859c2f8ea5c3978eac78a8cb3b30c7d9d0ef2.png" type="image/jpeg" /></item><item><title>Codegarden 26 : a review</title><link>https://medium.com/@ravimotha/codegarden-26-a-review-aa35c60e3b08?source=rss-8e76be83b03f------2</link><guid isPermaLink="false">4b418492-8dec-4929-8c7a-515b7ffb1298</guid><pubDate>Wed, 17 Jun 2026 17:42:48 GMT</pubDate><dc:creator>Ravi Motha</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/88c5773573b60c3a1c0859ce793ed62df55aa2006903e2872459cc81660bc1ca.jpg" type="image/jpeg" /></item><item><title>My Codegarden 2026 highlights</title><link>https://www.jeroenbreuer.nl/blog/my-codegarden-2026-highlights/</link><guid isPermaLink="false">38b4d6b3-f41a-4a60-999f-219eb4ec2913</guid><pubDate>Wed, 17 Jun 2026 14:26:59 GMT</pubDate><description>A summary of my Codegarden 2026 highlights.</description><dc:creator>Jeroen Breuer</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/4c07ec88451c2c62f6df8148fd2d50dc4d0f678e81a7d88492111c26b04f8f82.jpg" type="image/jpeg" /></item><item><title>Umbraco Package: Automate Inspector</title><link>https://jcdc.dev/blog/umbraco-package-automate-inspector</link><guid isPermaLink="false">ea2298b7-b19d-45a1-b34a-da9d1bf2a2b1</guid><pubDate>Wed, 17 Jun 2026 07:00:00 GMT</pubDate><description>Explore everything Umbraco Automate has to offer with this new community package!</description><dc:creator>James Carter</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/526ea9d7f1421c7256c1a6780746b22432395ba8a077e687330763d00932cebc.png" type="image/jpeg" /></item><item><title>Codegarden 2026 Road Report: Umbraco’s Bet on AI and Reusable Content | Blend Interactive</title><link>https://www.blendinteractive.com/thoughts/codegarden-2026/</link><guid isPermaLink="false">4c9b77c2-d771-43e8-a245-c34f228856c4</guid><pubDate>Wed, 17 Jun 2026 00:00:00 GMT</pubDate><description>A road report from Codegarden 2026 — Umbraco</description><dc:creator>Joe Kepley</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/cebb1916485666bfcfc2648503cf51a4be6acd57ffae2d8b596af7981e6a116d.png" type="image/jpeg" /></item><item><title>Codegarden 2026: I went to Copenhagen for a week</title><link>https://aaronsadler.dev/blog/2026/june/16/codegarden-2026-i-went-to-copenhagen-for-a-week</link><guid isPermaLink="false">6a8d6551-f9bb-4a4b-9427-6a57fd0403c6</guid><pubDate>Tue, 16 Jun 2026 00:00:00 GMT</pubDate><description>My week in Copenhagen for Codegarden 2026: the MVP Summit, the launch of Umbraco Automate, the sessions that stood out, and why I keep coming back. Continue reading</description><dc:creator>Aaron Sadler</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/d2a36bc50776c077a4067a9ceb84db853da02ebfe9d3476f34e60f650d5f8a3b.webp" type="image/jpeg" /></item><item><title>TipTap is not broken. Your expectations are.</title><link>https://dev.to/luukpeters/tiptap-is-not-broken-your-expectations-are-5h8m</link><guid isPermaLink="false">a75948fa-e5b9-4052-bdc9-95489f635a71</guid><pubDate>Mon, 15 Jun 2026 12:47:24 GMT</pubDate><description>Since the Umbraco 16 release, Umbraco ships only with the TipTap Rich Text Editor. This was unfortunately something that Umbraco was forced to do. TinyMce 7 has a license that is incompatible with the open source license of Umbraco and TinyMce 6 was going out of support. So an alternative had to be found.

Umbraco did a pretty good job at abstracting the rich text data. In Umbraco 15 both TinyMCE and TipTap were still present and exchangeable because of this abstraction. And arguably, the way you can set up your toolbars for the TipTap editor is superior to TinyMCE. But still, a new Rich Text Editor is a big change that presents real challenges.

These challenges are most obvious when looking at the Umbraco forum's tip-tap tag. Topics vary, but a few come up again and again:


Additional HTML tags getting added to the markup, like a  tag inside a 

The inability to add certain tags to TipTap, like  tags
The inability to add styling to an element, for instance to create a link that looks like a button


These are valid challenges, especially if you're upgrading from an existing TinyMCE setup. But this is also a good moment to ask two questions:



Why do I want the same behaviour?
And was the old behaviour actually any good to begin with?



  
  
  You don't have to migrate everything at once


Before getting into that, it's worth knowing that TinyMCE is still available as a community package for Umbraco 16+. If you're in the middle of a project, dealing with a large codebase, or just not ready to rethink your Rich Text Editor setup right now, that's a valid escape hatch. Swap in the package, keep things running, and give yourself time to migrate properly.

But "later" should still be on the roadmap. The package is community maintained, not an official Umbraco product, so there are no guarantees around long-term support or compatibility with future Umbraco versions. Relying on it indefinitely carries the same risk as the situation Umbraco just came out of with TinyMCE 6.

So use it if you need to. Just don't treat it as a permanent solution.


  
  
  The RTE is not a page builder


I'm not a big fan of giving editors too much freedom in a Rich Text Editor. Don't get me wrong, RTEs are great and help editors a lot. But give too much rope and things go wrong fast. My preference is for RTEs to handle the basics: adding a link, making text bold or italic, maybe a table if the frontend deals with it gracefully on mobile.

What I don't like is image placement and scaling inside an RTE. Without proper processing this is a problem for performance and mobile layouts. I also don't like HTML snippets or trying to add CSS classes to elements from within an editor. It's error prone, and if something breaks, you need HTML knowledge to fix it. That's not a realistic expectation for most editors.

So when people ask how to replicate that kind of behaviour in TipTap, I'd rather ask why they need it at all.


  
  
  Stop fighting the editor, start working with Umbraco


Instead of trying to make TipTap behave like TinyMCE did, consider using the tools Umbraco already gives you.

Need a link that looks like a button? Use a block inside the Rich Text Editor. TipTap has solid block support, and Umbraco exposes this well. You get a structured piece of content with its own view, its own properties, fully typed, fully renderable. An editor picks a "Button" block, fills in the label and the link and that's it. No CSS classes, no raw HTML, no risk of someone pasting style="color:red" into a script tag three months later.

Need a pull quote, a callout, a code snippet with syntax highlighting? Same answer. Model it as a block. Render it properly. Keep the RTE itself lean.

The argument I keep hearing is that recreating all of this takes more time than just making the old thing work again. That's sometimes true in the short term. But you're building something more maintainable, more predictable and more editor-friendly.

There's another reason to think twice before pouring effort into recreating editor-specific behaviour: Umbraco has already switched its default Rich Text Editor once. It could happen again. If your implementation leans heavily on workarounds and editor-specific quirks, you're setting yourself up for the same migration pain all over again. If instead your RTE is kept lean and the complex bits live in blocks with their own models and views, a future editor switch becomes much less of an event. The RTE just renders text. Everything interesting is already abstracted away.


  
  
  What about the extra markup?


The  inside  is worth addressing separately, because it looks like a bug but it isn't. TipTap is built on ProseMirror, which uses a strict document schema where every node needs to contain the right type of child node. For list items, that child is a block node and a paragraph is that block node. This is what makes editing reliable: without it, you can end up in situations where the cursor can't be placed inside a list item at all, or where deleting an item breaks unexpectedly.

This behaviour is not unique to TipTap. Any editor built on ProseMirror does the same thing, and that includes quite a few well-known ones. TinyMCE handled lists differently, but that doesn't make TinyMCE's approach the correct one.

If your frontend CSS breaks because of this, that's a one-time fix, typically just adjusting margin or display rules on li p. Once it's done, you're working with markup that is actually more structurally consistent than what TinyMCE produced.


  
  
  Closing thought


A new editor is disruptive. But disruption is also a chance to reconsider decisions that were made years ago under different constraints, maybe with less knowledge of what Umbraco could do, or just because TinyMCE made it easy and easy felt like good enough.

TipTap is not TinyMCE. It's not trying to be. And once you stop expecting it to be, you might find it pushes you toward solutions that are cleaner, better structured and easier to hand off to an editor who has no idea what a DOM is.

Work with the grain of the tool, not against it.</description><dc:creator>Luuk Peters</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/1ddc0afe5f42de804d617d45456b676586ec822f3f0838fd03da78ca37e3e262.webp" type="image/jpeg" /></item><item><title>I attended Umbraco Codegarden 2026!</title><link>https://dev.to/d_inventor/i-attended-umbraco-codegarden-2026-5dak</link><guid isPermaLink="false">161357b5-54e2-4f88-b774-2636f250f13f</guid><pubDate>Mon, 15 Jun 2026 07:00:00 GMT</pubDate><description>Codegarden was last week in Copenhagen! I was there this time and here are my thoughts about the event. Previous time I attended was in 2023, so I will draw some comparisons to that year. It was a great experience and I left feeling generally excited and inspired.


  
  
  Organization


Just like previous time, the event was very well-organized. At Codegarden, you're always well taken care of with lunch and dinner, great instructions, a little kick-off at the start of every day and a lot of spatial diversity. You always know what to expect.

I was very happy to see that the quiet area was easy to find and it was mentioned at the beginning of the event. The previous time I didn't know that such a quiet area existed and I spoke out about that. It gave me comfort that I knew where to retreat to when I needed to. Additionally, there were many places to stand or sit outside and inside. The event was also a little shorter, which made it more manageable for me.

The location was absolutely ideal for the amount of people that attended. There were many attendees (about 700 they said, if I remember correctly), but at no point did the venue feel crowded. I could always easily get to where I wanted to go, there were no long queues and there was always enough seats for all the talks at every stage.


  
  
  Talks


I'll admit that, on the previous Codegarden, I had the wrong expectations for the talks. Talks are obviously aimed at specific target audiences and I don't belong to all of them. Some talks aim to inform, while others aim to inspire. Stories are not tutorials. Also, sometimes a talk doesn't teach you something new, but simply validates what you were already doing.

So it was this time too. My focus is currently shifting slightly away from coding and more towards collaboration and I am looking for inspiration on how to deliver better software faster. I specifically wanted to attend Debugging Teams: What High-Performing Developer Teams Do Differently, because it seemed relevant to me. Although I was hoping for a deep analysis in development process and teamwork strategies, I ended up learning about the importance of trust and of sharing the "what", "how" and "why" of what we do. It surely gave me something to think about.

I listened to Building Resilient Umbraco Integrations. A more tutorial-style demonstration with insightful information about what you need to think about when integrating with external services. The presentation included concrete code examples that gave concrete solutions to the presented problems. I personally already knew all of it, but it was nice to see anyway, because it confirms that I'm already doing it right.

A special mention goes to Semira Allen and Jason Wodicka with their talks Drowning in Details: Turning TechTalk Into Everyday Language and How (not) to mess up everything. Their talks were incredibly engaging and they were a joy to listen to. I had a good laugh and they were each inspiring in their own ways.


  
  
  Some additional thoughts


Copenhagen: The fact that it was in Copenhagen was what made me consider it again. I am not big on traveling abroad and the trip to Odense and back was seriously daunting. Being able to get there with just the airplane made the whole trip so much better!
AI: I haven't mentioned AI in this blog. That's because I find the ethics of the application of AI at the moment very questionable. I am still working on forming a well-informed opinion. Umbraco and the community have showcased some very impressive work with AI.
Umbraco awards: In case you didn't know it yet: we were nominated for an Umbraco award for "Accessibility and Security"! Even though we didn't win the award, I believe that our submission was still the best. The winning solution had a more visible approach to accessibility, but we can show off a real certification of accessibility with end-user testimonies to back it up. The nomination is a nice validation of my team's hard work.
Umbraco in the bigger picture? Right now I am learning from people like Dave Farley, Emily Bache and Derek Comartin about better software development practices. Some of it is more about architecture and some of it is about collaboration and process. I feel like these topics deserve more attention in the Umbraco community. I need a talk named How I upgraded my mid-size web agency from feature branch and PR drag to real CI/CD. Maybe I get to give this talk myself one day, who knows.


  
  
  Conclusion


It was a great event, and I'm very happy that I could be there. If it's like this again next year, then I will be eager to attend. Thank you Umbraco for everything!</description><dc:creator>Dennis Heutinck</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/a512fe22734b65db108a32118a1b6a6ce436e155d59a30d4be3afeca9d426141.webp" type="image/jpeg" /></item><item><title>OC.Automate.Mastodon released</title><link>https://owain.codes/blog/2026/june/ocautomatemastodon-released/</link><guid isPermaLink="false">7de901d1-ee3d-4a4e-abc9-096021994b0c</guid><pubDate>Mon, 15 Jun 2026 00:00:00 GMT</pubDate><dc:creator>Owain Williams</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/017ca600b03de649b5895b3e3bfc1ad167909d92a1507ad55dd8e483585b398d.png" type="image/jpeg" /></item><item><title>Codegarden 2026: A Week in Copenhagen I Won't Forget</title><link>https://www.nevitech.co.uk/blog/codegarden-2026-a-week-in-copenhagen-i-wont-forget/</link><guid isPermaLink="false">233e382a-01d6-4b35-b86e-561899c22357</guid><pubDate>Sun, 14 Jun 2026 23:00:00 GMT</pubDate><description>Justin reflects on an unforgettable week at Codegarden 2026 in Copenhagen, where he was recognised as an Umbraco MVP, invited on stage during the keynote to demo his AI Log Analyser package, and won the AI Package Award.</description><dc:creator>Justin Neville</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/247740cc786f7c1e5471b667b3fece824be0bc51c1302b8e45fa9a9c24dd25ec.jpg" type="image/jpeg" /></item><item><title>My First Umbraco Codegarden: More Than Stickers and T-Shirts</title><link>https://www.dynamicdave.nl/blog/my-first-umbraco-codegarden/</link><guid isPermaLink="false">bbbc3e2f-5e98-47de-a90e-d1429527427a</guid><pubDate>Fri, 12 Jun 2026 22:00:00 GMT</pubDate><description>After my blog was recently featured on umb.fyi — thanks to Matt Brailsford for that — I felt like I also owed the community a proper write-up about my very first Codegarden experience.Because honestly, after finally attending for the first time, I completely understand why people keep talking about it long after the event is over.I’ve been building with Umbraco since version 4—that takes me back to 2012 or maybe 2013. After all those years, I finally made the pilgrimage: my first Codegarden. And wow, I get it now. I see why people talk about this thing like it’s some annual family reunion you can’t miss, not just a conference. All the stories you hear—about the talks, the people, those late nights that blur into early mornings—they're all real. Still, the heart of it isn’t just scavenging for stickers or filling your suitcase with t-shirts. It’s something deeper.What really struck me—and it hit pretty much as soon as I walked through the doors—is that sense of belonging. Suddenly you realize you’re a piece of something much bigger than just a CMS, a project, or a logo. You’re dropped right into the Umbraco community, and it’s almost impossible not to get swept up in that feeling.</description><dc:creator>Dave Jonker</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/37b8753df51dfc878243d50e387dc53f055dc1257cb85f002cde63150ece2d23.jpg" type="image/jpeg" /></item><item><title>Diagram and NATP Win Best Enterprise Solution at the 2026 Umbraco Awards</title><link>https://www.wearediagram.com/blog/diagram-wins-2026-umbraco-award-best-enterprise-solution</link><guid isPermaLink="false">bc80816d-7bd4-42f0-9765-11f0866ec590</guid><pubDate>Thu, 11 Jun 2026 20:46:10 GMT</pubDate><description>We’re excited to share that the National Association of Tax Professionals (NATP) website, designed and developed by Diagram, has been named Best Enterprise Solution at the 2026 Umbraco Awards.</description><dc:creator>Diagram</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/89bc9f8a392ec98a2fab46a72f5930bc182643db20a5366064b710ce703ee719.png" type="image/jpeg" /></item><item><title>Nominated for an Umbraco Solution Award</title><link>https://www.dynamicdave.nl/blog/nominated-for-an-umbraco-solution-award/</link><guid isPermaLink="false">0ee9de5e-4407-49b9-b854-3e315e18e3e4</guid><pubDate>Tue, 09 Jun 2026 22:00:00 GMT</pubDate><description>Feeling incredibly proud to have been nominated for an Umbraco Solution Award this year!</description><dc:creator>Dave Jonker</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/f9a225d9a3668c53d8f8063533dae3695078b95730f8857dce6d6f0b34ce6401.jpg" type="image/jpeg" /></item><item><title>CodeGarden-talk: Hybrid Cache changes everything</title><link>https://www.enkelmedia.se/blogg/2026/6/7/codegarden-talk-hybrid-cache-changes-everything?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=rss</link><guid isPermaLink="false">841e586f-3774-4f15-943b-a7d84c91aa7b</guid><pubDate>Sun, 07 Jun 2026 05:31:32 GMT</pubDate><description>I recently spent some time looking closer at the new HybridCache implementation in Umbraco to prepare for my presentation at CodeGarden 2026, and the short version is this: it changes more than just the cache layer.

Historically, Umbraco has been very good at keeping published content available in memory. That has made many common developer patterns feel cheap and convenient. Things like traversing content trees, using `.Children()`, `.Descendants()` and resolving references have often just worked without us thinking too much about the cost.
With HybridCache, that mental model changes. The cache is still there, but not everything necessarily lives in memory all the time.
The big win is scalability
The reason for this change is very easy to understand when looking at large Umbraco installations.
Keeping everything in memory can work beautifully for small and medium-sized sites, but it becomes painful when a site has hundreds of thousands of pages, many languages, or very large content structures. Startup time, memory usage and hosting constraints can become real problems.
HybridCache helps by reducing the memory footprint and making startup faster. Instead of loading everything into memory, Umbraco can seed important content and load other content when needed. That is a big architectural improvement.
The cost did not disappear
The interesting part, at least for me as a developer, is that the cost did not vanish. It moved.
Some operations that used to feel almost free can now become more expensive, especially on larger sites. Traversing a large tree, filtering over many children, or resolving many references may trigger more cache lookups or database access than before.
That does not mean HybridCache is bad. Quite the opposite. But it does mean we need to be more intentional about how we build things like menus, listings, sitemaps and search-driven pages.

Use the right tool for the job
One of my main takeaways is that we should stop treating the published content cache as the answer to everything.
For search and filtering, Examine is often a much better fit. For menus, footers and repeated structures, runtime cache or prebuilt DTOs can be a good option. For sitemaps, adding the right data to the index (e.g. URLs) can be much more scalable than traversing the whole content tree.
So the practical message is simple: measure, observe, and choose the right approach based on what the page actually needs to do.
HybridCache gives Umbraco a better foundation for large sites, but it also makes performance patterns more visible. And honestly, that is probably a good thing.
Download the slides
I’ve shared the full slide deck from the presentation if you want to dig into the examples, benchmarks and diagrams in more detail.
Download the slides</description><dc:creator>Markus Johansson</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/8deaecfadff1b0b589d22efb1380736a34b8be625d37ebf2e8173f52398dc19b.jpg" type="image/jpeg" /></item><item><title>Codegarden: What to bring (2026 edition!)</title><link>https://joe.gl/ombek/blog/codegarden-packing-list/</link><guid isPermaLink="false">58c35289-50d3-448e-abce-8e0c314d2d54</guid><pubDate>Thu, 04 Jun 2026 10:14:30 GMT</pubDate><description>Wow, hasn't time flown?! This weekend I'll be boarding my plane to Denmark ahead of Codegarden 2026 so it's about time we thought about packing our bags! But what to bring? If you've not been before, or if you're forgetful like I am, I've written you a packing list...</description><dc:creator>Joe Glombek</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/2c399f9af6aa8b01155985a7dfea95f7ed5a4f21a222e2990939686f013ab257.png" type="image/jpeg" /></item><item><title>Umbraco OpenID Connect example with lightweight external members</title><link>https://www.jeroenbreuer.nl/blog/umbraco-openid-connect-example-with-lightweight-external-members/</link><guid isPermaLink="false">e547bf8c-9056-4b31-8e4e-47f01df837ec</guid><pubDate>Tue, 02 Jun 2026 17:37:28 GMT</pubDate><description>The Umbraco OpenID Connect example has been updated to Umbraco 17.4.2 with support for lightweight external members . This stores members from an external provider as a minimal record instead of a full content entity.</description><dc:creator>Jeroen Breuer</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/5c8a66307324205cce6b96379b72c54dae57cdddec3f6dbe041279bbdcb7aba2.png" type="image/jpeg" /></item><item><title>Speed up slow deployments to Umbraco Cloud</title><link>https://owain.codes/blog/2026/june/speed-up-slow-deployments-to-umbraco-cloud/</link><guid isPermaLink="false">fffd4c8c-2ad6-49c5-a4e9-dd2639c520e0</guid><pubDate>Tue, 02 Jun 2026 00:00:00 GMT</pubDate><dc:creator>Owain Williams</dc:creator><enclosure url="https://community.umbraco.com/community-blog-images/439a28ebbc44bfa3faf591bcc78d00904058d8b132b56558ea65ea70e0223a64.png" type="image/jpeg" /></item></channel></rss>