Sign in

Stuart Lang

@stu.dev
274 followers 316 following 79 posts

Microsoft MVP. Co-organiser of .NET South West and DDD South West. Loves learning and sharing, particularly anything @dotnet. He/Him. Blogs at stu.dev @stuartblang (to help those migrating from Twitter)

PostsRepliesMedia
Stuart Lang @stu.dev · 12/07/2026
Yes, the tbd stub files are generated, and the symbol names are derived from the MIT-licenced dotnet runtime packs. The macOS SDKs are then consulted to discover the library the symbol maps to (that's all) Explanation: github.com/slang25/AotA... Script to generate stubs: github.com/slang25/AotA...
042
Stuart Lang @stu.dev · 11/07/2026
Thanks, I have a drift detection workflow which includes the latest previews: github.com/slang25/AotA...
010
Stuart Lang @stu.dev · 11/07/2026
Yes please, any ideas you have to make this slicker are much welcomed 😀
100
Stuart Lang @stu.dev · 11/07/2026
110
Stuart Lang @stu.dev · 11/07/2026
Oh, forgot to post the CI matrix: github.com/slang25/AotA...
github.com
Add Builds on / Runs on matrix graphic to README (#70) · slang25/AotAnywhere@b669849
NuGet package to help you cross-compile Native AOT to different OSes/architectures - Add Builds on / Runs on matrix graphic to README (#70) · slang25/AotAnywhere@b669849
110
Stuart Lang @stu.dev · 11/07/2026
I've swapped our multi-runner job at work, and now just have a single runner producing our native cli, and it's working great.
200
Stuart Lang @stu.dev · 11/07/2026
Thanks, I needed Fable to get me over the line with this 😅 I've been trying to get this matrix green for a while now, and the final big hurdle was how to build for macOS on non-macOS hardware without shipping the SDK (which is prohibited), that's solved now by generating the stubs.
210
Stuart Lang @stu.dev · 11/07/2026
A link to the repo with further details: github.com/slang25/AotA...
github.com
GitHub - slang25/AotAnywhere: NuGet package to help you cross-compile Native AOT to different OSes/architectures
NuGet package to help you cross-compile Native AOT to different OSes/architectures - slang25/AotAnywhere
100
Stuart Lang @stu.dev · 11/07/2026
Today I'm releasing AotAnywhere, a package which enables cross platform publishing support for dotnet NativeAOT. Before this package you had to use multiple different runners, with AotAnywhere you can publish for all targets from any single host. This is continuing the great work of @migeel.sk
Graphic showing all supported environments to build on, and all supported environments the resulting binary can run on.
4198
Reposted by Stuart Lang
Damian Edwards @damianedwards.com · 30/05/2026
New version of `dotnet-outdated` is out with support for C# file-based apps! Thanks to @stu.dev for the quick turnaround ❤️ #dotnet
1284
Reposted by Stuart Lang
David Pine @davidpine.dev · 21/04/2026
I love the #developercommunity, and this is an awesome contribution to @aspire.dev from @stu.dev where he added twoslash to our code blocks. Check it out: aspire.dev/get-started/... Our @typescriptlang.org code is literally looking like an IDE now. 🤓
A TypeScript code block from  aspire.dev, showing a tooltip hover over actual code APIs, just like an IDE.
042
Stuart Lang @stu.dev · 21/02/2026
I also forked ghostty-web to fix a bunch of quirks github.com/slang25/ghos...
github.com
GitHub - slang25/ghostty-web: Ghostty for the web with xterm.js API compatibility
Ghostty for the web with xterm.js API compatibility - slang25/ghostty-web
000
Stuart Lang @stu.dev · 21/02/2026
It's currently hosted on Cloudflare Pages, but we could host it in most places as it's static, but these headers are essential (which rules out GH Pages): github.com/slang25/spec...
github.com
spectreconsole-playground/src/Spectre.Docs.Playground/wwwroot/_headers at main · slang25/spectreconsole-playground
Contribute to slang25/spectreconsole-playground development by creating an account on GitHub.
100
Stuart Lang @stu.dev · 21/02/2026
Hey, sure, I think it's ready. I have also created a library (not pushed to nuget just yet) that enables creating a link with embedded content it (so we can link from docs with runnable examples). The repo is here currently: github.com/slang25/spec...
github.com
GitHub - slang25/spectreconsole-playground
Contribute to slang25/spectreconsole-playground development by creating an account on GitHub.
100
Stuart Lang @stu.dev · 18/02/2026
Totally. Great post. Something else in the mix here is the T4.BuildTools package github.com/dotnet/aspne... For me there should be the same tool that runs in VS and and from the dotnet cli.
github.com
Investigate using the new T4 Command-Line Tool for .NET · Issue #49382 · dotnet/aspnetcore
At some point in the future it might be worth looking at having the repo updated to use the .NET 6 version of the tt generator for the generated code as it might resolve some friction users have ha...
110
Stuart Lang @stu.dev · 18/02/2026
This is pretty much the mixed emotions I've been going through recently. Thanks for sharing
020
Stuart Lang @stu.dev · 18/02/2026
Not sure if this link will work, but let's try: spectreconsole-playground.pages.dev#nVbLbuM2FN3r...
spectreconsole-playground.pages.dev
Spectre.Console Playground
431
Stuart Lang @stu.dev · 18/01/2026
Thanks! Do let me know if there are any improvements that can be made or issues with it. The code is over here: github.com/slang25/msbu... It's a static app using .NET WASM on web workers, the web workers bit was the thing that made it viable for larger projects.
github.com
GitHub - slang25/msbuild-binlog-perfview
Contribute to slang25/msbuild-binlog-perfview development by creating an account on GitHub.
120
Stuart Lang @stu.dev · 18/01/2026
My latest side project, this takes an MSBuild binlog file and transforms it into a Perfetto trace msbuild-binlog-perfview.pages.dev
2249
Stuart Lang @stu.dev · 08/01/2026
Maybe you need a comparer comparer
020
Stuart Lang @stu.dev · 05/01/2026
@chethusk.bsky.social We didn't need to wait for the dotnet 10 SDK to get file-based apps after all 🙃
020
Stuart Lang @stu.dev · 27/12/2025
Yeah it's web assembly that compiles assemblies (CIL) and then loads that. I started with xtermjs for the terminal and then switched to libghostty, because you know, it's cool!
120
Stuart Lang @stu.dev · 27/12/2025
@patriksvensson.se I've been hacking around with something locally, just looking to fix out a few kinks and will send a PR
240
Stuart Lang @stu.dev · 26/12/2025
@andrewlock.bsky.social truly is the "Simpsons did it" of tech 😅
110
Stuart Lang @stu.dev · 26/12/2025
An option: andrewlock.net/replacing-di...
andrewlock.net
Replacing Disqus with GitHub discussions using giscus
I recently replaced Disqus with giscus for comments on this blog. In this post I describe the process I took
100
Stuart Lang @stu.dev · 23/12/2025
This is awesome, I think I'll be using this a lot cause I love worktrees but always search the commands and find them a little clunky. Random tangent, is the install․sh some kind of template, or something bespoke for this project?
100
Stuart Lang @stu.dev · 22/12/2025
This was a nice touch 😅
Screen grab of the PTY component with a friendly message to say you should use a desktop browser, with the opening message "Whoa there, mobile warrior!"
100
Stuart Lang @stu.dev · 22/12/2025
Ghostty is it for me. I'm using the tip release, which has search. Once 1.3 is out it's going to be an easy recommendation.
010
Reposted by Stuart Lang
ardalis (Steve Smith) @ardalis.com · 13/12/2025
Good advice for aspiring tech speakers 👇 dylanbeattie.net/2025/12/08/s...
dylanbeattie.net
So You Want To Speak At Software Conferences? : dylanbeattie.net
An article from dylanbeattie.net
0137
Stuart Lang @stu.dev · 10/12/2025
@chethusk.bsky.social What happened to your binlog MCP tool out of interest? I think it disappeared from GH
000
Stuart Lang @stu.dev · 02/12/2025
"Levenshteinly close" I'm so stealing that phrase 😅
030
Reposted by Stuart Lang
Andrew Lock "Sock" @andrewlock.bsky.social · 24/11/2025
Great post about TUnit here medium.com/@thomhurst/t...
medium.com
TUnit — Why I Spent 2 Years Building a New .NET Testing Framework
I started building TUnit around two years ago. For those who have followed the journey, you’ll be glad to see the recent release of…
33411
Stuart Lang @stu.dev · 24/11/2025
This is the time of year when everyone "Adds dotnet 10 support", which was already there, but are actually just dropping dotnet 8 support
220
Stuart Lang @stu.dev · 19/11/2025
This was a lot of fun, I always look forward to appearing on this stream. Watch to find out some of the inner workings of the new C# 14 features
040
Reposted by Stuart Lang
Andrew Lock "Sock" @andrewlock.bsky.social · 18/11/2025
Blogged: Companies complaining .NET moves too fast should just pay for post-EOL support andrewlock.net/companies-us... In this post I describe a solution to .NET "releasing too quickly": just pay for support of older versions, such as HeroDevs' Never Ending Support for .NET 6… #dotnet @hero.dev
andrewlock.net
Companies complaining .NET moves too fast should just pay for post-EOL support
In this post I describe a solution to .NET "releasing too quickly": just pay for support of older versions, such as HeroDevs' Never Ending Support for .NET 6
1125
Reposted by Stuart Lang
Safia Abdalla @captainsafia.com · 10/11/2025
First: I am really proud of this blog post title. It’s for the girlies (IYKYK). Second: .NET 10 drops tomorrow, so I did a whirlwind tour of the big and small features I worked on this cycle. Third: go read it! #dotnet #aspnetcore 📰 :https://blog.safia.rocks/2025/11/10/aspnetcore-ten/
blog.safia.rocks
And just like that .NET 10 ships tomorrow
A look at key ASP.NET Core features shipping in .NET 10, including: model validation for Minimal APIs, OpenAPI 3.1 support with unified JSON Schema, improved integration testing with top-level…
46616
Reposted by Stuart Lang
Deniz İrgin @denizirgin.bsky.social · 27/10/2025
📢LocalStack .NET Aspire Integration just hit its first stable release! 🎉 Highlights: ⚡ Eager service loading support (KUDOS @stu.dev) 🐳 Docker socket support (for Lambda containers) 🐛 Fixed Lambda + SQS "Invalid URL" bug github.com/localstack-d...
github.com
GitHub - localstack-dotnet/dotnet-aspire-for-localstack: This repositry contains the integrations with .NET Aspire for LocalStack
This repositry contains the integrations with .NET Aspire for LocalStack - localstack-dotnet/dotnet-aspire-for-localstack
132
Stuart Lang @stu.dev · 02/10/2025
I'm also thinking about an option that plugs into nuget, there is the concept of a "NuGet Package Download Plugin", which might give another way to "listen" to download events
010
Stuart Lang @stu.dev · 02/10/2025
To summarize, unused != unneeded Not sure if this is intentional @chethusk.bsky.social
100
Stuart Lang @stu.dev · 02/10/2025
So with this approach it then needs to redownload the unused packages on the next build, then the following build it will clear them. I can't distinguish between packages that will be downloaded but not used, vs old packages (if that makes sense)
100
Stuart Lang @stu.dev · 02/10/2025
So what's happening in numbers: * start with no cache * during the build we download 420 package versions * upload that to the cache * same build - restore cache * touch all 420 package metadata with last weeks timestamp * build * only 319 metadata files updated last read time * I delete 101 pkgs
110
Stuart Lang @stu.dev · 02/10/2025
I've been playing with this in CI and am getting some odd results, it seems to be _mostly_ working. Our GHA runners have relatime set on the mount we use, and this also makes things more confusing, so I first reset all f the atimes to 7 days earlier before starting the build
110
Stuart Lang @stu.dev · 30/09/2025
the http-cache is only valid up to 30 mins, so isn't much use in CI scenarios. I think it's just a missing part of the story. I know that @terrajobst.net played around with the idea of "dotnet nuget gc" which is sort of what's needed here: github.com/terrajobst/d...
github.com
GitHub - terrajobst/dotnet-nuget-gc
Contribute to terrajobst/dotnet-nuget-gc development by creating an account on GitHub.
100
Stuart Lang @stu.dev · 30/09/2025
The problem is you need to restore the cache into NUGET_PACKAGES, but at the end of it you want to say "now copy the contents of NUGET_PACKAGES, but _only_ the packages that were actually used" @chethusk.bsky.social this should be a thing
210
Stuart Lang @stu.dev · 30/09/2025
It happens when you cache the global package cache directory as at the end of each build, there's no eviction of older package versions that weren't used. It's an oversight IMO
100
Stuart Lang @stu.dev · 19/09/2025
Looks interesting, my goto for this these days is SpreadCheetah for performance reasons: github.com/sveinungf/sp... We used ClosedXML for some finance domain stuff, and for large spreadsheets these libraries cannot handle large-ish spreadsheets (hundreds of thousands of rows)
github.com
GitHub - sveinungf/spreadcheetah: SpreadCheetah is a high-performance .NET library for generating spreadsheet (Microsoft Excel XLSX) files.
SpreadCheetah is a high-performance .NET library for generating spreadsheet (Microsoft Excel XLSX) files. - sveinungf/spreadcheetah
210
Stuart Lang @stu.dev · 18/09/2025
It passes in xunit v3, and fails in xunit v2 (and is non-deterministic, but in practice always fails)
110
Stuart Lang @stu.dev · 18/09/2025
We have a winner!
110
Stuart Lang @stu.dev · 18/09/2025
I will post the full explanation tomorrow, but the answer is sort of all four of the options 😅 I'm not kidding
210
Stuart Lang @stu.dev · 17/09/2025
Your code quiz for today 📝 Does the following xUnit test: 1. Always passes 2. Always fails 3. Sometimes passes/fails 4. More information needed #dotnet
210