The Linux journey of a Windows refugee

posted 13 min read

A few weeks back, I decided to ditch Windows and migrate my Microsoft Surface Pro 7 tablet to Linux. It was not an experiment - I don't intend to ever install Windows 11 on that brilliant machine. I left myself no backup - I completely wiped off my Windows 10 install. Was I insane? Let's find out.


I need to get a few disclaimers out now, so we can all enjoy this article:

  • I am going to use term "Linux" to describe the graphical interface. This is a bit misleading because Linux is the underlying kernel and terminal interface, while the GUI is a bit more complicated. I am going to explain this more in the article, but just know I am going to say Linux a lot and I am going to mean Gnome or KDE or Cinnamon, or whatever.
  • I am not interested in your recommendations of distros.
  • I am a Windows power user and I am definitely going to apply "it works on Windows" glasses.

Picking the distro

I didn’t go into this blind. I have prior experience with Linux, both server and desktop. Namely, I worked with CentOS 7 and Ubuntu in my previous job. I also have SteamOS on my Steam Deck.

I use my Surface Pro 7 mainly for drawing in Gimp, writing stuff in Obsidian, and coding in C++. It is not a device meant for gaming. I wanted to go with Ubuntu-based distro, simply because my familiarity with it.

I chose Zorin OS, mainly due to its marketing push as “the distro for Windows 11 refugees”. Also because it looked somewhat pretty on screenshots. Note that I am very picky when it comes to aesthetics, Windows 8 was peak for me — bright bold colors, square corners, flat look. Most of of the Linux distros are downright ugly to me.

I also did my due diligence, so I knew there is this surface-linux project, which is a kernel patch aiming at supporting maximum features of Surface devices.

First steps

