From shiny-extensions
Generate and configure Shiny Stores for .NET - cross-platform key/value stores with persistent service binding for mobile, desktop, and Blazor WebAssembly
How this skill is triggered — by the user, by Claude, or both
Slash command
/shiny-extensions:shiny-storesThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
- IKeyValueStore
You are an expert in Shiny Extensions Stores, a .NET library providing cross-platform key/value store abstraction with persistent service binding.
Invoke this skill when the user wants to:
INotifyPropertyChanged objects to persistent storageDocumentation: https://shinylib.net/extensions/stores/
Repository: https://github.com/shinyorg/Shiny.Extensions
Packages: Shiny.Extensions.Stores, Shiny.Extensions.Stores.Web
| Alias | Platform | Implementation |
|---|---|---|
"memory" | All | In-memory dictionary |
"settings" | Android | SharedPreferences |
"settings" | iOS/macOS | NSUserDefaults |
"settings" | Windows | ApplicationData.LocalSettings |
"settings" | Blazor | localStorage |
"secure" | Android | EncryptedSharedPreferences |
"secure" | iOS/macOS | Keychain |
"session" | Blazor | sessionStorage |
// Mobile/Desktop - registers memory, settings, and secure stores
services.AddShinyStores();
// Blazor WebAssembly - adds localStorage and sessionStorage
services.AddShinyWebAssemblyStores();
// Via IKeyValueStoreFactory
public class MyService(IKeyValueStoreFactory storeFactory)
{
public void SaveSetting(string key, string value)
{
var store = storeFactory.GetStore("settings");
store.Set(key, value);
}
public T GetSetting<T>(string key, T defaultValue = default)
{
var store = storeFactory.DefaultStore;
return store.Get<T>(key, defaultValue);
}
}
Bind INotifyPropertyChanged objects to a store so property changes are automatically persisted:
// Register a persistent service
services.AddPersistentService<AppSettings>(); // Uses default store
services.AddPersistentService<SecureSettings>("secure"); // Uses secure store
// The class
public class AppSettings : INotifyPropertyChanged
{
string theme = "light";
public string Theme
{
get => theme;
set { theme = value; OnPropertyChanged(); }
}
// ... INotifyPropertyChanged implementation
}
You can also target a specific store with the attribute:
[ObjectStoreBinder("secure")]
public class SecureSettings : INotifyPropertyChanged
{
// Properties are automatically persisted to the secure store
}
store.Get<T>(key, defaultValue); // Get with default
store.GetRequired<T>(key); // Throws if not found
store.SetOrRemove(key, value); // Removes if value is null
store.SetDefault<T>(key, value); // Only sets if key doesn't exist
store.IncrementValue(key); // Thread-safe integer increment
AddShinyStores() for mobile/desktop, AddShinyWebAssemblyStores() for BlazorAddPersistentService<T>() for auto-persisting settings classesINotifyPropertyChanged for persistent servicesAddPersistentService<T>()"secure" store alias for sensitive data (tokens, credentials)[Reflector] and make them partial to bypass reflection for faster bindingnpx claudepluginhub shinyorg/skills --plugin shiny-extensionsGuides completion of development work by verifying tests, detecting environment, and presenting structured options for merge, PR, or cleanup.
Guides creation and editing of skills using test-driven development with pressure scenarios and subagents to verify agent compliance.
Dispatches multiple subagents concurrently for independent tasks without shared state. Use when facing 2+ unrelated failures or subsystems that can be investigated in parallel.