Sr. Content Developer at Microsoft, working remotely in PA, TechBash conference organizer, former Microsoft MVP, Husband, Dad and Geek.
161975 stories
·
33 followers

WSL containers is now generally available

1 Share
WSL is central to our commitment to making Windows the best place to build, run and manage Linux workloads. As AI, cloud-native development, containers, and open-source ecosystems continue to converge on Linux, more developers are choosing to perform these workloads directly on Windows devices. We’re continuing our journey towards this goal with a new feature in WSL: WSL containers, which is generally available today. To try it out,  simply runwsl --update in your terminal or download the latest release from GitHub and you will gain access to:
  • WSL containers CLI: wslc.exe to directly build, run and deploy Linux containers on Windows, or use its built-in alias container.exe to run the same familiar container commands
  • WSL containers API: Access functions to run Linux containers programmatically in your native Windows apps – unlocking scenarios like running local AI workloads or using cloud-based containerized applications locally.
PowerShell WSL Containers Screenshot For a deeper look at how WSL containers are built, how they work with WSL, and the architecture behind the platform, see our WSL containers architecture blog. Let's get into what's new with GA.

New commands and capabilities

Since public preview, we've continued to evolve WSL containers and our focus has been on making every day container workflows simpler, improving visibility into running environments, and adding the flexibility needed to manage containers at scale. As part of the GA release, we've introduced several new commands and capabilities across container lifecycle, networking, and observability. Here are a few highlights, and you can view the full change logs on our releases page:
  • wslc container restart — restart a running container
  • wslc container cp — copy files in and out via tar archive
  • wslc system info — see the state of your container environment at a glance
  • wslc network connect and wslc network disconnect — attach and detach containers from networks
  • wslc network create now supports arbitrary network driver options
  • wslc events – Streams real time container activity
  • Container health checks are now supported
  • --stop-timeout on wslc create and wslc run, including -1 for an infinite timeout
  • --mount support during wslc create and wslc run
  • A configurable storage path for the default wslc session, so you can put your container storage on the drive you want.
Alongside new commands and platform enhancements for developers, we've also focused on helping organizations adopt WSL containers with the governance and security controls required for production environments.

Enterprise manageability for WSL containers

This release extends Microsoft Intune and Microsoft Defender for Endpoint (MDE) integrations in WSL to include container workflows as well. MDE’s existing plugin for WSL has been augmented to also include support for containers. MDE can surface process, file and network activity from WSL containers and connect that activity back to Windows host, helping security teams investigate suspicious activity without creating a separate security workflow. Microsoft Intune has also added controls to enable or disable WSL container and restrict image pulls to approved registries. Additionally, on your Intune dashboard you will see new settings specific to the WSL container feature:
  • Allow WSL containers access - Control access to the entire WSL containers feature.
  • WSL containers registry allow list - For WSL containers enterprise adoption, organizations need stronger controls over the container images that can be introduced into their environment. With container registry allow lists, administrators can define approved registries and help ensure developers only pull container images from that list, that meet organizational security and compliance requirements.
You can view the WSL enterprise doc pages to learn more on how to set up WSL for your company.

Partner and community integrations

Partners and community contributors are bringing WSL containers into the editors, terminals and desktop tools developers already use, adding support for WSLc into existing projects or creating new ones. We're grateful for the fantastic community contributions that continue to expand the ecosystem around WSL containers.
  • VS Code dev container support: Use wslc as your default driver for creating and interacting with VS Code dev containers
  • Aspire: Aspire can use WSL Containers as first-class container runtime
  • VS Code container extension: A popular extension to manage your containers in VS Code, now supports wslc.
  • Lazywslc: A TUI dashboard to manage your WSL containers
  • WSL Container Desktop: WinUI 3 desktop app for managing WSL containers, Kubernetes (k3s) and container registries.
  • WSLc remote: A short wrapper script to run wslc from within WSL distros

