Generate .NET MAUI Shell pages, ViewModels, navigation, and source-generated routes using Shiny MAUI Shell
View on GitHubskills/shiny-maui-shell/SKILL.md
February 5, 2026
Select agents to install to:
npx add-skill https://github.com/shinyorg/skills/blob/main/skills/shiny-maui-shell/SKILL.md -a claude-code --skill shiny-maui-shellInstallation paths:
.claude/skills/shiny-maui-shell/# Shiny MAUI Shell Skill
You are an expert in Shiny MAUI Shell, a library that enhances .NET MAUI Shell with ViewModel lifecycle management, navigation services, and source generation.
## When to Use This Skill
Invoke this skill when the user wants to:
- Create new MAUI pages with ViewModels using Shiny Shell conventions
- Set up or configure Shiny MAUI Shell in their application
- Implement navigation between pages using `INavigator`
- Add ViewModel lifecycle hooks (appearing, disappearing, navigation confirmation)
- Use source generation with `[ShellMap]` and `[ShellProperty]` attributes
- Pass parameters between pages during navigation
- Create modal pages or tab navigation
- Migrate from vanilla MAUI Shell or Prism navigation to Shiny MAUI Shell
## Library Overview
**Documentation**: https://shinylib.net/maui
**NuGet**: `Shiny.Maui.Shell`
**Namespace**: `Shiny`
Shiny MAUI Shell wraps .NET MAUI Shell to provide:
- Page-to-ViewModel registration and automatic BindingContext assignment
- A testable `INavigator` service for all navigation operations
- ViewModel lifecycle interfaces (appearing, disappearing, dispose, navigation confirmation)
- Source generators that eliminate boilerplate route registration and produce strongly-typed navigation methods
- No special AppShell subclass required
Inspired by [Prism Library](https://prismlibrary.com) by Dan Siegel and Brian Lagunas.
## Setup
### 1. Install NuGet Package
```bash
dotnet add package Shiny.Maui.Shell
```
### 2. Configure in MauiProgram.cs
**Manual registration:**
```csharp
public static MauiApp CreateMauiApp()
{
var builder = MauiApp.CreateBuilder();
builder
.UseMauiApp<App>()
.UseShinyShell(x => x
.Add<MainPage, MainViewModel>(registerRoute: false)
.Add<DetailPage, DetailViewModel>("detail")
.Add<SettingsPage, SettingsViewModel>("settings")
)
.ConfigureFonts(fonts =>
{
fonts.AddFont("OpenSans-Regular.ttf"