Compare commits

..

20 Commits

Author SHA1 Message Date
64b25238da some more needed changes! 2025-03-12 18:27:40 +01:00
72a01e99e3 quite the coherence coming up 2025-03-12 15:43:38 +01:00
2196a1a5e8 use stylix for styling 2025-03-12 14:49:20 +01:00
b007e5b232 try streamlining the dev setup 2025-03-12 12:07:41 +01:00
dc3c98586d some more tryouts for the wallpapers 2025-03-11 17:59:58 +01:00
b17c844bb5 moore 2025-03-11 16:37:31 +01:00
5c3980dfcf not quite there 2025-03-11 15:38:44 +01:00
8eed29719d try setting wallpapers once more 2025-03-11 14:59:46 +01:00
f6f3a19d18 better applet handling 2025-03-08 14:21:59 +01:00
9d55b1de59 some more style adjustments 2025-03-08 13:39:35 +01:00
3f7924651e better styling, qol fixes 2025-03-07 11:44:00 +01:00
eb20634def some working nvidia, some styling 2025-03-06 11:39:41 +01:00
41b8850196 some waybar adjustments 2025-03-05 19:57:18 +01:00
6b1058f6a4 some more fonts and customization 2025-03-05 16:39:35 +01:00
3d32b6a4c5 wip more font struggles 2025-03-04 21:08:11 +01:00
6cd35a3fb2 some more refinement 2025-03-04 19:45:24 +01:00
fae56aa241 quite a few styling changes 2025-03-04 00:09:48 +01:00
729cc66bd1 try to use waybar 2025-03-03 17:52:38 +01:00
47ed3eb0cb more esthetics 2025-02-24 19:00:07 +01:00
7bf8c855b8 some more keybindings 2025-02-24 12:13:33 +01:00
86 changed files with 1267 additions and 3224 deletions

1
.envrc
View File

@@ -1 +0,0 @@
use flake

4
.gitignore vendored
View File

@@ -1,4 +1,2 @@
# Result is a symlink to the built iso
result
# direnv binaries
.direnv
result

3
.gitmodules vendored
View File

@@ -1,3 +0,0 @@
[submodule "secrets"]
path = secrets
url = ssh://git@git.kluster.moll.re:2222/remoll/nixos-secrets.git

View File

@@ -1,12 +0,0 @@
keys:
- &remy_usb age1027e2vu808mvf95m4f0am3aeg88n8vgzt56s04ndpkgm7awzeajspxl6tu
- &remy_yoga ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAX4zsiXSSWbE75C0wyBVwaHOw6Gsbh/WqQsgEhvPwT8 remy@nyx
- &host_yoga age1ckqer7nxzq7q58v9xaqy8ac9vx2va69a46t86wp9m78pj5dpuy3sq8xeaj
creation_rules:
- path_regex: secrets/[^/]+\.(yaml|json|env|ini)$
key_groups:
- age:
- *remy_usb
- *remy_yoga
- *host_yoga

View File

@@ -17,7 +17,6 @@ Don't forget to add the `#<host>` to the end of the target to specify the host c
### Spectre
###
@@ -27,17 +26,10 @@ Run
```bash
nixos-rebuild switch --flake <target>#<machine>
# for instance
nixos-rebuild switch --flake .#Nixtre
nixos-rebuild switch --flake .#spectre
```
to apply the configuration.
### Using `nh`
Updating from a local config is now easy - since `nh` is already specified as installed:
```
nix flake update
nh os switch .
```
### Installer iso
To build an installer iso, run
@@ -47,31 +39,12 @@ nix build .#nixosConfigurations.bcachefs-iso.config.system.build.isoImage
This will create an iso image in the result directory.
### Macos install
Initial install of nix using the determinate nix installer. Then a "full" bootstrap that installs all required packages such as `nh`, `git` etc.:
```
sudo nix run nix-darwin/master#darwin-rebuild -- switch --flake .#Remys-MacBook-Pro
```
> some modifications might be necessary (i.e. due to faulty git setup at that stage).
```
# could also try something like this:
nix-shell -p git nh
```
Finally, the desired state has been reached where `nh` is available:
```
nh darwin switch .
```
## Installation
TODO - disable root user
```
I install with --no-root-passwd and set users.mutableUsers = false in configuration.nix
```
## TODO
## Inspirations
- https://github.com/the-nix-way/dev-templates
@@ -82,20 +55,6 @@ TODO - disable root user
- https://github.com/anotherhadi/nixy
- https://github.com/Numb-0/nix-0
- https://github.com/Frost-Phoenix/nixos-config
- https://github.com/elifouts/Dotfiles
- https://github.com/nomadics9/nixcfg
- https://github.com/Daholli/nixos-config
- https://github.com/khaneliman/khanelinix
- https://github.com/NotAShelf/nyx
- https://copeberg.org/bloxx12/nichts
- https://github.com/fufexan/dotfiles
- https://github.com/spikespaz/dotfiles
- https://github.com/luisnquin/nixos-config
- https://gitlab.com/fisuri/dotfiles
- https://github.com/NobbZ/nixos-config
- https://code.maralorn.de/maralorn/config/
- https://github.com/sameemul-haque/dotfiles
#### Hyprland specific
- https://github.com/elifouts/Dotfiles
- https://github.com/Abhra00/hyprdots

716
flake.lock generated

File diff suppressed because it is too large Load Diff

208
flake.nix
View File

@@ -1,198 +1,74 @@
{
description = "Nix config entry point";
# since secrets live in a submodule, enable submodules by default
inputs.self.submodules = true;
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
nixpkgs.url = "github:nixos/nixpkgs/nixos-24.11";
nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable";
# Home manager
home-manager = {
url = "github:nix-community/home-manager";
inputs.nixpkgs.follows = "nixpkgs";
};
home-manager.url = "github:nix-community/home-manager/release-24.11";
home-manager.inputs.nixpkgs.follows = "nixpkgs";
# Managing flatpak apps
nix-flatpak.url = "github:gmodena/nix-flatpak";
nix-flatpak.url = "github:gmodena/nix-flatpak/?ref=v0.4.1";
# hyprland, plugins and related utils
hyprland.url = "github:hyprwm/Hyprland";
stylix = {
url = "github:nix-community/stylix";
inputs.nixpkgs.follows = "nixpkgs";
};
# zen browser
zen-browser = {
url = "github:0xc000022070/zen-browser-flake";
inputs.nixpkgs.follows = "nixpkgs";
};
# secrets
sops-nix = {
url = "github:Mic92/sops-nix";
inputs.nixpkgs.follows = "nixpkgs";
};
# quickshell
dankMaterialShell = {
url = "github:AvengeMedia/DankMaterialShell";
inputs.nixpkgs.follows = "nixpkgs";
};
nix4vscode = {
url = "github:nix-community/nix4vscode";
inputs.nixpkgs.follows = "nixpkgs";
};
nix-darwin.url = "github:nix-darwin/nix-darwin/nix-darwin-25.11";
nix-darwin.inputs.nixpkgs.follows = "nixpkgs";
mac-app-util = {
# see https://github.com/hraban/mac-app-util/issues/39#issuecomment-3503946041
url = "github:hraban/mac-app-util";
inputs.cl-nix-lite.url = "github:r4v3n6101/cl-nix-lite/url-fix";
};
stylix.url = "github:danth/stylix/release-24.11";
};
outputs = {
self,
nixpkgs,
nixpkgs-unstable,
home-manager,
stylix,
sops-nix,
nix4vscode,
nix-darwin,
mac-app-util,
...
} @ inputs:
let
system = "x86_64-linux";
username = "remy";
name = "Rémy";
pkgs = nixpkgs.legacyPackages.${system};
pkgs-unstable = nixpkgs-unstable.legacyPackages.${system};
lib = nixpkgs.lib;
systems = {
# HP Spectre x360 2018
Nixtre = {
hostModules = [
./hosts/spectre-x360-2018
];
userModules = [
./users/remy_spectre
inputs.nix-flatpak.homeManagerModules.nix-flatpak
];
extraModules = [
inputs.stylix.nixosModules.stylix
inputs.sops-nix.nixosModules.sops
];
};
# Portable usb stick
nichts = {
hostModules = [
./hosts/mobile-usb
];
userModules = [
./users/remy_usb
inputs.nix-flatpak.homeManagerModules.nix-flatpak
];
extraModules = [
inputs.stylix.nixosModules.stylix
inputs.sops-nix.nixosModules.sops
];
};
# Lenovo yoga 7 pro
nyx = {
hostModules = [
./hosts/yoga-7-pro
];
userModules = [
./users/remy_yoga
inputs.nix-flatpak.homeManagerModules.nix-flatpak
inputs.dankMaterialShell.homeModules.dankMaterialShell.default
];
extraModules = [
inputs.stylix.nixosModules.stylix
inputs.sops-nix.nixosModules.sops
{ nixpkgs.overlays = [ inputs.nix4vscode.overlays.default ]; }
];
};
};
in
{
# For each entry in `systems` create a nixosConfiguration
nixosConfigurations = lib.mapAttrs (_name: cfg:
nixpkgs.lib.nixosSystem {
inherit system;
specialArgs = { inherit inputs pkgs-unstable; };
modules =
cfg.hostModules ++
cfg.extraModules ++
[ home-manager.nixosModules.home-manager {
# Common home-manager flags
home-manager = {
backupFileExtension = ".backup";
useGlobalPkgs = true;
useUserPackages = true;
extraSpecialArgs = { inherit inputs pkgs-unstable; };
};
# Merge in all the user fragments for this host
home-manager.users.remy = lib.mkMerge cfg.userModules;
}
]
;
}
) systems;
## NixOS configurations are the main output of this flake
# HP Spectre x360 2018
nixosConfigurations.spectre = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
specialArgs = { inherit inputs; };
darwinConfigurations."Remys-MacBook-Pro" = nix-darwin.lib.darwinSystem {
modules = [
home-manager.darwinModules.home-manager {
home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true;
home-manager.backupFileExtension = ".backup";
home-manager.extraSpecialArgs = { inherit inputs pkgs-unstable; };
./hosts/spectre-x360-2018
stylix.nixosModules.stylix
home-manager.nixosModules.home-manager
{
home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true;
home-manager.extraSpecialArgs = { inherit inputs; };
home-manager.users.remy.imports = [
./users/remy_macos
mac-app-util.homeManagerModules.default
];
}
mac-app-util.darwinModules.default
{ nixpkgs.overlays = [ inputs.nix4vscode.overlays.default ]; }
./hosts/macbook-pro
home-manager.users.remy.imports = [
./users/remy.nix
inputs.nix-flatpak.homeManagerModules.nix-flatpak
];
}
];
};
# ## Useful nix build tools
# # iso builder TODO
# nixosConfigurations.bcachefs-iso = nixpkgs.lib.nixosSystem {
# system = "x86_64-linux";
# modules = [
# "${nixpkgs}/nixos/modules/installer/cd-dvd/installation-cd-minimal-new-kernel-no-zfs.nix"
# ({ lib, pkgs, ... }: {
# boot.supportedFilesystems = [ "bcachefs" ];
# boot.kernelPackages = lib.mkOverride 0 pkgs.linuxPackages_latest;
# })
# ];
# };
# nixosConfigurations.raspberry-pi = nixpkgs.lib.nixosSystem {
# system = "aarch64-linux";
# modules = [
# ./hosts/raspberry-pi/configuration.nix
# ];
# };
# devshell for this configuration
devShells.x86_64-linux.default = nixpkgs.legacyPackages.x86_64-linux.mkShell {
packages = [
pkgs.sops
## Home Manager configurations here?
## Useful nix build tools
# iso builder TODO
nixosConfigurations.bcachefs-iso = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules = [
"${nixpkgs}/nixos/modules/installer/cd-dvd/installation-cd-minimal-new-kernel-no-zfs.nix"
({ lib, pkgs, ... }: {
boot.supportedFilesystems = [ "bcachefs" ];
boot.kernelPackages = lib.mkOverride 0 pkgs.linuxPackages_latest;
})
];
# tell sops where the public ssh key to "seed" the age key from is located
SOPS_AGE_SSH_PRIVATE_KEY_FILE = "/home/remy/.ssh/main_key";
};
};
}

View File

@@ -1,26 +0,0 @@
{ config, lib, pkgs, ... }:
{
users.users.remy = {
home = "/Users/remy";
};
system.primaryUser = "remy";
nix.enable=false;
nixpkgs.config.allowUnfree = true;
security.pam.services.sudo_local.touchIdAuth = true;
# Necessary for using flakes on this system.
nix.settings.experimental-features = "nix-command flakes";
# Enable alternative shell support in nix-darwin.
# programs.fish.enable = true;
# Set Git commit hash for darwin-version.
# system.configurationRevision = self.rev or self.dirtyRev or null;
# Used for backwards compatibility, please read the changelog before changing.
# $ darwin-rebuild changelog
system.stateVersion = 6;
nixpkgs.hostPlatform = "aarch64-darwin";
}

View File

@@ -1,15 +0,0 @@
{
config = {
#nix-config = {
# networking.hostName = "nyx";
# userName = "remy";
#};
};
# Merge the configuration and hardware configuration
imports = [
./configuration.nix
../../modules/macos/tiling.nix
];
}

View File

@@ -1,10 +0,0 @@
# Edit this configuration file to define what should be installed on
# your system. Help is available in the configuration.nix(5) man page, on
# https://search.nixos.org/options and in the NixOS manual (`nixos-help`).
{ config, lib, pkgs, ... }:
{
# For more information, see `man configuration.nix` or https://nixos.org/manual/nixos/stable/options#opt-system.stateVersion .
system.stateVersion = "24.05"; # Did you read the comment?
}

View File

@@ -1,38 +0,0 @@
{lib, config, options, pkgs, ...}:
{
config = {
nix-config = {
networking.hostName = "nichts";
userName = "remy";
gnome.enable = true;
};
};
# Merge the configuration and hardware configuration
imports = [
./configuration.nix
./hardware-configuration.nix
# ../../modules/nixos/backup.nix
../../modules/nixos/bluetooth.nix
../../modules/nixos/flakes.nix
../../modules/nixos/flatpak.nix
../../modules/nixos/fonts.nix
../../modules/nixos/gnome.nix
../../modules/nixos/language.nix
../../modules/nixos/ld.nix
../../modules/nixos/monitoring.nix
../../modules/nixos/networking.nix
../../modules/nixos/pipewire.nix
../../modules/nixos/podman.nix
../../modules/nixos/power.nix
../../modules/nixos/stylix.nix
../../modules/nixos/user.nix
../../utils/binary-cache.nix
../../utils/garbage-collection.nix
../../utils/unfree.nix
];
}