What's next for WSL

Over time, we see Linux on Windows evolving beyond a development environment into a strategic execution platform for AI and cloud-native workloads, participating in the same enterprise security, management, and governance frameworks as Windows. We will continue to invest in the broader WSL experience, and in context of this release wanted to highlight two WSL specific items on our roadmap.

Adding wslc compose

Our top feature request for WSLc is adding compose support, and this will be our focus for our next iterations.   Our aim is for wsl compose up to work with your existing compose.yaml files, unchanged. We’ve started on this and hope to share more soon.

WSL fundamental improvements

We are also actively investigating how to better improve some of the core platform capabilities for WSL including networking, cross-OS file performance and more. You can see some of this work today with wslc, supporting up to 2x faster performance when accessing Windows files from Linux environments, helping reduce one of the most common cross-OS bottlenecks. It also introduces the new consomme network mode, enabled for container workflows which improves networking compatibility across developer and enterprise scenarios. These foundational improvements benefit WSL distributions, WSL containers, and other container technologies built on WSL, reflecting a broader effort to make Linux on Windows feel increasingly seamless and integrated.

Building the future of Linux on Windows, together

Thank you to the developers who tested the preview, shared feedback and helped improve WSL containers.  You can file any technical issues and feature requests at the WSL GitHub repo microsoft/wsl, and you can learn more about WSL at the WSL docs. We invite you to bring your next project to WSL containers and help shape what comes next. We will continue investing in the performance, compatibility and integration that make Windows a great place to build with Linux.
Read the whole story
alvinashcraft
29 seconds ago
reply
Pennsylvania, USA
Share this story
Delete

How to get the Windows 11 2026 Update

1 Share
Windows powers how people around the world work, learn, create, and connect every day. Today, we're announcing the availability of the Windows 11 2026 Update, also known as Windows 11, version 26H2. Built on the same servicing foundation as recent Windows 11 releases, version 26H2 delivers the latest Windows innovations with a streamlined update experience designed to minimize disruption and help you stay secure, productive, and up to date. As organizations and individuals continue to expect faster deployments and less downtime, Windows 11, version 26H2 takes advantage of the same modern servicing technologies that have simplified recent feature updates. For many eligible devices, moving to version 26H2 is as simple as installing a small enablement package, allowing people to start using this new release with minimal download size, quick installation, and a single restart.

A predictable and low-disruption update

Windows 11, version 26H2 is delivered as an enablement package for eligible devices running Windows 11, versions 25H2 and 24H2. An enablement package is a lightweight update that activates new features already included in the operating system through previous monthly servicing updates. Because versions 26H2, 25H2, and 24H2 share a common servicing branch and underlying codebase, many of the components required for version 26H2 are already present on devices before the feature update becomes available. This approach enables a significantly faster update experience compared to a traditional operating system upgrade. For eligible devices, installation is similar to a monthly update, requiring only a small download and a quick restart to transition to Windows 11, version 26H2. As with every Windows release, version 26H2 includes the latest quality, reliability, and security improvements designed to help protect people and organizations while delivering a dependable Windows experience.

How to get it

Windows 11, version 26H2 is now available for eligible devices running Windows 11, versions 25H2 and 24H2. To be among the first to receive the update, go to Settings > Windows Update and turn on Get the latest updates as soon as they're available. Once your device is eligible, you'll see the option to download and install Windows 11, version 26H2. As always, we take a measured and data-driven approach to broad availability and will be releasing version 26H2 using a controlled feature rollout. During rollout, we might place safeguard holds on devices where we detect a known compatibility issue that could impact the update experience. We will continue expanding availability over time and provide updates through the Windows release health hub.

Information for commercial and education customers

