We are pleased to announce the release of GNU Guix version 1.4.0!
The release comes with ISO-9660 installation images, a virtual machineimage, and with tarballs to install the package manager on top of yourGNU/Linux distro, either from source or from binaries—check out thedownload page. Guix users canupdate by running guix pull.
It’s been 18 months since the previousrelease.That’s a lot of time, reflecting both the fact that, as a rollingrelease, users continuously get new features and update by runningguix pull; but let’s face it, it also shows an area where we could andshould collectively improve our processes. During that time, Guixreceived about 29,000 commits by 453 people, which includes importantnew features as we’ll see; the project also changedmaintainers,structured cooperation asteams, andcelebrated its ten-yearanniversary!

Illustration by Luis Felipe, published under CC-BY-SA 4.0.
This post provides highlights for all the hard work that went into thisrelease—and yes, these are probably the longest release notes in Guix’shistory, so make yourself comfortable, relax, and enjoy.
Bonus! Here’s achiptune(by Trevor Lentz, underCC-BY-SA 3.0) our illustrator Luis Felipe recommends that you listento before going further.
One area where Guix shines is the management of softwareenvironments. The guix environment command was designed for thatbut it suffered from a clumsy interface. It is now superseded by guix shell,though we are committed to keeping guix environment until at least May1st, 2023. guix shell is a tool that’s interesting to developers, butit’s also a useful tool when you’re willing to try out software withoutcommitting it to your profile with guix install. Let’s say you wantto play SuperTuxKart but would rather nothave it in your profile because, hey, it’s a professional laptop; here’show you would launch it, fetching it first if necessary:
guix shell supertuxkart -- supertuxkart
In addition to providing a simpler interface, guix shell significantlyimproves performance through caching. It also simplifies developerworkflows by automatically recognizing guix.scm and manifest.scmfiles present in a directory: drop one of these in your project andother developers can get started hacking just by running guix shell,without arguments. Speaking of which: --export-manifest will get youstarted by “converting� command-line arguments into a manifest. Readmore about guix shell in themanual.
Another guix shell innovation is optional emulation of thefilesystem hierarchy standard (FHS). TheFHS specifieslocations for different file categories—/bin for essential commandbinaries, /lib for libraries, and so on. Guix with itsstoredoes not adhere to the FHS, which prevents users from running programsthat assume FHS adherence. The new --emulate-fhs (or -F) flag ofguix shell, combined with --container (-C), instructs it to createa container environment that follows the FHS. This is best illustratedwith this example, where the ls command of the coreutils packageappears right under /bin, as if we were on an FHS system like Debian:
$ guix shell -CF coreutils -- /bin/ls -1p /bin/dev/etc/gnu/home/lib/lib64proc/sbin/sys/tmp/usr/
Another big new feature is Guix Home. In a nutshell, Home bringsthe declarative nature of Guix System to your home environment: itlets you declare all the aspects of your home environments—“dot files�,services, and packages—and can instantiate that environment, in youractual $HOME or in acontainer.
If you’re already maintaining your dot files under version control, orif you would like to keep things under control so you don’t have tospend days or weeks configuring again next time you switch laptops, thisis the tool you need. Check out this excellentintroductionthat David Wilson gave at the Ten Years celebration, and read moreabout Guix Home in themanual.
Package transformationoptionsgive users fine control over the way packages are built. The new--tune option enables tuning of packages for a specific CPUmicro-architecture; this enables the use of the newestsingle-instruction multiple-data (SIMD)instructions,such as AVX-512 on recent AMD/Intel CPUs, which can make a significantdifference for some workloads such as linear algebra computations.
Since the 1.3.0 release, the project started maintaining analternative buildfarmat https://bordeaux.guix.gnu.org. It’s independent from the buildfarm at ci.guix.gnu.org (donated and hosted by the Max Delbrück Centerfor Molecular Medicine in Berlin, Germany), which has two benefits: itlets us challenge substitutes produced by eachsystem,and it provides redundancy should one of these two build farms go down.Guix is now configured by default to fetch substitutes from any of thesetwo build farms. In addition, abug was fixed, ensuring that Guixgracefully switches to another substitute provider when one goes down.
Those who’ve come to enjoy declarative deployment of entire fleets ofmachines will probably like the new --execute option of guix deploy.
The distribution itself has seen lots of changes. First, the GuixSystem installer received a number of bug fixes and it now includes anew mechanism that allows users to automatically report useful debugginginformation in case of a crash. This will help developers address bugsthat occur with unusual configurations.
Application startup has been reduced thanks to a newper-application dynamic linkercachethat drastically reduces the number of stat and open calls due toshared library lookup (we’re glad itinspiredothers).
Guix System is now using version 0.9 of theGNU Shepherd, which addressesshortcomings, improves logging, and adds features such as systemd-styleservice activation and inetd-style service startup. Speaking ofservices, the new guix system editsub-commandprovides an additional way for users to inspect services, completingguix system search and guix system extension-graph.
There are 15 new systemservices tochoose from, includingJami,Samba,fail2ban,andGitile,to name a few.
A new interface is available to declare swapspacein operating system configurations. This interface is more expressiveand more flexible than what was available before.
Similarly, the interface to declare static networkingconfigurationhas been overhauled. On GNU/Linux, it lets you do roughly the same asthe ip command, only in a declarative fashion and with static checksto prevent you from deploying obviously broken configurations.

