1
2
Fork
You've already forked firefly-channel
0
Guix channel of stuff I find useful, and will hopefully eventually upstream.
  • Scheme 99.3%
  • Shell 0.7%
2026年02月09日 10:42:59 -05:00
firefly firefly home services emacs: use source-module-closure instead of manual list 2026年02月08日 11:31:20 -05:00
.dir-locals.el Initial commit 2025年09月19日 17:39:47 -04:00
.gitignore add guix-cache? integration for protection against guix gc 2025年10月08日 12:07:09 -04:00
.guix-authorizations add news file 2026年02月09日 10:42:59 -05:00
.guix-channel add news file 2026年02月09日 10:42:59 -05:00
news-firefly.txt add news file 2026年02月09日 10:42:59 -05:00
README.md add webring to README 2026年02月08日 16:39:57 -05:00
test-pull gitini (and probably other inis) file type 2025年12月13日 21:20:12 -05:00

Firefly

My guix channel!

A collection of packages and services that I have found useful.

I am also a part of the toys webring! It's cool, check it out!

The end goal of all of these is to eventually be included upstream. As such, one file is generally equivalent to what needs to be included in one file for a patch. So that it is easier.

To use this channel, include this in your channels.scm:

(channel
 (name 'firefly)
 (url "https://codeberg.org/Firefly707/firefly-channel.git")
 (branch "main")
 (introduction
 (make-channel-introduction
 "8fd3d165ad053eda93ddb915d5dedc9e880c8fb5"
 (openpgp-fingerprint
 "E76F D6F5 4BCF 096F 28BB C2A0 A026 E5A7 C382 793E"))))

There is also a dev branch, but be warned, that's where the fuck-shit (like downgrades) happens! Use at your own risk.

I assume you have some amount of knowledge of guix for this 'documentation'. The best documentation may always be my personal config, which should always work with the latest commit on dev.

Packages

  • qman in (firefly packages qman): modern text-based terminal man page viewer. Has some issues on the guix system, I'm not certain how to fix.
  • font-monocraft in (firefly packages monocraft): monospaced programming font inspired by the minecraft typeface
  • xplr in (firefly packages rust): A hackable, minimal, fast TUI file explorer

Note: due to relying on Ratatui, this cannot be included in upstream Guix. This is because one of the main devs of Ratatui uses a large amount of AI code, and as of the time of writing, there is a conversation on whether upstream Guix does not consider LLM-generated code to be free. To be clear, I agree with this. Relatedly, I'm aware xplr has 1 copilot commit but it doesn't look significant and seems the author hasn't used copilot in the project again. Also, I currently have no other reason to switch off it. Purism doesn't help me.

Home Services

add-to-bin:

from (firefly home services add-to-bin)

adds a series of executables to the home profile bin directory, and path.

either can be used as a service:

(service home-add-to-bin-service-type
	 <config>)

or defined into a variable, and later added as a package

(define bonus-bin (bin <config>))
...
(home-environment
 (packages
 (list
 ...
 bonus-bin
 ...)))

in either case, the configuration value is the same. It is an alist of program names to one of a gexp, a string, a file-like object, a pair of a guile interpreter and a gexp, or a pair of an interpreter and a string.

A gexp and a string will be written to a program-file and plain-file respectively. A file-like object will be taken as-is. Both pairs are used to specify what interpreter is used for the other value, through a shebang.

All the files are marked as executable.

home-arbitrary-process:

from (firefly home services arbitrary)

runs arbitrary processes at user login.

(service home-arbitrary-process-type
 	 <config>)

where the configuration value can be either a single home-arbitrary-process-configuration or a list of them.

  • service-name (symbol): The name of the shepherd service to manage the process, to be used in commands such as herd status NAME.
  • one-shot (bool): see the guix service documentation.
  • command (list string): The command that the service runs.
  • requirements (list symbol): see the guix service documentation.
  • pwd (string or gexp): What PWD the service should run in.

home-desktop-autostart-service-type:

from (firefly home services desktop-autostart)

generates .desktop files to run a desktop environment on startup.


(service home-desktop-autostart-service-type
 (list
	 (autostart-desktop-entry
	 (command <command>)
	 (path [path])
	 (name [name])
	 (comment [comment])
	 (terminal? [terminal?])
	 (prefer-dgpu? [prefer-dgpu?]))
 ...))

The .desktop files that are generated are marked to be hidden, as they should not be managed by outside environments. Some desktop environments might still show them.

The files produced by this service are in conformation with the freedesktop.org specifications version 1.5.

  • command (string, gexp or file-like): The command to run, as passed to sh -c. If it is a gexp, it should evaluate to a string, and if it is file-like, it should point to an executable.
  • path (string, gexp or file-like): The PWD that command should be run in. If not specified, it uses whatever the desktop environment has default.
  • name (string): The name to give the .desktop file. If left blank, uses the command, which will error if command is not a string.
  • comment (string): A description or tooltip. By default, is the empty string.
  • terminal? (bool): Whether or not to run the program with a terminal.
  • prefer-dgpu? (bool): Whether or not to prefer a non-default, usually discrete, gpu.

This service can be extended with the same values as normal configuration.

direnv:

from (firefly home services direnv)

configures direnv, installs it to the home profile, and hooks into multiple shells.

There are two ways to use it.

(service home-direnv-service-type [home-direnv-configuration])

or

(home-direnv [home-direnv-configuration])

only the second one is able to configure shells. This is due to a limitation of guix, not providing ways to conditionally extend services, and not wishing to polute profiles with configuration files of shells that the user does not use.

home-direnv-configuration is a configuration record with the following fields:

  • direnv (file-like): the direnv package to add to the home profile. By default, the latest direnv.
  • direnv-bash (file-like): the bash package for direnv to evaluate .envrc files with.
  • bash-integration? (bool): Whether or not to set up a bash hook for direnv. Note: this may have issues if there are other extensions that manipulate the prompt. Check the docs.
  • zsh-integration? (bool): Whether or not to set up a zsh hook for direnv.
  • fish-integration? (bool or string): Whether or not to set up a fish hook. Can either be a bool, or one of the three modes that fish supports: eval_on_arrow, eval_after_arrow or disable_arrow.

note: I would love to add more shell hooks, however these are the only ones that have services for them in guix, as of yet.

  • nix-direnv? (bool): Use nix-direnv for nix integration with direnv. Conflicts with stdlib.
  • guix-cache? (bool): Use an implementation of use guix that adds a root for protection against garbage collection. Conflicts with stdlib.
  • erlang? (bool): Add support for erlang, using kerl through use kerl.
  • golang? (bool): Add support for the gb tool through layout golang command.
  • haskell? (bool): Add support for haskell through cabal and layout haskell.
  • opam? (bool): Add support for opam through use opam.
  • wine? (bool): Add support for wine through use wine [wine-exe].

note: No language or tool integrations install packages to the profile.

  • global (string alist): The global section of the direnv.toml. Should be an alist of keys to values. All datatypes should be entered as their guile counterparts. Check the docs: https://direnv.net/man/direnv.toml.1.html
  • whitelist (string alist): The whitelist section of the direnv.toml. Should be an alist of keys to values. All datatypes should be entered as their guile counterparts. Check the docs: https://direnv.net/man/direnv.toml.1.html
  • extra-content (string or gexp): Extra content to add to the end of the direnvrc file.

emacs:

from (firefly home services emacs)

runs the emacs server at user login.

(service emacs-server-service-type
 (emacs-server-configuration
 (emacs [emacs])
 (packages [packages])
 (args [args])
 (server-name [server-name])
 (service-name [service-name])))
  • emacs (file-like): The emacs package to use. By default, the most recent full emacs. Adds this package to the profile.
  • packages (manifest): A manifest of emacs packages/extensions to generate a profile for the server to run in. By default, empty.
  • args (list string): Any additional arguments to pass to the server on startup. By default, empty.
  • server-name (string): The name of the emacs server to open up. By default, doesn't specify a name so it's whatever emacs decides.
  • service-name (symbol): The name to give the shepherd service. By default, emacs-server. This is useful if you want to run multiple servers, for example if one is a computational server. This and server-name are meant to be used together.

load-profiles:

from (firefly home services load-profiles)

loads other profiles alongside the home profile in the .profile file.

(service home-load-profiles-service-type
 (list
	 [path-to-profile] ...))

xbindkeys:

from (firefly home services xbindkeys)

runs the xbindkeys daemon at login.

(service home-xbindkeys-service-type
 (home-xbindkeys-configuration
 (xbindkeys [xbindkeys])
 (rc <rc>)))
  • xbindkeys (file-like): The xbindkeys package to use. By default, the most recent.
  • rc (file-like or gexp): The configuration file. Should be in the guile style of xbindkeys rcs, or a gexp. Use xbindkeys --default-guile for an example.

This service provides a couple of utility actions to interact with xbindkeys without needing to include xbindkeys in the home profile, or symlink the rc.

xplr:

from (firefly home services xplr)

installs and configures xplr with plugins.

plugins are available in (firefly packages xplr)

Note: see notes on the xplr package for why this can't be upstreamed.

(service home-xplr-service-type
 (home-xplr-configuration
	 (xplr [xplr])
	 (version [version])
	 (plugins (list [plugin]
	 ...))
 (config [config])))
  • xplr (file-like): The xplr package to use. By default, the only one I have packaged.
  • version (file-like): The version of xplr to put in the config. If not supplied, will take from the given package.
  • plugins (list file-like or xplr-plugin-configuration): The xplr plugins to use. A list of packages or xplr-plugin-configuration records. If a package is given, then setup will be called with no arguments.
  • config (string or file-like)
(xplr-plugin-configuration
 (plugin <plugin>)
 (setup [setup])
 (cleanup? [cleanup?]))
  • plugin (file-like): The plugin to set up. To use arbitrary plugins, use guix download and the below xplr-plugin procedure.
  • setup (string): The code to call setup with. Defaults to "()".
  • cleanup? (bool): Whether or not to clean the package path before and after setting up the plugin. Set to #f if you need to require it later manually.