From 86706b1fc7bcfa84549bd7bbea5b53dd4b8fe24e Mon Sep 17 00:00:00 2001 From: Greg Burd Date: Mon, 25 Sep 2023 14:05:07 -0400 Subject: [PATCH] wimpy-ified inspired by wimpysworld nix-config --- .github/dependabot.yml | 7 + .github/workflows/build-iso.yml | 80 ++ .github/workflows/deadnix.yml | 16 + .github/workflows/flake-checker.yml | 22 + .github/workflows/lock-updater.yml | 25 + NOTES | 38 +- flake.lock | 301 +++---- flake.nix | 199 +++-- home/_mixins/console/default.nix | 185 ++++ home/_mixins/console/neofetch.conf | 842 ++++++++++++++++++ home/_mixins/desktop/audio-recorder.nix | 27 + home/_mixins/desktop/celluloid.nix | 14 + home/_mixins/desktop/dconf-editor.nix | 13 + home/_mixins/desktop/deckmaster-xl.nix | 27 + home/_mixins/desktop/default.nix | 47 + home/_mixins/desktop/emote.nix | 22 + home/_mixins/desktop/gitkraken.nix | 191 ++++ home/_mixins/desktop/gnome-sound-recorder.nix | 19 + home/_mixins/desktop/localsend.nix | 22 + home/_mixins/desktop/mate.nix | 363 ++++++++ home/_mixins/desktop/meld.nix | 19 + home/_mixins/desktop/pantheon.nix | 267 ++++++ home/_mixins/desktop/rhythmbox.nix | 22 + home/_mixins/desktop/sakura.conf | 75 ++ home/_mixins/desktop/sakura.nix | 10 + home/_mixins/desktop/tilix.nix | 86 ++ home/_mixins/desktop/vorta.nix | 22 + home/_mixins/services/keybase-gui.nix | 21 + home/_mixins/services/keybase.nix | 12 + home/_mixins/services/syncthing-tray.nix | 8 + home/_mixins/services/syncthing.nix | 16 + home/gburd/.gitconfig | 54 ++ home/gburd/{features => _mixins}/cli/bash.nix | 0 home/gburd/{features => _mixins}/cli/bat.nix | 0 .../{features => _mixins}/cli/default.nix | 7 +- .../{features => _mixins}/cli/direnv.nix | 0 home/gburd/{features => _mixins}/cli/fish.nix | 0 home/gburd/{features => _mixins}/cli/gh.nix | 0 home/gburd/{features => _mixins}/cli/git.nix | 2 +- .../cli/gpg-commands.nix | 0 home/gburd/{features => _mixins}/cli/gpg.nix | 9 +- .../{features => _mixins}/cli/jujutsu.nix | 0 .../{features => _mixins}/cli/nix-index.nix | 0 .../{features => _mixins}/cli/pfetch.nix | 0 .../{features => _mixins}/cli/ranger.nix | 0 .../{features => _mixins}/cli/screen.nix | 0 .../{features => _mixins}/cli/shellcolor.nix | 0 home/gburd/{features => _mixins}/cli/ssh.nix | 0 .../{features => _mixins}/cli/starship.nix | 31 +- home/gburd/{features => _mixins}/cli/xpo.nix | 0 home/gburd/{global => _mixins}/default.nix | 12 +- .../desktop/common/alacritty.nix | 0 .../desktop/common/default.nix | 2 +- .../desktop/common/deluge.nix | 0 .../desktop/common/discord.nix | 2 +- .../desktop/common/dragon.nix | 0 home/gburd/_mixins/desktop/common/firefox.nix | 127 +++ .../desktop/common/font.nix | 0 .../desktop/common/gnome-wm/default.nix | 12 +- .../desktop/common/gtk.nix | 0 .../desktop/common/kdeconnect.nix | 2 +- .../desktop/common/pavucontrol.nix | 0 .../desktop/common/playerctl.nix | 0 .../desktop/common/protonmail-bridge.nix | 0 .../desktop/common/qt.nix | 2 +- .../desktop/common/slack.nix | 0 .../desktop/common/sublime-music.nix | 2 +- .../desktop/common/wayland-wm/default.nix | 0 .../desktop/common/wayland-wm/gammastep.nix | 0 .../common/wayland-wm/hyprland-vnc.nix | 0 .../desktop/common/wayland-wm/kitty.nix | 0 .../desktop/common/wayland-wm/mako.nix | 0 .../desktop/common/wayland-wm/qutebrowser.nix | 2 +- .../desktop/common/wayland-wm/swayidle.nix | 0 .../desktop/common/wayland-wm/swaylock.nix | 0 .../desktop/common/wayland-wm/waybar.nix | 0 .../desktop/common/wayland-wm/wezterm.nix | 2 +- .../common/wayland-wm/wofi-run-shell.patch | 0 .../desktop/common/wayland-wm/wofi.nix | 0 .../desktop/common/wayland-wm/zathura.nix | 0 .../desktop/gnome/default.nix | 2 +- .../desktop/gnome/tty-init.nix | 0 .../desktop/wireless/default.nix | 0 .../desktop/wireless/wpa-gui.nix | 0 .../{features => _mixins}/emacs/burd.org | 0 .../{features => _mixins}/emacs/default.nix | 0 .../gburd/{features => _mixins}/emacs/init.el | 0 .../{features => _mixins}/emacs/theme.nix | 0 .../{features => _mixins}/games/default.nix | 2 +- .../{features => _mixins}/games/steam.nix | 0 .../{features => _mixins}/helix/default.nix | 0 .../{features => _mixins}/helix/theme.nix | 2 +- .../{features => _mixins}/music/default.nix | 0 .../{features => _mixins}/nvim/default.nix | 0 home/gburd/{features => _mixins}/nvim/lsp.nix | 0 .../{features => _mixins}/nvim/syntaxes.nix | 0 .../{features => _mixins}/nvim/theme.nix | 0 home/gburd/{features => _mixins}/nvim/ui.nix | 0 .../{features => _mixins}/pass/default.nix | 0 .../productivity/default.nix | 0 .../productivity/khal.nix | 0 .../productivity/khard.nix | 0 .../productivity/mail.nix | 4 +- home/gburd/_mixins/productivity/neomutt.nix | 232 +++++ .../productivity/todoman.nix | 0 .../productivity/vdirsyncer.nix | 2 +- .../{features => _mixins}/rgb/default.nix | 0 home/gburd/desktop.nix | 29 + home/gburd/face.png | Bin 0 -> 33951 bytes .../gburd/features/desktop/common/firefox.nix | 127 --- home/gburd/features/productivity/keyring.nix | 1 - home/gburd/features/productivity/neomutt.nix | 230 ----- home/gburd/floki.nix | 196 +++- home/gburd/wallpapers/default.nix | 9 - home/gburd/wallpapers/from_album.sh | 23 - home/gburd/wallpapers/list.json | 8 - home/gburd/wallpapers/single_image.sh | 14 - home/nixos/default.nix | 3 + home/nixos/face.png | Bin 0 -> 15555 bytes hosts/common/optional/pipewire.nix | 11 - hosts/common/optional/quietboot.nix | 24 - hosts/common/optional/x11-keymap.nix | 8 - hosts/common/users/gburd/default.nix | 42 - hosts/floki/default.nix | 59 -- hosts/floki/hardware-configuration.nix | 48 - hydra.nix | 2 +- lib/default.nix | 9 + lib/helpers.nix | 29 + modules/home-manager/monitors.nix | 1 - modules/home-manager/pass-secret-service.nix | 3 +- nixos/_mixins/desktop/chromium-extensions.nix | 14 + nixos/_mixins/desktop/chromium.nix | 28 + nixos/_mixins/desktop/default.nix | 54 ++ nixos/_mixins/desktop/evolution.nix | 9 + nixos/_mixins/desktop/firefox.nix | 7 + nixos/_mixins/desktop/mate-apps.nix | 20 + nixos/_mixins/desktop/mate.nix | 87 ++ nixos/_mixins/desktop/obs-studio.nix | 35 + nixos/_mixins/desktop/pantheon-apps.nix | 30 + nixos/_mixins/desktop/pantheon.nix | 56 ++ nixos/_mixins/desktop/qt-style.nix | 18 + nixos/_mixins/desktop/steam.nix | 15 + nixos/_mixins/desktop/ungoogled-chromium.nix | 28 + nixos/_mixins/desktop/vscode.nix | 131 +++ .../common => nixos/_mixins}/global/acme.nix | 2 +- .../_mixins}/global/auto-upgrade.nix | 0 .../_mixins}/global/default.nix | 2 +- .../common => nixos/_mixins}/global/fish.nix | 0 .../_mixins}/global/locale.nix | 0 .../common => nixos/_mixins}/global/nix.nix | 0 .../_mixins}/global/openssh.nix | 8 +- .../_mixins}/global/optin-persistence.nix | 0 .../_mixins}/global/podman.nix | 0 .../common => nixos/_mixins}/global/sops.nix | 2 +- .../_mixins}/global/ssh-serve-store.nix | 2 +- .../_mixins}/global/steam-hardware.nix | 0 .../_mixins}/global/systemd-initrd.nix | 0 .../_mixins}/global/tailscale.nix | 0 nixos/_mixins/hardware/gpd-dsi.nix | 6 + nixos/_mixins/hardware/gpd-edp.nix | 6 + nixos/_mixins/hardware/gpd-generic.nix | 11 + nixos/_mixins/hardware/gpd-win-max.nix | 19 + nixos/_mixins/hardware/streamdeck.nix | 34 + nixos/_mixins/hardware/systemd-boot.nix | 12 + .../_mixins}/optional/btrfs.nix | 14 +- .../_mixins}/optional/ckb-next.nix | 0 .../_mixins}/optional/docker.nix | 0 .../_mixins}/optional/encrypted-root.nix | 2 +- .../_mixins}/optional/ephemeral-btrfs.nix | 0 .../_mixins}/optional/fail2ban.nix | 0 .../_mixins}/optional/gamemode.nix | 0 .../_mixins}/optional/gnome.nix | 14 +- .../_mixins}/optional/lol-acfix.nix | 0 .../_mixins}/optional/mysql.nix | 0 .../_mixins}/optional/nginx.nix | 3 +- .../_mixins}/optional/pantheon.nix | 0 .../_mixins}/optional/postgres.nix | 2 +- .../_mixins}/optional/starcitizen-fixes.nix | 0 .../_mixins}/optional/systemd-boot.nix | 0 .../_mixins}/optional/tailscale-exit-node.nix | 0 .../_mixins}/optional/wireless.nix | 2 +- .../_mixins}/optional/wireshark.nix | 0 .../_mixins}/optional/x11-no-suspend.nix | 0 {hosts/common => nixos/_mixins}/secrets.yaml | 0 nixos/_mixins/services/avahi.nix | 8 + nixos/_mixins/services/bluetooth.nix | 13 + nixos/_mixins/services/cups.nix | 10 + nixos/_mixins/services/firewall.nix | 31 + nixos/_mixins/services/flatpak.nix | 10 + nixos/_mixins/services/homepage.nix | 39 + nixos/_mixins/services/kmscon.nix | 16 + nixos/_mixins/services/maestral.nix | 8 + nixos/_mixins/services/networkmanager.nix | 18 + nixos/_mixins/services/openrazer.nix | 17 + nixos/_mixins/services/openssh.nix | 22 + nixos/_mixins/services/pipewire.nix | 22 + nixos/_mixins/services/sane.nix | 13 + nixos/_mixins/services/smartmon.nix | 11 + nixos/_mixins/services/tailscale.nix | 10 + nixos/_mixins/services/zerotier.nix | 19 + nixos/_mixins/users/gburd/default.nix | 95 ++ nixos/_mixins/users/nixos/default.nix | 107 +++ nixos/_mixins/users/nixos/desktop.nix | 14 + nixos/_mixins/users/root/default.nix | 7 + nixos/_mixins/virt/default.nix | 25 + nixos/floki/default.nix | 86 ++ nixos/floki/disks.nix | 44 + {hosts => nixos}/floki/secrets.yaml | 0 .../floki/ssh_host_ed25519_key.pub | 0 {hosts => nixos}/floki/ssh_host_rsa_key.pub | 0 nixos/iso-console/default.nix | 4 + nixos/iso-desktop/default.nix | 9 + nixpkgs.nix | 8 + overlays/default.nix | 13 +- pkgs/formats/default.nix | 4 +- pkgs/pass-wofi/default.nix | 2 - shell.nix | 19 +- templates/c/flake.nix | 2 +- templates/haskell/flake.nix | 2 +- templates/node/flake.nix | 2 +- templates/rust/flake.nix | 2 +- 221 files changed, 4788 insertions(+), 1003 deletions(-) create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/build-iso.yml create mode 100644 .github/workflows/deadnix.yml create mode 100644 .github/workflows/flake-checker.yml create mode 100644 .github/workflows/lock-updater.yml create mode 100644 home/_mixins/console/default.nix create mode 100644 home/_mixins/console/neofetch.conf create mode 100644 home/_mixins/desktop/audio-recorder.nix create mode 100644 home/_mixins/desktop/celluloid.nix create mode 100644 home/_mixins/desktop/dconf-editor.nix create mode 100644 home/_mixins/desktop/deckmaster-xl.nix create mode 100644 home/_mixins/desktop/default.nix create mode 100644 home/_mixins/desktop/emote.nix create mode 100644 home/_mixins/desktop/gitkraken.nix create mode 100644 home/_mixins/desktop/gnome-sound-recorder.nix create mode 100644 home/_mixins/desktop/localsend.nix create mode 100644 home/_mixins/desktop/mate.nix create mode 100644 home/_mixins/desktop/meld.nix create mode 100644 home/_mixins/desktop/pantheon.nix create mode 100644 home/_mixins/desktop/rhythmbox.nix create mode 100644 home/_mixins/desktop/sakura.conf create mode 100644 home/_mixins/desktop/sakura.nix create mode 100644 home/_mixins/desktop/tilix.nix create mode 100644 home/_mixins/desktop/vorta.nix create mode 100644 home/_mixins/services/keybase-gui.nix create mode 100644 home/_mixins/services/keybase.nix create mode 100644 home/_mixins/services/syncthing-tray.nix create mode 100644 home/_mixins/services/syncthing.nix create mode 100644 home/gburd/.gitconfig rename home/gburd/{features => _mixins}/cli/bash.nix (100%) rename home/gburd/{features => _mixins}/cli/bat.nix (100%) rename home/gburd/{features => _mixins}/cli/default.nix (88%) rename home/gburd/{features => _mixins}/cli/direnv.nix (100%) rename home/gburd/{features => _mixins}/cli/fish.nix (100%) rename home/gburd/{features => _mixins}/cli/gh.nix (100%) rename home/gburd/{features => _mixins}/cli/git.nix (98%) rename home/gburd/{features => _mixins}/cli/gpg-commands.nix (100%) rename home/gburd/{features => _mixins}/cli/gpg.nix (89%) rename home/gburd/{features => _mixins}/cli/jujutsu.nix (100%) rename home/gburd/{features => _mixins}/cli/nix-index.nix (100%) rename home/gburd/{features => _mixins}/cli/pfetch.nix (100%) rename home/gburd/{features => _mixins}/cli/ranger.nix (100%) rename home/gburd/{features => _mixins}/cli/screen.nix (100%) rename home/gburd/{features => _mixins}/cli/shellcolor.nix (100%) rename home/gburd/{features => _mixins}/cli/ssh.nix (100%) rename home/gburd/{features => _mixins}/cli/starship.nix (82%) rename home/gburd/{features => _mixins}/cli/xpo.nix (100%) rename home/gburd/{global => _mixins}/default.nix (80%) rename home/gburd/{features => _mixins}/desktop/common/alacritty.nix (100%) rename home/gburd/{features => _mixins}/desktop/common/default.nix (90%) rename home/gburd/{features => _mixins}/desktop/common/deluge.nix (100%) rename home/gburd/{features => _mixins}/desktop/common/discord.nix (99%) rename home/gburd/{features => _mixins}/desktop/common/dragon.nix (100%) create mode 100644 home/gburd/_mixins/desktop/common/firefox.nix rename home/gburd/{features => _mixins}/desktop/common/font.nix (100%) rename home/gburd/{features => _mixins}/desktop/common/gnome-wm/default.nix (75%) rename home/gburd/{features => _mixins}/desktop/common/gtk.nix (100%) rename home/gburd/{features => _mixins}/desktop/common/kdeconnect.nix (98%) rename home/gburd/{features => _mixins}/desktop/common/pavucontrol.nix (100%) rename home/gburd/{features => _mixins}/desktop/common/playerctl.nix (100%) rename home/gburd/{features => _mixins}/desktop/common/protonmail-bridge.nix (100%) rename home/gburd/{features => _mixins}/desktop/common/qt.nix (85%) rename home/gburd/{features => _mixins}/desktop/common/slack.nix (100%) rename home/gburd/{features => _mixins}/desktop/common/sublime-music.nix (86%) rename home/gburd/{features => _mixins}/desktop/common/wayland-wm/default.nix (100%) rename home/gburd/{features => _mixins}/desktop/common/wayland-wm/gammastep.nix (100%) rename home/gburd/{features => _mixins}/desktop/common/wayland-wm/hyprland-vnc.nix (100%) rename home/gburd/{features => _mixins}/desktop/common/wayland-wm/kitty.nix (100%) rename home/gburd/{features => _mixins}/desktop/common/wayland-wm/mako.nix (100%) rename home/gburd/{features => _mixins}/desktop/common/wayland-wm/qutebrowser.nix (99%) rename home/gburd/{features => _mixins}/desktop/common/wayland-wm/swayidle.nix (100%) rename home/gburd/{features => _mixins}/desktop/common/wayland-wm/swaylock.nix (100%) rename home/gburd/{features => _mixins}/desktop/common/wayland-wm/waybar.nix (100%) rename home/gburd/{features => _mixins}/desktop/common/wayland-wm/wezterm.nix (98%) rename home/gburd/{features => _mixins}/desktop/common/wayland-wm/wofi-run-shell.patch (100%) rename home/gburd/{features => _mixins}/desktop/common/wayland-wm/wofi.nix (100%) rename home/gburd/{features => _mixins}/desktop/common/wayland-wm/zathura.nix (100%) rename home/gburd/{features => _mixins}/desktop/gnome/default.nix (91%) rename home/gburd/{features => _mixins}/desktop/gnome/tty-init.nix (100%) rename home/gburd/{features => _mixins}/desktop/wireless/default.nix (100%) rename home/gburd/{features => _mixins}/desktop/wireless/wpa-gui.nix (100%) rename home/gburd/{features => _mixins}/emacs/burd.org (100%) rename home/gburd/{features => _mixins}/emacs/default.nix (100%) rename home/gburd/{features => _mixins}/emacs/init.el (100%) rename home/gburd/{features => _mixins}/emacs/theme.nix (100%) rename home/gburd/{features => _mixins}/games/default.nix (79%) rename home/gburd/{features => _mixins}/games/steam.nix (100%) rename home/gburd/{features => _mixins}/helix/default.nix (100%) rename home/gburd/{features => _mixins}/helix/theme.nix (96%) rename home/gburd/{features => _mixins}/music/default.nix (100%) rename home/gburd/{features => _mixins}/nvim/default.nix (100%) rename home/gburd/{features => _mixins}/nvim/lsp.nix (100%) rename home/gburd/{features => _mixins}/nvim/syntaxes.nix (100%) rename home/gburd/{features => _mixins}/nvim/theme.nix (100%) rename home/gburd/{features => _mixins}/nvim/ui.nix (100%) rename home/gburd/{features => _mixins}/pass/default.nix (100%) rename home/gburd/{features => _mixins}/productivity/default.nix (100%) rename home/gburd/{features => _mixins}/productivity/khal.nix (100%) rename home/gburd/{features => _mixins}/productivity/khard.nix (100%) rename home/gburd/{features => _mixins}/productivity/mail.nix (97%) create mode 100644 home/gburd/_mixins/productivity/neomutt.nix rename home/gburd/{features => _mixins}/productivity/todoman.nix (100%) rename home/gburd/{features => _mixins}/productivity/vdirsyncer.nix (98%) rename home/gburd/{features => _mixins}/rgb/default.nix (100%) create mode 100644 home/gburd/desktop.nix create mode 100644 home/gburd/face.png delete mode 100644 home/gburd/features/desktop/common/firefox.nix delete mode 100644 home/gburd/features/productivity/keyring.nix delete mode 100644 home/gburd/features/productivity/neomutt.nix delete mode 100644 home/gburd/wallpapers/default.nix delete mode 100755 home/gburd/wallpapers/from_album.sh delete mode 100644 home/gburd/wallpapers/list.json delete mode 100755 home/gburd/wallpapers/single_image.sh create mode 100644 home/nixos/default.nix create mode 100644 home/nixos/face.png delete mode 100644 hosts/common/optional/pipewire.nix delete mode 100644 hosts/common/optional/quietboot.nix delete mode 100644 hosts/common/optional/x11-keymap.nix delete mode 100644 hosts/common/users/gburd/default.nix delete mode 100644 hosts/floki/default.nix delete mode 100644 hosts/floki/hardware-configuration.nix create mode 100644 lib/default.nix create mode 100644 lib/helpers.nix create mode 100644 nixos/_mixins/desktop/chromium-extensions.nix create mode 100644 nixos/_mixins/desktop/chromium.nix create mode 100644 nixos/_mixins/desktop/default.nix create mode 100644 nixos/_mixins/desktop/evolution.nix create mode 100644 nixos/_mixins/desktop/firefox.nix create mode 100644 nixos/_mixins/desktop/mate-apps.nix create mode 100644 nixos/_mixins/desktop/mate.nix create mode 100644 nixos/_mixins/desktop/obs-studio.nix create mode 100644 nixos/_mixins/desktop/pantheon-apps.nix create mode 100644 nixos/_mixins/desktop/pantheon.nix create mode 100644 nixos/_mixins/desktop/qt-style.nix create mode 100644 nixos/_mixins/desktop/steam.nix create mode 100644 nixos/_mixins/desktop/ungoogled-chromium.nix create mode 100644 nixos/_mixins/desktop/vscode.nix rename {hosts/common => nixos/_mixins}/global/acme.nix (94%) rename {hosts/common => nixos/_mixins}/global/auto-upgrade.nix (100%) rename {hosts/common => nixos/_mixins}/global/default.nix (97%) rename {hosts/common => nixos/_mixins}/global/fish.nix (100%) rename {hosts/common => nixos/_mixins}/global/locale.nix (100%) rename {hosts/common => nixos/_mixins}/global/nix.nix (100%) rename {hosts/common => nixos/_mixins}/global/openssh.nix (77%) rename {hosts/common => nixos/_mixins}/global/optin-persistence.nix (100%) rename {hosts/common => nixos/_mixins}/global/podman.nix (100%) rename {hosts/common => nixos/_mixins}/global/sops.nix (89%) rename {hosts/common => nixos/_mixins}/global/ssh-serve-store.nix (94%) rename {hosts/common => nixos/_mixins}/global/steam-hardware.nix (100%) rename {hosts/common => nixos/_mixins}/global/systemd-initrd.nix (100%) rename {hosts/common => nixos/_mixins}/global/tailscale.nix (100%) create mode 100644 nixos/_mixins/hardware/gpd-dsi.nix create mode 100644 nixos/_mixins/hardware/gpd-edp.nix create mode 100644 nixos/_mixins/hardware/gpd-generic.nix create mode 100644 nixos/_mixins/hardware/gpd-win-max.nix create mode 100644 nixos/_mixins/hardware/streamdeck.nix create mode 100644 nixos/_mixins/hardware/systemd-boot.nix rename {hosts/common => nixos/_mixins}/optional/btrfs.nix (66%) rename {hosts/common => nixos/_mixins}/optional/ckb-next.nix (100%) rename {hosts/common => nixos/_mixins}/optional/docker.nix (100%) rename {hosts/common => nixos/_mixins}/optional/encrypted-root.nix (95%) rename {hosts/common => nixos/_mixins}/optional/ephemeral-btrfs.nix (100%) rename {hosts/common => nixos/_mixins}/optional/fail2ban.nix (100%) rename {hosts/common => nixos/_mixins}/optional/gamemode.nix (100%) rename {hosts/common => nixos/_mixins}/optional/gnome.nix (72%) rename {hosts/common => nixos/_mixins}/optional/lol-acfix.nix (100%) rename {hosts/common => nixos/_mixins}/optional/mysql.nix (100%) rename {hosts/common => nixos/_mixins}/optional/nginx.nix (97%) rename {hosts/common => nixos/_mixins}/optional/pantheon.nix (100%) rename {hosts/common => nixos/_mixins}/optional/postgres.nix (89%) rename {hosts/common => nixos/_mixins}/optional/starcitizen-fixes.nix (100%) rename {hosts/common => nixos/_mixins}/optional/systemd-boot.nix (100%) rename {hosts/common => nixos/_mixins}/optional/tailscale-exit-node.nix (100%) rename {hosts/common => nixos/_mixins}/optional/wireless.nix (98%) rename {hosts/common => nixos/_mixins}/optional/wireshark.nix (100%) rename {hosts/common => nixos/_mixins}/optional/x11-no-suspend.nix (100%) rename {hosts/common => nixos/_mixins}/secrets.yaml (100%) create mode 100644 nixos/_mixins/services/avahi.nix create mode 100644 nixos/_mixins/services/bluetooth.nix create mode 100644 nixos/_mixins/services/cups.nix create mode 100644 nixos/_mixins/services/firewall.nix create mode 100644 nixos/_mixins/services/flatpak.nix create mode 100644 nixos/_mixins/services/homepage.nix create mode 100644 nixos/_mixins/services/kmscon.nix create mode 100644 nixos/_mixins/services/maestral.nix create mode 100644 nixos/_mixins/services/networkmanager.nix create mode 100644 nixos/_mixins/services/openrazer.nix create mode 100644 nixos/_mixins/services/openssh.nix create mode 100644 nixos/_mixins/services/pipewire.nix create mode 100644 nixos/_mixins/services/sane.nix create mode 100644 nixos/_mixins/services/smartmon.nix create mode 100644 nixos/_mixins/services/tailscale.nix create mode 100644 nixos/_mixins/services/zerotier.nix create mode 100644 nixos/_mixins/users/gburd/default.nix create mode 100644 nixos/_mixins/users/nixos/default.nix create mode 100644 nixos/_mixins/users/nixos/desktop.nix create mode 100644 nixos/_mixins/users/root/default.nix create mode 100644 nixos/_mixins/virt/default.nix create mode 100644 nixos/floki/default.nix create mode 100644 nixos/floki/disks.nix rename {hosts => nixos}/floki/secrets.yaml (100%) rename {hosts => nixos}/floki/ssh_host_ed25519_key.pub (100%) rename {hosts => nixos}/floki/ssh_host_rsa_key.pub (100%) create mode 100644 nixos/iso-console/default.nix create mode 100644 nixos/iso-desktop/default.nix create mode 100644 nixpkgs.nix diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..d202a33 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,7 @@ +version: 2 +updates: + - package-ecosystem: "github-actions" + directory: "/" + schedule: + # Check for updates to GitHub Actions every week + interval: "weekly" diff --git a/.github/workflows/build-iso.yml b/.github/workflows/build-iso.yml new file mode 100644 index 0000000..ad6ee92 --- /dev/null +++ b/.github/workflows/build-iso.yml @@ -0,0 +1,80 @@ +name: Build πŸ—οΈ and Publish πŸ“€ + +on: + push: + tags: ['*'] + +jobs: + create-release: + name: Create Release + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v4 + - name: Create release ${{ github.ref }} as a draft + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + gh release create "${{ github.ref }}" --draft --generate-notes + + build-console-iso: + needs: [create-release] + name: Console ISO + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v4 + - uses: DeterminateSystems/nix-installer-action@v4 + - uses: DeterminateSystems/magic-nix-cache-action@v2 + - name: Build Console ISO + run: | + nix build .#nixosConfigurations.iso-console.config.system.build.isoImage + mkdir iso || true + ISO=$(head -n1 result/nix-support/hydra-build-products | cut -d'/' -f6) + sudo mv "result/iso/${ISO}" iso/console-${ISO} + sha256sum "iso/console-${ISO}" > "iso/console-${ISO}.sha256" + sed -i -r "s/ .*\/(.+)/ \1/g" "iso/console-${ISO}.sha256" + - name: Upload Console ISO + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + for artefact in "iso/"*; do + gh release upload "${{ github.ref }}" "${artefact}" --clobber + done + + build-desktop-iso: + needs: [create-release] + name: Desktop ISO + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v4 + - uses: DeterminateSystems/nix-installer-action@v4 + - uses: DeterminateSystems/magic-nix-cache-action@v2 + - name: Build Desktop ISO + run: | + nix build .#nixosConfigurations.iso-desktop.config.system.build.isoImage + mkdir iso || true + ISO=$(head -n1 result/nix-support/hydra-build-products | cut -d'/' -f6) + sudo mv "result/iso/${ISO}" iso/desktop-${ISO} + sha256sum "iso/desktop-${ISO}" > "iso/desktop-${ISO}.sha256" + sed -i -r "s/ .*\/(.+)/ \1/g" "iso/desktop-${ISO}.sha256" + - name: Upload Desktop ISO + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + for artefact in "iso/"*; do + gh release upload "${{ github.ref }}" "${artefact}" --clobber + done + + publish-release: + name: Publish Release + needs: [build-console-iso, build-desktop-iso] + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v4 + - name: Publish release ${{ github.ref }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + if [ "$(gh release view "${{ github.ref }}" --json assets --template '{{len .assets}}')" -lt 0 ]; then + exit 1 + fi + gh release edit "${{ github.ref }}" --draft=false diff --git a/.github/workflows/deadnix.yml b/.github/workflows/deadnix.yml new file mode 100644 index 0000000..ba62fd0 --- /dev/null +++ b/.github/workflows/deadnix.yml @@ -0,0 +1,16 @@ +name: Dead 😡 Nix ❄️ Analysis πŸ”οΈ + +on: + push: + branches: + - main + +jobs: + deadnix: + name: Dead Nix Analysis + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v4 + - uses: DeterminateSystems/nix-installer-action@v4 + - uses: DeterminateSystems/magic-nix-cache-action@v2 + - uses: astro/deadnix-action@v1 diff --git a/.github/workflows/flake-checker.yml b/.github/workflows/flake-checker.yml new file mode 100644 index 0000000..a93d972 --- /dev/null +++ b/.github/workflows/flake-checker.yml @@ -0,0 +1,22 @@ +name: Flake ❄️ Checker βœ… + +on: + push: + branches: + - main + schedule: + # l33t o'clock + - cron: '37 13 * * *' + workflow_dispatch: + +jobs: + flake-checker: + name: Flake Checker + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - uses: DeterminateSystems/nix-installer-action@v4 + - uses: DeterminateSystems/magic-nix-cache-action@v2 + - uses: DeterminateSystems/flake-checker-action@v5 diff --git a/.github/workflows/lock-updater.yml b/.github/workflows/lock-updater.yml new file mode 100644 index 0000000..efe1771 --- /dev/null +++ b/.github/workflows/lock-updater.yml @@ -0,0 +1,25 @@ +name: Flake ❄️ Lock πŸ”’οΈ Updater ✨ + +on: + schedule: + # Pi o'clock + - cron: '3 14 * * 1,5' + workflow_dispatch: + +jobs: + lock-updater: + name: Flake Lock Updater + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - uses: DeterminateSystems/nix-installer-action@v4 + - uses: DeterminateSystems/magic-nix-cache-action@v2 + - uses: DeterminateSystems/update-flake-lock@v20 + with: + pr-title: "chore: update flake.lock" + # Labels to be set on the PR + pr-labels: | + dependencies + automated diff --git a/NOTES b/NOTES index 495ec44..96ce12b 100644 --- a/NOTES +++ b/NOTES @@ -21,6 +21,9 @@ * swap (see: https://discourse.nixos.org/t/how-do-i-set-up-a-swap-file/8323/7) * udevadm trigger +nh os switch --ask + + INSTALL: export device=/dev/nvme0n1 export hostname=floki @@ -93,25 +96,24 @@ clear; sudo nixos-rebuild dry-activate --flake .#${hostname} https://mt-caret.github.io/blog/posts/2020-06-29-optin-state.html https://hoverbear.org/blog/declarative-gnome-configuration-in-nixos/ - +https://github.com/wimpysworld/nix-config +https://github.com/Misterio77/nix-config +https://github.com/Misterio77/nix-starter-configs ------------------------------------------ +TODO: + +* agenix: alternative to sops/age for secrets + agenix.url = "github:ryantm/agenix"; + agenix.inputs.nixpkgs.follows = "nixpkgs"; +* "yet-another-nix-helper" https://github.com/viperML/nh +* declarative disk partitioning/formatting + https://github.com/nix-community/disko +* https://aria2.github.io/ +* https://github.com/schollz/croc + ------------------------------------------ +EXAMPLE COMMANDS: - -building the system configuration... -warning: Git tree '/home/gburd/ws/nix-config' is dirty -trace: warning: optionsDocBook is deprecated since 23.11 and will be removed in 24.05 -trace: warning: optionsDocBook is deprecated since 23.11 and will be removed in 24.05 -trace: warning: optionsDocBook is deprecated since 23.11 and will be removed in 24.05 -would stop the following units: ModemManager.service, NetworkManager-wait-online.service, NetworkManager.service, accounts-daemon.service, alsa-store.service, audit.service, avahi-daemon.service, avahi-daemon.socket, bluetooth.service, bolt.service, colord.service, cpufreq.service, kmod-static-nodes.service, logrotate-checkconf.service, mount-pstore.service, network-local-commands.service, network-setup.service, nscd.service, power-profiles-daemon.service, resolvconf.service, rtkit-daemon.service, systemd-machined.service, systemd-modules-load.service, systemd-oomd.service, systemd-oomd.socket, systemd-sysctl.service, systemd-timesyncd.service, systemd-udevd-control.socket, systemd-udevd-kernel.socket, systemd-udevd.service, systemd-update-done.service, udisks2.service, upower.service, wpa_supplicant.service -would NOT stop the following changed units: display-manager.service, getty@tty1.service, systemd-backlight@backlight:intel_backlight.service, systemd-backlight@leds:tpacpi::kbd_backlight.service, systemd-fsck@dev-disk-by\x2duuid-3D04\x2d3716.service, systemd-journal-flush.service, systemd-logind.service, systemd-random-seed.service, systemd-remount-fs.service, systemd-update-utmp.service, systemd-user-sessions.service, user-runtime-dir@1000.service, user@1000.service -would activate the configuration... -sops-install-secrets: Imported /persist/etc/ssh/ssh_host_ed25519_key as age key with fingerprint age1z2x0g05q2erpux006vwhul70d8akj9avrj67s9p27fm4ce32ly8qt8nllz -warning: password file β€˜/run/secrets-for-users/gburd-password’ does not exist -would restart systemd -would reload the following units: dbus.service, firewall.service, persist.mount, reload-systemd-vconsole-setup.service -would restart the following units: nix-daemon.service, polkit.service, sshd.service, systemd-journald.service -would start the following units: ModemManager.service, NetworkManager-wait-online.service, NetworkManager.service, accounts-daemon.service, audit.service, avahi-daemon.socket, bluetooth.service, bolt.service, colord.service, cpufreq.service, kmod-static-nodes.service, logrotate-checkconf.service, mount-pstore.service, network-local-commands.service, network-setup.service, nscd.service, power-profiles-daemon.service, resolvconf.service, rtkit-daemon.service, systemd-machined.service, systemd-modules-load.service, systemd-oomd.socket, systemd-sysctl.service, systemd-timesyncd.service, systemd-udevd-control.socket, systemd-udevd-kernel.socket, systemd-update-done.service, udisks2.service, upower.service, wpa_supplicant.service - -[nix-shell:~/ws/nix-config]$ clear; sudo nixos-rebuild dry-activate --flake .#floki +* nh os switch --ask +* clear; sudo nixos-rebuild dry-activate --flake .#floki diff --git a/flake.lock b/flake.lock index 76eb940..8b73e18 100644 --- a/flake.lock +++ b/flake.lock @@ -1,90 +1,22 @@ { "nodes": { - "base16-schemes": { - "flake": false, - "locked": { - "lastModified": 1680729003, - "narHash": "sha256-M9LHTL24/W4oqgbYRkz0B2qpNrkefTs98pfj3MxIXnU=", - "owner": "tinted-theming", - "repo": "base16-schemes", - "rev": "dc048afa066287a719ddbab62b3e19e4b5110cf0", - "type": "github" - }, - "original": { - "owner": "tinted-theming", - "repo": "base16-schemes", - "type": "github" - } - }, - "blobs": { - "flake": false, - "locked": { - "lastModified": 1604995301, - "narHash": "sha256-wcLzgLec6SGJA8fx1OEN1yV/Py5b+U5iyYpksUY/yLw=", - "owner": "simple-nixos-mailserver", - "repo": "blobs", - "rev": "2cccdf1ca48316f2cfd1c9a0017e8de5a7156265", - "type": "gitlab" - }, - "original": { - "owner": "simple-nixos-mailserver", - "repo": "blobs", - "type": "gitlab" - } - }, - "composer2nix-src": { - "flake": false, - "locked": { - "lastModified": 1646178110, - "narHash": "sha256-P3acfGwHYjjZQcviPiOT7T7qzzP/drc2mibzrsrNP18=", - "owner": "svanderburg", - "repo": "composer2nix", - "rev": "299caca4aac42d7639a42eb4dde951c010f6e91c", - "type": "github" - }, - "original": { - "owner": "svanderburg", - "ref": "v0.0.6", - "repo": "composer2nix", - "type": "github" - } - }, - "firefly": { + "disko": { "inputs": { - "composer2nix-src": "composer2nix-src", - "firefly-iii-src": "firefly-iii-src", "nixpkgs": [ "nixpkgs" ] }, "locked": { - "lastModified": 1689496855, - "narHash": "sha256-eLgJaeURjdKuBjyhS97texllfmtjCOhtPo1IOPvRCzI=", - "owner": "timhae", - "repo": "firefly", - "rev": "73aba7e1e9bd61bef0f8f54294beb3528e436806", + "lastModified": 1695632260, + "narHash": "sha256-B8nW57UouYtiWMJKX5leByifMj+lYk7IyV5uz0c/ZwA=", + "owner": "nix-community", + "repo": "disko", + "rev": "a14a3fb0a8e465fcd728e398d00204a195be06a3", "type": "github" }, "original": { - "owner": "timhae", - "repo": "firefly", - "type": "github" - } - }, - "firefly-iii-src": { - "flake": false, - "locked": { - "lastModified": 1681548383, - "narHash": "sha256-ymWotU5wM6nQhsfnyAt+unewJ5D0tJpNK+UedSyfITU=", - "owner": "firefly-iii", - "repo": "firefly-iii", - "rev": "f878af0d3bbfe7b1a51bef758d4e2e9a66118316", - "type": "github" - }, - "original": { - "owner": "firefly-iii", - "ref": "v6.0.8", - "repo": "firefly-iii", + "owner": "nix-community", + "repo": "disko", "type": "github" } }, @@ -111,22 +43,6 @@ "type": "gitlab" } }, - "flake-compat": { - "flake": false, - "locked": { - "lastModified": 1668681692, - "narHash": "sha256-Ht91NGdewz8IQLtWZ9LCeNXMSXHUss+9COoqu6JLmXU=", - "owner": "edolstra", - "repo": "flake-compat", - "rev": "009399224d5e398d03b22badca40a37ac85412a1", - "type": "github" - }, - "original": { - "owner": "edolstra", - "repo": "flake-compat", - "type": "github" - } - }, "flake-parts": { "inputs": { "nixpkgs-lib": "nixpkgs-lib" @@ -160,18 +76,21 @@ "type": "github" } }, - "hardware": { + "flake-utils_2": { + "inputs": { + "systems": "systems" + }, "locked": { - "lastModified": 1694710316, - "narHash": "sha256-uRh46iIC86D8BD1wCDA5gRrt+hslUXiD0kx/UjnjBcs=", - "owner": "nixos", - "repo": "nixos-hardware", - "rev": "570256327eb6ca6f7bebe8d93af49459092a0c43", + "lastModified": 1681202837, + "narHash": "sha256-H+Rh19JDwRtpVPAWp64F+rlEtxUWBAQW28eAi3SRSzg=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "cfacdce06f30d2b68473a46042957675eebb3401", "type": "github" }, "original": { - "owner": "nixos", - "repo": "nixos-hardware", + "owner": "numtide", + "repo": "flake-utils", "type": "github" } }, @@ -182,15 +101,16 @@ ] }, "locked": { - "lastModified": 1695191928, - "narHash": "sha256-yXUtJZQweg6v9G5fXStqkVNwxT4Xf+cux37yBVpaYCY=", + "lastModified": 1695108154, + "narHash": "sha256-gSg7UTVtls2yO9lKtP0yb66XBHT1Fx5qZSZbGMpSn2c=", "owner": "nix-community", "repo": "home-manager", - "rev": "0ed5f9786bba801c59fb53eef497438040acd471", + "rev": "07682fff75d41f18327a871088d20af2710d4744", "type": "github" }, "original": { "owner": "nix-community", + "ref": "release-23.05", "repo": "home-manager", "type": "github" } @@ -232,25 +152,6 @@ "type": "github" } }, - "nix-colors": { - "inputs": { - "base16-schemes": "base16-schemes", - "nixpkgs-lib": "nixpkgs-lib_2" - }, - "locked": { - "lastModified": 1682108218, - "narHash": "sha256-tMr7BbxualFQlN+XopS8rMMgf2XR9ZfRuwIZtjsWmfI=", - "owner": "misterio77", - "repo": "nix-colors", - "rev": "b92df8f5eb1fa20d8e09810c03c9dc0d94ef2820", - "type": "github" - }, - "original": { - "owner": "misterio77", - "repo": "nix-colors", - "type": "github" - } - }, "nix-filter": { "locked": { "lastModified": 1687178632, @@ -266,47 +167,56 @@ "type": "github" } }, - "nixos-mailserver": { + "nix-formatter-pack": { "inputs": { - "blobs": "blobs", - "flake-compat": "flake-compat", "nixpkgs": [ "nixpkgs" ], - "nixpkgs-22_11": [ - "nixpkgs" - ], - "nixpkgs-23_05": [ - "nixpkgs" - ], - "utils": "utils" + "nmd": "nmd", + "nmt": "nmt" }, "locked": { - "lastModified": 1689976554, - "narHash": "sha256-uWJq3sIhkqfzPmfB2RWd5XFVooGFfSuJH9ER/r302xQ=", - "owner": "simple-nixos-mailserver", - "repo": "nixos-mailserver", - "rev": "c63f6e7b053c18325194ff0e274dba44e8d2271e", - "type": "gitlab" + "lastModified": 1694984852, + "narHash": "sha256-A1x55uLb2LT9evsTWYc1U9+iki1AmE5ROxOuCKPf3JE=", + "owner": "Gerschtli", + "repo": "nix-formatter-pack", + "rev": "23795a4daf29ce784b3edc13b9776c7b445c453b", + "type": "github" }, "original": { - "owner": "simple-nixos-mailserver", - "repo": "nixos-mailserver", - "type": "gitlab" + "owner": "Gerschtli", + "repo": "nix-formatter-pack", + "type": "github" } }, - "nixpkgs": { + "nixos-hardware": { "locked": { - "lastModified": 1694959747, - "narHash": "sha256-CXQ2MuledDVlVM5dLC4pB41cFlBWxRw4tCBsFrq3cRk=", + "lastModified": 1695541019, + "narHash": "sha256-rs++zfk41K9ArWkDAlmBDlGlKO8qeRIRzdjo+9SmNFI=", "owner": "nixos", - "repo": "nixpkgs", - "rev": "970a59bd19eff3752ce552935687100c46e820a5", + "repo": "nixos-hardware", + "rev": "61283b30d11f27d5b76439d43f20d0c0c8ff5296", "type": "github" }, "original": { "owner": "nixos", - "ref": "nixos-unstable", + "ref": "master", + "repo": "nixos-hardware", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1695559356, + "narHash": "sha256-kXZ1pUoImD9OEbPCwpTz4tHsNTr4CIyIfXb3ocuR8sI=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "261abe8a44a7e8392598d038d2e01f7b33cf26d0", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-23.05", "repo": "nixpkgs", "type": "github" } @@ -329,33 +239,67 @@ "type": "github" } }, - "nixpkgs-lib_2": { + "nixpkgs-unstable": { "locked": { - "lastModified": 1680397293, - "narHash": "sha256-wBpJ73+tJ8fZSWb4tzNbAVahC4HSo2QG3nICDy4ExBQ=", - "owner": "nix-community", - "repo": "nixpkgs.lib", - "rev": "b18d328214ca3c627d3cc3f51fd9d1397fdbcd7a", + "lastModified": 1695360818, + "narHash": "sha256-JlkN3R/SSoMTa+CasbxS1gq+GpGxXQlNZRUh9+LIy/0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "e35dcc04a3853da485a396bdd332217d0ac9054f", "type": "github" }, "original": { - "owner": "nix-community", - "repo": "nixpkgs.lib", + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", "type": "github" } }, + "nmd": { + "flake": false, + "locked": { + "lastModified": 1666190571, + "narHash": "sha256-Z1hc7M9X6L+H83o9vOprijpzhTfOBjd0KmUTnpHAVjA=", + "owner": "rycee", + "repo": "nmd", + "rev": "b75d312b4f33bd3294cd8ae5c2ca8c6da2afc169", + "type": "gitlab" + }, + "original": { + "owner": "rycee", + "repo": "nmd", + "type": "gitlab" + } + }, + "nmt": { + "flake": false, + "locked": { + "lastModified": 1648075362, + "narHash": "sha256-u36WgzoA84dMVsGXzml4wZ5ckGgfnvS0ryzo/3zn/Pc=", + "owner": "rycee", + "repo": "nmt", + "rev": "d83601002c99b78c89ea80e5e6ba21addcfe12ae", + "type": "gitlab" + }, + "original": { + "owner": "rycee", + "repo": "nmt", + "type": "gitlab" + } + }, "root": { "inputs": { - "firefly": "firefly", + "disko": "disko", "firefox-addons": "firefox-addons", - "hardware": "hardware", "home-manager": "home-manager", "impermanence": "impermanence", "nh": "nh", - "nix-colors": "nix-colors", - "nixos-mailserver": "nixos-mailserver", + "nix-formatter-pack": "nix-formatter-pack", + "nixos-hardware": "nixos-hardware", "nixpkgs": "nixpkgs", - "sops-nix": "sops-nix" + "nixpkgs-unstable": "nixpkgs-unstable", + "sops-nix": "sops-nix", + "vscode-server": "vscode-server" } }, "sops-nix": { @@ -381,18 +325,39 @@ "type": "github" } }, - "utils": { + "systems": { "locked": { - "lastModified": 1605370193, - "narHash": "sha256-YyMTf3URDL/otKdKgtoMChu4vfVL3vCMkRqpGifhUn0=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "5021eac20303a61fafe17224c087f5519baed54d", + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", "type": "github" }, "original": { - "owner": "numtide", - "repo": "flake-utils", + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "vscode-server": { + "inputs": { + "flake-utils": "flake-utils_2", + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1684517665, + "narHash": "sha256-SaAr66uCQ8CF75jIr23FZjk1+9Kfwm5sQnwV25206Gs=", + "owner": "nix-community", + "repo": "nixos-vscode-server", + "rev": "1e1358493df6529d4c7bc4cc3066f76fd16d4ae6", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-vscode-server", "type": "github" } } diff --git a/flake.nix b/flake.nix index e68632a..7936ad0 100644 --- a/flake.nix +++ b/flake.nix @@ -1,109 +1,120 @@ { - description = "My (Greg Burd's) NixOS configuration"; + description = "Greg Burd's NixOS and Home Manager Configuration"; - inputs = { - nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-23.05"; + # You can access packages and modules from different nixpkgs revs at the + # same time. See 'unstable-packages' overlay in 'overlays/default.nix'. + nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable"; + + disko.url = "github:nix-community/disko"; + disko.inputs.nixpkgs.follows = "nixpkgs"; + + home-manager.url = "github:nix-community/home-manager/release-23.05"; + home-manager.inputs.nixpkgs.follows = "nixpkgs"; + + nixos-hardware.url = "github:nixos/nixos-hardware/master"; - hardware.url = "github:nixos/nixos-hardware"; impermanence.url = "github:nix-community/impermanence"; - nix-colors.url = "github:misterio77/nix-colors"; - sops-nix = { - url = "github:mic92/sops-nix"; - inputs.nixpkgs.follows = "nixpkgs"; - inputs.nixpkgs-stable.follows = "nixpkgs"; - }; - home-manager = { - url = "github:nix-community/home-manager"; - inputs.nixpkgs.follows = "nixpkgs"; - }; - nh = { - url = "github:viperml/nh"; - inputs.nixpkgs.follows = "nixpkgs"; - }; - nixos-mailserver = { - url = "gitlab:simple-nixos-mailserver/nixos-mailserver"; - inputs.nixpkgs.follows = "nixpkgs"; - inputs.nixpkgs-22_11.follows = "nixpkgs"; - inputs.nixpkgs-23_05.follows = "nixpkgs"; - }; - firefly = { - url = "github:timhae/firefly"; - inputs.nixpkgs.follows = "nixpkgs"; - }; - firefox-addons = { - url = "gitlab:rycee/nur-expressions?dir=pkgs/firefox-addons"; - inputs.nixpkgs.follows = "nixpkgs"; - }; + nix-formatter-pack.url = "github:Gerschtli/nix-formatter-pack"; + nix-formatter-pack.inputs.nixpkgs.follows = "nixpkgs"; + + vscode-server.url = "github:nix-community/nixos-vscode-server"; + vscode-server.inputs.nixpkgs.follows = "nixpkgs"; + + sops-nix.url = "github:mic92/sops-nix"; + sops-nix.inputs.nixpkgs.follows = "nixpkgs"; + sops-nix.inputs.nixpkgs-stable.follows = "nixpkgs"; + + nh.url = "github:viperml/nh"; + nh.inputs.nixpkgs.follows = "nixpkgs"; + + firefox-addons.url = "gitlab:rycee/nur-expressions?dir=pkgs/firefox-addons"; + firefox-addons.inputs.nixpkgs.follows = "nixpkgs"; + }; - - outputs = { self, nixpkgs, home-manager, ... }@inputs: + outputs = + { self + , nixpkgs + , nix-formatter-pack + , ... + } @ inputs: let inherit (self) outputs; - lib = nixpkgs.lib // home-manager.lib; - systems = [ "x86_64-linux" "aarch64-linux" ]; - forEachSystem = f: lib.genAttrs systems (sys: f pkgsFor.${sys}); - pkgsFor = nixpkgs.legacyPackages; + # https://nixos.wiki/wiki/FAQ/When_do_I_update_stateVersion + stateVersion = "23.05"; + libx = import ./lib { inherit inputs outputs stateVersion; }; in { - inherit lib; + # home-manager switch -b backup --flake $HOME/ws/nix-config + # nix build .#homeConfigurations."gburd@floki".activationPackage + homeConfigurations = { + # .iso images + # --------------------------------------------------------------------- + + "gburd@iso-console" = libx.mkHome { hostname = "iso-console"; username = "nixos"; }; + "gburd@iso-desktop" = libx.mkHome { hostname = "iso-desktop"; username = "nixos"; desktop = "pantheon"; }; + + # Workstations + # --------------------------------------------------------------------- + + "gburd@floki" = libx.mkHome { hostname = "floki"; username = "gburd"; desktop = "pantheon"; }; + + # Servers + # --------------------------------------------------------------------- + }; + + nixosConfigurations = { + # .iso images + # --------------------------------------------------------------------- + + # - nix build .#nixosConfigurations.{iso-console|iso-desktop}.config.system.build.isoImage + iso-console = libx.mkHost { hostname = "iso-console"; username = "nixos"; installer = nixpkgs + "/nixos/modules/installer/cd-dvd/installation-cd-minimal.nix"; }; + iso-desktop = libx.mkHost { hostname = "iso-desktop"; username = "nixos"; installer = nixpkgs + "/nixos/modules/installer/cd-dvd/installation-cd-graphical-calamares.nix"; desktop = "pantheon"; }; + + # Workstations + # --------------------------------------------------------------------- + + # Lenovo Carbon X1 Extreme Gen 5 - x86_64 + floki = libx.mkHost { hostname = "floki"; username = "gburd"; desktop = "pantheon"; }; + + # Servers + # --------------------------------------------------------------------- + }; + + # Custom packages and modifications, exported as overlays + overlays = import ./overlays { inherit inputs outputs; }; + + hydraJobs = import ./hydra.nix { inherit inputs outputs; }; + + # Devshell for bootstrapping; acessible via 'nix develop' or 'nix-shell' (legacy) + devShells = libx.forAllSystems (system: + let pkgs = nixpkgs.legacyPackages.${system}; + in import ./shell.nix { inherit pkgs; } + ); + + # nix fmt + formatter = libx.forAllSystems (system: + nix-formatter-pack.lib.mkFormatter { + pkgs = nixpkgs.legacyPackages.${system}; + config.tools = { + alejandra.enable = false; + deadnix.enable = true; + nixpkgs-fmt.enable = true; + statix.enable = true; + }; + } + ); + + # Custom packages; acessible via 'nix build', 'nix shell', etc + packages = libx.forAllSystems (system: + let pkgs = nixpkgs.legacyPackages.${system}; + in import ./pkgs { inherit pkgs; } + ); + nixosModules = import ./modules/nixos; homeManagerModules = import ./modules/home-manager; templates = import ./templates; - - overlays = import ./overlays { inherit inputs outputs; }; - hydraJobs = import ./hydra.nix { inherit inputs outputs; }; - - packages = forEachSystem (pkgs: import ./pkgs { inherit pkgs; }); - devShells = forEachSystem (pkgs: import ./shell.nix { inherit pkgs; }); - formatter = forEachSystem (pkgs: pkgs.nixpkgs-fmt); - - wallpapers = import ./home/gburd/wallpapers; - - nixosConfigurations = { - # Personal laptop - Lenovo Carbon X1 Extreme Gen 5 - x86_64 - floki = lib.nixosSystem { - modules = [ ./hosts/floki ]; - specialArgs = { inherit inputs outputs; }; - }; - - # Work laptop - MacBook Air macOS/nix - aarch64 - # ? = lib.nixosSystem { - # modules = [ ./hosts/? ]; - # specialArgs = { inherit inputs outputs; }; - # }; - - # Main desktop - Intel NUC Skull Canyon - x86_64 - # ? = lib.nixosSystem { - # modules = [ ./hosts/? ]; - # specialArgs = { inherit inputs outputs; }; - # }; - - # Core server (?) - # ? = lib.nixosSystem { - # modules = [ ./hosts/? ]; - # specialArgs = { inherit inputs outputs; }; - # }; - - # Build and game server (?) - # ? = lib.nixosSystem { - # modules = [ ./hosts/? ]; - # specialArgs = { inherit inputs outputs; }; - # }; - }; - - homeConfigurations = { - # Desktops - "gburd@floki" = lib.homeManagerConfiguration { - modules = [ ./home/gburd/floki.nix ]; - pkgs = pkgsFor.x86_64-linux; - extraSpecialArgs = { inherit inputs outputs; }; - }; - "gburd@generic" = lib.homeManagerConfiguration { - modules = [ ./home/gburd/generic.nix ]; - pkgs = pkgsFor.x86_64-linux; - extraSpecialArgs = { inherit inputs outputs; }; - }; - }; }; } diff --git a/home/_mixins/console/default.nix b/home/_mixins/console/default.nix new file mode 100644 index 0000000..5e692bb --- /dev/null +++ b/home/_mixins/console/default.nix @@ -0,0 +1,185 @@ +{ config, lib, pkgs, ... }: { + home = { + file = { + "${config.xdg.configHome}/neofetch/config.conf".text = builtins.readFile ./neofetch.conf; + }; + packages = with pkgs; [ + neofetch + ]; + sessionVariables = { + EDITOR = "micro"; + MANPAGER = "sh -c 'col --no-backspaces --spaces | bat --language man'"; + SYSTEMD_EDITOR = "micro"; + VISUAL = "micro"; + }; + }; + + programs = { + atuin = { + enable = true; + enableBashIntegration = true; + enableFishIntegration = true; + flags = [ + "--disable-up-arrow" + ]; + package = pkgs.unstable.atuin; + settings = { + auto_sync = true; + dialect = "uk"; + show_preview = true; + style = "compact"; + sync_frequency = "1h"; + sync_address = "https://api.atuin.sh"; + update_check = false; + }; + }; + bat = { + enable = true; + extraPackages = with pkgs.bat-extras; [ + batwatch + prettybat + ]; + }; + bottom = { + enable = true; + settings = { + colors = { + high_battery_color = "green"; + medium_battery_color = "yellow"; + low_battery_color = "red"; + }; + disk_filter = { + is_list_ignored = true; + list = [ "/dev/loop" ]; + regex = true; + case_sensitive = false; + whole_word = false; + }; + flags = { + dot_marker = false; + enable_gpu_memory = true; + group_processes = true; + hide_table_gap = true; + mem_as_value = true; + tree = true; + }; + }; + }; + dircolors = { + enable = true; + enableBashIntegration = true; + enableFishIntegration = true; + }; + direnv = { + enable = true; + enableBashIntegration = true; + nix-direnv = { + enable = true; + }; + }; + exa = { + enable = true; + enableAliases = true; + icons = true; + }; + fish = { + enable = true; + shellAliases = { + cat = "bat --paging=never --style=plain"; + htop = "btm --basic --tree --hide_table_gap --dot_marker --mem_as_value"; + ip = "ip --color --brief"; + less = "bat --paging=always"; + more = "bat --paging=always"; + top = "btm --basic --tree --hide_table_gap --dot_marker --mem_as_value"; + tree = "exa --tree"; + }; + }; + gh = { + enable = true; + extensions = with pkgs; [ gh-markdown-preview ]; + settings = { + editor = "micro"; + git_protocol = "ssh"; + prompt = "enabled"; + }; + }; + git = { + enable = true; + delta = { + enable = true; + options = { + features = "decorations"; + navigate = true; + side-by-side = true; + }; + }; + aliases = { + lg = "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"; + }; + extraConfig = { + push = { + default = "matching"; + }; + pull = { + rebase = true; + }; + init = { + defaultBranch = "main"; + }; + }; + ignores = [ + "*.log" + "*.out" + ".DS_Store" + "bin/" + "dist/" + "result" + ]; + }; + gpg.enable = true; + home-manager.enable = true; + info.enable = true; + jq.enable = true; + micro = { + enable = true; + settings = { + colorscheme = "simple"; + diffgutter = true; + rmtrailingws = true; + savecursor = true; + saveundo = true; + scrollbar = true; + }; + }; + powerline-go = { + enable = true; + settings = { + cwd-max-depth = 5; + cwd-max-dir-size = 12; + max-width = 60; + }; + }; + }; + + services = { + gpg-agent = { + enable = true; + enableSshSupport = true; + pinentryFlavor = "curses"; + }; + }; + + # Nicely reload system units when changing configs + systemd.user.startServices = "sd-switch"; + + xdg = { + enable = true; + userDirs = { + enable = true; + createDirectories = lib.mkDefault true; + extraConfig = { + XDG_SCREENSHOTS_DIR = "${config.home.homeDirectory}/Pictures/Screenshots"; + }; + }; + }; +} diff --git a/home/_mixins/console/neofetch.conf b/home/_mixins/console/neofetch.conf new file mode 100644 index 0000000..02c5e78 --- /dev/null +++ b/home/_mixins/console/neofetch.conf @@ -0,0 +1,842 @@ +# Adapted from https://github.com/chick2d/neofetch-themes/blob/main/normal/acenoster.conf +# Originally made by https://github.com/HimDek/ (HimDek) +# Customization Wiki https://github.com/dylanaraps/neofetch/wiki/Customizing-Info + +print_info() { + info "${cl2} β•­β”€ο‹œ" distro + info "${cl2} β”œβ”€ο…Ό" kernel +# info "${cl2} β”œβ”€ο€‡" users + info "${cl2} β”œβ”€ο£–" packages + info "${cl2} ╰─" uptime + echo + info "${cl6} β•­β”€οŠ’" shell + info "${cl6} β”œβ”€ο‹" de + info "${cl6} β”œβ”€ο‹’" wm + info "${cl6} β”œβ”€ξˆ«" theme +# info "${cl6} β”œβ”€ο–ͺ" icons + info "${cl6} β”œβ”€ο€±" font + info "${cl6} β”œβ”€ο€±" term_font + info "${cl6} ╰─" term + echo + info "${cl4} ╭─" model + info "${cl4} β”œβ”€ο‘š" cpu + info "${cl4} β”œβ”€ο‹›" memory + info "${cl4} β”œβ”€ο‚  ${cl0}" disk +# info "${cl4} β”œβ”€ο•Έ ${cl0} " battery + info "${cl4} β”œβ”€ο‘Έ" gpu +# info "${cl4} β”œβ”€ο‚…" gpu_driver + info "${cl4} ╰─" resolution + + prin " " + prin "\n \n ${cl0}─${cl1}──${cl2}──${cl3}──${cl4}──${cl5}──${cl6}──${cl7}─ " +} + +##--------- Title + +# Hide/Show Fully qualified domain name. +# +# Default: 'off' +# Values: 'on', 'off' +# Flag: --title_fqdn +title_fqdn="off" + + +##--------- Kernel + +# Shorten the output of the kernel function. +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --kernel_shorthand +# Supports: Everything except *BSDs (except PacBSD and PC-BSD) +# +# Example: +# on: '4.8.9-1-ARCH' +# off: 'Linux 4.8.9-1-ARCH' +kernel_shorthand="on" + + +##--------- Distro + +# Shorten the output of the distro function +# +# Default: 'off' +# Values: 'on', 'tiny', 'off' +# Flag: --distro_shorthand +# Supports: Everything except Windows and Haiku +distro_shorthand="on" + +# Show/Hide OS Architecture. +# Show 'x86_64', 'x86' and etc in 'Distro:' output. +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --os_arch +# +# Example: +# on: 'Arch Linux x86_64' +# off: 'Arch Linux' +os_arch="on" + +##--------- Uptime + +# Shorten the output of the uptime function +# +# Default: 'on' +# Values: 'on', 'tiny', 'off' +# Flag: --uptime_shorthand +# +# Example: +# on: '2 days, 10 hours, 3 mins' +# tiny: '2d 10h 3m' +# off: '2 days, 10 hours, 3 minutes' +uptime_shorthand="tiny" + +##--------- Memory + +# Show memory pecentage in output. +# +# Default: 'off' +# Values: 'on', 'off' +# Flag: --memory_percent +# +# Example: +# on: '1801MiB / 7881MiB (22%)' +# off: '1801MiB / 7881MiB' +memory_percent="on" + +# Change memory output unit. +# +# Default: 'mib' +# Values: 'kib', 'mib', 'gib' +# Flag: --memory_unit +# +# Example: +# kib '1020928KiB / 7117824KiB' +# mib '1042MiB / 6951MiB' +# gib: ' 0.98GiB / 6.79GiB' +memory_unit="Gib" + +##--------- Packages + +# Show/Hide Package Manager names. +# +# Default: 'tiny' +# Values: 'on', 'tiny' 'off' +# Flag: --package_managers +# +# Example: +# on: '998 (pacman), 8 (flatpak), 4 (snap)' +# tiny: '908 (pacman, flatpak, snap)' +# off: '908' +package_managers="on" + +##--------- Shell + +# Show the path to $SHELL +# +# Default: 'off' +# Values: 'on', 'off' +# Flag: --shell_path +# +# Example: +# on: '/bin/bash' +# off: 'bash' +shell_path="off" + +# Show $SHELL version +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --shell_version +# +# Example: +# on: 'bash 4.4.5' +# off: 'bash' +shell_version="on" + +##--------- CPU + +# CPU speed type +# +# Default: 'bios_limit' +# Values: 'scaling_cur_freq', 'scaling_min_freq', 'scaling_max_freq', 'bios_limit'. +# Flag: --speed_type +# Supports: Linux with 'cpufreq' +# NOTE: Any file in '/sys/devices/system/cpu/cpu0/cpufreq' can be used as a value. +speed_type="scaling_max_freq" + +# CPU speed shorthand +# +# Default: 'off' +# Values: 'on', 'off'. +# Flag: --speed_shorthand +# NOTE: This flag is not supported in systems with CPU speed less than 1 GHz +# +# Example: +# on: 'i7-6500U (4) @ 3.1GHz' +# off: 'i7-6500U (4) @ 3.100GHz' +speed_shorthand="on" + +# Enable/Disable CPU brand in output. +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --cpu_brand +# +# Example: +# on: 'Intel i7-6500U' +# off: 'i7-6500U (4)' +cpu_brand="on" + +# CPU Speed +# Hide/Show CPU speed. +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --cpu_speed +# +# Example: +# on: 'Intel i7-6500U (4) @ 3.1GHz' +# off: 'Intel i7-6500U (4)' +cpu_speed="on" + +# CPU Cores +# Display CPU cores in output +# +# Default: 'logical' +# Values: 'logical', 'physical', 'off' +# Flag: --cpu_cores +# Support: 'physical' doesn't work on BSD. +# +# Example: +# logical: 'Intel i7-6500U (4) @ 3.1GHz' (All virtual cores) +# physical: 'Intel i7-6500U (2) @ 3.1GHz' (All physical cores) +# off: 'Intel i7-6500U @ 3.1GHz' +cpu_cores="logical" + +# CPU Temperature +# Hide/Show CPU temperature. +# Note the temperature is added to the regular CPU function. +# +# Default: 'off' +# Values: 'C', 'F', 'off' +# Flag: --cpu_temp +# Supports: Linux, BSD +# NOTE: For FreeBSD and NetBSD-based systems, you'll need to enable +# coretemp kernel module. This only supports newer Intel processors. +# +# Example: sudo rm /var/lib/pacman/db.lck +# C: 'Intel i7-6500U (4) @ 3.1GHz [27.2Β°C]' +# F: 'Intel i7-6500U (4) @ 3.1GHz [82.0Β°F]' +# off: 'Intel i7-6500U (4) @ 3.1GHz' +cpu_temp="on" + +##--------- GPU + +# Enable/Disable GPU Brand +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --gpu_brand +# +# Example: +# on: 'AMD HD 7950' +# off: 'HD 7950' +gpu_brand="on" + +# Which GPU to display +# +# Default: 'all' +# Values: 'all', 'dedicated', 'integrated' +# Flag: --gpu_type +# Supports: Linux +# +# Example: +# all: +# GPU1: AMD HD 7950 +# GPU2: Intel Integrated Graphics +# +# dedicated: +# GPU1: AMD HD 7950 +# +# integrated: +# GPU1: Intel Integrated Graphics +gpu_type="all" + +##--------- Resolution + +# Display refresh rate next to each monitor +# Default: 'off' +# Values: 'on', 'off' +# Flag: --refresh_rate +# Supports: Doesn't work on Windows. +# +# Example: +# on: '1920x1080 @ 60Hz' +# off: '1920x1080' +refresh_rate="on" + +##--------- Gtk Theme / Icons / Font + +# Shorten output of GTK Theme / Icons / Font +# +# Default: 'off' +# Values: 'on', 'off' +# Flag: --gtk_shorthand +# +# Example: +# on: 'Numix, Adwaita' +# off: 'Numix [GTK2], Adwaita [GTK3]' +gtk_shorthand="on" + +# Enable/Disable gtk2 Theme / Icons / Font +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --gtk2 +# +# Example: +# on: 'Numix [GTK2], Adwaita [GTK3]' +# off: 'Adwaita [GTK3]' +gtk2="off" + +# Enable/Disable gtk3 Theme / Icons / Font +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --gtk3 +# +# Example: +# on: 'Numix [GTK2], Adwaita [GTK3]' +# off: 'Numix [GTK2]' +gtk3="on" + +##--------- IP Address + +# Website to ping for the public IP +# +# Default: 'http://ident.me' +# Values: 'url' +# Flag: --ip_host +public_ip_host="http://ident.me" + +# Public IP timeout. +# +# Default: '2' +# Values: 'int' +# Flag: --ip_timeout +public_ip_timeout=2 + +# Desktop Environment + +# Show Desktop Environment version +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --de_version +de_version="on" + +##--------- Disk + +# Which disks to display. +# The values can be any /dev/sdXX, mount point or directory. +# NOTE: By default we only show the disk info for '/'. +# +# Default: '/' +# Values: '/', '/dev/sdXX', '/path/to/drive'. +# Flag: --disk_show +# +# Example: +# disk_show=('/' '/dev/sdb1'): +# 'Disk (/): 74G / 118G (66%)' +# 'Disk (/mnt/Videos): 823G / 893G (93%)' +# +# disk_show=('/'): +# 'Disk (/): 74G / 118G (66%)' +# +disk_show=('/' '/home') + +# Disk subtitle. +# What to append to the Disk subtitle. +# +# Default: 'mount' +# Values: 'mount', 'name', 'dir', 'none' +# Flag: --disk_subtitle +# +# Example: +# name: 'Disk (/dev/sda1): 74G / 118G (66%)' +# 'Disk (/dev/sdb2): 74G / 118G (66%)' +# +# mount: 'Disk (/): 74G / 118G (66%)' +# 'Disk (/mnt/Local Disk): 74G / 118G (66%)' +# 'Disk (/mnt/Videos): 74G / 118G (66%)' +# +# dir: 'Disk (/): 74G / 118G (66%)' +# 'Disk (Local Disk): 74G / 118G (66%)' +# 'Disk (Videos): 74G / 118G (66%)' +# +# none: 'Disk: 74G / 118G (66%)' +# 'Disk: 74G / 118G (66%)' +# 'Disk: 74G / 118G (66%)' +disk_subtitle="mount" + +# Disk percent. +# Show/Hide disk percent. +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --disk_percent +# +# Example: +# on: 'Disk (/): 74G / 118G (66%)' +# off: 'Disk (/): 74G / 118G' +disk_percent="on" + + +##--------- Song + +# Manually specify a music player. +# +# Default: 'auto' +# Values: 'auto', 'player-name' +# Flag: --music_player +# +# Available values for 'player-name': +# +# amarok +# audacious +# banshee +# bluemindo +# clementine +# cmus +# deadbeef +# deepin-music +# dragon +# elisa +# exaile +# gnome-music +# gmusicbrowser +# gogglesmm +# guayadeque +# io.elementary.music +# iTunes +# juk +# lollypop +# mocp +# mopidy +# mpd +# muine +# netease-cloud-music +# olivia +# playerctl +# pogo +# pragha +# qmmp +# quodlibet +# rhythmbox +# sayonara +# smplayer +# spotify +# strawberry +# tauonmb +# tomahawk +# vlc +# xmms2d +# xnoise +# yarock +music_player="auto" + +# Format to display song information. +# +# Default: '%artist% - %album% - %title%' +# Values: '%artist%', '%album%', '%title%' +# Flag: --song_format +# +# Example: +# default: 'Song: Jet - Get Born - Sgt Major' +song_format="%artist% - %album% - %title%" + +# Print the Artist, Album and Title on separate lines +# +# Default: 'off' +# Values: 'on', 'off' +# Flag: --song_shorthand +# +# Example: +# on: 'Artist: The Fratellis' +# 'Album: Costello Music' +# 'Song: Chelsea Dagger' +# +# off: 'Song: The Fratellis - Costello Music - Chelsea Dagger' +song_shorthand="off" + +# 'mpc' arguments (specify a host, password etc). +# +# Default: '' +# Example: mpc_args=(-h HOST -P PASSWORD) +mpc_args=() + +##--------- Text Colors + +# Text Colors +# +# Default: 'distro' +# Values: 'distro', 'num' 'num' 'num' 'num' 'num' 'num' +# Flag: --colors +# +# Each number represents a different part of the text in +# this order: 'title', '@', 'underline', 'subtitle', 'colon', 'info' +# +# Example: +# colors=(distro) - Text is colored based on Distro colors. +# colors=(4 6 1 8 8 6) - Text is colored in the order above. +colors=(distro) + +##--------- Text Options + +# Toggle bold text +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --bold +bold="on" + +# Enable/Disable Underline +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --underline +underline_enabled="on" + +# Underline character +# +# Default: '-' +# Values: 'string' +# Flag: --underline_char +underline_char="ο‘³" + +# Info Separator +# Replace the default separator with the specified string. +# +# Default: ':' +# Flag: --separator +# +# Example: +# separator="->": 'Shell-> bash' +# separator=" =": 'WM = dwm' +separator=" " + +##--------- Color Blocks + +# Color block range +# The range of colors to print. +# +# Default: '0', '15' +# Values: 'num' +# Flag: --block_range +# +# Example: +# +# Display colors 0-7 in the blocks. (8 colors) +# neofetch --block_range 0 7 +# +# Display colors 0-15 in the blocks. (16 colors) +# neofetch --block_range 0 15 +#block_range=(8 15) +block_range=(1 8) + +# Colors for custom colorblocks +#colors +#bold="(tput bold)" +magenta="\033[1;35m" +green="\033[1;32m" +white="\033[1;37m" +blue="\033[1;34m" +red="\033[1;31m" +black="\033[1;40;30m" +yellow="\033[1;33m" +cyan="\033[1;36m" +reset="\033[0m" +bgyellow="\033[1;43;33m" +bgwhite="\033[1;47;37m" +cl0="${reset}" +cl1="${magenta}" +cl2="${green}" +cl3="${white}" +cl4="${blue}" +cl5="${red}" +cl6="${yellow}" +cl7="${cyan}" +cl8="${black}" +cl9="${bgyellow}" +cl10="${bgwhite}" + +# Toggle color blocks +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --color_blocks +color_blocks="on" + +# Color block width in spaces +# +# Default: '3' +# Values: 'num' +# Flag: --block_width +block_width=4 + +# Color block height in lines +# +# Default: '1' +# Values: 'num' +# Flag: --block_height +block_height=1 + +# Color Alignment +# +# Default: 'auto' +# Values: 'auto', 'num' +# Flag: --col_offset +# +# Number specifies how far from the left side of the terminal (in spaces) to +# begin printing the columns, in case you want to e.g. center them under your +# text. +# Example: +# col_offset="auto" - Default behavior of neofetch +# col_offset=7 - Leave 7 spaces then print the colors +col_offset="auto" + +##--------- Progress Bars + +# Bar characters +# +# Default: '-', '=' +# Values: 'string', 'string' +# Flag: --bar_char +# +# Example: +# neofetch --bar_char 'elapsed' 'total' +# neofetch --bar_char '-' '=' +bar_char_elapsed="-" +bar_char_total="=" + +# Toggle Bar border +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --bar_border +bar_border="on" + +# Progress bar length in spaces +# Number of chars long to make the progress bars. +# +# Default: '15' +# Values: 'num' +# Flag: --bar_length +bar_length=15 + +# Progress bar colors +# When set to distro, uses your distro's logo colors. +# +# Default: 'distro', 'distro' +# Values: 'distro', 'num' +# Flag: --bar_colors +# +# Example: +# neofetch --bar_colors 3 4 +# neofetch --bar_colors distro 5 +bar_color_elapsed="distro" +bar_color_total="distro" + +# Info display +# Display a bar with the info. +# +# Default: 'off' +# Values: 'bar', 'infobar', 'barinfo', 'off' +# Flags: --cpu_display +# --memory_display +# --battery_display +# --disk_display +# +# Example: +# bar: '[---=======]' +# infobar: 'info [---=======]' +# barinfo: '[---=======] info' +# off: 'info' +cpu_display="on" +memory_display="on" +battery_display="on" +disk_display="on" + +##--------- Backend Settings + +# Image backend. +# +# Default: 'ascii' +# Values: 'ascii', 'caca', 'chafa', 'jp2a', 'iterm2', 'off', +# 'pot', 'termpix', 'pixterm', 'tycat', 'w3m', 'kitty' +# Flag: --backend +image_backend="ascii" + +# Image Source +# +# Which image or ascii file to display. +# +# Default: 'auto' +# Values: 'auto', 'ascii', 'wallpaper', '/path/to/img', '/path/to/ascii', '/path/to/dir/' +# 'command output (neofetch --ascii "$(fortune | cowsay -W 30)")' +# Flag: --source +# +# NOTE: 'auto' will pick the best image source for whatever image backend is used. +# In ascii mode, distro ascii art will be used and in an image mode, your +# wallpaper will be used. +image_source="auto" + +##--------- Ascii Options + +# Ascii distro +# Which distro's ascii art to display. +# +# Default: 'auto' +# Values: 'auto', 'distro_name' +# Flag: --ascii_distro +# NOTE: AIX, Alpine, Anarchy, Android, Antergos, antiX, "AOSC OS", +# "AOSC OS/Retro", Apricity, ArcoLinux, ArchBox, ARCHlabs, +# ArchStrike, XFerience, ArchMerge, Arch, Artix, Arya, Bedrock, +# Bitrig, BlackArch, BLAG, BlankOn, BlueLight, bonsai, BSD, +# BunsenLabs, Calculate, Carbs, CentOS, Chakra, ChaletOS, +# Chapeau, Chrom*, Cleanjaro, ClearOS, Clear_Linux, Clover, +# Condres, Container_Linux, CRUX, Cucumber, Debian, Deepin, +# DesaOS, Devuan, DracOS, DarkOs, DragonFly, Drauger, Elementary, +# EndeavourOS, Endless, EuroLinux, Exherbo, Fedora, Feren, FreeBSD, +# FreeMiNT, Frugalware, Funtoo, GalliumOS, Garuda, Gentoo, Pentoo, +# gNewSense, GNOME, GNU, GoboLinux, Grombyang, Guix, Haiku, Huayra, +# Hyperbola, janus, Kali, KaOS, KDE_neon, Kibojoe, Kogaion, +# Korora, KSLinux, Kubuntu, LEDE, LFS, Linux_Lite, +# LMDE, Lubuntu, Lunar, macos, Mageia, MagpieOS, Mandriva, +# Manjaro, Maui, Mer, Minix, LinuxMint, MX_Linux, Namib, +# Neptune, NetBSD, Netrunner, Nitrux, NixOS, Nurunner, +# NuTyX, OBRevenge, OpenBSD, openEuler, OpenIndiana, openmamba, +# OpenMandriva, OpenStage, OpenWrt, osmc, Oracle, OS Elbrus, PacBSD, +# Parabola, Pardus, Parrot, Parsix, TrueOS, PCLinuxOS, Peppermint, +# popos, Porteus, PostMarketOS, Proxmox, Puppy, PureOS, Qubes, Radix, +# Raspbian, Reborn_OS, Redstar, Redcore, Redhat, Refracted_Devuan, +# Regata, Rosa, sabotage, Sabayon, Sailfish, SalentOS, Scientific, +# Septor, SereneLinux, SharkLinux, Siduction, Slackware, SliTaz, +# SmartOS, Solus, Source_Mage, Sparky, Star, SteamOS, SunOS, +# openSUSE_Leap, openSUSE_Tumbleweed, openSUSE, SwagArch, Tails, +# Trisquel, Ubuntu-Budgie, Ubuntu-GNOME, Ubuntu-MATE, Ubuntu-Studio, +# Ubuntu, Venom, Void, Obarun, windows10, Windows7, Xubuntu, Zorin, +# and IRIX have ascii logos +# NOTE: Arch, Ubuntu, Redhat, and Dragonfly have 'old' logo variants. +# Use '{distro name}_old' to use the old logos. +# NOTE: Ubuntu has flavor variants. +# Change this to Lubuntu, Kubuntu, Xubuntu, Ubuntu-GNOME, +# Ubuntu-Studio, Ubuntu-Mate or Ubuntu-Budgie to use the flavors. +# NOTE: Arcolinux, Dragonfly, Fedora, Alpine, Arch, Ubuntu, +# CRUX, Debian, Gentoo, FreeBSD, Mac, NixOS, OpenBSD, android, +# Antrix, CentOS, Cleanjaro, ElementaryOS, GUIX, Hyperbola, +# Manjaro, MXLinux, NetBSD, Parabola, POP_OS, PureOS, +# Slackware, SunOS, LinuxLite, OpenSUSE, Raspbian, +# postmarketOS, and Void have a smaller logo variant. +# Use '{distro name}_small' to use the small variants. +ascii_distro="auto" + +# Ascii Colors +# +# Default: 'distro' +# Values: 'distro', 'num' 'num' 'num' 'num' 'num' 'num' +# Flag: --ascii_colors +# +# Example: +# ascii_colors=(distro) - Ascii is colored based on Distro colors. +# ascii_colors=(4 6 1 8 8 6) - Ascii is colored using these colors. +ascii_colors=(distro) + +# Bold ascii logo +# Whether or not to bold the ascii logo. +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --ascii_bold +ascii_bold="on" + +##--------- Image Options + +# Image loop +# Setting this to on will make neofetch redraw the image constantly until +# Ctrl+C is pressed. This fixes display issues in some terminal emulators. +# +# Default: 'off' +# Values: 'on', 'off' +# Flag: --loop +image_loop="off" + +# Thumbnail directory +# +# Default: '~/.cache/thumbnails/neofetch' +# Values: 'dir' +thumbnail_dir="${XDG_CACHE_HOME:-${HOME}/.cache}/thumbnails/neofetch" + +# Crop mode +# +# Default: 'normal' +# Values: 'normal', 'fit', 'fill' +# Flag: --crop_mode +# +# See this wiki page to learn about the fit and fill options. +# https://github.com/dylanaraps/neofetch/wiki/What-is-Waifu-Crop%3F +crop_mode="normal" + +# Crop offset +# Note: Only affects 'normal' crop mode. +# +# Default: 'center' +# Values: 'northwest', 'north', 'northeast', 'west', 'center' +# 'east', 'southwest', 'south', 'southeast' +# Flag: --crop_offset +crop_offset="center" + +# Image size +# The image is half the terminal width by default. +# +# Default: 'auto' +# Values: 'auto', '00px', '00%', 'none' +# Flags: --image_size +# --size +image_size="auto" + +# Gap between image and text +# +# Default: '3' +# Values: 'num', '-num' +# Flag: --gap +gap=2 + +# Image offsets +# Only works with the w3m backend. +# +# Default: '0' +# Values: 'px' +# Flags: --xoffset +# --yoffset +yoffset=0 +xoffset=0 + +# Image background color +# Only works with the w3m backend. +# +# Default: '' +# Values: 'color', 'blue' +# Flag: --bg_color +background_color= + +##--------- Misc Options + +# Stdout mode +# Turn off all colors and disables image backend (ASCII/Image). +# Useful for piping into another command. +# Default: 'off' +# Values: 'on', 'off' +stdout="off" diff --git a/home/_mixins/desktop/audio-recorder.nix b/home/_mixins/desktop/audio-recorder.nix new file mode 100644 index 0000000..f6d2ed5 --- /dev/null +++ b/home/_mixins/desktop/audio-recorder.nix @@ -0,0 +1,27 @@ +{ config, lib, pkgs, username, ... }: +with lib.hm.gvariant; +{ + home.packages = with pkgs; [ + audio-recorder + ]; + + dconf.settings = { + "apps/audio-recorder" = { + append-to-file = false; + filename-pattern = "LMP-${username}-%V-%H%M"; + folder-name = "${config.home.homeDirectory}/Audio"; + keep-on-top = true; + level-bar-value = 2; + media-format = "Podcast Mono, Lossless 44KHz"; + #saved-profiles = [('CD Quality, AAC 44KHz', 'm4a', '', 'audio/x-raw,rate=44100,channels=2 ! avenc_aac compliance=-2 ! avmux_mp4'), ('CD Quality, Lossless 44KHz', 'flac', '', 'audio/x-raw,rate=44100,channels=2 ! flacenc name=enc'), ('CD Quality, Lossy 44KHz', 'ogg', '', 'audio/x-raw,rate=44100,channels=2 ! vorbisenc name=enc quality=0.5 ! oggmux'), ('CD Quality, MP3 Lossy 44KHz', 'mp3', '', 'audio/x-raw,rate=44100,channels=2 ! lamemp3enc name=enc target=0 quality=2'), ('Lossless WAV 22KHz', 'wav', '', 'audio/x-raw,rate=22050,channels=1 ! wavenc name=enc'), ('Lossless WAV 44KHz', 'wav', '', 'audio/x-raw,rate=44100,channels=2 ! wavenc name=enc'), ('Lossy Speex 32KHz', 'spx', '', 'audio/x-raw,rate=32000,channels=2 ! speexenc name=enc ! oggmux'), ('Podcast Mono, Lossless 44KHz', 'flac', '', 'audio/x-raw,rate=44100,channels=1 ! flacenc name=enc')]; + show-systray-icon = false; + timer-active = false; + timer-expanded = false; + timer-text = ""; + }; + }; + + systemd.user.tmpfiles.rules = [ + "d ${config.home.homeDirectory}/Audio 0755 ${username} users - -" + ]; +} diff --git a/home/_mixins/desktop/celluloid.nix b/home/_mixins/desktop/celluloid.nix new file mode 100644 index 0000000..2b0b971 --- /dev/null +++ b/home/_mixins/desktop/celluloid.nix @@ -0,0 +1,14 @@ +{ lib, pkgs, ... }: +with lib.hm.gvariant; +{ + home.packages = with pkgs; [ + celluloid + ]; + + dconf.settings = { + "io/github/celluloid-player/celluloid" = { + csd-enable = false; + dark-theme-enable = true; + }; + }; +} diff --git a/home/_mixins/desktop/dconf-editor.nix b/home/_mixins/desktop/dconf-editor.nix new file mode 100644 index 0000000..55b194b --- /dev/null +++ b/home/_mixins/desktop/dconf-editor.nix @@ -0,0 +1,13 @@ +{ lib, pkgs, ... }: +with lib.hm.gvariant; +{ + home.packages = with pkgs; [ + gnome.dconf-editor + ]; + + dconf.settings = { + "ca/desrt/dconf-editor" = { + show-warning = false; + }; + }; +} diff --git a/home/_mixins/desktop/deckmaster-xl.nix b/home/_mixins/desktop/deckmaster-xl.nix new file mode 100644 index 0000000..eddc9e3 --- /dev/null +++ b/home/_mixins/desktop/deckmaster-xl.nix @@ -0,0 +1,27 @@ +{ config, pkgs, ... }: +{ + # https://github.com/muesli/deckmaster + home = { + file = { + "${config.xdg.configHome}/autostart/deskmaster-xl.desktop".text = " + [Desktop Entry] + Name=Deckmaster XL + Comment=Deckmaster XL + Type=Application + Exec=deckmaster -deck ${config.home.homeDirectory}/Studio/StreamDeck/Deckmaster-xl/main.deck + Categories= + Terminal=false + NoDisplay=true + StartupNotify=false"; + }; + # Deckmaster and the utilities I bind to the Stream Deck + packages = with pkgs; [ + bc + deckmaster + hueadm + libnotify + unstable.obs-cli + playerctl + ]; + }; +} diff --git a/home/_mixins/desktop/default.nix b/home/_mixins/desktop/default.nix new file mode 100644 index 0000000..3a77c18 --- /dev/null +++ b/home/_mixins/desktop/default.nix @@ -0,0 +1,47 @@ +{ desktop, lib, username, ... }: { + imports = [ + (./. + "/${desktop}.nix") + ] ++ lib.optional (builtins.pathExists (./. + "/../users/${username}/desktop.nix")) ../users/${username}/desktop.nix; + + # https://nixos.wiki/wiki/Bluetooth#Using_Bluetooth_headsets_with_PulseAudio + services.mpris-proxy.enable = true; + + xresources.properties = { + "XTerm*background" = "#121214"; + "XTerm*foreground" = "#c8c8c8"; + "XTerm*cursorBlink" = true; + "XTerm*cursorColor" = "#FFC560"; + "XTerm*boldColors" = false; + + #Black + DarkGrey + "*color0" = "#141417"; + "*color8" = "#434345"; + #DarkRed + Red + "*color1" = "#D62C2C"; + "*color9" = "#DE5656"; + #DarkGreen + Green + "*color2" = "#42DD76"; + "*color10" = "#A1EEBB"; + #DarkYellow + Yellow + "*color3" = "#FFB638"; + "*color11" = "#FFC560"; + #DarkBlue + Blue + "*color4" = "#28A9FF"; + "*color12" = "#94D4FF"; + #DarkMagenta + Magenta + "*color5" = "#E66DFF"; + "*color13" = "#F3B6FF"; + #DarkCyan + Cyan + "*color6" = "#14E5D4"; + "*color14" = "#A1F5EE"; + #LightGrey + White + "*color7" = "#c8c8c8"; + "*color15" = "#e9e9e9"; + "XTerm*faceName" = "FiraCode Nerd Font:size=13:style=Medium:antialias=true"; + "XTerm*boldFont" = "FiraCode Nerd Font:size=13:style=Bold:antialias=true"; + "XTerm*geometry" = "132x50"; + "XTerm.termName" = "xterm-256color"; + "XTerm*locale" = false; + "XTerm*utf8" = true; + }; +} diff --git a/home/_mixins/desktop/emote.nix b/home/_mixins/desktop/emote.nix new file mode 100644 index 0000000..c6e16c9 --- /dev/null +++ b/home/_mixins/desktop/emote.nix @@ -0,0 +1,22 @@ +{ pkgs, ... }: +{ + # https://github.com/tom-james-watson/emote + home.packages = with pkgs.unstable; [ + emote + ]; + + systemd.user.services = { + emote = { + Unit = { + Description = "Emote"; + }; + Service = { + ExecStart = "${pkgs.unstable.emote}/bin/emote"; + Restart = "on-failure"; + }; + Install = { + WantedBy = [ "default.target" ]; + }; + }; + }; +} diff --git a/home/_mixins/desktop/gitkraken.nix b/home/_mixins/desktop/gitkraken.nix new file mode 100644 index 0000000..692e671 --- /dev/null +++ b/home/_mixins/desktop/gitkraken.nix @@ -0,0 +1,191 @@ +{ pkgs, ... }: +{ + home.packages = with pkgs; [ + unstable.gitkraken + ]; + + home.file = { + ".gitkraken/themes/bearded-vivid-black.jsonc".text = '' + { + "meta": { + "name": "Bearded Vivid Black", + "scheme": "dark" // must be "light" or "dark" + }, + "themeValues": { + // values applied to the entire app + "root": { + "red": "#d62c2c", + "orange": "#ff7135", + "yellow": "#ffb638", + "green": "#42dd76", + "teal": "#14e5d4", + "blue": "#28a9ff", + "ltblue": "#94D4FF", + "purple": "#e66dff", + "app__bg0": "#141417", + "toolbar__bg0": "lighten(saturate(@app__bg0, 3%), 1%)", + "toolbar__bg1": "lighten(@toolbar__bg0, 4%)", //4% + "toolbar__bg2": "lighten(@toolbar__bg1, 6%)", //6% + "panel__bg0": "lighten(@app__bg0, 5%)", //5% + "panel__bg1": "lighten(@panel__bg0, 4%)", //4% + "panel__bg2": "lighten(@panel__bg1, 4%)", //4% + "input__bg": "#141417", + "input-bg-warn-color": "fade(@orange, 60%)", + "panel-border": "fade(#FFFFFF, 8%)", + "section-border": "fade(#FFFFFF, 8%)", + "subtle-border": "fade(#FFFFFF, 4%)", + "modal-overlay-color": "rgba(0,0,0,.5)", + // graph colors + "graph-color-0": "#14E5D4", //cyan + "graph-color-1": "#28A9FF", //blue + "graph-color-2": "#8e00c2", //purle + "graph-color-3": "#E66DFF", //magenta + "graph-color-4": "#F3B6FF", //lt. magenta + "graph-color-5": "#D62C2C", //red + "graph-color-6": "#ff7135", //orange + "graph-color-7": "#FFB638", //yellow + "graph-color-8": "#42DD76", //green + "graph-color-9": "#2ece9d", //teal + // text colors + // values starting with . aren't added to the CSS, they're just variables + ".text-color": "#c8c8c8", + "text-selected": "@.text-color", + "text-normal": "fade(@.text-color, 78%)", + "text-secondary": "fade(@.text-color, 65%)", + "text-disabled": "fade(@.text-color, 45%)", + "text-accent": "#28a9ff", //blue + "text-inverse": "#373737", + "text-bright": "@.text-color", + "text-dimmed": "fade(@text-normal, 20%)", + "text-dimmed-selected": "fade(@text-dimmed, 50%)", + "text-selected-row": "@text-selected", + // buttons + "btn-text": "@text-normal", + "btn-text-hover": "@text-selected", + "default-border": "@text-normal", + "default-bg": "transparent", + "default-hover": "transparent", + "default-border-hover": "@text-selected", + "primary-border": "@blue", + "primary-bg": "fade(@blue, 10%)", //10% + "primary-hover": "fade(@blue, 40%)", //40% + "success-border": "@green", + "success-bg": "fade(@green, 10%)", + "success-hover": "fade(@green, 40%)", + "warning-border": "@orange", + "warning-bg": "fade(@orange, 10%)", + "warning-hover": "fade(@orange, 35%)", + "danger-border": "@red", + "danger-bg": "fade(@red, 10%)", + "danger-hover": "fade(@red, 40%)", + // states + "hover-row": "fade(@blue, 50%)", //15% + "danger-row": "fade(@red, 40%)", + "selected-row": "fade(@blue, 75%)", //20% + "selected-row-border": "none", + "warning-row": "fade(@orange, 40%)", + "droppable": "fade(@yellow, 30%)", + "drop-target": "fade(@green, 50%)", + "input--disabled": "fade(#000000, 10%)", + "link-color": "#14e5d4", //cyan + "link-color-bright": "#14e5d4", //cyan + "form-control-focus": "@blue", + // various app elements + "scroll-thumb-border": "rgba(0,0,0,0)", + "scroll-thumb-bg": "rgba(255,255,255,0.15)", + "scroll-thumb-bg-light": "rgba(0,0,0,0.15)", + "wip-status": "fade(@blue, 40%)", + "card__bg": "@panel__bg2", + "card-shadow": "@rgba(0,0,0,.2)", + "statusbar__warning-bg": "mixLess(@graph-color-7, @app__bg0, 50%)", + "label__yellow-color": "#ffb638", //yellow + "label__light-blue-color": "#28a9ff", //blue + "label__purple-color": "#e66dff", //magenta + // component states + "filtering": "fade(@blue, 50%)", + "soloing": "fade(@orange, 50%)", + "checked-out": "fade(@green, 30%)", + "soloed": "fade(@orange, 30%)", + "filter-match": "fade(@blue, 50%)", + "clone__progress": "fade(@blue, 70%)", + "toolbar__prompt": "fade(@blue, 20%)", + "verified": "fade(@green, 30%)", + "unverified": "fade(#ffffff, 10%)", + "drop-sort-border": "@green", + // terminal + "terminal__repo-name-color": "turquoise", + "terminal__repo-branch-color": "violet", + "terminal__repo-tag-color": "coral", + "terminal__repo-upstream-color": "lime", + "terminal__background": "#121214", + "terminal__cursor": "#ffb638", + "terminal__cursorAccent": "#ffb638", + "terminal__foreground": "#c8c8c8", + "terminal__selection": "#37373a", //grey-dark + "terminal__black": "#141417", + "terminal__red": "#d62c2c", + "terminal__green": "#42dd76", + "terminal__yellow": "#ffb638", + "terminal__blue": "#28a9ff", + "terminal__magenta": "#e66dff", + "terminal__cyan": "#14e5d4", + "terminal__white": "#c8c8c8", + "terminal__brightBlack": "#434345", + "terminal__brightRed": "#DE5656", + "terminal__brightGreen": "#A1EEBB", + "terminal__brightYellow": "#FFC560", + "terminal__brightBlue": "#94D4FF", + "terminal__brightMagenta": "#F3B6FF", + "terminal__brightCyan": "#A1F5EE, + "terminal__brightWhite": "#E9E9E9, + // code editor + "code-bg": "@app__bg0", + "code-foreground": "@text-normal", + "code-blame-color-0": "@graph-color-0", + "code-blame-color-1": "@graph-color-1", + "code-blame-color-2": "@graph-color-2", + "code-blame-color-3": "@graph-color-3", + "code-blame-color-4": "@graph-color-4", + "code-blame-color-5": "@graph-color-5", + "code-blame-color-6": "@graph-color-6", + "code-blame-color-7": "@graph-color-7", + "code-blame-color-8": "@graph-color-8", + "code-blame-color-9": "@graph-color-9", + "added-line": "fade(@green, 30%)", + "deleted-line": "fade(@red, 30%)", + "modified-line": "fade(#000000, 25%)", + "conflict-info-color": "#14e5d4", //cyan + "conflict-left-border-color": "#14e5d4", //cyan + "conflict-left-color": "fade(@conflict-left-border-color, 25%)", + "conflict-right-border-color": "#ffb638", //yellow + "conflict-right-color": "fade(@conflict-right-border-color, 25%)", + "conflict-output-border-color": "#e66dff", //magenta + "conflict-output-color": "fade(@conflict-output-border-color, 25%)" + }, + // override specific values just for the toolbar + "toolbar": { + "text-selected": "rgba(255,255,255,1)", + "text-normal": "rgba(255,255,255,.9)", + "text-secondary": "rgba(255,255,255,.6)", + "text-disabled": "rgba(255,255,255,.4)", + "section-border": "rgba(255,255,255,.2)", + "input__bg": "rgba(0,0,0,.20)", + "link-color": "#14e5d4", //cyan + "btn-text": "var(--text-normal)" + }, + // override specific values just for the tabs bar + "tabsbar": { + "text-selected": "rgba(255,255,255,1)", + "text-normal": "rgba(255,255,255,.9)", + "text-secondary": "rgba(255,255,255,.6)", + "text-disabled": "rgba(255,255,255,.4)", + "section-border": "rgba(255,255,255,.2)", + "input__bg": "rgba(0,0,0,.20)", + "link-color": "#14e5d4", //cyan + "btn-text": "var(--text-normal)" + } + } + } + ''; + }; +} diff --git a/home/_mixins/desktop/gnome-sound-recorder.nix b/home/_mixins/desktop/gnome-sound-recorder.nix new file mode 100644 index 0000000..8c57758 --- /dev/null +++ b/home/_mixins/desktop/gnome-sound-recorder.nix @@ -0,0 +1,19 @@ +{ config, lib, pkgs, username, ... }: +with lib.hm.gvariant; +{ + home.packages = with pkgs; [ + gnome.gnome-sound-recorder + ]; + + dconf.settings = { + "org/gnome/SoundRecorder" = { + audio-channel = "mono"; + audio-profile = "flac"; + }; + }; + + systemd.user.tmpfiles.rules = [ + "d ${config.home.homeDirectory}/Audio 0755 ${username} users - -" + "L+ ${config.home.homeDirectory}/.local/share/org.gnome.SoundRecorder/ - - - - ${config.home.homeDirectory}/Audio/" + ]; +} diff --git a/home/_mixins/desktop/localsend.nix b/home/_mixins/desktop/localsend.nix new file mode 100644 index 0000000..b3c81ca --- /dev/null +++ b/home/_mixins/desktop/localsend.nix @@ -0,0 +1,22 @@ +{ pkgs, ... }: +{ + # https://localsend.org/ + home.packages = with pkgs; [ + localsend + ]; + + systemd.user.services = { + localsend = { + Unit = { + Description = "LocalSend"; + }; + Service = { + ExecStart = "${pkgs.localsend}/bin/localsend"; + Restart = "on-failure"; + }; + Install = { + WantedBy = [ "default.target" ]; + }; + }; + }; +} diff --git a/home/_mixins/desktop/mate.nix b/home/_mixins/desktop/mate.nix new file mode 100644 index 0000000..8e7500d --- /dev/null +++ b/home/_mixins/desktop/mate.nix @@ -0,0 +1,363 @@ +{ config, lib, pkgs, ... }: +with lib.hm.gvariant; +{ + dconf.settings = { + "org/gnome/charmap" = { + font = "Work Sans 22"; + }; + + "org/gnome/desktop/interface" = { + cursor-theme = "Yaru"; + document-font-name = "Work Sans 12"; + font-name = "Work Sans 12"; + gtk-theme = "Yaru-magenta-dark"; + icon-theme = "Yaru-magenta-dark"; + monospace-font-name = "FiraCode Nerd Font Medium 13"; + }; + + "org/gnome/desktop/wm/preferences" = { + button-layout = ":minimize,maximize,close"; + theme = "Yaru-dark"; + titlebar-font = "Work Sans Semi-Bold 12"; + titlebar-uses-system-font = false; + }; + + "org/gnome/evolution/mail" = { + monospace-font = "FiraCode Nerd Font Medium 13"; + search-gravatar-for-photo = true; + show-sender-photo = true; + variable-width-font = "Work Sans 12"; + }; + + "org/gnome/evolution/plugin/external-editor" = { + command = "pluma"; + }; + + "org/gtk/settings/file-chooser" = { + sort-directories-first = true; + }; + + "org/mate/applications-office/calendar" = { + exec = "evolution"; + }; + + "org/mate/applications-office/tasks" = { + exec = "evolution"; + }; + + "org/mate/caja/desktop" = { + computer-icon-visible = false; + font = "Work Sans Medium 12"; + home-icon-visible = true; + trash-icon-visible = false; + }; + + "org/mate/caja/list-view" = { + default-zoom-level = "small"; + }; + + "org/mate/caja/preferences" = { + default-folder-view = "list-view"; + }; + + "org/mate/dictionary" = { + print-font = "Work Sans 12"; + }; + + "org/mate/disk-usage-analyzer/ui" = { + statusbar-visible = true; + }; + + "org/mate/desktop/applications/calculator" = { + exec = "mate-calc"; + }; + + "org/mate/desktop/applications/messager" = { + exec = "telegram-desktop"; + }; + + "org/mate/desktop/applications/terminal" = { + exec = "mate-terminal"; + }; + + "org/mate/desktop/background" = { + picture-filename = ""; + primary-color = "rgb(192,97,203)"; + secondary-color = "rgb(28,113,216)"; + }; + + "org/mate/desktop/font-rendering" = { + antialiasing = "rgba"; + hinting = "slight"; + rgba-order = "rgb"; + }; + + "org/mate/desktop/interface" = { + document-font-name = "Work Sans 12"; + font-name = "Work Sans 12"; + gtk-decoration-layout = ":minimize,maximize,close"; + gtk-theme = "Yaru-magenta-dark"; + gtk-color-scheme = "tooltip_fg_color:#ffffff\ntooltip_bg_color:#343434"; + icon-theme = "Yaru-magenta-dark"; + monospace-font-name = "FiraCode Nerd Font Medium 13"; + }; + + "org/mate/desktop/peripherals/keyboard/kbd" = { + options = [ "terminate\tterminate:ctrl_alt_bksp" "caps\tcaps:none" ]; + }; + + "org/mate/desktop/peripherals/mouse" = { + cursor-size = 32; + cursor-theme = "Yaru"; + }; + + "org/mate/desktop/peripherals/touchpad" = { + disable-while-typing = true; + tap-to-click = true; + three-finger-click = 0; + two-finger-click = 0; + }; + + "org/mate/desktop/session" = { + idle-delay = 30; + }; + + "org/mate/desktop/sound" = { + event-sounds = true; + input-feedback-sounds = true; + theme-name = "Yaru"; + }; + + "org/mate/eom/view" = { + extrapolate = false; + interpolate = false; + }; + + "org/mate/notification-daemon" = { + theme = "slider"; + }; + + "org/mate/marco/general" = { + alt-tab-expand-to-fit-title = true; + button-layout = ":minimize,maximize,close"; + center-new-windows = false; + compositing-manager = true; + num-workspaces = 8; + show-tab-border = false; + theme = "Yaru-dark"; + titlebar-font = "Work Sans Semi-Bold 12"; + }; + + "org/mate/marco/global-keybindings" = { + run-command-1 = "l"; + run-command-2 = "Print"; + run-command-3 = "e"; + run-command-4 = "t"; + run-command-5 = "i"; + run-command-6 = "s"; + run-command-7 = "Escape"; + run-command-8 = "Pause"; + run-command-terminal = "t"; + switch-panels = "disabled"; + switch-windows = "Tab"; + switch-windows-all = "Tab"; + switch-windows-all-backward = "Tab"; + switch-windows-backward = "Tab"; + switch-to-workspace-1 = "1"; + switch-to-workspace-2 = "2"; + switch-to-workspace-3 = "3"; + switch-to-workspace-4 = "4"; + switch-to-workspace-5 = "5"; + switch-to-workspace-6 = "6"; + switch-to-workspace-7 = "7"; + switch-to-workspace-8 = "8"; + }; + + "org/mate/marco/keybinding-commands" = { + command-1 = "mate-screensaver-command --lock"; + command-2 = "/bin/sh -c \"sleep 0.1; mate-screenshot --area\""; + command-3 = "caja"; + command-4 = "mate-terminal --window"; + command-5 = "mate-control-center"; + command-6 = "mate-search-tool"; + command-7 = "mate-system-monitor -p"; + command-8 = "mate-system-monitor -s"; + }; + + "org/mate/marco/window-keybindings" = { + maximize = "Up"; + move-to-center = "c"; + tile-to-corner-ne = "Right"; + tile-to-corner-nw = "Left"; + tile-to-corner-se = "Right"; + tile-to-corner-sw = "Left"; + tile-to-side-e = "Right"; + tile-to-side-w = "Left"; + toggle-shaded = "s"; + unmaximize = "Down"; + }; + + "org/mate/marco/workspace-names" = { + name-1 = " Web "; + name-2 = " Work "; + name-3 = " Chat "; + name-4 = " Code "; + name-5 = " Virt "; + name-6 = " Cast "; + name-7 = " Fun "; + name-8 = " Stuff "; + }; + + "org/mate/maximus" = { + no-maximize = true; + undecorate = false; + }; + + "org/mate/media-handling" = { + autorun-x-content-start-app = [ "x-content/software" "x-content/video-bluray.xml" "x-content/video-dvd.xml" "x-content/video-hddvd.xml" "x-content/video-svcd.xml" "x-content/video-vcd.xml" ]; + }; + + "org/mate/panel" = { + enable-sni-support = true; + show-program-list = true; + }; + + "org/mate/panel/menubar" = { + icon-name = "start-here-symbolic"; + }; + + "org/mate/panel/objects/workspace-switcher/prefs" = { + display-workspace-names = true; + }; + + "org/mate/pluma" = { + auto-indent = true; + bracket-matching = true; + color-scheme = "Yaru-dark"; + display-line-numbers = true; + display-right-margin = true; + display-overview-map = true; + editor-font = "FiraCode Nerd Font Medium 13"; + highlight-current-line = true; + insert-spaces = true; + print-font-body-pango = "FiraCode Nerd Font Medium 10"; + print-font-header-pango = "Work Sans 11"; + print-font-numbers-pango = "Work Sans 8"; + }; + + "org/mate/power-manager" = { + button-power = "interactive"; + sleep-computer-ac = 0; + sleep-display-ac = 3600; + }; + + "org/mate/screensaver" = { + lock-delay = 1; + mode = "single"; + themes = [ "screensavers-footlogo-floaters" ]; + }; + + "org/mate/settings-daemon/plugins/media-keys" = { + magnifier = "m"; + on-screen-keyboard = "k"; + screenreader = "s"; + }; + + "org/mate/stickynotes" = { + default-font = "Work Sans Medium 10"; + }; + + "org/mate/system-monitor" = { + cpu-color0 = "#9A0606"; + cpu-color1 = "#B42828"; + cpu-color10 = "#6B9A06"; + cpu-color11 = "#86B428"; + cpu-color12 = "#A4CD50"; + cpu-color13 = "#C4E67F"; + cpu-color14 = "#E6FFB3"; + cpu-color15 = "#066B9A"; + cpu-color16 = "#2886B4"; + cpu-color17 = "#50A5CD"; + cpu-color18 = "#7FC4E6"; + cpu-color19 = "#B3E6FF"; + cpu-color2 = "#CD5050"; + cpu-color20 = "#21069A"; + cpu-color21 = "#4028B4"; + cpu-color22 = "#6550CD"; + cpu-color23 = "#907FE6"; + cpu-color24 = "#C0B4FF"; + cpu-color25 = "#870087"; + cpu-color26 = "#BC00BC"; + cpu-color27 = "#F100F1"; + cpu-color28 = "#FF4FFF"; + cpu-color29 = "#FF87FF"; + cpu-color3 = "#E67F7F"; + cpu-color30 = "#C4A000"; + cpu-color31 = "#EDD400"; + cpu-color4 = "#FFB4B4"; + cpu-color5 = "#9A5306"; + cpu-color6 = "#B47028"; + cpu-color7 = "#CD8F50"; + cpu-color8 = "#E6B37F"; + cpu-color9 = "#FFDBB5"; + show-tree = true; + solaris-mode = false; + }; + + "org/mate/terminal/profile" = { + allow-bold = false; + use-system-font = true; + }; + }; + + gtk = { + enable = true; + cursorTheme = { + name = "Yaru"; + package = pkgs.yaru-theme; + size = 32; + }; + + font = { + name = "Work Sans 12"; + package = pkgs.work-sans; + }; + + gtk2 = { + configLocation = "${config.xdg.configHome}/gtk-2.0/gtkrc"; + extraConfig = '' + gtk-application-prefer-dark-theme=1 + ''; + }; + + gtk3 = { + extraConfig = { + gtk-application-prefer-dark-theme = 1; + }; + }; + + gtk4 = { + extraConfig = { + gtk-application-prefer-dark-theme = 1; + }; + }; + + iconTheme = { + name = "Yaru-dark-magenta"; + package = pkgs.yaru-theme; + }; + + theme = { + name = "Yaru-dark-magenta"; + package = pkgs.yaru-theme; + }; + }; + + home.pointerCursor = { + name = "Yaru"; + package = pkgs.yaru-theme; + size = 32; + gtk.enable = true; + x11.enable = true; + }; +} diff --git a/home/_mixins/desktop/meld.nix b/home/_mixins/desktop/meld.nix new file mode 100644 index 0000000..6544915 --- /dev/null +++ b/home/_mixins/desktop/meld.nix @@ -0,0 +1,19 @@ +{ lib, pkgs, ... }: +with lib.hm.gvariant; +{ + home.packages = with pkgs; [ + meld + ]; + + dconf.settings = { + "org/gnome/meld" = { + indent-width = 4; + insert-spaces-instead-of-tabs = true; + highlight-current-line = true; + show-line-numbers = true; + prefer-dark-theme = true; + highlight-syntax = true; + style-scheme = "Yaru-dark"; + }; + }; +} diff --git a/home/_mixins/desktop/pantheon.nix b/home/_mixins/desktop/pantheon.nix new file mode 100644 index 0000000..3a9a7e3 --- /dev/null +++ b/home/_mixins/desktop/pantheon.nix @@ -0,0 +1,267 @@ +{ config, lib, pkgs, ... }: +with lib.hm.gvariant; +{ + dconf.settings = { + "com/github/stsdc/monitor/settings" = { + background-state = true; + indicator-state = true; + indicator-cpu-state = false; + indicator-gpu-state = false; + indicator-memory-state = false; + indicator-network-download-state = true; + indicator-network-upload-state = true; + indicator-temperature-state = true; + }; + + "desktop/ibus/panel" = { + show-icon-on-systray = false; + use-custom-font = true; + custom-font = "Work Sans 10"; + }; + + "desktop/ibus/panel/emoji" = { + font = "JoyPixels 16"; + }; + + "io/elementary/code/saved-state" = { + outline-visible = true; + }; + + "io/elementary/code/settings" = { + strip-trailing-on-save = true; + show-mini-map = true; + show-right-margin = true; + style-scheme = "Yaru-dark"; + prefer-dark-style = true; + }; + + "io/elementary/desktop/agent-geoclue2" = { + location-enabled = true; + }; + + "io/elementary/desktop/wingpanel" = { + use-transparency = false; + }; + + "io/elementary/desktop/wingpanel/datetime" = { + clock-format = "24h"; + }; + + "io/elementary/desktop/wingpanel/sound" = { + max-volume = 100.0; + }; + + "io/elementary/files/preferences" = { + singleclick-select = true; + }; + + "io/elementary/notifications/applications/gala-other" = { + remember = false; + sounds = false; + }; + + "io/elementary/settings-daemon/datetime" = { + show-weeks = true; + }; + + "io/elementary/settings-daemon/housekeeping" = { + cleanup-downloads-folder = false; + }; + + "io/elementary/terminal/settings" = { + audible-bell = false; + background = "rgb(18,18,20)"; + cursor-color = "rgb(255,182,56)"; + follow-last-tab = "true"; + font = "FiraCode Nerd Font Medium 13"; + foreground = "rgb(200,200,200)"; + natural-copy-paste = false; + palette = "rgb(20,20,23):rgb(214,43,43):rgb(65,221,117):rgb(255,182,56):rgb(40,169,255):rgb(230,109,255):rgb(20,229,211):rgb(200,200,200):rgb(67,67,69):rgb(222,86,86):rgb(161,238,187):rgb(255,219,156):rgb(148,212,255):rgb(243,182,255):rgb(161,245,238):rgb(233,233,233)"; + theme = "custom"; + unsafe-paste-alert = false; + }; + + "net/launchpad/plank/docks/dock1" = { + alignment = "center"; + hide-mode = "window-dodge"; + icon-size = 48; + pinned-only = false; + position = "left"; + theme = "Transparent"; + }; + + "org/gnome/desktop/datetime" = { + automatic-timezone = true; + }; + + "org/gnome/desktop/input-sources" = { + xkb-options = [ "grp:alt_shift_toggle" "caps:none" ]; + }; + + "org/gnome/desktop/interface" = { + clock-format = "24h"; + color-scheme = "prefer-dark"; + cursor-size = 32; + cursor-theme = "elementary"; + document-font-name = "Work Sans 12"; + font-name = "Work Sans 12"; + gtk-theme = "io.elementary.stylesheet.bubblegum"; + gtk-enable-primary-paste = true; + icon-theme = "elementary"; + monospace-font-name = "FiraCode Nerd Font Medium 13"; + text-scaling-factor = 1.0; + }; + + "org/gnome/desktop/session" = { + idle-delay = lib.hm.gvariant.mkUint32 7200; + }; + + "org/gnome/desktop/sound" = { + theme-name = "elementary"; + }; + + "org/gnome/desktop/wm/keybindings" = { + switch-to-workspace-left = [ "Left" ]; + switch-to-workspace-right = [ "Right" ]; + }; + + "org/gnome/desktop/wm/preferences" = { + audible-bell = false; + button-layout = ":minimize,maximize,close"; + num-workspaces = 8; + titlebar-font = "Work Sans Semi-Bold 12"; + workspace-names = [ "Web" "Work" "Chat" "Code" "Virt" "Cast" "Fun" "Stuff" ]; + }; + + "org/gnome/GWeather" = { + temperature-unit = "centigrade"; + }; + + "org/gnome/mutter" = { + workspaces-only-on-primary = false; + dynamic-workspaces = false; + }; + + + "org/gnome/mutter/keybindings" = { + toggle-tiled-left = [ "Left" ]; + toggle-tiled-right = [ "Right" ]; + }; + + "org/gnome/settings-daemon/plugins/media-keys" = { + custom-keybindings = [ "/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/" ]; + }; + + "org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0" = { + binding = "e"; + command = "io.elementary.files -n ~/"; + name = "io.elementary.files -n ~/"; + }; + + "org/gnome/settings-daemon/plugins/power" = { + power-button-action = "interactive"; + sleep-inactive-ac-timeout = 0; + sleep-inactive-ac-type = "nothing"; + }; + + #"org/gnome/settings-daemon/plugins/xsettings" = { + # overrides = "{\'Gtk/DialogsUseHeader\': <0>, \'Gtk/ShellShowsAppMenu\': <0>, \'Gtk/EnablePrimaryPaste\': <1>, \'Gtk/DecorationLayout\': <\':minimize,maximize,close,menu\'>, \'Gtk/ShowUnicodeMenu\': <0>}"; + #}; + + "org/gtk/gtk4/Settings/FileChooser" = { + clock-format = "24h"; + }; + + "org/gtk/Settings/FileChooser" = { + clock-format = "24h"; + }; + + "org/pantheon/desktop/gala/appearance" = { + button-layout = ":minimize,maximize,close"; + }; + + "org/pantheon/desktop/gala/behavior" = { + dynamic-workspaces = false; + overlay-action = "io.elementary.wingpanel --toggle-indicator=app-launcher"; + }; + + "org/pantheon/desktop/gala/mask-corners" = { + enable = false; + }; + }; + + gtk = { + enable = true; + cursorTheme = { + name = "elementary"; + package = pkgs.pantheon.elementary-icon-theme; + size = 32; + }; + + font = { + name = "Work Sans 12"; + package = pkgs.work-sans; + }; + + gtk2 = { + configLocation = "${config.xdg.configHome}/gtk-2.0/gtkrc"; + extraConfig = '' + gtk-application-prefer-dark-theme=1 + ''; + }; + + gtk3 = { + extraConfig = { + gtk-application-prefer-dark-theme = 1; + }; + }; + + gtk4 = { + extraConfig = { + gtk-application-prefer-dark-theme = 1; + }; + }; + + iconTheme = { + name = "elementary"; + package = pkgs.pantheon.elementary-icon-theme; + }; + + theme = { + name = "io.elementary.stylesheet.bubblegum"; + package = pkgs.pantheon.elementary-gtk-theme; + }; + }; + + home.pointerCursor = { + package = pkgs.pantheon.elementary-icon-theme; + name = "elementary"; + size = 32; + gtk.enable = true; + x11.enable = true; + }; + + home.file = { + "${config.xdg.configHome}/autostart/ibus-daemon.desktop".text = " +[Desktop Entry] +Name=IBus Daemon +Comment=IBus Daemon +Type=Application +Exec=${pkgs.ibus}/bin/ibus-daemon --daemonize --desktop=pantheon --replace --xim +Categories= +Terminal=false +NoDisplay=true +StartupNotify=false"; + + "${config.xdg.configHome}/autostart/monitor.desktop".text = " +[Desktop Entry] +Name=Monitor Indicators +Comment=Monitor Indicators +Type=Application +Exec=/run/current-system/sw/bin/com.github.stsdc.monitor --start-in-background +Icon=com.github.stsdc.monitor +Categories= +Terminal=false +StartupNotify=false"; + }; +} diff --git a/home/_mixins/desktop/rhythmbox.nix b/home/_mixins/desktop/rhythmbox.nix new file mode 100644 index 0000000..7b6393f --- /dev/null +++ b/home/_mixins/desktop/rhythmbox.nix @@ -0,0 +1,22 @@ +{ lib, pkgs, ... }: +with lib.hm.gvariant; +{ + home.packages = with pkgs; [ + rhythmbox + ]; + + dconf.settings = { + "org/gnome/rhythmbox/plugins" = { + active-plugins = [ "rb" "power-manager" "mpris" "iradio" "generic-player" "audiocd" "android" ]; + }; + + "org/gnome/rhythmbox/podcast" = { + download-interval = "manual"; + }; + + "org/gnome/rhythmbox/sources" = { + browser-views = "genres-artists-albums"; + visible-columns = [ "post-time" "duration" "track-number" "album" "genre" "beats-per-minute" "play-count" "artist" ]; + }; + }; +} diff --git a/home/_mixins/desktop/sakura.conf b/home/_mixins/desktop/sakura.conf new file mode 100644 index 0000000..b4a3a1d --- /dev/null +++ b/home/_mixins/desktop/sakura.conf @@ -0,0 +1,75 @@ +[sakura] +colorset1_fore=rgb(192,192,192) +colorset1_back=rgb(18,18,20) +colorset1_curs=rgb(255,182,56) +colorset1_scheme=0 +colorset1_key=F1 +colorset2_fore=rgb(192,192,192) +colorset2_back=rgb(0,0,0) +colorset2_curs=rgb(255,255,255) +colorset2_scheme=1 +colorset2_key=F2 +colorset3_fore=rgb(192,192,192) +colorset3_back=rgb(0,0,0) +colorset3_curs=rgb(255,255,255) +colorset3_scheme=1 +colorset3_key=F3 +colorset4_fore=rgb(192,192,192) +colorset4_back=rgb(0,0,0) +colorset4_curs=rgb(255,255,255) +colorset4_scheme=1 +colorset4_key=F4 +colorset5_fore=rgb(192,192,192) +colorset5_back=rgb(0,0,0) +colorset5_curs=rgb(255,255,255) +colorset5_scheme=1 +colorset5_key=F5 +colorset6_fore=rgb(192,192,192) +colorset6_back=rgb(0,0,0) +colorset6_curs=rgb(255,255,255) +colorset6_scheme=1 +colorset6_key=F6 +last_colorset=1 +bold_is_bright=false +scroll_lines=4096 +font=FixedsysModernV05 Nerd Font Mono 18 +show_tab_bar=never +scrollbar=false +closebutton=false +tabs_on_bottom=false +less_questions=true +disable_numbered_tabswitch=true +use_fading=false +scrollable_tabs=true +urgent_bell=Yes +audible_bell=Yes +blinking_cursor=Yes +cursor_type=VTE_CURSOR_SHAPE_BLOCK +word_chars=-,./?%&#_~: +palette=1 +add_tab_accelerator=5 +del_tab_accelerator=5 +switch_tab_accelerator=8 +move_tab_accelerator=9 +copy_accelerator=5 +scrollbar_accelerator=5 +open_url_accelerator=5 +font_size_accelerator=4 +set_tab_name_accelerator=5 +search_accelerator=5 +add_tab_key=T +del_tab_key=W +prev_tab_key=Left +next_tab_key=Right +copy_key=C +paste_key=V +scrollbar_key=S +set_tab_name_key=N +search_key=F +increase_font_size_key=plus +decrease_font_size_key=minus +fullscreen_key=F11 +set_colorset_accelerator=5 +icon_file=terminal-tango.svg +paste_button=2 +menu_button=3 diff --git a/home/_mixins/desktop/sakura.nix b/home/_mixins/desktop/sakura.nix new file mode 100644 index 0000000..766ea50 --- /dev/null +++ b/home/_mixins/desktop/sakura.nix @@ -0,0 +1,10 @@ +{ config, pkgs, ... }: { + home = { + file = { + "${config.xdg.configHome}/sakura/sakura.conf".text = builtins.readFile ./sakura.conf; + }; + packages = with pkgs; [ + sakura + ]; + }; +} diff --git a/home/_mixins/desktop/tilix.nix b/home/_mixins/desktop/tilix.nix new file mode 100644 index 0000000..42d5f8b --- /dev/null +++ b/home/_mixins/desktop/tilix.nix @@ -0,0 +1,86 @@ +# Generated via dconf2nix: https://github.com/gvolpe/dconf2nix +{ lib, pkgs, ... }: +with lib.hm.gvariant; +{ + home.packages = with pkgs; [ + tilix + ]; + + dconf.settings = { + "com/gexperts/Tilix" = { + app-title = "\${appName}: \${directory}"; + paste-strip-trailing-whitespace = true; + prompt-on-close = true; + quake-hide-lose-focus = true; + quake-specific-monitor = 0; + session-name = "\${id}"; + terminal-title-show-when-single = true; + terminal-title-style = "none"; + use-tabs = true; + window-style = "normal"; + }; + + "com/gexperts/Tilix/keybindings" = { + win-view-sidebar = "F12"; + }; + + "com/gexperts/Tilix/profiles" = { + default = "d1def387-a465-4497-81bc-b8b2de782b2d"; + list = [ "d1def387-a465-4497-81bc-b8b2de782b2d" ]; + }; + + "com/gexperts/Tilix/profiles/d1def387-a465-4497-81bc-b8b2de782b2d" = { + background-color = "#121212121414"; + badge-color = "#E6E66D6DFFFF"; + badge-color-set = true; + badge-font = "FiraCode Nerd Font Mono 12"; + badge-text = "\${columns}x\${rows}"; + badge-use-system-font = false; + bold-color = "#C8C8C8C8C8C8"; + bold-color-set = true; + bold-is-bright = false; + cell-height-scale = 1.0; + cell-width-scale = 1.0; + cursor-background-color = "#FFFFB6B63838"; + cursor-blink-mode = "on"; + cursor-colors-set = true; + cursor-foreground-color = "#FFFFB6B63838"; + default-size-columns = 132; + default-size-rows = 50; + draw-margin = 80; + font = "FiraCode Nerd Font Medium 12"; + foreground-color = "#C8C8C8C8C8C8"; + highlight-background-color = "#1E1E1E1E2020"; + highlight-colors-set = false; + highlight-foreground-color = "#C8C8C8C8C8C8"; + palette = [ "#121212121414" "#D6D62B2B2B2B" "#4141DDDD7575" "#FFFFB6B63838" "#2828A9A9FFFF" "#E6E66D6DFFFF" "#1414E5E5D3D3" "#C8C8C8C8C8C8" "#434343434545" "#DEDE56565656" "#A1A1EEEEBBBB" "#FFFFC5C56060" "#9494D4D4FFFF" "#F2F2B6B6FFFF" "#A0A0F5F5EDED" "#E9E9E9E9E9E9" ]; + scrollback-unlimited = true; + terminal-title = ""; + use-system-font = true; + use-theme-colors = false; + visible-name = "Bearded Dark Vivid"; + }; + + "org/gnome/desktop/default/applications/terminal" = { + exec = "tilix"; + exec-arg = "-e"; + }; + + "org/gnome/settings-daemon/plugins/media-keys" = { + custom-keybindings = [ "/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/" "/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/" "/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom2/" ]; + terminal = [ "" ]; + }; + + "org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1" = { + binding = "t"; + command = "tilix"; + name = "tilix"; + }; + + "org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom2" = { + binding = "t"; + command = "tilix"; + name = "tilix"; + }; + }; +} diff --git a/home/_mixins/desktop/vorta.nix b/home/_mixins/desktop/vorta.nix new file mode 100644 index 0000000..0a357be --- /dev/null +++ b/home/_mixins/desktop/vorta.nix @@ -0,0 +1,22 @@ +{ pkgs, ... }: +{ + home.packages = with pkgs; [ + borgbackup + vorta + ]; + + systemd.user.services = { + vorta = { + Unit = { + Description = "Vorta"; + }; + Service = { + ExecStart = "${pkgs.vorta}/bin/vorta --daemonise"; + Restart = "on-failure"; + }; + Install = { + WantedBy = [ "default.target" ]; + }; + }; + }; +} diff --git a/home/_mixins/services/keybase-gui.nix b/home/_mixins/services/keybase-gui.nix new file mode 100644 index 0000000..0ad6085 --- /dev/null +++ b/home/_mixins/services/keybase-gui.nix @@ -0,0 +1,21 @@ +{ pkgs, ... }: +{ + home.packages = with pkgs; [ + keybase-gui + ]; + + systemd.user.services = { + keybase-gui = { + Unit = { + Description = "Keybase GUI"; + }; + Service = { + ExecStart = "${pkgs.keybase-gui}/bin/keybase-gui"; + Restart = "on-failure"; + }; + Install = { + WantedBy = [ "default.target" ]; + }; + }; + }; +} diff --git a/home/_mixins/services/keybase.nix b/home/_mixins/services/keybase.nix new file mode 100644 index 0000000..9844ac4 --- /dev/null +++ b/home/_mixins/services/keybase.nix @@ -0,0 +1,12 @@ +{ desktop, lib, ... }: { + imports = [ ] ++ lib.optionals (desktop != null) [ + ./keybase-gui.nix + ]; + + services = { + kbfs = { + enable = true; + mountPoint = "Keybase"; + }; + }; +} diff --git a/home/_mixins/services/syncthing-tray.nix b/home/_mixins/services/syncthing-tray.nix new file mode 100644 index 0000000..fc14743 --- /dev/null +++ b/home/_mixins/services/syncthing-tray.nix @@ -0,0 +1,8 @@ +{ pkgs, ... }: { + services.syncthing = { + tray = { + enable = true; + package = pkgs.unstable.syncthingtray; + }; + }; +} diff --git a/home/_mixins/services/syncthing.nix b/home/_mixins/services/syncthing.nix new file mode 100644 index 0000000..de627d0 --- /dev/null +++ b/home/_mixins/services/syncthing.nix @@ -0,0 +1,16 @@ +{ config, desktop, hostname, lib, ... }: { + imports = [ ] ++ lib.optionals (desktop != null) [ + ./syncthing-tray.nix + ]; + + services.syncthing = { + enable = true; + extraOptions = [ + "--config=${config.home.homeDirectory}/Syncthing/Devices/${hostname}" + "--data=${config.home.homeDirectory}/Syncthing/DB/${hostname}" + "--gui-address=0.0.0.0:8384" + "--no-default-folder" + "--no-browser" + ]; + }; +} diff --git a/home/gburd/.gitconfig b/home/gburd/.gitconfig new file mode 100644 index 0000000..1640f28 --- /dev/null +++ b/home/gburd/.gitconfig @@ -0,0 +1,54 @@ +[format] + pretty=format:%C(yellow)%h%Creset | %C(green)%ad (%ar)%Creset | %C(blue)%an%Creset | %s + +[push] + default = simple + +[branch] + autosetuprebase = always + +[receive] + denyCurrentBranch = warn + +[filter "media"] + clean = git media clean %f + smudge = git media smudge %f + required = true + +# http://nicercode.github.io/blog/2013-04-30-excel-and-line-endings/ +[filter "cr"] + clean = LC_CTYPE=C awk '{printf(\"%s\\n\", $0)}' | LC_CTYPE=C tr '\\r' '\\n' + smudge = tr '\\n' '\\r' + +[diff] + tool = meld +[difftool] + prompt = false +[difftool "meld"] + cmd = meld "$LOCAL" "$REMOTE" + +[merge] + tool = meld +[mergetool "meld"] + # Choose one of these 2 lines (not both!) explained below. + cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output "$MERGED" + cmd = meld "$LOCAL" "$BASE" "$REMOTE" --output "$MERGED" + +[core] + editor = vim +# editor = emacs -nw -q + excludesfile = ~/.gitignore_global + pager = less -FMRiX + quotepath = false + +[filter "lfs"] + process = git-lfs filter-process + required = true + clean = git-lfs clean -- %f + smudge = git-lfs smudge -- %f + +[init] + templateDir = /home/gregburd/.git-template + defaultBranch = main +[commit] + gpgsign = true diff --git a/home/gburd/features/cli/bash.nix b/home/gburd/_mixins/cli/bash.nix similarity index 100% rename from home/gburd/features/cli/bash.nix rename to home/gburd/_mixins/cli/bash.nix diff --git a/home/gburd/features/cli/bat.nix b/home/gburd/_mixins/cli/bat.nix similarity index 100% rename from home/gburd/features/cli/bat.nix rename to home/gburd/_mixins/cli/bat.nix diff --git a/home/gburd/features/cli/default.nix b/home/gburd/_mixins/cli/default.nix similarity index 88% rename from home/gburd/features/cli/default.nix rename to home/gburd/_mixins/cli/default.nix index 527ed9f..f2c00de 100644 --- a/home/gburd/features/cli/default.nix +++ b/home/gburd/_mixins/cli/default.nix @@ -1,4 +1,4 @@ -{ pkgs, lib, config, ... }: { +{ pkgs, ... }: { imports = [ ./bash.nix ./bat.nix @@ -17,6 +17,7 @@ ./starship.nix ./xpo.nix ]; + home.packages = with pkgs; [ comma # Install and run programs by sticking a , before them distrobox # Nice escape hatch, integrates docker images with my environment @@ -24,7 +25,7 @@ bc # Calculator bottom # System viewer ncdu # TUI disk usage -# eza # Better ls + # eza # Better ls ripgrep # Better grep fd # Better find curl # cURL @@ -41,6 +42,6 @@ tly # Tally counter -# inputs.nh.default # nixos-rebuild and home-manager CLI wrapper + inputs.nh.default # nixos-rebuild and home-manager CLI wrapper ]; } diff --git a/home/gburd/features/cli/direnv.nix b/home/gburd/_mixins/cli/direnv.nix similarity index 100% rename from home/gburd/features/cli/direnv.nix rename to home/gburd/_mixins/cli/direnv.nix diff --git a/home/gburd/features/cli/fish.nix b/home/gburd/_mixins/cli/fish.nix similarity index 100% rename from home/gburd/features/cli/fish.nix rename to home/gburd/_mixins/cli/fish.nix diff --git a/home/gburd/features/cli/gh.nix b/home/gburd/_mixins/cli/gh.nix similarity index 100% rename from home/gburd/features/cli/gh.nix rename to home/gburd/_mixins/cli/gh.nix diff --git a/home/gburd/features/cli/git.nix b/home/gburd/_mixins/cli/git.nix similarity index 98% rename from home/gburd/features/cli/git.nix rename to home/gburd/_mixins/cli/git.nix index 0dab974..0308099 100644 --- a/home/gburd/features/cli/git.nix +++ b/home/gburd/_mixins/cli/git.nix @@ -1,4 +1,4 @@ -{ pkgs, lib, config, ... }: +{ pkgs, config, ... }: let ssh = "${pkgs.openssh}/bin/ssh"; diff --git a/home/gburd/features/cli/gpg-commands.nix b/home/gburd/_mixins/cli/gpg-commands.nix similarity index 100% rename from home/gburd/features/cli/gpg-commands.nix rename to home/gburd/_mixins/cli/gpg-commands.nix diff --git a/home/gburd/features/cli/gpg.nix b/home/gburd/_mixins/cli/gpg.nix similarity index 89% rename from home/gburd/features/cli/gpg.nix rename to home/gburd/_mixins/cli/gpg.nix index 8f932cb..ecc466c 100644 --- a/home/gburd/features/cli/gpg.nix +++ b/home/gburd/_mixins/cli/gpg.nix @@ -1,4 +1,4 @@ -{ pkgs, config, lib, ... }: +{ pkgs, config, ... }: let pinentry = if config.gtk.enable then { @@ -10,13 +10,14 @@ let }; in { -# home.packages = pinentry.packages; + # home.packages = pinentry.packages; home.packages = [ pkgs.pinentry-curses ]; - services.gpg-agent = { #TODO: gnupg vs gpg-agent ? + services.gpg-agent = { + #TODO: gnupg vs gpg-agent ? enable = true; enableSshSupport = true; -# sshKeys = [ "149F16412997785363112F3DBD713BC91D51B831" ]; + # sshKeys = [ "149F16412997785363112F3DBD713BC91D51B831" ]; pinentryFlavor = pinentry.name; enableExtraSocket = true; }; diff --git a/home/gburd/features/cli/jujutsu.nix b/home/gburd/_mixins/cli/jujutsu.nix similarity index 100% rename from home/gburd/features/cli/jujutsu.nix rename to home/gburd/_mixins/cli/jujutsu.nix diff --git a/home/gburd/features/cli/nix-index.nix b/home/gburd/_mixins/cli/nix-index.nix similarity index 100% rename from home/gburd/features/cli/nix-index.nix rename to home/gburd/_mixins/cli/nix-index.nix diff --git a/home/gburd/features/cli/pfetch.nix b/home/gburd/_mixins/cli/pfetch.nix similarity index 100% rename from home/gburd/features/cli/pfetch.nix rename to home/gburd/_mixins/cli/pfetch.nix diff --git a/home/gburd/features/cli/ranger.nix b/home/gburd/_mixins/cli/ranger.nix similarity index 100% rename from home/gburd/features/cli/ranger.nix rename to home/gburd/_mixins/cli/ranger.nix diff --git a/home/gburd/features/cli/screen.nix b/home/gburd/_mixins/cli/screen.nix similarity index 100% rename from home/gburd/features/cli/screen.nix rename to home/gburd/_mixins/cli/screen.nix diff --git a/home/gburd/features/cli/shellcolor.nix b/home/gburd/_mixins/cli/shellcolor.nix similarity index 100% rename from home/gburd/features/cli/shellcolor.nix rename to home/gburd/_mixins/cli/shellcolor.nix diff --git a/home/gburd/features/cli/ssh.nix b/home/gburd/_mixins/cli/ssh.nix similarity index 100% rename from home/gburd/features/cli/ssh.nix rename to home/gburd/_mixins/cli/ssh.nix diff --git a/home/gburd/features/cli/starship.nix b/home/gburd/_mixins/cli/starship.nix similarity index 82% rename from home/gburd/features/cli/starship.nix rename to home/gburd/_mixins/cli/starship.nix index b532192..1002001 100644 --- a/home/gburd/features/cli/starship.nix +++ b/home/gburd/_mixins/cli/starship.nix @@ -50,18 +50,25 @@ style = "bold red"; }; custom = { - nix_inspect = let - excluded = [ - "kitty" "imagemagick" "ncurses" "user-environment" "pciutils" "binutils-wrapper" - ]; - in { - disabled = false; - when = "test -z $IN_NIX_SHELL"; - command = "${(lib.getExe pkgs.nix-inspect)} ${(lib.concatStringsSep " " excluded)}"; - format = "[($output <- )$symbol]($style) "; - symbol = "ο‹œ "; - style = "bold blue"; - }; + nix_inspect = + let + excluded = [ + "kitty" + "imagemagick" + "ncurses" + "user-environment" + "pciutils" + "binutils-wrapper" + ]; + in + { + disabled = false; + when = "test -z $IN_NIX_SHELL"; + command = "${(lib.getExe pkgs.nix-inspect)} ${(lib.concatStringsSep " " excluded)}"; + format = "[($output <- )$symbol]($style) "; + symbol = "ο‹œ "; + style = "bold blue"; + }; }; character = { diff --git a/home/gburd/features/cli/xpo.nix b/home/gburd/_mixins/cli/xpo.nix similarity index 100% rename from home/gburd/features/cli/xpo.nix rename to home/gburd/_mixins/cli/xpo.nix diff --git a/home/gburd/global/default.nix b/home/gburd/_mixins/default.nix similarity index 80% rename from home/gburd/global/default.nix rename to home/gburd/_mixins/default.nix index df8f5b5..494d925 100644 --- a/home/gburd/global/default.nix +++ b/home/gburd/_mixins/default.nix @@ -1,21 +1,17 @@ { inputs, lib, pkgs, config, outputs, ... }: -let - inherit (inputs.nix-colors) colorSchemes; - inherit (inputs.nix-colors.lib-contrib { inherit pkgs; }) colorschemeFromPicture nixWallpaperFromScheme; -in { imports = [ inputs.impermanence.nixosModules.home-manager.impermanence inputs.nix-colors.homeManagerModule - ../features/cli - ../features/nvim + ./cli + ./nvim ] ++ (builtins.attrValues outputs.homeManagerModules); nixpkgs = { overlays = builtins.attrValues outputs.overlays; config = { allowUnfree = true; - allowUnfreePredicate = (_: true); + allowUnfreePredicate = _: true; }; }; @@ -41,7 +37,7 @@ in stateVersion = lib.mkDefault "23.05"; sessionPath = [ "$HOME/.local/bin" ]; sessionVariables = { - FLAKE = "$HOME/Documents/NixConfig"; + FLAKE = "$HOME/ws/nix-config"; }; persistence = { diff --git a/home/gburd/features/desktop/common/alacritty.nix b/home/gburd/_mixins/desktop/common/alacritty.nix similarity index 100% rename from home/gburd/features/desktop/common/alacritty.nix rename to home/gburd/_mixins/desktop/common/alacritty.nix diff --git a/home/gburd/features/desktop/common/default.nix b/home/gburd/_mixins/desktop/common/default.nix similarity index 90% rename from home/gburd/features/desktop/common/default.nix rename to home/gburd/_mixins/desktop/common/default.nix index 32ae268..a53127f 100644 --- a/home/gburd/features/desktop/common/default.nix +++ b/home/gburd/_mixins/desktop/common/default.nix @@ -6,7 +6,7 @@ ./alacritty.nix ./font.nix ./gtk.nix -# ./kdeconnect.nix + # ./kdeconnect.nix ./pavucontrol.nix ./playerctl.nix ./qt.nix diff --git a/home/gburd/features/desktop/common/deluge.nix b/home/gburd/_mixins/desktop/common/deluge.nix similarity index 100% rename from home/gburd/features/desktop/common/deluge.nix rename to home/gburd/_mixins/desktop/common/deluge.nix diff --git a/home/gburd/features/desktop/common/discord.nix b/home/gburd/_mixins/desktop/common/discord.nix similarity index 99% rename from home/gburd/features/desktop/common/discord.nix rename to home/gburd/_mixins/desktop/common/discord.nix index 68c9221..97492f9 100644 --- a/home/gburd/features/desktop/common/discord.nix +++ b/home/gburd/_mixins/desktop/common/discord.nix @@ -1,4 +1,4 @@ -{ config, pkgs, lib, ... }: +{ config, pkgs, ... }: let inherit (config.colorscheme) colors; in { diff --git a/home/gburd/features/desktop/common/dragon.nix b/home/gburd/_mixins/desktop/common/dragon.nix similarity index 100% rename from home/gburd/features/desktop/common/dragon.nix rename to home/gburd/_mixins/desktop/common/dragon.nix diff --git a/home/gburd/_mixins/desktop/common/firefox.nix b/home/gburd/_mixins/desktop/common/firefox.nix new file mode 100644 index 0000000..23e1a1c --- /dev/null +++ b/home/gburd/_mixins/desktop/common/firefox.nix @@ -0,0 +1,127 @@ +{ pkgs, ... }: +{ + programs.browserpass.enable = true; + programs.firefox = { + enable = true; + + package = pkgs.wrapFirefox pkgs.firefox-unwrapped { + extraPolicies = { + CaptivePortal = false; + DisableFirefoxStudies = true; + DisablePocket = true; + DisableTelemetry = true; + DisableFirefoxAccounts = false; + NoDefaultBookmarks = true; + OfferToSaveLogins = false; + OfferToSaveLoginsDefault = false; + PasswordManagerEnabled = false; + FirefoxHome = { + Search = true; + Pocket = false; + Snippets = false; + TopSites = false; + Highlights = false; + }; + UserMessaging = { + ExtensionRecommendations = false; + SkipOnboarding = true; + }; + }; + }; + + profiles.gburd = { + id = 0; + bookmarks = { }; + extensions = with pkgs.inputs.firefox-addons; [ + # autoplay-no-more + bypass-paywalls-clean + i-dont-care-about-cookies + # kagi-search-for-firefox + clearurls + decentraleyes + disconnect + duckduckgo-privacy-essentials + floccus + ghostery + # https-everywhere + # languagetool + # onetab + privacy-badger + privacy-badger + privacy-redirect + proton-pass + react-devtools + ublock-origin + ]; + search = { + force = true; + default = "Kagi"; + engines = { + "Nix Packages" = { + urls = [{ + template = "https://search.nixos.org/packages"; + params = [ + { name = "type"; value = "packages"; } + { name = "query"; value = "{searchTerms}"; } + ]; + }]; + icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg"; + definedAliases = [ "@np" ]; + }; + "NixOS Wiki" = { + urls = [{ template = "https://nixos.wiki/index.php?search={searchTerms}"; }]; + iconUpdateURL = "https://nixos.wiki/favicon.png"; + updateInterval = 24 * 60 * 60 * 1000; + definedAliases = [ "@nw" ]; + }; + "Wikipedia (en)".metaData.alias = "@wiki"; + "Google".metaData.hidden = true; + "Amazon.com".metaData.hidden = true; + "Bing".metaData.hidden = true; + "eBay".metaData.hidden = true; + }; + }; + extraConfig = '' + user_pref("toolkit.legacyUserProfileCustomizations.stylesheets", true); + user_pref("full-screen-api.ignore-widgets", true); + user_pref("media.ffmpeg.vaapi.enabled", true); + user_pref("media.rdd-vpx.enabled", true); + ''; + userChrome = '' + # a css + ''; + userContent = '' + # Here too + ''; + settings = { + "general.smoothScroll" = true; + "browser.disableResetPrompt" = true; + "browser.download.panel.shown" = true; + "browser.download.useDownloadDir" = false; + "browser.newtabpage.activity-stream.showSponsoredTopSites" = false; + "browser.shell.checkDefaultBrowser" = false; + "browser.shell.defaultBrowserCheckCount" = 1; + "browser.startup.homepage" = "about:blank"; + "browser.uiCustomization.state" = ''{"placements":{"widget-overflow-fixed-list":[],"nav-bar":["back-button","forward-button","stop-reload-button","home-button","urlbar-container","downloads-button","library-button","ublock0_raymondhill_net-browser-action","_testpilot-containers-browser-action"],"toolbar-menubar":["menubar-items"],"TabsToolbar":["tabbrowser-tabs","new-tab-button","alltabs-button"],"PersonalToolbar":["import-button","personal-bookmarks"]},"seen":["save-to-pocket-button","developer-button","ublock0_raymondhill_net-browser-action","_testpilot-containers-browser-action"],"dirtyAreaCache":["nav-bar","PersonalToolbar","toolbar-menubar","TabsToolbar","widget-overflow-fixed-list"],"currentVersion":18,"newElementCount":4}''; + "dom.security.https_only_mode" = true; + "identity.fxaccounts.enabled" = false; + "privacy.trackingprotection.enabled" = true; + "signon.rememberSignons" = false; + }; + }; + }; + + home = { + persistence = { + # Not persisting is safer, but... + "/persist/home/gburd".directories = [ ".mozilla/firefox" ]; + }; + }; + + xdg.mimeApps.defaultApplications = { + "text/html" = [ "firefox.desktop" ]; + "text/xml" = [ "firefox.desktop" ]; + "x-scheme-handler/http" = [ "firefox.desktop" ]; + "x-scheme-handler/https" = [ "firefox.desktop" ]; + }; +} diff --git a/home/gburd/features/desktop/common/font.nix b/home/gburd/_mixins/desktop/common/font.nix similarity index 100% rename from home/gburd/features/desktop/common/font.nix rename to home/gburd/_mixins/desktop/common/font.nix diff --git a/home/gburd/features/desktop/common/gnome-wm/default.nix b/home/gburd/_mixins/desktop/common/gnome-wm/default.nix similarity index 75% rename from home/gburd/features/desktop/common/gnome-wm/default.nix rename to home/gburd/_mixins/desktop/common/gnome-wm/default.nix index dabc9e7..09785e3 100644 --- a/home/gburd/features/desktop/common/gnome-wm/default.nix +++ b/home/gburd/_mixins/desktop/common/gnome-wm/default.nix @@ -1,14 +1,14 @@ { pkgs, ... }: { - imports = []; + imports = [ ]; home.packages = with pkgs; [ # Gnome3 apps -# gnome3.eog # image viewer -# gnome3.evince # pdf reader + # gnome3.eog # image viewer + # gnome3.evince # pdf reader # Desktop look & feel -# gnome.gnome-tweak-tool + # gnome.gnome-tweak-tool # Extensions gnomeExtensions.appindicator @@ -32,8 +32,8 @@ # gnome.gnome-tweaks # ] # }; -# dbus.packages = [ pkgs.gnome.dconf ]; -# udev.packages = [ pkgs.gnome.gnome-settings- + # dbus.packages = [ pkgs.gnome.dconf ]; + # udev.packages = [ pkgs.gnome.gnome-settings- home.sessionVariables = { MOZ_ENABLE_WAYLAND = 1; diff --git a/home/gburd/features/desktop/common/gtk.nix b/home/gburd/_mixins/desktop/common/gtk.nix similarity index 100% rename from home/gburd/features/desktop/common/gtk.nix rename to home/gburd/_mixins/desktop/common/gtk.nix diff --git a/home/gburd/features/desktop/common/kdeconnect.nix b/home/gburd/_mixins/desktop/common/kdeconnect.nix similarity index 98% rename from home/gburd/features/desktop/common/kdeconnect.nix rename to home/gburd/_mixins/desktop/common/kdeconnect.nix index 7dc253f..6512f3a 100644 --- a/home/gburd/features/desktop/common/kdeconnect.nix +++ b/home/gburd/_mixins/desktop/common/kdeconnect.nix @@ -1,4 +1,4 @@ -{ pkgs, lib, ... }: +{ pkgs, ... }: let diff --git a/home/gburd/features/desktop/common/pavucontrol.nix b/home/gburd/_mixins/desktop/common/pavucontrol.nix similarity index 100% rename from home/gburd/features/desktop/common/pavucontrol.nix rename to home/gburd/_mixins/desktop/common/pavucontrol.nix diff --git a/home/gburd/features/desktop/common/playerctl.nix b/home/gburd/_mixins/desktop/common/playerctl.nix similarity index 100% rename from home/gburd/features/desktop/common/playerctl.nix rename to home/gburd/_mixins/desktop/common/playerctl.nix diff --git a/home/gburd/features/desktop/common/protonmail-bridge.nix b/home/gburd/_mixins/desktop/common/protonmail-bridge.nix similarity index 100% rename from home/gburd/features/desktop/common/protonmail-bridge.nix rename to home/gburd/_mixins/desktop/common/protonmail-bridge.nix diff --git a/home/gburd/features/desktop/common/qt.nix b/home/gburd/_mixins/desktop/common/qt.nix similarity index 85% rename from home/gburd/features/desktop/common/qt.nix rename to home/gburd/_mixins/desktop/common/qt.nix index 261768f..1ceedde 100644 --- a/home/gburd/features/desktop/common/qt.nix +++ b/home/gburd/_mixins/desktop/common/qt.nix @@ -1,4 +1,4 @@ -{ pkgs, config, ... }: +{ pkgs, ... }: { qt = { enable = true; diff --git a/home/gburd/features/desktop/common/slack.nix b/home/gburd/_mixins/desktop/common/slack.nix similarity index 100% rename from home/gburd/features/desktop/common/slack.nix rename to home/gburd/_mixins/desktop/common/slack.nix diff --git a/home/gburd/features/desktop/common/sublime-music.nix b/home/gburd/_mixins/desktop/common/sublime-music.nix similarity index 86% rename from home/gburd/features/desktop/common/sublime-music.nix rename to home/gburd/_mixins/desktop/common/sublime-music.nix index ba177b0..0bd6b04 100644 --- a/home/gburd/features/desktop/common/sublime-music.nix +++ b/home/gburd/_mixins/desktop/common/sublime-music.nix @@ -1,4 +1,4 @@ -{ pkgs, lib, ... }: { +{ pkgs, ... }: { home.packages = [ pkgs.sublime-music ]; home.persistence = { "/persist/home/gburd".directories = [ ".config/sublime-music" ]; diff --git a/home/gburd/features/desktop/common/wayland-wm/default.nix b/home/gburd/_mixins/desktop/common/wayland-wm/default.nix similarity index 100% rename from home/gburd/features/desktop/common/wayland-wm/default.nix rename to home/gburd/_mixins/desktop/common/wayland-wm/default.nix diff --git a/home/gburd/features/desktop/common/wayland-wm/gammastep.nix b/home/gburd/_mixins/desktop/common/wayland-wm/gammastep.nix similarity index 100% rename from home/gburd/features/desktop/common/wayland-wm/gammastep.nix rename to home/gburd/_mixins/desktop/common/wayland-wm/gammastep.nix diff --git a/home/gburd/features/desktop/common/wayland-wm/hyprland-vnc.nix b/home/gburd/_mixins/desktop/common/wayland-wm/hyprland-vnc.nix similarity index 100% rename from home/gburd/features/desktop/common/wayland-wm/hyprland-vnc.nix rename to home/gburd/_mixins/desktop/common/wayland-wm/hyprland-vnc.nix diff --git a/home/gburd/features/desktop/common/wayland-wm/kitty.nix b/home/gburd/_mixins/desktop/common/wayland-wm/kitty.nix similarity index 100% rename from home/gburd/features/desktop/common/wayland-wm/kitty.nix rename to home/gburd/_mixins/desktop/common/wayland-wm/kitty.nix diff --git a/home/gburd/features/desktop/common/wayland-wm/mako.nix b/home/gburd/_mixins/desktop/common/wayland-wm/mako.nix similarity index 100% rename from home/gburd/features/desktop/common/wayland-wm/mako.nix rename to home/gburd/_mixins/desktop/common/wayland-wm/mako.nix diff --git a/home/gburd/features/desktop/common/wayland-wm/qutebrowser.nix b/home/gburd/_mixins/desktop/common/wayland-wm/qutebrowser.nix similarity index 99% rename from home/gburd/features/desktop/common/wayland-wm/qutebrowser.nix rename to home/gburd/_mixins/desktop/common/wayland-wm/qutebrowser.nix index 9efd4f5..43816a0 100644 --- a/home/gburd/features/desktop/common/wayland-wm/qutebrowser.nix +++ b/home/gburd/_mixins/desktop/common/wayland-wm/qutebrowser.nix @@ -1,4 +1,4 @@ -{ config, pkgs, ... }: +{ config, ... }: let inherit (config.colorscheme) colors kind; in diff --git a/home/gburd/features/desktop/common/wayland-wm/swayidle.nix b/home/gburd/_mixins/desktop/common/wayland-wm/swayidle.nix similarity index 100% rename from home/gburd/features/desktop/common/wayland-wm/swayidle.nix rename to home/gburd/_mixins/desktop/common/wayland-wm/swayidle.nix diff --git a/home/gburd/features/desktop/common/wayland-wm/swaylock.nix b/home/gburd/_mixins/desktop/common/wayland-wm/swaylock.nix similarity index 100% rename from home/gburd/features/desktop/common/wayland-wm/swaylock.nix rename to home/gburd/_mixins/desktop/common/wayland-wm/swaylock.nix diff --git a/home/gburd/features/desktop/common/wayland-wm/waybar.nix b/home/gburd/_mixins/desktop/common/wayland-wm/waybar.nix similarity index 100% rename from home/gburd/features/desktop/common/wayland-wm/waybar.nix rename to home/gburd/_mixins/desktop/common/wayland-wm/waybar.nix diff --git a/home/gburd/features/desktop/common/wayland-wm/wezterm.nix b/home/gburd/_mixins/desktop/common/wayland-wm/wezterm.nix similarity index 98% rename from home/gburd/features/desktop/common/wayland-wm/wezterm.nix rename to home/gburd/_mixins/desktop/common/wayland-wm/wezterm.nix index 692f5fb..ceb31bf 100644 --- a/home/gburd/features/desktop/common/wayland-wm/wezterm.nix +++ b/home/gburd/_mixins/desktop/common/wayland-wm/wezterm.nix @@ -1,4 +1,4 @@ -{ config, pkgs, ... }: +{ config, ... }: let inherit (config) colorscheme; diff --git a/home/gburd/features/desktop/common/wayland-wm/wofi-run-shell.patch b/home/gburd/_mixins/desktop/common/wayland-wm/wofi-run-shell.patch similarity index 100% rename from home/gburd/features/desktop/common/wayland-wm/wofi-run-shell.patch rename to home/gburd/_mixins/desktop/common/wayland-wm/wofi-run-shell.patch diff --git a/home/gburd/features/desktop/common/wayland-wm/wofi.nix b/home/gburd/_mixins/desktop/common/wayland-wm/wofi.nix similarity index 100% rename from home/gburd/features/desktop/common/wayland-wm/wofi.nix rename to home/gburd/_mixins/desktop/common/wayland-wm/wofi.nix diff --git a/home/gburd/features/desktop/common/wayland-wm/zathura.nix b/home/gburd/_mixins/desktop/common/wayland-wm/zathura.nix similarity index 100% rename from home/gburd/features/desktop/common/wayland-wm/zathura.nix rename to home/gburd/_mixins/desktop/common/wayland-wm/zathura.nix diff --git a/home/gburd/features/desktop/gnome/default.nix b/home/gburd/_mixins/desktop/gnome/default.nix similarity index 91% rename from home/gburd/features/desktop/gnome/default.nix rename to home/gburd/_mixins/desktop/gnome/default.nix index 7041143..ebb0425 100644 --- a/home/gburd/features/desktop/gnome/default.nix +++ b/home/gburd/_mixins/desktop/gnome/default.nix @@ -1,4 +1,4 @@ -{ config, pkgs, lib, ... }: { +{ pkgs, ... }: { imports = [ ../common ../common/gnome-wm diff --git a/home/gburd/features/desktop/gnome/tty-init.nix b/home/gburd/_mixins/desktop/gnome/tty-init.nix similarity index 100% rename from home/gburd/features/desktop/gnome/tty-init.nix rename to home/gburd/_mixins/desktop/gnome/tty-init.nix diff --git a/home/gburd/features/desktop/wireless/default.nix b/home/gburd/_mixins/desktop/wireless/default.nix similarity index 100% rename from home/gburd/features/desktop/wireless/default.nix rename to home/gburd/_mixins/desktop/wireless/default.nix diff --git a/home/gburd/features/desktop/wireless/wpa-gui.nix b/home/gburd/_mixins/desktop/wireless/wpa-gui.nix similarity index 100% rename from home/gburd/features/desktop/wireless/wpa-gui.nix rename to home/gburd/_mixins/desktop/wireless/wpa-gui.nix diff --git a/home/gburd/features/emacs/burd.org b/home/gburd/_mixins/emacs/burd.org similarity index 100% rename from home/gburd/features/emacs/burd.org rename to home/gburd/_mixins/emacs/burd.org diff --git a/home/gburd/features/emacs/default.nix b/home/gburd/_mixins/emacs/default.nix similarity index 100% rename from home/gburd/features/emacs/default.nix rename to home/gburd/_mixins/emacs/default.nix diff --git a/home/gburd/features/emacs/init.el b/home/gburd/_mixins/emacs/init.el similarity index 100% rename from home/gburd/features/emacs/init.el rename to home/gburd/_mixins/emacs/init.el diff --git a/home/gburd/features/emacs/theme.nix b/home/gburd/_mixins/emacs/theme.nix similarity index 100% rename from home/gburd/features/emacs/theme.nix rename to home/gburd/_mixins/emacs/theme.nix diff --git a/home/gburd/features/games/default.nix b/home/gburd/_mixins/games/default.nix similarity index 79% rename from home/gburd/features/games/default.nix rename to home/gburd/_mixins/games/default.nix index eac62c1..77cc96e 100644 --- a/home/gburd/features/games/default.nix +++ b/home/gburd/_mixins/games/default.nix @@ -1,6 +1,6 @@ { pkgs, ... }: { imports = [ -# ./steam.nix + # ./steam.nix ]; home.packages = with pkgs; [ gamescope ]; } diff --git a/home/gburd/features/games/steam.nix b/home/gburd/_mixins/games/steam.nix similarity index 100% rename from home/gburd/features/games/steam.nix rename to home/gburd/_mixins/games/steam.nix diff --git a/home/gburd/features/helix/default.nix b/home/gburd/_mixins/helix/default.nix similarity index 100% rename from home/gburd/features/helix/default.nix rename to home/gburd/_mixins/helix/default.nix diff --git a/home/gburd/features/helix/theme.nix b/home/gburd/_mixins/helix/theme.nix similarity index 96% rename from home/gburd/features/helix/theme.nix rename to home/gburd/_mixins/helix/theme.nix index c53b4f8..94b4151 100644 --- a/home/gburd/features/helix/theme.nix +++ b/home/gburd/_mixins/helix/theme.nix @@ -1,6 +1,6 @@ { colorscheme }: { "${colorscheme.slug}" = { - palette = builtins.mapAttrs (name: value: "#${value}") colorscheme.colors; # Add leading '#' + palette = builtins.mapAttrs (_name: value: "#${value}") colorscheme.colors; # Add leading '#' "attributes" = "base09"; "comment" = { fg = "base03"; modifiers = [ "italic" ]; }; "constant" = "base09"; diff --git a/home/gburd/features/music/default.nix b/home/gburd/_mixins/music/default.nix similarity index 100% rename from home/gburd/features/music/default.nix rename to home/gburd/_mixins/music/default.nix diff --git a/home/gburd/features/nvim/default.nix b/home/gburd/_mixins/nvim/default.nix similarity index 100% rename from home/gburd/features/nvim/default.nix rename to home/gburd/_mixins/nvim/default.nix diff --git a/home/gburd/features/nvim/lsp.nix b/home/gburd/_mixins/nvim/lsp.nix similarity index 100% rename from home/gburd/features/nvim/lsp.nix rename to home/gburd/_mixins/nvim/lsp.nix diff --git a/home/gburd/features/nvim/syntaxes.nix b/home/gburd/_mixins/nvim/syntaxes.nix similarity index 100% rename from home/gburd/features/nvim/syntaxes.nix rename to home/gburd/_mixins/nvim/syntaxes.nix diff --git a/home/gburd/features/nvim/theme.nix b/home/gburd/_mixins/nvim/theme.nix similarity index 100% rename from home/gburd/features/nvim/theme.nix rename to home/gburd/_mixins/nvim/theme.nix diff --git a/home/gburd/features/nvim/ui.nix b/home/gburd/_mixins/nvim/ui.nix similarity index 100% rename from home/gburd/features/nvim/ui.nix rename to home/gburd/_mixins/nvim/ui.nix diff --git a/home/gburd/features/pass/default.nix b/home/gburd/_mixins/pass/default.nix similarity index 100% rename from home/gburd/features/pass/default.nix rename to home/gburd/_mixins/pass/default.nix diff --git a/home/gburd/features/productivity/default.nix b/home/gburd/_mixins/productivity/default.nix similarity index 100% rename from home/gburd/features/productivity/default.nix rename to home/gburd/_mixins/productivity/default.nix diff --git a/home/gburd/features/productivity/khal.nix b/home/gburd/_mixins/productivity/khal.nix similarity index 100% rename from home/gburd/features/productivity/khal.nix rename to home/gburd/_mixins/productivity/khal.nix diff --git a/home/gburd/features/productivity/khard.nix b/home/gburd/_mixins/productivity/khard.nix similarity index 100% rename from home/gburd/features/productivity/khard.nix rename to home/gburd/_mixins/productivity/khard.nix diff --git a/home/gburd/features/productivity/mail.nix b/home/gburd/_mixins/productivity/mail.nix similarity index 97% rename from home/gburd/features/productivity/mail.nix rename to home/gburd/_mixins/productivity/mail.nix index dfefd67..195d6c0 100644 --- a/home/gburd/features/productivity/mail.nix +++ b/home/gburd/_mixins/productivity/mail.nix @@ -1,4 +1,4 @@ -{ pkgs, lib, config, ... }: +{ pkgs, config, ... }: let mbsync = "${config.programs.mbsync.package}/bin/mbsync"; @@ -32,7 +32,7 @@ in personal = rec { primary = true; address = "greg@burd.me"; - aliases = ["gregburd@gmail.com"]; + aliases = [ "gregburd@gmail.com" ]; passwordCommand = "${pass} ${smtp.host}/${address}"; imap.host = "mail.burd.me"; diff --git a/home/gburd/_mixins/productivity/neomutt.nix b/home/gburd/_mixins/productivity/neomutt.nix new file mode 100644 index 0000000..3378414 --- /dev/null +++ b/home/gburd/_mixins/productivity/neomutt.nix @@ -0,0 +1,232 @@ +{ config, pkgs, lib, ... }: { + xdg = { + desktopEntries = { + neomutt = { + name = "Neomutt"; + genericName = "Email Client"; + comment = "Read and send emails"; + exec = "neomutt %U"; + icon = "mutt"; + terminal = true; + categories = [ "Network" "Email" "ConsoleOnly" ]; + type = "Application"; + mimeType = [ "x-scheme-handler/mailto" ]; + }; + }; + mimeApps.defaultApplications = { + "x-scheme-handler/mailto" = "neomutt.desktop"; + }; + }; + + programs.neomutt = { + enable = true; + vimKeys = true; + checkStatsInterval = 60; + sidebar = { + enable = true; + width = 30; + }; + settings = { + mark_old = "no"; + text_flowed = "yes"; + reverse_name = "yes"; + query_command = ''"khard email --parsable '%s'"''; + }; + binds = [ + { + action = "sidebar-toggle-visible"; + key = "\\\\"; + map = [ "index" "pager" ]; + } + { + action = "group-reply"; + key = "L"; + map = [ "index" "pager" ]; + } + { + action = "toggle-new"; + key = "B"; + map = [ "index" ]; + } + ]; + macros = + let + browserpipe = + "cat /dev/stdin > /tmp/muttmail.html && xdg-open /tmp/muttmail.html"; + in + [ + { + action = ""; + key = "J"; + map = [ "index" "pager" ]; + } + { + action = ""; + key = "K"; + map = [ "index" "pager" ]; + } + { + action = + ":set confirmappend=no\\n+Archive:set confirmappend=yes\\n"; + key = "A"; + map = [ "index" "pager" ]; + } + { + action = "${browserpipe}"; + key = "V"; + map = [ "attach" ]; + } + { + action = "${pkgs.urlscan}/bin/urlscan"; + key = "F"; + map = [ "pager" ]; + } + { + action = + "html${browserpipe}"; + key = "V"; + map = [ "index" "pager" ]; + } + ]; + extraConfig = + let + # Collect all addresses and aliases + addresses = lib.flatten (lib.mapAttrsToList (_n: v: [ v.address ] ++ v.aliases) config.accounts.email.accounts); + in + '' + alternates "${lib.concatStringsSep "|" addresses}" + '' + '' + # From: https://github.com/altercation/mutt-colors-solarized/blob/master/mutt-colors-solarized-dark-16.muttrc + + # basic colors --------------------------------------------------------- + color normal brightyellow default + color error red default + color tilde black default + color message cyan default + color markers red white + color attachment white default + color search brightmagenta default + color status brightyellow black + color indicator brightblack yellow + color tree cyan default # arrow in threads + + # basic monocolor screen + mono bold bold + mono underline underline + mono indicator reverse + mono error bold + + # index ---------------------------------------------------------------- + + color index red default "~A" # all messages + color index blue default "~N" # new messages + color index brightred default "~E" # expired messages + color index blue default "~N" # new messages + color index blue default "~O" # old messages + color index brightmagenta default "~Q" # messages that have been replied to + color index brightgreen default "~R" # read messages + color index blue default "~U" # unread messages + color index blue default "~U~$" # unread, unreferenced messages + color index cyan default "~v" # messages part of a collapsed thread + color index magenta default "~P" # messages from me + color index cyan default "~p!~F" # messages to me + color index cyan default "~N~p!~F" # new messages to me + color index cyan default "~U~p!~F" # unread messages to me + color index brightgreen default "~R~p!~F" # messages to me + color index red default "~F" # flagged messages + color index red default "~F~p" # flagged messages to me + color index red default "~N~F" # new flagged messages + color index red default "~N~F~p" # new flagged messages to me + color index red default "~U~F~p" # new flagged messages to me + color index brightcyan default "~v~(!~N)" # collapsed thread with no unread + color index yellow default "~v~(~N)" # collapsed thread with some unread + color index green default "~N~v~(~N)" # collapsed thread with unread parent + color index red black "~v~(~F)!~N" # collapsed thread with flagged, no unread + color index yellow black "~v~(~F~N)" # collapsed thread with some unread & flagged + color index green black "~N~v~(~F~N)" # collapsed thread with unread parent & flagged + color index green black "~N~v~(~F)" # collapsed thread with unread parent, no unread inside, but some flagged + color index cyan black "~v~(~p)" # collapsed thread with unread parent, no unread inside, some to me directly + color index yellow red "~v~(~D)" # thread with deleted (doesn't differentiate between all or partial) + color index yellow default "~(~N)" # messages in threads with some unread + color index green default "~S" # superseded messages + color index black red "~D" # deleted messages + color index black red "~N~D" # deleted messages + color index red default "~T" # tagged messages + + # message headers ------------------------------------------------------ + + color hdrdefault brightgreen default + color header brightyellow default "^(From)" + color header blue default "^(Subject)" + + # body ----------------------------------------------------------------- + + color quoted blue default + color quoted1 cyan default + color quoted2 yellow default + color quoted3 red default + color quoted4 brightred default + + color signature brightgreen default + color bold black default + color underline black default + color normal default default + color body brightcyan default "[;:][-o][)/(|]" # emoticons + color body brightcyan default "[;:][)(|]" # emoticons + color body brightcyan default "[*]?((N)?ACK|CU|LOL|SCNR|BRB|BTW|CWYL|\ + |FWIW|vbg|GD&R|HTH|HTHBE|IMHO|IMNSHO|\ + |IRL|RTFM|ROTFL|ROFL|YMMV)[*]?" + color body brightcyan default "[ ][*][^*]*[*][ ]?" # more emoticon? + color body brightcyan default "[ ]?[*][^*]*[*][ ]" # more emoticon? + + ## pgp + + color body red default "(BAD signature)" + color body cyan default "(Good signature)" + color body brightblack default "^gpg: Good signature .*" + color body brightyellow default "^gpg: " + color body brightyellow red "^gpg: BAD signature from.*" + mono body bold "^gpg: Good signature" + mono body bold "^gpg: BAD signature from.*" + + # yes, an insance URL regex + color body red default "([a-z][a-z0-9+-]*://(((([a-z0-9_.!~*'();:&=+$,-]|%[0-9a-f][0-9a-f])*@)?((([a-z0-9]([a-z0-9-]*[a-z0-9])?)\\.)*([a-z]([a-z0-9-]*[a-z0-9])?)\\.?|[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+)(:[0-9]+)?)|([a-z0-9_.!~*'()$,;:@&=+-]|%[0-9a-f][0-9a-f])+)(/([a-z0-9_.!~*'():@&=+$,-]|%[0-9a-f][0-9a-f])*(;([a-z0-9_.!~*'():@&=+$,-]|%[0-9a-f][0-9a-f])*)*(/([a-z0-9_.!~*'():@&=+$,-]|%[0-9a-f][0-9a-f])*(;([a-z0-9_.!~*'():@&=+$,-]|%[0-9a-f][0-9a-f])*)*)*)?(\\?([a-z0-9_.!~*'();/?:@&=+$,-]|%[0-9a-f][0-9a-f])*)?(#([a-z0-9_.!~*'();/?:@&=+$,-]|%[0-9a-f][0-9a-f])*)?|(www|ftp)\\.(([a-z0-9]([a-z0-9-]*[a-z0-9])?)\\.)*([a-z]([a-z0-9-]*[a-z0-9])?)\\.?(:[0-9]+)?(/([-a-z0-9_.!~*'():@&=+$,]|%[0-9a-f][0-9a-f])*(;([-a-z0-9_.!~*'():@&=+$,]|%[0-9a-f][0-9a-f])*)*(/([-a-z0-9_.!~*'():@&=+$,]|%[0-9a-f][0-9a-f])*(;([-a-z0-9_.!~*'():@&=+$,]|%[0-9a-f][0-9a-f])*)*)*)?(\\?([-a-z0-9_.!~*'();/?:@&=+$,]|%[0-9a-f][0-9a-f])*)?(#([-a-z0-9_.!~*'();/?:@&=+$,]|%[0-9a-f][0-9a-f])*)?)[^].,:;!)? \t\r\n<>\"]" + # and a heavy handed email regex + color body magenta default "((@(([0-9a-z-]+\\.)*[0-9a-z-]+\\.?|#[0-9]+|\\[[0-9]?[0-9]?[0-9]\\.[0-9]?[0-9]?[0-9]\\.[0-9]?[0-9]?[0-9]\\.[0-9]?[0-9]?[0-9]\\]),)*@(([0-9a-z-]+\\.)*[0-9a-z-]+\\.?|#[0-9]+|\\[[0-9]?[0-9]?[0-9]\\.[0-9]?[0-9]?[0-9]\\.[0-9]?[0-9]?[0-9]\\.[0-9]?[0-9]?[0-9]\\]):)?[0-9a-z_.+%$-]+@(([0-9a-z-]+\\.)*[0-9a-z-]+\\.?|#[0-9]+|\\[[0-2]?[0-9]?[0-9]\\.[0-2]?[0-9]?[0-9]\\.[0-2]?[0-9]?[0-9]\\.[0-2]?[0-9]?[0-9]\\])" + + # Various smilies and the like + color body brightwhite default "<[Gg]>" # + color body brightwhite default "<[Bb][Gg]>" # + color body yellow default " [;:]-*[})>{(<|]" # :-) etc... + # *bold* + color body blue default "(^|[[:space:][:punct:]])\\*[^*]+\\*([[:space:][:punct:]]|$)" + mono body bold "(^|[[:space:][:punct:]])\\*[^*]+\\*([[:space:][:punct:]]|$)" + # _underline_ + color body blue default "(^|[[:space:][:punct:]])_[^_]+_([[:space:][:punct:]]|$)" + mono body underline "(^|[[:space:][:punct:]])_[^_]+_([[:space:][:punct:]]|$)" + # /italic/ (Sometimes gets directory names) + color body blue default "(^|[[:space:][:punct:]])/[^/]+/([[:space:][:punct:]]|$)" + mono body underline "(^|[[:space:][:punct:]])/[^/]+/([[:space:][:punct:]]|$)" + + # Border lines. + color body blue default "( *[-+=#*~_]){6,}" + + # From https://github.com/jessfraz/dockerfiles/blob/master/mutt/.mutt/mutt-patch-highlighting.muttrc + color body cyan default ^(Signed-off-by).* + color body cyan default ^(Docker-DCO-1.1-Signed-off-by).* + color body brightwhite default ^(Cc) + color body yellow default "^diff \-.*" + color body brightwhite default "^index [a-f0-9].*" + color body brightblue default "^---$" + color body white default "^\-\-\- .*" + color body white default "^[\+]{3} .*" + color body green default "^[\+][^\+]+.*" + color body red default "^\-[^\-]+.*" + color body brightblue default "^@@ .*" + color body green default "LGTM" + color body brightmagenta default "-- Commit Summary --" + color body brightmagenta default "-- File Changes --" + color body brightmagenta default "-- Patch Links --" + ''; + }; +} diff --git a/home/gburd/features/productivity/todoman.nix b/home/gburd/_mixins/productivity/todoman.nix similarity index 100% rename from home/gburd/features/productivity/todoman.nix rename to home/gburd/_mixins/productivity/todoman.nix diff --git a/home/gburd/features/productivity/vdirsyncer.nix b/home/gburd/_mixins/productivity/vdirsyncer.nix similarity index 98% rename from home/gburd/features/productivity/vdirsyncer.nix rename to home/gburd/_mixins/productivity/vdirsyncer.nix index 3aea3c0..672c6f8 100644 --- a/home/gburd/features/productivity/vdirsyncer.nix +++ b/home/gburd/_mixins/productivity/vdirsyncer.nix @@ -1,4 +1,4 @@ -{ pkgs, lib, config, ... }: +{ pkgs, config, ... }: let pass = "${config.programs.password-store.package}/bin/pass"; in diff --git a/home/gburd/features/rgb/default.nix b/home/gburd/_mixins/rgb/default.nix similarity index 100% rename from home/gburd/features/rgb/default.nix rename to home/gburd/_mixins/rgb/default.nix diff --git a/home/gburd/desktop.nix b/home/gburd/desktop.nix new file mode 100644 index 0000000..4128a3d --- /dev/null +++ b/home/gburd/desktop.nix @@ -0,0 +1,29 @@ +{ config, lib, ... }: +with lib.hm.gvariant; +{ + imports = [ + ../../desktop/audio-recorder.nix + ../../desktop/celluloid.nix + ../../desktop/dconf-editor.nix + ../../desktop/emote.nix + ../../desktop/gitkraken.nix + ../../desktop/gnome-sound-recorder.nix + ../../desktop/localsend.nix + ../../desktop/meld.nix + ../../desktop/rhythmbox.nix + ../../desktop/sakura.nix + ../../desktop/tilix.nix + ]; + + dconf.settings = { + "org/gnome/rhythmbox/rhythmdb" = { + locations = [ "file://${config.home.homeDirectory}/Studio/Music" ]; + monitor-library = true; + }; + }; + + # Authrorize X11 access in Distrobox + home.file.".distroboxrc".text = '' + xhost +si:localuser:$USER + ''; +} diff --git a/home/gburd/face.png b/home/gburd/face.png new file mode 100644 index 0000000000000000000000000000000000000000..ef9da941c010fb0b619383d6a3d6d2fad6c100b5 GIT binary patch literal 33951 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.B&{f%75#t^Sy;S72!f<+0u|Llb*P(hg{>kEL#4F> zFD5h~z=8w{84(bOL6NI{6k`B214LF30F6cv??I8(N`Y;>2MV040g7CrSV;lSTh&r` zTdk~VP`w+3!+RT7*5^?e0*L*&QLTX7+y>FK6)>~XJsYEFtPQ5QPBeGxu(xy?Ewg|i zDrQy)-T(j)APE8~LWKe%s4N-+(WX&?Do{WmirKN!;Pgtoz{*MxHp>;G+0C`~U?uG? zM-f&9V3;_Q7z9C!6dD0V>_q@cUQP0MoOOooDCLS@O+^?=GK-{yEp5lVaL zdreJ>00D)_TZalk6ng+vgeZuF5TH0@BCWtx)?gTDBq9+&QqFm7Nn?Wq^Nwj6-C8ZQ zma23>Z9X5ijZX!;eO2-$?=4dlFOi6y4i#9C_uEksP?Taug_a}1)Ky>ztaqpYfe1hZ z2_=j|U)7+LcW$sYt4pnptOFf_U7rmhjj&E9r`c-Hj!6pJWNV$D0rGzVat9oVX{^XH P00000NkvXXu0mjfq$*xT literal 0 HcmV?d00001 diff --git a/home/gburd/features/desktop/common/firefox.nix b/home/gburd/features/desktop/common/firefox.nix deleted file mode 100644 index d5192b9..0000000 --- a/home/gburd/features/desktop/common/firefox.nix +++ /dev/null @@ -1,127 +0,0 @@ -{ config, pkgs, lib, theme, ... }: -{ - programs.browserpass.enable = true; - programs.firefox = { - enable = true; - - package = pkgs.wrapFirefox pkgs.firefox-unwrapped { - extraPolicies = { - CaptivePortal = false; - DisableFirefoxStudies = true; - DisablePocket = true; - DisableTelemetry = true; - DisableFirefoxAccounts = false; - NoDefaultBookmarks = true; - OfferToSaveLogins = false; - OfferToSaveLoginsDefault = false; - PasswordManagerEnabled = false; - FirefoxHome = { - Search = true; - Pocket = false; - Snippets = false; - TopSites = false; - Highlights = false; - }; - UserMessaging = { - ExtensionRecommendations = false; - SkipOnboarding = true; - }; - }; - }; - - profiles.gburd = { - id = 0; - bookmarks = { }; - extensions = with pkgs.inputs.firefox-addons; [ -# autoplay-no-more - bypass-paywalls-clean - i-dont-care-about-cookies -# kagi-search-for-firefox - clearurls - decentraleyes - disconnect - duckduckgo-privacy-essentials - floccus - ghostery -# https-everywhere -# languagetool -# onetab - privacy-badger - privacy-badger - privacy-redirect - proton-pass - react-devtools - ublock-origin - ]; - search = { - force = true; - default = "Kagi"; - engines = { - "Nix Packages" = { - urls = [{ - template = "https://search.nixos.org/packages"; - params = [ - { name = "type"; value = "packages"; } - { name = "query"; value = "{searchTerms}"; } - ]; - }]; - icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg"; - definedAliases = [ "@np" ]; - }; - "NixOS Wiki" = { - urls = [{ template = "https://nixos.wiki/index.php?search={searchTerms}"; }]; - iconUpdateURL = "https://nixos.wiki/favicon.png"; - updateInterval = 24 * 60 * 60 * 1000; - definedAliases = [ "@nw" ]; - }; - "Wikipedia (en)".metaData.alias = "@wiki"; - "Google".metaData.hidden = true; - "Amazon.com".metaData.hidden = true; - "Bing".metaData.hidden = true; - "eBay".metaData.hidden = true; - }; - }; - extraConfig = '' - user_pref("toolkit.legacyUserProfileCustomizations.stylesheets", true); - user_pref("full-screen-api.ignore-widgets", true); - user_pref("media.ffmpeg.vaapi.enabled", true); - user_pref("media.rdd-vpx.enabled", true); - ''; - userChrome = '' - # a css - ''; - userContent = '' - # Here too - ''; - settings = { - "general.smoothScroll" = true; - "browser.disableResetPrompt" = true; - "browser.download.panel.shown" = true; - "browser.download.useDownloadDir" = false; - "browser.newtabpage.activity-stream.showSponsoredTopSites" = false; - "browser.shell.checkDefaultBrowser" = false; - "browser.shell.defaultBrowserCheckCount" = 1; - "browser.startup.homepage" = "about:blank"; - "browser.uiCustomization.state" = ''{"placements":{"widget-overflow-fixed-list":[],"nav-bar":["back-button","forward-button","stop-reload-button","home-button","urlbar-container","downloads-button","library-button","ublock0_raymondhill_net-browser-action","_testpilot-containers-browser-action"],"toolbar-menubar":["menubar-items"],"TabsToolbar":["tabbrowser-tabs","new-tab-button","alltabs-button"],"PersonalToolbar":["import-button","personal-bookmarks"]},"seen":["save-to-pocket-button","developer-button","ublock0_raymondhill_net-browser-action","_testpilot-containers-browser-action"],"dirtyAreaCache":["nav-bar","PersonalToolbar","toolbar-menubar","TabsToolbar","widget-overflow-fixed-list"],"currentVersion":18,"newElementCount":4}''; - "dom.security.https_only_mode" = true; - "identity.fxaccounts.enabled" = false; - "privacy.trackingprotection.enabled" = true; - "signon.rememberSignons" = false; - }; - }; - }; - - home = { - persistence = { - # Not persisting is safer, but... - "/persist/home/gburd".directories = [ ".mozilla/firefox" ]; - }; - }; - - xdg.mimeApps.defaultApplications = { - "text/html" = [ "firefox.desktop" ]; - "text/xml" = [ "firefox.desktop" ]; - "x-scheme-handler/http" = [ "firefox.desktop" ]; - "x-scheme-handler/https" = [ "firefox.desktop" ]; - }; -} diff --git a/home/gburd/features/productivity/keyring.nix b/home/gburd/features/productivity/keyring.nix deleted file mode 100644 index 8b13789..0000000 --- a/home/gburd/features/productivity/keyring.nix +++ /dev/null @@ -1 +0,0 @@ - diff --git a/home/gburd/features/productivity/neomutt.nix b/home/gburd/features/productivity/neomutt.nix deleted file mode 100644 index 1770c98..0000000 --- a/home/gburd/features/productivity/neomutt.nix +++ /dev/null @@ -1,230 +0,0 @@ -{ config, pkgs, lib, ... }: { - xdg = { - desktopEntries = { - neomutt = { - name = "Neomutt"; - genericName = "Email Client"; - comment = "Read and send emails"; - exec = "neomutt %U"; - icon = "mutt"; - terminal = true; - categories = [ "Network" "Email" "ConsoleOnly" ]; - type = "Application"; - mimeType = [ "x-scheme-handler/mailto" ]; - }; - }; - mimeApps.defaultApplications = { - "x-scheme-handler/mailto" = "neomutt.desktop"; - }; - }; - - programs.neomutt = { - enable = true; - vimKeys = true; - checkStatsInterval = 60; - sidebar = { - enable = true; - width = 30; - }; - settings = { - mark_old = "no"; - text_flowed = "yes"; - reverse_name = "yes"; - query_command = ''"khard email --parsable '%s'"''; - }; - binds = [ - { - action = "sidebar-toggle-visible"; - key = "\\\\"; - map = [ "index" "pager" ]; - } - { - action = "group-reply"; - key = "L"; - map = [ "index" "pager" ]; - } - { - action = "toggle-new"; - key = "B"; - map = [ "index" ]; - } - ]; - macros = - let - browserpipe = - "cat /dev/stdin > /tmp/muttmail.html && xdg-open /tmp/muttmail.html"; - in - [ - { - action = ""; - key = "J"; - map = [ "index" "pager" ]; - } - { - action = ""; - key = "K"; - map = [ "index" "pager" ]; - } - { - action = - ":set confirmappend=no\\n+Archive:set confirmappend=yes\\n"; - key = "A"; - map = [ "index" "pager" ]; - } - { - action = "${browserpipe}"; - key = "V"; - map = [ "attach" ]; - } - { - action = "${pkgs.urlscan}/bin/urlscan"; - key = "F"; - map = [ "pager" ]; - } - { - action = - "html${browserpipe}"; - key = "V"; - map = [ "index" "pager" ]; - } - ]; - extraConfig = let - # Collect all addresses and aliases - addresses = lib.flatten (lib.mapAttrsToList (n: v: [ v.address ] ++ v.aliases) config.accounts.email.accounts); - in '' - alternates "${lib.concatStringsSep "|" addresses}" - '' + '' - # From: https://github.com/altercation/mutt-colors-solarized/blob/master/mutt-colors-solarized-dark-16.muttrc - - # basic colors --------------------------------------------------------- - color normal brightyellow default - color error red default - color tilde black default - color message cyan default - color markers red white - color attachment white default - color search brightmagenta default - color status brightyellow black - color indicator brightblack yellow - color tree cyan default # arrow in threads - - # basic monocolor screen - mono bold bold - mono underline underline - mono indicator reverse - mono error bold - - # index ---------------------------------------------------------------- - - color index red default "~A" # all messages - color index blue default "~N" # new messages - color index brightred default "~E" # expired messages - color index blue default "~N" # new messages - color index blue default "~O" # old messages - color index brightmagenta default "~Q" # messages that have been replied to - color index brightgreen default "~R" # read messages - color index blue default "~U" # unread messages - color index blue default "~U~$" # unread, unreferenced messages - color index cyan default "~v" # messages part of a collapsed thread - color index magenta default "~P" # messages from me - color index cyan default "~p!~F" # messages to me - color index cyan default "~N~p!~F" # new messages to me - color index cyan default "~U~p!~F" # unread messages to me - color index brightgreen default "~R~p!~F" # messages to me - color index red default "~F" # flagged messages - color index red default "~F~p" # flagged messages to me - color index red default "~N~F" # new flagged messages - color index red default "~N~F~p" # new flagged messages to me - color index red default "~U~F~p" # new flagged messages to me - color index brightcyan default "~v~(!~N)" # collapsed thread with no unread - color index yellow default "~v~(~N)" # collapsed thread with some unread - color index green default "~N~v~(~N)" # collapsed thread with unread parent - color index red black "~v~(~F)!~N" # collapsed thread with flagged, no unread - color index yellow black "~v~(~F~N)" # collapsed thread with some unread & flagged - color index green black "~N~v~(~F~N)" # collapsed thread with unread parent & flagged - color index green black "~N~v~(~F)" # collapsed thread with unread parent, no unread inside, but some flagged - color index cyan black "~v~(~p)" # collapsed thread with unread parent, no unread inside, some to me directly - color index yellow red "~v~(~D)" # thread with deleted (doesn't differentiate between all or partial) - color index yellow default "~(~N)" # messages in threads with some unread - color index green default "~S" # superseded messages - color index black red "~D" # deleted messages - color index black red "~N~D" # deleted messages - color index red default "~T" # tagged messages - - # message headers ------------------------------------------------------ - - color hdrdefault brightgreen default - color header brightyellow default "^(From)" - color header blue default "^(Subject)" - - # body ----------------------------------------------------------------- - - color quoted blue default - color quoted1 cyan default - color quoted2 yellow default - color quoted3 red default - color quoted4 brightred default - - color signature brightgreen default - color bold black default - color underline black default - color normal default default - color body brightcyan default "[;:][-o][)/(|]" # emoticons - color body brightcyan default "[;:][)(|]" # emoticons - color body brightcyan default "[*]?((N)?ACK|CU|LOL|SCNR|BRB|BTW|CWYL|\ - |FWIW|vbg|GD&R|HTH|HTHBE|IMHO|IMNSHO|\ - |IRL|RTFM|ROTFL|ROFL|YMMV)[*]?" - color body brightcyan default "[ ][*][^*]*[*][ ]?" # more emoticon? - color body brightcyan default "[ ]?[*][^*]*[*][ ]" # more emoticon? - - ## pgp - - color body red default "(BAD signature)" - color body cyan default "(Good signature)" - color body brightblack default "^gpg: Good signature .*" - color body brightyellow default "^gpg: " - color body brightyellow red "^gpg: BAD signature from.*" - mono body bold "^gpg: Good signature" - mono body bold "^gpg: BAD signature from.*" - - # yes, an insance URL regex - color body red default "([a-z][a-z0-9+-]*://(((([a-z0-9_.!~*'();:&=+$,-]|%[0-9a-f][0-9a-f])*@)?((([a-z0-9]([a-z0-9-]*[a-z0-9])?)\\.)*([a-z]([a-z0-9-]*[a-z0-9])?)\\.?|[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+)(:[0-9]+)?)|([a-z0-9_.!~*'()$,;:@&=+-]|%[0-9a-f][0-9a-f])+)(/([a-z0-9_.!~*'():@&=+$,-]|%[0-9a-f][0-9a-f])*(;([a-z0-9_.!~*'():@&=+$,-]|%[0-9a-f][0-9a-f])*)*(/([a-z0-9_.!~*'():@&=+$,-]|%[0-9a-f][0-9a-f])*(;([a-z0-9_.!~*'():@&=+$,-]|%[0-9a-f][0-9a-f])*)*)*)?(\\?([a-z0-9_.!~*'();/?:@&=+$,-]|%[0-9a-f][0-9a-f])*)?(#([a-z0-9_.!~*'();/?:@&=+$,-]|%[0-9a-f][0-9a-f])*)?|(www|ftp)\\.(([a-z0-9]([a-z0-9-]*[a-z0-9])?)\\.)*([a-z]([a-z0-9-]*[a-z0-9])?)\\.?(:[0-9]+)?(/([-a-z0-9_.!~*'():@&=+$,]|%[0-9a-f][0-9a-f])*(;([-a-z0-9_.!~*'():@&=+$,]|%[0-9a-f][0-9a-f])*)*(/([-a-z0-9_.!~*'():@&=+$,]|%[0-9a-f][0-9a-f])*(;([-a-z0-9_.!~*'():@&=+$,]|%[0-9a-f][0-9a-f])*)*)*)?(\\?([-a-z0-9_.!~*'();/?:@&=+$,]|%[0-9a-f][0-9a-f])*)?(#([-a-z0-9_.!~*'();/?:@&=+$,]|%[0-9a-f][0-9a-f])*)?)[^].,:;!)? \t\r\n<>\"]" - # and a heavy handed email regex - color body magenta default "((@(([0-9a-z-]+\\.)*[0-9a-z-]+\\.?|#[0-9]+|\\[[0-9]?[0-9]?[0-9]\\.[0-9]?[0-9]?[0-9]\\.[0-9]?[0-9]?[0-9]\\.[0-9]?[0-9]?[0-9]\\]),)*@(([0-9a-z-]+\\.)*[0-9a-z-]+\\.?|#[0-9]+|\\[[0-9]?[0-9]?[0-9]\\.[0-9]?[0-9]?[0-9]\\.[0-9]?[0-9]?[0-9]\\.[0-9]?[0-9]?[0-9]\\]):)?[0-9a-z_.+%$-]+@(([0-9a-z-]+\\.)*[0-9a-z-]+\\.?|#[0-9]+|\\[[0-2]?[0-9]?[0-9]\\.[0-2]?[0-9]?[0-9]\\.[0-2]?[0-9]?[0-9]\\.[0-2]?[0-9]?[0-9]\\])" - - # Various smilies and the like - color body brightwhite default "<[Gg]>" # - color body brightwhite default "<[Bb][Gg]>" # - color body yellow default " [;:]-*[})>{(<|]" # :-) etc... - # *bold* - color body blue default "(^|[[:space:][:punct:]])\\*[^*]+\\*([[:space:][:punct:]]|$)" - mono body bold "(^|[[:space:][:punct:]])\\*[^*]+\\*([[:space:][:punct:]]|$)" - # _underline_ - color body blue default "(^|[[:space:][:punct:]])_[^_]+_([[:space:][:punct:]]|$)" - mono body underline "(^|[[:space:][:punct:]])_[^_]+_([[:space:][:punct:]]|$)" - # /italic/ (Sometimes gets directory names) - color body blue default "(^|[[:space:][:punct:]])/[^/]+/([[:space:][:punct:]]|$)" - mono body underline "(^|[[:space:][:punct:]])/[^/]+/([[:space:][:punct:]]|$)" - - # Border lines. - color body blue default "( *[-+=#*~_]){6,}" - - # From https://github.com/jessfraz/dockerfiles/blob/master/mutt/.mutt/mutt-patch-highlighting.muttrc - color body cyan default ^(Signed-off-by).* - color body cyan default ^(Docker-DCO-1.1-Signed-off-by).* - color body brightwhite default ^(Cc) - color body yellow default "^diff \-.*" - color body brightwhite default "^index [a-f0-9].*" - color body brightblue default "^---$" - color body white default "^\-\-\- .*" - color body white default "^[\+]{3} .*" - color body green default "^[\+][^\+]+.*" - color body red default "^\-[^\-]+.*" - color body brightblue default "^@@ .*" - color body green default "LGTM" - color body brightmagenta default "-- Commit Summary --" - color body brightmagenta default "-- File Changes --" - color body brightmagenta default "-- Patch Links --" - ''; - }; -} diff --git a/home/gburd/floki.nix b/home/gburd/floki.nix index a59a390..c745a57 100644 --- a/home/gburd/floki.nix +++ b/home/gburd/floki.nix @@ -1,21 +1,187 @@ -{ inputs, outputs, ... }: +{ config, pkgs, username, ... }: { imports = [ - ./global - ./features/desktop/gnome - ./features/productivity - ./features/pass - ./features/games + ../services/keybase.nix + + # TODO remove/migrate away from user mixins + ./_mixins + ./_mixins/desktop/gnome + ./_mixins/productivity + ./_mixins/pass + ./_mixins/games ]; - wallpaper = outputs.wallpapers.aenami-lunar; - colorscheme = inputs.nix-colors.colorSchemes.atelier-heath; + home = { + file.".face".source = ./face.png; - # monitors = [{ - # name = "eDP-1"; - # width = 1920; - # height = 1080; - # workspace = "1"; - # primary = true; - # }]; + file.".ssh/config".text = '' + Host burd.me *.burd.me *.ts.burd.me + ForwardAgent yes + Host floki + ForwardAgent yes + RemoteForward /%d/.gnupg-sockets/S.gpg-agent /%d/.gnupg-sockets/S.gpg-agent.extra + + Host * + ForwardAgent no + Compression no + ServerAliveInterval 0 + ServerAliveCountMax 3 + HashKnownHosts no + UserKnownHostsFile ~/.ssh/known_hosts + ControlMaster no + ControlPath ~/.ssh/master-%r@%n:%p + ControlPersist no + + Host github.com + HostName github.com + User git + ''; + + file."Quickemu/nixos-console.conf".text = '' + #!/run/current-system/sw/bin/quickemu --vm + guest_os="linux" + disk_img="nixos-console/disk.qcow2" + disk_size="96G" + iso="nixos-console/nixos.iso" + ''; + file."Quickemu/nixos-desktop.conf".text = '' + #!/run/current-system/sw/bin/quickemu --vm + guest_os="linux" + disk_img="nixos-desktop/disk.qcow2" + disk_size="96G" + iso="nixos-desktop/nixos.iso" + ''; + + # A Modern Unix experience + # https://jvns.ca/blog/2022/04/12/a-list-of-new-ish--command-line-tools/ + packages = with pkgs; [ + asciinema # Terminal recorder + black # Code format Python + bmon # Modern Unix `iftop` + breezy # Terminal bzr client + butler # Terminal Itch.io API client + chafa # Terminal image viewer + chroma # Code syntax highlighter + clinfo # Terminal OpenCL info + curlie # Terminal HTTP client + dconf2nix # Nix code from Dconf files + debootstrap # Terminal Debian installer + diffr # Modern Unix `diff` + difftastic # Modern Unix `diff` + dogdns # Modern Unix `dig` + dua # Modern Unix `du` + duf # Modern Unix `df` + du-dust # Modern Unix `du` + entr # Modern Unix `watch` + fast-cli # Terminal fast.com + fd # Modern Unix `find` + glow # Terminal Markdown renderer + gping # Modern Unix `ping` + hexyl # Modern Unix `hexedit` + httpie # Terminal HTTP client + hyperfine # Terminal benchmarking + iperf3 # Terminal network benchmarking + iw # Terminal WiFi info + jpegoptim # Terminal JPEG optimizer + jiq # Modern Unix `jq` + lazygit # Terminal Git client + libva-utils # Terminal VAAPI info + lurk # Modern Unix `strace` + mdp # Terminal Markdown presenter + moar # Modern Unix `less` + mtr # Modern Unix `traceroute` + netdiscover # Modern Unix `arp` + nethogs # Modern Unix `iftop` + nixpkgs-review # Nix code review + nodePackages.prettier # Code format + nurl # Nix URL fetcher + nyancat # Terminal rainbow spewing feline + speedtest-go # Terminal speedtest.net + optipng # Terminal PNG optimizer + procs # Modern Unix `ps` + python310Packages.gpustat # Terminal GPU info + quilt # Terminal patch manager + ripgrep # Modern Unix `grep` + rustfmt # Code format Rust + shellcheck # Code lint Shell + shfmt # Code format Shell + tldr # Modern Unix `man` + tokei # Modern Unix `wc` for code + vdpauinfo # Terminal VDPAU info + wavemon # Terminal WiFi monitor + yq-go # Terminal `jq` for YAML + ]; + sessionVariables = { + PAGER = "moar"; + }; + }; + programs = { + fish = { + shellAliases = { + diff = "diffr"; + fast = "fast -u"; + glow = "glow --pager"; + pubip = "curl -s ifconfig.me/ip"; # "curl -s https://api.ipify.org"; + speedtest = "speedtest-go"; + }; + }; + git = { + userEmail = "greg@burd.me"; + userName = "Greg Burd"; + signing = { + key = "D4BB42BE729AEFBD2EFEBF8822931AF7895E82DF"; + signByDefault = true; + }; + aliases = { + st = "status --short"; + ci = "commit"; + co = "checkout"; + di = "diff"; + dc = "diff --cached"; + amend = "commit --amend"; + aa = "add --all"; + head = "!git l -1"; + h = "!git head"; + r = "!git --no-pager l -20"; + ra = "!git r --all"; + ff = "merge --ff-only"; + pullff = "pull --ff-only"; + l = "log --graph --abbrev-commit --date=relative"; + la = "!git l --all"; + div = "divergence"; + gn = "goodness"; + gnc = "goodness --cached"; + fa = "fetch --all"; + pom = "push origin master"; + files = "show --oneline"; + graph = "log --graph --decorate --all"; + lol = "log --graph --decorate --pretty=oneline --abbrev-commit"; + lola = "log --graph --decorate --pretty=oneline --abbrev-commit --all"; + lg = "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative"; + sync = "pull --rebase"; + update = "merge --ff-only origin/master"; + mend = "commit --amend --no-edit"; + unadd = "reset --"; + unedit = "checkout --"; + unstage = "reset HEAD"; + unrm = "checkout --"; + unstash = "stash pop"; + lastchange = "log -n 1 -p"; + dag = "log --graph --format='format:%C(yellow)%h%C(reset) %C(blue)\"%an\" <%ae>%C(reset) %C(magenta)%cr%C(reset)%C(auto)%d%C(reset)%n%s' --date-order"; + subdate = "submodule update --init --recursive"; + }; + }; + }; + + systemd.user.tmpfiles.rules = [ + "d ${config.home.homeDirectory}/ws 0755 ${username} users - -" + "d ${config.home.homeDirectory}/Dropbox 0755 ${username} users - -" +# "d ${config.home.homeDirectory}/Quickemu/nixos-console 0755 ${username} users - -" +# "d ${config.home.homeDirectory}/Quickemu/nixos-desktop 0755 ${username} users - -" + "d ${config.home.homeDirectory}/bin 0755 ${username} users - -" + "d ${config.home.homeDirectory}/Studio/OBS/config/obs-studio/ 0755 ${username} users - -" +# "d ${config.home.homeDirectory}/Syncthing 0755 ${username} users - -" + "d ${config.home.homeDirectory}/Websites 0755 ${username} users - -" + "L+ ${config.home.homeDirectory}/.config/obs-studio/ - - - - ${config.home.homeDirectory}/Studio/OBS/config/obs-studio/" + ]; } diff --git a/home/gburd/wallpapers/default.nix b/home/gburd/wallpapers/default.nix deleted file mode 100644 index 671ae1a..0000000 --- a/home/gburd/wallpapers/default.nix +++ /dev/null @@ -1,9 +0,0 @@ -builtins.listToAttrs (map - (wallpaper: { - inherit (wallpaper) name; - value = builtins.fetchurl { - inherit (wallpaper) sha256; - url = "https://i.imgur.com/${wallpaper.id}.${wallpaper.ext}"; - }; - }) - (builtins.fromJSON (builtins.readFile ./list.json))) diff --git a/home/gburd/wallpapers/from_album.sh b/home/gburd/wallpapers/from_album.sh deleted file mode 100755 index b3a4895..0000000 --- a/home/gburd/wallpapers/from_album.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/env -S nix shell nixpkgs#httpie nixpkgs#jq --command bash - -function fetch_image() { - jq -n \ - --arg name "$(echo $1 | cut -d '|' -f 1)" \ - --arg ext "$(echo $1 | cut -d '|' -f 2 | cut -d '/' -f 2)" \ - --arg id "$(echo $1 | cut -d '|' -f 3)" \ - --arg sha256 "$(nix-prefetch-url https://i.imgur.com/$id.$ext)" \ - '{"name": $name, "ext": $ext, "id": $id, "sha256": $sha256}' -} - -album="bXDPRpV" # https://imgur.com/a/bXDPRpV -clientid="0c2b2b57cdbe5d8" - -result=$(https api.imgur.com/3/album/$album Authorization:"Client-ID $clientid") -images=$(echo $result | jq -r '.data.images[] | "\(.description)|\(.type)|\(.id)"') - -echo "[" -while read -r image; do - fetch_image $image -done <<< "$images" -wait -echo "]" diff --git a/home/gburd/wallpapers/list.json b/home/gburd/wallpapers/list.json deleted file mode 100644 index ab109bd..0000000 --- a/home/gburd/wallpapers/list.json +++ /dev/null @@ -1,8 +0,0 @@ -[ - { - "ext": "jpeg", - "id": "u2T7X4I", - "name": "watercolor-beach", - "sha256": "00kcswwv9p14vs7ym0fmanzv8729i1gagk6gpl42icd93mmhlmd4" - } -] diff --git a/home/gburd/wallpapers/single_image.sh b/home/gburd/wallpapers/single_image.sh deleted file mode 100755 index d62fc3d..0000000 --- a/home/gburd/wallpapers/single_image.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env nix-shell -#!nix-shell -i bash -p jq httpie - -image="$(echo "$1" | rev | cut -d '/' -f1 | rev | cut -d '.' -f1)" -clientid="0c2b2b57cdbe5d8" - -image=$(https api.imgur.com/3/image/$image Authorization:"Client-ID $clientid" | jq -r '.data | "\(.description)|\(.type)|\(.id)"') - -jq -n \ - --arg name "$(echo $image | cut -d '|' -f 1)" \ - --arg ext "$(echo $image | cut -d '|' -f 2 | cut -d '/' -f 2)" \ - --arg id "$(echo $image | cut -d '|' -f 3)" \ - --arg sha256 "$(nix-prefetch-url https://i.imgur.com/$id.$ext)" \ - '{"name": $name, "ext": $ext, "id": $id, "sha256": $sha256}' diff --git a/home/nixos/default.nix b/home/nixos/default.nix new file mode 100644 index 0000000..f5476b8 --- /dev/null +++ b/home/nixos/default.nix @@ -0,0 +1,3 @@ +_: { + home.file.".face".source = ./face.png; +} diff --git a/home/nixos/face.png b/home/nixos/face.png new file mode 100644 index 0000000000000000000000000000000000000000..6ce6b36a43b009fffaedf29c4c9f11e5cae2962e GIT binary patch literal 15555 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 /tmp/data.keyfile + fi + + echo "WARNING! The disks in $TARGET_HOST are about to get wiped" + echo " NixOS will be re-installed" + echo " This is a destructive operation" + echo + read -p "Are you sure? [y/N]" -n 1 -r + echo + if [[ $REPLY =~ ^[Yy]$ ]]; then + sudo true + + sudo nix run github:nix-community/disko \ + --extra-experimental-features "nix-command flakes" \ + --no-write-lock-file \ + -- \ + --mode zap_create_mount \ + "nixos/$TARGET_HOST/disks.nix" + + sudo nixos-install --no-root-password --flake ".#$TARGET_HOST" + + # Rsync nix-config to the target install and set the remote origin to SSH. + rsync -a --delete "$HOME/ws/" "/mnt/home/$TARGET_USER/Zero/" + pushd "/mnt/home/$TARGET_USER/Zero/nix-config" + git remote set-url origin git@github.com:gburd/nix-config.git + popd + + # If there is a keyfile for a data disk, put copy it to the root partition and + # ensure the permissions are set appropriately. + if [[ -f "/tmp/data.keyfile" ]]; then + sudo cp /tmp/data.keyfile /mnt/etc/data.keyfile + sudo chmod 0400 /mnt/etc/data.keyfile + fi + fi + ''; +in +{ + # Only include desktop components if one is supplied. + imports = [ ] ++ lib.optional (desktop != null) ./desktop.nix; + + config.users.users.nixos = { + description = "NixOS"; + extraGroups = [ + "audio" + "networkmanager" + "users" + "video" + "wheel" + ] + ++ ifExists [ + "docker" + "podman" + ]; + homeMode = "0755"; + openssh.authorizedKeys.keys = [ (builtins.readFile ../../../home/gburd/ssh.pub) ]; + packages = [ pkgs.home-manager ]; + shell = pkgs.fish; + }; + + config.system.stateVersion = lib.mkForce lib.trivial.release; + config.environment.systemPackages = [ install-system ]; + config.services.kmscon.autologinUser = "${username}"; +} diff --git a/nixos/_mixins/users/nixos/desktop.nix b/nixos/_mixins/users/nixos/desktop.nix new file mode 100644 index 0000000..0d965c0 --- /dev/null +++ b/nixos/_mixins/users/nixos/desktop.nix @@ -0,0 +1,14 @@ +{ config, desktop, lib, pkgs, username, ... }: { + config.environment.systemPackages = with pkgs; [ + gparted + ]; + config.systemd.tmpfiles.rules = [ + "d /home/${username}/Desktop 0755 ${username} users" + "L+ /home/${username}/Desktop/gparted.desktop - - - - ${pkgs.gparted}/share/applications/gparted.desktop" + "L+ /home/${username}/Desktop/io.elementary.terminal.desktop - - - - ${pkgs.pantheon.elementary-terminal}/share/applications/io.elementary.terminal.desktop" + "L+ /home/${username}/Desktop/io.calamares.calamares.desktop - - - - ${pkgs.calamares-nixos}/share/applications/io.calamares.calamares.desktop" + ]; + config.isoImage.edition = lib.mkForce "${desktop}"; + config.services.xserver.displayManager.autoLogin.user = "${username}"; + config.services.kmscon.autologinUser = lib.mkForce null; +} diff --git a/nixos/_mixins/users/root/default.nix b/nixos/_mixins/users/root/default.nix new file mode 100644 index 0000000..9b53f33 --- /dev/null +++ b/nixos/_mixins/users/root/default.nix @@ -0,0 +1,7 @@ +_: +{ + users.users.root = { + hashedPassword = null; + openssh.authorizedKeys.keys = [ (builtins.readFile ../../../home/gburd/ssh.pub) ]; + }; +} diff --git a/nixos/_mixins/virt/default.nix b/nixos/_mixins/virt/default.nix new file mode 100644 index 0000000..414515c --- /dev/null +++ b/nixos/_mixins/virt/default.nix @@ -0,0 +1,25 @@ +{ config, desktop, lib, pkgs, ... }: { + #https://nixos.wiki/wiki/Podman + environment.systemPackages = with pkgs; [ + unstable.distrobox + fuse-overlayfs + podman-compose + podman-tui + ] ++ lib.optionals (desktop != null) [ + unstable.pods + unstable.quickemu + xorg.xhost + ]; + + virtualisation = { + podman = { + defaultNetwork.settings = { + dns_enabled = true; + }; + dockerCompat = true; + dockerSocket.enable = true; + enable = true; + enableNvidia = lib.elem "nvidia" config.services.xserver.videoDrivers; + }; + }; +} diff --git a/nixos/floki/default.nix b/nixos/floki/default.nix new file mode 100644 index 0000000..0a4dea0 --- /dev/null +++ b/nixos/floki/default.nix @@ -0,0 +1,86 @@ +{ pkgs, inputs, ... }: { + imports = [ + inputs.nixos-hardware.nixosModules.common-cpu-amd + inputs.nixos-hardware.nixosModules.common-gpu-amd + inputs.nixos-hardware.nixosModules.common-pc-ssd + #(import ./disks.nix { }) + + ../_mixins/hardware/systemd-boot.nix + ../_mixins/services/bluetooth.nix + ../_mixins/services/pipewire.nix + # ../_mixins/services/zerotier.nix + ../_mixins/virt + + ../_mixins/global + ../_mixins/users/gburd + ]; + + boot.initrd.luks.devices."enc".device = "/dev/disk/by-uuid/470152b6-16cc-4dcf-b1e9-c684c1589e33"; + + fileSystems."/swap" = + { + device = "/dev/disk/by-uuid/bf75af76-49b0-41fa-a4e5-9a52a6a0a667"; + fsType = "btrfs"; + options = [ "subvol=swap" ]; + }; + + fileSystems."/boot" = + { + device = "/dev/disk/by-uuid/3D04-3716"; + fsType = "vfat"; + }; + + # fileSystems = { + # "/boot" = { + # device = "/dev/disk/by-label/ESP"; + # fsType = "vfat"; + # }; + # }; + + swapDevices = [{ + device = "/swap/swapfile"; + size = 8196; + }]; + + boot = { + initrd.availableKernelModules = [ + "ahci" + "nvme" + "rtsx_pci_sdmmc" + "sd_mod" + "sdhci_pci" + "uas" + "usbhid" + "usb_storage" + "xhci_pci" + ]; + kernelModules = [ "kvm-intel" ]; + kernelPackages = pkgs.linuxPackages_latest; + }; + + # My GPD MicroPC has a US keyboard layout + console.keyMap = lib.mkForce "us"; + services.kmscon.extraConfig = lib.mkForce '' + font-size=14 + xkb-layout=us + ''; + services.xserver.layout = lib.mkForce "us"; + services.xserver.xkbOptions = "ctrl:swapcaps"; + + environment.systemPackages = with pkgs; [ + nvtop-amd + ]; + + networking.hostName = "floki"; + powerManagement.powertop.enable = true; + powerManagement.cpuFreqGovernor = "powersave"; + + # Lid settings + services.logind = { + lidSwitch = "suspend"; + lidSwitchExternalPower = "lock"; + }; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + +} diff --git a/nixos/floki/disks.nix b/nixos/floki/disks.nix new file mode 100644 index 0000000..48517fc --- /dev/null +++ b/nixos/floki/disks.nix @@ -0,0 +1,44 @@ +{ disks ? [ "/dev/nvme0n1" ], ... }: +let + defaultXfsOpts = [ "defaults" "relatime" "nodiratime" ]; +in +{ + disko.devices = { + disk = { + nvme0 = { + type = "disk"; + device = builtins.elemAt disks 0; + content = { + type = "table"; + format = "gpt"; + partitions = [{ + name = "ESP"; + start = "0%"; + end = "550MiB"; + bootable = true; + flags = [ "esp" ]; + fs-type = "fat32"; + content = { + type = "filesystem"; + format = "vfat"; + mountpoint = "/boot"; + }; + } + { + name = "root"; + start = "550MiB"; + end = "100%"; + content = { + type = "filesystem"; + # Overwirte the existing filesystem + extraArgs = [ "-f" ]; + format = "xfs"; + mountpoint = "/"; + mountOptions = defaultXfsOpts; + }; + }]; + }; + }; + }; + }; +} diff --git a/hosts/floki/secrets.yaml b/nixos/floki/secrets.yaml similarity index 100% rename from hosts/floki/secrets.yaml rename to nixos/floki/secrets.yaml diff --git a/hosts/floki/ssh_host_ed25519_key.pub b/nixos/floki/ssh_host_ed25519_key.pub similarity index 100% rename from hosts/floki/ssh_host_ed25519_key.pub rename to nixos/floki/ssh_host_ed25519_key.pub diff --git a/hosts/floki/ssh_host_rsa_key.pub b/nixos/floki/ssh_host_rsa_key.pub similarity index 100% rename from hosts/floki/ssh_host_rsa_key.pub rename to nixos/floki/ssh_host_rsa_key.pub diff --git a/nixos/iso-console/default.nix b/nixos/iso-console/default.nix new file mode 100644 index 0000000..5589c62 --- /dev/null +++ b/nixos/iso-console/default.nix @@ -0,0 +1,4 @@ +{ lib, ... }: +{ + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; +} diff --git a/nixos/iso-desktop/default.nix b/nixos/iso-desktop/default.nix new file mode 100644 index 0000000..8653889 --- /dev/null +++ b/nixos/iso-desktop/default.nix @@ -0,0 +1,9 @@ +{ lib, ... }: +{ + imports = [ + ../_mixins/services/bluetooth.nix + ../_mixins/services/pipewire.nix + ]; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; +} diff --git a/nixpkgs.nix b/nixpkgs.nix new file mode 100644 index 0000000..39a480d --- /dev/null +++ b/nixpkgs.nix @@ -0,0 +1,8 @@ +# A nixpkgs instance that is grabbed from the pinned nixpkgs commit in the lock +# file Useful to avoid using channels when using legacy nix commands +let lock = (builtins.fromJSON (builtins.readFile ./flake.lock)).nodes.nixpkgs.locked; +in +import (fetchTarball { + url = "https://github.com/nixos/nixpkgs/archive/${lock.rev}.tar.gz"; + sha256 = lock.narHash; +}) diff --git a/overlays/default.nix b/overlays/default.nix index ae815c2..86e7135 100644 --- a/overlays/default.nix +++ b/overlays/default.nix @@ -1,4 +1,4 @@ -{ outputs, inputs }: +{ inputs }: let addPatches = pkg: patches: pkg.overrideAttrs (oldAttrs: { patches = (oldAttrs.patches or [ ]) ++ patches; @@ -10,11 +10,12 @@ in # 'inputs.${flake}.legacyPackages.${pkgs.system}' flake-inputs = final: _: { inputs = builtins.mapAttrs - (_: flake: let - legacyPackages = ((flake.legacyPackages or {}).${final.system} or {}); - packages = ((flake.packages or {}).${final.system} or {}); - in - if legacyPackages != {} then legacyPackages else packages + (_: flake: + let + legacyPackages = (flake.legacyPackages or { }).${final.system} or { }; + packages = (flake.packages or { }).${final.system} or { }; + in + if legacyPackages != { } then legacyPackages else packages ) inputs; }; diff --git a/pkgs/formats/default.nix b/pkgs/formats/default.nix index 4ddabc4..33003d1 100644 --- a/pkgs/formats/default.nix +++ b/pkgs/formats/default.nix @@ -1,6 +1,6 @@ { pkgs }: { - gzipJson = {}: { + gzipJson = _: { generate = name: value: pkgs.callPackage ({ runCommand, gzip }: runCommand name { @@ -12,6 +12,6 @@ '') { }; - type = (pkgs.formats.json { }).type; + inherit ((pkgs.formats.json { })) type; }; } diff --git a/pkgs/pass-wofi/default.nix b/pkgs/pass-wofi/default.nix index e19a3c7..4167f8e 100644 --- a/pkgs/pass-wofi/default.nix +++ b/pkgs/pass-wofi/default.nix @@ -1,7 +1,5 @@ { lib -, pkgs , stdenv -, fetchFromGitHub , makeWrapper , pass , jq diff --git a/shell.nix b/shell.nix index be24d02..bb0ef53 100644 --- a/shell.nix +++ b/shell.nix @@ -1,15 +1,4 @@ -# Shell for bootstrapping flake-enabled nix and other tooling -{ pkgs ? # If pkgs is not defined, instanciate nixpkgs from locked commit - let - lock = (builtins.fromJSON (builtins.readFile ./flake.lock)).nodes.nixpkgs.locked; - nixpkgs = fetchTarball { - url = "https://github.com/nixos/nixpkgs/archive/${lock.rev}.tar.gz"; - sha256 = lock.narHash; - }; - in - import nixpkgs { overlays = [ ]; } -, ... }: -{ +{ pkgs ? (import ./nixpkgs.nix) { overlays = [ ]; } }: { default = pkgs.mkShell { NIX_CONFIG = "extra-experimental-features = nix-command flakes repl-flake"; nativeBuildInputs = with pkgs; [ @@ -32,8 +21,8 @@ services.dbus.packages = [ pkgs.gcr ]; services.pcscd.enable = true; programs.gnupg.agent = { - enable = true; - pinentryFlavor = "curses"; - enableSSHSupport = true; + enable = true; + pinentryFlavor = "curses"; + enableSSHSupport = true; }; } diff --git a/templates/c/flake.nix b/templates/c/flake.nix index 46cee2e..7f953e8 100644 --- a/templates/c/flake.nix +++ b/templates/c/flake.nix @@ -10,7 +10,7 @@ nixpkgs.url = "github:NixOS/nixpkgs/nixos-22.11"; }; - outputs = { self, nixpkgs }: + outputs = { nixpkgs }: let forAllSystems = nixpkgs.lib.genAttrs [ "x86_64-linux" "aarch64-linux" ]; pkgsFor = nixpkgs.legacyPackages; diff --git a/templates/haskell/flake.nix b/templates/haskell/flake.nix index 782db5a..58a764f 100644 --- a/templates/haskell/flake.nix +++ b/templates/haskell/flake.nix @@ -10,7 +10,7 @@ nixpkgs.url = "github:NixOS/nixpkgs/nixos-22.11"; }; - outputs = { self, nixpkgs }: + outputs = { nixpkgs }: let forAllSystems = nixpkgs.lib.genAttrs [ "x86_64-linux" "aarch64-linux" ]; pkgsFor = nixpkgs.legacyPackages; diff --git a/templates/node/flake.nix b/templates/node/flake.nix index 1f9847f..8e78445 100644 --- a/templates/node/flake.nix +++ b/templates/node/flake.nix @@ -10,7 +10,7 @@ nixpkgs.url = "github:NixOS/nixpkgs/nixos-22.11"; }; - outputs = { self, nixpkgs }: + outputs = { nixpkgs }: let forAllSystems = nixpkgs.lib.genAttrs [ "x86_64-linux" "aarch64-linux" ]; pkgsFor = nixpkgs.legacyPackages; diff --git a/templates/rust/flake.nix b/templates/rust/flake.nix index 80dae94..fe23934 100644 --- a/templates/rust/flake.nix +++ b/templates/rust/flake.nix @@ -10,7 +10,7 @@ nixpkgs.url = "github:NixOS/nixpkgs/nixos-22.11"; }; - outputs = { self, nixpkgs }: + outputs = { nixpkgs }: let forAllSystems = nixpkgs.lib.genAttrs [ "x86_64-linux" "aarch64-linux" ]; pkgsFor = nixpkgs.legacyPackages;