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
-
-
-
-
-
-**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
-
-
-
-
-
-## 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
-
----
-
-"$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)
@@ -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
-
-
-
+
+
+
## 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.
-
+
## **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
-
-
-
-
+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 = "