analyze-session
Skill8.6k starsChanged 52 days agoMITView on GitHub
Opens a WinUI Profiler session file (.sqlite) and answers questions about a WinUI 3 app's performance from it with the winui-profiler tools: how the launch went, UI-thread ticks and slow ticks, regions of interest (navigations, flyouts and dialogs opening, focus changes), and the UI elements and composition visuals the events mention. Use it when someone asks why a WinUI app is slow to start or draws slowly, what a tick did, what happened around a navigation or to an element, or what a session holds, and for /winui-profiler:analyze-session [session.sqlite | folder].
3 other projects use a version of this.
Trending
Quiet since August.about the whole repository
Most recently taken up by
- NTCoding/living-architecturetheir own version, first seen Nov 1, 2026
- tbhb/vale-ai-tellstheir own version, first seen Oct 11, 2026
- dabowman/Figmagenttheir own version, first seen Sep 4, 2026
Who's talking about microsoft/microsoft-ui-xaml
- dotnet/maui“Cross platform UX for .NET 5”GitHub · Jul 18, 2017 · 217 reactions
- A Hacker News story“WinUI 3 Performance: A Leap Forward”Hacker News · May 14, 2026 · 121 points
- xamarin/Xamarin.Forms“Proposal: Simplify Grid Column and Row Definitions”GitHub · Aug 28, 2019 · 67 reactions
- dotnet/maui“[Enhancement] Cross platform media player”GitHub · Aug 27, 2021 · 44 reactions
- dotnet/maui“Support Global Exception Handling Mechanism for .NET MAUI”GitHub · Mar 23, 2022 · 41 reactions
The biggest 5 of 72 mentions linking to the repository that our crawl found. Each line is their own headline.
See all 72
Talked about on GitHub, Stack Overflow, Hacker News and Bluesky (72 times).
On GitHub · 30
- Jul 18, 2017Cross platform UX for .NET 5 — dotnet/maui217 reactions · 31 comments
- Aug 28, 2019Proposal: Simplify Grid Column and Row Definitions — xamarin/Xamarin.Forms67 reactions · 13 comments
- Aug 27, 2021[Enhancement] Cross platform media player — dotnet/maui44 reactions · 23 comments
- Mar 23, 2022Support Global Exception Handling Mechanism for .NET MAUI — dotnet/maui41 reactions · 12 comments
- Apr 26, 2019Adds UWP support to Shell — xamarin/Xamarin.Forms39 reactions · 45 comments
25 more on GitHub
- Aug 28, 2019Proposal: Simplify Grid Column and Row Definitions — dotnet/wpf35 reactions · 7 comments
- Jun 22, 2019Support using Win2D with WinUI — microsoft/Win2D35 reactions · 28 comments
- May 19, 2020[WinUI3] Windows Community Toolkit 7.0.1 for Project Reunion 0.5 — CommunityToolkit/WindowsCommunityToolkit30 reactions · 49 comments
- Mar 18, 2020Proposal: Allow the App to Print without showing the Confirmation Dialog to user — microsoft/WindowsAppSDK28 reactions · 47 comments
- Oct 8, 2022Windows Unpackaged support in .NET MAUI — dotnet/maui27 reactions · 4 comments
- May 29, 2020Discussion: Decouple MSIX from AppContainer — microsoft/WindowsAppSDK26 reactions · 14 comments
- Aug 22, 2021BlazorWebView drag and drop does not work with MAUI Templates — dotnet/maui24 reactions · 96 comments
- Nov 14, 2019[Enhancement] WinUI Support — xamarin/Xamarin.Forms23 reactions · 11 comments
- Feb 7, 2025Fix issues with High CPU Usage on background — Devolutions/UniGetUI10 reactions
- Jun 20, 2022Remove Xaml from `windows` crate — microsoft/windows-rs8 reactions · 16 comments
- Dec 14, 2023XY focus — AvaloniaUI/Avalonia7 reactions · 10 comments
- Jun 1, 2019Porting ItemsRepeater from WinUI — AvaloniaUI/Avalonia7 reactions · 14 comments
- Feb 12, 2026Update to Windows App SDK 1.8 — microsoft/Win2D5 reactions · 1 comment
- Jan 30, 2025Improve VisualState order and prevent sticky Focused visual state — dotnet/maui5 reactions · 84 comments
- Dec 27, 2023Add BackgroundSizing — AvaloniaUI/Avalonia5 reactions · 16 comments
- Mar 21, 2022Add new ColorSpectrum Primitive — AvaloniaUI/Avalonia5 reactions · 30 comments
- Mar 19, 2025[Windows] Upgrade to Windows App SDK 1.7 — dotnet/maui4 reactions · 32 comments
- Nov 17, 2023Create a "Similar Issues" bot — dotnet/maui4 reactions
- Dec 17, 2021Do not copy UWP behavior with ListBoxItem horizontal alignment — AvaloniaUI/Avalonia4 reactions · 3 comments
- Nov 29, 2021Make DispatcherQueueSynchronizationContext faster and zero-alloc — microsoft/CsWinRT4 reactions · 7 comments
- Sep 15, 2021Update to MUX 2.7 — microsoft/terminal4 reactions · 3 comments
- Aug 11, 2020Add support for WinUI 3 — mono/SkiaSharp4 reactions · 18 comments
- Dec 3, 2025New functionalities of Storage.Pickers: SettingsIdentifier; InitialFileTypeIndex; Title; PickMultipleFoldersAsync; ShowOverwritePrompt; — microsoft/WindowsAppSDK3 reactions · 11 comments
- Mar 15, 2025Add BreadcrumbBar — amwx/FluentAvalonia3 reactions · 1 comment
- Sep 9, 2023[Keyboard Manager] Modernize the editor UI — microsoft/PowerToys3 reactions · 36 comments
On Stack Overflow · 30
- Dec 10, 2021Where is the designer view in WinUI 3?17 votes
- Sep 4, 2019Layout cycle detected. Layout could not complete. Layout cycle detected. Layout could not complete6 votes
- Nov 11, 2020NavigationView Pane background5 votes
- Jun 16, 2023c# WebView2 user directory "Access Denied"4 votes
- Feb 13, 2023Remove ListViewItemPresenter border in Microsoft.UI.Xaml ListView3 votes
25 more on Stack Overflow
- Nov 12, 2020What is the <ColumnDefinition /> used for in Xamarin Forms and can it be replaced with a value setting?3 votes
- Apr 22, 2020Is it possible to stop the first Entry getting Focus in a ScrollView in Xamarin Forms3 votes
- Sep 21, 2018UWP NavigationView is not supported3 votes
- Aug 4, 2025Difference between Windows App SDK and WinUI 32 votes
- Nov 13, 2024How to fix MAUI application crash with "Layout cycle detected. Layout could not complete." exception when data is loaded into views beyond a limit2 votes · 1 answer
- Jan 24, 2024How can I build a self-contained C# WinUI application from within a Windows Docker container (`XamlCompiler.exe` exits with code `-1073741515`)?2 votes
- Sep 29, 2023MAUI Picker style in Windows Platforms2 votes
- Sep 3, 2023UWP XAML NavigationView - CornerRadius on Content Panel2 votes
- Apr 25, 2023WinUI 3 Circle Button needs to keep hover animation2 votes
- Sep 4, 2021How to Access WinUI Generic.xaml file?2 votes
- Nov 29, 2019How to automatically scroll ScrollViewer - only if the user did not change scroll position2 votes
- Apr 12, 2024Cannot create a new WinUI 3 app and target .NET 81 vote · 1 answer
- Apr 11, 2024Make window only as large as required1 vote
- Mar 27, 2024What the equivalent to LocalPrintServer and PrintQueue that can be used in WinUI1 vote
- Mar 8, 2024SwapChainPanel DPI Awareness1 vote
- Jun 12, 2023Change Microsoft.UI.Xaml.Controls.Expander Title property when expanded1 vote · 1 answer
- May 1, 2023WinUI 3/WASDK 1.3 How do I shorten the width of the month on a DatePicker control?1 vote · 1 answer
- Nov 24, 2022Camera Video streaming control (CaptureElement) not available for Winui3 c#1 vote
- Nov 9, 2022Winui3 Navigationview PanetoggleButton increase size1 vote
- Mar 13, 2022WinUI 3 ItemsRepeater re-orders/removes items when scrolling within a ScrollViewer and using UniformGridLayout1 vote · 1 answer
- Jan 23, 2022Using TabItemTemplateSelector in WinUI 3 in conjunction with a TemplateSelector resulting in weirdly nested controls1 vote
- Feb 3, 2021Binding a Static Generic Class in XAML1 vote
- Oct 25, 2020UWP CommandBar moves vertically when IsOpen changes1 vote · 1 answer
- Jul 4, 2020Unable to change the background colour of TeachingTip in UWP1 vote
- Jul 16, 2019Creating a Subclass of Page in UWP1 vote · 2 answers
On Hacker News · 11
- May 14, 2026WinUI 3 Performance: A Leap Forward121 points · 141 comments
- Oct 25, 2023WinUI3 Source Available4 points
- Feb 13, 2022Dependency property is much slower in WinUI 3 than in WPF4 points
- Jul 1, 2019Windows UI Library Roadmap4 points
- Oct 25, 2023WinUI 3 is now open source3 points
6 more on Hacker News
- Aug 29, 2026WinUI development is now happening on GitHub2 points
- May 26, 2024Is WinUI 3 Dead?2 points
- Nov 13, 2019Windows UI Library Roadmap Update2 points
- Nov 6, 2019First WinUI 3.0 Alpha now available2 points
- Aug 2, 2025WinUI OSS Update: Phased Rollout Toward Open Collaboration1 point
- Jul 23, 2024Windows UI Library1 point
On Bluesky · 1
- Jan 26, 2025Over here: github.com/microsoft/mi... — @dotmorten.xaml.dev1 likes and repost · 1 reply
Other versions3 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 3
- NTCoding/living-architecture★ 139same name
- tbhb/vale-ai-tells★ 118same name
- dabowman/Figmagent★ 0same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository9 other files it gives its agents.
- dxaml/xcp/AGENTS.mdAGENTS.md
- Samples/TableViewSampleApp/AGENTS.mdAGENTS.md
- src/.github/copilot-instructions.mdCopilot instructions
- buildSkill
- code-coverage-calculationSkill
- code-reviewSkill
- test-on-vmSkill
- bt-buildSkill
- test-suite-setupSkill
The file
We split this skill into the rules it gives an agent
8 rules. 0 are common, 2 are distinctive, and 6 are very specific to this project.
0
Common
Most of the 3 edited versions we read keep these.
2
Distinctive
This author's own choices. Worth a look.
6
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 29
A
.sqlitefile: call sessions with view summary and sessionPath set to it. - Very specific: line 32
Nothing: call sessions with view summary and no sessionPath.
- Very specific: line 34
A folder: call sessions with view list and folder.
- Very specific: line 40
If the session can't be read, give the tool's error, offer sessions with view list, and stop.
- Distinctive: line 45
When the command only opened a session, reply briefly from its summary, then stop and call nothing else until the user asks a question:
- Very specific: line 57
Call sessions with view summary first, once per session.
- Very specific: line 60
Call only the views the question needs, as the table below says.
- Distinctive: line 120
If the user asks not to see the section, leave it out until they ask for it again.
“Common” is measured: kept by at least 6 in 10 of the 3 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Analyze a WinUI Profiler session
The WinUI Profiler app (tools/WinUIProfiler in the microsoft-ui-xaml
repository) records one WinUI 3 process into a session file. Its processors
store each UI thread's ticks, the regions of interest, and the UI elements
and composition visuals the events mention. The winui-profiler tools read
them, even while the app is still recording, and never change the file.
Pick the session
/winui-profiler:analyze-session [target] opens a session; the target is the
text after the command. A question, with or without the command, is about
the session file it names, or else the newest one.
- A
.sqlitefile: callsessionswith viewsummaryandsessionPathset to it. A file name alone means one in the sessions folder,%LOCALAPPDATA%\WinUIProfiler\Sessions. - Nothing: call
sessionswith viewsummaryand nosessionPath. It reads the newest file in the sessions folder; say which file that is. - A folder: call
sessionswith viewlistandfolder. Show the sessions (file, process, coverage, start, how it ended, events), ask which one to open, and stop. - A
.etlfile: the tools don't read traces. Say how to read it into a session file (Getting a session, below), and stop.
If the session can't be read, give the tool's error, offer sessions with
view list, and stop. Pass the file the summary read as sessionPath to
every later call, so that every answer comes from the same file: the newest
file changes when the app starts another recording.
When the command only opened a session, reply briefly from its summary, then stop and call nothing else until the user asks a question:
- the file, and the process (name and ID);
- the coverage, and how the recording ended, or that it's still recording;
- the time span, and the stored events, ticks, elements and visuals;
- which analyses have data, and why the others don't;
- the notes that limit answers, such as lost or deleted events;
- two or three questions the session can answer, from the analyses it has.
Answer a question
- Call
sessionswith viewsummaryfirst, once per session. Itsanalysessay which tools and views have data and, when one hasn't, why; itsnotessay what limits the answers. - Call only the views the question needs, as the table below says. Lists are
capped by
limit; a result withnextOffsetcontinues fromoffset. - Answer only from what the tools return. Give numbers with their units, and the tick, region, thread or object they belong to.
- Say what was read: the file, the process and the time base. Pass on the notes that change the answer: still recording, events lost or dropped, the oldest events deleted, a session that starts at the connection.
- End with How I got this.
| Question | Call |
| Which sessions are there? | sessions, view list |
| What does the session hold? How long does it run? | sessions, view summary (its uiThreads) |
| How did the launch go? | launch, view milestones |
| How soon did the first frames draw? | launch, view frames |
| Does the app draw slowly? | frames, view summary, then slowest |
| What did one slow tick do? | frames, view tick with its tickId |
| What happened when a page, flyout or dialog opened? | frames, view regions, then rows with its regionId, then tick for the tick it ends with |
| When did layout passes, navigations or focus changes happen? | frames, view rows with type |
| Which elements and visuals were there? | objects, view types, then list |
| What happened to one element or visual? | objects, view history |
How I got this
End every reply, including a session's summary, a list of sessions and an
error, with a section headed How I got this, which shows how the answer
came from the session file. The tools don't take SQL: each view runs fixed
statements, with the arguments' values written in, then sorts, groups,
counts and pages their rows in code. Each result says how: queries lists
the statements the call ran, each once, and computed says what the call
did with their rows.
- Name the session file, and say that each statement runs on it as is,
read-only, with
sqlite3 -readonly <file>. Forsessionsviewlist, name the folder: its statement ran once on each file it lists that could be read. The first time in a conversation that a statement you show readsInterestingRows,InterestingRowEventsorFrameList, add that SQLite 3.54.0 and 3.54.1 can't run it ("VIEWs and/or subqueries nested too deep"), but another version, such as 3.53, can. - Then each call the answer used, in the order they were made: the tool, the
view and the arguments passed. Under it, each of its
queriesin order: itssql, copied exactly, in a code block markedsql; after the block, itsrows(of all its runs), itsrunswhen it ran more than once, and itsfileswhen the result gives them. Then the call'scomputed, copied exactly, after "Then:". - Last, one or two sentences on how those results led to the answer.
Rules:
- Copy each
sqlandcomputedexactly as the tool returned them. Never write, shorten, reformat or reconstruct SQL, and never show a statement no tool returned. Don't add to acomputed: what you conclude from the results goes in the last step. - A call whose
queriesis empty ran no SQL; say so. A call that failed returns only its error: give the error, and don't guess what it ran. - Show a statement once per answer. When a later call ran it again, say which call showed it. When an answer needed no new call, name the earlier calls it came from.
- The statements read the file as it was. A session still being recorded can return more rows when one is run again.
- If the user asks not to see the section, leave it out until they ask for it again.
Reading the results
- Ticks. A tick drew when XAML's frame counter moved on by the thread's next tick, so whether the latest tick drew isn't known. That isn't proof that a frame reached the screen: report tick durations and slow ticks, and don't call frames dropped. Slow means more than 16.7 ms, a frame at 60 Hz; the display's refresh rate isn't recorded.
- Tick times are wall-clock time on the UI thread, not CPU time: a long tick may have been waiting, and nothing in a session says on what. Events on render and decode threads, and on threads that never tick, belong to no tick.
- Types. An element's type is the nearest built-in type, so an app's own
control shows as its base class, unless only a template, Loaded or render
event named it. A render event's name has no namespace, so one type can
have two rows, such as
TransitionRootandMicrosoft.UI.Xaml.TransitionRoot(typeTransitionRootlists both). Objects no event gave a type are markedtypeUnknown, which isn't a type of its own. A freed object's address can be reused:historythen lists the objects that had it, and asks for one'sobjectId. - Builds. Ticks, regions and launch come from Microsoft-Windows-XAML in
every WinUI build. Current builds write the Microsoft-Windows-XAML-Profiler
events whenever a session enables the provider. Older builds wrote most of
them only with
XamlProfilerEnabled, which WinUI's own build set for Debug builds only, so a session of an older Release build has no visuals; its elements come from the Microsoft-Windows-XAML events that name them. A visual has a name, its owner element's label, only in older builds. - Times are in milliseconds from the origin
session.timeBasegives: for a live session, the start of the recording; for a trace, the process's first event in it. It also says when the process was created, when known: for a launch recorded from process start, or a trace with the kernel's process events, as a WPR trace has.launchthen givesmsFromProcessStart, unless the session starts at the connection, andmeasuredFromsays what its frames count from. - Length. Each of the summary's
uiThreadssays when its first tick started (firstStartMs) and its last finished tick ended (lastEndMs). For a live session,startedUtctoendedUtcis how long the recording ran. For a session read from a trace, they're when the trace was read, not when it was recorded, which the file doesn't say. - Limits. One process per session. A session file is limited to 500 MB: past it, the oldest events are deleted, and the summary says from which event the file is complete.
What the tools can't answer
These aren't stored, so say so, and don't estimate them from other data:
- the events' field values, and counts of raw events by provider;
- GPU memory, CPU samples and call stacks, context switches and thread waits;
- the XAML and composition trees;
- the Launch tab's milestones from the marker configuration, such as an app's own markers (a marker event fired on a UI thread shows only among its tick's events, in the Other bucket; one fired on another thread doesn't);
- other processes, such as the one that launched the app.
Getting a session
- Record it in the WinUI Profiler app. The connection modes Unpackaged
executable and Packaged application launch the app after the session
starts; Attach to process ID starts at the connection, after most of
the launch. Recording live needs an elevated WinUI Profiler, or the local
Performance Log Users group. Sessions are saved in the sessions folder,
named
<date>-<time>-<process>-<pid>.sqlite. - Read a trace (.etl) into one, which needs no elevation: in the app,
with the connection mode Recorded trace (.etl), then Open trace, or
with the WinUI Profiler CLI's
record <trace.etl> --pid <pid> --out <session.sqlite>.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