Windows 11, version 26H2 is available now through the tools organizations use to manage Windows updates, including Windows Autopatch and the Microsoft 365 admin center[i]. Existing management tools, update rings, policies, and deployment practices can continue to be used. We recommend that commercial and education customers begin targeted deployments to validate applications, devices, and business-critical workflows before expanding deployment more broadly throughout their organizations. Windows 11, version 26H2 continues the annual Windows feature update cadence, with a new Windows 11 feature update released during the second half of the calendar year. As with previous annual releases, installing version 26H2 resets the support lifecycle for supported editions of Windows 11. That means 24 months of support for Home and Pro editions and 36 months of support for Enterprise and Education editions. Select features and enhancements initially released as disabled by default in version 25H2 will be enabled by default in version 26H2. You can find more information on these features, plus guidance to help with planning and deployment, in the Windows IT Pro Blog.

Staying protected and productive

We recommend updating eligible devices to Windows 11, version 26H2 to take advantage of the latest Windows innovations, quality improvements, and security enhancements. We'll continue to closely monitor the rollout and share information about known issues, safeguards, and rollout progress through the Windows release health hub and official Windows communications channels. Thank you for your feedback and partnership as we continue to improve Windows for people and organizations around the world. We love to hear about your experience, so please keep your comments and suggestions coming in via Feedback Hub.
[i] Downloads in the Microsoft 365 admin center and similar channels may be delayed. 
Read the whole story
alvinashcraft
36 seconds ago
reply
Pennsylvania, USA
Share this story
Delete

Is it MSIX? Part 1: How to Tell if a Process Is Packaged

1 Share

Overheard in a recent conversation:

Enterprise Administrator: “The ***redacted*** application is awesome, but it really should be an MSIX package.”
Microsoft Developer: “Ummm, it already is.”

That sparked another question: How can you tell if an application is packaged or unpackaged?

Turns out there’s a few simple ways to check.

The key difference between packaged and unpackaged processes is whether they have package identity. Task Manager provides a convenient way to quickly see this:

  1. Run taskmgr.exe
  2. On the left, select Details
  3. Right-click a column heading and select Select columns
  4. Select Package name
  5. Select OK

The list of processes now shows Package name:

  • If the process is unpackaged, this field is blank.
  • If the process is packaged, this field shows the package’s Display Name1

For example:

Task Manager

In this example, AzVpnAppx.exe is a packaged process with the display name Azure VPN Client, whereas audiodg.exe has no Package name, so it’s unpackaged.

We also see AzVpnSysTrayApp.exe is a packaged process with the same display name as AzVpnAppx.exe. Display names are localized strings meant for human consumption, and thus aren’t guaranteed to be unique. They can be whatever the developer chooses to show.


1 If Task Manager can’t resolve the package’s localized display name, the Package name column may instead show an ms-resource: value based on the DisplayName declared in AppxManifest.xml. Windows uses this resource reference to find the appropriate localized string rather than displaying the resource reference to the user.

The post Is it MSIX? Part 1: How to Tell if a Process Is Packaged appeared first on Inside MSIX.

Read the whole story
alvinashcraft
42 seconds ago
reply
Pennsylvania, USA
Share this story
Delete

Introducing Shiny.AppFunctions — One C# Declaration for Siri and Gemini

1 Share

Shiny.AppFunctions is a new package that lets the platform assistants call into your .NET app. You declare a function once, in C#, and it becomes:

  • an App Intent on iOS 16+, available to Siri, Spotlight, the Shortcuts app and Apple Intelligence;
  • an Android AppFunction on Android 16+, available to Gemini and other agents the system allows.

It’s coming in Shiny 5.8.

NuGet package Shiny.AppFunctions

Two assistants, two very different APIs

Apple and Google both want assistants to act inside apps, and both have shipped a way for apps to say what they can do. The two share nothing:

iOS Android
Framework App Intents AppFunctions (Android 16 / API 36)
Language Swift, with compile-time metadata extraction Kotlin, with an XML schema and a bound service
Picking an app object as a parameter AppEntity + EntityQuery not supported — agents send ids
Voice phrases AppShortcutsProvider —
Callers Siri, Spotlight, Shortcuts, Apple Intelligence Gemini and allowlisted agents

