diff --git a/home/backgrounds/bird.jpg b/home/backgrounds/bird.jpg new file mode 100644 index 0000000..bdf4598 Binary files /dev/null and b/home/backgrounds/bird.jpg differ diff --git a/home/backgrounds/monkey.jpg b/home/backgrounds/monkey.jpg new file mode 100644 index 0000000..5668022 Binary files /dev/null and b/home/backgrounds/monkey.jpg differ diff --git a/home/home.nix b/home/home.nix new file mode 100644 index 0000000..35c01a6 --- /dev/null +++ b/home/home.nix @@ -0,0 +1,31 @@ +{ pkgs, lib, ... }: + +{ + # Home Manager state version + home.stateVersion = "25.11"; + + home.username = "avravels"; + home.homeDirectory = "/home/avravels"; + + imports = [ + ./other/fonts.nix + ./programs/bitwarden.nix + ./programs/kitty.nix + ./programs/zsh.nix + ./programs/direnv.nix + ./programs/firefox.nix + ./programs/tmux.nix + ./programs/git.nix + ./programs/libreoffice.nix + ./programs/nvim.nix + ./programs/ripgrep.nix + ./wm/rofi.nix + ./wm/cursor.nix + ./wm/dconf.nix + ./wm/gtk.nix + ./wm/waybar.nix + ./wm/hyprland.nix + ./wm/hyprpaper.nix + ]; + +} diff --git a/home/other/fonts.nix b/home/other/fonts.nix new file mode 100644 index 0000000..44d078b --- /dev/null +++ b/home/other/fonts.nix @@ -0,0 +1,13 @@ +{ pkgs, ... }: + +{ + fonts.fontconfig.enable = true; + + home.packages = with pkgs; [ + nerd-fonts.fira-code + nerd-fonts.droid-sans-mono + nerd-fonts.noto + nerd-fonts.hack + nerd-fonts.ubuntu + ]; +} diff --git a/home/programs/bitwarden.nix b/home/programs/bitwarden.nix new file mode 100644 index 0000000..e8b74f6 --- /dev/null +++ b/home/programs/bitwarden.nix @@ -0,0 +1,7 @@ +{ pkgs, ...}: + +{ + home.packages = [ + pkgs.bitwarden-desktop + ]; +} diff --git a/home/programs/direnv.nix b/home/programs/direnv.nix new file mode 100644 index 0000000..0028306 --- /dev/null +++ b/home/programs/direnv.nix @@ -0,0 +1,13 @@ +{ pkgs, config, ... }: + +{ + programs.direnv = { + enable = true; + enableZshIntegration = true; + nix-direnv.enable = true; + }; + + home.file.".config/direnv/direnvrc" = { + source = ./direnv/direnvrc; + }; +} diff --git a/home/programs/direnv/direnvrc b/home/programs/direnv/direnvrc new file mode 100644 index 0000000..d7950e3 --- /dev/null +++ b/home/programs/direnv/direnvrc @@ -0,0 +1,15 @@ +# Place in ~/.config/direnv/direnvrc + +# Two things to know: +# * `direnv_layour_dir` is called once for every {.direnvrc,.envrc} sourced +# * The indicator for a different direnv file being sourced is a different $PWD value +# This means we can hash $PWD to get a fully unique cache path for any given environment + +: ${XDG_CACHE_HOME:=$HOME/.cache} +declare -A direnv_layout_dirs +direnv_layout_dir() { + echo "${direnv_layout_dirs[$PWD]:=$( + echo -n "$XDG_CACHE_HOME"/direnv/layouts/ + echo -n "$PWD" | sha1sum | cut -d ' ' -f 1 + )}" +} diff --git a/home/programs/fastfetch/config.jsonc b/home/programs/fastfetch/config.jsonc new file mode 100644 index 0000000..83ffaca --- /dev/null +++ b/home/programs/fastfetch/config.jsonc @@ -0,0 +1,12 @@ +{ + "$schema": "https://github.com/fastfetch-cli/fastfetch/raw/master/doc/json_schema.json", + "modules": [ + "os", + "uptime", + "cpu", + "gpu", + "memory", + "swap", + "disk", + ] +} diff --git a/home/programs/firefox.nix b/home/programs/firefox.nix new file mode 100644 index 0000000..e3706a5 --- /dev/null +++ b/home/programs/firefox.nix @@ -0,0 +1,36 @@ +{ pkgs, ... }: + +{ + programs.firefox = { + enable = true; + + profiles.default = { + settings = { + "extensions.activeThemeID" = "firefox-compact-dark@mozilla.org"; + }; + }; + + policies = { + # From https://discourse.nixos.org/t/declare-firefox-extensions-and-settings/36265/17 + ExtensionSettings = with builtins; + let extension = shortId: uuid: { + name = uuid; + value = { + install_url = "https://addons.mozilla.org/en-US/firefox/downloads/latest/${shortId}/latest.xpi"; + installation_mode = "normal_installed"; + }; + }; + in listToAttrs [ + (extension "bitwarden-password-manager" "{446900e4-71c2-419f-a6a7-df9c091e268b}") + (extension "ublock-origin" "uBlock0@raymondhill.net") + (extension "privacy-badger17" "jid1-MnnxcxisBPnSXQ@jetpack") + (extension "i-dont-care-about-cookies" "jid1-KKzOGWgsW3Ao4Q@jetpack") + ]; + # To add additional extensions, find it on addons.mozilla.org, find + # the short ID in the url (like https://addons.mozilla.org/en-US/firefox/addon/!SHORT_ID!/) + # Then, download the XPI by filling it in to the install_url template, unzip it, + # run `jq .browser_specific_settings.gecko.id manifest.json` or + # `jq .applications.gecko.id manifest.json` to get the UUID + }; + }; +} diff --git a/home/programs/git.nix b/home/programs/git.nix new file mode 100644 index 0000000..6970a3d --- /dev/null +++ b/home/programs/git.nix @@ -0,0 +1,11 @@ +{ pkgs, ... } : + +{ + programs.git = { + enable = true; + settings.user = { + name = "Armel van Ravels"; + email = "armel@armel.nl"; + }; + }; +} diff --git a/home/programs/kitty.nix b/home/programs/kitty.nix new file mode 100644 index 0000000..6e3dba5 --- /dev/null +++ b/home/programs/kitty.nix @@ -0,0 +1,8 @@ +{ pkgs, ... }: + +{ + programs.kitty = { + enable = true; + settings.confirm_quit = false; + }; +} diff --git a/home/programs/libreoffice.nix b/home/programs/libreoffice.nix new file mode 100644 index 0000000..774d68a --- /dev/null +++ b/home/programs/libreoffice.nix @@ -0,0 +1,11 @@ +{ pkgs, ... }: + +{ + home.packages = with pkgs; [ + libreoffice + + hunspell + hunspellDicts.en_US + hunspellDicts.nl_NL + ]; +} diff --git a/home/programs/nvim.nix b/home/programs/nvim.nix new file mode 100644 index 0000000..d266d91 --- /dev/null +++ b/home/programs/nvim.nix @@ -0,0 +1,158 @@ +{ pkgs, ... }: + +{ + programs.neovim = { + enable = true; + extraLuaPackages = ps: [ ps.magick ]; + extraPackages = [ + pkgs.ueberzugpp + pkgs.imagemagick + ]; + + plugins = with pkgs.vimPlugins; [ + neo-tree-nvim + catppuccin-nvim + tokyonight-nvim + nvim-lspconfig + nvim-cmp + cmp-nvim-lsp + cmp-buffer + cmp-path + plenary-nvim + telescope-nvim + (nvim-treesitter.withAllGrammars) + vim-nix + lualine-nvim + image-nvim + ]; + + extraLuaConfig = '' + vim.cmd("colorscheme catppuccin-mocha") + -- Basic settings + vim.o.number = true + vim.o.relativenumber = true + + -- ========================= + -- LSP (Neovim 0.11+ way) + -- ========================= + + -- Add cmp capabilities + local capabilities = require("cmp_nvim_lsp").default_capabilities() + + vim.lsp.config("nil_ls", { + capabilities = capabilities, + }) + + -- PHP LSP + vim.lsp.config("intelephense", { + capabilities = capabilities, + }) + + vim.lsp.enable("intelephense") + + + vim.lsp.enable("nil_ls") + + -- ========================= + -- nvim-cmp + -- ========================= + + local cmp = require("cmp") + + cmp.setup({ + mapping = cmp.mapping.preset.insert({ + [""] = cmp.mapping.complete(), + [""] = cmp.mapping.confirm({ select = true }), + }), + sources = { + { name = "nvim_lsp" }, + { name = "buffer" }, + { name = "path" }, + } + }) + + -- ========================= + -- Telescope + -- ========================= + + local builtin = require("telescope.builtin") + vim.keymap.set("n", "ff", builtin.find_files, {}) + vim.keymap.set("n", "fg", builtin.live_grep, {}) + + -- ========================= + -- Lualine (status line with Git branch) + -- ========================= + require('lualine').setup { + options = { + theme = 'catppuccin', -- match your colorscheme + section_separators = {'', ''}, + component_separators = {'', ''}, + }, + sections = { + lualine_a = {'mode'}, + lualine_b = {'branch'}, -- shows Git branch here + lualine_c = {'filename'}, + lualine_x = {'encoding', 'fileformat', 'filetype'}, + lualine_y = {'progress'}, + lualine_z = {'location'} + } + } + + -- ========================= + -- image-nvim + -- ========================= + require("image").setup({ + backend = "ueberzug", -- or "ueberzug" or "sixel" + processor = "magick_cli", -- or "magick_rock" + integrations = { + markdown = { + enabled = true, + clear_in_insert_mode = false, + download_remote_images = true, + only_render_image_at_cursor = false, + only_render_image_at_cursor_mode = "popup", -- or "inline" + floating_windows = false, -- if true, images will be rendered in floating markdown windows + filetypes = { "markdown", "vimwiki" }, -- markdown extensions (ie. quarto) can go here + }, + asciidoc = { + enabled = true, + clear_in_insert_mode = false, + download_remote_images = true, + only_render_image_at_cursor = false, + only_render_image_at_cursor_mode = "popup", + floating_windows = false, + filetypes = { "asciidoc", "adoc" }, + }, + neorg = { + enabled = true, + filetypes = { "norg" }, + }, + rst = { + enabled = true, + }, + typst = { + enabled = true, + filetypes = { "typst" }, + }, + html = { + enabled = false, + }, + css = { + enabled = false, + }, + }, + max_width = nil, + max_height = nil, + max_width_window_percentage = nil, + max_height_window_percentage = 50, + scale_factor = 1.0, + window_overlap_clear_enabled = false, -- toggles images when windows are overlapped + window_overlap_clear_ft_ignore = { "cmp_menu", "cmp_docs", "snacks_notif", "scrollview", "scrollview_sign" }, + editor_only_render_when_focused = false, -- auto show/hide images when the editor gains/looses focus + tmux_show_only_in_active_window = false, -- auto show/hide images in the correct Tmux window (needs visual-activity off) + hijack_file_patterns = { "*.png", "*.jpg", "*.jpeg", "*.gif", "*.webp", "*.avif" }, -- render image files as images when opened + }) + + ''; + }; +} diff --git a/home/programs/ripgrep.nix b/home/programs/ripgrep.nix new file mode 100644 index 0000000..201b43e --- /dev/null +++ b/home/programs/ripgrep.nix @@ -0,0 +1,8 @@ +{ pkgs, ... }: + +{ + home.packages = with pkgs; [ + ripgrep + ]; +} + diff --git a/home/programs/tmux.nix b/home/programs/tmux.nix new file mode 100644 index 0000000..7b16262 --- /dev/null +++ b/home/programs/tmux.nix @@ -0,0 +1,5 @@ +{ pkgs, ... }: + +{ + programs.tmux.enable = true; +} diff --git a/home/programs/zsh.nix b/home/programs/zsh.nix new file mode 100644 index 0000000..317d5e5 --- /dev/null +++ b/home/programs/zsh.nix @@ -0,0 +1,19 @@ +{ pkgs, ... }: + +{ + home.file.".zsh/fastfetch.jsonc".source = + ./fastfetch/config.jsonc; + + programs.zsh = { + enable = true; + oh-my-zsh = { + enable = true; + theme = "agnoster"; + }; + + initContent = '' + # Use kitty's ssh helper if running inside kitty + [ "$TERM" = "xterm-kitty" ] && alias ssh="kitty +kitten ssh" + ''; + }; +} diff --git a/home/wm/cursor.nix b/home/wm/cursor.nix new file mode 100644 index 0000000..456a01d --- /dev/null +++ b/home/wm/cursor.nix @@ -0,0 +1,13 @@ +{ pkgs, ... }: + +{ + home.pointerCursor = { +# name = "Bibata-Modern-Ice"; # change to your cursor theme +# package = pkgs.bibata-cursors; + name = "Adwaita"; + package = pkgs.adwaita-icon-theme; + size = 24; + gtk.enable = true; + x11.enable = true; + }; +} diff --git a/home/wm/dconf.nix b/home/wm/dconf.nix new file mode 100644 index 0000000..6af3886 --- /dev/null +++ b/home/wm/dconf.nix @@ -0,0 +1,16 @@ +{ pkgs, ... }: + +{ + home.packages = with pkgs; [ + dconf + ]; + + dconf = { + enable = true; + settings = { + "org/gnome/desktop/interface" = { + color-scheme = "prefer-dark"; + }; + }; + }; +} diff --git a/home/wm/gtk.nix b/home/wm/gtk.nix new file mode 100644 index 0000000..c80c880 --- /dev/null +++ b/home/wm/gtk.nix @@ -0,0 +1,26 @@ +{ pkgs, ... }: + +{ + gtk = { + enable = true; + theme = { + name = "Orchis-dark"; + package = pkgs.orchis-theme; + }; + iconTheme = { + name = "Adwaita"; + package = pkgs.adwaita-icon-theme; + }; + cursorTheme = { + name = "Adwaita"; + package = pkgs.adwaita-icon-theme; + }; + }; + + home.sessionVariables = { + GTK_THEME = "Adwaita:dark"; # GTK apps dark theme + MOZ_GTK_THEME = "Adwaita:dark"; # Firefox respects this + GDK_DARK_THEME = "1"; # GTK4 apps dark mode + CHROME_FORCE_DARK_MODE = "1"; # Chromium / Chrome dark mode + }; +} diff --git a/home/wm/hyprland.nix b/home/wm/hyprland.nix new file mode 100644 index 0000000..b088967 --- /dev/null +++ b/home/wm/hyprland.nix @@ -0,0 +1,143 @@ +{ pkgs, ... }: + +{ + home.packages = with pkgs; [ + bzmenu + hyprshot + hyprlock + playerctl + speedcrunch + ]; + + wayland.windowManager.hyprland = { + enable = true; + + settings = { + ### MONITOR + monitor = [ + ",preferred,auto,1" + ]; + + ### VARIABLES + "$mod" = "SUPER"; + "$terminal" = "kitty"; + "$menu" = "rofi -show drun"; + "$bluetoothMenu" = "bzmenu --launcher rofi"; + "$files" = "rofi -show filebrowser"; + + ### BASIC LAYOUT + general = { + layout = "dwindle"; + resize_on_border = true; + }; + + decoration = { + inactive_opacity = 0.8; + active_opacity = 0.9; + rounding = 5; + rounding_power = 2.5; + blur = { + enabled = true; + brightness = 1.0; + contrast = 1.0; + noise = 0.01; + + vibrancy = 0.2; + vibrancy_darkness = 0.5; + + passes = 4; + size = 7; + + popups = true; + popups_ignorealpha = 0.2; + }; + + shadow = { + enabled = true; + color = "rgba(00000055)"; + ignore_window = true; + offset = "0 15"; + range = 100; + render_power = 2; + scale = 0.97; + }; + }; + + exec-once = [ + "waybar" + ]; + + ### INPUT + input = { + kb_layout = "us"; + }; + + ### KEYBINDINGS + bind = [ + # Apps + "$mod, RETURN, exec, $terminal" + "$mod, D, exec, $menu" + "$mod, B, exec, $bluetoothMenu" + "$mod, G, exec, $files" + "$mod, Q, killactive" + "$mod, F, fullscreen" + "$mod, M, exit" + "$mod, L, exec, hyprlock" + + # show/hide waybar + "$mod, W, exec, pkill -SIGUSR1 -f '^waybar$'" + + # Focus + "$mod, LEFT, movefocus, l" + "$mod, RIGHT, movefocus, r" + "$mod, UP, movefocus, u" + "$mod, DOWN, movefocus, d" + + # Workspaces + "$mod, 1, workspace, 1" + "$mod, 2, workspace, 2" + "$mod, 3, workspace, 3" + "$mod, 4, workspace, 4" + "$mod, 5, workspace, 5" + "$mod, 6, workspace, 6" + "$mod, 7, workspace, 7" + "$mod, 8, workspace, 8" + "$mod, 9, workspace, 9" + + "$mod SHIFT, 1, movetoworkspace, 1" + "$mod SHIFT, 2, movetoworkspace, 2" + "$mod SHIFT, 3, movetoworkspace, 3" + "$mod SHIFT, 4, movetoworkspace, 4" + "$mod SHIFT, 5, movetoworkspace, 5" + "$mod SHIFT, 6, movetoworkspace, 6" + "$mod SHIFT, 7, movetoworkspace, 7" + "$mod SHIFT, 8, movetoworkspace, 8" + "$mod SHIFT, 9, movetoworkspace, 9" + + # Window movement + "$mod SHIFT, LEFT, movewindow, l" + "$mod SHIFT, RIGHT, movewindow, r" + "$mod SHIFT, UP, movewindow, u" + "$mod SHIFT, DOWN, movewindow, d" + + # Hyprshot + "$mod, Z, exec, hyprshot -m region" + + # Media keys + ", XF86AudioPlay, exec, playerctl play-pause" + ", XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle" + ", XF86AudioRaiseVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+" + ", XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-" + ", XF86AudioNext, exec, playerctl next" + ", XF86AudioPrev, exec, playerctl previous" + + ", XF86Calculator, exec, speedcrunch" + ]; + + bindm = [ + "$mod, mouse:272, movewindow" + "$mod, mouse:273, resizewindow" + ]; + }; + }; +} diff --git a/home/wm/hyprpaper.nix b/home/wm/hyprpaper.nix new file mode 100644 index 0000000..f289901 --- /dev/null +++ b/home/wm/hyprpaper.nix @@ -0,0 +1,22 @@ +{ config, pkgs, ... }: + +let + wallpaper = builtins.toString ../backgrounds/monkey.jpg; + wallpaper2 = builtins.toString ../backgrounds/bird.jpg; +in +{ + services.hyprpaper = { + enable = true; + + settings = { + preload = [ + wallpaper + wallpaper2 + ]; + wallpaper = [ + "DP-2,${wallpaper2}" + ",${wallpaper}" + ]; + }; + }; +} diff --git a/home/wm/rofi.nix b/home/wm/rofi.nix new file mode 100644 index 0000000..fcb7c38 --- /dev/null +++ b/home/wm/rofi.nix @@ -0,0 +1,13 @@ +{ pkgs, ... }: + +{ + home.packages = [ + pkgs.rofi-file-browser + ]; + + programs.rofi = { + enable = true; + theme = "material"; + terminal = "${pkgs.kitty}/bin/kitty"; + }; +} diff --git a/home/wm/waybar.nix b/home/wm/waybar.nix new file mode 100644 index 0000000..f2f4960 --- /dev/null +++ b/home/wm/waybar.nix @@ -0,0 +1,67 @@ +{ pkgs, ... }: + +{ + programs.waybar = { + enable = true; + + style = builtins.readFile ./waybar/waybar-style.css; + + settings.mainBar = { + layer = "top"; + position = "top"; + height = 30; + + modules-left = [ + "hyprland/workspaces" + "mpris" + ]; + + modules-center = [ + "wlr/taskbar" + ]; + + modules-right = [ + "pulseaudio" + "cpu" + "tray" + "clock" + ]; + + pulseaudio = { + format = "{icon} {volume}%"; + format-muted = "󰝟 muted"; + tooltip = false; + + scroll-step = 5; + + format-icons = { + default = [ "󰕿" "󰖀" "󰕾" ]; + }; + + on-click = "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"; + }; + + mpris = { + player = "spotify"; + format = "{player_icon} {artist} - {title}"; + format-paused = "{player_icon} ⏸ {title}"; + tooltip = true; + ignored-players = [ "firefox" "vlc" ]; + }; + + cpu = { + format = " {usage}%"; + tooltip = false; + }; + + clock = { + tooltip = false; + }; + + "wlr/taskbar" = { + format = "{icon} {name}"; + on-click = "activate"; + }; + }; + }; +} diff --git a/home/wm/waybar/waybar-style.css b/home/wm/waybar/waybar-style.css new file mode 100644 index 0000000..5ca9459 --- /dev/null +++ b/home/wm/waybar/waybar-style.css @@ -0,0 +1,82 @@ +/* --------------------------- + Default Waybar Styling +--------------------------- */ + +* { + color: #ffffff; +} + + +menu { + background-color: #222222; + border-radius: 8px; + border: 1px solid #313244; +} + +menu menuitem { + padding: 6px 12px; + color: #cdd6f4; +} + +menu menuitem:hover { + background-color: #45475a; +} + +/* General bar */ +#waybar { + background-color: #222222; /* Default dark gray bar */ + color: #ffffff; /* Default text color */ +} + +/* Modules */ +.module { + margin: 0 4px; +} + +/* Hover effect (minimal) */ +.module:hover { + opacity: 0.8; +} + +/* Separators */ +.separator { + margin: 0 2px; +} + +#taskbar button { + background: transparent; + border: none; + box-shadow: none; +} + +#taskbar button:hover { + background-color: rgba(180, 190, 254, 0.15); + border-radius: 6px; +} + +#taskbar button.active { + background-color: rgba(180, 190, 254, 0.3); +} + +/* Workspace buttons */ +#workspaces button { + background: transparent; + border: none; + box-shadow: none; +} + +/* Hover */ +#workspaces button:hover { + background-color: rgba(180, 190, 254, 0.15); + border-radius: 6px; +} + +/* Active workspace */ +#workspaces button.active { + background-color: rgba(180, 190, 254, 0.35); +} + +/* Icons */ +i { + margin-right: 2px; +} diff --git a/systems/gandalf/default.nix b/systems/gandalf/default.nix index c5dbea6..7de9441 100644 --- a/systems/gandalf/default.nix +++ b/systems/gandalf/default.nix @@ -4,6 +4,7 @@ imports = [ ./hardware-configuration.nix + ../modules/home-manager.nix ../modules/common.nix ../modules/users.nix ../modules/locales.nix diff --git a/systems/modules/home-manager.nix b/systems/modules/home-manager.nix new file mode 100644 index 0000000..4024107 --- /dev/null +++ b/systems/modules/home-manager.nix @@ -0,0 +1,10 @@ +{ pkgs, ... }: + +{ + home-manager = { + useGlobalPkgs = true; + useUserPackages = true; + + users.avravels = import ../../home/home.nix; + }; +}