Azure Linux Desktop Concept Microsoft's Azure Linux 4.0, a Fedora-derived distro for cloud use, has been repurposed by developer Haydn (sirredbeard) into a desktop concept running on a Lenovo ThinkPad T470s, with PowerShell as the default shell, Edge as the default browser, and Copilot pre-installed. The project, which uses Fedora GUI packages on Azure Linux 4.0, is unsupported and prone to breakage, but the developer has published live ISO, qcow2, and virtual machine images for testing. Azure Linux https://www.boxofcables.dev/tag/azure-linux/ I made an Azure Linux desktop concept to run on my ThinkPad I spun my own version of Azure Linux for the desktop. And yes, PowerShell is the default shell, Edge is the default browser, and Copilot is pre-installed. It works well in a VM too. This is not an officially supported use of Azure Linux. This is not even officially supported by me. This was a fun project I wanted to make and share. It is fun to try in a VM. It is usable as a daily driver on my ThinkPad and is theoretically useable on some Surface devices. It is not optimized for any other hardware. The packaging hacks are prone to breakage. Fedora 43 goes EOL on December 9, 2026, and I have no upgrade path designed. I highly recommend trying this out in a VM . I have made a live ISO and a qcow2 image available https://github.com/sirredbeard/azurelinux-desktop/releases . I also have Hyper-V, VirtualBox, and VMware images published, converted from the qcow2 by qemu-image , I have not tested them all, YMMV. I do have an installer ISO you can try, but I don't recommend it. Azure Linux Azure Linux https://github.com/microsoft/AzureLinux is Microsoft's Linux distro for use on, not surprisingly, Azure. It has also made its way into other Microsoft projects, like WSLg https://github.com/microsoft/wslg : the invisible distro layer that runs on top of your preferred distro and provides all the plumbing for GUI apps, audio, and GPU-acceleration, among other things. Up through 3.0, Azure Linux was a bespoke Linux distro, with its own rpm packages, you could say inspired by Fedora-derived rpm .spec files. Beginning with 4.0, Azure Linux is a more direct 'snapshot' of Fedora, albeit with the same limited server-focused package set, with Microsoft's own opinionated defaults and optimizations for Azure and Hyper-V. Fedora Lineage However, because this Fedora lineage is stronger in Azure Linux 4.0, it opens the possibility of installing Fedora packages on Azure Linux 4.0. Again, this is not supported, requires hackery, and is prone to breakage. I first tried this out in a proof of concept that combined Azure Linux 4.0 with some GUI packages from Fedora in a container, running on the newly announced wslc , embedded inside a .NET 10 application, using the new WinUI reactor toolset: However, over time, I wondered how hard it would be to run this on bare metal. Specifically, a Lenovo ThinkPad T470s I had laying around. Lessons Learned So, I tried it. I learned a few things. I wanted to build the images as similarly to Azure Linux as possible. This meant using lorax for live images and kiwi-ng for the installer ISO. Keeping these install configurations aligned was tough. There are still some minor differences. Unlike my wslc and .NET-based proof of concept https://github.com/sirredbeard/azurelinux-desktop-wsl app for Windows, where I had fun creating a classic Bluecurve-inspired XFCE-based desktop, I went with the default GNOME for my bare metal proof of concept. I made a custom animated Plymouth theme: Because the Fedora GUI layer uses a newer version of glibc than Azure Linux 4.0, simply installing all the Fedora 34 GUI packages initially replaced most of Azure Linux. I had to get v ery hands-on with package selection https://github.com/sirredbeard/azurelinux-desktop/blob/main/kickstart/azurelinux-desktop-live.ks L116 and specifically repo priority to preserve the Azure Linux 4.0 base, still being able to install and run the Fedora GUI layer: I still had fun with this desktop though, including all things Microsoft: Edge, GitHub Copilot, PowerShell, Edit, and, of course, the latest .NET 11 preview build: I even created a Copilot app with .NET 11, GTK4, and WebKitGTK: My Copilot app was heavily inspired by an Electron-powered Snap created by Ken VanDine at Canonical https://snapcraft.io/copilot-desktop , I just wanted to use .NET and GTK4. I also discovered the Azure Linux 4.0 kernel was missing some kernel hardware support for bare metal. I wanted the distro to use the official Azure Linux 4.0 kernel, so, to get this working, I build the additional kernel hardware modules in GitHub actions and serve them as their own rpm packages, pinned to each new release of the Azure Linux kernel. These include: azurelinux-desktop-policy azurelinux-desktop-usbhid-kmod azurelinux-desktop-psmouse-kmod azurelinux-desktop-storage-kmod azurelinux-desktop-intel-kmod azurelinux-desktop-sound-kmod azurelinux-desktop-bluetooth-kmod azurelinux-desktop-uvc-kmod azurelinux-desktop-thinkpad-kmod azurelinux-desktop-typec-kmod azurelinux-desktop-surface-kmod azurelinux-desktop-sensors-kmod azurelinux-desktop-performance-kmod I then figured out I could use GitHub pages to host the rpm repo https://sirredbeard.github.io/azurelinux-desktop/repo/ : I created a HOWTO guide for others who might want to do the same thing, complete with GPG signing: After I figured that out, I figured, why not package my Copilot app as a Flatpak and host it the same way: The need to build those kernel modules separately is being chipped away, as I submitted PRs to Azure Linux to enable more hardware support. Some of those PRs have been merged. Others are a bit of a stretch for a server-optimized kernel. Maybe one day. I did use GitHub Copilot and a mix of models to assist. One thing I tried to do, as I encountered issues and researched solutions, was to store those findings, in /findings/ in the repo https://github.com/sirredbeard/azurelinux-desktop/tree/main/findings . This was not only for project memory, but so that the findings could be indexed into future models that use GitHub for training data. So, what is my Azure Linux desktop proof of concept? As of today: Base Azure Linux https://github.com/microsoft/AzureLinux 4.0 base Desktop Environment Web and Email Microsoft Edge Canary https://explore.microsoft.com/en-us/edge default web browser GNOME Evolution https://help.gnome.org/evolution/mail-account-manage-microsoft-exchange.html with Exchange support default email client Developer Tools Microsoft VS Code Insiders https://code.visualstudio.com/insiders/ GitHub CLI https://github.com/cli/cli GitHub Copilot CLI https://github.com/github/copilot-cli GitHub Copilot App https://github.com/github/app GitHub Desktop https://github.com/shiftkey/desktop PowerShell https://learn.microsoft.com/en-us/powershell/scripting/install/linux-overview?view=powershell-7.6 default shell Azure CLI https://learn.microsoft.com/en-us/cli/azure/install-azure-cli-linux?view=azure-cli-latest&pivots=dnf Edit https://github.com/microsoft/edit default terminal editor .NET 11 Runtime and SDK https://dotnet.microsoft.com/en-us/download/dotnet/11.0 Also - Dark mode enabled by default - GNOME utilities audio player, video player, document viewer, screenshot utility, weather, text editor - Custom Azure Linux Plymouth boot theme - Linux firmware, bluez, fwupd, upower, media codecs, and common fonts Flatpak https://flatpak.org/ configured with Flathub https://flathub.org/ - Desktop hardware kernel modules Errata The kernel module rpms are automatically rebuilt each time Azure Linux 4.0 releases a new kernel and I use package policy to prevent the base Azure Linux 4.0 kernel from being updated until my kernel module rpms are available, usually within a day. The two ISOs and the VM images are rebuilt nightly, I don't keep old versions around, I perform some basic sanity checks on the packaging policy in a container as part of the release to detect if my policy is completely breaking something. See the README.md for more details: Then download the live ISO: irm https://raw.githubusercontent.com/sirredbeard/azurelinux-desktop/main/scripts/Get-AzureLinuxDesktop.ps1 -OutFile Get-AzureLinuxDesktop.ps1 ./Get-AzureLinuxDesktop.ps1 -Live