This is my personal GNU Guix system configuration for a desktop machine that I also use as local file server. The setup is built around EXWM (Emacs X Window Manager) for the desktop environment and includes various server services for local network.
- Minimal desktop footprint: EXWM for desktop instead of xfce/gnome etc
- Server capabilities: File sharing via Samba, web serving via nginx, music streaming via MPD
- Non-free programs: I’m using the nonguix channel for hardware compatibility (mainly graphics drivers)
~/.config/guix/
├── system.scm # Main system configuration
├── channels.scm # Channel definitions (includes nonguix)
└── modules/
└── arisu/
├── packages.scm # Package collections organized by purpose
├── services.scm # Custom service configurations
└── filesystems.scm # File system etc...
Packages are grouped into three categories:
- Desktop packages: EXWM, terminal emulator, media players, MPD clients
- Development packages: Git, GIMP, development tools
- Server packages: System monitoring, file sharing clients
- Serves
/public/hdd1and/public/hdd2as network shares - I’m currently wondering how this could be done better
- Serves static files from
/var/www/wired - Directory browsing enabled for file exploration
- Accessible on localhost and by hostname “wired”
- Multiple client support (ncmpcpp, Emacs, web clients)
- HTTP streaming on port 8000 for remote access
- Music stored in
/public/hdd1/Music/
Warning: This configuration uses non-free software via the nonguix channel!
- Clone to
~/.config/guix/ - Set up the module load path:
export GUILE_LOAD_PATH="~/.config/guix/modules"- Update channels:
guix pullApply the configuration (this will take a LONG TIME on first run):
sudo -E guix system reconfigure ~/.config/guix/system.scmMPD directories creation and initialisation:
mkdir -p ~/.config/mpd/playlists
sudo herd restart mpd
mpc update # to scan music libraryEnsure your storage drives are mounted:
/public/hdd1- sirius/public/hdd2- rigel
Create web content directory:
sudo mkdir -p /var/www/wired
sudo chown arisu:users /var/www/wiredEdit modules/arisu/packages.scm and add packages to the appropriate category:
arisu-desktop-packagesfor GUI applicationsarisu-development-packagesfor development toolsarisu-server-packagesfor system utilities
Service configurations are in modules/arisu/services.scm:
- Modify Samba shares in
arisu-samba-service - Adjust nginx settings in
arisu-nginx-service - Configure MPD options in
arisu-mpd-service
Storage configuration is in modules/arisu/filesystems.scm. UUIDs are obtained via blkid.
This configuration assumes you’ll configure EXWM in your Emacs setup. Expect this configuration to fail if you’re not using EXWM.
- Samba shares:
\\wired\hdd1and\\wired\hdd2 - Web interface:
http://wiredorhttp://localhost - MPD streaming:
http://localhost:6666 - SSH access: Port 22 (keys separately)
- I’m still figuring out
listen.elin Emacs. For now, I will stick tomcpandncmpcpp - Mobile apps can connect to
my-ip:6600
This configuration uses the non-free Linux kernel and firmware because my graphics card doesn’t have free drivers.
guix pull && sudo -E guix system reconfigure ~/.config/guix/system.scmsudo guix gc --delete-older-than=1m # Remove builds older than 1 monthIf you encounter corrupted derivations:
sudo guix gc --verify=repairChecking service status with herd:
sudo herd status
sudo herd status mpd # Check specific serviceEnsure GUILE_LOAD_PATH includes your modules directory.
Services run as different users:
- MPD runs as
arisuto access music files - Samba runs as system service with guest access
- nginx runs as system service
This is a personal configuration, but feel free to use it as inspiration for your own Guix setup. The modular structure makes it easy to adapt individual components. PRs are always welcome.