View File

@@ -1,40 +0,0 @@
# Do not modify this file! It was generated by nixos-generate-config
# and may be overwritten by future invocations. Please make changes
# to /etc/nixos/configuration.nix instead.
{ config, lib, pkgs, modulesPath, ... }:
{
imports =
[ (modulesPath + "/installer/scan/not-detected.nix")
];
boot.initrd.availableKernelModules = [ "nvme" "xhci_pci" "thunderbolt" "usb_storage" "sd_mod" ];
boot.initrd.kernelModules = [ ];
boot.kernelModules = [ ];
boot.extraModulePackages = [ ];
fileSystems."/" =
{ device = "/dev/disk/by-uuid/621498e8-64f6-4979-8489-3dc1d145e349";
fsType = "ext4";
};
boot.initrd.luks.devices."root-enc".device = "/dev/disk/by-uuid/156d0f15-397c-4bc6-8f57-026108975246";
fileSystems."/boot" =
{ device = "/dev/disk/by-uuid/B2D0-672E";
fsType = "vfat";
options = [ "fmask=0022" "dmask=0022" ];
};
swapDevices = [ ];
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
# (the default) this is the recommended approach. When using systemd-networkd it's
# still possible to use this option, but it's recommended to use it in conjunction
# with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`.
networking.useDHCP = lib.mkDefault true;
# networking.interfaces.wlp1s0.useDHCP = lib.mkDefault true;
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
}

View File

@@ -1,17 +0,0 @@
{
config,
pkgs,
...
}:
{
boot.loader.grub.enable = true;
boot.loader.grub.efiSupport = true;
# location at install time. Since the drive is a USB drive this is expcected to change on each device
boot.loader.grub.device = "/dev/sdb";
boot.loader.grub.efiInstallAsRemovable = true;
boot.loader.systemd-boot.enable = false;
boot.loader.efi.canTouchEfiVariables = false;
boot.tmp.useTmpfs = true;
}

View File

@@ -6,13 +6,10 @@
./hardware-configuration.nix
../../modules/nixos/bluetooth.nix
../../modules/nixos/flakes.nix
../../modules/nixos/flatpak.nix
../../modules/nixos/fonts.nix
../../modules/nixos/hyprland.nix
../../modules/nixos/ld.nix
../../modules/nixos/monitoring.nix
../../modules/nixos/networking.nix
../../modules/nixos/nh.nix
../../modules/nixos/nvidia.nix
../../modules/nixos/pipewire.nix
../../modules/nixos/podman.nix

View File

@@ -1,14 +0,0 @@
Installed using
```
> sudo nixos-install --root /tmp/new-install/ --flake .#nyx --impure --no-root-passwd
```
where `/tmp/new-install` was the mount point of the target FS.
The root user is effectively deactivated, hence the additional setup:
- users are part of the `wheel` group
- password needs to be set before first boot:
- `nix-enter --root /tmp/new-install`
- `passwd <username>`

View File

@@ -1,31 +0,0 @@
# Edit this configuration file to define what should be installed on
# your system. Help is available in the configuration.nix(5) man page, on
# https://search.nixos.org/options and in the NixOS manual (`nixos-help`).
{ config, lib, pkgs, ... }:
{
boot.loader = {
systemd-boot.enable = true;
timeout = 0;
efi.canTouchEfiVariables = true;
};
services.logind.settings.Login = {
# because it is so inconveniently located
HandlePowerKey = "ignore";
# handled by the dm instead
# HandleLidSwitch = "ignore"; # needs to be set because it is not passed to other events
HandleLidSwitchDocked = "ignore";
};
# requires too many shenanigans so I just install using --no-root-passwd
# users.users.root.hashedPassword = "!";
nixpkgs.config.allowUnfree = true;
# For more information, see `man configuration.nix` or https://nixos.org/manual/nixos/stable/options#opt-system.stateVersion .
system.stateVersion = "24.05"; # Did you read the comment?
}

View File

@@ -1,37 +0,0 @@
{
config = {
nix-config = {
networking.hostName = "nyx";
userName = "remy";
};
};
# Merge the configuration and hardware configuration
imports = [
./configuration.nix
./hardware-configuration.nix
../../modules/nixos/backup.nix
../../modules/nixos/bluetooth.nix
../../modules/nixos/flakes.nix
../../modules/nixos/flatpak.nix
../../modules/nixos/fonts.nix
../../modules/nixos/hyprland.nix
../../modules/nixos/language.nix
../../modules/nixos/ld.nix
../../modules/nixos/monitoring.nix
../../modules/nixos/networking.nix
../../modules/nixos/pipewire.nix
../../modules/nixos/podman.nix
../../modules/nixos/power.nix
../../modules/nixos/sops.nix
../../modules/nixos/stylix.nix
../../modules/nixos/user.nix
../../utils/binary-cache.nix
../../utils/garbage-collection.nix
../../utils/unfree.nix
];
}

View File

@@ -1,81 +0,0 @@
# Do not modify this file! It was generated by nixos-generate-config
# and may be overwritten by future invocations. Please make changes
# to /etc/nixos/configuration.nix instead.
{ config, lib, pkgs, modulesPath, ... }:
{
imports =
[ (modulesPath + "/installer/scan/not-detected.nix")
];
boot.initrd.availableKernelModules = [ "nvme" "xhci_pci" "thunderbolt" "usb_storage" "sd_mod" ];
boot.initrd.kernelModules = [ ];
boot.kernelModules = [ "kvm-amd" ];
boot.extraModulePackages = [ ];
boot.kernelPackages = pkgs.linuxPackages_latest;
boot.kernelParams = [
"quiet"
"splash"
];
# https://github.com/lwfinger/rtw89/issues/240
# boot.extraModprobeConfig = ''
# options rtw89_pci disable_aspm_l1ss=y disable_aspm_l1=y disable_clkreq=y
# options rtw89_core disable_ps_mode=y
# '';
# ipu is apparently required to make the webcam available as a camera device
hardware.ipu6 = {
enable = true;
platform = "ipu6";
};
services.fwupd.enable = true;
fileSystems."/" =
{ device = "/dev/disk/by-uuid/1ea0784c-4eeb-46f1-a0ae-f6b311b27bd1";
fsType = "btrfs";
options = [ "subvol=@" ];
};
boot.initrd.luks.devices."luks-root" = {
device = "/dev/disk/by-uuid/8832c090-9ca7-4a9c-8cfd-cf43cb59b3d3";
crypttabExtraOpts = [ "fido2-token=auto" ];
};
fileSystems."/boot" =
{ device = "/dev/disk/by-uuid/86C2-FD4D";
fsType = "vfat";
options = [ "fmask=0022" "dmask=0022" ];
};
fileSystems."/home" =
{ device = "/dev/disk/by-uuid/1ea0784c-4eeb-46f1-a0ae-f6b311b27bd1";
fsType = "btrfs";
options = [ "subvol=@home" ];
};
# TODO - only enable this if the user remy exists
fileSystems."/scratch/${config.nix-config.userName}" =
{ device = "/dev/disk/by-uuid/1ea0784c-4eeb-46f1-a0ae-f6b311b27bd1";
fsType = "btrfs";
options = [
"subvol=@scratch"
# Even though the mount point is not in home, we still want to show it in gnome-related file managers
"x-gvfs-show"
"x-gvfs-name=scratch"
"x-gvfs-icon=view-refresh"
];
# TODO make it owned by the user
};
swapDevices = [ ];
# Enables DHCP on each ethernet and wireless interface.
networking.useDHCP = lib.mkDefault true;
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
}

View File

@@ -0,0 +1,25 @@
{pkgs, ...}:
{
# Add a udev rule that launches a backup using restic when a specific USB device (the backup drive) is plugged in
environment.systemPackages = with pkgs; [
restic
];
# the udev rule:
services.udev.extraRules = ''
ACTION=="add", SUBSYSTEM=="block", ENV{ID_FS_LABEL}=="backup-restic", TAG+="systemd", ENV{SYSTEMD_WANTS}="backup-restic.service"
'';
# the systemd service:
systemd.services.backup-restic = {
description = "Backup using restic (triggered when USB drive is plugged in)";
after = [ "local-fs.target" ];
wantedBy = [ "multi-user.target" ];
serviceConfig = {
Type = "oneshot";
# TODO: adapt command
ExecStart = "${pkgs.restic}/bin/restic backup /home/username";
};
};
}

View File

@@ -1,9 +0,0 @@
{pkgs, ...}:
{
home.packages = [
pkgs.rofi-bluetooth
];
# patch the rofi-bluetooth script to use an alternative rofi-command variable
}

View File

@@ -1,27 +1,12 @@
{pkgs, inputs, ...}:
{pkgs, ...}:
{
imports = [
inputs.zen-browser.homeModules.beta
];
programs.zen-browser = {
programs.firefox = {
## Enable the Firefox web browser
enable = true;
## Global preferences
policies = {
BlockAboutConfig = true;
AutofillAddressEnabled = false;
AutofillCreditCardEnabled = false;
DisableAppUpdate = true;
DisableFeedbackCommands = true;
DisableTelemetry = true;
DisablePocket = true;
DontCheckDefaultBrowser = true;
OfferToSaveLogins = false;
DefaultDownloadDirectory = "\${home}/Downloads";
ExtensionSettings = with builtins;
let extension = shortId: uuid: {
name = uuid;
@@ -32,20 +17,64 @@
};
in listToAttrs [
(extension "ublock-origin" "uBlock0@raymondhill.net")
(extension "ghostery" "firefox@ghostery.com")
(extension "tabliss" "extension@tabliss.io")
(extension "clearurls" "{74145f27-f039-47ce-a470-a662b129930a}")
(extension "keepassxc-browser" "keepassxc-browser@keepassxc.org")
(extension "ghostery" "firefox@ghostery.com")
];
};
# ## Per-profile preferences
# profiles.default = {
# search = {
# force = true;
# default = "ddg";
# privateDefault = "ddg";
# order = ["ddg" "google"];
# };
# };
};
## Per-profile preferences
profiles.default = {
search = {
force = true;
default = "DuckDuckGo";
privateDefault = "DuckDuckGo";
order = ["DuckDuckGo" "Google"];
};
settings = {
"browser.startup.homepage" = "about:home";
# Disable irritating first-run stuff
"browser.disableResetPrompt" = true;
"browser.download.panel.shown" = true;
"browser.feeds.showFirstRunUI" = false;
"browser.messaging-system.whatsNewPanel.enabled" = false;
"browser.rights.3.shown" = true;
"browser.shell.checkDefaultBrowser" = false;
"browser.shell.defaultBrowserCheckCount" = 1;
"browser.startup.homepage_override.mstone" = "ignore";
"browser.uitour.enabled" = false;
"startup.homepage_override_url" = "";
"trailhead.firstrun.didSeeAboutWelcome" = true;
"browser.bookmarks.restore_default_bookmarks" = false;
"browser.bookmarks.addedImportButton" = true;
# Disable "save password" prompt
"signon.rememberSignons" = false;
# Harden
"privacy.trackingprotection.enabled" = true;
"dom.security.https_only_mode" = true;
# Disable Pocket
"extensions.pocket.enabled" = false;
# Disable telemetry
"toolkit.telemetry.enabled" = false;
# Remove bookmarks toolbar
"browser.toolbars.bookmarks.visibility" = "never";
# Restore session on startup
"browser.startup.page" = 3;
# Automatically enable extensions
"extensions.autoDisableScopes" = 0;
};
};
};
}

View File

