Client v5: BLE, BLE Hosting, HTTP, Jobs - Linux, MacOS, & Blazor Support! Full AOT, RX on BLE only & MANY other features!Check It Out
Document DB v8.1 Interceptors, Temporal Support, Telemetry Collection, All Calculations, String Based APIs, & Orleans Storage Providers!Feed The Machine Here
Controls: The biggest control suite for MAUI & Blazor + the ULTIMATE CameraView to end all others!Learn More
Shiny Health 2.0 - Every Health Metric shared between Apple & Google Health - NOW with AI Tools!Check It Out
Introducing AI Conversations: Natural Language Interaction for Your Apps!Learn More
Mediator 6.6: AI Tool Generation and More AOT generationCheck It Out
Shiny.Music v3: Lyrics, Album Art, Playlists, MusicKit and more!Check It Out
Architecture
Shiny is built around three core concepts: Services, Delegates, and Events. These form the foundation of every Shiny library and understanding them will help you use Shiny effectively.
Shiny is designed as a unified framework — not a collection of independent plugins. Under the hood, it manages storage, logging, platform lifecycle hooks, and cross-platform utilities so you don’t have to.
AOT-first. As of v5, Reactive Extensions (Rx) has been removed from Shiny.Core, Shiny.Jobs, Shiny.Locations, Shiny.Net.Http, Shiny.Notifications, Shiny.Push, and Shiny.BluetoothLE.Hosting. Those modules now expose plain C# event EventHandler<T> for foreground notification. Shiny.BluetoothLE (client) retains IObservable<T> because reactive composition is genuinely useful when chaining GATT operations and managing scan lifecycles.
Services are the primary API you interact with. They are registered with dependency injection and provide the interface for controlling platform features.
// Inject and use services directly
IGpsManagergpsManager; // injected
await gpsManager.StartListener(newGpsRequest
{
UseBackground =true
});
Services follow standard .NET DI patterns — register once, inject anywhere.
Delegates
Delegates are your callback handlers for background events. They are registered at startup and called by Shiny when platform events fire — even when your app isn’t in the foreground.
publicclassMyGpsDelegate : IGpsDelegate
{
publicTaskOnReading(IGpsReadingreading)
{
// Handle GPS reading in background
}
}
Delegates support full dependency injection and are treated as singletons.
Events
Most Shiny modules expose plain C# event EventHandler<T> for foreground notifications — simple to consume, AOT-clean, and free of System.Reactive overhead.
Events are ideal for UI binding and foreground scenarios. Shiny.BluetoothLE (client) retains IObservable<T> because reactive composition is genuinely useful for GATT pipelines and scan lifecycles.