Goodbye Windows: Why I Switched to Kubuntu for Development
After years on Windows, I finally switched my daily driver to Kubuntu. Docker is first-class, the terminal doesn't fight me, and everything I SSH into feels like home now. Here are the practical migration notes.
It's 9 PM and I'm writing this from a machine that no longer has the Windows logo on the boot screen. The switch finally happened. I've been threatening it for months, and tonight I pulled the trigger and didn't look back.
This is the story of why, and the practical details for anyone considering the same move.
The Breaking Point
For a long time, Windows was fine. WSL2 made Linux tooling available. VS Code Remote-SSH meant I was editing on the server anyway. Docker Desktop worked, mostly.
But "mostly" and "fine" accumulate friction. The server build, the local model experiments, and the steady move toward Linux-first infrastructure meant I was spending more time thinking in Ubuntu and then translating those habits back through Windows. Every SSH config tweak, every shell script, every Docker volume mount passed through a compatibility layer that worked but never felt native.
The breaking moment: I was debugging a local model setup and realized I was maintaining three mental models — the Windows way, the WSL way, and the actual Linux way. Three is two too many.
Why Kubuntu Specifically
I didn't want a religious experience. I wanted a desktop that worked, a package manager that wasn't hostile, and a DE that didn't require relearning window management. Kubuntu checked the boxes:
- Ubuntu base — same repos, same answers, same muscle memory as every server I run.
- KDE Plasma — a desktop that respects that I might want a taskbar and windows that behave like windows.
- Stable LTS — 24.04 is boring in the best way.
The installer asked sane questions and was done. No driver hunt, no surprise reboots. I spent more time picking a wallpaper than installing.
What Got Better Immediately
Docker is first-class. No Docker Desktop wrapper, no WSL2 VM layer, no "Docker is starting..." spinner that lies to you. It's just Docker. systemctl enable docker and it's there, every boot, no ceremony. Container startup times dropped noticeably because there's no VM boundary to cross.
The terminal is the terminal. No more choosing between PowerShell's quirks and WSL's translation layer. Bash is the default. Zsh if I want it. Every command I run on the servers runs identically on my desktop. Scripts are portable. Aliases work. My .bashrc is the same file, everywhere.
SSH is native. The SSH agent, the config, the keys — they live where they're supposed to. No forwarding gymnastics to make Git auth work through Remote-SSH. ssh-add and done.
Everything feels closer to the infrastructure. This is the big one and it's hard to explain if you haven't felt it. My desktop and my servers now share the same basic operating-system language. The tools, the file paths, the conventions — they're finally aligned. When I SSH into Linux boxes or work on the Proxmox plan, I'm not mentally translating every command first.
What I Miss
I'm not going to pretend it's all upside. A few things:
- Outlook. Thunderbird is fine for mail, but the calendar muscle memory is real and the alternatives don't quite match it.
- Some proprietary tools. A few Windows-only things still require rebooting or keeping a Windows environment around. Slightly clunky, fully functional.
- Games. Proton handles most of it. I didn't have time for the rest anyway.
Notice what's not on the list: dev tools, editors, runtimes, cloud CLIs, Docker, Kubernetes tooling. All as good or better on Linux.
The Migration, Practically
A few things made the switch clean:
Keep /home on a separate partition. This means future OS reinstalls don't touch my files or configs. Standard Linux advice, worth repeating.
Dotfiles in Git. My .bashrc, .gitconfig, .ssh/config, editor configs — all in a private repo. New machine, git clone, symlink, done. I've been doing this for the servers for a while; now the desktop benefits too.
AppImage and Flatpak for desktop apps. These sidestep the package manager versioning questions for things like Slack, Discord, browsers. System packages for system tools; containerized formats for user apps. Clean separation.
NVIDIA drivers from the official repo, not Ubuntu's. Same lesson as on the inference server — the distro drivers lag, and for GPU work that matters.
The Domain Controller, Revisited
One nice surprise: the Linux desktop fit naturally into the mixed-OS plan. Same SSH habits, same filesystem expectations, same network-share work ahead of me. The more I moved toward standard Linux tooling, the less special-case glue I needed.
Was It Worth It
Yes. The accumulated friction of developing for Linux on Windows is gone. My mental model collapsed from three layers to one. Docker is faster. SSH is simpler. The terminal is the terminal. If you're building Linux infrastructure and developing on Windows, ask yourself why — WSL2 is a bridge, and bridges are for crossing, not living on.
It's late and the machine is quiet and everything works. That's the review.