@@ -1,190 +1,117 @@
{pkgs, ...}:
let
baseExtensions = pkgs.nix4vscode.forVscode [
# QOL
"mhutchie.git-graph"
"redhat.vscode-yaml"
# Nix environment selector
"arrterian.nix-env-selector"
# continue.continue
"github.copilot"
"github.copilot-chat"
];
baseSettings = {
# visual
"window.titleBarStyle" = "native";
"window.customTitleBarVisibility" = "never";
"window.menuBarVisibility" = "hidden";
"window.autoDetectColorScheme" = true;
"workbench.preferredDarkColorTheme" = "Default Dark Modern";
"workbench.preferredLightColorTheme" = "Default Light Modern";
"editor.fontFamily" = "'FiraCode Nerd Font Mono', 'monospace', monospace";
"terminal.integrated.fontFamily" = "FiraCode Nerd Font Mono";
"workbench.iconTheme" = "vs-seti";
# telemetry
"telemetry.telemetryLevel" = "off";
"redhat.telemetry.enabled" = false;
# editor QOL
"security.workspace.trust.untrustedFiles" = "open";
"editor.wordWrap" = "on";
"editor.suggestSelection" = "first";
"editor.renderWhitespace" = "none";
"editor.acceptSuggestionOnEnter" = "off";
"editor.fontLigatures" = true;
"editor.inlineSuggest.enabled" = true;
"editor.bracketPairColorization.enabled" = true;
"editor.unicodeHighlight.nonBasicASCII" = false;
"editor.unicodeHighlight.invisibleCharacters" = false;
"editor.unicodeHighlight.ambiguousCharacters" = false;
"files.autoSave" = "onWindowChange";
"files.autoSaveDelay" = 1000;
"files.insertFinalNewline" = true;
"files.trimTrailingWhitespace" = true;
"explorer.confirmDelete" = false;
"explorer.confirmDragAndDrop" = false;
"terminal.integrated.enableMultiLinePasteWarning" = false;
"update.showReleaseNotes" = false;
"terminal.external.linuxExec" = "kitty";
"workbench.startupEditor" = "newUntitledFile";
# Extension management
"extensions.autoCheckUpdates" = false;
"extensions.autoUpdate" = false;
"extensions.ignoreRecommendations" = true;
# git
"git.ignoreMissingGitWarning" = true;
"git.confirmSync" = false;
"git.enableSmartCommit" = true;
"git.autofetch" = true;
"diffEditor.renderSideBySide" = false;
"diffEditor.hideUnchangedRegions.enabled" = true;
"diffEditor.ignoreTrimWhitespace" = false;
# Copilot
"github.copilot.editor.enableAutoCompletions" = true;
"github.copilot.advanced" = {};
"github.copilot.enable" = {
"*" = true;
};
# Python
"python.terminal.activateEnvironment" = false; # let nix-shell handle this
};
baseKeybindings = [
# comment/uncomment line
{
key = "ctrl+[Backslash]"; # was ctrl+# but vscode reads the key differently apparently
command = "editor.action.commentLine";
when = "editorTextFocus";
}
];
in
{
programs.vscode = {
enable = true;
profiles.default = {
userSettings = baseSettings // {
"window.newWindowProfile" = "development";
# profiles = {
# default = {
extensions = with pkgs.vscode-extensions; [
# QOL
mhutchie.git-graph
redhat.vscode-yaml
github.copilot
# python
ms-python.python
ms-python.isort
ms-python.debugpy
ms-python.vscode-pylance
# Nix language
jnoortheen.nix-ide
];
# };
keybindings = [
{
key = "ctrl+#";
command = "editor.action.commentLine";
when = "editorTextFocus";
}
];
userSettings = {
# visual
"window.menuBarVisibility" = "toggle";
# "editor.fontFamily" = "'FiraCode Nerd Font Mono', 'monospace', monospace";
# "terminal.integrated.fontFamily" = "FiraCode Nerd Font Mono";
# "workbench.iconTheme" = "vs-seti";
# telemetry
"telemetry.enableCrashReporter" = false;
"telemetry.enableTelemetry" = false;
"redhat.telemetry.enabled" = false;
# editor QOL
"security.workspace.trust.untrustedFiles" = "open";
"editor.wordWrap" = "on";
"editor.suggestSelection" = "first";
"editor.renderWhitespace" = "none";
"editor.acceptSuggestionOnEnter" = "off";
"editor.fontLigatures" = true;
"editor.inlineSuggest.enabled" = true;
"editor.bracketPairColorization.enabled" = true;
"editor.unicodeHighlight.nonBasicASCII" = false;
"editor.unicodeHighlight.invisibleCharacters" = false;
"editor.unicodeHighlight.ambiguousCharacters" = false;
"files.autoSave" = "onWindowChange";
"files.autoSaveDelay" = 1000;
"files.insertFinalNewline" = true;
"files.trimTrailingWhitespace" = true;
"explorer.confirmDelete" = false;
"explorer.confirmDragAndDrop" = false;
"terminal.integrated.enableMultiLinePasteWarning" = false;
"update.showReleaseNotes" = false;
"terminal.external.linuxExec" = "kitty";
"workbench.startupEditor" = "newUntitledFile";
# "workbench.colorTheme" = "Default Light+";
"github.copilot.editor.enableAutoCompletions" = true;
"github.copilot.advanced" = {};
"github.copilot.enable" = {
"*" = true;
};
extensions = [];
};
profiles.development = {
extensions = baseExtensions ++ pkgs.nix4vscode.forVscode [
# python
"ms-python.python"
"ms-python.isort"
"ms-python.debugpy"
"ms-python.vscode-pylance"
# git
"git.ignoreMissingGitWarning" = true;
"git.confirmSync" = false;
"git.enableSmartCommit" = true;
"git.autofetch" = true;
"diffEditor.renderSideBySide" = false;
"diffEditor.hideUnchangedRegions.enabled" = true;
"diffEditor.ignoreTrimWhitespace" = false;
# nix language
"jnoortheen.nix-ide"
# Flutter and co
"dart-code.flutter"
"dart-code.dart-code"
];
keybindings = baseKeybindings;
userSettings = baseSettings;
};
profiles.science = {
extensions = baseExtensions ++ pkgs.nix4vscode.forVscode [
# python + jupyter
"ms-python.python"
"ms-python.isort"
"ms-python.debugpy"
"ms-python.vscode-pylance"
"ms-toolsai.vscode-jupyter-slideshow"
"ms-toolsai.jupyter"
"ms-toolsai.jupyter-hub"
"ms-toolsai.jupyter-renderers"
# Typst
"myriad-dreamin.tinymist"
];
keybindings = baseKeybindings ++ [
# run code cell in jupyter
{
key = "ctrl+enter";
command = "jupyter.runcurrentcell";
when = "editorTextFocus && isWorkspaceTrusted && jupyter.hascodecells && !editorHasSelection && !isCompositeNotebook && !notebookEditorFocused";
}
];
userSettings = baseSettings // {
"jupyter.disableJupyterAutoStart" = true;
"jupyter.askForKernelRestart" = false;
"workbench.editorAssociations" = {
"*.ipynb" = "jupyter-notebook";
};
"notebook.cellToolbarLocation" = {
"default" = "right";
"jupyter-notebook" = "left";
};
"jupyter.widgetScriptSources" = [
"jsdelivr.com"
"unpkg.com"
];
# Typst
"[typst]" = {
"editor.wordSeparators" = "`~!@#$%^&*()=+[{]}\\|;:'\",.<>/?";
};
"[typst-code]" = {
"editor.wordSeparators" = "`~!@#$%^&*()=+[{]}\\|;:'\",.<>/?";
};
"tinymist.fontPaths" = [
"./font"
];
"workbench.colorCustomizations" = {
"statusBar.background" = "#003f9293";
};
# Python
"jupyter.disableJupyterAutoStart" = true;
"jupyter.askForKernelRestart" = false;
"workbench.editorAssociations" = {
"*.ipynb" = "jupyter-notebook";
};
};
profiles.cloud = {
extensions = baseExtensions ++ pkgs.nix4vscode.forVscode [
"Tim-Koehler.helm-intellisense"
"HashiCorp.terraform"
"signageos.signageos-vscode-sops"
"notebook.cellToolbarLocation" = {
"default" = "right";
"jupyter-notebook" = "left";
};
"jupyter.widgetScriptSources" = [
"jsdelivr.com"
"unpkg.com"
];
# Typst
"[typst]" = {
"editor.wordSeparators" = "`~!@#$%^&*()=+[{]}\\|;:'\",.<>/?";
};
"[typst-code]" = {
"git.openRepositoryInParentFolders" = "never";
"editor.wordSeparators" = "`~!@#$%^&*()=+[{]}\\|;:'\",.<>/?";
};
"tinymist.fontPaths" = [
"./font"
];
keybindings = baseKeybindings;
userSettings = baseSettings;
};
};
}

View File

@@ -1,22 +0,0 @@
{ config, pkgs, ... }:
{
# Set up essential directories in the home directory
# TODO
# home.file."Dev".directory = true;
# home.file."owncloud".directory = true;
# Set XDG user directories
xdg.userDirs = {
enable = true;
createDirectories = true;
documents = "${config.home.homeDirectory}/Documents";
download = "${config.home.homeDirectory}/Downloads";
pictures = "${config.home.homeDirectory}/Pictures";
# do not create the following
desktop = null;
music = null;
publicShare = null;
templates = null;
videos = null;
};
}

View File

@@ -1,11 +0,0 @@
{pkgs, ...}:
{
home.packages = [
# pdf viewer
pkgs.papers
# image viewer
pkgs.loupe
# video player
pkgs.showtime
];
}

View File

@@ -1,32 +1,30 @@
{pkgs, ...}:
{pkgs, ...}:
{
# Required by the fzf fish plugin
programs.fzf = {
enable = true;
};
home.packages = with pkgs; [
fd
bat
];
programs.fish = {
enable = true;
generateCompletions = true;
# enableCompletion = true;
plugins = [
{ name = "fzf"; src = pkgs.fishPlugins.fzf-fish.src; }
{ name = "z"; src = pkgs.fishPlugins.z.src; }
{ name = "pure"; src = pkgs.fishPlugins.pure.src; }
{
name = "fzf-fish";
src = pkgs.fetchFromGitHub {
owner = "PatrickF1";
repo = "fzf.fish";
rev = "v10.3";
sha256 = "sha256-T8KYLA/r/gOKvAivKRoeqIwE2pINlxFQtZJHpOy9GMM=";
};
}
# add others here
];
functions = {
# disable the fish greeting
fish_greeting = "";
};
};
home.packages = [
pkgs.fishPlugins.tide
];
# sets the "default" shell to fish
# actually keeps bash as a posix-compliant default but starts fish if the shell is not bash
@@ -41,5 +39,4 @@
fi
'';
};
}

View File

@@ -1,19 +1,16 @@
{
lib, pkgs, ...
}:
{
# requires that flatpaks be enabled in the system configuration as well
{ lib, pkgs, ... }: {
services.flatpak.enable = true;
services.flatpak.update.auto.enable = false;
services.flatpak.uninstallUnmanaged = false;
services.flatpak.packages = [
"com.calibre_ebook.calibre"
"com.github.flxzt.rnote"
"com.github.tchx84.Flatseal"
"com.spotify.Client"
"io.podman_desktop.PodmanDesktop"
"org.pipewire.Helvum"
"io.github.zen_browser.zen"
"im.riot.Riot"
"com.valvesoftware.Steam"
"org.prismlauncher.PrismLauncher"
];
}
}

View File

@@ -0,0 +1,7 @@
{inputs, pkgs, ...}:
{
# Put a cursor theme to the location expected by the hyprland window manager
# TODO
}

View File

@@ -1,23 +1,10 @@
{
config,
lib,
...
}:
let
cfg = config.nix-config.hypr;
in
{
options = {
nix-config.hypr.enable = lib.mkOption {
type = lib.types.bool;
default = true;
description = "Enable an opinionated hyprland+quickshell setup as a desktop environment.";
};
};
imports = [
./hyprland
./cursor.nix
./hyprland-customization.nix
./hyprpaper.nix
./hyprlock.nix
./hypridle.nix
./waybar.nix
];
}
}

View File

@@ -4,41 +4,34 @@
enable = true;
settings = {
general = {
# See: https://github.com/hyprwm/hypridle/issues/146
before_sleep_cmd = "hyprlock --no-fade-in";
lock_cmd = "hyprlock";
lock_cmd = "pidof hyprlock || hyprlock"; # avoid starting multiple hyprlock instances.
after_sleep_cmd = "hyprctl dispatch dpms on";
ignore_dbus_inhibit = false;
};
listener = [
{
# turn off keyboard backlight after 20 seconds
timeout = 10;
on-timeout = "brightnessctl -d platform::kbd_backlight -s set 0";
# restore keyboard backlight on resume to previous level.
on-resume = "brightnessctl -d platform::kbd_backlight -r";
}
{
# dim screen after 2 minutes
timeout = 120;
on-timeout = "brightnessctl -s set 2%";
# dim screen after 4 minutes
timeout = 240;
on-timeout = "brightnessctl -s set 10";
# set monitor backlight to minimum, avoid 0 on OLED monitor.
on-resume = "brightnessctl -r";
# monitor backlight restore.
}
{
# lock screen after 10 minutes
timeout = 600;
# lock screen after 5 minutes
timeout = 300;
on-timeout = "loginctl lock-session && hyprctl dispatch dpms off";
on-resume = "hyprctl dispatch dpms on";
}
{
# suspend after 15 minutes
timeout = 900;
# suspend after 10 minutes
timeout = 600;
on-timeout = "systemctl suspend";
on-resume = "hyprctl dispatch dpms on";
}
];
};
};
}

View File

