375 Commits

Author SHA1 Message Date
Hadi 2127ffbe31 remove "privateBookmars"
Signed-off-by: Hadi <hadi@example.com>
2026-04-23 09:52:11 +02:00
Hadi a76f81fa13 update caelestia conf
Signed-off-by: Hadi <hadi@example.com>
2026-04-22 11:34:48 +02:00
Hadi f9d5c6ab00 Merge branch 'main' of github.com:anotherhadi/nixy 2026-04-22 10:38:12 +02:00
Hadi b51a78ac1c add secrets
Signed-off-by: Hadi <hadi@example.com>
2026-04-22 10:33:19 +02:00
Hadi 96b5d5e671 move feedly
Signed-off-by: Hadi <hadi@example.com>
2026-04-22 10:33:10 +02:00
Hadi a222958eea remove sesh
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-04-21 18:44:39 +02:00
Hadi c3f86c9831 Add netrc
Signed-off-by: Hadi <hadi@example.com>
2026-04-21 15:21:55 +02:00
Hadi dc5c7dc915 create dirs
Signed-off-by: Hadi <hadi@example.com>
2026-04-20 16:51:37 +02:00
Hadi 3cbe2a1ab2 add Feedly to bookmarks
Signed-off-by: Hadi <hadi@example.com>
2026-04-20 14:21:49 +02:00
Hadi a1ed4ebc4c add list & tools
Signed-off-by: Hadi <hadi@example.com>
2026-04-20 14:21:44 +02:00
Hadi 80aa828ee5 Init the work config v2
Signed-off-by: Hadi <hadi@example.com>
2026-04-20 14:05:09 +02:00
Hadi 28cdcb6dad Add tool & bookmark
Signed-off-by: Hadi <hadi@example.com>
2026-04-20 14:04:41 +02:00
Hadi e620c5296f edit bookmarks
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-04-19 19:34:13 +02:00
Hadi 80ca377585 v5.0.0 2026-04-19 18:51:14 +02:00
Hadi 3a8ac99f43 fix warning
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-04-19 18:50:55 +02:00
Hadi 6724573f16 Merge pull request #54 from Chiloute/fix-nvf-tailwind-install
nvf tailwind new install method
2026-04-19 18:48:30 +02:00
Hadi 13ae753f3d update
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-04-19 18:45:22 +02:00
Hadi 805f43618c Edit qutebrowser config
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-04-19 18:45:19 +02:00
Hadi 4489c9e0ae Add Proton Mail & Calendar shortcuts
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-04-19 17:38:03 +02:00
Hadi 3a86013330 new theme!
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-04-18 20:11:38 +02:00
Hadi 922a412cda tabs switching & shortcuts
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-04-18 01:25:06 +02:00
Hadi cedf87698c edit home src
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-04-18 01:13:04 +02:00
Hadi 52561cf335 qutebrowser configuration
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-04-18 01:12:46 +02:00
Hadi 9429c9f93b dead imports
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-04-18 01:03:57 +02:00
Hadi 5e0dd70cfa Edit secrets & hostname
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-04-18 00:53:51 +02:00
Hadi 9e24c44c53 A lot of QOL changement, remove Zen, config Qutebrowser, update a lot of things
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-04-18 00:44:22 +02:00
pph 241db5ce7a init qutebrowser
Signed-off-by: pph <pph@pph.pph>
2026-04-17 14:43:58 +02:00
pph 00faa213bf move shortcuts
Signed-off-by: pph <pph@pph.pph>
2026-04-17 13:40:29 +02:00
pph 0aac097e77 edit groups
Signed-off-by: pph <pph@pph.pph>
2026-04-17 13:40:23 +02:00
pph 5aaeba1512 new bookmark
Signed-off-by: pph <pph@pph.pph>
2026-04-16 14:54:37 +02:00
Chiloute 1bdf7a3af5 nvf tailwind new install method
Signed-off-by: Chiloute <35150997+Chiloute@users.noreply.github.com>
2026-04-15 19:33:59 +02:00
Hadi 4f3cf99b99 nevermind
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-04-12 20:24:15 +02:00
Hadi f7a2aa6256 change from number to username + env var
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-04-12 19:24:24 +02:00
Hadi ac3c0886b7 auto upgrades
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-04-12 19:02:46 +02:00
Hadi 17f976d4e7 edit keybinds
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-04-11 17:44:25 +02:00
Hadi daaf0d2b27 edit secrets
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-04-11 12:26:35 +02:00
Hadi 5f0d3bff5f remove pins and change some keybinds
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-04-11 12:22:53 +02:00
Hadi 36ad6aeb57 Change from brave to zen
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-04-11 11:59:04 +02:00
Hadi 2326857f65 hardening
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-04-11 11:27:39 +02:00
Hadi 28b7923e47 New way to deploy apps in my server
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-04-11 02:26:00 +02:00
Hadi 29bdd6468a remove discord
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-04-11 01:34:02 +02:00
Hadi 08db0a42c4 add claude-code to jack
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-04-10 22:57:18 +02:00
Hadi 66cc2a3958 add colors
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-04-10 22:57:09 +02:00
Hadi 80afef207a edit gitignore
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-04-10 22:23:05 +02:00
Hadi d18d67d86e update
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-04-07 22:48:29 +02:00
pph 2e10d6feff Merge branch 'main' of github.com:anotherhadi/nixy 2026-04-07 13:42:51 +02:00
pph dea17ebf3c remove update nws
Signed-off-by: pph <pph@pph.pph>
2026-04-07 13:42:40 +02:00
Hadi ae024e308d Merge branch 'main' of github.com:anotherhadi/nixy 2026-04-06 15:13:17 +02:00
Hadi 302f0ceec9 Add variables for domain & tunnel id
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-04-06 15:13:10 +02:00
github-actions 1cddeef739 Update README.md (auto) 2026-04-03 18:45:39 +00:00
Hadi d7b72277f7 change gitlab user
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-04-03 20:45:03 +02:00
Hadi 5d9ab362a3 update blog config
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-03-30 20:00:00 +02:00
Hadi a6b2f66ac8 init swappy config
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-03-30 18:30:34 +02:00
Hadi e2a60b15dc Merge branch 'main' of github.com:anotherhadi/nixy 2026-03-30 18:30:19 +02:00
Hadi d029d6f205 init gitea instance
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-03-30 18:30:14 +02:00
Hadi d9b4102bed rename
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-03-30 18:05:44 +02:00
Hadi a744d85f48 update secrets
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-03-30 18:05:22 +02:00
github-actions 5d50819d49 Update README.md (auto) 2026-03-30 15:11:28 +00:00
Hadi 087f71d2d5 update readme
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-03-30 17:10:18 +02:00
Hadi 3f36665767 new secret
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-03-28 19:31:18 +01:00
Hadi 6cb4d1eb96 Merge branch 'main' of github.com:anotherhadi/nixy 2026-03-28 18:59:06 +01:00
Hadi 983c83b981 change gitlab secret
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-03-28 18:59:02 +01:00
Hadi c482e6e075 update flake
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-03-25 21:57:24 +01:00
Hadi 0a01e8f3e8 update flake
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-03-25 21:40:18 +01:00
Hadi 641411ad51 edit bookmarks
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-03-25 21:40:13 +01:00
Hadi 86fd60fd3d update flake
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-03-25 20:53:09 +01:00
Hadi 9a41aff92d migration hadi.diy > hadi.icu
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-03-25 20:30:02 +01:00
Hadi e4a2a7abd0 edit tunnels
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-03-25 18:51:17 +01:00
Hadi b4d8e87abe change domain name
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-03-25 18:35:27 +01:00
Hadi 5de0ce50d6 edit secrets
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-03-25 18:34:43 +01:00
Hadi aba6dafffa Remove eleakxir for now #53
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-03-24 22:57:28 +01:00
Hadi 290471fcc2 Update default-creds
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-03-20 20:16:28 +01:00
pph ac90e05258 edit ghostty configuration
Signed-off-by: pph <pph@pph.pph>
2026-03-17 11:30:00 +01:00
Hadi 562f2507c0 update flake
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-03-16 23:49:16 +01:00
Hadi a393b97680 +umami
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-03-16 23:27:43 +01:00
Hadi 59901b0081 Enable clipboard even in ssh
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-03-16 22:40:13 +01:00
Hadi 6ecf475301 Update hyprland
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-03-16 21:17:40 +01:00
pph 75483ea97a update
Signed-off-by: pph <pph@pph.pph>
2026-03-16 14:25:11 +01:00
pph 4cd0eccde5 Merge branch 'main' of github.com:anotherhadi/nixy 2026-03-16 09:45:05 +01:00
pph d32c4a317f edit secrets
Signed-off-by: pph <pph@pph.pph>
2026-03-16 09:44:54 +01:00
Hadi 5ecc516a2f init default-creds
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-03-14 21:16:01 +01:00
Hadi de489d7d9c remove Neofetch: deprecated
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-03-14 21:13:56 +01:00
pph 19bfd1201b Edit keymaps & add dependencies
Signed-off-by: pph <pph@pph.pph>
2026-03-13 13:47:00 +01:00
pph 20f7bca099 add nix-index-database
Signed-off-by: pph <pph@pph.pph>
2026-03-13 13:13:16 +01:00
pph 72ed018351 fix type
Signed-off-by: pph <pph@pph.pph>
2026-03-12 09:35:33 +01:00
pph b904fd4fde suppress float event from brave
Signed-off-by: pph <pph@pph.pph>
2026-03-11 17:02:15 +01:00
pph b1cf5fb3a1 QOL vim option
Signed-off-by: pph <pph@pph.pph>
2026-03-11 17:02:02 +01:00
pph fee44db81c let nixy take arguments
Signed-off-by: pph <pph@pph.pph>
2026-03-10 12:59:16 +01:00
pph 214095c02a edit secret
Signed-off-by: pph <pph@pph.pph>
2026-03-09 13:41:38 +01:00
Hadi 29fc893847 more stable nvidia version & fan control
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-02-28 22:37:32 +01:00
Hadi 3689215480 add extension
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-02-28 22:26:24 +01:00
Hadi 14168a65ea add amazon to bookmarks
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-02-24 21:59:24 +01:00
Hadi 43ae447b34 clamav: init
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-02-24 21:58:41 +01:00
Hadi 07fa66f1b6 add firefox to cybersecurity
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-02-24 21:58:32 +01:00
Hadi 168423cf16 Update images path 2026-02-24 18:25:34 +01:00
pph bde39be205 Add proton to work
Signed-off-by: pph <pph@pph.pph>
2026-02-23 10:59:59 +01:00
Hadi 18137f444a add bookmarks
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-02-20 20:57:32 +01:00
Hadi e835f2466b revert hyprland: current bug with external monitor
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-02-20 20:54:27 +01:00
Hadi d2a9fff0d1 DRM DEVICES now in host files
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-02-20 20:53:36 +01:00
Hadi 081e05c702 update
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-02-20 20:04:17 +01:00
Hadi 4a4b997ef3 fix brave fullscreen
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-02-20 19:05:31 +01:00
pph 37abf49364 Merge branch 'main' of github.com:anotherhadi/nixy 2026-02-20 15:28:06 +01:00
pph 36f5ef3792 Add monitor
Signed-off-by: pph <pph@pph.pph>
2026-02-20 15:27:54 +01:00
Hadi 3d4099c97b Fix brave fullscreen
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-02-19 20:29:03 +01:00
Hadi 89413d06a8 add apps
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-02-18 21:44:57 +01:00
Hadi 76e3368f3e lock instead of logout
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-02-18 21:44:48 +01:00
Hadi 0f40fccb5e remove usefull keymaps
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-02-18 21:44:42 +01:00
Hadi cefebdbd0a quit without confirmation
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-02-18 21:44:36 +01:00
pph 05cfe684c2 add python lsp
Signed-off-by: pph <pph@pph.pph>
2026-02-18 15:00:11 +01:00
pph f11bd21e00 add apps
Signed-off-by: pph <pph@pph.pph>
2026-02-18 15:00:07 +01:00
pph 40477c6562 change theme
Signed-off-by: pph <pph@pph.pph>
2026-02-18 15:00:02 +01:00
Hadi d1fec1128d Merge branch 'main' of github.com:anotherhadi/nixy 2026-02-16 22:48:16 +01:00
Hadi 677a279eda add freshrss
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-02-16 22:48:13 +01:00
Hadi 1489261fa9 add a shortcut for the dashboard
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-02-15 21:21:21 +01:00
Hadi 29d19d5502 add brave & brave incognito to which-key
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-02-15 20:36:52 +01:00
Hadi 2f69c6e1d4 fix env variables
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-02-15 19:43:37 +01:00
Hadi 9ad71c5775 add binding to restart caelestia-shell
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-02-15 19:16:58 +01:00
Hadi b5c64e96c4 change theme
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-02-15 18:23:16 +01:00
Hadi af787952ad add bookmarks
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-02-15 18:23:11 +01:00
Hadi 4ebf579743 new bindings! which-key like
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-02-15 17:36:49 +01:00
Hadi 78aa49547d edit opacity
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-02-13 23:19:37 +01:00
pph d21fc81a19 Don't show on hover the dashbaord
Signed-off-by: pph <pph@pph.pph>
2026-02-10 09:38:12 +01:00
pph b0684b2e56 fix thunar config overwrite
Signed-off-by: pph <pph@pph.pph>
2026-02-10 09:37:52 +01:00
Hadi 49a9f3f169 new theme
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-02-07 21:49:14 +01:00
Hadi 8caa02139c fix caelestia scheme change
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-02-07 21:49:07 +01:00
Hadi 0c0a487488 add cache to glance
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-02-07 20:37:54 +01:00
Hadi 6f463fc7f9 add brave settings
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-02-07 20:33:18 +01:00
Hadi 3e82b1cd60 Add desktop entries for incognito & tor
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-02-07 19:53:44 +01:00
Hadi f9d171cef3 add QOL apps
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-02-07 19:52:40 +01:00
Hadi 89c61650bc +witr
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-02-07 19:16:04 +01:00
Hadi c94559d29f done
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-02-07 13:27:44 +01:00
Hadi e91047a3e1 Kitty -> Ghostty
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-02-07 13:27:14 +01:00
Hadi 1d75175be8 Change default for text & add title
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-02-07 13:22:00 +01:00
Hadi ea18558cb3 add code mime files
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-02-07 13:16:42 +01:00
Hadi 72c13294e6 update flake
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-02-07 13:02:37 +01:00
Hadi a771f685b2 remove notifications from audio input/output change
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-02-07 12:46:58 +01:00
Hadi 27ad0783bc change inactive border opacity
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-02-07 12:37:35 +01:00
Hadi d61e378405 remove blueman
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-02-07 12:31:29 +01:00
Hadi baa1ce858d add more icons lib
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-02-07 12:31:06 +01:00
Hadi f32ea27565 fix icons
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-02-07 12:22:37 +01:00
Hadi b657e5a891 New mono font
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-02-07 12:22:25 +01:00
pph 48f3f3170b change ssh config
Signed-off-by: pph <pph@pph.pph>
2026-02-05 22:01:22 +01:00
pph 87778bd3fa init new host
Signed-off-by: pph <pph@pph.pph>
2026-02-05 19:57:56 +01:00
Hadi 5736c8ccf2 jellyfin on gpu
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-02-01 18:22:18 +01:00
Hadi 31031447ce glance rewrite
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-02-01 18:22:08 +01:00
Hadi 4fb4058dca Merge branch 'main' of github.com:anotherhadi/nixy 2026-02-01 18:21:43 +01:00
Hadi 33b3ef66f2 update
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-01-30 16:49:58 +01:00
Hadi 52ee08e13b Firewall allow port 53: DNS requests
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-01-15 18:48:18 +01:00
Hadi 8c4b9340b6 add comments
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-01-13 20:30:49 +01:00
Hadi a1d57253f0 Merge branch 'main' of github.com:anotherhadi/nixy 2026-01-13 20:26:06 +01:00
Hadi 6e21914113 +mazanoke
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-01-13 20:25:57 +01:00
Hadi 7acddfafa1 Update flake
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-01-10 15:23:28 +01:00
Hadi 9fb4072893 add unrar & 7z to utils
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-01-07 22:33:12 +01:00
Hadi fd644671af Server update
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-01-06 17:24:21 +01:00
Hadi bfb7c2f4e0 -tailscale
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-01-06 16:53:35 +01:00
Hadi 22b5aa9797 change ssh config
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-01-06 16:53:30 +01:00
Hadi 4ac3945174 Vivaldi->Brave
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-01-06 16:53:23 +01:00
Hadi d3cdc25481 Merge branch 'main' of github.com:anotherhadi/nixy 2026-01-04 00:40:14 +01:00
Hadi 6a0b3418a7 update
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-01-04 00:40:10 +01:00
Hadi f2c2540cd4 Merge branch 'main' of github.com:anotherhadi/nixy 2026-01-04 00:28:28 +01:00
Hadi 223f785c3a auto start vpn
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-01-04 00:28:20 +01:00
Hadi 81ab17fed7 go back to brave
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-01-04 00:28:13 +01:00
Hadi 8f16767240 add cloudflared
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-01-04 00:11:37 +01:00
github-actions e32cf43d87 Update README.md (auto) 2026-01-01 16:15:25 +00:00
Hadi 8e6270ca34 v4.0.0
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-01-01 17:15:04 +01:00
github-actions 1b0eb2f7bf Update KEYBINDINGS-HYPRLAND.md (auto) 2025-12-09 16:44:29 +00:00
Hadi 7861a22df0 wofi -> vicinae
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-12-09 17:44:18 +01:00
Hadi 53ab3a608c update flake
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-12-09 17:44:11 +01:00
Hadi e6873e8caa update
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-12-03 12:27:33 +01:00
Hadi 9b7a311fc3 add nuclei
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-11-10 22:15:59 +01:00
Hadi bb7819114b gogo ghostty
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-11-06 16:55:00 +01:00
Hadi 1acb888684 add caido & wireshark
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-11-04 16:15:06 +01:00
Hadi c09899e365 remove nextcloud
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-11-04 16:15:01 +01:00
Hadi d7fea0c4aa remove bitwarden
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-11-04 16:14:44 +01:00
Hadi c8dd5f2bbf add readarr
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-11-04 16:14:40 +01:00
Hadi 71b559e0f6 edit apps
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-11-03 15:50:33 +01:00
Hadi a901005929 change kitty config & switch from alacritty to kitty
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-11-03 15:49:02 +01:00
Hadi 31fb93ff68 change theme
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-11-03 15:48:42 +01:00
Hadi 84018b229c change theme
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-11-03 15:48:30 +01:00
Hadi 27d8dfb87f update flake
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-11-03 15:48:26 +01:00
Hadi 61c56e1b1d update git config
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-10-25 22:03:13 +02:00
Hadi 2ad7a99077 update flakes
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-10-25 21:53:07 +02:00
Hadi 8088a45891 kitty -> alacritty
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-10-16 21:18:02 +02:00
Hadi 5b8240c176 add utils
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-10-16 21:16:33 +02:00
Hadi 44964ce7cc init alacritty
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-10-16 21:16:28 +02:00
github-actions 25c331b2f1 Update KEYBINDINGS-HYPRLAND.md (auto) 2025-10-13 10:06:09 +00:00
Hadi d58e10e95d update
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-10-13 12:05:57 +02:00
Hadi e79e8d0d3b get back wofi for now
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-10-13 12:05:49 +02:00
Hadi 45aa87f9f8 update eleakxir
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-10-02 17:28:06 +02:00
Hadi 9dee9b0d6a new secret
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-09-29 14:09:34 +02:00
Hadi 2fac831333 update
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-09-25 19:53:45 +02:00
Hadi a2cfea4c3e remove git ignore on eza
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-09-25 19:49:26 +02:00
Hadi 6095fb13cc update
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-09-24 19:12:48 +02:00
Hadi 738631870d change eleakxir configuration
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-09-24 19:12:35 +02:00
Hadi 66169bb57e QOL Nvf
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-09-24 19:08:29 +02:00
Hadi 984c99f45e remove Nextcloud shortcut
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-09-23 19:24:41 +02:00
Hadi 47ec5d10e9 change wallpaper
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-09-23 19:24:35 +02:00
Hadi 43e45e5cce change notes dir
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-09-23 19:24:14 +02:00
Hadi 76a97d964f eleakxir: init
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-09-16 13:38:40 +02:00
Hadi 198e88682c update secrets
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-09-16 13:38:28 +02:00
Hadi 6e57ee66c2 Merge branch 'main' of github.com:anotherhadi/nixy 2025-09-13 23:08:25 +02:00
Hadi 1ace7442a1 add nixpkgs-stable
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-09-13 23:08:10 +02:00
github-actions cce4cbee10 Update KEYBINDINGS-HYPRLAND.md (auto) 2025-09-13 08:34:50 +00:00
Hadi 3c7702789c add back the bindings
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-09-13 10:34:29 +02:00
Hadi 65213eb7cf temp fix
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-09-12 15:49:10 +02:00
Hadi 56d7a4cd23 update flakes
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-09-12 15:48:59 +02:00
Hadi 8bd2c8752e working state
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-09-12 15:27:41 +02:00
Hadi cd95d86540 remove unused
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-09-12 14:49:27 +02:00
github-actions fa37b8c89f Update SCRIPTS.md (auto) 2025-09-12 12:44:19 +00:00
Hadi 32a079507c remove unused
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-09-12 14:44:09 +02:00
github-actions 0cb07052bd Update KEYBINDINGS-HYPRLAND.md (auto) 2025-09-12 12:36:27 +00:00
Hadi 0455d520d1 Merge branch 'main' of github.com:anotherhadi/nixy 2025-09-12 14:36:02 +02:00
Hadi 1bca9316b4 old unused wofi bindings
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-09-12 14:35:51 +02:00
github-actions 60c25395eb Update KEYBINDINGS-HYPRLAND.md (auto) 2025-09-12 12:35:04 +00:00
Hadi 3807536cf2 change bindings
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-09-12 14:34:51 +02:00
Hadi fada191840 update & remove old files
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-09-12 14:33:02 +02:00
Hadi b756f0fcd5 add todolist
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-09-11 17:25:55 +02:00
Hadi f88825b93c edit max volume
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-09-11 17:25:50 +02:00
Hadi ae115a50f2 change to brave browser
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-09-11 17:25:41 +02:00
Hadi 3d6a3f62ec let's try with ripgrep
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-08-29 00:21:37 +02:00
Hadi b0c93e7e00 change styling & font
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-08-29 00:13:13 +02:00
Hadi 96dc0bcb4c remove old calendar
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-08-29 00:03:23 +02:00
Hadi c853611916 remove the number of notifications
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-08-28 23:52:43 +02:00
Hadi 49f4828046 edit waybar & swaync config
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-08-28 23:50:40 +02:00
Hadi 29dbc0af97 add vpn module
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-08-28 23:29:39 +02:00
github-actions bc064cf1c5 Update KEYBINDINGS-HYPRLAND.md (auto) 2025-08-28 21:11:45 +00:00
Hadi 4f9ea610d6 change for waybar
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-08-28 23:11:34 +02:00
github-actions 9d04654018 Update SCRIPTS.md (auto) 2025-08-28 18:59:37 +00:00
Hadi 8508faf26e add powermode-toggle
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-08-28 20:59:26 +02:00
Hadi 71437939ab Not using duckduckgo anymore
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-08-25 19:55:57 +02:00
Hadi e851e8c2c3 remove walker
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-08-25 19:52:54 +02:00
Hadi f3e4069e8c remove walker
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-08-25 19:52:05 +02:00
Hadi 3bce0bce82 add bindings for proton's app
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-08-25 19:41:21 +02:00
Hadi 38a61285b3 change shortcuts
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-08-25 19:34:31 +02:00
Hadi 2a77cbf773 add apps and remove nextcloud
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-08-25 19:32:24 +02:00
Hadi 87b4be1860 remove exec once of tailscale
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-08-25 19:32:13 +02:00
github-actions e55385b3f0 Update SCRIPTS.md (auto) 2025-08-25 17:31:18 +00:00
Hadi 8d25b1b088 Merge pull request #45 from Dylouwu/feat/qol 2025-08-25 19:31:10 +02:00
Purin 97ff9eb09e removed useless options in wofi
Same as last commit, you probably did it on purpose to allow easier
modification later on.

