{"id":19876407,"url":"https://github.com/foo-dogsquared/guixsd-config","last_synced_at":"2026-03-05T13:32:18.881Z","repository":{"id":115061790,"uuid":"292199404","full_name":"foo-dogsquared/guixsd-config","owner":"foo-dogsquared","description":"My NixOS-config-inspired GuixSD config.","archived":false,"fork":false,"pushed_at":"2020-09-19T20:31:48.000Z","size":19,"stargazers_count":1,"open_issues_count":0,"forks_count":2,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-01T01:42:06.021Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Scheme","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/foo-dogsquared.png","metadata":{"files":{"readme":"README.adoc","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-09-02T06:32:54.000Z","updated_at":"2021-07-29T20:37:21.000Z","dependencies_parsed_at":"2023-03-12T08:01:28.954Z","dependency_job_id":null,"html_url":"https://github.com/foo-dogsquared/guixsd-config","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/foo-dogsquared/guixsd-config","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/foo-dogsquared%2Fguixsd-config","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/foo-dogsquared%2Fguixsd-config/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/foo-dogsquared%2Fguixsd-config/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/foo-dogsquared%2Fguixsd-config/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/foo-dogsquared","download_url":"https://codeload.github.com/foo-dogsquared/guixsd-config/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/foo-dogsquared%2Fguixsd-config/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30127834,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-05T12:40:50.676Z","status":"ssl_error","status_checked_at":"2026-03-05T12:39:32.209Z","response_time":93,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-12T16:32:56.980Z","updated_at":"2026-03-05T13:32:18.850Z","avatar_url":"https://github.com/foo-dogsquared.png","language":"Scheme","funding_links":[],"categories":[],"sub_categories":[],"readme":"= foo-dogsquared's GuixSD config\n:toc:\n\nThis is my config on my https://guix.gnu.org/[GuixSD] installation.\nSimilar to my https://github.com/foo-dogsquared/nixos-config[NixOS configuration], it provides a quick way for me to install GuixSD very quickly with all of the settings intact (for 99% of the time) which is the advantages of using NixOS and GuixSD.\n\n\n\n\n== Getting started\n\nBefore you can get this setup, there are some prerequisites to do:\n\n* You've decided for a https://guix.gnu.org/manual/en/html_node/Manual-Installation.html[manual installation] and already in a shell.\n\n* The partitions are already setup and mounted in `/mnt/` as the root.\n\n* Installed git or any other package (e.g., udisks2 if you have it in an external hard drive, ssh if it's on a remote computer) that can get the files.\nfootnote:[You can install it with `guix package -i $PKG`.]\n\n* Have http://www.gnu.org/software/make/[GNU Make] (or whatever build system compatible with it) already installed.\n\nSetting up consists of cloning this repo (i.e., `git clone $GIT_URL`) somewhere in your filesystem preferably in `/etc/guixsd-config` and `make install`.\n\nTake note that the setup has separate configurations for the system (i.e., link:./hosts/[`./hosts/`]) and the user (i.e., link:./manifests/[`./manifests/`]).\n\n\n\n\n== Project structure\n\nThe current setup should have the following folder structure:\n\n[source, tree]\n----\nguixsd-config\n├── config/\n├── hosts/\n├── manifests/\n├── modules/\n├── packages/\n└── README.adoc\n----\n\n* link:./config/[`./config/`] is the cluster-wide footnote:[When I say 'cluster-wide', I mean throughout all of my machines from a desktop (which I have only one) and laptops (which I have none).] ad-hoc configuration of the programs I often use.\nIn this case, it will be my https://github.com/foo-dogsquared/dotfiles[dotfiles].\n\n* link:./hosts/[`./hosts/`] is the system configuration for each of my machines with each of their name listed as a directory.\nFor more information, see the \u003c\u003cHosts\u003e\u003e section.\n\n* link:./modules/[`./modules/`] is where particular modules (e.g., metapackages) are stored.\nThey are primarily used by the `./manifests/` folder for user configuration.\n\n* link:./manifests/[`./manifests/`] contains https://guix.gnu.org/cookbook/en/html_node/Guix-Profiles-in-Practice.html[individual profiles] and https://guix.gnu.org/cookbook/en/html_node/Basic-setup-with-manifests.html[manifests] for user-level declarative configuration of their local system (e.g., Guix packages, third-party channels).\n\n* In the future, custom https://guix.gnu.org/manual/en/html_node/Services.html[services] may be stored under link:./services/[`./services/`] where it can contain certain services that are convenient to have (e.g., Recoll indexing, Unison backup).\n\n\n\n\n== Hosts\n\nIn link:./hosts/[`./hosts/`], it contains the configuration of each machine stored in their individual folder (with their name as the directory name).\nIt is intended to be copied on the appropriate place (at `/etc/config.scm`) but you could choose to just configure it anywhere else.\n\nThe configuration should strictly contain system-wide configuration and system-exclusive user configurations (e.g., guest users, helper accounts).\nUser-specific configurations that can be found on other systems should go to the link:./manifests/[`./manifests/`] folder.\n\nFor best practice, each host on `./hosts/$HOST` should follow the following folder structure:\n\n[source, tree]\n----\n./hosts/$HOST\n├── config/\n├── manifests/\n├── modules/\n├── config.scm\n└── README.adoc\n----\n\nThis folder structure is inspired from this very setup.\nThe difference is it is solely for system-specific stuff: `config/` for system-specific ad-hoc configurations, `manifests/` for system-specific users profiles, and so forth.\nIt should also have a `config.scm` file that contains the full system configuration similar to `/etc/config.scm` from your first installation (the guided graphical one, anyway).\n\nFor accessibility and self-reminder, it is recommended to create a README file.\nIt could be written in any format with any file extension.\nIn my case, I have README written in https://asciidoctor.org/[Asciidoctor] with the `.adoc` file extension.\n\n\n\n\n== Modules\n\nlink:./modules/[`./modules/`] contains the modules which are primarily metapackages (a package of a list of package) intended for easy toggling when configured with the https://guix.gnu.org/cookbook/en/html_node/Basic-setup-with-manifests.html[manifests].\n\n\n=== Workflow\n\nSince my modules setup is a bit customized for my needs, I'll try to explain it quickly.\nHere's the current project structure of the configuration (as of 2020-09-02):\n\n[source, tree]\n----\nguixsd-config/modules\n├── desktop.scm\n├── dev.scm\n├── editors.scm\n├── shell.scm\n└── _utils.scm\n----\n\nIf you've already taken a peek on the main modules (e.g., `desktop.scm`, `dev.scm`), they are all defined with `create-pkg-interface` procedure.\nIt is a procedure defined from `modules/_utils.scm`.\n\n.Example of using `create-pkg-interface` for creating a package module\n[source, guile]\n----\n; modules/games.scm\n(define-module (modules games)\n  #:use-modules (gnu packages)\n  #:use-modules ((modules _utils) #:prefix utils:\n                                  #:select (create-pkg-interface)))\n\n(create-pkg-interface\n  pkgs-games\n  '(\n     (default . (\"0ad\"\n                 \"battle-for-wesnoth\"\n                 \"endless-sky\"\n                 \"openmw\"\n                 \"openrc\"))\n     (proprietary . (\"lutris\"\n                     \"playonlinux\"\n                     \"steam\"))))\n----\n\nThe above code listing will produce a exported procedure like the following:\n\n[source, guile]\n----\n(define*-public\n  (pkgs-games #:key (allow '()))\n  (\n    ; The unimportant implementation...\n    ; It will just create a list of names of the packages based from the allowlist of branches.\n  ))\n----\n\nWhich on a manifest, you can use it like this:\n\n[source, guile]\n----\n; manifests/sample.scm\n(define-module (manifests sample)\n  #:use-modules (gnu packages)\n  #:use-modules (guix profiles)\n  #:use-modules ((modules games) #:prefix games:))\n\n(specifications-\u003emanifest\n  (append\n    ; Muh games.\n    (games:pkgs-games\n      #:allow (list 'default 'proprietary))\n\n    ; Your additional packages that are not added to the modules.\n    '(\"neovim\"\n      \"lf\"\n      \"minetest\"\n    )))\n----\n\n\n\n\n== Why GuixSD?\n\nGuix has a lot of good stuff a power user may look for.\nHere are the following features I find very attractive:\n\n* Declarative configurations which enables easier reproducibility.\nThe community behind Guix also happens to focus for https://reproducible-builds.org/[reproducible] and http://bootstrappable.org/[bootstrappable] builds which is interesting for me, at least.\n\n* Offers a transparent binary/source installation process.\nIf a package is not available as a binary, it will just build the package for you instead.\nThe best thing about it, it's optional with just a simple toggle option (`guix package -i $PACKAGE --fallback`).\n\n* Straightforward packaging process in case you didn't find the package you're looking for.\nThis one is a must (in my opinion) if you want to make an independent Linux distro from scratch.\nYou can either contribute to the https://guix.gnu.org/en/packages/[official package archive] or https://www.gnu.org/software/guix/manual/en/html_node/Channels.html[create one yourself].\n\n* Available options include rollback, letting you switch to previous configurations.\nThis is useful for emergency situations where your current configuration doesn't work and rework your config.\nTheoretically, you would have a difficult time screwing your system up.\nfootnote:[Practically, I don't know much but I imagine it would be \"easy\" especially for an idiot like me.\nWe'll just have to see.]\nYou could also go all the way back to your first installation provided you didn't garbage-collected your system yet.\n\n* It's a strictly https://www.gnu.org/distros/free-non-gnu-distros.html[free distro] with the ability to add your own proprietary stuff.\nAs far as I know, there's no mechanism in Guix that prevents you from adding them.\nThat alone makes it a true free distro for me: the freedom to add your own garbage. footnote:[;p]\n\n\n=== Want to learn about Guix?\n\nYou might've heard about Guix (which is probably you're here).\nHere are the stuff I've look for resources:\n\n* https://guix.gnu.org/manual/[The official manual] serves as a pretty good introduction to Guix (which it should be good).\nIt contains a bunch of information from installation process to the conceptual overview to anything Guix-related.\n\n* https://guix.gnu.org/cookbook/[The Guix cookbook] is a great practical introduction on what to do next after the installation process.\n\n* The community behind Guix is pretty great and welcoming to newcomers.\nYou can go to the IRC chat at `#guix` channel on irc.freenode.net to give them a visit.\n\n* https://gitlab.com/pjotrp/guix-notes[Pjotr Prins' notes on GNU Guix] is a set of great document on the subject.\nIt is pretty detailed so take as much as you want, revisit stuff, and glance at the possibilities of the distro.\n\n* I also applied (READ: currently applying) the same practical approach from the https://www.youtube.com/playlist?list=PLRGI9KQ3_HP_OFRG6R-p4iFgMSK1t5BHs[Nixology video series].\nExplore with the Guix\n\nFor other concepts such as channels, you can look at the official manual.\nOr just search through websites such as GitHub, GitLab, and the like.\nI found https://notabug.org/wigust/guix-wigust/[fairly active Guix channel] as a good example.\n\nAbout my experiences learning Guix, I cannot accurately say anything since it is pretty close to Nix.\nI would say since there's a lot of overlaps with Nix, it is almost seamless.\n\nI've encountered fewer (but more major at times) problems compared to Nix and here's an exhaustive list of them:\n\n* Hardware compatibility is one of the major problems.\nI'm able to install GuixSD on bare metal without any scratches but for extra peripherals like WiFi adapters, it is not possible unless you've used a https://gitlab.com/nonguix/nonguix[non-free Guix channel that has it available].\n\n* Package count is far fewer compared to https://github.com/NixOS/nixpkgs[nixpkgs].\nIt's no surprise since Guix is a younger project appeared a decade after Nix.\nCompared to other packaging process footnote:[My experience on packaging is very limited, I've only created a handful of packages for Arch Build System but then again, it's only takes copy-pasting it.], Guix offers a straightforward packaging process that can help Guix pick up the steam in increasing the package count.\n\n* Only strictly free and open source stuff (FOSS) are applied.\nAgain, not a surprise since it is a GNU project.\nSpeaking of which, not all FOSS are there for various reasons (e.g., Firefox is not included since it contains copyrighted material).\nTo get around it, you can create your channel composed of packages that will never get accepted upstream.\nfootnote:[There's already one at https://gitlab.com/nonguix/nonguix if you want to get ahead.]\n\n* Learning https://www.gnu.org/software/guile/[GNU Guile] which is strictly not a requirement but it is a must if you want to go beyond configuring your system in a simple fashion.\nI would put this at the far end when put it in a tier list of problems.\n\n* Speaking of GNU Guile, there is a certain lack of missing details in the documentation especially if you're familiar with the basic ropes of Guix.\nFor example, there's not much of an introduction to packaging aside from using importers which is the easy way out (in my opinion).\nWhat about if the package requires a bit of an intervention with the shell?\nWhat is the equivalent of moving files, copying files, substituting words for a quick patch?\nThose sort of stuff.\nIt has the opposite problem of https://nixos.org[Nix] documentation where the introductory documentation sucks.\nWhat I'm saying is: it has strong beginner's documentation but lacking technical details for the familiar which may end up having a more frustrations.\nAt least with the Nix documentation problem, it is already there outright, leading you to devise solutions from the get-go and a lot of the community tries to improve the situation.\nMeanwhile with Guix documentation problem, you'll be initially invested with the good starting documentation and having to scour for the rest if ever you find yourself needing for a solution.\nfootnote:[Nonetheless, I recommend getting in touch with a community these days which can alleviate most problems like these.]\n\n* The underlying development infrastructure sucks.\n\n** The https://guix.gnu.org[website is nice] and all but then you get into the workflow inside of the project.\nI get the technical merits of using a mailing list (e.g., doesn't require much internet connection, only requires an email address which every developer has, requires less moderation, requires only one interface [email client] to manage) but there's not much saying if the mailing list looks like a 90s website and can be unfamiliar to most newcomers.\nfootnote:[They say don't judge a book by its cover but most people however base a website by its appearance.]\nSimply prettifying it can go leaps and bounds into improving the user experience.\n\n** The https://debbugs.gnu.org[issue tracker] is a pain to use and has the same 90s aesthetic which isn't the best interface.\nEven with the https://issues.guix.info[prettified version], it is not much of an improvement since the searching mechanics seems to not work correctly but it is still great for reading the issues.\nSpeaking of the issue tracker, it is also slow at times although this may be due to my location.\nEven at the best times, it can take at least an hour to get an issue ticket resulting in a slow pace of contribution.\n(Personally, I don't see it as a problem since my pace is already slow anyways but I can see this as a problem for others.)\n\n** The way to contribute is with patches (really?) which is unfamiliar to most newcomers, thus, will have lower participation rate.\nMost FOSS contributors are familiar with pull requests due to popular platforms like GitHub, Gitlab, and so on.\nI have my gripes with patch-based workflows but the core problem I have with patches is how it make contributions not easy to replicate by others (except the maintainers who know what they're doing 99% of the time).\nfootnote:[Or maybe I'm just an idiot who cannot see the merits of a patch-based workflow.\nI think this is a generational thing and as part of the newer generation, can anyone tell me why patch-based workflows is a good thing?\nThere must be a reason Sourcehut uses it, right?]\nIt's already hard to use the issue tracker but with this, it attracts even less new contributors.\nI really hope the team behind Guix will move in to pull requests once they have gained enough steam or something something divine intervention.\n\nCompared to Nix, the community behind Guix has written great documentation with their https://guix.gnu.org/blog/[blog], https://guix.gnu.org/manual/en[manual], and the https://guix.gnu.org/cookbook/[cookbook].\nThe graphical installation helps a ton with providing you to get familiar with GuixSD.\nSimple things like those do add up to the experience and I'm loving it.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffoo-dogsquared%2Fguixsd-config","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffoo-dogsquared%2Fguixsd-config","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffoo-dogsquared%2Fguixsd-config/lists"}