[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-dotnet-maui-notifications-deep-links":3,"mdc--9grhg3-key":46,"related-repo-dotnet-maui-notifications-deep-links":945,"related-org-dotnet-maui-notifications-deep-links":1053},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":25,"repoUrl":26,"updatedAt":27,"license":28,"forks":29,"topics":30,"repo":41,"sourceUrl":44,"mdContent":45},"maui-notifications-deep-links","implement MAUI notifications and deep links","Implement .NET MAUI local notifications, push notifications, Firebase\u002FFCM legacy server-key migration to FCM HTTP v1, APNs\u002FAzure Notification Hubs registration, app links, universal links, custom URI schemes, token refresh\u002Fsign-in\u002Flogout lifecycle, push payload safety, and deep-link troubleshooting. USE FOR: notification permission UX, Android NotificationChannel and POST_NOTIFICATIONS, iOS UNUserNotificationCenter, push token upload, notification tap navigation, assetlinks.json autoVerify, apple-app-site-association, and CFBundleURLTypes. DO NOT USE FOR: OAuth callback-only flows, generic Shell navigation, or picker\u002Flocation permissions.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"dotnet",".NET (Microsoft)","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fdotnet.png",[12,16,19,22],{"name":13,"slug":14,"type":15},"Azure","azure","tag",{"name":17,"slug":18,"type":15},"MAUI","maui",{"name":20,"slug":21,"type":15},"Mobile","mobile",{"name":23,"slug":24,"type":15},"Firebase","firebase",190,"https:\u002F\u002Fgithub.com\u002Fdotnet\u002Fmaui-labs","2026-07-12T08:22:38.814164",null,21,[31,32,33,8,34,35,18,36,37,21,38,39,40],"ai","android","desktop","ios","maccatalyst","mcp","microsoft","multi-platform","user-interface","winui",{"repoUrl":26,"stars":25,"forks":29,"topics":42,"description":43},[31,32,33,8,34,35,18,36,37,21,38,39,40],"Experimental and pre-release tools for .NET MAUI","https:\u002F\u002Fgithub.com\u002Fdotnet\u002Fmaui-labs\u002Ftree\u002FHEAD\u002Fplugins\u002Fdotnet-maui-app\u002Fskills\u002Fmaui-notifications-deep-links","---\nname: maui-notifications-deep-links\ndescription: >-\n  Implement .NET MAUI local notifications, push notifications, Firebase\u002FFCM legacy server-key migration to FCM HTTP v1, APNs\u002FAzure Notification Hubs registration, app links, universal links, custom URI schemes, token refresh\u002Fsign-in\u002Flogout lifecycle, push payload safety, and deep-link troubleshooting. USE FOR: notification permission UX, Android NotificationChannel and POST_NOTIFICATIONS, iOS UNUserNotificationCenter, push token upload, notification tap navigation, assetlinks.json autoVerify, apple-app-site-association, and CFBundleURLTypes. DO NOT USE FOR: OAuth callback-only flows, generic Shell navigation, or picker\u002Flocation permissions.\n---\n\n# MAUI Notifications and Deep Links\n\nUse this skill when a MAUI app needs scheduled local alerts, remote push\nnotifications, or URLs that open the app and navigate to content.\n\n## Workflow\n\n1. Separate the entry points: local notification scheduling, push token\n   registration, notification tap handling, custom URI schemes, and verified web\n   links.\n2. Add platform declarations and entitlements before writing app logic.\n3. Request notification permission at a useful moment and support a denied state.\n4. For migrated push-token guidance, explicitly say Android backends use the\n   official **FCM HTTP v1** \u002F **Firebase Cloud Messaging v1** API with\n   service-account OAuth credentials, not legacy server keys. Treat OAuth 2.0\n   as the credential flow, not the API version. iOS uses APNs device tokens.\n5. Register refreshed device push tokens\u002Finstallations with the backend or\n   Azure Notification Hubs after sign-in, and disassociate them on logout.\n6. Treat Azure Notification Hubs as optional infrastructure unless the app needs\n   brokered installations, tags, templates, or multi-platform fanout.\n7. Keep push payloads free of PII, access tokens, and confidential content; send\n   route\u002Fentity IDs and fetch sensitive data after the app opens.\n8. Normalize all notification taps and deep links into one app navigation\n   service.\n9. Route links with Shell routes or an explicit navigation abstraction.\n10. Add diagnostics for token registration, payload parsing, and cold-start versus\n   resume handling.\n\n## Local Notifications\n\n.NET MAUI apps typically implement local notifications with platform services or\na vetted toolkit abstraction.\n\n```csharp\npublic interface INotificationService\n{\n    Task RequestPermissionAsync(CancellationToken cancellationToken);\n    Task ScheduleReminderAsync(string id, string title, string body, DateTimeOffset when);\n    Task CancelAsync(string id);\n}\n```\n\n| Platform | Required considerations |\n| --- | --- |\n| Android | Create a `NotificationChannel` for Android 8+, request `POST_NOTIFICATIONS` on Android 13+, and include stable channel IDs. |\n| iOS\u002FMac Catalyst | Request notification authorization through UserNotifications and handle foreground presentation explicitly. |\n| Windows | Use the Windows app notification APIs appropriate for the packaged target. |\n\nKeep notification IDs stable when updates\u002Fcancellation are required. Store\nscheduled notification metadata in app storage if it must survive app restart.\nIf notification permission is denied, surface an in-app reminders state, banner,\nor inbox fallback and provide a Settings path instead of silently dropping the\nschedule request.\n\n## Push Notifications\n\nWhen the prompt mentions migrating a legacy Firebase server key, legacy FCM API,\nor Xamarin push registrations, include these required points:\n\n1. Android senders move to the official **FCM HTTP v1** \u002F **Firebase Cloud\n   Messaging v1** API with service-account OAuth credentials. Do not recommend\n   legacy server keys. Treat OAuth 2.0 service-account authentication as the\n   credential flow, not the API version.\n2. iOS uses APNs device tokens, with sandbox\u002Fproduction environment alignment.\n3. Azure Notification Hubs is optional infrastructure, not required for direct\n   FCM\u002FAPNs token registration.\n4. Upload refreshed tokens\u002Finstallations after sign-in, associate them with the\n   authenticated user, and disassociate or unregister them on logout.\n5. Keep push payloads free of PII, access tokens, and confidential data; send\n   route\u002Fentity IDs and fetch sensitive content after the app opens.\n\n- Android uses Firebase Cloud Messaging (FCM); use the official **FCM HTTP v1**\n  API on the backend. The legacy FCM HTTP API was retired in June 2024 and\n  should not be used for migrated Xamarin or new MAUI apps.\n- iOS and Mac Catalyst use APNs.\n- Windows packaged apps use Windows Notification Service (WNS) channel URIs.\n- Small apps can register FCM\u002FAPNs\u002FWNS tokens directly with their own backend.\n  Azure Notification Hubs is optional and useful when the app needs a broker for\n  tags, installations, or multi-platform push management.\n- When using Azure Notification Hubs with FCM, configure **FCM HTTP v1**\n  service-account credentials rather than legacy server keys.\n- Migrating the backend send API from legacy FCM to FCM HTTP v1 does not require\n  a new client registration-token format; keep normal token refresh handling\n  because FCM can still rotate tokens.\n- Upload the current push token\u002Finstallation ID to the backend after it changes.\n- Protect token registration endpoints with app user authentication. Associate\n  tokens with the signed-in user only after auth completes, and remove or\n  disassociate them on logout.\n- Do not put secrets, access tokens, or sensitive content in push payloads.\n- Include a stable route or entity ID in the payload, then fetch sensitive data\n  after the app opens.\n\n## Deep Link Patterns\n\n| Link type | Use when | Platform setup |\n| --- | --- | --- |\n| Custom URI scheme | App-private callbacks or simple app opens such as `myapp:\u002F\u002Forders\u002F42` | Android intent filter, iOS\u002FMac Catalyst `CFBundleURLTypes`, Windows protocol registration |\n| Android App Links | Verified HTTPS links on Android | Intent filter with `autoVerify` and hosted `assetlinks.json` |\n| iOS Universal Links | Verified HTTPS links on iOS\u002FMac Catalyst | Associated Domains entitlement and hosted `apple-app-site-association` |\n\nUse one parser that accepts all launch sources:\n\n- App launched cold from a URL.\n- App resumed from background by a URL.\n- User tapped a local notification.\n- User tapped a push notification.\n\n## Wiring Deep Link Interception\n\nRoute native launch callbacks into one link handler:\n\n```csharp\nbuilder.ConfigureLifecycleEvents(events =>\n{\n    events.AddAndroid(android =>\n    {\n        android.OnCreate((activity, _) =>\n        {\n            var uri = activity.Intent?.Data?.ToString();\n            if (!string.IsNullOrEmpty(uri))\n                DeepLinkRouter.Route(uri);\n        });\n\n        android.OnNewIntent((activity, intent) =>\n        {\n            var uri = intent?.Data?.ToString();\n            if (!string.IsNullOrEmpty(uri))\n                DeepLinkRouter.Route(uri);\n        });\n    });\n\n    events.AddiOS(ios => ios.OpenUrl((app, url, options) =>\n    {\n        DeepLinkRouter.Route(url.AbsoluteString);\n        return true;\n    }));\n});\n```\n\nOverride `App.OnAppLinkRequestReceived(Uri uri)` for verified HTTPS app links\nand universal links, then forward the URI to the same parser used by\nnotifications and custom schemes.\n\nFor cold-start links or notification taps, queue the route until MAUI has built\nthe app navigation surface. Do not call `Shell.Current.GoToAsync` from Android\n`OnCreate` before `Shell.Current` exists.\nWhile a queued link is resolving, show a pending navigation\u002Floading state; after\narrival, move focus to the destination heading or announce the destination with\n`SemanticScreenReader.Announce`.\n\n## Troubleshooting Checklist\n\n- Confirm the app package ID\u002Fbundle ID matches the FCM\u002FAPNs\u002FAzure registration.\n- Confirm APNs sandbox versus production environment matches the build.\n- Confirm Android notification channel IDs are created before posting.\n- Confirm Android 13+ notification runtime permission is granted.\n- Confirm app link\u002Funiversal link association files are reachable without\n  redirects that break platform verification.\n- Confirm link payloads map to registered Shell routes or navigation commands.\n\n## Validation Checklist\n\n- Notification permissions and platform declarations are present and scoped.\n- Push migration guidance names FCM HTTP v1\u002Fservice-account credentials, APNs,\n  and Notification Hubs as optional infrastructure.\n- Push tokens are uploaded, refreshed, and disassociated on logout.\n- Notification payloads contain route\u002Fentity references, not PII, access tokens,\n  or secrets.\n- Deep links work for cold start and resume.\n- Cold-start links expose a pending state and announce\u002Ffocus the destination when\n  routing completes.\n- App link\u002Funiversal link verification files match the app identifiers.\n",{"data":47,"body":48},{"name":4,"description":6},{"type":49,"children":50},"root",[51,60,66,73,143,149,154,222,305,310,316,321,361,427,433,548,553,576,582,587,806,819,856,862,895,901,939],{"type":52,"tag":53,"props":54,"children":56},"element","h1",{"id":55},"maui-notifications-and-deep-links",[57],{"type":58,"value":59},"text","MAUI Notifications and Deep Links",{"type":52,"tag":61,"props":62,"children":63},"p",{},[64],{"type":58,"value":65},"Use this skill when a MAUI app needs scheduled local alerts, remote push\nnotifications, or URLs that open the app and navigate to content.",{"type":52,"tag":67,"props":68,"children":70},"h2",{"id":69},"workflow",[71],{"type":58,"value":72},"Workflow",{"type":52,"tag":74,"props":75,"children":76},"ol",{},[77,83,88,93,113,118,123,128,133,138],{"type":52,"tag":78,"props":79,"children":80},"li",{},[81],{"type":58,"value":82},"Separate the entry points: local notification scheduling, push token\nregistration, notification tap handling, custom URI schemes, and verified web\nlinks.",{"type":52,"tag":78,"props":84,"children":85},{},[86],{"type":58,"value":87},"Add platform declarations and entitlements before writing app logic.",{"type":52,"tag":78,"props":89,"children":90},{},[91],{"type":58,"value":92},"Request notification permission at a useful moment and support a denied state.",{"type":52,"tag":78,"props":94,"children":95},{},[96,98,104,106,111],{"type":58,"value":97},"For migrated push-token guidance, explicitly say Android backends use the\nofficial ",{"type":52,"tag":99,"props":100,"children":101},"strong",{},[102],{"type":58,"value":103},"FCM HTTP v1",{"type":58,"value":105}," \u002F ",{"type":52,"tag":99,"props":107,"children":108},{},[109],{"type":58,"value":110},"Firebase Cloud Messaging v1",{"type":58,"value":112}," API with\nservice-account OAuth credentials, not legacy server keys. Treat OAuth 2.0\nas the credential flow, not the API version. iOS uses APNs device tokens.",{"type":52,"tag":78,"props":114,"children":115},{},[116],{"type":58,"value":117},"Register refreshed device push tokens\u002Finstallations with the backend or\nAzure Notification Hubs after sign-in, and disassociate them on logout.",{"type":52,"tag":78,"props":119,"children":120},{},[121],{"type":58,"value":122},"Treat Azure Notification Hubs as optional infrastructure unless the app needs\nbrokered installations, tags, templates, or multi-platform fanout.",{"type":52,"tag":78,"props":124,"children":125},{},[126],{"type":58,"value":127},"Keep push payloads free of PII, access tokens, and confidential content; send\nroute\u002Fentity IDs and fetch sensitive data after the app opens.",{"type":52,"tag":78,"props":129,"children":130},{},[131],{"type":58,"value":132},"Normalize all notification taps and deep links into one app navigation\nservice.",{"type":52,"tag":78,"props":134,"children":135},{},[136],{"type":58,"value":137},"Route links with Shell routes or an explicit navigation abstraction.",{"type":52,"tag":78,"props":139,"children":140},{},[141],{"type":58,"value":142},"Add diagnostics for token registration, payload parsing, and cold-start versus\nresume handling.",{"type":52,"tag":67,"props":144,"children":146},{"id":145},"local-notifications",[147],{"type":58,"value":148},"Local Notifications",{"type":52,"tag":61,"props":150,"children":151},{},[152],{"type":58,"value":153},".NET MAUI apps typically implement local notifications with platform services or\na vetted toolkit abstraction.",{"type":52,"tag":155,"props":156,"children":161},"pre",{"className":157,"code":158,"language":159,"meta":160,"style":160},"language-csharp shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","public interface INotificationService\n{\n    Task RequestPermissionAsync(CancellationToken cancellationToken);\n    Task ScheduleReminderAsync(string id, string title, string body, DateTimeOffset when);\n    Task CancelAsync(string id);\n}\n","csharp","",[162],{"type":52,"tag":163,"props":164,"children":165},"code",{"__ignoreMap":160},[166,177,186,195,204,213],{"type":52,"tag":167,"props":168,"children":171},"span",{"class":169,"line":170},"line",1,[172],{"type":52,"tag":167,"props":173,"children":174},{},[175],{"type":58,"value":176},"public interface INotificationService\n",{"type":52,"tag":167,"props":178,"children":180},{"class":169,"line":179},2,[181],{"type":52,"tag":167,"props":182,"children":183},{},[184],{"type":58,"value":185},"{\n",{"type":52,"tag":167,"props":187,"children":189},{"class":169,"line":188},3,[190],{"type":52,"tag":167,"props":191,"children":192},{},[193],{"type":58,"value":194},"    Task RequestPermissionAsync(CancellationToken cancellationToken);\n",{"type":52,"tag":167,"props":196,"children":198},{"class":169,"line":197},4,[199],{"type":52,"tag":167,"props":200,"children":201},{},[202],{"type":58,"value":203},"    Task ScheduleReminderAsync(string id, string title, string body, DateTimeOffset when);\n",{"type":52,"tag":167,"props":205,"children":207},{"class":169,"line":206},5,[208],{"type":52,"tag":167,"props":209,"children":210},{},[211],{"type":58,"value":212},"    Task CancelAsync(string id);\n",{"type":52,"tag":167,"props":214,"children":216},{"class":169,"line":215},6,[217],{"type":52,"tag":167,"props":218,"children":219},{},[220],{"type":58,"value":221},"}\n",{"type":52,"tag":223,"props":224,"children":225},"table",{},[226,245],{"type":52,"tag":227,"props":228,"children":229},"thead",{},[230],{"type":52,"tag":231,"props":232,"children":233},"tr",{},[234,240],{"type":52,"tag":235,"props":236,"children":237},"th",{},[238],{"type":58,"value":239},"Platform",{"type":52,"tag":235,"props":241,"children":242},{},[243],{"type":58,"value":244},"Required considerations",{"type":52,"tag":246,"props":247,"children":248},"tbody",{},[249,279,292],{"type":52,"tag":231,"props":250,"children":251},{},[252,258],{"type":52,"tag":253,"props":254,"children":255},"td",{},[256],{"type":58,"value":257},"Android",{"type":52,"tag":253,"props":259,"children":260},{},[261,263,269,271,277],{"type":58,"value":262},"Create a ",{"type":52,"tag":163,"props":264,"children":266},{"className":265},[],[267],{"type":58,"value":268},"NotificationChannel",{"type":58,"value":270}," for Android 8+, request ",{"type":52,"tag":163,"props":272,"children":274},{"className":273},[],[275],{"type":58,"value":276},"POST_NOTIFICATIONS",{"type":58,"value":278}," on Android 13+, and include stable channel IDs.",{"type":52,"tag":231,"props":280,"children":281},{},[282,287],{"type":52,"tag":253,"props":283,"children":284},{},[285],{"type":58,"value":286},"iOS\u002FMac Catalyst",{"type":52,"tag":253,"props":288,"children":289},{},[290],{"type":58,"value":291},"Request notification authorization through UserNotifications and handle foreground presentation explicitly.",{"type":52,"tag":231,"props":293,"children":294},{},[295,300],{"type":52,"tag":253,"props":296,"children":297},{},[298],{"type":58,"value":299},"Windows",{"type":52,"tag":253,"props":301,"children":302},{},[303],{"type":58,"value":304},"Use the Windows app notification APIs appropriate for the packaged target.",{"type":52,"tag":61,"props":306,"children":307},{},[308],{"type":58,"value":309},"Keep notification IDs stable when updates\u002Fcancellation are required. Store\nscheduled notification metadata in app storage if it must survive app restart.\nIf notification permission is denied, surface an in-app reminders state, banner,\nor inbox fallback and provide a Settings path instead of silently dropping the\nschedule request.",{"type":52,"tag":67,"props":311,"children":313},{"id":312},"push-notifications",[314],{"type":58,"value":315},"Push Notifications",{"type":52,"tag":61,"props":317,"children":318},{},[319],{"type":58,"value":320},"When the prompt mentions migrating a legacy Firebase server key, legacy FCM API,\nor Xamarin push registrations, include these required points:",{"type":52,"tag":74,"props":322,"children":323},{},[324,341,346,351,356],{"type":52,"tag":78,"props":325,"children":326},{},[327,329,333,334,339],{"type":58,"value":328},"Android senders move to the official ",{"type":52,"tag":99,"props":330,"children":331},{},[332],{"type":58,"value":103},{"type":58,"value":105},{"type":52,"tag":99,"props":335,"children":336},{},[337],{"type":58,"value":338},"Firebase Cloud\nMessaging v1",{"type":58,"value":340}," API with service-account OAuth credentials. Do not recommend\nlegacy server keys. Treat OAuth 2.0 service-account authentication as the\ncredential flow, not the API version.",{"type":52,"tag":78,"props":342,"children":343},{},[344],{"type":58,"value":345},"iOS uses APNs device tokens, with sandbox\u002Fproduction environment alignment.",{"type":52,"tag":78,"props":347,"children":348},{},[349],{"type":58,"value":350},"Azure Notification Hubs is optional infrastructure, not required for direct\nFCM\u002FAPNs token registration.",{"type":52,"tag":78,"props":352,"children":353},{},[354],{"type":58,"value":355},"Upload refreshed tokens\u002Finstallations after sign-in, associate them with the\nauthenticated user, and disassociate or unregister them on logout.",{"type":52,"tag":78,"props":357,"children":358},{},[359],{"type":58,"value":360},"Keep push payloads free of PII, access tokens, and confidential data; send\nroute\u002Fentity IDs and fetch sensitive content after the app opens.",{"type":52,"tag":362,"props":363,"children":364},"ul",{},[365,376,381,386,391,402,407,412,417,422],{"type":52,"tag":78,"props":366,"children":367},{},[368,370,374],{"type":58,"value":369},"Android uses Firebase Cloud Messaging (FCM); use the official ",{"type":52,"tag":99,"props":371,"children":372},{},[373],{"type":58,"value":103},{"type":58,"value":375},"\nAPI on the backend. The legacy FCM HTTP API was retired in June 2024 and\nshould not be used for migrated Xamarin or new MAUI apps.",{"type":52,"tag":78,"props":377,"children":378},{},[379],{"type":58,"value":380},"iOS and Mac Catalyst use APNs.",{"type":52,"tag":78,"props":382,"children":383},{},[384],{"type":58,"value":385},"Windows packaged apps use Windows Notification Service (WNS) channel URIs.",{"type":52,"tag":78,"props":387,"children":388},{},[389],{"type":58,"value":390},"Small apps can register FCM\u002FAPNs\u002FWNS tokens directly with their own backend.\nAzure Notification Hubs is optional and useful when the app needs a broker for\ntags, installations, or multi-platform push management.",{"type":52,"tag":78,"props":392,"children":393},{},[394,396,400],{"type":58,"value":395},"When using Azure Notification Hubs with FCM, configure ",{"type":52,"tag":99,"props":397,"children":398},{},[399],{"type":58,"value":103},{"type":58,"value":401},"\nservice-account credentials rather than legacy server keys.",{"type":52,"tag":78,"props":403,"children":404},{},[405],{"type":58,"value":406},"Migrating the backend send API from legacy FCM to FCM HTTP v1 does not require\na new client registration-token format; keep normal token refresh handling\nbecause FCM can still rotate tokens.",{"type":52,"tag":78,"props":408,"children":409},{},[410],{"type":58,"value":411},"Upload the current push token\u002Finstallation ID to the backend after it changes.",{"type":52,"tag":78,"props":413,"children":414},{},[415],{"type":58,"value":416},"Protect token registration endpoints with app user authentication. Associate\ntokens with the signed-in user only after auth completes, and remove or\ndisassociate them on logout.",{"type":52,"tag":78,"props":418,"children":419},{},[420],{"type":58,"value":421},"Do not put secrets, access tokens, or sensitive content in push payloads.",{"type":52,"tag":78,"props":423,"children":424},{},[425],{"type":58,"value":426},"Include a stable route or entity ID in the payload, then fetch sensitive data\nafter the app opens.",{"type":52,"tag":67,"props":428,"children":430},{"id":429},"deep-link-patterns",[431],{"type":58,"value":432},"Deep Link Patterns",{"type":52,"tag":223,"props":434,"children":435},{},[436,457],{"type":52,"tag":227,"props":437,"children":438},{},[439],{"type":52,"tag":231,"props":440,"children":441},{},[442,447,452],{"type":52,"tag":235,"props":443,"children":444},{},[445],{"type":58,"value":446},"Link type",{"type":52,"tag":235,"props":448,"children":449},{},[450],{"type":58,"value":451},"Use when",{"type":52,"tag":235,"props":453,"children":454},{},[455],{"type":58,"value":456},"Platform setup",{"type":52,"tag":246,"props":458,"children":459},{},[460,492,524],{"type":52,"tag":231,"props":461,"children":462},{},[463,468,479],{"type":52,"tag":253,"props":464,"children":465},{},[466],{"type":58,"value":467},"Custom URI scheme",{"type":52,"tag":253,"props":469,"children":470},{},[471,473],{"type":58,"value":472},"App-private callbacks or simple app opens such as ",{"type":52,"tag":163,"props":474,"children":476},{"className":475},[],[477],{"type":58,"value":478},"myapp:\u002F\u002Forders\u002F42",{"type":52,"tag":253,"props":480,"children":481},{},[482,484,490],{"type":58,"value":483},"Android intent filter, iOS\u002FMac Catalyst ",{"type":52,"tag":163,"props":485,"children":487},{"className":486},[],[488],{"type":58,"value":489},"CFBundleURLTypes",{"type":58,"value":491},", Windows protocol registration",{"type":52,"tag":231,"props":493,"children":494},{},[495,500,505],{"type":52,"tag":253,"props":496,"children":497},{},[498],{"type":58,"value":499},"Android App Links",{"type":52,"tag":253,"props":501,"children":502},{},[503],{"type":58,"value":504},"Verified HTTPS links on Android",{"type":52,"tag":253,"props":506,"children":507},{},[508,510,516,518],{"type":58,"value":509},"Intent filter with ",{"type":52,"tag":163,"props":511,"children":513},{"className":512},[],[514],{"type":58,"value":515},"autoVerify",{"type":58,"value":517}," and hosted ",{"type":52,"tag":163,"props":519,"children":521},{"className":520},[],[522],{"type":58,"value":523},"assetlinks.json",{"type":52,"tag":231,"props":525,"children":526},{},[527,532,537],{"type":52,"tag":253,"props":528,"children":529},{},[530],{"type":58,"value":531},"iOS Universal Links",{"type":52,"tag":253,"props":533,"children":534},{},[535],{"type":58,"value":536},"Verified HTTPS links on iOS\u002FMac Catalyst",{"type":52,"tag":253,"props":538,"children":539},{},[540,542],{"type":58,"value":541},"Associated Domains entitlement and hosted ",{"type":52,"tag":163,"props":543,"children":545},{"className":544},[],[546],{"type":58,"value":547},"apple-app-site-association",{"type":52,"tag":61,"props":549,"children":550},{},[551],{"type":58,"value":552},"Use one parser that accepts all launch sources:",{"type":52,"tag":362,"props":554,"children":555},{},[556,561,566,571],{"type":52,"tag":78,"props":557,"children":558},{},[559],{"type":58,"value":560},"App launched cold from a URL.",{"type":52,"tag":78,"props":562,"children":563},{},[564],{"type":58,"value":565},"App resumed from background by a URL.",{"type":52,"tag":78,"props":567,"children":568},{},[569],{"type":58,"value":570},"User tapped a local notification.",{"type":52,"tag":78,"props":572,"children":573},{},[574],{"type":58,"value":575},"User tapped a push notification.",{"type":52,"tag":67,"props":577,"children":579},{"id":578},"wiring-deep-link-interception",[580],{"type":58,"value":581},"Wiring Deep Link Interception",{"type":52,"tag":61,"props":583,"children":584},{},[585],{"type":58,"value":586},"Route native launch callbacks into one link handler:",{"type":52,"tag":155,"props":588,"children":590},{"className":157,"code":589,"language":159,"meta":160,"style":160},"builder.ConfigureLifecycleEvents(events =>\n{\n    events.AddAndroid(android =>\n    {\n        android.OnCreate((activity, _) =>\n        {\n            var uri = activity.Intent?.Data?.ToString();\n            if (!string.IsNullOrEmpty(uri))\n                DeepLinkRouter.Route(uri);\n        });\n\n        android.OnNewIntent((activity, intent) =>\n        {\n            var uri = intent?.Data?.ToString();\n            if (!string.IsNullOrEmpty(uri))\n                DeepLinkRouter.Route(uri);\n        });\n    });\n\n    events.AddiOS(ios => ios.OpenUrl((app, url, options) =>\n    {\n        DeepLinkRouter.Route(url.AbsoluteString);\n        return true;\n    }));\n});\n",[591],{"type":52,"tag":163,"props":592,"children":593},{"__ignoreMap":160},[594,602,609,617,625,633,641,650,659,668,677,687,696,704,713,721,729,737,746,754,763,770,779,788,797],{"type":52,"tag":167,"props":595,"children":596},{"class":169,"line":170},[597],{"type":52,"tag":167,"props":598,"children":599},{},[600],{"type":58,"value":601},"builder.ConfigureLifecycleEvents(events =>\n",{"type":52,"tag":167,"props":603,"children":604},{"class":169,"line":179},[605],{"type":52,"tag":167,"props":606,"children":607},{},[608],{"type":58,"value":185},{"type":52,"tag":167,"props":610,"children":611},{"class":169,"line":188},[612],{"type":52,"tag":167,"props":613,"children":614},{},[615],{"type":58,"value":616},"    events.AddAndroid(android =>\n",{"type":52,"tag":167,"props":618,"children":619},{"class":169,"line":197},[620],{"type":52,"tag":167,"props":621,"children":622},{},[623],{"type":58,"value":624},"    {\n",{"type":52,"tag":167,"props":626,"children":627},{"class":169,"line":206},[628],{"type":52,"tag":167,"props":629,"children":630},{},[631],{"type":58,"value":632},"        android.OnCreate((activity, _) =>\n",{"type":52,"tag":167,"props":634,"children":635},{"class":169,"line":215},[636],{"type":52,"tag":167,"props":637,"children":638},{},[639],{"type":58,"value":640},"        {\n",{"type":52,"tag":167,"props":642,"children":644},{"class":169,"line":643},7,[645],{"type":52,"tag":167,"props":646,"children":647},{},[648],{"type":58,"value":649},"            var uri = activity.Intent?.Data?.ToString();\n",{"type":52,"tag":167,"props":651,"children":653},{"class":169,"line":652},8,[654],{"type":52,"tag":167,"props":655,"children":656},{},[657],{"type":58,"value":658},"            if (!string.IsNullOrEmpty(uri))\n",{"type":52,"tag":167,"props":660,"children":662},{"class":169,"line":661},9,[663],{"type":52,"tag":167,"props":664,"children":665},{},[666],{"type":58,"value":667},"                DeepLinkRouter.Route(uri);\n",{"type":52,"tag":167,"props":669,"children":671},{"class":169,"line":670},10,[672],{"type":52,"tag":167,"props":673,"children":674},{},[675],{"type":58,"value":676},"        });\n",{"type":52,"tag":167,"props":678,"children":680},{"class":169,"line":679},11,[681],{"type":52,"tag":167,"props":682,"children":684},{"emptyLinePlaceholder":683},true,[685],{"type":58,"value":686},"\n",{"type":52,"tag":167,"props":688,"children":690},{"class":169,"line":689},12,[691],{"type":52,"tag":167,"props":692,"children":693},{},[694],{"type":58,"value":695},"        android.OnNewIntent((activity, intent) =>\n",{"type":52,"tag":167,"props":697,"children":699},{"class":169,"line":698},13,[700],{"type":52,"tag":167,"props":701,"children":702},{},[703],{"type":58,"value":640},{"type":52,"tag":167,"props":705,"children":707},{"class":169,"line":706},14,[708],{"type":52,"tag":167,"props":709,"children":710},{},[711],{"type":58,"value":712},"            var uri = intent?.Data?.ToString();\n",{"type":52,"tag":167,"props":714,"children":716},{"class":169,"line":715},15,[717],{"type":52,"tag":167,"props":718,"children":719},{},[720],{"type":58,"value":658},{"type":52,"tag":167,"props":722,"children":724},{"class":169,"line":723},16,[725],{"type":52,"tag":167,"props":726,"children":727},{},[728],{"type":58,"value":667},{"type":52,"tag":167,"props":730,"children":732},{"class":169,"line":731},17,[733],{"type":52,"tag":167,"props":734,"children":735},{},[736],{"type":58,"value":676},{"type":52,"tag":167,"props":738,"children":740},{"class":169,"line":739},18,[741],{"type":52,"tag":167,"props":742,"children":743},{},[744],{"type":58,"value":745},"    });\n",{"type":52,"tag":167,"props":747,"children":749},{"class":169,"line":748},19,[750],{"type":52,"tag":167,"props":751,"children":752},{"emptyLinePlaceholder":683},[753],{"type":58,"value":686},{"type":52,"tag":167,"props":755,"children":757},{"class":169,"line":756},20,[758],{"type":52,"tag":167,"props":759,"children":760},{},[761],{"type":58,"value":762},"    events.AddiOS(ios => ios.OpenUrl((app, url, options) =>\n",{"type":52,"tag":167,"props":764,"children":765},{"class":169,"line":29},[766],{"type":52,"tag":167,"props":767,"children":768},{},[769],{"type":58,"value":624},{"type":52,"tag":167,"props":771,"children":773},{"class":169,"line":772},22,[774],{"type":52,"tag":167,"props":775,"children":776},{},[777],{"type":58,"value":778},"        DeepLinkRouter.Route(url.AbsoluteString);\n",{"type":52,"tag":167,"props":780,"children":782},{"class":169,"line":781},23,[783],{"type":52,"tag":167,"props":784,"children":785},{},[786],{"type":58,"value":787},"        return true;\n",{"type":52,"tag":167,"props":789,"children":791},{"class":169,"line":790},24,[792],{"type":52,"tag":167,"props":793,"children":794},{},[795],{"type":58,"value":796},"    }));\n",{"type":52,"tag":167,"props":798,"children":800},{"class":169,"line":799},25,[801],{"type":52,"tag":167,"props":802,"children":803},{},[804],{"type":58,"value":805},"});\n",{"type":52,"tag":61,"props":807,"children":808},{},[809,811,817],{"type":58,"value":810},"Override ",{"type":52,"tag":163,"props":812,"children":814},{"className":813},[],[815],{"type":58,"value":816},"App.OnAppLinkRequestReceived(Uri uri)",{"type":58,"value":818}," for verified HTTPS app links\nand universal links, then forward the URI to the same parser used by\nnotifications and custom schemes.",{"type":52,"tag":61,"props":820,"children":821},{},[822,824,830,832,838,840,846,848,854],{"type":58,"value":823},"For cold-start links or notification taps, queue the route until MAUI has built\nthe app navigation surface. Do not call ",{"type":52,"tag":163,"props":825,"children":827},{"className":826},[],[828],{"type":58,"value":829},"Shell.Current.GoToAsync",{"type":58,"value":831}," from Android\n",{"type":52,"tag":163,"props":833,"children":835},{"className":834},[],[836],{"type":58,"value":837},"OnCreate",{"type":58,"value":839}," before ",{"type":52,"tag":163,"props":841,"children":843},{"className":842},[],[844],{"type":58,"value":845},"Shell.Current",{"type":58,"value":847}," exists.\nWhile a queued link is resolving, show a pending navigation\u002Floading state; after\narrival, move focus to the destination heading or announce the destination with\n",{"type":52,"tag":163,"props":849,"children":851},{"className":850},[],[852],{"type":58,"value":853},"SemanticScreenReader.Announce",{"type":58,"value":855},".",{"type":52,"tag":67,"props":857,"children":859},{"id":858},"troubleshooting-checklist",[860],{"type":58,"value":861},"Troubleshooting Checklist",{"type":52,"tag":362,"props":863,"children":864},{},[865,870,875,880,885,890],{"type":52,"tag":78,"props":866,"children":867},{},[868],{"type":58,"value":869},"Confirm the app package ID\u002Fbundle ID matches the FCM\u002FAPNs\u002FAzure registration.",{"type":52,"tag":78,"props":871,"children":872},{},[873],{"type":58,"value":874},"Confirm APNs sandbox versus production environment matches the build.",{"type":52,"tag":78,"props":876,"children":877},{},[878],{"type":58,"value":879},"Confirm Android notification channel IDs are created before posting.",{"type":52,"tag":78,"props":881,"children":882},{},[883],{"type":58,"value":884},"Confirm Android 13+ notification runtime permission is granted.",{"type":52,"tag":78,"props":886,"children":887},{},[888],{"type":58,"value":889},"Confirm app link\u002Funiversal link association files are reachable without\nredirects that break platform verification.",{"type":52,"tag":78,"props":891,"children":892},{},[893],{"type":58,"value":894},"Confirm link payloads map to registered Shell routes or navigation commands.",{"type":52,"tag":67,"props":896,"children":898},{"id":897},"validation-checklist",[899],{"type":58,"value":900},"Validation Checklist",{"type":52,"tag":362,"props":902,"children":903},{},[904,909,914,919,924,929,934],{"type":52,"tag":78,"props":905,"children":906},{},[907],{"type":58,"value":908},"Notification permissions and platform declarations are present and scoped.",{"type":52,"tag":78,"props":910,"children":911},{},[912],{"type":58,"value":913},"Push migration guidance names FCM HTTP v1\u002Fservice-account credentials, APNs,\nand Notification Hubs as optional infrastructure.",{"type":52,"tag":78,"props":915,"children":916},{},[917],{"type":58,"value":918},"Push tokens are uploaded, refreshed, and disassociated on logout.",{"type":52,"tag":78,"props":920,"children":921},{},[922],{"type":58,"value":923},"Notification payloads contain route\u002Fentity references, not PII, access tokens,\nor secrets.",{"type":52,"tag":78,"props":925,"children":926},{},[927],{"type":58,"value":928},"Deep links work for cold start and resume.",{"type":52,"tag":78,"props":930,"children":931},{},[932],{"type":58,"value":933},"Cold-start links expose a pending state and announce\u002Ffocus the destination when\nrouting completes.",{"type":52,"tag":78,"props":935,"children":936},{},[937],{"type":58,"value":938},"App link\u002Funiversal link verification files match the app identifiers.",{"type":52,"tag":940,"props":941,"children":942},"style",{},[943],{"type":58,"value":944},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":946,"total":1052},[947,965,978,992,1008,1025,1041],{"slug":948,"name":948,"fn":949,"description":950,"org":951,"tags":952,"stars":25,"repoUrl":26,"updatedAt":964},"android-slim-bindings","create Android slim bindings for .NET","Create Android slim bindings for MAUI\u002F.NET Android. USE FOR: slim Android binding, Kotlin\u002FJava wrappers, build.gradle.kts, Maven, AAR\u002FJAR, AndroidMavenLibrary, AndroidLibrary, @JvmStatic, XA4241\u002FXA4242, Xamarin.AndroidX\u002FKotlin NuGets. DO NOT USE FOR: iOS\u002FmacOS bindings, general MAUI apps, or NuGet packaging.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[953,956,957,960,963],{"name":954,"slug":955,"type":15},".NET","net",{"name":257,"slug":32,"type":15},{"name":958,"slug":959,"type":15},"Java","java",{"name":961,"slug":962,"type":15},"Kotlin","kotlin",{"name":20,"slug":21,"type":15},"2026-07-12T08:22:54.006105",{"slug":966,"name":966,"fn":967,"description":968,"org":969,"tags":970,"stars":25,"repoUrl":26,"updatedAt":977},"devflow-automation","automate .NET MAUI app state","Automate MAUI app state through DevFlow Actions. USE FOR: `[DevFlowAction]` shortcuts, login, seed data, deep screens. DO NOT USE FOR: arbitrary methods, DI internals, UI MCP tools, connectivity, or build\u002Fdeploy issues.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[971,972,975,976],{"name":954,"slug":955,"type":15},{"name":973,"slug":974,"type":15},"Automation","automation",{"name":17,"slug":18,"type":15},{"name":20,"slug":21,"type":15},"2026-07-12T08:22:56.616564",{"slug":979,"name":979,"fn":980,"description":981,"org":982,"tags":983,"stars":25,"repoUrl":26,"updatedAt":991},"devflow-connect","diagnose DevFlow agent connectivity issues","Diagnose DevFlow agent connectivity. USE FOR: `maui devflow` connection failures, agent not found, ports, adb forwarding, broker. DO NOT USE FOR: build failures, setup, visual tree, or Blazor CDP.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[984,987,988],{"name":985,"slug":986,"type":15},"Debugging","debugging",{"name":17,"slug":18,"type":15},{"name":989,"slug":990,"type":15},"Networking","networking","2026-07-12T08:22:48.847431",{"slug":993,"name":993,"fn":994,"description":995,"org":996,"tags":997,"stars":25,"repoUrl":26,"updatedAt":1007},"dotnet-workload-info","discover MAUI workload metadata","Discover MAUI workload metadata from live NuGet APIs. USE FOR: workload manifest lookup, WorkloadDependencies.json, v3-flatcontainer, CLI-to-NuGet version conversion, Xcode\u002FJDK\u002FAndroid SDK requirements, CI sdkmanager packages, `packageid:Microsoft.Maui.Controls`. DO NOT USE FOR: installing workloads, build debugging, or app version edits.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[998,1000,1003,1006],{"name":999,"slug":159,"type":15},"C#",{"name":1001,"slug":1002,"type":15},"CLI","cli",{"name":1004,"slug":1005,"type":15},"Engineering","engineering",{"name":17,"slug":18,"type":15},"2026-07-12T08:22:46.318953",{"slug":1009,"name":1009,"fn":1010,"description":1011,"org":1012,"tags":1013,"stars":25,"repoUrl":26,"updatedAt":1024},"ios-slim-bindings","create iOS slim bindings for MAUI","Create iOS slim bindings for MAUI. USE FOR: slim iOS binding, Native Library Interop, Swift\u002FObjective-C wrappers, XcodeGen project.yml, Podfile, CocoaPods static linking, BUILD_LIBRARY_FOR_DISTRIBUTION, XcodeProject MSBuild, `@objc`\u002F`[Export]` selector crashes, async completion handlers. DO NOT USE FOR: Android bindings, general MAUI apps, or NuGet packaging.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1014,1015,1017,1018,1021],{"name":954,"slug":955,"type":15},{"name":1016,"slug":34,"type":15},"iOS",{"name":17,"slug":18,"type":15},{"name":1019,"slug":1020,"type":15},"Swift","swift",{"name":1022,"slug":1023,"type":15},"Xcode","xcode","2026-07-12T08:22:50.128667",{"slug":1026,"name":1026,"fn":1027,"description":1028,"org":1029,"tags":1030,"stars":25,"repoUrl":26,"updatedAt":1040},"maui-accessibility","implement accessibility in .NET MAUI apps","Make .NET MAUI apps accessible with semantic properties, screen reader labels\u002Fhints, heading levels, focus, announcements, AutomationProperties, touch targets, and platform checks. USE FOR: accessibility audits, WCAG UI fixes, TalkBack\u002FVoiceOver\u002FNarrator behavior, SemanticProperties.Description\u002FHint\u002FHeadingLevel, SemanticScreenReader.Announce, SetSemanticFocus, avoiding redundant Label metadata, hiding decorative content with IsInAccessibleTree=false, and CollectionView row semantics. DO NOT USE FOR: general layout, UI automation only, or performance tuning.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1031,1032,1035,1036,1037],{"name":954,"slug":955,"type":15},{"name":1033,"slug":1034,"type":15},"Accessibility","accessibility",{"name":17,"slug":18,"type":15},{"name":20,"slug":21,"type":15},{"name":1038,"slug":1039,"type":15},"WCAG","wcag","2026-07-12T08:22:17.823583",{"slug":1042,"name":1042,"fn":1043,"description":1044,"org":1045,"tags":1046,"stars":25,"repoUrl":26,"updatedAt":1051},"maui-ai-debugging","debug .NET MAUI application issues","Legacy DevFlow debug skill. USE FOR: `maui-ai-debugging`, `maui devflow`, screenshots, visual tree, Blazor CDP, simulator\u002Femulator debugging. DO NOT USE FOR: setup, desktop automation, AppleScript, host `xdotool`.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1047,1048,1049,1050],{"name":954,"slug":955,"type":15},{"name":985,"slug":986,"type":15},{"name":17,"slug":18,"type":15},{"name":20,"slug":21,"type":15},"2026-07-12T08:22:52.634889",32,{"items":1054,"total":1210},[1055,1069,1084,1096,1112,1126,1144,1154,1166,1176,1189,1200],{"slug":1056,"name":1056,"fn":1057,"description":1058,"org":1059,"tags":1060,"stars":1066,"repoUrl":1067,"updatedAt":1068},"multithreaded-task-migration","migrate MSBuild tasks to multithreaded mode","Guide for migrating MSBuild tasks to multithreaded mode support, including compatibility red-team review. Use this when converting tasks to thread-safe versions, implementing IMultiThreadableTask, adding TaskEnvironment support, or auditing migrations for behavioral compatibility.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1061,1062,1063],{"name":954,"slug":955,"type":15},{"name":1004,"slug":1005,"type":15},{"name":1064,"slug":1065,"type":15},"Performance","performance",5535,"https:\u002F\u002Fgithub.com\u002Fdotnet\u002Fmsbuild","2026-07-22T05:37:33.965588",{"slug":1070,"name":1070,"fn":1071,"description":1072,"org":1073,"tags":1074,"stars":1081,"repoUrl":1082,"updatedAt":1083},"analyzing-dotnet-performance","analyze .NET code for performance anti-patterns","Scans .NET code for ~50 performance anti-patterns across async, memory, strings, collections, LINQ, regex, serialization, and I\u002FO with tiered severity classification. Use when analyzing .NET code for optimization opportunities, reviewing hot paths, or auditing allocation-heavy patterns.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1075,1076,1079,1080],{"name":954,"slug":955,"type":15},{"name":1077,"slug":1078,"type":15},"Code Analysis","code-analysis",{"name":985,"slug":986,"type":15},{"name":1064,"slug":1065,"type":15},4576,"https:\u002F\u002Fgithub.com\u002Fdotnet\u002Fskills","2026-07-12T08:23:25.400375",{"slug":1085,"name":1085,"fn":1086,"description":1087,"org":1088,"tags":1089,"stars":1081,"repoUrl":1082,"updatedAt":1095},"android-tombstone-symbolication","symbolicate .NET runtime frames in Android tombstones","Symbolicate the .NET runtime frames in an Android tombstone file. Extracts BuildIds and PC offsets from the native backtrace, downloads debug symbols from the Microsoft symbol server, and runs llvm-symbolizer to produce function names with source file and line numbers. USE FOR triaging a .NET MAUI or Mono Android app crash from a tombstone, resolving native backtrace frames in libmonosgen-2.0.so or libcoreclr.so to .NET runtime source code, or investigating SIGABRT, SIGSEGV, or other native signals originating from the .NET runtime on Android. DO NOT USE FOR pure Java\u002FKotlin crashes, managed .NET exceptions that are already captured in logcat, or iOS crash logs. INVOKES Symbolicate-Tombstone.ps1 script, llvm-symbolizer, Microsoft symbol server.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1090,1091,1092,1093],{"name":954,"slug":955,"type":15},{"name":257,"slug":32,"type":15},{"name":985,"slug":986,"type":15},{"name":1094,"slug":37,"type":15},"Microsoft","2026-07-12T08:23:21.595572",{"slug":1097,"name":1097,"fn":1098,"description":1099,"org":1100,"tags":1101,"stars":1081,"repoUrl":1082,"updatedAt":1111},"apple-crash-symbolication","symbolicate .NET runtime frames in crash logs","Symbolicate .NET runtime frames in Apple platform .ips crash logs (iOS, tvOS, Mac Catalyst, macOS). Extracts UUIDs and addresses from the native backtrace, locates dSYM debug symbols, and runs atos to produce function names with source file and line numbers. Automatically downloads .dwarf symbols from the Microsoft symbol server using Mach-O UUIDs. USE FOR triaging a .NET MAUI or Mono app crash from an .ips file on any Apple platform, resolving native backtrace frames in libcoreclr or libmonosgen-2.0 to .NET runtime source code, retrieving .ips crash logs from a connected iOS device or iPhone, or investigating EXC_CRASH, EXC_BAD_ACCESS, SIGABRT, or SIGSEGV originating from the .NET runtime. DO NOT USE FOR pure Swift\u002FObjective-C crashes with no .NET components, or Android tombstone files. INVOKES Symbolicate-Crash.ps1 script, atos, dwarfdump, idevicecrashreport.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1102,1103,1104,1105,1108],{"name":954,"slug":955,"type":15},{"name":985,"slug":986,"type":15},{"name":1016,"slug":34,"type":15},{"name":1106,"slug":1107,"type":15},"macOS","macos",{"name":1109,"slug":1110,"type":15},"Observability","observability","2026-07-12T08:23:20.369986",{"slug":1113,"name":1113,"fn":1114,"description":1115,"org":1116,"tags":1117,"stars":1081,"repoUrl":1082,"updatedAt":1125},"assertion-quality","evaluate assertion quality in test suites","Analyzes the variety and depth of assertions across test suites in any language. Use when the user asks to evaluate assertion quality, find shallow tests, identify assertion-free tests (no assertions or only trivial ones like Assert.IsNotNull \u002F toBeTruthy()), flag self-referential or tautological assertions, measure assertion diversity, or audit whether tests verify different facets of behavior. Polyglot: .NET, Python, TS\u002FJS, Java, Go, Ruby, Rust, Swift, Kotlin, PowerShell, C++. DO NOT USE FOR: writing new tests (use code-testing-agent \u002F writing-mstest-tests), mutation reasoning about whether tests would catch a bug (use test-gap-analysis), or a general severity-ranked anti-pattern audit (use test-anti-patterns), fixing or rewriting assertions, or writing, fixing, or modernizing MSTest tests, assertions, or attributes (use writing-mstest-tests).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1118,1119,1122],{"name":1077,"slug":1078,"type":15},{"name":1120,"slug":1121,"type":15},"QA","qa",{"name":1123,"slug":1124,"type":15},"Testing","testing","2026-07-12T08:23:51.277743",{"slug":1127,"name":1127,"fn":1128,"description":1129,"org":1130,"tags":1131,"stars":1081,"repoUrl":1082,"updatedAt":1143},"author-component","create and review Blazor components","Create or review Blazor components (.razor files) with correct architecture. USE FOR: writing new Blazor components that do NOT involve JavaScript interop, implementing parameters and EventCallback, RenderFragment slots, component lifecycle (OnInitializedAsync, OnParametersSet), async patterns, IAsyncDisposable, CancellationToken, CSS isolation, code-behind. DO NOT USE FOR: creating new projects (use create-blazor-project), JavaScript interop or calling browser APIs from Blazor (use use-js-interop), forms and validation (use collect-user-input), prerendering issues (use support-prerendering), HTTP data fetching patterns (use fetch-and-send-data), coordinating state between unrelated components (use coordinate-components).\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1132,1133,1136,1137,1140],{"name":954,"slug":955,"type":15},{"name":1134,"slug":1135,"type":15},"Blazor","blazor",{"name":999,"slug":159,"type":15},{"name":1138,"slug":1139,"type":15},"UI Components","ui-components",{"name":1141,"slug":1142,"type":15},"Web Development","web-development","2026-07-15T06:03:29.216359",{"slug":1145,"name":1145,"fn":1146,"description":1147,"org":1148,"tags":1149,"stars":1081,"repoUrl":1082,"updatedAt":1153},"binlog-failure-analysis","analyze MSBuild binary logs","Analyze MSBuild binary logs to diagnose build failures. USE FOR: build errors that are unclear from console output, diagnosing cascading failures across multi-project builds, tracing MSBuild target execution order, and generally any MSBuild build issues. Requires an existing .binlog file. DO NOT USE FOR: generating binlogs (use binlog-generation), non-MSBuild build systems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1150,1151,1152],{"name":1077,"slug":1078,"type":15},{"name":985,"slug":986,"type":15},{"name":1094,"slug":37,"type":15},"2026-07-12T08:21:34.637923",{"slug":1155,"name":1155,"fn":1156,"description":1157,"org":1158,"tags":1159,"stars":1081,"repoUrl":1082,"updatedAt":1165},"binlog-generation","generate MSBuild binary logs for diagnostics","Generate MSBuild binary logs (binlogs) for build diagnostics and analysis. USE FOR: adding \u002Fbl:{} to any dotnet build, test, pack, publish, or restore command to capture a full build execution trace, prerequisite for binlog-failure-analysis and build-perf-diagnostics skills, enabling post-build investigation of errors or performance. Requires MSBuild 17.8+ \u002F .NET 8 SDK+ for {} placeholder; PowerShell needs -bl:{{}}. DO NOT USE FOR: non-MSBuild build systems (npm, Maven, CMake), analyzing an existing binlog (use binlog-failure-analysis instead).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1160,1163,1164],{"name":1161,"slug":1162,"type":15},"Build","build",{"name":985,"slug":986,"type":15},{"name":1004,"slug":1005,"type":15},"2026-07-19T05:38:19.340791",{"slug":1167,"name":1167,"fn":1168,"description":1169,"org":1170,"tags":1171,"stars":1081,"repoUrl":1082,"updatedAt":1175},"build-parallelism","optimize MSBuild build parallelism","Diagnose and fix under-parallelized MSBuild builds. USE WHEN a multi-project solution build is slower than expected, doesn't speed up when you add cores, pegs a single core while others idle, or you want to know why `-m` isn't helping. Note: `\u002Fmaxcpucount` default is 1 (sequential) — always pass `-m` for parallel builds. Covers finding the critical path (longest serial ProjectReference chain), graph build (`\u002Fgraph`), BuildInParallel, and solution filters (`.slnf`). DO NOT USE FOR: single-project builds, incremental issues (use incremental-build), compilation slowness inside one project (use build-perf-diagnostics), non-MSBuild build systems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1172,1173,1174],{"name":954,"slug":955,"type":15},{"name":1004,"slug":1005,"type":15},{"name":1064,"slug":1065,"type":15},"2026-07-19T05:38:18.364937",{"slug":1177,"name":1177,"fn":1178,"description":1179,"org":1180,"tags":1181,"stars":1081,"repoUrl":1082,"updatedAt":1188},"build-perf-baseline","establish and optimize build performance baselines","Establish build performance baselines and apply systematic optimization techniques. USE FOR: diagnosing slow builds, establishing before\u002Fafter measurements (cold, warm, no-op scenarios), applying optimization strategies like MSBuild Server, static graph builds, artifacts output, and dependency graph trimming. Start here before diving into build-perf-diagnostics, incremental-build, or build-parallelism. DO NOT USE FOR: non-MSBuild build systems, detailed bottleneck analysis (use build-perf-diagnostics after baselining).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1182,1183,1186,1187],{"name":1004,"slug":1005,"type":15},{"name":1184,"slug":1185,"type":15},"Monitoring","monitoring",{"name":1064,"slug":1065,"type":15},{"name":1123,"slug":1124,"type":15},"2026-07-12T08:21:35.865649",{"slug":1190,"name":1190,"fn":1191,"description":1192,"org":1193,"tags":1194,"stars":1081,"repoUrl":1082,"updatedAt":1199},"build-perf-diagnostics","diagnose MSBuild build performance bottlenecks","Diagnose MSBuild build performance bottlenecks using binary log analysis. USE FOR: identifying why builds are slow by analyzing binlog performance summaries, detecting ResolveAssemblyReference (RAR) taking >5s, Roslyn analyzers consuming >30% of Csc time, single targets dominating >50% of build time, node utilization below 80%, excessive Copy tasks, NuGet restore running every build. Covers timeline analysis, Target\u002FTask Performance Summary interpretation, and 7 common bottleneck categories. Use after build-perf-baseline has established measurements. DO NOT USE FOR: establishing initial baselines (use build-perf-baseline first), fixing incremental build issues (use incremental-build), parallelism tuning (use build-parallelism), non-MSBuild build systems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1195,1196,1197,1198],{"name":954,"slug":955,"type":15},{"name":985,"slug":986,"type":15},{"name":1004,"slug":1005,"type":15},{"name":1064,"slug":1065,"type":15},"2026-07-12T08:21:40.961722",{"slug":1201,"name":1201,"fn":1202,"description":1203,"org":1204,"tags":1205,"stars":1081,"repoUrl":1082,"updatedAt":1209},"check-bin-obj-clash","detect MSBuild output path conflicts","Detects MSBuild projects with conflicting OutputPath or IntermediateOutputPath. USE FOR: builds failing with 'Cannot create a file when that file already exists', 'The process cannot access the file because it is being used by another process', intermittent build failures that succeed on retry, or missing\u002Foverwritten outputs in multi-project or multi-targeting builds where bin\u002Fobj (or project.assets.json) collide. Common causes: shared OutputPath, missing AppendTargetFrameworkToOutputPath, extra global properties (e.g. PublishReadyToRun), or SetTargetFramework on a ProjectReference to a single-targeting project. DO NOT USE FOR: file access errors unrelated to MSBuild (OS-level locking), single-project single-TFM builds, non-MSBuild build systems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1206,1207,1208],{"name":985,"slug":986,"type":15},{"name":1004,"slug":1005,"type":15},{"name":1120,"slug":1121,"type":15},"2026-07-19T05:38:14.336279",144]