<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Allan Ritchie</title><description>Ramblings of an old software engineer</description><link>https://allanritchie.com/</link><item><title>Shiny HTTP Transfers: Why Is This Data Still Not Here?</title><link>https://allanritchie.com/blog/2026/08/background-http-transfers/</link><guid isPermaLink="true">https://allanritchie.com/blog/2026/08/background-http-transfers/</guid><description>Somebody is waiting on bytes that were supposed to have arrived. Usually nothing was carrying them — HttpClient stops the second iOS suspends your app, and Android will reclaim the process while you are not looking. Shiny.Net.Http hands the bytes to the platform instead — NSURLSession, a foreground service, a connectivity-driven managed loop, Service Worker Background Sync — under one API. Plus why I sign Azure Blob and S3 uploads by hand instead of taking the vendor SDKs, what the Android service does when the network drops, and why a Live Activity has to animate a time range instead of a percentage.</description><pubDate>Wed, 26 Aug 2026 04:00:00 GMT</pubDate></item><item><title>DocumentDB in Aspire</title><link>https://allanritchie.com/blog/2026/08/documentdb-aspire/</link><guid isPermaLink="true">https://allanritchie.com/blog/2026/08/documentdb-aspire/</guid><description>DocumentDb runs on ten-odd backends, but picking one used to be a line of C# inside your service. The Aspire integration moves that decision into the AppHost — the consuming code becomes one provider-agnostic line with health checks and OpenTelemetry attached, the admin UI becomes a resource, and an entire Orleans silo points at the same store.</description><pubDate>Mon, 24 Aug 2026 04:00:00 GMT</pubDate></item><item><title>DocumentDB in .NET Orleans</title><link>https://allanritchie.com/blog/2026/08/documentdb-orleans-stack/</link><guid isPermaLink="true">https://allanritchie.com/blog/2026/08/documentdb-orleans-stack/</guid><description>Membership, grain storage, reminders, grain directory and streams are five separate provider contracts. Shiny.DocumentDb.Orleans implements all five on one IDocumentStore — one connection string, grain state you can query without waking a grain, and a stream backlog you can actually open and look at.</description><pubDate>Fri, 21 Aug 2026 04:00:00 GMT</pubDate></item><item><title>Level Up Animation with Keyframes for MAUI &amp; Blazor</title><link>https://allanritchie.com/blog/2026/08/keyframes-motion-icons-shinybutton/</link><guid isPermaLink="true">https://allanritchie.com/blog/2026/08/keyframes-motion-icons-shinybutton/</guid><description>A seekable keyframe engine for .NET MAUI with CSS @keyframes semantics in XAML, 42 motion icons compiled from one spec into a drawn scene on MAUI and real CSS keyframes on Blazor, and a ShinyButton that finally makes press-wait-see-if-it-worked a one-liner.</description><pubDate>Thu, 20 Aug 2026 04:00:00 GMT</pubDate></item><item><title>Shiny Controls 1.0 — The Ultra Control Suite for .NET MAUI &amp; Blazor</title><link>https://allanritchie.com/blog/2026/08/shiny-controls-1-0/</link><guid isPermaLink="true">https://allanritchie.com/blog/2026/08/shiny-controls-1-0/</guid><description>Sixty-odd controls, one token contract, two renderers, zero WebViews. Shiny Controls hits 1.0 for .NET MAUI and Blazor — and there is a live playground you can click through before you install anything.</description><pubDate>Mon, 17 Aug 2026 04:00:00 GMT</pubDate></item><item><title>Shiny.DocumentDb — Hidden Gems</title><link>https://allanritchie.com/blog/2026/08/documentdb-hidden-gems/</link><guid isPermaLink="true">https://allanritchie.com/blog/2026/08/documentdb-hidden-gems/</guid><description>Thirteen major versions in, there&apos;s a lot of DocumentDb that shipped in a bullet list and never got explained. A store that diffs documents for you, a read path that never deserializes, and an extensibility surface that soft delete is entirely built out of.</description><pubDate>Thu, 13 Aug 2026 04:00:00 GMT</pubDate></item><item><title>Shiny.DocumentDb v13 — Encryption, an Outbox, and a Front Door</title><link>https://allanritchie.com/blog/2026/08/documentdb-v13/</link><guid isPermaLink="true">https://allanritchie.com/blog/2026/08/documentdb-v13/</guid><description>v13 puts AES-256-GCM field encryption in the core package, adds a transactional outbox that commits with the write that caused it, and gives a document type a front door — REST + Server-Sent Events, and an MCP server. Plus Orleans streams on the database you already have, and admin tools that read an encrypted store without a key.</description><pubDate>Wed, 12 Aug 2026 04:00:00 GMT</pubDate></item><item><title>Shiny.Net.HttpServer — A Real HTTP Server Where ASP.NET Core Will Not Go</title><link>https://allanritchie.com/blog/2026/08/shiny-httpserver/</link><guid isPermaLink="true">https://allanritchie.com/blog/2026/08/shiny-httpserver/</guid><description>Ten new packages: a dependency-light, AOT/trim-clean HTTP/1.1, HTTP/2 and HTTP/3 server that runs anywhere .NET runs — including inside a .NET MAUI app on iOS and Android. Routing, middleware, DI scopes, WebSockets, SSE, TLS with managed self-signed certs, an OpenAPI document built with zero reflection, source-generated typed endpoints, XML/MessagePack/protobuf without reflection, gRPC and gRPC-Web, a WebDAV mount, mediator handlers and DocumentDb documents as endpoints, tunnelling so a phone is reachable from the internet, and an MCP server you can point Claude at.</description><pubDate>Tue, 11 Aug 2026 04:00:00 GMT</pubDate></item><item><title>SwiftDotNet — It Started With &quot;What If I Could Just Write SwiftUI in C#?&quot;</title><link>https://allanritchie.com/blog/2026/08/swiftdotnet/</link><guid isPermaLink="true">https://allanritchie.com/blog/2026/08/swiftdotnet/</guid><description>A shower thought about writing SwiftUI from C# turned into a Kotlin shim for Jetpack Compose, and then into the realization that the shim was never the point. One C# view tree, a diff engine, and a patch protocol — now rendering as real SwiftUI, real Compose, real GTK4, real WinUI, real DOM, a from-scratch SkiaSharp toolkit that paints the whole thing itself, and — as of today — characters in a terminal, images and all. Plus 28 real controls built on it, what writing your own looks like on each backend, and an honest accounting of how far the Skia renderers still have to go. Think .NET Comet, but without the MAUI underneath it.</description><pubDate>Tue, 04 Aug 2026 04:00:00 GMT</pubDate></item><item><title>Shiny.DocumentDb — Doing All The Things!</title><link>https://allanritchie.com/blog/2026/07/documentdb-v12/</link><guid isPermaLink="true">https://allanritchie.com/blog/2026/07/documentdb-v12/</guid><description>v12 ships an admin UI for your document stores, schema-free JSON collections with no CLR type at all, interceptors that can replace a write, soft delete in the box, a fully trim/AOT-clean package set, and a provider consolidation that deleted 4,300 lines and found four real bugs on its way out.</description><pubDate>Mon, 27 Jul 2026 04:00:00 GMT</pubDate></item><item><title>Faces, Voices &amp; Documents — On-Device Recognition Controls for .NET MAUI</title><link>https://allanritchie.com/blog/2026/07/recognition-intelligence/</link><guid isPermaLink="true">https://allanritchie.com/blog/2026/07/recognition-intelligence/</guid><description>A MAUI UI July post: two drop-in MAUI controls — FaceRecognitionView and FaceEnrollmentView — that put live face recognition and a guided enrollment wizard on screen in one line of XAML, plus the CameraView frame analyzer, a GraphicsView overlay with an even-odd scrim, speaker recognition, and Shiny.DocumentDb + sqlite-vec as the on-device vector database.</description><pubDate>Mon, 27 Jul 2026 04:00:00 GMT</pubDate></item><item><title>Giving your .NET MAUI a real set of AI Wings</title><link>https://allanritchie.com/blog/2026/07/maui-ai-wings/</link><guid isPermaLink="true">https://allanritchie.com/blog/2026/07/maui-ai-wings/</guid><description>A .NET MAUI app built straight on Microsoft.Extensions.AI — an IChatClient onto OpenAI, ChatOptions.Tools, and UseFunctionInvocation running the loop. The chat UI is a control; the hands are Shiny — contacts, reminders, calendar, GPS, health, music, a local document DB, your own services, and the app&apos;s own navigation. All opt-in, all switchable, all AOT-clean.</description><pubDate>Fri, 24 Jul 2026 04:00:00 GMT</pubDate></item><item><title>Give Your MAUI Agent Hands — Contacts, Reminders &amp; Location as AI Tools</title><link>https://allanritchie.com/blog/2026/07/shiny-ai-tools/</link><guid isPermaLink="true">https://allanritchie.com/blog/2026/07/shiny-ai-tools/</guid><description>Three new Microsoft.Extensions.AI packages turn device services into tools an LLM can call — Shiny.Contacts.Extensions.AI, Shiny.Notifications.Extensions.AI, and Shiny.Locations.Extensions.AI. Opt-in, read-only by default, AOT-safe, and they all compose into one IChatClient.</description><pubDate>Mon, 06 Jul 2026 04:00:00 GMT</pubDate></item><item><title>A NEW CameraView to Rule Them All</title><link>https://allanritchie.com/blog/2026/06/cameraview/</link><guid isPermaLink="true">https://allanritchie.com/blog/2026/06/cameraview/</guid><description>One CameraView for .NET MAUI (iOS, Android, Windows, macOS AppKit) and Blazor WebAssembly — live preview, photo/video capture, 11 live filters, and a frame-analysis pipeline that scans barcodes, boxes faces, detects motion, runs OCR, and parses invoices, receipts, driver&apos;s licenses, health cards, credit cards, and passports into strongly-typed records.</description><pubDate>Mon, 15 Jun 2026 04:00:00 GMT</pubDate></item><item><title>Shiny Health 2.0 — The Ultimate Cross-Platform Health Library</title><link>https://allanritchie.com/blog/2026/06/shiny-health-v2/</link><guid isPermaLink="true">https://allanritchie.com/blog/2026/06/shiny-health-v2/</guid><description>One IHealthService for Apple HealthKit and Android Health Connect — now with 30+ data types across activity, body, vitals, nutrition, reproductive/cycle tracking and workouts, real-time observation, and a Microsoft.Extensions.AI tool surface so an LLM can read and write your health data.</description><pubDate>Mon, 15 Jun 2026 04:00:00 GMT</pubDate></item><item><title>Shiny.Data.Sync — Offline-First Record Sync, Built on Jobs &amp; HTTP Transfers</title><link>https://allanritchie.com/blog/2026/06/datasync/</link><guid isPermaLink="true">https://allanritchie.com/blog/2026/06/datasync/</guid><description>A background-capable, bidirectional record-sync engine for .NET apps. It doesn&apos;t reinvent background execution — it stands on the same playbook as Shiny Jobs and Shiny.Net.Http, moving records where transfers move files and riding the Jobs scheduler for periodic pulls.</description><pubDate>Sat, 13 Jun 2026 04:00:00 GMT</pubDate></item><item><title>Orleans on DocumentDb — Query Your Grains Without Waking Them Up</title><link>https://allanritchie.com/blog/2026/06/documentdb-orleans/</link><guid isPermaLink="true">https://allanritchie.com/blog/2026/06/documentdb-orleans/</guid><description>Shiny.DocumentDb.Orleans puts the whole Orleans persistence stack — grain storage, reminders, clustering, and grain directory — on one backend-agnostic IDocumentStore. The headline win: query grain state directly, without activating a single grain.</description><pubDate>Sat, 13 Jun 2026 04:00:00 GMT</pubDate></item><item><title>Shiny.DocumentDb v6 — Vectors, Filters &amp; a Real Connection Pool</title><link>https://allanritchie.com/blog/2026/06/documentdb-v6/</link><guid isPermaLink="true">https://allanritchie.com/blog/2026/06/documentdb-v6/</guid><description>v6 adds cross-provider vector / ANN search, EF-style global query filters, composite JSON indexes, real connection pooling on server SQL, and per-query change monitoring — without changing the schema-free, AOT-safe shape of the API.</description><pubDate>Mon, 01 Jun 2026 04:00:00 GMT</pubDate></item><item><title>Introducing Shiny.AiConversation — Text, Voice &amp; Wake Word in One Service</title><link>https://allanritchie.com/blog/2026/05/ai-conversation/</link><guid isPermaLink="true">https://allanritchie.com/blog/2026/05/ai-conversation/</guid><description>Shiny.AiConversation wraps chat clients, speech recognition, text-to-speech, audio playback, message persistence, and state management into a single IAiConversationService interface for .NET.</description><pubDate>Wed, 06 May 2026 04:00:00 GMT</pubDate></item><item><title>The Feedback Service — One Hook to Rule Them All</title><link>https://allanritchie.com/blog/2026/05/feedback-service/</link><guid isPermaLink="true">https://allanritchie.com/blog/2026/05/feedback-service/</guid><description>Shiny Controls v1.0 ships with IFeedbackService — a single injectable service that every interactive control calls. Implement it once for haptic, TTS, sound effects, analytics, or any combination.</description><pubDate>Sun, 03 May 2026 04:00:00 GMT</pubDate></item><item><title>DocumentDb AI Tools — Give Your LLM a Database</title><link>https://allanritchie.com/blog/2026/04/documentdb-ai-tools/</link><guid isPermaLink="true">https://allanritchie.com/blog/2026/04/documentdb-ai-tools/</guid><description>Shiny.DocumentDb.Extensions.AI turns your document store into a set of LLM-callable tools. Register types, set capabilities, and let the agent query, insert, update, and delete documents through natural language.</description><pubDate>Thu, 30 Apr 2026 04:00:00 GMT</pubDate></item><item><title>Turn Any Interface Into an AI Tool — Shiny DI 3.0</title><link>https://allanritchie.com/blog/2026/04/di-ai-tools/</link><guid isPermaLink="true">https://allanritchie.com/blog/2026/04/di-ai-tools/</guid><description>Mark a service interface with [Tool], add [Description] to your methods, and a source generator produces fully typed AIFunction classes compatible with Microsoft.Extensions.AI. AOT-safe, zero boilerplate.</description><pubDate>Wed, 29 Apr 2026 04:00:00 GMT</pubDate></item><item><title>One Contract, Three Transports — Mediator AI Tooling</title><link>https://allanritchie.com/blog/2026/04/mediator-ai-tools/</link><guid isPermaLink="true">https://allanritchie.com/blog/2026/04/mediator-ai-tools/</guid><description>Write a single C# record and have it automatically become a fully typed AI tool — with zero adapter code. Shiny Mediator 6.3 delivers contract-first source generation for AI tools, HTTP clients, and ASP.NET endpoints.</description><pubDate>Tue, 28 Apr 2026 04:00:00 GMT</pubDate></item><item><title>AI-Powered Navigation in Shiny MAUI Shell — Chat to Navigate, Intent to Form</title><link>https://allanritchie.com/blog/2026/04/shiny-shell-ai/</link><guid isPermaLink="true">https://allanritchie.com/blog/2026/04/shiny-shell-ai/</guid><description>How Shiny MAUI Shell uses source generation and Microsoft.Extensions.AI to let an AI chat agent discover your app routes, match user intent, and navigate with pre-filled forms.</description><pubDate>Sun, 26 Apr 2026 04:00:00 GMT</pubDate></item><item><title>UI Automated Testing for .NET MAUI with MauiDevFlow — And How AI Wrote the Tests</title><link>https://allanritchie.com/blog/2026/03/maui-ui-testing-mauidevflow/</link><guid isPermaLink="true">https://allanritchie.com/blog/2026/03/maui-ui-testing-mauidevflow/</guid><description>How I used MauiDevFlow and Claude Code to go from zero UI tests to full screen coverage in minutes — inspecting live apps, adding AutomationIds, and generating real automated tests from actual app screens.</description><pubDate>Fri, 27 Mar 2026 04:00:00 GMT</pubDate></item><item><title>Shiny Client v4 - Windows Support, .NET 10, and a Ton of Improvements</title><link>https://allanritchie.com/blog/2026/03/shiny-client-v4/</link><guid isPermaLink="true">https://allanritchie.com/blog/2026/03/shiny-client-v4/</guid><description>Shiny Client v4 brings Windows support for BLE, HTTP Transfers, and Locations, moves to .NET 10, and delivers major improvements to GPS, HTTP Transfers, Push, and BluetoothLE</description><pubDate>Thu, 26 Mar 2026 04:00:00 GMT</pubDate></item><item><title>Shiny.DocumentDb v3 — One API, Four Databases</title><link>https://allanritchie.com/blog/2026/03/shiny-documentdb-v3/</link><guid isPermaLink="true">https://allanritchie.com/blog/2026/03/shiny-documentdb-v3/</guid><description>The SQLite document store grows up. v3 adds MySQL, SQL Server, and PostgreSQL support with a clean provider abstraction — same fluent LINQ queries, same AOT support, any backend.</description><pubDate>Wed, 25 Mar 2026 04:00:00 GMT</pubDate></item><item><title>Shiny.Maui.ContactStore — Device Contact Access That Does It All</title><link>https://allanritchie.com/blog/2026/03/shiny-contactstore/</link><guid isPermaLink="true">https://allanritchie.com/blog/2026/03/shiny-contactstore/</guid><description>A cross-platform .NET MAUI library that gives you full CRUD access to device contacts with LINQ queries, native query translation, and zero platform ceremony.</description><pubDate>Tue, 24 Mar 2026 04:00:00 GMT</pubDate></item><item><title>Shiny MAUI Shell — A Library That Takes Shell to the Next Level</title><link>https://allanritchie.com/blog/2026/03/shiny-maui-shell/</link><guid isPermaLink="true">https://allanritchie.com/blog/2026/03/shiny-maui-shell/</guid><description>How Shiny MAUI Shell transforms .NET MAUI navigation from error-prone string routing into type-safe, testable, source-generated goodness.</description><pubDate>Mon, 23 Mar 2026 04:00:00 GMT</pubDate></item><item><title>Shiny.SqliteDocumentDb v2.0.0 — Table-Per-Type, Custom Ids, Diffing, and Batch Insert</title><link>https://allanritchie.com/blog/2026/03/shiny-sqlitedocumentdb-v2/</link><guid isPermaLink="true">https://allanritchie.com/blog/2026/03/shiny-sqlitedocumentdb-v2/</guid><description>v2.0.0 introduces table-per-type mapping, custom Id properties, document diffing via GetDiff, batch insert, a standalone core library without DI dependencies, and a convenience constructor — all fully AOT-safe</description><pubDate>Sun, 22 Mar 2026 04:00:00 GMT</pubDate></item><item><title>Introducing Shiny.Music — Cross-Platform Music Library Access for .NET MAUI</title><link>https://allanritchie.com/blog/2026/03/shiny-music/</link><guid isPermaLink="true">https://allanritchie.com/blog/2026/03/shiny-music/</guid><description>A new library that provides a unified API for browsing, searching, and playing music from the device music library on iOS and Android — with permissions, metadata, playback controls, and file export</description><pubDate>Sun, 01 Mar 2026 05:00:00 GMT</pubDate></item><item><title>Introducing Shiny.Spatial — A Dependency-Free Spatial Database and GPS Geofencing for .NET</title><link>https://allanritchie.com/blog/2026/03/shiny-spatial/</link><guid isPermaLink="true">https://allanritchie.com/blog/2026/03/shiny-spatial/</guid><description>A new library that turns SQLite into a spatial database with R*Tree indexing, custom geometry algorithms, polygon-based GPS geofencing with no OS region limits — zero native dependencies, fully AOT-compatible</description><pubDate>Sun, 01 Mar 2026 05:00:00 GMT</pubDate></item><item><title>Introducing Shiny.SqliteDocumentDb — Schema-Free JSON Documents in SQLite</title><link>https://allanritchie.com/blog/2026/02/shiny-sqlitedocumentdb/</link><guid isPermaLink="true">https://allanritchie.com/blog/2026/02/shiny-sqlitedocumentdb/</guid><description>A new library that turns SQLite into a document database with a fluent LINQ query builder, streaming, pagination, aggregates, indexes, projections, and full AOT support — no migrations required</description><pubDate>Sun, 22 Feb 2026 05:00:00 GMT</pubDate></item><item><title>Introducing Shiny.Maui.TableView — Settings-Style Pages for .NET MAUI, Without the Platform Pain</title><link>https://allanritchie.com/blog/2026/02/shiny-maui-tableview/</link><guid isPermaLink="true">https://allanritchie.com/blog/2026/02/shiny-maui-tableview/</guid><description>A pure .NET MAUI TableView control with 15 cell types, cascading styles, drag-sort, dynamic sections, and full MVVM support — no custom renderers required</description><pubDate>Sat, 21 Feb 2026 05:00:00 GMT</pubDate></item><item><title>CarPlay &amp; Android Auto with .NET MAUI</title><link>https://allanritchie.com/blog/2026/02/maui-carplay/</link><guid isPermaLink="true">https://allanritchie.com/blog/2026/02/maui-carplay/</guid><description>A practical guide to extending your .NET MAUI apps to the car dashboard — Apple CarPlay and Android Auto from the same codebase</description><pubDate>Fri, 20 Feb 2026 05:00:00 GMT</pubDate></item><item><title>.NET MAUI on Apple TV &amp; macOS (AppKit) — Yes, Really</title><link>https://allanritchie.com/blog/2026/02/maui-appletv-macos/</link><guid isPermaLink="true">https://allanritchie.com/blog/2026/02/maui-appletv-macos/</guid><description>An exploration of the GoneDotNet/mauiplatforms project that brings .NET MAUI to Apple TV (tvOS) and native macOS (AppKit) — platforms Microsoft never officially supported</description><pubDate>Thu, 12 Feb 2026 05:00:00 GMT</pubDate></item><item><title>The Importance of Open Source Libraries in the Age of AI</title><link>https://allanritchie.com/blog/2026/02/opensource-in-age-of-ai/</link><guid isPermaLink="true">https://allanritchie.com/blog/2026/02/opensource-in-age-of-ai/</guid><description>Why open source matters more than ever — AI amplifies its reach, but the human craft of building and maintaining libraries remains irreplaceable</description><pubDate>Wed, 11 Feb 2026 05:00:00 GMT</pubDate></item><item><title>Shiny Mediator &amp; AOT - Zero Reflection, Full Speed</title><link>https://allanritchie.com/blog/2026/02/shinymediator-aot/</link><guid isPermaLink="true">https://allanritchie.com/blog/2026/02/shinymediator-aot/</guid><description>A deep dive into every source generator and design choice that makes Shiny Mediator fully AOT &amp; trimming safe — zero reflection required</description><pubDate>Tue, 10 Feb 2026 05:00:00 GMT</pubDate></item><item><title>Shiny Mediator vs MediatR vs FastEndpoints</title><link>https://allanritchie.com/blog/2026/02/shinymediator-comparison/</link><guid isPermaLink="true">https://allanritchie.com/blog/2026/02/shinymediator-comparison/</guid><description>An honest comparison of three popular .NET mediation/CQRS libraries — what each does best and where they fall short</description><pubDate>Mon, 09 Feb 2026 05:00:00 GMT</pubDate></item><item><title>What&apos;s New in Shiny Mediator 6</title><link>https://allanritchie.com/blog/2026/02/shinymediator-whats-new-v6/</link><guid isPermaLink="true">https://allanritchie.com/blog/2026/02/shinymediator-whats-new-v6/</guid><description>A look at all the new features, improvements, and breaking changes in Shiny Mediator v6</description><pubDate>Sun, 08 Feb 2026 05:00:00 GMT</pubDate></item><item><title>Shiny Mediator - Getting Started</title><link>https://allanritchie.com/blog/2026/02/shinymediator-gettingstarted/</link><guid isPermaLink="true">https://allanritchie.com/blog/2026/02/shinymediator-gettingstarted/</guid><description>A Mediator Pattern with a focus on Apps written with .NET</description><pubDate>Sat, 07 Feb 2026 05:00:00 GMT</pubDate></item></channel></rss>