GuixPkgs: every Guix package, as a Nix flake
Published 2026-06-25 on Farid Zakaria's Blog
I wrote earlier about what I believe to be an absurd idea, The Guix Nix Abomination: a tool, guix-transfer, that takes any Guix derivation and rewrites it into a Nix derivation, and lets nix-daemon build it.
With this primitive in hand, I pondered what it would mean to import the entire Guix package set into Nix.
That means we could even build a
flakethat is all of Guix packages available for use.
Well…. Hello GuixPkgs. 🤯
Nixpkgs is famously the largest package repository in the world. GuixPkgs makes it bigger by including in the entire GNU Guix package set so you can mix and match Guix and Nixpkgs packages in the same flake.
{
description = "A project mixing Nix and Guix";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
guixpkgs.url = "github:fzakaria/guixpkgs";
};
outputs = { self, nixpkgs, guixpkgs }:
let
system = "x86_64-linux";
pkgs = nixpkgs.legacyPackages.${system};
guixPkgs = guixpkgs.packages.${system};
in {
devShells.${system}.default = pkgs.mkShell {
buildInputs = [
pkgs.git # from Nixpkgs
guixPkgs.hello # from Guix, via GuixPkgs
];
};
};
}
❯ nix build github:fzakaria/guixpkgs#hello
❯ ./result/bin/hello
Hello, world!
☝ Don’t forget, that hello is built from Guix’s source bootstrap, a 357-byte seed all the way up to GCC and glibc but it lands in /nix/store and behaves like any other Nix package. No guix required on the consuming side.
Is this just a joke or is there anything of value here?
Well, some packages only exist in Guix, notable many GNU Guile built software, like guile-png that are now easily available in Nix. 🤷
How does it work?
- Pins a Guix commit and uses
guix time-machineto get derivations from that exact Guix thus decoupling the result from whateverguix-daemonversion happens to be on the host. - Dumps every package’s
.drvand feeds them toguix-transfer --disable-tests --emit-nix-dir pkgs. - Rebuilds the
by-name/index and records the Guix channel + commit + timestamp inguix-metadata.json.
Realising a Guix package under Nix recompiles Guix’s entire source bootstrap. That’s hours per closure. To skip it, GuixPkgs ships a Cachix, cachix use guixpkgs, binary cache that is included in the flake. Thank you @domenkozar for sponsoring me with extra storage. 🙏
What’s next?
We can now do some truly horrendous evil stuff. What about an overlay that replaces every package from Nixpkgs which one that exists in Guix? 😈
We can then build a NixOS machine where every package is the Guix equivalent 😱.
This was a really fun project to pursue during TacoSprint.
Improve this page @ 9991133
The content for this site is
CC-BY-SA.