For a .NET developer, that’s two native languages, two build pipelines and two ways to describe the same “create an order” operation. They drift apart the moment one of them changes.

With Shiny.AppFunctions, the operation is a C# record and the handler is a C# class. The id, the parameters, their descriptions and the business logic are shared, and each platform gets its own native form generated from them.

Setup

MauiProgram.cs
builder
.UseMauiApp<App>()
.UseShiny();
builder.Services.AddAppFunctions(); // source-generated

That’s all the registration there is. AddAppFunctions() is written by the package’s source generator, and it registers every handler, entity query and delegate in your app.

Declaring a function

A function is a record marked [AppFunction] that implements IAppFunction<TResult>. Its properties are the parameters, and one handler runs it:

using Shiny.AppFunctions;
public enum Priority { Low, Normal, Urgent }
public record OrderResult(string Number, int Quantity, double Total);
[AppFunction("create_order", Description = "Creates an order for a customer")]
[AppShortcut("Create an order in ${applicationName}", ShortTitle = "New Order", SystemImage = "cart.badge.plus")]
public record CreateOrder(
[property: AppParameter(Title = "Customer", Description = "Who the order is for")] Customer Customer,
int Quantity,
Priority Priority,
string? Note
) : IAppFunction<OrderResult>;
public class CreateOrderHandler(OrderStore store) : IAppFunctionHandler<CreateOrder, OrderResult>
{
public Task<OrderResult> Handle(CreateOrder request, AppFunctionContext context, CancellationToken cancellationToken)
{
if (request.Quantity is < 1 or > 1000)
throw new AppFunctionException(AppFunctionErrorCode.InvalidArgument, "Quantity must be between 1 and 1000");
var order = store.Create(request.Customer, request.Quantity, request.Priority, request.Note);
context.Say($"Order {order.Number} is in.");
return Task.FromResult(new OrderResult(order.Number, order.Quantity, order.Total));
}
}

That one declaration is everything both assistants need:

  • The id (create_order) is the same on both platforms. It’s the name a saved Shortcut and an agent refer to.
  • The description is what Siri, Apple Intelligence and Gemini use to decide when to call the function.
  • The parameters come from the record. Constructor parameters are required unless nullable, so Note is optional everywhere. Priority becomes an AppEnum on iOS and an enumerated value in the Android schema.
  • context.Say(...) is what Siri shows or speaks. On Android it comes back with the result, in a response extra.
  • AppFunctionException fails the call with a code that maps to each platform’s own error. The message is shown or spoken to the user, so it’s written for them.

The handler is resolved from a new DI scope for every call, so it takes your services like anything else in the app.

Entities — letting the assistant pick a customer

An entity is an app object that can be a parameter: a customer, a playlist, a project. Mark a record with [AppEntity] and give it a query:

[AppEntity("customer", Title = "Customer")]
public record Customer(string Id, string Name, string City);
public class CustomerQuery(ICustomers customers) : IAppEntityQuery<Customer>
{
public Task<IReadOnlyList<Customer>> GetByIds(IReadOnlyList<string> ids, CancellationToken ct) => customers.ByIds(ids, ct);
public Task<IReadOnlyList<Customer>> Search(string text, CancellationToken ct) => customers.Search(text, ct);
public Task<IReadOnlyList<Customer>> Suggested(CancellationToken ct) => customers.Recent(ct);
}

This is where the two platforms differ most, and where one declaration pays off:

  • On iOS it’s a real App Entity. Siri and Shortcuts show a picker: Suggested before the user types, Search while they type, and GetByIds to load the one they chose.
  • On Android there are no entity queries, so agents send an id. Shiny generates a companion search_customer function from the same query, returning [{ id, title }], so Gemini can find the customer first and then call create_order with its id.

