diff --git a/README.md b/README.md
index 3c17c01..1410c1d 100644
--- a/README.md
+++ b/README.md
@@ -61,7 +61,12 @@ Une fois la manipulation finie, on copie `hosts/generic` dans `hosts/hostname`.
Avant de déployer la configuration, il faut ajouter la clé sops-nix
```
-(TODO)
+cat /etc/ssh/ssh_host_ed25519_key.pub | ssh-to-age
+vi .sops.yaml
+sops updatekeys secrets.yaml
+git commit -am "add myhost sops key"
+git push origin main
+nix flake update mysecrets
```
On édite `hosts/hostname/default.nix` et on inclus les bons modules.
diff --git a/flake.lock b/flake.lock
index b123a59..db550b1 100644
--- a/flake.lock
+++ b/flake.lock
@@ -23,19 +23,17 @@
"mysecrets": {
"flake": false,
"locked": {
- "lastModified": 1753141577,
- "narHash": "sha256-MNbm7KCEqML5l72GppVoxXX03UtVGIzUsgaW+A+FBDQ=",
- "ref": "main",
- "rev": "c1edf4983cba959f93daa9c7ef0c1acbd958c755",
- "shallow": true,
+ "lastModified": 1753261965,
+ "narHash": "sha256-KaKG3Vd7xpfQKAslnYPWCmqyoZTeefRDLqwSzD18nXQ=",
+ "ref": "refs/heads/main",
+ "rev": "341a2a1a75af6613018404dd0059d9c6d3fcc4a1",
+ "revCount": 3,
"type": "git",
- "url": "ssh://gitea@git.unixyourbrain.org/beastie/nixos-secrets.git"
+ "url": "file:///root/git/nixos-secrets"
},
"original": {
- "ref": "main",
- "shallow": true,
"type": "git",
- "url": "ssh://gitea@git.unixyourbrain.org/beastie/nixos-secrets.git"
+ "url": "file:///root/git/nixos-secrets"
}
},
"nixpkgs": {
diff --git a/flake.nix b/flake.nix
index 09388a7..ee74500 100644
--- a/flake.nix
+++ b/flake.nix
@@ -15,7 +15,7 @@
};
mysecrets = {
- url = "git+ssh://gitea@git.unixyourbrain.org/beastie/nixos-secrets.git?ref=main&shallow=1";
+ url = "git+file:///root/git/nixos-secrets";
flake = false;
};
};
diff --git a/hosts/generic/default.nix b/hosts/generic/default.nix
index 93c26f6..2726c15 100644
--- a/hosts/generic/default.nix
+++ b/hosts/generic/default.nix
@@ -35,6 +35,7 @@
${username} = {
isNormalUser = true;
createHome = true;
+ password = "toto";
description = "Admin account";
extraGroups = [
"wheel"
@@ -79,6 +80,7 @@
pkgs.curl
pkgs.nixos-anywhere
pkgs.nixos-generators
+ pkgs.ssh-to-age
];
services.openssh.enable = true;
diff --git a/hosts/generic/hardware-configuration.nix b/hosts/generic/hardware-configuration.nix
index 85f3eaf..48c6058 100644
--- a/hosts/generic/hardware-configuration.nix
+++ b/hosts/generic/hardware-configuration.nix
@@ -1,16 +1,28 @@
# 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, ... }:
+{
+ config,
+ lib,
+ pkgs,
+ modulesPath,
+ ...
+}:
{
- imports =
- [ (modulesPath + "/profiles/qemu-guest.nix")
- ];
+ imports = [
+ (modulesPath + "/profiles/qemu-guest.nix")
+ ];
- boot.initrd.availableKernelModules = [ "ahci" "xhci_pci" "virtio_pci" "sr_mod" "virtio_blk" ];
+ boot.initrd.availableKernelModules = [
+ "ahci"
+ "xhci_pci"
+ "virtio_pci"
+ "sr_mod"
+ "virtio_blk"
+ ];
boot.initrd.kernelModules = [ ];
- boot.kernelModules = [ "kvm-intel" ];
+ boot.kernelModules = [ "kvm-amd" ];
boot.extraModulePackages = [ ];
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
diff --git a/hosts/test-kvm/default.nix b/hosts/test-kvm/default.nix
index 19bdba9..bec5a43 100644
--- a/hosts/test-kvm/default.nix
+++ b/hosts/test-kvm/default.nix
@@ -6,11 +6,12 @@
inputs,
...
}:
-let
-in
{
+ system.stateVersion = "25.11";
+
imports = builtins.trace "${inputs.mysecrets}" [
(modulesPath + "/installer/scan/not-detected.nix")
+ ./network.nix
./disk-config.nix
./hardware-configuration.nix
../../modules/core
@@ -36,9 +37,20 @@ in
};
};
- services.openssh.enable = true;
+ ## Enable virtualisation guest settings
+ services.qemuGuest.enable = true;
+ services.spice-vdagentd.enable = true;
+ services.xserver = {
+ videoDrivers = [ "modesetting" ]; # Driver vidéo optimisé pour QEMU/KVM
+ };
- networking.hostName = "${hostname}";
+ environment.systemPackages = [
+ pkgs.spice-gtk # Outils SPICE
+ pkgs.spice-protocol # Protocoles SPICE
+ ];
- system.stateVersion = "25.11";
+ #fileSystems."/" = {
+ # device = "/dev/vda2"; # Disque virtuel typique
+ # fsType = "btrfs";
+ #};
}
diff --git a/hosts/test-kvm/hardware-configuration.nix b/hosts/test-kvm/hardware-configuration.nix
index f5b54dc..282f951 100644
--- a/hosts/test-kvm/hardware-configuration.nix
+++ b/hosts/test-kvm/hardware-configuration.nix
@@ -20,9 +20,19 @@
"virtio_pci"
"sr_mod"
"virtio_blk"
+ "virtio_scsi"
+ "virtio_net"
+ "virtio_blk"
+ ];
+ boot.initrd.kernelModules = [
+ "virtio_balloon"
+ "virtio_console"
+ "virtio_rng"
+ ];
+ boot.kernelModules = [
+ "kvm-amd"
+ "virtio-gpu"
];
- boot.initrd.kernelModules = [ ];
- boot.kernelModules = [ "kvm-intel" ];
boot.extraModulePackages = [ ];
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
diff --git a/hosts/test-kvm/network.nix b/hosts/test-kvm/network.nix
new file mode 100644
index 0000000..e5159ad
--- /dev/null
+++ b/hosts/test-kvm/network.nix
@@ -0,0 +1,29 @@
+{
+ hostname,
+ ...
+}:
+{
+ networking = {
+ hostName = "${hostname}";
+ interfaces.enp1s0 = {
+ ipv4.addresses = [
+ {
+ address = "192.168.122.100";
+ prefixLength = 24;
+ }
+ ];
+ };
+ defaultGateway = {
+ address = "192.168.122.1";
+ interface = "enp1s0";
+ };
+ nameservers = [
+ "9.9.9.9"
+ "2001:41d0:303:20da::1"
+ "217.182.138.218"
+ ];
+ networkmanager.enable = true;
+
+ firewall.enable = true;
+ };
+}
diff --git a/modules/core/config/etc/inputrc b/modules/core/config/etc/inputrc
new file mode 100644
index 0000000..a336cb2
--- /dev/null
+++ b/modules/core/config/etc/inputrc
@@ -0,0 +1,26 @@
+set bell-style none
+set meta-flag on
+set input-meta on
+set convert-meta off
+set output-meta on
+set colored-stats on
+set completion-ignore-case on
+set editing-mode emacs
+
+"\e[A":history-search-backward
+"\e[B":history-search-forward
+
+$if term=linux
+"\e[1~": beginning-of-line
+"\e[4~": end-of-line
+$endif
+
+$if term=xterm
+"\e[1~": beginning-of-line
+"\e[4~": end-of-line
+$endif
+
+$if term=rxvt-unicode
+"\e[7~": beginning-of-line
+"\e[8~": end-of-line
+$endif
diff --git a/modules/core/default.nix b/modules/core/default.nix
index 54ba2e8..030b6f0 100644
--- a/modules/core/default.nix
+++ b/modules/core/default.nix
@@ -5,6 +5,8 @@
imports = [
./grub.nix
./packages.nix
+ ./ssh.nix
+ ./tty.nix
./users.nix
];
}
diff --git a/modules/core/packages.nix b/modules/core/packages.nix
index 263ab08..28fe84b 100644
--- a/modules/core/packages.nix
+++ b/modules/core/packages.nix
@@ -14,6 +14,13 @@
pkgs.git
pkgs.neovim
pkgs.unzip
-
+ pkgs.sops
+ pkgs.ssh-to-age
];
+ services = {
+ locate = {
+ enable = true;
+ package = pkgs.plocate;
+ };
+ };
}
diff --git a/modules/core/ssh.nix b/modules/core/ssh.nix
new file mode 100644
index 0000000..570a3b0
--- /dev/null
+++ b/modules/core/ssh.nix
@@ -0,0 +1,17 @@
+{
+ ...
+}:
+{
+ services.openssh = {
+ enable = true;
+ settings = {
+ PasswordAuthentication = true;
+ AllowUsers = null;
+ UseDns = true;
+ X11Forwarding = false;
+ PermitRootLogin = "no";
+ };
+ };
+
+ networking.firewall.allowedTCPPorts = [ 22 ];
+}
diff --git a/modules/core/tty.nix b/modules/core/tty.nix
new file mode 100644
index 0000000..2cfb7e7
--- /dev/null
+++ b/modules/core/tty.nix
@@ -0,0 +1,27 @@
+{
+ config,
+ pkgs,
+ ...
+}@attrs:
+let
+ cfg = config.services.getty;
+in
+{
+ environment = {
+ etc = {
+ "inputrc".source = ./config/etc/inputrc;
+ };
+ shellAliases = {
+ ls = "ls --color=auto";
+ ll = "ls --color=auto -lha";
+ grep = "grep --color=auto";
+ ip = "ip -color=auto";
+ vi = "nvim";
+ };
+ variables = {
+ EDITOR = "nvim";
+ HISTSIZE = 20000;
+ HISTTIMEFORMAT = "%F %T ";
+ };
+ };
+}
diff --git a/modules/core/users.nix b/modules/core/users.nix
index d09c805..64c12bb 100644
--- a/modules/core/users.nix
+++ b/modules/core/users.nix
@@ -13,6 +13,9 @@
description = "Admin account";
extraGroups = [
"wheel"
+ "networkmanager"
+ "audio"
+ "video"
];
openssh.authorizedKeys.keys = [
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAKMJ3TkEmRQcX7RQijNa2km6a2xXJk6M6FERh7C9nTJ"
diff --git a/modules/optionnal/autologin.nix b/modules/optionnal/autologin.nix
new file mode 100644
index 0000000..96fd79b
--- /dev/null
+++ b/modules/optionnal/autologin.nix
@@ -0,0 +1,18 @@
+{
+ config,
+ username,
+ pkgs,
+ ...
+}:
+let
+ cfg = config.services.getty;
+in
+{
+ systemd.services."getty@tty1" = {
+ overrideStrategy = "asDropin";
+ serviceConfig.ExecStart = [
+ ""
+ "${pkgs.util-linux}/bin/agetty --login-program ${cfg.loginProgram} --autologin ${username} --noclear --keep-baud %I 115200,38400,9600 $TERM"
+ ];
+ };
+}
diff --git a/modules/optionnal/desktop/config/etc/xdg/hypr/frappe.conf b/modules/optionnal/desktop/config/etc/xdg/hypr/frappe.conf
new file mode 100644
index 0000000..3667139
--- /dev/null
+++ b/modules/optionnal/desktop/config/etc/xdg/hypr/frappe.conf
@@ -0,0 +1,77 @@
+$rosewater = rgb(f2d5cf)
+$rosewaterAlpha = f2d5cf
+
+$flamingo = rgb(eebebe)
+$flamingoAlpha = eebebe
+
+$pink = rgb(f4b8e4)
+$pinkAlpha = f4b8e4
+
+$mauve = rgb(ca9ee6)
+$mauveAlpha = ca9ee6
+
+$red = rgb(e78284)
+$redAlpha = e78284
+
+$maroon = rgb(ea999c)
+$maroonAlpha = ea999c
+
+$peach = rgb(ef9f76)
+$peachAlpha = ef9f76
+
+$yellow = rgb(e5c890)
+$yellowAlpha = e5c890
+
+$green = rgb(a6d189)
+$greenAlpha = a6d189
+
+$teal = rgb(81c8be)
+$tealAlpha = 81c8be
+
+$sky = rgb(99d1db)
+$skyAlpha = 99d1db
+
+$sapphire = rgb(85c1dc)
+$sapphireAlpha = 85c1dc
+
+$blue = rgb(8caaee)
+$blueAlpha = 8caaee
+
+$lavender = rgb(babbf1)
+$lavenderAlpha = babbf1
+
+$text = rgb(c6d0f5)
+$textAlpha = c6d0f5
+
+$subtext1 = rgb(b5bfe2)
+$subtext1Alpha = b5bfe2
+
+$subtext0 = rgb(a5adce)
+$subtext0Alpha = a5adce
+
+$overlay2 = rgb(949cbb)
+$overlay2Alpha = 949cbb
+
+$overlay1 = rgb(838ba7)
+$overlay1Alpha = 838ba7
+
+$overlay0 = rgb(737994)
+$overlay0Alpha = 737994
+
+$surface2 = rgb(626880)
+$surface2Alpha = 626880
+
+$surface1 = rgb(51576d)
+$surface1Alpha = 51576d
+
+$surface0 = rgb(414559)
+$surface0Alpha = 414559
+
+$base = rgb(303446)
+$baseAlpha = 303446
+
+$mantle = rgb(292c3c)
+$mantleAlpha = 292c3c
+
+$crust = rgb(232634)
+$crustAlpha = 232634
diff --git a/modules/optionnal/desktop/config/etc/xdg/hypr/hyperland-test-kvm.conf b/modules/optionnal/desktop/config/etc/xdg/hypr/hyperland-test-kvm.conf
new file mode 100644
index 0000000..2b93abb
--- /dev/null
+++ b/modules/optionnal/desktop/config/etc/xdg/hypr/hyperland-test-kvm.conf
@@ -0,0 +1,14 @@
+################
+### MONITORS ###
+################
+# See https://wiki.hyprland.org/Configuring/Monitors/
+monitor=Virtual-1,1920x1080,0x0,1
+
+workspace = 1, monitor:Virtual-1
+workspace = 2, monitor:Virtual-1
+workspace = 3, monitor:Virtual-1
+workspace = 4, monitor:Virtual-1
+workspace = 5, monitor:Virtual-1
+workspace = 6, monitor:Virtual-1
+workspace = 7, monitor:Virtual-1
+workspace = 8, monitor:Virtual-1
diff --git a/modules/optionnal/desktop/config/etc/xdg/hypr/hyprland.conf b/modules/optionnal/desktop/config/etc/xdg/hypr/hyprland.conf
new file mode 100644
index 0000000..e18085b
--- /dev/null
+++ b/modules/optionnal/desktop/config/etc/xdg/hypr/hyprland.conf
@@ -0,0 +1,313 @@
+source = /etc/xdg/hypr/hyprland-host.conf
+
+###################
+### MY PROGRAMS ###
+###################
+
+$terminal = kitty
+source = /etc/xdg/hypr/rofi.conf
+
+#################
+### AUTOSTART ###
+#################
+
+exec-once = waybar &
+exec-once = hyprpaper
+
+#############################
+### ENVIRONMENT VARIABLES ###
+#############################
+
+env = LIBVA_DRIVER_NAME,nvidia
+env = __GLX_VENDOR_LIBRARY_NAME,nvidia
+env = XCURSOR_SIZE,24
+env = HYPRCURSOR_SIZE,24
+
+###################
+### PERMISSIONS ###
+###################
+
+# permission = /usr/(bin|local/bin)/grim, screencopy, allow
+# permission = /usr/(lib|libexec|lib64)/xdg-desktop-portal-hyprland, screencopy, allow
+# permission = /usr/(bin|local/bin)/hyprpm, plugin, allow
+
+
+#####################
+### LOOK AND FEEL ###
+#####################
+
+general {
+ gaps_in = 5
+ gaps_out = 10
+
+ border_size = 2
+
+ # https://wiki.hyprland.org/Configuring/Variables/#variable-types for info about colors
+ # col.active_border = rgb(81c8be) rgb(8caaee) 45deg
+ col.active_border = rgb(81c8be)
+ col.inactive_border = rgb(737994)
+
+ # Set to true enable resizing windows by clicking and dragging on borders and gaps
+ resize_on_border = false
+
+ # Please see https://wiki.hyprland.org/Configuring/Tearing/ before you turn this on
+ allow_tearing = false
+
+ layout = dwindle
+}
+
+# https://wiki.hyprland.org/Configuring/Variables/#decoration
+decoration {
+ rounding = 10
+ rounding_power = 2
+
+ # Change transparency of focused and unfocused windows
+ active_opacity = 0.95
+ inactive_opacity = 0.80
+
+ shadow {
+ enabled = false
+ range = 4
+ render_power = 3
+ color = rgba(1a1a1aee)
+ }
+
+ # https://wiki.hyprland.org/Configuring/Variables/#blur
+ blur {
+ enabled = true
+ size = 3
+ passes = 1
+
+ vibrancy = 0.1696
+ }
+}
+
+# https://wiki.hypr.land/Configuring/Variables/#group
+group {
+ col.border_active = rgb(81c8be) # Violet par exemple
+ col.border_inactive = rgb(737994) # Gris par exemple
+ col.border_locked_active = rgb(81c8be) # Rose
+ col.border_locked_inactive = rgb(737994) # Gris foncé
+ groupbar {
+ font_family = CaskaydiaCove Nerd Font
+ font_size = 16
+ font_weight_active = bold
+ font_weight_inactive = normal
+ indicator_gap = 5
+ indicator_height = 2
+ text_color = rgb(81c8be)
+ col.active = rgb(81c8be)
+ col.inactive = rgb(737994)
+ col.locked_inactive = rgb(737994)
+ gaps_in = 10
+ gaps_out = 5
+ }
+}
+
+# https://wiki.hyprland.org/Configuring/Variables/#animations
+animations {
+ enabled = true, please :)
+
+ # Default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more
+
+ bezier = easeOutQuint,0.23,1,0.32,1
+ bezier = easeInOutCubic,0.65,0.05,0.36,1
+ bezier = linear,0,0,1,1
+ bezier = almostLinear,0.5,0.5,0.75,1.0
+ bezier = quick,0.15,0,0.1,1
+
+ animation = global, 1, 10, default
+ animation = border, 1, 5.39, easeOutQuint
+ animation = windows, 1, 4.79, easeOutQuint
+ animation = windowsIn, 1, 4.1, easeOutQuint, popin 87%
+ animation = windowsOut, 1, 1.49, linear, popin 87%
+ animation = fadeIn, 1, 1.73, almostLinear
+ animation = fadeOut, 1, 1.46, almostLinear
+ animation = fade, 1, 3.03, quick
+ animation = layers, 1, 3.81, easeOutQuint
+ animation = layersIn, 1, 4, easeOutQuint, fade
+ animation = layersOut, 1, 1.5, linear, fade
+ animation = fadeLayersIn, 1, 1.79, almostLinear
+ animation = fadeLayersOut, 1, 1.39, almostLinear
+ animation = workspaces, 1, 1.94, almostLinear, slidefade
+}
+
+# Ref https://wiki.hyprland.org/Configuring/Workspace-Rules/
+# "Smart gaps" / "No gaps when only"
+# uncomment all if you wish to use that.
+# workspace = w[tv1], gapsout:0, gapsin:0
+# workspace = f[1], gapsout:0, gapsin:0
+# windowrule = bordersize 0, floating:0, onworkspace:w[tv1]
+# windowrule = rounding 0, floating:0, onworkspace:w[tv1]
+# windowrule = bordersize 0, floating:0, onworkspace:f[1]
+# windowrule = rounding 0, floating:0, onworkspace:f[1]
+
+# See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more
+dwindle {
+ pseudotile = true # Master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below
+ preserve_split = true # You probably want this
+ force_split = 2
+}
+
+# See https://wiki.hyprland.org/Configuring/Master-Layout/ for more
+master {
+ new_status = master
+}
+
+# https://wiki.hyprland.org/Configuring/Variables/#misc
+misc {
+ force_default_wallpaper = -1 # Set to 0 or 1 to disable the anime mascot wallpapers
+ disable_hyprland_logo = false # If true disables the random hyprland logo / anime girl background. :(
+}
+
+
+#############
+### INPUT ###
+#############
+
+# https://wiki.hyprland.org/Configuring/Variables/#input
+input {
+ kb_layout = qwerty-fr
+ kb_variant =
+ kb_model =
+ kb_options =
+ kb_rules =
+
+ follow_mouse = 1
+
+ sensitivity = 0 # -1.0 - 1.0, 0 means no modification.
+
+ touchpad {
+ natural_scroll = false
+ }
+
+ numlock_by_default = true
+}
+
+# https://wiki.hyprland.org/Configuring/Variables/#gestures
+gestures {
+ workspace_swipe = false
+}
+
+# Example per-device config
+# See https://wiki.hyprland.org/Configuring/Keywords/#per-device-input-configs for more
+device {
+ name = epic-mouse-v1
+ sensitivity = -0.5
+}
+
+
+###################
+### KEYBINDINGS ###
+###################
+
+$mainMod = SUPER # Sets "Windows" key as main modifier
+# Apps shortcut
+bind = $mainMod, D, exec, $rofi
+bind = $mainMod, L, exec, /etc/xdg/scripts/wayland-disconnect.sh
+bind = $mainMod, M, exec, /etc/xdg/scripts/wayland-mpv.sh
+bind = $mainMod SHIFT, P, exec, pavucontrol
+bind = $mainMod SHIFT, T, exec, teams-for-linux
+bind = $mainMod SHIFT, D, exec, discord
+bind = $mainMod SHIFT, F, exec, firefox
+bind = $mainMod SHIFT, S, exec, steam
+bind = $mainMod SHIFT, L, exec, lutris
+bind = ,Print, exec, grim -g "$(slurp)" - | swappy -f -
+
+# Reload Restart config | moved to rofi
+bind = $mainMod, E, exit,
+
+# Kill focused window
+bind = $mainMod, Return, exec, $terminal
+
+# Créer un groupe
+bind = SUPER, G, togglegroup
+# Naviguer dans le groupe
+bind = SUPER, TAB, changegroupactive
+
+bind = $mainMod, Q, killactive,
+bind = $mainMod, F, fullscreenstate, 3
+bind = $mainMod, V, togglefloating,
+bind = $mainMod, SPACE, togglesplit, # dwindle
+
+# Move focus with mainMod + arrow keys
+bind = $mainMod, left, movefocus, l
+bind = $mainMod, right, movefocus, r
+bind = $mainMod, up, movefocus, u
+bind = $mainMod, down, movefocus, d
+
+# Déplacement de fenêtres avec CONTROL + flèches
+bind = $mainMod CONTROL, left, movewindow, l
+bind = $mainMod CONTROL, right, movewindow, r
+bind = $mainMod CONTROL, up, movewindow, u
+bind = $mainMod CONTROL, down, movewindow, d
+
+# Navigation workspace avec keypad (NumLock OFF)
+bind = $mainMod, KP_End, workspace, 1
+bind = $mainMod, KP_Down, workspace, 2
+bind = $mainMod, KP_Next, workspace, 3
+bind = $mainMod, KP_Left, workspace, 4
+bind = $mainMod, KP_Begin, workspace, 5
+bind = $mainMod, KP_Right, workspace, 6
+bind = $mainMod, KP_Home, workspace, 7
+bind = $mainMod, KP_Up, workspace, 8
+
+# Déplacement de fenêtre avec keypad
+bind = $mainMod CONTROL, KP_End, movetoworkspacesilent, 1
+bind = $mainMod CONTROL, KP_Down, movetoworkspacesilent, 2
+bind = $mainMod CONTROL, KP_Next, movetoworkspacesilent, 3
+bind = $mainMod CONTROL, KP_Left, movetoworkspacesilent, 4
+bind = $mainMod CONTROL, KP_Begin, movetoworkspacesilent, 5
+bind = $mainMod CONTROL, KP_Right, movetoworkspacesilent, 6
+bind = $mainMod CONTROL, KP_Home, movetoworkspacesilent, 7
+bind = $mainMod CONTROL, KP_Up, movetoworkspacesilent, 8
+
+# Example special workspace (scratchpad)
+bind = $mainMod, S, togglespecialworkspace, magic
+bind = $mainMod CONTROL, S, movetoworkspacesilent, special:magic
+
+# Scroll through existing workspaces with mainMod + scroll
+bind = $mainMod, mouse_down, workspace, e+1
+bind = $mainMod, mouse_up, workspace, e-1
+
+# Move/resize windows with mainMod + LMB/RMB and dragging
+bindm = $mainMod, mouse:272, movewindow
+bindm = $mainMod, mouse:273, resizewindow
+
+# Laptop multimedia keys for volume and LCD brightness
+bindel = ,XF86AudioRaiseVolume, exec, wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+
+bindel = ,XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-
+bindel = ,XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle
+bindel = ,XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle
+bindel = ,XF86MonBrightnessUp, exec, brightnessctl -e4 -n2 set 5%+
+bindel = ,XF86MonBrightnessDown, exec, brightnessctl -e4 -n2 set 5%-
+
+# Requires playerctl
+bindl = , XF86AudioNext, exec, playerctl next
+bindl = , XF86AudioPause, exec, playerctl play-pause
+bindl = , XF86AudioPlay, exec, playerctl play-pause
+bindl = , XF86AudioPrev, exec, playerctl previous
+
+##############################
+### WINDOWS AND WORKSPACES ###
+##############################
+
+# See https://wiki.hyprland.org/Configuring/Window-Rules/ for more
+# See https://wiki.hyprland.org/Configuring/Workspace-Rules/ for workspace rules
+
+# Example windowrule
+# windowrule = float,class:^(kitty)$,title:^(kitty)$
+
+# Ignore maximize requests from apps. You'll probably like this.
+windowrule = suppressevent maximize, class:.*
+
+# Fix some dragging issues with XWayland
+windowrule = nofocus,class:^$,title:^$,xwayland:1,floating:1,fullscreen:0,pinned:0
+
+# Supprimer la transparence pour des applications spécifiques
+windowrulev2 = opacity 1.0 override,class:firefox
+windowrulev2 = opacity 1.0 override,class:^(chromium)$
+windowrulev2 = opacity 1.0 override,class:^(mpv)$
+windowrulev2 = opacity 1.0 override,class:^(mpv)$
+
+windowrulev2 = fullscreen,class:^(mpv)$
diff --git a/modules/optionnal/desktop/config/etc/xdg/hypr/hyprlock.conf b/modules/optionnal/desktop/config/etc/xdg/hypr/hyprlock.conf
new file mode 100644
index 0000000..e69de29
diff --git a/modules/optionnal/desktop/config/etc/xdg/hypr/hyprpaper.conf b/modules/optionnal/desktop/config/etc/xdg/hypr/hyprpaper.conf
new file mode 100644
index 0000000..e69de29
diff --git a/modules/optionnal/desktop/config/etc/xdg/kitty/current-theme.conf b/modules/optionnal/desktop/config/etc/xdg/kitty/current-theme.conf
new file mode 100644
index 0000000..80c3a35
--- /dev/null
+++ b/modules/optionnal/desktop/config/etc/xdg/kitty/current-theme.conf
@@ -0,0 +1,80 @@
+# vim:ft=kitty
+
+## name: Catppuccin-Frappe
+## author: Pocco81 (https://github.com/Pocco81)
+## license: MIT
+## upstream: https://github.com/catppuccin/kitty/blob/main/frappe.conf
+## blurb: Soothing pastel theme for the high-spirited!
+
+
+
+# The basic colors
+foreground #C6D0F5
+background #303446
+selection_foreground #303446
+selection_background #F2D5CF
+
+# Cursor colors
+cursor #F2D5CF
+cursor_text_color #303446
+
+# URL underline color when hovering with mouse
+url_color #F2D5CF
+
+# Kitty window border colors
+active_border_color #BABBF1
+inactive_border_color #737994
+bell_border_color #E5C890
+
+# OS Window titlebar colors
+wayland_titlebar_color system
+macos_titlebar_color system
+
+# Tab bar colors
+active_tab_foreground #232634
+active_tab_background #CA9EE6
+inactive_tab_foreground #C6D0F5
+inactive_tab_background #292C3C
+tab_bar_background #232634
+
+# Colors for marks (marked text in the terminal)
+mark1_foreground #303446
+mark1_background #BABBF1
+mark2_foreground #303446
+mark2_background #CA9EE6
+mark3_foreground #303446
+mark3_background #85C1DC
+
+# The 16 terminal colors
+
+# black
+color0 #51576D
+color8 #626880
+
+# red
+color1 #E78284
+color9 #E78284
+
+# green
+color2 #A6D189
+color10 #A6D189
+
+# yellow
+color3 #E5C890
+color11 #E5C890
+
+# blue
+color4 #8CAAEE
+color12 #8CAAEE
+
+# magenta
+color5 #F4B8E4
+color13 #F4B8E4
+
+# cyan
+color6 #81C8BE
+color14 #81C8BE
+
+# white
+color7 #B5BFE2
+color15 #A5ADCE
diff --git a/modules/optionnal/desktop/config/etc/xdg/kitty/kitty.conf b/modules/optionnal/desktop/config/etc/xdg/kitty/kitty.conf
new file mode 100644
index 0000000..7a6c901
--- /dev/null
+++ b/modules/optionnal/desktop/config/etc/xdg/kitty/kitty.conf
@@ -0,0 +1,51 @@
+# BEGIN_KITTY_THEME
+# Catppuccin-Frappe
+include current-theme.conf
+# END_KITTY_THEME
+
+#Fonts
+font_family DejaVuSansM Nerd Font Mono
+bold_font auto
+italic_font auto
+bold_italic_font auto
+font_size 14.0
+
+# Scroll
+scrollback_lines 65635
+scrollback_indicator_opacity 0.5
+
+#Url
+open_url_with firefox
+underline_hyperlinks always
+
+copy_on_select clipboard
+select_by_word_characters @-./_~?&%+#!
+sync_to_monitor yes
+
+# Layout
+enabled_layouts vertical
+
+### Shortcut
+# Global
+map alt+up change_font_size all +2.0
+map alt+down change_font_size all -2.0
+map alt+= change_font_size all 0
+map alt+u open_url_with_hints
+map shift+up scroll_line_up
+map shift+down scroll_line_down
+map shift+page_up scroll_page_up
+map shift+page_down scroll_page_down
+mouse_map alt+middle press ungrabbed paste_from_clipboard
+# Layout
+map alt+s new_window
+map alt+p previous_window
+map alt+n next_window
+# Tab
+map alt+enter new_tab
+map alt+left previous_tab
+map alt+right next_tab
+map alt+tab next_tab
+map alt+t set_tab_title
+# Copy paste
+map ctrl+alt+c copy_to_clipboard
+map ctrl+alt+v paste_from_clipboard
diff --git a/modules/optionnal/desktop/config/etc/xdg/rofi/colors.rasi b/modules/optionnal/desktop/config/etc/xdg/rofi/colors.rasi
new file mode 100644
index 0000000..e99a12e
--- /dev/null
+++ b/modules/optionnal/desktop/config/etc/xdg/rofi/colors.rasi
@@ -0,0 +1,28 @@
+* {
+ rosewater: #f2d5cf;
+ flamingo: #eebebe;
+ pink: #f4b8e4;
+ mauve: #ca9ee6;
+ red: #e78284;
+ maroon: #ea999c;
+ peach: #ef9f76;
+ yellow: #e5c890;
+ green: #a6d189;
+ teal: #81c8be;
+ sky: #99d1db;
+ sapphire: #85c1dc;
+ blue: #8caaee;
+ lavender: #babbf1;
+ text: #c6d0f5;
+ subtext1: #b5bfe2;
+ subtext0: #a5adce;
+ overlay2: #949cbb;
+ overlay1: #838ba7;
+ overlay0: #737994;
+ surface2: #626880;
+ surface1: #51576d;
+ surface0: #414559;
+ base: #303446;
+ mantle: #292c3c;
+ crust: #232634;
+}
diff --git a/modules/optionnal/desktop/config/etc/xdg/rofi/config.rasi b/modules/optionnal/desktop/config/etc/xdg/rofi/config.rasi
new file mode 100644
index 0000000..f5d499e
--- /dev/null
+++ b/modules/optionnal/desktop/config/etc/xdg/rofi/config.rasi
@@ -0,0 +1,152 @@
+configuration {
+ modes: "window,drun,run,ssh,combi";
+/* font: "CaskaydiaCove Nerd Font 12"; */
+/* location: 0;*/
+/* yoffset: 0;*/
+/* xoffset: 0;*/
+/* fixed-num-lines: true;*/
+ show-icons: false;
+ terminal: "kitty";
+/* ssh-client: "ssh";*/
+/* ssh-command: "{terminal} -e {ssh-client} {host} [-p {port}]";*/
+/* run-command: "{cmd}";*/
+/* run-list-command: "";*/
+/* run-shell-command: "{terminal} -e {cmd}";*/
+/* window-command: "wmctrl -i -R {window}";*/
+/* window-match-fields: "all";*/
+/* icon-theme: "Papirus"; */
+/* drun-match-fields: "name,generic,exec,categories,keywords";*/
+/* drun-categories: ;*/
+/* drun-show-actions: false;*/
+/* drun-display-format: "{name} [({generic})]";*/
+/* drun-url-launcher: "xdg-open";*/
+/* disable-history: false;*/
+/* ignored-prefixes: "";*/
+/* sort: false;*/
+/* sorting-method: "normal";*/
+ case-sensitive: false;
+/* cycle: true;*/
+/* sidebar-mode: false;*/
+/* hover-select: false;*/
+/* eh: 1;*/
+/* auto-select: false;*/
+/* parse-hosts: false;*/
+/* parse-known-hosts: true;*/
+/* combi-modes: "window,run";*/
+/* matching: "normal";*/
+/* tokenize: true;*/
+/* m: "-5";*/
+/* filter: ;*/
+/* dpi: -1;*/
+/* threads: 0;*/
+/* scroll-method: 0;*/
+/* window-format: "{w} {c} {t}";*/
+/* click-to-exit: true;*/
+/* max-history-size: 25;*/
+/* combi-hide-mode-prefix: false;*/
+/* combi-display-format: "{mode} {text}";*/
+/* matching-negate-char: '-' /* unsupported */;*/
+/* cache-dir: ;*/
+/* window-thumbnail: false;*/
+/* drun-use-desktop-cache: false;*/
+/* drun-reload-desktop-cache: false;*/
+/* normalize-match: false;*/
+/* steal-focus: false;*/
+/* application-fallback-icon: ;*/
+/* refilter-timeout-limit: 8192;*/
+/* xserver-i300-workaround: false;*/
+/* pid: "/run/user/0/rofi.pid";*/
+/* display-window: ;*/
+/* display-windowcd: ;*/
+/* display-run: ;*/
+/* display-ssh: ;*/
+/* display-drun: ;*/
+/* display-combi: ;*/
+/* display-keys: ;*/
+/* display-filebrowser: ;*/
+/* kb-primary-paste: "Control+V,Shift+Insert";*/
+/* kb-secondary-paste: "Control+v,Insert";*/
+/* kb-clear-line: "Control+w";*/
+/* kb-move-front: "Control+a";*/
+/* kb-move-end: "Control+e";*/
+/* kb-move-word-back: "Alt+b,Control+Left";*/
+/* kb-move-word-forward: "Alt+f,Control+Right";*/
+/* kb-move-char-back: "Left,Control+b";*/
+/* kb-move-char-forward: "Right,Control+f";*/
+/* kb-remove-word-back: "Control+Alt+h,Control+BackSpace";*/
+/* kb-remove-word-forward: "Control+Alt+d";*/
+/* kb-remove-char-forward: "Delete,Control+d";*/
+/* kb-remove-char-back: "BackSpace,Shift+BackSpace,Control+h";*/
+/* kb-remove-to-eol: "Control+k";*/
+/* kb-remove-to-sol: "Control+u";*/
+/* kb-accept-entry: "Control+j,Control+m,Return,KP_Enter";*/
+/* kb-accept-custom: "Control+Return";*/
+/* kb-accept-custom-alt: "Control+Shift+Return";*/
+/* kb-accept-alt: "Shift+Return";*/
+/* kb-delete-entry: "Shift+Delete";*/
+/* kb-mode-next: "Shift+Right,Control+Tab";*/
+/* kb-mode-previous: "Shift+Left,Control+ISO_Left_Tab";*/
+/* kb-mode-complete: "Control+l";*/
+/* kb-row-left: "Control+Page_Up";*/
+/* kb-row-right: "Control+Page_Down";*/
+/* kb-row-up: "Up,Control+p";*/
+/* kb-row-down: "Down,Control+n";*/
+ kb-row-tab: "Control+space";
+ kb-element-next: "";
+/* kb-element-prev: "ISO_Left_Tab";*/
+/* kb-page-prev: "Page_Up";*/
+/* kb-page-next: "Page_Down";*/
+/* kb-row-first: "Home,KP_Home";*/
+/* kb-row-last: "End,KP_End";*/
+ kb-row-select: "Tab";
+/* kb-screenshot: "Alt+S";*/
+/* kb-ellipsize: "Alt+period";*/
+/* kb-toggle-case-sensitivity: "grave,dead_grave";*/
+/* kb-toggle-sort: "Alt+grave";*/
+/* kb-cancel: "Escape,Control+g,Control+bracketleft";*/
+/* kb-custom-1: "Alt+1";*/
+/* kb-custom-2: "Alt+2";*/
+/* kb-custom-3: "Alt+3";*/
+/* kb-custom-4: "Alt+4";*/
+/* kb-custom-5: "Alt+5";*/
+/* kb-custom-6: "Alt+6";*/
+/* kb-custom-7: "Alt+7";*/
+/* kb-custom-8: "Alt+8";*/
+/* kb-custom-9: "Alt+9";*/
+/* kb-custom-10: "Alt+0";*/
+/* kb-custom-11: "Alt+exclam";*/
+/* kb-custom-12: "Alt+at";*/
+/* kb-custom-13: "Alt+numbersign";*/
+/* kb-custom-14: "Alt+dollar";*/
+/* kb-custom-15: "Alt+percent";*/
+/* kb-custom-16: "Alt+dead_circumflex";*/
+/* kb-custom-17: "Alt+ampersand";*/
+/* kb-custom-18: "Alt+asterisk";*/
+/* kb-custom-19: "Alt+parenleft";*/
+/* kb-select-1: "Super+1";*/
+/* kb-select-2: "Super+2";*/
+/* kb-select-3: "Super+3";*/
+/* kb-select-4: "Super+4";*/
+/* kb-select-5: "Super+5";*/
+/* kb-select-6: "Super+6";*/
+/* kb-select-7: "Super+7";*/
+/* kb-select-8: "Super+8";*/
+/* kb-select-9: "Super+9";*/
+/* kb-select-10: "Super+0";*/
+/* ml-row-left: "ScrollLeft";*/
+/* ml-row-right: "ScrollRight";*/
+/* ml-row-up: "ScrollUp";*/
+/* ml-row-down: "ScrollDown";*/
+/* me-select-entry: "MousePrimary";*/
+/* me-accept-entry: "MouseDPrimary";*/
+/* me-accept-custom: "Control+MouseDPrimary";*/
+ timeout {
+ action: "kb-cancel";
+ delay: 0;
+ }
+ filebrowser {
+ directories-first: true;
+ sorting-method: "name";
+ }
+}
+@theme "/etc/xdg/rofi/launcher.rasi"
diff --git a/modules/optionnal/desktop/config/etc/xdg/rofi/disconnect.rasi b/modules/optionnal/desktop/config/etc/xdg/rofi/disconnect.rasi
new file mode 100644
index 0000000..884faec
--- /dev/null
+++ b/modules/optionnal/desktop/config/etc/xdg/rofi/disconnect.rasi
@@ -0,0 +1,12 @@
+@import "launcher.rasi"
+window {
+ width: 30%;
+ height: 280px;
+ margin: 0px;
+ location: center;
+ anchor: center;
+}
+
+mainbox {
+ children: [inputbar,listview];
+}
diff --git a/modules/optionnal/desktop/config/etc/xdg/rofi/launcher.rasi b/modules/optionnal/desktop/config/etc/xdg/rofi/launcher.rasi
new file mode 100644
index 0000000..2c11398
--- /dev/null
+++ b/modules/optionnal/desktop/config/etc/xdg/rofi/launcher.rasi
@@ -0,0 +1,123 @@
+/**
+ * ROFI Color theme
+ * User: Beastie
+ * Copyright: GPLv3
+ */
+
+@import "/etc/xdg/rofi/colors.rasi"
+
+* {
+ background-color: @transparent;
+ text-color: @blue;
+ margin: 5px;
+ padding: 0px;
+ border: 0px;
+ font: "CaskaydiaCove Nerd Font Propo 12";
+}
+
+window {
+ width: 50%;
+ height: 50%;
+ margin: 0px;
+ location: center;
+ anchor: center;
+ border: 2px;
+ border-color: @overlay0;
+ background-color: rgba(48, 52, 70, 0.8);
+ border-radius: 10px;
+ //background-color: green;
+}
+
+mainbox {
+ spacing: 0px;
+ border-radius: 10px;
+ children: [inputbar,mode-switcher,listview];
+ background-color: transparent;
+}
+
+/* Configure inputbar */
+inputbar {
+ background-color: transparent;
+ border: 1px;
+ border-color: @surface1;
+ border-radius: 10px;
+ children: [icon-current-entry,prompt,textbox-prompt-colon,entry,num-filtered-rows,textbox-num-sep,num-rows];
+}
+
+prompt, textbox-prompt-colon, entry, num-filtered-rows, textbox-num-sep, num-rows, icon-current-entry {
+ text-color: @blue;
+ vertical-align: 0.5;
+ background-color: transparent;
+}
+
+icon-current-entry {
+ size: 1.5em;
+}
+
+textbox-prompt-colon, textbox-num-sep {
+ expand: false;
+ str: " ";
+}
+
+textbox-num-sep {
+ str: "/";
+}
+
+entry {
+ placeholder: "Search";
+ placeholder-color: transparent;
+}
+
+/* Configure mode switcher */
+mode-switcher {
+ background-color: transparent;
+ border: 1px;
+ border-color: @surface1;
+ border-radius: 10px;
+}
+
+button {
+ background-color: transparent;
+ margin: 2px;
+ text-color: @blue;
+}
+
+button selected {
+ background-color: @blue;
+ text-color: @base;
+ border-radius: 10px;
+}
+
+/* Configure listview */
+listview {
+ padding: 10px;
+ background-color: transparent;
+ border: 1px;
+ border-color: @surface1;
+ border-radius: 10px;
+ columns: 2;
+}
+
+element {
+ background-color: transparent;
+ margin: 0px;
+}
+
+element selected {
+ background-color: @blue;
+ border-radius: 10px;
+}
+
+element-icon {
+ background-color: transparent;
+ size: 1.5em;
+}
+
+element-text {
+ vertical-align: 0.5;
+ background-color: transparent;
+}
+
+element-text selected {
+ text-color: @base;
+}
diff --git a/modules/optionnal/desktop/config/etc/xdg/scripts/update.sh b/modules/optionnal/desktop/config/etc/xdg/scripts/update.sh
new file mode 100644
index 0000000..fa98d0a
--- /dev/null
+++ b/modules/optionnal/desktop/config/etc/xdg/scripts/update.sh
@@ -0,0 +1,26 @@
+#!/usr/bin/env bash
+
+cd ~/nixos-dotfiles || exit
+
+# Obtenir le hash actuel
+current_hash=$(nix flake metadata --json 2>/dev/null | jq -r '.locks.nodes.nixpkgs.locked.rev')
+
+# Obtenir le hash le plus récent
+latest_hash=$(nix flake metadata github:NixOS/nixpkgs/nixos-unstable --json | jq -r '.locked.rev')
+
+# Date du commit local
+local_commit_date=$(nix flake metadata --json 2>/dev/null | jq -r '.locks.nodes.nixpkgs.locked.lastModified')
+local_commit_date=$(date -d "@${local_commit_date}" "+%d/%m/%Y à %H:%M")
+
+if [ "$current_hash" != "$latest_hash" ]; then
+ # Nombre de commits de retard
+ maj_count=$(curl -s "https://api.github.com/repos/NixOS/nixpkgs/compare/${current_hash}...${latest_hash}" | jq -r '.ahead_by // 0' 2>/dev/null || echo "?")
+
+ # Date du commit distant
+ remote_commit_date=$(curl -s https://api.github.com/repos/NixOS/nixpkgs/commits/c87b95e25065c028d31a94f06a62927d18763fdf | jq -r '.commit.author.date')
+ remote_commit_date=$(date -d "${remote_commit_date}" "+%d/%m/%Y à %H:%M")
+ printf '{"text": "%s ", "tooltip": "Commit distant : %s\\nCommit local : %s"}' "${maj_count}" "${remote_commit_date}" "${local_commit_date}"
+ # Compter les commits entre les deux
+else
+ printf '{"text": "0 ", "tooltip": "Date du dernier commit :\\n%s"}' "${local_commit_date}"
+fi
diff --git a/modules/optionnal/desktop/config/etc/xdg/waybar/colors.css b/modules/optionnal/desktop/config/etc/xdg/waybar/colors.css
new file mode 100644
index 0000000..c06b8fb
--- /dev/null
+++ b/modules/optionnal/desktop/config/etc/xdg/waybar/colors.css
@@ -0,0 +1,26 @@
+@define-color rosewater #f2d5cf;
+@define-color flamingo #eebebe;
+@define-color pink #f4b8e4;
+@define-color mauve #ca9ee6;
+@define-color red #e78284;
+@define-color maroon #ea999c;
+@define-color peach #ef9f76;
+@define-color yellow #e5c890;
+@define-color green #a6d189;
+@define-color teal #81c8be;
+@define-color sky #99d1db;
+@define-color sapphire #85c1dc;
+@define-color blue #8caaee;
+@define-color lavender #babbf1;
+@define-color text #c6d0f5;
+@define-color subtext1 #b5bfe2;
+@define-color subtext0 #a5adce;
+@define-color overlay2 #949cbb;
+@define-color overlay1 #838ba7;
+@define-color overlay0 #737994;
+@define-color surface2 #626880;
+@define-color surface1 #51576d;
+@define-color surface0 #414559;
+@define-color base #303446;
+@define-color mantle #292c3c;
+@define-color crust #232634;
diff --git a/modules/optionnal/desktop/config/etc/xdg/waybar/config.jsonc b/modules/optionnal/desktop/config/etc/xdg/waybar/config.jsonc
new file mode 100644
index 0000000..8944bf2
--- /dev/null
+++ b/modules/optionnal/desktop/config/etc/xdg/waybar/config.jsonc
@@ -0,0 +1,101 @@
+{
+ "position": "top",
+ "reload_style_on_change": true,
+ "modules-left": [
+ "custom/logo",
+ "cpu",
+ "memory",
+ "disk",
+ "network",
+ "pulseaudio",
+ ],
+ "modules-center": [
+ "hyprland/workspaces"
+ ],
+ "modules-right": [
+ "custom/maj",
+ "clock",
+ "tray"
+ ],
+ "custom/logo": {
+ "format": "{icon}",
+ "format-icons": {
+ "default": " "
+ }
+ },
+ "cpu": {
+ "format": " {usage}% ",
+ "tooltip": true
+ },
+ "memory": {
+ "format": " {percentage}% ",
+ "tooltip": true,
+ "tooltip-format": "asd: {used:0.2f} G / {total:0.2f} G"
+ },
+ "disk": {
+ "interval": 300,
+ "format": " {percentage_free}% ",
+ "path": "/"
+ },
+ "network": {
+ "format-wifi": " {essid} ",
+ "format-ethernet": " {ipaddr} ",
+ "tooltip-format": " {bandwidthUpBytes} {bandwidthDownBytes}",
+ "format-linked": " {ifname} (No IP) ",
+ "format-disconnected": " Disconnected ",
+ "format-alt": " {signalStrength}% ",
+ "interval": 1
+ },
+ "pulseaudio": {
+ "format": "{icon}{volume}% ",
+ "format-muted": " 0% ",
+ "format-icons": {
+ "headphone": " ",
+ "hands-free": " ",
+ "headset": " ",
+ "phone": " ",
+ "portable": " ",
+ "car": " ",
+ "default": [
+ " ",
+ " ",
+ " "
+ ]
+ },
+ "on-click-right": "pavucontrol -t 3",
+ "on-click": "pactl -- set-sink-mute 0 toggle",
+ "tooltip": false,
+ "tooltip-format": "{volume}%",
+ "scroll-step": 5.0,
+ },
+ "hyprland/workspaces": {
+ "disable-scroll": false,
+ "all-outputs": false,
+ "on-click": "activate",
+ "persistent-workspaces": {
+ "HDMI-A-1": [1, 2, 3, 4],
+ "HDMI-A-2": [5, 6, 7, 8],
+ },
+ "format": "{name}",
+ "format-icons": {
+ "default": "",
+ },
+ },
+ "custom/maj": {
+ "exec": "/etc/xdg/scripts/update.sh",
+ "interval": 300,
+ "return-type": "json",
+ "format": "{icon}{text}",
+ "format-icons": {
+ "default": " "
+ }
+ },
+ "clock": {
+ "format": " {:%a %d %H:%M} ",
+ "tooltip-format": "{:%Y %B}\n{calendar}"
+ },
+ "tray": {
+ "icon-size": 18,
+ "spacing": 6
+ }
+}
diff --git a/modules/optionnal/desktop/config/etc/xdg/waybar/style.css b/modules/optionnal/desktop/config/etc/xdg/waybar/style.css
new file mode 100644
index 0000000..b8b11f1
--- /dev/null
+++ b/modules/optionnal/desktop/config/etc/xdg/waybar/style.css
@@ -0,0 +1,116 @@
+@import "colors.css";
+
+* {
+ /*font-family: "Font Awesome 6 Free Solid", "Font Awesome 6 Free Regular", "Font Awesome 6 Brands Regular", "CaskaydiaCove Nerd Font Propo";*/
+ font-family: "CaskaydiaCove Nerd Font Propo";
+ font-size: 16px;
+ font-weight: bold;
+ min-height: 0px;
+ padding: 0;
+ margin: 0;
+}
+
+#waybar {
+ color: @text;
+ border: none;
+ box-shadow: none;
+ background-color: rgba(48, 52, 70, 0);
+}
+
+#custom-logo,
+#cpu,
+#memory,
+#disk,
+#network,
+#workspaces,
+#custom-maj,
+#pulseaudio,
+#memory,
+#clock,
+#tray {
+ border-radius: 10px;
+ background-color: rgba(48, 52, 70, 0.8);
+ margin: 10px 10px 0px 10px;
+ border: @overlay0 2px solid;
+}
+
+#custom-settings {
+ color: @pink;
+}
+
+#custom-lockscreen {
+ color: @green;
+}
+
+#workspaces {
+ padding: 0 5px;
+ min-width: 152px;
+}
+
+#workspaces button {
+ background-color: @overlay0;
+ margin: 5px 5px;
+ border-radius: 10px;
+}
+
+#workspaces button:hover,
+#workspaces button.empty:hover,
+#workspaces button.active:hover,
+#workspaces button.visible:hover,
+#workspaces button.urgent:hover {
+ background: @overlay2;
+ border: 0px solid @red;
+}
+
+#workspaces button label {
+ color: @teal;
+ opacity: 0;
+ padding: 1px 6px 0px 6px;
+ transition: padding 0.2s;
+}
+
+#workspaces button.visible label {
+ opacity: 1;
+ padding: 1px 20px;
+ transition: padding 0.2s;
+}
+
+#workspaces button.empty {
+ background: @surface0;
+}
+
+#workspaces button.active {
+ background: @overlay1;
+}
+
+#workspaces button.visible {
+ background: @overlay0;
+}
+
+#workspaces button.urgent {
+ background: @red;
+}
+
+#network {
+ color: @pink;
+}
+
+#pulseaudio {
+ color: @yellow;
+}
+
+#cpu {
+ color: @blue;
+}
+
+#memory {
+ color: @green;
+}
+
+#clock {
+ color: @red;
+}
+
+#tray {
+ padding: 0 8px 0 10px;
+}
diff --git a/modules/optionnal/desktop/config/qwerty-fr b/modules/optionnal/desktop/config/qwerty-fr
new file mode 100644
index 0000000..c055ffb
--- /dev/null
+++ b/modules/optionnal/desktop/config/qwerty-fr
@@ -0,0 +1,62 @@
+partial alphanumeric_keys
+xkb_symbols "qwerty-fr"
+{
+ include "us(basic)"
+ include "level3(ralt_switch)"
+
+ name[Group1]= "US keyboard with french symbols - AltGr combination";
+
+ key { [ grave, asciitilde, dead_grave, dead_tilde ] };
+ key { [ 1, exclam, onesuperior, exclamdown ] };
+ key { [ 2, at, twosuperior, dead_doubleacute ] };
+ key { [ 3, numbersign, ecircumflex, Ecircumflex ] };
+ key { [ 4, dollar, EuroSign, dead_currency ] }; // FIXME: dead_currency has a different mapping than the one we want for qwerty-fr. Need to define a custom dead key instead. See Windows layout for dead key definition.
+ key { [ 5, percent, dead_macron, dead_abovedot ] };
+ key { [ 6, asciicircum, dead_circumflex, dead_caron ] };
+ key { [ 7, ampersand, ucircumflex, Ucircumflex ] };
+ key { [ 8, asterisk, icircumflex, Icircumflex ] };
+ key { [ 9, parenleft, ocircumflex, Ocircumflex ] };
+ key { [ 0, parenright, oslash, Oslash ] };
+ key { [ minus, underscore, endash, emdash ] };
+ key { [ equal, plus, notequal, approxeq ] };
+
+ key { [ q, Q, acircumflex, Acircumflex ] };
+ key { [ w, W, eacute, Eacute ] };
+ key { [ e, E, egrave, Egrave ] };
+ key { [ r, R, registered, copyright ] };
+ key { [ t, T, thorn, THORN ] };
+ key { [ y, Y, dead_invertedbreve, dead_breve ] };
+ key { [ u, U, ugrave, Ugrave ] };
+ key { [ i, I, igrave, Igrave ] };
+ key { [ o, O, ograve, Ograve ] };
+ key { [ p, P, oe, OE ] };
+ key { [ bracketleft, braceleft, guillemotleft, leftdoublequotemark ] };
+ key { [ bracketright, braceright, guillemotright, rightdoublequotemark ] };
+
+ key { [ a, A, agrave, Agrave ] };
+ key { [ s, S, ae, AE ] };
+ key { [ d, D, ediaeresis, Ediaeresis ] };
+ key { [ f, F, VoidSymbol, VoidSymbol ] };
+ key { [ g, G, dead_greek, VoidSymbol ] }; // FIXME: dead_greek has a different mapping than the one we want for qwerty-fr. Need to define a custom dead key instead. See Windows layout for dead key definition.
+ key { [ h, H, ydiaeresis, Ydiaeresis ] };
+ key { [ j, J, udiaeresis, Udiaeresis ] };
+ key { [ k, K, idiaeresis, Idiaeresis ] };
+ key { [ l, L, odiaeresis, Odiaeresis ] };
+ key { [ semicolon, colon, dead_acute, dead_abovering ] };
+ key { [ apostrophe, quotedbl, dead_grave, dead_diaeresis ] };
+ key { [ backslash, bar, VoidSymbol, doublelowquotemark ] }; // „
+
+ key { [ less, greater, lessthanequal, greaterthanequal ] };
+ key { [ z, Z, adiaeresis, Adiaeresis ] };
+ key { [ x, X, multiply, division ] };
+ key { [ c, C, ccedilla, Ccedilla ] };
+ key { [ v, V, VoidSymbol, VoidSymbol ] };
+ key { [ b, B, ssharp, U1E9E ] }; // ß, ẞ (capital)
+ key { [ n, N, ntilde, Ntilde ] };
+ key { [ m, M, VoidSymbol, VoidSymbol ] };
+ key { [ comma, less, dead_cedilla, dead_ogonek ] };
+ key { [ period, greater, periodcentered, ellipsis ] }; // ., >, ·, …
+ key { [ slash, question, rightsinglequotemark, questiondown ] }; // /, ?, ’, ¿
+ key { [ space, space, nobreakspace, 0x100202F ] }; // espace insécable fine
+
+};
diff --git a/modules/optionnal/desktop/i3.nix b/modules/optionnal/desktop/i3.nix
new file mode 100644
index 0000000..e69de29
diff --git a/modules/optionnal/desktop/kitty.nix b/modules/optionnal/desktop/kitty.nix
new file mode 100644
index 0000000..bad6734
--- /dev/null
+++ b/modules/optionnal/desktop/kitty.nix
@@ -0,0 +1,35 @@
+{
+ pkgs,
+ ...
+}:
+{
+ environment.systemPackages = [
+ pkgs.kitty
+ pkgs.nitch
+
+ ];
+ environment = {
+ etc = {
+ "xdg/kitty".source = ./config/etc/xdg/kitty;
+ };
+ variables = {
+ VISUAL = "nvim";
+ BROWSER = "firefox";
+ };
+ };
+ programs = {
+ starship.enable = true;
+ bash = {
+ promptInit = ''
+ [[ "$TERM" == "xterm-kitty" ]] && export TERM="xterm"
+
+ [[ -f ${pkgs.nitch}/bin/nitch ]] && nitch
+
+ if [[ -z $DISPLAY ]] && [[ $(tty) = /dev/tty1 ]]; then
+ hyprland --config /etc/xdg/hypr/hyprland.conf
+ fi
+ '';
+ };
+ };
+
+}
diff --git a/modules/optionnal/desktop/nvidia.nix b/modules/optionnal/desktop/nvidia.nix
new file mode 100644
index 0000000..e69de29
diff --git a/modules/optionnal/desktop/packages.nix b/modules/optionnal/desktop/packages.nix
new file mode 100644
index 0000000..5ddc275
--- /dev/null
+++ b/modules/optionnal/desktop/packages.nix
@@ -0,0 +1,32 @@
+{
+ pkgs,
+ ...
+}:
+{
+ environment.systemPackages = [
+ pkgs.remmina
+ pkgs.mpv
+ pkgs.chromium
+ pkgs.firefox
+ pkgs.keepassxc
+ pkgs.nwg-look
+ pkgs.gimp
+ pkgs.teams-for-linux
+ pkgs.discord
+ pkgs.lxappearance
+ pkgs.libreoffice
+ pkgs.xfe
+ pkgs.catppuccin-gtk
+ pkgs.imagemagick
+ pkgs.gthumb
+ pkgs.papirus-icon-theme
+ pkgs.catppuccin-cursors
+ pkgs.catppuccin-gtk
+ ];
+ fonts.packages = [
+ pkgs.nerd-fonts.dejavu-sans-mono
+ pkgs.nerd-fonts.comic-shanns-mono
+ pkgs.nerd-fonts.roboto-mono
+ pkgs.nerd-fonts.caskaydia-cove
+ ];
+}
diff --git a/modules/optionnal/desktop/picom.nix b/modules/optionnal/desktop/picom.nix
new file mode 100644
index 0000000..e69de29
diff --git a/modules/optionnal/desktop/qwerty-fr.nix b/modules/optionnal/desktop/qwerty-fr.nix
new file mode 100644
index 0000000..a87b1de
--- /dev/null
+++ b/modules/optionnal/desktop/qwerty-fr.nix
@@ -0,0 +1,15 @@
+{
+ ...
+}:
+{
+ services.xserver = {
+ xkb = {
+ layout = "qwerty-fr";
+ extraLayouts.qwerty-fr = {
+ description = "QWERTY avec symboles et diacritiques français ";
+ languages = [ "eng" ];
+ symbolsFile = ./config/qwerty-fr;
+ };
+ };
+ };
+}
diff --git a/modules/optionnal/desktop/rofi.nix b/modules/optionnal/desktop/rofi.nix
new file mode 100644
index 0000000..2128e2d
--- /dev/null
+++ b/modules/optionnal/desktop/rofi.nix
@@ -0,0 +1,83 @@
+{
+ pkgs,
+ ...
+}:
+{
+ environment = {
+ etc = {
+ "xdg/rofi".source = ./config/etc/xdg/rofi;
+ "xdg/scripts/wayland-disconnect.sh" = {
+ text = ''
+ #!/usr/bin/env bash
+
+ selected=$(printf "Lock\0icon\x1fsystem-lock-screen
+ Update\0icon\x1fsystem-software-update
+ Shutdown\0icon\x1fsystem-shutdown
+ Reboot\0icon\x1fsystem-reboot
+ Exit hyprland\0icon\x1fsystem-log-out
+ Reload hyprland\0icon\x1fsystem-log-out" | ${pkgs.rofi-wayland}/bin/rofi -dmenu -show-icons -i -theme /etc/xdg/rofi/disconnect.rasi -p System)
+
+ echo "$selected"
+
+ case $selected in
+ "Lock")
+ ${pkgs.hyprlock}/bin/hyprlock
+ ;;
+ "Update")
+ kitty /usr/local/share/dotfiles/scripts/update.sh
+ ;;
+ "Shutdown")
+ systemctl poweroff
+ ;;
+ "Reboot")
+ reboot
+ ;;
+ "Exit hyprland")
+ hyprctl dispatch exit
+ ;;
+ "Reload hyprland")
+ hyprctl reload
+ ;;
+ esac
+ '';
+ mode = "0755";
+ };
+ "xdg/scripts/wayland-mpv.sh" = {
+ text = ''
+ #!/usr/bin/env bash
+
+ cd -- "$(dirname -- "$0")" || exit
+
+ ## if not $1
+ if [[ -z $1 ]]
+ then
+ _LINES=$(curl "http://10.0.0.1:2013" 2>/dev/null | sed -e "s|.*/dev/null | sed -e "s|.*