Gerald Versluis
@jfversluis
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 🎥 🔌 jfversluis.dev
A red build should show evidence, not send you log hunting. Microsoft.Testing.Platform 2.3 puts test failures and summaries directly in GitHub Actions. The reporter is still preview. https://devblogs.microsoft.com/dotnet/microsoft-testing-platform-reporting/
Issues can be related without blocking or duplicating each other. GitHub's new "Relates to" relationship is in public preview, adding a neutral connection for cross-cutting work. https://github.blog/changelog/2026-08-07-connecting-issues-and-multi-select-field-support
One quick question shouldn't derail the agent that's already working. VS Code 1.132 adds `/btw`: a side chat that shares the current context and prompt cache without interrupting the active turn. Small feature. Very practical. https://code.visualstudio.com/updates/v1_132
Very millennial of me: I will happily type a small novel before talking to my computer. Then I tried VS Code 1.131's built-in dictation. Chat, editors, even the terminal. Honestly? Much faster than I expected. https://code.visualstudio.com/updates/v1_131
Upgraded a .NET MAUI app to .NET 10 and content moved under Android system bars? `ContentPage` now defaults to edge-to-edge. Set `SafeAreaEdges="Container"` to restore .NET 9-style behavior. https://learn.microsoft.com/dotnet/maui/user-interface/safe-area
We’re live! 🔴 Matt Goldman, David Ortinau, and I are recapping MAUI UI July: the highlights, community contributions, latest updates, and what’s next for building beautiful .NET MAUI apps. Come join us: https://www.youtube.com/watch?v=XH19sR5AzuA
Our midlife crisis has a registration page now. Mark and I signed up for HYROX Utrecht: 8 km running plus sleds, wall balls and burpees. The name is silly. The cause is serious. We're raising €1,500 for KWF cancer research ❤️ https://acties.kwf.nl/fundraisers/MarkandGeraldsmidlifecrisis
“Generate unit tests” leaves a lot unsaid. A new open-source test agent learns the repo, framework, and test command before writing tests. It completed 140/152 benchmark tasks vs 120/152 for stock Copilot. https://devblogs.microsoft.com/dotnet/polyglot-unit-testing-agent/
Publishing to NuGet.org with an API key? Aug 17: new keys max out at 30 days. Nov 1: older keys expire. If CI still uses a key, look at Trusted Publishing now. https://devblogs.microsoft.com/dotnet/strengthening-nuget-supply-chain-security-reducing-api-key-lifetime/
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.
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.
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.
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?
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.
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.
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.
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
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.
.NET MAUI tip: stop checking the app theme every time you need a color. AppThemeBinding lets XAML pick Light/Dark resources, and update when the system theme changes. Less theme plumbing. Fewer dark mode surprises. https://learn.microsoft.com/dotnet/maui/user-interface/system-theme-changes
Your queue has no brakes. If producers add work faster than consumers process it, an unbounded queue is delayed pain. Friday .NET tip: use a bounded Channel<t>. When it fills up, choose what happens: wait, drop, or fail. https://learn.microsoft.com/dotnet/core/extensions/channels</t>
That “Not recommended” label next to NuGet API Keys says a lot. NuGet is making the direction clear: stop using long-lived API keys. I finally moved to Trusted Publishing. Short-lived GitHub Actions tokens, no secret to rotate. https://blog.verslu.is/nuget/trusted-publishing-easy-setup/
Your background loop probably doesn't need Task.Delay. For periodic async work, PeriodicTimer makes the intent much clearer: wait for the next tick, do the work, repeat. One consumer at a time, dispose it, pass the token. https://learn.microsoft.com/dotnet/api/system.threading.periodictimer
7 years ago I swore I’d never write another book again. So anyway, here’s my new book: Getting Started with Visual Studio 2026 📘 Writing is hard. Finishing is harder. Holding the actual book? Pretty neat. It’s out now: https://www.amazon.com/Getting-Started-Visual-Studio-2026/dp/B0GPHTZXYG/
Stop using a mutable Dictionary for data that never changes. If you build lookup data once and read it a lot, FrozenDictionary can be a better fit. Freezing has a cost. Use it for long-lived lookups. https://learn.microsoft.com/dotnet/core/whats-new/dotnet-8/runtime#performance-focused-types
Your .NET MAUI app probably isn't just a phone app anymore. VisualStateManager + AdaptiveTrigger can switch layout when the window gets wider, right in XAML. No SizeChanged soup. Pretty neat. https://learn.microsoft.com/dotnet/maui/fundamentals/triggers#state-triggers
Delete your timeout helper. If your code has Task.WhenAny + Task.Delay just to put a timeout around an await, Task.WaitAsync probably does it cleaner. Tiny API. Nice cleanup. Very satisfying. https://learn.microsoft.com/dotnet/api/system.threading.tasks.task.waitasync
And yes, the badges are real physical ones you get at the event 😄 This one is from Kraków. Cologne gets its own design too. Tiny developer conference side quest unlocked: collect them all.
MAUI Day is coming to Cologne 🇩🇪 Friday, October 23, 2026. One day, in person, all about building mobile apps with .NET MAUI. No live stream or recordings, so if you can make it: go grab a ticket. Seats are limited. https://www.eventbrite.nl/e/net-maui-day-cologne-2026-tickets-1990687626278
.NET tip: stop discovering bad config after deploy. Bind your settings with the options pattern, validate them, and use ValidateOnStart. Missing URL? Invalid timeout? Fail at startup, not during the first real request. https://learn.microsoft.com/dotnet/core/extensions/options#options-validation