<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>2026-06 on Funky Si's Blog (Dev)</title><link>https://blog-dev.funkysi1701.com/2026/06/</link><description>Recent content in 2026-06 on Funky Si's Blog (Dev)</description><generator>Hugo -- gohugo.io</generator><language>en-gb</language><managingEditor>funkysi1701@gmail.com (Simon Foster)</managingEditor><webMaster>funkysi1701@gmail.com (Simon Foster)</webMaster><lastBuildDate>Mon, 29 Jun 2026 18:00:00 +0000</lastBuildDate><atom:link href="https://blog-dev.funkysi1701.com/2026/06/index.xml" rel="self" type="application/rss+xml"/><item><title>.NET 5 to 10: features per release</title><link>https://blog-dev.funkysi1701.com/posts/2026/dotnet-5-to-10-features/</link><author>funkysi1701@gmail.com (funkysi1701)</author><pubDate>Mon, 29 Jun 2026 18:00:00 +0000</pubDate><guid>https://blog-dev.funkysi1701.com/posts/2026/dotnet-5-to-10-features/</guid><category term="DotNet">DotNet</category><category term=".NET5">.NET5</category><category term=".NET6">.NET6</category><category term=".NET7">.NET7</category><category term=".NET8">.NET8</category><category term=".NET9">.NET9</category><category term=".NET10">.NET10</category><category term="C-Sharp">C-Sharp</category><category term="Blazor">Blazor</category><category term="ASP.NETCore">ASP.NETCore</category><category term="VisualStudio">VisualStudio</category><media:content medium="image" type="image/png" url="https://blog-dev.funkysi1701.com/images/2026/dotnet-5-to-10-features.png"/><description>&lt;p&gt;Every November, &lt;a href="https://www.dotnetconf.net/" target="_blank" rel="noopener noreferrer"&gt;.NET Conf&lt;/a&gt;
brings a new major release of .NET. If you have been building on the platform since the early 2020s, you have watched the ecosystem move from &amp;ldquo;.NET Core&amp;rdquo; to a single, unified .NET — and pick up minimal APIs, Native AOT, Blazor full stack, Aspire, and a steady stream of C# language improvements along the way.&lt;/p&gt;
&lt;p&gt;This post is a guided tour of what landed in each major version from &lt;strong&gt;.NET 5&lt;/strong&gt; through &lt;strong&gt;.NET 10&lt;/strong&gt;. It is not exhaustive — Microsoft ships hundreds of changes per release — but it should help you remember which version introduced what, and where to dig deeper.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Version&lt;/th&gt;
&lt;th&gt;Released&lt;/th&gt;
&lt;th&gt;Support type&lt;/th&gt;
&lt;th&gt;C# version&lt;/th&gt;
&lt;th&gt;Status (June 2026)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;.NET 5&lt;/td&gt;
&lt;td&gt;Nov 2020&lt;/td&gt;
&lt;td&gt;STS (18 months)&lt;/td&gt;
&lt;td&gt;C# 9&lt;/td&gt;
&lt;td&gt;End of support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.NET 6&lt;/td&gt;
&lt;td&gt;Nov 2021&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;LTS&lt;/strong&gt; (3 years)&lt;/td&gt;
&lt;td&gt;C# 10&lt;/td&gt;
&lt;td&gt;End of support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.NET 7&lt;/td&gt;
&lt;td&gt;Nov 2022&lt;/td&gt;
&lt;td&gt;STS (18 months)&lt;/td&gt;
&lt;td&gt;C# 11&lt;/td&gt;
&lt;td&gt;End of support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.NET 8&lt;/td&gt;
&lt;td&gt;Nov 2023&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;LTS&lt;/strong&gt; (3 years)&lt;/td&gt;
&lt;td&gt;C# 12&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.NET 9&lt;/td&gt;
&lt;td&gt;Nov 2024&lt;/td&gt;
&lt;td&gt;STS (2 years)&lt;/td&gt;
&lt;td&gt;C# 13&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.NET 10&lt;/td&gt;
&lt;td&gt;Nov 2025&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;LTS&lt;/strong&gt; (3 years)&lt;/td&gt;
&lt;td&gt;C# 14&lt;/td&gt;
&lt;td&gt;Current LTS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.NET 11&lt;/td&gt;
&lt;td&gt;Nov 2026&lt;/td&gt;
&lt;td&gt;Preview&lt;/td&gt;
&lt;td&gt;C# 15&lt;/td&gt;
&lt;td&gt;Preview Until Nov 2026 then STS&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;For the full release schedule and patch versions, see the official &lt;a href="https://learn.microsoft.com/en-us/dotnet/core/releases-and-support" target="_blank" rel="noopener noreferrer"&gt;.NET releases&lt;/a&gt;
documentation.&lt;/p&gt;
&lt;h2 id="net-5--november-2020"&gt;.NET 5 — November 2020&lt;a class="anchor ms-1" href="#net-5--november-2020" aria-label="Permalink: .NET 5 — November 2020"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;.NET 5 was the first release after the &amp;ldquo;Core&amp;rdquo; branding was dropped. Version 4.x was skipped deliberately so nobody confused it with .NET Framework 4.x. The message was clear: this is the main implementation of .NET going forward, not a side project.&lt;/p&gt;
&lt;h3 id="platform-and-runtime"&gt;Platform and runtime&lt;a class="anchor ms-1" href="#platform-and-runtime" aria-label="Permalink: Platform and runtime"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Unified vision&lt;/strong&gt; — one BCL and runtime targeting cloud, desktop, web, mobile, and IoT (the full unification completed in .NET 6).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Single-file applications&lt;/strong&gt; and improved &lt;strong&gt;app trimming&lt;/strong&gt; for smaller deployments.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ClickOnce&lt;/strong&gt; publishing for .NET (Windows).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ARM64&lt;/strong&gt; support on Windows.&lt;/li&gt;
&lt;li&gt;Performance work across the runtime, GC, and networking stack.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="c-9"&gt;C# 9&lt;a class="anchor ms-1" href="#c-9" aria-label="Permalink: C# 9"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;C# 9 shipped alongside .NET 5 and brought several features that are now everyday tools:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Records&lt;/strong&gt; — reference types with value-based equality and &lt;code&gt;with&lt;/code&gt; expressions for non-destructive mutation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Init-only setters&lt;/strong&gt; — immutable object initialisation without verbose constructors.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Top-level statements&lt;/strong&gt; — less boilerplate in small console apps.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pattern matching&lt;/strong&gt; — relational patterns (&lt;code&gt;&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;&lt;/code&gt;, &lt;code&gt;and&lt;/code&gt;, &lt;code&gt;or&lt;/code&gt;, &lt;code&gt;not&lt;/code&gt;) and improved &lt;code&gt;switch&lt;/code&gt; expressions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Source generators&lt;/strong&gt; — compile-time code generation (the foundation for later JSON and logging generators).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="libraries-and-frameworks"&gt;Libraries and frameworks&lt;a class="anchor ms-1" href="#libraries-and-frameworks" aria-label="Permalink: Libraries and frameworks"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;EF Core 5&lt;/strong&gt; — split queries, table-per-entity (TPE) mapping, and Cosmos DB improvements.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ASP.NET Core&lt;/strong&gt; in the 5.x line — gRPC improvements, HTTP/2 and HTTP/3 groundwork, and Blazor WebAssembly performance gains.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;System.Text.Json&lt;/strong&gt; — constructor and parameterised constructor support, &lt;code&gt;[JsonIgnore]&lt;/code&gt; on properties, and better options for ignoring cycles.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;.NET 5 reached end of support in May 2022. If you still have projects on it, plan an upgrade — there are no security patches.&lt;/p&gt;
&lt;h2 id="net-6--november-2021-lts"&gt;.NET 6 — November 2021 (LTS)&lt;a class="anchor ms-1" href="#net-6--november-2021-lts" aria-label="Permalink: .NET 6 — November 2021 (LTS)"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;.NET 6 delivered on the unification promise: one SDK, one base class library, and one runtime across mobile, desktop, IoT, and cloud. It was an &lt;strong&gt;LTS&lt;/strong&gt; release and became the baseline many teams standardised on.&lt;/p&gt;
&lt;h3 id="developer-experience"&gt;Developer experience&lt;a class="anchor ms-1" href="#developer-experience" aria-label="Permalink: Developer experience"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hot reload&lt;/strong&gt; in Visual Studio 2022 and &lt;code&gt;dotnet watch&lt;/code&gt; — edit code and see changes without a full restart.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Minimal APIs&lt;/strong&gt; — build HTTP APIs with far less ceremony than traditional controllers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SDK workloads&lt;/strong&gt; — optional components (MAUI, Blazor WebAssembly AOT, and others) install via &lt;code&gt;dotnet workload&lt;/code&gt; instead of bloating the default SDK.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Project templates modernised&lt;/strong&gt; — top-level statements, file-scoped namespaces, nullable reference types, and &lt;code&gt;async Main&lt;/code&gt; in new projects.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="c-10"&gt;C# 10&lt;a class="anchor ms-1" href="#c-10" aria-label="Permalink: C# 10"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;global using&lt;/code&gt; directives&lt;/li&gt;
&lt;li&gt;File-scoped namespaces&lt;/li&gt;
&lt;li&gt;Record structs&lt;/li&gt;
&lt;li&gt;Improved interpolated strings and constant interpolated strings&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AsyncMethodBuilder&lt;/code&gt; attribute for custom async method builders&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="runtime-and-libraries"&gt;Runtime and libraries&lt;a class="anchor ms-1" href="#runtime-and-libraries" aria-label="Permalink: Runtime and libraries"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DateOnly&lt;/strong&gt; and &lt;strong&gt;TimeOnly&lt;/strong&gt; — separate date and time types without carrying a full &lt;code&gt;DateTime&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PriorityQueue&amp;lt;TElement, TPriority&amp;gt;&lt;/strong&gt; — a built-in min-heap.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;System.Text.Json&lt;/strong&gt; source generator, writeable &lt;strong&gt;JsonNode&lt;/strong&gt; DOM, and &lt;code&gt;IAsyncEnumerable&lt;/code&gt; serialisation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTTP/3&lt;/strong&gt; preview support via QUIC.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OpenTelemetry&lt;/strong&gt; metrics APIs in &lt;code&gt;System.Diagnostics.Metrics&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;FileStream&lt;/strong&gt; rewrite for better async performance on Windows.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Arm64&lt;/strong&gt; support for macOS (&amp;ldquo;Apple Silicon&amp;rdquo;) and Windows, with side-by-side x64 and Arm64 installs.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="aspnet-core-6"&gt;ASP.NET Core 6&lt;a class="anchor ms-1" href="#aspnet-core-6" aria-label="Permalink: ASP.NET Core 6"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Minimal APIs as a first-class style for microservices.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Blazor&lt;/strong&gt; components renderable from JavaScript; AOT compilation for Blazor WebAssembly.&lt;/li&gt;
&lt;li&gt;Improved gRPC and SignalR performance.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="net-maui"&gt;.NET MAUI&lt;a class="anchor ms-1" href="#net-maui" aria-label="Permalink: .NET MAUI"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;.NET Multi-platform App UI arrived in preview with .NET 6 — one codebase for Android, iOS, macOS, and Windows native apps. GA followed in 2022.&lt;/p&gt;
&lt;p&gt;.NET 6 LTS ended in November 2024.&lt;/p&gt;
&lt;h2 id="net-7--november-2022"&gt;.NET 7 — November 2022&lt;a class="anchor ms-1" href="#net-7--november-2022" aria-label="Permalink: .NET 7 — November 2022"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;.NET 7 was a &lt;strong&gt;standard-term support&lt;/strong&gt; release focused heavily on performance, cloud-native patterns, and polishing the developer experience. I wrote about &lt;a href="https://blog-dev.funkysi1701.com/posts/2022/dotnet7/"&gt;upgrading to .NET 7&lt;/a&gt;
at the time — mostly smooth, with a few surprises around AutoMapper and EF Core triggers.&lt;/p&gt;
&lt;h3 id="c-11"&gt;C# 11&lt;a class="anchor ms-1" href="#c-11" aria-label="Permalink: C# 11"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Raw string literals&lt;/strong&gt; — multi-line strings without escape-character pain.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;required&lt;/code&gt; members&lt;/strong&gt; — enforce initialisation at compile time.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generic math&lt;/strong&gt; — static abstract interface members for numeric generics.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;List patterns&lt;/strong&gt; — &lt;code&gt;if (list is [var first, .., var last])&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UTF-8 string literals&lt;/strong&gt; — &lt;code&gt;u8&lt;/code&gt; suffix for byte-oriented APIs.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="aspnet-core-7"&gt;ASP.NET Core 7&lt;a class="anchor ms-1" href="#aspnet-core-7" aria-label="Permalink: ASP.NET Core 7"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Rate limiting middleware&lt;/strong&gt; — built-in protection against abuse.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Output caching&lt;/strong&gt; — cache entire responses at the framework level.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Minimal API improvements&lt;/strong&gt; — route groups, typed results, and filters.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Native AOT&lt;/strong&gt; for console apps — smaller, faster-starting binaries (ASP.NET Core AOT came in .NET 8).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="performance-and-tooling"&gt;Performance and tooling&lt;a class="anchor ms-1" href="#performance-and-tooling" aria-label="Permalink: Performance and tooling"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Continued JIT and GC improvements; &lt;strong&gt;Native AOT&lt;/strong&gt; publishing matured.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Regex source generator&lt;/strong&gt; for compile-time pattern compilation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Library multi-targeting&lt;/strong&gt; and package validation tooling for NuGet authors.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;.NET 7 reached end of support in May 2024.&lt;/p&gt;
&lt;h2 id="net-8--november-2023-lts"&gt;.NET 8 — November 2023 (LTS)&lt;a class="anchor ms-1" href="#net-8--november-2023-lts" aria-label="Permalink: .NET 8 — November 2023 (LTS)"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;.NET 8 is the current-generation &lt;strong&gt;LTS&lt;/strong&gt; baseline for many production workloads (supported until November 2026). It is the release where cloud-native tooling, Native AOT for web apps, and modern C# really clicked together.&lt;/p&gt;
&lt;h3 id="c-12"&gt;C# 12&lt;a class="anchor ms-1" href="#c-12" aria-label="Permalink: C# 12"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Primary constructors&lt;/strong&gt; — declare constructor parameters on the type declaration.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Collection expressions&lt;/strong&gt; — &lt;code&gt;[1, 2, 3]&lt;/code&gt; syntax for arrays, spans, and lists.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Alias any type&lt;/strong&gt; — &lt;code&gt;using Point = (int X, int Y);&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Default lambda parameters&lt;/strong&gt; — optional parameters in lambdas.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="aspnet-core-8"&gt;ASP.NET Core 8&lt;a class="anchor ms-1" href="#aspnet-core-8" aria-label="Permalink: ASP.NET Core 8"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Blazor full stack&lt;/strong&gt; — server-side rendering, streaming rendering, and enhanced interactivity models in one framework.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Native AOT&lt;/strong&gt; for ASP.NET Core — ahead-of-time compilation for web workloads.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Keyed dependency injection&lt;/strong&gt; — register and resolve multiple implementations of the same interface by key.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Frozen collections&lt;/strong&gt; — optimised read-only collections for hot paths.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TimeProvider&lt;/strong&gt; — abstract time for testable code.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="net-aspire-now-just-called-aspire"&gt;.NET Aspire (now just called Aspire)&lt;a class="anchor ms-1" href="#net-aspire-now-just-called-aspire" aria-label="Permalink: .NET Aspire (now just called Aspire)"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://blog-dev.funkysi1701.com/posts/2024/aspire/"&gt;.NET Aspire&lt;/a&gt;
launched in preview with .NET 8 — an opinionated stack for observable, distributed applications. AppHost orchestrates dependencies; ServiceDefaults wire up OpenTelemetry, health checks, and resilience. I have been using it for local microservice development and it removes a lot of port-and-connection-string drudgery. In 2025 .Net Aspire was rebranded to Aspire and version 13 was released (don&amp;rsquo;t ask why 13, but I believe it was so it was no longer tied to .NET releases)&lt;/p&gt;
&lt;h3 id="other-highlights"&gt;Other highlights&lt;a class="anchor ms-1" href="#other-highlights" aria-label="Permalink: Other highlights"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;EF Core 8&lt;/strong&gt; — complex types, primitive collections, JSON column mapping, &lt;code&gt;HierarchyId&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NuGet Audit&lt;/strong&gt; — warnings when packages have known vulnerabilities.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Windows Forms and WPF&lt;/strong&gt; improvements — DPI, data binding, and hardware acceleration.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Source generators&lt;/strong&gt; for COM interop and configuration binding.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="net-9--november-2024"&gt;.NET 9 — November 2024&lt;a class="anchor ms-1" href="#net-9--november-2024" aria-label="Permalink: .NET 9 — November 2024"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;.NET 9 continued the annual cadence with performance, AI integration, and polish across the stack. I covered several highlights in my &lt;a href="https://blog-dev.funkysi1701.com/posts/2024/dotnet9/"&gt;.NET 9 post&lt;/a&gt;
when it shipped.&lt;/p&gt;
&lt;h3 id="c-13"&gt;C# 13&lt;a class="anchor ms-1" href="#c-13" aria-label="Permalink: C# 13"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;params&lt;/code&gt; collections&lt;/strong&gt; — &lt;code&gt;params&lt;/code&gt; works with &lt;code&gt;Span&amp;lt;T&amp;gt;&lt;/code&gt;, &lt;code&gt;ReadOnlySpan&amp;lt;T&amp;gt;&lt;/code&gt;, and collection types beyond arrays.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;lock&lt;/code&gt; on &lt;code&gt;System.Object&lt;/code&gt;&lt;/strong&gt; — the &lt;code&gt;lock&lt;/code&gt; statement can use more types safely.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Partial properties and indexers&lt;/strong&gt; — split declarations across files.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Escape sequence &lt;code&gt;\e&lt;/code&gt;&lt;/strong&gt; for the ESC character.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="platform-and-libraries"&gt;Platform and libraries&lt;a class="anchor ms-1" href="#platform-and-libraries" aria-label="Permalink: Platform and libraries"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Performance&lt;/strong&gt; — runtime, GC, and JIT improvements across the board; the team publishes detailed benchmark posts each release.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI abstractions&lt;/strong&gt; — &lt;code&gt;Microsoft.Extensions.AI&lt;/code&gt; packages unify access to language models and embeddings from different providers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NuGet Audit&lt;/strong&gt; defaults to reporting &lt;strong&gt;transitive&lt;/strong&gt; dependency vulnerabilities (opt back to direct-only with &lt;code&gt;&amp;lt;NuGetAuditMode&amp;gt;direct&amp;lt;/NuGetAuditMode&amp;gt;&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OpenTelemetry&lt;/strong&gt; enhancements and better observability defaults.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="aspnet-core-9-and-blazor"&gt;ASP.NET Core 9 and Blazor&lt;a class="anchor ms-1" href="#aspnet-core-9-and-blazor" aria-label="Permalink: ASP.NET Core 9 and Blazor"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;MapStaticAssets()&lt;/code&gt;&lt;/strong&gt; — fingerprinted, cache-friendly static files replace &lt;code&gt;UseStaticFiles()&lt;/code&gt; for Blazor and modern web apps.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Blazor&lt;/strong&gt; component state persistence, improved form handling, and better WebAssembly performance.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;.NET Aspire 9&lt;/strong&gt; — dashboard improvements, deployment tooling, and more community integrations.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;.NET 9 is &lt;strong&gt;standard-term support&lt;/strong&gt; until November 2026.&lt;/p&gt;
&lt;h2 id="net-10--november-2025-lts"&gt;.NET 10 — November 2025 (LTS)&lt;a class="anchor ms-1" href="#net-10--november-2025-lts" aria-label="Permalink: .NET 10 — November 2025 (LTS)"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;.NET 10 is the current &lt;strong&gt;LTS&lt;/strong&gt; release (supported until November 2028). If you are choosing a version for a new project in 2026, this is the long-term bet.&lt;/p&gt;
&lt;h3 id="c-14"&gt;C# 14&lt;a class="anchor ms-1" href="#c-14" aria-label="Permalink: C# 14"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Field-backed properties&lt;/strong&gt; — use the &lt;code&gt;field&lt;/code&gt; keyword when you outgrow auto-properties.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;nameof&lt;/code&gt; for unbound generics&lt;/strong&gt; — e.g. &lt;code&gt;nameof(List&amp;lt;&amp;gt;)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Implicit &lt;code&gt;Span&amp;lt;T&amp;gt;&lt;/code&gt; conversions&lt;/strong&gt; — less ceremony at API boundaries.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;ref&lt;/code&gt;/&lt;code&gt;out&lt;/code&gt;/&lt;code&gt;in&lt;/code&gt; in lambdas&lt;/strong&gt; without explicit parameter types.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Extension blocks&lt;/strong&gt; — static extension methods and properties in a dedicated syntax.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Null-conditional assignment&lt;/strong&gt; (&lt;code&gt;?.=&lt;/code&gt;) and user-defined compound assignment operators.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="runtime-and-libraries-1"&gt;Runtime and libraries&lt;a class="anchor ms-1" href="#runtime-and-libraries-1" aria-label="Permalink: Runtime and libraries"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;JIT improvements&lt;/strong&gt; — better inlining, devirtualisation, and loop inversion.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AVX10.2&lt;/strong&gt; support for SIMD workloads.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Native AOT&lt;/strong&gt; enhancements and improved struct argument code generation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JSON&lt;/strong&gt; — stricter serialisation options, &lt;code&gt;PipeReader&lt;/code&gt; support, duplicate property handling.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Post-quantum cryptography&lt;/strong&gt; — expanded ML-DSA and related APIs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;WebSocketStream&lt;/code&gt;&lt;/strong&gt; — simpler WebSocket usage; TLS 1.3 on macOS clients.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="sdk-and-tooling"&gt;SDK and tooling&lt;a class="anchor ms-1" href="#sdk-and-tooling" aria-label="Permalink: SDK and tooling"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;dotnet test&lt;/code&gt;&lt;/strong&gt; integrates &lt;strong&gt;Microsoft.Testing.Platform&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Container images from console apps&lt;/strong&gt; without a separate Dockerfile in simple scenarios.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;dotnet tool exec&lt;/code&gt;&lt;/strong&gt; for one-shot tool runs.&lt;/li&gt;
&lt;li&gt;Native shell tab-completion scripts for the CLI.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="aspnet-core-10-and-blazor"&gt;ASP.NET Core 10 and Blazor&lt;a class="anchor ms-1" href="#aspnet-core-10-and-blazor" aria-label="Permalink: ASP.NET Core 10 and Blazor"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Blazor WebAssembly &lt;strong&gt;preloading&lt;/strong&gt; and automatic memory pool eviction.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Passkey support&lt;/strong&gt; for ASP.NET Core Identity.&lt;/li&gt;
&lt;li&gt;OpenAPI and minimal API improvements.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One breaking change caught me when upgrading a Blazor WebAssembly app: &lt;strong&gt;HttpClient response streaming is enabled by default&lt;/strong&gt;, which broke synchronous &lt;code&gt;Stream.Read&lt;/code&gt; calls in generated API clients. I wrote about the fix in &lt;a href="https://blog-dev.funkysi1701.com/posts/2025/blazor-and-dotnet10/"&gt;Blazor and .NET 10&lt;/a&gt;
— either opt out with &lt;code&gt;&amp;lt;WasmEnableStreamingResponse&amp;gt;false&amp;lt;/WasmEnableStreamingResponse&amp;gt;&lt;/code&gt; or move to async reads.&lt;/p&gt;
&lt;h3 id="ef-core-10-maui-and-desktop"&gt;EF Core 10, MAUI, and desktop&lt;a class="anchor ms-1" href="#ef-core-10-maui-and-desktop" aria-label="Permalink: EF Core 10, MAUI, and desktop"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;EF Core 10&lt;/strong&gt; — named query filters, Cosmos DB improvements, and LINQ performance work.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;.NET MAUI 10&lt;/strong&gt; — multi-file MediaPicker, WebView interception, Android API 35/36 support.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Windows Forms and WPF&lt;/strong&gt; — continued quality and Fluent-style updates.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="how-to-choose-a-version-in-2026"&gt;How to choose a version in 2026&lt;a class="anchor ms-1" href="#how-to-choose-a-version-in-2026" aria-label="Permalink: How to choose a version in 2026"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Recommendation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;New production app, minimise upgrade churn&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;.NET 10 LTS&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Existing app on .NET 8 LTS with no pressing need&lt;/td&gt;
&lt;td&gt;Stay on 8 until you are ready; both 8 and 10 are supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Experimenting with the latest features&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;.NET 9&lt;/strong&gt; or &lt;strong&gt;.NET 10&lt;/strong&gt; — check STS/LTS dates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Legacy maintenance&lt;/td&gt;
&lt;td&gt;Upgrade anything still on 5, 6, or 7 — they are all end-of-life&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Microsoft&amp;rsquo;s guidance has shifted over the years: LTS releases (6, 8, 10) alternate with STS releases (5, 7, 9) on an annual November cadence. STS now lasts two years; LTS lasts three. Remember there is no difference in quality between a LTS and STS release, it is only the support window that is different.&lt;/p&gt;
&lt;h2 id="further-reading"&gt;Further reading&lt;a class="anchor ms-1" href="#further-reading" aria-label="Permalink: Further reading"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="official-docs"&gt;Official docs&lt;a class="anchor ms-1" href="#official-docs" aria-label="Permalink: Official docs"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dotnet.microsoft.com/download" target="_blank" rel="noopener noreferrer"&gt;.NET download&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/dotnet/core/whats-new/" target="_blank" rel="noopener noreferrer"&gt;What&amp;rsquo;s new in each .NET version&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-version-history" target="_blank" rel="noopener noreferrer"&gt;C# language version history&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="on-this-blog"&gt;On this blog&lt;a class="anchor ms-1" href="#on-this-blog" aria-label="Permalink: On this blog"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog-dev.funkysi1701.com/posts/2024/dotnet9/"&gt;.NET 9&lt;/a&gt;
and &lt;a href="https://blog-dev.funkysi1701.com/posts/2025/blazor-and-dotnet10/"&gt;Blazor and .NET 10&lt;/a&gt;
— deeper dives from recent releases&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog-dev.funkysi1701.com/posts/2025/whats-new-csharp/"&gt;What&amp;rsquo;s new with C#&lt;/a&gt;
— language features that shipped alongside the runtime&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog-dev.funkysi1701.com/posts/2024/aspire/"&gt;Getting started with Aspire&lt;/a&gt;
and &lt;a href="https://blog-dev.funkysi1701.com/posts/2025/adding-elasticsearch-with-aspire/"&gt;Adding Elasticsearch with Aspire&lt;/a&gt;
— cloud-native .NET after you pick a target framework&lt;/li&gt;
&lt;li&gt;Prefer a short curated path? See &lt;a href="https://blog-dev.funkysi1701.com/start-here/"&gt;Start Here&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you have been on the platform since .NET 5, you have lived through the best decade of .NET since the original framework shipped.&lt;/p&gt;</description></item><item><title>Portfolio: Azure, AI, and dev tools</title><link>https://blog-dev.funkysi1701.com/projects/</link><author>funkysi1701@gmail.com (funkysi1701)</author><pubDate>Mon, 22 Jun 2026 21:00:00 +0000</pubDate><guid>https://blog-dev.funkysi1701.com/projects/</guid><media:content medium="image" type="image/png" url="https://blog-dev.funkysi1701.com/images/projects/semantic-search.png"/><description>&lt;h2 id="featured-projects-heading"&gt;Featured Projects&lt;/h2&gt;
&lt;p class="projects-featured-intro"&gt;Three live Azure workloads I own end-to-end — CI/CD static delivery, AI-backed search on real content, and full-stack Blazor with actual users. &lt;/p&gt;
&lt;div class="projects-featured" role="region" aria-labelledby="featured-projects-heading"&gt;
&lt;div class="projects-featured-grid"&gt;
&lt;article class="projects-featured-card"&gt;
&lt;h3 class="projects-featured-title"&gt;&lt;a href="https://www.episodeatlas.com" target="_blank" rel="noopener noreferrer"&gt;🔧 Episode Atlas&lt;/a&gt;&lt;/h3&gt;
&lt;p class="projects-featured-hook"&gt;Track TV progress at scale with per-user state and cloud-backed data.&lt;/p&gt;
&lt;a href="https://www.episodeatlas.com" target="_blank" rel="noopener noreferrer"&gt;&lt;img src="https://blog-dev.funkysi1701.com/images/projects/episode-atlas.png" alt="Episode Atlas: TV episode tracking app" width="800" height="450" loading="lazy"&gt;&lt;/a&gt;
&lt;p class="projects-featured-meta"&gt;&lt;strong&gt;What it does:&lt;/strong&gt; Per-user episode lists, “last watched” markers, and curated metadata links — so long-running franchises stay manageable.&lt;/p&gt;
&lt;p class="projects-featured-meta"&gt;&lt;strong&gt;Tech used:&lt;/strong&gt; .NET Blazor, Azure Static Web Apps, Azure Functions, Cosmos DB, GitHub auth.&lt;/p&gt;
&lt;p class="projects-featured-impressive"&gt;&lt;strong&gt;Why it’s impressive:&lt;/strong&gt; Demonstrates scalable data modelling and cloud-first architecture for user-driven applications.&lt;/p&gt;
&lt;div class="projects-signals" role="group" aria-label="Engineering signals"&gt;&lt;span class="projects-signal"&gt;Deployed to Azure&lt;/span&gt;&lt;span class="projects-signal"&gt;Implements authentication / APIs / caching&lt;/span&gt;&lt;/div&gt;
&lt;p class="projects-featured-outcome"&gt;&lt;strong&gt;Outcome:&lt;/strong&gt; Turned a personal “where was I in 900+ episodes?” problem into a maintainable multi-tenant pattern for identity, persistence, and UX for ongoing shows.&lt;/p&gt;
&lt;p class="projects-featured-links"&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://www.episodeatlas.com" target="_blank" rel="noopener noreferrer"&gt;episodeatlas.com&lt;/a&gt;&lt;/p&gt;
&lt;/article&gt;
&lt;article class="projects-featured-card"&gt;
&lt;h3 class="projects-featured-title"&gt;&lt;a href="https://search.funkysi1701.com/" target="_blank" rel="noopener noreferrer"&gt;🔧 Semantic Search&lt;/a&gt;&lt;/h3&gt;
&lt;p class="projects-featured-hook"&gt;AI-powered natural language search for discovering content beyond keywords.&lt;/p&gt;
&lt;a href="https://search.funkysi1701.com/" target="_blank" rel="noopener noreferrer"&gt;&lt;img src="https://blog-dev.funkysi1701.com/images/projects/semantic-search.png" alt="Semantic Search: natural-language blog search" width="800" height="450" loading="lazy"&gt;&lt;/a&gt;
&lt;p class="projects-featured-meta"&gt;&lt;strong&gt;What it does:&lt;/strong&gt; Accepts conversational queries, retrieves meaningfully related posts, and surfaces them alongside the site’s JSON index search.&lt;/p&gt;
&lt;p class="projects-featured-meta"&gt;&lt;strong&gt;Tech used:&lt;/strong&gt; .NET, Azure, Cosmos DB, OpenAI.&lt;/p&gt;
&lt;p class="projects-featured-impressive"&gt;&lt;strong&gt;Why it’s impressive:&lt;/strong&gt; Showcases practical LLM integration in .NET beyond basic chat interfaces.&lt;/p&gt;
&lt;div class="projects-signals" role="group" aria-label="Engineering signals"&gt;&lt;span class="projects-signal"&gt;Deployed to Azure&lt;/span&gt;&lt;span class="projects-signal"&gt;Designed with clean architecture&lt;/span&gt;&lt;/div&gt;
&lt;p class="projects-featured-outcome"&gt;&lt;strong&gt;Outcome:&lt;/strong&gt; Explored how vector-style retrieval and operational concerns (cost, latency, content freshness) fit next to a static Hugo site without compromising the authoring workflow.&lt;/p&gt;
&lt;p class="projects-featured-links"&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://search.funkysi1701.com/" target="_blank" rel="noopener noreferrer"&gt;search.funkysi1701.com&lt;/a&gt; · linked from &lt;a href="https://blog-dev.funkysi1701.com/search/"&gt;Search&lt;/a&gt;&lt;/p&gt;
&lt;/article&gt;
&lt;article class="projects-featured-card"&gt;
&lt;h3 class="projects-featured-title"&gt;&lt;a href="https://www.funkysi1701.com/" target="_blank" rel="noopener noreferrer"&gt;🔧 Blog Platform&lt;/a&gt;&lt;/h3&gt;
&lt;p class="projects-featured-hook"&gt;Technical blog on Azure with CI/CD—fast static pages, search, and comments without babysitting an app server.&lt;/p&gt;
&lt;a href="https://www.funkysi1701.com/" target="_blank" rel="noopener noreferrer"&gt;&lt;img src="https://blog-dev.funkysi1701.com/images/projects/blog.png" alt="Blog homepage: navigation and latest posts" width="800" height="450" loading="lazy"&gt;&lt;/a&gt;
&lt;p class="projects-featured-meta"&gt;&lt;strong&gt;What it does:&lt;/strong&gt; Publishes posts, generates RSS and a JSON search index, integrates Giscus for discussions, and deploys on every merge.&lt;/p&gt;
&lt;p class="projects-featured-meta"&gt;&lt;strong&gt;Tech used:&lt;/strong&gt; Hugo, GitHub Actions, Azure Static Web Apps, Giscus.&lt;/p&gt;
&lt;p class="projects-featured-impressive"&gt;&lt;strong&gt;Why it’s impressive:&lt;/strong&gt; Highlights modern static-first architecture with automated deployment pipelines.&lt;/p&gt;
&lt;div class="projects-signals" role="group" aria-label="Engineering signals"&gt;&lt;span class="projects-signal"&gt;Deployed to Azure&lt;/span&gt;&lt;span class="projects-signal"&gt;CI/CD via GitHub Actions&lt;/span&gt;&lt;/div&gt;
&lt;p class="projects-featured-outcome"&gt;&lt;strong&gt;Outcome:&lt;/strong&gt; Demonstrates a production-shaped static pipeline — preview builds, repeatable deploys, and content-driven SEO — suitable as a reference architecture for docs and marketing sites.&lt;/p&gt;
&lt;p class="projects-featured-links"&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://github.com/funkysi1701/funkysi1701.github.io" target="_blank" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;&lt;/p&gt;
&lt;/article&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="-cloud--production-systems"&gt;💼 Cloud &amp; Production Systems&lt;a class="anchor ms-1" href="#-cloud--production-systems" aria-label="Permalink: 💼 Cloud &amp;amp; Production Systems"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The featured trio — &lt;strong&gt;Episode Atlas&lt;/strong&gt;, &lt;strong&gt;this blog&lt;/strong&gt; (Hugo on Azure), and &lt;strong&gt;Semantic Search&lt;/strong&gt; (&lt;a href="https://search.funkysi1701.com/" target="_blank" rel="noopener noreferrer"&gt;search.funkysi1701.com&lt;/a&gt;
) — is fully described in &lt;strong&gt;&lt;a href="#featured-projects-heading"&gt;Featured Projects&lt;/a&gt;
&lt;/strong&gt; above and not repeated here. Below is the rest of the catalogue by category.&lt;/p&gt;
&lt;h3 id="-thorne-pentecostal-church"&gt;🔧 Thorne Pentecostal Church&lt;a class="anchor ms-1" href="#-thorne-pentecostal-church" aria-label="Permalink: 🔧 Thorne Pentecostal Church"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Dependable church presence online—clear for newcomers, simple for volunteers to keep current.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.thornepentecostalchurch.co.uk" target="_blank" rel="noopener noreferrer"&gt;
&lt;img class="img-fluid" alt="Thorne Pentecostal Church website homepage" src="https://blog-dev.funkysi1701.com/images/projects/thorne-pentecostal-church.png" loading="lazy"
width="1280" height="800"
/&gt;
&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What it does&lt;/strong&gt; — Presents service times, beliefs, and visitor information with a simple structure so members and newcomers get answers in one place.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tech used&lt;/strong&gt; — HTML/CSS, Azure Static Web Apps.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why it’s impressive&lt;/strong&gt; — Demonstrates proportionate engineering: production-grade static hosting and clear information architecture for stakeholders who need reliability, not complexity.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Engineering signals:&lt;/strong&gt; Deployed to Azure · CI/CD via GitHub Actions&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Outcome:&lt;/strong&gt; Delivered a first web presence focused on clarity and sustainability so non-developers can keep content current with minimal process overhead.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://www.thornepentecostalchurch.co.uk" target="_blank" rel="noopener noreferrer"&gt;Thorne Pentecostal Church&lt;/a&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="-tools--utilities"&gt;🛠 Tools &amp; Utilities&lt;a class="anchor ms-1" href="#-tools--utilities" aria-label="Permalink: 🛠 Tools &amp;amp; Utilities"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="-mandelbrot-generator"&gt;🔧 Mandelbrot Generator&lt;a class="anchor ms-1" href="#-mandelbrot-generator" aria-label="Permalink: 🔧 Mandelbrot Generator"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Interactive Mandelbrot exploration in the browser—smooth zoom, pure WASM, zero server-side rendering cost.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://mandelbrot.funkysi1701.com" target="_blank" rel="noopener noreferrer"&gt;
&lt;img class="img-fluid" alt="Mandelbrot Generator: fractal view in the browser" src="https://blog-dev.funkysi1701.com/images/projects/mandelbrot.png" loading="lazy"
width="1280" height="800"
/&gt;
&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What it does&lt;/strong&gt; — Renders the Mandelbrot set in the client with zoom for desktop and mobile, demonstrating CPU-bound UI work in WASM.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tech used&lt;/strong&gt; — .NET Blazor WebAssembly, Azure Static Web Apps.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why it’s impressive&lt;/strong&gt; — Demonstrates client-side compute discipline in Blazor WASM: rich, interactive UI with predictable cost because heavy work never hits the server.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Engineering signals:&lt;/strong&gt; Deployed to Azure · Designed with clean architecture&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Outcome:&lt;/strong&gt; Built the tool to stress-test interactive Blazor WASM performance and touch UX patterns — a small codebase that still informs decisions about heavier client-side workloads.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://mandelbrot.funkysi1701.com" target="_blank" rel="noopener noreferrer"&gt;Mandelbrot Generator&lt;/a&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="-ongoing-exploration"&gt;💡 Ongoing exploration&lt;a class="anchor ms-1" href="#-ongoing-exploration" aria-label="Permalink: 💡 Ongoing exploration"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Areas I keep hands-on with outside these shipped projects:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;.NET Aspire&lt;/strong&gt; — Cloud-native composition and local dev parity&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kubernetes&lt;/strong&gt; — Orchestration and service boundaries&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Elasticsearch&lt;/strong&gt; — Search and analytics stacks&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Azure Functions&lt;/strong&gt; — Event-driven and serverless patterns&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DevOps automation&lt;/strong&gt; — CI/CD, IaC, and release hygiene&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="-collaborate-with-me"&gt;🤝 Collaborate With Me&lt;a class="anchor ms-1" href="#-collaborate-with-me" aria-label="Permalink: 🤝 Collaborate With Me"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Interested in collaborating on a project or discussing an idea?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog-dev.funkysi1701.com/contact/"&gt;Contact Me&lt;/a&gt;
— Get in touch&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/funkysi1701" target="_blank" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;
— Code and experiments&lt;/li&gt;
&lt;li&gt;&lt;a href="https://linkedin.com/in/funkysi1701" target="_blank" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;
— Connect professionally&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="-more-resources"&gt;📚 More resources&lt;a class="anchor ms-1" href="#-more-resources" aria-label="Permalink: 📚 More resources"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog-dev.funkysi1701.com/tools-and-resources/"&gt;Tools &amp;amp; Resources&lt;/a&gt;
— Recommended development tools&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog-dev.funkysi1701.com/about/"&gt;About Me&lt;/a&gt;
— Background and experience&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog-dev.funkysi1701.com/posts/"&gt;Blog Posts&lt;/a&gt;
— Technical writing&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Stay visible when made redundant</title><link>https://blog-dev.funkysi1701.com/posts/2026/stay-visible-as-a-developer-when-you-are-made-redundant/</link><author>funkysi1701@gmail.com (funkysi1701)</author><pubDate>Mon, 22 Jun 2026 12:00:00 +0000</pubDate><guid>https://blog-dev.funkysi1701.com/posts/2026/stay-visible-as-a-developer-when-you-are-made-redundant/</guid><category term="Career">Career</category><category term="Redundancy">Redundancy</category><category term="Networking">Networking</category><category term="Blogging">Blogging</category><category term="SideProjects">SideProjects</category><category term="Conferences">Conferences</category><category term="Developer">Developer</category><media:content medium="image" type="image/png" url="https://blog-dev.funkysi1701.com/images/2026/stay-visible-redundancy.png"/><description>&lt;p&gt;Sadly earlier this year I was made redundant from my Software Developer job. Looking for a new job has not been fun, but a few common themes have emerged that I wanted to share. My hope is that these will help others to put things in place that may help them in the future.&lt;/p&gt;
&lt;h2 id="go-to-events-and-meet-people"&gt;Go to events and meet people&lt;a class="anchor ms-1" href="#go-to-events-and-meet-people" aria-label="Permalink: Go to events and meet people"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Something I have said often is that I enjoy going to events or conferences, like &lt;a href="https://blog-dev.funkysi1701.com/posts/2026/ndc-london-2026"&gt;NDC London&lt;/a&gt;
. These are great places to hear interesting talks, however that is not all they are good for. When you are at a conference or user group you are in a room full of like-minded people, each of them has unique experiences of being a software developer.&lt;/p&gt;
&lt;p&gt;I am not very good at networking, I tend to stand in the corner or look awkward. However the more of these events I go to the better I get. Even if you only talk to one new person, that is one more person that you have spoken to. Want an advantage in meeting people? Volunteer. If you are a volunteer at an event, you will need to interact with other people, you may need to help direct people or assist one of the speakers. I have found this gives me a tiny bit more confidence to go and start speaking with someone or ask a question. Check out my &lt;a href="https://blog-dev.funkysi1701.com/posts/2025/volunteering-at-ndc/"&gt;Volunteering at NDC&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;User Groups often have the same people coming week after week, take advantage of this and be one of those people as well. You will start to get noticed and remembered even if you barely speak to anyone. For me I don&amp;rsquo;t have any really local user groups, however I am enjoying spending time at &lt;a href="https://www.meetup.com/leeds-sharp/" target="_blank" rel="noopener noreferrer"&gt;LeedsSharp&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;If you genuinely had a good conversation with someone, find them on LinkedIn (or other social media) and send them a quick &amp;ldquo;It was nice chatting with you&amp;rdquo; message, this helps solidify the connection and helps you remember it.&lt;/p&gt;
&lt;p&gt;So far during this job search I have met a recruiter who I would not have met without going to events, I have had jobs suggested to me to apply for that I would not have received otherwise, and one hiring manager is someone I have met previously at an event.&lt;/p&gt;
&lt;h2 id="build-a-blog-and-write-about-what-you-are-learning"&gt;Build a blog and write about what you are learning&lt;a class="anchor ms-1" href="#build-a-blog-and-write-about-what-you-are-learning" aria-label="Permalink: Build a blog and write about what you are learning"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Almost every interview I have had has featured a comment about my blog. Now building a blog is for the long game. If you are unemployed now and don&amp;rsquo;t have a blog this won&amp;rsquo;t help you today, but if you start one and write about your experiences a few times a year it may help you tomorrow.&lt;/p&gt;
&lt;p&gt;Back in 2014 when I started blogging I wasn&amp;rsquo;t even a Software Developer, I was just an IT guy at a small company and I wanted to write about some of the cool things I was learning. I kept writing, some years I wrote more than others, there have been some big gaps where I didn&amp;rsquo;t write anything. But somehow I keep coming back to it and writing a short piece about a new version of X or a conference I have been to, or a trend that is happening.&lt;/p&gt;
&lt;p&gt;My blog is a great talking point during interviews, it helps me talk about why I think sharing information with the community is so important, what technology I have used over the years, some of the things I have learnt. My blog is featured at the top of my CV, and hiring managers have said they love it.&lt;/p&gt;
&lt;p&gt;When redundancy hit, refreshing my CV and LinkedIn was one of the first practical jobs I did: update the headline, add recent projects, link to the blog and &lt;a href="https://blog-dev.funkysi1701.com/projects"&gt;projects&lt;/a&gt;
page, and make sure nothing still implied I was in my old role. Mundane, yes — but recruiters and hiring managers check both before they ever speak to you.&lt;/p&gt;
&lt;p&gt;Today blogging isn&amp;rsquo;t the only way you can share your ideas. You could create videos, start a podcast, or have an active social media channel. I think the key is consistency, if you do a lot of it, it can easily look impressive if you look back after a few years. I personally prefer the well written blog post that I can refer back to, or search for again and again.&lt;/p&gt;
&lt;p&gt;Some ideas to get you started (but there are loads more):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What have you learnt today/this week&lt;/li&gt;
&lt;li&gt;What do you think about technology X&lt;/li&gt;
&lt;li&gt;How do you solve problem Y&lt;/li&gt;
&lt;li&gt;Compare two approaches to the same problem&lt;/li&gt;
&lt;li&gt;Your experience at a conference or meetup&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="build-side-projects"&gt;Build side projects&lt;a class="anchor ms-1" href="#build-side-projects" aria-label="Permalink: Build side projects"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Side projects are a great way to learn. You can create a side project with the goal of learning technology X, you can also blog about your journey, what problems you solved and what insights you gained from it.&lt;/p&gt;
&lt;p&gt;I personally feel there is a lot of value from getting your side project into the wild and letting users interact with it. Users will find your edge cases and ask questions you hadn&amp;rsquo;t considered. Publishing onto the internet is not free so consider your architecture carefully.&lt;/p&gt;
&lt;p&gt;What you can deploy depends on what you build. For simple websites you can do a lot with Github Pages or Azure Static Web Apps. For example this website is built with Hugo which is deployed to an Azure Static Web App for pennies per month. If you have more complex needs small Linux VMs can be created for not a lot more.&lt;/p&gt;
&lt;p&gt;I have learnt more from running a side project in production than I have the original idea. Things like DNS, SSL certificates, authentication, SEO are all very important for running a project but they would have been missed if you only ever ran your side project on localhost. I think having a rounded experience gives you a leg up when it comes to talking about your skills in an interview scenario.&lt;/p&gt;
&lt;p&gt;If you are between jobs, it is tempting to start something ambitious — the next big SaaS idea, a full-stack app with every feature you can think of. I have fallen into that trap myself. A small project you actually finish is worth more than a grand one that never ships. Pick something you can complete in a weekend or two: a CLI tool, a simple API, a static site, even a useful script. You will have something concrete to talk about in interviews, and the momentum of finishing one thing often makes the next one easier.&lt;/p&gt;
&lt;p&gt;My personal side projects can be found on my &lt;a href="https://blog-dev.funkysi1701.com/projects"&gt;projects&lt;/a&gt;
page. My inspiration came from various places, my hobbies and interests, problems I am facing or hear about, or just stuff I want to learn.&lt;/p&gt;
&lt;h2 id="keep-learning-deliberately"&gt;Keep learning deliberately&lt;a class="anchor ms-1" href="#keep-learning-deliberately" aria-label="Permalink: Keep learning deliberately"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Between applications there is often more waiting than interviewing. Use that time deliberately: look at the job descriptions you are targeting, spot a recurring skill gap, and focus on one thing rather than trying to learn everything. I listen to &lt;a href="https://blog-dev.funkysi1701.com/podcasts"&gt;development podcasts&lt;/a&gt;
on the commute and dip into courses — I have written before about using &lt;a href="https://blog-dev.funkysi1701.com/posts/2018/pluralsight/"&gt;Pluralsight&lt;/a&gt;
while doing the washing up. You will not become an expert in a fortnight, but being able to talk about what you are learning still comes up in interviews. For more general advice, see &lt;a href="https://blog-dev.funkysi1701.com/posts/2018/tips-for-developing-yourself/"&gt;Tips for Developing Yourself&lt;/a&gt;
.&lt;/p&gt;
&lt;h2 id="closing-thoughts"&gt;Closing thoughts&lt;a class="anchor ms-1" href="#closing-thoughts" aria-label="Permalink: Closing thoughts"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Being made redundant is not something I would wish on anyone, and I am still in the middle of finding my next role. Some days the job search feels slow and frustrating. On the better days, I remind myself that the things I have been doing for years — showing up at events, writing on this blog, shipping side projects, keeping my skills current — are not wasted effort. They are what give me stories to tell in interviews and reasons for people to remember my name.&lt;/p&gt;
&lt;p&gt;None of this replaces the practical side of job hunting: refreshing your CV and LinkedIn, talking to recruiters, applying properly, and working through the admin that comes with redundancy. I went through redundancy before, in 2021, and wrote about recruiters, interview rounds, and the spreadsheet I used to keep track of it all in &lt;a href="https://blog-dev.funkysi1701.com/posts/2021/lone-developer-to-senior-developer-my-2021-story/"&gt;my 2021 story&lt;/a&gt;
. Visibility helps people remember your name; applications still get you in the door.&lt;/p&gt;
&lt;p&gt;But small, consistent habits compound. You do not need to do everything at once. Pick one thing you can start this month: a user group, a blog post, a course on something job ads keep asking for, or a side project you can actually finish — &lt;a href="https://blog-dev.funkysi1701.com/start-here/"&gt;Start Here&lt;/a&gt;
collects a short reading path if you want inspiration from this blog first. Community work counts too; running a &lt;a href="https://blog-dev.funkysi1701.com/posts/2024/codeclub/"&gt;Code Club&lt;/a&gt;
taught me as much about showing up as any meetup talk. If you still have a job but worry the ground is shifting beneath you, even better — start now while you have a bit more energy and headspace.&lt;/p&gt;
&lt;p&gt;If you are going through something similar, I hope this helps. If you have found other things that worked for you, I would love to hear about them in the comments.&lt;/p&gt;
&lt;p&gt;If you have enjoyed this article and want a monthly email with my latest posts, please sign up for my &lt;a href="https://blog-dev.funkysi1701.com/newsletter"&gt;newsletter&lt;/a&gt;
. You can also &lt;a href="https://blog-dev.funkysi1701.com/contact"&gt;get in touch&lt;/a&gt;
if you have questions or just want to chat.&lt;/p&gt;</description></item><item><title>Episode Atlas: track your Trek rewatch</title><link>https://blog-dev.funkysi1701.com/posts/2026/episode-atlas/</link><author>funkysi1701@gmail.com (funkysi1701)</author><pubDate>Mon, 01 Jun 2026 12:00:00 +0000</pubDate><guid>https://blog-dev.funkysi1701.com/posts/2026/episode-atlas/</guid><category term="StarTrek">StarTrek</category><category term="SideProjects">SideProjects</category><category term="EpisodeAtlas">EpisodeAtlas</category><media:content medium="image" type="image/png" url="https://blog-dev.funkysi1701.com/images/2026/episode-atlas/episode-atlas-home.png"/><description>&lt;p&gt;If you have ever tried to rewatch &lt;em&gt;Star Trek&lt;/em&gt; properly—not just dip into a favourite episode, but work through hundreds of instalments across multiple series—you will know the feeling. You pause &lt;em&gt;Deep Space Nine&lt;/em&gt; for a few weeks, start something else, and suddenly you have no idea which episode you were on. Spreadsheets help for a while, then they do not. Notes on your phone get lost. Memory is unreliable when you jump between TNG, DS9, and whatever new show has just dropped.&lt;/p&gt;
&lt;p&gt;That is the problem &lt;strong&gt;&lt;a href="https://www.episodeatlas.com/" target="_blank" rel="noopener noreferrer"&gt;Episode Atlas&lt;/a&gt;
&lt;/strong&gt; exists to solve: &lt;strong&gt;search 900+ episodes and films, mark what you have watched, and always know what to watch next&lt;/strong&gt;—without treating a rewatch like a project-management exercise.&lt;/p&gt;
&lt;p&gt;
&lt;img class="img-fluid" alt="Episode Atlas homepage: search and track Star Trek episodes" src="https://blog-dev.funkysi1701.com/images/2026/episode-atlas/episode-atlas-home.png" loading="lazy"
width="1280" height="800"
/&gt;
&lt;/p&gt;
&lt;h2 id="why-i-built-it"&gt;Why I built it&lt;a class="anchor ms-1" href="#why-i-built-it" aria-label="Permalink: Why I built it"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I write about &lt;em&gt;Star Trek&lt;/em&gt; on this blog from time to time—episode reviews, top-50 lists, thoughts on new series. The honest origin is simpler than that, though: &lt;strong&gt;I wanted a better way to track my own rewatches&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Generic TV trackers are fine if you watch a bit of everything. They are less helpful when you care about &lt;strong&gt;one enormous franchise&lt;/strong&gt; with inconsistent stardates, films mixed in with series, and the urge to jump to &amp;ldquo;all the Borg episodes&amp;rdquo; rather than the next sequential instalment. Episode Atlas is deliberately narrow (if you can describe a database of over 900 episodes and films narrow!): all of &lt;em&gt;Star Trek&lt;/em&gt;, in one place, with features shaped by how fans actually rewatch.&lt;/p&gt;
&lt;h2 id="browse-first-sign-in-to-save"&gt;Browse first, sign in to save&lt;a class="anchor ms-1" href="#browse-first-sign-in-to-save" aria-label="Permalink: Browse first, sign in to save"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;You can use &lt;strong&gt;&lt;a href="https://www.episodeatlas.com/" target="_blank" rel="noopener noreferrer"&gt;Episode Atlas&lt;/a&gt;
&lt;/strong&gt; without creating an account. Search the catalogue, open episodes, browse collections, and spin the random picker—no signup required.&lt;/p&gt;
&lt;p&gt;When you want your progress to stick, sign in and start your &lt;strong&gt;captain’s log&lt;/strong&gt;. Mark episodes watched, and the site remembers where you left off across every series—even if you detour from DS9 to TNG and back again.&lt;/p&gt;
&lt;h2 id="your-service-record"&gt;Your service record&lt;a class="anchor ms-1" href="#your-service-record" aria-label="Permalink: Your service record"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Once you are logging watches, the homepage gives you a &lt;strong&gt;service record&lt;/strong&gt; at a glance: how many of the 900+ episodes you have seen, your percentage through the franchise, and your current &lt;strong&gt;watch rank&lt;/strong&gt; (from the early ranks up through Lieutenant, Commander, and beyond). The site shows how many more episodes you need for the next rank, so a long rewatch feels like progress rather than a vague “I think I am halfway through Voyager.”&lt;/p&gt;
&lt;p&gt;You can also earn &lt;strong&gt;commendations&lt;/strong&gt; and build an &lt;strong&gt;active duty streak&lt;/strong&gt;—small nudges to keep visiting when you are in the middle of a serious rewatch. It is the same idea as a fitness streak, but for &lt;em&gt;Star Trek&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id="find-any-episode-in-seconds"&gt;Find any episode in seconds&lt;a class="anchor ms-1" href="#find-any-episode-in-seconds" aria-label="Permalink: Find any episode in seconds"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Search&lt;/strong&gt; is the front door. Most visits start with “I know roughly what I want” or “which episode was that again?” Filter by series and season to narrow the list; keywords catch titles and descriptions you only half remember. Every series and the films are in one catalogue.&lt;/p&gt;
&lt;p&gt;
&lt;img class="img-fluid" alt="Episode list: find and filter Star Trek episodes" src="https://blog-dev.funkysi1701.com/images/2026/episode-atlas/episode-atlas-episodes.png" loading="lazy"
width="1280" height="800"
/&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;img class="img-fluid" alt="Search results filtered by keyword" src="https://blog-dev.funkysi1701.com/images/2026/episode-atlas/episode-atlas-search.png" loading="lazy"
width="1280" height="800"
/&gt;
&lt;/p&gt;
&lt;h2 id="episode-pages-context-and-next-steps"&gt;Episode pages: context and next steps&lt;a class="anchor ms-1" href="#episode-pages-context-and-next-steps" aria-label="Permalink: Episode pages: context and next steps"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Open any episode and you get what you need for a rewatch session: metadata, &lt;strong&gt;previous and next&lt;/strong&gt; navigation within the series, season progress, and actions to mark the episode watched or jump to the suggested &lt;strong&gt;next episode&lt;/strong&gt;. Your captain’s log ties it together—what you logged today, what you have already seen, and where to pick up when you return.&lt;/p&gt;
&lt;p&gt;The flow the site describes is simple: &lt;strong&gt;search → open → mark watched → move on&lt;/strong&gt;. Three gestures, no spreadsheet.&lt;/p&gt;
&lt;h2 id="collections-when-you-want-a-mood-not-a-season"&gt;Collections when you want a mood, not a season&lt;a class="anchor ms-1" href="#collections-when-you-want-a-mood-not-a-season" aria-label="Permalink: Collections when you want a mood, not a season"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Collections&lt;/strong&gt; answer a different question from search: &lt;em&gt;“It is late; show me something good in this mood.”&lt;/em&gt; Each collection points at Borg stories, time-travel episodes, holodeck highlights, and similar lists—fan knowledge encoded as browseable sets, so you skip filler without digging through every season.&lt;/p&gt;
&lt;p&gt;
&lt;img class="img-fluid" alt="Curated Star Trek episode collections" src="https://blog-dev.funkysi1701.com/images/2026/episode-atlas/episode-atlas-collections.png" loading="lazy"
width="1280" height="800"
/&gt;
&lt;/p&gt;
&lt;h2 id="random-episode-when-you-cannot-decide"&gt;Random episode when you cannot decide&lt;a class="anchor ms-1" href="#random-episode-when-you-cannot-decide" aria-label="Permalink: Random episode when you cannot decide"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The &lt;strong&gt;&lt;a href="https://www.episodeatlas.com/random" target="_blank" rel="noopener noreferrer"&gt;random episode&lt;/a&gt;
&lt;/strong&gt; picker is for the evenings when you and the sofa have agreed on &lt;em&gt;Star Trek&lt;/em&gt; but not on &lt;em&gt;which&lt;/em&gt; &lt;em&gt;Star Trek&lt;/em&gt;. One click, one suggestion—useful when commitment is the hard part.&lt;/p&gt;
&lt;p&gt;
&lt;img class="img-fluid" alt="Random episode picker" src="https://blog-dev.funkysi1701.com/images/2026/episode-atlas/episode-atlas-random.png" loading="lazy"
width="1280" height="800"
/&gt;
&lt;/p&gt;
&lt;h2 id="how-it-compares-to-other-sites"&gt;How it compares to other sites&lt;a class="anchor ms-1" href="#how-it-compares-to-other-sites" aria-label="Permalink: How it compares to other sites"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Episode Atlas is not trying to replace &lt;a href="https://memory-alpha.fandom.com/" target="_blank" rel="noopener noreferrer"&gt;Memory Alpha&lt;/a&gt;
for lore or IMDb for cast lists. It is built for &lt;strong&gt;progress&lt;/strong&gt;: what you have watched, what rank you have earned, and what to play next. If you have ever bounced between a wiki, a ratings site, and a generic tracker and still not known where you were in DS9, this is the gap it fills.&lt;/p&gt;
&lt;h2 id="try-it"&gt;Try it&lt;a class="anchor ms-1" href="#try-it" aria-label="Permalink: Try it"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.episodeatlas.com/" target="_blank" rel="noopener noreferrer"&gt;episodeatlas.com&lt;/a&gt;
&lt;/strong&gt; — free to browse, sign in when you want your captain’s log saved. Search, mark your first episode, and see your rank climb.&lt;/p&gt;
&lt;p&gt;How do you track long rewatches—spreadsheet, app, or pure memory? If you try Episode Atlas, I would genuinely like to know what works for you and what does not: features you love, gaps that annoy you, or anything that would make a rewatch easier. Leave a comment below, or use the &lt;strong&gt;feedback&lt;/strong&gt; option on &lt;a href="https://www.episodeatlas.com/" target="_blank" rel="noopener noreferrer"&gt;episodeatlas.com&lt;/a&gt;
—both reach me, and both help shape what I build next.&lt;/p&gt;</description></item></channel></rss>