Installing a Ubuntu-based distro from USB is a braindead effort these days. For Windows runaways, you need to boot into UEFI, disable secure boot (you don't have to, but your life will be easier), and just change the boot order to the USB stick.

Patching the kernel was also super easy, the instructions of surface-linux projectt are very well written and it is mostly just apt install anyway. Even without the custom kernel, the computer booted fine and the attachment "Type Cover" keyboard with touchpad worked just fine. Great start!

The software I used on Windows was already pretty FOSS - LibreOffice suite, Gimp, Audacity, Obsidian, VLC, VS Code, Tiled editor, all of these can be installed right away from the software marketplace on Zorin OS. Just be aware that the marketplace defaults to Flatpak/Snap, which means the software runs sandboxed. There are programs, notably VS Code and Tiled editor, that most users need unsandboxed, so they can invoke other programs from them (such as compiler). For those, don't forget to switch the package source to APT, or ask your local chatbot for how to unsandbox the Flatpak/Snap installation.

Fun fact: Gimp installed from APT was unable to start. Gimp installed from Snap ran fine. I tried APT because my custom plug-ins were not registering - I had to chmod +x them. I kinda expected Gimp to run them explicitly in Python interpreter, but it seems not to be the case.

Fun fact 2: Browsers run sandboxed too. If you open a local .html file from disc, it opens fine under file:/// protocol, but any associated CSS or JavaScript files won't. Not particularly practical.

In the end, I only struggled with three programs. First was GitHub Desktop, which luckily has unofficial Linux port. Second was Microsoft To-Do, hands down the best task management app out there. The closest free equivalent is Super Productivity, but that app is more interested in implementing project management features than basic QoL like multiselect, so I kinda bounced off it. Finally I found Kuro, a WebView wrapper around Microsoft To-Do web app. It is laggy as hell, but suffices.

Third program was OneDrive. While Nautilus has a built-in OneDrive client, it is only good for browsing, downloading a backing up files. If you try to open a Gimp project file or load an Obsidian vault, something times out and these programs will never load. The better option is onedriver, which also acts like a native filesystem, but it is much faster. It is also 90% less stable, so I had to log in at least once a day and half of the time Obsidian loaded, but failed to save any edits.

The Gnome Shell experience

On first glance, Gnome Shell is pretty. It is a bit of a case of "millenial grey", but other than that, it looks like slick and modern.

Unfortunately, the UX is atrocious. For a while, I am not going to yap about the lack of customization - that is baked in Gnome philosophy. However, the Nautilus file manager drove me mad:

  • It doesn't have a Desktop shortcut next to Home, Documents, and Downloads. You can add it to favorites, but that is down on the bottom of the side panel.
  • Programs like VS Code and VLC don't have their context menu shortcuts like they have in Windows. Instead, you need to click Open with > Choose program > scroll down a list and pick it. You can write a Python script that will add a record to the context menu, but that is not something a common user would be able to do.
  • Desktop seems to be governed by a different process than Nautilus, because the context menu is different on the Desktop. WTF.
    Later on, I installed Thunar file manager which is miles better than Nautilus, but it only integrates for file browsing. Desktop is still governed by a different process, same as the file picker dialog when saving stuff.

I also lacked the ability to group icons on the right side of the sidebar into collapsible menu. I don't understand why certain Zorin desktop open Start Menu with the Super key, while the "Windows 11-esque" one opens the menu with Super+A, while Super is for swapping workspaces. These shortcuts couldn't be edited.

The whole stuff works, and it even looks decent, but the experience as a whole is inconsistent.

A little detour into KDE

I complained about Nautilus to my friend who told me to switch to KDE, because Dolphin is much better. They kinda failed to told me that I can just install an alternative file manager and remain on Gnome.

Switching to KDE was easy, but since it was very ugly and DPI scaling was completely broken, I nuked it and went back to Gnome. Except... if you nuke KDE, it has the tendency of removing APT packages that are also used by Gnome! I don't understand how this can happen, but it did and I lost my desktop environment altogether. In the end I managed to bring Gnome back, and installed Thunar. Just a little FYI - if you're not ready to reinstall your whole system, don't switch between desktop environments.

What is a desktop environment?

This section might be valuable for people who are considering switching to Linux. Desktop environment is many things. Under the hood, it deals with how the stuff is rendered. Then it is about what you see - the icons, the visual identity of system apps and the systray. It also bundles the recommended software - SteamOS runs KDE and has Discover as its software marketplace. ZorinOS runs Gnome and has "Software". Linux Mint runs Cinnamon and has "Software Manager". These programs have the same purpose, but completely different UX. Same goes for settings and other system apps.

The desktop environment also comes with a "philosophy". This philosophy usually revolves around how many things you can configure in GUI. With KDE, you have toggles for everything. Gnome prevents you from configuring even the most basic things. Even then, you can always hand-edit config files. Good luck.

Theme hell

Using Gnome for some time exposed how much is the Linux desktop environment inconsistent. This is not only about the context menu on desktop. When you try to theme your desktop environment, because "linux is so darn customizable", you'll find out that the "desktop environment" (aka the systray and maybe bunch of system apps) are controlled by one theme (in this case gnome-shell), while most of the other apps are controlled by a different theme (usually GTK 2, 3, or 4). And even if you find a theme online that supports both your desktop environment AND your legacy applications, there will be applications that are not affected by either of these - like System Monitor or the fucking Nautilus, which doesn't feature a traditional window title bar.

Note that I dived into this rabbit hole solely because I hated the "millenial gray" vibes of the default Gnome themes. I also hated the round corners (which you can configure for systray but not for windows). Ultimately, I used Claude Code to make most corners square and window titlebars colored. The best use for Claude ever.

Cracks start to appear

My first major problem was the keyboard layout. Even though I am a programmer, I taught myself to program on a Czech keyboard. We have a lot of weird accent symbols that you need in common writing and I was never a fan of switching between keyboard layouts. So I learned the Czech one and I really struggle whenever I have to write anything on the English one.

Quite recently, my Type Cover keyboard stopped working, so I needed a replacement. But it is so old that Microsoft no longers manufactures it, and the only one I could find has French labels. I don't really mind because I can type on it blindfolded, but only with the Windows Czech QWERTZ layout. And I am not learning anything new since my other laptop and work computer both run Windows 11.

Now Linux has something that is called Czech Windows QWERTZ layout, except it is no different from the base Czech QWERTZ layout and nowhere near the layout used by Windows. It would be nice if the system settings allowed me to rebind keys but no luck there. I had to create a custom XKB layout and register it (with the help of a chatbot). Again, not something a common user could do:

// File: /usr/share/X11/xkb/symbols/cz_custom
// Czech QWERTZ with custom AltGr mappings
// AltGr+-  => *
// AltGr+ý  => `
// AltGr+š  => ^
// AltGr+ů  => $

default partial alphanumeric_keys
xkb_symbols "qwertz_custom" {
    include "cz(basic)"
    name[Group1]= "Czech (QWERTZ, custom AltGr)";

    key <TLDE> { [ semicolon, asciitilde, dead_abovering, asciitilde ]};
    key <AB10> { [ minus,   underscore, asterisk,    asterisk    ] };
    key <AE07> { [ yacute,  7,          grave,       grave       ] };
    key <AE03> { [ scaron,  3,          asciicircum, asciicircum ] };
    key <AC10> { [ uring,   quotedbl,   dollar,      dollar      ] };
};

/usr/share/X11/xkb/rules/evdev.xml:

...
<layout>
    <configItem>
<name>cz_custom</name>
<description>Czech True Windows QWERTZ</description>
<countryList>
  <iso3166Id>CZ</iso3166Id>
</countryList>
<languageList>
  <iso639Id>ces</iso639Id>
</languageList>
</configItem>
<variantList>        
<variant>
  <configItem>
<name>qwertz_custom</name>
<description>Custom Czech Windows</description>
  </configItem>
</variant>
</variantList>
</layout>
...

But worse things happen. For example when sometimes when I closed the lid and reopened it later, the computer was not registering keyboard or mouse. Or any part of USB HID stack for that matter. I could plug the tablet into a USB-C hub and while the monitor worked, USB keyboard did not. Chatbot helped me to create a custom service that resets the HID stack after a wake up. Somehow the issue eventually vanished.

Instead, the computer developed another reason for me to hard reset it daily. When I opened YouTube in browser, started Code, GitHub Desktop, and triggered a C++ compiler, the computer often froze. I suspect it ran out of RAM, and the default 2GBs of swap were usually all eaten up. When I worked in Gimp on a bigger canvas, it was also incredibly laggy.

Here's the thing - on Windows 10, I had none of these issues. Once a month, I had to hard-reset the computer, because it went into a weird boot loop after a wakeup. But it never struggled in Gimp and it never froze while programming with a YouTube on background. A common user using the device as a drawing tablet would be unable to troubleshoot memory issues. It would be nice if the system issued some pop-up saying "Hey, we noticed that you are running out of RAM often, do you want to increase swap so your computer is snappier?".

The last nail to the coffin was configuring the behavior when lid is closed. When my computer is plugged in, I always let it running with the lid closed. You cannot configure this under Gnome, once again you need to touch config files. However, a weird thing happened to me. When I plugged the PC into a USB-C hud with external monitor (with lid closed) and left the PC for a while, it somehow suspended itself (even though it was also plugged in), and it was impossible to wake it up again without hard reset.

This was about the time I got fed up. Hard resetting a computer daily is not normal. Shit all you want on Windows, it is thousand times stabler system than this is.

Linux Mint

But there is no going back. Two days back, I dumped Zorin and replaced it with Linux Mint with Cinnamon desktop. It is still based off Ubuntu, but it is more customizable. It is also very ugly, as Cinnamon is closer to KDE than Gnome. Fortunately, I managed to find a Windows 8.1 theme which works well and in combination with Cinnamenu applet creates a relatively pleasant desktop experience.

So far it looks more visually consistent, the only program still resilient to theming is the System Monitor. Desktop has the same context menu as any other folder. I can configure the lid behavior in GUI. OneDriver is still unstable - I had to reboot Obsidian twice while writing this article.

Software manager

One thing I have to mention is the Software manager, which comes preinstalled with way fewer repos than Zorin did. For example, it couldn't find VS Code out of the box.

It is incredibly funny to me that the Linux crowd always mocked Windows users for having to download installers manually from the web, then Windows adopted the software manager from Linux, and now I have to download Linux installers manually from the web, because I can't find them in the local Software manager. The irony...

But yeah. While Mint is much uglier than Zorin, it doesn't seem to freeze while docked, it has a dedicated systray button for opening on-screen keyboard, has lower HW requirements, and hopefully I'll manage to configure touch inputs so I can actually control the system using them.

C++ programmer perspective

This could be a topic for a separate article, but C++ programming on Linux is hell. First of all, using system package manager like APT for package management of C++ dependencies is a decision that made sense 30 years ago, but not today. How many applications, especially games, share the same libraries and library versions these days? With just rendering, you might use Raylib, SDL2, SDL3, SFML2, or SFML3 - there is no point installing them system-wide if each is going to be used in a single app on the whole system.

On Windows, many libraries lying on GitHub bring their dependencies automagically through CMake (which also makes them sandboxed). On Linux, the same library might require you to use a CMake switch to enable this, or it will require you to figure what to manually install through APT.

Also, C++ has versions that are enabled through compile switch, like --std=c++23 . This is sort of a feature flag for activating new features. However, you need to use extra flags on Linux to link those features. If you ever did something with C/C++, you might remember having to specify -lm to bring in the math library. Similar stuff applies to let’s say stack traces.

This exists so people shipping on embedded don’t have to pay for features they don’t use. I think these flags should be ON by default, allowing the user to opt out. Not the other way around. This bullshit doesn’t exist on Windows ports of the same compilers (and thanks to PlatformIO, you can do embedded equally well on Windows).

Lastly, using the latest C++ features on Ubuntu LTS 22/24 requires you to either force-update GCC (the default compiler), or bring in newer Clang. The trouble is that Clang, while shipping its own implementation of the standard library, uses by default the GCC standard library, which doesn't have some C++23 features! There is -stdlib=libc++ flag to fix this.

However, I had to learn all of these the hard way. For C++ developer, Windows is the easy mode — install MSVC, clone repo, configure CMake, compile. For Linux developer — clone repo, figure what you need to install in APT (possibly deal with conflicts or older versions of APT packages), install correct version of the compiler, figure out why it still doesn’t work, figure what extra flags to use to enable newest features… This really sucks.

Conclusion

The Linux experience definitely got better over the years and it definitely could suffice a common user with some normal hardware out of the box.

But there is still so much the user needs to know to effectively configure the computer. And if you choose some more "user-friendly" and prettier distro, you will paradoxically have to delve more into config files, which is the opposite of user-friendly.

For me, the experience was harsh - inferior UX, general instability, and UI inconsistency. I hope that Mint alleviates the freezes for me. After that, the final frontier is OneDrive. Yes, it would be better to switch to GDrive, that would negatively impact my workflows elsewhere. Vendor-lock is a bitch.

If you are considering a switch: Do your due diligence. I don't think you need to install dozens of distros to figure out what you need. Watch some videos on YouTube - Linus Tech Tips currently runs a series where they try out various distros for a month and point out their wins and loses. Look up what an immutable distro is and whether it could make sense for you. Try to think about the settings that you are using on Windows (like action for closing the lid) and ask ChatGPT if that option is configurable under Gnome/Cinnamon/XFCE/KDE.

Oh and if you are a gamer and decide to go for Cachy OS, because it is optimized for games, know two things:

  • It really is optimized. I deployed it on a old friend's device and PS2 emulation worked fine. Then they nuked the system, installed Mint instead and PS2 runs like shit.
  • It is based of Arch, which is very DYI. The default system, especially the software center, is ugly, barebones and a polar opposite of user-friendly.

More Posts

The Audit Trail of Things: Using Hashgraph as a Digital Caliper for Provenance

Ken W. Algerverified - Apr 28

TypeScript Complexity Has Finally Reached the Point of Total Absurdity

Karol Modelskiverified - Apr 23

Linux vs Windows Which Operating System is Best?

Dewan Codes - Jan 15, 2025

Why Does the System Clock Break on Windows + Linux Dual Boot?

Igor Giamoniano - Coisa de Dev - Dec 29, 2025

The End of Data Export: Why the Cloud is a Compliance Trap

Pocket Portfolio - Apr 6
chevron_left

Related Jobs

View all jobs →

Commenters (This Week)

9 comments
1 comment
1 comment

Contribute meaningful comments to climb the leaderboard and earn badges!