Gerald Versluis

@jfversluis.dev

Engineer @microsoft.com (.NET) | content creator | speaker | gamer | .NET MAUI, Blazor, C# | posts & opinions on personal title | He/Him | Talk about what you love, not what you don't. 📍 Maastricht, NL 🎥 YouTube.com/@jfversluis 🔌 jfversluis.dev

XAML is getting a serious upgrade in .NET 11. Global and implicit XML namespaces, source generation, C# expressions in XAML, incremental Hot Reload, and performance improvements are all on the way for .NET MAUI. At MAUI Day Skopje, Stéphane Delcroix will break it all down.

Bild

I made two contributions to the GitHub Copilot CLI! Fellow content creators should be happy. Streamer mode now: - Hides the timestamps on your prompts - Suppresses the "update available" notification Look out for it in a next release! 👀

One shot with GitHub Copilot Desktop: @mauiday.net event app with data coming from Sessionize, branding taken from the website, used MAUI DevFlow so that the agent could self-verify and adjust. Is it perfect? Not yet, but also I could not have done this in the time Copilot did.

BildBildBildBild

What’s next for .NET MAUI? At #MAUIDay Cologne, Gerald Versluis will explore where .NET MAUI stands today, what .NET 11 brings. Discover how AI, performance, quality, native experiences and developer productivity are shaping the future of cross-platform apps.

Bild

Copilot CLI tip: restrict tools before the task starts. If I only want repo work, I do not want the agent trying web searches or unrelated commands. Use available/denied tools to shape the session up front. Fewer detours. Less approval noise. Less wasted context.

Terminal screenshot in Windows PowerShell showing the command copilot --excluded-tools='web_fetch,web_search' at a C source prompt, demonstrating how to start Copilot CLI with web fetch and web search tools excluded.

Copilot CLI remote control feels like a small feature until you use it. Start a session with --remote, walk away, then steer it from GitHub.com or GitHub Mobile when it needs approval or direction. Very handy for long-running fixes where the terminal is not where you are.

Desktop screenshot of GitHub Copilot CLI showing the slash command /remote with options to enable or disable remote control, alongside a code diff and session details.Mobile screenshot of a GitHub Copilot remote session in GitHub Mobile showing a conversation about merging a pull request, a branch-policy question, and a reply box to continue from the phone or web.

Saturday Copilot save list: 1. Keep sessions PR-sized 2. Ask for bug review, not “thoughts” 3. Give broken-test tasks a stop condition The pattern is boring but useful: smaller scope, clearer constraints, easier review.

Copilot CLI prompt template for broken tests: Goal: make this test pass. Failing command: ... Failure: ... Constraints: keep public behavior. Validation: rerun the same command. Stop if: the fix needs product/design input. Report: root cause, files changed, test result.

The one thing I want for the GitHub Copilot desktop app now is a way to go over all my sessions that have an open PR that is not merged and tell me the latest state of each so I don't have to poll them all myself with: news?

Screenshot of a GitHub Copilot chat showing a PR status update: CI passed on the previous commit, one unresolved review thread remains, and a new CI run is pending.

The Copilot app/CLI habit I keep coming back to: one session should be one PR-sized change. Not “make the app better”. More like: • fix this failing test • add this validation rule • update this API call and its tests Small scope. Clear diff. Easier review.

Graphic titled Copilot session sizing. It compares vague Copilot tasks like make the app better, clean up the codebase, fix performance, and modernize everything with PR-sized tasks like fix this failing test, add this validation rule, update this API call, and include matching tests. Footer says treat each session like a focused branch.

My favorite kind of refactor is the one users never notice. Delete dead code. Rename the confusing thing. Move setup into one place. Add the guard clause that makes the impossible state impossible. No demo. No screenshots. Just less code that can hurt you later.

Got something to share with the .NET MAUI community? The CFP for #MAUIDay Cologne is open. We’re looking for practical talks, real-world lessons, technical deep dives, workshops, and fresh ideas from across the .NET MAUI ecosystem. 📍 Cologne 📆 Closes 1st August

Bild

GitHub Actions tip: stop giving GITHUB_TOKEN more access than the job needs. A build job usually needs read access. A release job may need write access. An issue/comment bot needs something else again. Set permissions per workflow or job. Start small, then add only what breaks.

Graphic titled GitHub Actions token permissions. It compares overly broad GITHUB_TOKEN permissions such as write-all with a better default of workflow contents read and write access only for the release job, summarized as start read-only and add writes deliberately.

A Copilot code review prompt I like: “Review this diff for bugs only. Ignore style unless it changes behavior. Focus on edge cases, async flow, nullability, threading, resource lifetime, and tests that should exist but do not.” Much better than “what do you think?”

If your .NET solution has package versions scattered across project files, future you has cleanup waiting. Central Package Management moves versions into Directory.Packages.props. Projects reference the package. One file owns the version. Less dependency archaeology.

Graphic titled Central Package Management. It compares package versions scattered across project files before, with a Directory.Packages.props file after, summarizing that one file owns package versions and there is less dependency archaeology.

MAUI startup feels slow? Do not optimize from vibes. Add timestamps around: 1. App/process start 2. App constructor 3. first page + viewmodel creation 4. first data call 5. first frame after navigation Then fix the biggest gap, not the loudest guess.

One HttpClient per request is not the fix. It owns a connection pool. Dispose it constantly and you churn connections/ports. Use one of these: • long-lived HttpClient + PooledConnectionLifetime • short-lived clients from IHttpClientFactory

Cheat sheet graphic titled HttpClient lifetime. It says not to create and dispose HttpClient for every request, warns against connection churn, port pressure, and stale DNS surprises, and recommends either a long-lived HttpClient with PooledConnectionLifetime or IHttpClientFactory named or typed clients.

Steal this .NET MAUI release check before you ship: 1. Cold start on a real device 2. Light/dark switch while running 3. Deep link with real parameters 4. Network off/on 5. Rotate, resume, background 6. Fresh install + upgrade install Boring? Yes. Finds bugs? Also yes.

Checklist graphic titled .NET MAUI release check with six items: cold start on a real device, light/dark switch while running, deep link with real parameters, network off/on, rotate resume background, and fresh install plus upgrade install.

Saturday .NET catch-up list: 1. Test a .NET MAUI preview SDK locally without breaking your machine 2. Move NuGet publishing away from long-lived API keys 3. Watch the SkiaSharp 4 MAUI standup Practical stuff for the weekend. Links below.

Friday afternoon hot take: The best developer tools are the ones you barely notice. Not flashy. Not full of ceremony. Just boring little things that quietly remove friction until you forget how annoying the old workflow was. What boring tool deserves more credit?