Source profileQuality 96/100

Postpartum-genushyacinthus29/dotnet-skills/skills/dotnet-maui/SKILL.md

dotnet-maui

Build, review, or migrate .NET MAUI applications across Android, iOS, macOS, and Windows with correct cross-platform UI, platform integration, and native packaging assumptions.

Source repository stars
9
Declared platforms
0
Static risk flags
1
Last source update
2026-08-23
Source checked
2026-08-25

Decision brief

What it does: where it fits

Build, review, or migrate . NET MAUI applications across Android, iOS, macOS, and Windows with correct cross-platform UI, platform integration, and native packaging assumptions.

Best for

    Not for

    • Tasks that require unconfirmed production actions or broad system permissions.
    • Environments where the pinned source and install steps cannot be inspected.

    Compatibility matrix

    Platform support, with evidence labels

    PlatformStatusEvidenceWhat to check
    CodexNot declaredNo explicit evidencePortability before use
    Claude CodeNot declaredNo explicit evidencePortability before use
    CursorNot declaredNo explicit evidencePortability before use
    Gemini CLINot declaredNo explicit evidencePortability before use
    Open the compatibility checker

    Installation

    Inspect first. Install second.

    The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.

    Source-detected install commandSource
    npx skills add https://github.com/Postpartum-genushyacinthus29/dotnet-skills --skill "skills/dotnet-maui"
    Safe inspection promptEditorial

    Inspect the Agent Skill "dotnet-maui" from https://github.com/Postpartum-genushyacinthus29/dotnet-skills/blob/f9c1a213bc25d95641adc3a59f8048cb5656741c/skills/dotnet-maui/SKILL.md at commit f9c1a213bc25d95641adc3a59f8048cb5656741c. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.

    Workflow

    What the source asks the agent to do

    1. 01

      Workflow

      1. Confirm target platforms — behavior differs across Android, iOS, Mac, Windows 2. Separate shared UI and platform code — use handlers and DI 3. Follow MVVM pattern — keep views dumb, logic in ViewModels 4. Handle lifecycle and permissions — platform contracts need testing 5. T…

      Confirm target platforms — behavior differs across Android, iOS, Mac, WindowsSeparate shared UI and platform code — use handlers and DIFollow MVVM pattern — keep views dumb, logic in ViewModels
    2. 02

      Trigger On

      working on cross-platform mobile or desktop UI in .NET MAUI

      working on cross-platform mobile or desktop UI in .NET MAUIintegrating device capabilities, navigation, or platform-specific codemigrating Xamarin.Forms or aligning a shared codebase across targets
    3. 03

      Documentation

      .NET MAUI Overview

      .NET MAUI OverviewEnterprise PatternsMVVM Pattern
    4. 04

      Platform Targets

      Review the “Platform Targets” section in the pinned source before continuing.

      Review and apply the “Platform Targets” source section.
    5. 05

      Project Structure

      Review the “Project Structure” section in the pinned source before continuing.

      Review and apply the “Project Structure” source section.

    Permission review

    Static risk signals and limitations

    Network access

    medium · line 93

    The documentation includes network, browsing, or remote request actions.

    <ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"

    Network access

    medium · line 94

    The documentation includes network, browsing, or remote request actions.

    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"

    Evidence record

    Why each signal appears

    EvidenceSourceComputedTestedEditorial
    SignalValueEvidence typeMeaning
    Quality score96/100ComputedDocumentation, specificity, maintenance, and trust rules
    Repository stars9SourceRepository attention, not individual Skill quality
    Compatibility0 platformsSourceDeclared in the catalog source record
    Usage guideautomated source guideEditorialGenerated or reviewed according to the visible evidence level

    Pinned source

    Provenance and original SKILL.md

    Repository
    Postpartum-genushyacinthus29/dotnet-skills
    Skill path
    skills/dotnet-maui/SKILL.md
    Commit
    f9c1a213bc25d95641adc3a59f8048cb5656741c
    License
    MIT
    Collected
    2026-08-25
    Default branch
    main
    View the original SKILL.md

    .NET MAUI

    Trigger On

    • working on cross-platform mobile or desktop UI in .NET MAUI
    • integrating device capabilities, navigation, or platform-specific code
    • migrating Xamarin.Forms or aligning a shared codebase across targets
    • implementing MVVM patterns in mobile apps

    Documentation

    References

    • patterns.md - Shell navigation, platform-specific code, messaging, lifecycle, data binding, and CollectionView patterns
    • anti-patterns.md - Common MAUI mistakes and how to avoid them

    Platform Targets

    PlatformBuild HostNotes
    AndroidWindows/MacEmulator or device
    iOSMac onlyRequires Xcode
    macOSMac onlyCatalyst
    WindowsWindowsWinUI 3

    Workflow

    1. Confirm target platforms — behavior differs across Android, iOS, Mac, Windows
    2. Separate shared UI and platform code — use handlers and DI
    3. Follow MVVM pattern — keep views dumb, logic in ViewModels
    4. Handle lifecycle and permissions — platform contracts need testing
    5. Test on real devices — emulators don't catch everything

    Project Structure

    MyApp/
    ├── MyApp/                    # Shared code
    │   ├── App.xaml              # Application entry
    │   ├── MauiProgram.cs        # DI and configuration
    │   ├── Views/                # XAML pages
    │   ├── ViewModels/           # MVVM ViewModels
    │   ├── Models/               # Domain models
    │   ├── Services/             # Business logic
    │   └── Platforms/            # Platform-specific code
    │       ├── Android/
    │       ├── iOS/
    │       ├── MacCatalyst/
    │       └── Windows/
    └── MyApp.Tests/
    

    MVVM Pattern

    ViewModel with MVVM Toolkit

    public partial class ProductsViewModel(IProductService productService) : ObservableObject
    {
        [ObservableProperty]
        private ObservableCollection<Product> _products = [];
    
        [ObservableProperty]
        [NotifyCanExecuteChangedFor(nameof(LoadProductsCommand))]
        private bool _isLoading;
    
        [RelayCommand(CanExecute = nameof(CanLoadProducts))]
        private async Task LoadProductsAsync()
        {
            IsLoading = true;
            try
            {
                var items = await productService.GetAllAsync();
                Products = new ObservableCollection<Product>(items);
            }
            finally
            {
                IsLoading = false;
            }
        }
    
        private bool CanLoadProducts() => !IsLoading;
    }
    

    View Binding

    <ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
                 xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                 xmlns:vm="clr-namespace:MyApp.ViewModels"
                 x:Class="MyApp.Views.ProductsPage"
                 x:DataType="vm:ProductsViewModel">
    
        <RefreshView Command="{Binding LoadProductsCommand}"
                     IsRefreshing="{Binding IsLoading}">
            <CollectionView ItemsSource="{Binding Products}">
                <CollectionView.ItemTemplate>
                    <DataTemplate x:DataType="models:Product">
                        <VerticalStackLayout Padding="10">
                            <Label Text="{Binding Name}" FontSize="18" />
                            <Label Text="{Binding Price, StringFormat='{0:C}'}" />
                        </VerticalStackLayout>
                    </DataTemplate>
                </CollectionView.ItemTemplate>
            </CollectionView>
        </RefreshView>
    </ContentPage>
    

    Dependency Injection

    public static class MauiProgram
    {
        public static MauiApp CreateMauiApp()
        {
            var builder = MauiApp.CreateBuilder();
            builder
                .UseMauiApp<App>()
                .ConfigureFonts(fonts =>
                {
                    fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
                });
    
            // Services
            builder.Services.AddSingleton<IProductService, ProductService>();
            builder.Services.AddSingleton<INavigationService, NavigationService>();
    
            // ViewModels
            builder.Services.AddTransient<ProductsViewModel>();
            builder.Services.AddTransient<ProductDetailViewModel>();
    
            // Pages
            builder.Services.AddTransient<ProductsPage>();
            builder.Services.AddTransient<ProductDetailPage>();
    
            return builder.Build();
        }
    }
    

    Navigation

    Shell Navigation

    // Register routes
    Routing.RegisterRoute(nameof(ProductDetailPage), typeof(ProductDetailPage));
    
    // Navigate with parameters
    await Shell.Current.GoToAsync($"{nameof(ProductDetailPage)}?id={product.Id}");
    
    // Receive parameters
    [QueryProperty(nameof(ProductId), "id")]
    public partial class ProductDetailViewModel : ObservableObject
    {
        [ObservableProperty]
        private string _productId;
    
        partial void OnProductIdChanged(string value)
        {
            LoadProduct(value);
        }
    }
    

    Navigation Service

    public interface INavigationService
    {
        Task NavigateToAsync<TViewModel>(object? parameter = null);
        Task GoBackAsync();
    }
    
    public class NavigationService : INavigationService
    {
        public async Task NavigateToAsync<TViewModel>(object? parameter = null)
        {
            var route = typeof(TViewModel).Name.Replace("ViewModel", "Page");
            var query = parameter is null ? "" : $"?id={parameter}";
            await Shell.Current.GoToAsync($"{route}{query}");
        }
    
        public Task GoBackAsync() => Shell.Current.GoToAsync("..");
    }
    

    Platform-Specific Code

    Using Partial Classes

    // Services/DeviceService.cs (shared)
    public partial class DeviceService
    {
        public partial string GetDeviceId();
    }
    
    // Platforms/Android/DeviceService.cs
    public partial class DeviceService
    {
        public partial string GetDeviceId()
        {
            return Android.Provider.Settings.Secure.GetString(
                Android.App.Application.Context.ContentResolver,
                Android.Provider.Settings.Secure.AndroidId);
        }
    }
    
    // Platforms/iOS/DeviceService.cs
    public partial class DeviceService
    {
        public partial string GetDeviceId()
        {
            return UIKit.UIDevice.CurrentDevice.IdentifierForVendor?.ToString() ?? "";
        }
    }
    

    Conditional Compilation

    public string GetPlatformInfo()
    {
    #if ANDROID
        return $"Android {Android.OS.Build.VERSION.Release}";
    #elif IOS
        return $"iOS {UIKit.UIDevice.CurrentDevice.SystemVersion}";
    #elif MACCATALYST
        return "macOS Catalyst";
    #elif WINDOWS
        return "Windows";
    #else
        return "Unknown";
    #endif
    }
    

    Anti-Patterns to Avoid

    Anti-PatternWhy It's BadBetter Approach
    God ViewModelUnmaintainableSplit into focused ViewModels
    Logic in code-behindHard to testUse MVVM and commands
    Platform code everywhereDefeats cross-platformUse handlers/DI
    Direct service calls in ViewsTight couplingUse ViewModel
    Ignoring lifecycleCrashes, leaksHandle lifecycle events

    Performance Best Practices

    1. Use compiled bindings:

      <ContentPage x:DataType="vm:ProductsViewModel">
      
    2. Virtualize long lists:

      <CollectionView ItemsSource="{Binding Items}"
                      ItemSizingStrategy="MeasureFirstItem" />
      
    3. Optimize images:

      var image = ImageSource.FromFile("image.png");
      // Use appropriate resolution for platform
      
    4. Avoid synchronous work on UI thread:

      // Bad
      var data = service.GetData(); // Blocks UI
      
      // Good
      var data = await service.GetDataAsync();
      

    Testing

    [Fact]
    public async Task LoadProducts_UpdatesCollection()
    {
        var mockService = new Mock<IProductService>();
        mockService.Setup(s => s.GetAllAsync())
            .ReturnsAsync(new[] { new Product { Name = "Test" } });
    
        var viewModel = new ProductsViewModel(mockService.Object);
    
        await viewModel.LoadProductsCommand.ExecuteAsync(null);
    
        Assert.Single(viewModel.Products);
        Assert.Equal("Test", viewModel.Products[0].Name);
    }
    

    Deliver

    • shared MAUI code with explicit platform seams
    • MVVM pattern with testable ViewModels
    • navigation and lifecycle behavior that fits each target
    • a realistic build and deployment path for the chosen platforms

    Validate

    • cross-platform reuse is real, not superficial
    • platform-specific behavior is isolated and testable
    • MVVM pattern is followed consistently
    • build assumptions for Mac/iOS and Windows are explicit
    • performance is acceptable on target devices

    Frequently asked questions

    What to verify before installation and use

    What does the dotnet-maui source document cover?

    Build, review, or migrate . NET MAUI applications across Android, iOS, macOS, and Windows with correct cross-platform UI, platform integration, and native packaging assumptions.

    How do I install dotnet-maui?

    The source record exposes this install command: npx skills add https://github.com/Postpartum-genushyacinthus29/dotnet-skills --skill "skills/dotnet-maui". Inspect the command and pinned source before running it.

    Which permission-related actions were detected?

    Static rules flagged network in the source; the page lists the matching lines and excerpts.

    Alternatives

    Compare before choosing

    Computed 976

    mgiovani/cc-arsenal

    team-review

    Multi-agent review team: architecture, security, performance, testing, style, docs/UX, plus an adversary that cross-examines the other 6, for security-sensitive, architectural, or large PRs (15+ files) where a single-agent pass risks missing cross-cutting issues. Use for auth/payments/PII changes, schema/pattern changes, compliance sign-off, or when asked to 'get the review team on this' / 'multi-agent review' / 'thorough review before merge'. For a standard PR or a quick pre-merge check, use /r

    Computed 9420

    upex-galaxy/agentic-qa-boilerplate

    test-automation

    Plan, write, and review automated tests following KATA (Komponent Action Test Architecture) on Playwright + TypeScript, or explain existing automated tests in a sealed read-only mode. Use when writing E2E or API/integration tests, creating Page or Api components, designing ATCs, parameterizing test data, registering fixtures, reviewing test code for KATA compliance, or requesting break-down-tests / a plain-English test breakdown. The explain mode reads source and reports assertions without enter

    Computed 9420

    upex-galaxy/agentic-qa-boilerplate

    test-documentation

    Analyze, prioritize, and document test cases in TMS (Jira/Xray), or repair an existing Story-ATS-ATP-ATR-TC cascade through a sealed explicit mode. Use for Test/ATP/ATR artifacts, ROI and automation verdicts, maintaining traceability, fix-traceability, or broken TMS links. The repair-traceability mode audits, plans, waits for explicit approval, applies, and verifies without launching the general documentation workflow. Do NOT use for writing test code (test-automation) or running suites (regress

    Computed 946

    gaelic-ghost/socket

    openapi-rpc-workflow

    Design, generate, implement, test, and diagnose Swift OpenAPI and RPC-style server contracts using Swift OpenAPI Generator, OpenAPIRuntime, OpenAPIHummingbird, OpenAPIVapor, SwiftPM plugins, Dash docsets, official GitHub/SPI documentation, and clear handoffs to Vapor or Hummingbird workflows.