@@ -0,0 +1,208 @@
{inputs, pkgs, ...}:
{
home.packages = [
pkgs.hyprshot
pkgs.nautilus
pkgs.gnome-control-center
pkgs.brightnessctl
pkgs.cliphist
pkgs.wl-clipboard
];
wayland.windowManager.hyprland = {
enable = true;
systemd.enable = true;
settings = {
"$mod" = "SUPER";
"$browser" = "firefox";
"$launcher-cmd" = "wofi --show drun -n";
"$ide" = "code";
# Global bindings
bind = [
# Launch applications
"$mod, space, exec, $launcher-cmd"
"$mod, return, exec, kitty"
"$mod, b, exec, $browser"
"$mod, s, exec, $ide"
"$mod, e, exec, nautilus"
# Lock screen
"$mod, l, exec, hyprlock"
# Clipboard management
"$mod, V, exec, cliphist list | wofi --dmenu | cliphist decode | wl-copy"
"$mod+Shift, Q, killactive," # Close window
# Toggle Floating and reduce size
"$mod, f, togglefloating,"
"$mod, f, resizeactive, 50% 50%,"
# Alt-tab alternative
"$mod, Tab, cyclenext,"
"$mod, Tab, bringactivetotop,"
# Move the window
"$mod+Shift, left, movewindow, l"
"$mod+Shift, right, movewindow, r"
"$mod+Shift, up, movewindow, u"
"$mod+Shift, down, movewindow, d"
"$mod+Ctrl, left, movetoworkspace, -1"
"$mod+Ctrl, right, movetoworkspace, +1"
# # Switch workspace
# "$mod+Ctrl, left, workspace, -1"
# "$mod+Ctrl, right, workspace, +1"
# Screenshot
"$mod, Print, exec, hyprshot -m region -o ~/Pictures/Screenshots"
"$mod+Shift, Print, exec, hyprshot -m window -o ~/Pictures/Screenshots"
];
# repeatable bindings
binde = [
# Fn keys
", XF86MonBrightnessDown, exec, brightnessctl set -5%"
", XF86MonBrightnessUp, exec, brightnessctl set +5%"
", XF86AudioRaiseVolume, exec, wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+"
", XF86AudioLowerVolume, exec, wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%-"
", XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"
# Reshape the window in focus
"$mod, left, resizeactive, -2% 0"
"$mod, right, resizeactive, 2% 0"
];
# lock-screen bindings
bindl = [
# on lid close, lock the screen
# if another monitor is connected, only turn the internal monitor off and don't lock the screen
", switch:on:Lid Switch, exec, hyprctl dispatch dpms off eDP-1"
# if there is no active monitor, perform a screen lock
", switch:on:Lid Switch, exec, hyprctl monitors | grep 'dpmsStatus: 1' || hyprlock"
", switch:off:Lid Switch, exec, hyprctl dispatch dpms on eDP-1"
];
# bindr = [
# # Overview
# "$mod, , overview:toggle"
# ];
bindm = [
# move the window
"$mod, mouse:272, movewindow"
];
exec-once = [
# "${pkgs.hyprpaper}/bin/hyprpaper"
# hyprpaper is handled as its own service
"${pkgs.waybar}/bin/waybar"
# listen to clipboard events and send them to cliphist
"wl-paste --watch cliphist store"
"${pkgs.waybar}/bin/hypridle"
"hyprpaper"
# # Fixes cursor themes in gnome apps under hyprland
# "gsettings set org.gnome.desktop.interface cursor-theme '${config.home.pointerCursor.name}'"
# "gsettings set org.gnome.desktop.interface cursor-size ${toString home.pointerCursor.size}"
];
general = {
resize_on_border = true;
gaps_in = 5;
gaps_out = 5;
border_size = 1;
"col.active_border" = "rgb(98971A) rgb(CC241D) 45deg";
layout = "master";
};
misc = {
# disable refreshs when nothing is going on
vfr = false;
disable_hyprland_logo = true;
};
input = {
kb_layout = "de";
# remap caps lock to ctrl
kb_options = "ctrl:nocaps";
numlock_by_default = true;
# mouse input should be unchanged
natural_scroll = false;
sensitivity = 0.3;
touchpad = {
disable_while_typing = false;
natural_scroll = true;
};
};
gestures = {
workspace_swipe = true;
workspace_swipe_fingers = 4;
workspace_swipe_touch = true;
};
decoration = {
rounding = 5;
# active_opacity = 0.95;
inactive_opacity = 0.9;
shadow = {
enabled = false;
};
# blur is set on a per-program basis
windowrulev2 = [
# kitty should behave like a floating window
"animation popin, class:kitty"
"move cursor -50% -50%, class:kitty"
"float, class:kitty"
"size 50% 50%, class:kitty"
# some more floating windows
"float, class:org.gnome.Settings"
"float, class:desktopclient.owncloud.com"
"float, class:org.keepassxc.KeePassXC"
];
};
monitor = [
"eDP-1, 3840x2160, 0x0, 1.5" # the internal laptop monitor
# Samsung monitor at irchel (matching the description)
# "desc:Samsung Electric Company LS27D80xU HK7X800803, 3840x2160, auto-up, 1.5"
", preferred, auto-up, auto" # automatically add any newly detected monitor
];
xwayland = {
enabled = false;
};
env = [
# force apps to use wayland
"NIXOS_OZONE_WL, 1"
"ELECTRON_OZONE_PLATFORM_HINT, wayland"
# set the scale factor for GDK apps
"GDK_SCALE, 1.5"
# set the scale factor for QT apps
"QT_SCALE_FACTOR, 1.5"
# set the scale factor for GTK apps
];
};
plugins = [
# Global overview
pkgs.hyprlandPlugins.hyprspace
# Touch gestures
pkgs.hyprlandPlugins.hyprgrass
];
};
services.swaync.enable = true;
}

View File

@@ -1,30 +0,0 @@
{inputs, pkgs, lib, config, ...}:
let
cfg = config.nix-config.hypr;
in
{
options = {
nix-config.hypr.autostartApps = lib.mkOption {
type = lib.types.listOf lib.types.str;
default = [
"gnome-keyring-daemon --start --components=secrets"
"wl-paste --watch cliphist store"
"${lib.getExe pkgs.hypridle}"
# TODO - currently broken
"${pkgs.owncloud-client}"
"${lib.getExe pkgs.keepassxc}"
];
description = "List of applications to start automatically in Hyprland.";
};
};
config = {
wayland.windowManager.hyprland = {
enable = true;
systemd.enable = true;
settings = {
exec-once = cfg.autostartApps;
};
};
};
}

View File

@@ -1,10 +0,0 @@
{
imports = [
./autostart.nix
./general.nix
./gestures.nix
./keybinds.nix
./layouts.nix
./packages.nix
];
}

View File

@@ -1,146 +0,0 @@
{inputs, pkgs, lib, config, ...}:
let
cfg = config.nix-config.hypr;
in
{
options = {
nix-config.hypr.internal-screen.resolution = lib.mkOption { type = lib.types.str; };
nix-config.hypr.internal-screen.scale = lib.mkOption { type = lib.types.str; };
nix-config.hypr.browser = lib.mkOption {
type = lib.types.str;
default = "firefox";
description = "The browser to use in Hyprland.";
};
nix-config.hypr.ide = lib.mkOption {
type = lib.types.str;
default = "code";
description = "The IDE to use in Hyprland.";
};
};
config = {
wayland.windowManager.hyprland = lib.mkIf cfg.enable {
enable = true;
systemd.enable = true;
settings = {
# debug = {
# disable_logs = false;
# };
general = {
resize_on_border = true;
gaps_in = 3;
gaps_out = 3;
border_size = 1;
"col.active_border" = "rgb(98971A) rgb(CC241D) 45deg";
"col.inactive_border" = "rgba(595959aa)";
layout = "master";
};
input = {
kb_layout = "de";
# remap caps lock to ctrl
kb_options = "ctrl:nocaps";
numlock_by_default = true;
# mouse input should be unchanged
natural_scroll = false;
sensitivity = 0.3;
touchpad = {
disable_while_typing = false;
natural_scroll = true;
};
};
device = {
name = "syna329a:00-06cb:cd4f-touchpad";
sensitivity = 0.5;
};
decoration = {
rounding = 10;
inactive_opacity = 0.9;
dim_inactive = false;
dim_strength = 0.1;
shadow = {
enabled = false;
};
# blur = {
# enabled = true;
# size = 5;
# passes = 2;
# };
# blur is set on a per-program basis
windowrulev2 = [
# kitty should behave like a floating window
"animation popin, class:kitty"
"move cursor -50% -50%, class:kitty"
"float, class:kitty"
"size 50% 50%, class:kitty"
# blur the launcher background
# "blur 10, class:${config.nix-config.launcher.name}"
# some more floating windows
"float, class:org.gnome.Settings"
"float, class:desktopclient.owncloud.com"
"float, class:org.keepassxc.KeePassXC"
"float, title:^(Picture-in-Picture)$"
"float, class:org.gnome.Nautilus"
# when there is a single window, deactivate border and gaps
# "border_size 0, onworkspace:w[tv1], "
# File pickers and dialogs
"float, title:^(Save As)$"
"float, title:^(Open File)$"
"size 50% 50%, title:^(Open File)$"
"center, title:^(Open File)$"
# Disable idle when gaming
"idleinhibit always, class:^(steam_app_)"
"idleinhibit always, class:^(gamescope)$"
];
};
monitor = [
# the internal monitor, always at the "center"
"eDP-1, ${cfg.internal-screen.resolution}, 0x0, ${cfg.internal-screen.scale}"
# ultra wide monitor at home
"desc:Samsung Electric Company C34H89x H4ZN501178, 3440x1440@99.98, auto-up, 1"
# Samsung monitors at irchel (matching the description)
"desc:Samsung Electric Company LS27D80xU, 2560x1440@59.95, auto-up, 1"
", preferred, auto-up, auto" # automatically add any newly detected monitor
];
xwayland = {
enabled = true;
force_zero_scaling = true;
};
env = [
# force apps to use wayland
"NIXOS_OZONE_WL, 1"
"ELECTRON_OZONE_PLATFORM_HINT, wayland"
# set the scale factor for GDK apps
"GDK_SCALE, ${cfg.internal-screen.scale}"
# set the scale factor for QT apps
# "QT_SCALE_FACTOR, ${cfg.internal-screen.scale}"
"QT_SCALE_FACTOR, 1.1"
# set the scale factor for GTK apps
];
};
plugins = [
# Global overview
pkgs.hyprlandPlugins.hyprspace
# Touch gestures
# pkgs.hyprlandPlugins.hyprgrass
];
};
};
}

View File

@@ -1,21 +0,0 @@
{inputs, pkgs, lib, config, ...}:
let
cfg = config.nix-config.hypr;
in
{
config = {
wayland.windowManager.hyprland = {
settings = {
gesture = [
# 4 finger swipe to switch workspace
"4, horizontal, workspace"
"3, up, fullscreen"
"3, down, float"
"4, vertical, scale: 0.5, special, magic"
];
};
};
};
}

View File

@@ -1,135 +0,0 @@
# Note that some keybindings are delegated to other components, e.g. the quickshell module
{inputs, pkgs, lib, config, ...}:
let
cfg = config.nix-config.hypr;
in
{
config = {
wayland.windowManager.hyprland = {
settings = {
"$mod" = "SUPER";
# Global bindings
bind = [
# Launch applications
"$mod, space, exec, ${lib.getExe config.nix-config.launcher}"
"$mod, return, exec, kitty"
"$mod, b, exec, ${cfg.browser}"
"$mod, s, exec, ${cfg.ide}"
"$mod, e, exec, ${lib.getExe pkgs.nautilus}"
# Lock screen
"$mod, l, exec, loginctl lock-session"
# Close window
"$mod, Q, killactive,"
# Force close window
"$mod+Shift, Q, forcekillactive,"
# Toggle Floating and reduce size
"$mod, f, togglefloating,"
"$mod, f, resizeactive, 50% 50%,"
# "$mod, P, pseudo, " # dwindle
# "$mod, J, togglesplit, " # dwindle
# Toggle fullscreen
"$mod+Shift, f, fullscreen,"
# Alt-tab alternative
"$mod, Tab, cyclenext,"
"$mod, Tab, bringactivetotop,"
# Move the window
"$mod+Shift, left, movewindow, l"
"$mod+Shift, right, movewindow, r"
"$mod+Shift, up, movewindow, u"
"$mod+Shift, down, movewindow, d"
# Move window to workspace
"$mod+Ctrl, left, movetoworkspace, -1"
"$mod+Ctrl, right, movetoworkspace, +1"
# Switch workspace
"$mod, left, workspace, e-1"
"$mod, right, workspace, e+1"
"$mod, mouse_down, workspace, e-1"
"$mod, mouse_up, workspace, e+1"
# move to scratch workspace
"$mod+Ctrl, up, movetoworkspace, special:magic"
"$mod+Ctrl, down, movetoworkspace, prev"
# switch to scratch workspace
"$mod, up, togglespecialworkspace, magic"
"$mod, down, togglespecialworkspace, magic"
# Screenshot
"$mod, Print, exec, hyprshot -m region -o ~/Pictures/Screenshots"
"$mod+Shift, Print, exec, hyprshot -m window -o ~/Pictures/Screenshots"
# # somehow logitech calls this SUPER_L but we refer to it by its code
"SUPER_L&Shift_L, S, exec, hyprshot -m region -o ~/Pictures/Screenshots"
"Shift&SUPER_L&Shift_L, S, exec, hyprshot -m window -o ~/Pictures/Screenshots"
# when there is a dedicated screenshot button
", XF86Cut, exec, hyprshot -m region -o ~/Pictures/Screenshots"
"Shift, XF86Cut, exec, hyprshot -m window -o ~/Pictures/Screenshots"
# Other pickers using the same launcher
"$mod+Ctrl, space, exec, ${lib.getExe config.nix-config.filePicker}"
"$mod, period, exec, ${lib.getExe config.nix-config.emojiPicker}"
];
# repeatable bindings
binde = [
# Reshape the window in focus
"$mod, MINUS, resizeactive, -2% -2%"
"$mod, KP_Subtract, resizeactive, -2% -2%"
"$mod, PLUS, resizeactive, 2% 2%"
"$mod, KP_Add, resizeactive, 2% 2%"
];
# lock-screen bindings
bindl = [
", XF86PowerOff, exec, hyprctl dispatch dpms on eDP-1"
## depending on the setup we expect different behaviors when closing the lid:
# either sleep & lock screen OR switch to clamshell mode
# through the `services.logind.lidSwitch` and `services.logind.lidSwitchDocked` we can differentiate both cases
# when not docked, the system is put to sleep and the screen is implicitly locked as per the hypridle configuration
# when docked, the lid switch is ignored by logind and needs to be handled manually, see below:
# if an additional monitor is detected, simply deactivate the internal screen and continue working on the external monitor
", switch:on:Lid Switch, exec, hyprctl keyword monitor 'eDP-1,disable"
## on reopening the lid, turn the internal screen back on
", switch:off:Lid Switch, exec, hyprctl dispatch dpms on eDP-1"
# we need to reload the monitor configuration so that the internal screen is turned back on
", switch:off:Lid Switch, exec, hyprctl reload"
];
# bindr = [
# # Overview
# "$mod, , overview:toggle"
# ];
bindm = [
# move the window using left click
"$mod, mouse:272, movewindow"
# resize the window using right click
"$mod, mouse:273, resizewindow"
];
};
# extraConfig = ''
# bind= , XF86AudioMicMute, submap, player_submap
# submap=player_submap
# bind=, XF86AudioRaiseVolume, exec, notify-send previous; hyprctl dispatch submap reset
# bind=, XF86AudioLowerVolume, exec, notify-send next; hyprctl dispatch submap reset
# bind=, XF86AudioMicMute, exec, notify-send pause; hyprctl dispatch submap reset
# submap=reset
# '';
};
};
}

View File

@@ -1,57 +0,0 @@
{inputs, pkgs, lib, config, ...}:
let
cfg = config.nix-config.hypr;
in
{
config = {
wayland.windowManager.hyprland = {
settings = {
master = {
# no_gaps_when_only = true;
# default: single app is centered/fullscreen; when more apps are added it splits
orientation = "right";
# keep center-master behaviour when there is exactly 1 slave (i.e. single app appears fullscreen)
slave_count_for_center_master = 1;
# only split in two columns
mfact = 0.6;
inherit_fullscreen = false;
};
# #create special workspaces with no gaps
# workspace = [
# "w[t1], gapsout:0, gapsin:0"
# "w[tg1], gapsout:0, gapsin:0"
# "f[1], gapsout:0, gapsin:0"
# ];
# # automatically assign windows to workspaces when there is only one window
# windowrulev2 = [
# "bordersize 0, floating:0, onworkspace:w[t1]"
# "rounding 0, floating:0, onworkspace:w[t1]"
# "bordersize 0, floating:0, onworkspace:w[tg1]"
# "rounding 0, floating:0, onworkspace:w[tg1]"
# "bordersize 0, floating:0, onworkspace:f[1]"
# "rounding 0, floating:0, onworkspace:f[1]"
# ];
misc = {
vfr = false;
disable_hyprland_logo = true;
};
# Keybind to toggle between 2 and 3 column master layout
bind = [
# Toggle master layout between 2 and 3 columns (press $mod + m)
"$mod, m, exec, hyprctl dispatch layoutmsg orientationcenter"
"$mod, m, exec, hyprctl dispatch layoutmsg mfact exact 0.34"
# Toggle master layout between 3 and 2 columns (press $mod + Shift + m)
"$mod, Shift+m, exec, hyprctl dispatch layoutmsg orientationright"
"$mod, Shift+m, exec, hyprctl dispatch layoutmsg mfact exact 0.6"
];
};
};
};
}

