Recently, I've talked about a couple of solutions that let you run Windows apps on Linux, including WinApps and WinBoat for virtualization, and Wine for real-time translation. Solutions like WinBoat and WinApps are kind of like the Windows Subsystem for Linux, so you may think there's no reason to make something like WinBoat for Windows. But you'd be wrong.

Enter X410, short for "XSERVER4W1ND0WS" (yes, it's odd), a tool designed to run your Linux apps on the Windows desktop just as if they were part of Windows itself. And if that sounds familiar, you're not wrong, but trust me, this is very different from running these Linux apps normally in WSL. Let me explain.

How it works

It's not just for virtualization

X410 is quite a bit different from other solutions, including the built-in method for opening Linux GUI apps through WSL. This is an app that runs natively on Windows and is built from the ground up, so it doesn't rely on existing implementations like Cygwin or MinGW. It also doesn't use the Remote Desktop Protocol to connect to the Linux apps like WSL does.

Instead, the display output of the Linux machine is pointed directly to X410 through a TCP/IP connection, or through an SSH client. What that means is that the use cases for X410 don't have to be limited to virtualization, either. You can use X410 to draw apps from a Hyper-V virtual machine, a WSL instance, or even a remote Linux desktop through SSH.

That already gives you a bit more freedom than just using WSL considering you can get the same seamless integration of Windows without using the same exact setup. Even if you use it with WSL, there are some big advantages.

It's so smooth and responsive

WSL who?

I mostly tested X410 with my WSL instance, primarily because I already had that set up on my machine. I was a little intrigued by this option, seeing as WSL already runs Linux GUI mostly fine. To my surprise, though, X410 actually provides a much nicer experience.

Much like WSL, X410 has the ability to display apps in their individual windows on the desktop, though it can also create a virtual floating desktop of sorts that contains all your Linux windows. I stuck with the typical separate windows as it's easier to set up and feels more natural to use.

The big difference, though, is the performance and how native the apps feel. X410 draws apps using regular Windows frames, and it also makes for a far better experience manipulating said windows. You can easily resize windows just as if they were native Windows apps, and they're even responsive, so the UI adapts to the new size even as you're still adjusting the size of the window. Comparatively, resizing Windows through the typical WSL method is much more cumbersome. It's harder to select the edges of the window (and especially the corners), and even then, sometimes resizing simply doesn't work. I did find some apps, like Apostrophe and Foliate, still render their Linux-style frames, but resizing is still more reliable.

And that's not all. X410 can also provide better scaling for your Linux apps. When you run Linux apps through WSL, there's a good chance they won't follow the scaling settings you have in Windows, and UI elements can appear far too large or small. X410 has multiple scaling settings to help Linux apps respond better to your screen resolution and scaling settings, so you can have the best experience more easily. Of course, you can also set scaling within Linux itself if you prefer it, but the experience is just easier this way.

Setup can be a pain

I wish it was slightly easier

The main downside of X410 for me was how frustrating it was to properly set up. It's not that it's horrible and it didn't take that long to figure out, but it was still a little annoying, at least with the Windows Subsystem for Linux. I can imagine it may be easier in a proper Hyper-V VM, but I admittedly didn't test that method.

In order to use X410 with WSL, I needed to add a DISPLAY environment variable to the Linux instance, which pointed it to X410 as a display output. Because this uses a TCP/IP connection, I had to set up a function that grabs the IP address of the Windows host to connect to, but this didn't always work reliably. After restarting my computer, the DISPLAY variable would default back to 0.0, so apps would fall back on the typical WSL render.

This also happened if I opened a new instance of the WSL terminal, which is required if you want to use multiple GUI apps at the same time. To open apps using X410, they need to be launched from the terminal, not the Start menu, otherwise, they're launched with the normal WSL window. But if you launch a GUI app in the terminal, you can't enter a new command without closing the app, which means you need a new instance each time, and for each one, I had to define the DISPLAY variable again.

X410 does offer other ways to connect that could make it easier, though, For example, if you set the WSL instance use mirrored mode for networking, you can set the DISPLAY environment variable to use the localhost IP (127.0.0.1), which may produce more consistent results. Alternatively, there's experimental support for using VSOCK to connect to WSL instead of the TCP/IP connection. This can be easier, but Microsoft hasn't provided documentation on how to use VSOCK with WSL, so there may be some other issues there.

But even with my less-than-ideal experience, it's easy to see the appeal of X410. I would still rather deal with this and have a smoother GUI than deal with the official WSL implementation.

X410 is better than I thought

Going into this, I was skeptical about the need for X410 when WSL already works fine, but actually using it made it pretty apparent that you can make Linux apps work much better on Windows. The native frame, better scaling support, and far more reliable resizing make this an easy choice if you want your Linux apps on Windows. Frankly, I only wish there was a solution this good for running Windows apps on Linux instead.