Skip to content
Shiny.NET
Commercial SupportGuaranteed response times on Shiny bug fixes, straight from the maintainers. Plans from US$1,500 a year.See the plans

Foundation

Start here. These libraries have no platform code of their own; they are the patterns the rest of Shiny is built on, and most of them are just as useful in a console app or an ASP.NET service as in a phone app.

Core

The host, lifecycle hooks and device monitoring every Shiny module builds on

Get started

Shiny.Core is the package every other Shiny module sits on — you rarely reference it on purpose because Jobs, Locations, BluetoothLE and Push pull it in. It still gives your own code a lot: platform abstractions, lifecycle hooks, startup tasks and device monitoring.

  • Boots a Shiny host with or without .NET MAUI
  • Platform abstractions and lifecycle hooks
  • Startup tasks and device monitoring
  • Shiny's AccessState permission model and Android foreground service helpers

Mediator

A source-generated mediator with middleware for offline, caching, validation and resiliency

Get started

A mediator pattern implementation built for every kind of .NET app — mobile, desktop and server. Source-generated and AOT-ready, with middleware you switch on with a single attribute.

  • Offline support, caching, validation and resiliency middleware — one attribute each
  • HTTP request handlers generated from contracts
  • Expose contracts as AI-callable tools
  • Works with MAUI, Blazor, Uno Platform, ASP.NET Core, Prism and Dapper

Actors

Orleans-style virtual actors in one process — even inside a MAUI or Blazor app

Get started

Small objects with an id, their own state and one call at a time, so there are no locks to write. Activated on first call and put away when idle, with proxies and registrations generated at compile time — AOT-clean, and callable from other devices over HTTP.

  • Turn-based calls with deadlock detection — no locks
  • ETag-checked state, auto-save, event sourcing and migrations
  • Typed and durable streams, timers and persistent reminders
  • Reminders as background jobs or on-time OS notifications on mobile
  • Remoting over HTTP, mDNS discovery and a test host with fake time

Dependency Injection

Attribute-driven service registration, generated at compile time

Get started

Stop wiring up every service by hand. Tag a class with an attribute and a source generator writes the registration — no reflection, no startup scan, fully AOT-compatible.

  • Add an attribute, and the service is registered
  • Categories and configuration-driven registration
  • Generate reflection-free AI tools from service interfaces
  • Every registration generated into one readable file

Reflector

Reflection-style property access without runtime reflection

Get started

Reflection is powerful but slow, and it breaks AOT. Reflector uses source generators to give you the same dynamic property access at compile time — mark a class partial, add an attribute, done.

  • Enumerate, read and write properties with zero reflection
  • Records supported
  • JSON serialization and assembly-info helpers
  • Trimming and Native AOT safe

Serialization

Every JsonSerializerContext in your app behind one AOT-safe ISerializer

Get started

Centralize every JsonSerializerContext behind a single ISerializer. Contexts auto-register, and element types opt into collection support, so lists and arrays round-trip without reflection.

  • [ShinyJsonContext] auto-registers a context
  • [ShinyJsonInclude] makes List<T>, T[] and friends round-trip
  • Compose inline JsonConverter<T>s
  • DI and static usage patterns, with diagnostics

Localization Generator

Strongly-typed classes generated from your .resx files

Get started

Microsoft.Extensions.Localization has great abstractions but loses the strong typing .resx files used to give you. This generator brings it back — a typed class per resource file, with compile-time safety and IntelliSense.

  • No more typo-prone string lookups
  • Compile-time safety and IntelliSense for every key
  • Built on Microsoft.Extensions.Localization
  • Namespaces follow your directory structure