View File

@@ -1,19 +0,0 @@
{inputs, pkgs, lib, config, ...}:
let
cfg = config.nix-config.hypr;
in
{
# packages required by the current hyprland setup
home.packages = [
pkgs.hyprshot
pkgs.nautilus
pkgs.gnome-control-center
pkgs.gnome-bluetooth # needed by gnome-control-center to manage bluetooth
pkgs.cliphist
pkgs.wl-clipboard
pkgs.gcr # Provides org.gnome.keyring.SystemPrompter
];
# Also use gnome keyring
services.gnome-keyring.enable = true;
}

View File

@@ -3,14 +3,10 @@
programs.hyprlock = {
enable = true;
settings = {
general = {
# immediately lock the screen
grace = 0;
# no_fade_in = false;
# disable_loading_bar = false;
grace = 5;
no_fade_in = false;
disable_loading_bar = false;
};
background = {

View File

@@ -0,0 +1,63 @@
{
pkgs,
lib,
...
}:
with lib; let
# # load the wallpapers from the wallpapers directory - this gives a set with the folder content
# dirContent = builtins.readDir ../../../wallpapers;
# wallpaperString = lib.strings.concatMapStrings (x: " " + x) wallpapers;
# # # load each wallpaper and keep its path (now in the nix store) as an array
# # wallpapers = map (x: builtins.readDir "${../../../wallpapers}/${x.value}") dirContent;
# # wallpaperString = lib.strings.concatMapStrings (x: " " + x) wallpapers;
# # script that picks a random wallpaper from the array and sets it as the desktop background
# monitor = ""; # leave empty to set the wallpaper on all monitors
# wallpaperRandomizer = pkgs.writeShellScriptBin "wallpaperRandomizer" ''
# wallpaper=$(shuf -n 1 -e ${wallpaperString})
# hyprctl hyprpaper unload all
# hyprctl hyprpaper preload $wallpaper
# hyprctl hyprpaper wallpaper "${monitor},$wallpaper"
# '';
in {
# home.packages = [wallpaperRandomizer];
services.hyprpaper = {
enable = true;
};
# settings = {
# ipc = "off";
# splash = false;
# };
# };
# systemd.user = {
# services.wallpaperRandomizer = {
# Install = {WantedBy = ["graphical-session.target"];};
# Unit = {
# Description = "Set random desktop background using hyprpaper";
# After = ["graphical-session-pre.target"];
# PartOf = ["graphical-session.target"];
# };
# Service = {
# Type = "oneshot";
# ExecStart = "${wallpaperRandomizer}/bin/wallpaperRandomizer";
# IOSchedulingClass = "idle";
# };
# };
# timers.wallpaperRandomizer = {
# Unit = {Description = "Set random desktop background using hyprpaper on an interval";};
# Timer = {OnUnitActiveSec = "6h";};
# Install = {WantedBy = ["timers.target"];};
# };
# };
}

View File

@@ -0,0 +1,211 @@
{inputs, pkgs, ...}:
{
# required to autoload fonts from packages installed via Home Manager
fonts.fontconfig.enable = true;
# waybar requires font-awesome
home.packages = [
pkgs.pavucontrol
];
# enable waybar
programs.waybar.enable = true;
programs.waybar = {
settings = {
mainBar = {
margin-top = 2;
margin-bottom = 2;
margin-left = 5;
margin-right = 5;
layer = "top";
position = "top";
spacing = 5;
modules-left = [
"hyprland/workspaces"
"hyprland/window"
];
modules-center = [
"clock"
"custom/notification"
];
modules-right = [
"tray"
# "temperature"
# "group/expand"
# "bluetooth"
"wireplumber"
"network"
# "mpd"
"battery"
"backlight"
"idle_inhibitor"
];
# module specific settings
"hyprland/workspaces" = {
format = "{icon}";
format-icons = {
active = "";
default = "";
};
};
"hyprland/window"= {
"icon" = false;
"separate-outputs" = true;
"format" = "{}";
};
"clock" = {
format = "{:%H:%M}";
interval = 1;
tooltip-format = "<tt>{calendar}</tt>";
calendar = {
"format" = {
"today" = "<span color='#fAfBfC'><b>{}</b></span>";
};
};
};
"idle_inhibitor" = {
format = "{icon}";
format-icons = {
activated = "";
deactivated = "";
};
tooltip = "true";
};
"bluetooth" = {
format-on = "󰂯";
format-off = "BT-off";
format-disabled = "󰂲";
format-connected-battery = "{device_battery_percentage}% 󰂯";
format-alt = "{device_alias} 󰂯";
tooltip-format = "{controller_alias}\t{controller_address}\n\n{num_connections} connected";
tooltip-format-connected = "{controller_alias}\t{controller_address}\n\n{num_connections} connected\n\n{device_enumerate}";
tooltip-format-enumerate-connected = "{device_alias}\n{device_address}";
tooltip-format-enumerate-connected-battery = "{device_alias}\n{device_address}\n{device_battery_percentage}%";
on-click-right = "blueman-manager";
};
"battery" = {
interval = 60;
states = {
good = 80;
warning = 30;
critical = 10;
};
format = "{capacity}% {icon}";
format-charging = "{capacity}% 󰂄";
format-plugged = "{capacity}% 󰂄 ";
format-icons = [ "󰁻" "󰁼" "󰁾" "󰂀" "󰂂" "󰁹" ];
};
"backlight" = {
"format" = "{percent}% {icon}";
"format-icons" = ["" "" "" "" "" "" "" "" ""];
};
"wireplumber" = {
scroll-step = 10;
format = "{icon} {volume}%";# {format_source}";
format-bluetooth = "{volume}% {icon}";# {format_source}";
format-bluetooth-muted = " {icon}";# {format_source}";
format-muted = " Muted";# {format_source}";
# format-source = " {volume}%";
# format-source-muted = "";
format-icons = {
headphone = "";
hands-free = "";
headset = "";
phone = "";
portable = "";
default = [
""
""
""
];
};
on-click = "XDG_CURRENT_DESKTOP=GNOME gnome-control-center sound";
};
"tray" = {
spacing = 5;
};
"custom/notification" = {
tooltip = false;
format = "{icon} {}";
format-icons = {
notification = "<span foreground='red'><sup></sup></span>";
none = "";
dnd-notification = "<span foreground='red'><sup></sup></span>";
dnd-none = "";
inhibited-notification = "<span foreground='red'><sup></sup></span>";
inhibited-none = "";
dnd-inhibited-notification = "<span foreground='red'><sup></sup></span>";
dnd-inhibited-none = "";
};
return-type = "json";
exec-if = "which swaync-client";
exec = "swaync-client -swb";
on-click = "sleep 0.1 && task-waybar";
escape = true;
};
"network" = {
format = "󰤭";
format-wifi = "{icon} {essid}";
format-icons = [ "󰤯" "󰤟" "󰤢" "󰤥" "󰤨" ];
format-ethernet = "󰊗 {ipaddr}/{cidr}";
format-disconnected = "";
tooltip-format = "󰊗 {ifname} via {gwaddr}";
tooltip-format-wifi = "SSID: {essid}({signalStrength}%), {frequency} MHz\nInterface: {ifname}\nIP: {ipaddr}\nGW: {gwaddr}\n\n<span color='#a6da95'>{bandwidthUpBits}</span>\t<span color='#ee99a0'>{bandwidthDownBits}</span>\t<span color='#c6a0f6'>󰹹{bandwidthTotalBits}</span>";
tooltip-format-ethernet = "{ifname} ";
tooltip-format-disconnected = "Disconnected";
on-click = "XDG_CURRENT_DESKTOP=GNOME gnome-control-center wifi";
};
};
};
style = ''
* {
font-family: "FiraCode Nerd Font";
font-weight: bold;
font-size: 22px;
}
window#waybar {
background-color: transparent;
}
.module {
background: rgba(0, 0, 0, 0.6);
color: white;
border-radius: 5px;
padding: 5px 5px 5px 5px;
margin: 5px 0;
}
box.module button:hover {
box-shadow: inset 0 -3px #ffffff;
}
.modules-left {
padding: 3px;
}
.modules-right {
padding: 3px;
}
.modules-center {
padding: 3px;
}
#battery.warning {
background:rgba(240, 165, 0, 0.6);
}
#battery.critical {
background:rgba(255, 0, 0, 0.6);
}
'';
};
}

View File

@@ -1,54 +1,22 @@
{pkgs, lib, config, ...}:
let
cfg = config.nix-config.style;
in
{pkgs, lib, ...}:
{
programs.kitty = {
enable = true;
shellIntegration.enableFishIntegration = true;
settings = {
# # import the colors from the stylix theme, but keep the background black
# color0 = stylix.stylix.base16Scheme.base00;
# color8 = stylix.stylix.base16Scheme.base08;
# color1 = stylix.stylix.base16Scheme.base01;
# color9 = stylix.stylix.base16Scheme.base09;
# color2 = stylix.stylix.base16Scheme.base02;
# color10 = stylix.stylix.base16Scheme.base0A;
# color3 = stylix.stylix.base16Scheme.base03;
# color11 = stylix.stylix.base16Scheme.base0B;
# color4 = stylix.stylix.base16Scheme.base04;
# color12 = stylix.stylix.base16Scheme.base0C;
# color5 = stylix.stylix.base16Scheme.base05;
# color13 = stylix.stylix.base16Scheme.base0D;
# color6 = stylix.stylix.base16Scheme.base06;
# color14 = stylix.stylix.base16Scheme.base0E;
# color7 = stylix.stylix.base16Scheme.base07;
# color15 = stylix.stylix.base16Scheme.base0F;
# also reuse the background opacity by stylix
background_opacity = cfg.terminalOpacity;
# color0 = stylix.colors.background;
# color1 = stylix.colors.red;
# color2 = stylix.colors.green;
# color3 = stylix.colors.yellow;
background = "#000000";
font_family = cfg.monospaceFont;
font_size = cfg.fontSizes.terminal;
confirm_os_window_close = 0;
enable_audio_bell = false;
cursor_trail = 3;
cursor_trail_decay = "0.1 0.4";
url_style = "curly";
notify_on_cmd_finish = "unfocused";
window_padding_width = 5;
};
keybindings = {

View File

@@ -1,25 +1,8 @@
{pkgs, ...}:
{pkgs, ...}:
{
home.packages = [
pkgs.kubie
pkgs.kubectl
];
# Add the shell alias
programs.fish.shellAliases = {
k = "kubectl";
};
# set the kubectl autocompletions for fish
# the fish functions are generated by kubectl itself, we do this at compile time and write them a single time to avoid generating them at each shell start
# the command is kubectl completion fish
# which becomes
programs.fish.completions."kubectl" = builtins.readFile "${pkgs.runCommand "kubectl-completion" {} ''
${pkgs.kubectl}/bin/kubectl completion fish > $out
''}";
programs.kubeswitch = {
enable = true;
enableFishIntegration = true;
};
}

View File

@@ -1,123 +0,0 @@
{ config, pkgs, lib, ... }:
let
cfg = config.nix-config.style;
powerMenu = pkgs.writeShellScriptBin "power-menu" ''
options=" Power Off\n Reboot\n Lock\n Suspend"
selected=$(echo -e "$options" | fuzzel --dmenu --prompt "Power Menu" --lines 4 --width 20)
case "$selected" in
" Power Off") systemctl poweroff ;;
" Reboot") systemctl reboot ;;
" Lock") hyprlock ;;
" Suspend") systemctl suspend ;;
*) exit 1 ;;
esac
'';
filePicker = pkgs.writeShellScriptBin "file-picker" ''
files=$(${lib.getExe pkgs.fd} . $HOME --type f)
filesShortened=$(echo "$files" | sed "s|$HOME|~|g" | awk -F/ '{print $(NF)" ("$0")"}')
selected=$(echo "$filesShortened" | fuzzel --dmenu --prompt "🔎 " --placeholder "File search" --index)
if [ -n "$selected" ]; then
# Since fuzzel was launched with the --index option the actual path is now files[selected]
selectedPlusOne=$((selected + 1))
file=$(echo "$files" | sed -n "''${selectedPlusOne}p")
xdg-open "$file"
# plus one
else
echo "No file selected"
exit 1
fi
'';
emojiPicker = pkgs.writeShellScriptBin "emoji-picker" ''
curl -s https://raw.githubusercontent.com/littleboycoding/emoji-dmenu/refs/heads/master/emoji.txt | fuzzel --dmenu | cut -d ' ' -f 1 | wl-copy
'';
in
{
options.nix-config = {
powerMenu = lib.mkOption {
description = "Package to use as a power menu";
type = lib.types.package;
default = powerMenu;
};
launcher = lib.mkOption {
description = "Configuration for the launcher";
type = lib.types.package;
default = pkgs.fuzzel;
};
filePicker = lib.mkOption {
description = "Package to use as a file picker";
type = lib.types.package;
default = filePicker;
};
emojiPicker = lib.mkOption {
description = "Package to use as a emoji picker";
type = lib.types.package;
default = emojiPicker;
};
};
config = {
programs.fuzzel = {
enable = true;
settings = {
main = {
font = "monospace:size=${builtins.toString (cfg.fontSizes.applications - 1)}";
terminal = "${lib.getExe pkgs.kitty}";
layer = "overlay"; #or top?
use-bold = true;
dpi-aware = true;
icons-enabled = true;
match-mode = "fzf";
horizontal-pad = cfg.fontSizes.applications + 5;
vertical-pad = cfg.fontSizes.applications + 5;
inner-pad = cfg.fontSizes.applications;
show-actions = true;
lines = 12;
width = 50;
};
colors = {
background = "000000aa";
text = "ffffffaa";
# prompt
# placeholder
# input
match = "ffffffaa";
selection = "00000000";
selection-text = "ffffffbb";
selection-match = "ffffffaa";
};
border = {
width = 0;
radius = 15;
};
};
};
home.packages = with pkgs; [
powerMenu
filePicker
emojiPicker
];
};
}

