Qubes, Fedora Silverblue, secureblue, Kicksecure, and NixOS all get recommended for securing a developer workstation, and they are all good projects, which is exactly why the comparison is worth writing down.
They are not five answers to the same question. They are answers to three different questions: how do I make the base system hard to modify, how do I make the kernel and userspace full of hardening parameters, and how do I keep hostile code from ever touching my data in the first place.
Most comparisons merge these into a checklist. The checklist is the least useful part, because a developer workstation is the single most hostile environment Linux gets deployed onto: it executes untrusted code from npm registries, git repos, build scripts, and increasingly AI coding agents, all day, every day, as the same user who stores production credentials.
That last fact is the hinge of this article. The strongest hardening config in the world cannot help you if your editor (IDE, with extensions, …), your terminal, and your npm install all run in the same trust domain as your SSH keys and cloud credentials. Security on a developer box is therefore not primarily a parameter-tuning problem. It is an architecture problem: how many trust domains do you have, and what separates them?
This is a natural companion to our look at AI coding agent egress firewalls and sandboxing AI coding agents in Docker, which deal with isolating untrusted agent code from the network and from the host.
Here, the question is the other end of the stack: which operating system model should carry that isolation, and what the honest limits of "hardened Linux" are no matter which distro you pick.
The short version
- Qubes OS is the only one of the five with a compartmentalized architecture. It runs each workload in its own VM under Xen, each with its own kernel instance. That is not an implementation detail: a kernel exploit, an installed rootkit, or a stolen browser session in one qube is structurally contained, because the others run separate kernel instances with their own userspace and their own data. One nuance worth getting right: by default, app qubes boot a kernel supplied by dom0, so qubes usually run the *same kernel version*, and a kernel bug that works in one qube will generally work in the others; the containment comes from each qube being a separate VM, so an attacker still has to get code running inside each target qube individually. Data compartmentalization is the direct consequence: your work API tokens never live in the qube where you load a random repo, and there is no shared filesystem to walk across by default.
- Silverblue, secureblue, and Kicksecure are all single-kernel hardening stories. Silverblue gives you the immutable, atomic base; secureblue layers serious hardening on top of that model (hardened_malloc, kernel lockdown, USBGuard, sudo/su/pkexec replaced by run0); Kicksecure does similar work on Debian. All of them still run everything in one trust domain on one kernel. They raise the cost of kernel exploitation, without eliminating it, and they raise the cost of persistence, but a compromise of your build tooling still touches everything your user can touch.
- NixOS is a reproducibility and auditability story that can express hardening, but does not give it to you. The declarative config makes a hardened workstation reproducible and reviewable, which is genuinely valuable, but the out-of-the-box security posture is roughly a standard distro's, and it is still one kernel, one trust domain.
- Hardening without compartmentalization has known limits on Linux desktops. Flatpak sandbox escapes, portal weaknesses, browser-level blob attacks, and the general "Linux desktop was not designed with a strong system-wide compromise boundary" reality all apply to every non-Qubes entry on this list. If an attacker executes code in your user session, your mostly-unified kernel and filesystem are the shared fate.
- The boring rule survives: developers doing serious work with untrusted repositories should either run Qubes, or deliberately build their own compartmentalization (VMs, containers, separate machines) on top of a hardened single-kernel OS. Hardening and compartmentalization are complements, not competitors, and pretending one substitutes for the other is where people get hurt.
What each one actually is
Qubes OS is compartmentalization as the product. Under the hood: the Xen hypervisor runs dom0, the small, trusted root of the system, plus one or more service qubes (network via sys-net, firewalling via sys-firewall, USB via a dedicated qube) and any number of your own app and work qubes. Qubes' own documentation is blunt about dom0's role: it is the most trusted of all qubes, and if it were ever compromised it would be "game over": an effective compromise of the entire system. That is exactly why everything in Qubes is designed to protect dom0 rather than assume it lost: dom0 has no network connectivity, runs no user applications, and keeps its attack surface as small as possible. The parts Qubes actually treats as untrusted are the service qubes (sys-net, sys-usb, sys-firewall), which are sandboxed in unprivileged VMs. The core idea the project itself states plainly: OS security by isolation, because perfect single-OS security does not exist. Practically that gets you:
- A separate kernel instance per qube. Because each VM is a full guest with its own kernel, a local kernel exploit or a vulnerable module in your "risky repo" qube does not extend to your "production SSH" qube. There is no shared kernel to own, no shared page cache to walk, and no shared process space. Precision matters here: by default qubes boot a dom0-provided kernel, so the kernel version is usually the same everywhere and a given kernel bug is generally present in every qube. What contains the exploit is the instance boundary: malicious code must already be running inside a qube to exploit its kernel, and reaching another qube means crossing the hypervisor.
- Data compartmentalization by default. Each qube has its own private filesystem. Copying data between qubes is a deliberate, clipboard- or file-manager-mediated act. Malicious code in the untrusted qube has to escalate across a hypervisor boundary to reach anything else, which is categorically harder than reading your home directory on a single-kernel system.
- Disposable qubes that spin up, open an untrusted PDF or repo, and die, plus per-qube network policies so an untrusted qube can be firewalled or airgapped at the hypervisor level (this is the same class of control the egress-firewall piece applies to agents, enforced one level lower in the stack).
The costs are just as real: hardware constraints (VT-x/VT-d, IOMMU, a compatible GPU), a learning curve, RAM and disk overhead, GPU/performance tradeoffs, and dependency knowledge, since you need Qubes + your app VMs configured enough for daily work. Qubes is also built around securing one laptop rather than a fleet: syncing a team's developer setups across qube templates is real administration.
Fedora Silverblue (and the other Atomic Desktop variants) makes the base OS immutable and atomic. rpm-ostree/ostree images are updated transactionally with rollback, /usr is read-only, and most app installs become Flatpaks. That is a real integrity and durability improvement: a bad update is a reboot to the previous image, not an fsck of your weekend. But be honest about the model: it is one kernel shared by everything, one Fedora that all your user processes share, and a home directory that all your processes read. The Flatpak layer (apps sandboxed with portals) is the main compartmentalization mechanism the model gives you, and it is a weak one: portals were not designed as a hard security boundary, there are documented escape hatches and a history of sandbox escapes, and developer workflows resist Flatpaks badly (toolchains, mutable build states, IDE/CLI bridging). The standard developer workflow on Atomic desktops proves the point: Toolbx containers by default have seamless access to your home directory: your "isolated" toolchain container shares the same files and the same user session as everything else. Silverblue is the right answer for "can my OS not be silently modified and can I always roll back", which is a different question than "am I compartmentalized".
secureblue takes the Silverblue-family Atomic model and turns the hardening up, hard. It ships as hardened bootable OCI container images built on Fedora Atomic Desktop base images, pulling ideas from GrapheneOS-style hardening into the Linux desktop: hardened_malloc system-wide including for Flatpaks, its own Fedora-based kernel build (not linux-hardened), with aggressive sysctl and kernel-argument hardening, USBGuard, Trivalent (its own security-focused Chromium-based browser), Xwayland disabled by default, ptrace attachment prohibited by default, and unprivileged user namespaces disabled for the unconfined and container SELinux domains (retained only where needed, such as for Flatpaks and Trivalent). It also strips suid-root from numerous binaries and removes sudo, su, and pkexec entirely in favor of run0, which is stronger than "no sudo by default". Note what the Flatpak story actually is: not a curated, vetted whitelist of apps, but permission lockdown to close sandbox-escape routes, with only the Flathub-verified remote enabled by default. Those ptrace and user-namespace restrictions matter directly for this article's argument: they close two of the classic paths by which one process in your session can attack another running as the same user. secureblue is also honest about what it is not: its own FAQ contrasts it with Qubes OS: isolation between qubes is significantly stronger than app-level isolation on a normal desktop, so "Qubes OS can fill certain security needs better than secureblue". For a developer, secureblue is the strongest available expression of "I want my daily OS as hard as it can get while remaining a normal Linux desktop I can build software on, and staying in the Fedora ecosystem so my tooling works normally". The cost is friction: the defaults break some mainstream software (Xwayland apps, Electron apps under hardened_malloc, containers until you enable user namespaces), and you are downstream of a small team doing substantial hardening work on a fast-moving base; it is a real hardening project, not a reskin. The cost you do not escape: still one kernel, one session.
Kicksecure is the Debian-family analog of the same idea: a security-hardened distro that ships a broad set of hardening as defaults: KSPP-inspired kernel hardening sysctls and boot parameters (its security-misc package), a SUID disabler and permission hardener, blacklisted kernel modules, hardened SSH client and server defaults, sdwdate for secure time synchronization, USBGuard, AppArmor profiles, no open ports by default, torified apt upgrades, and a separate user/sysmaint boot-mode split. It is Debian's packaging ecosystem plus a posture committed in one place rather than maintained by hand. (One contrast with secureblue: Kicksecure does not use hardened_malloc; the project deprecated it, citing among its reasons that it would "never be stable enough to be suitable for installation by default for all users".) Kicksecure's own documentation (its "reasonable security" write-up) is candid in a specific way: it defines reasonable security as a trade-off against your threat model and mostly discusses why the Qubes founders call Qubes "reasonably secure"; it is not a hardened-host-versus-Qubes comparison. The accurate summary is the project's own framing: defense-in-depth hardening of one system. What it is not is compartmentalization: virtualization works fine on it (and it is available as a Qubes template), but isolation is not the product. For a Debian operator, Kicksecure is the natural choice; like the Fedora-family options, it raises exploitation costs but does not create trust domains.
NixOS is a different animal entirely: the whole system, from kernel config to app install to service files, is declared in a versioned config, built atomically, and fully rollback-safe. For a workstation, that gives you: reproducible builds of your hardened environment (deterministic kernel config options declared in configuration.nix or your own module, and when a config doesn't evaluate, the build fails loudly rather than booting something half-configured), the ability to review security posture changes as code, and easy hypothetically-disposable clones for testing. What it does not give you is a security architecture. Out of the box NixOS is a conventional single-kernel Linux distro with a large userspace, a mutable home directory, hardening that arrives only if you research and express it, and a large attack surface from the wide ecosystem of packages. That last point is now truer than it used to be: profiles.hardened was removed in the 26.05 release; the release notes call it a "grab bag" of settings without a consistent baseline, and the linux_hardened kernel package was dropped for lack of maintenance, so the one-line hardening switch you may remember from older guides no longer exists; the maintained path is the NixOS wiki's hardening page plus your own configuration. The genuinely useful thing NixOS contributes to this question is the expressiveness when you do compartmentalize: hardened NixOS VMs and reproducible per-domain packages get you Qubes-like compartmentalization if, and only if, you build the VM architecture yourself.
Why the single-kernel model has hard limits
Hardening configs (the realistic kind) limit privilege escalation, silence attack surfaces, tighten ptrace and mmap, load fewer modules, and so on. But the local kernel attack that matters on a developer box is not usually "root to kernel": it is "user to user's data". npm postinstall scripts, git hooks, build systems, MCP tools, and editor extensions run as your user. Hardening does not stop code that runs as your user from reading files your user reads, tokens your user's shell has, or memories your user's processes hold. The kernel hardening of the last decade, from KSPP-driven work like hardened usercopy and refcount hardening to the older vm.mmap_min_addr null-dereference protection (which predates KSPP) and the separate post-Spectre/Meltdown mitigation wave, addresses kernel exploitation probability, but every one of those mitigations is shared-state: one Linux, one kernel, one address space model for all of your work and all of your untrusted code.
This is why the flatpak sandbox is also not a full fix: it is a single-kernel, single-system userspace fence, and there is a long public history of Flatpak and portal escape bugs and of app categories that are technically sandboxed via a few overly-wide portal grants. Desktop Linux genuinely does not yet have a strong capability-based inter-app boundary like GrapheneOS's app sandbox and permission model or Apple's; you get fences and the fences have gates. Qubes sidesteps the question entirely: the fence is the VM boundary and the boundary enforcement budget lives in the hypervisor and IOMMU. That boundary is not magic. Xen has a long public advisory history, but it is unusually well-lit: Qubes maintains a public tracker assessing every Xen security advisory's impact on Qubes (over 500 XSAs across roughly fifteen years, about a quarter of them affecting Qubes) and publishes signed security bulletins with impact analysis for every advisory that does.
To be fair to the single-kernel family, there are individual mitigations that genuinely matter on workstations and that accumulate into a meaningfully harder target: KSPP-style kernel configs, hardened_malloc, USBGuard, run0/no-sudo defaults, AppArmor/SELinux policies, and snapshots. They raise the cost of exploitation and persistence. "Raise the cost" and "structurally contain" are different properties, and none of the hardening projects claim otherwise, which is exactly why they coexist with Qubes rather than competing with it.
Side by side
Dimension | Qubes | Silverblue (Atomic) | secureblue | Kicksecure | NixOS |
|---|---|---|---|---|---|
Core model | Xen compartmentalization | Immutable atomic base | Hardened Atomic | Hardened Debian | Declarative reproducible |
Shared kernel? | No, a separate kernel instance per qube | Yes, one | Yes, one (hardened) | Yes, one (hardened) | Yes, one (configurable) |
Data compartmentalization | Structural, per-VM fs | Flatpak sandbox only | Flatpak sandbox, permissions locked down | Userspace hardening only | Only if you build it |
Hardening defaults | Minimal dom0, isolation-first | Fedora defaults | Aggressive (malloc, run0, ptrace/userns lockdown) | Aggressive sysctls, SUID hardening | Few defaults, great expressiveness |
Rollback | Per-qube templates | Atomic, built in | Atomic, built in | Debian tooling | Atomic, built in |
Dev workflow friction | High (templates, VM boundaries) | Medium (layered packages, toolchains) | Medium-high (defaults break some apps) | Low (normal Debian) | High until fluent in Nix |
Hardware requirements | Strict (VT-x, VT-d, IOMMU) | Normal | Normal | Normal | Normal |
Best for | Anyone whose work touches untrusted code and real credentials concurrently | Base immutability with normal workflow | Max hardening with normal Linux desktop use | Debian operators wanting hardened defaults | Reproducible, reviewable workstations you compartmentalize yourself |
Choose Qubes when
- Your job mixes untrusted code and high-value credentials every day. If your terminal clones repos, runs build scripts, and shares a user with saved production SSH keys and cloud tokens, there is nothing else on this list that structurally separates those two lives.
- You want the OS to enforce boundaries rather than to have to remember them. Disposable qubes, per-qube network policy, one kernel instance per trust domain: this is the only candidate where the architecture does the daily discipline for you.
- You accept the tradeoffs. Compatible hardware, RAM, template administration, and learning. Qubes is the highest security model and the highest friction; that price is real, and including it here is a feature of the comparison, not a bias.
Choose Silverblue or secureblue when
- Your hardening budget is real but your compartmentalization appetite is not. An immutable, atomic base with rollback, hardened_malloc, USBGuard, and run0-instead-of-sudo defaults is a genuine and measurable improvement over a stock workstation with conventional partitions and a mutable root.
- You value a workflow, not a security cult. secureblue's hardening is in service of staying a daily-driver Fedora desktop. If you actually want a daily-driven Linux desktop and want the hardest possible version of that desktop, this is the strongest answer in the category.
- You already compartmentalize somewhere else. A remote dev box, a build machine, a separate laptop for release signing. If your trust domains already exist at the machine or network level, a hardened single-system desktop is a genuinely good daily layer, and Qubes on it would be redundant.
Choose Kicksecure when
- You are a Debian operator first. Familiar packaging, apt lifetime, the same assumptions on every box you own. Kicksecure's hardening defaults are serious and give you a meaningfully hostile-to-exploit workstation without leaving the Debian world.
- You want its anonymity options too. It is the base of Whonix; if anonymity is part of the threat model, Kicksecure integrates cleanly and links up with the compartmentalization story via the Kicksecure Qubes template.
- You understand it raises exploitation cost but does not create trust domains. Running it as a lone hardened host is a credible choice for most corp-developer threat models, but it is not compartmentalization.
Choose NixOS when
- The value you want is reproducibility and reviewability, and you are willing to engineer for security yourself. A declarative configuration.nix (or your own module) with hardened kernel options, reviewed as code, and rebuilt atomically on a schedule is a genuinely powerful artifact for a team.
- You want to build your own compartmentalization. NixOS on VMs under libvirt or as a Qubes template gives you the strongest DIY composite on this list: architectural compartmentalization with reproducible per-domain images.
- You accept that NixOS defaults are not hardened by default. You get exactly what you configure, and since 26.05 even the old profiles.hardened shortcut is gone. That is the entire pitch, and it is a double-edged one on a hostile workload machine.
The honest limits of ALL of these
- No mainstream Linux desktop has an app-model-plus-kernel story that matches the mobile world. There is no mainstream Linux analog to the strong capability-security pattern of GrapheneOS, iOS, or seL4-based systems; secureblue is pushing the closest spirit. The browser's large attack surface and distro toolchain breadth are a permanent tax on all of these anyway.
- Even Qubes has its own limits. dom0 is the most trusted part of the system, not an assumed-compromised one: because a dom0 compromise would be game over for the whole machine, Qubes minimizes dom0's exposure (no networking, no user applications) instead. What the architecture does not solve: hardware attacks, firmware, physical access, and the overall supply chain of what a qube runs.
- None of this replaces secrets hygiene or backups. Where your credentials live, what they can do, what your egress rules are, and how fast you can rebuild a compromised workstation matter as much as which of these systems you boot. For agents specifically, the adjacent question is network egress (our agent egress piece) and runtime isolation (our agent sandboxing piece). For the asset side of workstation loss, our 3-2-1 backup walkthrough covers the baseline.
- Measured hardening impact is workload-specific. Kernel configs, malloc, and USBGuard metrics shift per machine, driver, and discipline. I have deliberately not put benchmark numbers next to any of these five; the local reality is that no current public benchmark measures "user-task exploitation prevented" in a way that ranks these five fairly.
Versions checked
- Qubes OS
dom0 is the most trusted qube (no networking, no user apps); VM kernels are provided by dom0 by default - secureblue
run0 replaces sudo/su/pkexec; ptrace prohibited; unprivileged userns disabled for unconfined and container domains; Xwayland off; Trivalent; Flatpak permission lockdown; own Fedora-based kernel build (not linux-hardened); lockdown=confidentiality karg set by default; FAQ contrasts Qubes - Kicksecure
hardened_malloc deprecated, never enabled by default - Fedora Silverblue
Toolbx containers share the home directory by default
Verified against doc.qubes-os.org (getting started, managing qube kernels, and the XSA tracker: 507 Xen advisories since 2011, 121 affecting Qubes), secureblue.dev features and FAQ, the kicksecure.com wiki, the NixOS 26.05 release notes, Fedora Atomic docs, and containertoolbx.org.
FAQ
Is Fedora Silverblue actually more secure than regular Fedora Workstation?
It is more tamper-resistant: the base OS is read-only and updates are atomic with rollback, so a silent modification of system files or a half-applied update is a structurally different (and better contained) event. It is not more compartmentalized: there is still one kernel, one session, and one home directory trusted by everything, and the Flatpak sandbox is the only app-bounding layer in the model.
Does secureblue make running untrusted code safe?
No, and the project does not claim it does. Hardened malloc, USBGuard, sudo/su/pkexec replaced by run0, locked-down Flatpak permissions, and hardened kernel parameters raise exploitation and persistence cost substantially. But a user running npm install in a session still executes in the same trust domain the OS protects, so hardening reduces probability rather than eliminating blast radius. Qubes, or building your own compartmentalization, is the actual containment answer.
Is Kicksecure actually more secure than plain Debian?
It meaningfully raises default hardening, yes: KSPP-inspired kernel sysctls and boot parameters, SUID and permission hardening, blacklisted kernel modules, hardened SSH and account defaults, USBGuard, and no open ports, all with better out-of-the-box configuration than plain Debian. What Kicksecure's documentation claims is "reasonable security" (hardening as a threat-model trade-off on a single system), and it makes no compartmentalization claim; Qubes-style isolation is a different category of guarantee.
Is NixOS the most secure Linux distro?
Not by default. NixOS is a reproducible, atomic, declarative distro with great auditability and expressiveness for kernel and service hardening, but its default posture is not hardened, and the old profiles.hardened one-liner was removed in 26.05, so the hardening work is fully manual now. It is still a single-shared-kernel system. It can be made very secure, and it pairs well with compartmentalized architectures because the per-VM images are trivially reproducible, but "declarative" and "hardened" are not the same thing.
What is the actual difference with Qubes' per-VM kernels?
On Qubes, each VM is a guest with its own kernel instance, userspace, and filesystem, under the Xen hypervisor. Consequences: a kernel exploit or rootkit in one qube reaches only that qube, and an attacker's data access is bounded by the private filesystem of that qube, not by the home directory of a unified system. By default, qubes boot a kernel supplied by dom0, so the kernel version is typically the same across qubes; the isolation comes from separate kernel instances in separate VMs, not from running different kernel versions. On every other option in this comparison, the kernel is shared by definition, so one kernel-level compromise affects all users of that system. That data-compartmentalization property of Qubes comes from compartmentalization itself, not from any hardening flag.
Do I need Qubes, or can I get the same isolation differently?
You can get materially similar isolation by building it yourself: a hardened single-kernel distro running your untrusted workloads in isolated VMs or throwaway containers with their own kernels, no shared home directory, their own kernel and network policy. The comparison is Qubes' benefit versus the effort you put in, and Qubes' benefit is that the discipline is built into the OS rather than being a thing you have to systematically demonstrate every commit of every project. If you build it yourself, containerized agent sandboxes and egress controls are the adjacent pieces.
Further reading
- Qubes OS architecture overview: https://www.qubes-os.org/doc/architecture/
- Qubes on dom0 (the most trusted qube) and on VM kernels: https://doc.qubes-os.org/en/latest/introduction/getting-started.html and https://doc.qubes-os.org/en/latest/user/advanced-topics/managing-vm-kernels.html
- Qubes' Xen security advisory impact tracker: https://www.qubes-os.org/security/xsa/
- Kicksecure's write-up on "reasonable security" (a trade-off definition, not a Qubes comparison): https://www.kicksecure.com/wiki/Reasonable_Security
- secureblue project, hardening docs, FAQ (including its Qubes comparison), and kernel-arguments list: https://secureblue.dev/, https://secureblue.dev/faq, https://secureblue.dev/articles/kargs
- Fedora Atomic Desktops documentation: https://docs.fedoraproject.org/en-US/fedora-silverblue/
- Toolbx, the standard Atomic developer containers (note what they share with your host): https://containertoolbx.org/
- NixOS manual and the 26.05 release notes (where the profiles.hardened removal is documented): https://nixos.org/manual/nixos/stable/release-notes
- Our write-up on firewalls for AI coding agents: https://systhoughts.com/posts/ai-coding-agents-egress-firewall
- Our write-up on sandboxing AI coding agents: https://systhoughts.com/posts/docker-sandboxes-ai-agents
- Our comparison of immutable node operating systems (different axis: server): https://systhoughts.com/posts/talos-vs-flatcar-vs-fedora-coreos-immutable-kubernetes-nodes
Which of these runs your workstation, and what convinced you: the compartmentalized discipline of Qubes, the immutability of Silverblue, the hardened posture of secureblue or Kicksecure, or reproducibility of NixOS? If you moved between them, tell me what you missed first. Drop it in the comments.
Until next time, keep your systems thoughtful.

No comments yet