diff options
31 files changed, 1664 insertions, 801 deletions
diff --git a/README.md b/README.md new file mode 100644 index 0000000..d391a4c --- /dev/null +++ b/README.md @@ -0,0 +1,581 @@ +# NixOS Configuration Guide + +This NixOS configuration repository uses a modular, hierarchical import structure to manage system and home-manager configurations across multiple environments and desktop setups. + +## Table of Contents + +1. [Architecture Overview](#architecture-overview) +2. [Directory Structure](#directory-structure) +3. [How Import Wranglers Work](#how-import-wranglers-work) +4. [Switching Environments](#switching-environments) +5. [Configuration Layers](#configuration-layers) +6. [Modifying Configurations](#modifying-configurations) + +--- + +## Architecture Overview + +The configuration follows a **layered orchestrator pattern**: + +``` +flake.nix (entry point) + ↓ +configuration.nix (system orchestrator) + ├─ hardware-configuration.nix (hardware specifics) + ├─ modules/nixos/base/ (system-wide config) + │ └─ default.nix (orchestrator) + │ ├─ nix.nix + │ ├─ boot.nix + │ ├─ networking.nix + │ ├─ users.nix + │ ├─ services.nix + │ ├─ programs.nix + │ ├─ graphics.nix + │ └─ packages.nix + └─ modules/nixos/{i3wm,hyprland}/ (environment-specific) + +mun.nix (home-manager orchestrator) + ├─ modules/home/i3wm/default.nix (orchestrator) + │ ├─ dunst.nix + │ ├─ i3.nix + │ ├─ kitty.nix + │ ├─ neovim.nix + │ ├─ nnn.nix + │ ├─ picom.nix + │ ├─ polybar.nix + │ ├─ rofi.nix + │ ├─ scripts.nix + │ └─ xdg.nix + └─ modules/home/hyprland/default.nix (orchestrator) + └─ chernobyl/default.nix (orchestrator) + ├─ dunst.nix + ├─ fastfetch.nix + ├─ hyprland.nix + └─ kitty.nix +``` + +--- + +## Directory Structure + +``` +. +├── flake.nix # Flake inputs/outputs definition +├── flake.lock # Lock file for reproducibility +├── configuration.nix # Main system config (thin orchestrator) +├── hardware-configuration.nix # Hardware-specific config (generated) +├── mun.nix # Home-manager user config (orchestrator) +├── modules/ +│ ├── nixos/ +│ │ ├── base/ # Base system config (split modules) +│ │ │ ├── default.nix # Orchestrator: imports all base modules +│ │ │ ├── nix.nix # Nix settings, flakes, substituters +│ │ │ ├── boot.nix # Boot loader, kernel, Plymouth +│ │ │ ├── networking.nix # Hostname, NetworkManager, Bluetooth +│ │ │ ├── users.nix # User definitions +│ │ │ ├── services.nix # System services (SSH, Pipewire, Printing, Ly) +│ │ │ ├── programs.nix # System programs (Firefox, Zsh, Java, Steam) +│ │ │ ├── graphics.nix # GPU drivers, hardware acceleration +│ │ │ └── packages.nix # System-wide packages +│ │ ├── i3wm/ +│ │ │ └── default.nix # X11, i3 window manager config +│ │ └── hyprland/ +│ │ └── default.nix # Wayland, Hyprland config +│ └── home/ +│ ├── i3wm/ +│ │ ├── default.nix # Orchestrator: imports all i3wm home modules +│ │ ├── dunst.nix # Notification daemon (i3 config) +│ │ ├── i3.nix # i3 window manager config (keybinds, layout) +│ │ ├── kitty.nix # Terminal emulator (i3 config) +│ │ ├── neovim.nix # Text editor with LazyVim setup +│ │ ├── nnn.nix # File browser +│ │ ├── picom.nix # X11 compositor +│ │ ├── polybar.nix # Status bar (i3 specific) +│ │ ├── rofi.nix # Application launcher +│ │ ├── scripts.nix # Custom shell scripts +│ │ └── xdg.nix # XDG MIME type defaults +│ └── hyprland/ +│ ├── default.nix # Orchestrator: imports Hyprland rices +│ └── chernobyl/ # "Chernobyl" Hyprland rice +│ ├── default.nix # Orchestrator for chernobyl rice +│ ├── dunst.nix # Notification daemon (Hyprland config) +│ ├── fastfetch.nix # System info display +│ ├── hyprland.nix # Hyprland window manager config +│ └── kitty.nix # Terminal emulator (Hyprland config) +``` + +--- + +## How Import Wranglers Work + +An "import wrangler" is a `default.nix` file that acts as a **local aggregator**, collecting all related configurations into one place for easy management. This pattern appears at multiple levels: + +### Level 1: Base System Configuration + +**File:** `modules/nixos/base/default.nix` + +```nix +{ ... }: + +{ + imports = [ + ./nix.nix + ./boot.nix + ./networking.nix + ./users.nix + ./services.nix + ./programs.nix + ./graphics.nix + ./packages.nix + ]; + + system.stateVersion = "25.11"; +} +``` + +**Purpose:** Groups all foundational system configurations (boot, networking, users, services, packages) into a single import point. When you need to add a base system feature, you either: +- Add it to an existing module file +- Create a new module (e.g., `firewall.nix`) and add it to this import list + +**Benefits:** +- Single import in `configuration.nix`: `./modules/nixos/base` +- All base modules are in one place; easy to see what's included +- New base modules are simply added to the imports list + +### Level 2: Environment-Specific System Configuration + +**Files:** `modules/nixos/i3wm/default.nix`, `modules/nixos/hyprland/default.nix` + +These are currently thin wrappers but follow the same pattern. To extend them (e.g., add environment-specific services or packages), you would create sub-modules: + +```nix +# Example expansion of modules/nixos/i3wm/default.nix +{ ... }: + +{ + imports = [ + ./xserver.nix # X11-specific settings + ./i3.nix # i3 window manager + ./keyboard.nix # Czech keyboard layout + ]; +} +``` + +### Level 3: Home-Manager Orchestration + +**File:** `modules/home/i3wm/default.nix` + +```nix +{ ... }: + +{ + imports = [ + ./dunst.nix + ./i3.nix + ./kitty.nix + ./neovim.nix + ./nnn.nix + ./picom.nix + ./polybar.nix + ./rofi.nix + ./scripts.nix + ./xdg.nix + ]; +} +``` + +**Purpose:** All i3wm-specific home-manager modules (dunst, i3 keybinds, polybar, etc.) are collected here. This is imported once in `mun.nix`, rather than importing 10 separate files. + +**Benefits:** +- One line in `mun.nix`: `./modules/home/i3wm/default.nix` +- All i3 home configs are clearly grouped +- Easy to switch entire environments with a single comment/uncomment + +### Level 4: Multi-Rice Support (Hyprland) + +**File:** `modules/home/hyprland/default.nix` + +```nix +{ ... }: + +{ + imports = [ + #./default.nix # main hyprland rice (future) + ./chernobyl/default.nix # chernobyl hyprland rice + ]; +} +``` + +**File:** `modules/home/hyprland/chernobyl/default.nix` + +```nix +{ ... }: + +{ + imports = [ + ./dunst.nix + ./fastfetch.nix + ./hyprland.nix + ./kitty.nix + ]; +} +``` + +**Purpose:** Supports multiple visual rices/themes for the same window manager. The parent orchestrator selects which rice to use. + +**Benefits:** +- Scale to many rices easily (add `./cyberpunk/default.nix`, `./nord/default.nix`, etc.) +- Each rice has its own folder with consistent structure +- Switch rices by commenting/uncommenting in the parent orchestrator + +--- + +## Switching Environments + +### Switch from i3wm to Hyprland + +Edit **two files**: + +#### 1. System Configuration (`configuration.nix`) + +```nix +{ config, lib, pkgs, ... }: + +{ + imports = [ + ./hardware-configuration.nix + ./modules/nixos/base + + # === Environment Choice === + # Uncomment one of the following to select your environment: + #./modules/nixos/i3wm # ← comment this + ./modules/nixos/hyprland # ← uncomment this + ]; +} +``` + +#### 2. Home-Manager Configuration (`mun.nix`) + +```nix +{ config, lib, pkgs, ... }: + +{ + imports = [ + #./modules/home/i3wm/default.nix # ← comment this + ./modules/home/hyprland/default.nix # ← uncomment this + ]; + + # ... rest of mun.nix +} +``` + +#### 3. Rebuild + +```bash +sudo nixos-rebuild switch +``` + +--- + +## Configuration Layers + +The configuration is organized in **four distinct layers**: + +### 1. **System-Wide Base (`modules/nixos/base/`)** + +Applied to **all environments**. + +**Includes:** +- Nix settings (flakes, substituters) +- Boot configuration (GRUB, EFI, kernel) +- Networking (hostname, NetworkManager, Bluetooth) +- Users (mun user definition) +- System services (SSH, Pipewire, Printing, Ly display manager) +- System programs (Firefox, Zsh, Java, Steam) +- Graphics drivers (Intel VAAPI, hardware acceleration) +- System packages (Neovim, Git, TeX Live, RetroArch, etc.) + +**Modify by:** Editing existing files in `base/` or creating new ones and adding them to `base/default.nix`. + +### 2. **Environment-Specific System (`modules/nixos/{i3wm,hyprland}/`)** + +Applied to **one environment at a time** (X11 vs Wayland). + +**i3wm includes:** +- X11 enable +- i3 window manager +- Keyboard layout (Czech) +- Display manager session + +**Hyprland includes:** +- X11 disable +- Hyprland enable +- XDG portal for Wayland +- Qt6 Wayland support +- Keyboard layout (Czech) + +**Modify by:** Editing the respective `default.nix` or creating sub-modules. + +### 3. **Home-Manager User-Wide Config (`mun.nix`)** + +Configuration applied to user `mun` only. + +**Includes:** +- SSH setup +- Shell configuration (Zsh with oh-my-zsh) +- Environment variables +- Gnome-keyring service +- User packages (Rust tools, Discord, utilities) +- Environment-specific home-manager orchestrator import + +**Modify by:** Editing `mun.nix` directly or adding packages to the `packages` list. + +### 4. **Environment-Specific Home-Manager (`modules/home/{i3wm,hyprland}/`)** + +Applied to **one environment at a time**. + +**i3wm includes:** +- i3 keybindings and layout +- Polybar status bar +- Dunst notifications +- Picom compositor +- Rofi launcher +- NeoVim with LazyVim +- Kitty terminal +- Custom scripts +- XDG MIME type defaults + +**Hyprland (chernobyl rice) includes:** +- Hyprland config +- Dunst notifications +- Kitty terminal +- Fastfetch system info + +**Modify by:** Editing the respective module files or adding new ones to the orchestrator `default.nix`. + +--- + +## Modifying Configurations + +### Add a New System Package + +**File:** `modules/nixos/base/packages.nix` + +```nix +environment.systemPackages = with pkgs; [ + # ... existing packages ... + my-new-package # ← add here +]; +``` + +### Add a New Base System Service + +**File:** `modules/nixos/base/services.nix` or create `modules/nixos/base/firewall.nix` + +If adding firewall rules, create a new file: + +```nix +# modules/nixos/base/firewall.nix +{ config, lib, pkgs, ... }: + +{ + networking.firewall.allowedTCPPorts = [ 80 443 ]; +} +``` + +Then add to orchestrator: + +```nix +# modules/nixos/base/default.nix +{ ... }: + +{ + imports = [ + ./nix.nix + ./boot.nix + ./networking.nix + ./users.nix + ./services.nix + ./programs.nix + ./graphics.nix + ./packages.nix + ./firewall.nix # ← add here + ]; + + system.stateVersion = "25.11"; +} +``` + +### Add an i3wm Home-Manager Module + +**File:** `modules/home/i3wm/my-new-config.nix` + +```nix +{ config, pkgs, ... }: + +{ + # Your home-manager config here +} +``` + +Then add to orchestrator: + +```nix +# modules/home/i3wm/default.nix +{ ... }: + +{ + imports = [ + ./dunst.nix + ./i3.nix + # ... other modules ... + ./my-new-config.nix # ← add here + ]; +} +``` + +### Add a New Hyprland Rice + +Create a new directory: + +```bash +mkdir modules/home/hyprland/cyberpunk +``` + +Add files: + +```nix +# modules/home/hyprland/cyberpunk/default.nix +{ ... }: + +{ + imports = [ + ./dunst.nix + ./hyprland.nix + ./kitty.nix + ]; +} +``` + +Update parent orchestrator: + +```nix +# modules/home/hyprland/default.nix +{ ... }: + +{ + imports = [ + #./default.nix + ./chernobyl/default.nix + #./cyberpunk/default.nix # ← uncomment to use + ]; +} +``` + +--- + +## Rebuilding Your System + +After making changes: + +```bash +# Switch to new system configuration +sudo nixos-rebuild switch + +# Or, test first (doesn't activate) +sudo nixos-rebuild test + +# Show what changed +sudo nixos-rebuild dry-run +``` + +To edit and rebuild in one step: + +```bash +# If you have the 'edit' alias from mun.nix +edit +sudo nixos-rebuild switch +``` + +--- + +## Key Principles + +1. **One Import Per Layer:** Each `default.nix` orchestrator imports related modules, reducing clutter in parent files. + +2. **Separation of Concerns:** System config (nixos/) is separate from user config (home/); base is separate from environment-specific. + +3. **Easy Environment Switching:** Change environments by commenting one line in `configuration.nix` and `mun.nix`. + +4. **Scalability:** Adding new features (base services, home modules, rices) follows a consistent pattern of creating a file + adding it to the orchestrator. + +5. **Clarity:** Each file has a clear purpose; finding where to modify something is straightforward. + +--- + +## Example Workflow + +### Goal: Add Firefox configuration to i3wm + +1. Create `modules/home/i3wm/firefox.nix`: + ```nix + { config, pkgs, ... }: + + { + programs.firefox = { + enable = true; + profiles.mun = { + settings = { + "browser.startup.homepage" = "about:home"; + }; + }; + }; + } + ``` + +2. Add to orchestrator in `modules/home/i3wm/default.nix`: + ```nix + imports = [ + ./dunst.nix + ./firefox.nix # ← add here + ./i3.nix + # ... rest + ]; + ``` + +3. Rebuild: + ```bash + sudo nixos-rebuild switch + ``` + +Done! Firefox is now configured for the i3wm environment. + +--- + +## Troubleshooting + +### "Module not found" error + +Check that all imports in `default.nix` files reference correct file paths. Use absolute paths from the module directory: +- `./nix.nix` ✓ (correct) +- `../base/nix.nix` ✓ (correct, relative to parent) +- `/absolute/path/nix.nix` ✗ (avoid; use relative) + +### Environment not loading after switch + +Ensure **both** `configuration.nix` and `mun.nix` have the same environment enabled (not one i3wm and one hyprland). + +### Syntax errors in .nix files + +Use `nix flake check` to validate: +```bash +nix flake check +``` + +--- + +## References + +- [NixOS Manual - Configuration](https://nixos.org/manual/nixos/stable/) +- [Home Manager Manual](https://nix-community.github.io/home-manager/) +- [Nix Language](https://nixos.wiki/wiki/Nix_language) diff --git a/configuration.nix b/configuration.nix index 2271492..e3cb894 100755 --- a/configuration.nix +++ b/configuration.nix @@ -1,268 +1,15 @@ { config, lib, pkgs, ... }: -let - get_spotify_status = pkgs.writeShellScript "get_spotify_status.sh" '' - #!/bin/bash - PARENT_BAR="example" - PARENT_BAR_PID=$(pgrep -a "polybar" | grep "$PARENT_BAR" | cut -d" " -f1) - PLAYER="playerctld" - FORMAT="{{ title }} - {{ artist }}" - - update_hooks() { - while IFS= read -r id; do - polybar-msg -p "$id" hook spotify-play-pause $2 1>/dev/null 2>&1 - done < <(echo "$1") - } - - PLAYERCTL_STATUS=$(playerctl --player=$PLAYER status 2>/dev/null) - EXIT_CODE=$? - - if [ $EXIT_CODE -eq 0 ]; then - STATUS=$PLAYERCTL_STATUS - else - STATUS="No player is running" - fi - - if [ "$1" == "--status" ]; then - echo "$STATUS" - else - if [ "$STATUS" = "Stopped" ]; then - echo "Music Stopped" - elif [ "$STATUS" = "Paused" ]; then - update_hooks "$PARENT_BAR_PID" 2 - playerctl --player=$PLAYER metadata --format "$FORMAT" - elif [ "$STATUS" = "No player is running" ]; then - echo "Music Off" - else - update_hooks "$PARENT_BAR_PID" 1 - playerctl --player=$PLAYER metadata --format "$FORMAT" - fi - fi - ''; - - hidePolybarInFullscreen = pkgs.writeShellScript "hidePolybarInFullscreen.sh" '' - #!/usr/bin/env bash - sleep 1 - i3-msg -t subscribe -m '[ "window" ]' | while read -r event; do - if echo "$event" | grep -q '"fullscreen_mode":[[:space:]]*1'; then - polybar-msg cmd hide - elif echo "$event" | grep -q '"fullscreen_mode":[[:space:]]*0'; then - polybar-msg cmd show - fi - done - ''; -in { imports = [ ./hardware-configuration.nix - ]; - - nix.settings = { - substituters = [ - "https://cache.nixos.org/" - ]; - - trusted-public-keys = [ - "cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY=" - ]; - experimental-features = [ - "nix-command" - "flakes" - ]; - }; - - - # === System Settings === - boot = { - kernelPackages = pkgs.linuxPackages_latest; - initrd = { - kernelModules = [ "i915" ]; - systemd.enable = true; - }; - loader = { - # Hide the OS choice for bootloaders. - # It's still possible to open the bootloader list by pressing any key - # It will just not appear on screen unless a key is pressed - timeout = 0; - - efi = { - canTouchEfiVariables = true; - efiSysMountPoint = "/boot"; - }; - grub = { - enable = false; - device = "nodev"; - useOSProber = true; - efiSupport = true; - }; - systemd-boot = { - enable = true; - consoleMode = "keep"; - configurationLimit = 5; - }; - }; - plymouth = { - enable = true; - theme = "deus_ex"; - themePackages = with pkgs; [ - # By default we would install all themes - (adi1090x-plymouth-themes.override { - selected_themes = [ "deus_ex" ]; - }) - ]; - logo = pkgs.fetchurl { - url = "https://external-content.duckduckgo.com/iu/?u=https%3A%2F%2Fcdn.icon-icons.com%2Ficons2%2F2699%2FPNG%2F512%2Fnixos_logo_icon_170910.png&f=1&nofb=1&ipt=71345d68f1fc864748db54e81111d5853a24fba1d39bdee7cc6fda3e58181bc0"; - sha256 = "sha256-fr1ZnKdX9EeXl2eTIrxEd17DkVKZL8BV9RGmluSgFfk="; - }; - extraConfig = '' - DeviceScale=1 - ''; - }; - - # Enable "Silent boot" - consoleLogLevel = 3; - initrd.verbose = false; - kernelParams = [ - "quiet" - "splash" - "udev.log_level=3" - "systemd.show_status=auto" - ]; - }; - networking.hostName = "kronos"; - networking.networkmanager.enable = true; - - fileSystems."/boot".options = [ "fmask=0077" "dmask=0077" ]; - - hardware.bluetooth = { - enable = true; - powerOnBoot = true; - settings = { - General = { - Experimental = true; - Enable = "Source,Sink,Media,Socket"; - AutoConnect = true; - FastConnectabke = true; - }; - Policy.AutoEnable = true; - }; - }; - - security.pam.sshAgentAuth.enable = true; - -# In your configuration.nix -environment.variables = { - JAVA_HOME = "${pkgs.jdk17}/lib/openjdk"; # adjust path based on version -}; - - time.timeZone = "Europe/Prague"; - - services.xserver = { - wacom.enable = true; - enable = true; - windowManager.i3 = { - enable = true; - extraPackages = with pkgs; [ polybar i3lock-fancy-rapid ]; - }; - - }; - - services.displayManager.defaultSession = "none+i3"; - services.displayManager.ly = { - enable = true; - }; - services.xserver.xkb.layout = "cz"; - services.xserver.xkb.options = "eurosign:e,caps:escape"; - - services.printing.enable = true; - services.pipewire = { enable = true; pulse.enable = true; }; - services.libinput.enable = true; - - users.users = { - mun = { - isNormalUser = true; - extraGroups = [ "wheel" "bluetooth" "networkmanager" "kvm" "nixos" ]; - packages = with pkgs; [ tree ]; - shell = pkgs.zsh; - }; - }; - - programs.firefox.enable = true; - programs.zsh.enable = true; - nixpkgs.config.allowUnfree = true; - - environment.systemPackages = with pkgs; [ - neovim wget stdenv tree-sitter discord kitty xfce.thunar thunderbird - flameshot libreoffice spotify tor-browser alsa-utils helvum - blueman bluez cava i3status i3lock-fancy-rapid xss-lock polybar - rofi feh clipman tree git lazygit killall acpi wirelesstools - brightnessctl fastfetch auto-cpufreq btop cargo gnome-boxes - clippy xclip texstudio godotPackages_4_5.godot - clang tree-sitter ripgrep fd unzip lua-language-server stylua - rust-analyzer rustfmt cargo rustc zathura krita - ruff vtsls pyright imagemagick ghostscript ruff python314 ly - prismlauncher vlc lua53Packages.luarocks mermaid-cli lua nil obsidian - wine bottles comic-mono playerctl zscroll espeak qbittorrent perl bzip2 - libresprite audacity libgcc celestia lutris vscodium peazip vscode - - (texlive.combine { - inherit (texlive) scheme-full; - notestex = texlivePackages.notestex; - }) - - - (retroarch.withCores (cores: with cores; [ - # --- NES --- # - fceumm - - # --- GBA --- # - mgba - - # --- GB / GBC --- # - gambatte - sameboy - ])) + ./modules/nixos/base + # === Environment Choice === + # Uncomment one of the following to select your environment: + ./modules/nixos/i3wm + #./modules/nixos/hyprland ]; - - fonts = { - enableDefaultPackages = true; - packages = with pkgs; [ fira-code noto-fonts noto-fonts-color-emoji blackout beon]; - }; - - programs.steam = { - enable = true; - remotePlay.openFirewall = true; # Open ports in the firewall for Steam Remote Play - dedicatedServer.openFirewall = true; # Open ports in the firewall for Source Dedicated Server - localNetworkGameTransfers.openFirewall = true; # Open ports in the firewall for Steam Local Network Game Transfers - }; - - # enable Java support - programs.java = { - enable = true; - package = pkgs.jdk17; # or pkgs.jdk11, pkgs.jdk8, whatever you need - }; - - services.xserver.videoDrivers = [ "intel" ]; - - hardware.graphics = { - enable = true; - extraPackages = with pkgs; [ - intel-vaapi-driver # for video acceleration on Intel - intel-media-driver - intel-compute-runtime - mesa - ]; - }; - - - - services.openssh.enable = true; - - - - system.stateVersion = "25.11"; - } diff --git a/hardware-configuration.nix b/hardware-configuration.nix index 8419d66..0dc8341 100755 --- a/hardware-configuration.nix +++ b/hardware-configuration.nix @@ -1,11 +1,11 @@ -# Do not modify this file! It was generated by ‘nixos-generate-config’ +# 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") + imports = [ + (modulesPath + "/installer/scan/not-detected.nix") ]; boot.initrd.availableKernelModules = [ "xhci_pci" "nvme" "usb_storage" "sd_mod" ]; diff --git a/modules/home/hyprland/chernobyl/default.nix b/modules/home/hyprland/chernobyl/default.nix new file mode 100644 index 0000000..68ffecc --- /dev/null +++ b/modules/home/hyprland/chernobyl/default.nix @@ -0,0 +1,10 @@ +{ ... }: + +{ + imports = [ + ./dunst.nix + ./fastfetch.nix + ./hyprland.nix + ./kitty.nix + ]; +}
\ No newline at end of file diff --git a/modules/home/hyprland/chernobyl/dunst.nix b/modules/home/hyprland/chernobyl/dunst.nix new file mode 100644 index 0000000..b51a4a8 --- /dev/null +++ b/modules/home/hyprland/chernobyl/dunst.nix @@ -0,0 +1,44 @@ +{ pkgs, ... }: + +{ + services.dunst = { + enable = true; + settings = let + colors = { + foreground = "#d0b6fd"; + background = "#1c182d"; + alert = "#7b91fc"; + }; + in { + global = { + width = "(200,300)"; + height = "(0,150)"; + offset = "(30,50)"; + origin = "bottom-right"; + transparency = 10; + frame_width = 0; + font = "Fira Code 10"; + }; + + urgency_low = { + background = colors.background; + foreground = colors.foreground; + timeout = 8; + }; + + urgency_normal = { + background = colors.background; + foreground = colors.foreground; + frame-size = "0"; + timeout = 10; + }; + + urgency_critical = { + background = colors.background; + foreground = colors.foreground; + frame-size = "5"; + frame-color = colors.alert; + }; + }; + }; +}
\ No newline at end of file diff --git a/modules/home/hyprland/chernobyl/fastfetch.nix b/modules/home/hyprland/chernobyl/fastfetch.nix new file mode 100644 index 0000000..1e90196 --- /dev/null +++ b/modules/home/hyprland/chernobyl/fastfetch.nix @@ -0,0 +1,83 @@ +{ pkgs, ... }: + +{ + programs.fastfetch = { + enable = true; + extraConfig = '' +{ + "$schema": "https://github.com/fastfetch-cli/fastfetch/raw/dev/doc/json_schema.json", + "logo": { + "padding": { "top": 2 }, + "type": "small" + }, + "display": { + "separator": " -> " + }, + "modules": [ + "break", + { + "type": "title", + "keyWidth": 10, + "format": " {6}{7}{8}" + }, + { + "type": "custom", + "format": " ─────────────────────────── " + }, + { + "type": "kernel", + "key": " ", + "keyColor": "yellow" + }, + { + "type": "command", + "key": " ", + "keyColor": "blue", + "text": "echo Jakoolit: v$DOTS_VERSION" + }, + { + "type": "wm", + "key": " ", + "keyColor": "magenta" + }, + { + "type": "shell", + "key": " ", + "keyColor": "yellow" + }, + { + "type": "terminal", + "key": " ", + "keyColor": "blue" + }, + { + "type": "memory", + "key": " ", + "keyColor": "magenta", + "format": "{1} / {2}" + }, + { + "type": "uptime", + "key": " ", + "keyColor": "green" + }, + { + "type": "command", + "key": " ", + "keyColor": "magenta", + "text": "echo $(( ($(date +%s) - $(stat -c %W /)) / 86400 )) days" + }, + { + "type": "custom", + "format": " ─────────────────────────── " + }, + { + "type": "custom", + "format": " \u001b[31m \u001b[32m \u001b[33m \u001b[34m \u001b[35m \u001b[36m \u001b[37m \u001b[90m " + }, + "break" + ] +} + ''; + }; +} diff --git a/modules/home/hyprland/chernobyl/hyprland.nix b/modules/home/hyprland/chernobyl/hyprland.nix new file mode 100644 index 0000000..8712df9 --- /dev/null +++ b/modules/home/hyprland/chernobyl/hyprland.nix @@ -0,0 +1,7 @@ +{ pkgs, ... }: + +{ + programs.hyprland = { + enable = true; + }; +}
\ No newline at end of file diff --git a/modules/home/hyprland/chernobyl/kitty.nix b/modules/home/hyprland/chernobyl/kitty.nix new file mode 100644 index 0000000..11d4054 --- /dev/null +++ b/modules/home/hyprland/chernobyl/kitty.nix @@ -0,0 +1,7 @@ +{ pkgs, ... }: + +{ + programs.kitty = { + enable = true; + }; +}
\ No newline at end of file diff --git a/modules/home/hyprland/default.nix b/modules/home/hyprland/default.nix new file mode 100644 index 0000000..b54f464 --- /dev/null +++ b/modules/home/hyprland/default.nix @@ -0,0 +1,10 @@ +{ ... }: + +{ + # Hyprland home-manager configuration orchestrator + # Uncomment one of the rices below: + imports = [ + #./default.nix # main hyprland rice + ./chernobyl/default.nix # chernobyl hyprland rice + ]; +} diff --git a/modules/home/i3wm/default.nix b/modules/home/i3wm/default.nix new file mode 100644 index 0000000..c861b04 --- /dev/null +++ b/modules/home/i3wm/default.nix @@ -0,0 +1,17 @@ +{ ... }: + +{ + # i3wm home-manager configuration orchestrator + imports = [ + ./dunst.nix + ./i3.nix + ./kitty.nix + ./neovim.nix + ./nnn.nix + ./picom.nix + ./polybar.nix + ./rofi.nix + ./scripts.nix + ./xdg.nix + ]; +}
\ No newline at end of file diff --git a/modules/home/i3wm/dunst.nix b/modules/home/i3wm/dunst.nix new file mode 100644 index 0000000..6f217d9 --- /dev/null +++ b/modules/home/i3wm/dunst.nix @@ -0,0 +1,45 @@ +{ config, pkgs, lib, ... }: + +{ + services.dunst = { + enable = true; + + settings = let + colors = { + foreground = "#d0b6fd"; + background = "#1c182d"; + alert = "#7b91fc"; + }; + in { + global = { + width = "(200,300)"; + height = "(0,150)"; + offset = "(30,50)"; + origin = "bottom-right"; + transparency = 10; + frame_width = 0; + font = "Fira Code 10"; + }; + + urgency_low = { + background = colors.background; + foreground = colors.foreground; + timeout = 8; + }; + + urgency_normal = { + background = colors.background; + foreground = colors.foreground; + frame-size = "0"; + timeout = 10; + }; + + urgency_critical = { + background = colors.background; + foreground = colors.foreground; + frame-size = "5"; + frame-color = colors.alert; + }; + }; + }; +}
\ No newline at end of file diff --git a/modules/home/i3wm/i3.nix b/modules/home/i3wm/i3.nix new file mode 100644 index 0000000..35ce6de --- /dev/null +++ b/modules/home/i3wm/i3.nix @@ -0,0 +1,130 @@ +{ config, pkgs, lib, ... }: + +{ + xsession.windowManager.i3 = { + enable = true; + config.bars = []; + + extraConfig = '' + # i3 config + set $mod Mod4 + font pango:Fira Code 10 + + exec --no-startup-id dex-autostart --autostart --environment i3 + exec --no-startup-id xss-lock --transfer-sleep-lock -- i3lock-fancy-rapid 5 3 --nofork + exec --no-startup-id nm-applet + exec --no-startup-id blueman-applet + exec_always --no-startup-id sh -c "sleep 1 && picom --config ~/.config/picom/picom.conf" + exec --no-startup-id -merge ~/.Xresources + exec_always --no-startup-id feh --bg-scale ~/Pictures/wallpapers/vox.jpg + exec_always --no-startup-id sh -c "killall -q polybar; sleep 1; polybar example --config=~/.config/polybar/config.ini &" + exec_always --no-startup-id polybar-hide-on-fullscreen + exec --no-startup-id flameshot + + gaps top 60 + + bindsym XF86MonBrightnessDown exec brightnessctl set 10%- + bindsym XF86MonBrightnessUp exec brightnessctl set +10% + bindsym XF86AudioMute exec amixer set Master toggle + bindsym XF86AudioLowerVolume exec amixer set Master 5%- + bindsym XF86AudioRaiseVolume exec amixer set Master 5%+ + bindsym XF86AudioMicMute exec amixer set Capture toggle + + floating_modifier $mod + + bindsym $mod+Shift+s exec flameshot gui + bindsym $mod+Return exec kitty + bindsym $mod+Control+l exec --no-startup-id i3lock-fancy-rapid 5 3 + bindsym $mod+m exec rofi -show drun + bindsym $mod+Shift+m exec kitty nnn + bindsym $mod+n exec firefox + bindsym $mod+Shift+q kill + + bindsym $mod+j focus left + bindsym $mod+k focus down + bindsym $mod+l focus up + bindsym $mod+uring focus right + + bindsym $mod+Shift+j move left + bindsym $mod+Shift+k move down + bindsym $mod+Shift+l move up + bindsym $mod+Shift+uring move right + + bindsym $mod+h split h + bindsym $mod+v split v + bindsym $mod+f fullscreen toggle + bindsym $mod+s layout stacking + bindsym $mod+w layout tabbed + bindsym $mod+e layout toggle split + bindsym $mod+Shift+space floating toggle + bindsym $mod+space focus mode_toggle + bindsym $mod+a focus parent + + set $ws1 "1" + set $ws2 "2" + set $ws3 "3" + set $ws4 "4" + set $ws5 "5" + set $ws6 "6" + set $ws7 "7" + set $ws8 "8" + set $ws9 "9" + set $ws10 "10" + + bindsym $mod+plus workspace number $ws1 + bindsym $mod+ecaron workspace number $ws2 + bindsym $mod+scaron workspace number $ws3 + bindsym $mod+ccaron workspace number $ws4 + bindsym $mod+rcaron workspace number $ws5 + bindsym $mod+zcaron workspace number $ws6 + bindsym $mod+yacute workspace number $ws7 + bindsym $mod+aacute workspace number $ws8 + bindsym $mod+iacute workspace number $ws9 + bindsym $mod+eacute workspace number $ws10 + + bindsym $mod+Shift+plus move container to workspace number $ws1 + bindsym $mod+Shift+ecaron move container to workspace number $ws2 + bindsym $mod+Shift+scaron move container to workspace number $ws3 + bindsym $mod+Shift+ccaron move container to workspace number $ws4 + bindsym $mod+Shift+rcaron move container to workspace number $ws5 + bindsym $mod+Shift+zcaron move container to workspace number $ws6 + bindsym $mod+Shift+yacute move container to workspace number $ws7 + bindsym $mod+Shift+aacute move container to workspace number $ws8 + bindsym $mod+Shift+iacute move container to workspace number $ws9 + bindsym $mod+Shift+eacute move container to workspace number $ws10 + + bindsym $mod+Shift+c reload + bindsym $mod+Shift+r restart + bindsym $mod+Shift+e exec "i3-nagbar -t warning -m 'You pressed the exit shortcut. Do you really want to exit i3? This will end your X session.' -B 'Yes, exit i3' 'i3-msg exit'" + + mode "resize" { + bindsym j resize shrink width 5 px or 5 ppt + bindsym k resize grow height 5 px or 5 ppt + bindsym l resize shrink height 5 px or 5 ppt + bindsym uring resize grow width 5 px or 5 ppt + + bindsym Left resize shrink width 5 px or 5 ppt + bindsym Down resize grow height 5 px or 5 ppt + bindsym Up resize shrink height 5 px or 5 ppt + bindsym Right resize grow width 5 px or 5 ppt + + bindsym Return mode "default" + bindsym Escape mode "default" + bindsym $mod+r mode "default" + } + + bindsym $mod+r mode "resize" + + client.focused #FFFFFF #FFFFFF #FFFFFF #FFFFFF #b12cbf + client.focused_inactive #8C8C8C #4C4C4C #FFFFFF #4C4C4C #FFFFFF + client.unfocused #4C4C4C #222222 #888888 #292D2E #500096 + client.urgent #EC69A0 #DB3279 #FFFFFF #DB3279 #DB3279 + client.placeholder #000000 #0C0C0C #FFFFFF #000000 #FFFFFF + client.background #FFFFFF + + default_border pixel 3 + default_floating_border pixel 3 + hide_edge_borders smart + ''; + }; +}
\ No newline at end of file diff --git a/modules/home/i3wm/kitty.nix b/modules/home/i3wm/kitty.nix new file mode 100644 index 0000000..17b220d --- /dev/null +++ b/modules/home/i3wm/kitty.nix @@ -0,0 +1,45 @@ +{ config, pkgs, lib, ... }: + +{ + programs.kitty = { + enable = true; + extraConfig = '' + confirm_os_window_close 0 + font_family Fira Code + bold_font Fira Code Bold + italic_font Fira Code Light + shell_integration no-cursor + cursor_shape beam + window_padding_width 7 + window_padding_height 10 + scrollback_lines 3000 + font_size 11 + map ctrl+shift+plus change_font_size all +1.0 + map ctrl+shift+minus change_font_size all -1.0 + background_opacity 0.7 + + cursor #AC82E9 + selection_background #d8cab8 + selection_foreground #141216 + background #141216 + foreground #d8cab8 + + color0 #2b2135 + color8 #92fcfa + color1 #fc4649 + color9 #fc4649 + color2 #c4e881 + color10 #c4e881 + color3 #AC82E9 + color11 #AC82E9 + color4 #7b91fc + color12 #7b91fc + color5 #f3fc7b + color13 #f3fc7b + color6 #8F56E1 + color14 #8F56E1 + color7 #fc92fc + color15 #d8cab8 + ''; + }; +}
\ No newline at end of file diff --git a/modules/home/i3wm/neovim.nix b/modules/home/i3wm/neovim.nix new file mode 100644 index 0000000..e59fd3d --- /dev/null +++ b/modules/home/i3wm/neovim.nix @@ -0,0 +1,101 @@ +{ pkgs, ... }: + +{ + programs.neovim = { + enable = true; + defaultEditor = true; + viAlias = true; + vimAlias = true; + withNodeJs = true; + + # +ANT FIX + plugins = []; # disable HM plugin processing + + extraLuaConfig = '' + -- LazyVim bootstrap + local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" + if not vim.loop.fs_stat(lazypath) then + vim.fn.system({ + "git", "clone", "--filter=blob:none", + "https://github.com/folke/lazy.nvim.git", + "--branch=stable", lazypath, + }) + end + vim.opt.rtp:prepend(lazypath) + + require("lazy").setup({ + spec = { + { "LazyVim/LazyVim", import = "lazyvim.plugins" }, + { import = "lazyvim.plugins.extras.lang.tex" }, + { import = "lazyvim.plugins.extras.lang.markdown" }, + { import = "lazyvim.plugins.extras.ui.mini-animate" }, + { import = "lazyvim.plugins.extras.lang.typescript" }, + { import = "lazyvim.plugins.extras.lang.python" }, + { import = "lazyvim.plugins.extras.lang.rust" }, + { import = "lazyvim.plugins.extras.lang.nix" }, + + { + "lervag/vimtex", + lazy = false, + init = function() + vim.g.vimtex_view_method = "zathura" + end + }, + + { + "MeanderingProgrammer/render-markdown.nvim", + opts = { + enabled = true, + file_types = { "markdown", "rmd" }, + colorscheme = "default", + }, + dependencies = { + "nvim-treesitter/nvim-treesitter", + "nvim-tree/nvim-web-devicons", + }, + }, + + { "mracos/mermaid.vim", ft = { "mermaid" } }, + }, + + defaults = { lazy = false, version = false }, + checker = { enabled = true }, + + performance = { + rtp = { + disabled_plugins = { + "gzip", "tarPlugin", "tohtml", + "tutor", "zipPlugin", + }, + }, + }, + }) + + -- LaTeX wrapping + vim.api.nvim_create_autocmd("FileType", { + pattern = "tex", + callback = function() + vim.opt_local.wrap = true + vim.opt_local.linebreak = true + vim.opt_local.breakindent = true + vim.opt_local.breakindentopt = "shift:2" + vim.opt_local.textwidth = 0 + end, + }) + + -- Disable diagnostics in markdown + vim.api.nvim_create_autocmd("FileType", { + pattern = "markdown", + callback = function() + vim.diagnostic.disable(0) + end, + }) + + -- Nix LSP + local lspconfig = require("lspconfig") + lspconfig.nil_ls.setup({ cmd = { "nil" } }) + + vim.opt.clipboard = "unnamedplus" + ''; + }; +}
\ No newline at end of file diff --git a/modules/home/i3wm/nnn.nix b/modules/home/i3wm/nnn.nix new file mode 100644 index 0000000..74b7dcb --- /dev/null +++ b/modules/home/i3wm/nnn.nix @@ -0,0 +1,7 @@ +{ pkgs, ... }: +{ + programs.nnn = { + enable = true; + package = pkgs.nnn.override { withNerdIcons = true; }; + }; +}
\ No newline at end of file diff --git a/modules/home/i3wm/picom.nix b/modules/home/i3wm/picom.nix new file mode 100644 index 0000000..d5f460f --- /dev/null +++ b/modules/home/i3wm/picom.nix @@ -0,0 +1,24 @@ +{ config, pkgs, lib, ... }: + +{ + services.picom = { + enable = true; + backend = "glx"; + vSync = true; + inactiveOpacity = 0.9; + activeOpacity = 1.0; + fade = true; + fadeSteps = [ 0.09 0.09 ]; + fadeDelta = 5; + shadow = true; + shadowOffsets = [ 12 12 ]; + shadowOpacity = 0.5; + shadowExclude = [ + "class_g = 'Polybar'" + "name = 'Polybar'" + ]; + settings = { + corner-radius = 15; + }; + }; +}
\ No newline at end of file diff --git a/modules/home/i3wm/polybar.nix b/modules/home/i3wm/polybar.nix new file mode 100644 index 0000000..95130cf --- /dev/null +++ b/modules/home/i3wm/polybar.nix @@ -0,0 +1,181 @@ +{ config, pkgs, lib, ... }: + + +{ + services.polybar = { + enable = true; + + extraConfig = let + colors = { + background = "#1c182d"; + background-alt = "#2b1b3d"; + foreground = "#d0b6fd"; + primary = "#cfb5fd"; + secondary = "#8a78b0"; + alert = "#7b91fc"; + disabled = "#707880"; + }; + in '' + [bar/example] + width = 98% + height = 30pt + radius = 15 + offset-x = 1% + offset-y = 1% + override-redirect = true + fixed-center = true + enable-ipc = true + + background = ${colors.background} + foreground = ${colors.foreground} + + line-size = 4pt + border-size = Opt + border-color = #00000000 + + padding-left = 1 + padding-right = 1 + module-margin = 1 + + separator = | + separator-foreground = ${colors.disabled} + + font-0 = fira code;2 + + modules-left = xworkspaces spotify spotify-prev spotify-play-pause spotify-next + modules-center = date + modules-right = filesystem memory cpu pulseaudio-devices wlan xkeyboard battery + + [module/systray] + type = internal/tray + format-margin = 8pt + tray-spacing = 16pt + + [module/xworkspaces] + type = internal/xworkspaces + label-active = %name% + label-active-background = ${colors.background-alt} + label-active-underline = ${colors.primary} + label-active-padding = 1 + label-occupied = %name% + label-occupied-padding = 1 + label-urgent = %name% + label-urgent-background = ${colors.alert} + label-urgent-padding = 1 + label-empty = %name% + label-empty-foreground = ${colors.disabled} + label-empty-padding = 1 + + [module/xwindow] + type = internal/xwindow + label = %title:0:60:...% + + [module/filesystem] + type = internal/fs + interval = 25 + mount-0 = / + label-mounted = %{F#F0C674}%mountpoint%%{F-} %percentage_used%% + label-unmounted = %mountpoint% not mounted + label-unmounted-foreground = ${colors.disabled} + + [module/pulseaudio] + type = internal/pulseaudio + format-volume-prefix = "VOL " + format-volume-prefix-foreground = ${colors.primary} + format-volume = <label-volume> + label-volume = %percentage%% + label-muted = muted + label-muted-foreground = ${colors.disabled} + + [module/xkeyboard] + type = internal/xkeyboard + blacklist-0 = num lock + label-layout = %layout% + label-layout-foreground = ${colors.primary} + label-indicator-padding = 2 + label-indicator-margin = 1 + label-indicator-foreground = ${colors.background} + label-indicator-background = ${colors.secondary} + + [module/memory] + type = internal/memory + interval = 2 + format-prefix = "RAM " + format-prefix-foreground = ${colors.primary} + label = %percentage_used:2%% + + [module/cpu] + type = internal/cpu + interval = 2 + format-prefix = "CPU " + format-prefix-foreground = ${colors.primary} + label = %percentage:2%% + + [network-base] + type = internal/network + interval = 5 + format-connected = <label-connected> + format-disconnected = <label-disconnected> + label-disconnected = %{F#F0C674}%ifname%%{F#707880} disconnected + + [module/wlan] + inherit = network-base + interface-type = wireless + label-connected = %{F#F0C674}%ifname%%{F-} %essid% + + [module/eth] + inherit = network-base + interface-type = wired + label-connected = %{F#F0C674}%ifname%%{F-} + + [module/date] + type = internal/date + interval = 1 + date = %H:%M + date-alt = %Y-%m-%d %H:%M:%S + label = %date% + label-foreground = ${colors.primary} + + [settings] + screenchange-reload = true + pseudo-transparency = true + + [module/battery] + type = internal/battery + full-at = 100 + low-at = 15 + battery = BAT0 + adapter = ADP1 + poll-interval = 5 + + [module/spotify] + type = custom/script + tail = true + interval = 1 + format-prefix = "♫" + format = <label> + exec = get-spotify-status + + [module/spotify-prev] + type = custom/script + exec = echo "◀◀" + format = <label> + click-left = playerctl previous -p spotify + + [module/spotify-play-pause] + type = custom/ipc + hook-0 = echo "▶" + hook-1 = echo "▶" + initial = 1 + click-left = playerctl play-pause -p spotify + + [module/spotify-next] + type = custom/script + exec = echo "▶▶" + format = <label> + click-left = playerctl next -p spotify + ''; + + script = "polybar example --config=~/.config/polybar/config.ini &"; + }; +}
\ No newline at end of file diff --git a/modules/home/i3wm/rofi.nix b/modules/home/i3wm/rofi.nix new file mode 100644 index 0000000..9332efd --- /dev/null +++ b/modules/home/i3wm/rofi.nix @@ -0,0 +1,13 @@ +{ pkgs, ... }: + +{ + programs.rofi = { + enable = true; + location = "center"; + cycle = true; + theme = "purple"; + terminal = "${pkgs.kitty}/bin/kitty"; + modes = [ "drun" "ssh" "emoji" "calc" ]; + plugins = with pkgs; [ rofi-emoji rofi-calc ]; + }; +}
\ No newline at end of file diff --git a/modules/home/i3wm/scripts.nix b/modules/home/i3wm/scripts.nix new file mode 100644 index 0000000..4eb0b61 --- /dev/null +++ b/modules/home/i3wm/scripts.nix @@ -0,0 +1,31 @@ +{ pkgs, ... }: + +{ + home.packages = [ + (pkgs.writeShellScriptBin "get-spotify-status" '' + PARENT_BAR="example" + PLAYER="playerctld" + FORMAT="{{ title }} - {{ artist }}" + + PLAYERCTL_STATUS=$(playerctl --player=$PLAYER status 2>/dev/null) + + if [ "$PLAYERCTL_STATUS" = "Playing" ]; then + playerctl --player=$PLAYER metadata --format "$FORMAT" + elif [ "$PLAYERCTL_STATUS" = "Paused" ]; then + echo "Paused" + else + echo "No music" + fi + '') + + (pkgs.writeShellScriptBin "polybar-hide-on-fullscreen" '' + i3-msg -t subscribe -m '[ "window" ]' | while read -r event; do + if echo "$event" | grep -q '"fullscreen_mode":[[:space:]]*1'; then + polybar-msg cmd hide + elif echo "$event" | grep -q '"fullscreen_mode":[[:space:]]*0'; then + polybar-msg cmd show + fi + done + '') + ]; +}
\ No newline at end of file diff --git a/modules/home/i3wm/xdg.nix b/modules/home/i3wm/xdg.nix new file mode 100644 index 0000000..7590ea8 --- /dev/null +++ b/modules/home/i3wm/xdg.nix @@ -0,0 +1,16 @@ +{ pkgs, ... }: + +{ + xdg = { + enable = true; + + mimeApps = { + enable = true; + defaultApplications = { + "text/plain" = [ "nvim.desktop" ]; + "text/markdown" = [ "nvim.desktop" ]; + "text/x-markdown" = [ "nvim.desktop" ]; + }; + }; + }; +}
\ No newline at end of file diff --git a/modules/nixos/base/boot.nix b/modules/nixos/base/boot.nix new file mode 100644 index 0000000..a9aaff1 --- /dev/null +++ b/modules/nixos/base/boot.nix @@ -0,0 +1,46 @@ +{ config, lib, pkgs, ... }: + +{ + boot = { + kernelPackages = pkgs.linuxPackages_latest; + initrd = { + kernelModules = [ "i915" ]; + systemd.enable = true; + }; + loader = { + efi = { + canTouchEfiVariables = true; + efiSysMountPoint = "/boot"; + }; + grub = { + enable = true; + device = "nodev"; + useOSProber = true; + efiSupport = true; + }; + systemd-boot = { + enable = false; + consoleMode = "keep"; + configurationLimit = 5; + }; + }; + plymouth = { + enable = false; + theme = "deus_ex"; + themePackages = with pkgs; [ + (adi1090x-plymouth-themes.override { + selected_themes = [ "deus_ex" ]; + }) + ]; + logo = pkgs.fetchurl { + url = "https://external-content.duckduckgo.com/iu/?u=https%3A%2F%2Fcdn.icon-icons.com%2Ficons2%2F2699%2FPNG%2F512%2Fnixos_logo_icon_170910.png&f=1&nofb=1&ipt=71345d68f1fc864748db54e81111d5853a24fba1d39bdee7cc6fda3e58181bc0"; + sha256 = "sha256-fr1ZnKdX9EeXl2eTIrxEd17DkVKZL8BV9RGmluSgFfk="; + }; + extraConfig = '' + DeviceScale=1 + ''; + }; + }; + + fileSystems."/boot".options = [ "fmask=0077" "dmask=0077" ]; +} diff --git a/modules/nixos/base/default.nix b/modules/nixos/base/default.nix new file mode 100644 index 0000000..2a70d3b --- /dev/null +++ b/modules/nixos/base/default.nix @@ -0,0 +1,16 @@ +{ ... }: + +{ + imports = [ + ./nix.nix + ./boot.nix + ./networking.nix + ./users.nix + ./services.nix + ./programs.nix + ./graphics.nix + ./packages.nix + ]; + + system.stateVersion = "25.11"; +} diff --git a/modules/nixos/base/graphics.nix b/modules/nixos/base/graphics.nix new file mode 100644 index 0000000..e2913fe --- /dev/null +++ b/modules/nixos/base/graphics.nix @@ -0,0 +1,19 @@ +{ config, lib, pkgs, ... }: + +{ + services.xserver.videoDrivers = [ "intel" ]; + + hardware.graphics = { + enable = true; + extraPackages = with pkgs; [ + intel-vaapi-driver + intel-media-driver + intel-compute-runtime + mesa + ]; + }; + + environment.variables = { + JAVA_HOME = "${pkgs.jdk17}/lib/openjdk"; + }; +} diff --git a/modules/nixos/base/networking.nix b/modules/nixos/base/networking.nix new file mode 100644 index 0000000..9d3a293 --- /dev/null +++ b/modules/nixos/base/networking.nix @@ -0,0 +1,20 @@ +{ config, lib, pkgs, ... }: + +{ + networking.hostName = "kronos"; + networking.networkmanager.enable = true; + + hardware.bluetooth = { + enable = true; + powerOnBoot = true; + settings = { + General = { + Experimental = true; + Enable = "Source,Sink,Media,Socket"; + AutoConnect = true; + FastConnectabke = true; + }; + Policy.AutoEnable = true; + }; + }; +} diff --git a/modules/nixos/base/nix.nix b/modules/nixos/base/nix.nix new file mode 100644 index 0000000..87e93f4 --- /dev/null +++ b/modules/nixos/base/nix.nix @@ -0,0 +1,17 @@ +{ config, lib, pkgs, ... }: + +{ + nix.settings = { + substituters = [ + "https://cache.nixos.org/" + ]; + + trusted-public-keys = [ + "cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY=" + ]; + experimental-features = [ + "nix-command" + "flakes" + ]; + }; +} diff --git a/modules/nixos/base/packages.nix b/modules/nixos/base/packages.nix new file mode 100644 index 0000000..fedccd5 --- /dev/null +++ b/modules/nixos/base/packages.nix @@ -0,0 +1,124 @@ +{ config, lib, pkgs, ... }: + +{ + nixpkgs.config.allowUnfree = true; + + environment.systemPackages = with pkgs; [ + # === Core Development Tools === + neovim + wget + stdenv + tree-sitter + git + lazygit + killall + acpi + + # === CLI Utilities === + tree + ripgrep + fd + unzip + bzip2 + perl + + # === System Monitoring === + btop + auto-cpufreq + + # === Audio/Media === + alsa-utils + helvum + playerctl + zscroll + + # === Bluetooth & Wireless === + blueman + bluez + wirelesstools + + # === Display & Graphics === + feh + flameshot + xss-lock + brightnessctl + imagemagick + ghostscript + + # === Text/Document Tools === + thunderbird + libreoffice + texstudio + zathura + krita + libresprite + audacity + + # === Network & Utilities === + tor-browser + clipman + xclip + qbittorrent + + # === Development Languages & Compilers === + clang + lua-language-server + stylua + nil + lua53Packages.luarocks + mermaid-cli + lua + + # === Language Servers & Formatters === + ruff + vtsls + pyright + python314 + + # === System Packages === + ly + + # === Gaming & Emulation === + godotPackages_4_5.godot + prismlauncher + vlc + + # === Creative & Editors === + obsidian + vscodium + vscode + peazip + celestia + + # === Wine/Compatibility === + wine + bottles + comic-mono + libgcc + espeak + lutris + + # === Miscellaneous === + gnome-boxes + xfce.thunar + + # === TeX Live === + (texlive.combine { + inherit (texlive) scheme-full; + notestex = texlivePackages.notestex; + }) + + # === RetroArch with Cores === + (retroarch.withCores (cores: with cores; [ + fceumm + mgba + gambatte + sameboy + ])) + ]; + + fonts = { + enableDefaultPackages = true; + packages = with pkgs; [ fira-code noto-fonts noto-fonts-color-emoji blackout beon]; + }; +} diff --git a/modules/nixos/base/programs.nix b/modules/nixos/base/programs.nix new file mode 100644 index 0000000..15853ee --- /dev/null +++ b/modules/nixos/base/programs.nix @@ -0,0 +1,17 @@ +{ config, lib, pkgs, ... }: + +{ + programs.firefox.enable = true; + programs.zsh.enable = true; + programs.java = { + enable = true; + package = pkgs.jdk17; + }; + + programs.steam = { + enable = true; + remotePlay.openFirewall = true; + dedicatedServer.openFirewall = true; + localNetworkGameTransfers.openFirewall = true; + }; +} diff --git a/modules/nixos/base/services.nix b/modules/nixos/base/services.nix new file mode 100644 index 0000000..b005d8c --- /dev/null +++ b/modules/nixos/base/services.nix @@ -0,0 +1,16 @@ +{ config, lib, pkgs, ... }: + +{ + security.pam.sshAgentAuth.enable = true; + + time.timeZone = "Europe/Prague"; + + services.displayManager.ly = { + enable = true; + }; + + services.printing.enable = true; + services.pipewire = { enable = true; pulse.enable = true; }; + services.libinput.enable = true; + services.openssh.enable = true; +} diff --git a/modules/nixos/base/users.nix b/modules/nixos/base/users.nix new file mode 100644 index 0000000..c2db993 --- /dev/null +++ b/modules/nixos/base/users.nix @@ -0,0 +1,12 @@ +{ config, lib, pkgs, ... }: + +{ + users.users = { + mun = { + isNormalUser = true; + extraGroups = [ "wheel" "bluetooth" "networkmanager" "kvm" "nixos" ]; + packages = with pkgs; [ tree ]; + shell = pkgs.zsh; + }; + }; +} diff --git a/modules/nixos/hyprland.nix b/modules/nixos/hyprland.nix new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/modules/nixos/hyprland.nix @@ -1,8 +1,9 @@ { config, lib, pkgs, ... }: - { imports = [ + #./modules/home/hyprland/default.nix + ./modules/home/i3wm/default.nix ]; home = { username = "mun"; @@ -10,6 +11,18 @@ stateVersion = "25.11"; packages = with pkgs; [ + # === Development Tools === + cargo + rustc + rust-analyzer + rustfmt + clippy + ruff + + # === Applications === + discord + + # === Utilities === pay-respects zathura ripgrep @@ -26,23 +39,8 @@ }; }; - gtk.cursorTheme = { - package = pkgs.rose-pine-cursor; - name = "RosePine"; - }; - - xdg = { - enable = true; - mimeApps = { - enable = true; - defaultApplications = { - "text/plain" = [ "nvim.desktop" ]; - "text/markdown" = [ "nvim.desktop" ]; - "text/x-markdown" = [ "nvim.desktop" ]; - }; - }; - }; + programs = { ssh = { @@ -74,532 +72,11 @@ fastfetch ''; }; - - rofi = { - enable = true; - location = "center"; - cycle = true; - theme = "purple"; - terminal = "${pkgs.kitty}/bin/kitty"; - modes = [ "drun" "ssh" "emoji" "calc" ]; - plugins = with pkgs; [ rofi-emoji rofi-calc ]; - }; - - nnn = { - enable = true; - package = pkgs.nnn.override { withNerdIcons = true; }; - }; - - neovim = { - enable = true; - defaultEditor = true; - viAlias = true; - vimAlias = true; - withNodeJs = true; - - # +ANT FIX - plugins = []; # disable HM plugin processing - - extraLuaConfig = '' - -- LazyVim bootstrap - local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" - if not vim.loop.fs_stat(lazypath) then - vim.fn.system({ - "git", "clone", "--filter=blob:none", - "https://github.com/folke/lazy.nvim.git", - "--branch=stable", lazypath, - }) - end - vim.opt.rtp:prepend(lazypath) - - require("lazy").setup({ - spec = { - { "LazyVim/LazyVim", import = "lazyvim.plugins" }, - { import = "lazyvim.plugins.extras.lang.tex" }, - { import = "lazyvim.plugins.extras.lang.markdown" }, - { import = "lazyvim.plugins.extras.ui.mini-animate" }, - { import = "lazyvim.plugins.extras.lang.typescript" }, - { import = "lazyvim.plugins.extras.lang.python" }, - { import = "lazyvim.plugins.extras.lang.rust" }, - { import = "lazyvim.plugins.extras.lang.nix" }, - - { - "lervag/vimtex", - lazy = false, - init = function() - vim.g.vimtex_view_method = "zathura" - end - }, - - { - "MeanderingProgrammer/render-markdown.nvim", - opts = { - enabled = true, - file_types = { "markdown", "rmd" }, - colorscheme = "default", - }, - dependencies = { - "nvim-treesitter/nvim-treesitter", - "nvim-tree/nvim-web-devicons", - }, - }, - - { "mracos/mermaid.vim", ft = { "mermaid" } }, - }, - - defaults = { lazy = false, version = false }, - checker = { enabled = true }, - - performance = { - rtp = { - disabled_plugins = { - "gzip", "tarPlugin", "tohtml", - "tutor", "zipPlugin", - }, - }, - }, - }) - - -- LaTeX wrapping - vim.api.nvim_create_autocmd("FileType", { - pattern = "tex", - callback = function() - vim.opt_local.wrap = true - vim.opt_local.linebreak = true - vim.opt_local.breakindent = true - vim.opt_local.breakindentopt = "shift:2" - vim.opt_local.textwidth = 0 - end, - }) - - -- Disable diagnostics in markdown - vim.api.nvim_create_autocmd("FileType", { - pattern = "markdown", - callback = function() - vim.diagnostic.disable(0) - end, - }) - - -- Nix LSP - local lspconfig = require("lspconfig") - lspconfig.nil_ls.setup({ cmd = { "nil" } }) - - vim.opt.clipboard = "unnamedplus" - ''; - }; - - kitty = { - enable = true; - extraConfig = '' - confirm_os_window_close 0 - font_family Fira Code - bold_font Fira Code Bold - italic_font Fira Code Light - shell_integration no-cursor - cursor_shape beam - window_padding_width 7 - window_padding_height 10 - scrollback_lines 3000 - font_size 11 - map ctrl+shift+plus change_font_size all +1.0 - map ctrl+shift+minus change_font_size all -1.0 - background_opacity 0.7 - - cursor #AC82E9 - selection_background #d8cab8 - selection_foreground #141216 - background #141216 - foreground #d8cab8 - - color0 #2b2135 - color8 #92fcfa - color1 #fc4649 - color9 #fc4649 - color2 #c4e881 - color10 #c4e881 - color3 #AC82E9 - color11 #AC82E9 - color4 #7b91fc - color12 #7b91fc - color5 #f3fc7b - color13 #f3fc7b - color6 #8F56E1 - color14 #8F56E1 - color7 #fc92fc - color15 #d8cab8 - ''; - }; - }; - - xsession.windowManager.i3 = { - enable = true; - config.bars = []; - - extraConfig = '' - # i3 config - set $mod Mod4 - font pango:Fira Code 10 - - exec --no-startup-id dex-autostart --autostart --environment i3 - exec --no-startup-id xss-lock --transfer-sleep-lock -- i3lock-fancy-rapid 5 3 --nofork - exec --no-startup-id nm-applet - exec --no-startup-id blueman-applet - exec_always --no-startup-id sh -c "sleep 1 && picom --config ~/.config/picom/picom.conf" - exec --no-startup-id -merge ~/.Xresources - exec_always --no-startup-id feh --bg-scale ~/Pictures/wallpapers/vox.jpg - exec_always --no-startup-id sh -c "killall -q polybar; sleep 1; polybar example --config=~/.config/polybar/config.ini &" - exec_always --no-startup-id ${hidePolybarInFullscreen} - exec --no-startup-id flameshot - - gaps top 60 - - bindsym XF86MonBrightnessDown exec brightnessctl set 10%- - bindsym XF86MonBrightnessUp exec brightnessctl set +10% - bindsym XF86AudioMute exec amixer set Master toggle - bindsym XF86AudioLowerVolume exec amixer set Master 5%- - bindsym XF86AudioRaiseVolume exec amixer set Master 5%+ - bindsym XF86AudioMicMute exec amixer set Capture toggle - - floating_modifier $mod - - bindsym $mod+Shift+s exec flameshot gui - bindsym $mod+Return exec kitty - bindsym $mod+Control+l exec --no-startup-id i3lock-fancy-rapid 5 3 - bindsym $mod+m exec rofi -show drun - bindsym $mod+Shift+m exec kitty nnn - bindsym $mod+n exec firefox - bindsym $mod+Shift+q kill - - bindsym $mod+j focus left - bindsym $mod+k focus down - bindsym $mod+l focus up - bindsym $mod+uring focus right - - bindsym $mod+Shift+j move left - bindsym $mod+Shift+k move down - bindsym $mod+Shift+l move up - bindsym $mod+Shift+uring move right - - bindsym $mod+h split h - bindsym $mod+v split v - bindsym $mod+f fullscreen toggle - bindsym $mod+s layout stacking - bindsym $mod+w layout tabbed - bindsym $mod+e layout toggle split - bindsym $mod+Shift+space floating toggle - bindsym $mod+space focus mode_toggle - bindsym $mod+a focus parent - - set $ws1 "1" - set $ws2 "2" - set $ws3 "3" - set $ws4 "4" - set $ws5 "5" - set $ws6 "6" - set $ws7 "7" - set $ws8 "8" - set $ws9 "9" - set $ws10 "10" - - bindsym $mod+plus workspace number $ws1 - bindsym $mod+ecaron workspace number $ws2 - bindsym $mod+scaron workspace number $ws3 - bindsym $mod+ccaron workspace number $ws4 - bindsym $mod+rcaron workspace number $ws5 - bindsym $mod+zcaron workspace number $ws6 - bindsym $mod+yacute workspace number $ws7 - bindsym $mod+aacute workspace number $ws8 - bindsym $mod+iacute workspace number $ws9 - bindsym $mod+eacute workspace number $ws10 - - bindsym $mod+Shift+plus move container to workspace number $ws1 - bindsym $mod+Shift+ecaron move container to workspace number $ws2 - bindsym $mod+Shift+scaron move container to workspace number $ws3 - bindsym $mod+Shift+ccaron move container to workspace number $ws4 - bindsym $mod+Shift+rcaron move container to workspace number $ws5 - bindsym $mod+Shift+zcaron move container to workspace number $ws6 - bindsym $mod+Shift+yacute move container to workspace number $ws7 - bindsym $mod+Shift+aacute move container to workspace number $ws8 - bindsym $mod+Shift+iacute move container to workspace number $ws9 - bindsym $mod+Shift+eacute move container to workspace number $ws10 - - bindsym $mod+Shift+c reload - bindsym $mod+Shift+r restart - bindsym $mod+Shift+e exec "i3-nagbar -t warning -m 'You pressed the exit shortcut. Do you really want to exit i3? This will end your X session.' -B 'Yes, exit i3' 'i3-msg exit'" - - mode "resize" { - bindsym j resize shrink width 5 px or 5 ppt - bindsym k resize grow height 5 px or 5 ppt - bindsym l resize shrink height 5 px or 5 ppt - bindsym uring resize grow width 5 px or 5 ppt - - bindsym Left resize shrink width 5 px or 5 ppt - bindsym Down resize grow height 5 px or 5 ppt - bindsym Up resize shrink height 5 px or 5 ppt - bindsym Right resize grow width 5 px or 5 ppt - - bindsym Return mode "default" - bindsym Escape mode "default" - bindsym $mod+r mode "default" - } - - bindsym $mod+r mode "resize" - - client.focused #FFFFFF #FFFFFF #FFFFFF #FFFFFF #b12cbf - client.focused_inactive #8C8C8C #4C4C4C #FFFFFF #4C4C4C #FFFFFF - client.unfocused #4C4C4C #222222 #888888 #292D2E #500096 - client.urgent #EC69A0 #DB3279 #FFFFFF #DB3279 #DB3279 - client.placeholder #000000 #0C0C0C #FFFFFF #000000 #FFFFFF - client.background #FFFFFF - - default_border pixel 3 - default_floating_border pixel 3 - hide_edge_borders smart - ''; + }; services = { gnome-keyring.enable = true; - - dunst = { - enable = true; - - settings = let - colors = { - foreground = "#d0b6fd"; - background = "#1c182d"; - alert = "#7b91fc"; - }; - in { - global = { - width = "(200,300)"; - height = "(0,150)"; - offset = "(30,50)"; - origin = "bottom-right"; - transparency = 10; - frame_width = 0; - font = "Fira Code 10"; - }; - - urgency_low = { - background = colors.background; - foreground = colors.foreground; - timeout = 8; - }; - - urgency_normal = { - background = colors.background; - foreground = colors.foreground; - frame-size = "0"; - timeout = 10; - }; - - urgency_critical = { - background = colors.background; - foreground = colors.foreground; - frame-size = "5"; - frame-color = colors.alert; - }; - }; - }; - - polybar = { - enable = true; - - extraConfig = let - colors = { - background = "#1c182d"; - background-alt = "#2b1b3d"; - foreground = "#d0b6fd"; - primary = "#cfb5fd"; - secondary = "#8a78b0"; - alert = "#7b91fc"; - disabled = "#707880"; - }; - in '' - [bar/example] - width = 98% - height = 30pt - radius = 15 - offset-x = 1% - offset-y = 1% - override-redirect = true - fixed-center = true - enable-ipc = true - - background = ${colors.background} - foreground = ${colors.foreground} - - line-size = 4pt - border-size = Opt - border-color = #00000000 - - padding-left = 1 - padding-right = 1 - module-margin = 1 - - separator = | - separator-foreground = ${colors.disabled} - - font-0 = fira code;2 - - modules-left = xworkspaces spotify spotify-prev spotify-play-pause spotify-next - modules-center = date - modules-right = filesystem memory cpu pulseaudio-devices wlan xkeyboard battery - - [module/systray] - type = internal/tray - format-margin = 8pt - tray-spacing = 16pt - - [module/xworkspaces] - type = internal/xworkspaces - label-active = %name% - label-active-background = ${colors.background-alt} - label-active-underline = ${colors.primary} - label-active-padding = 1 - label-occupied = %name% - label-occupied-padding = 1 - label-urgent = %name% - label-urgent-background = ${colors.alert} - label-urgent-padding = 1 - label-empty = %name% - label-empty-foreground = ${colors.disabled} - label-empty-padding = 1 - - [module/xwindow] - type = internal/xwindow - label = %title:0:60:...% - - [module/filesystem] - type = internal/fs - interval = 25 - mount-0 = / - label-mounted = %{F#F0C674}%mountpoint%%{F-} %percentage_used%% - label-unmounted = %mountpoint% not mounted - label-unmounted-foreground = ${colors.disabled} - - [module/pulseaudio] - type = internal/pulseaudio - format-volume-prefix = "VOL " - format-volume-prefix-foreground = ${colors.primary} - format-volume = <label-volume> - label-volume = %percentage%% - label-muted = muted - label-muted-foreground = ${colors.disabled} - - [module/xkeyboard] - type = internal/xkeyboard - blacklist-0 = num lock - label-layout = %layout% - label-layout-foreground = ${colors.primary} - label-indicator-padding = 2 - label-indicator-margin = 1 - label-indicator-foreground = ${colors.background} - label-indicator-background = ${colors.secondary} - - [module/memory] - type = internal/memory - interval = 2 - format-prefix = "RAM " - format-prefix-foreground = ${colors.primary} - label = %percentage_used:2%% - - [module/cpu] - type = internal/cpu - interval = 2 - format-prefix = "CPU " - format-prefix-foreground = ${colors.primary} - label = %percentage:2%% - - [network-base] - type = internal/network - interval = 5 - format-connected = <label-connected> - format-disconnected = <label-disconnected> - label-disconnected = %{F#F0C674}%ifname%%{F#707880} disconnected - - [module/wlan] - inherit = network-base - interface-type = wireless - label-connected = %{F#F0C674}%ifname%%{F-} %essid% - - [module/eth] - inherit = network-base - interface-type = wired - label-connected = %{F#F0C674}%ifname%%{F-} - - [module/date] - type = internal/date - interval = 1 - date = %H:%M - date-alt = %Y-%m-%d %H:%M:%S - label = %date% - label-foreground = ${colors.primary} - - [settings] - screenchange-reload = true - pseudo-transparency = true - - [module/battery] - type = internal/battery - full-at = 100 - low-at = 15 - battery = BAT0 - adapter = ADP1 - poll-interval = 5 - - [module/spotify] - type = custom/script - tail = true - interval = 1 - format-prefix = "♫" - format = <label> - exec = ${get_spotify_status} - - [module/spotify-prev] - type = custom/script - exec = echo "◀◀" - format = <label> - click-left = playerctl previous -p spotify - - [module/spotify-play-pause] - type = custom/ipc - hook-0 = echo "▶" - hook-1 = echo "▶" - initial = 1 - click-left = playerctl play-pause -p spotify - - [module/spotify-next] - type = custom/script - exec = echo "▶▶" - format = <label> - click-left = playerctl next -p spotify - ''; - - script = "polybar example --config=~/.config/polybar/config.ini &"; - }; - - picom = { - enable = true; - backend = "glx"; - vSync = true; - inactiveOpacity = 0.9; - activeOpacity = 1.0; - fade = true; - fadeSteps = [ 0.09 0.09 ]; - fadeDelta = 5; - shadow = true; - shadowOffsets = [ 12 12 ]; - shadowOpacity = 0.5; - shadowExclude = [ - "class_g = 'Polybar'" - "name = 'Polybar'" - ]; - settings = { - corner-radius = 15; - }; - }; - }; + }; } |