View File

@@ -1,21 +0,0 @@
{pkgs, ...}:
{
# on macos we don't set the default shell to fish
# instead we just tell the terminal to run fish as the first command
# this means that the first thing fish should do is to clear the screen
programs.fish = {
interactiveShellInit = "clear";
};
# stylix will be tricky as well, so we just install the fonts manually
fonts.fontconfig.enable = true;
home.packages = with pkgs; [
nerd-fonts.fira-code
noto-fonts-color-emoji
] ++ [ # some more packages that are not available as flatpaks
pkgs.spotify
];
}

View File

@@ -1,10 +0,0 @@
{
config,
pkgs,
...
}:
{
programs.nh = {
enable = true;
};
}

View File

@@ -1,6 +1,7 @@
{pkgs, ...}:
{pkgs, ...}:
{
home.packages = [
pkgs.obsidian
];
}

View File

@@ -1,59 +0,0 @@
{
lib,
pkgs,
...
}:
{
programs.dankMaterialShell.enable = true;
programs.dankMaterialShell = {
enableSystemd = true;
enableSystemMonitoring = false;
enableClipboard = true;
enableVPN = true;
enableBrightnessControl = true;
enableColorPicker = false;
enableDynamicTheming = true;
enableAudioWavelength = false;
enableCalendarEvents = false;
enableSystemSound = true;
# default = {
# settings = ''{}'';
# session = ''{}'';
# };
# plugins = {};
};
wayland.windowManager.hyprland = {
settings = {
binde = [
# Brightness
", XF86MonBrightnessDown, exec, dms ipc call brightness decrement 5 \"\""
", XF86MonBrightnessUp, exec, dms ipc call brightness increment 5 \"\""
# Audio volume + playback
", XF86AudioMute, exec, dms ipc call audio mute"
", XF86AudioLowerVolume, exec, dms ipc call audio decrement 5"
", XF86AudioRaiseVolume, exec, dms ipc call audio increment 5"
"$mod, XF86AudioMute, exec, dms ipc call mpris playPause"
"$mod, XF86AudioLowerVolume, exec, dms ipc call mpris previous"
"$mod, XF86AudioRaiseVolume, exec, dms ipc call mpris next"
# also allow the dedicated media keys to control playback
", XF86AudioPlay, exec, dms ipc call mpris playPause"
", XF86AudioPrev, exec, dms ipc call mpris previous"
", XF86AudioNext, exec, dms ipc call mpris next"
];
bind = [
", XF86PowerOff, exec, dms ipc call powermenu toggle"
# used to be ", XF86PowerOff, exec, ${lib.getExe config.nix-config.powerMenu}"
"$mod, V, exec, dms ipc call clipboard toggle"
# used to be "$mod, V, exec, cliphist list | ${lib.getExe config.nix-config.launcher} --dmenu | cliphist decode | wl-copy"
];
};
};
}

View File

@@ -1,23 +0,0 @@
{ lib, config, ... }:
{
programs.ssh.enable = true;
programs.ssh.matchBlocks = {
"*" = {
identityFile = "${config.home.homeDirectory}/.ssh/main_key";
};
ela = lib.hm.dag.entryBefore ["eiger"] {
hostname = "ela.cscs.ch";
user = "rmoll";
identityFile = "${config.home.homeDirectory}/.ssh/cscs-key";
identitiesOnly = true;
};
eiger = {
hostname = "eiger.cscs.ch";
user = "rmoll";
identityFile = "${config.home.homeDirectory}/.ssh/cscs-key";
identitiesOnly = true;
proxyJump = "ela";
};
};
}

View File

@@ -1,182 +1,95 @@
{pkgs, config, lib, ...}:
let
cfg = config.nix-config.style;
in
{pkgs, ...}:
{
options.nix-config.style = {
stylix = {
# Stylix is already enabled since the system is configured to use it
# enable = true;
# don't theme applications by default
autoEnable = false;
cursor = {
size = lib.mkOption {
type = lib.types.int;
default = 22;
description = "Size of the cursor in pixels.";
};
package = pkgs.apple-cursor;
name = "macOS";
size = 32;
};
fontSizes = {
applications = lib.mkOption {
type = lib.types.int;
default = 12;
description = "Font size for applications.";
iconTheme = {
enable = true;
package = pkgs.tela-icon-theme;
};
image = ./../../wallpapers/magicpattern-87PP9Zd7MNo-unsplash.jpg;
fonts = {
serif = {
package = pkgs.dejavu_fonts;
name = "DejaVu Serif";
};
desktop = lib.mkOption {
type = lib.types.int;
default = 12;
description = "Font size for desktop icons.";
sansSerif = {
package = pkgs.dejavu_fonts;
name = "DejaVu Sans";
};
popups = lib.mkOption {
type = lib.types.int;
default = 12;
description = "Font size for popups.";
monospace = {
package = pkgs.nerdfonts.override { fonts = [ "FiraCode" ]; };
name = "FiraCode Nerd Font Mono";
};
terminal = lib.mkOption {
type = lib.types.int;
default = 12;
description = "Font size for terminal.";
emoji = {
package = pkgs.noto-fonts-emoji;
name = "Noto Color Emoji";
};
sizes = {
applications = 14;
desktop = 14;
popups = 12;
terminal = 14;
};
};
terminalOpacity = lib.mkOption {
type = lib.types.float;
default = 0.8;
description = "Terminal default opacity";
};
monospaceFont = lib.mkOption {
type = lib.types.str;
default = "FiraCode Nerd Font Mono";
description = "Monospace font. Needs to be installed.";
opacity = {
applications = 1.0;
desktop = 1.0;
popups = 0.9;
terminal = 0.8;
};
};
stylix.base16Scheme = {
scheme = "onelight";
author = "https://github.com/one-dark";
base00 = "#fafafa";
base01 = "#f4f4f4";
base02 = "#e5e5e6";
base03 = "#dfdfe0";
base04 = "#d7d7d8";
base05 = "#383a42";
base06 = "#202227";
base07 = "#090a0b";
base08 = "#d84a3d";
base09 = "#a626a4";
base0A = "#c18401";
base0B = "#50a14f";
base0C = "#0070a8";
base0D = "#4078f2";
base0E = "#a626a4";
base0F = "#986801";
config = {
};
stylix = {
# Stylix is already enabled since the system is configured to use it
enable = true;
image = ./../../wallpapers/magicpattern-87PP9Zd7MNo-unsplash.jpg;
# don't theme applications by default
autoEnable = false;
stylix.targets = {
vscode.enable = true;
hyprpaper.enable = true;
hyprlock.enable = true;
wofi.enable = true;
cursor = {
package = pkgs.bibata-cursors;
name = "Bibata-Modern-Ice";
size = cfg.cursor.size;
};
# disabled because they overwrite too many settings
# waybar.enable = true;
# kitty.enable = true;
iconTheme = {
enable = true;
package = pkgs.tela-icon-theme;
};
polarity = lib.mkDefault "dark";
fonts = {
serif = {
package = pkgs.dejavu_fonts;
name = "DejaVu Serif";
};
sansSerif = {
package = pkgs.dejavu_fonts;
name = "DejaVu Sans";
};
monospace = {
package = pkgs.nerd-fonts.fira-code;
name = cfg.monospaceFont;
};
emoji = {
package = pkgs.noto-fonts-color-emoji;
name = "Noto Color Emoji";
};
sizes = {
applications = cfg.fontSizes.applications;
desktop = cfg.fontSizes.desktop;
popups = cfg.fontSizes.popups;
terminal = cfg.fontSizes.terminal;
};
};
opacity = {
applications = 1.0;
desktop = 1.0;
popups = 0.9;
terminal = cfg.terminalOpacity;
};
base16Scheme = {
scheme = "onelight";
author = "https://github.com/one-dark";
base00 = "#fafafa";
base01 = "#f4f4f4";
base02 = "#e5e5e6";
base03 = "#dfdfe0";
base04 = "#d7d7d8";
base05 = "#383a42";
base06 = "#202227";
base07 = "#090a0b";
base08 = "#d84a3d";
base09 = "#a626a4";
base0A = "#c18401";
base0B = "#50a14f";
base0C = "#0070a8";
base0D = "#4078f2";
base0E = "#a626a4";
base0F = "#986801";
};
targets = {
hyprpaper.enable = true;
hyprlock.enable = true;
# disabled because they overwrite too many settings
# gnome
# wofi
# vscode
# waybar
# kitty
fontconfig.enable = true;
font-packages.enable = true;
};
};
# https://pltanton.dev/posts/2024/02/nix-based-dark-light-theme-switch/
home.packages = [
(lib.lowPrio (pkgs.writeShellApplication {
name = "toggle-theme";
runtimeInputs = with pkgs; [ home-manager coreutils ripgrep ];
text =
''
"$(home-manager generations | head -1 | rg -o '/[^ ]*')"/specialisation/light-theme/activate
echo "Switched to light theme"
'';
}))
];
specialisation.light-theme.configuration = {
stylix = {
polarity = "light";
};
home.packages = [
(lib.hiPrio (pkgs.writeShellApplication {
name = "toggle-theme";
runtimeInputs = with pkgs; [ home-manager coreutils ripgrep ];
text =
''
"$(home-manager generations | head -2 | tail -1 | rg -o '/[^ ]*')"/activate
echo "Switched to dark theme"
'';
}))
];
};
};
}

View File

@@ -1,9 +0,0 @@
{
lib, pkgs, ...
}:
{
# requires avahi or similar
home.packages = with pkgs; [ uxplay ];
}

View File

@@ -1,11 +0,0 @@
# Write an importable nix file that copies a folder from this repo into the store and creates a symlink to a predictible directory in my home file
{
lib, pkgs, ...
}:
{
# Copy the entire wallpapers directory into the Nix store and symlink it to ~/wallpapers
home.file."wallpapers" = {
source = ../../wallpapers;
target = "Pictures/wallpapers";
};
}

View File

@@ -1,139 +1,105 @@
{ config, pkgs, lib, ... }:
let
cfg = config.nix-config.style;
accent = "#ffffff";
background = "#000000";
background-alt = "#000000";
foreground = "##ffffff";
rounding = 5;
font-size = 25;
in {
wofiPowerMenu = pkgs.writeShellScriptBin "wofi-power-menu" ''
#!/usr/bin/env bash
home.packages = with pkgs; [ wofi-emoji ];
options=" Power Off\n Reboot\n Lock\n Suspend"
selected=$(echo -e "$options" | wofi --dmenu --prompt "Power Menu")
# --width 300 --height 250
programs.wofi = {
enable = true;
case "$selected" in
" Power Off") systemctl poweroff ;;
" Reboot") systemctl reboot ;;
" Lock") hyprlock ;;
" Suspend") systemctl suspend ;;
*) exit 1 ;;
esac
'';
wofiFilePicker = pkgs.writeShellScriptBin "wofi-file-picker" ''
#!/usr/bin/env bash
initial=$(find $HOME -maxdepth 2 -type f)
selected=$(printf "%s\n" $initial | wofi --dmenu --prompt "Select a file")
if [ -n "$selected" ]; then
xdg-open "$selected"
else
echo "No file selected"
exit 1
fi
'';
in
{
options.nix-config = {
powerMenu = lib.mkOption {
description = "Package to use as a power menu";
type = lib.types.package;
default = wofiPowerMenu;
settings = {
allow_markup = true;
width = 450;
show = "drun";
prompt = "Apps";
normal_window = true;
layer = "top";
term = "foot";
height = "305px";
orientation = "vertical";
halign = "fill";
line_wrap = "off";
dynamic_lines = false;
allow_images = true;
image_size = 24;
exec_search = false;
hide_search = false;
parse_search = false;
insensitive = true;
hide_scroll = true;
no_actions = true;
sort_order = "default";
gtk_dark = true;
filter_rate = 100;
key_expand = "Tab";
key_exit = "Escape";
};
};
config = {
programs.wofi = {
enable = true;
settings = {
# global layout
width = "50%";
height = "50%";
orientation = "vertical";
hide_scroll = true;
line_wrap = "off";
dynamic_lines = true;
# search behaviour
matching = "fuzzy";
single_click = true;
show = "drun";
prompt = "Launch...";
# normal_window = true;
layer = "top";
term = "foot";
halign = "fill";
# Rich rendering
allow_markup = true;
allow_images = true;
image_size = 24;
exec_search = false;
hide_search = false;
parse_search = false;
insensitive = true;
no_actions = true;
filter_rate = 100;
key_expand = "Tab";
key_exit = "Escape";
};
style = ''
style = ''
* {
font-family: ${cfg.monospaceFont};
font-size: ${builtins.toString (cfg.fontSizes.desktop + 8)}px;
color: white;
background: transparent;
font-family: "${font}";
font-weight: 500;
font-size: ${toString font-size}px;
}
#window {
background: rgba(1, 1, 1, 0.5);
margin: auto;
padding: 10px;
}
#input {
padding: 10px;
margin-bottom: 10px;
border-radius: 15px;
background-color: ${background};
color: ${foreground};
border-radius: ${toString rounding}px;
}
#outer-box {
padding: 20px;
}
#input {
background-color: ${background-alt};
border: 0px solid ${accent};
color: ${foreground};
padding: 8px 12px;
}
#scroll {
margin-top: 20px;
}
#inner-box {}
#img {
margin-right: 6px;
}
#entry {
padding: 10px;
border-radius: 15px;
}
#entry:selected {
background-color: #2e3440;
outline: none;
border: none;
padding-right: 8px;
}
#text {
margin: 2px;
color: ${foreground};
}
#text:selected {
color: ${foreground};
}
#entry {
padding: 6px;
}
#entry:selected {
background-color: ${accent};
color: ${foreground};
}
#unselected {}
#selected {}
#input,
#entry:selected {
border-radius: ${toString rounding}px;
}
'';
};
home.packages = with pkgs; [
wofiPowerMenu
wofi-emoji
];
};
}

