This repository describes the setup of both my laptop and PC. It's a relatively large flake because I am very committed to reproducibility. The only things in my setup that don't exactly match what you will get from building this repository are some browser extensions, installed flatpaks, and my wallpapers.
To apply or update, install nix-direnv-flakes:
nix shell nixpkgs#nix-direnv-flakes
. Then run direnv allow
to enter the
environment. Finally, run "rebuild" or "update", respectively.
You can find configurations for different machines inside of the hosts/
directory. In order to build the configurations for different hosts instead
of the default, run rebuild laptop
or rebuild pc
.
Each host (both laptop and PC) have different configurations for nixpkgs. Unlike
configuration options such as environment.systemPackages
, it is not possible
to set these with modules. Therefore, each host has some settings (found in
hosts/[hostname]/default.nix
) which are imported and used in order to import
nixpkgs. Here is a snippet of code from the flake.nix, for example:
{
outputs = let
hosts = {
laptop = import ./hosts/laptop {
inherit nixpkgs;
hostname = "evil";
};
pc = import ./hosts/pc {
inherit nixpkgs;
hostname = "mutant";
};
};
in
{
nixosConfigurations = {
laptop = self.createNixosConfiguration hosts.laptop;
};
packages.${defaultGlobalSettings.system} = {
myPackages =
(finalizeSettings defaultGlobalSettings).pkgs.callPackage ./packages {};
};
};
}
On the last line, you can see that (finalizeSettings defaultGlobalSettings)
returns a set which includes pkgs
, which is the finished and imported
nixpkgs.
First, copy and paste the contents of hosts/laptop/default.nix
to
hosts/[yourhostname]/default.nix
. You can then edit the value found in the
hostname ? "evil",
line, to be whatever default hostname you prefer. Then
you can get into editing the settings.
Defaults to rosepine with the gtk-nix flake's gtk theme. Available themes include "drifter", "orchis", "nordicWithGtkNix", "nordic", "gtk4", "rosepine", "gruvbox", "gruvboxWithGtkNix", and "amber-forest".
Defaults to "x86_64-linux". This is the only tested system.
Defaults to "argus". Change it to whatever you want your primary user's username to be.
Boolean which, when set to true, adds the Dvorak programmer layout to X based environments, and makes it the default while in a TTY.
A list of strings with the names of unfree packages you would like to allow. It
always is merged with the contents of allowedUnfree from
lib/settings-defaults.nix
.
Defaults to false. Whether to allow broken packages. Useful when building with musl.
Unused. Additional values to be passed into all home-manager modules.
Unused. Additional values to be passed into all nixos modules.
List of paths to nix module files. These will be imported in addition to
user/primary/default.nix
.
A set which must contain at least the following:
{
unstable = _: _: {};
remotebuild = _: _: {};
localbuild = _: _: {};
}
Each of these is a function which will apply overlays. For example, if you want the steam package to be the version from the unstable branch, you could do the following:
{
unstable = unstable: _:
{
steam = unstable.steam;
};
remotebuild = _: _: {};
localbuild = _: _: {};
}
The second argument of the function is the original packageset.
A list of overlays to add to pkgs. Applied before packageSelections
.
Identical to additionalModules
except these will be added to the
nixpkgs.lib.nixosSystem
call.
A complex set which must at least contain the following:
{
optimization = {
arch = "";
useMusl = false;
useFlags = false;
useClang = false;
useNative = false;
USE = [];
};
}
Setting useFlags
to true will enable all of the custom build settings, and
cause pretty much all your packages to build from source. Add compiler flags
such as "-O3"
to the USE list.
This value must always be set to "pkgs".
Thise is merely a passthrough to config.nix
. Available values include things
like package
, gc
, distributedBuilds
, settings
, etc.
These are overrides which will be applied to the settings, but only for a single package set. Here are what they must contain at the bare minimum, respectively:
{
unstableOverrides = {
name = "unstable";
};
remotebuildOverrides = {
name = "remotebuild";
};
localbuildOverrides = {
name = "localbuild";
};
}
These can be used to select certain packages to have specific optimizations, or to be cross-compiled on a remote machine. For example:
{
packageSelections = {
# make firefox be selected from the "remotebuild" packageset
remotebuild = remotebuild: _:
with remotebuild; {
inherit firefox;
};
localbuild = _: _: {};
unstable = _: _: {};
};
# configure the remotebuild packageset to use fancy optimizations
remotebuildOverrides = {
optimization = {
useMusl = true;
useFlags = true;
useClang = true;
};
name = "remotebuild";
};
}