Either way, the id is resolved back to a Customer through your query before the handler runs. An id the query doesn’t know fails the call with NotFound.

Siri phrases with no setup

[AppShortcut] turns a function into an App Shortcut. It’s available to Siri and Spotlight as soon as the app is installed, and the user doesn’t have to set anything up:

[AppFunction("count_open_orders", Title = "Open Orders", Description = "Counts the orders that have not shipped")]
[AppShortcut("How many orders are open in ${applicationName}", SystemImage = "shippingbox")]
[AppShortcut("Open orders in ${applicationName}")]
public record CountOpenOrders : IAppFunction<int>;

Every phrase must include ${applicationName}, and iOS allows up to 10 App Shortcuts per app. Both are checked at compile time. The attribute is ignored on Android, where Gemini works from the function’s description instead.

Gating every call with delegates

An assistant can call your app when the user isn’t signed in, or when a feature is switched off. An IAppFunctionDelegate sees every call before and after the handler:

public class SignInDelegate(IAuth auth) : IAppFunctionDelegate
{
public Task<AppFunctionGate> OnInvoking(AppFunctionContext context, CancellationToken ct)
=> Task.FromResult(context.FunctionId == "cancel_order" && !auth.IsSignedIn
? AppFunctionGate.OpenApp("Sign in to cancel orders.")
: AppFunctionGate.Allow);
}

AppFunctionGate.Deny(message) refuses the call. AppFunctionGate.OpenApp(message) asks the user to continue in the app on iOS, and then runs the call again in the foreground; on Android it refuses with the message. OnInvoked receives the result or the exception, which makes it the place for logging and telemetry. context.Platform tells you whether Siri or Gemini made the call. Delegates are found and registered by the generator.

What you don’t write

The source generator and the build step ship inside the package:

  • Generated C#: AddAppFunctions(), the function descriptors, and reflection-free argument binding, dispatch and result writing. It’s trim- and AOT-safe.
  • iOS: the Swift App Intents, App Entities, entity queries and AppShortcutsProvider, compiled with swiftc into the app. Apple’s App Intents metadata and Siri phrase processors run before signing.
  • Android: the AppFunctions schema, added to the app as assets. The AppFunctionService arrives through the manifest merger.

There’s no Swift, no Kotlin, no Info.plist entry, no entitlement and no AndroidManifest entry to write. The iOS build needs Xcode, since it runs swiftc and Apple’s processors.

The generator also checks your declarations: a missing handler, an unsupported parameter type, a duplicate id or a Siri phrase without ${applicationName} is a build error (SHAF001–SHAF013), not a failure at runtime.

The same functions, in your app

AppFunctionDispatcher runs the same pipeline Siri and Gemini use — new scope, binding, delegates, handler, JSON result — from inside the app:

var outcome = await dispatcher.Execute(
new AppFunctionInvocation("create_order"),
"""{"customer":"acme","quantity":2,"priority":"Normal"}""",
CancellationToken.None
);

Every function in dispatcher.Registry.Functions exposes GetParametersJsonSchema(). That’s enough to hand your app’s functions to an in-app AI chat as tools, or to an MCP server, without declaring them a third time.

Trying it

On an Android 16+ emulator, the shell can list and call your functions, the same way an agent does:

adb shell cmd app_function list-app-functions --package com.mycompany.myapp
adb shell "cmd app_function execute-app-function --package com.mycompany.myapp \
--function create_order --parameters '{\"customer\":\"acme\",\"quantity\":2,\"priority\":\"Normal\"}'"

On iOS, install the app and search for a shortcut’s title in Spotlight (“New Order”), or find the app’s actions in the Shortcuts app.