View File

@@ -1,11 +0,0 @@
{pkgs, ...}:
{
# Add aliases for the various environments in aws so that their contexts can be easily switched
programs.fish.shellAliases = {
cdev = "aws-vault exec dev --";
cstage = "aws-vault exec stage --";
cprod = "aws-vault exec prod --";
clogs = "aws-vault exec logs --";
cshared = "aws-vault exec shared --";
};
}

View File

@@ -1,7 +0,0 @@
{pkgs, ...}:
{
home.packages = [
pkgs.gnupg
pkgs.sops
];
}

View File

@@ -1,19 +0,0 @@
{
config,
lib,
...
}:
let
cfg = config.nix-config.hypr;
in
{
options = {
};
imports = [
./aliases.nix
./cryptography.nix
./git.nix
./kluster.nix
];
}

View File

@@ -1,14 +0,0 @@
{
config,
lib,
...
}:
{
programs.git = {
enable = true;
settings = {
user.name = "Remy Moll";
user.email = "remy.moll@artidis.com";
};
};
}

View File

@@ -1,14 +0,0 @@
{pkgs, ...}:
{
home.packages = [
pkgs.kubernetes-helm
pkgs.awscli2
pkgs.aws-vault
pkgs.k9s
# some parsers
pkgs.ripgrep
pkgs.jq
pkgs.yq
];
}

View File

@@ -1,32 +1,23 @@
{inputs, pkgs, ...}:
{inputs, pkgs, ...}:
{
xdg.enable = true;
xdg.portal = {
enable = true;
xdgOpenUsePortal = true;
# configPackages = [ pkgs.hyprland ];
config = {
common.default = ["gtk"];
hyprland.default = ["gtk" "hyprland"];
};
configPackages = [ pkgs.hyprland ];
extraPortals = [
pkgs.xdg-desktop-portal-gtk
pkgs.xdg-desktop-portal-wlr
pkgs.xdg-desktop-portal-hyprland
pkgs.xdg-desktop-portal-gtk
];
};
xdg.mimeApps.defaultApplications = {
"text/*" = [ "code" ];
"application/x-yaml" = [ "code" ];
"application/pdf" = [ "papers" ];
"image/*" = [ "loupe" ];
"video/*" = [ "showtime" ];
xdg.userDirs = {
enable = true;
createDirectories = true;
desktop = "Desktop";
documents = "Documents";
# downloads = "Downloads";
pictures = "Pictures";
};
}

View File

@@ -1,79 +0,0 @@
{ config, pkgs, lib, ... }:
{
# Enable yabai service
# Caution: at the very least yabai requires Accessibility permissions to be granted
# https://github.com/koekeishiya/yabai/issues/2688
services.yabai = {
enable = true;
config = {
layout = "bsp";
focus_follows_mouse = "autoraise";
window_placement = "second_child";
window_topmost = "on";
window_shadow = "float";
# by default, set balanced split ratio and auto balance => three windows will be evenly spaced on an ultrawide monitor
split_ratio = "0.50";
auto_balance = "on";
mouse_modifier = "alt";
mouse_action1 = "move";#
mouse_action2 = "resize";
window_opacity = "on";
normal_window_opacity = 0.9;
top_padding = 0;
bottom_padding = 0;
left_padding = 0;
right_padding = 0;
window_gap = 10;
};
extraConfig = ''
# Example: rules for floating windows
yabai -m rule --add app="System Preferences" manage=off
'';
};
# # Enable skhd service
# services.skhd = {
# enable = true;
# package = pkgs.skhd;
# skhdConfig = ''
# # Focus windows with Command + Arrow keys
# cmd - left : yabai -m window --focus west
# cmd - right : yabai -m window --focus east
# cmd - up : yabai -m window --focus north
# cmd - down : yabai -m window --focus south
# # Swap windows with Command + Shift + Arrow keys
# cmd + shift - left : yabai -m window --swap west
# cmd + shift - right : yabai -m window --swap east
# cmd + shift - up : yabai -m window --swap north
# cmd + shift - down : yabai -m window --swap south
# # Move windows with Command + Control + Arrow keys
# cmd + ctrl - left : yabai -m window --warp west
# cmd + ctrl - right : yabai -m window --warp east
# cmd + ctrl - up : yabai -m window --warp north
# cmd + ctrl - down : yabai -m window --warp south
# # Resize windows with Command + Option + Arrow keys
# cmd + alt - left : yabai -m window --resize left:-50:0
# cmd + alt - right : yabai -m window --resize right:50:0
# cmd + alt - up : yabai -m window --resize top:0:-50
# cmd + alt - down : yabai -m window --resize bottom:0:50
# # Toggle window float with Command + F
# cmd - f : yabai -m window --toggle float
# # Toggle window fullscreen with Command + Enter
# cmd - return : yabai -m window --toggle zoom-fullscreen
# '';
# };
}

View File

@@ -1,7 +0,0 @@
{ config, pkgs, lib, inputs, ... }:
{
# agenix client
environment.systemPackages = [
inputs.agenix.packages."${system}".default
];
}

View File

@@ -1,88 +0,0 @@
{pkgs, lib, ...}:
let
snapshotsDir = "/snapshots/home";
in
{
environment.systemPackages = with pkgs; [
restic
btrbk
libnotify
];
# btrbk systemd service and timer for daily home snapshots
systemd.services.btrbk-home-snapshot = {
description = "Create daily btrbk snapshot of the home subvolume";
serviceConfig = {
Type = "oneshot";
User = "remy";
ExecStartPre = "${lib.getExe pkgs.libnotify} \"Backup\" \"Creating BTRBK snapshot of /home.\"";
# run the btrbk command as superuser
ExecStart = "+${lib.getExe pkgs.btrbk} -c /etc/btrbk/home.conf run";
Environment = "DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus"; # ensure the notification is sent to the correct display
ExecStartPost = "${lib.getExe pkgs.libnotify} \"Backup\" \"Snapshot of /home created successfully.\"";
};
};
systemd.timers.btrbk-home-snapshot = {
enable = true;
description = "Daily timer for btrbk home snapshot";
wantedBy = [ "timers.target" ];
timerConfig = {
OnCalendar = "*-*-* 12:00";
Persistent = true; # ensures missed runs are triggered after resume
};
};
# ensure the target directory exists
systemd.tmpfiles.settings = {
"btrbk snapshots" = {
"${snapshotsDir}" = {
d = {
group = "root";
user = "root";
mode = "0770";
};
};
};
};
# btrbk config for home snapshots
environment.etc."btrbk/home.conf".text = ''
timestamp_format long
# keep snapshots for 2 days independently of the call
snapshot_preserve_min 2d
# retain daily snapshots for 14 days
snapshot_preserve 14d
subvolume /home
snapshot_dir ${snapshotsDir}
'';
# Now create a restic backup off the newest btrbk snapshot
systemd.services.restic-backup-latest-snapshot = {
description = "Backup home subvolume using restic";
serviceConfig = {
Type = "oneshot";
ExecStart = "${lib.getExe pkgs.restic} -r /home/snapshots/restic-backup backup /home/snapshots/home-$(date +%Y-%m-%d_%H-%M-%S)";
# send a notification when the service is done
ExecStartPost = "su remy -c 'notify-send \"Restic Backup\" \"Home backup created successfully.\"'";
};
};
# # the udev rule:
# services.udev.extraRules = ''
# ACTION=="add", SUBSYSTEM=="block", ENV{ID_FS_LABEL}=="backup-restic", TAG+="systemd", ENV{SYSTEMD_WANTS}="backup-restic.service"
# '';
# # the systemd service:
# systemd.services.backup-restic = {
# description = "Backup using restic (triggered when USB drive is plugged in)";
# after = [ "local-fs.target" ];
# wantedBy = [ "multi-user.target" ];
# serviceConfig = {
# Type = "oneshot";
# # TODO: adapt command
# ExecStart = "${lib.getExe pkgs.restic} backup /home/username";
# };
# };
}

View File

@@ -1,31 +1,18 @@
{
config,
lib,
pkgs,
...
}:
{
environment.systemPackages = [
pkgs.bluez
# bluez-qt
# gnome.gnome-control-center
pkgs.gnome-bluetooth
];
services.dbus.packages = with pkgs; [
gnome-bluetooth
bluez
];
users.users.remy.extraGroups = [
"networkmanager"
];
hardware.bluetooth = {
enable = true;
powerOnBoot = false;
settings = {
General = {
Name = "Hello";
ControllerMode = "dual";
FastConnectable = "true";
Experimental = "true";
};
Policy = {
AutoEnable = "true";
};
};
};
}
services.blueman.enable = true;
}

View File

@@ -1,9 +0,0 @@
{
config,
lib,
pkgs,
...
}:
{
services.flatpak.enable = true;
}

View File

@@ -1,31 +0,0 @@
{
config,
lib,
pkgs,
...
}:
{
options.nix-config.gnome.enable = lib.mkOption {
type = lib.types.bool;
default = false;
description = "Enable GNOME desktop environment.";
};
config = lib.mkIf config.nix-config.gnome.enable {
services = {
displayManager.gdm.enable = true;
desktopManager.gnome.enable = true;
gnome = {
core-apps.enable = false;
core-developer-tools.enable = false;
games.enable = false;
};
# Exclude some packages to keep the installation lean
environment.gnome.excludePackages = with pkgs; [
gnome-tour
gnome-user-docs
];
};
};
}

View File

@@ -4,45 +4,22 @@
pkgs,
...
}:
let
cfg = config.nix-config;
in
{
config = {
# Use hyprland as the main desktop environment but use gdm as desktop manager
programs.hyprland = {
enable = true;
xwayland.enable = true;
};
services.displayManager = {
defaultSession = "hyprland";
};
services.displayManager.gdm = {
enable = true;
wayland = true;
};
services.gvfs.enable = true;
security.pam.services.hyprlock = {};
security.pam.services.gdm.enableGnomeKeyring = true;
# Enable RTKit for real-time audio processing, ...
# improving audio performance and reducing dropouts.
security.rtkit.enable = true;
# Enable D-Bus for inter-process communication
services.dbus.enable = true;
programs.dconf.enable = true;
# Use hyprland as the main desktop environment but use gdm as desktop manager
programs.hyprland = {
enable = true;
xwayland.enable = false;
};
services.displayManager = {
defaultSession = "hyprland";
};
services.xserver.displayManager.gdm = {
enable = true;
wayland = true;
};
security.pam.services.hyprlock = {};
}

View File

@@ -1,11 +0,0 @@
{ config, pkgs, ... }:
{
# Configure console keymap
console.keyMap = "de";
i18n.defaultLocale = "en_US.UTF-8";
# i18n.supportedLocales = [ "en_US.UTF-8" "de_DE.UTF-8" ];
time.timeZone = "Europe/Berlin";
}

View File

@@ -1,4 +0,0 @@
{config, ...}:
{
programs.nix-ld.enable = true;
}

View File

@@ -1,94 +1,7 @@
{
lib,
config,
...
}:
let
cfg = config.nix-config.networking;
in
{
options = {
nix-config.networking.hostName = lib.mkOption {
type = lib.types.str;
default = "nixos";
};
nix-config.networking.vpn = lib.mkOption {
type = lib.types.bool;
default = true;
};
};
config = {
networking.hostName = cfg.hostName;
networking.networkmanager.enable = true;
networking.networkmanager.wifi.powersave = lib.mkDefault true;
users.users.${config.nix-config.userName}.extraGroups = [
"networkmanager"
];
services.avahi.enable = true;
services.avahi.openFirewall = true;
# networking.firewall = {
# enable = false;
# };
# # VPN setup
networking.networkmanager.ensureProfiles = {
environmentFiles = [ config.sops.secrets.vpnEnvironment.path ];
profiles.wg-home = {
connection = {
id = "wg-home";
type = "wireguard";
interface-name = "wgh";
autoconnect = false;
};
ipv4 = {
address = "10.0.0.2/32";
method = "manual";
};
wireguard = {
listen-port = 51820;
private-key = "$HOME_PRIVATE_KEY";
};
"wireguard-peer.y/TBD/c0GkrRtekDkCb8TUnYYil8bSRPIjPDY650pz8=" = {
endpoint = "$HOME_ENDPOINT";
allowed-ips = "192.168.1.0/16";
};
};
profiles.wg-fritzbox = {
connection = {
id = "wg-fritzbox";
type = "wireguard";
interface-name = "wgfb";
autoconnect = false;
};
ipv4 = {
address = "192.168.178.201/24";
dns = "192.168.178.1";
method = "manual";
};
wireguard = {
listen-port = 51820;
private-key = "$FRITZBOX_PRIVATE_KEY";
};
"wireguard-peer.Jf/seKAL7kWm2qX9gf5Ln8FiN7OlPQB3CyRovDIOEHw=" = {
endpoint = "$FRITZBOX_ENDPOINT";
allowed-ips = "192.168.178.0/24;fd73:ea00:5841::/64";
preshared-key = "$FRITZBOX_PRESHARED_KEY";
};
};
};
};
}
{lib, ...}:{
networking.networkmanager.enable = true;
networking.networkmanager.wifi.powersave = lib.mkDefault true;
users.users.remy.extraGroups = [
"networkmanager"
];
}

View File

@@ -16,9 +16,8 @@
hardware.graphics.enable = lib.mkForce true;
hardware.nvidia = lib.mkForce {
modesetting.enable = true;
powerManagement.enable = false;
powerManagement.enable = true;
powerManagement.finegrained = false;
# features not available for the old graphics card
open = false;
nvidiaSettings = false;
@@ -28,13 +27,7 @@
intelBusId = "PCI:0:2:0";
};
package = config.boot.kernelPackages.nvidiaPackages.mkDriver {
version = "575.51.02";
sha256_64bit = "sha256-XZ0N8ISmoAC8p28DrGHk/YN1rJsInJ2dZNL8O+Tuaa0=";
openSha256 = "sha256-NQg+QDm9Gt+5bapbUO96UFsPnz1hG1dtEwT/g/vKHkw=";
settingsSha256 = "sha256-6n9mVkEL39wJj5FB1HBml7TTJhNAhS/j5hqpNGFQE4w=";
usePersistenced = false;
};
package = config.boot.kernelPackages.nvidiaPackages.beta;
};
# overwrite the blacklists set previously
boot.extraModprobeConfig = lib.mkForce "";
@@ -51,7 +44,7 @@
blacklist nouveau
options nouveau modeset=0
'';
services.udev.extraRules = ''
# Remove NVIDIA USB xHCI Host Controller devices, if present
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x0c0330", ATTR{power/control}="auto", ATTR{remove}="1"
@@ -68,3 +61,7 @@
boot.blacklistedKernelModules = [ "nouveau" "nvidia" "nvidia_drm" "nvidia_modeset" ];
}
# Warning: used to have
# lib.mkdDefault