More than 5,300 packages were added for a total of almost 22,000packages, making Guix one of the top-ten biggest distros according toRepology. Among the many noteworthy packageupgrades and addition, GNOME 42 is now available. KDE is not thereyet but tens of KDE packages have been added so we’re getting closer;Qt 6 is also available. The distribution also comes with GCC 12.2.0,GNU libc 2.33, Xfce 4.16, Linux-libre 6.0.10, LibreOffice 7.4.3.2, andEmacs 28.2 (with just-in-time compilation support!).
In other news, motivated by the fact that Python 2 officially reached“end of life� in 2020, more than 500 Python 2 packages wereremoved—those whose name starts with python2-. This includes “bigones� like python2-numpy and python2-scipy. Those who still needthese have two options: using guix time-machineto jump to an older commit that contains the packages they need, orusing the Guix-Pastchannel to build some of those old packages in today’senvironments—scientific computing is one area where this may come inhandy.
On top of that, the Web site features a new packagebrowser—at last! Among other things,the package browse provides stable package URLs likehttps://packages.guix.gnu.org/packages/PACKAGE.
The NEWSfilelists additional noteworthy changes and bug fixes you may beinterested in.
As with past releases, we have worked on documentation to make Guix moreapproachable. “How-to� kind of sections have been written or improved,such as:
The Cookbook likewisekeeps receiving how-to entries, check it out!
The Guix reference manual is fully translated intoFrench andGerman; 70% is available inSpanish, and there arepreliminarytranslationsin Russian,Chinese, and otherlanguages. Guix itself is fully translated in French, with almostcomplete translations in Brazilian Portuguese, German, Slovak, andSpanish, and partial translations in almost twenty otherlanguages.Check out the manual on how tohelpor this guided tour by translator in chief JulienLepiller!
A salient feature of Guix is its support for reproducible softwaredeployment. There are several aspects to that, one of which is beingable to retrieve source code from the Software Heritagearchive.While Guix was already able to fetch the source code of packages fromSoftware Heritage as a fallback, with version 1.4.0 the source code ofGuix channels is automatically fetched from Software Heritage if itsoriginal URL has become unreachable.
In addition, Guix is now able to retrieve and restore source codetarballs such as tar.gz files. Software Heritage archives thecontents of tarballs, but not tarball themselves. This created animpedance mismatch for Guix, where the majority of packagedefinitionsrefer to tarballs and expect to be able to verify the content hash ofthe tarball itself. To bridge this gap, Timothy Sample developedDisarchive, a tool thatcan (1) extract tarball metadata, and (2) assemblepreviously-extracted metadata and actual files to reconstruct a tarball,as shown in the diagram below.

