alacritty | ||
awesome | ||
bpytop | ||
chemacs | ||
dunst | ||
espanso | ||
eww | ||
firefox/chrome | ||
fish | ||
flameshot | ||
imv | ||
kanshi | ||
kmonad | ||
leftwm | ||
LightlyShaders | ||
lolcate | ||
macchina | ||
mako | ||
mpv | ||
networkmanager-dmenu | ||
nyxt | ||
oguri | ||
pkgs | ||
polybar | ||
qutebrowser | ||
rbw | ||
river | ||
rofi | ||
scripts | ||
surfingkeys | ||
sway | ||
sxiv/exec | ||
system | ||
systemd/user | ||
taiwins | ||
tridactyl | ||
user | ||
waybar | ||
wayfire | ||
wofi | ||
.gitmodules | ||
.mbsyncrc | ||
flake.lock | ||
flake.nix | ||
greenclip.toml | ||
libinput-gestures.conf | ||
picom.conf | ||
README.org | ||
xinitrc | ||
Xresources |
Readme
Welcome
This repository contains all of my dotfiles to the many programs I like to use on Linux. This is primarily built with NixOS and Emacs. This is done through literate programming. So basically this README file has all the source code for the entire system. (or at least it will once I get it all finished)
As is common in org-mode literate programming, I'm using a feature of org-mode to bring in config that exists elsewhere called org-babel tangle and noweb. The syntax <<something>>
brings in the named blocks that are above. Meaning that through this single document I can consolidate configuration. This may not work for you, but I prefer it.
You will see the blocks to be brought into the bracket syntax by a named section like #+NAME: …
This creates files that have everything in them, making them bigger and maybe filled with more things, but makes this document much easier to read and easier for me to handle things. Again, if this doesn't work for you, sorry it's just the way that I like to do it.
NixOS
The biggest part of this is through NixOS. NixOS is a declarative way of building an OS for Linux and allows an immutable and reproducible system. I really like that last part. I enjoy my config to be the same no matter how many machines I place it on. I'd also one day like this to be modular so that I'll have some switches that can turn on and off certain features.
Let's start with the core of this, the flake.
flake.nix
This is not a wholly complex setup with flakes. I've seen far more complex and unique ones. But the basic idea is to have a few of our inputs setup to bring in the expected pkgs and then output things to the correct system/user.
Note how in the outputs I do have some duplicated code. That is will disappear as I grow more accustomed to flakes and nix. Anyhow, the important things to gather in this file are that I'm making sure to use non-free software by making pkgs config = { allowUnfree = true; }
. This ensures that things like the non-free linux kernel are accessible.
Also, syl is my laptop and kaladin is my desktop. So those are going to be unique in the future.
Both include the home-manager module. Primarily I chose that route so that I could use the same command to update the entire system without needing to update the system and user stuff seperately.
{
description = "The Flake";
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
home-manager.url = "github:nix-community/home-manager/master";
home-manager.inputs.nixpkgs.follows = "nixpkgs";
};
outputs = { nixpkgs, home-manager, ... }:
let
system = "x86_64-linux";
username = "chris";
pkgs = import nixpkgs {
inherit system;
config = { allowUnfree = true; };
};
lib = nixpkgs.lib;
in {
nixosConfigurations = {
syl = lib.nixosSystem {
inherit system;
modules = [
./system/syl/configuration.nix
home-manager.nixosModules.home-manager
{
home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true;
home-manager.users.chris = import ./user/home.nix;
}
];
};
kaladin = lib.nixosSystem {
inherit system;
modules = [
./system/kaladin/configuration.nix
home-manager.nixosModules.home-manager
{
home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true;
home-manager.users.chris = import ./user/home.nix;
}
];
};
};
};
}
General
All my machines have these settings.
Every machine has it's own hardware config/
imports =
[
./hardware-configuration.nix
];
Let's make sure all the machines have their pkgs setup to be unstable and using the flake system.
nix = {
extraOptions = "experimental-features = nix-command flakes";
package = pkgs.nixFlakes;
};
I use plasma and awesome mostly as my desktop.
services.xserver = {
enable = true;
windowManager.awesome = {
enable = true;
package = pkgs.myAwesome;
};
displayManager.sddm.enable = true;
desktopManager.plasma5.enable = true;
};
To use pipewire there are some specific setup pieces that I like to have.
# Enable sound.
security.rtkit.enable = true;
services.pipewire = {
enable = true;
alsa.enable = true;
alsa.support32Bit = true;
pulse.enable = true;
wireplumber.enable = true;
};
# Needed for some pipewire progs
programs.dconf.enable = true;
To make sure certain things are setup properly I'll modify the shells a bit.
# Set default shell to be dash for speed
# Apparently this is bad because a lot of nix relies on bash
# environment.binsh = "${pkgs.dash}/bin/dash";
environment.variables = {
EDITOR = "emacsclient -t -a";
VISUAL = "emacsclient -c -a";
};
environment.homeBinInPath = true;
programs.fish.enable = true;
programs.zsh.enable = true;
Packages
Here are a list of packages that I like to have on all machines.
vim
wget
killall
discover
lightly-qt
pinentry
pinentry-qt
unzip
unrar
p7zip
zip
gzip
usbutils
binutils
hunspell
hunspellDicts.en_US
git
openssh
samba
ark
dash
kget
krename
kwallet-pam
plasma5Packages.kwallet
libimobiledevice
sddm-kcm
ydotool
bottles
exa
imv
feh
mpv
yt-dlp
rofi-emoji
nerdfonts
latte-dock
bat
alacritty
libsForQt5.bismuth
libnotify
rofi-wayland
ripgrep
fd
plocate
bc
sysstat
procs
pandoc
papirus-icon-theme
phinger-cursors
plasma-hud
kde-cli-tools
gzip
htop
btop
firefox
kate
kdialog
openlp
libreoffice-fresh
vlc
neochat
haskellPackages.greenclip
pulsemixer
any-nix-shell
wtype
xdotool
wmctrl
xcape
unclutter-xfixes
bluez-tools
networkmanager_dmenu
qt5ct
lxappearance
spotdl
kdenlive
ffmpeg
wlroots
picom-next
pamixer
jellyfin-mpv-shim
pfetch
Here are some dev tools that I often have on a few devices.
nix-index
meson
ninja
gnumake
gcc
gdb
clang
cmake
extra-cmake-modules
pkg-config
# LIBRARIES FOR DEV
qt5.qtbase
qt5.qtquickcontrols2
qt5.qtx11extras
libsForQt5.kirigami2
libsForQt5.ki18n
libsForQt5.kcoreaddons
fennel
Let's create our own custom LightlyShaders package. This is in it's own file for now.
(libsForQt5.callPackage ../../LightlyShaders {})
Here are the two main overlays I like to use. One for Emacs and another for the AwesomeWM.
nixpkgs.overlays = [
(import (builtins.fetchTarball {
url = https://github.com/nix-community/emacs-overlay/archive/master.tar.gz;
sha256 = "09rsqmz7i7lyays59b9600z11qqr6h6lcskw1zzp54yw2csxn2ix";
}))
(self: super:
{
myAwesome = super.awesome.overrideAttrs (old: rec {
pname = "myAwesome";
version = "git-20220508-c539e0e";
src = super.fetchFromGitHub {
owner = "awesomeWM";
repo = "awesome";
rev = "c539e0e4350a42f813952fc28dd8490f42d934b3";
sha256 = "EDAL7NnLF2BiVI8DAlEciiZtDmwXOzCPypGTrlN/OoQ=";
};
});
}
)
];
Emacs
Emacs service
services.emacs = {
enable = true;
package = with pkgs; ((emacsPackagesFor emacsPgtkNativeComp).emacsWithPackages (epkgs: [ epkgs.vterm epkgs.magit epkgs.pdf-tools pkgs.mu ]));
};
Syl
Syl is my laptop and has some configuration unique to that. In particular, it's a Framework Laptop. Honestly a great piece of tech. Love it.
Notice how I am including all of my software here. It may be a big file, but having all of it in one place means I can easily grok through it and remove something.
{ config, pkgs, callPackage, ... }:
{
<<hardware>>
<<experimental-features>>
# Use the systemd-boot EFI boot loader.
boot.kernelPackages = pkgs.linuxPackages_zen;
boot.loader.systemd-boot.enable = true;
boot.loader.efi.canTouchEfiVariables = true;
nixpkgs.config.allowUnfree = true;
boot.kernelParams = [ "mem_sleep_default=deep" ];
networking.hostName = "syl"; # Define your hostname.
networking.networkmanager.enable = true;
# networking.wireless.enable = true; # Enables wireless support via wpa_supplicant.
# Set your time zone.
time.timeZone = "America/Chicago";
# The global useDHCP flag is deprecated, therefore explicitly set to false here.
# Per-interface useDHCP will be mandatory in the future, so this generated config
# replicates the default behaviour.
networking.useDHCP = false;
networking.interfaces.wlp170s0.useDHCP = true;
# Select internationalisation properties.
i18n.defaultLocale = "en_US.UTF-8";
hardware.uinput.enable = true;
nixpkgs.config.packageOverrides = pkgs: {
vaapiIntel = pkgs.vaapiIntel.override { enableHybridCodec = true; };
};
hardware.opengl = {
enable = true;
extraPackages = with pkgs; [
intel-media-driver # LIBVA_DRIVER_NAME=iHD
vaapiIntel # LIBVA_DRIVER_NAME=i965 (older but works better for Firefox/Chromium)
vaapiVdpau
libvdpau-va-gl
];
};
<<desktop>>
# Configure keymap in X11
services.xserver.layout = "us";
# services.xserver.xkbOptions = "eurosign:e";
# Enable CUPS to print documents.
services.printing.enable = true;
services.printing.drivers = [ pkgs.gutenprint pkgs.gutenprintBin pkgs.hplipWithPlugin ];
# Enable fingerprint
services.fprintd.enable = true;
<<pipewire>>
# Turn on flatpak
services.flatpak.enable = true;
# Some other things
services.thermald.enable = true;
services.tlp = {
enable = true;
settings = {
CPU_SCALING_GOVERNOR_ON_AC="performance";
CPU_SCALING_GOVERNOR_ON_BAT="powersave";
CPU_ENERGY_PERF_POLICY_ON_AC="balance_performance";
CPU_ENERGY_PERF_POLICY_ON_BAT="power";
SCHED_POWERSAVE_ON_AC=0;
SCHED_POWERSAVE_ON_BAT=1;
START_CHARGE_THRESH_BAT1=70;
STOP_CHARGE_THRESH_BAT1=80;
USB_ALLOWLIST="32ac:0002";
};
};
services.usbmuxd.enable = true;
services.fstrim.enable = true;
# Enable touchpad support (enabled default in most desktopManager).
services.xserver.libinput.enable = true;
<<shell>>
# Define a user account. Don't forget to set a password with ‘passwd’.
users.users.chris = {
isNormalUser = true;
extraGroups = [ "wheel" "networkmanager" "input" "uinput" ];
};
programs.partition-manager.enable = true;
programs.kdeconnect.enable = true;
security.pam.services.kwallet = {
name = "kwallet";
enableKwallet = true;
};
security.pam.services.sddm.enableKwallet = true;
virtualisation.waydroid.enable = true;
# List packages installed in system profile. To search, run:
# $ nix search wget
environment.systemPackages = with pkgs; [
<<general-packages>>
neofetch
afetch
yafetch
freshfetch
disfetch
bunnyfetch
fet-sh
macchina
# Dev tools
<<dev-tools>>
<<lightlyshaders>>
];
<<overlays>>
<<emacs>>
# Some programs need SUID wrappers, can be configured further or are
# started in user sessions.
# programs.mtr.enable = true;
# programs.gnupg.agent = {
# enable = true;
# enableSSHSupport = true;
# };
# List services that you want to enable:
# Enable the OpenSSH daemon.
# services.openssh.enable = true;
# Open ports in the firewall.
# networking.firewall.allowedTCPPorts = [ ... ];
# networking.firewall.allowedUDPPorts = [ ... ];
# Or disable the firewall altogether.
# networking.firewall.enable = false;
# This value determines the NixOS release from which the default
# settings for stateful data, like file locations and database versions
# on your system were taken. It‘s perfectly fine and recommended to leave
# this value at the release version of the first install of this system.
# Before changing this value read the documentation for this option
# (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
system.stateVersion = "21.11"; # Did you read the comment?
}
Now in the hardware-configuration.nix
file, I didn't change much because I wanted to keep it roughly the same in case things do get overwritten, but this is another nice feature of literate programming, should things change in the /etc folder, I'll have this readme as a backup of what it was before the changes.
{ config, lib, pkgs, modulesPath, ... }:
{
imports =
[ (modulesPath + "/installer/scan/not-detected.nix")
];
boot.initrd.availableKernelModules = [ "xhci_pci" "thunderbolt" "nvme" "usb_storage" "sd_mod" ];
boot.initrd.kernelModules = [ ];
boot.kernelModules = [ "kvm-intel" "acpi_call" ];
boot.extraModulePackages = with config.boot.kernelPackages; [ acpi_call ];
fileSystems."/" =
{ device = "/dev/disk/by-uuid/500ad375-8fe0-4888-8f57-ee9d5ea1fd9f";
fsType = "btrfs";
options = [ "subvol=root" "noatime" "nodiratime" "ssd" "compress=zstd" "space_cache" ];
};
boot.initrd.luks.devices."enc".device = "/dev/disk/by-uuid/5db54453-8ae9-4ba0-b381-01255ac7d7f7";
fileSystems."/home" =
{ device = "/dev/disk/by-uuid/500ad375-8fe0-4888-8f57-ee9d5ea1fd9f";
fsType = "btrfs";
options = [ "subvol=home" "noatime" "nodiratime" "ssd" "compress=zstd" "space_cache" ];
};
fileSystems."/nix" =
{ device = "/dev/disk/by-uuid/500ad375-8fe0-4888-8f57-ee9d5ea1fd9f";
fsType = "btrfs";
options = [ "subvol=nix" "noatime" "nodiratime" "ssd" "compress=zstd" "space_cache" ];
};
fileSystems."/var/log" =
{ device = "/dev/disk/by-uuid/500ad375-8fe0-4888-8f57-ee9d5ea1fd9f";
fsType = "btrfs";
options = [ "subvol=log" "noatime" "nodiratime" "ssd" "compress=zstd" "space_cache" ];
neededForBoot = true;
};
fileSystems."/boot" =
{ device = "/dev/disk/by-uuid/E9C0-3E97";
fsType = "vfat";
};
swapDevices =
[ { device = "/dev/disk/by-uuid/4f3c6d93-3be2-480c-8be8-fb9200c06b0c"; }
];
powerManagement.cpuFreqGovernor = lib.mkDefault "powersave";
hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
# high-resolution display
hardware.video.hidpi.enable = lib.mkDefault true;
}
Kaladin
Kaladin is my desktop machine. A powerhouse for the most part with a recent i7 and 64gb of memory and an Nvidia 1080. Basically I use this for video editing, animation, and some other things. Here is it's configuration.
{ config, pkgs, ... }:
{
<<hardware>>
<<experimental-features>>
# Use the systemd-boot EFI boot loader.
boot.kernelPackages = pkgs.linuxPackages_zen;
boot.loader.systemd-boot.enable = true;
boot.loader.efi.canTouchEfiVariables = true;
nixpkgs.config.allowUnfree = true;
boot.kernelParams = [ "mem_sleep_default=deep" ];
networking.hostName = "kaladin"; # Define your hostname.
networking.networkmanager.enable = true;
# networking.wireless.enable = true; # Enables wireless support via wpa_supplicant.
# Set your time zone.
time.timeZone = "America/Chicago";
# The global useDHCP flag is deprecated, therefore explicitly set to false here.
# Per-interface useDHCP will be mandatory in the future, so this generated config
# replicates the default behaviour.
networking.useDHCP = false;
networking.interfaces.enp0s31f6.useDHCP = true;
networking.interfaces.wlp7s0.useDHCP = true;
# Select internationalisation properties.
i18n.defaultLocale = "en_US.UTF-8";
# Set default shell to be dash for speed
environment.binsh = "${pkgs.dash}/bin/dash";
# NVIDIA
services.xserver.videoDrivers = [ "nvidia" ];
hardware.opengl.enable = true;
<<desktop>>
# Configure keymap in X11
services.xserver.layout = "us";
# services.xserver.xkbOptions = "eurosign:e";
# Enable CUPS to print documents.
services.printing.enable = true;
services.printing.drivers = [ pkgs.gutenprint pkgs.gutenprintBin pkgs.hplipWithPlugin ];
<<pipewire>>
# Turn on flatpak
services.flatpak.enable = true;
services.usbmuxd.enable = true;
services.fstrim.enable = true;
<<shell>>
# Define a user account. Don't forget to set a password with ‘passwd’.
users.users.chris = {
isNormalUser = true;
extraGroups = [ "wheel" "networkmanager" "input" ]; # Enable ‘sudo’ for the user.
};
programs.partition-manager.enable = true;
programs.kdeconnect.enable = true;
security.pam.services.kwallet = {
name = "kwallet";
enableKwallet = true;
};
security.pam.services.sddm.enableKwallet = true;
virtualisation.waydroid.enable = true;
# List packages installed in system profile. To search, run:
# $ nix search wget
environment.systemPackages = with pkgs; [
<<general-packages>>
blender
neofetch
# Dev tools
<<dev-tools>>
];
<<overlays>>
<<emacs>>
# Some programs need SUID wrappers, can be configured further or are
# started in user sessions.
# programs.mtr.enable = true;
# programs.gnupg.agent = {
# enable = true;
# enableSSHSupport = true;
# };
# List services that you want to enable:
# Enable the OpenSSH daemon.
services.openssh.enable = true;
# Open ports in the firewall.
# networking.firewall.allowedTCPPorts = [ ... ];
# networking.firewall.allowedUDPPorts = [ ... ];
# Or disable the firewall altogether.
# networking.firewall.enable = false;
# This value determines the NixOS release from which the default
# settings for stateful data, like file locations and database versions
# on your system were taken. It‘s perfectly fine and recommended to leave
# this value at the release version of the first install of this system.
# Before changing this value read the documentation for this option
# (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
system.stateVersion = "21.11"; # Did you read the comment?
}
And here is it's hardware config.
{ config, lib, pkgs, modulesPath, ... }:
{
imports =
[ (modulesPath + "/installer/scan/not-detected.nix")
];
boot.initrd.availableKernelModules = [ "xhci_pci" "ahci" "nvme" "usbhid" "usb_storage" "sd_mod" "sr_mod" ];
boot.initrd.kernelModules = [ ];
boot.kernelModules = [ "kvm-intel" ];
boot.extraModulePackages = [ ];
fileSystems."/" =
{ device = "/dev/nvme0n1p2";
fsType = "btrfs";
options = [ "subvol=root" "noatime" "ssd" "space_cache" "compress=zstd" ];
};
fileSystems."/home" =
{ device = "/dev/nvme0n1p2";
fsType = "btrfs";
options = [ "subvol=home" "noatime" "ssd" "space_cache" "compress=zstd" ];
};
fileSystems."/boot" =
{ device = "/dev/disk/by-uuid/F9BD-D185";
fsType = "vfat";
};
swapDevices = [ ];
powerManagement.cpuFreqGovernor = lib.mkDefault "powersave";
hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
}
Kaladin is still not fullly setup, so I'll be working on that more and more as time goes.
Home
I also use home-manager for managing dotfiles. This means that everything is contained in this folder and then tangled out to their respective places when rebuilding the system.
Thanks!
EXTRA
Possible efibootmgr command to make efistub work on desktop
efibootmgr --disk /dev/nvme0n1 --part 1 --create --label "Arch Linux" --loader /boot/vmlinuz-linux-zen --unicode 'root=PARTUUID=d920ee9c-3b42-4c83-9c4c-a33406421ed1 rootflags=subvol=@ rw noatime nodiratime compress=zstd:3 ssd space_cache initrd=\initramfs-linux-zen.img' --verbose