View File

@@ -6,7 +6,7 @@
}:
{
# Needs to be explicitly set to false...
services.pulseaudio.enable = false;
hardware.pulseaudio.enable = false;
# OR
services.pipewire = {
enable = true;

View File

@@ -1,24 +1,24 @@
{
config,
lib,
pkgs,
...
config,
lib,
pkgs,
...
}:
{
virtualisation.containers.enable = true;
virtualisation = {
podman = {
enable = true;
virtualisation.containers.enable = true;
virtualisation = {
podman = {
enable = true;
dockerCompat = false;
dockerCompat = false;
# Required for containers under podman-compose to be able to talk to each other.
defaultNetwork.settings.dns_enabled = true;
# Required for containers under podman-compose to be able to talk to each other.
defaultNetwork.settings.dns_enabled = true;
};
};
};
# Useful other development tools
environment.systemPackages = with pkgs; [
podman-compose # start group of containers for dev
];
# Useful other development tools
environment.systemPackages = with pkgs; [
podman-compose # start group of containers for dev
];
}

View File

@@ -1,99 +1,30 @@
{
config,
inputs,
lib,
pkgs,
...
}:
{
options.nix-config = {
power = {
batteryThresholds = lib.mkOption {
type = lib.types.listOf lib.types.int;
default = [ 60 80 ];
description = "Battery charge thresholds for power management.";
};
services.tlp = {
enable = true;
settings = {
CPU_SCALING_GOVERNOR_ON_BAT = "powersave";
CPU_SCALING_GOVERNOR_ON_AC = "performance";
CPU_ENERGY_PERF_POLICY_ON_BAT = "power";
CPU_ENERGY_PERF_POLICY_ON_AC = "performance";
CPU_MIN_PERF_ON_AC = 0;
CPU_MAX_PERF_ON_AC = 100;
CPU_MIN_PERF_ON_BAT = 0;
CPU_MAX_PERF_ON_BAT = 50;
};
};
imports = [
inputs.watt.nixosModules.default
];
config = {
# environment.systemPackages = [
# pkgs.power-profiles-daemon
# ];
services.power-profiles-daemon.enable = true;
# services.tlp = {
# enable = true;
# settings = {
# # # processor chooses frequencies itself but respects the limits set by the user
# # CPU_DRIVER_OPMODE_ON_AC = "guided";
# # CPU_DRIVER_OPMODE_ON_BAT = "guided";
# # # governor dictates global behavior of the CPU
# # CPU_SCALING_GOVERNOR_ON_BAT = "powersave";
# # CPU_SCALING_GOVERNOR_ON_AC = "performance";
# # # energy performance policy (EPP) sets the energy/performance balance
# # CPU_ENERGY_PERF_POLICY_ON_BAT = "balance_power";
# # CPU_ENERGY_PERF_POLICY_ON_AC = "performance";
# # # clock speeds reported by `sudo tlp-stat`
# # # 623377 [kHz] and 5090910 [kHz]
# # CPU_SCALING_MIN_FREQ_ON_AC = 623377;
# # CPU_SCALING_MAX_FREQ_ON_AC = 5090910;
# # CPU_SCALING_MIN_FREQ_ON_BAT = 0;
# # # reduce max frequency on battery to save power
# # CPU_SCALING_MAX_FREQ_ON_BAT = 3000000;
# # # Allow the CPU to boost
# # CPU_BOOST_ON_AC = 1;
# # CPU_BOOST_ON_BAT = 1;
# # RADEON_DPM_PERF_LEVEL_ON_AC = "high";
# # # WIFI_PWR_ON_BAT = "off";
# # enable battery charge thresholds on the default battery
# STOP_CHARGE_THRESH_BAT0 = 1;
# };
# };
systemd.sleep.extraConfig = ''
AllowSuspend=yes
AllowHibernation=yes
AllowHybridSleep=yes
AllowSuspendThenHibernate=yes
'';
# services.watt = {
# enable = true;
# settings = {
# battery_charge_thresholds = [
# 40
# 80
# ];
# };
# };
services.upower.enable = true;
services.irqbalance = {
enable = true;
};
services.thermald = {
enable = true;
};
};
systemd.sleep.extraConfig = ''
AllowSuspend=yes
AllowHibernation=yes
AllowHybridSleep=yes
AllowSuspendThenHibernate=yes
'';
}

View File

@@ -1,12 +0,0 @@
{
inputs,
...
}:
{
sops.age.sshKeyPaths = [ "/etc/ssh/ssh_host_ed25519_key" ];
sops.defaultSopsFile = ./../../secrets/vpn.env;
sops.secrets.vpnEnvironment = {
sopsFile = ./../../secrets/vpn.env;
format = "dotenv";
};
}

View File

@@ -5,29 +5,7 @@
...
}:
{
stylix = {
enable = true;
polarity = "dark";
homeManagerIntegration.followSystem = false;
base16Scheme = {
# scheme = "onedark";
# author = "https://github.com/one-dark";
base00 = "#282c34";
base01 = "#353b45";
base02 = "#3e4451";
base03 = "#545862";
base04 = "#565c64";
base05 = "#abb2bf";
base06 = "#b6bdca";
base07 = "#c8ccd4";
base08 = "#e06c75";
base09 = "#d19a66";
base0A = "#e6c07b";
base0B = "#98c379";
base0C = "#56b6c2";
base0D = "#61afef";
base0E = "#c678dd";
base0F = "#be5046";
};
};
stylix.enable = true;
stylix.image = ./../../wallpapers/magicpattern-87PP9Zd7MNo-unsplash.jpg;
}

View File

@@ -1,28 +0,0 @@
{
lib,
config,
...
}:
let
cfg = config.nix-config;
in
{
options = {
nix-config.userName = lib.mkOption {
type = lib.types.str;
default = "remy";
};
};
config = {
users.users.${cfg.userName} = {
isNormalUser = true;
extraGroups = [
"wheel" # Enable sudo for the user.
"input"
# other groups are added as needed, eg. networkmanager
];
};
};
}

Submodule secrets deleted from a51d89c420

11
secrets/secrets.nix Normal file
View File

@@ -0,0 +1,11 @@
let
remy-nix = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMU7pWZfs7GfFTvqljA99pJV9DGJIPH+eK6DvGqBs4pG";
remy-arch = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOP0PZqY8/YfV0NnVbFs2fZLj+nXXVJ8bDo03TyYDfW1";
users = [remy-arch remy-nix];
in {
"secret1.age".publicKeys = users;
"wifi.age".publicKeys = users;
}

BIN
secrets/wifi.age Normal file

Binary file not shown.

View File

@@ -1,5 +1,24 @@
{ config, pkgs, lib, ... }:
with lib.hm.gvariant;
{
imports = [
../modules/home-manager/browser.nix
../modules/home-manager/code.nix
../modules/home-manager/dev.nix
../modules/home-manager/fish.nix
../modules/home-manager/flatpaks.nix
../modules/home-manager/hypr
../modules/home-manager/keepassxc.nix
../modules/home-manager/kitty.nix
../modules/home-manager/kubectl.nix
../modules/home-manager/obsidian.nix
../modules/home-manager/owncloud-client.nix
../modules/home-manager/stylix.nix
../modules/home-manager/thunderbird.nix
../modules/home-manager/wofi.nix
../modules/home-manager/xdg-portals.nix
];
## Home Manager configuration
home.stateVersion = "24.05";
# Let Home Manager install and manage itself.
@@ -9,40 +28,10 @@
home.username = "remy";
home.homeDirectory = "/home/remy";
## Utils relevant to this user only
programs.git = {
enable = true;
settings = {
user.name = "Remy Moll";
user.email = "me@moll.re";
};
};
## XDG configuration
xdg = {
mimeApps = {
enable = true;
defaultApplications = {
# TODO
"inode/directory" = "org.gnome.Nautilus.desktop";
"application/zip" = "org.gnome.FileRoller.desktop";
"application/octet-stream" = "org.gnome.GHex.desktop";
# pdfs
"application/pdf" = "org.gnome.Evince.desktop";
# links
"x-scheme-handler/https" = "firefox.desktop"; # Links
"x-scheme-handler/http" = "firefox.desktop"; # Links
# images
# "image/png" = "org.gnome.Evince.desktop";
# "image/jpeg" = "org.gnome.Evince.desktop";
# "image/gif" = "org.gnome.Evince.desktop";
# "image/svg+xml" = "org.gnome.Evince.desktop";
# "image/tiff" = "org.gnome.Evince.desktop";
# text-based
"text/*" = "vscode.desktop";
};
};
userName = "Remy Moll";
userEmail = "me@moll.re";
};
}

View File

@@ -1,23 +0,0 @@
{ config, pkgs, lib, ... }:
with lib.hm.gvariant;
{
config = {
home.stateVersion = "24.05";
};
imports = [
../../modules/home-manager/browser.nix
../../modules/home-manager/code.nix
../../modules/home-manager/dev.nix
../../modules/home-manager/fish.nix
../../modules/home-manager/kubectl.nix
../../modules/home-manager/macos-fixes.nix
../../modules/home-manager/nh.nix
../../modules/home-manager/obsidian.nix
../../modules/home-manager/work
];
}

View File

@@ -1,38 +0,0 @@
{ config, pkgs, lib, ... }:
with lib.hm.gvariant;
{
config = {
nix-config = {
hypr = {
internal-screen = {
resolution = "3840x2160";
scale = "1.666667";
};
};
};
};
imports = [
../remy.nix
../../modules/home-manager/browser.nix
../../modules/home-manager/code.nix
../../modules/home-manager/dev.nix
../../modules/home-manager/documents.nix
../../modules/home-manager/fish.nix
../../modules/home-manager/flatpaks.nix
../../modules/home-manager/hypr
../../modules/home-manager/keepassxc.nix
../../modules/home-manager/kitty.nix
../../modules/home-manager/kubectl.nix
../../modules/home-manager/obsidian.nix
../../modules/home-manager/owncloud-client.nix
../../modules/home-manager/ssh.nix
../../modules/home-manager/stylix.nix
../../modules/home-manager/thunderbird.nix
../../modules/home-manager/wofi.nix
../../modules/home-manager/xdg-portals.nix
];
}

View File

@@ -1,38 +0,0 @@
{ config, pkgs, lib, ... }:
with lib.hm.gvariant;
{
config = {
nix-config = {
hypr = {
internal-screen = {
resolution = "auto";
scale = "auto";
};
};
};
};
imports = [
../remy.nix
../../modules/home-manager/browser.nix
../../modules/home-manager/code.nix
../../modules/home-manager/dev.nix
../../modules/home-manager/documents.nix
../../modules/home-manager/fish.nix
../../modules/home-manager/flatpaks.nix
../../modules/home-manager/hypr
../../modules/home-manager/keepassxc.nix
../../modules/home-manager/kitty.nix
../../modules/home-manager/kubectl.nix
../../modules/home-manager/obsidian.nix
../../modules/home-manager/owncloud-client.nix
../../modules/home-manager/nh.nix
../../modules/home-manager/ssh.nix
../../modules/home-manager/stylix.nix
../../modules/home-manager/thunderbird.nix
../../modules/home-manager/wofi.nix
../../modules/home-manager/xdg-portals.nix
];
}

View File

@@ -1,44 +0,0 @@
{ config, nixpkgs, lib, ... }:
with lib.hm.gvariant;
{
config = {
nix-config = {
hypr = {
internal-screen = {
resolution = "2944x1840@90.00";
scale = "1.6";
};
};
# quickshell = {
# enable = true;
# };
};
};
imports = [
../remy.nix
../../modules/home-manager/browser.nix
../../modules/home-manager/code.nix
../../modules/home-manager/dev.nix
../../modules/home-manager/directories.nix
../../modules/home-manager/documents.nix
../../modules/home-manager/fish.nix
../../modules/home-manager/flatpaks.nix
../../modules/home-manager/hypr
../../modules/home-manager/keepassxc.nix
../../modules/home-manager/kitty.nix
../../modules/home-manager/kubectl.nix
../../modules/home-manager/launcher.nix
../../modules/home-manager/nh.nix
../../modules/home-manager/obsidian.nix
../../modules/home-manager/owncloud-client.nix
../../modules/home-manager/quickshell
../../modules/home-manager/ssh.nix
../../modules/home-manager/stylix.nix
../../modules/home-manager/thunderbird.nix
../../modules/home-manager/uxplay.nix
../../modules/home-manager/wallpaper.nix
../../modules/home-manager/xdg-portals.nix
];
}

View File

@@ -1,4 +0,0 @@
{ config, lib, pkgs, ... }:
{
nixpkgs.config.allowUnfree = true;
}

25
variable.nix Normal file
View File

@@ -0,0 +1,25 @@
{ config, ... }:
{
config.var = {
hostname = "garnix";
username = "remy";
configDirectory = "/home/" + config.var.username
+ "/.config/nixos"; # The path of the nixos configuration directory
keyboardLayout = "de";
location = "Berlin";
timeZone = "Europe/Berlin";
defaultLocale = "en_US.UTF-8";
extraLocale = "de_DE.UTF-8";
git = {
username = "Hadi";
email = "112569860+anotherhadi@users.noreply.github.com";
};
autoUpgrade = false;
autoGarbageCollector = true;
};
}