<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hi, I'm Ben. I use code to solve your problems. on BEN ABT</title><link>https://benjamin-abt.com/</link><description>Recent content in Hi, I'm Ben. I use code to solve your problems. on BEN ABT</description><generator>Hugo</generator><language>en-US</language><atom:link href="https://benjamin-abt.com/index.xml" rel="self" type="application/rss+xml"/><item><title>Custom Password Hashing in ASP.NET Core: A Versioned, Upgradeable Design</title><link>https://benjamin-abt.com/blog/2026/08/10/custom-password-hashing-aspnet-core/</link><pubDate>Mon, 10 Aug 2026 00:00:00 +0000</pubDate><guid>https://benjamin-abt.com/blog/2026/08/10/custom-password-hashing-aspnet-core/</guid><description>&lt;p&gt;Applications that do not use ASP.NET Core Identity still need a disciplined password-storage design. This often leads to a requirement phrased as &amp;ldquo;password encryption.&amp;rdquo; That phrase is dangerous because encryption is reversible: an application holding the key can recover every password. Password storage needs a deliberately one-way, slow derivation function instead.&lt;/p&gt;</description></item><item><title>MCP C# SDK 2.0: Stateless HTTP, Interactive Tools and a Practical Migration Path</title><link>https://benjamin-abt.com/blog/2026/08/03/mcp-csharp-sdk-2/</link><pubDate>Mon, 03 Aug 2026 00:00:00 +0000</pubDate><guid>https://benjamin-abt.com/blog/2026/08/03/mcp-csharp-sdk-2/</guid><description>&lt;p&gt;The 2.0 release of the official Model Context Protocol (MCP) C# SDK is more than a version increment. It implements the 2026-07-28 MCP specification revision, which changes the default shape of MCP over HTTP. The protocol now favors independent, self-describing requests over a connection-scoped session, while still supporting interactive workflows that need more than one exchange.&lt;/p&gt;</description></item><item><title>Handle time correctly in .NET: TimeProvider</title><link>https://benjamin-abt.com/blog/2026/07/27/dotnet-timeprovider/</link><pubDate>Mon, 27 Jul 2026 00:00:00 +0000</pubDate><guid>https://benjamin-abt.com/blog/2026/07/27/dotnet-timeprovider/</guid><description>&lt;p&gt;Time is an external dependency. That may sound unusual at first because &lt;code&gt;DateTime.UtcNow&lt;/code&gt; is available anywhere without configuration. This convenience becomes a problem as soon as business rules depend on the current moment: expired invitations, time-limited tokens, cancellation windows, rate limits, background jobs, and reminders.&lt;/p&gt;</description></item><item><title>Run Hono on Azure Static Web Apps: managed Functions APIs for static frontends</title><link>https://benjamin-abt.com/blog/2026/07/19/run-hono-on-azure-static-web-apps/</link><pubDate>Sun, 19 Jul 2026 00:00:00 +0000</pubDate><guid>https://benjamin-abt.com/blog/2026/07/19/run-hono-on-azure-static-web-apps/</guid><description>&lt;p&gt;Azure Static Web Apps is primarily a host for static frontend assets, but it can also deploy a small HTTP API alongside the frontend. That API is implemented as an Azure Functions application and is exposed through the same site under the fixed &lt;code&gt;/api&lt;/code&gt; path. Hono fits this model well when a web application needs a focused JSON API without introducing a separately operated container or web host.&lt;/p&gt;</description></item><item><title>Problem Details in ASP.NET Core and .NET 10</title><link>https://benjamin-abt.com/blog/2026/07/15/problem-details-standard-aspnet-core-dotnet-10/</link><pubDate>Wed, 15 Jul 2026 00:00:00 +0000</pubDate><guid>https://benjamin-abt.com/blog/2026/07/15/problem-details-standard-aspnet-core-dotnet-10/</guid><description>&lt;p&gt;Error responses are part of an API contract. Still, many systems grow them incidentally: one endpoint returns &lt;code&gt;{ &amp;quot;error&amp;quot;: &amp;quot;not found&amp;quot; }&lt;/code&gt;, another returns an array of validation errors, a gateway adds its own structure and an unexpected exception ends up as another JSON shape. That is inconvenient for people and brittle for client applications.&lt;/p&gt;</description></item><item><title>Using MeterListener with the new .NET 11 MemoryCache metrics</title><link>https://benjamin-abt.com/blog/2026/07/14/dotnet-11-meterlistener-memorycache-metrics/</link><pubDate>Tue, 14 Jul 2026 00:00:00 +0000</pubDate><guid>https://benjamin-abt.com/blog/2026/07/14/dotnet-11-meterlistener-memorycache-metrics/</guid><description>&lt;p&gt;.NET 11 adds a small but useful improvement to the built-in observability story: &lt;code&gt;MemoryCache&lt;/code&gt; can now publish OpenTelemetry-compatible metrics directly through &lt;code&gt;System.Diagnostics.Metrics&lt;/code&gt;. That makes cache behavior visible without adding a custom wrapper around every &lt;code&gt;Get&lt;/code&gt;, &lt;code&gt;Set&lt;/code&gt; and &lt;code&gt;Remove&lt;/code&gt; call.&lt;/p&gt;</description></item><item><title>Run Hono on Azure: Container Apps, Functions, App Service and AKS compared</title><link>https://benjamin-abt.com/blog/2026/07/12/run-hono-on-azure/</link><pubDate>Sun, 12 Jul 2026 00:00:00 +0000</pubDate><guid>https://benjamin-abt.com/blog/2026/07/12/run-hono-on-azure/</guid><description>&lt;p&gt;Hono is often associated with Cloudflare Workers, and for good reason. Its small routing model, Web Standard API surface and direct &lt;code&gt;fetch&lt;/code&gt; integration make it a natural fit for edge runtimes. That association can obscure a more useful fact: Hono is not tied to Cloudflare. The same application core can run on Azure when the runtime-specific edge is kept separate from routes and business logic.&lt;/p&gt;</description></item><item><title>Top 10 recommendations for .NET developers working with Azure Cosmos DB</title><link>https://benjamin-abt.com/blog/2026/07/10/top-10-recommendations-dotnet-developers-azure-cosmos-db/</link><pubDate>Fri, 10 Jul 2026 00:00:00 +0000</pubDate><guid>https://benjamin-abt.com/blog/2026/07/10/top-10-recommendations-dotnet-developers-azure-cosmos-db/</guid><description>&lt;p&gt;Azure Cosmos DB has a habit of exposing architectural weaknesses very early. Classic data-access patterns that work perfectly fine with relational databases often become expensive, noisy and operationally awkward once request units (RUs), partitioning and cross-partition query fan-out come into play.&lt;/p&gt;</description></item><item><title>How to migrate .NET versioning from x.x.x.x to SemVer</title><link>https://benjamin-abt.com/blog/2026/07/05/migrate-dotnet-versioning-from-xxxx-to-semver/</link><pubDate>Sun, 05 Jul 2026 00:00:00 +0000</pubDate><guid>https://benjamin-abt.com/blog/2026/07/05/migrate-dotnet-versioning-from-xxxx-to-semver/</guid><description>&lt;p&gt;Many long-lived .NET repositories did not start with semantic versioning. They grew up with &lt;code&gt;major.minor.build.revision&lt;/code&gt;, often set in &lt;code&gt;AssemblyInfo.cs&lt;/code&gt;, sometimes mixed with wildcard auto increment, sometimes duplicated across several projects and sometimes quietly diverging over the years.&lt;/p&gt;</description></item><item><title>Modern versioning for ASP.NET Core and web apps and how to produce idempotent artifacts</title><link>https://benjamin-abt.com/blog/2026/07/03/modern-versioning-aspnet-core-web-apps-idempotent-artifacts/</link><pubDate>Fri, 03 Jul 2026 00:00:00 +0000</pubDate><guid>https://benjamin-abt.com/blog/2026/07/03/modern-versioning-aspnet-core-web-apps-idempotent-artifacts/</guid><description>&lt;p&gt;ASP.NET Core applications are usually released often enough that versioning stops being a documentation concern and turns into delivery infrastructure. Once an application moves through CI, staging, production, containers, rollback procedures and incident response, the version number is no longer just a label. It becomes part of the operational model.&lt;/p&gt;</description></item><item><title>Modern versioning for .NET desktop apps and how to produce idempotent artifacts</title><link>https://benjamin-abt.com/blog/2026/06/30/modern-versioning-dotnet-desktop-apps-idempotent-artifacts/</link><pubDate>Tue, 30 Jun 2026 00:00:00 +0000</pubDate><guid>https://benjamin-abt.com/blog/2026/06/30/modern-versioning-dotnet-desktop-apps-idempotent-artifacts/</guid><description>&lt;p&gt;Desktop software makes versioning visible in a way that web systems often do not. A backend can hide a surprising amount of release machinery behind its platform. A Windows executable cannot. Explorer exposes file versions, installers compare product versions, update channels make decisions based on package identity and support usually starts with a screenshot from an About dialog.&lt;/p&gt;</description></item><item><title>Modern versioning for .NET apps and libraries and how to produce idempotent artifacts</title><link>https://benjamin-abt.com/blog/2026/06/26/modern-versioning-dotnet-apps-libraries-idempotent-artifacts/</link><pubDate>Fri, 26 Jun 2026 00:00:00 +0000</pubDate><guid>https://benjamin-abt.com/blog/2026/06/26/modern-versioning-dotnet-apps-libraries-idempotent-artifacts/</guid><description>&lt;p&gt;Versioning stays invisible right up to the point when it fails. A package has to be reissued, a support case depends on one exact binary, or staging and production turn out to run artifacts from the same commit that do not quite match. At that moment the version number stops being release-note decoration and becomes engineering data.&lt;/p&gt;</description></item><item><title>Local Aspire Development with Azure Cosmos DB and the Preview Emulator</title><link>https://benjamin-abt.com/blog/2026/06/24/local-development-aspire-cosmosdb-preview-emulator/</link><pubDate>Wed, 24 Jun 2026 00:00:00 +0000</pubDate><guid>https://benjamin-abt.com/blog/2026/06/24/local-development-aspire-cosmosdb-preview-emulator/</guid><description>&lt;p&gt;Distributed applications tend to feel straightforward until a real cloud dependency enters the picture. Azure Cosmos DB is a good example. In Azure, the preferred model is usually clear: the application should connect without secrets and authenticate through Managed Identity. Local development has different constraints. There is no managed identity attached to a machine in the same way, but the application still needs a reachable endpoint, credentials, startup ordering and a database that exists before the first request reaches repository code.&lt;/p&gt;</description></item><item><title>Using MiMo V2.5 with GitHub Copilot BYOK and OpenCode Zen (Promo)</title><link>https://benjamin-abt.com/blog/2026/05/27/vscode-github-copilot-byok-opencode-mimo-v2-5-free/</link><pubDate>Wed, 27 May 2026 00:00:00 +0000</pubDate><guid>https://benjamin-abt.com/blog/2026/05/27/vscode-github-copilot-byok-opencode-mimo-v2-5-free/</guid><description>&lt;p&gt;MiMo V2.5 is the latest reasoning and coding model from Xiaomi&amp;rsquo;s AI lab. Xiaomi positions MiMo as a general-purpose reasoning model with particular strength in code generation, structured output and tool calling. In May 2026 the model was made available through OpenCode Zen as part of a promotional offer, meaning it can be used at no cost during the promotion period.&lt;/p&gt;</description></item><item><title>Using OpenAI Models in VS Code with GitHub Copilot BYOK</title><link>https://benjamin-abt.com/blog/2026/05/24/vscode-github-copilot-byok-openai/</link><pubDate>Sun, 24 May 2026 00:00:00 +0000</pubDate><guid>https://benjamin-abt.com/blog/2026/05/24/vscode-github-copilot-byok-openai/</guid><description>&lt;p&gt;GitHub Copilot&amp;rsquo;s pricing shift from flat premium request units to token-based GitHub AI Credits, scheduled for June 1, 2026, changes the economics of heavy AI usage in VS Code meaningfully. Models with large context windows, high output verbosity or intensive agent loops now have a more direct relationship between compute and cost. That makes model selection a more relevant engineering decision than it was under the older quota model.&lt;/p&gt;</description></item><item><title>Using Kimi K2.5 and DeepSeek V4 in VS Code with GitHub Copilot BYOK and OpenCode</title><link>https://benjamin-abt.com/blog/2026/05/23/vscode-github-copilot-byok-opencode-kimi-deepseek/</link><pubDate>Sat, 23 May 2026 00:00:00 +0000</pubDate><guid>https://benjamin-abt.com/blog/2026/05/23/vscode-github-copilot-byok-opencode-kimi-deepseek/</guid><description>&lt;p&gt;GitHub Copilot is moving into a different cost model. GitHub announced that Copilot plans will transition from premium request units to GitHub AI Credits on June 1, 2026. Usage will be calculated from token consumption, including input, output and cached tokens, using the listed API rates for each model. This is a more direct mapping between compute usage and billing, but it also changes the economics for teams that have started to use agentic workflows heavily.&lt;/p&gt;</description></item><item><title>Zero-Code REST API Mocking with json-server for Angular and React</title><link>https://benjamin-abt.com/blog/2026/05/21/json-server-mock-api-angular-react/</link><pubDate>Thu, 21 May 2026 00:00:00 +0000</pubDate><guid>https://benjamin-abt.com/blog/2026/05/21/json-server-mock-api-angular-react/</guid><description>&lt;p&gt;Frontend development often hits a practical wall early: the backend API does not exist yet, is unreachable in local environments, or is shared between multiple teams and cannot be safely modified during development. The typical workarounds - hardcoded response stubs, in-memory interceptors, or hand-rolled Express servers - all impose overhead that does not belong in the development workflow.&lt;/p&gt;</description></item><item><title>Cloudflare Workers with wrangler.toml: Preview URLs, production routes and SEO-safe SPA handling</title><link>https://benjamin-abt.com/blog/2026/05/10/cloudflare-workers-preview-urls-production-routing-and-seo/</link><pubDate>Sun, 10 May 2026 00:00:00 +0000</pubDate><guid>https://benjamin-abt.com/blog/2026/05/10/cloudflare-workers-preview-urls-production-routing-and-seo/</guid><description>&lt;p&gt;Cloudflare Workers can separate production and preview traffic cleanly without sacrificing canonical URL control. For search visibility, that detail matters more than the mere existence of preview links. The production hostname stays singular, the preview hostname stays disposable and the Worker runtime can normalize HTML paths before duplicate URLs leak into indexing.&lt;/p&gt;</description></item><item><title>Azure Static Web Apps with GitHub Actions: Pull Request Preview Environments, automatic teardown and stable production URLs</title><link>https://benjamin-abt.com/blog/2026/05/06/azure-static-web-app-pull-request-preview-urls-with-teardown/</link><pubDate>Wed, 06 May 2026 00:00:00 +0000</pubDate><guid>https://benjamin-abt.com/blog/2026/05/06/azure-static-web-app-pull-request-preview-urls-with-teardown/</guid><description>&lt;p&gt;Azure Static Web Apps has one feature that is easy to underestimate until a team starts using it seriously: pull requests can behave like first-class deployment units.&lt;/p&gt;</description></item><item><title>Backing Up GitHub Repositories on Synology NAS with gickup</title><link>https://benjamin-abt.com/blog/2026/04/23/backup-github-repositories-on-synology-with-gickup/</link><pubDate>Thu, 23 Apr 2026 00:00:00 +0000</pubDate><guid>https://benjamin-abt.com/blog/2026/04/23/backup-github-repositories-on-synology-with-gickup/</guid><description>&lt;p&gt;GitHub is an operational platform, not a backup strategy. For a long time, that distinction often felt theoretical because GitHub is - usually - highly available and because Git itself already distributes history well. The gap becomes visible once repositories are treated as regulated business assets instead of convenient hosting locations.&lt;/p&gt;</description></item></channel></rss>