The Guix project has set up a continuousintegration job to build aDisarchive database, which is available atdisarchive.gnu.org. The databaseincludes metadata for all the tarballs packages refer to. When a sourcecode tarball disappears, Guix now transparently retrieves tarballmetadata from Disarchive database, fetches file contents from SoftwareHeritage, and reconstructs the original tarball. As of the“Preservation of Guix Report�published in January 2022, almost 75% of the .tar.gz files packagesrefer to are now fully archived with Disarchive and Software Heritage.Running guix lint -c archival PKG will tell you about the archivalstatus of PKG.You can read more in the annual report ofGuix-HPC.
This is a significant step forward to provide, for the first time, atool that can redeploy past software environments while maintaining theconnection between source code and binaries.
The guix packcommandto create “application bundles�—standalone application images—hasbeen extended: guix pack -f deb creates a standalone .deb packagethat can be installed on Debian and derivative distros; the new--symlink flag makes it create symlinks within the image.
At the system level, the new guix system imagecommandsupersedes previously existing guix system sub-commands, providing asingle entry point to build images of all types: raw disk images, QCOW2virtual machine images, ISO8660 CD/DVD images, Docker images, and evenimages for Microsoft’s Windows Subsystem for Linux(WSL2). Thiscomes with a high-levelinterfacethat lets you declare the type of image you want: the storage format,partitions, and of course the operating system for that image. Tofacilitate its use, predefined image types are provided:
$ guix system image --list-image-typesThe available image types are: - rock64-raw - pinebook-pro-raw - pine64-raw - novena-raw - hurd-qcow2 - hurd-raw - raw-with-offset - iso9660 - efi32-raw - wsl2 - uncompressed-iso9660 - efi-raw - docker - qcow2 - tarball
That includes forexamplean image type for the Pine64 machines and for the GNU/Hurd operatingsystem. For example, this is how you’d create an QCOW2 virtual machineimage suitable for QEMU:
guix system image -t qcow2 my-operating-system.scm
… where my-operating-system.scm contains an operating systemdeclaration.
Likewise, here’s how you’d create, on your x86\_64 machine, an image foryour Pine64 board, ready to be transferred to an SD card or similarstorage device that the board will boot from:
guix system image -t pine64-raw my-operating-system.scm
The pine64-raw image type specifies that software in the image isactually cross-compiled to aarch64-linux-gnu—that is, GNU/Linux onan AArch64 CPU, with the appropriate U-Bootvariant asits bootloader. Sky’s the limit!
A significant change that packagers will immediately notice ispackagesimplification,introduced shortly after 1.3.0. The most visible effect is that packagedefinitions now look clearer:
(package ;; … (inputs (list pkg-config guile-3.0))) ;�
… instead of the old baroque style with “input labels�:
(package ;; … (inputs `(("pkg-config" ,pkg-config) ;� ("guile" ,guile-3.0))))
The new guix stylecommandcan automatically convert from the “old� style to the “new� style ofpackage inputs. It can also reformat whole Scheme files following thestylistic canons du jour, which is particularly handy when gettingstarted with the language.
That’s just the tip of the iceberg: the new modify-inputsmacromakes package input manipulation easier and clearer, and one can useG-expressionsfor instance in package phases. Read our earlierannouncement formore info. On top of that, the new field sanitizer mechanism is usedto validate some fields; for instance, the license field is nowtype-checked and the Texinfo syntax of description and synopsis isvalidated, all without any run-time overhead in common cases. We hopethese changes will make it easier to get started with packaging.
The guix build command has new flags, --list-systems and--list-targets, to list supported system types (which may bepassed to --system) and cross-compilation target triplets (for usewith --target). Under the hood, the new (guix platform) module letsdevelopers define “platforms�—a combination of CPU architecture andoperating system—in an abstract way, unifying various bits ofinformation previously scattered around.
In addition, packagers can now mark as“tunable�packages that would benefit from CPU micro-architectureoptimizations, enabled with --tune.
Python packaging has seen important changes. First, the pythonpackage now honors the GUIX\_PYTHONPATH environment variable ratherthan PYTHONPATH. That ensures that Python won’t unwillingly pick uppackages not provided by Guix. Second, the newpyproject-build-systemimplements PEP 517. It complementsthe existing python-build-system, and both may eventually be mergedtogether.
What’s great with packaging is when it comes for free. The guix importcommandgained support for several upstream package repositories: minetest(extensions of the Minetest game), elm (the Elm programming language),egg (for CHICKEN Scheme), and hexpm (for Erlang and Elixirpackages). Existing importers have seen various improvements. Theguix refreshcommandto automatically update package definitions has a new generic-gitupdater.
There are several ways to get started using Guix:
The installation script lets youquickly install Guix on top of another GNU/Linuxdistribution.
The Guix System virtual machineimagecan be used with QEMU and is a simple way to discover Guix Systemwithout touching your system.
You can install Guix System as a standalonedistribution.Theinstallerwill guide you through the initial configuration steps.
To review all the installation options at your disposal, consult thedownload page and don't hesitateto get in touch with us.
Enjoy!
GNU Guix is a transactional package manager andan advanced distribution of the GNU system that respects userfreedom.Guix can be used on top of any system running the Hurd or the Linuxkernel, or it can be used as a standalone operating system distributionfor i686, x86\_64, ARMv7, AArch64, and POWER9 machines.
In addition to standard package management features, Guix supportstransactional upgrades and roll-backs, unprivileged package management,per-user profiles, and garbage collection. When used as a standaloneGNU/Linux distribution, Guix offers a declarative, stateless approach tooperating system configuration management. Guix is highly customizableand hackable through Guileprogramming interfaces and extensions to theScheme language.