Things to know

  • Platforms: iOS 16+ and Android 16 (API 36)+. Below Android 16 the package does nothing. There’s no Mac Catalyst, macOS or Windows bridge; net10.0 has the contracts and the dispatcher.
  • Declare functions in the app project. The generator scans only the app, not class libraries. The services, enums and result types they use can live anywhere.
  • Calls can be cold starts with no UI. Persist what a handler changes, and don’t touch pages from it.
  • Parameters are string, int, long, double, bool, DateTimeOffset, enums and entities. Results can also be records and lists.
  • Titles and descriptions are not localized yet.

Get started

Read the whole story
alvinashcraft
48 seconds ago
reply
Pennsylvania, USA
Share this story
Delete

How do you deal with people who strongly disagree with your views?

1 Share
 
1. Begin by genuinely listening to them. Make sure that you understand them. It is often useful to ask for confirmation: restate what you think they are saying and make sure that you understand. Physically, it helps to turn your shoulders so that you face them. Don’t look at your screen while they talk.
 
2. Ask more questions. You can often effortlessly weaken the stance of someone who has not given much thought to an issue just by asking them questions. Don’t ‘challenge them’. Ask genuine questions. The objective is not to break their views with questions, but to establish the playing ground. Many people are unclear about what they think they believe. They may simply be repeated what they heard.
 
3. Focus on what you share in common. Often, the disagreement is smaller than you think. Furthermore, you can sometimes entirely avoid a conflict by establishing strong agreement on many points.
 
4. Unless you are clearly a knowledgeable person, do not immediately express your opinion. Begin by establishing your credibility. Refer to hard facts, data. Refer to people or documents you have consulted. This, in turn, should have been done ahead of time. Never engage in a debate without having done at least a bit of research and reflection.
 
5. Use language that fits the issue. You need to learn the vocabulary. Learn the technical terms and use them, although you may want to remain accessible, so explain them as well.
 
6. Tell stories. People understand by emotions as much as by their reason. Ideally, the story should be true and it should be backed by hard evidence.
 
7. Avoid personal attacks and do not tolerate them against you and others. If someone is insulting you, if it is fair to say so. You may say that you feel offended. It is the one case where you can and maybe should go on the offensive. Don’t answer by an insult, but attack the fact that they insulted you. You may ask for an apology.
Read the whole story
alvinashcraft
59 seconds ago
reply
Pennsylvania, USA
Share this story
Delete

Multiplayer Game Development with TypeScript, Phaser, Socket.io, and MongoDB

1 Share

Game data rarely looks the same for very long. A player document might start out with just a username and a score, and a few sprints later, it needs an inventory, a set of unlocked achievements, and a friends list, each shaped differently from the last. MongoDB's document model is a natural fit for that kind of growth, since a new field is just a new field, with no migration to write and no join to add. A match record can embed both players directly, scores and all, so reading back a finished match is a single document lookup rather than a query spread across multiple tables. Atomic operators like $inc and $max also mean stats and high scores can be updated safely by many concurrent players at once, without the application code having to coordinate a read-then-write itself.

In this tutorial, we're going to build a simple multiplayer game. Each player controls a white square on a canvas, and for thirty seconds, yellow coin squares spawn at random positions. Whoever collects the most coins when the timer runs out wins. Movement, coin spawning, and scoring all happen over WebSockets through Socket.io, with the server acting as the single source of truth for everything that happens during a match. MongoDB sits underneath that, storing player accounts, match records, and the leaderboard.

We'll use TypeScript, Zod, Socket.io, and Express on the backend, and Phaser, TypeScript, and Socket.io on the frontend. The MongoDB Node.js driver is used directly, without an ODM like Mongoose, so every query in this tutorial is plain driver code. If you'd rather skip ahead or just want to run the finished project, the full source is available on GitHub.

The post Multiplayer Game Development with TypeScript, Phaser, Socket.io, and MongoDB appeared first on DEV.



Read the whole story
alvinashcraft
1 minute ago
reply
Pennsylvania, USA
Share this story
Delete
Next Page of Stories