diff --git a/.envrc b/.envrc new file mode 100644 index 00000000..3550a30f --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +use flake diff --git a/.github/assets/README_template.md b/.github/assets/README_template.md deleted file mode 100644 index d08e74a3..00000000 --- a/.github/assets/README_template.md +++ /dev/null @@ -1,134 +0,0 @@ -
- nixy logo -
- -
- -# Nixy - -
-
- - - - - - - - - - - - -
-
- -**Nixy simplifies and unifies** the Hyprland ecosystem with a modular, easily -customizable setup. It provides a structured way to manage your system -configuration and dotfiles with minimal effort. It includes _home-manager_, -_secrets_, and _custom theming_ all in one place. - -**Features:** - -- 💻 Hyprland & Caelestia: Preconfigured Hyprland ecosystem with Caelestia-shell (Ty to both projects!) -- 🎨 Consistent Theming: Base16 & Stylix-powered themes -- ⌨️ Vim-like Everywhere: Unified keybindings (Hyprland, nvim, vimium, etc.) - -## Table of Content - -{md_table_of_content} - -## Screenshots - -![Home](.github/assets/rose-pine/home.png) -![Flake & Spotify](.github/assets/rose-pine/flake-spotify.png) -![Browser and notification center](.github/assets/rose-pine/browser-and-notifications.png) - -## Architecture - -### 🏠 /home (User-level configuration) - -Contains **dotfiles and settings** that apply to your user environment. - -**Subfolders:** - -- `programs` is a collection of apps configured with home-manager -- `system` is some "desktop environment" configuration - -### 🐧 /nixos - -Those are the system-level configurations. (audio, bluetooth, gpu, bootloader, -...) - -### 🎨 /themes - -This folder contains all system themes. Mainly -[stylix](https://stylix.danth.me/) configurations. Check out the available -themes and learn how to create your own in [THEMES.md](docs/THEMES.md) - -### 💻 /hosts - -This directory contains host-specific configurations. Each host includes: - -- `configuration.nix` for system-wide settings -- `home.nix` for user-level configuration -- `variables.nix` for global variables -- `secrets/` for sensitive data - -### 🖥️ /server-modules - -This folder contains server-related nixos modules. (bitwarden, nextcloud, ...) - -## Installation - -1. [Fork](https://github.com/anotherhadi/nixy/fork) this repo and clone it to - your system: - -```sh -git clone https://github.com/anotherhadi/nixy ~/.config/nixos -``` - -2. Copy the `hosts/laptop` folder, rename it to match your system’s hostname, - and update `variables.nix` with your machine’s settings. -3. Copy your `hardware-configuration.nix` into your new host's folder to ensure - proper hardware support. -4. Register your new host in `flake.nix` by adding it under nixosConfigurations. - -> [!IMPORTANT] -> `# CHANGEME` comments are placed throughout the config to -> indicate necessary modifications. Use the following command to quickly locate -> them: -> -> ```sh -> rg "CHANGEME" ~/.config/nixos -> ``` - -> [!TIP] -> When you add new files, don't forget to run `git add .` to add them to the git -> repository - -5. Build the system - -```sh -sudo nixos-rebuild switch --flake ~/.config/nixos#yourhostname -``` - -## Documentation - -- [SERVER](docs/SERVER.md): Check out the server documentation -- [THEMES](docs/THEMES.md): How themes work and how to create your own -- [WALLPAPERS](https://github.com/anotherhadi/awesome-wallpapers): An awesome - collection of wallpapers -- [NEOVIM](docs/NEOVIM.md): How to use the Neovim config in your own flake -- [GROUPS](docs/GROUPS.md): Reusable package groups (dev, cybersecurity) - -- [CONTRIBUTING](docs/CONTRIBUTING.md): How to contribute -- [LICENSE](LICENSE): MIT License - ---- - -
- github | - gitlab (mirror) | - gitea (mirror) -
"$README_FILE" -echo "$readme_content" >>"$README_FILE" -sed 's/\r//' "$README_FILE" >"/tmp/readme.md" -mv "/tmp/readme.md" "$README_FILE" diff --git a/.github/scripts/inject-exec.py b/.github/scripts/inject-exec.py new file mode 100644 index 00000000..d7fed5e2 --- /dev/null +++ b/.github/scripts/inject-exec.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python3 +import re +import subprocess +import sys +from pathlib import Path + +PATTERN = re.compile(r".*?", re.DOTALL) + + +def replace(match): + cmd = match.group(1).strip() + result = subprocess.run(cmd, shell=True, capture_output=True, text=True) + output = result.stdout + if result.returncode != 0: + print( + f"[inject-exec] command failed ({result.returncode}): {cmd}", + file=sys.stderr, + ) + print(result.stderr, file=sys.stderr) + sys.exit(1) + output = re.sub(r"\n?|\n?", "", output) + if output and not output.endswith("\n"): + output += "\n" + return f"\n{output}" + + +def process(path): + content = Path(path).read_text() + new_content = PATTERN.sub(replace, content) + if new_content != content: + Path(path).write_text(new_content) + print(f"[inject-exec] updated {path}") + + +for p in sys.argv[1:]: + process(p) diff --git a/.github/workflows/update-readme.yml b/.github/workflows/update-readme.yml deleted file mode 100644 index 8f2238b5..00000000 --- a/.github/workflows/update-readme.yml +++ /dev/null @@ -1,31 +0,0 @@ -on: - push: - paths: - - '.github/assets/README_template.md' -permissions: - contents: write -jobs: - update-readme: - runs-on: ubuntu-latest - defaults: - run: - working-directory: ./ - steps: - - name: Check out the repository to the runner - uses: actions/checkout@v4 - - name: Set up Go - uses: actions/setup-go@v5 - with: - go-version: '^1.23' - - name: Install required dependencies - run: | - go install github.com/anotherhadi/markdown-table-of-contents@latest - - name: Run a script - run: | - chmod +x ./.github/scripts/create_readme.sh - ./.github/scripts/create_readme.sh - git config user.name github-actions - git config user.email github-actions@github.com - git add . - git commit -m "Update README.md (auto)" && git push - exit 0 diff --git a/.gitignore b/.gitignore index 1be5a966..a50cb2dc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,8 @@ .sops.yaml .claude/ old/ +docs/superpowers/ +.superpowers/ +result/ +.pre-commit-config.yaml +.direnv/ diff --git a/README.md b/README.md index 0afe625a..8e39a6e5 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,3 @@ -[//]: # (This file is autogenerated)
nixy logo
@@ -24,20 +23,22 @@
-**Nixy simplifies and unifies** the Hyprland ecosystem with a modular, easily +**Nixy simplifies and unifies** the Hyprland ecosystem with a modular, minimalist & easily customizable setup. It provides a structured way to manage your system configuration and dotfiles with minimal effort. It includes _home-manager_, _secrets_, and _custom theming_ all in one place. **Features:** -- 💻 Hyprland & Caelestia: Preconfigured Hyprland ecosystem with Caelestia-shell (Ty to both projects!) +- 💻 Hyprland & TUIs: Preconfigured Hyprland ecosystem with a lot of cool TUIs - 🎨 Consistent Theming: Base16 & Stylix-powered themes - ⌨️ Vim-like Everywhere: Unified keybindings (Hyprland, nvim, vimium, etc.) ## Table of Content -- [Table of Content](#table-of-content) + + + - [Screenshots](#screenshots) - [Architecture](#architecture) - [🏠 /home (User-level configuration)](#-home-user-level-configuration) @@ -48,11 +49,13 @@ _secrets_, and _custom theming_ all in one place. - [Installation](#installation) - [Documentation](#documentation) + + ## Screenshots -![Home](.github/assets/rose-pine/home.png) -![Flake & Spotify](.github/assets/rose-pine/flake-spotify.png) -![Browser and notification center](.github/assets/rose-pine/browser-and-notifications.png) +![Home](.github/assets/screenshots/1.png) +![Neovim and spotify](.github/assets/screenshots/2.png) +![Browser and file explorer](.github/assets/screenshots/3.png) ## Architecture @@ -87,7 +90,7 @@ This directory contains host-specific configurations. Each host includes: ### 🖥️ /server-modules -This folder contains server-related nixos modules. (bitwarden, nextcloud, ...) +This folder contains server-related nixos modules. (gitea, cloudflared, self-hosted apps, ...) ## Installation @@ -130,7 +133,6 @@ sudo nixos-rebuild switch --flake ~/.config/nixos#yourhostname - [WALLPAPERS](https://github.com/anotherhadi/awesome-wallpapers): An awesome collection of wallpapers - [NEOVIM](docs/NEOVIM.md): How to use the Neovim config in your own flake -- [GROUPS](docs/GROUPS.md): Reusable package groups (dev, cybersecurity) - [CONTRIBUTING](docs/CONTRIBUTING.md): How to contribute - [LICENSE](LICENSE): MIT License diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index 7cf1fd72..ad816ad9 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -9,8 +9,5 @@ The process is straight-forward. - Write your changes (new theme, bug fixes, issues fix, ...). - Create a Pull Request against the main branch of Nixy. -> [!TIP] -> To update the README, change the `./.github/assets/README_template.md` - > [!IMPORTANT] > Don't push your host's folder diff --git a/docs/GROUPS.md b/docs/GROUPS.md deleted file mode 100644 index a8b6ac48..00000000 --- a/docs/GROUPS.md +++ /dev/null @@ -1,44 +0,0 @@ -# Groups - -Groups are curated sets of packages exposed as flake outputs. Each group has two forms: - -- **`homeManagerModules.`** — full home-manager module (packages + files + systemd units) -- **`packages.`** — standalone environment for `nix shell` (packages only) - -## Available groups - -- dev (go, bun, air, ...) -- cybersecurity (nmap, john, dirb, ffuf, ...) - -For the Cybersecurity group, the home-manager module also sets up: - -- `~/Cyber/wordlists/` with SecLists, fuzz4bounty, and hashcat rules -- `~/Cyber/tmp/` as a temporary workspace - -## Use in another flake - -Add this repo as an input: - -```nix -inputs.nixy.url = "github:anotherhadi/nixy"; -``` - -Import the home-manager module in your home configuration: - -```nix -{ inputs, ... }: { - imports = [ - inputs.nixy.homeManagerModules.cybersecurity - # inputs.nixy.homeManagerModules.dev - ]; -} -``` - -## Quick shell without installing - -```sh -nix shell github:anotherhadi/nixy#cybersecurity -nix shell github:anotherhadi/nixy#dev -``` - -This drops you into a shell with all tools in `PATH`. No home-manager required, no wordlists or systemd units. diff --git a/docs/NEOVIM.md b/docs/NEOVIM.md index fdd46c4b..b575bf93 100644 --- a/docs/NEOVIM.md +++ b/docs/NEOVIM.md @@ -37,4 +37,4 @@ Then import the home-manager module in your home configuration: | `picker.nix` | Snacks picker + oil.nvim | | `snacks.nix` | Snacks extras: image preview, zen mode, git signs, statuscolumn | | `utils.nix` | Bufferline, lualine, copilot, lazygit, toggleterm, autocomplete | -| `mini.nix` | Mini.nvim suite: pairs, comment, icons, indentscope, diff, git | +| `mini.nix` | Mini.nvim suite: ai, clue, comment, diff, git, icons, indentscope, jump2d, pairs, starter, statusline, surround | diff --git a/docs/SERVER.md b/docs/SERVER.md index 4d4e8173..96e25a1b 100644 --- a/docs/SERVER.md +++ b/docs/SERVER.md @@ -5,7 +5,7 @@ This document describes the architecture and setup of the self-hosted **NixOS server**, which is securely accessible via **a Cloudflare Tunnel**. The server is designed for private, secure, and easily manageable self-hosting of various services. -![server dashboard](../.github/assets/server_dashboard.png) +![server dashboard](../.github/assets/screenshots/server_dashboard.png) ## **Why This Setup?** @@ -17,13 +17,17 @@ The server is designed for private, secure, and easily manageable self-hosting o The server hosts several key applications: -- **NGINX**: Reverse proxy for routing traffic to services via my domain name. - **AdGuard Home**: A self-hosted DNS ad blocker for network-wide ad and tracker filtering. - **Glance**: An awesome dashboard! (See the screenshot above) -- **Arr Stack (Radarr, Sonarr, etc.)**: Automated media management tools for handling movies and TV shows. (legaly ofc) +- **Arr Stack (Radarr, Sonarr, etc.)**: Automated media management tools for handling movies and TV shows. (legally ofc) - **Mealie**: A self-hosted recipe manager and meal planner with a clean user interface. - **Stirling-PDF**: A powerful, locally hosted web application for editing, merging, and converting PDF files. - **CyberChef**: The "Cyber Swiss Army Knife" for data analysis, decoding, and encryption tasks. - **Mazanoke**: A utility service for image processing, specialized in format conversion and downgrading/optimization. +- **Umami**: Privacy-focused web analytics. +- **Gitea**: Self-hosted git forge. +- **Blog**: Personal website/blog. +- **iknowyou**: Personal project hosted in two containers (prod + demo). +- **Awesome Wallpapers**: Wallpaper browser served via NGINX inside a container. - **SSH**: Secure remote access configuration for server management. (via browser too) -- **Security related stuff**: Cloudflared, Fail2Ban, Firewall +- **Security related stuff**: Cloudflared, Fail2Ban, Firewall, Kernel Hardening diff --git a/docs/THEMES.md b/docs/THEMES.md index 06a84fdf..dda57583 100644 --- a/docs/THEMES.md +++ b/docs/THEMES.md @@ -1,17 +1,9 @@ # Themes -Themes are defined in `themes`. Those themes define the colors, fonts, icons, etc, used by Hyprland and the apps/programs installed. -You can change the selected theme by changing the import statement of your host's variables.nix file. +Themes are defined in `themes/`. They define the colors, fonts, icons, wallpaper, and other visual settings used by Hyprland and all apps/programs. +You can change the selected theme by changing the import statement in your host's `variables.nix` file. ## Create your theme -Create a copy of one of the existing themes and change the variables. -Wallpapers are loaded from the [hadi's awesome-wallpapers](https://github.com/anotherhadi/awesome-wallpapers) repo. - -## Gallery - -### Rose-pine - -![Home](../.github/assets/rose-pine/home.png) -![Flake & Spotify](../.github/assets/rose-pine/flake-spotify.png) -![Browser and notification center](../.github/assets/rose-pine/browser-and-notifications.png) +Create a copy of `themes/nixy.nix` and change the variables. +Wallpapers are loaded from my [awesome-wallpapers](https://github.com/anotherhadi/awesome-wallpapers) repo. diff --git a/flake.lock b/flake.lock index 365867f6..913abb10 100644 --- a/flake.lock +++ b/flake.lock @@ -1,48 +1,15 @@ { "nodes": { - "aquamarine": { - "inputs": { - "hyprutils": [ - "hyprland", - "hyprutils" - ], - "hyprwayland-scanner": [ - "hyprland", - "hyprwayland-scanner" - ], - "nixpkgs": [ - "hyprland", - "nixpkgs" - ], - "systems": [ - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1778857089, - "narHash": "sha256-TclWRW2SdFeETLaiTG4BA8C8C4m/LppQEldncqyTzAQ=", - "owner": "hyprwm", - "repo": "aquamarine", - "rev": "ab2b0af63fbc9fb779d684f19149b790978be8a8", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "aquamarine", - "type": "github" - } - }, "awesome-wallpapers": { "inputs": { "nixpkgs": "nixpkgs" }, "locked": { - "lastModified": 1780174698, - "narHash": "sha256-fYHv6Z03ysxIe8saRNYHWi7njWcT7AfPNGNEm5JJIQQ=", + "lastModified": 1781031430, + "narHash": "sha256-AcJTjMpnffSJ6bpTDEaGcJ/31rOOYDgGr/2L2yH7H0Y=", "owner": "anotherhadi", "repo": "awesome-wallpapers", - "rev": "6edc4aeb12d517e3aaad239e579c89b080f07dab", + "rev": "0147e19341039fd3b01d36c3cbaa9571105fb777", "type": "github" }, "original": { @@ -196,7 +163,7 @@ "iknowyou", "nixpkgs" ], - "systems": "systems_4", + "systems": "systems_3", "treefmt-nix": "treefmt-nix_3" }, "locked": { @@ -213,105 +180,13 @@ "type": "github" } }, - "caelestia-cli": { - "inputs": { - "caelestia-shell": "caelestia-shell", - "nixpkgs": [ - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1780375472, - "narHash": "sha256-Q8RAJoYlakA6B2I5DVcuxzNbhCNU1nnIjqQZYP1KGrM=", - "owner": "caelestia-dots", - "repo": "cli", - "rev": "d1c8c8fc09738d1b40576e97c274b4a11a2e0ac7", - "type": "github" - }, - "original": { - "owner": "caelestia-dots", - "repo": "cli", - "type": "github" - } - }, - "caelestia-cli_2": { - "inputs": { - "caelestia-shell": [ - "caelestia-shell" - ], - "nixpkgs": [ - "caelestia-shell", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1779768519, - "narHash": "sha256-2n/447oNfAZrl1yncafLPgXMx5tuTF6T2B+zI/zFYkI=", - "owner": "caelestia-dots", - "repo": "cli", - "rev": "64a5507e74f6c7d0c29f9131964412f8f8c4dd89", - "type": "github" - }, - "original": { - "owner": "caelestia-dots", - "repo": "cli", - "type": "github" - } - }, - "caelestia-shell": { - "inputs": { - "caelestia-cli": [ - "caelestia-cli" - ], - "nixpkgs": [ - "caelestia-cli", - "nixpkgs" - ], - "quickshell": "quickshell" - }, - "locked": { - "lastModified": 1780196414, - "narHash": "sha256-iXmyWULTZuRd68xRL79e9GyYL9FZ6gfh6zl1PPlWX2A=", - "owner": "caelestia-dots", - "repo": "shell", - "rev": "63bb82762bb29ac9b7fcd5b97839abae721ce860", - "type": "github" - }, - "original": { - "owner": "caelestia-dots", - "repo": "shell", - "type": "github" - } - }, - "caelestia-shell_2": { - "inputs": { - "caelestia-cli": "caelestia-cli_2", - "nixpkgs": [ - "nixpkgs" - ], - "quickshell": "quickshell_2" - }, - "locked": { - "lastModified": 1780196414, - "narHash": "sha256-iXmyWULTZuRd68xRL79e9GyYL9FZ6gfh6zl1PPlWX2A=", - "owner": "caelestia-dots", - "repo": "shell", - "rev": "63bb82762bb29ac9b7fcd5b97839abae721ce860", - "type": "github" - }, - "original": { - "owner": "caelestia-dots", - "repo": "shell", - "type": "github" - } - }, "crane": { "locked": { - "lastModified": 1779130139, - "narHash": "sha256-BLrtr42azquO7MdGFU5a7KiMl3YpFlTeIXqy1fT5GlQ=", + "lastModified": 1780532242, + "narHash": "sha256-D+BsdpxmtUwtqGoY0IXPhHgTlmqgcZKCEo1oMyn7ep0=", "owner": "ipetkov", "repo": "crane", - "rev": "edb38893982a3338972bb4a2ec7ce7c29ba10fd9", + "rev": "59a82a1222dd3b2080b5cc52a1a2e8d5f1b77f37", "type": "github" }, "original": { @@ -342,11 +217,11 @@ "firefox-gnome-theme": { "flake": false, "locked": { - "lastModified": 1779670703, - "narHash": "sha256-UdfMivNMwCCqQsYDg5pSz8X2IOaOrIZLIIy+Bg3CO2o=", + "lastModified": 1783570805, + "narHash": "sha256-ptl5aRlCv9/uRSv2u8Hq8UFVFeZ6Q/bT049bpqNgc3w=", "owner": "rafaelmardojai", "repo": "firefox-gnome-theme", - "rev": "942159e73e40bf785816f7f1f5feed9ef3d7c8f9", + "rev": "5602ed62d638142c1ab31dccd01dfbfb28841225", "type": "github" }, "original": { @@ -442,6 +317,27 @@ } }, "flake-parts_4": { + "inputs": { + "nixpkgs-lib": [ + "nur", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1733312601, + "narHash": "sha256-4pDvzqnegAfRkPwO3wmwBhVi/Sye1mzps0zHWYnP88c=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "205b12d8b7cd4802fbcb8e8ef6a0f1408781a4f9", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_5": { "inputs": { "nixpkgs-lib": [ "nvf", @@ -462,7 +358,7 @@ "type": "github" } }, - "flake-parts_5": { + "flake-parts_6": { "inputs": { "nixpkgs-lib": [ "stylix", @@ -470,11 +366,11 @@ ] }, "locked": { - "lastModified": 1778716662, - "narHash": "sha256-m1Yf0wZ8j1OHjTc2UwHwyQRSnNeSgLJOd7q5Y45hzi4=", + "lastModified": 1782949081, + "narHash": "sha256-vp6Y/Grm98ESt6ceOkWiHWyZRDV3J1RID4w+6NWK9yA=", "owner": "hercules-ci", "repo": "flake-parts", - "rev": "f7c1a2d347e4c52d5fb8d10cb4d94b5884e546fb", + "rev": "17c9d6cdfc60c64f4ee8d306f9bc0b4ccb51481e", "type": "github" }, "original": { @@ -499,25 +395,24 @@ "type": "github" } }, - "gitignore": { + "git-hooks": { "inputs": { + "flake-compat": "flake-compat", "nixpkgs": [ - "hyprland", - "pre-commit-hooks", "nixpkgs" ] }, "locked": { - "lastModified": 1709087332, - "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=", - "owner": "hercules-ci", - "repo": "gitignore.nix", - "rev": "637db329424fd7e46cf4185293b9cc8c88c95394", + "lastModified": 1784288435, + "narHash": "sha256-ReRHaLgr/uVqdD8afFSn+myXIfpHeOhP0yYe0TJqAA8=", + "owner": "cachix", + "repo": "git-hooks.nix", + "rev": "43b3c1ab9d40fb1dbb008f451988a91e375825e9", "type": "github" }, "original": { - "owner": "hercules-ci", - "repo": "gitignore.nix", + "owner": "cachix", + "repo": "git-hooks.nix", "type": "github" } }, @@ -540,14 +435,16 @@ }, "helium-browser": { "inputs": { - "nixpkgs": "nixpkgs_4" + "nixpkgs": [ + "nixpkgs-unstable" + ] }, "locked": { - "lastModified": 1780054154, - "narHash": "sha256-VbHwck8XGyZ77uHfY9adqE0qrilRshWUdFwB6etEIt4=", + "lastModified": 1781783441, + "narHash": "sha256-v7rAVyX0DGAYqei3FxWPDJLqrzJrEsue2DVBEDApxQo=", "owner": "oxcl", "repo": "nix-flake-helium-browser", - "rev": "47e435ce0b81c012683bd2b1a4101285e1f46183", + "rev": "aabc12cf6518480d83b2b5d06d2eecf86a25273f", "type": "github" }, "original": { @@ -563,344 +460,24 @@ ] }, "locked": { - "lastModified": 1780593650, - "narHash": "sha256-CHo7k65YTL3HY+WQVedDTupji+LMgNlKCdrtRHZFAK4=", + "lastModified": 1785119570, + "narHash": "sha256-Rgs2xKnGLFWQscxUaXX07oyZeuMDOHEbqDOsgliLFGM=", "owner": "nix-community", "repo": "home-manager", - "rev": "447fd9ff62501dae7206dfe180ee89f8de27b7d5", + "rev": "d4fd24667c8cbef124bb70a20380cab75ec8474d", "type": "github" }, "original": { "owner": "nix-community", + "ref": "release-26.05", "repo": "home-manager", "type": "github" } }, - "hyprcursor": { - "inputs": { - "hyprlang": [ - "hyprland", - "hyprlang" - ], - "nixpkgs": [ - "hyprland", - "nixpkgs" - ], - "systems": [ - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1776511930, - "narHash": "sha256-fCpwFiTW0rT7oKJqr3cqHMnkwypSwQKpbtUEtxdkgrM=", - "owner": "hyprwm", - "repo": "hyprcursor", - "rev": "39435900785d0c560c6ae8777d29f28617d031ef", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "hyprcursor", - "type": "github" - } - }, - "hyprgraphics": { - "inputs": { - "hyprutils": [ - "hyprland", - "hyprutils" - ], - "nixpkgs": [ - "hyprland", - "nixpkgs" - ], - "systems": [ - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1776426399, - "narHash": "sha256-RUESLKNikIeEq9ymGJ6nmcDXiSFQpUW1IhJ245nL3xM=", - "owner": "hyprwm", - "repo": "hyprgraphics", - "rev": "68d064434787cf1ed4a2fe257c03c5f52f33cf84", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "hyprgraphics", - "type": "github" - } - }, - "hyprland": { - "inputs": { - "aquamarine": "aquamarine", - "hyprcursor": "hyprcursor", - "hyprgraphics": "hyprgraphics", - "hyprland-guiutils": "hyprland-guiutils", - "hyprland-protocols": "hyprland-protocols", - "hyprlang": "hyprlang", - "hyprutils": "hyprutils", - "hyprwayland-scanner": "hyprwayland-scanner", - "hyprwire": "hyprwire", - "nixpkgs": "nixpkgs_5", - "pre-commit-hooks": "pre-commit-hooks", - "systems": "systems_3", - "xdph": "xdph" - }, - "locked": { - "lastModified": 1780589398, - "narHash": "sha256-TTSRAf2EIP6Wy3aiaXhfj2qDtCuO/hN7PWVEEufNSiU=", - "ref": "refs/heads/main", - "rev": "7c721d5c012752fd8719d66ef59d290845d6638e", - "revCount": 7417, - "submodules": true, - "type": "git", - "url": "https://github.com/hyprwm/Hyprland" - }, - "original": { - "submodules": true, - "type": "git", - "url": "https://github.com/hyprwm/Hyprland" - } - }, - "hyprland-guiutils": { - "inputs": { - "aquamarine": [ - "hyprland", - "aquamarine" - ], - "hyprgraphics": [ - "hyprland", - "hyprgraphics" - ], - "hyprlang": [ - "hyprland", - "hyprlang" - ], - "hyprtoolkit": "hyprtoolkit", - "hyprutils": [ - "hyprland", - "hyprutils" - ], - "hyprwayland-scanner": [ - "hyprland", - "hyprwayland-scanner" - ], - "nixpkgs": [ - "hyprland", - "nixpkgs" - ], - "systems": [ - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1776426575, - "narHash": "sha256-KI6nIfVihn/DPaeB5Et46Xg3dkNHrrEtUd5LBBVomB0=", - "owner": "hyprwm", - "repo": "hyprland-guiutils", - "rev": "a968d211048e3ed538e47b84cb3649299578f19d", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "hyprland-guiutils", - "type": "github" - } - }, - "hyprland-protocols": { - "inputs": { - "nixpkgs": [ - "hyprland", - "nixpkgs" - ], - "systems": [ - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1772460177, - "narHash": "sha256-/6G/MsPvtn7bc4Y32pserBT/Z4SUUdBd4XYJpOEKVR4=", - "owner": "hyprwm", - "repo": "hyprland-protocols", - "rev": "1cb6db5fd6bb8aee419f4457402fa18293ace917", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "hyprland-protocols", - "type": "github" - } - }, - "hyprlang": { - "inputs": { - "hyprutils": [ - "hyprland", - "hyprutils" - ], - "nixpkgs": [ - "hyprland", - "nixpkgs" - ], - "systems": [ - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1777320127, - "narHash": "sha256-Qu+Wf2Bp5qUjyn2YpZNq8a7JyzTGowhT1knrwE38a9U=", - "owner": "hyprwm", - "repo": "hyprlang", - "rev": "090117506ddc3d7f26e650ff344d378c2ec329cc", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "hyprlang", - "type": "github" - } - }, - "hyprtoolkit": { - "inputs": { - "aquamarine": [ - "hyprland", - "hyprland-guiutils", - "aquamarine" - ], - "hyprgraphics": [ - "hyprland", - "hyprland-guiutils", - "hyprgraphics" - ], - "hyprlang": [ - "hyprland", - "hyprland-guiutils", - "hyprlang" - ], - "hyprutils": [ - "hyprland", - "hyprland-guiutils", - "hyprutils" - ], - "hyprwayland-scanner": [ - "hyprland", - "hyprland-guiutils", - "hyprwayland-scanner" - ], - "nixpkgs": [ - "hyprland", - "hyprland-guiutils", - "nixpkgs" - ], - "systems": [ - "hyprland", - "hyprland-guiutils", - "systems" - ] - }, - "locked": { - "lastModified": 1772462885, - "narHash": "sha256-5pHXrQK9zasMnIo6yME6EOXmWGFMSnCITcfKshhKJ9I=", - "owner": "hyprwm", - "repo": "hyprtoolkit", - "rev": "9af245a69fa6b286b88ddfc340afd288e00a6998", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "hyprtoolkit", - "type": "github" - } - }, - "hyprutils": { - "inputs": { - "nixpkgs": [ - "hyprland", - "nixpkgs" - ], - "systems": [ - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1779475241, - "narHash": "sha256-Nw4DN0A5krWNcPBvuWe5Gz2yuxsUUPiDgtu6SVPJQeU=", - "owner": "hyprwm", - "repo": "hyprutils", - "rev": "3cd3972b2ee658a14d2610d8494e09259e530124", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "hyprutils", - "type": "github" - } - }, - "hyprwayland-scanner": { - "inputs": { - "nixpkgs": [ - "hyprland", - "nixpkgs" - ], - "systems": [ - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1777159683, - "narHash": "sha256-Jxixw6wZphUp+nHYxOKUYSckL17QMBx2d5Zp0rJHr1g=", - "owner": "hyprwm", - "repo": "hyprwayland-scanner", - "rev": "b8632713a6beaf28b56f2a7b0ab2fb7088dbb404", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "hyprwayland-scanner", - "type": "github" - } - }, - "hyprwire": { - "inputs": { - "hyprutils": [ - "hyprland", - "hyprutils" - ], - "nixpkgs": [ - "hyprland", - "nixpkgs" - ], - "systems": [ - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1778410714, - "narHash": "sha256-o6RzFj4nJXaPRY7EM01siuCQeT41RfwwmcmFQqwFJJg=", - "owner": "hyprwm", - "repo": "hyprwire", - "rev": "85148a8e612808cf5ddb25d0b3c5840f3498a7dc", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "hyprwire", - "type": "github" - } - }, "iknowyou": { "inputs": { "bun2nix": "bun2nix_3", - "nixpkgs": "nixpkgs_6", + "nixpkgs": "nixpkgs_4", "nur-osint": "nur-osint" }, "locked": { @@ -964,11 +541,11 @@ }, "mnw": { "locked": { - "lastModified": 1778541201, - "narHash": "sha256-n0twkzWexzjsoDycOTvvQNuGEdg62UiNHYcFCduYpKI=", + "lastModified": 1780772958, + "narHash": "sha256-VKKe8r4pwCGWZ3Yr9CPN129R4S3CKLSrlYqdYz3vKpM=", "owner": "Gerg-L", "repo": "mnw", - "rev": "1a3573fc9d2486738fe0b2cacc5cd10dd5f3a445", + "rev": "0871dbf63a53610c95db04439ed8ea4d6ec9c160", "type": "github" }, "original": { @@ -977,28 +554,6 @@ "type": "github" } }, - "ndg": { - "inputs": { - "nixpkgs": [ - "nvf", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1779233504, - "narHash": "sha256-YIKEyzh0NFQlD0O92LQQNMoVCDwV8yw1Xz0Iu+4ZC5U=", - "owner": "feel-co", - "repo": "ndg", - "rev": "86f6644411a64d5413711895b7cf6e0e1be465b6", - "type": "github" - }, - "original": { - "owner": "feel-co", - "ref": "refs/tags/v2.8.0", - "repo": "ndg", - "type": "github" - } - }, "nix-index-database": { "inputs": { "nixpkgs": [ @@ -1006,11 +561,11 @@ ] }, "locked": { - "lastModified": 1780210899, - "narHash": "sha256-4axz3OBPTKa6LIkXV8n0lc63MQU+et2CB5DGobEAi6k=", + "lastModified": 1782030356, + "narHash": "sha256-h4WpMr455AfRub0FXBaon6Vcpe0waUyJ4GivIW6oyd4=", "owner": "nix-community", "repo": "nix-index-database", - "rev": "97df9dc0b7c924344b793a15c1e8e4522ebb854e", + "rev": "3017088b49efd404f78e3b104f553b97e4af786b", "type": "github" }, "original": { @@ -1021,17 +576,17 @@ }, "nixarr": { "inputs": { - "nixpkgs": "nixpkgs_7", + "nixpkgs": "nixpkgs_5", "treefmt-nix": "treefmt-nix_4", "vpnconfinement": "vpnconfinement", "website-builder": "website-builder" }, "locked": { - "lastModified": 1780503763, - "narHash": "sha256-e2PD1oowOjebEAaWsiQ9g0FQA9OYaUWj7vLwUvDE6EM=", + "lastModified": 1781774207, + "narHash": "sha256-pUHOn5uRbY1yOdeBgfm/UpkVkN9YrLUxl7jZnN1emyo=", "owner": "rasmus-kirk", "repo": "nixarr", - "rev": "6c1eb23334e06bd3fd8d3d8782c64e5c3ac13097", + "rev": "67952a6e79a298396e909d35f7ee35b23f754c43", "type": "github" }, "original": { @@ -1042,19 +597,18 @@ }, "nixos-hardware": { "inputs": { - "nixpkgs": "nixpkgs_8" + "nixpkgs": "nixpkgs_6" }, "locked": { - "lastModified": 1780310866, - "narHash": "sha256-fPBRVf6A5xlACYcOI59shGrjURuvwu0lRsDoSCEXt/I=", + "lastModified": 1782166108, + "narHash": "sha256-/EtnQBcKbsaCAGQ5VRcplrHRkR4ryqyLMpBfkVuG9Xw=", "owner": "NixOS", "repo": "nixos-hardware", - "rev": "4ed851c979641e28597a05086332d75cdc9e395f", + "rev": "875776f0252fcb8618bb948640a0d1f7a5b362be", "type": "github" }, "original": { "owner": "NixOS", - "ref": "master", "repo": "nixos-hardware", "type": "github" } @@ -1120,97 +674,17 @@ "type": "github" } }, - "nixpkgs-stable": { + "nixpkgs-unstable": { "locked": { - "lastModified": 1779796641, - "narHash": "sha256-ZsIrKmhp4vbBXoXXmR/tBXA/UCsAQiJL9vsgZEduhVY=", + "lastModified": 1786384358, + "narHash": "sha256-RzPPiWeUtuvymnpuEWsdtzli5w4kjZs49FqEs3/1u+I=", "owner": "nixos", "repo": "nixpkgs", - "rev": "25f538306313eae3927264466c70d7001dcea1df", + "rev": "2fcb964de67fcf60b43471c55d5d99e61a9ccb5a", "type": "github" }, "original": { "owner": "nixos", - "ref": "nixos-25.11", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_10": { - "locked": { - "lastModified": 1778869304, - "narHash": "sha256-30sZNZoA1cqF5JNO9fVX+wgiQYjB7HJqqJ4ztCDeBZE=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "d233902339c02a9c334e7e593de68855ad26c4cb", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_11": { - "locked": { - "lastModified": 1780749050, - "narHash": "sha256-3av0pIjlOWQ6rDbNOmpUSvbNnJkGORQKKjb4LtCZsIY=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a799d3e3886da994fa307f817a6bc705ae538eeb", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_12": { - "locked": { - "lastModified": 1778869304, - "narHash": "sha256-30sZNZoA1cqF5JNO9fVX+wgiQYjB7HJqqJ4ztCDeBZE=", - "owner": "nixos", - "repo": "nixpkgs", - "rev": "d233902339c02a9c334e7e593de68855ad26c4cb", - "type": "github" - }, - "original": { - "owner": "nixos", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_13": { - "locked": { - "lastModified": 1775888245, - "narHash": "sha256-nwASzrRDD1JBEu/o8ekKYEXm/oJW6EMCzCRdrwcLe90=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "13043924aaa7375ce482ebe2494338e058282925", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_14": { - "locked": { - "lastModified": 1780243769, - "narHash": "sha256-x5UQuRsH3MqI0U9afaXSNqzTPSeZlRLvFAav2Ux1pNw=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "331800de5053fcebacf6813adb5db9c9dca22a0c", - "type": "github" - }, - "original": { - "owner": "NixOS", "ref": "nixos-unstable", "repo": "nixpkgs", "type": "github" @@ -1249,38 +723,6 @@ } }, "nixpkgs_4": { - "locked": { - "lastModified": 1777578337, - "narHash": "sha256-Ad49moKWeXtKBJNy2ebiTQUEgdLyvGmTeykAQ9xM+Z4=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "15f4ee454b1dce334612fa6843b3e05cf546efab", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_5": { - "locked": { - "lastModified": 1779357205, - "narHash": "sha256-cCO8aTqss5x9Ky8GWkpY0Hy5fyTZEbtifSUV8QjSzic=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "f83fc3c307e74bc5fd5adb7eb6b8b13ffd2a36e1", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_6": { "locked": { "lastModified": 1775710090, "narHash": "sha256-ar3rofg+awPB8QXDaFJhJ2jJhu+KqN/PRCXeyuXR76E=", @@ -1296,7 +738,7 @@ "type": "github" } }, - "nixpkgs_7": { + "nixpkgs_5": { "locked": { "lastModified": 1775595990, "narHash": "sha256-OEf7YqhF9IjJFYZJyuhAypgU+VsRB5lD4DuiMws5Ltc=", @@ -1312,7 +754,7 @@ "type": "github" } }, - "nixpkgs_8": { + "nixpkgs_6": { "locked": { "lastModified": 1767892417, "narHash": "sha256-8bW3q88CEg2u4hSP66Vf4lpbLonHz7hqDNBMcCY7E9U=", @@ -1325,18 +767,34 @@ "url": "https://channels.nixos.org/nixos-unstable/nixexprs.tar.xz" } }, - "nixpkgs_9": { + "nixpkgs_7": { "locked": { - "lastModified": 1780243769, - "narHash": "sha256-x5UQuRsH3MqI0U9afaXSNqzTPSeZlRLvFAav2Ux1pNw=", + "lastModified": 1786430034, + "narHash": "sha256-Vux08kA5PICwS2sViCMfwVLAHNoH8TkKAeBo25LjpMI=", "owner": "nixos", "repo": "nixpkgs", - "rev": "331800de5053fcebacf6813adb5db9c9dca22a0c", + "rev": "70cc4559b10a6062b05ff1af17e0add065ccaed9", "type": "github" }, "original": { "owner": "nixos", - "ref": "nixos-unstable", + "ref": "nixos-26.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_8": { + "locked": { + "lastModified": 1781216227, + "narHash": "sha256-9mUW6gNwoN2SWc/l0fW4svPNOulXLl8ijqKyeSOGgJE=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a0374025a863d007d98e3297f6aa46cc3141c2f0", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-26.05", "repo": "nixpkgs", "type": "github" } @@ -1344,15 +802,17 @@ "notashelf-tuigreet": { "inputs": { "crane": "crane", - "nixpkgs": "nixpkgs_10", + "nixpkgs": [ + "nixpkgs" + ], "rust-overlay": "rust-overlay" }, "locked": { - "lastModified": 1780583973, - "narHash": "sha256-ZZk1ccebBjK3pzHVsDU4+fvX/c1fePZ3Tic96/OkfpA=", + "lastModified": 1781718334, + "narHash": "sha256-Ova9OQemsGRmg2b22W9HQSRhtjwS1C9mLUtkYqEjyRs=", "owner": "NotAShelf", "repo": "tuigreet", - "rev": "dc41006d4a4366f732a1a75a20b989fc1e42c0a6", + "rev": "a75f469d51a11b35f9766153d35d15c535b268a6", "type": "github" }, "original": { @@ -1363,44 +823,22 @@ }, "nur": { "inputs": { - "flake-parts": [ - "stylix", - "flake-parts" - ], + "flake-parts": "flake-parts_4", "nixpkgs": [ - "stylix", "nixpkgs" ] }, "locked": { - "lastModified": 1780281641, - "narHash": "sha256-M/+hUKoKbHXpV0xGVfELbN1Ds1aoe3pL5p5/t46YhVo=", + "lastModified": 1786612668, + "narHash": "sha256-drUMW/BXNEKe5wzw2yM7ea/g7CnObPcwRNVp9ap0yQk=", "owner": "nix-community", - "repo": "NUR", - "rev": "30f9ae2f04174de63ba8bcf3580ca90843b28a01", + "repo": "nur", + "rev": "a5ef785fafbf01c361372d7dc8e0f1591aeeacd3", "type": "github" }, "original": { "owner": "nix-community", - "repo": "NUR", - "type": "github" - } - }, - "nur-anotherhadi": { - "inputs": { - "nixpkgs": "nixpkgs_11" - }, - "locked": { - "lastModified": 1781028989, - "narHash": "sha256-wN9iKLIUrD1xOTKB2GXsTBlXYsByL/Tk0hk/KPh0/vw=", - "owner": "anotherhadi", - "repo": "nur-packages", - "rev": "afedd9b527fc7f0e418e6384fa581d8bb7564675", - "type": "github" - }, - "original": { - "owner": "anotherhadi", - "repo": "nur-packages", + "repo": "nur", "type": "github" } }, @@ -1425,21 +863,45 @@ "type": "github" } }, + "nur_2": { + "inputs": { + "flake-parts": [ + "stylix", + "flake-parts" + ], + "nixpkgs": [ + "stylix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1785549842, + "narHash": "sha256-DCwBZmGsySF7oKGTRgEv2HvpxVXkHT+38VhTM76k0B4=", + "owner": "nix-community", + "repo": "NUR", + "rev": "a9f987b57594e845e3e5cdd423b9a70846d70308", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "NUR", + "type": "github" + } + }, "nvf": { "inputs": { "flake-compat": "flake-compat_2", - "flake-parts": "flake-parts_4", + "flake-parts": "flake-parts_5", "mnw": "mnw", - "ndg": "ndg", - "nixpkgs": "nixpkgs_12", - "systems": "systems_5" + "nixpkgs": "nixpkgs_8", + "systems": "systems_4" }, "locked": { - "lastModified": 1780511420, - "narHash": "sha256-Ib44d47GTijSfCtcxFDliP3C9uUiLDYaAE/nVH8TQoY=", + "lastModified": 1781997110, + "narHash": "sha256-6D6xtYN5t1kZGNd69eMZsRBkgX5Df1roErn/kFR1C+A=", "owner": "notashelf", "repo": "nvf", - "rev": "29f7eb8491d9833ee55006ab11169130a60c2652", + "rev": "320f60b97075a58d38b90fc5e39f478421dbd38a", "type": "github" }, "original": { @@ -1448,91 +910,43 @@ "type": "github" } }, - "pre-commit-hooks": { + "nvf-config": { "inputs": { - "flake-compat": "flake-compat", - "gitignore": "gitignore", "nixpkgs": [ - "hyprland", "nixpkgs" + ], + "nvf": [ + "nvf" ] }, "locked": { - "lastModified": 1778507602, - "narHash": "sha256-kTwur1wV+01SdqskVMSo6JMEpg71ps3HpbFY2GsflKs=", - "owner": "cachix", - "repo": "git-hooks.nix", - "rev": "61ab0e80d9c7ab14c256b5b453d8b3fb0189ba0a", - "type": "github" + "path": "./home/programs/tui/nvf", + "type": "path" }, "original": { - "owner": "cachix", - "repo": "git-hooks.nix", - "type": "github" - } - }, - "quickshell": { - "inputs": { - "nixpkgs": [ - "caelestia-cli", - "caelestia-shell", - "nixpkgs" - ] + "path": "./home/programs/tui/nvf", + "type": "path" }, - "locked": { - "lastModified": 1779430452, - "narHash": "sha256-zTslhsxLqUlRTML506iougTGzyR38Fzhzn7t4KDEuuE=", - "ref": "refs/heads/master", - "rev": "4b4fca3224ab977dc515ac0bb78d00b3dfa71e00", - "revCount": 819, - "type": "git", - "url": "https://git.outfoxxed.me/outfoxxed/quickshell" - }, - "original": { - "type": "git", - "url": "https://git.outfoxxed.me/outfoxxed/quickshell" - } - }, - "quickshell_2": { - "inputs": { - "nixpkgs": [ - "caelestia-shell", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1779430452, - "narHash": "sha256-zTslhsxLqUlRTML506iougTGzyR38Fzhzn7t4KDEuuE=", - "ref": "refs/heads/master", - "rev": "4b4fca3224ab977dc515ac0bb78d00b3dfa71e00", - "revCount": 819, - "type": "git", - "url": "https://git.outfoxxed.me/outfoxxed/quickshell" - }, - "original": { - "type": "git", - "url": "https://git.outfoxxed.me/outfoxxed/quickshell" - } + "parent": [] }, "root": { "inputs": { "awesome-wallpapers": "awesome-wallpapers", "blog": "blog", - "caelestia-cli": "caelestia-cli", - "caelestia-shell": "caelestia-shell_2", "default-creds": "default-creds", + "git-hooks": "git-hooks", "helium-browser": "helium-browser", "home-manager": "home-manager", - "hyprland": "hyprland", "iknowyou": "iknowyou", "nix-index-database": "nix-index-database", "nixarr": "nixarr", "nixos-hardware": "nixos-hardware", - "nixpkgs": "nixpkgs_9", - "nixpkgs-stable": "nixpkgs-stable", + "nixpkgs": "nixpkgs_7", + "nixpkgs-unstable": "nixpkgs-unstable", "notashelf-tuigreet": "notashelf-tuigreet", - "nur-anotherhadi": "nur-anotherhadi", + "nur": "nur", "nvf": "nvf", + "nvf-config": "nvf-config", "sops-nix": "sops-nix", "stylix": "stylix" } @@ -1545,11 +959,11 @@ ] }, "locked": { - "lastModified": 1778555852, - "narHash": "sha256-55EmwooVAS4UpA0oWd5wilKPRqCiHD5BAej9QiNwheY=", + "lastModified": 1780975129, + "narHash": "sha256-428T1pLXnbVeUgZx2wWEkbvl3ZORjras34ANZ3ACp5A=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "f29b0f7a9f367e0056b716f8aa137cb41e784444", + "rev": "fe64e6b409dc513274d2941f8da13bbd0fdcf44e", "type": "github" }, "original": { @@ -1560,14 +974,16 @@ }, "sops-nix": { "inputs": { - "nixpkgs": "nixpkgs_13" + "nixpkgs": [ + "nixpkgs" + ] }, "locked": { - "lastModified": 1780547341, - "narHash": "sha256-Gq8KNx5A7hBB3uGJaj6eQfLDIz5YdLu92gqBcvHvoUo=", + "lastModified": 1781943681, + "narHash": "sha256-NFHmA7H47adqiyp+0iEOyZOQhmigDqA/NBAlf4imB6U=", "owner": "Mic92", "repo": "sops-nix", - "rev": "9ed65852b6257fbeae4355bc24ecfea307ca759a", + "rev": "420f8d2e9882911f65cfac15cc706f639ba96cca", "type": "github" }, "original": { @@ -1583,26 +999,29 @@ "base16-helix": "base16-helix", "base16-vim": "base16-vim", "firefox-gnome-theme": "firefox-gnome-theme", - "flake-parts": "flake-parts_5", + "flake-parts": "flake-parts_6", "gnome-shell": "gnome-shell", - "nixpkgs": "nixpkgs_14", - "nur": "nur", - "systems": "systems_6", + "nixpkgs": [ + "nixpkgs" + ], + "nur": "nur_2", + "systems": "systems_5", "tinted-kitty": "tinted-kitty", "tinted-schemes": "tinted-schemes", "tinted-tmux": "tinted-tmux", "tinted-zed": "tinted-zed" }, "locked": { - "lastModified": 1780584783, - "narHash": "sha256-b4o1AlQpGgpUfieaNz/3gsSzogjoiczmnlbDj0khImY=", - "owner": "danth", + "lastModified": 1786383226, + "narHash": "sha256-SM00z+A0/ruFPGCRdoxDnApVGa3A1iLlhRmMvnGH7tU=", + "owner": "nix-community", "repo": "stylix", - "rev": "6b6b874d082928aa9557e21516d4fe2f2bb305e1", + "rev": "a01dcef2f28b4106d6b3817ab89280194bf716d3", "type": "github" }, "original": { - "owner": "danth", + "owner": "nix-community", + "ref": "release-26.05", "repo": "stylix", "type": "github" } @@ -1639,16 +1058,16 @@ }, "systems_3": { "locked": { - "lastModified": 1689347949, - "narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=", + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", "owner": "nix-systems", - "repo": "default-linux", - "rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", "type": "github" }, "original": { "owner": "nix-systems", - "repo": "default-linux", + "repo": "default", "type": "github" } }, @@ -1682,21 +1101,6 @@ "type": "github" } }, - "systems_6": { - "locked": { - "lastModified": 1681028828, - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", - "owner": "nix-systems", - "repo": "default", - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default", - "type": "github" - } - }, "tinted-kitty": { "flake": false, "locked": { @@ -1716,11 +1120,11 @@ "tinted-schemes": { "flake": false, "locked": { - "lastModified": 1777806186, - "narHash": "sha256-PDF0/wObw4nIsSBeXVYLsloXOiphXCgIdsrNcVXguKs=", + "lastModified": 1785153830, + "narHash": "sha256-fNdfCTeCXU3tZG3TMincd+u68qBHQgCr2Ljr/M1mWP0=", "owner": "tinted-theming", "repo": "schemes", - "rev": "0c94645546f4f3ddac77a1a5fce54eb95bf50795", + "rev": "9bd28ed313560db3c5b605c63bc4e309e78e3fc8", "type": "github" }, "original": { @@ -1732,11 +1136,11 @@ "tinted-tmux": { "flake": false, "locked": { - "lastModified": 1778379944, - "narHash": "sha256-wPDFzMGSlARlw0Sfsn48Q2+jPSfk6N0Ng6BC/d+7Q24=", + "lastModified": 1785031658, + "narHash": "sha256-mZp9O2LjzdMzlqQF3l3fjqsuPBzXy+1qTfBEUGjTlpk=", "owner": "tinted-theming", "repo": "tinted-tmux", - "rev": "fe0203a198690e71a5ff11e08812a4673de3678d", + "rev": "5d2c67f61ea7af36f16865ab6d541cdba41dc257", "type": "github" }, "original": { @@ -1748,11 +1152,11 @@ "tinted-zed": { "flake": false, "locked": { - "lastModified": 1778378178, - "narHash": "sha256-OXPXRIQgGwV77HjYRryOHguh4ALX96jkg+tseLkGgHA=", + "lastModified": 1785030526, + "narHash": "sha256-klZf8UviewRkxuu74Bhbq6tqy7oxebQC7UVRWbbtQxU=", "owner": "tinted-theming", "repo": "base16-zed", - "rev": "9cd816033ff969415b190722cddf134e78a5665f", + "rev": "16f5a8adf4a6b1310d0a61ab172de963e8f76a02", "type": "github" }, "original": { @@ -1883,47 +1287,6 @@ "repo": "website-builder", "type": "github" } - }, - "xdph": { - "inputs": { - "hyprland-protocols": [ - "hyprland", - "hyprland-protocols" - ], - "hyprlang": [ - "hyprland", - "hyprlang" - ], - "hyprutils": [ - "hyprland", - "hyprutils" - ], - "hyprwayland-scanner": [ - "hyprland", - "hyprwayland-scanner" - ], - "nixpkgs": [ - "hyprland", - "nixpkgs" - ], - "systems": [ - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1778265244, - "narHash": "sha256-8jlPtGSsv/CQY6tVVyLF4Jjd0gnS+Zbn9yk/V13A9nM=", - "owner": "hyprwm", - "repo": "xdg-desktop-portal-hyprland", - "rev": "813ea5ca9a1702a9a2d1f5836bc00172ef698968", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "xdg-desktop-portal-hyprland", - "type": "github" - } } }, "root": "root", diff --git a/flake.nix b/flake.nix index a35bc0ad..70c24a1b 100644 --- a/flake.nix +++ b/flake.nix @@ -6,31 +6,45 @@ ''; inputs = { - nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; - nixpkgs-stable.url = "github:nixos/nixpkgs/nixos-25.11"; - nixos-hardware.url = "github:NixOS/nixos-hardware/master"; - hyprland.url = "git+https://github.com/hyprwm/Hyprland?submodules=1"; - stylix.url = "github:danth/stylix"; - sops-nix.url = "github:Mic92/sops-nix"; + nixpkgs.url = "github:nixos/nixpkgs/nixos-26.05"; + nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable"; + nixos-hardware.url = "github:NixOS/nixos-hardware"; nvf.url = "github:notashelf/nvf"; - notashelf-tuigreet.url = "github:NotAShelf/tuigreet"; - helium-browser.url = "github:oxcl/nix-flake-helium-browser"; - nur-anotherhadi.url = "github:anotherhadi/nur-packages"; - + nvf-config = { + url = "path:./home/programs/tui/nvf"; + inputs.nixpkgs.follows = "nixpkgs"; + inputs.nvf.follows = "nvf"; + }; + nur = { + url = "github:nix-community/nur"; + inputs.nixpkgs.follows = "nixpkgs"; + }; nix-index-database = { url = "github:nix-community/nix-index-database"; inputs.nixpkgs.follows = "nixpkgs"; }; home-manager = { - url = "github:nix-community/home-manager"; + url = "github:nix-community/home-manager/release-26.05"; inputs.nixpkgs.follows = "nixpkgs"; }; - caelestia-shell = { - url = "github:caelestia-dots/shell"; + stylix = { + url = "github:nix-community/stylix/release-26.05"; inputs.nixpkgs.follows = "nixpkgs"; }; - caelestia-cli = { - url = "github:caelestia-dots/cli"; + sops-nix = { + url = "github:Mic92/sops-nix"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + notashelf-tuigreet = { + url = "github:NotAShelf/tuigreet"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + helium-browser = { + url = "github:oxcl/nix-flake-helium-browser"; + inputs.nixpkgs.follows = "nixpkgs-unstable"; + }; + git-hooks = { + url = "github:cachix/git-hooks.nix"; inputs.nixpkgs.follows = "nixpkgs"; }; @@ -44,34 +58,49 @@ outputs = inputs @ { nixpkgs, - nixpkgs-stable, + nixpkgs-unstable, + git-hooks, ... }: let system = "x86_64-linux"; + pkgs-unstable = import nixpkgs-unstable { + inherit system; + config.allowUnfree = true; + }; pkgs = nixpkgs.legacyPackages.${system}; args = { inherit inputs nixpkgs system + pkgs-unstable pkgs ; - pkgs-stable = nixpkgs-stable.legacyPackages.${system}; - pkgs-nur-hadi = inputs.nur-anotherhadi.packages.${system}; }; merge = nixpkgs.lib.foldl nixpkgs.lib.recursiveUpdate {}; + supportedSystems = ["x86_64-linux" "aarch64-linux"]; + + forAllSystems = f: + nixpkgs.lib.genAttrs supportedSystems + (system: f system (import nixpkgs {inherit system;})); in merge [ - (import ./home/programs/nvf/flake.nix args) - (import ./home/programs/group/flake.nix args) - (import ./home/programs/nixy/flake.nix args) + (import ./home/programs/tui/nixy/flake.nix args) { formatter.${system} = pkgs.alejandra; + packages.${system}.nvim = inputs.nvf-config.packages.${system}.nvim; + apps.${system}.nvim = inputs.nvf-config.apps.${system}.nvim; nixosConfigurations = { h-laptop = import ./hosts/laptop/flake.nix args; h-work = import ./hosts/work/flake.nix args; jack = import ./hosts/server/flake.nix args; }; + devShells = forAllSystems (system: pkgs: { + default = import ./shell.nix { + inherit pkgs; + gitHooksLib = git-hooks.lib.${system}; + }; + }); } ]; } diff --git a/home/programs/ghostty/default.nix b/home/programs/ghostty/default.nix deleted file mode 100644 index 292d0b2a..00000000 --- a/home/programs/ghostty/default.nix +++ /dev/null @@ -1,66 +0,0 @@ -{ - pkgs, - config, - ... -}: let - cursorShaders = pkgs.fetchFromGitHub { - owner = "sahaj-b"; - repo = "ghostty-cursor-shaders"; - rev = "06d4e90fb5410e9c4d0b3131584060adddf89406"; - hash = "sha256-G/UIr1bKnxn1AcHl/4FL/jou6b7M2VeREslYVELxdmw="; - }; - c = config.lib.stylix.colors; -in { - home.sessionVariables = { - TERMINAL = "ghostty"; - TERM = "ghostty"; - }; - - programs.ghostty = { - enable = true; - installVimSyntax = true; - enableZshIntegration = true; - settings = { - window-padding-x = 10; - confirm-close-surface = false; - window-padding-y = 10; - clipboard-read = "allow"; - clipboard-write = "allow"; - copy-on-select = "clipboard"; - app-notifications = false; - custom-shader = "${cursorShaders}/cursor_warp.glsl"; - custom-shader-animation = "always"; - keybind = [ - # "ctrl+j=goto_split:left" - # "ctrl+i=goto_split:up" - # "ctrl+k=goto_split:down" - # "ctrl+l=goto_split:right" - # "shift+ctrl+h=new_split:left" - # "shift+ctrl+j=new_split:down" - # "shift+ctrl+k=new_split:up" - # "shift+ctrl+l=new_split:right" - "shift+ctrl+tab=new_tab" - ]; - }; - }; - - home.file.".config/ilovetui/config.yaml".text = '' - colors: - base00: "#${c.base00}" # Background - base01: "#${c.base01}" # Lighter Background / Status Bars - base02: "#${c.base02}" # Selection Background - base03: "#${c.base03}" # Comments / Invisibles - base04: "#${c.base04}" # Dark Foreground / Status Bars - base05: "#${c.base05}" # Default Foreground - base06: "#${c.base06}" # Light Foreground - base07: "#${c.base07}" # Light Background - base08: "#${c.base08}" # Variables / Errors / Diff Deleted - base09: "#${c.base09}" # Integers / Constants / Booleans - base0a: "#${c.base0A}" # Classes / Warnings / Search Background - base0b: "#${c.base0B}" # Strings / Success / Diff Inserted - base0c: "#${c.base0C}" # Support / Regex / Escape Characters - base0d: "#${c.base0D}" # Functions / Methods / Headings / Accent - base0e: "#${c.base0E}" # Keywords / Storage / Diff Changed - base0f: "#${c.base0F}" # Embedded / Misc - ''; -} diff --git a/home/programs/group/basic-apps.nix b/home/programs/group/basic-apps.nix deleted file mode 100644 index e9394fd8..00000000 --- a/home/programs/group/basic-apps.nix +++ /dev/null @@ -1,45 +0,0 @@ -{ - pkgs, - pkgs-stable, - pkgs-nur-hadi, - ... -}: { - home.packages = with pkgs-stable; [ - vlc # Video player - obsidian # Note taking app - textpieces # Manipulate texts - resources # Ressource monitor - gnome-clocks # Clocks app - gnome-text-editor # Basic graphic text editor - ticktick # Todo app - pinta # Image editor - switcheroo # Convert images between different formats - onlyoffice-desktopeditors # Office suite - blanket # Listen to different sounds - signal-desktop # Messaging app - librewolf # Backup browser - - # I love TUIs - caligula # User-friendly, lightweight TUI for disk imaging (ISO, USB BOOT) - browsh # A modern text-based browser that renders anything that a modern browser can. It runs in a terminal and can be used remotely over SSH - dysk # A terminal-based disk usage analyzer - wikiman # Offline search engine for manual pages (arch wiki, tldr) - tealdeer # Fast tldr client - sttr # Minimalist "cyberchef" like. Cross-platform, cli app to perform various operations on string - wiremix # Simple TUI mixer for PipeWire - slides # A terminal-based presentation tool that allows you to create and deliver presentations directly from the command line - pom # Pomodoro timer in your terminal - pkgs.wifitui # TUI for managing wifi - pkgs-nur-hadi.usbguard-tui # TUI for managing USBGuard rules - pkgs-nur-hadi.sheets # Terminal based spreadsheet tool - - # I love CLIs - httpie # Command-line HTTP client, a user-friendly cURL replacement - gh # GitHub - gh-dash # A terminal dashboard for GitHub - figlet # Transform text into ASCII art - pastel # Command-line tool to generate, analyze, convert and manipulate colors - imagemagick # Image manipulation tool - chafa # Image to ANSI/Unicode converter and more. - ]; -} diff --git a/home/programs/group/cybersecurity-packages.nix b/home/programs/group/cybersecurity-packages.nix index c0e9af55..25926f1d 100644 --- a/home/programs/group/cybersecurity-packages.nix +++ b/home/programs/group/cybersecurity-packages.nix @@ -1,35 +1,29 @@ -{ - pkgs, - pkgs-stable, - pkgs-nur-hadi, -}: -(with pkgs-stable; [ +{pkgs}: (with pkgs; [ # Web dirb ffuf katana whatweb + sqlmap + nosqli # Hashes hashcat haiti - hydra john # Databases mariadb redis - sqlmap - nosqli # Network inetutils termshark # wireshark in TUI - dnsrecon whois dig nmap samba + hydra # Misc metasploit @@ -41,8 +35,6 @@ # Forensics binwalk -]) -++ (with pkgs-nur-hadi; [ - spilltea - jwt-tui + pkgs.nur.repos.anotherhadi.spilltea + pkgs.nur.repos.anotherhadi.jwt-tui ]) diff --git a/home/programs/group/cybersecurity.nix b/home/programs/group/cybersecurity.nix index cc569cbb..741b683f 100644 --- a/home/programs/group/cybersecurity.nix +++ b/home/programs/group/cybersecurity.nix @@ -1,11 +1,6 @@ -{ - pkgs, - pkgs-stable, - pkgs-nur-hadi, - ... -}: { +{pkgs, ...}: { home.packages = import ./cybersecurity-packages.nix { - inherit pkgs pkgs-stable pkgs-nur-hadi; + inherit pkgs; }; systemd.user.tmpfiles.rules = [ diff --git a/home/programs/group/dev-packages.nix b/home/programs/group/dev-packages.nix deleted file mode 100644 index cd2701ed..00000000 --- a/home/programs/group/dev-packages.nix +++ /dev/null @@ -1,17 +0,0 @@ -{ - pkgs, - pkgs-stable, -}: -(with pkgs; [ - go - claude-code -]) -++ (with pkgs-stable; [ - nodejs - air - duckdb - python3 - jq - nix-prefetch-github - rsync -]) diff --git a/home/programs/group/dev.nix b/home/programs/group/dev.nix index 9cb187e7..a5ff2fb8 100644 --- a/home/programs/group/dev.nix +++ b/home/programs/group/dev.nix @@ -1,7 +1,20 @@ { pkgs, - pkgs-stable, + pkgs-unstable, ... }: { - home.packages = import ./dev-packages.nix {inherit pkgs pkgs-stable;}; + home.packages = with pkgs-unstable; + [ + go + claude-code + ] + ++ (with pkgs; [ + nodejs + air + duckdb + python3 + jq + nix-prefetch-github + rsync + ]); } diff --git a/home/programs/group/flake.nix b/home/programs/group/flake.nix deleted file mode 100644 index 934e475b..00000000 --- a/home/programs/group/flake.nix +++ /dev/null @@ -1,22 +0,0 @@ -{ - inputs, - pkgs, - pkgs-stable, - pkgs-nur-hadi, - system, - ... -}: let - devPackages = import ./dev-packages.nix {inherit pkgs pkgs-stable;}; - cyberPackages = import ./cybersecurity-packages.nix {inherit pkgs pkgs-stable pkgs-nur-hadi;}; -in { - packages.${system} = { - dev = pkgs.buildEnv { - name = "dev-tools"; - paths = devPackages; - }; - cybersecurity = pkgs.buildEnv { - name = "cybersecurity-tools"; - paths = cyberPackages; - }; - }; -} diff --git a/home/programs/group/misc.nix b/home/programs/group/misc.nix deleted file mode 100644 index 436a4625..00000000 --- a/home/programs/group/misc.nix +++ /dev/null @@ -1,16 +0,0 @@ -{ - pkgs-stable, - pkgs-nur-hadi, - inputs, - ... -}: { - home.packages = with pkgs-stable; [ - tty-solitaire - bastet - peaclock - cbonsai - pipes - cmatrix - fastfetch - ]; -} diff --git a/home/programs/helium/bookmarks/default.nix b/home/programs/gui/helium/bookmarks/default.nix similarity index 98% rename from home/programs/helium/bookmarks/default.nix rename to home/programs/gui/helium/bookmarks/default.nix index 46e293cd..0d90328b 100644 --- a/home/programs/helium/bookmarks/default.nix +++ b/home/programs/gui/helium/bookmarks/default.nix @@ -1,7 +1,7 @@ { config, lib, - pkgs, + pkgs-unstable, ... }: let bookmarkList = @@ -451,7 +451,7 @@ in { }; Service = { Type = "simple"; - ExecStart = "${pkgs.darkhttpd}/bin/darkhttpd %h/.local/share/helium-startpage --port 8888 --addr 127.0.0.1 --no-listing"; + ExecStart = "${pkgs-unstable.darkhttpd}/bin/darkhttpd %h/.local/share/helium-startpage --port 8888 --addr 127.0.0.1 --no-listing"; Restart = "on-failure"; }; Install.WantedBy = ["default.target"]; diff --git a/home/programs/helium/bookmarks/entertainment.nix b/home/programs/gui/helium/bookmarks/entertainment.nix similarity index 100% rename from home/programs/helium/bookmarks/entertainment.nix rename to home/programs/gui/helium/bookmarks/entertainment.nix diff --git a/home/programs/helium/bookmarks/general.nix b/home/programs/gui/helium/bookmarks/general.nix similarity index 100% rename from home/programs/helium/bookmarks/general.nix rename to home/programs/gui/helium/bookmarks/general.nix diff --git a/home/programs/helium/bookmarks/infosec.nix b/home/programs/gui/helium/bookmarks/infosec.nix similarity index 100% rename from home/programs/helium/bookmarks/infosec.nix rename to home/programs/gui/helium/bookmarks/infosec.nix diff --git a/home/programs/helium/bookmarks/jack.nix b/home/programs/gui/helium/bookmarks/jack.nix similarity index 100% rename from home/programs/helium/bookmarks/jack.nix rename to home/programs/gui/helium/bookmarks/jack.nix diff --git a/home/programs/helium/bookmarks/other.nix b/home/programs/gui/helium/bookmarks/other.nix similarity index 83% rename from home/programs/helium/bookmarks/other.nix rename to home/programs/gui/helium/bookmarks/other.nix index a43ea982..7e651a5f 100644 --- a/home/programs/helium/bookmarks/other.nix +++ b/home/programs/gui/helium/bookmarks/other.nix @@ -11,6 +11,14 @@ name = "Hyprland Wiki"; url = "https://wiki.hypr.land"; } + { + name = "Nerdfont Cheatsheet"; + url = "https://www.nerdfonts.com/cheat-sheet"; + } + { + name = "Helium Bangs"; + url = "https://helium.computer/bangs"; + } { name = "NVF Options"; url = "https://nvf.notashelf.dev/"; diff --git a/home/programs/helium/bookmarks/tools.nix b/home/programs/gui/helium/bookmarks/tools.nix similarity index 92% rename from home/programs/helium/bookmarks/tools.nix rename to home/programs/gui/helium/bookmarks/tools.nix index 4929cd40..c7dbc7dc 100644 --- a/home/programs/helium/bookmarks/tools.nix +++ b/home/programs/gui/helium/bookmarks/tools.nix @@ -43,6 +43,10 @@ name = "Gemini"; url = "https://gemini.google.com"; } + { + name = "Lumo"; + url = "https://lumo.proton.me"; + } ]; } ] diff --git a/home/programs/helium/default.nix b/home/programs/gui/helium/default.nix similarity index 90% rename from home/programs/helium/default.nix rename to home/programs/gui/helium/default.nix index 769275cc..a1fa4b35 100644 --- a/home/programs/helium/default.nix +++ b/home/programs/gui/helium/default.nix @@ -1,7 +1,7 @@ { inputs, config, - pkgs, + pkgs-unstable, lib, ... }: let @@ -44,11 +44,11 @@ "--show-avatar-button=never" ]; - originalPkg = (inputs.helium-browser.packages.${pkgs.stdenv.hostPlatform.system}.helium).override { + originalPkg = (inputs.helium-browser.packages.${pkgs-unstable.stdenv.hostPlatform.system}.helium).override { flags = heliumFlags; }; - patchScript = pkgs.writeShellScript "helium-patch-prefs" '' + patchScript = pkgs-unstable.writeShellScript "helium-patch-prefs" '' PROFILE="$HOME/.config/net.imput.helium/Default" THEME_DIR="$PROFILE/Extensions/${themeId}/1.0_0" PREFS="$PROFILE/Preferences" @@ -59,7 +59,7 @@ if [ -f "$PREFS" ]; then tmp=$(mktemp) - ${lib.getExe pkgs.jq} \ + ${lib.getExe pkgs-unstable.jq} \ --arg id "${themeId}" \ --slurpfile manifest "$THEME_DIR/manifest.json" \ ' @@ -85,12 +85,13 @@ fi ''; - baseWrapped = pkgs.symlinkJoin { + baseWrapped = pkgs-unstable.symlinkJoin { name = "helium-wrapped"; paths = [originalPkg]; - nativeBuildInputs = [pkgs.makeWrapper]; + nativeBuildInputs = [pkgs-unstable.makeWrapper]; postBuild = '' wrapProgram $out/bin/helium \ + --set-default GTK_USE_PORTAL 1 \ --run ${lib.escapeShellArg (toString patchScript)} ''; }; @@ -111,7 +112,7 @@ in { xdg.desktopEntries.helium = { name = "Helium"; - genericName = "Navigateur Web"; + genericName = "Web Browser"; exec = "${config.programs.helium.package}/bin/helium %U"; icon = "${config.programs.helium.package}/share/icons/hicolor/256x256/apps/helium.png"; terminal = false; @@ -128,7 +129,7 @@ in { xdg.desktopEntries.helium-private = { name = "Helium (Private window)"; - genericName = "Navigateur Web"; + genericName = "Web Browser"; exec = "${config.programs.helium.package}/bin/helium --incognito %U"; icon = "${config.programs.helium.package}/share/icons/hicolor/256x256/apps/helium.png"; terminal = false; diff --git a/home/programs/helium/system.nix b/home/programs/gui/helium/system.nix similarity index 98% rename from home/programs/helium/system.nix rename to home/programs/gui/helium/system.nix index 616605fe..0760542f 100644 --- a/home/programs/helium/system.nix +++ b/home/programs/gui/helium/system.nix @@ -41,7 +41,7 @@ in { DefaultBrowserSettingEnabled = false; DeveloperToolsAvailability = 1; - DnsOverHttpsMode = "secure"; + DnsOverHttpsMode = "automatic"; DnsOverHttpsTemplates = "https://dns.quad9.net/dns-query"; DefaultSearchProviderEnabled = true; diff --git a/home/programs/gui/pkgs.nix b/home/programs/gui/pkgs.nix new file mode 100644 index 00000000..50cf43cb --- /dev/null +++ b/home/programs/gui/pkgs.nix @@ -0,0 +1,17 @@ +{pkgs, ...}: { + home.packages = with pkgs; [ + vlc # Video player + obsidian # Note taking app + textpieces # Manipulate texts + resources # Resource monitor + gnome-clocks # Clocks app + gnome-text-editor # Basic graphic text editor + ticktick # Todo app + pinta # Image editor + switcheroo # Convert images between different formats + onlyoffice-desktopeditors # Office suite + blanket # Listen to different sounds + signal-desktop # Messaging app + thunar # File explorer + ]; +} diff --git a/home/programs/proton/default.nix b/home/programs/gui/proton/default.nix similarity index 100% rename from home/programs/proton/default.nix rename to home/programs/gui/proton/default.nix diff --git a/home/programs/nightshift/default.nix b/home/programs/nightshift/default.nix deleted file mode 100644 index 749adc33..00000000 --- a/home/programs/nightshift/default.nix +++ /dev/null @@ -1,19 +0,0 @@ -{pkgs, ...}: let - nightshift-toggle = - pkgs.writeShellScriptBin "nightshift-toggle" - # bash - '' - if pidof "hyprsunset"; then - pkill hyprsunset - ${pkgs.libnotify}/bin/notify-send "Night Shift Disabled" "Returning to full spectrum light. Filter disabled." - else - ${pkgs.hyprsunset}/bin/hyprsunset -t 4500 & - ${pkgs.libnotify}/bin/notify-send "Night Shift Activated" "Welcome to the warm side. Blue light filtering is now active." - fi - ''; -in { - home.packages = with pkgs; [ - hyprsunset - nightshift-toggle - ]; -} diff --git a/home/programs/nvf/default.nix b/home/programs/nvf/default.nix deleted file mode 100644 index e4009624..00000000 --- a/home/programs/nvf/default.nix +++ /dev/null @@ -1,33 +0,0 @@ -{ - inputs, - pkgs, - config, - ... -}: let - c = config.lib.stylix.colors; -in { - imports = [inputs.nvf.homeManagerModules.default]; - programs.nvf = { - enable = true; - settings = { - vim.luaConfigRC.hl-overrides = '' - local function apply_hl() - vim.api.nvim_set_hl(0, "MiniStarterHeader", { fg = "#${c.base0D}", bold = true }) - vim.api.nvim_set_hl(0, "SnacksPickerBorder", { fg = "#${c.base0D}" }) - vim.api.nvim_set_hl(0, "SnacksPickerTitle", { fg = "#${c.base0D}", bold = true }) - end - apply_hl() - vim.api.nvim_create_autocmd("ColorScheme", { pattern = "*", callback = apply_hl }) - ''; - imports = [ - ./options.nix - ./languages.nix - ./picker.nix - ./snacks.nix - ./keymaps.nix - ./utils.nix - ./mini.nix - ]; - }; - }; -} diff --git a/home/programs/nvf/flake.nix b/home/programs/nvf/flake.nix deleted file mode 100644 index b9fdd4f8..00000000 --- a/home/programs/nvf/flake.nix +++ /dev/null @@ -1,37 +0,0 @@ -{ - inputs, - pkgs, - system, - ... -}: let - nvimConfig = inputs.nvf.lib.neovimConfiguration { - inherit pkgs; - modules = [ - ./options.nix - ./languages.nix - ./picker.nix - ./snacks.nix - ./keymaps.nix - ./utils.nix - ./mini.nix - ]; - }; -in { - packages.${system}.nvim = nvimConfig.neovim; - - apps.${system}.nvim = { - type = "app"; - program = "${nvimConfig.neovim}/bin/nvim"; - }; - defaultApp.${system} = { - type = "app"; - program = "${nvimConfig.neovim}/bin/nvim"; - }; - - homeManagerModules.nvim = { - imports = [ - inputs.nvf.homeManagerModules.default - ./default.nix - ]; - }; -} diff --git a/home/programs/proton/auto-start-vpn.nix b/home/programs/proton/auto-start-vpn.nix deleted file mode 100644 index 6222d7f3..00000000 --- a/home/programs/proton/auto-start-vpn.nix +++ /dev/null @@ -1,5 +0,0 @@ -{ - wayland.windowManager.hyprland.settings.exec-once = [ - "protonvpn-app --start-minimized &" - ]; -} diff --git a/home/programs/shell/fzf.nix b/home/programs/shell/fzf.nix deleted file mode 100644 index 9ad89659..00000000 --- a/home/programs/shell/fzf.nix +++ /dev/null @@ -1,33 +0,0 @@ -# Fzf is a general-purpose command-line fuzzy finder. -{ - config, - lib, - ... -}: let - accent = "#" + config.lib.stylix.colors.base0D; - foreground = "#" + config.lib.stylix.colors.base05; - muted = "#" + config.lib.stylix.colors.base03; -in { - programs.fzf = { - enable = true; - enableZshIntegration = true; - colors = lib.mkForce { - "fg+" = accent; - "bg+" = "-1"; - "fg" = foreground; - "bg" = "-1"; - "prompt" = muted; - "pointer" = accent; - }; - defaultOptions = [ - "--margin=1" - "--layout=reverse" - "--border=none" - "--info='hidden'" - "--header=''" - "--prompt='/ '" - "-i" - "--no-bold" - ]; - }; -} diff --git a/home/programs/shell/zsh.nix b/home/programs/shell/zsh.nix deleted file mode 100644 index f7055bee..00000000 --- a/home/programs/shell/zsh.nix +++ /dev/null @@ -1,196 +0,0 @@ -# My shell configuration -{ - pkgs, - lib, - config, - ... -}: { - home.packages = with pkgs; [ - bat - ripgrep - ]; - - # Add go binaries to the PATH - home.sessionPath = ["$HOME/go/bin"]; - - home.sessionVariables = { - COLORTERM = "truecolor"; - }; - - programs.zsh = { - enable = true; - enableCompletion = true; - autosuggestion.enable = true; - syntaxHighlighting = { - enable = true; - highlighters = [ - "main" - "brackets" - "pattern" - "regexp" - "root" - "line" - ]; - }; - historySubstringSearch.enable = true; - - history = { - ignoreDups = true; - save = 10000; - size = 10000; - }; - - profileExtra = lib.optionalString (config.home.sessionPath != []) '' - export PATH="$PATH''${PATH:+:}${lib.concatStringsSep ":" config.home.sessionPath}" - ''; - - shellAliases = { - # Change default - vim = "nvim"; - vi = "nvim"; - cd = "z"; - ls = "eza --icons=always --no-quotes"; - tree = "eza --icons=always --tree --no-quotes"; - cat = "bat --theme=base16 --color=always --paging=never --tabs=2 --wrap=never --plain"; - mkdir = "mkdir -p"; - - # Shortcuts - spt = "spotatui"; - v = "nvim"; - c = "clear"; - e = "exit"; - open = "${pkgs.xdg-utils}/bin/xdg-open"; - - notes = "nvim ~/notes/index.md --cmd 'cd ~/notes' -c ':lua Snacks.picker.smart()'"; - nix-shell = "nix-shell --command zsh"; - - # git - g = "lazygit"; - ga = "git add"; - gc = "git commit"; - gcu = "git add . && git commit -m 'Update'"; - gp = "git push"; - gpl = "git pull"; - gs = "git status"; - gd = "git diff"; - gco = "git checkout"; - gcb = "git checkout -b"; - gbr = "git branch"; - grs = "git reset HEAD~1"; - grh = "git reset --hard HEAD~1"; - gaa = "git add ."; - gcm = "git commit -m"; - - # Typo - clera = "clear"; - celar = "clear"; - claer = "clear"; - sl = "ls"; - }; - - initContent = - # bash - '' - bindkey -e - - # Open command in VIM - autoload -Uz edit-command-line - zle -N edit-command-line - bindkey '^X' edit-command-line - - # Suffix Aliases - alias -s {nix,md,txt,json,yml,yaml,go}=nvim - alias -s {png,jpg,jpeg,gif,pdf}=xdg-open - - # 3. Global Aliases (Remplacés n'importe où dans la commande, pas seulement au début) - alias -g G="| grep" - alias -g L="| less" - alias -g V="| nvim" - alias -g H="| head" - alias -g T="| tail" - alias -g JQ="| jq" - alias -g C="| wl-copy" - alias -g NE="2>/dev/null" - alias -g ND=">/dev/null" - alias -g NUL=">/dev/null 2>1" - - # search history based on what's typed in the prompt - autoload -U history-search-end - zle -N history-beginning-search-backward-end history-search-end - zle -N history-beginning-search-forward-end history-search-end - bindkey "^[OA" history-beginning-search-backward-end - bindkey "^[OB" history-beginning-search-forward-end - - # General completion behavior - zstyle ':completion:*' completer _extensions _complete _approximate - - # Use cache - zstyle ':completion:*' use-cache on - zstyle ':completion:*' cache-path "$XDG_CACHE_HOME/zsh/.zcompcache" - - # Complete the alias - zstyle ':completion:*' complete true - - # Autocomplete options - zstyle ':completion:*' complete-options true - - # Completion matching control - zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*' - zstyle ':completion:*' keep-prefix true - - # Group matches and describe - zstyle ':completion:*' menu select - zstyle ':completion:*' list-grouped false - zstyle ':completion:*' list-separator ''' - zstyle ':completion:*' group-name ''' - zstyle ':completion:*' verbose yes - zstyle ':completion:*:matches' group 'yes' - zstyle ':completion:*:warnings' format '%F{red}%B-- No match for: %d --%b%f' - zstyle ':completion:*:messages' format '%d' - zstyle ':completion:*:corrections' format '%B%d (errors: %e)%b' - zstyle ':completion:*:descriptions' format '[%d]' - - # Colors - zstyle ':completion:*' list-colors ''${(s.:.)LS_COLORS} - - # Case insensitive tab completion - zstyle ':completion:*:*:cd:*' tag-order local-directories directory-stack path-directories - zstyle ':completion:*:*:cd:*:directory-stack' menu yes select - zstyle ':completion:*:-tilde-:*' group-order 'named-directories' 'path-directories' 'users' 'expand' - zstyle ':completion:*:*:-command-:*:*' group-order aliases builtins functions commands - zstyle ':completion:*' special-dirs true - zstyle ':completion:*' squeeze-slashes true - - # Sort - zstyle ':completion:*' sort false - zstyle ":completion:*:git-checkout:*" sort false - zstyle ':completion:*' file-sort modification - zstyle ':completion:*:eza' sort false - zstyle ':completion:complete:*:options' sort false - zstyle ':completion:files' sort false - - autoload zmv - - hash -d dl=~/Downloads - hash -d ni=~/.config/nixos - hash -d de=~/dev - hash -d cy=~/Cyber - - ${lib.optionalString config.services.gpg-agent.enable '' - gnupg_path=$(ls $XDG_RUNTIME_DIR/gnupg) - export SSH_AUTH_SOCK="$XDG_RUNTIME_DIR/gnupg/$gnupg_path/S.gpg-agent.ssh" - ''} - - # Allow foot to pipe command output - function precmd { - if ! builtin zle; then - print -n "\e]133;D\e\\" - fi - } - function preexec { - print -n "\e]133;C\e\\" - } - - ''; - }; -} diff --git a/home/programs/thunar/default.nix b/home/programs/thunar/default.nix deleted file mode 100644 index b977f6b9..00000000 --- a/home/programs/thunar/default.nix +++ /dev/null @@ -1,176 +0,0 @@ -# Thunar is a file explorer -{ - pkgs, - pkgs-stable, - config, - lib, - ... -}: let - user = config.var.username; -in { - # ctrl + m to toggle the menubar - home.packages = - (with pkgs-stable; [ - xfce.thunar - xfce.xfconf - xfce.tumbler - xfce.thunar-archive-plugin - xfce.thunar-volman - xfce.thunar-media-tags-plugin - p7zip - xarchiver - ]) - ++ (with pkgs; [ - # Icon themes: keep on global pkgs to avoid conflicts with other modules - papirus-icon-theme - material-icons - material-design-icons - material-symbols - ]); - - gtk = { - enable = true; - iconTheme = { - name = "Papirus-Dark"; - package = pkgs.papirus-icon-theme; - }; - - # bookmarks for the side pane - gtk3.bookmarks = [ - "file:///home/${user}/Downloads Downloads" - "file:///home/${user}/Pictures Pictures" - "file:///home/${user}/.config/nixos NixOS" - "file:///home/${user}/dev Development" - ]; - }; - - qt.enable = true; - - home.sessionVariables = { - XDG_ICON_DIR = "${pkgs.papirus-icon-theme}/share/icons/Papirus"; - QS_ICON_THEME = "Papirus"; - QT_STYLE_OVERRIDE = lib.mkForce "Fusion"; - }; - - home.file.".config/xarchiver/xarchiverrc".text = '' - [xarchiver] - preferred_format=0 - prefer_unzip=true - confirm_deletion=true - sort_filename_content=false - advanced_isearch=true - auto_expand=true - store_output=false - icon_size=2 - show_archive_comment=false - show_sidebar=true - show_location_bar=true - show_toolbar=true - preferred_custom_cmd= - preferred_temp_dir=/tmp - preferred_extract_dir=./ - allow_sub_dir=0 - ensure_directory=true - overwrite=false - full_path=2 - touch=false - fresh=false - update=false - store_path=false - updadd=true - freshen=false - recurse=true - solid_archive=false - remove_files=false - ''; - - home.file.".config/xfce4/xfconf/xfce-perchannel-xml/thunar.xml" = { - text = '' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ''; - force = true; - }; - - xdg.configFile."Thunar/uca.xml".text = '' - - - - utilities-terminal - Open Terminal Here - 1700000000000001 - ghostty -d %f - Opens terminal in the selected folder - * - - - - - - Extract here - - 1689618425925956-3 - xarchiver -x . %f - Extracts the archive into the directory it is located in. - * - *.tar.bz2;*.tar.gz;*.tar.xz;*.tar.Z;*.tar;*.taz;*.tb2;*.tbz;*.tbz2;*.tgz;*.txz;*.zip;*.bz2;*.docx;*.apk;*.gz;*.odt; - - - - package-x-generic - Compress here (tar.gz) - - 1700000000000003 - tar -czvf %n.tar.gz %N - Creates a compressed archive (.tar.gz) of selected files/folders. - * - * - - - - - ''; -} diff --git a/home/programs/tui/elio/default.nix b/home/programs/tui/elio/default.nix new file mode 100644 index 00000000..c627854f --- /dev/null +++ b/home/programs/tui/elio/default.nix @@ -0,0 +1,119 @@ +{ + pkgs, + config, + ... +}: let + c = config.lib.stylix.colors; + # TODO: Waiting for a version in nixpkgs + version = "1.11.2"; + sources = { + "x86_64-linux" = { + url = "https://github.com/elio-fm/elio/releases/download/v${version}/elio-${version}-x86_64-unknown-linux-gnu.tar.gz"; + hash = "sha256-9cW/xUA9p0LEYI3/j4MGPVZvcyJpV1JYKYBuHur4sTM="; + }; + "aarch64-linux" = { + url = "https://github.com/elio-fm/elio/releases/download/v${version}/elio-${version}-aarch64-unknown-linux-gnu.tar.gz"; + hash = "sha256-zg141Dp+jHwAqzoaCNvOoC7ZFeAX+cO8HZF5W7wz1Qs="; + }; + }; + source = + sources.${pkgs.stdenv.hostPlatform.system} + or (throw "elio: unsupported platform ${pkgs.stdenv.hostPlatform.system}"); + + elio = pkgs.stdenv.mkDerivation { + pname = "elio"; + inherit version; + + src = pkgs.fetchurl {inherit (source) url hash;}; + + nativeBuildInputs = [pkgs.autoPatchelfHook]; + + buildInputs = [pkgs.stdenv.cc.cc.lib]; + + installPhase = '' + runHook preInstall + + install -Dm755 elio -t $out/bin + + for size in 48 128 256 512; do + install -Dm644 \ + "packaging/linux/icons/hicolor/''${size}x''${size}/apps/elio.png" \ + "$out/share/icons/hicolor/''${size}x''${size}/apps/elio.png" + done + install -Dm644 packaging/linux/elio.desktop -t $out/share/applications + + runHook postInstall + ''; + + meta = { + description = "Terminal file manager"; + homepage = "https://github.com/elio-fm/elio"; + license = pkgs.lib.licenses.mit; + mainProgram = "elio"; + platforms = builtins.attrNames sources; + sourceProvenance = [pkgs.lib.sourceTypes.binaryNativeCode]; + }; + }; +in { + home.packages = [elio]; + + xdg.desktopEntries.elio = { + name = "elio"; + exec = "${pkgs.ghostty}/bin/ghostty +new-window -e ${elio}/bin/elio %f"; + terminal = false; + icon = "elio"; + mimeType = ["inode/directory"]; + categories = ["System" "FileManager" "FileTools" "ConsoleOnly"]; + }; + + xdg.configFile."elio/theme.toml".text = '' + [palette] + bg = "#${c.base00}" + chrome = "#${c.base01}" + chrome_alt = "#${c.base01}" + chip_text = "#${c.base00}" + panel = "#${c.base00}" + panel_alt = "#${c.base00}" + surface = "#${c.base02}" + elevated = "#${c.base02}" + border = "#${c.base03}" + text = "#${c.base05}" + muted = "#${c.base04}" + accent = "#${c.base0D}" + accent_soft = "#${c.base02}" + accent_text = "#${c.base06}" + selected_bg = "#${c.base02}" + selected_border = "#${c.base0D}" + selection_bar = "#${c.base09}" + yank_bar = "#${c.base0B}" + cut_bar = "#${c.base08}" + progress_bar = "#${c.base0D}" + grid_selection_band = "#${c.base02}" + grid_yank_band = "#${c.base01}" + grid_cut_band = "#${c.base01}" + sidebar_active = "#${c.base02}" + button_bg = "#${c.base01}" + button_disabled_bg = "#${c.base01}" + path_bg = "#${c.base00}" + + [preview.code] + fg = "#${c.base05}" + bg = "#${c.base01}" + selection_bg = "#${c.base02}" + selection_fg = "#${c.base06}" + caret = "#${c.base0C}" + line_highlight = "#${c.base01}" + line_number = "#${c.base03}" + comment = "#${c.base03}" + string = "#${c.base0B}" + constant = "#${c.base09}" + keyword = "#${c.base0E}" + function = "#${c.base0D}" + type = "#${c.base0A}" + parameter = "#${c.base08}" + tag = "#${c.base0C}" + operator = "#${c.base0C}" + macro = "#${c.base0F}" + invalid = "#${c.base08}" + ''; +} diff --git a/home/programs/tui/ghostty/default.nix b/home/programs/tui/ghostty/default.nix new file mode 100644 index 00000000..fea74e9a --- /dev/null +++ b/home/programs/tui/ghostty/default.nix @@ -0,0 +1,40 @@ +# Ghostty is a terminal emulator +{ + pkgs, + config, + ... +}: let + cursorShaders = pkgs.fetchFromGitHub { + owner = "sahaj-b"; + repo = "ghostty-cursor-shaders"; + rev = "06d4e90fb5410e9c4d0b3131584060adddf89406"; + hash = "sha256-G/UIr1bKnxn1AcHl/4FL/jou6b7M2VeREslYVELxdmw="; + }; + c = config.lib.stylix.colors; +in { + home.sessionVariables = { + TERMINAL = "ghostty"; + TERM = "ghostty"; + }; + + programs.ghostty = { + enable = true; + installVimSyntax = true; + enableZshIntegration = true; + settings = { + window-padding-x = 10; + confirm-close-surface = false; + window-padding-y = 10; + gtk-single-instance = true; + clipboard-read = "allow"; + clipboard-write = "allow"; + copy-on-select = "clipboard"; + app-notifications = false; + custom-shader = "${cursorShaders}/cursor_warp.glsl"; + custom-shader-animation = "always"; + keybind = [ + "shift+ctrl+tab=new_tab" + ]; + }; + }; +} diff --git a/home/programs/git/default.nix b/home/programs/tui/git/default.nix similarity index 85% rename from home/programs/git/default.nix rename to home/programs/tui/git/default.nix index 49f5e9c9..e86cf5df 100644 --- a/home/programs/git/default.nix +++ b/home/programs/tui/git/default.nix @@ -16,6 +16,9 @@ in { "node_modules" "result" "result-*" + ".superpowers/" + ".claude/" + "docs/superpowers/" ]; settings = { user.name = username; @@ -40,13 +43,10 @@ in { d = "diff"; ps = "!git push origin $(git rev-parse --abbrev-ref HEAD)"; pl = "!git pull origin $(git rev-parse --abbrev-ref HEAD)"; - af = "!git add $(git ls-files -m -o --exclude-standard | sk -m)"; st = "status"; br = "branch"; - df = "!git hist | peco | awk '{print $2}' | xargs -I {} git diff {}^ {}"; hist = ''log --pretty=format:"%Cgreen%h %Creset%cd %Cblue[%cn] %Creset%s%C(yellow)%d%C(reset)" --graph --date=relative --decorate --all''; llog = ''log --graph --name-status --pretty=format:"%C(red)%h %C(reset)(%cd) %C(green)%an %Creset%s %C(yellow)%d%Creset" --date=relative''; - edit-unmerged = "!f() { git ls-files --unmerged | cut -f2 | sort -u ; }; hx `f`"; }; }; }; diff --git a/home/programs/git/lazygit.nix b/home/programs/tui/git/lazygit.nix similarity index 100% rename from home/programs/git/lazygit.nix rename to home/programs/tui/git/lazygit.nix diff --git a/home/programs/git/signing.nix b/home/programs/tui/git/signing.nix similarity index 100% rename from home/programs/git/signing.nix rename to home/programs/tui/git/signing.nix diff --git a/home/programs/tui/ilovetui/default.nix b/home/programs/tui/ilovetui/default.nix new file mode 100644 index 00000000..8f5af11e --- /dev/null +++ b/home/programs/tui/ilovetui/default.nix @@ -0,0 +1,23 @@ +{config, ...}: let + c = config.lib.stylix.colors; +in { + home.file.".config/ilovetui/config.yaml".text = '' + colors: + base00: "#${c.base00}" # Background + base01: "#${c.base01}" # Lighter Background / Status Bars + base02: "#${c.base02}" # Selection Background + base03: "#${c.base03}" # Comments / Invisibles + base04: "#${c.base04}" # Dark Foreground / Status Bars + base05: "#${c.base05}" # Default Foreground + base06: "#${c.base06}" # Light Foreground + base07: "#${c.base07}" # Light Background + base08: "#${c.base08}" # Variables / Errors / Diff Deleted + base09: "#${c.base09}" # Integers / Constants / Booleans + base0a: "#${c.base0A}" # Classes / Warnings / Search Background + base0b: "#${c.base0B}" # Strings / Success / Diff Inserted + base0c: "#${c.base0C}" # Support / Regex / Escape Characters + base0d: "#${c.base0D}" # Functions / Methods / Headings / Accent + base0e: "#${c.base0E}" # Keywords / Storage / Diff Changed + base0f: "#${c.base0F}" # Embedded / Misc + ''; +} diff --git a/home/programs/nix-utils/default.nix b/home/programs/tui/nix-utils/default.nix similarity index 100% rename from home/programs/nix-utils/default.nix rename to home/programs/tui/nix-utils/default.nix diff --git a/home/programs/nixy/default.nix b/home/programs/tui/nixy/default.nix similarity index 100% rename from home/programs/nixy/default.nix rename to home/programs/tui/nixy/default.nix diff --git a/home/programs/nixy/flake.nix b/home/programs/tui/nixy/flake.nix similarity index 100% rename from home/programs/nixy/flake.nix rename to home/programs/tui/nixy/flake.nix diff --git a/home/programs/nixy/package.nix b/home/programs/tui/nixy/package.nix similarity index 100% rename from home/programs/nixy/package.nix rename to home/programs/tui/nixy/package.nix diff --git a/home/programs/tui/nvf/default.nix b/home/programs/tui/nvf/default.nix new file mode 100644 index 00000000..cc737723 --- /dev/null +++ b/home/programs/tui/nvf/default.nix @@ -0,0 +1,38 @@ +{ + config, + lib, + ... +}: { + home.sessionVariables = { + EDITOR = "nvim"; + VISUAL = "nvim"; + }; + + programs.nvf = { + enable = true; + settings = { + vim.luaConfigRC = lib.mkIf (config ? stylix && config.stylix.enable) { + hl-overrides = let + c = config.lib.stylix.colors; + in '' + local function apply_hl() + vim.api.nvim_set_hl(0, "MiniStarterHeader", { fg = "#${c.base0D}", bold = true }) + vim.api.nvim_set_hl(0, "SnacksPickerBorder", { fg = "#${c.base0D}" }) + vim.api.nvim_set_hl(0, "SnacksPickerTitle", { fg = "#${c.base0D}", bold = true }) + end + apply_hl() + vim.api.nvim_create_autocmd("ColorScheme", { pattern = "*", callback = apply_hl }) + ''; + }; + imports = [ + ./options.nix + ./languages.nix + ./picker.nix + ./snacks.nix + ./keymaps.nix + ./utils.nix + ./mini.nix + ]; + }; + }; +} diff --git a/home/programs/tui/nvf/flake.lock b/home/programs/tui/nvf/flake.lock new file mode 100644 index 00000000..c82848e8 --- /dev/null +++ b/home/programs/tui/nvf/flake.lock @@ -0,0 +1,133 @@ +{ + "nodes": { + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1777699697, + "narHash": "sha256-Eg9b/rq/ECYwNwEXs5i9wHyhxNI0JrYx2srdI2uZMaQ=", + "ref": "refs/heads/main", + "rev": "382052b74656a369c5408822af3f2501e9b1af81", + "revCount": 94, + "type": "git", + "url": "https://git.lix.systems/lix-project/flake-compat.git" + }, + "original": { + "type": "git", + "url": "https://git.lix.systems/lix-project/flake-compat.git" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": [ + "nvf", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1778716662, + "narHash": "sha256-m1Yf0wZ8j1OHjTc2UwHwyQRSnNeSgLJOd7q5Y45hzi4=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "f7c1a2d347e4c52d5fb8d10cb4d94b5884e546fb", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "mnw": { + "locked": { + "lastModified": 1780772958, + "narHash": "sha256-VKKe8r4pwCGWZ3Yr9CPN129R4S3CKLSrlYqdYz3vKpM=", + "owner": "Gerg-L", + "repo": "mnw", + "rev": "0871dbf63a53610c95db04439ed8ea4d6ec9c160", + "type": "github" + }, + "original": { + "owner": "Gerg-L", + "repo": "mnw", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1785133411, + "narHash": "sha256-Yjv0WEg39KRYS0rBdTbu6Fc/or/ihAKk13W9sQ6VWd0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "2f5a153c270b70cb0f8c11f46d96d6d3bc39f4e3", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-26.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1781216227, + "narHash": "sha256-9mUW6gNwoN2SWc/l0fW4svPNOulXLl8ijqKyeSOGgJE=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a0374025a863d007d98e3297f6aa46cc3141c2f0", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-26.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nvf": { + "inputs": { + "flake-compat": "flake-compat", + "flake-parts": "flake-parts", + "mnw": "mnw", + "nixpkgs": "nixpkgs_2", + "systems": "systems" + }, + "locked": { + "lastModified": 1781997110, + "narHash": "sha256-6D6xtYN5t1kZGNd69eMZsRBkgX5Df1roErn/kFR1C+A=", + "owner": "notashelf", + "repo": "nvf", + "rev": "320f60b97075a58d38b90fc5e39f478421dbd38a", + "type": "github" + }, + "original": { + "owner": "notashelf", + "repo": "nvf", + "type": "github" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs", + "nvf": "nvf" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/home/programs/tui/nvf/flake.nix b/home/programs/tui/nvf/flake.nix new file mode 100644 index 00000000..bd1198c6 --- /dev/null +++ b/home/programs/tui/nvf/flake.nix @@ -0,0 +1,57 @@ +{ + description = "Hadi's NVF Neovim configuration"; + + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-26.05"; + nvf.url = "github:notashelf/nvf"; + }; + + outputs = { + self, + nixpkgs, + nvf, + ... + }: let + systems = ["x86_64-linux" "aarch64-linux" "aarch64-darwin" "x86_64-darwin"]; + forAllSystems = f: nixpkgs.lib.genAttrs systems f; + modules = [ + ./options.nix + ./languages.nix + ./picker.nix + ./snacks.nix + ./keymaps.nix + ./utils.nix + ./mini.nix + ]; + in { + packages = forAllSystems (system: let + pkgs = nixpkgs.legacyPackages.${system}; + nvim = (nvf.lib.neovimConfiguration {inherit pkgs modules;}).neovim; + in { + inherit nvim; + default = nvim; + }); + + apps = forAllSystems (system: let + nvim = { + type = "app"; + program = "${self.packages.${system}.nvim}/bin/nvim"; + }; + in { + inherit nvim; + default = nvim; + }); + + homeManagerModules = rec { + nvim = { + imports = [ + nvf.homeManagerModules.default + ./default.nix + ]; + }; + default = nvim; + }; + + formatter = forAllSystems (system: nixpkgs.legacyPackages.${system}.alejandra); + }; +} diff --git a/home/programs/nvf/keymaps.nix b/home/programs/tui/nvf/keymaps.nix similarity index 99% rename from home/programs/nvf/keymaps.nix rename to home/programs/tui/nvf/keymaps.nix index b708c1b9..09e62b53 100644 --- a/home/programs/nvf/keymaps.nix +++ b/home/programs/tui/nvf/keymaps.nix @@ -98,7 +98,7 @@ mode = "n"; silent = true; action = "set spell!"; - desc = "Toggle spellLazyGitcheck"; + desc = "Toggle spell check"; } { key = "uc"; diff --git a/home/programs/nvf/languages.nix b/home/programs/tui/nvf/languages.nix similarity index 96% rename from home/programs/nvf/languages.nix rename to home/programs/tui/nvf/languages.nix index efc96f32..3a9b3f20 100644 --- a/home/programs/nvf/languages.nix +++ b/home/programs/tui/nvf/languages.nix @@ -1,4 +1,4 @@ -{...}: { +{pkgs, ...}: { vim = { diagnostics = { enable = true; @@ -25,6 +25,7 @@ context.enable = true; highlight.enable = true; textobjects.enable = true; + grammars = [pkgs.vimPlugins.nvim-treesitter.grammarPlugins.http]; }; lsp = { enable = true; diff --git a/home/programs/nvf/mini.nix b/home/programs/tui/nvf/mini.nix similarity index 96% rename from home/programs/nvf/mini.nix rename to home/programs/tui/nvf/mini.nix index 1de33586..808415ab 100644 --- a/home/programs/nvf/mini.nix +++ b/home/programs/tui/nvf/mini.nix @@ -23,13 +23,12 @@ miniclue.gen_clues.z(), { mode = 'n', keys = 'f', desc = '+find' }, { mode = 'n', keys = 's', desc = '+search' }, - { mode = 'n', keys = 't', desc = '+terminal' }, + { mode = 'n', keys = 't', desc = '+tools' }, { mode = 'n', keys = 'u', desc = '+ui' }, { mode = 'n', keys = 'l', desc = '+lsp' }, { mode = 'n', keys = 'x', desc = '+trouble' }, { mode = 'n', keys = '!', desc = 'shell' }, { mode = 'v', keys = '!', desc = 'shell' }, - { mode = 'n', keys = 'e', desc = 'yazi' }, }, window = { delay = 300 }, }) diff --git a/home/programs/nvf/options.nix b/home/programs/tui/nvf/options.nix similarity index 100% rename from home/programs/nvf/options.nix rename to home/programs/tui/nvf/options.nix diff --git a/home/programs/nvf/picker.nix b/home/programs/tui/nvf/picker.nix similarity index 99% rename from home/programs/nvf/picker.nix rename to home/programs/tui/nvf/picker.nix index eae7de36..8ef37d6b 100644 --- a/home/programs/nvf/picker.nix +++ b/home/programs/tui/nvf/picker.nix @@ -18,7 +18,7 @@ desc = "Smart Find Files"; } { - key = "E"; + key = "e"; mode = "n"; silent = true; action = "lua Snacks.explorer()"; diff --git a/home/programs/nvf/snacks.nix b/home/programs/tui/nvf/snacks.nix similarity index 100% rename from home/programs/nvf/snacks.nix rename to home/programs/tui/nvf/snacks.nix diff --git a/home/programs/nvf/utils.nix b/home/programs/tui/nvf/utils.nix similarity index 90% rename from home/programs/nvf/utils.nix rename to home/programs/tui/nvf/utils.nix index 57647fa5..200ffde1 100644 --- a/home/programs/nvf/utils.nix +++ b/home/programs/tui/nvf/utils.nix @@ -5,15 +5,7 @@ vim.keymap.del("n", "tdt") ''; undoFile.enable = true; - utility.yazi-nvim = { - enable = true; - mappings.openYazi = "e"; - }; notes.todo-comments.enable = true; - assistant.copilot = { - enable = true; - cmp.enable = true; - }; autocomplete = { nvim-cmp = { diff --git a/home/programs/tui/pkgs.nix b/home/programs/tui/pkgs.nix new file mode 100644 index 00000000..bd17240e --- /dev/null +++ b/home/programs/tui/pkgs.nix @@ -0,0 +1,39 @@ +{pkgs, ...}: { + home.packages = with pkgs; [ + # I love TUIs + caligula # User-friendly, lightweight TUI for disk imaging (ISO, USB BOOT) + dysk # A terminal-based disk usage analyzer + wikiman # Offline search engine for manual pages (arch wiki, tldr) + tealdeer # Fast tldr client + sttr # A minimalist CyberChef-like, cross-platform CLI app for performing various operations on strings + slides # A terminal-based presentation tool that allows you to create and deliver presentations directly from the command line + pom # Pomodoro timer in your terminal + tabiew # A terminal-based CSV viewer and manipulator + jless # A pager for JSON + pkgs.nur.repos.anotherhadi.usbguard-tui # TUI for managing USBGuard rules + pkgs.nur.repos.anotherhadi.sheets # Terminal based spreadsheet tool + pkgs.nur.repos.anotherhadi.settuings # Terminal based settings (wifi, bluetooth, audio, ...) + rainfrog # TODO: To test + posting # TODO: To test + newsboat # TODO: To test + dooit # TODO: To test + + # I love CLIs + httpie # Command-line HTTP client, a user-friendly cURL replacement + gh # GitHub + gh-dash # A terminal dashboard for GitHub + figlet # Transform text into ASCII art + pastel # Command-line tool to generate, analyze, convert and manipulate colors + imagemagick # Image manipulation tool + chafa # Image to ANSI/Unicode converter and more. + + # Just cool + tty-solitaire + bastet + peaclock + cbonsai + pipes + cmatrix + fastfetch + ]; +} diff --git a/home/programs/shell/default.nix b/home/programs/tui/shell/default.nix similarity index 100% rename from home/programs/shell/default.nix rename to home/programs/tui/shell/default.nix diff --git a/home/programs/shell/direnv.nix b/home/programs/tui/shell/direnv.nix similarity index 51% rename from home/programs/shell/direnv.nix rename to home/programs/tui/shell/direnv.nix index 2b51c9d2..67ff2113 100644 --- a/home/programs/shell/direnv.nix +++ b/home/programs/tui/shell/direnv.nix @@ -1,6 +1,8 @@ { programs.direnv = { enable = true; - nix-direnv.enable = true; + nix-direnv = { + enable = true; + }; }; } diff --git a/home/programs/shell/eza.nix b/home/programs/tui/shell/eza.nix similarity index 77% rename from home/programs/shell/eza.nix rename to home/programs/tui/shell/eza.nix index dbf4c51f..6322edcc 100644 --- a/home/programs/shell/eza.nix +++ b/home/programs/tui/shell/eza.nix @@ -1,5 +1,8 @@ # Eza is a ls replacement { + programs.zsh.initContent = '' + compdef eza=ls + ''; programs.eza = { enable = true; icons = "auto"; diff --git a/home/programs/tui/shell/fzf.nix b/home/programs/tui/shell/fzf.nix new file mode 100644 index 00000000..281ac6e6 --- /dev/null +++ b/home/programs/tui/shell/fzf.nix @@ -0,0 +1,50 @@ +# Fzf is a general-purpose command-line fuzzy finder. +{ + config, + lib, + ... +}: let + accent = "#" + config.lib.stylix.colors.base0D; + foreground = "#" + config.lib.stylix.colors.base05; + muted = "#" + config.lib.stylix.colors.base03; + previewCmd = "bat --color=always --style=plain,numbers --line-range=:500 {}"; +in { + programs.fzf = { + enable = true; + enableZshIntegration = true; + + defaultCommand = "fd --type f --hidden --strip-cwd-prefix"; + fileWidgetCommand = "fd --type f --hidden --strip-cwd-prefix"; + fileWidgetOptions = ["--preview '${previewCmd}'"]; + + colors = lib.mkForce { + "fg+" = accent; + "bg+" = "-1"; + "fg" = foreground; + "bg" = "-1"; + "prompt" = muted; + "pointer" = accent; + }; + + defaultOptions = [ + "--height=60%" + "--layout=reverse" + "--border=none" + "--prompt='/ '" + "--preview-window=right:65%:wrap:border-left" + "-i" + "--no-bold" + ]; + }; + + programs.zsh.initContent = lib.mkAfter '' + _fzf_file_no_hidden() { + local cmd result + cmd="''${FZF_DEFAULT_COMMAND/--hidden /}" + result=$(eval "''${cmd:-find . -type f}" | fzf --preview "${previewCmd}") \ + && LBUFFER+="$result" + zle reset-prompt + } + zle -N _fzf_file_no_hidden + ''; +} diff --git a/home/programs/shell/starship.nix b/home/programs/tui/shell/starship.nix similarity index 100% rename from home/programs/shell/starship.nix rename to home/programs/tui/shell/starship.nix diff --git a/home/programs/shell/zoxide.nix b/home/programs/tui/shell/zoxide.nix similarity index 100% rename from home/programs/shell/zoxide.nix rename to home/programs/tui/shell/zoxide.nix diff --git a/home/programs/tui/shell/zsh.nix b/home/programs/tui/shell/zsh.nix new file mode 100644 index 00000000..ec07a530 --- /dev/null +++ b/home/programs/tui/shell/zsh.nix @@ -0,0 +1,152 @@ +# My shell configuration +{ + pkgs, + lib, + config, + ... +}: { + home.packages = with pkgs; [ + bat + ripgrep + ]; + + home = { + sessionPath = ["$HOME/go/bin"]; + sessionVariables = { + COLORTERM = "truecolor"; + MANPAGER = "bat -l man -p"; + }; + }; + + programs.zsh = { + enable = true; + autocd = true; + enableCompletion = true; + autosuggestion.enable = true; + syntaxHighlighting.enable = true; + historySubstringSearch.enable = true; + + plugins = [ + { + name = "zsh-vi-mode"; + src = pkgs.zsh-vi-mode; + file = "share/zsh-vi-mode/zsh-vi-mode.plugin.zsh"; + } + ]; + + history = { + ignoreDups = true; + findNoDups = true; + expireDuplicatesFirst = true; + ignoreSpace = true; + append = true; + save = 10000; + size = 10000; + }; + + setOptions = [ + "NOBEEP" + "AUTOCD" + "NUMERIC_GLOB_SORT" + ]; + + profileExtra = lib.optionalString (config.home.sessionPath != []) '' + export PATH="$PATH''${PATH:+:}${lib.concatStringsSep ":" config.home.sessionPath}" + ''; + + shellAliases = { + # Change default + vim = "nvim"; + vi = "nvim"; + cd = "z"; + ls = "eza --icons=always --no-quotes"; + tree = "eza --icons=always --tree --no-quotes"; + cat = "bat --theme=base16 --color=always --paging=never --tabs=2 --wrap=never --plain"; + mkdir = "mkdir -p"; + nix-shell = "nix-shell --command zsh"; + grep = "rg --color=auto"; + diff = "diff --color=auto"; + df = "df -h"; + + # Shortcuts + spt = "spotatui"; + open = "${pkgs.xdg-utils}/bin/xdg-open"; + + notes = "nvim ~/notes/index.md --cmd 'cd ~/notes' -c ':lua Snacks.picker.smart()'"; + + # git + g = "lazygit"; + ga = "git add"; + gc = "git commit"; + gp = "git push"; + gpl = "git pull"; + gs = "git status"; + gd = "git diff"; + gco = "git checkout"; + gcb = "git checkout -b"; + gbr = "git branch"; + grs = "git reset HEAD~1"; + grh = "git reset --hard HEAD~1"; + gaa = "git add ."; + gcm = "git commit -m"; + + # Original binaries + ocat = "/run/current-system/sw/bin/cat"; + ols = "/run/current-system/sw/bin/ls"; + ocd = "builtin cd"; + + # Typo + clera = "clear"; + celar = "clear"; + claer = "clear"; + sl = "ls"; + }; + + initContent = lib.mkMerge [ + (lib.mkOrder 550 '' + function zvm_config() { + ZVM_INSERT_MODE_CURSOR=$ZVM_CURSOR_BEAM + ZVM_NORMAL_MODE_CURSOR=$ZVM_CURSOR_BLOCK + ZVM_VISUAL_MODE_CURSOR=$ZVM_CURSOR_BLOCK + + ZVM_VI_HIGHLIGHT_BACKGROUND=none + ZVM_VI_HIGHLIGHT_FOREGROUND=none + ZVM_VI_HIGHLIGHT_EXTRASTYLE=none + } + '') + # bash + '' + # Suffix Aliases + alias -s {nix,md,txt,yml,yaml,go}=nvim + alias -s {json,jsonl}=jless + alias -s {csv,tsv,parquet,pqt,arrow,db,sqlite,xls,xlsx,xlsm,xlsb,fwf}=tw + alias -s {png,jpg,jpeg,gif,pdf}=xdg-open + + # Global Aliases + alias -g G="| rg" + alias -g L="| less" + alias -g V="| nvim" + alias -g H="| head" + alias -g T="| tail" + alias -g JQ="| jq" + alias -g C="| wl-copy" + alias -g NE="2>/dev/null" + alias -g ND=">/dev/null" + alias -g NUL=">/dev/null 2>&1" + + autoload zmv # Mv for multiple files + + zstyle ':completion:*' menu select + zstyle ':completion:*' matcher-list 'm:{a-z}={A-Za-z}' + + zvm_after_init() { + bindkey '^[[1;5C' forward-word + bindkey '^[[1;5D' backward-word + bindkey '^F' _fzf_file_no_hidden + bindkey '^[[A' history-substring-search-up + bindkey '^[[B' history-substring-search-down + } + '' + ]; + }; +} diff --git a/home/programs/spotatui/default.nix b/home/programs/tui/spotatui/default.nix similarity index 100% rename from home/programs/spotatui/default.nix rename to home/programs/tui/spotatui/default.nix diff --git a/home/programs/yazi/default.nix b/home/programs/yazi/default.nix deleted file mode 100644 index 1c721249..00000000 --- a/home/programs/yazi/default.nix +++ /dev/null @@ -1,129 +0,0 @@ -{pkgs, ...}: { - programs.yazi = { - enable = true; - shellWrapperName = "y"; - - plugins = { - git = { - package = pkgs.yaziPlugins.git; - setup = true; - }; - ouch = pkgs.yaziPlugins.ouch; - piper = pkgs.yaziPlugins.piper; - convert = pkgs.yaziPlugins.convert; - "jump-to-char" = pkgs.yaziPlugins."jump-to-char"; - "wl-clipboard" = pkgs.yaziPlugins."wl-clipboard"; - "batch-rename-gui" = pkgs.yaziPlugins.mkYaziPlugin { - pname = "batch-rename-gui.yazi"; - version = "0-unstable-2025-07-08"; - src = pkgs.fetchFromGitHub { - owner = "pakhromov"; - repo = "batch-rename-gui.yazi"; - rev = "5c2d5aa349948b6ab405a171541faab44751f6a5"; - hash = "sha256-3RviPY3WOyYi5GWXWRYMWp6VLxCe5cuJX7Kb7AyWxLE="; - }; - }; - }; - - settings.mgr.ratio = [0 4 3]; - - settings.plugin = { - prepend_fetchers = [ - { - url = "*"; - run = "git"; - group = "git"; - } - { - url = "*/"; - run = "git"; - group = "git"; - } - ]; - prepend_previewers = [ - { - url = "*.md"; - run = ''piper -- CLICOLOR_FORCE=1 glow -w=$w -s=dark "$1"''; - } - ]; - prepend_openers = [ - { - url = "*.{zip,tar,gz,bz2,xz,7z,rar}"; - run = "ouch"; - } - ]; - }; - - keymap.mgr.prepend_keymap = [ - { - on = ["C"]; - run = "plugin ouch"; - desc = "Compress"; - } - { - on = ["X"]; - run = "plugin ouch --args=extract"; - desc = "Extract"; - } - { - on = ["c" "p"]; - run = "plugin convert -- --extension='png'"; - desc = "Convert to PNG"; - } - { - on = ["c" "j"]; - run = "plugin convert -- --extension='jpg'"; - desc = "Convert to JPG"; - } - { - on = ["c" "w"]; - run = "plugin convert -- --extension='webp'"; - desc = "Convert to WebP"; - } - { - on = ["M"]; - run = ''shell 'exiftool "$@" | less' --block''; - desc = "Show metadata"; - } - { - on = ["T"]; - run = "plugin toggle-parent"; - desc = "Toggle parent pane"; - } - { - on = ["F"]; - run = "plugin jump-to-char"; - desc = "Jump to char"; - } - { - on = ["Y"]; - run = "plugin wl-clipboard"; - desc = "Copy to clipboard (Wayland)"; - } - { - on = ["B"]; - run = "plugin batch-rename-gui"; - desc = "Batch rename"; - } - ]; - }; - - home.packages = with pkgs; [glow ouch hexyl exiftool fzf wl-clipboard]; - - xdg.configFile."yazi/plugins/toggle-parent.yazi/main.lua".text = '' - --- @sync entry - local RESTORE_WIDTH = 1 - return { - entry = function(st, job) - local r = rt.mgr.ratio - if r.parent == 0 then - rt.mgr.ratio = { st.width or RESTORE_WIDTH, r.current, r.preview } - else - st.width = r.parent - rt.mgr.ratio = { 0, r.current, r.preview } - end - ya.emit("app:resize", {}) - end - } - ''; -} diff --git a/home/system/caelestia-shell/appearance.nix b/home/system/caelestia-shell/appearance.nix deleted file mode 100644 index f80a0c9d..00000000 --- a/home/system/caelestia-shell/appearance.nix +++ /dev/null @@ -1,50 +0,0 @@ -{ - pkgs, - config, - ... -}: let - inherit (config.theme) bar-rounding bar-thickness; - inherit (config.stylix) fonts; -in { - home.packages = with pkgs; [ - papirus-icon-theme - ]; - - programs.caelestia.settings = { - paths.sessionGif = ./session-gif-hacker-cat.gif; - background.enabled = false; - appearance = { - transparency = { - enabled = true; - base = config.theme.active-opacity; - layers = config.theme.inactive-opacity; - }; - font.family = { - material = "Material Symbols Rounded"; - mono = fonts.monospace.name; - sans = fonts.sansSerif.name; - }; - }; - utilities = { - enabled = true; - maxToasts = 4; - toasts = { - audioInputChanged = false; - audioOutputChanged = false; - capsLockChanged = false; - chargingChanged = true; - configLoaded = false; - dndChanged = true; - gameModeChanged = true; - numLockChanged = false; - nowPlaying = false; - kbLayoutChanged = false; - }; - }; - dashboard.showOnHover = false; - border = { - rounding = bar-rounding; - thickness = bar-thickness; - }; - }; -} diff --git a/home/system/caelestia-shell/bar.nix b/home/system/caelestia-shell/bar.nix deleted file mode 100644 index 532c4f45..00000000 --- a/home/system/caelestia-shell/bar.nix +++ /dev/null @@ -1,68 +0,0 @@ -{ - programs.caelestia.settings.bar = { - clock.showIcon = false; - popouts.activeWindow = false; - persistent = true; - status = { - showBattery = true; - showMicrophone = false; - showLockStatus = false; - showBluetooth = true; - showAudio = true; - showKbLayout = false; - showNetwork = true; - }; - workspaces = { - activeIndicator = true; - activeLabel = "󰪥 "; - activeTrail = false; - label = " "; - occupiedBg = true; - occupiedLabel = "󰪥 "; - showWindows = false; - shown = 5; - }; - entries = [ - { - id = "logo"; - enabled = true; - } - { - id = "workspaces"; - enabled = true; - } - { - id = "spacer"; - enabled = true; - } - { - id = "activeWindow"; - enabled = true; - } - { - id = "spacer"; - enabled = true; - } - { - id = "tray"; - enabled = true; - } - { - id = "clock"; - enabled = true; - } - { - id = "statusIcons"; - enabled = true; - } - { - id = "power"; - enabled = true; - } - ]; - tray = { - background = false; - recolour = false; - }; - }; -} diff --git a/home/system/caelestia-shell/default.nix b/home/system/caelestia-shell/default.nix deleted file mode 100644 index b7c4e94f..00000000 --- a/home/system/caelestia-shell/default.nix +++ /dev/null @@ -1,80 +0,0 @@ -# Caelestia Shell Home Manager Configuration -# See https://github.com/caelestia-dots/shell -{ - pkgs, - inputs, - lib, - ... -}: { - imports = [ - inputs.caelestia-shell.homeManagerModules.default - ./bar.nix - ./launcher.nix - ./appearance.nix - ./scheme.nix - ./swappy.nix - ]; - - programs.caelestia = { - enable = true; - systemd.enable = false; - settings = { - services.weatherLocation = "Paris"; - general = { - apps = { - terminal = ["ghostty"]; - audio = ["pavucontrol"]; - explorer = ["thunar"]; - }; - idle = { - timeouts = []; - }; - }; - }; - cli = { - enable = true; - settings.theme = { - enableTerm = false; - enableDiscord = false; - enableSpicetify = false; - enableBtop = false; - enableCava = false; - enableHypr = false; - enableGtk = false; - enableQt = false; - }; - }; - }; - - home.packages = with pkgs; [ - gpu-screen-recorder - ]; - - wayland.windowManager.hyprland.settings.exec-once = [ - "uwsm app -- caelestia resizer -d" - "uwsm app -- caelestia shell -d" - "caelestia scheme set -n onedark" - "caelestia scheme set -n custom" - ]; - - # shell.json is managed by home-manager (read-only symlink) but caelestia - # needs to write to it at runtime: replace the symlink with a mutable copy. - # The stale .hm-backup must be removed before linkGeneration so HM can - # back up the runtime-modified shell.json without hitting a conflict. - home.activation.caelestiaCleanBackup = lib.hm.dag.entryBefore ["linkGeneration"] '' - $DRY_RUN_CMD rm -f "$HOME/.config/caelestia/shell.json.hm-backup" - ''; - - home.activation.caelestiaWritableShellConfig = lib.hm.dag.entryAfter ["linkGeneration"] '' - if [ -L "$HOME/.config/caelestia/shell.json" ]; then - $DRY_RUN_CMD cp --remove-destination \ - "$(readlink -f "$HOME/.config/caelestia/shell.json")" \ - "$HOME/.config/caelestia/shell.json" - fi - ''; - - services.cliphist = { - enable = true; - allowImages = true; - }; -} diff --git a/home/system/caelestia-shell/launcher.nix b/home/system/caelestia-shell/launcher.nix deleted file mode 100644 index cf90a482..00000000 --- a/home/system/caelestia-shell/launcher.nix +++ /dev/null @@ -1,188 +0,0 @@ -{ - programs.caelestia.settings = { - session.commands = { - shutdown = [ - "systemctl" - "poweroff" - ]; - logout = [ - "loginctl" - "lock-session" - ]; - hibernate = [ - "systemctl" - "hibernate" - ]; - reboot = [ - "systemctl" - "reboot" - ]; - }; - launcher = { - actionPrefix = "/"; - actions = [ - { - name = "Calculator"; - icon = "calculate"; - description = "Do simple math equations (powered by Qalc)"; - command = [ - "autocomplete" - "calc" - ]; - enabled = true; - dangerous = false; - } - { - name = "Shutdown"; - icon = "power_settings_new"; - description = "Shutdown the system"; - command = [ - "systemctl" - "poweroff" - ]; - enabled = true; - dangerous = true; - } - { - name = "Reboot"; - icon = "cached"; - description = "Reboot the system"; - command = [ - "systemctl" - "reboot" - ]; - enabled = true; - dangerous = true; - } - { - name = "Logout"; - icon = "exit_to_app"; - description = "Log out of the current session"; - command = [ - "loginctl" - "terminate-user" - "" - ]; - enabled = true; - dangerous = true; - } - { - name = "Lock"; - icon = "lock"; - description = "Lock the current session"; - command = [ - "loginctl" - "lock-session" - ]; - enabled = true; - dangerous = false; - } - { - name = "Sleep"; - icon = "bedtime"; - description = "Suspend then hibernate"; - command = [ - "systemctl" - "suspend-then-hibernate" - ]; - enabled = true; - dangerous = false; - } - { - name = "Restart caelestia"; - icon = "cached"; - description = "Restart caelestia"; - command = [ - "hyprctl" - "dispatch" - "exec" - "caelestia-shell kill | sleep 1 | caelestia-shell" - ]; - enabled = true; - dangerous = false; - } - { - name = "Emoji Picker"; - icon = "mood"; - description = "Toggle the emoji picker"; - command = [ - "caelestia" - "emoji" - "-p" - ]; - enabled = true; - dangerous = false; - } - { - name = "Clipboard History"; - icon = "content_paste"; - description = "Toggle the clipboard history"; - command = [ - "caelestia" - "clipboard" - ]; - enabled = true; - dangerous = false; - } - { - name = "Delete from Clipboard History"; - icon = "content_paste_off"; - description = "Delete a line from the clipboard history"; - command = [ - "caelestia" - "clipboard" - ]; - enabled = true; - dangerous = false; - } - { - name = "Night Shift"; - icon = "moon_stars"; - description = "Toggle Night Shift, the blue light filter"; - command = ["nightshift-toggle"]; - enabled = true; - dangerous = false; - } - { - name = "Hyprpicker"; - icon = "colorize"; - description = "Pick an hex color"; - command = [ - "hyprpicker" - "-a" - ]; - enabled = true; - dangerous = false; - } - { - name = "Run in background"; - icon = "play_circle"; - description = "Type and run any shell command in the background"; - command = [ - "ghostty" - "--title=run-bg" - "-e" - "bash" - "-c" - "printf 'Run: '; read -r cmd; [ -n \"$cmd\" ] && hyprctl dispatch exec \"$cmd\"" - ]; - enabled = true; - dangerous = false; - } - ]; - dragThreshold = 50; - enableDangerousActions = false; - maxShown = 7; - specialPrefix = "@"; - useFuzzy = { - apps = false; - actions = false; - schemes = false; - variants = false; - wallpapers = false; - }; - showOnHover = false; - hiddenApps = []; - }; - }; -} diff --git a/home/system/caelestia-shell/scheme.nix b/home/system/caelestia-shell/scheme.nix deleted file mode 100644 index e8c6e5b5..00000000 --- a/home/system/caelestia-shell/scheme.nix +++ /dev/null @@ -1,137 +0,0 @@ -# This Nix module customizes the color scheme of the Caelestia CLI application using the Stylix base16 color palette. -{ - pkgs, - inputs, - config, - ... -}: let - colors = config.lib.stylix.colors; - - customSchemeFile = pkgs.writeText "custom-dark.txt" '' - primary_paletteKeyColor ${colors.base0D} - secondary_paletteKeyColor ${colors.base04} - tertiary_paletteKeyColor ${colors.base08} - neutral_paletteKeyColor ${colors.base03} - neutral_variant_paletteKeyColor ${colors.base03} - background ${colors.base00} - onBackground ${colors.base05} - surface ${colors.base00} - surfaceDim ${colors.base00} - surfaceBright ${colors.base02} - surfaceContainerLowest ${colors.base01} - surfaceContainerLow ${colors.base01} - surfaceContainer ${colors.base01} - surfaceContainerHigh ${colors.base02} - surfaceContainerHighest ${colors.base02} - onSurface ${colors.base05} - surfaceVariant ${colors.base02} - onSurfaceVariant ${colors.base04} - inverseSurface ${colors.base05} - inverseOnSurface ${colors.base00} - outline ${colors.base03} - outlineVariant ${colors.base02} - shadow ${colors.base00} - scrim ${colors.base00} - surfaceTint ${colors.base0D} - primary ${colors.base0D} - onPrimary ${colors.base00} - primaryContainer ${colors.base0D} - onPrimaryContainer ${colors.base05} - inversePrimary ${colors.base0D} - secondary ${colors.base0C} - onSecondary ${colors.base00} - secondaryContainer ${colors.base02} - onSecondaryContainer ${colors.base0C} - tertiary ${colors.base08} - onTertiary ${colors.base00} - tertiaryContainer ${colors.base08} - onTertiaryContainer ${colors.base00} - error ${colors.base08} - onError ${colors.base00} - errorContainer ${colors.base08} - onErrorContainer ${colors.base05} - primaryFixed ${colors.base0D} - primaryFixedDim ${colors.base0D} - onPrimaryFixed ${colors.base00} - onPrimaryFixedVariant ${colors.base00} - secondaryFixed ${colors.base0C} - secondaryFixedDim ${colors.base0C} - onSecondaryFixed ${colors.base00} - onSecondaryFixedVariant ${colors.base02} - tertiaryFixed ${colors.base08} - tertiaryFixedDim ${colors.base08} - onTertiaryFixed ${colors.base00} - onTertiaryFixedVariant ${colors.base00} - term0 ${colors.base00} - term1 ${colors.base08} - term2 ${colors.base0B} - term3 ${colors.base0A} - term4 ${colors.base0D} - term5 ${colors.base0E} - term6 ${colors.base0C} - term7 ${colors.base05} - term8 ${colors.base03} - term9 ${colors.base08} - term10 ${colors.base0B} - term11 ${colors.base0A} - term12 ${colors.base0D} - term13 ${colors.base0E} - term14 ${colors.base0C} - term15 ${colors.base07} - rosewater ${colors.base06} - flamingo ${colors.base0F} - pink ${colors.base0E} - mauve ${colors.base0D} - red ${colors.base08} - maroon ${colors.base08} - peach ${colors.base09} - yellow ${colors.base0A} - green ${colors.base0B} - teal ${colors.base0C} - sky ${colors.base0C} - sapphire ${colors.base0C} - blue ${colors.base0D} - lavender ${colors.base0D} - klink ${colors.base0D} - klinkSelection ${colors.base0D} - kvisited ${colors.base0E} - kvisitedSelection ${colors.base0E} - knegative ${colors.base08} - knegativeSelection ${colors.base08} - kneutral ${colors.base0A} - kneutralSelection ${colors.base0A} - kpositive ${colors.base0B} - kpositiveSelection ${colors.base0B} - text ${colors.base05} - subtext1 ${colors.base04} - subtext0 ${colors.base03} - overlay2 ${colors.base03} - overlay1 ${colors.base03} - overlay0 ${colors.base02} - surface2 ${colors.base02} - surface1 ${colors.base01} - surface0 ${colors.base01} - base ${colors.base00} - mantle ${colors.base00} - crust ${colors.base00} - success ${colors.base0B} - onSuccess ${colors.base00} - successContainer ${colors.base0B} - onSuccessContainer ${colors.base05} - ''; - - colorsHash = builtins.hashString "sha256" (builtins.toJSON colors); - - customCli = - inputs.caelestia-cli.packages.${pkgs.stdenv.hostPlatform.system}.default.overrideAttrs - (oldAttrs: { - name = "${oldAttrs.name or "caelestia-cli"}-themed-${colorsHash}"; - postUnpack = '' - mkdir -p $sourceRoot/src/caelestia/data/schemes/custom/main - cp ${customSchemeFile} $sourceRoot/src/caelestia/data/schemes/custom/main/dark.txt - echo "Custom scheme added to source" - ''; - }); -in { - programs.caelestia.cli.package = customCli; -} diff --git a/home/system/caelestia-shell/session-gif-hacker-cat.gif b/home/system/caelestia-shell/session-gif-hacker-cat.gif deleted file mode 100644 index 4cc58d5e..00000000 Binary files a/home/system/caelestia-shell/session-gif-hacker-cat.gif and /dev/null differ diff --git a/home/system/caelestia-shell/swappy.nix b/home/system/caelestia-shell/swappy.nix deleted file mode 100644 index 8a250493..00000000 --- a/home/system/caelestia-shell/swappy.nix +++ /dev/null @@ -1,11 +0,0 @@ -{ - xdg.configFile."swappy/config".text = '' - [Default] - save_dir=~/Pictures/Screenshots - save_filename_format=screenshot-%Y%m%d-%H%M%S.png - show_panel=false - line_size=5 - text_size=20 - text_font=sans-serif - ''; -} diff --git a/home/system/clipboard/default.nix b/home/system/clipboard/default.nix new file mode 100644 index 00000000..ed0925f1 --- /dev/null +++ b/home/system/clipboard/default.nix @@ -0,0 +1,24 @@ +# Clipboard history: cliphist watches the Wayland clipboard and stores every +# entry (text + images) so it can be recalled later via the `clipboard-menu` +# script (tofi). Uses the home-manager module so the watcher services are +# managed the same way as swaync/hypridle. +{pkgs, ...}: { + services.cliphist = { + enable = true; + allowImages = true; + }; + + systemd.user.services.cliphist-wipe = { + Unit = { + Description = "Wipe cliphist history on login and logout"; + After = ["cliphist.service"]; + }; + Service = { + Type = "oneshot"; + RemainAfterExit = true; + ExecStart = "${pkgs.cliphist}/bin/cliphist wipe"; + ExecStop = "${pkgs.cliphist}/bin/cliphist wipe"; + }; + Install.WantedBy = ["default.target"]; + }; +} diff --git a/home/system/hypridle/default.nix b/home/system/hypridle/default.nix new file mode 100644 index 00000000..d2533d60 --- /dev/null +++ b/home/system/hypridle/default.nix @@ -0,0 +1,31 @@ +# hypridle handles idle management: lock the screen, turn the display off, and +# suspend after periods of inactivity. The `caffeine-toggle` script pauses it. +{pkgs, ...}: { + services.hypridle = { + enable = true; + settings = { + general = { + # Avoid starting multiple hyprlock instances. + lock_cmd = "${pkgs.procps}/bin/pidof ${pkgs.hyprlock}/bin/hyprlock || ${pkgs.hyprlock}/bin/hyprlock"; + before_sleep_cmd = "loginctl lock-session"; + after_sleep_cmd = "${pkgs.hyprland}/bin/hyprctl dispatch dpms on"; + }; + + listener = [ + { + timeout = 300; # 5 min → lock + on-timeout = "loginctl lock-session"; + } + { + timeout = 360; # 6 min → screen off + on-timeout = "${pkgs.hyprland}/bin/hyprctl dispatch dpms off"; + on-resume = "${pkgs.hyprland}/bin/hyprctl dispatch dpms on"; + } + { + timeout = 1800; # 30 min → suspend + on-timeout = "systemctl suspend"; + } + ]; + }; + }; +} diff --git a/home/system/hyprland/animations.nix b/home/system/hyprland/animations.nix index a0a3952f..c038187d 100644 --- a/home/system/hyprland/animations.nix +++ b/home/system/hyprland/animations.nix @@ -6,13 +6,9 @@ then "4" else if animationSpeed == "medium" then "2.5" - else "1.5"; - borderDuration = - if animationSpeed == "slow" - then "10" - else if animationSpeed == "medium" - then "6" - else "3"; + else if animationSpeed == "fast" + then "1.5" + else "0.5"; in { wayland.windowManager.hyprland.settings = { animations = { @@ -38,7 +34,7 @@ in { "windows, 1, ${animationDuration}, md3_decel, popin 60%" "windowsIn, 1, ${animationDuration}, md3_decel, popin 60%" "windowsOut, 1, ${animationDuration}, md3_accel, popin 60%" - "border, 1, ${borderDuration}, default" + "border, 1, ${animationDuration}, default" "fade, 1, ${animationDuration}, md3_decel" "layersIn, 1, ${animationDuration}, menu_decel, slide" "layersOut, 1, ${animationDuration}, menu_accel" diff --git a/home/system/hyprland/bindings.nix b/home/system/hyprland/bindings.nix index 2da3577f..a91f1702 100644 --- a/home/system/hyprland/bindings.nix +++ b/home/system/hyprland/bindings.nix @@ -5,6 +5,7 @@ ... }: let colors = config.lib.stylix.colors; + scripts = import ../waybar/scripts.nix {inherit pkgs config;}; mkMenu = menu: let configFile = pkgs.writeText "config.yaml" ( @@ -91,14 +92,13 @@ in { "$mod,B, exec, uwsm app -- ${config.programs.helium.package}/bin/helium" # Browser # Power - "$mod, X, global, caelestia:session" # Powermenu ( - "$shiftMod, X, exec, " + "$mod, X, exec, " + lib.getExe (mkMenu [ { key = "l"; desc = "Lock"; - cmd = "hyprctl dispatch global caelestia:lock"; + cmd = "${pkgs.hyprlock}/bin/hyprlock"; } { key = "s"; @@ -115,31 +115,20 @@ in { desc = "Power Off"; cmd = "systemctl poweroff"; } - { - key = "n"; - desc = "Nightshift"; - cmd = "nightshift-toggle"; - } - { - key = "c"; - desc = "Restart caelestia"; - cmd = "hyprctl dispatch exec 'caelestia-shell kill | sleep 1 | caelestia-shell'"; - } ]) ) # Quick launch - "$mod,RETURN, exec, uwsm app -- ${pkgs.ghostty}/bin/ghostty" # Ghostty (terminal) - "$mod,E, exec, uwsm app -- ${pkgs.thunar}/bin/thunar" # Thunar - "$shiftMod, E, exec, pkill fuzzel || caelestia emoji -p" # Emoji picker - "$mod, SPACE, global, caelestia:launcher" # Launcher - "$mod, N, exec, caelestia shell drawers toggle sidebar" # Sidebar (Notifications, quick actions) - "$mod, D, exec, caelestia shell drawers toggle dashboard" # Dashboard + "$mod,RETURN, exec, ${pkgs.ghostty}/bin/ghostty +new-window" # Ghostty (terminal, via daemon D-Bus) + "$mod,E, exec, ${pkgs.ghostty}/bin/ghostty +new-window -e elio" # Elio + "$mod, SPACE, exec, ${pkgs.tofi}/bin/tofi-drun" # Launcher + "$mod, N, exec, ${pkgs.swaynotificationcenter}/bin/swaync-client -t" # Notification center # Windows "$mod,Q, killactive," # Close window "$mod,F, fullscreen" # Toggle Fullscreen "$shiftMod,F, togglefloating," # Toggle Floating + "$shiftMod, SPACE, exec, ${scripts.focus-toggle}/bin/focus-toggle" # Toggle focus mode # Focus Windows "$mod,H, movefocus, l" # Move focus left @@ -151,11 +140,13 @@ in { "$shiftMod,K, layoutmsg, addmaster" # Add to master "$shiftMod,L, focusmonitor, 1" # Focus next monitor + # Special workspaces + "$mod, S, togglespecialworkspace, scratch" # Toggle scratch workspace + "$shiftMod, S, movetoworkspace, special:scratch" # Move to scratch workspace + # Utilities - "$shiftMod, SPACE, exec, caelestia shell gameMode toggle" # Toggle Focus/Game mode - "$shiftMod, S, global, caelestia:screenshotFreeze" # Capture region (freeze) - ", Print, global, caelestia:screenshotFreeze" # Capture region (freeze) - "$shiftMod+Alt, S, global, caelestia:screenshot" # Capture region + ", Print, exec, ${pkgs.hyprshot}/bin/hyprshot -m region" # Capture region + "$shiftMod, Print, exec, ${pkgs.hyprshot}/bin/hyprshot -m output" # Capture screen ] ++ (builtins.concatLists ( builtins.genList ( @@ -176,32 +167,21 @@ in { bindl = [ # Brightness - ", XF86MonBrightnessUp, global, caelestia:brightnessUp" - ", XF86MonBrightnessDown, global, caelestia:brightnessDown" + ", XF86MonBrightnessUp, exec, ${scripts.bright-up}/bin/bright-up" + ", XF86MonBrightnessDown, exec, ${scripts.bright-down}/bin/bright-down" # Media - ", XF86AudioPlay, global, caelestia:mediaToggle" - ", XF86AudioPause, global, caelestia:mediaToggle" - ", XF86AudioNext, global, caelestia:mediaNext" - ", XF86AudioPrev, global, caelestia:mediaPrev" - ", XF86AudioStop, global, caelestia:mediaStop" + ", XF86AudioPlay, exec, ${pkgs.playerctl}/bin/playerctl play-pause" + ", XF86AudioPause, exec, ${pkgs.playerctl}/bin/playerctl play-pause" + ", XF86AudioNext, exec, ${pkgs.playerctl}/bin/playerctl next" + ", XF86AudioPrev, exec, ${pkgs.playerctl}/bin/playerctl previous" + ", XF86AudioStop, exec, ${pkgs.playerctl}/bin/playerctl stop" # Sound - ", XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle" - ", XF86AudioRaiseVolume, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ 0; wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+" - ", XF86AudioLowerVolume, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ 0; wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-" - ]; - - bindin = [ - # Launcher - "$mod, mouse:272, global, caelestia:launcherInterrupt" - "$mod, mouse:273, global, caelestia:launcherInterrupt" - "$mod, mouse:274, global, caelestia:launcherInterrupt" - "$mod, mouse:275, global, caelestia:launcherInterrupt" - "$mod, mouse:276, global, caelestia:launcherInterrupt" - "$mod, mouse:277, global, caelestia:launcherInterrupt" - "$mod, mouse_up, global, caelestia:launcherInterrupt" - "$mod, mouse_down, global, caelestia:launcherInterrupt" + ", XF86AudioMute, exec, ${scripts.vol-mute}/bin/vol-mute" + ", XF86AudioRaiseVolume, exec, ${scripts.vol-up}/bin/vol-up" + ", XF86AudioLowerVolume, exec, ${scripts.vol-down}/bin/vol-down" + ", XF86AudioMicMute, exec, ${scripts.mic-mute}/bin/mic-mute" ]; }; } diff --git a/home/system/hyprland/default.nix b/home/system/hyprland/default.nix index aa158bbb..fbe48e61 100644 --- a/home/system/hyprland/default.nix +++ b/home/system/hyprland/default.nix @@ -1,5 +1,6 @@ # Hyprland is a dynamic tiling Wayland compositor that is highly customizable and performant. { + pkgs-unstable, pkgs, config, lib, @@ -19,51 +20,52 @@ in { ./animations.nix ./bindings.nix ./polkitagent.nix - ./keyboard-backlight.nix # CHANGEME: This is for omen laptop only + ./hyprpaper.nix ]; - home.packages = with pkgs; [ - qt5.qtwayland - qt6.qtwayland - libsForQt5.qt5ct - qt6Packages.qt6ct - xcb-util-cursor - libxcb - hyprland-qtutils - adw-gtk3 - hyprshot - hyprpicker - swappy - imv - wf-recorder - wlr-randr - brightnessctl - gnome-themes-extra - dconf - wayland-utils - wayland-protocols - ]; + home.packages = + (with pkgs-unstable; [ + qt5.qtwayland + qt6.qtwayland + hyprland-qtutils + ]) + ++ (with pkgs; [ + libsForQt5.qt5ct + qt6Packages.qt6ct + xcb-util-cursor + papirus-icon-theme + material-icons + material-design-icons + material-symbols + libxcb + adw-gtk3 + hyprshot + hyprpicker + satty + imv + wf-recorder + brightnessctl + gnome-themes-extra + dconf + wayland-utils + wayland-protocols + ]); wayland.windowManager.hyprland = { enable = true; configType = "hyprlang"; xwayland.enable = true; - systemd = { - enable = false; - variables = [ - "--all" - ]; # https://wiki.hyprland.org/Nix/Hyprland-on-Home-Manager/#programs-dont-work-in-systemd-services-but-do-on-the-terminal - }; + systemd.enable = false; package = null; portalPackage = null; settings = { - exec-once = [ - "dbus-update-activation-environment --systemd --all &" + monitor = [ + ",preferred,auto,1" # default ]; - monitor = [ - ",prefered,auto,1" # default + exec-once = [ + "systemctl --user start app-com.mitchellh.ghostty.service" ]; env = [ @@ -84,7 +86,6 @@ in { cursor = { no_hardware_cursors = true; - default_monitor = "eDP-2"; }; general = { @@ -122,6 +123,11 @@ in { gesture = "3, horizontal, workspace"; + layerrule = [ + "match:namespace launcher, animation popin 70%" + "match:namespace swaync-control-center, animation slide right" + ]; + windowrule = [ "match:class .*, suppress_event maximize" "match:class helium, suppress_event fullscreen" @@ -168,4 +174,20 @@ in { }; }; }; + + qt.enable = true; + + gtk = { + enable = true; + iconTheme = { + name = "Papirus-Dark"; + package = pkgs.papirus-icon-theme; + }; + }; + + home.sessionVariables = { + XDG_ICON_DIR = "${pkgs.papirus-icon-theme}/share/icons/Papirus"; + QS_ICON_THEME = "Papirus"; + QT_STYLE_OVERRIDE = lib.mkForce "Fusion"; + }; } diff --git a/home/system/hyprpaper/default.nix b/home/system/hyprland/hyprpaper.nix similarity index 100% rename from home/system/hyprpaper/default.nix rename to home/system/hyprland/hyprpaper.nix diff --git a/home/system/hyprland/keyboard-backlight.nix b/home/system/hyprland/keyboard-backlight.nix deleted file mode 100644 index 53b72caa..00000000 --- a/home/system/hyprland/keyboard-backlight.nix +++ /dev/null @@ -1,44 +0,0 @@ -# Turn the keyboard red/off when the battery is low -# Include this one only if you have a omen laptop with RGB keyboard -{ - pkgs, - config, - ... -}: let - alert-when-low-battery = false; - keyboard-backlight = pkgs.writeShellScriptBin "keyboard-backlight" '' - function set_keyboard_backlight { - local color=$1 - echo $color > /sys/devices/platform/hp-wmi/rgb_zones/zone00 - echo $color > /sys/devices/platform/hp-wmi/rgb_zones/zone01 - echo $color > /sys/devices/platform/hp-wmi/rgb_zones/zone02 - echo $color > /sys/devices/platform/hp-wmi/rgb_zones/zone03 - } - state="white" - set_keyboard_backlight ${config.lib.stylix.colors.base0D} - if [ "${toString alert-when-low-battery}" = "false" ]; then - exit 0 - fi - while true; do - BATTERY_LEVEL=$(cat /sys/class/power_supply/BAT*/capacity) - IS_CHARGING=$(cat /sys/class/power_supply/BAT*/status) - if [[ $BATTERY_LEVEL -le 10 && $IS_CHARGING != "Charging" ]]; then - if [[ $state == "red" ]];then - state="white" - set_keyboard_backlight "000000" - else - state="red" - set_keyboard_backlight "FF0000" - fi - else - state="white" - set_keyboard_backlight ${config.lib.stylix.colors.base0D} - fi - sleep 2 - done - ''; - - command = "bash ${keyboard-backlight}/bin/keyboard-backlight &"; -in { - wayland.windowManager.hyprland.settings.exec-once = [command]; -} diff --git a/home/system/hyprlock/default.nix b/home/system/hyprlock/default.nix new file mode 100644 index 00000000..26e5d31b --- /dev/null +++ b/home/system/hyprlock/default.nix @@ -0,0 +1,82 @@ +{config, ...}: let + c = config.lib.stylix.colors; +in { + stylix.targets.hyprlock.enable = false; + + programs.hyprlock = { + enable = true; + settings = { + background = [ + { + monitor = ""; + color = "rgba(${c.base00}FF)"; + } + ]; + + label = [ + { + monitor = ""; + text = ''cmd[update:0] echo "[$USER@$(hostname) ~]"''; + color = "rgb(${c.base0D})"; + font_size = 13; + font_family = "Maple Mono NF"; + position = "48, -48"; + halign = "left"; + valign = "top"; + } + { + monitor = ""; + text = ''cmd[update:1000] echo "$(date +'%H:%M:%S')"''; + color = "rgb(${c.base05})"; + font_size = 13; + font_family = "Maple Mono NF"; + position = "48, -70"; + halign = "left"; + valign = "top"; + } + { + monitor = ""; + text = ''cmd[update:60000] echo "$(date +'%A %d %B %Y')"''; + color = "rgb(${c.base04})"; + font_size = 13; + font_family = "Maple Mono NF"; + position = "48, -92"; + halign = "left"; + valign = "top"; + } + { + monitor = ""; + text = "passwd:"; + color = "rgb(${c.base0D})"; + font_size = 13; + font_family = "Maple Mono NF"; + position = "48, -141"; + halign = "left"; + valign = "top"; + } + ]; + + "input-field" = [ + { + monitor = ""; + size = "200, 20"; + outline_thickness = 0; + outer_color = "rgba(00000000)"; + inner_color = "rgba(00000000)"; + font_color = "rgb(${c.base05})"; + fade_on_empty = false; + placeholder_text = ""; + hide_input = true; + rounding = 0; + check_color = "rgb(${c.base0B})"; + fail_color = "rgb(${c.base08})"; + fail_text = ''auth failed''; + capslock_color = "rgb(${c.base0A})"; + position = "116, -138"; + halign = "left"; + valign = "top"; + } + ]; + }; + }; +} diff --git a/home/system/mime/default.nix b/home/system/mime/default.nix index c94805d3..01ecd057 100644 --- a/home/system/mime/default.nix +++ b/home/system/mime/default.nix @@ -1,25 +1,18 @@ -# Mime type associations for the system. { lib, pkgs, ... -}: -with lib; let +}: let defaultApps = { - # check desktop files here: `ls $(echo $XDG_DATA_DIRS| sed "s/:/ /g")` - text = [ - # "org.gnome.TextEditor.desktop" - "nvim-ghostty.desktop" - ]; + text = ["nvim-ghostty.desktop"]; code = ["nvim-ghostty.desktop"]; image = ["imv-dir.desktop"]; - audio = ["mpv.desktop"]; - video = ["mpv.desktop"]; - directory = ["thunar.desktop"]; - office = ["libreoffice.desktop"]; - pdf = ["zathura.desktop"]; - terminal = ["ghostty.desktop"]; - archive = ["xarchiver.desktop"]; + audio = ["vlc.desktop"]; + video = ["vlc.desktop"]; + directory = ["elio.desktop"]; + office = ["onlyoffice-desktopeditors.desktop"]; + pdf = ["onlyoffice-desktopeditors.desktop"]; + archive = ["elio.desktop"]; browser = ["helium.desktop"]; }; @@ -34,7 +27,6 @@ with lib; let "text/x-go" "text/x-java" "text/x-csharp" - "text/x-python" "application/x-shellscript" "text/javascript" @@ -42,7 +34,6 @@ with lib; let "text/css" "text/x-php" "text/x-ruby" - "application/json" "application/xml" "text/xml" @@ -51,11 +42,8 @@ with lib; let "application/toml" "text/x-nix" "text/markdown" - "text/x-dockerfile" - "application/x-yaml" "text/x-terraform" - "application/x-perl" "text/x-lua" "text/x-haskell" @@ -104,12 +92,17 @@ with lib; let "application/rtf" ]; pdf = ["application/pdf"]; - terminal = ["terminal"]; archive = [ "application/zip" - "application/rar" - "application/7z" - "application/*tar" + "application/x-rar-compressed" + "application/vnd.rar" + "application/x-7z-compressed" + "application/x-tar" + "application/gzip" + "application/x-bzip2" + "application/x-xz" + "application/x-zstd" + "application/x-compressed-tar" ]; browser = [ "text/html" @@ -123,19 +116,19 @@ with lib; let nvim-ghostty = pkgs.makeDesktopItem { name = "nvim-ghostty"; desktopName = "Neovim (Ghostty)"; - exec = ''ghostty --title="Neovim Editor" -e nvim %F''; + exec = ''${pkgs.ghostty}/bin/ghostty +new-window --title="Neovim Editor" -e nvim %F''; terminal = false; - categories = [ - "Development" - "TextEditor" - ]; + categories = ["Development" "TextEditor"]; mimeTypes = mimeMap.code ++ mimeMap.text; }; - associations = with lists; - listToAttrs ( - flatten (mapAttrsToList (key: map (type: attrsets.nameValuePair type defaultApps."${key}")) mimeMap) - ); + associations = lib.listToAttrs ( + lib.flatten ( + lib.mapAttrsToList + (key: map (type: lib.nameValuePair type defaultApps.${key})) + mimeMap + ) + ); in { home.packages = [nvim-ghostty]; @@ -144,7 +137,16 @@ in { mimeApps = { enable = true; associations.added = associations; - defaultApplications = associations; + defaultApplications = lib.mapAttrs (_: lib.mkForce) associations; + }; + + userDirs = { + enable = true; + createDirectories = true; + desktop = null; + music = null; + publicShare = null; + templates = null; }; }; } diff --git a/home/system/swaync/default.nix b/home/system/swaync/default.nix new file mode 100644 index 00000000..f3dae283 --- /dev/null +++ b/home/system/swaync/default.nix @@ -0,0 +1,421 @@ +{ + config, + pkgs, + ... +}: let + scripts = import ../waybar/scripts.nix {inherit pkgs config;}; + c = config.lib.stylix.colors; + font = config.stylix.fonts.sansSerif.name; + monofont = config.stylix.fonts.monospace.name; + rounding = config.theme.rounding; + border-size = config.theme.border-size; + gaps-in = config.theme.gaps-in; + opacityToHex = opacity: let + val = builtins.floor (opacity * 255); + high = val / 16; + low = val - high * 16; + digits = "0123456789abcdef"; + in "${builtins.substring high 1 digits}${builtins.substring low 1 digits}"; + alphaHex = opacityToHex config.theme.inactive-opacity; +in { + services.swaync = { + enable = true; + + settings = { + positionX = "right"; + positionY = "top"; + layer = "overlay"; + "control-center-layer" = "overlay"; + cssPriority = "user"; + "control-center-width" = 450; + "control-center-margin-top" = config.theme.gaps-out * 2; + "control-center-margin-bottom" = config.theme.gaps-out * 2; + "control-center-margin-right" = 0; + "fit-to-screen" = true; + "notification-window-width" = 400; + "notification-icon-size" = 40; + "notification-body-image-height" = 500; + "notification-body-image-width" = 500; + "notification-inline-replies" = true; + "notification-2fa-action" = false; + timeout = 3; + "timeout-low" = 2; + "timeout-critical" = 6; + "keyboard-shortcuts" = true; + "image-visibility" = "when-available"; + "transition-time" = 200; + "hide-on-clear" = false; + "hide-on-action" = false; + "script-fail-notify" = true; + widgets = ["mpris" "volume" "backlight" "dnd" "buttons-grid" "notifications"]; + "widget-config" = { + dnd.text = "Do not disturb"; + volume = { + label = "󰕾"; + "show-per-app" = false; + }; + backlight = { + label = "󰃠"; + "min" = 0; + }; + mpris = { + "image-size" = 100; + "image-radius" = 10; + autohide = false; + blacklist = ["org.mpris.MediaPlayer2.playerctld"]; + }; + "buttons-grid" = { + actions = [ + { + label = "󰖔"; + type = "toggle"; + command = "${scripts.nightshift-toggle}/bin/nightshift-toggle"; + "update-command" = "${pkgs.procps}/bin/pidof ${pkgs.hyprsunset}/bin/hyprsunset > /dev/null && echo true || echo false"; + } + { + label = "󰈈"; + type = "toggle"; + command = "${scripts.focus-toggle}/bin/focus-toggle"; + "update-command" = "test -f /tmp/hypr-focus-mode && echo true || echo false"; + } + { + label = "󰍭"; + type = "toggle"; + command = "${scripts.mic-mute}/bin/mic-mute"; + "update-command" = "${scripts.mic-status}/bin/mic-status"; + } + { + label = "󰌾"; + command = "${pkgs.swaynotificationcenter}/bin/swaync-client -cp ; ${pkgs.hyprlock}/bin/hyprlock"; + } + { + label = "󰐥"; + command = "${pkgs.swaynotificationcenter}/bin/swaync-client -cp ; systemctl poweroff"; + } + ]; + }; + }; + }; + + style = '' + @define-color center-bg #${c.base01}${alphaHex}; + @define-color notification-bg #${c.base00}${alphaHex}; + @define-color center-notification-bg #${c.base01}; + @define-color background #${c.base00}${alphaHex}; + @define-color background-alt #${c.base01}; + @define-color text #${c.base05}; + @define-color text-alt #${c.base03}; + @define-color selected #${c.base03}66; + @define-color hover #${c.base03}28; + @define-color urgent #${c.base08}; + + * { + all: unset; + font-family: "${font}"; + font-weight: 700; + --border-radius: ${toString rounding}px; + --border-radius-s: ${toString gaps-in}px; + --border-radius-xl: ${toString (rounding - 2)}px; + } + + .notification { padding: 5px; } + + .notification-row { background: transparent; border: none; box-shadow: none; } + + .control-center .notification { padding: 0; } + + .notification-background { + background: @notification-bg; + border-radius: var(--border-radius); + border: ${toString border-size}px solid @selected; + box-shadow: none; + outline: none; + margin: ${toString gaps-in}px; + padding: 0; + } + + .notification-background .close-button { + margin: 6px; + padding: 2px; + border-radius: ${toString (gaps-in - 2)}px; + background: transparent; + color: @text; + } + + .notification-background .close-button:hover { background: @hover; } + + .notification.low, + .notification.normal { border: none; } + + .notification.critical { + border: ${toString border-size}px solid @urgent; + border-radius: var(--border-radius); + } + + .notification-content { + color: @text; + margin: 10px; + font-weight: 700; + border: none; + } + + .notification-content .text-box { margin: 0 0 0 15px; } + + .notification-content .time { + padding: 2px; + font-size: 0.95rem; + font-weight: 800; + } + + .notification-content .summary { + font-size: 1rem; + font-weight: 800; + padding: 2px 0; + margin-bottom: 2px; + } + + .notification-content .body { + color: @text-alt; + font-size: 0.8rem; + } + + .notification-row .inline-reply-entry, + .notification-row .inline-reply-button { + margin: 5px -5px -5px -5px; + padding: 10px 15px; + border-radius: var(--border-radius); + background: @background-alt; + } + + .notification-row .inline-reply-entry { margin-right: 10px; } + .notification-row .inline-reply-button:hover { background: @selected; } + + .notification-alt-actions { padding: 5px 0; } + + .notification-action { + font-weight: 700; + border-radius: var(--border-radius); + background: @hover; + color: @text; + margin: 0 5px; + padding: 10px 0; + } + + .notification-action:hover, + .notification-action:active { background: @selected; } + + .control-center { + background: @center-bg; + border-radius: var(--border-radius) 0 0 var(--border-radius); + border-left: ${toString border-size}px solid @selected; + margin: 0; + padding: 5px 5px 0 5px; + } + + .control-center .notification-background { + background: @center-notification-bg; + } + + .control-center .notification-background .close-button, + .notification-group-close-button { opacity: 0; } + + .notification-group { transition: 200ms; } + + .notification-group:not(.collapsed) { margin: ${toString gaps-in}px; } + + .notification-group-headers, + .notification-group-buttons { + color: @text; + font-weight: bold; + background: @background; + border-radius: var(--border-radius); + padding: 4px 8px; + } + + .notification-group-headers > label { + margin: 0 3px; + font-size: 1rem; + } + + .notification-group-icon { color: @text; } + + .notification-group-buttons .image-button { + background: transparent; + color: @text; + padding: 4px; + border-radius: var(--border-radius); + } + + .notification-group-buttons .image-button:hover { background: @hover; } + + .widget { + margin: 5px; + color: @text; + } + + .widget-mpris-album-art { + border-radius: var(--border-radius); + margin: 6px 4px; + } + + .widget-mpris-title { + font-weight: 700; + font-size: 1.2rem; + margin: 0 3px; + } + + .widget-mpris-subtitle { + color: @text-alt; + font-weight: 700; + font-size: 0.9rem; + margin: 0 3px; + } + + .mpris-background { border-radius: 14px; margin: 3px; } + + .widget-mpris { + border-radius: var(--border-radius); + } + + .mpris-overlay { + border-radius: var(--border-radius); + padding: 10px; + background: @background; + } + + .mpris-overlay > box:last-child { + border-radius: var(--border-radius-xl); + padding: 0 5px; + background: alpha(@hover, .6); + } + + .widget-mpris-player button { + padding: 5px; + margin: 0 2.5px; + } + + .widget-mpris-player button:hover { + border-radius: var(--border-radius-s); + background: @hover; + } + + .widget-volume, + .widget-backlight { + border-radius: var(--border-radius); + padding: 10px 15px; + background: @background-alt; + color: @text; + } + + .widget-volume > box, + .widget-backlight > box { + color: @text; + } + + .widget-volume label, + .widget-backlight label { + font-size: 1rem; + font-weight: 700; + min-width: 1.2rem; + } + + .widget-volume slider, + .widget-backlight slider { + background: @text; + border-radius: var(--border-radius-s); + min-height: 12px; + min-width: 12px; + } + + .widget-volume trough, + .widget-backlight trough { + background: @hover; + border-radius: var(--border-radius-s); + min-height: 4px; + } + + .widget-volume highlight, + .widget-backlight highlight { + background: @text; + border-radius: var(--border-radius-s); + } + + .widget-dnd { + padding: 10px 15px; + border-radius: var(--border-radius); + background: @background-alt; + color: @text; + } + + .widget-dnd > label { + font-size: 1rem; + font-weight: 700; + } + + .widget-dnd switch { + background: @hover; + border-radius: var(--border-radius-s); + box-shadow: none; + padding: 2px; + transition: 200ms; + } + + .widget-dnd switch slider { + background: @text; + border-radius: var(--border-radius-s); + } + + .widget-dnd switch:hover, + .widget-dnd switch:checked { background-color: @selected; } + + .widget-notifications { margin: 0; } + + .widget-buttons-grid { + border-radius: var(--border-radius); + padding: 5px 15px; + margin-bottom: 5px; + background: @background-alt; + } + + .widget-buttons-grid button { + padding: 10px; + margin: 3px; + min-width: 2rem; + font-family: "${monofont}"; + background: @hover; + border-radius: var(--border-radius); + transition: 200ms; + } + + .widget-buttons-grid button > label { + font-family: "${monofont}"; + font-size: 18px; + font-weight: normal; + font-style: normal; + color: @text; + } + + .widget-buttons-grid button:hover { background: @selected; } + + .widget-buttons-grid button:checked { background-color: @text; } + + .widget-buttons-grid button:checked > label { color: @background; } + + .control-center-list-placeholder { color: @text; } + + .blank-window { background: transparent; } + ''; + }; + + stylix.targets.swaync.enable = false; + + # GTK 4.22 defaults to the Vulkan renderer, which compiles its graphics + # pipelines lazily on the first frame. The control center has many distinct + # visual elements, so the first open triggers a big burst of pipeline + # compilation (a multi-second stall on a cold boot) while later opens reuse + # the in-process cache. The GL (ngl) renderer avoids this: it stays + # GPU-accelerated and benefits from Mesa's on-disk shader cache, so the + # first open is as fast as the rest. Scoped to swaync so other GTK4 apps + # keep the Vulkan renderer. + systemd.user.services.swaync.Service.Environment = ["GSK_RENDERER=ngl"]; +} diff --git a/home/system/termfilechooser/default.nix b/home/system/termfilechooser/default.nix new file mode 100644 index 00000000..8c14176d --- /dev/null +++ b/home/system/termfilechooser/default.nix @@ -0,0 +1,65 @@ +# Use elio as the file picker for portal dialogs (browser "select file(s)" and +# "save download to..."). The backend is xdg-desktop-portal-termfilechooser, +# enabled system-wide in nixos/utils.nix (extraPortals + FileChooser routing). +{ + config, + pkgs, + ... +}: let + wrapper = pkgs.writeShellScript "elio-wrapper" '' + multiple="$1" + directory="$2" + save="$3" + path="$4" + out="$5" + debug="$6" + + set -e + + if [[ "$debug" = 1 ]]; then + set -x + fi + + cmd="elio" + termcmd="''${TERMCMD:-ghostty --gtk-single-instance=false --title=termfilechooser -e}" + + if [[ "$save" = "1" ]]; then + set -- --chooser-file="$out" "$path" + elif [[ "$directory" = "1" ]]; then + set -- --chooser-file="$out" --cwd-file="$out.1" "$path" + else + set -- --chooser-file="$out" "$path" + fi + + command="$termcmd $cmd" + for arg in "$@"; do + escaped=$(printf "%s" "$arg" | sed 's/"/\\"/g') + command="$command \"$escaped\"" + done + + sh -c "$command" + + if [[ "$directory" = "1" ]]; then + if [[ ! -s "$out" ]] && [[ -s "$out.1" ]]; then + cat "$out.1" > "$out" + rm "$out.1" + else + rm "$out.1" + fi + fi + ''; + # ghostty must run in the foreground instead of handing off to the + # single-instance daemon, otherwise the wrapper returns before you've picked + # anything and the portal reads an empty selection. + termcmd = "ghostty --gtk-single-instance=false --title=termfilechooser -e"; +in { + xdg.configFile."xdg-desktop-portal-termfilechooser/config".text = '' + [filechooser] + cmd=${wrapper} + default_dir=$HOME + open_mode=suggested + save_mode=suggested + env=TERMCMD=${termcmd} + PATH=${config.home.profileDirectory}/bin:/run/current-system/sw/bin:/run/wrappers/bin + ''; +} diff --git a/home/system/tofi/default.nix b/home/system/tofi/default.nix new file mode 100644 index 00000000..c1684f90 --- /dev/null +++ b/home/system/tofi/default.nix @@ -0,0 +1,47 @@ +{ + config, + lib, + ... +}: let + c = config.lib.stylix.colors; + font = config.stylix.fonts.serif.name; + gaps = config.theme.gaps-out; + barHeight = config.theme.bar-height; + rounding = + if config.theme.rounding > barHeight / 2 + then barHeight / 2 + else config.theme.rounding; +in { + imports = [./desktop-actions.nix]; + programs.tofi = { + enable = true; + settings = { + anchor = "top"; + height = barHeight; + margin-top = gaps; + margin-left = 350; + margin-right = 350; + + horizontal = true; + num-results = 8; + result-spacing = 20; + padding-top = 2; + padding-bottom = 2; + padding-left = 14; + padding-right = 14; + + font = lib.mkForce font; + prompt-color = lib.mkForce "#${c.base0D}ff"; + selection-color = lib.mkForce "#${c.base0D}ff"; + + outline-width = 0; + border-width = 0; + corner-radius = rounding; + + prompt-text = " "; + placeholder-text = "Search..."; + + drun-launch = true; + }; + }; +} diff --git a/home/system/tofi/desktop-actions.nix b/home/system/tofi/desktop-actions.nix new file mode 100644 index 00000000..4d5789e4 --- /dev/null +++ b/home/system/tofi/desktop-actions.nix @@ -0,0 +1,333 @@ +{ + pkgs, + config, + ... +}: let + scripts = import ../waybar/scripts.nix {inherit pkgs config;}; +in { + xdg.desktopEntries = { + focus-toggle = { + name = "Focus Mode"; + exec = "${scripts.focus-toggle}/bin/focus-toggle"; + icon = "do-not-disturb-symbolic"; + comment = "Toggle focus mode"; + categories = ["System"]; + terminal = false; + }; + + nightshift-toggle = { + name = "Night Shift"; + exec = "${scripts.nightshift-toggle}/bin/nightshift-toggle"; + icon = "night-light-symbolic"; + comment = "Toggle night shift"; + categories = ["System"]; + terminal = false; + }; + + mic-mute = { + name = "Mute Microphone"; + exec = "${scripts.mic-mute}/bin/mic-mute"; + icon = "microphone-sensitivity-muted-symbolic"; + comment = "Toggle microphone mute"; + categories = ["System"]; + terminal = false; + }; + + lock = { + name = "Lock"; + exec = "${pkgs.hyprlock}/bin/hyprlock"; + icon = "system-lock-screen-symbolic"; + comment = "Lock the screen"; + categories = ["System"]; + terminal = false; + }; + + reboot = { + name = "Reboot"; + exec = "systemctl reboot"; + icon = "system-restart-symbolic"; + comment = "Restart the system"; + categories = ["System"]; + terminal = false; + }; + + shutdown = { + name = "Shutdown"; + exec = "systemctl poweroff"; + icon = "system-shutdown-symbolic"; + comment = "Power off the system"; + categories = ["System"]; + terminal = false; + }; + + hibernate = { + name = "Hibernate"; + exec = "systemctl hibernate"; + icon = "drive-harddisk-symbolic"; + comment = "Hibernate the system"; + categories = ["System"]; + terminal = false; + }; + + waybar-toggle = { + name = "Toggle Waybar"; + exec = "${scripts.waybar-toggle}/bin/waybar-toggle"; + icon = "panel-applets-symbolic"; + comment = "Show or hide the status bar"; + categories = ["System"]; + terminal = false; + }; + + wifi-toggle = { + name = "Toggle Wi-Fi"; + exec = "${scripts.wifi-toggle}/bin/wifi-toggle"; + icon = "network-wireless-symbolic"; + comment = "Enable or disable Wi-Fi"; + categories = ["System"]; + terminal = false; + }; + + bluetooth-toggle = { + name = "Toggle Bluetooth"; + exec = "${scripts.bluetooth-toggle}/bin/bluetooth-toggle"; + icon = "bluetooth-symbolic"; + comment = "Enable or disable Bluetooth"; + categories = ["System"]; + terminal = false; + }; + + color-pick = { + name = "Pick Color"; + exec = "${scripts.color-pick}/bin/color-pick"; + icon = "color-select-symbolic"; + comment = "Pick a screen color to the clipboard"; + categories = ["Utility"]; + terminal = false; + settings.Keywords = "color;picker;hex;eyedropper;"; + }; + + screenshot-region = { + name = "Screenshot Region"; + exec = "${pkgs.hyprshot}/bin/hyprshot -m region"; + icon = "screenshot-recorded-symbolic"; + comment = "Capture a selected region"; + categories = ["Utility"]; + terminal = false; + settings.Keywords = "screenshot;capture;region;"; + }; + + screenshot-window = { + name = "Screenshot Window"; + exec = "${pkgs.hyprshot}/bin/hyprshot -m window"; + icon = "screenshot-recorded-symbolic"; + comment = "Capture the active window"; + categories = ["Utility"]; + terminal = false; + settings.Keywords = "screenshot;capture;window;"; + }; + + screenshot-screen = { + name = "Screenshot Screen"; + exec = "${pkgs.hyprshot}/bin/hyprshot -m output"; + icon = "screenshot-recorded-symbolic"; + comment = "Capture the whole screen"; + categories = ["Utility"]; + terminal = false; + settings.Keywords = "screenshot;capture;screen;monitor;"; + }; + + screenshot-edit = { + name = "Screenshot & Annotate"; + exec = "${scripts.screenshot-edit}/bin/screenshot-edit"; + icon = "edit-symbolic"; + comment = "Capture a region and open it in Satty"; + categories = ["Utility"]; + terminal = false; + settings.Keywords = "screenshot;annotate;satty;edit;"; + }; + + record-toggle = { + name = "Screen Recording"; + exec = "${scripts.record-toggle}/bin/record-toggle"; + icon = "media-record-symbolic"; + comment = "Start or stop screen recording"; + categories = ["Utility" "AudioVideo"]; + terminal = false; + settings.Keywords = "record;recording;screencast;video;"; + }; + + power-cycle = { + name = "Power Profile"; + exec = "${scripts.power-cycle}/bin/power-cycle"; + icon = "power-profile-balanced-symbolic"; + comment = "Cycle power-saver / balanced / performance"; + categories = ["System"]; + terminal = false; + settings.Keywords = "power;profile;performance;battery;"; + }; + + airplane-toggle = { + name = "Airplane Mode"; + exec = "${scripts.airplane-toggle}/bin/airplane-toggle"; + icon = "airplane-mode-symbolic"; + comment = "Toggle Wi-Fi and Bluetooth together"; + categories = ["System"]; + terminal = false; + settings.Keywords = "airplane;flight;wifi;bluetooth;offline;"; + }; + + clipboard-menu = { + name = "Clipboard History"; + exec = "${scripts.clipboard-menu}/bin/clipboard-menu"; + icon = "edit-paste-symbolic"; + comment = "Pick a past clipboard entry"; + categories = ["Utility"]; + terminal = false; + settings.Keywords = "clipboard;history;paste;cliphist;"; + }; + + clipboard-wipe = { + name = "Clear Clipboard History"; + exec = "${pkgs.cliphist}/bin/cliphist wipe"; + icon = "edit-clear-all-symbolic"; + comment = "Delete all clipboard history entries"; + categories = ["Utility"]; + terminal = false; + settings.Keywords = "clipboard;history;clear;wipe;delete;cliphist;"; + }; + + emoji-picker = { + name = "Emoji Picker"; + exec = "${scripts.emoji-picker}/bin/emoji-picker"; + icon = "face-smile-symbolic"; + comment = "Pick an emoji and type it"; + categories = ["Utility"]; + terminal = false; + settings.Keywords = "emoji;emoticon;smiley;symbol;"; + }; + + icon-picker = { + name = "Icon Picker"; + exec = "${scripts.icon-picker}/bin/icon-picker"; + icon = "character-map-symbolic"; + comment = "Pick a Nerd Font icon and type it"; + categories = ["Utility"]; + terminal = false; + settings.Keywords = "icon;nerdfont;glyph;symbol;"; + }; + + caffeine-toggle = { + name = "Keep Awake"; + exec = "${scripts.caffeine-toggle}/bin/caffeine-toggle"; + icon = "my-caffeine-on-symbolic"; + comment = "Pause or resume idle locking and suspend"; + categories = ["System"]; + terminal = false; + settings.Keywords = "caffeine;idle;awake;inhibit;suspend;"; + }; + + logout = { + name = "Logout"; + exec = "${pkgs.hyprland}/bin/hyprctl dispatch exit"; + icon = "system-log-out-symbolic"; + comment = "End the current session"; + categories = ["System"]; + terminal = false; + }; + + dnd-toggle = { + name = "Do Not Disturb"; + exec = "${scripts.dnd-toggle}/bin/dnd-toggle"; + icon = "notifications-disabled-symbolic"; + comment = "Toggle Do Not Disturb"; + categories = ["System"]; + terminal = false; + settings.Keywords = "dnd;notifications;disturb;swaync;silence;"; + }; + + vol-mute = { + name = "Mute Volume"; + exec = "${scripts.vol-mute}/bin/vol-mute"; + icon = "audio-volume-muted-symbolic"; + comment = "Toggle output mute"; + categories = ["System"]; + terminal = false; + }; + + vol-up = { + name = "Volume Up"; + exec = "${scripts.vol-up}/bin/vol-up"; + icon = "audio-volume-high-symbolic"; + comment = "Raise the volume by 5%"; + categories = ["System"]; + terminal = false; + }; + + vol-down = { + name = "Volume Down"; + exec = "${scripts.vol-down}/bin/vol-down"; + icon = "audio-volume-low-symbolic"; + comment = "Lower the volume by 5%"; + categories = ["System"]; + terminal = false; + }; + + bright-up = { + name = "Brightness Up"; + exec = "${scripts.bright-up}/bin/bright-up"; + icon = "display-brightness-high-symbolic"; + comment = "Raise the brightness by 5%"; + categories = ["System"]; + terminal = false; + }; + + bright-down = { + name = "Brightness Down"; + exec = "${scripts.bright-down}/bin/bright-down"; + icon = "display-brightness-low-symbolic"; + comment = "Lower the brightness by 5%"; + categories = ["System"]; + terminal = false; + }; + + output-cycle = { + name = "Cycle Audio Output"; + exec = "${scripts.output-cycle}/bin/output-cycle"; + icon = "audio-speakers-symbolic"; + comment = "Switch to the next audio output"; + categories = ["System"]; + terminal = false; + settings.Keywords = "audio;output;sink;speaker;headphones;"; + }; + + input-cycle = { + name = "Cycle Audio Input"; + exec = "${scripts.input-cycle}/bin/input-cycle"; + icon = "audio-input-microphone-symbolic"; + comment = "Switch to the next audio input"; + categories = ["System"]; + terminal = false; + settings.Keywords = "audio;input;source;microphone;mic;"; + }; + + spotatui = { + name = "Spotify"; + exec = "${pkgs.ghostty}/bin/ghostty +new-window -e ${pkgs.spotatui}/bin/spotatui"; + icon = "spotify"; + comment = "Control Spotify from the terminal"; + categories = ["Audio" "Music"]; + terminal = false; + settings.Keywords = "spotify;spotatui;music;"; + }; + + settuings = { + name = "Settings"; + exec = "${pkgs.ghostty}/bin/ghostty +new-window -e ${pkgs.nur.repos.anotherhadi.settuings}/bin/settuings"; + icon = "preferences-system-symbolic"; + comment = "Terminal based settings (wifi, bluetooth, audio, ...)"; + categories = ["Settings"]; + terminal = false; + settings.Keywords = "settings;wifi;bluetooth;audio;settuings;"; + }; + }; +} diff --git a/home/system/udiskie/default.nix b/home/system/udiskie/default.nix index f87dc5bd..bb59f1de 100644 --- a/home/system/udiskie/default.nix +++ b/home/system/udiskie/default.nix @@ -4,5 +4,6 @@ enable = true; notify = true; automount = true; + tray = "never"; }; } diff --git a/home/system/waybar/battery-monitor.sh b/home/system/waybar/battery-monitor.sh new file mode 100644 index 00000000..611202ff --- /dev/null +++ b/home/system/waybar/battery-monitor.sh @@ -0,0 +1,103 @@ +# battery-monitor: low-battery alerts for waybar/swaync. +# Runs main once (triggered by the battery-monitor systemd timer). + +POWER_SUPPLY_DIR="${POWER_SUPPLY_DIR:-/sys/class/power_supply}" +STATE_FILE="${BATTERY_STATE_FILE:-/tmp/battery-alert-state}" +CRIT_ID_FILE="${BATTERY_CRIT_ID_FILE:-/tmp/battery-crit-id}" + +WARN_THRESHOLD=10 +CRIT_THRESHOLD=5 + +# Pure decision. Prints ":". +# action ∈ noop | osd_warn | crit_show | crit_clear ; state ∈ none | warn10 | crit5 +battery_decide() { + status=$1 + cap=$2 + prev=$3 + + if [ "$status" = "Discharging" ]; then + if [ "$cap" -le "$CRIT_THRESHOLD" ]; then + echo "crit_show:crit5" + elif [ "$cap" -le "$WARN_THRESHOLD" ]; then + if [ "$prev" = "crit5" ]; then + echo "crit_clear:warn10" + elif [ "$prev" = "warn10" ]; then + echo "noop:warn10" + else + echo "osd_warn:warn10" + fi + else + if [ "$prev" = "crit5" ]; then + echo "crit_clear:none" + else + echo "noop:none" + fi + fi + else + if [ "$prev" = "crit5" ]; then + echo "crit_clear:none" + else + echo "noop:none" + fi + fi +} + +# First real battery (type == Battery, with status + capacity). +resolve_battery() { + for d in "$POWER_SUPPLY_DIR"/*; do + [ -r "$d/type" ] || continue + [ "$(cat "$d/type")" = "Battery" ] || continue + [ -r "$d/status" ] && [ -r "$d/capacity" ] || continue + printf '%s' "$d" + return 0 + done + return 1 +} + +show_warn_osd() { + waybar-osd "󰂃 Low battery · $1%" +} + +show_crit_notification() { + cap=$1 + id=$(cat "$CRIT_ID_FILE" 2>/dev/null || echo 0) + newid=$(notify-send --print-id --replace-id="$id" \ + --urgency=critical --expire-time=0 \ + "󰂃 Critical battery" "Battery at $cap%: plug in the charger") + printf '%s' "$newid" >"$CRIT_ID_FILE" +} + +clear_crit_notification() { + id=$(cat "$CRIT_ID_FILE" 2>/dev/null || echo 0) + if [ "$id" != "0" ]; then + gdbus call --session \ + --dest org.freedesktop.Notifications \ + --object-path /org/freedesktop/Notifications \ + --method org.freedesktop.Notifications.CloseNotification "$id" \ + >/dev/null 2>&1 || true + fi + rm -f "$CRIT_ID_FILE" +} + +main() { + dir=$(resolve_battery) || exit 0 + + status=$(cat "$dir/status") + cap=$(cat "$dir/capacity") + prev=$(cat "$STATE_FILE" 2>/dev/null || echo none) + + result=$(battery_decide "$status" "$cap" "$prev") + action=${result%%:*} + newstate=${result##*:} + + case "$action" in + osd_warn) show_warn_osd "$cap" ;; + crit_show) show_crit_notification "$cap" ;; + crit_clear) clear_crit_notification ;; + noop) : ;; + esac + + printf '%s' "$newstate" >"$STATE_FILE" +} + +main "$@" diff --git a/home/system/waybar/default.nix b/home/system/waybar/default.nix new file mode 100644 index 00000000..2d4ead35 --- /dev/null +++ b/home/system/waybar/default.nix @@ -0,0 +1,59 @@ +{ + pkgs, + config, + ... +}: let + scripts = import ./scripts.nix {inherit pkgs config;}; +in { + imports = [ + ./settings.nix + ./style.nix + ]; + + _module.args.networkScript = scripts.networkScript; + _module.args.bluetoothScript = scripts.bluetoothScript; + _module.args.volMuteScript = scripts.vol-mute; + _module.args.caffeineToggleScript = scripts.caffeine-toggle; + _module.args.osdStatusScript = scripts.waybar-osd-status; + _module.args.nightshiftToggleScript = scripts.nightshift-toggle; + + programs.waybar.enable = true; + stylix.targets.waybar.enable = false; + + home.packages = with pkgs; + [ + playerctl + pavucontrol + blueman + hyprsunset + ] + ++ (with scripts; [waybar-osd waybar-osd-status battery-monitor vol-up vol-down vol-mute mic-mute bright-up bright-down nightshift-toggle focus-toggle waybar-toggle wifi-toggle bluetooth-toggle dnd-toggle output-cycle input-cycle color-pick screenshot-edit record-toggle power-cycle airplane-toggle clipboard-menu emoji-picker caffeine-toggle mic-status]); + + # Poll battery level every 30s; battery-monitor no-ops when no battery exists. + systemd.user.services.battery-monitor = { + Unit.Description = "Low-battery OSD and critical notification monitor"; + Service = { + Type = "oneshot"; + ExecStart = "${scripts.battery-monitor}/bin/battery-monitor"; + }; + }; + + systemd.user.timers.battery-monitor = { + Unit.Description = "Poll battery level for low-battery alerts"; + Timer = { + OnBootSec = "1min"; + OnUnitActiveSec = "30s"; + }; + Install.WantedBy = ["timers.target"]; + }; + + # Prevent blueman-applet from auto-starting via XDG autostart (we use custom/bluetooth module instead) + xdg.configFile."autostart/blueman.desktop".text = '' + [Desktop Entry] + Hidden=true + ''; + + wayland.windowManager.hyprland.settings.exec-once = [ + "waybar" + ]; +} diff --git a/home/system/waybar/scripts.nix b/home/system/waybar/scripts.nix new file mode 100644 index 00000000..9e5e2026 --- /dev/null +++ b/home/system/waybar/scripts.nix @@ -0,0 +1,455 @@ +{ + pkgs, + config, +}: let + waybar-osd = pkgs.writeShellApplication { + name = "waybar-osd"; + runtimeInputs = with pkgs; [procps coreutils]; + text = '' + printf '%s' "$1" > /tmp/waybar-osd + pkill -x -RTMIN+8 waybar 2>/dev/null || true + ''; + }; + + waybar-osd-status = pkgs.writeShellApplication { + name = "waybar-osd-status"; + runtimeInputs = with pkgs; [coreutils]; + text = '' + file=/tmp/waybar-osd + [ -f "$file" ] || exit 1 + mtime=$(stat -c %Y "$file" 2>/dev/null) || exit 1 + age=$(( $(date +%s) - mtime )) + if [ "$age" -ge 3 ]; then + rm -f "$file" + exit 1 + fi + ''; + }; + + # battery-monitor: low-battery alerts, run by the systemd user timer. + battery-monitor = pkgs.writeShellApplication { + name = "battery-monitor"; + runtimeInputs = with pkgs; [waybar-osd libnotify glib coreutils]; + text = builtins.readFile ./battery-monitor.sh; + }; + + updateOsd = '' + ${waybar-osd}/bin/waybar-osd "$OSD_TEXT" + ''; + + volGetText = '' + VOL_RAW=$(${pkgs.wireplumber}/bin/wpctl get-volume @DEFAULT_SINK@) + VOL=$(printf '%s' "$VOL_RAW" | awk '{printf "%d", $2*100}') + if printf '%s' "$VOL_RAW" | grep -q MUTED; then + OSD_TEXT="󰝟 $VOL%" + elif [ "$VOL" -lt 33 ]; then + OSD_TEXT="󰕿 $VOL%" + elif [ "$VOL" -lt 66 ]; then + OSD_TEXT="󰖀 $VOL%" + else + OSD_TEXT="󰕾 $VOL%" + fi + ''; + + brightGetText = '' + BRIGHT=$(${pkgs.brightnessctl}/bin/brightnessctl -m | awk -F, '{print int($5)}') + if [ "$BRIGHT" -lt 33 ]; then + OSD_TEXT="󰃞 $BRIGHT%" + elif [ "$BRIGHT" -lt 66 ]; then + OSD_TEXT="󰃟 $BRIGHT%" + else + OSD_TEXT="󰃠 $BRIGHT%" + fi + ''; + + # Resolve $src: the default source, otherwise the first available source. + # Some machines have no default audio source (@DEFAULT_AUDIO_SOURCE@ unresolved). + micSource = '' + src=$(${pkgs.wireplumber}/bin/wpctl inspect @DEFAULT_AUDIO_SOURCE@ 2>/dev/null | sed -n 's/^id \([0-9]*\),.*/\1/p') + if [ -z "$src" ]; then + src=$(${pkgs.pipewire}/bin/pw-dump | ${pkgs.jq}/bin/jq -r \ + '[.[] | select(.info.props."media.class"=="Audio/Source") | .id] | .[0] // empty') + fi + ''; + + # tofi in vertical dmenu mode: the global config is a 36px-tall horizontal + # launcher, unusable for a list, so override the geometry here. + tofiMenu = "${pkgs.tofi}/bin/tofi --horizontal false --anchor center --width 700 --height 500 --margin-top 0 --margin-left 0 --margin-right 0 --num-results 10"; + + # Name -> glyph table maintained by the nerd-fonts project itself, pinned to + # the same release as the nerd-fonts packages in nixos/fonts.nix. + nerdFontGlyphnames = pkgs.fetchurl { + url = "https://raw.githubusercontent.com/ryanoasis/nerd-fonts/v3.4.0/glyphnames.json"; + sha256 = "sha256-4tENI/W/8L1vBnbpsB2XifzcZW3ntJiilVwncW6kQ5w="; + }; + nerdFontIconList = pkgs.runCommand "nerd-font-icons.txt" {nativeBuildInputs = [pkgs.jq];} '' + jq -r 'to_entries[] | select(.key != "METADATA") | "\(.value.char) \(.key)"' \ + ${nerdFontGlyphnames} > "$out" + ''; +in { + inherit waybar-osd waybar-osd-status battery-monitor; + + bluetoothScript = pkgs.writeShellScript "waybar-bluetooth" '' + jq=${pkgs.jq}/bin/jq + nl=$'\n' + # bluetoothctl hangs without a controller by default → always bounded by timeout. + bt() { timeout 3 ${pkgs.bluez}/bin/bluetoothctl "$@" 2>/dev/null; } + + powered=$(bt show | awk '/Powered:/ { print $2; exit }') + if [ "$powered" != "yes" ]; then + "$jq" -cn '{ text: "󰂲", class: "off", tooltip: "Bluetooth off" }' + exit 0 + fi + + tip="" + add_tip() { tip="''${tip:+$tip$nl}$1"; } + + count=0 + for mac in $(bt devices Connected | awk '{ print $2 }'); do + count=$((count + 1)) + info=$(bt info "$mac") + name=$(printf '%s' "$info" | sed -n 's/^[[:space:]]*Name: //p' | head -1) + [ -z "$name" ] && name="$mac" + batt=$(printf '%s' "$info" | sed -n 's/.*Battery Percentage:.*(\([0-9][0-9]*\)).*/\1/p' | head -1) + add_tip "󰂱 $name''${batt:+ · $batt%}" + done + + if [ "$count" -gt 0 ]; then + "$jq" -cn --arg tooltip "$tip" '{ text: "󰂰", class: "connected", tooltip: $tooltip }' + else + "$jq" -cn '{ text: "󰂰", class: "on", tooltip: "Bluetooth on" }' + fi + ''; + + networkScript = pkgs.writeShellScript "waybar-network" '' + nmcli=${pkgs.networkmanager}/bin/nmcli + ip=${pkgs.iproute2}/bin/ip + jq=${pkgs.jq}/bin/jq + nl=$'\n' + + text="" + tip="" + class="disconnected" + add_seg() { text="''${text:+$text }$1"; } + add_tip() { tip="''${tip:+$tip$nl}$1"; } + + # ── Ethernet ──────────────────────────────────────────────── + eth=$("$nmcli" -t -f DEVICE,TYPE,STATE device status 2>/dev/null \ + | awk -F: '$2 == "ethernet" && $3 == "connected" { print $1; exit }') + if [ -n "$eth" ]; then + eth_ip=$("$ip" -4 -br addr show "$eth" 2>/dev/null | awk '{ print $3 }' | cut -d/ -f1) + add_seg "󰛳" + class="ethernet" + add_tip "󰛳 Ethernet''${eth_ip:+ · $eth_ip}" + fi + + # ── Wi-Fi ─────────────────────────────────────────────────── + wifi=$("$nmcli" -t -f ACTIVE,SSID,SIGNAL device wifi 2>/dev/null | grep -m1 '^yes:') + if [ -n "$wifi" ]; then + ssid=$(printf '%s' "$wifi" | cut -d: -f2) + signal=$(printf '%s' "$wifi" | cut -d: -f3) + if [ "''${signal:-0}" -ge 80 ]; then icon="󰤨" + elif [ "''${signal:-0}" -ge 60 ]; then icon="󰤥" + elif [ "''${signal:-0}" -ge 40 ]; then icon="󰤢" + elif [ "''${signal:-0}" -ge 20 ]; then icon="󰤟" + else icon="󰤯" + fi + add_seg "$icon" + [ "$class" = "disconnected" ] && class="wifi" + add_tip "$icon ''${ssid:-Wi-Fi}''${signal:+ · $signal%}" + fi + + # ── VPN (nmcli, fallback interfaces) ──────────────────────── + vpn=$("$nmcli" -t -f TYPE,NAME connection show --active 2>/dev/null \ + | awk -F: '$1 == "vpn" || $1 == "wireguard" { print $2; exit }') + if [ -z "$vpn" ]; then + vpn=$("$ip" -br link show 2>/dev/null \ + | awk '($2 == "UP" || $2 == "UNKNOWN") && $1 ~ /^(tun|wg|proton|ppp)/ { sub(/@.*/, "", $1); print $1; exit }') + fi + if [ -n "$vpn" ]; then + add_seg "󰦝" + add_tip "󰦝 VPN · $vpn" + fi + + if [ -z "$text" ]; then + text="󰤭" + tip="Disconnected" + fi + + "$jq" -cn --arg text "$text" --arg class "$class" --arg tooltip "$tip" \ + '{ text: $text, class: $class, tooltip: $tooltip }' + ''; + + vol-up = pkgs.writeShellScriptBin "vol-up" '' + ${pkgs.wireplumber}/bin/wpctl set-volume @DEFAULT_SINK@ 5%+ --limit 1.0 + ${volGetText} + ${updateOsd} + ''; + + vol-down = pkgs.writeShellScriptBin "vol-down" '' + ${pkgs.wireplumber}/bin/wpctl set-volume @DEFAULT_SINK@ 5%- + ${volGetText} + ${updateOsd} + ''; + + vol-mute = pkgs.writeShellScriptBin "vol-mute" '' + ${pkgs.wireplumber}/bin/wpctl set-mute @DEFAULT_SINK@ toggle + ${volGetText} + ${updateOsd} + ''; + + mic-mute = pkgs.writeShellScriptBin "mic-mute" '' + wpctl=${pkgs.wireplumber}/bin/wpctl + ${micSource} + [ -z "$src" ] && exit 0 + + "$wpctl" set-mute "$src" toggle + if "$wpctl" get-volume "$src" | grep -q MUTED; then + OSD_TEXT="󰍭 Muted" + else + OSD_TEXT="󰍬 Live" + fi + ${updateOsd} + ''; + + mic-status = pkgs.writeShellScriptBin "mic-status" '' + ${micSource} + if [ -n "$src" ] && ${pkgs.wireplumber}/bin/wpctl get-volume "$src" | grep -q MUTED; then + echo true + else + echo false + fi + ''; + + bright-up = pkgs.writeShellScriptBin "bright-up" '' + ${pkgs.brightnessctl}/bin/brightnessctl set 5%+ + ${brightGetText} + ${updateOsd} + ''; + + bright-down = pkgs.writeShellScriptBin "bright-down" '' + ${pkgs.brightnessctl}/bin/brightnessctl set 5%- + ${brightGetText} + ${updateOsd} + ''; + + wifi-toggle = pkgs.writeShellScriptBin "wifi-toggle" '' + if nmcli radio wifi | grep -q enabled; then + nmcli radio wifi off + else + nmcli radio wifi on + fi + ${updateOsd} + ''; + + bluetooth-toggle = pkgs.writeShellScriptBin "bluetooth-toggle" '' + if bluetoothctl show | grep -q "Powered: yes"; then + bluetoothctl power off + else + bluetoothctl power on + fi + ${updateOsd} + ''; + + waybar-toggle = pkgs.writeShellScriptBin "waybar-toggle" '' + if pidof waybar > /dev/null; then + pkill waybar + else + hyprctl dispatch exec waybar + fi + ''; + + nightshift-toggle = pkgs.writeShellScriptBin "nightshift-toggle" '' + if pidof "hyprsunset" > /dev/null; then + pkill hyprsunset + OSD_TEXT="󰖔 Night Shift Off" + else + ${pkgs.hyprsunset}/bin/hyprsunset -t 4500 & + OSD_TEXT="󰖔 Night Shift On" + fi + ${updateOsd} + ''; + + focus-toggle = pkgs.writeShellScriptBin "focus-toggle" '' + if test -f /tmp/hypr-focus-mode; then + rm /tmp/hypr-focus-mode + OSD_TEXT="󰈈 Focus Off" + ${updateOsd} + hyprctl reload + hyprctl dispatch exec waybar + else + touch /tmp/hypr-focus-mode + OSD_TEXT="󰈈 Focus On" + ${updateOsd} + pkill waybar || true + hyprctl keyword animations:enabled false + hyprctl keyword general:gaps_in 0 + hyprctl keyword general:gaps_out 0 + hyprctl keyword decoration:active_opacity 1 + hyprctl keyword decoration:inactive_opacity 1 + hyprctl keyword decoration:rounding 0 + fi + ''; + + dnd-toggle = pkgs.writeShellScriptBin "dnd-toggle" '' + state=$(${pkgs.swaynotificationcenter}/bin/swaync-client -d) + if [ "$state" = "true" ]; then + OSD_TEXT="󰂛 Do Not Disturb On" + else + OSD_TEXT="󰂚 Do Not Disturb Off" + fi + ${updateOsd} + ''; + + output-cycle = pkgs.writeShellScriptBin "output-cycle" '' + wpctl=${pkgs.wireplumber}/bin/wpctl + jq=${pkgs.jq}/bin/jq + pwdump=${pkgs.pipewire}/bin/pw-dump + + # Sink IDs in pw-dump order. + ids=($("$pwdump" | "$jq" -r '.[] | select(.info.props."media.class"=="Audio/Sink") | .id')) + n=''${#ids[@]} + [ "$n" -eq 0 ] && exit 0 + + cur=$("$wpctl" inspect @DEFAULT_AUDIO_SINK@ 2>/dev/null | sed -n 's/^id \([0-9]*\),.*/\1/p') + + next_index=0 + for i in "''${!ids[@]}"; do + if [ "''${ids[$i]}" = "$cur" ]; then + next_index=$(( (i + 1) % n )) + break + fi + done + next=''${ids[$next_index]} + + "$wpctl" set-default "$next" + desc=$("$pwdump" | "$jq" -r --argjson id "$next" '.[] | select(.id==$id) | .info.props."node.description"') + OSD_TEXT="󰓃 ''${desc:-Output}" + ${updateOsd} + ''; + + input-cycle = pkgs.writeShellScriptBin "input-cycle" '' + wpctl=${pkgs.wireplumber}/bin/wpctl + jq=${pkgs.jq}/bin/jq + pwdump=${pkgs.pipewire}/bin/pw-dump + + # Source IDs in pw-dump order. + ids=($("$pwdump" | "$jq" -r '.[] | select(.info.props."media.class"=="Audio/Source") | .id')) + n=''${#ids[@]} + [ "$n" -eq 0 ] && exit 0 + + cur=$("$wpctl" inspect @DEFAULT_AUDIO_SOURCE@ 2>/dev/null | sed -n 's/^id \([0-9]*\),.*/\1/p') + + next_index=0 + for i in "''${!ids[@]}"; do + if [ "''${ids[$i]}" = "$cur" ]; then + next_index=$(( (i + 1) % n )) + break + fi + done + next=''${ids[$next_index]} + + "$wpctl" set-default "$next" + desc=$("$pwdump" | "$jq" -r --argjson id "$next" '.[] | select(.id==$id) | .info.props."node.description"') + OSD_TEXT="󰍬 ''${desc:-Input}" + ${updateOsd} + ''; + + color-pick = pkgs.writeShellScriptBin "color-pick" '' + # hyprpicker -a already copies the color to the clipboard. + color=$(${pkgs.hyprpicker}/bin/hyprpicker -a 2>/dev/null) + if [ -n "$color" ]; then + OSD_TEXT="󰈊 $color" + else + OSD_TEXT="󰈊 Cancelled" + fi + ${updateOsd} + ''; + + screenshot-edit = pkgs.writeShellScriptBin "screenshot-edit" '' + ${pkgs.hyprshot}/bin/hyprshot -m region --raw 2>/dev/null \ + | ${pkgs.satty}/bin/satty --filename - + ''; + + record-toggle = pkgs.writeShellScriptBin "record-toggle" '' + if pgrep -x wf-recorder >/dev/null; then + # -INT lets wf-recorder finalize the file cleanly. + pkill -INT -x wf-recorder + OSD_TEXT="󰕧 Recording saved" + else + dir="$HOME/Videos" + mkdir -p "$dir" + file="$dir/rec-$(date +%Y%m%d-%H%M%S).mp4" + ${pkgs.wf-recorder}/bin/wf-recorder -f "$file" >/dev/null 2>&1 & + OSD_TEXT="󰑊 Recording…" + fi + ${updateOsd} + ''; + + power-cycle = pkgs.writeShellScriptBin "power-cycle" '' + ppd=${pkgs.power-profiles-daemon}/bin/powerprofilesctl + cur=$("$ppd" get) + case "$cur" in + power-saver) next=balanced; icon="󰾅" ;; + balanced) next=performance; icon="󰓅" ;; + performance) next=power-saver; icon="󰌪" ;; + *) next=balanced; icon="󰾅" ;; + esac + "$ppd" set "$next" + OSD_TEXT="$icon ''${next^}" + ${updateOsd} + ''; + + airplane-toggle = pkgs.writeShellScriptBin "airplane-toggle" '' + # Reuse nmcli + bluetoothctl (unprivileged) instead of rfkill. + on=false + nmcli radio wifi 2>/dev/null | grep -q enabled && on=true + bluetoothctl show 2>/dev/null | grep -q "Powered: yes" && on=true + if $on; then + nmcli radio wifi off 2>/dev/null + bluetoothctl power off >/dev/null 2>&1 || true + OSD_TEXT="󰀝 Airplane On" + else + nmcli radio wifi on 2>/dev/null + bluetoothctl power on >/dev/null 2>&1 || true + OSD_TEXT="󰀞 Airplane Off" + fi + ${updateOsd} + ''; + + clipboard-menu = pkgs.writeShellScriptBin "clipboard-menu" '' + list=$(${pkgs.cliphist}/bin/cliphist list) + selected=$(printf '%s\n' "$list" | cut -f2- | ${tofiMenu} --prompt-text "Clipboard: ") + [ -n "$selected" ] && printf '%s\n' "$list" \ + | awk -F'\t' -v s="$selected" '$2 == s {print; exit}' \ + | ${pkgs.cliphist}/bin/cliphist decode \ + | ${pkgs.wl-clipboard}/bin/wl-copy + ''; + + emoji-picker = pkgs.writeShellScriptBin "emoji-picker" '' + export PATH="${pkgs.wtype}/bin:${pkgs.wl-clipboard}/bin:$PATH" + export BEMOJI_PICKER_CMD="${tofiMenu} --prompt-text 'emoji: '" + # -t types the emoji (wtype), -c also copies it. + exec ${pkgs.bemoji}/bin/bemoji -t -c + ''; + + icon-picker = pkgs.writeShellScriptBin "icon-picker" '' + selected=$(${tofiMenu} --font "${config.stylix.fonts.monospace.name}" --prompt-text 'icon: ' < ${nerdFontIconList}) + [ -z "$selected" ] || icon=$(printf '%s\n' "$selected" | awk '{print $1}') + [ -n "''${icon:-}" ] || exit 0 + ${pkgs.wtype}/bin/wtype "$icon" + printf '%s' "$icon" | ${pkgs.wl-clipboard}/bin/wl-copy + ''; + + caffeine-toggle = pkgs.writeShellScriptBin "caffeine-toggle" '' + # Pause hypridle (stay awake) or resume it. + if systemctl --user is-active --quiet hypridle; then + systemctl --user stop hypridle + OSD_TEXT="󰅶 Keep Awake On" + else + systemctl --user start hypridle + OSD_TEXT="󰾫 Keep Awake Off" + fi + ${updateOsd} + ''; +} diff --git a/home/system/waybar/settings.nix b/home/system/waybar/settings.nix new file mode 100644 index 00000000..d858ff2e --- /dev/null +++ b/home/system/waybar/settings.nix @@ -0,0 +1,169 @@ +{ + config, + pkgs, + networkScript, + bluetoothScript, + caffeineToggleScript, + osdStatusScript, + nightshiftToggleScript, + ... +}: let + gaps-out = config.theme.gaps-out; + c = config.lib.stylix.colors; +in { + programs.waybar.settings = [ + { + layer = "top"; + position = "top"; + height = config.theme.bar-height; + margin = "${toString gaps-out} ${toString gaps-out} 0"; + modules-center = ["custom/osd" "custom/osd-sep" "clock" "tray" "hyprland/workspaces" "custom/network" "custom/bluetooth" "battery" "group/drawer"]; + + # ── Modules ───────────────────────────────────────────────────────── + + "hyprland/workspaces" = { + format = "{id}"; + all-outputs = true; + move-to-monitor = true; + ignore-workspaces = ["[5-9]" "[1-9][0-9]+"]; + on-scroll-down = "${pkgs.hyprland}/bin/hyprctl dispatch workspace e+1"; + on-scroll-up = "${pkgs.hyprland}/bin/hyprctl dispatch workspace e-1"; + persistent-workspaces."*" = [1 2 3 4]; + cursor = true; + }; + + battery = { + interval = 20; + full-at = 100; + tooltip = true; + format = "{icon} "; + format-charging = " {icon} "; + format-icons = ["" "" "" "" ""]; + tooltip-format = "{capacity}% · {time}"; + tooltip-format-full = "Full\n{capacity}%"; + tooltip-format-charging = "Charging\n{capacity}% · {time}"; + on-click = "${pkgs.ghostty}/bin/ghostty +new-window -e ${pkgs.nur.repos.anotherhadi.settuings}/bin/settuings --page power"; + states = { + warning = 30; + critical = 15; + }; + }; + + "custom/caffeine" = { + exec = "${pkgs.coreutils}/bin/printf '󰅶'"; + exec-if = "! systemctl --user is-active --quiet hypridle"; + format = "{}"; + interval = 5; + on-click = "${caffeineToggleScript}/bin/caffeine-toggle"; + tooltip = false; + }; + + "custom/nightshift" = { + exec = "${pkgs.coreutils}/bin/printf '󰖔'"; + exec-if = "${pkgs.procps}/bin/pgrep -x hyprsunset"; + format = "{}"; + interval = 5; + on-click = "${nightshiftToggleScript}/bin/nightshift-toggle"; + tooltip = false; + }; + + "custom/bluetooth" = { + exec = "${bluetoothScript}"; + exec-if = "${pkgs.bluez}/bin/bluetoothctl list 2>/dev/null | grep -q Controller"; + return-type = "json"; + interval = 5; + on-click = "${pkgs.ghostty}/bin/ghostty +new-window -e ${pkgs.nur.repos.anotherhadi.settuings}/bin/settuings --page bluetooth"; + }; + + "custom/osd" = { + exec = "cat /tmp/waybar-osd"; + exec-if = "${osdStatusScript}/bin/waybar-osd-status"; + signal = 8; + interval = 1; + format = "{}"; + }; + + "custom/osd-sep" = { + exec = "echo '|'"; + exec-if = "${osdStatusScript}/bin/waybar-osd-status"; + signal = 8; + interval = 1; + format = "{}"; + tooltip = false; + }; + + pulseaudio = { + format = "{icon}"; + format-bluetooth = "{icon}"; + tooltip-format = "{volume}%"; + format-muted = "󰝟"; + scroll-step = 2; + on-click = "${pkgs.ghostty}/bin/ghostty +new-window -e ${pkgs.nur.repos.anotherhadi.settuings}/bin/settuings --page audio"; + format-icons = { + headphone = ""; + hands-free = ""; + headset = ""; + phone = ""; + portable = ""; + car = ""; + default = [ + "󰕿" + "󰖀" + "󰕾" + ]; + }; + }; + + "pulseaudio/slider" = { + min = 0; + max = 100; + cursor = true; + }; + + "custom/network" = { + exec = "${networkScript}"; + return-type = "json"; + interval = 10; + on-click = "${pkgs.ghostty}/bin/ghostty +new-window -e ${pkgs.nur.repos.anotherhadi.settuings}/bin/settuings --page network"; + }; + + tray = { + icon-size = 13; + spacing = 12; + cursor = true; + }; + + clock = { + timezone = config.var.timeZone; + tooltip-format = "{calendar}"; + format = "{:%H:%M}"; + format-alt = "{:%H:%M %d %B %Y}"; + calendar = { + mode = "month"; + format = { + months = "{}"; + weekdays = "{}"; + days = "{}"; + today = "{}"; + }; + }; + }; + + "group/drawer" = { + orientation = "horizontal"; + drawer = { + transition-duration = 300; + children-class = "drawer-child"; + transition-left-to-right = false; + }; + modules = ["custom/arrow-right" "pulseaudio" "custom/nightshift" "custom/caffeine"]; + }; + + "custom/arrow-right" = { + format = " "; + tooltip = false; + cursor = true; + }; + } + ]; +} diff --git a/home/system/waybar/style.nix b/home/system/waybar/style.nix new file mode 100644 index 00000000..a3fd9417 --- /dev/null +++ b/home/system/waybar/style.nix @@ -0,0 +1,172 @@ +{config, ...}: let + c = config.lib.stylix.colors; + fg = "#${c.base05}"; + module-bg = "#${c.base01}"; + tooltip-bg = "#${c.base01}"; + red = "#${c.base08}"; + yellow = "#${c.base0A}"; + green = "#${c.base0B}"; + blue = "#${c.base0D}"; + cyan = "#${c.base0C}"; + inactive = "#${c.base03}"; + highlight = "#${c.base02}"; + font-size = "${toString config.stylix.fonts.sizes.applications}px"; + font-size-clock = "${toString (config.stylix.fonts.sizes.applications + 2)}px"; + module-padding = "14px"; +in { + programs.waybar.style = '' + * { + font-family: '${config.stylix.fonts.sansSerif.name}'; + border: none; + border-radius: 0; + min-height: 0; + margin: 0; + padding: 0; + text-shadow: none; + } + + #waybar { + font-weight: 700; + background: transparent; + font-size: ${font-size}; + color: ${fg}; + } + + .modules-center { + background: ${module-bg}; + border-radius: 100px; + padding: 6px 14px; + box-shadow: none; + } + + #clock, + #battery, + #tray, + #workspaces, + #custom-osd, + #custom-network, + #custom-bluetooth, + #custom-caffeine, + #custom-nightshift, + #pulseaudio { + padding: 1px ${module-padding}; + } + + #custom-arrow-right { + color: ${fg}; + padding: 1px 8px; + } + + #group-drawer { + padding: 0; + } + + #custom-osd-sep { + padding: 0; + color: ${inactive}; + } + + #clock { + font-size: ${font-size-clock}; + } + + #workspaces button { + color: ${fg}; + font-size: ${font-size}; + border-radius: 100px; + padding: 0 3px; + margin: 0; + } + + #workspaces button.empty { + color: ${inactive}; + } + + #workspaces button:hover { + background: transparent; + color: ${fg}; + } + + #workspaces button.active { + color: ${module-bg}; + background: ${blue}; + border-radius: 60px; + padding: 0 8px; + margin: 0; + } + + #battery { + color: ${green}; + } + + #battery.charging, + #battery.full { + color: ${green}; + } + + #battery.critical, + #custom-network.disconnected { + color: ${red}; + } + + #battery.warning { + color: ${yellow}; + } + + #custom-network.ethernet, + #custom-network.wifi { + color: ${cyan}; + } + + #custom-bluetooth { + color: ${blue}; + } + + #custom-bluetooth.off { + color: ${inactive}; + } + + #custom-caffeine, + #custom-nightshift { + color: ${yellow}; + } + + #custom-osd { + font-weight: 700; + color: ${fg}; + } + + tooltip { + border-radius: 15px; + background: ${tooltip-bg}; + } + + tooltip label { + padding: 3px 10px; + color: ${fg}; + font-weight: 700; + } + + .popup * { + box-shadow: none; + outline: none; + border-radius: 10px; + } + + menu { + border-radius: 10px; + font-weight: 700; + color: ${fg}; + background: ${tooltip-bg}; + } + + menu > * { + padding: 3px 0px; + } + + menu > *:hover { + border-radius: 10px; + background-color: ${highlight}; + } + ''; +} diff --git a/hosts/laptop/configuration.nix b/hosts/laptop/configuration.nix index f333438c..b4c122e4 100644 --- a/hosts/laptop/configuration.nix +++ b/hosts/laptop/configuration.nix @@ -13,10 +13,12 @@ ../../nixos/utils.nix ../../nixos/hyprland.nix ../../nixos/usbguard.nix - ../../home/programs/helium/system.nix # I hate browser's configuration.. + ../../home/programs/gui/helium/system.nix # I hate browser's configuration.. ../../nixos/omen.nix # CHANGEME: For my laptop only, remove this (OMEN 16) + ./wireguard.nix # CHANGEME: For my laptop only + # You should let those lines as is ./hardware-configuration.nix ./variables.nix @@ -47,12 +49,13 @@ allow id 03f0:076b serial "" name "USB5734" hash "BshoqybYo0IKgoDORYPRtbhhlmQrYAxPQb2EAm1JsWA=" parent-hash "JHDjLFApQNqijjmuKdJSWH5+1oLL7S6LQ9QHTAk5fTk=" via-port "8-1.3" with-interface 09:00:00 with-connect-type "unknown" allow id 0bda:8153 serial "000001000000" name "USB 10/100/1000 LAN" hash "utEnXKJ57kRUbPcGUaNWhEyoOEbLOYAFxvlsyC0PZkk=" parent-hash "JHDjLFApQNqijjmuKdJSWH5+1oLL7S6LQ9QHTAk5fTk=" with-interface { ff:ff:00 02:06:00 0a:00:00 0a:00:00 } with-connect-type "unknown" allow id 046d:0ab7 serial "2046BAB04T68" name "Blue Microphones" hash "cC6AQ2e1Q/BeFeostpbf1mH2WpoUmt6bhau4NlA3niU=" parent-hash "MSXcPAlZqkpTyZQylOhSIB8eMfST2AzVHV9EbrBGTWc=" with-interface { 01:01:00 01:02:00 01:02:00 01:02:00 01:02:00 01:02:00 01:02:00 03:00:00 } with-connect-type "unknown" - allow id 1532:02a1 serial "" name "Razer Ornata V3" hash "wfuIjBhhGuge8gflyA526SKqKoy8rHJZQZ+2o6usMiE=" parent-hash "MSXcPAlZqkpTyZQylOhSIB8eMfST2AzVHV9EbrBGTWc=" via-port "7-1.3.3" with-interface { 03:01:01 03:00:01 03:00:02 } with-connect-type "unknown" allow id 13fd:5900 serial "50026B76861EE752 " name "External" hash "l/QvVV5hzZj1z6OUwB/kWl+WnH/7awrdMBoiNVx660M=" parent-hash "MSXcPAlZqkpTyZQylOhSIB8eMfST2AzVHV9EbrBGTWc=" with-interface { 08:06:50 08:06:62 } with-connect-type "unknown" + allow id 1532:02a1 name "Razer Ornata V3" + allow id 03f0:066b name "HP USB-C Dock G5" ''; home-manager.users."${config.var.username}" = import ./home.nix; # Don't touch this - system.stateVersion = "24.05"; + system.stateVersion = "26.05"; } diff --git a/hosts/laptop/flake.nix b/hosts/laptop/flake.nix index 916c6e78..46fdd63e 100644 --- a/hosts/laptop/flake.nix +++ b/hosts/laptop/flake.nix @@ -1,18 +1,21 @@ { inputs, nixpkgs, + pkgs-unstable, ... }: nixpkgs.lib.nixosSystem { modules = [ { nixpkgs.overlays = [ + inputs.nur.overlays.default ]; - _module.args = {inherit inputs;}; + _module.args = {inherit inputs pkgs-unstable;}; } inputs.nixos-hardware.nixosModules.omen-16-n0005ne inputs.home-manager.nixosModules.home-manager inputs.stylix.nixosModules.stylix + inputs.sops-nix.nixosModules.sops inputs.nix-index-database.nixosModules.default inputs.helium-browser.nixosModules.default ./configuration.nix diff --git a/hosts/laptop/home.nix b/hosts/laptop/home.nix index 4ed5f33f..632817f7 100644 --- a/hosts/laptop/home.nix +++ b/hosts/laptop/home.nix @@ -1,33 +1,45 @@ -{config, ...}: { +{ + config, + inputs, + ... +}: { imports = [ # Programs - ../../home/programs/helium - ../../home/programs/proton - ../../home/programs/proton/auto-start-vpn.nix - ../../home/programs/ghostty - ../../home/programs/nvf - ../../home/programs/shell - ../../home/programs/git - ../../home/programs/git/lazygit.nix - ../../home/programs/git/signing.nix # CHANGEME: Change the key or remove this file - ../../home/programs/thunar - ../../home/programs/nixy - ../../home/programs/nightshift - ../../home/programs/nix-utils - ../../home/programs/spotatui - ../../home/programs/yazi - ../../home/programs/group/basic-apps.nix + ## GUI + ../../home/programs/gui/proton + ../../home/programs/gui/helium + ../../home/programs/gui/pkgs.nix + + ## TUI + inputs.nvf-config.homeManagerModules.default + ../../home/programs/tui/ghostty + ../../home/programs/tui/ilovetui + ../../home/programs/tui/shell + ../../home/programs/tui/git + ../../home/programs/tui/git/lazygit.nix + ../../home/programs/tui/git/signing.nix # CHANGEME: Change the key or remove this file + ../../home/programs/tui/nixy + ../../home/programs/tui/nix-utils + ../../home/programs/tui/spotatui + ../../home/programs/tui/elio + ../../home/programs/tui/pkgs.nix + + ## GROUPS ../../home/programs/group/cybersecurity.nix ../../home/programs/group/dev.nix - ../../home/programs/group/misc.nix # System (Desktop environment like stuff) + ../../home/system/hyprlock ../../home/system/hyprland - ../../home/system/caelestia-shell - ../../home/system/hyprpaper + ../../home/system/waybar + ../../home/system/swaync + ../../home/system/tofi ../../home/system/mime ../../home/system/udiskie + ../../home/system/termfilechooser + ../../home/system/clipboard + ../../home/system/hypridle ./variables.nix # Mostly user-specific configuration ./secrets # CHANGEME: You should probably remove this line, this is where I store my secrets @@ -45,7 +57,7 @@ }; # Don't touch this - stateVersion = "24.05"; + stateVersion = "26.05"; }; wayland.windowManager.hyprland.settings.monitor = [ diff --git a/hosts/laptop/secrets/default.nix b/hosts/laptop/secrets/default.nix index eac568f7..efc008b3 100644 --- a/hosts/laptop/secrets/default.nix +++ b/hosts/laptop/secrets/default.nix @@ -51,11 +51,12 @@ in { - *work ''; - systemd.user.services.mbsync.Unit.After = ["sops-nix.service"]; home.packages = with pkgs; [ sops age ]; - wayland.windowManager.hyprland.settings.exec-once = ["systemctl --user start sops-nix"]; + wayland.windowManager.hyprland.settings.exec-once = [ + "systemctl --user start sops-nix" + ]; } diff --git a/hosts/laptop/secrets/secrets.yaml b/hosts/laptop/secrets/secrets.yaml index 49bcc0f5..e5720ca7 100644 --- a/hosts/laptop/secrets/secrets.yaml +++ b/hosts/laptop/secrets/secrets.yaml @@ -3,10 +3,10 @@ github-key: ENC[AES256_GCM,data:xUgFMlBo8e+3eXqNscxbby1dWug3SgUagDiNUe/IGVbU6ccz jack-key: ENC[AES256_GCM,data:VfCl3wH0MMBc8QDyjLDFeSvzSEsf7uGpfJvRjFrmjW+bPRUXBpZhJV8a9VQIAz7z7zZXvzARMfCeI0ydyC57CW81GH5/H5pneJ4b+xreINjVfdLbL1nC1thelo/O64jda/L+xVKhgE+QQi8/zt4JmXGghkP+74nYcTTaMpmcbgWw354J1ybXqyCEY+88nsJ1d2s+M7M2bplx4fGb7sLUs6sqdsad3sENzhH/0HQCFXreHTtgsLbIs8ccmdRgFNKM8/wD0OoW76rOQsJoA9JY4yOTQNVoX5M8+Olj6+wVlt6QBrWrYRuEztGnHrHvzxiHXtmEkMwVNfoPpEflQyRYRa0rVp/66REOkMckGx6/LbxKFgrxnifRlsK3kWd28v2bRGVQOghUluYUtVkaJ+eh6o6ik0NQKx8/H6BznBSDE6MjDwbLv434LHBfDtAqhWN1eMbOlunFivsl5Hb/6rl9kydHlcCS6FY8cUHoKQ90gDaUuDrvUifwmdO5hU0GH5tgvGi1ReK9ndcpQsrHptG6,iv:oC1xU5Tu3The105VYRmxIw4kEwDoqe8T/EH6mmqpqwQ=,tag:Pu8c536u6W7ALrqjRsvXDw==,type:str] signing-key: ENC[AES256_GCM,data:NvLqmt7NzrWkbQQqFfosmSMvEv8C8+MDDpxSoDo3zZ3MR6WXr9B+6CnUc6rtevM230wgE17VC9XlmcQxX+PjJsWq6gZteK5THTIcrR5zPJVNlVCEyeLKoFj/6m7qBgyyoN3OjCNjgMkhsm009jwBgNk0qJMAYebOGo8eoP/al+4ytm7dhna+iX5WZabAg0J4z4JMDQonqQl3SaDnCEdHvk9m7ZEP2vUFscPkbLj4ewgFq+bUCHOOQb2uqRJoEgcR/NetRFcQfzcU6lp7JxobaICaO3zdmomUm7oabIUTrc3Kom3Wjw8ryqfqC1/SC0SHr5XGk2ygk0WnlQ4kNshqriL2dwbWAzy1Z/cTX9+aB/KNtC0U6zWG1bpnL3dgSgvhRiocIis/eNg1HWsLWVicmdebL/lXHztxFMdTuX/gWgQBotggTmx+OFGZfP9ZGlF3635mDxM/fEOCtTyA195dMicCUsjEpBegNtXsp+oOtxyRI0jSW47MBcXFP09f5ywELTPyz4eOUHO8sQ6UfJ6X,iv:KNQUlMPaiR4x1Fw+HZe/EOmh/gfsrqlefpq23uflz/8=,tag:illu42HKunQXnijjsUIvnQ==,type:str] signing-pub-key: ENC[AES256_GCM,data:XuokZmCsnaNQ0rvVa3k81T4vtxw//r63xp1yHDLaNAMwA2r2bh6addl9WoAmm76g1rweqZrAAIw1PXDb90ubPaBP1iEHSkGZpwUpy/tOTePRdHMW2WtVvidpHQ==,iv:auB/bA89cJK6DnQi1BK2uldXRPyJfo+r7nl5qOLefUk=,tag:/I3kB6El1yesBMGOjJ+oHA==,type:str] +wireguard-private-key: ENC[AES256_GCM,data:5pEYyxiyKWMc9/3M37JimpeIrfZOtpwBnxL26q5d2griryqK8/CNsrv1Idw=,iv:2bZ/HlkwQ5Q6+BsiPWdjmdn3NbZ8Ck1RxP5dbGm3gDg=,tag:YeSEZlqj8QNLzItiSGjbPA==,type:str] sops: age: - - recipient: age12yvtj49pfh3fqzqflscm0ek4yzrjhr6cqhn7x89gdxnlykq0xudq5c7334 - enc: | + - enc: | -----BEGIN AGE ENCRYPTED FILE----- YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBHVWN4YjZqczB3Q21WL1lz ckROWkhRditHblVHVEpOS0E0aGVqdW14M0ZvCkNzRXlCOWFBWmQwTGpTYVdFRlpq @@ -14,7 +14,8 @@ sops: cmVxVC8rVDlWMUdZaGw3bmdOaWZGS1EKYahBlc8XpB5UdKZQkvxbLcKQ/xkFJjWo FSfQWnjhe/a7BJtJEcKZkjOQU0mYqlSu+uT2RA9diCQeRUJPRF+nAw== -----END AGE ENCRYPTED FILE----- - lastmodified: "2026-04-25T11:23:30Z" - mac: ENC[AES256_GCM,data:ZnLSwtyhaiMIcXxzlwhtk0dWVnOkn0avfeRezPPNBUXd0oyJY+krBsLXJdSNPHV/X/L58476okYjUzfIQzEAkrL9Fb7v/Jt0aw4SDrxbF+qbcfdvsWPUjFDJIPovuf3ee3o7iXGU2ItGTaJa2eFACoyd37KVc7jZd6gvYYAyULA=,iv:7IKqe0c5CTgJrS7OgCQWhtxaCVKo+UWEibttFUVCWGM=,tag:OfCrKPzrPBZThCR1j7IB7A==,type:str] + recipient: age12yvtj49pfh3fqzqflscm0ek4yzrjhr6cqhn7x89gdxnlykq0xudq5c7334 + lastmodified: "2026-08-12T16:57:26Z" + mac: ENC[AES256_GCM,data:uRV+z//TyrFiqYcVWQmQ4lT2QpiRR2gHwrFV9gSZAoeAcpmZqqUN84a1AcbM4Vx61uT1mhtIYwiUs7kdhjoypGKWWPwKSIDY9wMDjLoc5m/q4EZQ8n60qwmYMkKrqHcinn/uE60jl6bHo8zMaF2zRmLJD2OB+GQ4r4Gn5zxsO/I=,iv:EnKVhZsmU1uE6L0zq5nGvkk8ooVcSA6dlCsOg1k4Njg=,tag:ho+IhaChdCxUeMGl3dGgBA==,type:str] unencrypted_suffix: _unencrypted - version: 3.12.2 + version: 3.13.3 diff --git a/hosts/laptop/wireguard.nix b/hosts/laptop/wireguard.nix new file mode 100644 index 00000000..52957ee6 --- /dev/null +++ b/hosts/laptop/wireguard.nix @@ -0,0 +1,78 @@ +{ + config, + pkgs, + ... +}: let + vpnConnection = "wg-vpn"; + + # Same OSD mechanism as home/system/waybar/scripts.nix's waybar-osd: drop the + # text in /tmp/waybar-osd and nudge waybar's custom/osd module to show it. + toggleVpn = pkgs.writeShellScript "toggle-wg-vpn" '' + set -euo pipefail + nmcli="${pkgs.networkmanager}/bin/nmcli" + + if "$nmcli" -t -f NAME connection show --active | grep -qx "${vpnConnection}"; then + "$nmcli" connection down "${vpnConnection}" + OSD_TEXT="󰦝 VPN Off" + else + "$nmcli" connection up "${vpnConnection}" + OSD_TEXT="󰦝 VPN On" + fi + + printf '%s' "$OSD_TEXT" > /tmp/waybar-osd + ${pkgs.procps}/bin/pkill -x -RTMIN+8 waybar 2>/dev/null || true + ''; +in { + environment.systemPackages = [ + (pkgs.makeDesktopItem { + name = "toggle-wg-vpn"; + desktopName = "Toggle VPN"; + comment = "Turn the WireGuard VPN connection on or off"; + icon = "network-vpn-symbolic"; + exec = "${toggleVpn}"; + terminal = false; + categories = ["Network"]; + }) + ]; + + sops = { + age.keyFile = "/home/hadi/.config/sops/age/keys.txt"; + defaultSopsFile = ./secrets/secrets.yaml; + secrets.wireguard-private-key = {}; + + templates."wg-vpn.nmconnection" = { + path = "/etc/NetworkManager/system-connections/wg-vpn.nmconnection"; + mode = "0600"; + owner = "root"; + group = "root"; + content = '' + [connection] + id=wg-vpn + type=wireguard + interface-name=wg-vpn + autoconnect=true + autoconnect-priority=0 + + [wireguard] + private-key=${config.sops.placeholder.wireguard-private-key} + + [wireguard-peer.36G8+pInNcPK9F1TpHglWs9Pk5uJOY9o8SCNrCBgvHE=] + endpoint=89.222.96.158:51820 + allowed-ips=0.0.0.0/0;::/0; + persistent-keepalive=25 + + [ipv4] + method=manual + address1=10.2.0.2/32 + dns=10.2.0.1; + + [ipv6] + method=manual + address1=2a07:b944::2:2/128 + dns=2a07:b944::2:1; + addr-gen-mode=default + ip6-privacy=0 + ''; + }; + }; +} diff --git a/hosts/server/flake.nix b/hosts/server/flake.nix index f4a3df31..bfe90f61 100644 --- a/hosts/server/flake.nix +++ b/hosts/server/flake.nix @@ -1,11 +1,12 @@ { inputs, nixpkgs, + pkgs-unstable, ... }: nixpkgs.lib.nixosSystem { modules = [ - {_module.args = {inherit inputs;};} + {_module.args = {inherit inputs pkgs-unstable;};} inputs.home-manager.nixosModules.home-manager inputs.stylix.nixosModules.stylix inputs.sops-nix.nixosModules.sops diff --git a/hosts/server/hardware-configuration.nix b/hosts/server/hardware-configuration.nix index c7bbfe2a..09aed552 100644 --- a/hosts/server/hardware-configuration.nix +++ b/hosts/server/hardware-configuration.nix @@ -4,7 +4,6 @@ { config, lib, - pkgs, modulesPath, ... }: { @@ -38,7 +37,7 @@ options = [ "subvol=/" "compress=zstd" - ]; # adapte selon si t'as des subvolumes + ]; # adjust depending on whether you use subvolumes }; swapDevices = []; # Enables DHCP on each ethernet and wireless interface. In case of scripted networking diff --git a/hosts/server/home.nix b/hosts/server/home.nix index 5eafaa16..11adcab2 100644 --- a/hosts/server/home.nix +++ b/hosts/server/home.nix @@ -1,16 +1,19 @@ -{config, ...}: { +{ + config, + inputs, + ... +}: { imports = [ # Mostly user-specific configuration ./variables.nix # Programs - ../../home/programs/nvf - ../../home/programs/shell - ../../home/programs/git - ../../home/programs/git/lazygit.nix - ../../home/programs/nixy - ../../home/programs/nix-utils - ../../home/programs/yazi + inputs.nvf-config.homeManagerModules.default + ../../home/programs/tui/shell + ../../home/programs/tui/git + ../../home/programs/tui/git/lazygit.nix + ../../home/programs/tui/nixy + ../../home/programs/tui/nix-utils ../../home/programs/group/dev.nix ]; diff --git a/hosts/work/configuration.nix b/hosts/work/configuration.nix index 92c3c91f..f67566e5 100644 --- a/hosts/work/configuration.nix +++ b/hosts/work/configuration.nix @@ -2,7 +2,6 @@ imports = [ # Mostly system related configuration ../../nixos/audio.nix - ../../nixos/bluetooth.nix ../../nixos/fonts.nix ../../nixos/home-manager.nix ../../nixos/nix.nix @@ -12,7 +11,8 @@ ../../nixos/users.nix ../../nixos/utils.nix ../../nixos/hyprland.nix - ../../home/programs/helium/system.nix # I hate browser's configuration.. + ../../nixos/docker.nix + ../../home/programs/gui/helium/system.nix # I hate browser's configuration.. # You should let those lines as is ./hardware-configuration.nix @@ -29,13 +29,13 @@ services.usbguard.rules = '' allow id 1d6b:0002 serial "0000:00:14.0" name "xHCI Host Controller" hash "jEP/6WzviqdJ5VSeTUY8PatCNBKeaREvo2OqdplND/o=" parent-hash "rV9bfLq7c2eA4tYjVjwO4bxhm+y6GgZpl9J60L0fBkY=" with-interface 09:00:00 with-connect-type "" allow id 1d6b:0003 serial "0000:00:14.0" name "xHCI Host Controller" hash "prM+Jby/bFHCn2lNjQdAMbgc6tse3xVx+hZwjOPHSdQ=" parent-hash "rV9bfLq7c2eA4tYjVjwO4bxhm+y6GgZpl9J60L0fBkY=" with-interface 09:00:00 with-connect-type "" - allow id 17ef:608d serial "" name "Lenovo USB Optical Mouse" hash "klpDZuv1jhWGNqZLOl+KXF+75Ir3PfBm6D6ncjoLRBU=" parent-hash "jEP/6WzviqdJ5VSeTUY8PatCNBKeaREvo2OqdplND/o=" via-port "1-7" with-interface 03:01:02 with-connect-type "hotplug" allow id 17ef:6190 serial "" name "Lenovo Calliope USB Keyboard G2" hash "CfZ9R/aoXGm7BN/ojVEzKQwVoxCUtRWMuACrE7BL/5Y=" parent-hash "jEP/6WzviqdJ5VSeTUY8PatCNBKeaREvo2OqdplND/o=" via-port "1-10" with-interface { 03:01:01 03:00:00 } with-connect-type "hotplug" allow id 0781:5581 name " SanDisk 3.2Gen1" + allow id 17ef:608d name "Lenovo USB Optical Mouse" ''; networking.firewall.allowedTCPPorts = [9001]; # Don't touch this - system.stateVersion = "24.05"; + system.stateVersion = "26.05"; } diff --git a/hosts/work/flake.nix b/hosts/work/flake.nix index 963a5c27..1df13d4d 100644 --- a/hosts/work/flake.nix +++ b/hosts/work/flake.nix @@ -1,13 +1,16 @@ { inputs, nixpkgs, + pkgs-unstable, ... }: nixpkgs.lib.nixosSystem { modules = [ { - nixpkgs.overlays = []; - _module.args = {inherit inputs;}; + nixpkgs.overlays = [ + inputs.nur.overlays.default + ]; + _module.args = {inherit inputs pkgs-unstable;}; } inputs.home-manager.nixosModules.home-manager inputs.stylix.nixosModules.stylix diff --git a/hosts/work/hardware-configuration.nix b/hosts/work/hardware-configuration.nix index 5357795b..1026d658 100644 --- a/hosts/work/hardware-configuration.nix +++ b/hosts/work/hardware-configuration.nix @@ -4,7 +4,6 @@ { config, lib, - pkgs, modulesPath, ... }: { diff --git a/hosts/work/home.nix b/hosts/work/home.nix index 860dee89..bf1c251d 100644 --- a/hosts/work/home.nix +++ b/hosts/work/home.nix @@ -1,31 +1,42 @@ -{config, ...}: { +{ + config, + inputs, + ... +}: { imports = [ # Programs - ../../home/programs/proton - ../../home/programs/helium - ../../home/programs/ghostty - ../../home/programs/nvf - ../../home/programs/shell - ../../home/programs/git - ../../home/programs/git/lazygit.nix - ../../home/programs/thunar - ../../home/programs/nixy - ../../home/programs/nightshift - ../../home/programs/nix-utils - ../../home/programs/spotatui - ../../home/programs/yazi - ../../home/programs/group/basic-apps.nix + ## GUI + ../../home/programs/gui/proton + ../../home/programs/gui/helium + ../../home/programs/gui/pkgs.nix + + ## TUI + inputs.nvf-config.homeManagerModules.default + ../../home/programs/tui/ghostty + ../../home/programs/tui/shell + ../../home/programs/tui/git + ../../home/programs/tui/git/lazygit.nix + ../../home/programs/tui/nixy + ../../home/programs/tui/nix-utils + ../../home/programs/tui/spotatui + ../../home/programs/tui/pkgs.nix + + ## GROUPS ../../home/programs/group/cybersecurity.nix ../../home/programs/group/dev.nix - ../../home/programs/group/misc.nix # System (Desktop environment like stuff) + ../../home/system/hyprlock ../../home/system/hyprland - ../../home/system/caelestia-shell - ../../home/system/hyprpaper + ../../home/system/waybar + ../../home/system/swaync + ../../home/system/tofi ../../home/system/mime + ../../home/system/termfilechooser ../../home/system/udiskie + ../../home/system/clipboard + ../../home/system/hypridle ./variables.nix # Mostly user-specific configuration ./secrets # CHANGEME: You should probably remove this line, this is where I store my secrets @@ -36,7 +47,7 @@ homeDirectory = "/home/" + config.var.username; # Don't touch this - stateVersion = "24.05"; + stateVersion = "26.05"; }; wayland.windowManager.hyprland.settings.monitor = [ diff --git a/hosts/work/secrets/default.nix b/hosts/work/secrets/default.nix index 093d5f0a..09177310 100644 --- a/hosts/work/secrets/default.nix +++ b/hosts/work/secrets/default.nix @@ -48,11 +48,12 @@ in { - *work ''; - systemd.user.services.mbsync.Unit.After = ["sops-nix.service"]; home.packages = with pkgs; [ sops age ]; - wayland.windowManager.hyprland.settings.exec-once = ["systemctl --user start sops-nix"]; + wayland.windowManager.hyprland.settings.exec-once = [ + "systemctl --user start sops-nix" + ]; } diff --git a/hosts/work/secrets/secrets.yaml b/hosts/work/secrets/secrets.yaml index ae328cb6..cd0381d5 100644 --- a/hosts/work/secrets/secrets.yaml +++ b/hosts/work/secrets/secrets.yaml @@ -1,11 +1,10 @@ ssh-config: ENC[AES256_GCM,data:npBcAOSwHpApUASlZmRo4stwMrOjdrdmhfYwumjbTpcq8aQ2ybV8le7cjNdVqIyxgwxUFV4/tGfmsq4nlrWIO/85spwfC5DyPGaZ848NI3UZJj8k2GKuw5qk/xGsTveNhq+vNZQcHeL4aeXF2TRmFLDHYGTku9anFL7FWkQ75MmGW78XfPUEyZJ52ylXq3gkYeVSrl6cXuwJw/QBlu+XTgFk4MM+E5BTXBFFNJOYkIt4GwWX7wdI+QqPEof8J0ENYdxUAMKMueL4pLNclWP0fu7QC7gwwRJWjauCNElJiDhpVFa6WukJV/Ut+I30FH9cJtj0rSodeu0hq2fWaiQ0wVbQudxi0JcnxJQs+B9nb6kpF+TN0MiD,iv:c7DMZSmlgMMnNlR0/kNRKPYjCzvNQJ46mZzojHppSg8=,tag:ausjsFk0H9nOiiMebHXSUg==,type:str] netrc: ENC[AES256_GCM,data:EOpuZhDVXe7Q4P/98C3gtEvkdawI26d4oX/wRNytyp/mAdkHytXiLpFdsuO/3DADOG8h1CCo1UTs9ex+bqoD/LdChdp7INfNDSQ+aDxTiG0rLBgjvy8TIj8=,iv:tc/RbN1Upbjv+3rU5zUR3P//a1Hj1xODInLMShg4i1Y=,tag:7E9G2g4g+eMeJrwI20R/1g==,type:str] github-key: ENC[AES256_GCM,data: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,iv:2Mvmz1CFO1112RxjIl6sxyNIDqa/cg00um6RcQaHNY8=,tag:+zygdwQdCBeBXVLvAj/jJQ==,type:str] -gitlab-key: ENC[AES256_GCM,data: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,iv:aG4nqGJ/TRiAtiWoPwqej6We+IWEWFibCqL7bGwXbkA=,tag:c5ckW2o4+2rm/5mrGF1tzg==,type:str] +gitlab-key: ENC[AES256_GCM,data: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,iv:pbe2MtYmFmY/kS+gM9xyI6cXViVmzPB3H7XL1ZH47h0=,tag:NmSKMlAIEOWE8Jw/iy3+Xw==,type:str] sops: age: - - recipient: age1c8pawdsxptfslgrz2c56s39mrtnjzc5mm3hfzgr2wdwu2v6vfsdsupjsq6 - enc: | + - enc: | -----BEGIN AGE ENCRYPTED FILE----- YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBVby9Wa1NUUkpyeDMwU3dM R0EyeFVtT0tJU0pKaWtXQzRkTDBPY3JjcTFrClNIQnl2WVorS0FZZjhicTQ5V2kx @@ -13,7 +12,8 @@ sops: RkMrdTYwNkY1Tlc3M3dxTFdkRXJJZUEKUlYU45jXpS9hJO9Z/uAQ6XMj9QWgMMRI LbJxvt48+yC+Y0XKOtDE0lHAuGNzUG8R/7FB1tTD8NCamBe46KGCIg== -----END AGE ENCRYPTED FILE----- - lastmodified: "2026-04-23T07:50:07Z" - mac: ENC[AES256_GCM,data:V3us1oxkQxIg5hn8TMiSHWa0RhNbio2mP8j59lSCKDLjnpTUHUAUZZOan+fkBwPxxtIdZFVZQl/kZuEHcnNwXk8J0DLeT8jrs8pvlDCHMAc+C9uzThNjQ9CrZ2C/dNtoI6uop3a6qo8UMhKhvAus08yR8rLsY7Gqt/In28HKqxU=,iv:g8wmq1thPfkSSfG+mtJS0431wbon/uylDTfH0P31dlw=,tag:5Z6CJMWeGN6frTLJQMxGGw==,type:str] + recipient: age1c8pawdsxptfslgrz2c56s39mrtnjzc5mm3hfzgr2wdwu2v6vfsdsupjsq6 + lastmodified: "2026-07-01T12:18:22Z" + mac: ENC[AES256_GCM,data:rX8MoqaMAbfuMdcQMw8eDGXos3VgbA3VfNJJcGGk2xQPuTC7FW5S0BVuh68ajzVv0oaYtT8pBRktv9Lo2VDY6Mm4neVuF/9IgV0cTKwvx5ACjN40Zt7OU+QtlQK44kDXsJQFyV+BYHVNiW8jej1h9d7vSAgG0hD3GOpvtK6ZY6E=,iv:3B3COjvazDVRkUsuIiLlOCFqlE9ooFR8dC5PTXe/q28=,tag:QEqcRTks4zSX02qc9KDsrA==,type:str] unencrypted_suffix: _unencrypted - version: 3.12.2 + version: 3.13.1 diff --git a/nixos/amd-graphics.nix b/nixos/amd-graphics.nix index c2886a95..1758fe3d 100644 --- a/nixos/amd-graphics.nix +++ b/nixos/amd-graphics.nix @@ -3,7 +3,6 @@ enable = true; extraPackages = with pkgs; [ rocmPackages.clr.icd - # Support VA-API pour AMD libvdpau-va-gl libva-vdpau-driver ]; diff --git a/nixos/audio.nix b/nixos/audio.nix index 1fe30783..053d5677 100644 --- a/nixos/audio.nix +++ b/nixos/audio.nix @@ -1,23 +1,11 @@ # Audio configuration for NixOS using PipeWire { - security.rtkit.enable = true; - services.pulseaudio.enable = false; - services.pipewire = { enable = true; alsa.enable = true; alsa.support32Bit = true; pulse.enable = true; jack.enable = true; - wireplumber = { - enable = true; - extraConfig = { - "10-disable-camera" = { - "wireplumber.profiles" = { - main."monitor.libcamera" = "disabled"; - }; - }; - }; - }; }; + security.rtkit.enable = true; } diff --git a/nixos/docker.nix b/nixos/docker.nix index cf586fdf..4b972631 100644 --- a/nixos/docker.nix +++ b/nixos/docker.nix @@ -1,5 +1,9 @@ -{config, pkgs, ...}: { +{ + config, + pkgs, + ... +}: { virtualisation.docker.enable = true; - virtualisation.docker.package = pkgs.docker_29; users.users."${config.var.username}".extraGroups = ["docker"]; + environment.systemPackages = [pkgs.lazydocker]; } diff --git a/nixos/home-manager.nix b/nixos/home-manager.nix index 69369eb9..371dc333 100644 --- a/nixos/home-manager.nix +++ b/nixos/home-manager.nix @@ -1,7 +1,7 @@ # Home-manager configuration for NixOS { inputs, - pkgs, + pkgs-unstable, ... }: { home-manager = { @@ -9,12 +9,7 @@ useUserPackages = true; backupFileExtension = "hm-backup"; extraSpecialArgs = { - inherit inputs; - pkgs-stable = import inputs.nixpkgs-stable { - system = pkgs.stdenv.hostPlatform.system; - config.allowUnfree = true; - }; - pkgs-nur-hadi = inputs.nur-anotherhadi.packages.${pkgs.stdenv.hostPlatform.system}; + inherit inputs pkgs-unstable; }; }; } diff --git a/nixos/hyprland.nix b/nixos/hyprland.nix index 0a4943b1..b0ac2a90 100644 --- a/nixos/hyprland.nix +++ b/nixos/hyprland.nix @@ -1,14 +1,16 @@ # Hyprland is a dynamic tiling Wayland compositor. -{ - inputs, - pkgs, - ... -}: { +{...}: { programs.hyprland = { enable = true; withUWSM = true; - package = inputs.hyprland.packages."${pkgs.stdenv.hostPlatform.system}".hyprland; - portalPackage = - inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.xdg-desktop-portal-hyprland; }; + + # Generic Wayland hints (Chromium/Electron and Firefox), applied on every + # Hyprland host regardless of the GPU. + environment.variables = { + NIXOS_OZONE_WL = "1"; + MOZ_ENABLE_WAYLAND = "1"; + }; + + security.pam.services.hyprlock = {}; } diff --git a/nixos/nix.nix b/nixos/nix.nix index 5ee8294b..30db75b3 100644 --- a/nixos/nix.nix +++ b/nixos/nix.nix @@ -6,22 +6,6 @@ }: let autoGarbageCollector = config.var.autoGarbageCollector; in { - # Ask for password once per SSH session (tied to the tty, expires when session closes) - security.sudo.extraConfig = '' - Defaults timestamp_type=tty,timestamp_timeout=-1 - ''; - - security.sudo.extraRules = [ - { - users = [config.var.username]; - commands = [ - { - command = "/run/current-system/sw/bin/nixos-rebuild"; - options = ["NOPASSWD"]; - } - ]; - } - ]; nixpkgs.config = { allowUnfree = true; allowBroken = false; @@ -40,17 +24,10 @@ in { "flakes" ]; substituters = [ - # high priority since it's almost always used - "https://cache.nixos.org?priority=10" - - "https://hyprland.cachix.org" "https://nix-community.cachix.org" - "https://numtide.cachix.org" ]; trusted-public-keys = [ - "hyprland.cachix.org-1:a7pgxzMz7+chwVL3/pzj6jIBMioiJM7ypFP8PwtkuGc=" "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs=" - "numtide.cachix.org-1:2ps1kLBUWjxIneOy1Ik6cQjb41X0iXVXeHigGmycPPE=" ]; }; gc = { diff --git a/nixos/nvidia.nix b/nixos/nvidia.nix index 2c35464b..62c02b64 100644 --- a/nixos/nvidia.nix +++ b/nixos/nvidia.nix @@ -5,67 +5,47 @@ config, ... }: let - # Using beta driver for recent GPUs like RTX 4070 nvidiaDriverChannel = config.boot.kernelPackages.nvidiaPackages.production; in { - # Video drivers configuration for Xorg and Wayland - services.xserver.videoDrivers = ["nvidia"]; # Simplified - other modules are loaded automatically + services.xserver.videoDrivers = ["nvidia"]; - # Kernel parameters for better Wayland and Hyprland integration boot.kernelParams = [ - "nvidia-drm.modeset=1" # Enable mode setting for Wayland "nvidia.NVreg_PreserveVideoMemoryAllocations=1" # Improves resume after sleep ]; - # Blacklist nouveau to avoid conflicts - boot.blacklistedKernelModules = ["nouveau"]; - - # Environment variables for better compatibility environment.variables = { - LIBVA_DRIVER_NAME = "nvidia"; # Hardware video acceleration - GBM_BACKEND = "nvidia-drm"; # Graphics backend for Wayland - __GLX_VENDOR_LIBRARY_NAME = "nvidia"; # Use Nvidia driver for GLX - NIXOS_OZONE_WL = "1"; # Wayland support for Electron apps - __GL_GSYNC_ALLOWED = "1"; # Enable G-Sync if available - __GL_VRR_ALLOWED = "1"; # Enable VRR (Variable Refresh Rate) - NVD_BACKEND = "direct"; # Configuration for new driver - MOZ_ENABLE_WAYLAND = "1"; # Wayland support for Firefox + LIBVA_DRIVER_NAME = "nvidia"; + __GLX_VENDOR_LIBRARY_NAME = "nvidia"; + __GL_GSYNC_ALLOWED = "1"; + __GL_VRR_ALLOWED = "1"; + NVD_BACKEND = "direct"; }; - # Configuration for proprietary packages - nixpkgs.config = { - nvidia.acceptLicense = true; - }; + nixpkgs.config.nvidia.acceptLicense = true; - # Nvidia configuration hardware = { nvidia = { - open = false; # Proprietary driver for better performance - nvidiaSettings = true; # Nvidia settings utility + open = true; # Open kernel modules, recommended for Turing and newer (RTX 4070 = Ada Lovelace) + nvidiaSettings = true; powerManagement = { - enable = true; # Power management - finegrained = true; # More precise power consumption control + enable = true; + finegrained = true; }; - modesetting.enable = true; # Required for Wayland + modesetting.enable = true; package = nvidiaDriverChannel; - forceFullCompositionPipeline = true; # Prevents screen tearing + # forceFullCompositionPipeline = true; # Only useful when display is connected directly to Nvidia GPU, not in PRIME offload mode - # Configuration for hybrid AMD+Nvidia laptop prime = { - # Optimized configuration for switchable graphics laptops offload = { - enable = true; # Mode optimized for power saving - enableOffloadCmd = true; # Allows running applications with dedicated GPU + enable = true; + enableOffloadCmd = true; }; - # sync.enable disabled as offload is generally better for laptops - sync.enable = false; - # PCI IDs verified for your hardware - amdgpuBusId = "PCI:5:0:0"; # Integrated AMD GPU - nvidiaBusId = "PCI:1:0:0"; # Dedicated Nvidia GPU + sync.enable = false; # offload mode is better for battery life + amdgpuBusId = "PCI:5:0:0"; + nvidiaBusId = "PCI:1:0:0"; }; }; - # Enhanced graphics support graphics = { enable = true; enable32Bit = true; @@ -73,10 +53,8 @@ in { nvidia-vaapi-driver libva-vdpau-driver libvdpau-va-gl - mesa egl-wayland vulkan-loader - vulkan-validation-layers libva ]; }; @@ -90,13 +68,9 @@ in { ]; }; - # Additional useful packages environment.systemPackages = with pkgs; [ vulkan-tools mesa-demos - libva-utils # VA-API debugging tools + libva-utils ]; - - # Enable Nvidia container toolkit for GPU acceleration in containers (docker) - hardware.nvidia-container-toolkit.enable = false; } diff --git a/nixos/omen.nix b/nixos/omen.nix index cc16439e..e0ebfbdb 100644 --- a/nixos/omen.nix +++ b/nixos/omen.nix @@ -13,12 +13,16 @@ }: stdenv.mkDerivation (finalAttrs: { pname = "hp-omen-linux-module"; - version = "rebase-6.14"; + version = "rebase-6.15"; + # Upstream only rebases per kernel branch and currently tops out at + # rebase-6.15, while linuxPackages_latest is already on 7.x. If the + # module ever fails to build against a newer kernel, either bump this + # to a fresh upstream branch or fall back to a stable kernel. src = fetchFromGitHub { owner = "ranisalt"; repo = "hp-omen-linux-module"; - rev = finalAttrs.version; - sha256 = "sha256-2zCm29bdboSjRm/caMjBPGNc0tZXPUnIIYlHxxfhAok="; + rev = "d4b9b5adb84581c3874ca3985dc749c40c3ece67"; # rebase-6.15 + sha256 = "sha256-IOXHzcCB0n1InMjeIu3XYEJ4bhbHS3NIlS8/+4XIwkQ="; }; setSourceRoot = '' export sourceRoot=$(pwd)/${finalAttrs.src.name}/src diff --git a/nixos/systemd-boot.nix b/nixos/systemd-boot.nix index 1dbd4fa8..10e708c6 100644 --- a/nixos/systemd-boot.nix +++ b/nixos/systemd-boot.nix @@ -1,7 +1,6 @@ # Systemd-boot configuration for NixOS {pkgs, ...}: { boot = { - bootspec.enable = true; loader = { efi.canTouchEfiVariables = true; systemd-boot = { @@ -24,16 +23,6 @@ ]; consoleLogLevel = 0; initrd.verbose = false; - - # plymouth = { - # enable = true; - # theme = lib.mkForce "cuts_alt"; - # themePackages = with pkgs; [ - # (adi1090x-plymouth-themes.override { - # selected_themes = ["cuts_alt"]; - # }) - # ]; - # }; }; # To avoid systemd services hanging on shutdown diff --git a/nixos/tuigreet.nix b/nixos/tuigreet.nix index 126b02b9..f0796f71 100644 --- a/nixos/tuigreet.nix +++ b/nixos/tuigreet.nix @@ -43,10 +43,14 @@ in { }; }; + security.pam.services.greetd.enableGnomeKeyring = true; + # this is a life saver. # literally no documentation about this anywhere. # might be good to write about this... # https://www.reddit.com/r/NixOS/comments/u0cdpi/tuigreet_with_xmonad_how/ + # Unlock the gnome-keyring with the login password so apps (browser + # secrets via libsecret, ProtonVPN credentials, …) don't reprompt. systemd.services.greetd.serviceConfig = { Type = "idle"; StandardInput = "tty"; @@ -57,6 +61,4 @@ in { TTYVHangup = true; TTYVTDisallocate = true; }; - - environment.systemPackages = [tuigreet]; } diff --git a/nixos/usbguard.nix b/nixos/usbguard.nix index a1567d19..165e8f61 100644 --- a/nixos/usbguard.nix +++ b/nixos/usbguard.nix @@ -1,10 +1,14 @@ -{config, ...}: { +# USBGuard: +# The following line allow all USB devices until a proper policy is configured. +# Run `sudo usbguard generate-policy` with your devices plugged in, +# then set rules = "" and switch implicitPolicyTarget to "block". +# services.usbguard.implicitPolicyTarget = lib.mkForce "allow"; +{ services.usbguard = { enable = true; implicitPolicyTarget = "block"; IPCAllowedUsers = [ "root" - config.var.username ]; }; } diff --git a/nixos/utils.nix b/nixos/utils.nix index 44d6a4c2..2ca1959e 100644 --- a/nixos/utils.nix +++ b/nixos/utils.nix @@ -12,11 +12,12 @@ extraLocale = config.var.extraLocale; autoUpgrade = config.var.autoUpgrade; in { - networking.hostName = hostname; + networking = { + hostName = hostname; + networkmanager.enable = true; + }; - networking.networkmanager.enable = true; systemd.services.NetworkManager-wait-online.enable = false; - system.autoUpgrade = { enable = autoUpgrade; dates = "04:00"; @@ -32,49 +33,34 @@ in { time = { timeZone = timeZone; }; - i18n.defaultLocale = defaultLocale; - i18n.inputMethod = { - enable = true; - type = "fcitx5"; - fcitx5.addons = with pkgs; [fcitx5-gtk]; - }; - i18n.extraLocaleSettings = { - LC_ADDRESS = extraLocale; - LC_IDENTIFICATION = extraLocale; - LC_MEASUREMENT = extraLocale; - LC_MONETARY = extraLocale; - LC_NAME = extraLocale; - LC_NUMERIC = extraLocale; - LC_PAPER = extraLocale; - LC_TELEPHONE = extraLocale; - LC_TIME = extraLocale; + + i18n = { + defaultLocale = defaultLocale; + extraLocaleSettings = { + LC_ADDRESS = extraLocale; + LC_IDENTIFICATION = extraLocale; + LC_MEASUREMENT = extraLocale; + LC_MONETARY = extraLocale; + LC_NAME = extraLocale; + LC_NUMERIC = extraLocale; + LC_PAPER = extraLocale; + LC_TELEPHONE = extraLocale; + LC_TIME = extraLocale; + }; }; services = { + libinput.enable = true; xserver = { enable = true; xkb.layout = keyboardLayout; - xkb.variant = ""; }; gnome.gnome-keyring.enable = true; psd = { enable = true; resyncTimer = "10m"; }; - }; - console.keyMap = keyboardLayout; - - environment.variables = { - XDG_DATA_HOME = "$HOME/.local/share"; - PASSWORD_STORE_DIR = "$HOME/.local/share/password-store"; - EDITOR = "nvim"; - }; - - services.libinput.enable = true; - programs.dconf.enable = true; - services = { dbus = { - enable = true; implementation = "broker"; packages = with pkgs; [ gcr @@ -86,66 +72,70 @@ in { power-profiles-daemon.enable = true; udisks2.enable = true; }; + console.keyMap = keyboardLayout; - # enable zsh autocompletion for system packages (systemd, etc) - environment.pathsToLink = ["/share/zsh"]; + environment = { + variables = { + PASSWORD_STORE_DIR = "$HOME/.local/share/password-store"; + }; + # enable zsh autocompletion for system packages (systemd, etc) + pathsToLink = ["/share/zsh"]; + systemPackages = with pkgs; [ + fd + bc + gcc + file + git-ignore + xdg-utils + wget + curl + gnupg + openssl + vim + go + comma + zip + unzip + optipng + jpegoptim + pfetch + btop + unrar + p7zip + ]; + }; + + programs.dconf.enable = true; # Faster rebuilding documentation = { - enable = true; doc.enable = false; - man.enable = true; dev.enable = false; info.enable = false; nixos.enable = false; }; - environment.systemPackages = with pkgs; [ - fd - bc - gcc - file - git-ignore - xdg-utils - wget - curl - gnupg - openssl - vim - go - comma - zip - unzip - optipng - jpegoptim - pfetch - btop - unrar - p7zip - ]; - xdg.portal = { - enable = true; - xdgOpenUsePortal = true; + xdgOpenUsePortal = false; config = { common.default = ["gtk"]; - hyprland.default = [ - "gtk" - "hyprland" - ]; + hyprland = { + default = [ + "gtk" + "hyprland" + ]; + # Pick files / choose download paths with elio instead of the GTK dialog. + # Key MUST use the "impl" interface name, else xdg-desktop-portal + # ignores it and falls back to the default (gtk). See portals.conf(5). + "org.freedesktop.impl.portal.FileChooser" = ["termfilechooser"]; + }; }; - extraPortals = [pkgs.xdg-desktop-portal-gtk]; + extraPortals = [ + pkgs.xdg-desktop-portal-gtk + pkgs.xdg-desktop-portal-termfilechooser + ]; }; - security = { - # allow wayland lockers to unlock the screen - pam.services.hyprlock.text = "auth include login"; - - # userland niceness - rtkit.enable = true; - - # don't ask for password for wheel group - sudo.wheelNeedsPassword = false; - }; + security.rtkit.enable = true; } diff --git a/server-modules/arr.nix b/server-modules/arr.nix index 707543c2..680fe0c8 100644 --- a/server-modules/arr.nix +++ b/server-modules/arr.nix @@ -8,6 +8,7 @@ in { sops.secrets = { recyclarr = { owner = "recyclarr"; + # TODO: too permissive (world-writable), should be 0600/0400 mode = "0777"; }; wireguard-pia = { diff --git a/server-modules/awesome-wallpapers.nix b/server-modules/awesome-wallpapers.nix index b3dd75bf..979bba02 100644 --- a/server-modules/awesome-wallpapers.nix +++ b/server-modules/awesome-wallpapers.nix @@ -11,11 +11,11 @@ in { name = "wallpapers"; hostIp = "10.233.4.1"; containerIp = "10.233.4.2"; - nixosConfig = {pkgs, ...}: { + nixosConfig = {pkgs-unstable, ...}: { services.nginx = { enable = true; virtualHosts."wallpapers" = { - root = "${inputs.awesome-wallpapers.packages.${pkgs.stdenv.hostPlatform.system}.default}/share/awesome-wallpapers"; + root = "${inputs.awesome-wallpapers.packages.${pkgs-unstable.stdenv.hostPlatform.system}.default}/share/awesome-wallpapers"; listen = [ { addr = "0.0.0.0"; diff --git a/server-modules/blog.nix b/server-modules/blog.nix index 33c9618b..2a0b6101 100644 --- a/server-modules/blog.nix +++ b/server-modules/blog.nix @@ -12,12 +12,12 @@ in { name = "blog"; hostIp = "10.233.3.1"; containerIp = "10.233.3.2"; - nixosConfig = {pkgs, ...}: { + nixosConfig = {pkgs-unstable, ...}: { services.nginx = { enable = true; virtualHosts = { "blog" = { - root = "${inputs.blog.packages.${pkgs.stdenv.hostPlatform.system}.default}/share/blog"; + root = "${inputs.blog.packages.${pkgs-unstable.stdenv.hostPlatform.system}.default}/share/blog"; listen = [ { addr = "0.0.0.0"; diff --git a/server-modules/cloudflared.nix b/server-modules/cloudflared.nix index 4bccfdb0..d83251b7 100644 --- a/server-modules/cloudflared.nix +++ b/server-modules/cloudflared.nix @@ -2,7 +2,7 @@ # It allows exposing services securely via Cloudflare Tunnel { config, - pkgs, + pkgs-unstable, ... }: { sops.secrets.cloudflared-token.mode = "0400"; @@ -20,7 +20,7 @@ }; }; - environment.systemPackages = with pkgs; [ + environment.systemPackages = with pkgs-unstable; [ cloudflared ]; diff --git a/server-modules/cyberchef.nix b/server-modules/cyberchef.nix index fa227982..b562e063 100644 --- a/server-modules/cyberchef.nix +++ b/server-modules/cyberchef.nix @@ -10,11 +10,11 @@ in { name = "cyberchef"; hostIp = "10.233.5.1"; containerIp = "10.233.5.2"; - nixosConfig = {pkgs, ...}: { + nixosConfig = {pkgs-unstable, ...}: { services.nginx = { enable = true; virtualHosts."cyberchef" = { - root = "${pkgs.cyberchef}/share/cyberchef"; + root = "${pkgs-unstable.cyberchef}/share/cyberchef"; listen = [ { addr = "0.0.0.0"; diff --git a/server-modules/gitea.nix b/server-modules/gitea.nix index 6426f73f..411e82fa 100644 --- a/server-modules/gitea.nix +++ b/server-modules/gitea.nix @@ -1,12 +1,12 @@ { config, - pkgs, + pkgs-unstable, lib, ... }: let inherit (import ./mk-container.nix {inherit lib config;}) mkContainer; domain = config.var.domain; - catppuccin-gitea = pkgs.fetchzip { + catppuccin-gitea = pkgs-unstable.fetchzip { url = "https://github.com/catppuccin/gitea/releases/download/v1.0.2/catppuccin-gitea.tar.gz"; sha256 = "sha256-rZHLORwLUfIFcB6K9yhrzr+UwdPNQVSadsw6rg8Q7gs="; stripRoot = false; diff --git a/server-modules/glance/default.nix b/server-modules/glance/default.nix index 4763c642..7ed417fc 100644 --- a/server-modules/glance/default.nix +++ b/server-modules/glance/default.nix @@ -83,6 +83,7 @@ c = config.stylix.base16Scheme; in { # 0444 so the glance user inside the container can read the bind-mounted file + # TODO: too broad (world-readable), scope to the container's mapped uid/gid instead sops.secrets.adguard-pwd.mode = "0444"; imports = [ diff --git a/server-modules/mazanoke.nix b/server-modules/mazanoke.nix index 53f73c26..a71f76a1 100644 --- a/server-modules/mazanoke.nix +++ b/server-modules/mazanoke.nix @@ -10,12 +10,12 @@ in { name = "mazanoke"; hostIp = "10.233.7.1"; containerIp = "10.233.7.2"; - nixosConfig = {pkgs, ...}: let + nixosConfig = {pkgs-unstable, ...}: let version = "1.1.5"; - mazanoke-pkg = pkgs.stdenv.mkDerivation { + mazanoke-pkg = pkgs-unstable.stdenv.mkDerivation { inherit version; pname = "mazanoke"; - src = pkgs.fetchFromGitHub { + src = pkgs-unstable.fetchFromGitHub { owner = "civilblur"; repo = "mazanoke"; rev = "v${version}"; diff --git a/shell.nix b/shell.nix new file mode 100644 index 00000000..33532b97 --- /dev/null +++ b/shell.nix @@ -0,0 +1,36 @@ +{ + pkgs, + gitHooksLib, +}: let + hooks = gitHooksLib.run { + src = ../.; + hooks = { + inject-exec = { + enable = true; + name = "inject-exec"; + entry = "python3 .github/scripts/inject-exec.py README.md"; + language = "system"; + files = "(README\\.md)"; + pass_filenames = false; + }; + + doctoc = { + enable = true; + name = "doctoc"; + entry = "doctoc --notitle README.md"; + language = "system"; + files = "(README\\.md)"; + pass_filenames = false; + }; + }; + }; +in + pkgs.mkShell { + packages = with pkgs; + [ + doctoc + ] + ++ hooks.enabledPackages; + + shellHook = hooks.shellHook; + } diff --git a/themes/nixy.nix b/themes/nixy.nix index e1d5b25a..394e62e8 100644 --- a/themes/nixy.nix +++ b/themes/nixy.nix @@ -8,16 +8,14 @@ type = lib.types.attrs; default = { rounding = 20; - bar-rounding = 20 + 10; - bar-thickness = 0; + bar-height = 36; gaps-in = 8; gaps-out = 8 * 2; active-opacity = 0.96; inactive-opacity = 0.92; - blur = true; + blur = false; border-size = 2; - animation-speed = "medium"; # "fast" | "medium" | "slow" - fetch = "none"; # "nerdfetch" | "neofetch" | "pfetch" | "none" + animation-speed = "very-fast"; # "very-fast" | "fast" | "medium" | "slow" }; description = "Theme configuration options"; }; @@ -57,8 +55,8 @@ name = "Maple Mono NF"; }; sansSerif = { - package = pkgs.source-sans-pro; - name = "Source Sans Pro"; + package = pkgs.rubik; + name = "Rubik"; }; serif = config.stylix.fonts.sansSerif; emoji = { @@ -75,8 +73,8 @@ polarity = "dark"; image = pkgs.fetchurl { - url = "https://raw.githubusercontent.com/anotherhadi/awesome-wallpapers/refs/heads/main/app/static/wallpapers/black-moutains-and-a-city.png"; - sha256 = "sha256-RTTA3Lf+hnPpo9hwS075kbnIouz12ul2GKO3EIgP6AU="; + url = "https://raw.githubusercontent.com/anotherhadi/awesome-wallpapers/main/app/static/wallpapers/another-one.png"; + sha256 = "sha256-zthfsd4QLShPPApV8RoPANaymMC5IiCrmp8QwyyhCcY="; }; }; }