Signed-off-by: Purin <118902463+Dylouwu@users.noreply.github.com>
2025-08-25 16:01:11 +02:00
Purin f9c4bd1f99 removed caffeine in tofi as Hypridle is not used anymore
This is another change that can be ignored as hypridle can be commented
out and used again in nixy (even though it's quite clunky)

Signed-off-by: Purin <118902463+Dylouwu@users.noreply.github.com>
2025-08-25 15:57:16 +02:00
Purin bd2c7dfc25 Fix not needed anymore and allows rounding on all apps
Signed-off-by: Purin <118902463+Dylouwu@users.noreply.github.com>
2025-08-25 15:55:22 +02:00
Purin f110213bb0 removed useless packages for screenshot
Signed-off-by: Purin <118902463+Dylouwu@users.noreply.github.com>
2025-08-25 15:53:27 +02:00
Purin 8fdab8a9cc Hyprlock tweak, removed useless options and added QoL tweaks
This can be seen as a subjective change and you can ignore it if it does
not fit into your idea of nixy.

Signed-off-by: Purin <118902463+Dylouwu@users.noreply.github.com>
2025-08-25 15:43:08 +02:00
Purin 1e68496efe added overrideGpg to lazygit
This allows to remove the flickering/prompting from lazygit when
committing a signed commit.

Signed-off-by: Purin <118902463+Dylouwu@users.noreply.github.com>
2025-08-25 15:33:03 +02:00
Purin 172205b613 added new options when right-clicking in Thunar
Open Terminal Here and Extract here options

Signed-off-by: Purin <118902463+Dylouwu@users.noreply.github.com>
2025-08-25 15:29:32 +02:00
Purin a07b0a38ac garbage collect cleans more stuff
You might want to remove the logging

Signed-off-by: Purin <118902463+Dylouwu@users.noreply.github.com>
2025-08-25 15:24:00 +02:00
Purin f70a139bd7 changed nixy from having an upgrade to a test option
This allows you to test the configuration without building it, where as
upgrade is useless with flakes (and can be confusing with update)

Signed-off-by: Purin <118902463+Dylouwu@users.noreply.github.com>
2025-08-25 15:12:35 +02:00
Purin b98af7060b removed allowUnfree redundancy
Signed-off-by: Purin <118902463+Dylouwu@users.noreply.github.com>
2025-08-25 15:02:47 +02:00
Hadi 31bb45950d update flake
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-08-23 17:18:43 +02:00
Hadi cd55babaa2 add vert.sh to the bookmarks
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-08-23 17:09:33 +02:00
Hadi d9b4ef2766 update flakes
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-08-09 20:03:43 +02:00
Hadi e8a5db5dc2 Merge pull request #42 from romek-codes/systemd-extra-config-rfc-42 2025-08-09 19:38:53 +02:00
Hadi b69baaf428 Merge branch 'main' of github.com:anotherhadi/nixy 2025-08-09 19:37:01 +02:00
Hadi 550248aa4e edit n4c alias
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-08-09 19:36:58 +02:00
Hadi 229e7bf30e Merge pull request #43 from romek-codes/fix-hyprpanel-layouts 2025-08-09 19:36:16 +02:00
romek e1f03b2909 fix hyprpanel bar layout config 2025-08-08 23:34:38 +02:00
Romek 696bbcdcdf Update systemd extraConfig to rfc 42 2025-08-08 21:49:30 +02:00
Hadi d61b5989c0 change the alias
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-07-29 15:20:01 +02:00
Hadi dd73b1c3e5 change wallpaper
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-07-29 14:19:48 +02:00
Hadi ecde37dbe6 remove grave
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-07-29 14:19:44 +02:00
Hadi 279a89e424 Merge branch 'main' of github.com:anotherhadi/nixy 2025-07-29 14:19:32 +02:00
Hadi be47d4801a update eleakxir
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-07-29 14:18:38 +02:00
Hadi 6a641139bd remove rmtrash
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-07-29 14:15:57 +02:00
Hadi d211c4408b change leaks path
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-07-28 14:40:37 +02:00
Hadi 5a6c1e7663 mounting /mnt/data
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-07-28 14:40:33 +02:00
Hadi 91944a9b8d add duckdb
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-07-28 14:36:38 +02:00
Hadi 4932c2dd5e add eleakxir
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-07-28 00:24:19 +02:00
Hadi c66fcbd709 testing eleakxir prod
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-07-27 23:00:16 +02:00
Hadi 9f01990924 update flake
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-07-24 18:00:14 +02:00
Hadi 4b3c6bcb04 add utils and cache
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-07-24 17:59:57 +02:00
Hadi c077387e5f init walker
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-07-24 17:59:48 +02:00
Hadi 877171faa7 disable hypridle
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-07-24 17:59:35 +02:00
Hadi f9ecc03f9d put back the custom dirs
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-07-24 17:56:36 +02:00
Hadi a419fb2214 Merge pull request #39 from MehdiBoustani/patch-1 2025-07-21 21:17:20 +02:00
Mehdi Boustani 838187c0ad feat (hyprpanel): generic directories configuration 2025-07-21 20:40:35 +02:00
Hadi d7dc6ff8ab disable recyclarr for now
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-07-16 20:53:15 +02:00
Hadi 66ed46603b remove hyprpanel overlay
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-07-16 20:32:27 +02:00
Hadi 4323eb53b7 todo
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-07-16 20:32:21 +02:00
Hadi 7c36c6ce14 increase download buffer size
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-07-16 20:32:16 +02:00
Hadi c9ec302d19 add adguard pwd secret to glance
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-07-16 20:23:47 +02:00
github-actions 69bba83536 Update KEYBINDINGS-HYPRLAND.md (auto) 2025-07-16 18:14:55 +00:00
Hadi 59ae3d5f9d update laptop configuration
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-07-16 20:14:43 +02:00
Hadi 72e4be86eb update/format configuration for jack
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-07-16 19:51:05 +02:00
Hadi 18c8afb616 update
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-07-16 19:25:32 +02:00
Hadi f74e15288b change secrets
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-07-11 10:47:09 +02:00
Hadi 21b993d1cc edit ssh config
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-07-07 10:31:53 +02:00
Hadi 9ee631dd7a Merge branch 'main' of github.com:anotherhadi/nixy 2025-07-07 10:31:34 +02:00
Hadi ba3536c4dd fix typescript error with svelte
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-07-07 10:13:45 +02:00
github-actions 6e14ad1357 Update README.md (auto) 2025-07-04 16:52:13 +00:00
Hadi ee84daa4b4 Fix github callout 2025-07-04 18:51:58 +02:00
github-actions 806697e20d Update README.md (auto) 2025-07-04 16:49:29 +00:00
Hadi db9286108d Fix github callouts 2025-07-04 18:49:06 +02:00
Hadi 709c6c3680 change theme
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2025-07-04 15:44:06 +02:00
Hadi 4a40717982 zen global config init
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>

Former-commit-id: 13d6150a4592ca4cd5e3f4950c838ae57523727c
2025-07-01 17:48:52 +02:00
Hadi 51f20ec168 fix hyprpanel config
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>

Former-commit-id: 8639b495d233014065227a3e6ea0ed564af4c592
2025-07-01 17:48:29 +02:00
Hadi fc3d977050 update flake & fix hyprpanel
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>

Former-commit-id: eebaa0ffc17af2e314bba4c7161a9b76ffd03cd8
2025-07-01 17:36:22 +02:00
github-actions 38665036fc Update README.md (auto)
Former-commit-id: 852502635cfccdd5c4b9f5c833a2c45984d5417c
2025-06-25 23:08:30 +00:00
Hadi d5cc53f975 new catppuccin theme
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>

Former-commit-id: 677a048f271be5beceb8fe10634cad0365efa0cf
2025-06-26 01:08:11 +02:00
Hadi 1c539f857d format & add server-modules
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>

Former-commit-id: ea0d931b6464252a90f71953bf774d574b15a2d0
2025-06-26 00:13:57 +02:00
Hadi b241a2f367 update flake
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>

Former-commit-id: 50cb11ecbc469b79ae9f43f473debf44dd1ecb85
2025-06-24 10:00:43 +02:00
Hadi d9d4cf53f8 change render-markdown to markview
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>

Former-commit-id: 8d21295f5cf94a17a7b4cb7cc67f9cf7cf38a223
2025-06-23 11:38:21 +02:00
Hadi 6649f93754 add plymouth
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>

Former-commit-id: 5e67a0bcd2c02d201cf8d074b5fc29aca2e41d0e
2025-06-21 14:28:12 +02:00
Hadi 74d2b12889 edit nvf config
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>

Former-commit-id: 74aee44e9e6fc9310cd989049989c529b74b1da8
2025-06-21 14:27:59 +02:00
Hadi c594900d45 edit nvf config
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>

Former-commit-id: 2899b84d8f0809ba14540adce1ebebb3eb225065
2025-06-19 16:06:29 +02:00
Hadi f306041af9 edit nvf config
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>

Former-commit-id: 20350cacd5f393f214438f5b19753af53b56f305
2025-06-19 15:29:24 +02:00
Hadi 5d7c159e34 update nixarr conf
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>

Former-commit-id: 012e81f99509ff0756c85581292fc641c0528761
2025-06-19 15:10:03 +02:00
Hadi f4e951169a update secrets
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>

Former-commit-id: 09934db50d6cae2062d79577792fe980e8e2f3ff
2025-06-19 15:09:56 +02:00
Hadi 8d75aa0b2d update server
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>

Former-commit-id: 4a0a78fcd868e0be2a195f3bebdc82087ffd8e1e
2025-06-17 15:54:12 +02:00
Hadi 88d712360a change lazygit shortcut
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>

Former-commit-id: a106c7d6be97b9e0459db1c7681a7cb34285c8ee
2025-06-17 11:30:40 +02:00
Hadi a1691ae886 from nixvim to nvf
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>

Former-commit-id: d966eafd50f111f94ffe368ce685bfeb5e32c2f6
2025-06-17 11:28:12 +02:00
Hadi 37f63e248a update flake
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>

Former-commit-id: ddb95461f8394dbae6559872816e879dfe46ae53
2025-06-17 11:27:47 +02:00
Hadi 1a0e9429f7 from nixvim to nvf
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>

Former-commit-id: 0d6390b18f38bdba346a1f92799884d209159b33
2025-06-17 11:27:22 +02:00
Hadi f2e7751d7f from tmux to kitty
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>

Former-commit-id: 049f6885e51fa8227f6cd7da2a4954387eb6f0d8
2025-06-17 11:27:06 +02:00
Hadi 9857d75263 add shortcut to create a new tab in kitty
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>

Former-commit-id: 57c170c9aad1db000706d3dfea9e60be8fc67c57
2025-06-05 15:29:21 +02:00
Hadi 2af2fdd7a1 update flake
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>

Former-commit-id: 7525f892db2971f189ab93a4e5ad6b586269688f
2025-06-05 15:29:09 +02:00
Hadi 5eeba41413 add kitty shortcuts
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>

Former-commit-id: c2b90d76340429a0d6ffbaf070b28a30d2f6a2a2
2025-06-05 14:05:51 +02:00
Hadi 794650d294 remove this
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>

Former-commit-id: 41f98c18a1d177ee310acc3f3cb68d6897760aa8
2025-06-05 14:04:13 +02:00
Hadi 7013531715 move LD_LIBRARY_PATH
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>

Former-commit-id: 5a35789f8cc7009e3310d49b27381b84aca0a475
2025-06-05 13:46:20 +02:00
Hadi d35af50097 Merge pull request #32 from Brisingr05/remove-legacy-system-alias
Former-commit-id: b4eb50568dfc5819daf849513cd52e30e501e7bf
2025-06-02 09:48:08 +02:00
Brisingr05 1c587f2ff3 Remove mentions of system in flake.nix
It's a legacy alias of `nixpkgs.hostPlatform`, which is already set in each host's `hardware-configuration.nix` files.

Source: https://github.com/NixOS/nixpkgs/blob/837ff226bbd44c29303611703a4085d48f0957c9/flake.nix#L61
Former-commit-id: fb5595cb37
2025-05-31 11:00:48 +05:30
Hadi 2d344e086e update flakes
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>

Former-commit-id: 23fe9da36b
2025-05-28 14:33:47 +02:00
Hadi c5c6c46af8 full collect garbage
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>

Former-commit-id: d60e4530f5
2025-05-28 14:33:35 +02:00
Hadi 0afd3fc6cf change chatgpt func
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>

Former-commit-id: b7598a36ee
2025-05-28 10:24:07 +02:00
Hadi 7f094e0a4f update
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>

Former-commit-id: 612a978e29
2025-05-28 10:23:48 +02:00
Hadi 3506f691eb Merge branch 'main' of github.com:anotherhadi/nixy
Former-commit-id: 6cb71d92ac
2025-05-26 11:16:01 +02:00
Hadi 1f36d4eb75 add trash instead of rm & improve mkdir
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>

Former-commit-id: 736fa52b0f
2025-05-26 11:15:42 +02:00
github-actions a7d433c2fd Update KEYBINDINGS-HYPRLAND.md (auto)
Former-commit-id: d87830d57e
2025-05-23 13:21:30 +00:00
Hadi 3ccb167d6d update
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>

Former-commit-id: a0c510f906
2025-05-23 15:21:15 +02:00
Hadi 680ee14463 format
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>

Former-commit-id: 3f1eb01070
2025-05-23 15:11:34 +02:00
Hadi 8c4162b885 don't blink when charging
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>

Former-commit-id: 494de74831
2025-05-20 22:02:50 +02:00
Hadi 15f4554703 update flake
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>

Former-commit-id: 4eba6b9767
2025-05-16 14:01:34 +02:00
Hadi 56792d70ec Use the hyprpanel module (ty gemini)
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>

Former-commit-id: a6df02573c
2025-05-13 11:24:25 +02:00
Hadi e82fa4e8c8 fix transmission
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>

Former-commit-id: 29fc2d6a1b
2025-05-12 14:21:17 +02:00
Hadi b7636142cd Merge branch 'main' of github.com:anotherhadi/nixy
Former-commit-id: a6eb2f375e
2025-05-12 13:27:39 +02:00
Hadi 43ae984817 edit secret
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>

Former-commit-id: b6d1175e71
2025-05-12 13:27:36 +02:00
Hadi e3090bee73 Merge branch 'main' of github.com:anotherhadi/nixy
Former-commit-id: a278d7b787
2025-05-12 11:15:05 +02:00
Hadi 587bbf860e edit server config
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>

Former-commit-id: e1c7055db2
2025-05-12 11:13:41 +02:00
Hadi 17e31c6bbc remove sabnzbd
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>

Former-commit-id: aa72726934
2025-05-12 10:53:37 +02:00
Hadi 3693fad125 update secrets
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>

Former-commit-id: 9bef5046b4
2025-05-12 09:52:10 +02:00
Hadi f275bee6c8 new wallpaper
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>

Former-commit-id: e9f7e9a3d0
2025-05-11 18:51:44 +02:00
Hadi 18d5042a21 add config for xarchiver
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>

Former-commit-id: ac3a48dc05
2025-05-11 00:33:41 +02:00
Hadi dd83ee0e5e change floaterm command
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>

Former-commit-id: ab6fc98de6
2025-05-11 00:33:24 +02:00
Hadi 0f944e4c05 add bookmarks
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>

Former-commit-id: e9de49e3c7
2025-05-10 20:23:38 +02:00
Hadi 98598ee3ce add #changeme
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>

Former-commit-id: 8dabda6194
2025-05-07 16:10:04 +02:00
Hadi 830c1059a9 update flakes
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>

Former-commit-id: 70355c96ac
2025-05-07 15:42:38 +02:00
Hadi 53e8a42484 update lazygit config
Former-commit-id: 4bc6576d7c
2025-05-07 15:39:50 +02:00
Hadi ea7eaa106a edit nix shell prompt
Former-commit-id: 53ff7a2a94
2025-05-07 15:25:07 +02:00
Hadi 936266ab11 add astro lsp
Former-commit-id: 75f499a996
2025-05-07 15:24:48 +02:00
Hadi 26b08ec009 add signing key to sops
Former-commit-id: 1a771e97ac
2025-05-06 11:27:32 +02:00
Hadi 96673a4e69 add signing
Former-commit-id: 6a4634bb04
2025-05-06 11:20:40 +02:00
Hadi 81b3128ef6 Upgrade flakes
Former-commit-id: 685f104a67
2025-05-05 10:06:59 +02:00
Hadi 55349958d3 Merge branch 'main' of github.com:anotherhadi/nixy
Former-commit-id: 770569c1d9
2025-05-04 16:00:10 +02:00
Hadi a6524d8d83 same-tab
Former-commit-id: 38b9bcec07
2025-05-04 16:00:08 +02:00
Hadi 682f24b1be remove apps tmp
Former-commit-id: 5a3f4dcd49
2025-05-04 15:57:28 +02:00
Hadi 4fb4ab9ae2 test colors
Former-commit-id: 6f9ca7e044
2025-05-04 15:53:03 +02:00
Hadi 64c833dfaf update bookmarks
Former-commit-id: 5f7c914d1e
2025-05-04 15:46:51 +02:00
Hadi fe1d58998c glance config update
Former-commit-id: 72690d7d0c
2025-05-04 15:38:42 +02:00
Hadi 557844d07a Merge branch 'main' of github.com:anotherhadi/nixy
Former-commit-id: 6353514e49
2025-05-04 15:34:48 +02:00
Hadi aac1ced91e add bookmarks glance
Former-commit-id: 7939150e37
2025-05-04 15:34:28 +02:00
Hadi 45cd05c304 update flakes
Former-commit-id: 1d286f7c47
2025-05-04 15:34:21 +02:00
Hadi 4da1706085 update flakes
Former-commit-id: 66b78355f8
2025-05-02 16:54:57 +02:00
Hadi b06ec10646 update wallpaper
Former-commit-id: a4e107eafc
2025-05-02 16:05:15 +02:00
Hadi 8ea5a5e6ae add xarchiver
Former-commit-id: 0d235c33f4
2025-04-30 12:58:10 +02:00
Hadi 40d80808c3 remove auto-kill wofi
Former-commit-id: 42464199cc
2025-04-29 23:03:05 +02:00
Hadi 66cce04e98 update theme
Former-commit-id: afde9edaea
2025-04-26 18:27:34 +02:00
Hadi 580c7302aa update flake
Former-commit-id: 8260e6f7fd
2025-04-26 18:27:20 +02:00
Hadi f36bef6bde edit keyboard-backlight
Former-commit-id: 62ceddf5f8
2025-04-26 18:27:08 +02:00
Hadi 0bfb226119 remove slow cache
Former-commit-id: e0fbb91516
2025-04-24 19:57:31 +02:00
Hadi 6fd6982d0f fix omen perms
Former-commit-id: b7bfd6eed8
2025-04-24 11:27:54 +02:00
Hadi d1eb1353f5 tmp buffer & fix notes
Former-commit-id: 6391904287
2025-04-24 10:17:55 +02:00
Hadi 7dce2b592f Merge branch 'main' of github.com:anotherhadi/nixy
Former-commit-id: a91dc2dc22
2025-04-22 13:53:09 +02:00
Hadi bbec068d1d hardening nginx conf
Former-commit-id: 94b9738638
2025-04-22 13:48:02 +02:00
Hadi 30c4099b64 set keyboard backlight on boot
Former-commit-id: f01ec00483
2025-04-22 10:08:59 +02:00
Hadi 8eec546631 init headscale-ui
Former-commit-id: aaf3532cde
2025-04-22 10:05:58 +02:00
Hadi 21f9ed2d54 init headscale
Former-commit-id: 05891cdd1d
2025-04-22 09:51:46 +02:00
194 changed files with 10123 additions and 5534 deletions
+43 -26
View File
@@ -1,5 +1,5 @@
<div align="center">
<img src="https://raw.githubusercontent.com/anotherhadi/nixy/main/.github/assets/logo.png" width="120px" />
<img alt="nixy logo" src="./.github/assets/logo.png" width="120px" />
</div>
<br>
@@ -23,25 +23,26 @@
</div>
<br>
**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.
**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-centric: Preconfigured Hyprland ecosystem (Hyprlock, Hyprpanel, etc.)
- 💻 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.)
- ⌨️ Vim-like Everywhere: Unified keybindings (Hyprland, nvim, vimium, etc.)
## Table of Content
{md_table_of_content}
## Gallery
## Screenshots
![Nixy helper, peaclock](.github/assets/nixy/1.png)
![Qutebrowser, pipes, shell](.github/assets/nixy/2.png)
![nvim, lazygit](.github/assets/nixy/3.png)
![spotify, cava](.github/assets/nixy/4.png)
![Home](.github/assets/rose-pine/home.png)
![Flake & Spotify](.github/assets/rose-pine/flake-spotify.png)
![Browser and notification center](.github/assets/rose-pine/browser-and-notifications.png)
## Architecture
@@ -52,50 +53,59 @@ Contains **dotfiles and settings** that apply to your user environment.
**Subfolders:**
- `programs` is a collection of apps configured with home-manager
- `scripts` is a folder full of bash scripts (see [SCRIPTS.md](docs/SCRIPTS.md))
- `system` is some "desktop environment" configuration
### 🐧 /nixos
Those are the system-level configurations. (audio, bluetooth, gpu, bootloader, ...)
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)
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:
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:
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 systems hostname, and update `variables.nix` with your machines settings.
3. Copy your `hardware-configuration.nix` into your new host's folder to ensure proper hardware support.
2. Copy the `hosts/laptop` folder, rename it to match your systems hostname,
and update `variables.nix` with your machines 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:
> [!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
> When you add new files, don't forget to run `git add .` to add them to the git
> repository
5. Build the system
@@ -107,9 +117,16 @@ sudo nixos-rebuild switch --flake ~/.config/nixos#yourhostname
- [SERVER](docs/SERVER.md): Check out the server documentation
- [THEMES](docs/THEMES.md): How themes work and how to create your own
- [SCRIPTS](docs/SCRIPTS.md): A list of available scripts and their usage
- [KEYBINDINGS-HYPRLAND](docs/KEYBINDINGS-HYPRLAND.md): Keybindings available in Hyprland
- [WALLPAPERS](https://github.com/anotherhadi/awesome-wallpapers): An awesome collection of wallpapers
- [WALLPAPERS](https://github.com/anotherhadi/awesome-wallpapers): An awesome
collection of wallpapers
- [CONTRIBUTING](docs/CONTRIBUTING.md): How to contribute
- [LICENSE](LICENSE): MIT License
---
<div align="center">
<a href="https://github.com/anotherhadi/nixy">github</a> |
<a href="https://gitlab.com/anotherhadi_mirror/nixy">gitlab (mirror)</a> |
<a href="https://git.hadi.icu/anotherhadi/nixy">gitea (mirror)</a>
</div
Binary file not shown.

After

Width:  |  Height:  |  Size: 412 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.9 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 643 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 301 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 404 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1001 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 837 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 738 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

+1 -1
View File
@@ -10,7 +10,7 @@ table_of_content=$(markdown-table-of-contents --start-by 2 ./.github/assets/READ
readme_content=$(cat "./.github/assets/README_template.md")
# Replace variables
readme_content=${readme_content//\{primarycolor\}/A594FD}
readme_content=${readme_content//\{primarycolor\}/A89AD1}
readme_content=${readme_content//\{backgroundcolor\}/0b0b0b}
readme_content=${readme_content//\{md_table_of_content\}/$table_of_content}
-26
View File
@@ -1,26 +0,0 @@
#!/usr/bin/env bash
[[ -d "./docs" ]] || (echo "Folder ./docs not found" && exit 1)
DOCS_FILE="./docs/SCRIPTS.md"
SCRIPTS_FOLDER="./home/scripts"
# search for every directory in the scripts folder:
# The docs for each scripts are in the beginning of the file prefixed by "#-" or "# -" for the title
# Inside the folders, the scripts are stored in default.nix files
echo "[//]: # (This file is autogenerated)" >"$DOCS_FILE"
echo "# Scripts" >>"$DOCS_FILE"
echo "" >>"$DOCS_FILE"
echo "Scripts are located in the 'home/scripts' folder. Home-manager add those in the user's path." >>"$DOCS_FILE"
echo "" >>"$DOCS_FILE"
for folder in "$SCRIPTS_FOLDER"/*; do
script="$folder/default.nix"
[[ -f "$script" ]] || continue
content=$(cat "$script")
content=$(echo "$content" | grep -E "^#-|^# -" | sed 's/^#- //;s/^# - //;s/#-//')
echo "$content" >>"$DOCS_FILE"
echo "" >>"$DOCS_FILE"
done
@@ -1,60 +0,0 @@
#!/usr/bin/env bash
# A script to parse the Hyprland configuration to store keybindings in a table
[[ -d "./docs" ]] || (echo "Folder ./docs not found" && exit 1)
KEYBINDINGS_FILE="./docs/KEYBINDINGS-HYPRLAND.md"
function getList() {
content=$1
name=$2
list_start=$(echo "$content" | sed "/$name = \[/!d;=;Q")
list=$(echo "$content" | tail +"$list_start")
list_end=$(echo "$list" | sed '/\]/!d;=;Q')
list=$(echo "$list" | head -n"$list_end")
echo "$list"
}
[[ -f "./home/system/hyprland/bindings.nix" ]] || (echo "File ./home/system/hyprland/bindings.nix not found" && exit 1)
config=$(cat "./home/system/hyprland/bindings.nix")
# Bind
bind=$(getList "$config" "bind")
# Bindm (mouse)
bindm=$(getList "$config" "bindm")
# Bindl (lock)
bindl=$(getList "$config" "bindl")
# Bindle (lock, repetition)
bindle=$(getList "$config" "bindle")
# Join the lists:
keybindings=$(echo -e "$bind\n$bindm\n$bindl\n$bindle" | grep '"')
echo "[//]: # (This file is autogenerated)" >"$KEYBINDINGS_FILE"
echo "# Keybindings for Hyprland" >>"$KEYBINDINGS_FILE"
echo "" >>"$KEYBINDINGS_FILE"
echo "> [!NOTE]" >>"$KEYBINDINGS_FILE"
echo "> SUPER is the windows key by default" >>"$KEYBINDINGS_FILE"
echo "" >>"$KEYBINDINGS_FILE"
echo "| Description | Keybinding |" >>"$KEYBINDINGS_FILE"
echo "| -- | -- |" >>"$KEYBINDINGS_FILE"
echo "| Switch Workspace | SUPER + {Number} |" >>"$KEYBINDINGS_FILE"
echo "| Move app to Workspace | SHIFT + SUPER + {Number} |" >>"$KEYBINDINGS_FILE"
echo "$keybindings" | while read -r line; do
comment=$(echo "$line" | cut -d\# -f2)
line=$(echo "$line" | cut -d\# -f1)
line=${line:1:${#line}-3}
mod=$(echo "$line" | cut -d, -f1)
key=$(echo "$line" | cut -d, -f2)
# dispatcher=$(echo "$line" | cut -d, -f3)
# params=$(echo "$line" | cut -d, -f4)
[[ $mod == '$mod' ]] && mod="SUPER + "
[[ $mod == '$shiftMod' ]] && mod="SHIFT + SUPER + "
echo "| ${comment:1} | $mod$key |" >>"$KEYBINDINGS_FILE"
done
@@ -1,24 +0,0 @@
on:
push:
paths:
- 'home/system/hyprland/bindings.nix'
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: Run a script
run: |
chmod +x ./.github/scripts/keybindings_to_markdown.sh
./.github/scripts/keybindings_to_markdown.sh
git config user.name github-actions
git config user.email github-actions@github.com
git add .
git commit -m "Update KEYBINDINGS-HYPRLAND.md (auto)" && git push
exit 0
-24
View File
@@ -1,24 +0,0 @@
on:
push:
paths:
- 'home/scripts/**'
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: Run a script
run: |
chmod +x ./.github/scripts/create_scripts_docs.sh
./.github/scripts/create_scripts_docs.sh
git config user.name github-actions
git config user.email github-actions@github.com
git add .
git commit -m "Update SCRIPTS.md (auto)" && git push
exit 0
+2
View File
@@ -1 +1,3 @@
.sops.yaml
.claude/
old/
+49 -31
View File
@@ -1,6 +1,6 @@
[//]: # (This file is autogenerated)
<div align="center">
<img src="https://raw.githubusercontent.com/anotherhadi/nixy/main/.github/assets/logo.png" width="120px" />
<img alt="nixy logo" src="./.github/assets/logo.png" width="120px" />
</div>
<br>
@@ -10,47 +10,49 @@
<br>
<div align="center">
<a href="https://github.com/anotherhadi/nixy/stargazers">
<img src="https://img.shields.io/github/stars/anotherhadi/nixy?color=A594FD&labelColor=0b0b0b&style=for-the-badge&logo=starship&logoColor=A594FD">
<img src="https://img.shields.io/github/stars/anotherhadi/nixy?color=A89AD1&labelColor=0b0b0b&style=for-the-badge&logo=starship&logoColor=A89AD1">
</a>
<a href="https://github.com/anotherhadi/nixy/">
<img src="https://img.shields.io/github/repo-size/anotherhadi/nixy?color=A594FD&labelColor=0b0b0b&style=for-the-badge&logo=github&logoColor=A594FD">
<img src="https://img.shields.io/github/repo-size/anotherhadi/nixy?color=A89AD1&labelColor=0b0b0b&style=for-the-badge&logo=github&logoColor=A89AD1">
</a>
<a href="https://nixos.org">
<img src="https://img.shields.io/badge/NixOS-unstable-blue.svg?style=for-the-badge&labelColor=0b0b0b&logo=NixOS&logoColor=A594FD&color=A594FD">
<img src="https://img.shields.io/badge/NixOS-unstable-blue.svg?style=for-the-badge&labelColor=0b0b0b&logo=NixOS&logoColor=A89AD1&color=A89AD1">
</a>
<a href="https://github.com/anotherhadi/nixy/blob/main/LICENSE">
<img src="https://img.shields.io/static/v1.svg?style=for-the-badge&label=License&message=MIT&colorA=0b0b0b&colorB=A594FD&logo=unlicense&logoColor=A594FD"/>
<img src="https://img.shields.io/static/v1.svg?style=for-the-badge&label=License&message=MIT&colorA=0b0b0b&colorB=A89AD1&logo=unlicense&logoColor=A89AD1"/>
</a>
</div>
<br>
**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.
**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-centric: Preconfigured Hyprland ecosystem (Hyprlock, Hyprpanel, etc.)
- 💻 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.)
- ⌨️ Vim-like Everywhere: Unified keybindings (Hyprland, nvim, vimium, etc.)
## Table of Content
- [Table of Content](#table-of-content)
- [Gallery](#gallery)
- [Screenshots](#screenshots)
- [Architecture](#architecture)
- [🏠 /home (User-level configuration)](#-home-user-level-configuration)
- [🐧 /nixos](#-nixos)
- [🎨 /themes](#-themes)
- [💻 /hosts](#-hosts)
- [🖥️ /server-modules](#-server-modules)
- [Installation](#installation)
- [Documentation](#documentation)
## Gallery
## Screenshots
![Nixy helper, peaclock](.github/assets/nixy/1.png)
![Qutebrowser, pipes, shell](.github/assets/nixy/2.png)
![nvim, lazygit](.github/assets/nixy/3.png)
![spotify, cava](.github/assets/nixy/4.png)
![Home](.github/assets/rose-pine/home.png)
![Flake & Spotify](.github/assets/rose-pine/flake-spotify.png)
![Browser and notification center](.github/assets/rose-pine/browser-and-notifications.png)
## Architecture
@@ -61,50 +63,59 @@ Contains **dotfiles and settings** that apply to your user environment.
**Subfolders:**
- `programs` is a collection of apps configured with home-manager
- `scripts` is a folder full of bash scripts (see [SCRIPTS.md](docs/SCRIPTS.md))
- `system` is some "desktop environment" configuration
### 🐧 /nixos
Those are the system-level configurations. (audio, bluetooth, gpu, bootloader, ...)
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)
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:
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:
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 systems hostname, and update `variables.nix` with your machines settings.
3. Copy your `hardware-configuration.nix` into your new host's folder to ensure proper hardware support.
2. Copy the `hosts/laptop` folder, rename it to match your systems hostname,
and update `variables.nix` with your machines 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:
> [!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
> When you add new files, don't forget to run `git add .` to add them to the git
> repository
5. Build the system
@@ -116,9 +127,16 @@ sudo nixos-rebuild switch --flake ~/.config/nixos#yourhostname
- [SERVER](docs/SERVER.md): Check out the server documentation
- [THEMES](docs/THEMES.md): How themes work and how to create your own
- [SCRIPTS](docs/SCRIPTS.md): A list of available scripts and their usage
- [KEYBINDINGS-HYPRLAND](docs/KEYBINDINGS-HYPRLAND.md): Keybindings available in Hyprland
- [WALLPAPERS](https://github.com/anotherhadi/awesome-wallpapers): An awesome collection of wallpapers
- [WALLPAPERS](https://github.com/anotherhadi/awesome-wallpapers): An awesome
collection of wallpapers
- [CONTRIBUTING](docs/CONTRIBUTING.md): How to contribute
- [LICENSE](LICENSE): MIT License
---
<div align="center">
<a href="https://github.com/anotherhadi/nixy">github</a> |
<a href="https://gitlab.com/anotherhadi_mirror/nixy">gitlab (mirror)</a> |
<a href="https://git.hadi.icu/anotherhadi/nixy">gitea (mirror)</a>
</div
-51
View File
@@ -1,51 +0,0 @@
[//]: # (This file is autogenerated)
# Keybindings for Hyprland
> [!NOTE]
> SUPER is the windows key by default
| Description | Keybinding |
| -- | -- |
| Switch Workspace | SUPER + {Number} |
| Move app to Workspace | SHIFT + SUPER + {Number} |
| Kitty | SUPER + RETURN |
| Thunar | SUPER + E |
| Zen Browser | SUPER + B |
| Bitwarden | SUPER + K |
| Lock | SUPER + L |
| Powermenu | SUPER + X |
| Launcher | SUPER + SPACE |
| Quickmenu | SUPER + C |
| Toggle HyprFocus | SHIFT + SUPER + SPACE |
| Planify | SUPER + P |
| Close window | SUPER + Q |
| Toggle Floating | SUPER + T |
| Toggle Fullscreen | SUPER + F |
| Move focus left | SUPER + left |
| Move focus Right | SUPER + right |
| Move focus Up | SUPER + up |
| Move focus Down | SUPER + down |
| Focus previous monitor | SHIFT + SUPER + up |
| Focus next monitor | SHIFT + SUPER + down |
| Add to master | SHIFT + SUPER + left |
| Remove from master | SHIFT + SUPER + right |
| Screenshot region | SUPER + PRINT |
| Screenshot monitor | PRINT |
| Screenshot window | SHIFT + SUPER + PRINT |
| Screenshot region then edit | ALTPRINT |
| Toggle hyprpanel | SHIFT + SUPER + T |
| Clipboard picker with wofi | SHIFT + SUPER + C |
| Emoji picker with wofi | SHIFT + SUPER + E |
| Toggle night shift | SUPER + F2 |
| Toggle night shift | SUPER + F3 |
| Move Window (mouse) | SUPER + mouse:272 |
| Resize Window (mouse) | SUPER + R |
| Toggle Mute | XF86AudioMute |
| Play/Pause Song | XF86AudioPlay |
| Next Song | XF86AudioNext |
| Previous Song | XF86AudioPrev |
| Lock when closing Lid | switch:Lid Switch |
| Sound Up | XF86AudioRaiseVolume |
| Sound Down | XF86AudioLowerVolume |
| Brightness Up | XF86MonBrightnessUp |
| Brightness Down | XF86MonBrightnessDown |
-99
View File
@@ -1,99 +0,0 @@
[//]: # (This file is autogenerated)
# Scripts
Scripts are located in the 'home/scripts' folder. Home-manager add those in the user's path.
## Brightness
This module provides a set of scripts to control the brightness of the screen.
- `brightness-up` increases the brightness by 5%.
- `brightness-down` decreases the brightness by 5%.
- `brightness-set [value]` sets the brightness to the given value.
- `brightness-change [up|down] [value]` increases or decreases the brightness by the given value.
## Caffeine
Caffeine is a simple script that toggles hypridle (disable suspend & screenlock).
- `caffeine-status` - Check if hypridle is running. (0/1)
- `caffeine-status-icon` - Check if hypridle is running. (icon)
- `caffeine` - Toggle hypridle.
## Hyprfocus
A simple script to toggle focus on few windows in Hyprland.
(disable gaps, border, shadow, opacity, etc.)
- `hyprfocus-on` - Enable hyprfocus.
- `hyprfocus-off` - Disable hyprfocus.
- `hyprfocus-toggle` - Toggle hyprfocus.
## Hyprpanel
Quick scripts to toggle, reload, hide & show hyprpanel.
- `hyprpanel-toggle` - Toggle hyprpanel (hide/show).
- `hyprpanel-show` - Show hyprpanel.
- `hyprpanel-hide` - Hide hyprpanel.
- `hyprpanel-reload` - Reload hyprpanel.
## Nerdfont FZF
This module provides a script to search for Nerd Fonts icons using fzf.
- `nerdfont-fzf` - Search for Nerd Fonts icons using fzf.
## Night-Shift
Night-Shift is a feature that reduces the amount of blue light emitted by your screen, which can help reduce eye strain and improve sleep quality. This module provides a set of scripts to control Night-Shift on your system.
It use hyprsunset to control the screen temperature.
- `night-shift-on` activates Night-Shift.
- `night-shift-off` deactivates Night-Shift.
- `night-shift` toggles Night-Shift.
- `night-shift-status` checks if Night-Shift is active. (0/1)
- `night-shift-status-icon` checks if Night-Shift is active. (icon)
## Nixy
Nixy is a simple script that I use to manage my NixOS system. It's a simple script that provides a menu to rebuild, upgrade, update, collect garbage, clean boot menu, etc.
- `nixy` - UI wizard to manage the system.
- `nixy rebuild` - Rebuild the system.
- `nixy ...` - ... see the script for more commands.
## OpenVPN
OpenVPN allows you to connect/disconnect quickly to a openVPN server
- `openvpn-up` turn on the vpn
- `openvpn-down` turn down the vpn
- `openvpn-toggle` toggle the vpn
## Screenshot
This module provides a script to take screenshots using `grimblast` and `swappy`.
- `screenshot [region|window|monitor] [swappy]` - Take a screenshot of the region, window, or monitor. Optionally, use `swappy` to copy the screenshot to the clipboard.
## Sound
This module provides a set of scripts to control the volume of the default audio sink using `wpctl`.
- `sound-up` increases the volume by 5%.
- `sound-down` decreases the volume by 5%.
- `sound-set [value]` sets the volume to the given value.
- `sound-toggle` toggles the mute state of the default audio sink.
## System
Usefull quick scripts
- `menu` - Open wofi with drun mode. (wofi)
- `powermenu` - Open power dropdown menu. (wofi)
- `quickmenu` - Open a dropdown menu with shortcuts and scripts. (wofi)
- `lock` - Lock the screen. (hyprlock)
+12 -45
View File
@@ -2,61 +2,28 @@
## Overview
This document describes the architecture and setup of the self-hosted **NixOS server**, which is securely accessible via **Tailscale**. The server is designed for private, secure, and easily manageable self-hosting of various services.
This document describes the architecture and setup of the self-hosted **NixOS server**, which is securely accessible via **a Cloudflare Tunnel**.
The server is designed for private, secure, and easily manageable self-hosting of various services.
![server dashboard](../.github/assets/server_dashboard.png)
## **Why This Setup?**
- **Private & Secure**: Services are only accessible through Tailscale, preventing exposure to the public internet.
- **Domain-based Access**: A custom domain (`example.org`) maps to the server's Tailscale IP, making service access simple and consistent.
- **Automatic SSL Certificates**: Using DNS-01 challenges, valid SSL certificates are generated even though the services are not publicly exposed.
- **Modular & Declarative**: Everything is managed through NixOS modules, ensuring reproducibility and easy configuration.
- **Private & Secure**: Services are only accessible through Cloudflare's access control, preventing exposure to the "public internet".
- **Domain-based Access**: A custom domain maps to the server's tunnel, making service access simple and consistent.
- **Modular & Declarative**: Everything is managed through NixOS modules (except for access control), ensuring reproducibility and easy configuration.
## **Self-Hosted Services**
The server hosts several key applications:
### **Core Infrastructure**
- **NGINX**: Reverse proxy for routing traffic to services via `example.org`.
- **Bitwarden**: A self-hosted password manager for secure credential storage.
- **Nextcloud**: A private cloud solution for file synchronization and collaboration.
### **Networking & Security**
- **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.
### **Monitoring & Storage**
- **Glance**: An awesome dashboard! (See the screenshot above)
- **Hoarder**: A self-hostable bookmark-everything app (links, notes and images)
### **Media & Content Management**
- **Arr Stack (Radarr, Sonarr, etc.)**: Automated media management tools for handling movies and TV shows. (legaly ofc)
## **How It Works**
1. **Domain Configuration**
- `example.org` is pointed to the Tailscale IP of the server. (cloudflare A record, not proxied)
- This allows for easy access without exposing services to the internet.
2. **SSL Certificate Generation**
- Certificates are obtained using a **DNS-01 challenge**, verifying domain ownership without requiring public access.
3. **NGINX Reverse Proxy**
- Routes incoming requests from `*.example.org` to the correct internal service.
- Ensures SSL termination and secure connections.
4. **Access Control**
- Only devices within the Tailscale network can reach the services.
- Firewall rules restrict access further based on necessity.
## What's Next?
I want to self-host:
- **A great todolist app**: One that is compatible with markdown & IOS
- **Cyberchef**
- **Maybe**: An app to manage finances
- **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.
- **SSH**: Secure remote access configuration for server management. (via browser too)
- **Security related stuff**: Cloudflared, Fail2Ban, Firewall
+5 -9
View File
@@ -3,19 +3,15 @@
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.
> [!TIP]
> To apply the theme to DuckDuckGo, follow the instructions in `$HOME/.duckduckgo-colorscheme.js`
## Create your theme
Create a copy of one of the existing themes and change the variables.
Wallpapers are loaded from the [nixy-wallpapers](https://github.com/anotherhadi/nixy-wallpapers) repo.
Wallpapers are loaded from the [hadi's awesome-wallpapers](https://github.com/anotherhadi/awesome-wallpapers) repo.
## Gallery
### Nixy
### Rose-pine
![nixy1](../.github/assets/nixy/1.png)
![nixy2](../.github/assets/nixy/2.png)
![nixy3](../.github/assets/nixy/3.png)
![nixy4](../.github/assets/nixy/4.png)
![Home](../.github/assets/rose-pine/home.png)
![Flake & Spotify](../.github/assets/rose-pine/flake-spotify.png)
![Browser and notification center](../.github/assets/rose-pine/browser-and-notifications.png)
Generated
+976 -779
View File
File diff suppressed because it is too large Load Diff
+49 -22
View File
@@ -7,63 +7,90 @@
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";
hyprpanel.url = "github:Jas-SinghFSU/HyprPanel";
stylix.url = "github:danth/stylix";
apple-fonts.url = "github:Lyndeno/apple-fonts.nix";
zen-browser.url = "github:0xc000022070/zen-browser-flake";
nixcord.url = "github:kaylorben/nixcord";
sops-nix.url = "github:Mic92/sops-nix";
nixarr.url = "github:rasmus-kirk/nixarr";
anyrun.url = "github:fufexan/anyrun/launch-prefix";
nvf.url = "github:notashelf/nvf";
bun2nix.url = "github:nix-community/bun2nix";
nix-index-database = {
url = "github:nix-community/nix-index-database";
inputs.nixpkgs.follows = "nixpkgs";
};
home-manager = {
url = "github:nix-community/home-manager";
inputs.nixpkgs.follows = "nixpkgs";
};
nixvim = {
url =
"github:nix-community/nixvim/d81f37256d0a8691b837b74979d27bf89be8ecdd";
caelestia-shell = {
url = "github:caelestia-dots/shell";
inputs.nixpkgs.follows = "nixpkgs";
};
caelestia-cli = {
url = "github:caelestia-dots/cli";
inputs.nixpkgs.follows = "nixpkgs";
};
spicetify-nix = {
url = "github:Gerg-L/spicetify-nix";
inputs.nixpkgs.follows = "nixpkgs";
};
hyprspace = {
url = "github:KZDKM/Hyprspace";
inputs.hyprland.follows = "hyprland";
};
search-nixos-api.url = "github:anotherhadi/search-nixos-api";
# Server
# FIXME: Deleted repo for now
# eleakxir.url = "github:anotherhadi/eleakxir";
nixarr.url = "github:rasmus-kirk/nixarr";
default-creds.url = "github:anotherhadi/default-creds";
blog.url = "github:anotherhadi/blog";
awesome-wallpapers.url = "github:anotherhadi/awesome-wallpapers";
iknowyou.url = "github:anotherhadi/iknowyou";
};
outputs = inputs@{ nixpkgs, ... }: {
outputs = inputs @ {nixpkgs, ...}: {
nixosConfigurations = {
nixy =
h-laptop =
# CHANGEME: This should match the 'hostname' in your variables.nix file
nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules = [
{
nixpkgs.overlays = [ inputs.hyprpanel.overlay ];
_module.args = { inherit inputs; };
nixpkgs.overlays = [];
_module.args = {
inherit inputs;
};
}
inputs.nixos-hardware.nixosModules.omen-16-n0005ne # CHANGEME: check https://github.com/NixOS/nixos-hardware
inputs.home-manager.nixosModules.home-manager
inputs.stylix.nixosModules.stylix
inputs.nix-index-database.nixosModules.default
./hosts/laptop/configuration.nix # CHANGEME: change the path to match your host folder
];
};
h-work = nixpkgs.lib.nixosSystem {
modules = [
{
nixpkgs.overlays = [];
_module.args = {
inherit inputs;
};
}
inputs.home-manager.nixosModules.home-manager
inputs.stylix.nixosModules.stylix
inputs.nix-index-database.nixosModules.default
./hosts/work/configuration.nix
];
};
# Jack is my server
jack = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules = [
{ _module.args = { inherit inputs; }; }
{_module.args = {inherit inputs;};}
inputs.home-manager.nixosModules.home-manager
inputs.stylix.nixosModules.stylix
inputs.sops-nix.nixosModules.sops
inputs.nixarr.nixosModules.default
inputs.search-nixos-api.nixosModules.search-nixos-api
# inputs.eleakxir.nixosModules.eleakxir
inputs.nix-index-database.nixosModules.default
inputs.default-creds.nixosModules.default
./hosts/server/configuration.nix
];
};
-87
View File
@@ -1,87 +0,0 @@
{ pkgs, inputs, ... }: {
programs.anyrun = {
enable = true;
config = {
plugins = with inputs.anyrun.packages.${pkgs.system}; [
applications
shell
randr
rink
symbols
translate
];
width.fraction = 0.25;
y.fraction = 0.3;
hidePluginInfo = true;
closeOnClick = true;
};
extraCss = ''
* {
all: unset;
font-size: 1.2rem;
}
#window,
#match,
#entry,
#plugin,
#main {
background: transparent;
}
#match.activatable {
border-radius: 8px;
margin: 4px 0;
padding: 4px;
/* transition: 100ms ease-out; */
}
#match.activatable:first-child {
margin-top: 12px;
}
#match.activatable:last-child {
margin-bottom: 0;
}
#match:hover {
background: rgba(255, 255, 255, 0.05);
}
#match:selected {
background: rgba(255, 255, 255, 0.1);
}
#entry {
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 8px;
padding: 4px 8px;
}
box#main {
background: rgba(0, 0, 0, 0.5);
box-shadow:
inset 0 0 0 1px rgba(255, 255, 255, 0.1),
0 30px 30px 15px rgba(0, 0, 0, 0.5);
border-radius: 20px;
padding: 12px;
}
'';
extraConfigFiles = {
"applications.ron".text = ''
Config(
desktop_actions: false,
max_entries: 5,
terminal: Some("foot"),
)
'';
"shell.ron".text = ''
Config(
prefix: ">"
)
'';
};
};
}
+78
View File
@@ -0,0 +1,78 @@
{
programs.brave = {
enable = true;
commandLineArgs = [
# Wayland Native
"--enable-features=UseOzonePlatform"
"--ozone-platform=wayland"
# Hardware Acceleration (NVIDIA optimized)
"--enable-accelerated-video-decode"
"--enable-gpu-rasterization"
"--enable-zero-copy"
"--ignore-gpu-blocklist"
# Performance
"--enable-features=VaapiVideoDecoder"
"--enable-features=VaapiVideoEncoder"
"--enable-features=CanvasOopRasterization"
"--disable-features=UseChromeOSDirectVideoDecoder"
# Privacy & Security
"--disable-features=MediaRouter" # Disable Chromecast
"--disable-features=OptimizationHints" # No Google suggestions
"--disable-features=AutofillSavePaymentMethods"
"--disable-background-networking" # No telemetry
"--disable-sync" # Manual sync control
# Wayland-specific fixes
"--disable-features=WaylandWpColorManagerV1" # Color management fix
# UI/UX
"--force-dark-mode" # Match Stylix theme
"--enable-features=WebUIDarkMode"
"--no-default-browser-check"
];
extensions = let
ids = [
];
in
map (id: {inherit id;}) ids;
};
xdg.configFile."BraveSoftware/Brave-Browser/Policies/managed/policy.json".text = builtins.toJSON {
BraveShieldsAdControl = 2;
BraveShieldsTrackersBlocked = 1;
BraveShieldsHttpsEverywhere = 1;
BraveRewardsDisabled = 1;
BraveWalletDisabled = 1;
BraveVPNDisabled = 1;
BraveAIChatEnabled = 0;
PasswordManagerEnabled = 0;
BravePlaylistEnabled = 0;
BraveWebDiscoveryEnabled = 0;
BraveStatsPingEnabled = 0;
DnsOverHttpsMode = "automatic";
BraveDarkMode = 1;
};
xdg.desktopEntries = {
brave-incognito = {
name = "Brave (Private window)";
genericName = "Navigateur Web";
exec = "brave --incognito";
icon = "brave-browser";
terminal = false;
categories = ["Network" "WebBrowser"];
mimeType = ["text/html" "text/xml"];
};
brave-tor = {
name = "Brave (Private window w/Tor)";
genericName = "Navigateur Web";
exec = "brave --tor";
icon = "brave-browser";
terminal = false;
categories = ["Network" "WebBrowser"];
};
};
}
-9
View File
@@ -1,9 +0,0 @@
# Discord is a popular chat application.
{ inputs, ... }: {
imports = [ inputs.nixcord.homeManagerModules.nixcord ];
programs.nixcord = {
enable = true;
config = { frameless = true; };
};
}
@@ -1,44 +0,0 @@
# A duckduckgo colorscheme generated for the Stylix theme used.
{ config, ... }:
let
accent = config.lib.stylix.colors.base0D;
background = config.lib.stylix.colors.base00;
foreground = config.lib.stylix.colors.base05;
background-alt = config.lib.stylix.colors.base01;
foreground-alt = config.lib.stylix.colors.base06;
in {
home.file.".duckduckgo-colorscheme.js".text =
# js
''
// Go to DuckDuckGo settings page, open the console, paste the code and hit enter.
// based on https://ddg.codingcodax.dev/
// Cookies string for your theme
const cookie = '7=${background}; j=${background}; 9=${foreground}; aa=${foreground-alt}; 8=${foreground}; x=${accent}; 21=${background-alt};';
// Converts cookie string into formatted JSON
const cookieToJSON = (cookieRaw) => {
const cookieJson = {};
const items = cookieRaw.split(/[ ,]+/);
items.forEach((item) => {
const parts = item.split('=');
cookieJson[parts[0]] = parts[1];
});
return cookieJson;
};
// Iterates over JSON, and adds to browser cookie store
const setCookies = (cookieJson) => {
Object.keys(cookieJson).forEach((key) => {
document.cookie = `''${key}=''${cookieJson [ key ]}`;
});
};
// Call set cookies, passing in formated cookie data
setCookies(cookieToJSON(cookie));
// All done, reload page for changes to take effect :)
location.reload();
'';
}
-1
View File
@@ -1 +0,0 @@
{ imports = [ ./neofetch ./nerdfetch ]; }
-148
View File
@@ -1,148 +0,0 @@
# Legacy
{ pkgs, ... }: {
home.packages = with pkgs; [ neofetch ];
xdg.configFile."neofetch/ascii.txt".text = ''
''${c6}
'';
xdg.configFile."neofetch/config.conf".text = ''
# From: https://github.com/Chick2D/neofetch-themes/
# Made by https://github.com/Dan1jel
print_info() {
prin "\n"
info "\n \n OS" distro
info "\n \n Host" model
info "\n \n Kernel" kernel
info "\n \n Uptime" uptime
info "\n \n Packages" packages
info "\n \n Shell" shell
info "\n \n Resolution" resolution
info "\n \n DE" de
info "\n \n WM" wm
info "\n \n WM Theme" wm_theme
info "\n \n Theme" theme
info "\n \n Icons" icons
info "\n \n Terminal" term
info "\n \n Terminal Font" term_font
info "\n \n CPU" cpu
info "\n \n GPU" gpu
info "\n \n Memory" memory
info "\n \n Disk" disk
info "\n \n Battery" battery
info "\n \n Font" font
info "\n \n Song" song
[[ "$player" ]] && prin "\n \n Music Player" "$player"
info "\n \n Local IP" local_ip
prin "\n"
# prin "\n \n ''${cl0}''${cl1}''${cl2}''${cl3}''${cl4}''${cl5}''${cl6}''${cl7}"
prin "\n \n \n \n \n \n ''${cl0} \n \n ''${cl1} \n \n ''${cl2} \n \n ''${cl3} \n \n ''${cl4} \n \n ''${cl5} \n \n ''${cl6} \n \n ''${cl7}"
}
reset="\033[0m"
gray="\033[1;90m"
red="\033[1;31m"
green="\033[1;32m"
yellow="\033[1;33m"
blue="\033[1;34m"
magenta="\033[1;35m"
cyan="\033[1;36m"
white="\033[1;37m"
cl0="''${gray}"
cl1="''${red}"
cl2="''${green}"
cl3="''${yellow}"
cl4="''${blue}"
cl5="''${magenta}"
cl6="''${cyan}"
cl7="''${white}"
title_fqdn="off"
kernel_shorthand="on"
distro_shorthand="off"
os_arch="off"
uptime_shorthand="on"
memory_percent="off"
memory_unit="mib"
package_managers="on"
shell_path="off"
shell_version="on"
speed_type="bios_limit"
speed_shorthand="off"
cpu_brand="on"
cpu_speed="on"
cpu_cores="logical"
cpu_temp="off"
gpu_brand="on"
gpu_type="all"
refresh_rate="off"
gtk_shorthand="off"
gtk2="on"
gtk3="on"
de_version="on"
disk_show=('/storage/emulated' '/' '/server')
disk_subtitle="none"
disk_percent="on"
music_player="auto"
song_format="%artist% - %album% - %title%"
song_shorthand="off"
mpc_args=()
bold="on"
underline_enabled="on"
underline_char="-"
separator=":"
block_range=(0 15)
color_blocks="on"
block_width=3
block_height=1
col_offset="auto"
bar_char_elapsed="-"
bar_char_total="="
bar_border="on"
bar_length=15
bar_color_elapsed="distro"
bar_color_total="distro"
cpu_display="off"
memory_display="off"
battery_display="off"
disk_display="off"
image_backend="ascii"
image_source="$HOME/.config/neofetch/ascii.txt"
ascii_distro="auto"
ascii_colors=(distro)
ascii_bold="on"
image_loop="off"
thumbnail_dir="''${XDG_CACHE_HOME:-''${HOME}/.cache}/thumbnails/neofetch"
crop_mode="normal"
crop_offset="center"
image_size="auto"
gap=2
yoffset=0
xoffset=0
background_color=
stdout="off"
'';
}
-371
View File
@@ -1,371 +0,0 @@
# Nerdfetch, a simple system info script written in bash
# Source: https://github.com/ThatOneCalculator/NerdFetch
{ pkgs, ... }:
let
nerdfetch = pkgs.writeShellScriptBin "nerdfetch" ''
ostype="$(uname)"
version=8.1.1
font=nerd
distrotype=none
osi=""
ki=""
ri="󰍛"
pi="󰏔"
ui="󰅶"
ci=""
case $1 in
"-p")
font=phosphor
osi=""
ki=""
ri=""
pi=""
ui=""
ci=""
;;
"-c")
font=cozette
ki=""
ri=""
pi=""
ui=""
ci=""
;;
"-e")
font=emoji
osi="🐧"
ki="💓"
ri="🐐"
pi="📦"
ui=""
ci="🎨"
;;
"-v")
echo "NerdFetch $version"
exit
;;
"-h")
echo "Flags:
-c: Cozette font
-p: Phosphor font
-e: Emoji font
-v: Version"
exit
;;
esac
if command -v getprop 1>/dev/null; then
distrotype=android
fi
kernel="$(echo $(uname -r) | cut -d'-' -f1-1)"
case $ostype in
*"Linux"*)
if [ $distrotype = android ]; then
host="$(hostname)"
USER="$(whoami)"
os="Android $(getprop ro.build.version.release)"
case $font in
phosphor) osi="" ;;
emoji) osi="🤖" ;;
*) osi="󰀲" ;;
esac
else
host="$(cat /proc/sys/kernel/hostname)"
. /etc/os-release
if [ -f /bedrock/etc/bedrock-release ]; then
os="$(brl version)"
else
os="''${PRETTY_NAME}"
if [ $font = nerd ]; then
case $(echo $ID | sed 's/ .*//') in
debian) osi="" ;;
arch) osi="󰣇" ;;
endeavouros) osi="" ;;
fedora) osi="" ;;
gentoo) osi="" ;;
rhel) osi="" ;;
slackware) osi="" ;;
void) osi="" ;;
alpine) osi="" ;;
nixos) osi="󱄅" ;;
artix) osi="" ;;
exherbo) osi="󰆚" ;;
mageia) osi="" ;;
manjaro) osi="" ;;
opensuse) osi="" ;;
solus) osi="" ;;
ubuntu) osi="" ;;
mint) osi="󰣭" ;;
trisquel) osi="" ;;
puppy) osi="" ;;
coreos) osi="" ;;
mx) osi="" ;;
vanilla) osi="" ;;
pop_os) osi="" ;;
raspbian) osi="" ;;
deepin) osi="" ;;
almalinux) osi="" ;;
garuda) osi="" ;;
centos) osi="" ;;
rocky) osi="" ;;
esac
elif [ $font = cozette ]; then
case $(echo $ID | sed 's/ .*//') in
debian) osi="" ;;
arch) osi="" ;;
fedora) osi="" ;;
gentoo) osi="" ;;
slackware) osi="" ;;
void) osi="" ;;
alpine) osi="" ;;
nixos) osi="" ;;
mageia) osi="" ;;
manjaro) osi="" ;;
opensuse) osi="" ;;
ubuntu) osi="" ;;
mint) osi="" ;;
coreos) osi="" ;;
centos) osi="" ;;
esac
fi
fi
fi
shell=$(basename "$SHELL")
;;
*"Darwin"*)
host="$(hostname -f | sed -e 's/^[^.]*\.//')"
mac_product="$(/usr/libexec/PlistBuddy -c "Print:ProductName" /System/Library/CoreServices/SystemVersion.plist)"
mac_version="$(/usr/libexec/PlistBuddy -c "Print:ProductVersion" /System/Library/CoreServices/SystemVersion.plist)"
os="''${mac_product} ''${mac_version}"
case $font in
nerd) osi="" ;;
phosphor) osi="" ;;
cozette) osi="" ;;
emoji) osi="🍎" ;;
esac
;;
*"FreeBSD"*)
host="$(hostname)"
distrotype=bsd
os="FreeBSD $(freebsd-version | sed 's/-.*//')"
case $font in
nerd) osi="" ;;
phosphor) osi="" ;;
cozette) osi="" ;;
emoji) osi="😈" ;;
esac
;;
*"OpenBSD"*)
host="$(hostname)"
distrotype=bsd
os="OpenBSD $(uname -r)"
case $font in
nerd) osi="" ;;
phosphor) osi="" ;;
cozette) osi="" ;;
emoji) osi="🐡" ;;
esac
;;
*"NetBSD"*)
host="$(hostname)"
distrotype=netbsd
os="NetBSD $(uname -r)"
case $font in
nerd) osi="󰉀" ;;
phosphor) osi="" ;;
cozette) osi="" ;;
emoji) osi="🚩" ;;
esac
;;
*)
os="Unix-like"
host="host"
;;
esac
## PACKAGE MANAGER AND PACKAGES DETECTION
MANAGER=$(which nix-env pkg flatpak yum zypper dnf rpm dpkg-query brew port pacman xbps-query emerge cave apk kiss pmm /usr/sbin/slackpkg bulge birb yay paru pacstall cpm pmm eopkg getprop 2>/dev/null)
manager=$(basename "$MANAGER")
if [ $distrotype = netbsd ]; then
manager="pkg_info-netbsd"
fi
case $manager in
cpm) packages="$(cpm C)" ;;
flatpak) packages="$(flatpak list --app | wc -l)" ;;
brew) packages="$(printf '%s\n' "$(brew --cellar)/"* | wc -l)" ;;
port) packages="$(port installed | wc -l)" ;;
dpkg-query) packages="$(dpkg-query -f '${
"binary:Package"
}\n' -W | wc -l)" ;;
rpm) packages="$(rpm -qa --last | wc -l)" ;;
yum) packages="$(yum list installed | wc -l)" ;;
dnf) packages="$(dnf list installed | wc -l)" ;;
zypper) packages="$(zypper se | wc -l)" ;;
pacman) packages="$(pacman -Q | wc -l)" ;;
yay) packages="$(yay -Q | wc -l)" ;;
paru) packages="$(paru -Q | wc -l)" ;;
pacstall) packages="$(pacstall -L | wc -l)" ;;
kiss) packages="$(kiss list | wc -l)" ;;
emerge) packages="$(qlist -I | wc -l)" ;;
pkg) packages="$(pkg info | wc -l | tr -d ' ')" ;;
cave) packages="$(cave show installed-slots | wc -l)" ;;
xbps-query) packages="$(xbps-query -l | wc -l)" ;;
nix-env) packages="$(nix-store -q --requisites /run/current-system/sw | wc -l)" ;;
apk) packages="$(apk list --installed | wc -l)" ;;
pmm) packages="$(/bedrock/libexec/pmm pacman pmm -Q 2>/dev/null | wc -l)" ;;
eopkg) packages="$(eopkg li | wc -l)" ;;
/usr/sbin/slackpkg) packages="$(ls /var/log/packages | wc -l)" ;;
bulge) packages="$(bulge list | wc -l)" ;;
birb) packages="$(birb --list-installed | wc -l)" ;;
pkg_info)
packages="$(pkg_info -A | wc -l)"
manager="pkg"
;;
pkg_info-netbsd)
packages="$(pkg_info -a | wc -l)"
manager="pkg"
;;
*)
if [ $distrotype = android ]; then
packages="$(dpkg-query -f '${"binary:Package"}\n' -W | wc -l)"
manager="dpkg"
else
packages="$(ls /usr/bin | wc -l)"
manager="bin"
fi
;;
esac
packages="''${packages#"''${packages%%[![:space:]]*}"}"
manager=$(echo $manager | sed "s/-query//; s/\/usr\/.*\///")
## UPTIME DETECTION
if [ $distrotype = android ]; then
uptime="$(echo $(uptime -p) | cut -c 4-)"
elif [ $distrotype = bsd ] || [ $distrotype = netbsd ]; then
uptime="$(uptime | sed -e 's/.* up //; s/, [0-9]* user.*//')"
else
case $ostype in
*"Linux"*)
IFS=. read -r s _ </proc/uptime
;;
*)
s=$(sysctl -n kern.boottime)
s=''${s#*=}
s=''${s%,*}
s=$(($(date +%s) - s))
;;
esac
d="$((s / 60 / 60 / 24))"
h="$((s / 60 / 60 % 24))"
m="$((s / 60 % 60))"
# Plurals
[ "$d" -gt 1 ] && dp=s
[ "$h" -gt 1 ] && hp=s
[ "$m" -gt 1 ] && mp=s
[ "$s" -gt 1 ] && sp=s
# Hide empty fields.
[ "$d" = 0 ] && d=
[ "$h" = 0 ] && h=
[ "$m" = 0 ] && m=
[ "$m" != "" ] && s=
# Make the output of uptime smaller.
[ "$d" ] && uptime="$d day$dp, "
[ "$h" ] && uptime="$uptime$h hour$hp, "
[ "$m" ] && uptime="$uptime$m min$mp"
[ "$s" ] && uptime="$uptime$s sec$sp"
uptime=''${uptime%, }
fi
## RAM DETECTION
case $ostype in
*"Linux"*)
while IFS=':k ' read -r key val _; do
case $key in
MemTotal)
mem_used=$((mem_used + val))
mem_full=$val
;;
Shmem) mem_used=$((mem_used + val)) ;;
MemFree | Buffers | Cached | SReclaimable) mem_used=$((mem_used - val)) ;;
esac
done </proc/meminfo
mem_used=$((mem_used / 1024))
mem_full=$((mem_full / 1024))
;;
*"Darwin"*)
mem_full=$(($(sysctl -n hw.memsize) / 1024 / 1024))
while IFS=:. read -r key val; do
case $key in
*' wired'* | *' active'* | *' occupied'*)
mem_used=$((mem_used + ${"val:-0"}))
;;
esac
done <-EOF
$(vm_stat)
EOF
mem_used=$((mem_used * 4 / 1024))
;;
*"BSD"*)
mem_full=$(($(sysctl -n hw.physmem) / 1024 / 1024))
if [ $distrotype = netbsd ]; then
mem_free=$(($(vmstat | awk 'NR==3 {print $4}') / 1024))
else
mem_free=$(($(sysctl -n vm.stats.vm.v_free_count) * $(sysctl -n vm.stats.vm.v_page_size) / 1024 / 1024))
fi
mem_used=$((mem_full - mem_free))
;;
*)
mem_full=1
mem_used=0
;;
esac
memstat="''${mem_used}/''${mem_full} MiB"
if which expr >/dev/null 2>&1; then
mempercent="($(expr $(expr ''${mem_used} \* 100 / ''${mem_full}))%)"
fi
## DEFINE COLORS
bold=''
black=''
red=''
green=''
yellow=''
blue=''
magenta=''
cyan=''
white=''
grey=''
reset=''
## USER VARIABLES -- YOU CAN CHANGE THESE
lc="$reset$bold$magenta" # labels
nc="$reset$bold$magenta" # labels
hn="$reset$bold$magenta" # labels
ic="$reset$white" # info
c0="$reset$grey" # first color
c1="$reset$white" # second color
c2="$reset$yellow" # third color
## OUTPUT
echo """
''${c0} ___ ''${nc}''${USER}''${grey}@''${reset}''${hn}''${host}''${reset}
''${c0} (''${c1}.. ''${c0}\ ''${lc}''${osi} ''${ic}''${os}''${reset}
''${c0} (''${c2}<> ''${c0}| ''${lc}''${ki} ''${ic}''${kernel}''${reset}
''${c0} /''${c1}/ \\ ''${c0}\\ ''${lc}''${ri} ''${ic}''${RAM}''${memstat} ''${mempercent}
''${c0} ( ''${c1}| | ''${c0}/| ''${lc}''${pi} ''${ic}''${packages} (''${manager})''${reset}
''${c2} _''${c0}/\\ ''${c1}__)''${c0}/''${c2}_''${c0}) ''${lc}''${ui} ''${ic}''${uptime}''${reset}
''${c2} \/''${c0}-____''${c2}\/''${reset} ''${lc}''${ci} ''${red}''${green}''${yellow}''${blue}''${magenta}''${cyan}''${reset}
"""
'';
in { home.packages = [ nerdfetch ]; }
+32
View File
@@ -0,0 +1,32 @@
{
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;
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"
];
};
};
}
+30 -32
View File
@@ -1,13 +1,10 @@
# Git configuration
{ config, ... }:
let
{config, ...}: let
username = config.var.git.username;
email = config.var.git.email;
in {
programs.git = {
enable = true;
userName = username;
userEmail = email;
ignores = [
".cache/"
".DS_Store"
@@ -20,38 +17,39 @@ in {
"result"
"result-*"
];
extraConfig = {
settings = {
user.name = username;
user.email = email;
init.defaultBranch = "main";
pull.rebase = "false";
push.autoSetupRemote = true;
color.ui = "1";
};
aliases = {
essa = "push --force";
co = "checkout";
fuck = "commit --amend -m";
c = "commit -m";
ca = "commit -am";
forgor = "commit --amend --no-edit";
graph = "log --all --decorate --graph --oneline";
oops = "checkout --";
l = "log";
r = "rebase";
s = "status --short";
ss = "status";
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`";
alias = {
essa = "push --force";
co = "checkout";
fuck = "commit --amend -m";
c = "commit -m";
ca = "commit -am";
forgor = "commit --amend --no-edit";
graph = "log --all --decorate --graph --oneline";
oops = "checkout --";
l = "log";
r = "rebase";
s = "status --short";
ss = "status";
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`";
};
};
};
}
@@ -1,16 +1,28 @@
# Lazygit is a simple terminal UI for git commands.
{ config, lib, ... }:
let
{
config,
lib,
...
}: let
accent = "#${config.lib.stylix.colors.base0D}";
muted = "#${config.lib.stylix.colors.base03}";
in {
programs.lazygit = {
enable = true;
settings = lib.mkForce {
disableStartupPopups = true;
notARepository = "skip";
promptToReturnFromSubprocess = false;
update.method = "never";
git = {
commit.signOff = true;
overrideGpg = true;
parseEmoji = true;
};
gui = {
theme = {
activeBorderColor = [ accent "bold" ];
inactiveBorderColor = [ muted ];
activeBorderColor = [accent "bold"];
inactiveBorderColor = [muted];
};
showListFooter = false;
showRandomTip = false;
+15
View File
@@ -0,0 +1,15 @@
# This file is used to sign git commits using an SSH key.
{
# CHANGEME: change this to your own SSH key.
home.file.".ssh/allowed_signers".text = "* ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIINhWby7lUUXQNKbRu9/UOrGjWDf3fvoAwGHomWv/+lL";
programs.git = {
signing.format = "openpgp";
settings = {
commit.gpgsign = true;
gpg.ssh.allowedSignersFile = "~/.ssh/allowed_signers";
gpg.format = "ssh";
user.signingkey = "~/.ssh/key.pub";
};
};
}
+21
View File
@@ -0,0 +1,21 @@
{
pkgs,
pkgs-stable,
...
}: {
home.packages = with pkgs-stable; [
vlc # Video player
blanket # White-noise app
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
onlyoffice-desktopeditors # Office suite
signal-desktop # Messaging app
element-desktop # Messaging app
];
}
+77
View File
@@ -0,0 +1,77 @@
{
pkgs-stable,
pkgs,
...
}: {
home.packages = with pkgs-stable; [
wireshark
nmap
john
hashcat
metasploit
haiti
hydra
dnsrecon
whois
dig
nosqli
jwt-cli
nuclei
# Web
caido
nuclei
gobuster
dirb
ffuf
sqlmap
# Utils
inetutils
samba
openvpn
mariadb
redis
];
systemd.user.tmpfiles.rules = [
"d %h/Cyber/tmp 0755 - - -"
"d %h/Cyber/wordlists 0755 - - -"
"d %h/Cyber/wordlists/rules 0755 - - -"
];
home.file = {
"Cyber/wordlists/seclists" = {
source = pkgs.fetchFromGitHub {
owner = "danielmiessler";
repo = "SecLists";
rev = "47aa98053fce8670c6489e4f6fb57dc34881d8bd";
hash = "sha256-ojXLB/TXap1Qi0MtV5/WJlJpjNIDYx/sLY2KHm0uFKI=";
};
};
"Cyber/wordlists/fuzz4bounty" = {
source = pkgs.fetchFromGitHub {
owner = "0xPugal";
repo = "fuzz4bounty";
rev = "a805f6b434033f054312da0ddc2bc3021cc9a3b0";
hash = "sha256-wMhx1CcxIyw2E7gJXQxXAFc7m5nYt0FXNkoTZqFMQh4=";
};
};
# RULES
"Cyber/wordlists/rules/oneruletorulethemstill".source = pkgs.fetchFromGitHub {
owner = "stealthsploit";
repo = "oneruletorulethemstill";
rev = "4bfb7322e189305b5f35bb7fcd4e9cc233c3d3c6";
hash = "sha256-h7MeymIXS/6wlPRt4lzsIEqOOssP0lDx9nQip65cwZw=";
};
"Cyber/wordlists/rules/best64.rule" = {
source = pkgs.fetchurl {
url = "https://raw.githubusercontent.com/CarlosLannister/OwadeReborn/refs/heads/master/owade/fileAnalyze/hashcatLib/best64.rule%7E";
hash = "sha256-T0XkMHJZQiy63/j25nGTkaiDFjc+blmgEVGTAFgVylU=";
};
};
};
}
+24
View File
@@ -0,0 +1,24 @@
{
pkgs,
pkgs-stable,
inputs,
...
}: {
home.packages =
(with pkgs; [
# Unstable: latest toolchain versions preferred for dev
go
bun
nodejs
air
duckdb
claude-code
inputs.bun2nix.packages.${stdenv.hostPlatform.system}.default
])
++ (with pkgs-stable; [
docker
python3
jq
just
]);
}
+9
View File
@@ -0,0 +1,9 @@
{pkgs-stable, ...}: {
home.packages = with pkgs-stable; [
peaclock
cbonsai
pipes
cmatrix
fastfetch
];
}
-33
View File
@@ -1,33 +0,0 @@
# Kitty is a fast, featureful, GPU based terminal emulator
{
programs.kitty = {
enable = true;
keybindings = {
# Reset existing mappings
"ctrl+alt+tab" = "next_tab";
"ctrl+alt+shift+tab" = "previous_tab";
# Send Ctrl Tab and Ctrl + Shift + Tab for Tmux navigation
"ctrl+tab" = "send_text all \\x1b[27;5;9~";
"ctrl+shift+tab" = "send_text all \\x1b[27;6;9~";
"alt+tab" = "send_text all \\x1b[27;3;9~";
};
settings = {
scrollback_lines = 10000;
initial_window_width = 1200;
initial_window_height = 600;
update_check_interval = 0;
enable_audio_bell = false;
confirm_os_window_close = "0";
remember_window_size = "no";
disable_ligatures = "never";
url_style = "curly";
copy_on_select = "clipboard";
cursor_shape = "Underline";
cursor_underline_thickness = 3;
cursor_trail = 3;
cursor_trail_decay = "0.1 0.4";
window_padding_width = 10;
open_url_with = "default";
};
};
}
-7
View File
@@ -1,7 +0,0 @@
# Nextcloud is a suite of client-server software for creating file hosting services and using them. It is functionally similar to Dropbox, although Nextcloud is free and open-source, allowing anyone to install and operate it on a private server. In contrast to proprietary services, Nextcloud can be hosted on a private server, without additional cost.
{
services.nextcloud-client = {
enable = true;
startInBackground = true;
};
}
+19
View File
@@ -0,0 +1,19 @@
{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
];
}
+5
View File
@@ -0,0 +1,5 @@
{inputs, ...}: {
imports = [inputs.nix-index-database.homeModules.default];
programs.nix-index.enable = true;
programs.nix-index-database.comma.enable = true;
}
@@ -1,19 +1,23 @@
# - ## Nixy
#-
#- Nixy is a simple script that I use to manage my NixOS system. It's a simple script that provides a menu to rebuild, upgrade, update, collect garbage, clean boot menu, etc.
#- Nixy is a simple script that I use to manage my NixOS system. It's a simple script that provides a menu to rebuild, test, update, collect garbage, clean boot menu, etc.
#-
#- - `nixy` - UI wizard to manage the system.
#- - `nixy rebuild` - Rebuild the system.
#- - `nixy ...` - ... see the script for more commands.
{ pkgs, config, inputs, ... }:
let
{
pkgs,
config,
...
}: let
inherit (config.var) configDirectory;
configDirectory = config.var.configDirectory;
hostname = config.var.hostname;
nixy = pkgs.writeShellScriptBin "nixy"
nixy =
pkgs.writeShellScriptBin "nixy"
# bash
''
EXTRA_ARGS="''${@:2}"
function exec() {
$@
}
@@ -24,13 +28,11 @@ let
# "icon;name;command"[]
apps=(
"󰑓;Rebuild;nixy rebuild"
"󰦗;Upgrade;nixy upgrade"
"󰐊;Test;nixy test"
"󰚰;Update;nixy update"
";Collect Garbage;nixy gc"
"󰍜;Clean Boot Menu;nixy cb"
";List generation;nixy listgen"
"󰌌;Hyprland Keybindings;nvim ${configDirectory}/docs/KEYBINDINGS-HYPRLAND.md"
"󰋩;Wallpapers;zen https://github.com/anotherhadi/nixy-wallpapers"
)
# Apply default icons if empty:
@@ -51,14 +53,23 @@ let
[[ $1 == "" ]] && ui
if [[ $1 == "rebuild" ]];then
cd ${configDirectory} && git add .
sudo nixos-rebuild switch --flake ${configDirectory}#${hostname}
elif [[ $1 == "upgrade" ]];then
sudo nixos-rebuild switch --upgrade --flake '${configDirectory}#${hostname}'
cd ${configDirectory} && git add . && sudo nixos-rebuild switch --flake . $EXTRA_ARGS
elif [[ $1 == "test" ]];then
cd ${configDirectory} && git add . && sudo nixos-rebuild test --flake . $EXTRA_ARGS
elif [[ $1 == "update" ]];then
cd ${configDirectory} && nix flake update
cd ${configDirectory} && nix flake update $EXTRA_ARGS
elif [[ $1 == "gc" ]];then
cd ${configDirectory} && sudo nix-collect-garbage -d
echo "Starting Nix garbage collection..."
cd ${configDirectory} && \
echo "Cleaning up system garbage..." && \
sudo nix-collect-garbage -d && \
echo "Cleaning up user garbage..." && \
nix-collect-garbage -d && \
echo "Collecting garbage from Nix store..." && \
nix-store --gc && \
echo "Optimizing Nix store..." && \
nix-store --optimise
echo "Nix garbage collection complete."
elif [[ $1 == "cb" ]];then
sudo /run/current-system/bin/switch-to-configuration boot
elif [[ $1 == "listgen" ]];then
@@ -67,5 +78,4 @@ let
echo "Unknown argument"
fi
'';
in { home.packages = [ nixy ]; }
in {home.packages = [nixy];}
+21
View File
@@ -0,0 +1,21 @@
# NVF is a Neovim configuration that provides a minimal setup with essential plugins and configurations.
{
inputs,
pkgs,
...
}: {
imports = [
inputs.nvf.homeManagerModules.default
./options.nix
./languages.nix
./picker.nix
./snacks.nix
./keymaps.nix
./utils.nix
./mini.nix
];
programs.nvf = {
enable = true;
};
}
+229
View File
@@ -0,0 +1,229 @@
{
programs.nvf.settings.vim = {
globals.mapleader = " ";
binds = {
whichKey = {
enable = true;
# TODO: registers
register = {};
};
};
keymaps = [
# General Mappings
{
key = "s";
mode = "n";
silent = true;
action = "<cmd>lua require('flash').jump()<cr>";
desc = "Flash";
}
{
key = "K";
mode = "n";
silent = true;
action = "<cmd>lua vim.lsp.buf.hover()<cr>";
desc = "LSP Hover";
}
{
key = "<C-tab>";
mode = "n";
silent = true;
action = "<cmd>bnext<cr>";
desc = "Next Buffer";
}
# Disable Arrow Keys in Normal Mode and Middle click
{
key = "<Up>";
mode = "n";
silent = true;
action = "<Nop>";
desc = "Disable Up Arrow";
}
{
key = "<Down>";
mode = "n";
silent = true;
action = "<Nop>";
desc = "Disable Down Arrow";
}
{
key = "<Left>";
mode = "n";
silent = true;
action = "<Nop>";
desc = "Disable Left Arrow";
}
{
key = "<Right>";
mode = "n";
silent = true;
action = "<Nop>";
desc = "Disable Right Arrow";
}
{
key = "<MiddleMouse>";
mode = ["n" "i" "v"]; # Normal, Insert, Visual
action = "<nop>"; # No Operation
silent = true;
}
{
key = "<2-MiddleMouse>"; # Désactive aussi le double clic molette
mode = ["n" "i" "v"];
action = "<nop>";
silent = true;
}
{
key = "<3-MiddleMouse>"; # Désactive aussi le double clic molette
mode = ["n" "i" "v"];
action = "<nop>";
silent = true;
}
# UI
{
key = "<leader>uw";
mode = "n";
silent = true;
action = "<cmd>set wrap!<cr>";
desc = "Toggle word wrapping";
}
{
key = "<leader>ul";
mode = "n";
silent = true;
action = "<cmd>set linebreak!<cr>";
desc = "Toggle linebreak";
}
{
key = "<leader>us";
mode = "n";
silent = true;
action = "<cmd>set spell!<cr>";
desc = "Toggle spellLazyGitcheck";
}
{
key = "<leader>uc";
mode = "n";
silent = true;
action = "<cmd>set cursorline!<cr>";
desc = "Toggle cursorline";
}
{
key = "<leader>un";
mode = "n";
silent = true;
action = "<cmd>set number!<cr>";
desc = "Toggle line numbers";
}
{
key = "<leader>ur";
mode = "n";
silent = true;
action = "<cmd>set relativenumber!<cr>";
desc = "Toggle relative line numbers";
}
{
key = "<leader>ut";
mode = "n";
silent = true;
action = "<cmd>set showtabline=2<cr>";
desc = "Show tabline";
}
{
key = "<leader>uT";
mode = "n";
silent = true;
action = "<cmd>set showtabline=0<cr>";
desc = "Hide tabline";
}
# Windows
{
key = "<leader>ws";
mode = "n";
silent = true;
action = "<cmd>split<cr>";
desc = "Split";
}
{
key = "<leader>wv";
mode = "n";
silent = true;
action = "<cmd>vsplit<cr>";
desc = "VSplit";
}
{
key = "<leader>wd";
mode = "n";
silent = true;
action = "<cmd>close<cr>";
desc = "Close";
}
# QOL
{
key = ">";
mode = "v";
silent = true;
action = ">gv";
desc = "Indent and keep selection";
}
{
key = "<";
mode = "v";
silent = true;
action = "<gv";
desc = "Dedent and keep selection";
}
# Move
{
key = "<C-h>";
mode = "n";
silent = true;
action = "<C-w>h";
desc = "Move to left window";
}
{
key = "<C-j>";
mode = "n";
silent = true;
action = "<C-w>j";
desc = "Move to bottom window";
}
{
key = "<C-k>";
mode = "n";
silent = true;
action = "<C-w>k";
desc = "Move to top window";
}
{
key = "<C-l>";
mode = "n";
silent = true;
action = "<C-w>l";
desc = "Move to right window";
}
# Save
{
key = "<C-s>";
mode = ["n" "i" "v"];
silent = true;
action = "<cmd>w<cr>";
desc = "Save file";
}
# Deactivate "esc"
{
key = "<Esc>";
mode = ["n" "i" "v"];
silent = true;
action = "<Nop>";
desc = "Disable Escape";
}
];
};
}
+130
View File
@@ -0,0 +1,130 @@
{
lib,
pkgs,
...
}: {
programs.nvf.settings.vim = {
diagnostics = {
enable = true;
config = {
signs = {
text = {
"vim.diagnostic.severity.Error" = " ";
"vim.diagnostic.severity.Warn" = " ";
"vim.diagnostic.severity.Hint" = " ";
"vim.diagnostic.severity.Info" = " ";
};
};
underline = true;
update_in_insert = true;
virtual_text = {
format =
lib.generators.mkLuaInline
/*
lua
*/
''
function(diagnostic)
return string.format("%s", diagnostic.message)
--return string.format("%s (%s)", diagnostic.message, diagnostic.source)
end
'';
};
};
nvim-lint = {
enable = true;
};
};
syntaxHighlighting = true;
treesitter = {
enable = true;
autotagHtml = true;
context.enable = true;
highlight.enable = true;
grammars = with pkgs.vimPlugins.nvim-treesitter.builtGrammars; [
typescript # in language settings only tsx gets enabled, not typescript
];
};
lsp = {
enable = true;
presets = {
tailwindcss-language-server = {
enable = true;
};
};
trouble.enable = true;
lspSignature.enable = true;
lspconfig.enable = true;
formatOnSave = true;
inlayHints.enable = true;
null-ls.enable = true;
servers.nixd.settings.nil.nix.autoArchive = true;
otter-nvim = {
enable = true;
setupOpts = {
buffers.set_filetype = true;
lsp = {
diagnostic_update_event = [
"BufWritePost"
"InsertLeave"
];
};
};
};
lspkind.enable = true;
lspsaga = {
enable = true;
setupOpts = {
ui = {
code_action = "";
};
lightbulb = {
sign = false;
virtual_text = true;
};
breadcrumbs.enable = false;
};
};
};
languages = {
enableDAP = true;
enableExtraDiagnostics = true;
enableFormat = true;
enableTreesitter = true;
python = {
enable = true;
lsp = {
enable = true;
servers = ["pyright"];
};
};
astro.enable = true;
go.enable = true;
markdown = {
enable = true;
format.type = ["prettierd"];
extensions = {
markview-nvim = {
enable = true;
};
};
extraDiagnostics.enable = true;
};
typescript = {
enable = true;
extensions.ts-error-translator.enable = true;
};
css.enable = true;
svelte.enable = true;
html.enable = true;
bash.enable = true;
nix.enable = true;
};
formatter = {
conform-nvim = {
enable = true;
};
};
};
}
+13
View File
@@ -0,0 +1,13 @@
{
programs.nvf.settings.vim.mini = {
starter.enable = true;
comment.enable = true;
# cursorword.enable = true;
icons.enable = true;
indentscope.enable = true;
notify.enable = true;
pairs.enable = true;
diff.enable = true;
git.enable = true;
};
}
+53
View File
@@ -0,0 +1,53 @@
{lib, ...}: {
programs.nvf.settings.vim = {
viAlias = false;
vimAlias = true;
withNodeJs = true;
# syntaxHighlighting = true;
options = {
autoindent = true;
smartindent = true;
shiftwidth = 2;
foldlevel = 99;
foldcolumn = "auto:1";
mousescroll = "ver:1,hor:1";
mousemoveevent = true;
fillchars = "eob:,fold: ,foldopen:,foldsep:,foldclose:";
signcolumn = "yes";
tabstop = 2;
softtabstop = 2;
wrap = false;
};
globals = {
navic_silence = true; # navic tries to attach multiple LSPs and fails
suda_smart_edit = 1; # use super user write automatically
neovide_scale_factor = 0.7;
neovide_cursor_animation_length = 0.1;
neovide_cursor_short_animation_length = 0;
};
clipboard = {
enable = true;
registers = "unnamedplus";
providers.wl-copy.enable = true;
};
luaConfigRC.osc52-clipboard = ''
vim.g.clipboard = {
name = 'OSC 52',
copy = {
['+'] = require('vim.ui.clipboard.osc52').copy '+',
['*'] = require('vim.ui.clipboard.osc52').copy '*',
},
paste = {
['+'] = require('vim.ui.clipboard.osc52').paste '+',
['*'] = require('vim.ui.clipboard.osc52').paste '*',
},
}
'';
theme = {
enable = true;
name = lib.mkForce "catppuccin";
style = lib.mkForce "mocha";
transparent = lib.mkForce true;
};
};
}
@@ -1,221 +1,256 @@
{ config, ... }: {
programs.nixvim = {
highlightOverride = {
SnacksPicker = {
bg = "none";
nocombine = true;
{
programs.nvf.settings.vim = {
utility = {
oil-nvim.enable = true;
snacks-nvim = {
setupOpts = {
picker.enabled = true;
explorer.enabled = true;
};
};
SnacksPickerBorder = {
bg = "none";
fg = "#${config.lib.stylix.colors.base0D}";
};
SnacksPickerTree = { bg = "#${config.lib.stylix.colors.base00}"; };
FloatBorder = {
bg = "#${config.lib.stylix.colors.base00}";
fg = "#${config.lib.stylix.colors.base0D}";
};
NormalFloat = { bg = "#${config.lib.stylix.colors.base00}"; };
};
plugins = {
snacks.settings = {
picker.enable = true;
explorer.enable = true;
};
oil.enable = true;
which-key.settings.spec = [
{
__unkeyed-1 = "<leader>f";
mode = "n";
group = "+find";
}
{
__unkeyed-1 = "<leader>g";
mode = "n";
group = "+git";
}
{
__unkeyed-1 = "<leader>s";
mode = "n";
group = "+search";
}
];
};
keymaps = [
# Top Pickers & Explorer
{
key = "<leader> ";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.smart()<cr>";
options.desc = "Smart Find Files";
desc = "Smart Find Files";
}
{
key = "<leader>,";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.buffers()<cr>";
options.desc = "Buffers";
desc = "Buffers";
}
{
key = "<leader>/";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.grep()<cr>";
options.desc = "Grep";
desc = "Grep";
}
{
key = "<leader>:";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.command_history()<cr>";
options.desc = "Command History";
desc = "Command History";
}
{
key = "<leader>e";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.explorer()<cr>";
options.desc = "File Explorer";
desc = "File Explorer";
}
{
key = "-";
mode = "n";
silent = true;
action = "<cmd>Oil<cr>";
options.desc = "Oil";
desc = "Oil";
}
# Find
{
key = "<leader>fb";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.buffers()<cr>";
options.desc = "Buffers";
desc = "Buffers";
}
{
key = "<leader>fc";
mode = "n";
silent = true;
action = ''
<cmd>lua Snacks.picker.files({ cwd = vim.fn.stdpath("config") })<cr>'';
options.desc = "Find Config File";
desc = "Find Config File";
}
{
key = "<leader>ff";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.files()<cr>";
options.desc = "Find Files";
desc = "Find Files";
}
{
key = "<leader>fg";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.git_files()<cr>";
options.desc = "Find Git Files";
desc = "Find Git Files";
}
{
key = "<leader>fp";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.projects()<cr>";
options.desc = "Projects";
desc = "Projects";
}
{
key = "<leader>fr";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.recent()<cr>";
options.desc = "Recent";
desc = "Recent";
}
{
key = "<leader>fn";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.notifications()<cr>";
options.desc = "Notification History";
desc = "Notification History";
}
{
key = "<leader>fe";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.icons()<cr>";
options.desc = "Emoji";
desc = "Emoji";
}
# Git
{
key = "<leader>gb";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.git_branches()<cr>";
options.desc = "Git Branches";
desc = "Git Branches";
}
{
key = "<leader>gL";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.git_log()<cr>";
options.desc = "Git Log Line";
desc = "Git Log Line";
}
{
key = "<leader>gs";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.git_status()<cr>";
options.desc = "Git Status";
desc = "Git Status";
}
{
key = "<leader>gS";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.git_stash()<cr>";
options.desc = "Git Stash";
desc = "Git Stash";
}
{
key = "<leader>gd";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.git_diff()<cr>";
options.desc = "Git Diff (Hunks)";
desc = "Git Diff (Hunks)";
}
{
key = "<leader>gf";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.git_log_file()<cr>";
options.desc = "Git Log File";
desc = "Git Log File";
}
# Grep
{
key = "<leader>sb";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.lines()<cr>";
options.desc = "Buffer Lines";
desc = "Buffer Lines";
}
{
key = "<leader>st";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.todo_comments()<cr>";
options.desc = "Todos";
desc = "Todos";
}
{
key = "<leader>sB";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.grep_buffers()<cr>";
options.desc = "Grep Open Buffers";
desc = "Grep Open Buffers";
}
{
key = "<leader>sg";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.grep()<cr>";
options.desc = "Grep";
desc = "Grep";
}
{
key = "<leader>sw";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.grep_word()<cr>";
options.desc = "Visual selection or word";
desc = "Visual selection or word";
}
{
key = "<leader>sr";
mode = "n";
silent = true;
action = "<cmd>nohlsearch<cr>";
options.desc = "Reset search";
desc = "Reset search";
}
# LSP
{
key = "gd";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.lsp_definitions()<cr>";
options.desc = "Goto Definition";
desc = "Goto Definition";
}
{
key = "gD";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.lsp_declarations()<cr>";
options.desc = "Goto Declaration";
desc = "Goto Declaration";
}
{
key = "gr";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.lsp_references()<cr>";
options.desc = "References";
options.nowait = true;
desc = "References";
nowait = true;
}
{
key = "gI";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.lsp_implementations()<cr>";
options.desc = "Goto Implementation";
desc = "Goto Implementation";
}
{
key = "gy";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.lsp_type_definitions()<cr>";
options.desc = "Goto Type Definition";
desc = "Goto Type Definition";
}
{
key = "<leader>ss";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.lsp_symbols()<cr>";
options.desc = "LSP Symbols";
desc = "LSP Symbols";
}
{
key = "<leader>sS";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.lsp_workspace_symbols()<cr>";
options.desc = "LSP Workspace Symbols";
desc = "LSP Workspace Symbols";
}
];
};
+26
View File
@@ -0,0 +1,26 @@
{pkgs, ...}: {
home.packages = with pkgs; [
imagemagick
tree-sitter
ghostscript
tectonic
mermaid-cli
];
programs.nvf.settings.vim.utility.snacks-nvim = {
enable = true;
setupOpts = {
image = {
enabled = true;
doc = {
inline = false;
float = true;
};
};
quickfile.enabled = true;
statuscolumn.enabled = true;
zen.enabled = true;
bufdelete.enabled = true;
gitsigns.enabled = true;
};
};
}
+52
View File
@@ -0,0 +1,52 @@
{pkgs, ...}: {
programs.nvf.settings.vim = {
undoFile.enable = true;
utility = {
motion.flash-nvim.enable = true;
outline.aerial-nvim.enable = true;
};
tabline.nvimBufferline.enable = true;
notes.todo-comments.enable = true;
assistant.copilot = {
enable = true;
cmp.enable = true;
};
statusline.lualine.enable = true;
autocomplete = {
nvim-cmp = {
enable = true;
sources = {
buffer = "[Buffer]";
path = "[Path]";
};
sourcePlugins = [
pkgs.vimPlugins.cmp-cmdline
];
};
};
snippets.luasnip.enable = true;
ui = {
noice.enable = true;
colorizer.enable = true;
};
git = {
enable = true;
gitsigns.enable = true;
};
terminal.toggleterm = {
enable = true;
lazygit = {
enable = true;
mappings.open = "<leader>gl";
};
};
visuals = {
rainbow-delimiters.enable = true;
nvim-scrollbar = {
enable = false;
};
};
};
}
-46
View File
@@ -1,46 +0,0 @@
{
programs.nixvim = {
autoGroups = {
highlightyank.clear = true;
q_close_windows.clear = true;
};
autoCmd = [
# highlightyank
# https://github.com/AstroNvim/AstroNvim/blob/v4.7.7/lua/astronvim/plugins/_astrocore_autocmds.lua#L206-L211
{
desc = "Highlight yanked text";
event = "TextYankPost";
group = "highlightyank";
pattern = "*";
callback.__raw = ''
function()
vim.highlight.on_yank()
end
'';
}
# q_close_windows
# https://github.com/AstroNvim/AstroNvim/blob/v4.7.7/lua/astronvim/plugins/_astrocore_autocmds.lua#L242-L255
{
desc = "Make q close help, man, quickfix, dap floats";
event = "BufWinEnter";
group = "q_close_windows";
callback.__raw = ''
function(event)
if vim.tbl_contains({ "help", "nofile", "quickfix" }, vim.bo[event.buf].buftype) then
vim.keymap.set("n", "q", "<Cmd>close<CR>", {
desc = "Close window",
buffer = event.buf,
silent = true,
nowait = true,
})
end
end
'';
}
];
};
}
-22
View File
@@ -1,22 +0,0 @@
# Nixvim is a NixOS module that installs and configures Neovim
{ inputs, ... }: {
imports = [
inputs.nixvim.homeManagerModules.nixvim
./plugins/cmp.nix
./plugins/floaterm.nix
./plugins/git.nix
./plugins/lsp.nix
./plugins/markdown.nix
./plugins/mini.nix
./plugins/picker.nix
./plugins/snacks.nix
./plugins/trouble.nix
./plugins/utils.nix
./options.nix
./keymaps.nix
./autocmds.nix
];
programs.nixvim.enable = true;
}
-156
View File
@@ -1,156 +0,0 @@
{
programs.nixvim = {
plugins.which-key = {
enable = true;
settings = {
delay = 600;
icons = {
breadcrumb = "»";
group = "+";
separator = ""; # ➜
mappings = false;
};
spec = [
# General Mappings
{
__unkeyed-1 = "<leader>u";
mode = "n";
group = "+ui";
}
{
__unkeyed-1 = "<leader>w";
mode = "n";
group = "+windows";
}
{
__unkeyed-1 = "<leader>c";
mode = "n";
group = "+code";
}
];
win = {
border = "rounded";
wo.winblend = 0;
};
};
};
keymaps = [
# General Mappings
{
key = "s";
action = "<cmd>lua require('flash').jump()<cr>";
options.desc = "Flash";
}
{
key = "K";
action = "<cmd>lua vim.lsp.buf.hover()<cr>";
options.desc = "LSP Hover";
}
{
key = "<C-tab>";
action = "<cmd>bnext<cr>";
options.desc = "Next Buffer";
}
# Tmux
{
key = "<C-h>";
action = "<cmd>TmuxNavigateLeft<cr>";
}
{
key = "<C-j>";
action = "<cmd>TmuxNavigateDown<cr>";
}
{
key = "<C-k>";
action = "<cmd>TmuxNavigateUp<cr>";
}
{
key = "<C-l>";
action = "<cmd>TmuxNavigateRight<cr>";
}
# Disable Arrow Keys in Normal Mode
{
key = "<Up>";
action = "<Nop>";
options.desc = "Disable Up Arrow";
}
{
key = "<Down>";
action = "<Nop>";
options.desc = "Disable Down Arrow";
}
{
key = "<Left>";
action = "<Nop>";
options.desc = "Disable Left Arrow";
}
{
key = "<Right>";
action = "<Nop>";
options.desc = "Disable Right Arrow";
}
# UI
{
key = "<leader>uw";
action = "<cmd>set wrap!<cr>";
options.desc = "Toggle word wrapping";
}
{
key = "<leader>ul";
action = "<cmd>set linebreak!<cr>";
options.desc = "Toggle linebreak";
}
{
key = "<leader>us";
action = "<cmd>set spell!<cr>";
options.desc = "Toggle spellLazyGitcheck";
}
{
key = "<leader>uc";
action = "<cmd>set cursorline!<cr>";
options.desc = "Toggle cursorline";
}
{
key = "<leader>un";
action = "<cmd>set number!<cr>";
options.desc = "Toggle line numbers";
}
{
key = "<leader>ur";
action = "<cmd>set relativenumber!<cr>";
options.desc = "Toggle relative line numbers";
}
{
key = "<leader>ut";
action = "<cmd>set showtabline=2<cr>";
options.desc = "Show tabline";
}
{
key = "<leader>uT";
action = "<cmd>set showtabline=0<cr>";
options.desc = "Hide tabline";
}
# Windows
{
key = "<leader>ws";
action = "<cmd>split<cr>";
options.desc = "Split";
}
{
key = "<leader>wv";
action = "<cmd>vsplit<cr>";
options.desc = "VSplit";
}
{
key = "<leader>wd";
action = "<cmd>close<cr>";
options.desc = "Close";
}
];
};
}
-141
View File
@@ -1,141 +0,0 @@
{
programs.nixvim = {
globals.mapleader = " ";
diagnostics = {
virtual_text = true;
virtual_improved = { current_line = "only"; };
};
opts = {
autoindent = true;
smartindent = true;
incsearch = true;
hlsearch = true;
wildmode = "list:longest";
scrolloff = 8;
swapfile = false;
conceallevel = 3;
clipboard = "unnamed,unnamedplus";
# Don't stop backspace at insert
backspace.__raw = ''
vim.list_extend(vim.opt.backspace:get(), { "nostop" })
'';
# Keep visual indentation on wrapped lines
breakindent = true;
# Hide command line unless needed
cmdheight = 0;
# Insert mode completion options
completeopt = [ "menu" "menuone" "noselect" ];
# Raise a dialog asking if you wish to save the current file(s)
confirm = true;
# Copy previous indentation on autoindenting
copyindent = true;
# Highlight current line
cursorline = true;
# Expand <Tab> to spaces
expandtab = true;
# Disable `~` on nonexistent lines
fillchars = { eob = " "; };
# Enable fold with all code unfolded
foldcolumn = "1";
foldenable = true;
foldlevel = 99;
foldlevelstart = 99;
# Ignore case in search patterns
ignorecase = true;
# Show substitution preview in split window
inccommand = "split";
# Infer casing on word completion
infercase = true;
# Global statusline
laststatus = 3;
# Wrap lines at 'breakat'
linebreak = true;
# Enable mouse support
mouse = "a";
# Show line numbers
number = true;
# Preserve indentation as much as possible
preserveindent = true;
# Height of the popup menu
pumheight = 10;
# Display line numbers relative to current line
relativenumber = true;
# Minimal number of lines to keep around the cursor
# This has the effect to move the view along with current line
#scrolloff = 999;
# Number of spaces to use for indentation
shiftwidth = 2;
# Disable showing modes in command line
showmode = false;
# Always show tabline
showtabline = 2;
# Show signs column
signcolumn = "yes";
# Override ignorecase if search pattern contains uppercase characters
smartcase = true;
# Number of spaces input on <Tab>
softtabstop = 2;
# Open horizontal split below (:split)
splitbelow = true;
# Open vertical split to the right (:vsplit)
splitright = true;
# Number of spaces to represent a <Tab>
tabstop = 2;
# Enables 24-bit RGB color
termguicolors = true;
# Shorter timeout duration
timeoutlen = 500;
# Set window title to the filename
title = true;
# Save undo history to undo file (in $XDG_STATE_HOME/nvim/undo)
undofile = true;
# Enable virtual edit in visual block mode
# This has the effect of selecting empty cells beyond lines boundaries
virtualedit = "block";
# Disable line wrapping
wrap = false;
# Disable making a backup before overwriting a file
writebackup = false;
};
};
}
-117
View File
@@ -1,117 +0,0 @@
{
programs.nixvim.plugins = {
luasnip.enable = true;
cmp-buffer = { enable = true; };
cmp-emoji = { enable = true; };
cmp-nvim-lsp = { enable = true; };
cmp-path = { enable = true; };
cmp_luasnip = { enable = true; };
cmp = {
enable = true;
settings = {
snippet.expand =
"function(args) require('luasnip').lsp_expand(args.body) end";
sources = [
{ name = "nvim_lsp"; }
{ name = "luasnip"; }
{
name = "buffer";
option.get_bufnrs.__raw = "vim.api.nvim_list_bufs";
}
{ name = "nvim_lua"; }
{ name = "mkdnflow"; }
{ name = "render-markdown"; }
{ name = "path"; }
];
formatting = {
fields = [ "abbr" "kind" "menu" ];
format =
# lua
''
function(_, item)
local icons = {
Namespace = "󰌗",
Text = "󰉿",
Method = "󰆧",
Function = "󰆧",
Constructor = "",
Field = "󰜢",
Variable = "󰀫",
Class = "󰠱",
Interface = "",
Module = "",
Property = "󰜢",
Unit = "󰑭",
Value = "󰎠",
Enum = "",
Keyword = "󰌋",
Snippet = "",
Color = "󰏘",
File = "󰈚",
Reference = "󰈇",
Folder = "󰉋",
EnumMember = "",
Constant = "󰏿",
Struct = "󰙅",
Event = "",
Operator = "󰆕",
TypeParameter = "󰊄",
Table = "",
Object = "󰅩",
Tag = "",
Array = "[]",
Boolean = "",
Number = "",
Null = "󰟢",
String = "󰉿",
Calendar = "",
Watch = "󰥔",
Package = "",
Copilot = "",
Codeium = "",
TabNine = "",
}
local icon = icons[item.kind] or ""
item.kind = string.format("%s %s", icon, item.kind or "")
return item
end
'';
};
window = {
completion = {
winhighlight =
"FloatBorder:CmpBorder,Normal:CmpPmenu,Search:PmenuSel";
scrollbar = false;
sidePadding = 0;
border = [ "" "" "" "" "" "" "" "" ];
};
documentation = {
border = [ "" "" "" "" "" "" "" "" ];
winhighlight =
"FloatBorder:CmpBorder,Normal:CmpPmenu,Search:PmenuSel";
};
};
mapping = {
"<C-n>" = "cmp.mapping.select_next_item()";
"<C-p>" = "cmp.mapping.select_prev_item()";
"<Down>" = "cmp.mapping.select_next_item()";
"<Up>" = "cmp.mapping.select_prev_item()";
"<C-j>" = "cmp.mapping.select_next_item()";
"<C-k>" = "cmp.mapping.select_prev_item()";
"<C-d>" = "cmp.mapping.scroll_docs(-4)";
"<C-f>" = "cmp.mapping.scroll_docs(4)";
"<C-Space>" = "cmp.mapping.complete()";
"<C-e>" = "cmp.mapping.close()";
"<CR>" =
"cmp.mapping.confirm({ behavior = cmp.ConfirmBehavior.Insert, select = true })";
};
};
};
};
}
-13
View File
@@ -1,13 +0,0 @@
{ config, ... }: {
programs.nixvim = {
plugins.floaterm.enable = true;
highlightOverride = {
FloatermBorder.fg = "#${config.lib.stylix.colors.base01}";
};
keymaps = [{
key = "<leader>cn";
action = "<cmd>FloatermNew --title=nixy nixy || sleep 10<cr>";
options.desc = "Nixy";
}];
};
}
-13
View File
@@ -1,13 +0,0 @@
{
programs.nixvim = {
plugins = {
gitsigns.enable = true;
snacks.settings = { lazygit.enable = true; };
};
keymaps = [{
key = "<leader>gl";
action = "<cmd>lua Snacks.lazygit()<cr>";
options.desc = "LazyGit";
}];
};
}
-39
View File
@@ -1,39 +0,0 @@
{
programs.nixvim.plugins = {
lsp-format.enable = true;
lsp = {
enable = true;
inlayHints = true;
servers = {
bashls.enable = true;
gopls.enable = true;
ts_ls.enable = true;
nixd.enable = true;
tailwindcss.enable = true;
html.enable = true;
svelte.enable = true;
};
};
none-ls = {
enable = true;
sources = {
completion = { luasnip.enable = true; };
diagnostics = {
golangci_lint.enable = true;
statix.enable = true;
};
formatting = {
gofmt.enable = true;
goimports.enable = true;
nixfmt.enable = true;
markdownlint.enable = true;
tidy.enable = true;
shellharden.enable = true;
shfmt.enable = true;
golines.enable = true;
gofumpt.enable = true;
};
};
};
};
}
-34
View File
@@ -1,34 +0,0 @@
{ config, ... }:
let
accent = "#${config.lib.stylix.colors.base0D}";
muted = "#${config.lib.stylix.colors.base03}";
in {
programs.nixvim = {
extraFiles."after/ftplugin/markdown.lua".text = ''
vim.bo.tabstop = 2
vim.bo.shiftwidth = 2
vim.bo.expandtab = true
vim.wo.cursorline = false
'';
# Plugins
plugins = {
# Render UI elements
render-markdown = {
enable = true;
settings = { completions.lsp.enabled = true; };
};
mkdnflow = {
enable = true;
mappings = {
MkdnTableNextCell = {
key = "<S-Tab>";
modes = "i";
};
MkdnTablePrevCell = false;
};
};
};
};
}
-22
View File
@@ -1,22 +0,0 @@
{ config, ... }: {
programs.nixvim = {
plugins.mini = {
enable = true;
mockDevIcons = true;
modules = {
icons = { };
# TODO: Learn how to use this
bracketed = { };
git = { };
diff = { };
starter = { };
pairs = { };
notify = { lsp_progress.enable = false; };
indentscope = { };
cursorword = { };
comment = { };
starter = { };
};
};
};
}
-40
View File
@@ -1,40 +0,0 @@
{
programs.nixvim = {
plugins.snacks = {
enable = true;
settings = {
image = {
enable = true;
doc = { inline = false; };
};
quickfile.enable = true;
statuscolumn.enable = true;
zen.enable = true;
bufdelete.enable = true;
};
};
keymaps = [
{
key = "<leader>uz";
action = "<cmd>lua Snacks.zen()<cr>";
options.desc = "Zen";
}
{
key = "<leader>ud";
action = "<cmd>lua Snacks.dim.enable()<cr>";
options.desc = "Dim";
}
{
key = "<leader>uD";
action = "<cmd>lua Snacks.dim.disable()<cr>";
options.desc = "Undim";
}
{
key = "<leader>wc";
action = "<cmd>lua Snacks.bufdelete.all()<cr>";
options.desc = "Close all buffers";
}
];
};
}
-46
View File
@@ -1,46 +0,0 @@
{ pkgs, ... }: {
home.packages = with pkgs; [ ctags ];
programs.nixvim = {
plugins = {
trouble.enable = true;
which-key.settings.spec = [{
__unkeyed-1 = "<leader>t";
mode = "n";
group = "+trouble";
}];
};
keymaps = [
{
key = "<leader>tx";
action = "<cmd>Trouble diagnostics toggle<cr>";
options.desc = "Diagnostics (Trouble)";
}
{
key = "<leader>tX";
action = "<cmd>Trouble diagnostics toggle filter.buf=0<cr>";
options.desc = "Buffer Diagnostics (Trouble)";
}
{
key = "<leader>ts";
action = "<cmd>Trouble symbols toggle focus=false<cr>";
options.desc = "Symbols (Trouble)";
}
{
key = "<leader>tl";
action = "<cmd>Trouble lsp toggle focus=false win.position=right<cr>";
options.desc = "LSP Definitions / references / ... (Trouble)";
}
{
key = "<leader>tL";
action = "<cmd>Trouble loclist toggle<cr>";
options.desc = "Location List (Trouble)";
}
{
key = "<leader>tQ";
action = "<cmd>Trouble qflist toggle<cr>";
options.desc = "Quickfix List (Trouble)";
}
];
};
}
-37
View File
@@ -1,37 +0,0 @@
{ config, lib, pkgs, ... }: {
programs.nixvim = {
nixpkgs.config.allowUnfree = true; # For copilot
highlightOverride = {
WhichKeySeparator.bg = "#${config.lib.stylix.colors.base00}";
};
plugins = {
bufferline.enable = true;
copilot-vim = {
enable = true;
# FIXME: Temp issue solving
settings.node_command = lib.getExe pkgs.nodejs_20;
};
flash.enable = true;
tmux-navigator.enable = true;
todo-comments.enable = true;
lualine = { enable = true; };
aerial.enable = true;
treesitter = {
enable = true;
nixGrammars = true;
settings = {
ensure_installed = "all";
indent.enable = true;
highlight.enable = true;
};
};
};
keymaps = [
{
key = "<leader>ct";
action = "<cmd>AerialToggle<cr>";
options.desc = "Aerial (tags)";
}
];
};
}
+5
View File
@@ -0,0 +1,5 @@
{
wayland.windowManager.hyprland.settings.exec-once = [
"protonvpn-app --start-minimized &"
];
}
+35
View File
@@ -0,0 +1,35 @@
{pkgs, ...}: {
home.packages = with pkgs; [
proton-vpn
proton-pass
proton-authenticator
];
# Fix Proton Authenticator desktop entry
xdg.desktopEntries = {
"Proton Authenticator" = {
name = "Proton Authenticator";
exec = "env WEBKIT_DISABLE_COMPOSITING_MODE=1 ${pkgs.proton-authenticator}/bin/proton-authenticator";
icon = "proton-authenticator";
type = "Application";
categories = ["Utility"];
terminal = false;
};
"Proton Calendar" = {
name = "Proton Calendar";
exec = "${pkgs.qutebrowser}/bin/qutebrowser \"https://calendar.proton.me\"";
icon = "proton-calendar";
type = "Application";
categories = ["Utility"];
terminal = false;
};
"Proton Mail" = {
name = "Proton Mail";
exec = "${pkgs.qutebrowser}/bin/qutebrowser \"https://mail.proton.me/\"";
icon = "proton-mail";
type = "Application";
categories = ["Utility"];
terminal = false;
};
};
}
@@ -0,0 +1,488 @@
{
config,
lib,
pkgs,
...
}: let
bookmarkList =
(import ./general.nix)
++ (import ./tools.nix)
++ (import ./social.nix)
++ (import ./infosec.nix)
++ (import ./other.nix)
++ (import ./jack.nix);
c = config.lib.stylix.colors;
stripProtocol = url:
lib.removePrefix "https://" (lib.removePrefix "http://" url);
stripDomain = url:
builtins.head (
lib.splitString "/" (stripProtocol url)
);
mkCard = item: let
domain = stripDomain item.url;
initial = builtins.substring 0 1 item.name;
in ''
<a href="${item.url}" class="card">
<div class="favicon-wrapper">
<img class="favicon" src="https://icons.duckduckgo.com/ip3/${domain}.ico" alt="" aria-hidden="true" loading="lazy" onerror="this.style.display='none';this.nextElementSibling.style.display='flex'">
<span class="favicon-fallback" style="display:none">${initial}</span>
</div>
<div class="card-info">
<span class="card-name">${item.name}</span>
<span class="card-url">${stripProtocol item.url}</span>
</div>
</a>'';
mkFolderContent = items: let
step = acc: item:
if item ? url
then acc // {pending = acc.pending ++ [item];}
else {
chunks =
acc.chunks
++ lib.optional (acc.pending != []) {
isCards = true;
items = acc.pending;
}
++ [
{
isCards = false;
folder = item;
}
];
pending = [];
};
result =
lib.foldl' step {
chunks = [];
pending = [];
}
items;
chunks =
result.chunks
++ lib.optional (result.pending != []) {
isCards = true;
items = result.pending;
};
in
lib.concatMapStrings (chunk:
if chunk.isCards
then ''
<div class="cards">
${lib.concatMapStrings mkCard chunk.items}
</div>''
else mkFolder chunk.folder)
chunks;
mkFolder = folder: let
iconHtml =
if folder ? icon
then ''<span class="material-symbols-outlined folder-icon" aria-hidden="true">${folder.icon}</span>''
else "";
in ''
<details class="folder-section" open>
<summary class="folder-title">
${iconHtml}<span class="folder-name">${folder.name}</span>
<svg class="chevron" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="6 9 12 15 18 9"/></svg>
</summary>
<div class="folder-content">
${mkFolderContent folder.bookmarks}
</div>
</details>'';
grouped = let
step = acc: item:
if item ? url
then acc // {pending = acc.pending ++ [item];}
else {
groups =
acc.groups
++ lib.optional (acc.pending != []) {
isRoot = true;
items = acc.pending;
}
++ [
{
isRoot = false;
inherit item;
}
];
pending = [];
};
result =
lib.foldl' step {
groups = [];
pending = [];
}
bookmarkList;
in
result.groups
++ lib.optional (result.pending != []) {
isRoot = true;
items = result.pending;
};
mkSection = group:
if group.isRoot
then ''
<div class="root-section">
<div class="cards">
${lib.concatMapStrings mkCard group.items}
</div>
</div>''
else mkFolder group.item;
collectBookmarks = prefix: items:
lib.concatMapStrings (
item:
if item ? url
then "${item.url} ${prefix}${item.name}\n"
else collectBookmarks "${prefix}${item.name}/" item.bookmarks
)
items;
publicBookmarks =
pkgs.writeText "qutebrowser-public-bookmarks"
(collectBookmarks "" bookmarkList);
in {
config = {
xdg.dataFile."qutebrowser/bookmarks.html".text = ''
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Bookmarks</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20,300,0,0">
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
body {
background-color: #${c.base00};
color: #${c.base05};
font-family: 'Source Sans Pro', sans-serif;
font-size: 14px;
min-height: 100vh;
padding: 2.5rem 2rem;
}
.header {
max-width: 1100px;
margin: 0 auto 2rem;
display: flex;
align-items: center;
gap: 1.5rem;
}
.page-title {
font-size: 1.3rem;
font-weight: 700;
color: #${c.base0D};
letter-spacing: -0.01em;
flex-shrink: 0;
}
.search-bar {
flex: 1;
background-color: #${c.base01};
border: 1px solid #${c.base02};
border-radius: 8px;
color: #${c.base05};
font-family: 'Source Sans Pro', sans-serif;
font-size: 0.9rem;
padding: 0.5rem 0.9rem;
outline: none;
transition: border-color 0.15s ease;
}
.search-bar::placeholder { color: #${c.base03}; }
.search-bar:focus { border-color: #${c.base0D}; }
.collapse-btn {
flex-shrink: 0;
background: none;
border: 1px solid #${c.base02};
border-radius: 8px;
color: #${c.base03};
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
padding: 0.47rem;
transition: color 0.15s ease, border-color 0.15s ease;
}
.collapse-btn:hover {
color: #${c.base0D};
border-color: #${c.base0D};
}
.collapse-btn svg {
width: 16px;
height: 16px;
}
.bookmarks-container {
max-width: 1100px;
margin: 0 auto;
display: flex;
flex-direction: column;
gap: 0.75rem;
}
.root-section {
margin-bottom: 1rem;
}
details.folder-section {
border-radius: 8px;
}
details.folder-section > summary {
list-style: none;
cursor: pointer;
display: flex;
align-items: center;
gap: 0.5rem;
padding: 0.45rem 0.5rem;
border-radius: 8px;
user-select: none;
transition: background-color 0.12s ease;
}
details.folder-section > summary::-webkit-details-marker { display: none; }
details.folder-section > summary:hover {
background-color: #${c.base01};
color: #${c.base0D};
}
details.folder-section > summary:hover .folder-name {
color: #${c.base0D};
}
details.folder-section > summary:hover .folder-icon {
color: #${c.base0D};
}
.folder-icon {
font-size: 14px;
line-height: 1;
flex-shrink: 0;
color: #${c.base04};
user-select: none;
}
.folder-name {
font-size: 0.72rem;
font-weight: 700;
letter-spacing: 0.12em;
text-transform: uppercase;
color: #${c.base03};
flex: 1;
}
.chevron {
width: 13px;
height: 13px;
color: #${c.base03};
transition: transform 0.2s ease;
flex-shrink: 0;
}
details[open] > summary > .chevron {
transform: rotate(180deg);
}
.folder-content {
padding: 0.4rem 0 0.5rem 0;
display: flex;
flex-direction: column;
gap: 0.25rem;
}
.folder-content > details.folder-section > summary {
padding-left: 1.2rem;
}
.folder-content > details.folder-section > .folder-content {
padding-left: 1rem;
}
.cards {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
gap: 0.4rem;
}
.card {
display: flex;
align-items: center;
gap: 0.7rem;
padding: 0.6rem 0.8rem;
background-color: #${c.base01};
border: 1px solid #${c.base02};
border-radius: 10px;
text-decoration: none;
transition: background-color 0.12s ease, border-color 0.12s ease;
overflow: hidden;
}
.card:hover {
background-color: #${c.base02};
border-color: #${c.base0D};
}
.favicon-wrapper { position: relative; width: 18px; height: 18px; flex-shrink: 0; }
.favicon {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
object-fit: contain;
border-radius: 3px;
}
.favicon-fallback {
position: absolute;
inset: 0;
display: flex;
align-items: center;
justify-content: center;
background-color: #${c.base02};
border-radius: 4px;
color: #${c.base04};
font-size: 10px;
font-weight: 700;
text-transform: uppercase;
user-select: none;
}
.card-info {
display: flex;
flex-direction: column;
gap: 0.05rem;
overflow: hidden;
flex: 1;
}
.card-name {
color: #${c.base05};
font-size: 0.86rem;
font-weight: 500;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
transition: color 0.12s ease;
}
.card:hover .card-name { color: #${c.base0D}; }
.card-url {
color: #${c.base03};
font-family: 'Maple Mono NF', monospace;
font-size: 0.7rem;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.no-results {
color: #${c.base03};
font-size: 0.9rem;
padding: 0.5rem 0.2rem;
display: none;
}
</style>
</head>
<body>
<div class="header">
<h1 class="page-title">Bookmarks</h1>
<input id="search" class="search-bar" type="text" placeholder="Search" autocomplete="off" spellcheck="false">
<button id="collapse-btn" class="collapse-btn" title="Collapse all folders" aria-label="Collapse all folders">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<polyline points="4 14 10 14 10 20"/><polyline points="20 10 14 10 14 4"/><line x1="10" y1="14" x2="3" y2="21"/><line x1="21" y1="3" x2="14" y2="10"/>
</svg>
</button>
</div>
<div class="bookmarks-container">
<p id="no-results" class="no-results">No results</p>
${lib.concatMapStrings mkSection grouped}
</div>
<script>
window.addEventListener('DOMContentLoaded', function () {
const input = document.getElementById('search');
const noResults = document.getElementById('no-results');
const collapseBtn = document.getElementById('collapse-btn');
input.focus();
collapseBtn.addEventListener('click', function () {
document.querySelectorAll('details.folder-section').forEach(function (d) {
d.open = false;
});
});
input.addEventListener('input', function () {
const query = this.value.toLowerCase().trim();
let anyVisible = false;
if (query) {
document.querySelectorAll('details.folder-section').forEach(function (d) {
d.open = true;
});
}
document.querySelectorAll('.folder-section, .root-section').forEach(function (section) {
let sectionVisible = false;
section.querySelectorAll('.card').forEach(function (card) {
const name = card.querySelector('.card-name').textContent.toLowerCase();
const url = card.querySelector('.card-url').textContent.toLowerCase();
const match = !query || name.includes(query) || url.includes(query);
card.style.display = match ? ''' : 'none';
if (match) { sectionVisible = true; anyVisible = true; }
});
section.style.display = sectionVisible ? ''' : 'none';
});
noResults.style.display = anyVisible || !query ? 'none' : 'block';
});
input.addEventListener('keydown', function (e) {
if (e.key === 'Enter') {
const val = this.value.trim();
const isUrl = /^https?:\/\//i.test(val) || /^[a-zA-Z0-9-]+(\.[a-zA-Z]{2,})(\/.*)?$/.test(val);
if (isUrl) {
location.href = /^https?:\/\//i.test(val) ? val : 'https://' + val;
} else {
const first = document.querySelector('.card:not([style*="none"])');
if (first) {
location.href = first.href;
} else {
const q = encodeURIComponent(val);
if (q) location.href = 'https://www.startpage.com/sp/search?q=' + q;
}
}
}
if (e.key === 'Escape') {
this.value = ''';
this.dispatchEvent(new Event('input'));
}
});
});
</script>
</body>
</html>
'';
home.activation.qutebrowserBookmarks = lib.hm.dag.entryAfter ["writeBoundary"] ''
mkdir -p ${config.home.homeDirectory}/.config/qutebrowser/bookmarks
cat ${publicBookmarks} > ${config.home.homeDirectory}/.config/qutebrowser/bookmarks/urls
'';
};
}
@@ -0,0 +1,22 @@
[
{
name = "Proton Mail";
url = "https://mail.proton.me";
}
{
name = "Proton Drive";
url = "https://drive.proton.me";
}
{
name = "Proton Lumo";
url = "https://lumo.proton.me";
}
{
name = "Proton Calendar";
url = "https://calendar.proton.me";
}
{
name = "Github";
url = "https://github.com";
}
]
@@ -0,0 +1,48 @@
[
{
name = "Infosec";
icon = "terminal";
bookmarks = [
{
name = "Nix 4 Cyber";
url = "https://n4c.hadi.icu";
}
{
name = "Cyberchef";
url = "https://cyberchef.hadi.icu";
}
{
name = "TryHackMe";
url = "https://tryhackme.com";
}
{
name = "Root-Me";
url = "https://root-me.org";
}
{
name = "Hack The Box";
url = "https://hackthebox.com";
}
{
name = "Iknowyou";
url = "https://iknowyou-prod.hadi.icu";
}
{
name = "Exploit-DB";
url = "https://exploit-db.com";
}
{
name = "GTFOBins";
url = "https://gtfobins.org/";
}
{
name = "Crack Station";
url = "https://crackstation.net";
}
{
name = "Osint Tracker";
url = "https://app.osintracker.com";
}
];
}
]
@@ -0,0 +1,80 @@
[
{
name = "Jack";
icon = "dns";
bookmarks = [
{
name = "Glance";
url = "https://home.hadi.icu";
}
{
name = "Blog";
url = "https://hadi.icu";
}
{
name = "Gitea";
url = "https://git.hadi.icu";
}
{
name = "Mealie";
url = "https://mealie.hadi.icu";
}
{
name = "Wallpapers";
url = "https://wallpapers.hadi.icu";
}
{
name = "Default Creds";
url = "https://default-creds.hadi.icu";
}
{
name = "Media";
icon = "subscriptions";
bookmarks = [
{
name = "Radarr";
url = "https://radarr.hadi.icu";
}
{
name = "Sonarr";
url = "https://sonarr.hadi.icu";
}
{
name = "Bazarr";
url = "https://bazarr.hadi.icu";
}
{
name = "Prowlarr";
url = "https://prowlarr.hadi.icu";
}
{
name = "Transmission";
url = "https://transmission.hadi.icu";
}
];
}
{
name = "Infrastructure";
icon = "construction";
bookmarks = [
{
name = "AdGuard";
url = "https://adguard.hadi.icu";
}
{
name = "Umami";
url = "https://umami.hadi.icu";
}
{
name = "Cloudflare";
url = "https://dash.cloudflare.com";
}
{
name = "Cloudflare Zero Trust";
url = "https://one.dash.cloudflare.com";
}
];
}
];
}
]
@@ -0,0 +1,46 @@
[
{
name = "Other";
icon = "category";
bookmarks = [
{
name = "Documentation";
icon = "menu_book";
bookmarks = [
{
name = "Hyprland Wiki";
url = "https://wiki.hypr.land";
}
{
name = "Stylix Wiki";
url = "https://nix-community.github.io/stylix/";
}
{
name = "Nixpkgs";
url = "https://github.com/NixOS/nixpkgs";
}
{
name = "tldr";
url = "https://tldr.inbrowser.app/";
}
];
}
{
name = "Startpage Config";
url = "https://www.startpage.com/do/mypage.pl?prfe=45d331deb05471d659dba933e7400df51d952bb103da6f6125c0e769a6be1d65610456a479f495ceeee7e97311cf227d7c1bb198de0ceeb193d8cddf9c455c19a409cc35c3e3f542ee27bd7cecd3";
}
{
name = "Feedly";
url = "https://feedly.com";
}
{
name = "MyNixOS";
url = "https://mynixos.com";
}
{
name = "Amazon";
url = "https://amazon.fr";
}
];
}
]
@@ -0,0 +1,50 @@
[
{
name = "Entertainment";
icon = "movie";
bookmarks = [
{
name = "Youtube";
url = "https://youtube.com";
}
{
name = "Jellyfin";
url = "https://media.hadi.icu";
}
{
name = "Seerr";
url = "https://demandemedia.hadi.icu";
}
{
name = "Social Media";
icon = "group";
bookmarks = [
{
name = "Medium";
url = "https://medium.com";
}
{
name = "Bluesky";
url = "https://bsky.app";
}
{
name = "Reddit";
url = "https://reddit.com";
}
{
name = "Instagram";
url = "https://instagram.com";
}
{
name = "Discord";
url = "https://discord.com/channels/@me/";
}
{
name = "Gitlab";
url = "https://gitlab.com/";
}
];
}
];
}
]
@@ -0,0 +1,48 @@
[
{
name = "Tools";
icon = "handyman";
bookmarks = [
{
name = "Maps";
url = "https://maps.apple.com";
}
{
name = "Excalidraw";
url = "https://excalidraw.com";
}
{
name = "Cobalt (downloader)";
url = "https://cobalt.meowing.de";
}
{
name = "Mazanoke (image)";
url = "https://mazanoke.hadi.icu";
}
{
name = "Vert";
url = "https://vert.sh";
}
{
name = "Markdown to PDF";
url = "https://md2file.com";
}
{
name = "Image to Vector";
url = "https://www.vectorcascade.com/";
}
{
name = "PrivateBin";
url = "https://privatebin.net";
}
{
name = "Claude";
url = "https://claude.ai";
}
{
name = "Gemini";
url = "https://gemini.google.com";
}
];
}
]
+28 -248
View File
@@ -1,257 +1,37 @@
# Qutebrowser is a keyboard-focused browser with a minimal GUI.
# My homepage is generated using https://github.com/anotherhadi/homepage
{ pkgs, config, ... }:
let
accent = "#${config.lib.stylix.colors.base0D}";
background = "#${config.lib.stylix.colors.base00}";
foreground = "#${config.lib.stylix.colors.base05}";
muted = "#${config.lib.stylix.colors.base03}";
{...}: {
imports = [
./bookmarks
./search.nix
./keybindings.nix
./settings.nix
./userscripts.nix
];
settings = ''
{
"config": {
"title" : "Welcome Home",
"openLinksInNewTab": false,
"locale": "fr-FR",
"colors": {
"primary": "${accent}",
"background": "${background}",
"foreground": "${foreground}",
"muted": "#${muted}"
},
"folders": [
{
"name": "Bookmarks",
"links": [
{"title": "MyNixOs", "url": "https://mynixos.com", "icon": "󱄅"},
{"title": "Github", "url": "https://github.com", "icon": ""},
{"title": "Proton", "url": "https://mail.proton.me/u/0/inbox", "icon": ""},
{"title": "Cloudflare One", "url": "https://one.dash.cloudflare.com/", "icon": ""},
{"title": "Chat GPT", "url": "https://chat.openai.com/", "icon": "󰭹"},
{"title": "Nixvim", "url": "https://nix-community.github.io/nixvim/", "icon": ""},
{"title": "Hyprland Wiki", "url": "https://wiki.hyprland.org/", "icon": "󰖬"},
{"title": "Youtube", "url": "https://youtube.com", "icon": "󰗃"},
{"title": "Figma", "url": "https://figma.com", "icon": ""},
{"title": "Server", "url": "https://home.anotherhadi.com", "icon": ""}
]
},
{
"name": "Work",
"links": [
{"title": "Outlook", "url": "https://outlook.office.com/mail/", "icon": "󰴢"},
{"title": "Office", "url": "https://www.office.com/?auth=2", "icon": "󰏆"},
{"title": "Teams", "url": "https://teams.microsoft.com/_", "icon": "󰊻"}
]
}
]
}
}
'';
homepage = pkgs.buildNpmPackage {
pname = "homepage";
version = "0.0.0";
src = pkgs.fetchFromGitHub {
owner = "anotherhadi";
repo = "homepage";
rev = "b77d35ed3596eb451bd2ec78063d7cc6e73c773d";
hash = "sha256-j/40922kfAh6zqJ4IRYpr66YXNNYsxuXwZ0aiJFJea0=";
};
# npmDepsHash = lib.fakeHash;
npmDepsHash = "sha256-bG+CHTq2Rst3JMxsjAC81KhK+G7WwsTVD1eyP87g0z4=";
buildPhase = ''
npm install
cp ${
pkgs.writeText "src/routes/config.json" settings
} src/routes/config.json
npm run build
mkdir $out
mv build $out
'';
meta = {
description = "homepage";
homepage = "https://github.com/anotherhadi/homepage";
};
home.sessionVariables = {
DEFAULT_BROWSER = "qutebrowser";
BROWSER = "qutebrowser";
};
in {
xdg.mimeApps.defaultApplications = {
"text/html" = ["org.qutebrowser.qutebrowser.desktop"];
"text/xml" = ["org.qutebrowser.qutebrowser.desktop"];
"x-scheme-handler/http" = ["org.qutebrowser.qutebrowser.desktop"];
"x-scheme-handler/https" = ["org.qutebrowser.qutebrowser.desktop"];
"x-scheme-handler/unknown" = ["org.qutebrowser.qutebrowser.desktop"];
"x-scheme-handler/about" = ["org.qutebrowser.qutebrowser.desktop"];
"x-scheme-handler/qute" = ["org.qutebrowser.qutebrowser.desktop"];
};
imports = [ ../duckduckgo-colorscheme ];
xdg.desktopEntries.qutebrowser-private = {
name = "Qutebrowser (Temp session)";
genericName = "Web Browser";
exec = "qutebrowser --temp-basedir %U";
icon = "qutebrowser";
categories = ["Network" "WebBrowser"];
};
programs.qutebrowser = {
enable = true;
searchEngines = {
"DEFAULT" = "https://duckduckgo.com/?q={}&ia=web";
"d" = "https://duckduckgo.com/?q={}&ia=web";
"g" = "https://google.com/search?q={}";
"y" = "https://youtube.com/results?search_query={}";
"ya" = "https://yandex.com/search/?text={}";
"n" = "https://mynixos.com/search?q={}";
"nixo" = "https://search.nixos.org/options?channel=unstable&query={}";
"nixp" = "https://search.nixos.org/packages?channel=unstable&query={}";
"gt" = "https://github.com/search?q={}&type=repositories";
};
quickmarks = {
home = "${homepage}/build/index.html";
server = "https://home.anotherhadi.com";
jack = "https://home.anotherhadi.com";
mynixos = "https://mynixos.com";
github = "https://github.com";
outlook = "https://outlook.office.com/mail/";
office = "https://www.office.com/?auth=2";
teams = "https://teams.microsoft.com/_";
casa = "http://192.168.2.16:8081/#/";
proton = "https://mail.proton.me/u/0/inbox";
cloudflare-one = "https://one.dash.cloudflare.com/";
chatgpt = "https://chat.openai.com/";
nixvim = "https://nix-community.github.io/nixvim/";
hyprland = "https://wiki.hyprland.org/";
nerdfont = "https://www.nerdfonts.com/cheat-sheet";
youtube = "https://youtube.com/";
cloudflare = "https://dash.cloudflare.com/";
};
settings = {
url = {
default_page = "${homepage}/build/index.html";
start_pages = [ "${homepage}/build/index.html" ];
};
colors = {
webpage.preferred_color_scheme =
"dark"; # Enable dark mode for websites that support it
};
statusbar.show = "in-mode";
completion = {
height = "30%";
open_categories = [ "history" ];
scrollbar = {
padding = 0;
width = 0;
};
show = "always";
shrink = true;
timestamp_format = "";
web_history.max_items = 7;
};
content = {
autoplay = false;
javascript.clipboard = "access";
javascript.enabled = true;
webgl = true;
pdfjs = true;
};
downloads = {
position = "bottom";
remove_finished = 0;
};
hints = { radius = 1; };
scrolling = {
bar = "never";
smooth = true;
};
tabs = {
show = "multiple";
last_close = "close";
mode_on_change = "restore";
close_mouse_button = "right";
};
zoom.default = "100%";
qt.force_software_rendering = "chromium";
};
keyBindings = {
normal = {
"gh" = "open ${homepage}/build/index.html";
"gs" = "open https://home.anotherhadi.com";
" p" = "tab-move -";
" n" = "tab-move +";
" w" = "tab-close";
" 1" = "tab-focus 1";
" 2" = "tab-focus 2";
" 3" = "tab-focus 3";
" 4" = "tab-focus 4";
" 5" = "tab-focus 5";
" 6" = "tab-focus 6";
" 7" = "tab-focus 7";
" 8" = "tab-focus 8";
" 9" = "tab-focus 9";
" 0" = "tab-focus 10";
"<Ctrl-w>" = "tab-close";
"<Ctrl-n>" = "open -w";
"<Ctrl-1>" = "tab-focus 1";
"<Ctrl-2>" = "tab-focus 2";
"<Ctrl-3>" = "tab-focus 3";
"<Ctrl-4>" = "tab-focus 4";
"<Ctrl-5>" = "tab-focus 5";
"<Ctrl-6>" = "tab-focus 6";
"<Ctrl-7>" = "tab-focus 7";
"<Ctrl-8>" = "tab-focus 8";
"<Ctrl-9>" = "tab-focus 9";
"<Ctrl-0>" = "tab-focus 10";
};
command = {
"<Ctrl-w>" = "tab-close";
"<Ctrl-n>" = "open -w";
"<Ctrl-1>" = "tab-focus 1";
"<Ctrl-2>" = "tab-focus 2";
"<Ctrl-3>" = "tab-focus 3";
"<Ctrl-4>" = "tab-focus 4";
"<Ctrl-5>" = "tab-focus 5";
"<Ctrl-6>" = "tab-focus 6";
"<Ctrl-7>" = "tab-focus 7";
"<Ctrl-8>" = "tab-focus 8";
"<Ctrl-9>" = "tab-focus 9";
"<Ctrl-0>" = "tab-focus 10";
};
insert = {
"<Ctrl-w>" = "tab-close";
"<Ctrl-n>" = "open -w";
"<Ctrl-1>" = "tab-focus 1";
"<Ctrl-2>" = "tab-focus 2";
"<Ctrl-3>" = "tab-focus 3";
"<Ctrl-4>" = "tab-focus 4";
"<Ctrl-5>" = "tab-focus 5";
"<Ctrl-6>" = "tab-focus 6";
"<Ctrl-7>" = "tab-focus 7";
"<Ctrl-8>" = "tab-focus 8";
"<Ctrl-9>" = "tab-focus 9";
"<Ctrl-0>" = "tab-focus 10";
};
};
extraConfig = ''
config.unbind("gm")
config.unbind("gd")
config.unbind("gb")
config.unbind("tl")
config.unbind("gt")
c.tabs.padding = {"bottom": 6, "left": 7, "right": 7, "top": 6}
c.statusbar.padding = {"bottom": 6, "left": 7, "right": 7, "top": 6}
config.load_autoconfig(True)
'';
loadAutoconfig = true;
};
}
@@ -0,0 +1,826 @@
// ==UserScript==
// @name Don't track me Google
// @namespace Rob W
// @description Removes the annoying link-conversion at Google Search/maps/...
// @version 4.28
// @icon https://raw.githubusercontent.com/Rob--W/dont-track-me-google/master/icon48.png
// @supportURL https://github.com/Rob--W/dont-track-me-google/issues
// @license MIT
// @run-at document-start
// @match *://*.google.com/*
// @match *://*.google.ad/*
// @match *://*.google.ae/*
// @match *://*.google.com.af/*
// @match *://*.google.com.ag/*
// @match *://*.google.com.ai/*
// @match *://*.google.al/*
// @match *://*.google.am/*
// @match *://*.google.co.ao/*
// @match *://*.google.com.ar/*
// @match *://*.google.as/*
// @match *://*.google.at/*
// @match *://*.google.com.au/*
// @match *://*.google.az/*
// @match *://*.google.ba/*
// @match *://*.google.com.bd/*
// @match *://*.google.be/*
// @match *://*.google.bf/*
// @match *://*.google.bg/*
// @match *://*.google.com.bh/*
// @match *://*.google.bi/*
// @match *://*.google.bj/*
// @match *://*.google.com.bn/*
// @match *://*.google.com.bo/*
// @match *://*.google.com.br/*
// @match *://*.google.bs/*
// @match *://*.google.bt/*
// @match *://*.google.co.bw/*
// @match *://*.google.by/*
// @match *://*.google.com.bz/*
// @match *://*.google.ca/*
// @match *://*.google.cd/*
// @match *://*.google.cf/*
// @match *://*.google.cg/*
// @match *://*.google.ch/*
// @match *://*.google.ci/*
// @match *://*.google.co.ck/*
// @match *://*.google.cl/*
// @match *://*.google.cm/*
// @match *://*.google.cn/*
// @match *://*.google.com.co/*
// @match *://*.google.co.cr/*
// @match *://*.google.com.cu/*
// @match *://*.google.cv/*
// @match *://*.google.com.cy/*
// @match *://*.google.cz/*
// @match *://*.google.de/*
// @match *://*.google.dj/*
// @match *://*.google.dk/*
// @match *://*.google.dm/*
// @match *://*.google.com.do/*
// @match *://*.google.dz/*
// @match *://*.google.com.ec/*
// @match *://*.google.ee/*
// @match *://*.google.com.eg/*
// @match *://*.google.es/*
// @match *://*.google.com.et/*
// @match *://*.google.fi/*
// @match *://*.google.com.fj/*
// @match *://*.google.fm/*
// @match *://*.google.fr/*
// @match *://*.google.ga/*
// @match *://*.google.ge/*
// @match *://*.google.gg/*
// @match *://*.google.com.gh/*
// @match *://*.google.com.gi/*
// @match *://*.google.gl/*
// @match *://*.google.gm/*
// @match *://*.google.gp/*
// @match *://*.google.gr/*
// @match *://*.google.com.gt/*
// @match *://*.google.gy/*
// @match *://*.google.com.hk/*
// @match *://*.google.hn/*
// @match *://*.google.hr/*
// @match *://*.google.ht/*
// @match *://*.google.hu/*
// @match *://*.google.co.id/*
// @match *://*.google.ie/*
// @match *://*.google.co.il/*
// @match *://*.google.im/*
// @match *://*.google.co.in/*
// @match *://*.google.iq/*
// @match *://*.google.is/*
// @match *://*.google.it/*
// @match *://*.google.je/*
// @match *://*.google.com.jm/*
// @match *://*.google.jo/*
// @match *://*.google.co.jp/*
// @match *://*.google.co.ke/*
// @match *://*.google.com.kh/*
// @match *://*.google.ki/*
// @match *://*.google.kg/*
// @match *://*.google.co.kr/*
// @match *://*.google.com.kw/*
// @match *://*.google.kz/*
// @match *://*.google.la/*
// @match *://*.google.com.lb/*
// @match *://*.google.li/*
// @match *://*.google.lk/*
// @match *://*.google.co.ls/*
// @match *://*.google.lt/*
// @match *://*.google.lu/*
// @match *://*.google.lv/*
// @match *://*.google.com.ly/*
// @match *://*.google.co.ma/*
// @match *://*.google.md/*
// @match *://*.google.me/*
// @match *://*.google.mg/*
// @match *://*.google.mk/*
// @match *://*.google.ml/*
// @match *://*.google.com.mm/*
// @match *://*.google.mn/*
// @match *://*.google.ms/*
// @match *://*.google.com.mt/*
// @match *://*.google.mu/*
// @match *://*.google.mv/*
// @match *://*.google.mw/*
// @match *://*.google.com.mx/*
// @match *://*.google.com.my/*
// @match *://*.google.co.mz/*
// @match *://*.google.com.na/*
// @match *://*.google.com.nf/*
// @match *://*.google.com.ng/*
// @match *://*.google.com.ni/*
// @match *://*.google.ne/*
// @match *://*.google.nl/*
// @match *://*.google.no/*
// @match *://*.google.com.np/*
// @match *://*.google.nr/*
// @match *://*.google.nu/*
// @match *://*.google.co.nz/*
// @match *://*.google.com.om/*
// @match *://*.google.com.pa/*
// @match *://*.google.com.pe/*
// @match *://*.google.com.pg/*
// @match *://*.google.com.ph/*
// @match *://*.google.com.pk/*
// @match *://*.google.pl/*
// @match *://*.google.pn/*
// @match *://*.google.com.pr/*
// @match *://*.google.ps/*
// @match *://*.google.pt/*
// @match *://*.google.com.py/*
// @match *://*.google.com.qa/*
// @match *://*.google.ro/*
// @match *://*.google.ru/*
// @match *://*.google.rw/*
// @match *://*.google.com.sa/*
// @match *://*.google.com.sb/*
// @match *://*.google.sc/*
// @match *://*.google.se/*
// @match *://*.google.com.sg/*
// @match *://*.google.sh/*
// @match *://*.google.si/*
// @match *://*.google.sk/*
// @match *://*.google.com.sl/*
// @match *://*.google.sn/*
// @match *://*.google.so/*
// @match *://*.google.sm/*
// @match *://*.google.sr/*
// @match *://*.google.st/*
// @match *://*.google.com.sv/*
// @match *://*.google.td/*
// @match *://*.google.tg/*
// @match *://*.google.co.th/*
// @match *://*.google.com.tj/*
// @match *://*.google.tk/*
// @match *://*.google.tl/*
// @match *://*.google.tm/*
// @match *://*.google.tn/*
// @match *://*.google.to/*
// @match *://*.google.com.tr/*
// @match *://*.google.tt/*
// @match *://*.google.com.tw/*
// @match *://*.google.co.tz/*
// @match *://*.google.com.ua/*
// @match *://*.google.co.ug/*
// @match *://*.google.co.uk/*
// @match *://*.google.com.uy/*
// @match *://*.google.co.uz/*
// @match *://*.google.com.vc/*
// @match *://*.google.co.ve/*
// @match *://*.google.vg/*
// @match *://*.google.co.vi/*
// @match *://*.google.com.vn/*
// @match *://*.google.vu/*
// @match *://*.google.ws/*
// @match *://*.google.rs/*
// @match *://*.google.co.za/*
// @match *://*.google.co.zm/*
// @match *://*.google.co.zw/*
// @match *://*.google.cat/*
// @match *://*.google.ng/*
// @downloadURL https://update.greasyfork.org/scripts/428243/Don%27t%20track%20me%20Google.user.js
// @updateURL https://update.greasyfork.org/scripts/428243/Don%27t%20track%20me%20Google.meta.js
// ==/UserScript==
document.addEventListener('mousedown', handlePointerPress, true);
document.addEventListener('touchstart', handlePointerPress, true);
document.addEventListener('click', handleClick, true);
var scriptCspNonce;
var needsCspNonce = typeof browser !== 'undefined'; // Firefox.
var preferenceObservers = [];
setupAggresiveUglyLinkPreventer();
var forceNoReferrer = true;
var noping = true;
if (typeof chrome == 'object' && chrome.storage) {
(chrome.storage.sync || chrome.storage.local).get({
forceNoReferrer: true,
// From version 4.7 until 4.11, the preference was the literal value of
// the referrer policy.
referrerPolicy: 'no-referrer',
noping: true,
}, function(items) {
if (items) {
// Migration code (to be removed in the future).
if (items.referrerPolicy === '') {
// User explicitly allowed referrers to be sent, respect that.
items.forceNoReferrer = false;
}
forceNoReferrer = items.forceNoReferrer;
noping = items.noping;
callPreferenceObservers();
}
});
chrome.storage.onChanged.addListener(function(changes) {
if (changes.forceNoReferrer) {
forceNoReferrer = changes.forceNoReferrer.newValue;
}
if (changes.noping) {
noping = changes.noping.newValue;
}
callPreferenceObservers();
});
}
function callImmediatelyAndOnPreferenceUpdate(callback) {
callback();
preferenceObservers.push(callback);
}
function callPreferenceObservers() {
// This method is usually once, and occasionally more than once if the user
// changes a preference. For simplicity we don't check whether a pref was
// changed before calling a callback - these are cheap anyway.
preferenceObservers.forEach(function(callback) {
callback();
});
}
function getReferrerPolicy() {
return forceNoReferrer ? 'origin' : '';
}
function updateReferrerPolicy(a) {
if (a.referrerPolicy === 'no-referrer') {
// "no-referrer" is more privacy-friendly than "origin".
return;
}
var referrerPolicy = getReferrerPolicy();
if (referrerPolicy) {
a.referrerPolicy = referrerPolicy;
}
}
function handlePointerPress(e) {
var a = e.target;
while (a && !a.href) {
a = a.parentElement;
}
if (!a) {
return;
}
var inlineMousedown = a.getAttribute('onmousedown');
// return rwt(....); // E.g Google search results.
// return google.rwt(...); // E.g. sponsored search results
// return google.arwt(this); // E.g. sponsored search results (dec 2016).
if (inlineMousedown && /\ba?rwt\(/.test(inlineMousedown)) {
a.removeAttribute('onmousedown');
// Just in case:
a.removeAttribute('ping');
// In Chrome, removing onmousedown during event dispatch does not
// prevent the inline listener from running... So we have to cancel
// event propagation just in case.
e.stopImmediatePropagation();
}
if (noping) {
a.removeAttribute('ping');
}
var realLink = getRealLinkFromGoogleUrl(a);
if (realLink) {
a.href = realLink;
// Sometimes, two fixups are needed, on old mobile user agents:
// /url?q=https://googleweblight.com/fp?u=... -> ...
realLink = getRealLinkFromGoogleUrl(a);
if (realLink) {
a.href = realLink;
}
}
updateReferrerPolicy(a);
if (e.eventPhase === Event.CAPTURING_PHASE) {
// Our event listener runs first, to sanitize the link.
// But the page may have an event handler that modifies the link again.
// We can append a listener to the bubbling phase of the (current)
// event dispatch to fix the link up again, provided that the page did
// not call stopPropagation() or stopImmediatePropagation().
var eventOptions = { capture: false, once: true };
a.addEventListener(e.type, handlePointerPress, eventOptions);
document.addEventListener(e.type, handlePointerPress, eventOptions);
}
}
// This is specifically designed for catching clicks in Gmail.
// Gmail binds a click handler to a <div> and cancels the event after opening
// a window with an ugly URL. It uses a blank window + meta refresh in Firefox,
// which is too crazy to patch. So we just make sure that the browser's default
// click handler is activated (=open link in new tab).
// The entry point for this crazy stuff is shown in my comment at
// https://github.com/Rob--W/dont-track-me-google/issues/2
function handleClick(e) {
if (e.button !== 0) {
return;
}
var a = e.target;
while (a && !a.href) {
a = a.parentElement;
}
if (!a) {
return;
}
if (a.dataset && a.dataset.url) {
var realLink = getSanitizedIntentUrl(a.dataset.url);
if (realLink) {
a.dataset.url = realLink;
}
}
if (!location.hostname.startsWith('mail.')) {
// This hack was designed for Gmail, but broke other Google sites:
// - https://github.com/Rob--W/dont-track-me-google/issues/6
// - https://github.com/Rob--W/dont-track-me-google/issues/19
// So let's disable it for every domain except Gmail.
return;
}
// TODO: Consider using a.baseURI instead of location in case Gmail ever
// starts using <base href>?
if (a.origin === location.origin) {
// Same-origin link.
// E.g. an in-page navigation at Google Docs (#...)
// or an attachment at Gmail (https://mail.google.com/mail/u/0?ui=2&...)
return;
}
if (a.protocol !== 'http:' &&
a.protocol !== 'https:' &&
a.protocol !== 'ftp:') {
// Be conservative and don't block too much. E.g. Gmail has special
// handling for mailto:-URLs, and using stopPropagation now would
// cause mailto:-links to be opened by the platform's default mailto
// handler instead of Gmail's handler (=open in new window).
return;
}
if (a.target === '_blank') {
e.stopPropagation();
updateReferrerPolicy(a);
}
}
/**
* @param {URL|HTMLHyperlinkElementUtils} a
* @returns {String} the real URL if the given link is a Google redirect URL.
*/
function getRealLinkFromGoogleUrl(a) {
if (a.protocol !== 'https:' && a.protocol !== 'http:') {
return;
}
var url;
if ((a.hostname === location.hostname || a.hostname === 'www.google.com') &&
(a.pathname === '/url' || a.pathname === '/local_url' ||
a.pathname === '/searchurl/rr.html' ||
a.pathname === '/linkredirect')) {
// Google Maps / Dito (/local_url?q=<url>)
// Mobile (/url?q=<url>)
// Google Meet's chat (/linkredirect?authuser=0&dest=<url>)
url = /[?&](?:q|url|dest)=((?:https?|ftp)[%:][^&]+)/.exec(a.search);
if (url) {
return decodeURIComponent(url[1]);
}
// Help pages, e.g. safe browsing (/url?...&q=%2Fsupport%2Fanswer...)
url = /[?&](?:q|url)=((?:%2[Ff]|\/)[^&]+)/.exec(a.search);
if (url) {
return a.origin + decodeURIComponent(url[1]);
}
// Redirect pages for Android intents (/searchurl/rr.html#...&url=...)
// rr.html only supports http(s). So restrict to http(s) only.
url = /[#&]url=(https?[:%][^&]+)/.exec(a.hash);
if (url) {
return decodeURIComponent(url[1]);
}
}
// Google Search with old mobile UA (e.g. Firefox 41).
if (a.hostname === 'googleweblight.com' && a.pathname === '/fp') {
url = /[?&]u=((?:https?|ftp)[%:][^&]+)/.exec(a.search);
if (url) {
return decodeURIComponent(url[1]);
}
}
}
/**
* @param {string} intentUrl
* @returns {string|undefined} The sanitized intent:-URL if it was an intent URL
* with embedded tracking link.
*/
function getSanitizedIntentUrl(intentUrl) {
if (!intentUrl.startsWith('intent:')) {
return;
}
// https://developer.chrome.com/multidevice/android/intents#syntax
var BROWSER_FALLBACK_URL = ';S.browser_fallback_url=';
var indexStart = intentUrl.indexOf(BROWSER_FALLBACK_URL);
if (indexStart === -1) {
return;
}
indexStart += BROWSER_FALLBACK_URL.length;
var indexEnd = intentUrl.indexOf(';', indexStart);
indexEnd = indexEnd === -1 ? intentUrl.length : indexEnd;
var url = decodeURIComponent(intentUrl.substring(indexStart, indexEnd));
var realUrl = getRealLinkFromGoogleUrl(newURL(url));
if (!realUrl) {
return;
}
return intentUrl.substring(0, indexStart) +
encodeURIComponent(realUrl) +
intentUrl.substring(indexEnd);
}
/**
* Intercept the .href setter in the page so that the page can never change the
* URL to a tracking URL. Just intercepting mousedown/touchstart is not enough
* because e.g. on Google Maps, the page rewrites the URL in the contextmenu
* event at the bubbling event stage and then stops the event propagation. So
* there is no event-driven way to fix the URL. The DOMAttrModified event could
* be used, but the event is deprecated, so not a viable long-term solution.
*/
function setupAggresiveUglyLinkPreventer() {
// This content script runs as document_start, so we can have some assurance
// that the methods in the page are reliable.
var s = document.createElement('script');
if (getScriptCspNonce()) {
s.setAttribute('nonce', scriptCspNonce);
} else if (document.readyState !== 'complete' && needsCspNonce) {
// In Firefox, a page's CSP is enforced for content scripts, so we need
// to wait for the document to be loaded (we may be at document_start)
// and find a fitting CSP nonce.
findScriptCspNonce(setupAggresiveUglyLinkPreventer);
return;
}
s.textContent = '(' + function(getRealLinkFromGoogleUrl) {
var proto = HTMLAnchorElement.prototype;
// The link target can be changed in many ways, but let's only consider
// the .href attribute since it's probably the only used setter.
var hrefProp = Object.getOwnPropertyDescriptor(proto, 'href');
var hrefGet = Function.prototype.call.bind(hrefProp.get);
var hrefSet = Function.prototype.call.bind(hrefProp.set);
Object.defineProperty(proto, 'href', {
configurable: true,
enumerable: true,
get() {
return hrefGet(this);
},
set(v) {
hrefSet(this, v);
try {
v = getRealLinkFromGoogleUrl(this);
if (v) {
hrefSet(this, v);
}
} catch (e) {
// Not expected to happen, but don't break the setter if for
// some reason the (hostile) page broke the link APIs.
}
updateReferrerPolicy(this);
},
});
function replaceAMethod(methodName, methodFunc) {
// Overwrite the methods without triggering setters, because that
// may inadvertently overwrite the prototype, as observed in
// https://github.com/Rob--W/dont-track-me-google/issues/52#issuecomment-1596207655
Object.defineProperty(proto, methodName, {
configurable: true,
// All methods that we are overriding are not part of
// HTMLAnchorElement.prototype, but inherit.
enumerable: false,
writable: true,
value: methodFunc,
});
}
// proto inherits Element.prototype.setAttribute:
var setAttribute = Function.prototype.call.bind(proto.setAttribute);
replaceAMethod('setAttribute', function(name, value) {
// Attribute names are not case-sensitive, but weird capitalizations
// are unlikely, so only check all-lowercase and all-uppercase.
if (name === 'href' || name === 'HREF') {
this.href = value;
} else {
setAttribute(this, name, value);
}
});
// proto inherits EventTarget.prototype.dispatchEvent:
var aDispatchEvent = Function.prototype.apply.bind(proto.dispatchEvent);
replaceAMethod('dispatchEvent', function() {
updateReferrerPolicy(this);
return aDispatchEvent(this, arguments);
});
// proto inherits HTMLElement.prototype.click:
var aClick = Function.prototype.apply.bind(proto.click);
replaceAMethod('click', function() {
updateReferrerPolicy(this);
return aClick(this, arguments);
});
var rpProp = Object.getOwnPropertyDescriptor(proto, 'referrerPolicy');
var rpGet = Function.prototype.call.bind(rpProp.get);
var rpSet = Function.prototype.call.bind(rpProp.set);
var currentScript = document.currentScript;
var getReferrerPolicy = Object.getOwnPropertyDescriptor(
HTMLScriptElement.prototype,
'referrerPolicy'
).get.bind(currentScript);
function updateReferrerPolicy(a) {
try {
if (rpGet(a) === 'no-referrer') {
// "no-referrer" is more privacy-friendly than "origin".
return;
}
var referrerPolicy = getReferrerPolicy();
if (referrerPolicy) {
rpSet(a, referrerPolicy);
}
} catch (e) {
// Not expected to happen, but don't break callers if it happens
// anyway.
}
}
currentScript.dataset.jsEnabled = 1;
} + ')(' + getRealLinkFromGoogleUrl + ');';
callImmediatelyAndOnPreferenceUpdate(function forceNoReferrerChanged() {
// Send the desired referrerPolicy value to the injected script.
s.referrerPolicy = getReferrerPolicy();
});
(document.head || document.documentElement).appendChild(s);
s.remove();
if (!s.dataset.jsEnabled) {
cleanLinksWhenJsIsDisabled();
if (!needsCspNonce) {
needsCspNonce = true;
// This is not Firefox, but the script was blocked. Perhaps a CSP
// nonce is needed anyway.
findScriptCspNonce(function() {
if (scriptCspNonce) {
setupAggresiveUglyLinkPreventer();
}
});
}
} else {
// Scripts enabled (not blocked by CSP), run other inline scripts.
blockTrackingBeacons();
overwriteWindowOpen();
if (location.hostname === 'docs.google.com') {
// Google Docs have simple non-JS interfaces where the ugly links
// are hard-coded in the HTML. Remove them (#51).
// https://docs.google.com/document/d/.../mobilebasic
// https://docs.google.com/spreadsheets/d/.../htmlview
cleanLinksWhenJsIsDisabled();
}
}
}
// Block sendBeacon requests with destination /gen_204, because Google
// asynchronously sends beacon requests in response to mouse events on links:
// https://github.com/Rob--W/dont-track-me-google/issues/20
//
// This implementation also blocks other forms of tracking via gen_204 as a side
// effect. That is not fully intentional, but given the lack of obvious ways to
// discern such link-tracking events from others, I will block all of them.
function blockTrackingBeacons() {
var s = document.createElement('script');
if (getScriptCspNonce()) {
s.setAttribute('nonce', scriptCspNonce);
}
s.textContent = '(' + function() {
var navProto = window.Navigator.prototype;
var navProtoSendBeacon = navProto.sendBeacon;
if (!navProtoSendBeacon) {
return;
}
var sendBeacon = Function.prototype.apply.bind(navProtoSendBeacon);
// Blocks the following:
// gen_204
// /gen_204
// https://www.google.com/gen_204
var isTrackingUrl = RegExp.prototype.test.bind(
/^(?:(?:https?:\/\/[^\/]+)?\/)?gen_204(?:[?#]|$)/);
navProto.sendBeacon = function(url, data) {
if (isTrackingUrl(url) && isNoPingEnabled()) {
// Lie that the data has been transmitted to avoid fallbacks.
return true;
}
return sendBeacon(this, arguments);
};
var currentScript = document.currentScript;
var getElementId = Object.getOwnPropertyDescriptor(
Element.prototype,
'id'
).get.bind(currentScript);
function isNoPingEnabled() {
try {
return getElementId() !== '_dtmg_do_not_touch_ping';
} catch (e) {
return true;
}
}
} + ')();';
callImmediatelyAndOnPreferenceUpdate(function nopingChanged() {
// Send the noping value to the injected script. The "id" property is
// mirrored and can have an arbitrary (string) value, so we use that:
s.id = noping ? '' : '_dtmg_do_not_touch_ping';
});
(document.head || document.documentElement).appendChild(s);
s.remove();
}
// Google sometimes uses window.open() to open ugly links.
// https://github.com/Rob--W/dont-track-me-google/issues/18
// https://github.com/Rob--W/dont-track-me-google/issues/41
function overwriteWindowOpen() {
var s = document.createElement('script');
if (getScriptCspNonce()) {
s.setAttribute('nonce', scriptCspNonce);
}
s.textContent = '(' + function() {
var open = window.open;
window.open = function(url, windowName, windowFeatures) {
var isBlankUrl = !url || url === "about:blank";
try {
if (!isBlankUrl) {
var a = document.createElement('a');
// Triggers getRealLinkFromGoogleUrl via the href setter in
// setupAggresiveUglyLinkPreventer.
a.href = url;
url = a.href;
// The origin check exists to avoid adding "noreferrer" to
// same-origin popups. That implies noopener and causes
// https://github.com/Rob--W/dont-track-me-google/issues/43
// And allow any Google domain to support auth popups:
// https://github.com/Rob--W/dont-track-me-google/issues/45
// And don't bother editing the list if it already contains
// "opener" (it would be disabled by "noreferrer").
if (a.referrerPolicy && a.origin !== location.origin &&
!/\.google\.([a-z]+)$/.test(a.hostname) &&
!/\bopener|noreferrer/.test(windowFeatures)) {
if (windowFeatures) {
windowFeatures += ',';
} else {
windowFeatures = '';
}
windowFeatures += 'noreferrer';
}
}
} catch (e) {
// Not expected to happen, but don't break callers if it does.
}
var win = open(url, windowName, windowFeatures);
try {
if (isBlankUrl && win) {
// In Google Docs, sometimes a blank document is opened,
// and document.write is used to insert a redirector.
// https://github.com/Rob--W/dont-track-me-google/issues/41
var doc = win.document;
var docWrite = win.Function.prototype.call.bind(doc.write);
doc.write = function(markup) {
try {
markup = fixupDocMarkup(markup);
} catch (e) {
// Not expected, but don't break callers otherwise.
}
return docWrite(this, markup);
};
}
} catch (e) {
// Not expected to happen, but don't break callers if it does.
}
return win;
};
function fixupDocMarkup(html) {
html = html || '';
html += '';
return html.replace(
/<meta [^>]*http-equiv=(["']?)refresh\1[^>]*>/i,
function(m) {
var doc = new DOMParser().parseFromString(m, 'text/html');
var meta = doc.querySelector('meta[http-equiv=refresh]');
return meta && fixupMetaUrl(meta) || m;
});
}
function fixupMetaUrl(meta) {
var parts = /^(\d*;\s*url=)(.+)$/i.exec(meta.content);
if (!parts) {
return;
}
var metaPrefix = parts[1];
var url = parts[2];
var a = document.createElement('a');
// Triggers getRealLinkFromGoogleUrl via the href setter in
// setupAggresiveUglyLinkPreventer.
a.href = url;
url = a.href;
meta.content = metaPrefix + url;
var html = meta.outerHTML;
if (a.referrerPolicy) {
// Google appears to already append the no-referrer
// meta tag, but add one just in case it doesn't.
html = '<meta name="referrer" content="no-referrer">' + html;
}
return html;
}
} + ')();';
(document.head || document.documentElement).appendChild(s);
s.remove();
}
function cleanLinksWhenJsIsDisabled() {
// When JavaScript is disabled, Google sets the "href" attribute's value to
// an ugly URL. Although the link is rewritten on click, we still need to
// rewrite the link even earlier because otherwise the ugly URL is shown in
// the tooltip upon hover.
if (document.readyState == 'complete') {
cleanAllLinks();
return;
}
// When JS is disabled, the links won't change after the document finishes
// loading. Until the DOM has finished loading, use the mouseover event to
// beautify links (the DOMContentLoaded may be delayed on slow networks).
document.addEventListener('mouseover', handleMouseOver);
document.addEventListener('DOMContentLoaded', function() {
document.removeEventListener('mouseover', handleMouseOver);
cleanAllLinks();
}, {once: true});
function cleanAllLinks() {
var as = document.querySelectorAll('a[href]');
for (var i = 0; i < as.length; ++i) {
var href = getRealLinkFromGoogleUrl(as[i]);
if (href) {
as[i].href = href;
}
}
}
function handleMouseOver(e) {
var a = e.target;
var href = a.href && getRealLinkFromGoogleUrl(a);
if (href) {
a.href = href;
}
}
}
function getScriptCspNonce() {
var scripts = document.querySelectorAll('script[nonce]');
for (var i = 0; i < scripts.length && !scriptCspNonce; ++i) {
scriptCspNonce = scripts[i].nonce;
}
return scriptCspNonce;
}
function findScriptCspNonce(callback) {
var timer;
function checkDOM() {
if (getScriptCspNonce() || document.readyState === 'complete') {
document.removeEventListener('DOMContentLoaded', checkDOM, true);
if (timer) {
clearTimeout(timer);
}
callback();
return;
}
timer = setTimeout(checkDOM, 50);
}
document.addEventListener('DOMContentLoaded', checkDOM, true);
checkDOM();
}
function newURL(href) {
try {
return new URL(href);
} catch (e) {
var a = document.createElement('a');
a.href = href;
return a;
}
}
@@ -0,0 +1,984 @@
// ==UserScript==
// @name I don't care about cookies
// @name:vi Tôi không quan tâm về cookie
// @name:zh-CN 我不关心cookie
// @name:zh-TW 我不關心cookie
// @name:ja クッキーについては気にしない
// @name:ru Я не забочусь о куки
// @namespace http://tampermonkey.net/
// @version 2025.01.03.2
// @description Remove cookie warnings from almost all websites! Auto accept cookies and remove annoying cookie popups
// @description:vi Loại bỏ cảnh báo cookie từ hầu hết các trang web! Tự động chấp nhận cookie và xóa các popup cookie phiền phức
// @description:zh-CN 自动接受cookie并移除烦人的cookie弹窗
// @description:zh-TW 自動接受cookie並移除煩人的cookie彈窗
// @description:ru Автоматическое принятие cookie и удаление надоедливых всплывающих окон
// @description:ja 自動承認cookieと迷惑なポップアップを削除
// @author Yuusei
// @match *://*/*
// @grant none
// @icon https://lh3.googleusercontent.com/sCLTYpGX0VcVootQ_XaFQ9saRIhVWu79ngSzY5eTZ5evRpJ_Q27OdvxA4RrOoZXP7Q4enFh-u6VhxObcJLfARw1g=s60
// @compatible chrome
// @compatible edge
// @compatible firefox
// @compatible safari
// @run-at document-start
// @license gpl-3.0-only
// @downloadURL https://update.greasyfork.org/scripts/522645/I%20don%27t%20care%20about%20cookies.user.js
// @updateURL https://update.greasyfork.org/scripts/522645/I%20don%27t%20care%20about%20cookies.meta.js
// ==/UserScript==
(function () {
'use strict';
const CONSENT_TEXTS = {
en: ['accept', 'accept all', 'agree', 'continue', 'got it', 'reject all', 'decline', 'necessary only', 'required only', 'manage', 'customize'],
vi: ['chấp nhận', 'chấp nhận tất cả', 'đồng ý', 'tiếp tục', 'từ chối tất cả', 'từ chối', 'chỉ cần thiết', 'tùy chỉnh', 'quản lý', 'cho phép', 'đồng ý và tiếp tục', 'tôi đồng ý', 'xác nhận', 'tôi chấp nhận', 'đồng ý tất cả', 'chấp nhận và tiếp tục', 'cho phép tất cả'],
zh: ['接受', '接受全部', '同意', '继续', '拒绝全部', '拒绝', '仅必要', '管理', '自定义'],
ru: ['принять', 'принять все', 'согласен', 'продолжить', 'отклонить все', 'отклонить', 'только необходимые', 'настроить', 'управлять'],
ja: ['承認', '同意', '続ける', 'すべて拒否', '拒否', '必要のみ', 'カスタマイズ', '管理'],
de: ['akzeptieren', 'einverstanden', 'fortfahren', 'alle ablehnen', 'ablehnen', 'nur notwendige', 'anpassen', 'verwalten'],
fr: ['accepter', 'accepter tout', 'accepte', 'continuer', 'tout refuser', 'refuser', 'uniquement nécessaire', 'personnaliser', 'gérer'],
es: ['aceptar', 'acepto todo', 'acepto', 'continuar', 'rechazar todo', 'rechazar', 'solo necesario', 'personalizar', 'gestionar'],
it: ['accetta', 'accetto tutto', 'accetto', 'continua', 'rifiuta tutto', 'rifiuta', 'solo necessari', 'personalizza', 'gestisci'],
pl: ['akceptuj', 'akceptuj wszystko', 'zgadzam się', 'kontynuuj', 'odrzuć wszystko', 'odrzuć', 'tylko niezbędne', 'dostosuj', 'zarządzaj'],
nl: ['accepteren', 'accepteren', 'doorgaan', 'alles weigeren', 'weigeren', 'alleen noodzakelijk', 'aanpassen', 'beheren'],
ko: ['동의', '모두 동의', '계속하기', '모두 거부', '거부', '필수만', '설정', '관리'],
th: ['ยอมรับ', 'ยอมรับทั้งหมด', 'ตกลง', 'ปฏิเสธทั้งหมด', 'ปฏิเสธ', 'จำเป็นเท่านั้น', 'ตั้งค่า', 'จัดการ'],
id: ['setuju', 'setuju semua', 'lanjutkan', 'tolak semua', 'tolak', 'wajib saja', 'pengaturan', 'kelola'],
ms: ['terima', 'terima semua', 'teruskan', 'tolak semua', 'tolak', 'perlu sahaja', 'tetapan', 'urus'],
pt: ['aceitar', 'aceitar tudo', 'continuar', 'rejeitar tudo', 'rejeitar', 'necessário', 'configurar', 'gerir'],
sv: ['godkänn', 'godkänn alla', 'fortsätt', 'neka alla', 'neka', 'nödvändiga', 'inställningar', 'hantera'],
da: ['accepter', 'accepter alle', 'fortsæt', 'afvis alle', 'afvis', 'nødvendige', 'indstillinger', 'administrer'],
fi: ['hyväksy', 'hyväksy kaikki', 'jatka', 'hylkää kaikki', 'hylkää', 'välttämätön', 'asetukset', 'hallitse'],
'zh-CN': ['接受', '接受全部', '同意', '继续', '我同意', '确定', '确认', '知道了', '好的', '拒绝全部', '拒绝', '仅必要', '设置', '自定义', '管理', '保存设置', '允许', '允许全部', '接受并继续', '同意并继续', '保存并继续'],
'zh-TW': ['接受', '接受全部', '同意', '繼續', '我同意', '確定', '確認', '知道了', '好的', '拒絕全部', '拒絕', '僅必要', '設置', '自定義', '管理', '保存設置', '允許', '允許全部', '接受並繼續', '同意並繼續', '保存並繼續'],
ko: ['동의', '모두 동의', '수락', '계속하기', '확인', '거부', '거부하기', '필수만', '설정', '관리', '저장', '허용', '모두 허용'],
th: ['ยอมรับ', 'ยอมรับทั้งหมด', 'ตกลง', 'ดำเนินการต่อ', 'ปฏิเสธ', 'ปฏิเสธทั้งหมด', 'จำเป็นเท่านั้น', 'ตั้งค่า', 'จัดการ', 'บันทึก', 'อนุญาต', 'อนุญาตทั้งหมด'],
id: ['terima', 'terima semua', 'setuju', 'lanjutkan', 'tolak', 'tolak semua', 'wajib saja', 'pengaturan', 'kelola', 'simpan', 'izinkan', 'izinkan semua'],
ms: ['terima', 'terima semua', 'setuju', 'teruskan', 'tolak', 'tolak semua', 'perlu sahaja', 'tetapan', 'urus', 'simpan', 'benarkan', 'benarkan semua'],
};
function matchesConsentText(element) {
const text = element.textContent.toLowerCase();
const lang = document.documentElement.lang || 'en';
const texts = CONSENT_TEXTS[lang.split('-')[0]] || CONSENT_TEXTS['en'];
return texts.some(t => text.includes(t));
}
// Utility functions
function _sl(selector, container) {
return (container || document).querySelector(selector);
}
function _id(id) {
return document.getElementById(id);
}
function _ev(selector, container, full) {
return document.evaluate((typeof full == 'undefined' ? '//' : '') + selector, container || document, null, XPathResult.ANY_TYPE, null).iterateNext();
}
function _if(condition, ...selectors) {
return _sl(condition) ? _chain(...selectors) : false;
}
function _if_else(condition, if_selectors, else_selectors) {
if (_sl(condition)) return _chain(...if_selectors);
return _chain(...else_selectors);
}
function _chain(...selectors) {
let elements,
l = selectors.length;
let flagUnique = false,
flagOptional = false,
flagAllMatches = false;
for (let i = currentChainElement; i < l; i++) {
if (/^FLAG\:/.test(selectors[i])) {
selectors[i]
.split(':')[1]
.split(',')
.forEach(function (flag) {
if (flag == 'UNIQUE') flagUnique = true;
else if (flag == 'OPTIONAL') flagOptional = true;
else if (flag == 'REQUIRED') flagOptional = false;
else if (flag == 'ALL-MATCHES') flagAllMatches = true;
else if (flag == 'SINGLE-MATCH') flagAllMatches = false;
});
continue;
}
if (flagUnique) selectors[i] += selectors[i].startsWith('//') ? '[not(contains(@class, "' + classname + '"))]' : ':not(.' + classname + ')';
if (i == l - 1) return selectors[i];
elements = _sl(selectors[i], false, flagAllMatches);
if (!flagAllMatches) elements = elements ? [elements] : [];
if (!elements.length) {
if (flagOptional) {
currentChainElement++;
continue;
}
return false;
}
currentChainElement++;
elements.forEach(function (element) {
if (flagUnique) element.classList.add(classname);
if (element.nodeName == 'OPTION') element.selected = true;
else element.click();
});
}
return false;
}
function getItem(hostname) {
switch (hostname) {
case 'youtube.com':
case 'www.youtube.com':
return { strict: true, key: 'CONSENT', value: 'PENDING+999' };
case 'google.com':
case 'www.google.com':
return { strict: true, key: 'CONSENT', value: 'YES+' };
case 'twitter.com':
case 'www.twitter.com':
return { strict: false, key: 'twtr_cookie_consent', value: '1' };
case 'pepephone.com':
case 'lyricsbox.com':
return { strict: true, key: 'cookieconsent', value: '1111' };
case 'kontaktbazar.at':
case 'hoernews.de':
return { strict: false, key: 'cookieconsent_status', value: 'dismiss' };
case 'vodafoneziggo.nl':
return { strict: false, key: 'cookies-accepted', value: 'true' };
case 'frankfurt.de':
return { strict: false, key: 'cookieAccepted', value: 'needed---piwik' };
case 'hackerrank.com':
return { strict: false, key: 'show_cookie_banner', value: 'false' };
case 'facebook.com':
case 'www.facebook.com':
return { strict: true, key: 'datr', value: 'accepted' };
case 'instagram.com':
case 'www.instagram.com':
return { strict: true, key: 'ig_did', value: 'accepted' };
case 'linkedin.com':
case 'www.linkedin.com':
return { strict: false, key: 'lidc', value: 'accepted' };
case 'reddit.com':
case 'www.reddit.com':
return { strict: false, key: 'eu_cookie', value: '{"opted":true}' };
case 'tiktok.com':
case 'www.tiktok.com':
return { strict: true, key: 'tt_webid', value: 'accepted' };
case 'netflix.com':
case 'www.netflix.com':
return { strict: false, key: 'netflix-cookie-consent', value: 'accepted' };
case 'spotify.com':
case 'www.spotify.com':
return { strict: false, key: 'sp_dc', value: 'accepted' };
case 'amazon.com':
case 'www.amazon.com':
return { strict: false, key: 'amazon-cookie-consent', value: 'accepted' };
case 'pinterest.com':
case 'www.pinterest.com':
return { strict: false, key: '_pinterest_sess', value: 'accepted' };
case 'twitch.tv':
case 'www.twitch.tv':
return { strict: false, key: 'twitch_cookie_consent', value: 'accepted' };
case 'github.com':
case 'www.github.com':
return { strict: false, key: '_gh_sess', value: 'accepted' };
case 'medium.com':
case 'www.medium.com':
return { strict: false, key: 'medium_cookie_consent', value: 'accepted' };
case 'quora.com':
case 'www.quora.com':
return { strict: false, key: 'm-b', value: 'accepted' };
case 'stackoverflow.com':
case 'www.stackoverflow.com':
return { strict: false, key: 'acct', value: 'accepted' };
case 'microsoft.com':
case 'www.microsoft.com':
return { strict: false, key: 'MUID', value: 'accepted' };
case 'apple.com':
case 'www.apple.com':
return { strict: false, key: 'geo', value: 'accepted' };
case 'dropbox.com':
case 'www.dropbox.com':
return { strict: false, key: 'dbx-consent', value: 'accepted' };
case 'booking.com':
case 'www.booking.com':
return { strict: false, key: 'bkng_consent', value: 'accepted' };
case 'vnexpress.net':
case 'www.vnexpress.net':
return { strict: false, key: 'vnexpress_cookie_consent', value: 'accepted' };
case 'thanhnien.vn':
case 'www.thanhnien.vn':
return { strict: false, key: 'thanhnien_cookie', value: 'accepted' };
case 'tuoitre.vn':
case 'www.tuoitre.vn':
return { strict: false, key: 'tuoitre_cookie', value: 'accepted' };
case 'tiki.vn':
case 'www.tiki.vn':
return { strict: false, key: 'tiki_cookie', value: 'accepted' };
case 'shopee.vn':
case 'www.shopee.vn':
return { strict: false, key: 'shopee_cookie', value: 'accepted' };
case 'lazada.vn':
case 'www.lazada.vn':
return { strict: false, key: 'lzd_cookie', value: 'accepted' };
case 'sendo.vn':
case 'www.sendo.vn':
return { strict: false, key: 'sendo_cookie', value: 'accepted' };
case 'thegioididong.com':
case 'www.thegioididong.com':
return { strict: false, key: 'tgdd_cookie', value: 'accepted' };
case 'fptshop.com.vn':
case 'www.fptshop.com.vn':
return { strict: false, key: 'fpt_cookie', value: 'accepted' };
case 'cellphones.com.vn':
case 'www.cellphones.com.vn':
return { strict: false, key: 'cps_cookie', value: 'accepted' };
case 'aliexpress.com':
case 'www.aliexpress.com':
return { strict: false, key: 'aep_usuc_f', value: 'accepted' };
case 'ebay.com':
case 'www.ebay.com':
return { strict: false, key: 'ebay_cookie_consent', value: 'accepted' };
case 'coursera.org':
case 'www.coursera.org':
return { strict: false, key: 'coursera_cookie', value: 'accepted' };
case 'udemy.com':
case 'www.udemy.com':
return { strict: false, key: 'ud_cookie', value: 'accepted' };
case 'bachhoaxanh.com':
case 'www.bachhoaxanh.com':
return { strict: false, key: 'bhx_cookie', value: 'accepted' };
case 'dienmayxanh.com':
case 'www.dienmayxanh.com':
return { strict: false, key: 'dmx_cookie', value: 'accepted' };
case 'nguyenkim.com':
case 'www.nguyenkim.com':
return { strict: false, key: 'nk_cookie', value: 'accepted' };
case 'dantri.com.vn':
case 'www.dantri.com.vn':
return { strict: false, key: 'dantri_cookie', value: 'accepted' };
case 'vietnamnet.vn':
case 'www.vietnamnet.vn':
return { strict: false, key: 'vietnamnet_cookie', value: 'accepted' };
case '24h.com.vn':
case 'www.24h.com.vn':
return { strict: false, key: '24h_cookie', value: 'accepted' };
case 'vietcombank.com.vn':
case 'www.vietcombank.com.vn':
return { strict: false, key: 'vcb_cookie', value: 'accepted' };
case 'techcombank.com.vn':
case 'www.techcombank.com.vn':
return { strict: false, key: 'tcb_cookie', value: 'accepted' };
case 'mbbank.com.vn':
case 'www.mbbank.com.vn':
return { strict: false, key: 'mb_cookie', value: 'accepted' };
case 'amazon.co.jp':
case 'www.amazon.co.jp':
return { strict: false, key: 'amazon_jp_cookie', value: 'accepted' };
case 'rakuten.co.jp':
case 'www.rakuten.co.jp':
return { strict: false, key: 'rakuten_jp_cookie', value: 'accepted' };
case 'taobao.com':
case 'www.taobao.com':
return { strict: false, key: 'taobao_cookie', value: 'accepted' };
case 'line.me':
case 'www.line.me':
return { strict: false, key: 'line_cookie', value: 'accepted' };
case 'weibo.com':
case 'www.weibo.com':
return { strict: false, key: 'weibo_cookie', value: 'accepted' };
case 'kakao.com':
case 'www.kakao.com':
return { strict: false, key: 'kakao_cookie', value: 'accepted' };
case 'yahoo.co.jp':
case 'www.yahoo.co.jp':
return { strict: false, key: 'yahoo_jp_cookie', value: 'accepted' };
case 'naver.com':
case 'www.naver.com':
return { strict: false, key: 'naver_cookie', value: 'accepted' };
case 'baidu.com':
case 'www.baidu.com':
return { strict: false, key: 'baidu_cookie', value: 'accepted' };
case 'zalando.com':
case 'www.zalando.com':
return { strict: false, key: 'zalando_cookie', value: 'accepted' };
case 'asos.com':
case 'www.asos.com':
return { strict: false, key: 'asos_cookie', value: 'accepted' };
case 'zara.com':
case 'www.zara.com':
return { strict: false, key: 'zara_cookie', value: 'accepted' };
case 'tmall.com':
case 'www.tmall.com':
return { strict: false, key: 'tmall_cookie', value: 'accepted' };
case 'jd.com':
case 'www.jd.com':
return { strict: false, key: 'jd_cookie', value: 'accepted' };
case 'sina.com.cn':
case 'www.sina.com.cn':
return { strict: false, key: 'sina_cookie', value: 'accepted' };
case 'qq.com':
case 'www.qq.com':
return { strict: false, key: 'qq_cookie', value: 'accepted' };
case '163.com':
case 'www.163.com':
return { strict: false, key: 'netease_cookie', value: 'accepted' };
case 'sohu.com':
case 'www.sohu.com':
return { strict: false, key: 'sohu_cookie', value: 'accepted' };
case 'bilibili.com':
case 'www.bilibili.com':
return { strict: false, key: 'bilibili_cookie', value: 'accepted' };
}
const parts = hostname.split('.');
if (parts.length > 2) {
parts.shift();
return getItem(parts.join('.'));
}
return false;
}
function _parent(element) {
if (element && element.parentNode) return element.parentNode;
return false;
}
function _iframe(iframe_selector, selector) {
var e = _sl(iframe_selector);
return e ? _sl(selector, e.contentDocument || e.contentWindow.contentDocument) : e;
}
// Cookie consent handling logic
let searchPairs = {
'.vn-cookie-banner': ['.vn-cookie-banner__reject', '.vn-cookie-banner__customize'],
'.vn-cookie-notice': ['.vn-cookie-notice__reject', '.vn-cookie-notice__settings'],
'.vn-cookie-consent': ['.vn-cookie-consent__reject', '.vn-cookie-consent__customize'],
'.vn-cookie-popup': ['.vn-cookie-popup__reject', '.vn-cookie-popup__settings'],
'.shopee-cookie-banner': ['.shopee-cookie-banner__reject', '.shopee-cookie-banner__settings'],
'.lazada-cookie-notice': ['.lazada-cookie-notice__reject', '.lazada-cookie-notice__settings'],
'.tiki-cookie-popup': ['.tiki-cookie-popup__reject', '.tiki-cookie-popup__settings'],
'.sendo-cookie-consent': ['.sendo-cookie-consent__reject', '.sendo-cookie-consent__settings'],
'.vnexpress-cookie': ['.vnexpress-cookie__reject', '.vnexpress-cookie__settings'],
'.tuoitre-cookie': ['.tuoitre-cookie__reject', '.tuoitre-cookie__settings'],
'.thanhnien-cookie': ['.thanhnien-cookie__reject', '.thanhnien-cookie__settings'],
'.dantri-cookie': ['.dantri-cookie__reject', '.dantri-cookie__settings'],
'.tgdd-cookie-notice': ['.tgdd-cookie-notice__reject', '.tgdd-cookie-notice__settings'],
'.fpt-cookie-popup': ['.fpt-cookie-popup__reject', '.fpt-cookie-popup__settings'],
'.cps-cookie-consent': ['.cps-cookie-consent__reject', '.cps-cookie-consent__settings'],
'.vcb-cookie-notice': ['.vcb-cookie-notice__reject', '.vcb-cookie-notice__settings'],
'.tcb-cookie-popup': ['.tcb-cookie-popup__reject', '.tcb-cookie-popup__settings'],
'.mb-cookie-consent': ['.mb-cookie-consent__reject', '.mb-cookie-consent__settings'],
'div[class*="consent"]': ['button[class*="reject"]', 'button[class*="decline"]', 'button[class*="settings"]'],
'div[class*="notice"]': ['button[class*="reject"]', 'button[class*="decline"]', 'button[class*="settings"]'],
'div[class*="popup"]': ['button[class*="reject"]', 'button[class*="decline"]', 'button[class*="settings"]'],
'div[class*="banner"]': ['button[class*="reject"]', 'button[class*="decline"]', 'button[class*="settings"]'],
};
let searchGroups = [
'.qc-cmp2-summary-buttons button[mode="secondary"],\
.qc-cmp2-buttons-desktop > button:first-child,\
#didomi-popup .didomi-button-highlight:not([class*="paywall"]):not([class*="disagree"]),\
#rgpd_video .rgpd-mask a[data-rgpd-consent],\
.cli-barmodal-open #wt-cli-privacy-save-btn,\
.js--modal[style*="block"] .cookie-permission--accept-button,\
.gdpr-modal-rider .btn-cookieaccept,\
.js-cookiewall #sel-test-accept-cookies-button,\
#mpo[style*="block"] .submit.modal-privacy__btn[onclick*="privacyframe.accept"],\
.lightbox--cookie-consent .btn-cta,\
.lightbox.cookie-consent .cookie-consent-button-decline,\
.js-modal-gdpr.is-active .btn[data-level="2"],\
#CybotCookiebotDialogBodyLevelButtonLevelOptinAllowallSelection,\
#cookieNotificationModal.in .btn.accept-cookie,\
.has-ccwindow .cc-compliance .cc-dismiss,\
.ds2-cookie-disclaimer--slidedown .ds2-cookie-disclaimer-js--submit,\
#mdlCookieCompliance.in .cookieClose,\
#cookieModal.in .js-acceptDefaultCookie,\
.c-cookiebutton .c-cookiebutton__close,\
#normativa_cookies.in .btn,\
#cookiewall.in .btn-primary,\
.outerCookieBar .EuCookieBar__cookieButton,\
#TOS-POPUP .rhododendron-popup__button--agree,\
#cookie-wall #accept-cookies,\
#popup-wrapper .button[href*="/cookies.consent.php"],\
.reveal.cookies[style*="block"] button[click*="aceptaCookies"],\
.mnd-cookie-modal[style*="block"] .btn.is--primary,\
.cookieHandler.cookieHandler--modalOpen #acceptAllCookies,\
.gdpr-modal--active .btn--primary,\
#dpi-banner:not(.hidden) #btn-agree-cookie,\
.gh-banner.gh-banner-active #gh-cookiebanner-close,\
#mrktpref.notification-bar .btn-success,\
#PopinGDPRCookie[style*="block"] .jsbd-popin-ok,\
#modal-rodo.in .btn-primary,\
.cookie-compliance-modal.in .btn-primary,\
.cookieconsent.show .btn[data-dm*="accept"],\
.cookie-wall-modal.in .btn.ja,\
#modal-consent.in .modal-consent-accept,\
.rodo #cookies.in .btn-primary,\
.js-cookie-alert.in .js-cookie-alert-accept,\
#modal_gdpr_intro_popup.in #gdpr-modal-btn-ok-agree,\
#consentButtonContainer > button[onclick*="sendAndRedirect"],\
#eu-consent[style*="block"] .btn.yes,\
.modal--gdpr.is-open .js-gdpr-consent,\
#cookiePopupModal.in .cookiepopup-agreed,\
.polityka-cookie-rodo[style*="block"] .button-zgoda,\
.ui-dialog.consent-modal[style*="block"] .js-btn-agree,\
#up-cookie.active .button[onclick*="setCookiePreference"],\
.RodoModal.in .close,\
.consent-popup form[action*="cookie-consent"] .consent-popup__button,\
#consent form[action*="cookie-consent"] .one-btn,\
#cookiewall-wrapper .button[href*="accept"],\
#cookieChoiceButtonAccept,\
.mod-cookie-consent[style*="block"] .btn-all-cookies,\
.c-layer--consent .layer-button--accept,\
.button.button-ok[onclick*="acceptAVG"],\
#meredithGdprConsentFormButton,\
#advanced-cookie-modal.in .cookie-accept,\
.show-modal .cookie-settings-manager-container .initial-dialog .js-accept-button,\
.cookie-settings-manager-container .initial-dialog[style*="block"] .js-accept-button,\
.gdprLightbox[data-module="gdprLightbox"] ._type_gdpr_agree,\
.cookie.showa #Row1_Column1_Cell1_CookieSettings_AdvancedSaveAccept,\
#core-cookie-container[style*="block"] .btn--agree,\
.cookie-consent-modal._show .action-primary,\
#dsgvoModal.show #dsvgo-banner__button,\
.basicLightbox--visible #accept-all-gdpr,\
#gdpr-modal.in .gdpr-modal__btn--accept,\
.cookiehint .btn.cookieagree,\
#cookiealert .modal.in .btn[href*="accept"],\
#lml-data-consent-accept,\
#CBCookieMsg.in .btn[onclick*="approveCookies"],\
#cookiewall-container .button[name="submit"],\
#cookie_disclaimer.in .cookie_disclaimer_button,\
.m-cookie.iziModal[style*="block"] .m-cookie__save2.button,\
kamino-cookie-policy .mat-raised-button,\
#surbma-gpga-modal[style*="block"] button,\
#GDPR.overlayBox .menuButton,\
#cookiebar .cookie-selection-button.accept,\
.modal.in .btn.close-modal-cookie,\
#consent-module[style*="block"] #consent-module-text-button,\
.modal #consentButton,\
#consent-modal[style*="block"] .lm_modal__modal__content__body__buttons__ok,\
.cookiesOverlay3Box #cookiesConsentOK,\
.bemCookieOverlay--activePopup .bemCookieOverlay__btn--save,\
#root main ~ div [data-gi-selector="reject-all-cookies"] ~ div a,\
.cookies-management .cookies-deny,\
.offcanvas.is-open .js-offcanvas-cookie-submit,\
.force--consent.show--consent #cs_save__btn,\
.force--consent.show--consent #s-sv-bn,\
#cookieNoticeModal.vrm-reveal[style*="block"] .vrm-reveal__icon--close',
'.cookie-banner .cookie-banner__buttons .cookie-banner__button--reject,\
.cookie-consent-banner .cookie-consent-banner__reject,\
.cookie-notification .cookie-notification__buttons .cookie-notification__reject,\
.cookie-policy-banner .cookie-policy-banner__buttons .cookie-policy-banner__reject,\
.cookie-warning .cookie-warning__buttons .cookie-warning__reject,\
.cookie-notice .cookie-notice__buttons .cookie-notice__reject,\
.cookie-alert .cookie-alert__buttons .cookie-alert__reject,\
.cookie-popup .cookie-popup__buttons .cookie-popup__reject,\
.cookie-modal .cookie-modal__buttons .cookie-modal__reject,\
.cookie-dialog .cookie-dialog__buttons .cookie-dialog__reject,\
.gdpr-banner .gdpr-banner__buttons .gdpr-banner__reject,\
.gdpr-modal .gdpr-modal__buttons .gdpr-modal__reject,\
.gdpr-notice .gdpr-notice__buttons .gdpr-notice__reject,\
.gdpr-popup .gdpr-popup__buttons .gdpr-popup__reject,\
.gdpr-dialog .gdpr-dialog__buttons .gdpr-dialog__reject,\
.privacy-banner .privacy-banner__buttons .privacy-banner__reject,\
.privacy-modal .privacy-modal__buttons .privacy-modal__reject,\
.privacy-notice .privacy-notice__buttons .privacy-notice__reject,\
.privacy-popup .privacy-popup__buttons .privacy-popup__reject,\
.privacy-dialog .privacy-dialog__buttons .privacy-dialog__reject',
'.consent-banner .consent-banner__buttons .consent-banner__reject,\
.consent-modal .consent-modal__buttons .consent-modal__reject,\
.consent-notice .consent-notice__buttons .consent-notice__reject,\
.consent-popup .consent-popup__buttons .consent-popup__reject,\
.consent-dialog .consent-dialog__buttons .consent-dialog__reject,\
.tracking-banner .tracking-banner__buttons .tracking-banner__reject,\
.tracking-modal .tracking-modal__buttons .tracking-modal__reject,\
.tracking-notice .tracking-notice__buttons .tracking-notice__reject,\
.tracking-popup .tracking-popup__buttons .tracking-popup__reject,\
.tracking-dialog .tracking-dialog__buttons .tracking-dialog__reject',
'.cookie-settings-modal .cookie-settings__reject,\
.cookie-settings-modal .cookie-settings__customize,\
.cookie-preferences-modal .cookie-preferences__reject,\
.cookie-preferences-modal .cookie-preferences__customize,\
.cookie-manager-modal .cookie-manager__reject,\
.cookie-manager-modal .cookie-manager__customize,\
.cookie-control-modal .cookie-control__reject,\
.cookie-control-modal .cookie-control__customize,\
.cookie-options-modal .cookie-options__reject,\
.cookie-options-modal .cookie-options__customize',
'.data-privacy-modal .data-privacy__reject,\
.data-privacy-modal .data-privacy__customize,\
.data-protection-modal .data-protection__reject,\
.data-protection-modal .data-protection__customize,\
.data-consent-modal .data-consent__reject,\
.data-consent-modal .data-consent__customize,\
.data-settings-modal .data-settings__reject,\
.data-settings-modal .data-settings__customize,\
.data-preferences-modal .data-preferences__reject,\
.data-preferences-modal .data-preferences__customize',
'.privacy-manager-modal .privacy-manager__reject,\
.privacy-manager-modal .privacy-manager__customize,\
.privacy-settings-modal .privacy-settings__reject,\
.privacy-settings-modal .privacy-settings__customize,\
.privacy-options-modal .privacy-options__reject,\
.privacy-options-modal .privacy-options__customize,\
.privacy-control-modal .privacy-control__reject,\
.privacy-control-modal .privacy-control__customize,\
.privacy-preferences-modal .privacy-preferences__reject,\
.privacy-preferences-modal .privacy-preferences__customize',
'.consent-manager-modal .consent-manager__reject,\
.consent-manager-modal .consent-manager__customize,\
.consent-settings-modal .consent-settings__reject,\
.consent-settings-modal .consent-settings__customize,\
.consent-options-modal .consent-options__reject,\
.consent-options-modal .consent-options__customize,\
.consent-control-modal .consent-control__reject,\
.consent-control-modal .consent-control__customize,\
.consent-preferences-modal .consent-preferences__reject,\
.consent-preferences-modal .consent-preferences__customize',
'.tracking-manager-modal .tracking-manager__reject,\
.tracking-manager-modal .tracking-manager__customize,\
.tracking-settings-modal .tracking-settings__reject,\
.tracking-settings-modal .tracking-settings__customize,\
.tracking-options-modal .tracking-options__reject,\
.tracking-options-modal .tracking-options__customize,\
.tracking-control-modal .tracking-control__reject,\
.tracking-control-modal .tracking-control__customize,\
.tracking-preferences-modal .tracking-preferences__reject,\
.tracking-preferences-modal .tracking-preferences__customize',
'.gdpr-manager-modal .gdpr-manager__reject,\
.gdpr-manager-modal .gdpr-manager__customize,\
.gdpr-settings-modal .gdpr-settings__reject,\
.gdpr-settings-modal .gdpr-settings__customize,\
.gdpr-options-modal .gdpr-options__reject,\
.gdpr-options-modal .gdpr-options__customize,\
.gdpr-control-modal .gdpr-control__reject,\
.gdpr-control-modal .gdpr-control__customize,\
.gdpr-preferences-modal .gdpr-preferences__reject,\
.gdpr-preferences-modal .gdpr-preferences__customize',
'div[class*="cookie-banner"] button[class*="reject"],\
div[class*="cookie-banner"] button[class*="decline"],\
div[class*="cookie-banner"] button[class*="settings"],\
div[id*="cookie-banner"] button[class*="reject"],\
div[id*="cookie-banner"] button[class*="decline"],\
div[id*="cookie-banner"] button[class*="settings"]',
'div[class*="cookie-consent"] button[class*="reject"],\
div[class*="cookie-consent"] button[class*="decline"],\
div[class*="cookie-consent"] button[class*="settings"],\
div[id*="cookie-consent"] button[class*="reject"],\
div[id*="cookie-consent"] button[class*="decline"],\
div[id*="cookie-consent"] button[class*="settings"]',
'div[class*="cookie-notice"] button[class*="reject"],\
div[class*="cookie-notice"] button[class*="decline"],\
div[class*="cookie-notice"] button[class*="settings"],\
div[id*="cookie-notice"] button[class*="reject"],\
div[id*="cookie-notice"] button[class*="decline"],\
div[id*="cookie-notice"] button[class*="settings"]',
'[data-*="cookie"] button[data-*="reject"],\
[data-*="cookie"] button[data-*="decline"],\
[data-*="cookie"] button[data-*="settings"],\
[data-*="gdpr"] button[data-*="reject"],\
[data-*="gdpr"] button[data-*="decline"],\
[data-*="gdpr"] button[data-*="settings"]',
'div[class*="cookie-layer"] button[class*="reject"],\
div[class*="cookie-layer"] button[class*="decline"],\
div[class*="cookie-layer"] button[class*="settings"],\
div[id*="cookie-layer"] button[class*="reject"],\
div[id*="cookie-layer"] button[class*="decline"],\
div[id*="cookie-layer"] button[class*="settings"]',
'div[class*="cookie-section"] button[class*="reject"],\
div[class*="cookie-section"] button[class*="decline"],\
div[class*="cookie-section"] button[class*="settings"],\
div[id*="cookie-section"] button[class*="reject"],\
div[id*="cookie-section"] button[class*="decline"],\
div[id*="cookie-section"] button[class*="settings"]',
'div[class*="cookie-container"] button[class*="reject"],\
div[class*="cookie-container"] button[class*="decline"],\
div[class*="cookie-container"] button[class*="settings"],\
div[id*="cookie-container"] button[class*="reject"],\
div[id*="cookie-container"] button[class*="decline"],\
div[id*="cookie-container"] button[class*="settings"]',
'[data-purpose*="cookie"] button[data-purpose*="reject"],\
[data-purpose*="cookie"] button[data-purpose*="decline"],\
[data-purpose*="cookie"] button[data-purpose*="settings"],\
[data-ref*="cookie"] button[data-ref*="reject"],\
[data-ref*="cookie"] button[data-ref*="decline"],\
[data-ref*="cookie"] button[data-ref*="settings"]',
'[id*="cookie-manager"] button[id*="reject"],\
[id*="cookie-manager"] button[id*="decline"],\
[id*="cookie-manager"] button[id*="settings"],\
[id*="cookie-control"] button[id*="reject"],\
[id*="cookie-control"] button[id*="decline"],\
[id*="cookie-control"] button[id*="settings"]',
'div[class*="vn-cookie"] button[class*="reject"],\
div[class*="vn-cookie"] button[class*="decline"],\
div[class*="vn-cookie"] button[class*="settings"],\
div[id*="vn-cookie"] button[class*="reject"],\
div[id*="vn-cookie"] button[class*="decline"],\
div[id*="vn-cookie"] button[class*="settings"]',
'div[class*="ecommerce"] button[class*="cookie-reject"],\
div[class*="ecommerce"] button[class*="cookie-decline"],\
div[class*="ecommerce"] button[class*="cookie-settings"],\
div[id*="ecommerce"] button[class*="cookie-reject"],\
div[id*="ecommerce"] button[class*="cookie-decline"],\
div[id*="ecommerce"] button[class*="cookie-settings"]',
'div[class*="news"] button[class*="cookie-reject"],\
div[class*="news"] button[class*="cookie-decline"],\
div[class*="news"] button[class*="cookie-settings"],\
div[id*="news"] button[class*="cookie-reject"],\
div[id*="news"] button[class*="cookie-decline"],\
div[id*="news"] button[class*="cookie-settings"]',
'div[class*="retail"] button[class*="cookie-reject"],\
div[class*="retail"] button[class*="cookie-decline"],\
div[class*="retail"] button[class*="cookie-settings"],\
div[id*="retail"] button[class*="cookie-reject"],\
div[id*="retail"] button[class*="cookie-decline"],\
div[id*="retail"] button[class*="cookie-settings"]',
'div[class*="gdpr"] button[class*="reject"],\
div[class*="gdpr"] button[class*="decline"],\
div[class*="gdpr"] button[class*="settings"],\
div[id*="gdpr"] button[class*="reject"],\
div[id*="gdpr"] button[class*="decline"],\
div[id*="gdpr"] button[class*="settings"]',
'div[class*="privacy"] button[class*="reject"],\
div[class*="privacy"] button[class*="decline"],\
div[class*="privacy"] button[class*="settings"],\
div[id*="privacy"] button[class*="reject"],\
div[id*="privacy"] button[class*="decline"],\
div[id*="privacy"] button[class*="settings"]',
'div[class*="bank"] button[class*="cookie-reject"],\
div[class*="bank"] button[class*="cookie-decline"],\
div[class*="bank"] button[class*="cookie-settings"],\
div[id*="bank"] button[class*="cookie-reject"],\
div[id*="bank"] button[class*="cookie-decline"],\
div[id*="bank"] button[class*="cookie-settings"]',
'div[class*="consent"] button[class*="reject"],\
div[class*="consent"] button[class*="decline"],\
div[class*="consent"] button[class*="settings"],\
div[id*="consent"] button[class*="reject"],\
div[id*="consent"] button[class*="decline"],\
div[id*="consent"] button[class*="settings"]',
'div[class*="notice"] button[class*="reject"],\
div[class*="notice"] button[class*="decline"],\
div[class*="notice"] button[class*="settings"],\
div[id*="notice"] button[class*="reject"],\
div[id*="notice"] button[class*="decline"],\
div[id*="notice"] button[class*="settings"]',
'div[class*="popup"] button[class*="reject"],\
div[class*="popup"] button[class*="decline"],\
div[class*="popup"] button[class*="settings"],\
div[id*="popup"] button[class*="reject"],\
div[id*="popup"] button[class*="decline"],\
div[id*="popup"] button[class*="settings"]',
'div[class*="eu-cookie-banner"] button[class*="reject"],\
div[class*="eu-cookie-banner"] button[class*="settings"]',
'div[class*="gdpr-notice"] button[class*="reject"],\
div[class*="gdpr-notice"] button[class*="settings"]',
'div[class*="privacy-consent"] button[class*="reject"],\
div[class*="privacy-consent"] button[class*="settings"]',
'div[class*="asia"] button[class*="cookie-reject"],\
div[class*="asia"] button[class*="cookie-decline"],\
div[class*="asia"] button[class*="cookie-settings"]',
'div[class*="europe"] button[class*="cookie-reject"],\
div[class*="europe"] button[class*="cookie-decline"],\
div[class*="europe"] button[class*="cookie-settings"]',
'div[class*="global"] button[class*="cookie-reject"],\
div[class*="global"] button[class*="cookie-decline"],\
div[class*="global"] button[class*="cookie-settings"]',
'div[class*="america"] button[class*="cookie-reject"],\
div[class*="america"] button[class*="cookie-decline"],\
div[class*="america"] button[class*="cookie-settings"]',
'div[class*="oceania"] button[class*="cookie-reject"],\
div[class*="oceania"] button[class*="cookie-decline"],\
div[class*="oceania"] button[class*="cookie-settings"]',
];
let currentChainElement = 0;
const classname = Math.random()
.toString(36)
.replace(/[^a-z]+/g, '');
// Search loop function
let searchGroupsLength = searchGroups.length,
searchPairsKeys = Object.keys(searchPairs),
searchPairsJoinedKeys = searchPairsKeys.join(','),
timeoutDuration = 300;
function querySelectorAllShadowRoot(selector, root = document) {
const elements = [];
const findElements = node => {
if (node.shadowRoot) {
node.shadowRoot.querySelectorAll(selector).forEach(el => elements.push(el));
node.shadowRoot.querySelectorAll('*').forEach(findElements);
}
};
root.querySelectorAll('*').forEach(findElements);
return elements;
}
function searchLoop(counter) {
if (document.cookie.indexOf('cookie_consent') !== -1) {
return;
}
const dynamicTimeout = Math.min(timeoutDuration * (counter + 1), 2000);
setTimeout(function () {
document.querySelectorAll(searchPairsJoinedKeys).forEach(function (box) {
searchPairsKeys.forEach(function (selector) {
if (box.matches(selector)) {
const shadowElements = querySelectorAllShadowRoot(searchPairs[selector].join(','), box);
shadowElements.forEach(button => {
if (button.click && !button.classList.contains(classname)) {
button.classList.add(classname);
if (typeof chrome == 'object' && chrome.runtime) chrome.runtime.sendMessage({ command: 'cookie_warning_dismissed', url: document.location.href });
button.click();
if (selector != '.message-container' && button.getAttribute('href') != '#cookieman-settings')
setTimeout(function () {
if (button) button.click();
}, 500);
timeoutDuration += 500;
}
});
}
});
});
document.querySelectorAll(searchGroups[counter % searchGroupsLength]).forEach(function (element) {
if (element.click && !element.classList.contains(classname)) {
element.classList.add(classname);
if (typeof chrome == 'object' && chrome.runtime) chrome.runtime.sendMessage({ command: 'cookie_warning_dismissed', url: document.location.href });
element.click();
if (element.getAttribute('aria-pressed') != 'true')
setTimeout(function () {
if (element) element.click();
}, 500);
timeoutDuration += 500;
}
});
if (counter < 100 * searchGroupsLength) {
searchLoop(counter + 1);
}
}, dynamicTimeout);
}
// Embeds handling
function handleEmbeds() {
var l = document.location,
is_audioboom = false,
is_dailymotion = false,
is_dailybuzz = false,
is_playerclipslaliga = false;
switch (l.hostname) {
case 'embeds.audioboom.com':
is_audioboom = true;
break;
case 'dailymotion.com':
case 'www.dailymotion.com':
is_dailymotion = l.pathname.indexOf('/embed') === 0;
break;
case 'geo.dailymotion.com':
is_dailymotion = l.pathname.indexOf('/player') === 0;
break;
case 'dailybuzz.nl':
is_dailybuzz = l.pathname.indexOf('/buzz/embed') === 0;
break;
case 'playerclipslaliga.tv':
is_playerclipslaliga = true;
break;
}
function searchEmbeds() {
setTimeout(function () {
if (is_audioboom) {
document.querySelectorAll('div[id^="cookie-modal"] .modal[style*="block"] .btn.mrs:not(.' + classname + ')').forEach(function (button) {
button.className += ' ' + classname;
button.click();
});
} else if (is_dailymotion) {
document.querySelectorAll('.np_DialogConsent-accept:not(.' + classname + '), .consent_screen-accept:not(.' + classname + ')').forEach(function (button) {
button.className += ' ' + classname;
button.click();
});
} else if (is_dailybuzz) {
document.querySelectorAll('#ask-consent #accept:not(.' + classname + ')').forEach(function (button) {
button.className += ' ' + classname;
button.click();
});
} else if (is_playerclipslaliga) {
document.querySelectorAll('#cookies button[onclick*="saveCookiesSelection"]:not(.' + classname + ')').forEach(function (button) {
button.className += ' ' + classname;
button.click();
});
} else {
return;
}
searchEmbeds();
}, 1000);
}
searchEmbeds();
}
// Initialize
var start = setInterval(function () {
var html = document.querySelector('html');
if (!html || /idc0_350/.test(html.className)) return;
clearInterval(start);
html.className += ' idc0_350';
searchLoop(0);
handleEmbeds();
}, 500);
var hostname = document.location.hostname.replace(/^w{2,3}\d*\./i, ''),
items = getItem(hostname);
if (items) {
(items instanceof Array ? items : [items]).forEach(function (item) {
let value = localStorage.getItem(item.key);
if (value == null || (item.strict && value != item.value)) {
localStorage.setItem(item.key, item.value);
counter++;
}
});
if (counter > 0) document.location.reload();
}
})();
@@ -0,0 +1,704 @@
// ==UserScript==
// @name Return YouTube Dislike
// @namespace https://www.returnyoutubedislike.com/
// @homepage https://www.returnyoutubedislike.com/
// @version 3.1.5
// @encoding utf-8
// @description Return of the YouTube Dislike, Based off https://www.returnyoutubedislike.com/
// @icon https://github.com/Anarios/return-youtube-dislike/raw/main/Icons/Return%20Youtube%20Dislike%20-%20Transparent.png
// @author Anarios & JRWR
// @match *://*.youtube.com/*
// @exclude *://music.youtube.com/*
// @exclude *://*.music.youtube.com/*
// @compatible chrome
// @compatible firefox
// @compatible opera
// @compatible safari
// @compatible edge
// @grant GM.xmlHttpRequest
// @connect youtube.com
// @grant GM_addStyle
// @run-at document-end
// @downloadURL https://update.greasyfork.org/scripts/436115/Return%20YouTube%20Dislike.user.js
// @updateURL https://update.greasyfork.org/scripts/436115/Return%20YouTube%20Dislike.meta.js
// ==/UserScript==
const extConfig = {
// BEGIN USER OPTIONS
// You may change the following variables to allowed values listed in the corresponding brackets (* means default). Keep the style and keywords intact.
showUpdatePopup: false, // [true, false*] Show a popup tab after extension update (See what's new)
disableVoteSubmission: false, // [true, false*] Disable like/dislike submission (Stops counting your likes and dislikes)
disableLogging: true, // [true*, false] Disable Logging API Response in JavaScript Console.
coloredThumbs: false, // [true, false*] Colorize thumbs (Use custom colors for thumb icons)
coloredBar: false, // [true, false*] Colorize ratio bar (Use custom colors for ratio bar)
colorTheme: "classic", // [classic*, accessible, neon] Color theme (red/green, blue/yellow, pink/cyan)
numberDisplayFormat: "compactShort", // [compactShort*, compactLong, standard] Number format (For non-English locale users, you may be able to improve appearance with a different option. Please file a feature request if your locale is not covered)
numberDisplayRoundDown: true, // [true*, false] Round down numbers (Show rounded down numbers)
tooltipPercentageMode: "none", // [none*, dash_like, dash_dislike, both, only_like, only_dislike] Mode of showing percentage in like/dislike bar tooltip.
numberDisplayReformatLikes: false, // [true, false*] Re-format like numbers (Make likes and dislikes format consistent)
rateBarEnabled: false, // [true, false*] Enables ratio bar under like/dislike buttons
// END USER OPTIONS
};
const LIKED_STATE = "LIKED_STATE";
const DISLIKED_STATE = "DISLIKED_STATE";
const NEUTRAL_STATE = "NEUTRAL_STATE";
let previousState = 3; //1=LIKED, 2=DISLIKED, 3=NEUTRAL
let likesvalue = 0;
let dislikesvalue = 0;
let preNavigateLikeButton = null;
let isMobile = location.hostname == "m.youtube.com";
let isShorts = () => location.pathname.startsWith("/shorts");
let mobileDislikes = 0;
function cLog(text, subtext = "") {
if (!extConfig.disableLogging) {
subtext = subtext.trim() === "" ? "" : `(${subtext})`;
console.log(`[Return YouTube Dislikes] ${text} ${subtext}`);
}
}
function isInViewport(element) {
const rect = element.getBoundingClientRect();
const height = innerHeight || document.documentElement.clientHeight;
const width = innerWidth || document.documentElement.clientWidth;
return (
// When short (channel) is ignored, the element (like/dislike AND short itself) is
// hidden with a 0 DOMRect. In this case, consider it outside of Viewport
!(rect.top == 0 && rect.left == 0 && rect.bottom == 0 && rect.right == 0) &&
rect.top >= 0 &&
rect.left >= 0 &&
rect.bottom <= height &&
rect.right <= width
);
}
function getButtons() {
if (isShorts()) {
let elements = document.querySelectorAll(
isMobile ? "ytm-like-button-renderer" : "#like-button > ytd-like-button-renderer",
);
for (let element of elements) {
if (isInViewport(element)) {
return element;
}
}
}
if (isMobile) {
return (
document.querySelector(".slim-video-action-bar-actions .segmented-buttons") ??
document.querySelector(".slim-video-action-bar-actions")
);
}
if (document.getElementById("menu-container")?.offsetParent === null) {
return (
document.querySelector("ytd-menu-renderer.ytd-watch-metadata > div") ??
document.querySelector("ytd-menu-renderer.ytd-video-primary-info-renderer > div")
);
} else {
return document.getElementById("menu-container")?.querySelector("#top-level-buttons-computed");
}
}
function getDislikeButton() {
if (getButtons().children[0].tagName === "YTD-SEGMENTED-LIKE-DISLIKE-BUTTON-RENDERER") {
if (getButtons().children[0].children[1] === undefined) {
return document.querySelector("#segmented-dislike-button");
} else {
return getButtons().children[0].children[1];
}
} else {
if (getButtons().querySelector("segmented-like-dislike-button-view-model")) {
const dislikeViewModel = getButtons().querySelector("dislike-button-view-model");
if (!dislikeViewModel) cLog("Dislike button wasn't added to DOM yet...");
return dislikeViewModel;
} else {
return getButtons().children[1];
}
}
}
function getLikeButton() {
return getButtons().children[0].tagName === "YTD-SEGMENTED-LIKE-DISLIKE-BUTTON-RENDERER"
? document.querySelector("#segmented-like-button") !== null
? document.querySelector("#segmented-like-button")
: getButtons().children[0].children[0]
: getButtons().querySelector("like-button-view-model") ?? getButtons().children[0];
}
function getLikeTextContainer() {
return (
getLikeButton().querySelector("#text") ??
getLikeButton().getElementsByTagName("yt-formatted-string")[0] ??
getLikeButton().querySelector("span[role='text']")
);
}
function getDislikeTextContainer() {
const dislikeButton = getDislikeButton();
let result =
dislikeButton?.querySelector("#text") ??
dislikeButton?.getElementsByTagName("yt-formatted-string")[0] ??
dislikeButton?.querySelector("span[role='text']");
if (result === null) {
let textSpan = document.createElement("span");
textSpan.id = "text";
textSpan.style.marginLeft = "6px";
dislikeButton?.querySelector("button").appendChild(textSpan);
if (dislikeButton) dislikeButton.querySelector("button").style.width = "auto";
result = textSpan;
}
return result;
}
function createObserver(options, callback) {
const observerWrapper = new Object();
observerWrapper.options = options;
observerWrapper.observer = new MutationObserver(callback);
observerWrapper.observe = function (element) {
this.observer.observe(element, this.options);
};
observerWrapper.disconnect = function () {
this.observer.disconnect();
};
return observerWrapper;
}
let shortsObserver = null;
if (isShorts() && !shortsObserver) {
cLog("Initializing shorts mutation observer");
shortsObserver = createObserver(
{
attributes: true,
},
(mutationList) => {
mutationList.forEach((mutation) => {
if (
mutation.type === "attributes" &&
mutation.target.nodeName === "TP-YT-PAPER-BUTTON" &&
mutation.target.id === "button"
) {
cLog("Short thumb button status changed");
if (mutation.target.getAttribute("aria-pressed") === "true") {
mutation.target.style.color =
mutation.target.parentElement.parentElement.id === "like-button"
? getColorFromTheme(true)
: getColorFromTheme(false);
} else {
mutation.target.style.color = "unset";
}
return;
}
cLog("Unexpected mutation observer event: " + mutation.target + mutation.type);
});
},
);
}
function isVideoLiked() {
if (isMobile) {
return getLikeButton().querySelector("button").getAttribute("aria-label") == "true";
}
return getLikeButton().classList.contains("style-default-active");
}
function isVideoDisliked() {
if (isMobile) {
return getDislikeButton()?.querySelector("button").getAttribute("aria-label") == "true";
}
return getDislikeButton()?.classList.contains("style-default-active");
}
function isVideoNotLiked() {
if (isMobile) {
return !isVideoLiked();
}
return getLikeButton().classList.contains("style-text");
}
function isVideoNotDisliked() {
if (isMobile) {
return !isVideoDisliked();
}
return getDislikeButton()?.classList.contains("style-text");
}
function checkForUserAvatarButton() {
if (isMobile) {
return;
}
if (document.querySelector("#avatar-btn")) {
return true;
} else {
return false;
}
}
function getState() {
if (isVideoLiked()) {
return LIKED_STATE;
}
if (isVideoDisliked()) {
return DISLIKED_STATE;
}
return NEUTRAL_STATE;
}
function setLikes(likesCount) {
if (isMobile) {
getButtons().children[0].querySelector(".button-renderer-text").innerText = likesCount;
return;
}
getLikeTextContainer().innerText = likesCount;
}
function setDislikes(dislikesCount) {
if (isMobile) {
mobileDislikes = dislikesCount;
return;
}
const _container = getDislikeTextContainer();
_container?.removeAttribute("is-empty");
if (_container?.innerText !== dislikesCount) {
_container.innerText = dislikesCount;
}
}
function getLikeCountFromButton() {
try {
if (isShorts()) {
//Youtube Shorts don't work with this query. It's not necessary; we can skip it and still see the results.
//It should be possible to fix this function, but it's not critical to showing the dislike count.
return false;
}
let likeButton =
getLikeButton().querySelector("yt-formatted-string#text") ?? getLikeButton().querySelector("button");
let likesStr = likeButton.getAttribute("aria-label").replace(/\D/g, "");
return likesStr.length > 0 ? parseInt(likesStr) : false;
} catch {
return false;
}
}
(typeof GM_addStyle != "undefined"
? GM_addStyle
: (styles) => {
let styleNode = document.createElement("style");
styleNode.type = "text/css";
styleNode.innerText = styles;
document.head.appendChild(styleNode);
})(`
#return-youtube-dislike-bar-container {
background: var(--yt-spec-icon-disabled);
border-radius: 2px;
}
#return-youtube-dislike-bar {
background: var(--yt-spec-text-primary);
border-radius: 2px;
transition: all 0.15s ease-in-out;
}
.ryd-tooltip {
position: absolute;
display: block;
height: 2px;
bottom: -10px;
}
.ryd-tooltip-bar-container {
width: 100%;
height: 2px;
position: absolute;
padding-top: 6px;
padding-bottom: 12px;
top: -6px;
}
ytd-menu-renderer.ytd-watch-metadata {
overflow-y: visible !important;
}
#top-level-buttons-computed {
position: relative !important;
}
`);
function createRateBar(likes, dislikes) {
if (isMobile || !extConfig.rateBarEnabled) {
return;
}
let rateBar = document.getElementById("return-youtube-dislike-bar-container");
const widthPx = getLikeButton().clientWidth + (getDislikeButton()?.clientWidth ?? 52);
const widthPercent = likes + dislikes > 0 ? (likes / (likes + dislikes)) * 100 : 50;
var likePercentage = parseFloat(widthPercent.toFixed(1));
const dislikePercentage = (100 - likePercentage).toLocaleString();
likePercentage = likePercentage.toLocaleString();
var tooltipInnerHTML;
switch (extConfig.tooltipPercentageMode) {
case "dash_like":
tooltipInnerHTML = `${likes.toLocaleString()}&nbsp;/&nbsp;${dislikes.toLocaleString()}&nbsp;&nbsp;-&nbsp;&nbsp;${likePercentage}%`;
break;
case "dash_dislike":
tooltipInnerHTML = `${likes.toLocaleString()}&nbsp;/&nbsp;${dislikes.toLocaleString()}&nbsp;&nbsp;-&nbsp;&nbsp;${dislikePercentage}%`;
break;
case "both":
tooltipInnerHTML = `${likePercentage}%&nbsp;/&nbsp;${dislikePercentage}%`;
break;
case "only_like":
tooltipInnerHTML = `${likePercentage}%`;
break;
case "only_dislike":
tooltipInnerHTML = `${dislikePercentage}%`;
break;
default:
tooltipInnerHTML = `${likes.toLocaleString()}&nbsp;/&nbsp;${dislikes.toLocaleString()}`;
}
if (!rateBar && !isMobile) {
let colorLikeStyle = "";
let colorDislikeStyle = "";
if (extConfig.coloredBar) {
colorLikeStyle = "; background-color: " + getColorFromTheme(true);
colorDislikeStyle = "; background-color: " + getColorFromTheme(false);
}
getButtons().insertAdjacentHTML(
"beforeend",
`
<div class="ryd-tooltip" style="width: ${widthPx}px">
<div class="ryd-tooltip-bar-container">
<div
id="return-youtube-dislike-bar-container"
style="width: 100%; height: 2px;${colorDislikeStyle}"
>
<div
id="return-youtube-dislike-bar"
style="width: ${widthPercent}%; height: 100%${colorDislikeStyle}"
></div>
</div>
</div>
<tp-yt-paper-tooltip position="top" id="ryd-dislike-tooltip" class="style-scope ytd-sentiment-bar-renderer" role="tooltip" tabindex="-1">
<!--css-build:shady-->${tooltipInnerHTML}
</tp-yt-paper-tooltip>
</div>
`,
);
let descriptionAndActionsElement = document.getElementById("top-row");
descriptionAndActionsElement.style.borderBottom = "1px solid var(--yt-spec-10-percent-layer)";
descriptionAndActionsElement.style.paddingBottom = "10px";
} else {
document.querySelector(".ryd-tooltip").style.width = widthPx + "px";
document.getElementById("return-youtube-dislike-bar").style.width = widthPercent + "%";
if (extConfig.coloredBar) {
document.getElementById("return-youtube-dislike-bar-container").style.backgroundColor = getColorFromTheme(false);
document.getElementById("return-youtube-dislike-bar").style.backgroundColor = getColorFromTheme(true);
}
}
}
function setState() {
cLog("Fetching votes...");
let statsSet = false;
fetch(`https://returnyoutubedislikeapi.com/votes?videoId=${getVideoId()}`).then((response) => {
response.json().then((json) => {
if (json && !("traceId" in response) && !statsSet) {
const { dislikes, likes } = json;
cLog(`Received count: ${dislikes}`);
likesvalue = likes;
dislikesvalue = dislikes;
setDislikes(numberFormat(dislikes));
if (extConfig.numberDisplayReformatLikes === true) {
const nativeLikes = getLikeCountFromButton();
if (nativeLikes !== false) {
setLikes(numberFormat(nativeLikes));
}
}
createRateBar(likes, dislikes);
if (extConfig.coloredThumbs === true) {
const dislikeButton = getDislikeButton();
if (isShorts()) {
// for shorts, leave deactived buttons in default color
const shortLikeButton = getLikeButton().querySelector("tp-yt-paper-button#button");
const shortDislikeButton = dislikeButton?.querySelector("tp-yt-paper-button#button");
if (shortLikeButton.getAttribute("aria-pressed") === "true") {
shortLikeButton.style.color = getColorFromTheme(true);
}
if (shortDislikeButton && shortDislikeButton.getAttribute("aria-pressed") === "true") {
shortDislikeButton.style.color = getColorFromTheme(false);
}
shortsObserver.observe(shortLikeButton);
shortsObserver.observe(shortDislikeButton);
} else {
getLikeButton().style.color = getColorFromTheme(true);
if (dislikeButton) dislikeButton.style.color = getColorFromTheme(false);
}
}
}
});
});
}
function updateDOMDislikes() {
setDislikes(numberFormat(dislikesvalue));
createRateBar(likesvalue, dislikesvalue);
}
function likeClicked() {
if (checkForUserAvatarButton() == true) {
if (previousState == 1) {
likesvalue--;
updateDOMDislikes();
previousState = 3;
} else if (previousState == 2) {
likesvalue++;
dislikesvalue--;
updateDOMDislikes();
previousState = 1;
} else if (previousState == 3) {
likesvalue++;
updateDOMDislikes();
previousState = 1;
}
if (extConfig.numberDisplayReformatLikes === true) {
const nativeLikes = getLikeCountFromButton();
if (nativeLikes !== false) {
setLikes(numberFormat(nativeLikes));
}
}
}
}
function dislikeClicked() {
if (checkForUserAvatarButton() == true) {
if (previousState == 3) {
dislikesvalue++;
updateDOMDislikes();
previousState = 2;
} else if (previousState == 2) {
dislikesvalue--;
updateDOMDislikes();
previousState = 3;
} else if (previousState == 1) {
likesvalue--;
dislikesvalue++;
updateDOMDislikes();
previousState = 2;
if (extConfig.numberDisplayReformatLikes === true) {
const nativeLikes = getLikeCountFromButton();
if (nativeLikes !== false) {
setLikes(numberFormat(nativeLikes));
}
}
}
}
}
function setInitialState() {
setState();
}
function getVideoId() {
const urlObject = new URL(window.location.href);
const pathname = urlObject.pathname;
if (pathname.startsWith("/clip")) {
return (document.querySelector("meta[itemprop='videoId']") || document.querySelector("meta[itemprop='identifier']")).content;
} else {
if (pathname.startsWith("/shorts")) {
return pathname.slice(8);
}
return urlObject.searchParams.get("v");
}
}
function isVideoLoaded() {
if (isMobile) {
return document.getElementById("player").getAttribute("loading") == "false";
}
const videoId = getVideoId();
return (
// desktop: spring 2024 UI
document.querySelector(`ytd-watch-grid[video-id='${videoId}']`) !== null ||
// desktop: older UI
document.querySelector(`ytd-watch-flexy[video-id='${videoId}']`) !== null ||
// mobile: no video-id attribute
document.querySelector('#player[loading="false"]:not([hidden])') !== null
);
}
function roundDown(num) {
if (num < 1000) return num;
const int = Math.floor(Math.log10(num) - 2);
const decimal = int + (int % 3 ? 1 : 0);
const value = Math.floor(num / 10 ** decimal);
return value * 10 ** decimal;
}
function numberFormat(numberState) {
let numberDisplay;
if (extConfig.numberDisplayRoundDown === false) {
numberDisplay = numberState;
} else {
numberDisplay = roundDown(numberState);
}
return getNumberFormatter(extConfig.numberDisplayFormat).format(numberDisplay);
}
function getNumberFormatter(optionSelect) {
let userLocales;
if (document.documentElement.lang) {
userLocales = document.documentElement.lang;
} else if (navigator.language) {
userLocales = navigator.language;
} else {
try {
userLocales = new URL(
Array.from(document.querySelectorAll("head > link[rel='search']"))
?.find((n) => n?.getAttribute("href")?.includes("?locale="))
?.getAttribute("href"),
)?.searchParams?.get("locale");
} catch {
cLog("Cannot find browser locale. Use en as default for number formatting.");
userLocales = "en";
}
}
let formatterNotation;
let formatterCompactDisplay;
switch (optionSelect) {
case "compactLong":
formatterNotation = "compact";
formatterCompactDisplay = "long";
break;
case "standard":
formatterNotation = "standard";
formatterCompactDisplay = "short";
break;
case "compactShort":
default:
formatterNotation = "compact";
formatterCompactDisplay = "short";
}
const formatter = Intl.NumberFormat(userLocales, {
notation: formatterNotation,
compactDisplay: formatterCompactDisplay,
});
return formatter;
}
function getColorFromTheme(voteIsLike) {
let colorString;
switch (extConfig.colorTheme) {
case "accessible":
if (voteIsLike === true) {
colorString = "dodgerblue";
} else {
colorString = "gold";
}
break;
case "neon":
if (voteIsLike === true) {
colorString = "aqua";
} else {
colorString = "magenta";
}
break;
case "classic":
default:
if (voteIsLike === true) {
colorString = "lime";
} else {
colorString = "red";
}
}
return colorString;
}
let smartimationObserver = null;
function setEventListeners(evt) {
let jsInitChecktimer;
function checkForJS_Finish() {
//console.log();
if (isShorts() || (getButtons()?.offsetParent && isVideoLoaded())) {
const buttons = getButtons();
const dislikeButton = getDislikeButton();
if (preNavigateLikeButton !== getLikeButton() && dislikeButton) {
cLog("Registering button listeners...");
try {
getLikeButton().addEventListener("click", likeClicked);
dislikeButton?.addEventListener("click", dislikeClicked);
getLikeButton().addEventListener("touchstart", likeClicked);
dislikeButton?.addEventListener("touchstart", dislikeClicked);
dislikeButton?.addEventListener("focusin", updateDOMDislikes);
dislikeButton?.addEventListener("focusout", updateDOMDislikes);
preNavigateLikeButton = getLikeButton();
if (!smartimationObserver) {
smartimationObserver = createObserver(
{
attributes: true,
subtree: true,
childList: true,
},
updateDOMDislikes,
);
smartimationObserver.container = null;
}
const smartimationContainer = buttons.querySelector("yt-smartimation");
if (smartimationContainer && smartimationObserver.container != smartimationContainer) {
cLog("Initializing smartimation mutation observer");
smartimationObserver.disconnect();
smartimationObserver.observe(smartimationContainer);
smartimationObserver.container = smartimationContainer;
}
} catch {
return;
} //Don't spam errors into the console
}
if (dislikeButton) {
setInitialState();
clearInterval(jsInitChecktimer);
}
}
}
cLog("Setting up...");
jsInitChecktimer = setInterval(checkForJS_Finish, 111);
}
(function () {
"use strict";
window.addEventListener("yt-navigate-finish", setEventListeners, true);
setEventListeners();
})();
if (isMobile) {
let originalPush = history.pushState;
history.pushState = function (...args) {
window.returnDislikeButtonlistenersSet = false;
setEventListeners(args[2]);
return originalPush.apply(history, args);
};
setInterval(() => {
const dislikeButton = getDislikeButton();
if (dislikeButton?.querySelector(".button-renderer-text") === null) {
getDislikeTextContainer().innerText = mobileDislikes;
} else {
if (dislikeButton) dislikeButton.querySelector(".button-renderer-text").innerText = mobileDislikes;
}
}, 1000);
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,18 @@
// ==UserScript==
// @name Startpage - Hide Ads
// @match https://www.startpage.com/*
// @run-at document-start
// ==/UserScript==
new MutationObserver(function(mutations) {
mutations.forEach((mutation) => {
if (mutation.type === 'childList') {
mutation.addedNodes.forEach((node) => {
if (node.nodeType === 1 && node.nodeName === 'DIV' && node.id === 'gcsa-top') {
node.remove();
this.disconnect();
}
});
}
});
}).observe(document, { childList: true, subtree: true });
@@ -0,0 +1,191 @@
// ==UserScript==
// @name TrackingTokenStripper
// @version 1.4
// @description Remove most of the annoying tracking token from URL parameters
// @license MIT
// @homepage https://blog.miniasp.com/
// @homepageURL https://blog.miniasp.com/
// @website https://www.facebook.com/will.fans
// @source https://github.com/doggy8088/TrackingTokenStripper/raw/refs/heads/master/TrackingTokenStripper.user.js
// @namespace https://github.com/doggy8088/TrackingTokenStripper
// @author Will Huang
// @match *://*/*
// @run-at document-start
// ==/UserScript==
(function () {
'use strict';
const oldReplaceState = history.replaceState;
history.replaceState = function replaceState() {
let ret = oldReplaceState.apply(this, arguments);
window.dispatchEvent(new Event('replacestate'));
window.dispatchEvent(new Event('locationchange'));
return ret;
};
window.addEventListener('popstate', () => {
window.dispatchEvent(new Event('locationchange'));
});
window.addEventListener('locationchange', function () {
executeActions();
});
executeActions();
let id = setInterval(executeActions, 500);
setTimeout(() => { clearInterval(id); }, 2000);
function executeActions() {
var s = TrackingTokenStripper(location.href)
// facebook
.remove('fbclid')
.removeByDomain('www.facebook.com', 'privacy_mutation_token')
.removeByDomain('www.facebook.com', 'acontext')
.removeByDomain('www.facebook.com', '__xts__[0]')
.removeByDomain('www.facebook.com', 'notif_t')
.removeByDomain('www.facebook.com', 'notif_id')
.removeByDomain('www.facebook.com', 'notif_ids[0]')
.removeByDomain('www.facebook.com', 'notif_ids[1]')
.removeByDomain('www.facebook.com', 'notif_ids[2]')
.removeByDomain('www.facebook.com', 'notif_ids[3]')
.removeByDomain('www.facebook.com', 'ref', 'notif')
.removeByDomain('www.facebook.com', 'ref=watch_permalink')
// Dropbox
.removeByDomain('www.dropbox.com', '_ad')
.removeByDomain('www.dropbox.com', '_camp')
.removeByDomain('www.dropbox.com', '_tk')
// YouTube
// https://youtu.be/4f-Y9G5ENPc?si=SHSu2hEdSbXGy4_Q
// https://www.youtube.com/embed/4f-Y9G5ENPc?si=GQFJV_nKMXxpiQb6
.removeByDomain('youtu.be', 'si')
.removeByDomain('www.youtube.com', 'si')
// Google Analytics
// https://support.google.com/analytics/answer/1033863?hl=en
.remove('utm_id')
.remove('utm_source')
.remove('utm_medium')
.remove('utm_campaign')
.remove('utm_term')
.remove('utm_content')
.remove('_ga')
// GA - others
.remove('utm_campaignid')
.remove('utm_cid')
.remove('utm_reader')
.remove('utm_referrer')
.remove('utm_name')
.remove('utm_social')
.remove('utm_social-type')
.remove('gclid')
.remove('igshid')
.remove('_hsenc')
.remove('_hsmi')
.remove('mc_cid')
.remove('mc_eid')
.remove('mkt_tok')
.remove('yclid')
.remove('_openstat')
// devblogs.microsoft.com
.removeByDomain('devblogs.microsoft.com', 'utm_issue')
.removeByDomain('devblogs.microsoft.com', 'utm_position')
.removeByDomain('devblogs.microsoft.com', 'utm_topic')
.removeByDomain('devblogs.microsoft.com', 'utm_section')
.removeByDomain('devblogs.microsoft.com', 'utm_cta')
.removeByDomain('devblogs.microsoft.com', 'utm_description')
.removeByDomain('devblogs.microsoft.com', 'ocid')
// Microsoft
.remove('wt.mc_id')
.removeByDomain('learn.microsoft.com', 'ocid')
.removeByDomain('learn.microsoft.com', 'redirectedfrom')
.removeByDomain('azure.microsoft.com', 'OCID')
.removeByDomain('azure.microsoft.com', 'ef_id')
.removeByDomain('www.msn.com', 'ocid')
.removeByDomain('www.msn.com', 'cvid')
// bilibili
.removeByDomain('www.bilibili.com', 'share_source')
.removeByDomain('www.bilibili.com', 'share_medium')
// Others
.remove('__tn__')
.remove('gclsrc')
.remove('itm_source')
.remove('itm_medium')
.remove('itm_campaign')
.remove('mc') // sendgrid.com
.remove('mcd') // sendgrid.com
.remove('cvosrc') // sendgrid.com
.remove('cr_cc') // https://blogs.microsoft.com/
.remove('sc_channel')
.remove('sc_campaign')
.remove('sc_geo')
.remove('trk')
.remove('sc_publisher')
.remove('trkCampaign')
.remove('sc_outcome')
.remove('sc_country')
.remove('__hstc')
.remove('__hssc')
.remove('__hsfp')
.remove('_gl')
// Yahoo News
.remove('guce_referrer')
.remove('guce_referrer_sig')
.toString();
if (s && location.href !== s) {
// console.log('Changing URL', s);
// location.href = s;
oldReplaceState.apply(history, [{}, '', s]);
}
function TrackingTokenStripper(url) {
const parsedUrl = new URL(url);
return {
remove(name, value) {
if (parsedUrl.searchParams.has(name)) {
if (value && value === parsedUrl.searchParams.get(name)) {
parsedUrl.searchParams.delete(name);
}
if (!value) {
parsedUrl.searchParams.delete(name);
}
}
return TrackingTokenStripper(parsedUrl.toString());
},
removeByDomain(domain, name) {
if (parsedUrl.hostname.toLocaleLowerCase() === domain.toLocaleLowerCase()) {
if (name.indexOf('=') >= 0) {
var [key, value] = name.split("=");
return this.remove(key, value);
} else {
return this.remove(name);
}
} else {
return this;
}
},
toString() {
return parsedUrl.toString();
}
}
}
}
})();
+17
View File
@@ -0,0 +1,17 @@
{config, ...}: {
programs.qutebrowser.keyBindings = {
normal."<Ctrl-w>" = "tab-close";
normal."<Ctrl-Tab>" = "tab-next";
normal."<Ctrl-Shift-Tab>" = "tab-prev";
normal."<Ctrl-b>" = "open file://${config.xdg.dataHome}/qutebrowser/bookmarks.html";
# Ctrl+c is used to leave the current mode and return to normal mode.
insert."<Ctrl-c>" = "mode-leave";
hint."<Ctrl-c>" = "mode-leave";
caret."<Ctrl-c>" = "mode-leave";
command."<Ctrl-c>" = "mode-leave";
prompt."<Ctrl-c>" = "mode-leave";
yesno."<Ctrl-c>" = "mode-leave";
register."<Ctrl-c>" = "mode-leave";
};
}
+30
View File
@@ -0,0 +1,30 @@
{
programs.qutebrowser.searchEngines = rec {
startpage = "https://www.startpage.com/sp/search?q={}";
mynixos = "https://mynixos.com/search?q={}";
duckduckgo = "https://duckduckgo.com/?q={}";
google = "https://google.com/search?hl=en&q={}";
yandex = "https://yandex.com/search/?text={}";
bing = "https://bing.com/search?q={}";
youtube = "https://youtube.com/results?search_query={}";
google-images = "https://google.com/search?hl=en&tbm=isch&q={}";
# AI
chatgpt = "https://chatgpt.com/?q={}";
claude = "https://claude.ai/new?q={}";
gemini = "https://gemini.google.com/app?q={}";
# Maps
amap = "https://maps.apple.com/?q={}";
gmap = "https://www.google.com/maps/search/{}";
# shortcuts
g = google;
n = mynixos;
gpt = chatgpt;
gem = gemini;
cla = claude;
DEFAULT = startpage;
};
}
+52
View File
@@ -0,0 +1,52 @@
{config, ...}: {
programs.qutebrowser = {
settings = {
url = rec {
default_page = "file://${config.xdg.dataHome}/qutebrowser/bookmarks.html";
start_pages = [default_page];
};
new_instance_open_target = "window";
"tabs.last_close" = "close";
"statusbar.widgets" = ["keypress" "url" "progress"];
# Adblock
"content.blocking.enabled" = true;
"content.blocking.method" = "adblock";
"content.blocking.adblock.lists" = [
"https://easylist.to/easylist/easylist.txt"
"https://easylist.to/easylist/easyprivacy.txt"
"https://secure.fanboy.co.nz/fanboy-cookiemonster.txt"
];
# Clipboard access (needed for Excalidraw, Cyberchef, etc.)
"content.javascript.clipboard" = "access";
# Downloads
"downloads.location.directory" = "~/Downloads";
"downloads.location.prompt" = false;
# Editor (Ctrl+e in text fields)
"editor.command" = ["ghostty" "-e" "nvim" "{}"];
# Tabs
# "tabs.show" = "switching";
# "tabs.show_switching_delay" = 3000;
# Scrollbar
"scrolling.bar" = "never";
# Statusbar
"statusbar.show" = "in-mode";
# Privacy
"content.geolocation" = false;
"content.cookies.accept" = "no-3rdparty";
};
extraConfig = ''
c.statusbar.padding = {'top': 6, 'bottom': 6, 'left': 8, 'right': 8}
c.tabs.padding = {'top': 6, 'bottom': 6, 'left': 8, 'right': 8}
config.set('content.local_content_can_access_remote_urls', True, 'file://*')
'';
};
}
+27
View File
@@ -0,0 +1,27 @@
{
xdg.dataFile = {
# Startpage - hide sponsored results
"qutebrowser/greasemonkey/startpage-no-ads.user.js".source =
./greasemonkey/startpage-no-ads.user.js;
# Return YouTube Dislike
"qutebrowser/greasemonkey/return-youtube-dislike.user.js".source =
./greasemonkey/return-youtube-dislike.user.js;
# SponsorBlock Lite - auto-skip sponsors on YouTube
"qutebrowser/greasemonkey/sponsorblock-lite.user.js".source =
./greasemonkey/sponsorblock-lite.user.js;
# Don't Track Me Google - remove Google tracking redirects
"qutebrowser/greasemonkey/dont-track-me-google.user.js".source =
./greasemonkey/dont-track-me-google.user.js;
# I don't care about cookies - auto-dismiss cookie banners
"qutebrowser/greasemonkey/i-dont-care-about-cookies.user.js".source =
./greasemonkey/i-dont-care-about-cookies.user.js;
# TrackingTokenStripper - remove tracking params from URLs (utm_*, fbclid, etc.)
"qutebrowser/greasemonkey/tracking-token-stripper.user.js".source =
./greasemonkey/tracking-token-stripper.user.js;
};
}
+2 -2
View File
@@ -1,4 +1,4 @@
# Import all shell configurations
{
imports =
[ ./fzf.nix ./zsh.nix ./starship.nix ./zoxide.nix ./tmux.nix ./eza.nix ];
imports = [./fzf.nix ./zsh.nix ./starship.nix ./zoxide.nix ./eza.nix];
}
-1
View File
@@ -7,7 +7,6 @@
extraOptions = [
"--group-directories-first"
"--no-quotes"
"--git-ignore"
"--icons=always"
];
};
+5 -2
View File
@@ -1,6 +1,9 @@
# Fzf is a general-purpose command-line fuzzy finder.
{ config, lib, ... }:
let
{
config,
lib,
...
}: let
accent = "#" + config.lib.stylix.colors.base0D;
foreground = "#" + config.lib.stylix.colors.base05;
muted = "#" + config.lib.stylix.colors.base03;
+13 -5
View File
@@ -1,6 +1,9 @@
# starship is a minimal, fast, and extremely customizable prompt for any shell!
{ config, lib, ... }:
let
{
config,
lib,
...
}: let
accent = "#${config.lib.stylix.colors.base0D}";
background-alt = "#${config.lib.stylix.colors.base01}";
in {
@@ -17,7 +20,7 @@ in {
"$git_status"
"$character"
];
directory = { style = accent; };
directory = {style = accent;};
character = {
success_symbol = "[](${accent})";
@@ -25,6 +28,12 @@ in {
vimcmd_symbol = "[](cyan)";
};
nix_shell = {
format = "[$symbol]($style) ";
symbol = "🐚";
style = "";
};
git_branch = {
symbol = "[](${background-alt}) ";
style = "fg:${accent} bg:${background-alt}";
@@ -32,8 +41,7 @@ in {
};
git_status = {
format =
"[[(*$conflicted$untracked$modified$staged$renamed$deleted)](218)($ahead_behind$stashed)]($style)";
format = "[[(*$conflicted$untracked$modified$staged$renamed$deleted)](218)($ahead_behind$stashed)]($style)";
style = "cyan";
conflicted = "";
renamed = "";
-58
View File
@@ -1,58 +0,0 @@
# Tmux is a terminal multiplexer that allows you to run multiple terminal sessions in a single window.
{ pkgs, ... }:
let
Config = pkgs.writeShellScriptBin "Config" ''
SESSION="Nixy Config"
tmux has-session -t "$SESSION" 2>/dev/null
if [ $? == 0 ]; then
tmux attach -t "$SESSION"
exit 0
fi
tmux new-session -d -s "$SESSION"
tmux send-keys -t "$SESSION" "sleep 0.2 && clear && cd ~/.config/nixos/ && vim" C-m
tmux new-window -t "$SESSION" -n "nixy"
tmux send-keys -t "$SESSION":1 "sleep 0.2 && clear && cd ~/.config/nixos/ && nixy loop" C-m
tmux new-window -t "$SESSION" -n "lazygit"
tmux send-keys -t "$SESSION":2 "sleep 0.2 && clear && cd ~/.config/nixos/ && lazygit" C-m
tmux select-window -t "$SESSION":0
tmux select-pane -t 0
tmux attach -t "$SESSION"
'';
in {
programs.tmux = {
enable = true;
mouse = true;
shell = "${pkgs.zsh}/bin/zsh";
prefix = "C-s";
terminal = "kitty";
keyMode = "vi";
extraConfig = ''
bind-key h select-pane -L
bind-key j select-pane -D
bind-key k select-pane -U
bind-key l select-pane -R
set -gq allow-passthrough on
bind-key x kill-pane # skip "kill-pane 1? (y/n)" prompt
bind-key -n C-Tab next-window
bind-key -n C-S-Tab previous-window
bind-key -n M-Tab new-window
'';
plugins = with pkgs; [
tmuxPlugins.vim-tmux-navigator
# tmuxPlugins.resurrect
tmuxPlugins.sensible
tmuxPlugins.tokyo-night-tmux
];
};
home.packages = [ Config ];
}
+100 -126
View File
@@ -1,11 +1,20 @@
# My shell configuration
{ pkgs, lib, config, ... }:
let fetch = config.theme.fetch; # neofetch, nerdfetch, pfetch
{
pkgs,
lib,
config,
...
}: let
fetch = config.theme.fetch; # neofetch, nerdfetch, pfetch
in {
home.packages = with pkgs; [bat ripgrep tldr witr];
home.packages = with pkgs; [ bat ripgrep tldr sesh ];
# Add go binaries to the PATH
home.sessionPath = ["$HOME/go/bin"];
home.sessionPath = [ "$HOME/go/bin" ];
home.sessionVariables = {
COLORTERM = "truecolor";
};
programs.zsh = {
enable = true;
@@ -13,74 +22,22 @@ in {
autosuggestion.enable = true;
syntaxHighlighting = {
enable = true;
highlighters = [ "main" "brackets" "pattern" "regexp" "root" "line" ];
highlighters = ["main" "brackets" "pattern" "regexp" "root" "line"];
};
historySubstringSearch.enable = true;
initExtraFirst =
#bash
''
bindkey -e
${if fetch == "neofetch" then
pkgs.neofetch + "/bin/neofetch"
else if fetch == "nerdfetch" then
"nerdfetch"
else if fetch == "pfetch" then
"echo; ${pkgs.pfetch}/bin/pfetch"
else
""}
function sesh-sessions() {
session=$(sesh list -t -c | fzf --height 70% --reverse)
[[ -z "$session" ]] && return
sesh connect $session
}
function chatgptlist(){
for arg in "$@"; do
echo "$arg:"
echo "\`\`\`"
cat "$arg"
echo "\`\`\`"
echo
done
}
function n4c() {
nix develop --no-write-lock-file --refresh "github:anotherhadi/nix4cyber#''${1:-all}"
}
zle -N sesh-sessions
bindkey -M emacs '\es' sesh-sessions
bindkey -M vicmd '\es' sesh-sessions
bindkey -M viins '\es' sesh-sessions
'';
history = {
ignoreDups = true;
save = 10000;
size = 10000;
};
profileExtra = lib.optionalString (config.home.sessionPath != [ ]) ''
profileExtra = lib.optionalString (config.home.sessionPath != []) ''
export PATH="$PATH''${PATH:+:}${
lib.concatStringsSep ":" config.home.sessionPath
}"
'';
#NOTE- for btop to show gpu usage
#may want to check the driver version with:
#nix path-info -r /run/current-system | grep nvidia-x11
#and
#nix search nixpkgs nvidia_x11
sessionVariables = {
LD_LIBRARY_PATH = lib.concatStringsSep ":" [
"${pkgs.linuxPackages_latest.nvidia_x11_beta}/lib" # change the package name according to nix search result
"$LD_LIBRARY_PATH"
];
};
shellAliases = {
vim = "nvim";
vi = "nvim";
@@ -94,18 +51,15 @@ in {
tree = "eza --icons=always --tree --no-quotes";
sl = "ls";
open = "${pkgs.xdg-utils}/bin/xdg-open";
icat = "${pkgs.kitty}/bin/kitty +kitten icat";
ssh = "kitty +kitten ssh";
cat =
"bat --theme=base16 --color=always --paging=never --tabs=2 --wrap=never --plain";
cat = "bat --theme=base16 --color=always --paging=never --tabs=2 --wrap=never --plain";
mkdir = "mkdir -p";
obsidian-no-gpu =
"env ELECTRON_OZONE_PLATFORM_HINT=auto obsidian --ozone-platform=x11";
obsidian-no-gpu = "env ELECTRON_OZONE_PLATFORM_HINT=auto obsidian --ozone-platform=x11";
wireguard-import = "nmcli connection import type wireguard file";
notes =
"nvim ~/nextcloud/notes/index.md --cmd 'cd ~/nextcloud/notes' -c ':Telescope find_files'";
notes = "nvim ~/notes/index.md --cmd 'cd ~/notes' -c ':lua Snacks.picker.smart()'";
note = "notes";
tmp = "nvim /tmp/$(date | sed 's/ //g;s/\\.//g').md";
nix-shell = "nix-shell --command zsh";
@@ -128,77 +82,97 @@ in {
gcm = "git commit -m";
};
initExtra = ''
# 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
initContent =
# bash
''
bindkey -e
${
if fetch == "neofetch"
then pkgs.neofetch + "/bin/neofetch"
else if fetch == "nerdfetch"
then "nerdfetch"
else if fetch == "pfetch"
then "echo; ${pkgs.pfetch}/bin/pfetch"
else ""
}
# General completion behavior
zstyle ':completion:*' completer _extensions _complete _approximate
function n4c() {
category=''${1:-all}
shift
args=''${*}
nix develop "github:nix4cyber/n4c#''${category}" ''${args} -c zsh
}
# Use cache
zstyle ':completion:*' use-cache on
zstyle ':completion:*' cache-path "$XDG_CACHE_HOME/zsh/.zcompcache"
# 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
# Complete the alias
zstyle ':completion:*' complete true
# General completion behavior
zstyle ':completion:*' completer _extensions _complete _approximate
# Autocomplete options
zstyle ':completion:*' complete-options true
# Use cache
zstyle ':completion:*' use-cache on
zstyle ':completion:*' cache-path "$XDG_CACHE_HOME/zsh/.zcompcache"
# Completion matching control
zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*'
zstyle ':completion:*' keep-prefix true
# Complete the alias
zstyle ':completion:*' complete 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]'
# Autocomplete options
zstyle ':completion:*' complete-options true
# Colors
zstyle ':completion:*' list-colors ''${(s.:.)LS_COLORS}
# Completion matching control
zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*'
zstyle ':completion:*' keep-prefix true
# 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
# 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]'
# 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
# Colors
zstyle ':completion:*' list-colors ''${(s.:.)LS_COLORS}
${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"
''}
# 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
# 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\\"
}
# 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
'';
${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\\"
}
'';
};
}
+11 -5
View File
@@ -1,16 +1,23 @@
# Spicetify is a spotify client customizer
{ pkgs, config, lib, inputs, ... }:
let
spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.system};
{
pkgs,
pkgs-stable,
config,
lib,
inputs,
...
}: let
spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.stdenv.hostPlatform.system};
accent = "${config.lib.stylix.colors.base0D}";
background = "${config.lib.stylix.colors.base00}";
in {
imports = [ inputs.spicetify-nix.homeManagerModules.default ];
imports = [inputs.spicetify-nix.homeManagerModules.default];
stylix.targets.spicetify.enable = false;
programs.spicetify = {
enable = true;
spotifyPackage = pkgs-stable.spotify;
theme = lib.mkForce spicePkgs.themes.dribbblish;
colorScheme = "custom";
@@ -26,7 +33,6 @@ in {
enabledExtensions = with spicePkgs.extensions; [
playlistIcons
lastfm
historyShortcut
hidePodcasts
adblock
-8
View File
@@ -1,8 +0,0 @@
# Tailscale is a VPN service that works on top of WireGuard.
# It allows me to access my servers and devices from anywhere.
{ pkgs, ... }: {
home.packages = with pkgs; [ tailscale tailscale-systray ];
wayland.windowManager.hyprland.settings.exec-once =
[ "${pkgs.tailscale-systray}/bin/tailscale-systray" ];
}
+162 -59
View File
@@ -1,75 +1,178 @@
# Thunar is a file explorer
{ pkgs, config, ... }:
let user = config.var.username;
{
pkgs,
pkgs-stable,
config,
lib,
...
}: let
user = config.var.username;
in {
# ctrl + m to toggle the menubar
home.packages = with pkgs; [
xfce.thunar
xfce.xfconf
xfce.tumbler
xfce.thunar-archive-plugin
xfce.thunar-volman
xfce.thunar-media-tags-plugin
p7zip
unar
];
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 = "WhiteSur";
package = pkgs.whitesur-icon-theme.override {
boldPanelIcons = true;
alternativeIcons = true;
};
name = "Papirus-Dark";
package = pkgs.papirus-icon-theme;
};
gtk4.theme = null;
# 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.whitesur-icon-theme}/share/icons/WhiteSur";
XDG_ICON_DIR = "${pkgs.papirus-icon-theme}/share/icons/Papirus";
QS_ICON_THEME = "Papirus";
QT_STYLE_OVERRIDE = lib.mkForce "Fusion";
};
# bookmarks for the side pane
gtk.gtk3.bookmarks = [
"file:///home/${user}/Downloads Downloads"
"file:///home/${user}/Pictures Pictures"
"file:///home/${user}/nextcloud Nextcloud"
"file:///home/${user}/.config/nixos NixOS"
"file:///home/${user}/dev Development"
];
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 = ''
home.file.".config/xfce4/xfconf/xfce-perchannel-xml/thunar.xml" = {
text = ''
<?xml version="1.1" encoding="UTF-8"?>
<channel name="thunar" version="1.0">
<property name="last-view" type="string" value="ThunarIconView"/>
<property name="last-icon-view-zoom-level" type="string" value="THUNAR_ZOOM_LEVEL_100_PERCENT"/>
<property name="last-window-maximized" type="bool" value="true"/>
<property name="last-separator-position" type="int" value="230"/>
<property name="last-statusbar-visible" type="bool" value="false"/>
<property name="last-menubar-visible" type="bool" value="false"/>
<property name="misc-single-click" type="bool" value="false"/>
<property name="shortcuts-icon-emblems" type="bool" value="true"/>
<property name="tree-icon-emblems" type="bool" value="true"/>
<property name="misc-file-size-binary" type="bool" value="false"/>
<property name="misc-thumbnail-draw-frames" type="bool" value="true"/>
<property name="misc-text-beside-icons" type="bool" value="false"/>
<property name="misc-change-window-icon" type="bool" value="false"/>
<property name="hidden-bookmarks" type="array">
<value type="string" value="computer:///"/>
<value type="string" value="recent:///"/>
<value type="string" value="network:///"/>
</property>
<property name="hidden-devices" type="array">
<value type="string" value="52FEA905FEA8E309"/>
</property>
<property name="last-toolbar-item-order" type="string" value="0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17"/>
<property name="last-toolbar-visible-buttons" type="string" value="0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0"/>
<property name="last-location-bar" type="string" value="ThunarLocationButtons"/>
<property name="last-show-hidden" type="bool" value="false"/>
<property name="last-details-view-zoom-level" type="string" value="THUNAR_ZOOM_LEVEL_38_PERCENT"/>
<property name="last-details-view-column-widths" type="string" value="50,50,118,111,50,50,50,50,993,50,50,84,50,151"/>
<property name="last-toolbar-items" type="string" value="menu:1,undo:1,back:1,forward:1,open-parent:0,open-home:0,redo:0,zoom-in:0,zoom-out:0,zoom-reset:0,location-bar:1,view-switcher:1,search:1,view-as-icons:0,view-as-detailed-list:0,view-as-compact-list:0,toggle-split-view:0,reload:0,new-tab:0,new-window:0,uca-action-1700000000000001:0"/>
<property name="last-side-pane" type="string" value="THUNAR_SIDEPANE_TYPE_SHORTCUTS"/>
<property name="last-image-preview-visible" type="bool" value="false"/>
<property name="misc-use-csd" type="bool" value="true"/>
<property name="default-view" type="string" value="ThunarIconView"/>
<property name="misc-thumbnail-max-file-size" type="uint64" value="1073741824"/>
<property name="misc-symbolic-icons-in-toolbar" type="bool" value="true"/>
<property name="misc-date-style" type="string" value="THUNAR_DATE_STYLE_SIMPLE"/>
<property name="shortcuts-icon-size" type="string" value="THUNAR_ICON_SIZE_16"/>
<property name="tree-icon-size" type="string" value="THUNAR_ICON_SIZE_16"/>
<property name="misc-symbolic-icons-in-sidepane" type="bool" value="true"/>
<property name="misc-open-new-window-as-tab" type="bool" value="false"/>
<property name="misc-full-path-in-tab-title" type="bool" value="true"/>
<property name="misc-show-delete-action" type="bool" value="false"/>
</channel>
'';
force = true;
};
xdg.configFile."Thunar/uca.xml".text = ''
<?xml version="1.0" encoding="UTF-8"?>
<channel name="thunar" version="1.0">
<property name="last-view" type="string" value="ThunarIconView"/>
<property name="last-icon-view-zoom-level" type="string" value="THUNAR_ZOOM_LEVEL_100_PERCENT"/>
<property name="last-window-maximized" type="bool" value="true"/>
<property name="last-separator-position" type="int" value="170"/>
<property name="last-statusbar-visible" type="bool" value="false"/>
<property name="last-menubar-visible" type="bool" value="false"/>
<property name="misc-single-click" type="bool" value="false"/>
<property name="shortcuts-icon-emblems" type="bool" value="true"/>
<property name="tree-icon-emblems" type="bool" value="true"/>
<property name="misc-file-size-binary" type="bool" value="true"/>
<property name="misc-thumbnail-draw-frames" type="bool" value="false"/>
<property name="misc-text-beside-icons" type="bool" value="true"/>
<property name="misc-change-window-icon" type="bool" value="true"/>
<property name="hidden-bookmarks" type="array">
<value type="string" value="computer:///"/>
<value type="string" value="recent:///"/>
<value type="string" value="file:///"/>
<value type="string" value="network:///"/>
</property>
<property name="hidden-devices" type="array">
<value type="string" value="52FEA905FEA8E309"/>
</property>
<property name="last-toolbar-item-order" type="string" value="0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17"/>
<property name="last-toolbar-visible-buttons" type="string" value="0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0"/>
<property name="last-location-bar" type="string" value="ThunarLocationButtons"/>
<property name="last-show-hidden" type="bool" value="false"/>
<property name="last-details-view-zoom-level" type="string" value="THUNAR_ZOOM_LEVEL_38_PERCENT"/>
<property name="last-details-view-column-widths" type="string" value="50,50,127,50,50,50,50,50,751,50,50,75,50,145"/>
<property name="last-toolbar-items" type="string" value="menu:1,back:1,forward:0,open-parent:0,open-home:0,undo:0,redo:0,zoom-in:0,zoom-out:0,zoom-reset:0,view-as-icons:0,view-as-detailed-list:0,view-as-compact-list:0,toggle-split-view:0,location-bar:1,reload:0,search:1,uca-action-1710183590071525-1:0,new-tab:0,new-window:0,view-switcher:0"/>
</channel>
<actions>
<action>
<icon>utilities-terminal</icon>
<name>Open Terminal Here</name>
<unique-id>1700000000000001</unique-id>
<command>ghostty -d %f</command>
<description>Opens terminal in the selected folder</description>
<patterns>*</patterns>
<startup-notify/>
<directories/>
</action>
<action>
<icon></icon>
<name>Extract here</name>
<submenu></submenu>
<unique-id>1689618425925956-3</unique-id>
<command>xarchiver -x . %f</command>
<description>Extracts the archive into the directory it is located in.</description>
<range>*</range>
<patterns>*.tar.bz2;*.tar.gz;*.tar.xz;*.tar.Z;*.tar;*.taz;*.tb2;*.tbz;*.tbz2;*.tgz;*.txz;*.zip;*.bz2;*.docx;*.apk;*.gz;*.odt;</patterns>
<other-files/>
</action>
<action>
<icon>package-x-generic</icon>
<name>Compress here (tar.gz)</name>
<submenu></submenu>
<unique-id>1700000000000003</unique-id>
<command>tar -czvf %n.tar.gz %N</command>
<description>Creates a compressed archive (.tar.gz) of selected files/folders.</description>
<range>*</range>
<patterns>*</patterns>
<directories/>
<other-files/>
</action>
</actions>
'';
}
-14
View File
@@ -1,14 +0,0 @@
# Zen is a minimalistic web browser.
{ pkgs, inputs, ... }:
let
# Create a wrapper script for zen-browser with Wayland enabled
zenWithWayland = pkgs.symlinkJoin {
name = "zen-browser-wayland";
paths = [ inputs.zen-browser.packages."${pkgs.system}".default ];
buildInputs = [ pkgs.makeWrapper ];
postBuild = ''
wrapProgram $out/bin/zen \
--set MOZ_ENABLE_WAYLAND 1
'';
};
in { home.packages = [ zenWithWayland ]; }
-40
View File
@@ -1,40 +0,0 @@
# - ## Brightness
#-
#- This module provides a set of scripts to control the brightness of the screen.
#-
#- - `brightness-up` increases the brightness by 5%.
#- - `brightness-down` decreases the brightness by 5%.
#- - `brightness-set [value]` sets the brightness to the given value.
#- - `brightness-change [up|down] [value]` increases or decreases the brightness by the given value.
{ pkgs, ... }:
let
increments = "5";
brightness-change = pkgs.writeShellScriptBin "brightness-change" ''
[[ $1 == "up" ]] && ${pkgs.brightnessctl}/bin/brightnessctl set ''${2-${increments}}%+
[[ $1 == "down" ]] && ${pkgs.brightnessctl}/bin/brightnessctl set ''${2-${increments}}%-
'';
brightness-set = pkgs.writeShellScriptBin "brightness-set" ''
${pkgs.brightnessctl}/bin/brightnessctl set ''${1-100}%
'';
brightness-up = pkgs.writeShellScriptBin "brightness-up" ''
brightness-change up ${increments}
'';
brightness-down = pkgs.writeShellScriptBin "brightness-down" ''
brightness-change down ${increments}
'';
in {
home.packages = [
pkgs.brightnessctl
brightness-change
brightness-up
brightness-down
brightness-set
];
}
-33
View File
@@ -1,33 +0,0 @@
# - ## Caffeine
#-
#- Caffeine is a simple script that toggles hypridle (disable suspend & screenlock).
#-
#- - `caffeine-status` - Check if hypridle is running. (0/1)
#- - `caffeine-status-icon` - Check if hypridle is running. (icon)
#- - `caffeine` - Toggle hypridle.
{ pkgs, ... }:
let
caffeine-status = pkgs.writeShellScriptBin "caffeine-status" ''
[[ $(pidof "hypridle") ]] && echo "0" || echo "1"
'';
caffeine-status-icon = pkgs.writeShellScriptBin "caffeine-status-icon" ''
[[ $(pidof "hypridle") ]] && echo "󰾪" || echo "󰅶"
'';
caffeine = pkgs.writeShellScriptBin "caffeine" ''
if [[ $(pidof "hypridle") ]]; then
systemctl --user stop hypridle.service
title="󰅶 Caffeine Activated"
description="Caffeine is now active! Your screen will not turn off automatically."
else
systemctl --user start hypridle.service
title="󰾪 Caffeine Deactivated"
description="Caffeine is now deactivated! Your screen will turn off automatically."
fi
notif "caffeine" "$title" "$description"
'';
in { home.packages = [ caffeine-status caffeine caffeine-status-icon ]; }
-16
View File
@@ -1,16 +0,0 @@
{
imports = [
./nixy
./sounds
./brightness
./caffeine
./hyprpanel
./hyprfocus
./night-shift
./screenshot
./nerdfont-fzf
./notification
./system
./openvpn
];
}
-47
View File
@@ -1,47 +0,0 @@
# - ## Hyprfocus
#-
#- A simple script to toggle focus on few windows in Hyprland.
#- (disable gaps, border, shadow, opacity, etc.)
#-
#- - `hyprfocus-on` - Enable hyprfocus.
#- - `hyprfocus-off` - Disable hyprfocus.
#- - `hyprfocus-toggle` - Toggle hyprfocus.
{ pkgs, ... }:
let
hyprfocus-on = pkgs.writeShellScriptBin "hyprfocus-on"
# bash
''
hyprpanel-hide
hyprctl --batch "\
keyword animations:enabled 0;\
keyword decoration:shadow:enabled 0;\
keyword decoration:blur:enabled 0;\
keyword general:gaps_in 0;\
keyword general:gaps_out 0;\
keyword general:border_size 1;\
keyword decoration:rounding 0;\
keyword decoration:inactive_opacity 1;\
keyword decoration:active_opacity 1"
echo "1" > /tmp/hyprfocus
'';
hyprfocus-off = pkgs.writeShellScriptBin "hyprfocus-off"
# bash
''
hyprctl reload
hyprpanel-show
rm /tmp/hyprfocus
'';
hyprfocus-toggle = pkgs.writeShellScriptBin "hyprfocus-toggle"
# bash
''
if [ -f /tmp/hyprfocus ]; then
hyprfocus-off
else
hyprfocus-on
fi
'';
in { home.packages = [ hyprfocus-on hyprfocus-off hyprfocus-toggle ]; }
-47
View File
@@ -1,47 +0,0 @@
# - ## Hyprpanel
#-
#- Quick scripts to toggle, reload, hide & show hyprpanel.
#-
#- - `hyprpanel-toggle` - Toggle hyprpanel (hide/show).
#- - `hyprpanel-show` - Show hyprpanel.
#- - `hyprpanel-hide` - Hide hyprpanel.
#- - `hyprpanel-reload` - Reload hyprpanel.
{ pkgs, ... }:
let
hyprpanel-toggle = pkgs.writeShellScriptBin "hyprpanel-toggle" ''
hyprpanel toggleWindow bar-0
hyprpanel toggleWindow bar-1
hyprpanel toggleWindow bar-2
hyprpanel toggleWindow bar-3
'';
hyprpanel-hide = pkgs.writeShellScriptBin "hyprpanel-hide" ''
status=$(hyprpanel isWindowVisible bar-0)
if [[ $status == "true" ]]; then
hyprpanel toggleWindow bar-0
fi
status=$(hyprpanel isWindowVisible bar-1)
if [[ $status == "true" ]]; then
hyprpanel toggleWindow bar-1
fi
'';
hyprpanel-show = pkgs.writeShellScriptBin "hyprpanel-show" ''
status=$(hyprpanel isWindowVisible bar-0)
if [[ $status == "false" ]]; then
hyprpanel toggleWindow bar-0
fi
status=$(hyprpanel isWindowVisible bar-1)
if [[ $status == "false" ]]; then
hyprpanel toggleWindow bar-1
fi
'';
hyprpanel-reload = pkgs.writeShellScriptBin "hyprpanel-reload" ''
[ $(pgrep "hyprpanel") ] && pkill hyprpanel
hyprctl dispatch exec hyprpanel
'';
in {
home.packages =
[ hyprpanel-toggle hyprpanel-reload hyprpanel-hide hyprpanel-show ];
}

Some files were not shown because too many files have changed in this diff Show More