Improving the Guix Home Experience


Improving the Guix Home Experience

Today I’d like to discuss some ideas I have for how to improve the Guix Home experience for both new and experienced users. If you’ve used Guix Home, I also want to hear your experience and ideas!

Simpler “onboarding” for existing configs

  • Linking existing configuration files
  • Templating existing configuration files
  • Converting to well-designed “home services” for a better experience


  • Some users won’t necessarily want to use a full home service to configure some subset of their programs
  • They may have an existing configuration file that they want to parameterize


  • Should the configuration files be usable on non-Guix systems too?

Check out home-stow-migration-service:

Experiment: Simplified home service for existing config files


 (gnu home)
 (gnu services)
 (gnu packages base)
 (daviwil home-services template-file))

(define (template-files base-path file-list value-alist)
  (service home-template-file-service-type
            (base-path base-path)
            (files file-list)
            (values value-alist))))

 (packages (list grep))
 (services (list (template-files "/home/daviwil/.dotfiles/.files"
                                 '((dunst/font . "Iosevka Aile 18")
                                   (qutebrowser/zoom . "150"))))))


(define-module (daviwil utils)
  #:use-module (gnu packages)
  #:use-module (gnu services)
  #:use-module (gnu home services)
  #:use-module (gnu home services shepherd)
  #:use-module (gnu packages freedesktop)
  #:use-module (gnu services configuration)
  #:use-module (guix gexp)
  #:use-module (ice-9 regex)
  #:use-module (ice-9 pretty-print)
  #:use-module (ice-9 textual-ports)

  #:export (gather-manifest-packages

(define (apply-template template-string value-alist)
  (regexp-substitute/global #f
                            (lambda (m)
                              (let ((entry (assq (string->symbol (match:substring m 1))
                                (if entry
                                    (cdr entry)
                                    "VALUE NOT FOUND")))

(define (apply-template-file file-path value-alist)
  (call-with-input-file file-path
    (lambda (port)
      (apply-template (get-string-all port)

Creating shareable configuration layers

  • This requires well-designed home services, either in the main Guix channel or a community channel

Providing a unified configuration model for both home and system services

Andrew Tropin’s RDE has a concept called “features” to accomplish this:

Does Guix need something similar? Maybe. However, any Guix channel can provide this kind of feature.

Implementing a Guix analogue to Nix Flakes

Set up your entire system with a single command using a URL directly to your dotfiles repo!

An example, benoitj’s Nix Flake configuration:

Subscribe to the System Crafters Newsletter!
Stay up to date with the latest System Crafters news and updates! Read the Newsletter page for more information.
Name (optional)
Email Address