828 Commits

Author SHA1 Message Date
Hadi 30293a616b change the way workflow works
Former-commit-id: de125e21a7
2025-02-21 15:55:13 +01:00
Hadi 16c76c92b3 change to kofi
Former-commit-id: 58bae6e2c0
2025-02-21 15:54:02 +01:00
Hadi d22a30be53 change process name
Former-commit-id: 074dc5864b
2025-02-21 15:49:49 +01:00
Hadi 92e165396d woops mb
Former-commit-id: 9312ef84a2
2025-02-21 15:49:17 +01:00
Hadi b0899442ab only show cava when media is playing
Former-commit-id: a4bd708f24
2025-02-21 15:44:04 +01:00
Hadi 991b456713 add cava to hyprpanel
Former-commit-id: 3383fe5af7
2025-02-21 15:42:50 +01:00
Hadi 53dc030c22 special workspace for ProtonMail
Former-commit-id: d64e096e8c
2025-02-21 15:29:03 +01:00
Hadi afd27f2a92 Fix alpha-nvim keybindings
Former-commit-id: 4eb6d59909
2025-02-21 14:07:44 +01:00
Hadi 6a5c430830 Create FUNDING.yml
Former-commit-id: 56b4a77d1f
2025-02-19 18:01:04 +01:00
Hadi f04821fffe Planify in fullscreen by default
Former-commit-id: e63b86345b
2025-02-19 17:56:38 +01:00
github-actions eeeaf1a7c4 Update KEYBINDINGS-HYPRLAND.md (auto)
Former-commit-id: 0f6f40ab23
2025-02-19 16:47:15 +00:00
Hadi 2c42201b15 Add key binding for Planify
Former-commit-id: b5147a52ba
2025-02-19 17:46:56 +01:00
Hadi e3e7714f4c open planify in special workspace
Former-commit-id: ef189b3b62
2025-02-19 16:54:55 +01:00
Hadi 28ff9b7e6a update flake
Former-commit-id: 813dca5d40
2025-02-19 14:55:11 +01:00
Hadi c92d1ac1ad increase opacity for inactive windows
Former-commit-id: bac6ec2f82
2025-02-19 14:55:08 +01:00
Hadi 3d214c7c2d Make no sense in offload mode ?
Former-commit-id: a0ffe24e7d
2025-02-19 14:54:55 +01:00
Hadi bfd689beab let's try proton mail desktop
Former-commit-id: 052fd7cada
2025-02-19 14:54:41 +01:00
Hadi 8879e0c222 screenshot now save & copy
Former-commit-id: 0eca13a163
2025-02-19 10:44:18 +01:00
Hadi 794932ee3b cleaner solution
Former-commit-id: a91c0e37c0
2025-02-19 10:44:05 +01:00
Hadi d5e56f4092 disable the hyprpanel shadow
Former-commit-id: 480e2bf2da
2025-02-19 10:43:53 +01:00
Hadi ad0cc491f8 reenable hyprspace & static workspace for some apps
Former-commit-id: fa3d207375
2025-02-19 10:43:40 +01:00
Hadi a90dfeac07 batsignal now locks on very low battery
Former-commit-id: 3b200caed9
2025-02-19 10:43:08 +01:00
Hadi 61ae19567a wallpaper change for yoru theme
Former-commit-id: 19a48aee14
2025-02-19 10:42:58 +01:00
Hadi 2ffa0a3abf update todo
Former-commit-id: d56f39275c
2025-02-18 23:40:07 +01:00
Hadi 651de22342 change apps
Former-commit-id: 7aa07cde8e
2025-02-11 20:59:24 +01:00
Hadi 3d5516e20c Merge branch 'main' of github.com:anotherhadi/nixy
Former-commit-id: 4e438e9f78
2025-02-11 20:58:45 +01:00
Hadi 2270fe77b6 update flakes
Former-commit-id: ca73bf3af3
2025-02-11 20:58:40 +01:00
Hadi 6514624612 remove resurrect
Former-commit-id: af79d8031d
2025-02-11 20:58:30 +01:00
github-actions 4d4db27d49 Update KEYBINDINGS-HYPRLAND.md (auto)
Former-commit-id: c5f99341d5
2025-02-04 19:42:52 +00:00
Hadi 9ff48eb543 update flake
Former-commit-id: 1f4be60931
2025-02-04 20:42:09 +01:00
Hadi 519de26e6a edit
Former-commit-id: 43f27ff383
2025-02-04 20:41:21 +01:00
Hadi e1915e1741 change bindings
Former-commit-id: 2433d287f8
2025-02-04 20:41:13 +01:00
Hadi de177e0003 screenshot to clipboard
Former-commit-id: e4f6f611d6
2025-02-04 20:41:10 +01:00
Hadi c054d85b1c markdown writting
Former-commit-id: 6f1bcbf4dc
2025-02-04 20:40:54 +01:00
Hadi 47e9b45cfa update flakes
Former-commit-id: 0e5fbb9ea5
2025-01-27 09:53:06 +01:00
Hadi f1f8d50c2e add mimes for zen
Former-commit-id: 7906679e9a
2025-01-27 08:36:23 +01:00
Hadi e514c9ca09 change homepage path
Former-commit-id: d694a57ae6
2025-01-27 08:36:12 +01:00
Hadi 336574206c edit nextcloud notes path
Former-commit-id: 2ebed4ab9c
2025-01-27 08:35:50 +01:00
Hadi dcd302bf5b update flakes
Former-commit-id: 406889a019
2025-01-23 17:49:40 +01:00
Hadi 5aad861057 update my nvim config
Former-commit-id: cd54511aa0
2025-01-23 17:36:26 +01:00
Hadi 1098005af6 delete old modules
Former-commit-id: 5cc7a65ea1
2025-01-23 17:36:13 +01:00
github-actions 223b91e075 Update SCRIPTS.md (auto)
Former-commit-id: 726bb896dd
2025-01-22 19:16:05 +00:00
Hadi ee80453e77 update flakes
Former-commit-id: 57f9723b87
2025-01-22 20:15:49 +01:00
Hadi a49bc73bbd disable hyprspace, broken
Former-commit-id: d8a45d947b
2025-01-22 20:15:45 +01:00
Hadi 818dfda0e3 temp fix for nvidia drivers
Former-commit-id: b26a7b9dd0
2025-01-22 20:15:38 +01:00
Hadi 33f62390c5 remove desktop & pia
Former-commit-id: fd8f7de9b1
2025-01-22 19:41:19 +01:00
Hadi fe143348a4 edit theme
Former-commit-id: 44a8ac06ec
2025-01-22 19:41:09 +01:00
Hadi 937c0a70d9 app test
Former-commit-id: 722efcf03a
2025-01-22 19:41:03 +01:00
Hadi 11c88abded delete desktop
Former-commit-id: a030370542
2025-01-22 19:40:41 +01:00
Hadi 9c43f16027 open vpn scripts
Former-commit-id: f83370b4fa
2025-01-22 19:40:23 +01:00
github-actions ffc3b1baed Update KEYBINDINGS-HYPRLAND.md (auto)
Former-commit-id: dbe30d164e
2025-01-21 19:55:49 +00:00
Hadi 73c349918f remove systemd.enable
Former-commit-id: 8c92529ef2
2025-01-21 20:55:36 +01:00
Hadi 662009000d add keybind to toggle the bar
Former-commit-id: 141f6d8fc1
2025-01-21 20:55:27 +01:00
Hadi d4ffdae2f4 open webpage to display wallpapers
Former-commit-id: 2fb93eaff5
2025-01-21 20:55:17 +01:00
Hadi 1a69437e3f fix hyprpanel toggleWindow call
Former-commit-id: 943ea80ac2
2025-01-21 20:54:47 +01:00
Hadi a2210756c5 fix
Former-commit-id: 4d63588ddc
2025-01-21 20:54:37 +01:00
Hadi 76dabd905e copilot nvim broken on unstable
Former-commit-id: 2962bd8503
2025-01-21 20:54:28 +01:00
Hadi 3c1be077b9 add duckduckgo colorscheme
Former-commit-id: ed605769b0
2025-01-21 20:54:16 +01:00
Hadi 5aef2f7d40 update flake
Former-commit-id: c828520da1
2025-01-21 20:54:03 +01:00
Hadi 7342a52609 update theme
Former-commit-id: 5fab44846d
2025-01-21 20:53:59 +01:00
Hadi 8f1949c3fb flake update
Former-commit-id: f10612b1d1
2025-01-12 20:00:10 +01:00
Hadi 09352dbcbc fix hyprpanel hide & show
Former-commit-id: 3a34579f35
2025-01-07 21:34:54 +01:00
Hadi b32cc2ade5 flake update
Former-commit-id: 05aa21e311
2025-01-07 21:34:46 +01:00
Hadi eb457f8069 edit theme
Former-commit-id: 5b4670d6e2
2025-01-07 20:23:59 +01:00
Hadi bba6f699bd config edit
Former-commit-id: 972490513f
2025-01-07 20:22:54 +01:00
Hadi 532b2e4e0a change theme & update flake
Former-commit-id: 868c3b4e4f
2025-01-07 00:27:57 +01:00
Hadi 21beb27859 update flake & fix nixpkgs error
Former-commit-id: 8f3645996a
2025-01-06 23:35:06 +01:00
Hadi 029655cb72 enable the hyprpanel overlay
Former-commit-id: b1702060f2
2025-01-06 20:58:55 +01:00
Hadi ec8f733408 treesitter ensure installed
Former-commit-id: d158c6160f
2025-01-06 20:58:41 +01:00
Hadi 47449eb534 migrate config to hyprpanel v2
Former-commit-id: d7dbea9437
2025-01-02 19:42:41 +01:00
Hadi 8d585f941d new theme!
Former-commit-id: ada0a0761c
2025-01-02 19:42:26 +01:00
Hadi 35e8d0a6a6 flakes update
Former-commit-id: 3941e15c5c
2025-01-02 19:01:55 +01:00
Hadi 5662804337 update flake
Former-commit-id: f6f203f848
2025-01-02 18:31:06 +01:00
Hadi 523a3819d1 add a configuration limit in boot menu
Former-commit-id: ce32ac84fa
2025-01-02 18:31:02 +01:00
Hadi 4532330c0c enable auto gc
Former-commit-id: 70baebf547
2025-01-02 18:30:54 +01:00
Hadi 0362bbec14 update flakes
Former-commit-id: 87cf8f6bfa
2024-12-30 20:41:31 +01:00
Hadi fcdd2dc92c remove GTK theming
Former-commit-id: 8ceabe0a8a
2024-12-30 20:41:27 +01:00
Hadi e7b81f510c hyprpanel v2 migration
Former-commit-id: d4db565e46
2024-12-30 20:41:20 +01:00
Hadi c3517e5f56 removed some imports
Former-commit-id: 4551530344
2024-12-30 20:41:12 +01:00
Hadi 9af2f9f691 toolbar-items
Former-commit-id: a957fe856c
2024-12-30 20:40:38 +01:00
Hadi 9ca1a031b5 Merge pull request #11 from hcw9iu/fix-btop-gpu
Former-commit-id: 50b01f235d
2024-12-22 23:47:53 +01:00
william1209 640f815782 fix btop not show gpu
Former-commit-id: 2a50a895ef
2024-12-23 02:38:42 +08:00
Hadi 5885d6e400 update flakes
Former-commit-id: b6014cc3a1
2024-12-20 21:49:52 +01:00
Hadi 897dcfb7e3 update flakes
Former-commit-id: dbfc4887f0
2024-12-17 13:55:08 +01:00
Hadi 17589f5697 update flake
Former-commit-id: 277bafd297
2024-12-16 15:47:02 +01:00
Hadi 914f8bfa7e update flake
Former-commit-id: d1a14bb22c
2024-12-15 22:01:15 +01:00
Hadi 65f98fd3ec update flakes
Former-commit-id: 0d1ff6074f
2024-12-12 21:38:50 +01:00
Hadi f65f5a28e8 Add typescript LSP
Former-commit-id: 1577960c51
2024-12-12 21:37:18 +01:00
Hadi c9ca8c21f3 Fixed!!
Former-commit-id: 46bf6c9cb3
2024-12-12 21:37:05 +01:00
Hadi b0e4113b3b update flakes
Former-commit-id: 65acc4d2da
2024-12-09 10:08:01 +01:00
Hadi 2a200b0e75 new theme!
Former-commit-id: 89db4101fd
2024-12-06 17:02:23 +01:00
Hadi f1b6044ed1 update flakes
Former-commit-id: dbe720e366
2024-12-06 16:49:51 +01:00
Hadi 8891834ae1 remove old temp packages
Former-commit-id: 275178807d
2024-12-06 16:34:02 +01:00
Hadi 4356ad0e2f add desktop to .sops.yaml
Former-commit-id: e928fcf59a
2024-12-05 23:16:46 +01:00
Hadi 3cbf606230 add secrets
Former-commit-id: b94c673084
2024-12-05 23:04:30 +01:00
Hadi fb75ecc61d add desktop host
Former-commit-id: e3e5be7b73
2024-12-05 23:03:57 +01:00
Hadi 792970dc7f Change zen input
Former-commit-id: c79a153478
2024-12-05 22:22:01 +01:00
Hadi 30220aba6c Merge pull request #9 from underscoregeb/patch-1
new zen url

Former-commit-id: 88c1d7f6e0
2024-12-05 19:23:36 +01:00
geb 6f0e14a560 new zen url
Former-commit-id: ad8a0ccf53
2024-12-05 08:54:14 -06:00
Hadi fb297a1016 wallpaper change
Former-commit-id: 30bd93f973
2024-12-04 17:24:13 +01:00
Hadi ea3baad219 flake update
Former-commit-id: a16a9acd49
2024-12-04 17:24:09 +01:00
Hadi f12c527cdc Update flake
Former-commit-id: b3b191831f
2024-12-04 09:19:18 +01:00
github-actions f16312b953 Update KEYBINDINGS-HYPRLAND.md (auto)
Former-commit-id: 8309831a6e
2024-12-03 21:46:55 +00:00
Hadi de8abc2c4f change cursor
Former-commit-id: 4107af5343
2024-12-03 22:46:42 +01:00
Hadi 3308c7424a change browser binding
Former-commit-id: 4a42049faf
2024-12-03 22:46:38 +01:00
Hadi 12ca3743a1 update
Former-commit-id: b8920ade11
2024-12-03 20:08:04 +01:00
Hadi fc7fbfe0ee oops
Former-commit-id: c8c8738bfd
2024-12-03 20:07:49 +01:00
Hadi 916a9ed923 Switch from Firefox to Zen, ...
Former-commit-id: 7add142ab1
2024-12-03 19:36:15 +01:00
Hadi bd98e149f9 update flake
Former-commit-id: 52213697ea
2024-11-29 22:03:36 +01:00
Hadi a66048b432 fix nixd encoding
Former-commit-id: ea3d436c6e
2024-11-25 10:24:53 +01:00
Hadi d8d8d7e990 put bindings to hyprspace file
Former-commit-id: b991c66c2e
2024-11-25 10:01:58 +01:00
Hadi 8c5ce4880e move hyprspace to file
Former-commit-id: de8de47de4
2024-11-25 09:59:45 +01:00
Hadi 14ef376f03 Firefox homepage
Former-commit-id: cb041ad452
2024-11-25 09:34:08 +01:00
Hadi ff5a75f687 Firefox config
Former-commit-id: c8aff9ee96
2024-11-25 09:33:56 +01:00
Hadi bbfd3a5de2 update flakes
Former-commit-id: a6cc144770
2024-11-19 18:16:55 +01:00
Hadi a980904382 try transparentBackground config
Former-commit-id: fd4535f566
2024-11-17 19:53:03 +01:00
Hadi 25d6f672a4 switch to firefox
Former-commit-id: 8a692431e4
2024-11-17 19:52:52 +01:00
Hadi 1922a9550b doesn't build on unstable
Former-commit-id: 69c0605202
2024-11-17 19:52:22 +01:00
Hadi 79b3cec6fb add backupFileExtension in HM
Former-commit-id: 887668d962
2024-11-17 19:52:10 +01:00
Hadi e9f8555d37 update flakes
Former-commit-id: d7a03d4a80
2024-11-17 19:51:53 +01:00
Hadi 0875217932 fix colors for the workspace modules
Former-commit-id: 619b0d3724
2024-11-16 12:06:44 +01:00
Hadi 7dc0964759 update flakes & fix
Former-commit-id: 9f1b464ce4
2024-11-16 11:57:00 +01:00
Hadi d7553fbce8 Fix ssh kitty
Former-commit-id: 8b6f98d153
2024-11-14 20:53:26 +01:00
Hadi 458e61b19c update flakes
Former-commit-id: 65a9e23d90
2024-11-08 14:19:32 +01:00
Hadi d20693de9a change theme
Former-commit-id: 48c334cb5e
2024-11-08 14:19:25 +01:00
Hadi ea770a10ec regroup calls
Former-commit-id: 3b45228e47
2024-11-08 14:19:14 +01:00
Hadi 970aa3133b new theme
Former-commit-id: d2aa568fff
2024-11-08 14:18:55 +01:00
Hadi fe323511a4 Hyprland breaking changes. (Stylix fix, waiting for upstream)
Former-commit-id: f4f9f889ed
2024-11-08 13:32:25 +01:00
Hadi ea806f21d4 update flakes
Former-commit-id: 61a4d11ca4
2024-11-08 11:37:33 +01:00
Hadi a6a6cc3c09 update flakes
Former-commit-id: a43e3e36cf
2024-11-05 15:39:17 +01:00
Hadi c334ff2851 private internet access (vpn)
Former-commit-id: 53efbb88d6
2024-11-05 15:39:11 +01:00
Hadi 40c8ca00db update todos
Former-commit-id: 67f96bde02
2024-11-05 11:36:03 +01:00
Hadi a25c5fd551 Add colored output for git
Former-commit-id: d721e1bc1c
2024-11-05 11:07:21 +01:00
github-actions b6d0f00b34 Update SCRIPTS.md (auto)
Former-commit-id: 868cf5d3b3
2024-11-05 10:01:56 +00:00
Hadi c020deea69 update docs
Former-commit-id: b6f9d2b570
2024-11-05 11:01:41 +01:00
Hadi 01e6c36348 hyprshade -> hyprsunset
Former-commit-id: 8d5eefced0
2024-11-05 10:59:34 +01:00
Hadi 1c9454a1cd broken on unstable
Former-commit-id: f343ef25d2
2024-11-05 10:59:01 +01:00
Hadi 0b65935549 update flakes
Former-commit-id: f2b11b84a2
2024-11-05 10:58:49 +01:00
Hadi b48b9d1ef2 rename underscore
Former-commit-id: c0cdd3fcde
2024-11-05 10:47:07 +01:00
Hadi c52a218305 update github actions
Former-commit-id: b0bb2016bc
2024-11-05 10:46:24 +01:00
Hadi b5638ad2c8 rename underscore
Former-commit-id: 63d38846d8
2024-11-05 10:42:32 +01:00
Hadi ca94ff3e9b update flake
Former-commit-id: 9fc781c7da
2024-11-01 20:01:30 +01:00
Hadi a306013288 add nh informations
Former-commit-id: 999b3abda5
2024-10-29 11:19:37 +01:00
Hadi 90a73be013 init nh
Former-commit-id: 9ffeb42e14
2024-10-29 11:17:40 +01:00
Hadi 4aa1b4eb50 switch to nh
Former-commit-id: 1ae412cf5b
2024-10-29 11:12:35 +01:00
Hadi c2c92cf19c update todos
Former-commit-id: 46b7f8d1b7
2024-10-29 10:44:49 +01:00
Hadi d767f47422 update flake
Former-commit-id: 2551b8c9ec
2024-10-29 09:23:55 +01:00
Hadi 442a0ad2b8 init docker
Former-commit-id: 4657ca3d75
2024-10-28 12:56:55 +01:00
Hadi 8b4fae6767 disable channels
Former-commit-id: 863253bc74
2024-10-25 18:10:08 +02:00
Hadi 886e10612b update flake
Former-commit-id: 34e71c0efd
2024-10-25 18:10:01 +02:00
Hadi 5734351eca Init hyprsunset
Former-commit-id: 9a41310dd7
2024-10-23 20:21:49 +02:00
Hadi c52894ecf0 update todos
Former-commit-id: be5b996255
2024-10-23 20:21:33 +02:00
Hadi 72dd09aca1 fix mistake
Former-commit-id: 0c169156bb
2024-10-23 20:20:26 +02:00
Hadi 4bd0343a63 Init hyprpolkitagent
Former-commit-id: 965ef9e76e
2024-10-23 20:15:46 +02:00
Hadi 961bb66e39 add nix path to nixd config
Former-commit-id: d7831f4115
2024-10-23 20:00:11 +02:00
Hadi 3e2f341bdb add nixpkgs path
Former-commit-id: a74e365403
2024-10-23 19:59:57 +02:00
Hadi e0dcde257a update flake
Former-commit-id: f38ee3051c
2024-10-22 20:34:24 +02:00
github-actions e2ce1c442c Update README.md (auto)
Former-commit-id: a1fcbd51d8
2024-10-21 15:08:56 +00:00
Hadi d3a25298d8 update readme theme section
Former-commit-id: 4e69c6702f
2024-10-21 17:08:34 +02:00
Hadi b4edee45c2 add the theme variables inside the theme dir
Former-commit-id: ba911dc627
2024-10-21 17:06:15 +02:00
Hadi c830e627b0 add just to dev packages
Former-commit-id: c36755f90e
2024-10-21 16:54:39 +02:00
Hadi fcec5fff43 add position option for hyprpanel
Former-commit-id: 1ac07c3ace
2024-10-21 13:16:27 +02:00
Hadi 8a81c97ef3 Merge branch 'main' of github.com:anotherhadi/nixy
Former-commit-id: 7af05cf3b3
2024-10-21 13:04:00 +02:00
Hadi 6d46bb179c update todos
Former-commit-id: b1a5af1257
2024-10-21 13:03:51 +02:00
github-actions a38eb82a2d Update KEYBINDINGS-HYPRLAND.md (auto)
Former-commit-id: 893260f073
2024-10-20 18:38:06 +00:00
Hadi 2c01fd4182 tofi rules & dbus activation
Former-commit-id: f42dc43810
2024-10-20 20:37:53 +02:00
Hadi ad01749b10 playerctl shortcuts
Former-commit-id: bb06cc673a
2024-10-20 20:37:10 +02:00
Hadi 201e9141a9 launch drun through tofi
Former-commit-id: d4761c8c51
2024-10-20 20:36:54 +02:00
Hadi dfbabf721d Add gpu & disable ghost monitors
Former-commit-id: 6744550bf6
2024-10-17 20:29:08 +02:00
Hadi 24553acae4 add hints for changeme comments
Former-commit-id: b8b9d16f8c
2024-10-16 18:56:56 +02:00
Hadi ace16b05dd remove kde connect
Former-commit-id: 4c5963dcaa
2024-10-16 18:56:41 +02:00
Hadi 9222b90b24 add aliases for git reset
Former-commit-id: 968ca31d18
2024-10-16 16:19:20 +02:00
Hadi ac7da3935e update todos
Former-commit-id: c283b9cb9c
2024-10-16 16:17:55 +02:00
Hadi c08d1bd231 sort by lines
Former-commit-id: 339349661a
2024-10-16 16:16:49 +02:00
github-actions 9635c7c8d5 Update KEYBINDINGS-HYPRLAND.md (auto)
Former-commit-id: c904a81267
2024-10-15 23:59:19 +00:00
Hadi 51c00c532f init quickmenu
Former-commit-id: c9663e1da6
2024-10-16 01:59:04 +02:00
Hadi e386a42a43 update todos
Former-commit-id: 37c6ba8d1b
2024-10-16 01:29:47 +02:00
Hadi 26f5c4d041 disable autoDrag (overview)
Former-commit-id: 6f052316e9
2024-10-16 01:29:36 +02:00
github-actions c3c4d5a027 Update KEYBINDINGS-HYPRLAND.md (auto)
Former-commit-id: 01a5992be0
2024-10-15 23:22:27 +00:00
Hadi c416c53ec3 Init Hyprspace (overview)
Former-commit-id: e0e09df208
2024-10-16 01:22:12 +02:00
Hadi 51c1e94c15 fix prompts
Former-commit-id: 0d50980a8d
2024-10-16 00:43:59 +02:00
Hadi 12657964c0 add tofi commandw
Former-commit-id: fdec6ed81c
2024-10-16 00:40:40 +02:00
Hadi b4a41673ed change markdown title highlight
Former-commit-id: f878719b3d
2024-10-15 21:20:43 +02:00
Hadi a0c9d2570d disable treesitter context
Former-commit-id: 491e29a8fc
2024-10-15 20:15:22 +02:00
Hadi abca34497f buttons background color fix if transparent bar
Former-commit-id: e513c2cb44
2024-10-15 19:53:20 +02:00
Hadi 3a66e81390 nixy loop prompt fix
Former-commit-id: f36410f05f
2024-10-15 19:53:08 +02:00
Hadi 9c8ff97621 init nixy loop
Former-commit-id: 51c64ace97
2024-10-15 17:42:52 +02:00
Hadi fd3b272e31 Delete .sops.yaml
Former-commit-id: a88496af4f
2024-10-15 17:37:01 +02:00
Hadi b14941d499 remove .sops.yaml from github
Former-commit-id: 3c72f875ed
2024-10-15 17:36:37 +02:00
Hadi b503ef1dec remove .sops.yaml from github
Former-commit-id: 159e4aad23
2024-10-15 17:36:01 +02:00
Hadi f600f4903f tmux shortcuts for config
Former-commit-id: 3dee75c5d5
2024-10-15 17:30:47 +02:00
Hadi 023bf6d570 update flake
Former-commit-id: e5c39e4f2c
2024-10-15 16:54:19 +02:00
Hadi 3e23890e43 update github actions
Former-commit-id: 05fb0f494a
2024-10-15 15:08:08 +02:00
Hadi fc4dba9a75 update todos
Former-commit-id: f760d9b564
2024-10-15 15:03:50 +02:00
Hadi 2b56da08c6 change tab size for markdown
Former-commit-id: 80e52cc5c6
2024-10-15 15:02:39 +02:00
Hadi f95f539cad Add comments to explain each file
Former-commit-id: 915a767283
2024-10-15 15:02:07 +02:00
Hadi d8b626139a update markdown tab size
Former-commit-id: 4733414bb3
2024-10-15 14:24:58 +02:00
Hadi 477679c0a7 hyprshot -> grimblast
Former-commit-id: 3910bef1bf
2024-10-15 14:14:12 +02:00
Hadi 109ce61bbe add glib
Former-commit-id: 92dded9cc6
2024-10-15 14:05:20 +02:00
Hadi 0c50468ec2 update flake
Former-commit-id: 5e94040f34
2024-10-15 13:42:42 +02:00
Hadi 71f03bde80 update todo
Former-commit-id: 178cb469ab
2024-10-15 13:42:12 +02:00
Hadi b568faa7f2 From flake to nixvim plugin
Former-commit-id: 59202f132e
2024-10-15 03:47:58 +02:00
Hadi 31a84fd6ff update todo
Former-commit-id: 9f98570ef4
2024-10-15 03:47:43 +02:00
Hadi 30d497fef2 update todo
Former-commit-id: bcd3bd19f0
2024-10-15 03:28:56 +02:00
github-actions 6e41aed96f Update README.md (auto)
Former-commit-id: ad13d77413
2024-10-15 01:22:40 +00:00
Hadi 9256aabe91 edit readme
Former-commit-id: 98d8e2c87d
2024-10-15 03:22:09 +02:00
github-actions 7d54322e8c Update README.md (auto)
Former-commit-id: fd87e06e20
2024-10-15 01:20:20 +00:00
Hadi 364945be45 Edit readme
Former-commit-id: 6c9e632ab8
2024-10-15 03:19:53 +02:00
Hadi 7932ba1f44 Edit github actions
Former-commit-id: 66160d6ae2
2024-10-15 03:18:22 +02:00
Hadi 4eef13d9ba Changes config screenshots
Former-commit-id: 480ae1761d
2024-10-15 03:17:17 +02:00
Hadi 80ea020322 Edit aliases
Former-commit-id: 1b41b58e68
2024-10-15 03:16:57 +02:00
Hadi 31d025a1b8 Update todolist
Former-commit-id: bbbf23b3b0
2024-10-15 02:47:32 +02:00
Hadi b41644c69d Config lazygit
Former-commit-id: ff2d397191
2024-10-15 02:45:32 +02:00
Hadi 0ec95f82d2 Merge branch 'main' of github.com:anotherhadi/nixy
Former-commit-id: afe8e81bf6
2024-10-15 02:34:33 +02:00
Hadi 0df71d76df Init lazygit hm module
Former-commit-id: d097caf401
2024-10-15 02:34:18 +02:00
Hadi d3f39e88dc Add git aliases
Former-commit-id: 4b6814ae28
2024-10-15 02:34:00 +02:00
github-actions a8db853539 Update README.md (auto)
Former-commit-id: c76675c145
2024-10-15 00:29:21 +00:00
Hadi ba4af473f4 Move files to .github
Former-commit-id: ff86acc8c8
2024-10-15 02:28:55 +02:00
Hadi c272a4a8f9 Edit github actions
Former-commit-id: 7bb5c3b36c
2024-10-15 02:28:24 +02:00
Hadi 16f1aba0c1 Add transparentButtons option in hyprpanel
Former-commit-id: 1c477bacc3
2024-10-15 02:23:14 +02:00
Hadi 9be215cdea Update todo
Former-commit-id: 391d3dd58b
2024-10-15 02:18:54 +02:00
Hadi f125369e88 Add lazygit
Former-commit-id: e6dd29dac7
2024-10-15 02:17:45 +02:00
Hadi 73d9867b9a Add info
Former-commit-id: 67bed2c355
2024-10-14 22:29:08 +02:00
Hadi 04b3882399 Update github actions
Former-commit-id: 5ec16c82c4
2024-10-14 22:27:33 +02:00
github-actions ad0c8828cf Update README.md (auto)
Former-commit-id: 277faa310d
2024-10-14 20:21:09 +00:00
Hadi 89252b80bf Init tofi
Former-commit-id: 059acab3f9
2024-10-14 22:20:39 +02:00
Hadi ab6ae9e7fb Update todolist
Former-commit-id: 95248322f7
2024-10-14 22:20:30 +02:00
Hadi c84eb4e185 Update readme
Former-commit-id: 0ea82dbf32
2024-10-14 22:20:16 +02:00
Hadi 00236ad9b1 Update github actions
Former-commit-id: 65b9ab0b7e
2024-10-14 22:19:25 +02:00
Hadi 3e9f37ea04 Update readme
Former-commit-id: 4fd7e39c4e
2024-10-14 22:14:49 +02:00
Hadi 0019097d38 Update github actions
Former-commit-id: de477fd3dd
2024-10-14 22:14:30 +02:00
Hadi 90284912bc Update readme
Former-commit-id: 62e6928036
2024-10-14 22:13:13 +02:00
Hadi f9f63657fb Update github actions
Former-commit-id: 4cfdd8f461
2024-10-14 22:12:52 +02:00
Hadi 319da87024 Update readme
Former-commit-id: 2909de8e3a
2024-10-14 22:11:18 +02:00
Hadi b5cad0e00c Fix github action
Former-commit-id: e2f6c5e1ff
2024-10-14 22:09:29 +02:00
Hadi 892666e946 Update readme
Former-commit-id: 206de96fa2
2024-10-14 22:08:31 +02:00
Hadi d1f5b0ea4f Update github actions
Former-commit-id: ff7f46aa5d
2024-10-14 22:07:10 +02:00
Hadi a8980eb4dd Add white-noise app
Former-commit-id: 34cc630789
2024-10-14 21:23:59 +02:00
Hadi 8482de47b2 Update todolist
Former-commit-id: eb4cb4f4f4
2024-10-14 21:23:45 +02:00
Hadi 7faec62f69 Init KDE Connect
Former-commit-id: 52d7a9f2f0
2024-10-14 21:10:16 +02:00
Hadi 69f2ccceca Fix gtk settings key
Former-commit-id: a8dca6d1c1
2024-10-14 20:57:56 +02:00
Hadi 476d89a651 Flake update
Former-commit-id: d06355d5b7
2024-10-14 20:51:31 +02:00
Hadi 690ae53780 Add documentation per modules
Former-commit-id: 39f74ee63c
2024-10-14 16:35:57 +02:00
Hadi 58ed393097 Edit network placement
Former-commit-id: bd57c19a2b
2024-10-14 14:22:14 +02:00
Hadi 4367c39873 Edit popup font size
Former-commit-id: b9e3f09e7f
2024-10-11 22:33:29 +02:00
Hadi f32062d541 Fix copilot completion key overlap
Former-commit-id: f5388f478b
2024-10-11 13:02:43 +02:00
Hadi eb57aa062e Edit todo
Former-commit-id: a24167d107
2024-10-10 22:42:02 +02:00
Hadi fce3056d8f Init zenmode
Former-commit-id: 53703c0db0
2024-10-10 22:41:39 +02:00
Hadi 42bb93093c merge gh actions updates
Former-commit-id: 6adc0d7c3c
2024-10-10 21:43:33 +02:00
Hadi e785e84bf2 Init hyprswitch
Former-commit-id: 4969b5aa8f
2024-10-10 21:43:24 +02:00
github-actions e2af0156c8 Update KEYBINDINGS-HYPRLAND.md (auto)
Former-commit-id: f595e67528
2024-10-10 14:33:34 +00:00
Hadi b071daad02 Update
Former-commit-id: b5071b889b
2024-10-10 16:33:21 +02:00
Hadi 4e7a020fc4 Update
Former-commit-id: fa59c4d8c2
2024-10-10 16:31:30 +02:00
github-actions ac53f1a812 Update README.md (auto)
Former-commit-id: 568306aade
2024-10-10 14:29:41 +00:00
Hadi 5ed0ec12ea Update
Former-commit-id: 159ce3c1c2
2024-10-10 16:29:14 +02:00
Hadi fc0c2b0d13 Update
Former-commit-id: df52538c42
2024-10-10 15:35:23 +02:00
Hadi aa1f99e8f4 Update
Former-commit-id: ee894aaea7
2024-10-10 15:28:25 +02:00
Hadi 2b947bd5b1 Update
Former-commit-id: bd7ff1cc20
2024-10-10 15:09:59 +02:00
Hadi c0efbbd734 Update
Former-commit-id: 3c2157260d
2024-10-09 18:34:02 +02:00
Hadi 6379ff551d Update
Former-commit-id: 36e9281397
2024-10-09 17:09:33 +02:00
Hadi 492d257fa5 Put every variables in top of the file for easy copy to another config
Former-commit-id: 0bd55fdc10
2024-10-09 15:12:50 +02:00
Hadi 3bebb475d7 Update
Former-commit-id: 55c7c7068a
2024-10-08 21:56:44 +02:00
Hadi 4a832f376f Update
Former-commit-id: 5603871ef1
2024-10-08 20:46:56 +02:00
Hadi a5bd556df9 Update
Former-commit-id: a554505de2
2024-10-08 20:07:56 +02:00
Hadi c6710b1d64 Update
Former-commit-id: 3f0a694b5f
2024-10-08 20:02:45 +02:00
Hadi 731aa270b6 Update
Former-commit-id: a781a227ac
2024-10-08 13:00:40 +02:00
Hadi 8c74fa0fc8 Remove duckduckgo theme changing alert
Former-commit-id: 5e8139963f
2024-10-08 12:37:56 +02:00
Hadi 0bb41bb6dd Update the readme
Former-commit-id: 85b8874094
2024-10-08 12:35:38 +02:00
Hadi 92e9e59f02 Update the readme
Former-commit-id: d7184174cd
2024-10-08 12:34:50 +02:00
Hadi 7a177e4bb2 Update
Former-commit-id: 8d7fbd74b5
2024-10-08 12:33:38 +02:00
Hadi e8625f81e9 Update
Former-commit-id: 36527362a7
2024-10-08 11:43:12 +02:00
Hadi b14c343f14 Update
Former-commit-id: e83de257ad
2024-10-08 11:29:59 +02:00
Hadi c364668759 Update
Former-commit-id: c401b9bd7f
2024-10-08 10:39:10 +02:00
Hadi 3381fe405b Update
Former-commit-id: 741a6f97ae
2024-10-08 10:17:01 +02:00
Hadi b738189d0c Update
Former-commit-id: 52e267a436
2024-10-07 20:41:30 +02:00
Hadi ac914caf6a Update
Former-commit-id: d11cf580f9
2024-10-07 20:27:07 +02:00
Hadi 97e2c915cd Update
Former-commit-id: d37504de7c
2024-10-07 18:34:06 +02:00
Hadi 21ed46cd7c Update
Former-commit-id: 8a41ffad2f
2024-10-07 13:13:23 +02:00
Hadi 7eb4e5ade9 Update
Former-commit-id: 3aa0fb8a22
2024-10-07 12:02:26 +02:00
Hadi dae95bc5be Update
Former-commit-id: 75f2c2c7c6
2024-10-07 11:17:59 +02:00
Hadi a33cf73ff1 Update
Former-commit-id: ab65fe342b
2024-10-07 10:13:21 +02:00
Hadi 18c30e5931 Update
Former-commit-id: 905cc9a885
2024-10-06 18:49:52 +02:00
Hadi 13c8f27411 Testing
Former-commit-id: 23dcfd5290
2024-10-05 11:48:16 +02:00
Hadi a640670baa Update
Former-commit-id: 270c1b959e
2024-10-04 21:12:13 +02:00
Hadi ae77733c71 Update
Former-commit-id: 58fa41a210
2024-10-04 21:03:01 +02:00
Hadi 6827360045 Update
Former-commit-id: 8f6b049129
2024-10-04 10:58:53 +02:00
Hadi 359e9745d6 Update
Former-commit-id: 7047ffe785
2024-10-03 10:18:49 +02:00
Hadi 56bcd3d56a Update
Former-commit-id: fe657984fe
2024-10-01 17:16:24 +02:00
Hadi 8a81c546de Update
Former-commit-id: 660c99d5ed
2024-10-01 15:05:02 +02:00
Hadi 23f0682eac Update
Former-commit-id: 7f1c7446f8
2024-10-01 14:57:15 +02:00
Hadi 418bc45bd2 Update
Former-commit-id: 804e6b255e
2024-10-01 13:58:05 +02:00
Hadi 1c4fece944 Update
Former-commit-id: 381e839dfa
2024-10-01 13:21:25 +02:00
Hadi 3716ba6b4f Update
Former-commit-id: 57c0df5d48
2024-09-30 21:15:21 +02:00
Hadi 0e56be3428 Update
Former-commit-id: c1609eefff
2024-09-23 15:12:05 +02:00
Hadi 7beef9441e Update
Former-commit-id: 22c67467c0
2024-09-20 13:35:40 +02:00
Hadi 176e3ba305 Update
Former-commit-id: f49ac89514
2024-09-18 23:54:02 +02:00
Hadi ed045316ff Update
Former-commit-id: e47edc0c1f
2024-09-18 23:53:39 +02:00
Hadi cfec304bbb Update
Former-commit-id: 2721d11575
2024-09-18 00:52:23 +02:00
Hadi 575bb58bfc Update
Former-commit-id: c97e51a9d2
2024-09-16 17:28:52 +02:00
Hadi 9ce3df4884 Update
Former-commit-id: ac293a378c
2024-09-16 17:24:47 +02:00
Hadi 3c9875a110 Update
Former-commit-id: 615028dcca
2024-09-15 20:58:24 +02:00
Hadi 8c69c549db update
Former-commit-id: feeb938f5e
2024-09-13 22:07:19 +02:00
Hadi f1f919fe49 Update
Former-commit-id: b6ec38b1a1
2024-09-13 20:04:14 +02:00
Hadi 12cc080fc3 Update
Former-commit-id: 86d990f157
2024-09-12 01:36:59 +02:00
Hadi 6b4b9a9aa7 Update
Former-commit-id: a16ea9af7d
2024-09-12 00:25:37 +02:00
Hadi 6207e48d84 Update
Former-commit-id: 7904e497bd
2024-09-11 17:53:25 +02:00
Hadi b41dfdf664 Update
Former-commit-id: 7f5e4a8e6d
2024-09-10 09:50:27 +02:00
Hadi 8155f65fb9 Update
Former-commit-id: 1a7e84a8dd
2024-09-09 13:56:45 +02:00
Hadi b0ca6aa757 Update
Former-commit-id: 381f88cf0d
2024-09-07 17:25:21 +02:00
Hadi fd0251afbc Update
Former-commit-id: 166c9f3139
2024-09-06 20:19:21 +02:00
Hadi 5e16ae7463 Update
Former-commit-id: 316e0cd2d3
2024-09-04 22:37:24 +02:00
Hadi 2a2f4e4b9d Update
Former-commit-id: 8fe7237409
2024-09-04 22:36:17 +02:00
Hadi eef1d9531f Update
Former-commit-id: 2ffa7e9518
2024-09-04 22:01:48 +02:00
Hadi b92243118d Update
Former-commit-id: cc8d0ddca3
2024-09-04 21:24:51 +02:00
Hadi 01f9894fc6 update
Former-commit-id: da2aab6f76
2024-09-04 21:07:53 +02:00
Hadi 03d202250b update
Former-commit-id: 79403b916d
2024-09-04 21:06:59 +02:00
Hadi 9cb8036b73 Update
Former-commit-id: 0489f7eaa7
2024-09-04 21:04:53 +02:00
Hadi 60fe3769e8 Release v2.4.0
Former-commit-id: 7ddff66f00
2024-09-04 10:11:28 +02:00
Hadi 641bf821d4 Update
Former-commit-id: e1f973cabf
2024-09-04 10:10:52 +02:00
Hadi 25aa619445 Update
Former-commit-id: e38895c4a5
2024-09-04 10:10:32 +02:00
Hadi 5a0d476de3 Update
Former-commit-id: c2e6fd7d32
2024-09-04 09:34:42 +02:00
Hadi 00db8d0ae6 Update
Former-commit-id: 3d8bcaeeb2
2024-09-04 02:02:57 +02:00
Hadi ef66b6f848 Add wofi clipman
Former-commit-id: 4135134261
2024-09-04 01:53:36 +02:00
Hadi 59caed5e69 Add wofi emoji
Former-commit-id: 027ef1c398
2024-09-04 01:44:37 +02:00
Hadi dad0865d06 Change to gammastep
Former-commit-id: 659509e613
2024-09-04 01:40:24 +02:00
Hadi c106c76cbc Update
Former-commit-id: e9a20f49e2
2024-09-02 18:30:30 +02:00
Hadi 4181544de8 Update
Former-commit-id: 75562adea8
2024-09-02 09:29:50 +02:00
Hadi 30c8414749 Update
Former-commit-id: 4afca71b91
2024-08-30 17:29:30 +02:00
Hadi 6bb9386773 Update
Former-commit-id: 4a8f1be75f
2024-08-30 17:02:38 +02:00
Hadi ae82cbcf67 Update
Former-commit-id: 4540b40dc4
2024-08-30 16:13:57 +02:00
Hadi 518ac107c6 Update
Former-commit-id: fcd5eca04f
2024-08-30 16:06:22 +02:00
Hadi 58f5f421e8 Update
Former-commit-id: da1b88305d
2024-08-30 15:47:17 +02:00
Hadi 999950afc9 Update
Former-commit-id: f0e9294982
2024-08-30 14:16:30 +02:00
Hadi 13a6249227 Update
Former-commit-id: b3f20e6aef
2024-08-30 09:33:57 +02:00
Hadi c68df370cc Update
Former-commit-id: 48a59c4c55
2024-08-29 22:46:04 +02:00
Hadi c08d551932 Update
Former-commit-id: c83e5b2213
2024-08-29 17:04:05 +02:00
Hadi fa63cf950a Update
Former-commit-id: 55a5c52c51
2024-08-29 14:29:05 +02:00
Hadi 31cb1fd0f2 Release v2.3.0
Former-commit-id: 90e8d5577e
2024-08-28 12:30:52 +02:00
Hadi 647236f7b0 Fetch the gtk flatcolor theme folder from github
Former-commit-id: 835a9e9da2
2024-08-28 12:30:04 +02:00
Hadi 43566fc4ae Update
Former-commit-id: 3c171c33be
2024-08-28 11:43:03 +02:00
Hadi 682c50793c Update
Former-commit-id: aa8fca0bed
2024-08-26 17:48:05 +02:00
Hadi 2958b5a03c Update
Former-commit-id: 1255919f41
2024-08-24 17:09:12 +02:00
Hadi 2b25d18bd5 update
Former-commit-id: 109f31151d
2024-08-23 11:42:33 +02:00
Hadi 248f9a5ba8 update
Former-commit-id: 3c3acd03b4
2024-08-23 11:28:15 +02:00
Hadi 89ff802e16 update
Former-commit-id: 65c95ac82a
2024-08-23 11:28:07 +02:00
Hadi 13643dc1bc update
Former-commit-id: 776095c817
2024-08-23 11:25:23 +02:00
Hadi 188ef240ae update
Former-commit-id: d36952e040
2024-08-23 11:23:16 +02:00
Hadi a8c1b6363d update
Former-commit-id: ae0480cab3
2024-08-23 10:59:21 +02:00
Hadi 8aaa6199f2 update
Former-commit-id: bd8e69fe44
2024-08-23 10:58:07 +02:00
Hadi 4cd544d59f update
Former-commit-id: ddeaf0170d
2024-08-23 10:56:42 +02:00
Hadi c9a4f2115d update
Former-commit-id: f27b66f878
2024-08-23 10:52:35 +02:00
Hadi 395efb8ef1 update
Former-commit-id: 574b0043ac
2024-08-23 10:52:11 +02:00
Hadi 1280370a0a update
Former-commit-id: fbd804939f
2024-08-23 10:51:31 +02:00
Hadi f9bcfb5b50 update
Former-commit-id: cfa4e187c5
2024-08-23 10:31:25 +02:00
Hadi 3244b2d7e0 update
Former-commit-id: b1d3094bcc
2024-08-23 10:25:43 +02:00
Hadi eff0846c0f update
Former-commit-id: 1f7ca17d94
2024-08-23 10:12:00 +02:00
Hadi e2a10d4067 update
Former-commit-id: d939bc6f53
2024-08-23 10:11:07 +02:00
Hadi 39a1d16701 update
Former-commit-id: 3419421098
2024-08-23 10:09:02 +02:00
Hadi adbe7f3295 Update
Former-commit-id: d816099985
2024-08-22 21:02:14 +02:00
Hadi d67f234b2b update
Former-commit-id: 28424b82ab
2024-08-22 16:28:08 +02:00
Hadi 14a3a77c9e update
Former-commit-id: 771dceeb06
2024-08-22 16:11:48 +02:00
Hadi 0a1f505dd1 update
Former-commit-id: a2d4d36289
2024-08-22 16:07:39 +02:00
Hadi c6b1af26ce update
Former-commit-id: e4fce0a17a
2024-08-22 16:06:44 +02:00
Hadi 4a42f1fc91 update
Former-commit-id: 88a8168ce2
2024-08-22 16:02:10 +02:00
Hadi 612a8f6d33 update
Former-commit-id: 58d809d860
2024-08-22 15:41:28 +02:00
Hadi e7b608ecc4 update
Former-commit-id: 4b3f43e402
2024-08-22 15:32:46 +02:00
Hadi bfe270b6e1 update
Former-commit-id: bbe0574051
2024-08-22 15:28:47 +02:00
Hadi e5f82cdb2d Update
Former-commit-id: 3ef71b9fa2
2024-08-22 15:25:32 +02:00
Hadi d705c8cecc Update
Former-commit-id: a240a76a8e
2024-08-20 15:27:18 +02:00
Hadi f2613218db Update
Former-commit-id: d254085e29
2024-08-20 00:17:10 +02:00
Hadi 2099c4636c Update
Former-commit-id: ac2223ad24
2024-08-19 22:50:30 +02:00
Hadi 8cf93bfbc8 Update
Former-commit-id: 8092a2d348
2024-08-19 22:28:49 +02:00
Hadi b2dca45c34 Update
Former-commit-id: c434816d83
2024-08-19 22:20:59 +02:00
Hadi 403e4e1967 Update
Former-commit-id: 9e8637e9a8
2024-08-19 21:09:21 +02:00
Hadi 7ef771f14e Update
Former-commit-id: d1896b626b
2024-08-19 20:40:29 +02:00
Hadi acb7db87df Release v2.2.0
Former-commit-id: e6f66110f0
2024-08-19 20:32:10 +02:00
Hadi 0f5b7f60b6 Update
Former-commit-id: caaa500232
2024-08-19 19:42:20 +02:00
Hadi d7264b0de1 Update
Former-commit-id: e27d43df71
2024-08-19 19:41:24 +02:00
Hadi 23b518381a Update
Former-commit-id: 79a69d245c
2024-08-19 19:36:21 +02:00
Hadi 8876aae16c Update
Former-commit-id: 849eb5dd11
2024-08-19 00:38:27 +02:00
Hadi 0ed5d1cf04 Update
Former-commit-id: 31ac58592e
2024-08-19 00:15:43 +02:00
Hadi 83decac5e9 Update
Former-commit-id: b9fda769bc
2024-08-18 23:57:00 +02:00
Hadi 9104494893 Update
Former-commit-id: 94c88e04f2
2024-08-18 23:56:48 +02:00
Hadi 10d1a73eeb Update
Former-commit-id: 9d74ac9d82
2024-08-18 23:52:21 +02:00
Hadi 307c0b5edd Update
Former-commit-id: a64c79ae22
2024-08-18 23:43:17 +02:00
Hadi 321914861f Release v2.1.0
Former-commit-id: a134abdea3
2024-08-18 23:40:47 +02:00
Hadi b851c527af Update
Former-commit-id: 957b148656
2024-08-18 23:29:31 +02:00
Hadi 69f1aa3072 Update
Former-commit-id: 7fab715859
2024-08-18 23:29:08 +02:00
Hadi aeaee053c4 Update
Former-commit-id: 246b5b6c8e
2024-08-11 12:02:11 +02:00
Hadi 7632e82867 Update
Former-commit-id: a318562aa7
2024-08-10 13:28:07 +02:00
Hadi ffbb5eb322 Update
Former-commit-id: 4ec671e6b4
2024-08-02 20:53:58 +02:00
Hadi fe6288d42c Update
Former-commit-id: e3f4493865
2024-07-29 19:34:43 +02:00
Hadi f54ec0a5ab Update
Former-commit-id: 5c5a2796f6
2024-07-25 23:23:11 +02:00
Hadi 768b475183 Update
Former-commit-id: a7bd5ad28b
2024-07-24 23:38:16 +02:00
Hadi 0643968e77 Update
Former-commit-id: 830dc909e2
2024-07-22 22:32:10 +02:00
Hadi 18a17abad4 Update
Former-commit-id: 351dc0ebb3
2024-07-22 21:49:19 +02:00
Hadi c4b19710ef Update
Former-commit-id: aff363f37d
2024-07-21 22:20:55 +02:00
Hadi 1beb1be29c Update
Former-commit-id: fdd41cf848
2024-07-19 13:03:34 +02:00
Hadi 621520e9e8 Update
Former-commit-id: 308cbfcb19
2024-07-13 12:04:41 +02:00
Hadi f030f9b6ed Update
Former-commit-id: 1dc5190c43
2024-07-11 16:07:04 +02:00
Hadi f6c5f90a75 Update
Former-commit-id: 8412b4dd93
2024-07-09 16:20:53 +02:00
Hadi 3ad6f353b6 Update
Former-commit-id: 04d2e91dd5
2024-07-09 15:01:41 +02:00
Hadi debc426717 Update
Former-commit-id: 70459117ed
2024-07-09 14:16:50 +02:00
Hadi 0e6f7110e4 Update
Former-commit-id: 87ee1c7738
2024-07-09 14:00:14 +02:00
Hadi af3b9fcd6e Update
Former-commit-id: 0509eba07f
2024-07-09 13:41:42 +02:00
Hadi 8e5df9ff90 Update
Former-commit-id: 9142814f8f
2024-07-09 12:05:04 +02:00
Hadi 7e1eaf33af Update
Former-commit-id: 33a9386356
2024-07-09 11:44:32 +02:00
Hadi 6a12e7cde9 Update
Former-commit-id: fb73cce28a
2024-07-09 11:12:41 +02:00
Hadi 9a4fb9fd61 Update
Former-commit-id: e0c24bf068
2024-07-09 09:47:29 +02:00
Hadi c77dd39a98 Update
Former-commit-id: 8e63ef0b46
2024-07-09 09:38:51 +02:00
Hadi a0a7d5755a Merge branch 'main' of github.com:anotherhadi/nixy
Update


Former-commit-id: e107b25a2f
2024-07-09 09:33:49 +02:00
Hadi 5efa224a57 Update
Former-commit-id: 841f9625e9
2024-07-09 09:33:21 +02:00
Hadi 61e195d134 update
Former-commit-id: ddddd3b4a4
2024-07-08 07:45:56 +00:00
Hadi 5b2c6db769 Update
Former-commit-id: a73a50aa1f
2024-07-06 00:37:24 +02:00
Hadi c6fee1ccd6 Update
Former-commit-id: cd7db37ccd
2024-07-06 00:35:41 +02:00
Hadi 60652a60df Update
Former-commit-id: 9931071846
2024-07-05 14:56:19 +02:00
Hadi b41f3576c9 Update
Former-commit-id: de4347765c
2024-07-05 10:16:16 +02:00
Hadi edacf85795 Update
Former-commit-id: 5bee2d6931
2024-07-05 09:20:58 +02:00
Hadi 7dd9f021f0 Update
Former-commit-id: 7dc7cfcaba
2024-07-05 09:09:43 +02:00
Hadi ce4da71c70 Update
Former-commit-id: a8d37c3fcd
2024-07-05 08:49:18 +02:00
Hadi 0380714faa Update
Former-commit-id: fa6d5d50bd
2024-07-02 12:18:49 +02:00
Hadi 2b7d962b27 update
Former-commit-id: fdff88cc9d
2024-07-01 13:15:24 +00:00
Hadi 11f73f74ff nixvim refactor
Former-commit-id: 55caf123df
2024-07-01 13:07:12 +00:00
Hadi 8cc101b169 Update
Former-commit-id: 88ae1d29a5
2024-07-01 13:04:32 +02:00
Hadi 0bd30d921b update todos
Former-commit-id: 51739ac610
2024-07-01 08:41:07 +00:00
Hadi fe238ca49a update
Former-commit-id: 76a6f6cd6e
2024-07-01 08:34:04 +00:00
Hadi 527a22c37b update
Former-commit-id: 7ef2c71725
2024-07-01 08:32:49 +00:00
Hadi e1ad72405f update
Former-commit-id: 81574fd7bc
2024-07-01 08:31:12 +00:00
Hadi 985a8b063d Add wallpapers
Former-commit-id: ba9dde2c1a
2024-07-01 10:13:17 +02:00
Hadi 66677bc08e update
Former-commit-id: 93837b6bea
2024-06-30 18:01:52 +02:00
Hadi f3434352d2 Update
Former-commit-id: 8b76bf48a6
2024-06-30 17:59:39 +02:00
Hadi 65b82b3609 update
Former-commit-id: c80ddff8eb
2024-06-30 17:46:32 +02:00
Hadi c3e544248f update
Former-commit-id: c4d436b434
2024-06-30 17:42:09 +02:00
Hadi 6a33d7ac72 update
Former-commit-id: dae8755b59
2024-06-30 17:35:58 +02:00
Hadi 9b8c5b9b19 Update
Former-commit-id: 7c0216b1fb
2024-06-30 17:32:42 +02:00
Hadi 130415e809 Update
Former-commit-id: 40ffce6605
2024-06-29 00:18:07 +02:00
Hadi 52a029e998 Update
Former-commit-id: 56c2c41b68
2024-06-28 16:35:49 +02:00
Hadi d1a8286a21 Update
Former-commit-id: 06f5e03e66
2024-06-28 16:32:52 +02:00
Hadi 78bccf2c7e Update
Former-commit-id: 921c359693
2024-06-28 15:02:53 +02:00
Hadi 4290cc3c35 update
Former-commit-id: 1f35859f2c
2024-06-28 14:35:35 +02:00
Hadi 8f70b0d26b Update
Former-commit-id: 71f405e633
2024-06-28 01:24:27 +02:00
Hadi d9580c1dff update
Former-commit-id: 84b645e181
2024-06-28 01:11:49 +02:00
Hadi 763fa5e549 update
Former-commit-id: 5857299c20
2024-06-28 01:10:09 +02:00
Hadi 0c68ac35b5 update
Former-commit-id: ec24cde14f
2024-06-28 01:07:53 +02:00
Hadi 3ed7128cc4 update
Former-commit-id: 3f79044a2a
2024-06-28 01:07:24 +02:00
Hadi d7f34d9f0e Update
Former-commit-id: cf6ea202e1
2024-06-28 00:58:12 +02:00
Hadi 826fd6aaaf Update
Former-commit-id: 84f87f9833
2024-06-27 19:42:08 +02:00
Hadi 1fba2d19b3 Update
Former-commit-id: ae6818ed65
2024-06-27 18:32:17 +02:00
Hadi d92bbe59a6 update
Former-commit-id: cd7b35389e
2024-06-27 09:49:24 +00:00
Hadi edc0243200 update
Former-commit-id: c8c81e20ae
2024-06-27 09:20:44 +00:00
Hadi 27ac4008f8 golang bin to $PATH
Former-commit-id: 2972b4238c
2024-06-27 08:45:21 +00:00
Hadi 9dc7b851f5 update
Former-commit-id: b35d35f3d5
2024-06-27 08:42:42 +00:00
Hadi 4a2d941991 update
Former-commit-id: bde31a4934
2024-06-27 08:32:24 +00:00
Hadi a62c549e8f update
Former-commit-id: 170287e948
2024-06-27 08:31:28 +00:00
Hadi 7232c54382 create keybindings doc
Former-commit-id: 5d14ec00b5
2024-06-27 08:24:13 +00:00
Hadi 25067c9d06 Merge branch 'main' of https://github.com/anotherhadi/nixy
Former-commit-id: f6209d0754
2024-06-27 07:50:31 +00:00
Hadi be8b1b696c update todo
Former-commit-id: 9e906c161a
2024-06-27 07:46:24 +00:00
Hadi 885f18806e Update
Former-commit-id: 071ce93f11
2024-06-27 00:11:54 +02:00
Hadi b9ebf59fea Update
Former-commit-id: a9939a0f54
2024-06-27 00:10:09 +02:00
Hadi ba007b4710 Update
Former-commit-id: 9cf68648eb
2024-06-26 22:18:39 +02:00
Hadi 1d8bc979c3 Update
Former-commit-id: 652377bd9b
2024-06-26 22:17:03 +02:00
Hadi a7197e360e Update
Former-commit-id: dd9c61b9ff
2024-06-26 22:13:14 +02:00
Hadi 878754ad8b update
Former-commit-id: c00458c02a
2024-06-26 21:30:04 +02:00
Hadi 4a08e654e0 Update
Former-commit-id: 1df0f31dbc
2024-06-26 21:19:04 +02:00
Hadi 5d94699990 add md-table-of-contents source
Former-commit-id: 6a8382c79e
2024-06-26 14:46:22 +00:00
Hadi d98468a34d update
Former-commit-id: 1ed7675095
2024-06-26 14:44:08 +00:00
Hadi 5f73e46e73 Update
Former-commit-id: 57cab5fa52
2024-06-26 12:31:58 +02:00
Hadi 674ef50ac9 update
Former-commit-id: 3cfb9e733a
2024-06-26 10:32:58 +02:00
Hadi d276202288 Update
Former-commit-id: bb4617160c
2024-06-25 22:22:26 +02:00
Hadi 9b31f3be8d update
Former-commit-id: 80f8ca3e9a
2024-06-25 22:20:17 +02:00
Hadi 24d0f22f8e Update
Former-commit-id: c618feced4
2024-06-25 21:57:24 +02:00
Hadi 13cf7cd494 Update
Former-commit-id: 6f6c8bebf7
2024-06-25 18:10:20 +02:00
Hadi 65c430318f Update
Former-commit-id: 6d0855ce44
2024-06-25 18:02:38 +02:00
Hadi b4e6f9d48c update
Former-commit-id: 32af0cf534
2024-06-25 11:57:53 +02:00
Hadi a024023c43 init keybindings.md
Former-commit-id: 0b4f2d6970
2024-06-25 11:47:15 +02:00
Hadi 6edf2cd0b9 install script test
Former-commit-id: b4947a61c5
2024-06-25 11:39:34 +02:00
Hadi d2b3e6b430 up
Former-commit-id: 4e5cdbbac5
2024-06-25 09:49:11 +02:00
Hadi b5476da7ef version pull
Former-commit-id: c0a0afd077
2024-06-25 09:26:10 +02:00
Hadi 9c1afd279c Update TODO.md
Former-commit-id: e047f99306
2024-06-24 22:31:49 +02:00
Hadi f998316b9e rearrange folders
Former-commit-id: fbb6fe70ff
2024-06-24 21:18:20 +02:00
Hadi fea1eade7f Change notification system
Former-commit-id: 3b84f735ee
2024-06-24 21:13:22 +02:00
Hadi 2517219f4c Fix
Former-commit-id: 1cdfe8e278
2024-06-24 20:44:09 +02:00
Hadi c5d95b14ea Update TODO.md
Former-commit-id: 1eb830a97c
2024-06-24 16:37:59 +02:00
Hadi 0a7befb23b todo update
Former-commit-id: ec924af562
2024-06-24 14:35:46 +02:00
Hadi 41116fb2b5 update
Former-commit-id: 5d47643320
2024-06-24 11:05:38 +02:00
Hadi cf2f5f2f9b Update
Former-commit-id: 282c04af67
2024-06-24 00:40:05 +02:00
Hadi 35ba84724f Update
Former-commit-id: 7397237149
2024-06-24 00:33:36 +02:00
Hadi 2151fc6f90 Update
Former-commit-id: 1a4ff5e542
2024-06-24 00:17:07 +02:00
Hadi 45ed8258ca Update
Former-commit-id: 0cec3f04d2
2024-06-24 00:12:53 +02:00
Hadi ffc95dcd1b Update
Former-commit-id: 87ae5dd36f
2024-06-24 00:10:35 +02:00
Hadi 2c68166067 update
Former-commit-id: 2e31e74d92
2024-06-23 23:51:07 +02:00
Hadi ae83c7497a update
Former-commit-id: 0922357af2
2024-06-23 23:47:31 +02:00
Hadi 03c675cf62 update
Former-commit-id: 1d298c60d5
2024-06-23 23:43:47 +02:00
Hadi a4d8670563 update
Former-commit-id: d5aa5b1a49
2024-06-23 23:32:18 +02:00
Hadi 0114b629e6 update
Former-commit-id: 469f903657
2024-06-23 20:11:35 +02:00
Hadi 7f4280af72 update
Former-commit-id: ae95a1b457
2024-06-23 20:10:15 +02:00
Hadi e7b4080c2a update
Former-commit-id: 101712c8bb
2024-06-23 19:59:53 +02:00
Hadi c541832066 update
Former-commit-id: 5dce9af547
2024-06-23 19:54:21 +02:00
Hadi 8b57bffcd6 update
Former-commit-id: d215570fea
2024-06-23 18:35:16 +02:00
Hadi 7a4e3ad1a3 update
Former-commit-id: aa7801b04f
2024-06-23 18:32:04 +02:00
Hadi 7a2c2c6201 update
Former-commit-id: d1789906a2
2024-06-23 18:28:15 +02:00
Hadi a8c0fdb670 update
Former-commit-id: a4f74f5fe7
2024-06-23 18:26:25 +02:00
Hadi 5ce310fe6d update
Former-commit-id: afd56d878e
2024-06-23 18:24:30 +02:00
Hadi 89818e9ee2 update
Former-commit-id: 12ebcadd71
2024-06-23 17:53:09 +02:00
Hadi d943b85cc9 update
Former-commit-id: c5420f8d3a
2024-06-23 17:52:19 +02:00
Hadi 8eaa78bf4b Update
Former-commit-id: f8786dd24f
2024-06-23 17:32:18 +02:00
Hadi 82d6c29f21 Update
Former-commit-id: caee38f568
2024-06-23 15:48:52 +02:00
Hadi 72a8aa16bb Update
Former-commit-id: 487d81ff86
2024-06-23 15:14:29 +02:00
Hadi 5c9b799afe Update
Former-commit-id: 4046038cf2
2024-06-23 14:53:23 +02:00
Hadi eb584dac56 Update
Former-commit-id: e9a5a9e574
2024-06-23 14:52:35 +02:00
Hadi 2fd610a09c Update
Former-commit-id: 98f708d693
2024-06-23 14:50:06 +02:00
Hadi 8eb88f474a Update
Former-commit-id: 66cd92d740
2024-06-23 14:47:22 +02:00
Hadi f73291c269 Update
Former-commit-id: 2b5813057c
2024-06-23 14:46:11 +02:00
Hadi e93e5807f9 Update
Former-commit-id: bbb35737c2
2024-06-23 14:45:51 +02:00
Hadi 6d0a2e186b Update
Former-commit-id: 1efdadbdad
2024-06-23 14:23:36 +02:00
Hadi c2a700ef3a Update
Former-commit-id: 9f98ec2a52
2024-06-23 14:22:01 +02:00
Hadi 7b0deaf9c1 Update
Former-commit-id: 6f8c9d7836
2024-06-23 14:19:45 +02:00
Hadi 98d1ccb2c0 Add remote rebuild (server)
Former-commit-id: d1f5aa6dfa
2024-06-23 13:53:01 +02:00
Hadi e6f46e1788 Update
Former-commit-id: 54eb13bc40
2024-06-23 13:46:07 +02:00
Hadi e6c2becccb Update
Former-commit-id: f29e68ef63
2024-06-23 13:36:37 +02:00
Hadi cfc9f99c83 Update
Former-commit-id: 8260c9d554
2024-06-21 15:49:16 +02:00
Hadi 3c43b277b7 Update
Former-commit-id: ec5b132e17
2024-06-21 15:48:37 +02:00
Hadi 64f789e52a Update
Former-commit-id: 45c0175d72
2024-06-21 15:25:14 +02:00
Hadi 9ab4dae87b Update
Former-commit-id: 154c21859d
2024-06-21 13:58:14 +02:00
Hadi f2b742e470 Update
Former-commit-id: d100690333
2024-06-21 13:45:59 +02:00
Hadi a3f44fa53c Update
Former-commit-id: 9fd64e9f04
2024-06-21 13:44:56 +02:00
Hadi 91d06ef6a4 Update
Former-commit-id: 909c32fef8
2024-06-21 13:42:14 +02:00
Hadi b9df9861fc Update
Former-commit-id: feea4f5ad9
2024-06-21 13:14:54 +02:00
Hadi 049e2a9214 Update
Former-commit-id: 1ce9d2e46f
2024-06-20 18:04:50 +02:00
Hadi 78bb7ff465 Update
Former-commit-id: ae48fb8605
2024-06-20 17:43:20 +02:00
Hadi 8e04a559b9 Update
Former-commit-id: 636d921341
2024-06-20 17:34:56 +02:00
Hadi aa3f3e2269 Update
Former-commit-id: fa7ec583b6
2024-06-20 17:33:40 +02:00
Hadi bcc505f5dd Update
Former-commit-id: a723bd6087
2024-06-20 17:30:14 +02:00
Hadi f0617924b0 Update
Former-commit-id: 3950c68160
2024-06-20 17:08:25 +02:00
Hadi 14c33a8191 Update
Former-commit-id: 4653a9e86f
2024-06-20 16:39:59 +02:00
Hadi fcd92d0155 Update
Former-commit-id: 9e191c76eb
2024-06-20 16:32:27 +02:00
Hadi 9d73c644a7 Update
Former-commit-id: 2996ca0d12
2024-06-20 15:43:04 +02:00
Hadi c5c0fdc7cc Update
Former-commit-id: c7beef1880
2024-06-20 15:41:54 +02:00
Hadi 42d7b8b820 Update
Former-commit-id: 1a3c28f69a
2024-06-20 15:35:06 +02:00
Hadi 2983dd6270 Update
Former-commit-id: 597f88adab
2024-06-20 15:33:42 +02:00
Hadi 7d684153a9 Update
Former-commit-id: 85a4a4ad2a
2024-06-20 15:31:01 +02:00
Hadi bc26eb05a7 Update
Former-commit-id: e078d81b51
2024-06-20 15:29:25 +02:00
Hadi ec38767570 Update
Former-commit-id: b676e1bdbb
2024-06-20 15:27:32 +02:00
Hadi 5340cfeb84 Update
Former-commit-id: 83252b0da5
2024-06-20 15:16:28 +02:00
Hadi 734e310f28 Update
Former-commit-id: 56b09db387
2024-06-20 15:13:02 +02:00
Hadi e388cc7556 Update
Former-commit-id: 6f998c79ab
2024-06-20 15:07:15 +02:00
Hadi 0263e08415 Update
Former-commit-id: 4bec772eb2
2024-06-20 12:10:00 +02:00
Hadi 65f8fcc926 Update
Former-commit-id: 5bdbfb3a5f
2024-06-20 12:09:20 +02:00
Hadi 59a3c1d4de Update
Former-commit-id: 0cc6e18f3d
2024-06-20 11:45:19 +02:00
Hadi 206d4d7433 Update
Former-commit-id: f9bd98bc58
2024-06-20 11:42:57 +02:00
Hadi 8c8833b26e Update
Former-commit-id: 81e72e574d
2024-06-20 11:41:28 +02:00
Hadi 392a3e4998 Update
Former-commit-id: fe393e3c2a
2024-06-20 11:38:53 +02:00
Hadi 76a423a964 Update
Former-commit-id: e0803c6bd5
2024-06-20 11:31:02 +02:00
Hadi 63c19a0c61 Update
Former-commit-id: f761b8c66a
2024-06-20 11:27:41 +02:00
Hadi f3f4689cc8 Update
Former-commit-id: 01b056d4cb
2024-06-20 11:25:35 +02:00
Hadi 2050efbfbf Update
Former-commit-id: 73ac8d8188
2024-06-20 11:24:41 +02:00
Hadi 8d5734b739 Update TODO.md
Former-commit-id: b90999d5b6
2024-06-20 09:39:02 +02:00
Hadi f23897d7d8 Update TODO.md
Former-commit-id: 365fab9659
2024-06-20 02:47:27 +02:00
Hadi 22b00bf301 Update
Former-commit-id: a0c5bd962b
2024-06-20 02:45:24 +02:00
Hadi 76355d3ca1 Fix
Former-commit-id: b796117725
2024-06-20 01:55:49 +02:00
Hadi 14b29a6588 Update
Former-commit-id: 1b4cd64024
2024-06-20 01:31:30 +02:00
Hadi 5eafcf5b76 Update
Former-commit-id: 8ec1744969
2024-06-20 01:23:20 +02:00
Hadi 9c43d22eb1 Update
Former-commit-id: b44a2e17f9
2024-06-20 00:25:10 +02:00
Hadi 06428958dd Update
Former-commit-id: de9b1de37c
2024-06-20 00:17:59 +02:00
Hadi 0d84783032 Update
Former-commit-id: e94276c144
2024-06-20 00:15:18 +02:00
Hadi 25af8d6213 Update
Former-commit-id: 0114f7281b
2024-06-20 00:14:15 +02:00
Hadi e3549ce9e5 Update
Former-commit-id: 5db186ba9b
2024-06-20 00:07:23 +02:00
Hadi 1d859e5c13 Update
Former-commit-id: eec2b56fcd
2024-06-20 00:06:06 +02:00
Hadi 4ef84d1f8d Update
Former-commit-id: 265651c931
2024-06-19 23:59:20 +02:00
Hadi ed791eb748 Update
Former-commit-id: 7e5c45d406
2024-06-19 23:53:17 +02:00
Hadi 5c6acc2028 Update
Former-commit-id: ae9ffdf2a8
2024-06-19 23:52:10 +02:00
Hadi a9dc177a34 Update
Former-commit-id: 325f8e9d15
2024-06-19 23:51:36 +02:00
Hadi ef32063715 Update
Former-commit-id: 29905a460b
2024-06-19 23:49:03 +02:00
Hadi bdaa52dedc Update
Former-commit-id: 92e8eb8983
2024-06-19 23:48:36 +02:00
Hadi c5d7ba76c7 Update
Former-commit-id: cafce8e7c9
2024-06-19 23:47:35 +02:00
Hadi 358e8c9158 Update
Former-commit-id: 21482d4a44
2024-06-19 23:45:03 +02:00
Hadi d1dd841da8 Update
Former-commit-id: 1b3cc99197
2024-06-19 23:42:42 +02:00
Hadi 8137ebfd99 Update
Former-commit-id: adecf1bc29
2024-06-19 23:39:30 +02:00
Hadi cc45eda3ef Update
Former-commit-id: a272a038f1
2024-06-19 23:38:04 +02:00
Hadi 8415d92264 Update
Former-commit-id: a6d3e17135
2024-06-19 23:32:31 +02:00
Hadi 17d95716b6 Update
Former-commit-id: 0e291d3388
2024-06-19 23:28:50 +02:00
Hadi 6db2fc373d Update
Former-commit-id: c852176e0d
2024-06-19 23:28:13 +02:00
Hadi ebbf404c68 Update
Former-commit-id: ad339a19a6
2024-06-19 23:23:29 +02:00
Hadi 9fc328f675 Update
Former-commit-id: aad8b9d8e6
2024-06-19 23:21:24 +02:00
Hadi ba489aaea3 Update
Former-commit-id: debb139aeb
2024-06-19 23:20:49 +02:00
Hadi 67ec1dd41f Update
Former-commit-id: 939597dd90
2024-06-19 23:15:52 +02:00
Hadi ae50fc36d6 Update
Former-commit-id: 7a89711897
2024-06-19 23:11:37 +02:00
Hadi f401067dd9 Update
Former-commit-id: e51b20e4ab
2024-06-19 23:07:47 +02:00
Hadi a02bee95de Update
Former-commit-id: 9dbc87c010
2024-06-19 23:02:56 +02:00
Hadi ec7b2a2fe9 Update
Former-commit-id: 137dd150fd
2024-06-19 22:59:06 +02:00
Hadi 2a40427cd6 Update
Former-commit-id: 6e66f200a3
2024-06-19 22:57:14 +02:00
Hadi eb42d3e4d1 Update
Former-commit-id: 28dcb1f574
2024-06-19 22:50:58 +02:00
Hadi 03f4715693 Update
Former-commit-id: 536de64d5c
2024-06-19 22:48:21 +02:00
Hadi c35dfb8017 Update
Former-commit-id: ac1c7da665
2024-06-19 22:47:37 +02:00
Hadi 7bdacd9ed5 Update
Former-commit-id: d3604fa6cf
2024-06-19 22:47:13 +02:00
Hadi c8ca22f308 Update
Former-commit-id: 241a91487c
2024-06-19 22:46:33 +02:00
Hadi 13b147932e Update
Former-commit-id: 2f2aad2b91
2024-06-19 22:45:37 +02:00
Hadi 29b6dc17c0 Update
Former-commit-id: ce756d2f78
2024-06-19 22:44:55 +02:00
Hadi 8ff1df4333 Update
Former-commit-id: 94cb2758e6
2024-06-19 22:40:01 +02:00
Hadi af0241f1eb Update
Former-commit-id: 50ee6b2dbf
2024-06-19 22:39:12 +02:00
Hadi 3719cc90be Update
Former-commit-id: 0949607442
2024-06-19 22:37:52 +02:00
Hadi 396297d6f7 Update
Former-commit-id: 12e8e9e870
2024-06-19 22:36:42 +02:00
Hadi cb4b5741d7 Update
Former-commit-id: aa519ba3ee
2024-06-19 22:36:18 +02:00
Hadi da000e60bd Update
Former-commit-id: 2cd6b6be58
2024-06-19 22:33:48 +02:00
Hadi c4a38e7691 Update
Former-commit-id: 3939348e1b
2024-06-19 22:32:03 +02:00
Hadi 8972cd081b Update
Former-commit-id: 26767f861c
2024-06-19 21:53:34 +02:00
Hadi b930a7e9f7 Update
Former-commit-id: adbbcec22c
2024-06-19 21:52:46 +02:00
Hadi 85a7fc8ca7 Update
Former-commit-id: f868a937d5
2024-06-19 21:50:36 +02:00
Hadi 869a442843 Update
Former-commit-id: c9ba9b30fe
2024-06-19 21:47:33 +02:00
Hadi 49b6d81216 Update
Former-commit-id: f2b659add1
2024-06-19 21:43:28 +02:00
Hadi 21d84fd39d Update
Former-commit-id: c18fffcb3d
2024-06-19 21:42:12 +02:00
Hadi 2a12db0133 test
Former-commit-id: b5fe18ab2f
2024-06-19 21:41:04 +02:00
Hadi 9c5118264c add hardware config
Former-commit-id: 115c6345c3
2024-06-19 21:31:18 +02:00
Hadi 3a8df54936 Update
Former-commit-id: 884abe9e6c
2024-06-19 21:22:41 +02:00
Hadi a3c8ad5efb Update
Former-commit-id: d877b40d0b
2024-06-19 21:18:28 +02:00
Hadi b38a1ccef8 test
Former-commit-id: 530e9d8bea
2024-06-19 21:17:54 +02:00
Hadi 321bb0bd16 Update
Former-commit-id: d9e4bd4cd1
2024-06-19 21:16:15 +02:00
Hadi 6c96796584 Update
Former-commit-id: 4cba1f2acf
2024-06-19 21:12:30 +02:00
Hadi c6bc2ba192 Update
Former-commit-id: 8c0c636ec8
2024-06-19 21:05:03 +02:00
Hadi c5f8e0f7a2 Update
Former-commit-id: 39a4b5cc00
2024-06-19 21:03:58 +02:00
Hadi 9ff0e4cbe4 Update
Former-commit-id: a5e4015cf3
2024-06-19 21:01:08 +02:00
Hadi 4c0a61ccad Update
Former-commit-id: 5414f49671
2024-06-19 21:01:01 +02:00
Hadi 8ddabcee34 Update
Former-commit-id: 10f3754b0a
2024-06-19 09:55:58 +02:00
Hadi ccef91e0ed Update
Former-commit-id: 063534079d
2024-06-18 19:15:19 +02:00
Hadi f9057b2983 Update
Former-commit-id: d4abd221c0
2024-06-18 19:14:18 +02:00
Hadi 5e276e88f8 Update
Former-commit-id: 77696506bc
2024-06-18 19:13:15 +02:00
Hadi 6c4428b4ef Update
Former-commit-id: 05932e597c
2024-06-18 19:05:40 +02:00
Hadi fd32e06cd2 Update README.md
Former-commit-id: 6606762bca
2024-06-18 15:49:32 +02:00
Hadi 1a4615a781 change image
Former-commit-id: e0bae26b5d
2024-06-18 15:44:27 +02:00
Hadi 3823561a0a Update README.md
Former-commit-id: cd91c40f7d
2024-06-18 15:43:27 +02:00
Hadi b667a65f31 Add files via upload
Former-commit-id: 07e81831fa
2024-06-18 15:42:24 +02:00
Hadi 88df4c8d42 Add files via upload
Former-commit-id: a900a2a121
2024-06-18 15:34:25 +02:00
Hadi 8082c06548 update readme colors
Former-commit-id: d2916aa984
2024-06-18 15:25:59 +02:00
Hadi 21bf90efc0 edit
Former-commit-id: f79b67c04e
2024-06-18 14:39:51 +02:00
Hadi 6d22f2d409 move nextcloud to home manager
Former-commit-id: 6c936a12f1
2024-06-18 14:32:35 +02:00
Hadi ffa788dd4e update todo
Former-commit-id: b5ae490899
2024-06-18 14:26:49 +02:00
Hadi 79a045e3bb todo update
Former-commit-id: fd9b7ea141
2024-06-18 14:20:23 +02:00
Hadi 2fb8a97b71 update
Former-commit-id: c11a21a34a
2024-06-18 14:09:55 +02:00
Hadi 26065f3699 fix
Former-commit-id: ba09c5cfe3
2024-06-18 14:07:48 +02:00
Hadi 4f2ba52404 add tailscale
Former-commit-id: 8ec108927c
2024-06-18 14:05:14 +02:00
Hadi be23ff67aa fix
Former-commit-id: d311675fe9
2024-06-18 13:41:33 +02:00
Hadi ff79cbf502 update
Former-commit-id: 63fd084dcf
2024-06-18 13:41:07 +02:00
Hadi 8b8f3fa54b Update
Former-commit-id: 759f7e715a
2024-06-18 12:36:26 +02:00
Hadi 1f2bb4c33a Update
Former-commit-id: c0e0609ef4
2024-06-18 12:35:13 +02:00
Hadi 9d458b7e04 Update
Former-commit-id: fb2f1824a3
2024-06-18 12:32:45 +02:00
Hadi dedf840131 Update
Former-commit-id: bfed924f0f
2024-06-18 12:30:56 +02:00
Hadi 7dc2c69292 Update
Former-commit-id: 1ad4233def
2024-06-18 12:21:57 +02:00
Hadi def86d31a4 Update
Former-commit-id: b536a87854
2024-06-18 12:10:45 +02:00
Hadi 3038f62405 update
Former-commit-id: c3b54c538f
2024-06-18 11:42:22 +02:00
Hadi fe01b971cf temp
Former-commit-id: 40648d4041
2024-06-18 11:26:35 +02:00
Hadi 918c865202 temp
Former-commit-id: cb4a8f024f
2024-06-18 11:11:08 +02:00
Hadi 6e30f6cd4e temp
Former-commit-id: f4aa262e74
2024-06-18 10:29:37 +02:00
Hadi ff73c05ba6 temp
Former-commit-id: ac6a0f59c4
2024-06-18 10:23:07 +02:00
Hadi dbf520b556 temp
Former-commit-id: 93b7145e70
2024-06-18 10:10:21 +02:00
Hadi fc046db74b temp
Former-commit-id: dc4f3160cc
2024-06-18 09:54:18 +02:00
Hadi 96bae83dd1 rename shared to modules
Former-commit-id: 2ccd17867f
2024-06-18 09:21:14 +02:00
Hadi aae802193c Update
Former-commit-id: d3e6730df0
2024-06-18 00:01:23 +02:00
Hadi 8dc316d6a4 Update
Former-commit-id: 57eb1c9459
2024-06-17 23:57:26 +02:00
Hadi ad86356f9a update
Former-commit-id: 880ed3d0e9
2024-06-17 23:47:58 +02:00
Hadi 007ef7304b add server
Former-commit-id: 93ba190cbf
2024-06-17 23:41:41 +02:00
Hadi 019a6deaf4 Update
Former-commit-id: 251f535146
2024-06-17 23:32:56 +02:00
Hadi 7da96ad2c7 Update
Former-commit-id: 8e0691ca6a
2024-06-17 23:32:52 +02:00
Hadi 7ebc1ba322 add server
Former-commit-id: 25d4dc93f1
2024-06-17 23:29:47 +02:00
Hadi c5e9cb9c32 add pfetch
Former-commit-id: d1b581fd58
2024-06-17 21:34:54 +02:00
Hadi a3ec52058e update
Former-commit-id: bbaf52b496
2024-06-17 20:47:28 +02:00
Hadi d78f213006 update
Former-commit-id: 5835d73997
2024-06-17 20:44:37 +02:00
Hadi 73b2015d02 Update
Former-commit-id: bbbf516812
2024-06-17 20:38:13 +02:00
Hadi cedad9a7a6 Update
Former-commit-id: c0894a20ca
2024-06-17 20:37:22 +02:00
Hadi 65d6c2f28f Update
Former-commit-id: 6f8698e345
2024-06-17 20:37:09 +02:00
Hadi 18c7618ebf Update
Former-commit-id: b49b2d2c60
2024-06-17 20:08:17 +02:00
Hadi e29a5c2517 update
Former-commit-id: a703d0816b
2024-06-17 19:50:35 +02:00
Hadi 6f3c922010 update
Former-commit-id: 4aba4116de
2024-06-17 19:45:21 +02:00
Hadi 2b902ef731 Update
Former-commit-id: 9db5b9231e
2024-06-17 19:23:43 +02:00
Hadi 7cb070b6b1 Update
Former-commit-id: dc5c227667
2024-06-17 19:20:34 +02:00
Hadi e788f5954e update
Former-commit-id: 912c0abc51
2024-06-17 19:20:01 +02:00
Hadi bfb370d8fe update
Former-commit-id: d8659825a2
2024-06-17 19:18:05 +02:00
Hadi 0332b6c56b Update README.md
Former-commit-id: 087dd4dfec
2024-06-17 17:10:04 +02:00
Hadi e5bdab5a24 update
Former-commit-id: a6207c07ab
2024-06-17 17:04:39 +02:00
Hadi a42ef3ff84 add hyprcursor
Former-commit-id: efc017e5bd
2024-06-17 16:55:42 +02:00
Hadi da33cf1fd3 moved gtk theme
Former-commit-id: 2982684252
2024-06-17 16:54:50 +02:00
Hadi 4290a5e814 update
Former-commit-id: 5e3a372259
2024-06-17 16:53:18 +02:00
Hadi 8e425d5d87 temp
Former-commit-id: 8d16aa86e0
2024-06-17 16:35:53 +02:00
Hadi 8aeff4bb9a temp
Former-commit-id: 3f613c9910
2024-06-17 16:33:34 +02:00
Hadi 6d23ca208e update
Former-commit-id: 8b2f8c08d3
2024-06-17 16:23:03 +02:00
Hadi 41ccb74258 update
Former-commit-id: f2c80d003c
2024-06-17 14:24:18 +02:00
Hadi 5f1b047221 Add themes folder
Former-commit-id: a6cc46cf93
2024-06-17 14:18:15 +02:00
Hadi a5b26b92de Update
Former-commit-id: 857c98e32a
2024-06-17 13:49:05 +02:00
Hadi 5e71ef48dd Update
Former-commit-id: d169306a68
2024-06-17 13:47:13 +02:00
Hadi 2fc51aa02e test hosts
Former-commit-id: b22d2f596f
2024-06-17 09:23:37 +02:00
Hadi 7dc90af1c8 test
Former-commit-id: 026be4852e
2024-06-17 09:22:31 +02:00
Hadi 7a564110a5 Update
Former-commit-id: 49cf0fc0e3
2024-06-14 21:18:42 +02:00
Hadi bb08cd494a Add animations speed in variables
Former-commit-id: 7267fa55fb
2024-06-14 21:13:50 +02:00
Hadi 3b5885e2c9 Update
Former-commit-id: c410d04e1a
2024-06-14 21:04:33 +02:00
Hadi d9810c3c1f Update
Former-commit-id: fad7c6e46d
2024-06-14 20:58:52 +02:00
Hadi 13f060d100 Update
Former-commit-id: 089c57802e
2024-06-14 15:28:30 +02:00
Hadi 40164e8cbd Update
Former-commit-id: 47701f3f49
2024-06-14 14:43:21 +02:00
Hadi f9187d3252 Update
Former-commit-id: 5af6219fff
2024-06-14 14:24:09 +02:00
Hadi b86fe8b3c7 Update
Former-commit-id: 9eb2dbf579
2024-06-14 14:21:27 +02:00
Hadi 9cdddb99c5 Refactor
Former-commit-id: ea15e4fa98
2024-06-14 14:20:06 +02:00
Hadi 35bb470eb1 Update
Former-commit-id: cf99fa5687
2024-06-14 14:03:35 +02:00
Hadi 1a1597ba49 Update
Former-commit-id: 98d8545186
2024-06-14 13:58:54 +02:00
Hadi 8c55eb48af Update
Former-commit-id: 60ee25a3fa
2024-06-14 13:56:43 +02:00
Hadi cd3dfb985c Update
Former-commit-id: 25e4b89053
2024-06-14 13:44:30 +02:00
Hadi 19bf7838c4 Fix
Former-commit-id: 758b594e39
2024-06-14 12:54:46 +02:00
Hadi 05da8fd990 Update
Former-commit-id: eb94f6b527
2024-06-14 10:03:29 +02:00
Hadi d28ad77974 test
Former-commit-id: aae1271cf0
2024-06-14 10:00:54 +02:00
Hadi 379424e228 Update
Former-commit-id: 70a3473916
2024-06-13 11:02:21 +02:00
Hadi 355336c9ff Update
Former-commit-id: 96b64e86e0
2024-06-13 10:52:06 +02:00
Hadi 46b213bbfa Temp
Former-commit-id: d117be2be9
2024-06-13 10:48:06 +02:00
Hadi 4fda4eda9e Update
Former-commit-id: a30df8d186
2024-06-11 23:41:38 +02:00
Hadi 3bffc0142c Stable
Former-commit-id: 3b52711351
2024-06-11 23:31:59 +02:00
Hadi 21f5d55569 Fix
Former-commit-id: 0e3989391e
2024-06-11 22:00:58 +02:00
Hadi 12d7254c83 Fix
Former-commit-id: e9310630bd
2024-06-11 21:58:04 +02:00
Hadi 35dd9bb964 Update
Former-commit-id: c2bb7f475b
2024-06-08 20:50:18 +02:00
Hadi e104aec12d Update
Former-commit-id: 14eeb7bd3a
2024-06-08 02:32:42 +02:00
Hadi e11dcecace Update
Former-commit-id: 08b9ef2677
2024-06-08 02:28:42 +02:00
Hadi 84d2f689ed Update
Former-commit-id: cbb276551c
2024-06-08 02:28:13 +02:00
Hadi 52c060c8be Update
Former-commit-id: 4556c5ea2f
2024-06-08 02:26:47 +02:00
Hadi 28dc3d1a94 Update
Former-commit-id: 6a017c8e70
2024-06-08 02:24:07 +02:00
Hadi ef2ee20495 Update
Former-commit-id: e33ab5a6e1
2024-06-08 02:22:10 +02:00
Hadi f4f253a218 Update
Former-commit-id: fbf3fe3255
2024-06-08 02:20:20 +02:00
Hadi 2f0f3c74f3 Update
Former-commit-id: 41a6de85b1
2024-06-08 02:19:25 +02:00
Hadi 2809615f7b Update
Former-commit-id: 6561d23db6
2024-06-08 02:18:53 +02:00
Hadi a617044695 Update
Former-commit-id: 562dad765b
2024-06-08 02:17:50 +02:00
Hadi 379cd9e98d Update
Former-commit-id: 2656132158
2024-06-08 02:17:04 +02:00
Hadi 60d880aac2 Update
Former-commit-id: 430d30e4ee
2024-06-08 02:05:37 +02:00
Hadi 89d736c311 Update
Former-commit-id: 3a1896894f
2024-06-08 01:57:55 +02:00
Hadi 96faa74cf0 Update
Former-commit-id: 88fb9d078b
2024-06-08 01:56:21 +02:00
Hadi 0f6a8af649 Update
Former-commit-id: 1ccb720f3b
2024-06-08 00:36:44 +02:00
Hadi 80b3607bc1 Update
Former-commit-id: d2c8461193
2024-06-08 00:35:45 +02:00
Hadi 9c1c2a21a4 Update
Former-commit-id: 92b467525d
2024-06-08 00:01:20 +02:00
Hadi ab13ead2a8 Update
Former-commit-id: 6c08c79a16
2024-06-07 23:54:10 +02:00
Hadi dea3f4f4fd Update
Former-commit-id: e52f52f4da
2024-06-07 23:46:40 +02:00
Hadi 4bf7d41ff1 Update
Former-commit-id: b855318c55
2024-06-07 23:35:59 +02:00
Hadi 54bb1e2064 Update
Former-commit-id: ca8abfde1c
2024-06-07 23:34:02 +02:00
Hadi 3e818073e0 Update
Former-commit-id: 24de104139
2024-06-07 22:53:04 +02:00
Hadi 9c8d27e687 Update
Former-commit-id: 2c0246c84a
2024-06-07 22:43:37 +02:00
Hadi ca138aa8af Update
Former-commit-id: 9177f93a96
2024-06-07 22:41:10 +02:00
Hadi 784df1e08f Update
Former-commit-id: 57867b1a22
2024-06-07 22:37:59 +02:00
Hadi a12846fddc Update
Former-commit-id: 7b9e579a4e
2024-06-07 22:34:48 +02:00
Hadi 820268a2a1 Update
Former-commit-id: 65ec024028
2024-06-07 22:25:21 +02:00
Hadi 7e19f9ee0d Update
Former-commit-id: 19af1ccdc2
2024-06-07 22:11:42 +02:00
Hadi 6558683822 Update
Former-commit-id: 7d80970e9d
2024-06-07 22:08:09 +02:00
Hadi 8401688019 Update
Former-commit-id: 755a2e8f2b
2024-06-07 22:05:49 +02:00
Hadi cfd999b373 Update
Former-commit-id: 160d302a74
2024-06-07 21:49:44 +02:00
Hadi 70b156b828 Add pub key
Former-commit-id: b674a8be1b
2024-06-07 21:46:15 +02:00
Hadi 6e056afe67 Fix
Former-commit-id: e2382abacc
2024-06-07 21:41:04 +02:00
Hadi caa93f691c Add hardware config for server
Former-commit-id: bf7dd645ba
2024-06-07 21:38:39 +02:00
Hadi 34776f0af1 Update
Former-commit-id: 7bb06e521f
2024-06-07 21:37:48 +02:00
Hadi 7f30239b2a Add heaven (my server)
Former-commit-id: 17f93ea60b
2024-06-07 21:21:03 +02:00
Hadi 6d744fab45 Update
Former-commit-id: d917ac9f6a
2024-06-07 10:55:45 +02:00
Hadi cf6ed4a265 Update
Former-commit-id: 98556f202e
2024-06-03 20:18:30 +02:00
Hadi 62e0472698 Update
Former-commit-id: 0f98d762a2
2024-05-25 10:53:38 +02:00
Hadi d477340177 Update
Former-commit-id: c074db2779
2024-05-20 19:44:45 +02:00
Hadi f9c910f5ac Add hyprland cachix
Former-commit-id: 98186715b1
2024-05-17 14:52:18 +02:00
Hadi 41a225ec83 Merge pull request #1 from anotherhadi/unstable
Update

Former-commit-id: 0087ca74be
2024-05-17 14:46:30 +02:00
Hadi 35c98d1b97 Update
Former-commit-id: 5fe726fd20
2024-05-17 14:44:56 +02:00
Hadi 1a477e26bc More variables
Former-commit-id: cc1efb2588
2024-05-17 10:28:02 +02:00
Hadi 8166950e74 Update
Former-commit-id: 0b32914be2
2024-05-16 17:59:50 +02:00
Hadi ea0d1cee92 Add nvim noice
Former-commit-id: bc9101e542
2024-05-11 00:37:16 +02:00
Hadi 8df0278272 Add table of contents
Former-commit-id: 42876ccac3
2024-05-09 16:58:42 +02:00
Hadi 6c471c33f7 Add compress/extract
Former-commit-id: 728797b8c5
2024-05-09 16:55:46 +02:00
Hadi 5182276d1e Update
Former-commit-id: dff9dcc8d5
2024-05-09 16:51:42 +02:00
Hadi d18e69ee75 Update
Former-commit-id: 31913ccdcc
2024-05-09 16:50:46 +02:00
Hadi f363249e41 Add lazygit
Former-commit-id: 8400e5fd4d
2024-05-09 16:46:30 +02:00
Hadi 342fbc2fcc Add lazygit
Former-commit-id: 8d0216e1fc
2024-05-09 16:44:39 +02:00
Hadi 150617ca7a Update
Former-commit-id: c4f8d05c0d
2024-05-09 16:33:24 +02:00
Hadi 7196117da7 Update
Former-commit-id: 6d4bc5a9e8
2024-05-09 13:33:51 +02:00
Hadi ba1feb92ec Add new theme
Former-commit-id: 6065afd390
2024-05-09 13:33:44 +02:00
Hadi 7452406a00 Fix spacing
Former-commit-id: abfe7ca839
2024-05-09 13:33:18 +02:00
Hadi 2c910092c8 Update
Former-commit-id: a26fbaa2c3
2024-05-09 10:54:19 +02:00
Hadi c3d9df2cb0 Rearrange folder struct
Former-commit-id: e58fda9896
2024-05-04 22:51:33 +02:00
Hadi b573560024 Fix renamed
Former-commit-id: d026643105
2024-05-04 22:46:46 +02:00
Hadi 1633e21d9b Delete /tmp dir on boot
Former-commit-id: 984a25c111
2024-05-04 22:45:51 +02:00
Hadi 406d7ae6e9 Update
Former-commit-id: 2c2b451d40
2024-05-04 22:36:06 +02:00
Hadi 2055d2da9a Waybar git to solve issue w/hyprland
Former-commit-id: 1af3617b32
2024-05-02 18:16:39 +02:00
Hadi ec4fc1864c Update
Former-commit-id: 6d1912703c
2024-05-02 15:46:16 +02:00
Hadi fa0aa29974 Update
Former-commit-id: 81ab14b256
2024-05-02 15:40:12 +02:00
Hadi 8e4d046365 flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/572af610f6151fd41c212f897c71f7056e3fb518' (2024-04-23)
  → 'github:nixos/nixpkgs/58a1abdbae3217ca6b702f03d3b35125d88a2994' (2024-04-27)


Former-commit-id: 92ec6a5ea8
2024-05-02 12:44:43 +02:00
Hadi aec2c05778 flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/6143fc5eeb9c4f00163267708e26191d1e918932' (2024-04-21)
  → 'github:nixos/nixpkgs/572af610f6151fd41c212f897c71f7056e3fb518' (2024-04-23)


Former-commit-id: 62029890cd
2024-04-25 22:44:44 +02:00
Hadi 5cd78b81d1 flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/5c24cf2f0a12ad855f444c30b2421d044120c66f' (2024-04-19)
  → 'github:nixos/nixpkgs/6143fc5eeb9c4f00163267708e26191d1e918932' (2024-04-21)


Former-commit-id: 6cec1f00f0
2024-04-22 17:39:48 +02:00
Hadi d906e2675d Update
Former-commit-id: 7dd8af5bf8
2024-04-20 11:50:19 +02:00
Hadi ac5949e2a0 flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/66adc1e47f8784803f2deb6cacd5e07264ec2d5c' (2024-04-16)
  → 'github:nixos/nixpkgs/5c24cf2f0a12ad855f444c30b2421d044120c66f' (2024-04-19)


Former-commit-id: 86175a04e5
2024-04-20 11:31:07 +02:00
Hadi 72111e6c3a Fix typo
Former-commit-id: de607e2eea
2024-04-20 01:05:50 +02:00
Hadi dad7e92a41 Delete .sops.yaml
Former-commit-id: e8dd18e32c
2024-04-20 00:41:50 +02:00
Hadi 8cf07d7418 Fix
Former-commit-id: 3fe07d3ba5
2024-04-20 00:39:15 +02:00
Hadi 3ae887ef0e Add github search engine
Former-commit-id: 52ccccc2d9
2024-04-20 00:23:32 +02:00
Hadi ac34c94aad Fix 2 file explorer
Former-commit-id: 805917511e
2024-04-20 00:19:15 +02:00
Hadi dd54fa49f0 Fix
Former-commit-id: 950e1cfcf2
2024-04-20 00:16:05 +02:00
Hadi 4f1920ac35 Fix
Former-commit-id: 637accfc1c
2024-04-20 00:02:59 +02:00
Hadi 7693435eab Fix font
Former-commit-id: a37de9940f
2024-04-19 23:46:15 +02:00
Hadi 5451b4cfb4 flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/cfd6b5fc90b15709b780a5a1619695a88505a176' (2024-04-12)
  → 'github:nixos/nixpkgs/66adc1e47f8784803f2deb6cacd5e07264ec2d5c' (2024-04-16)


Former-commit-id: 14bca81e37
2024-04-19 23:35:51 +02:00
Hadi 3677d8f6a1 Update
Former-commit-id: 767e9d182d
2024-04-14 21:59:30 +02:00
Hadi 8f3fd2e2a5 flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/4cba8b53da471aea2ab2b0c1f30a81e7c451f4b6' (2024-04-08)
  → 'github:nixos/nixpkgs/1042fd8b148a9105f3c0aca3a6177fd1d9360ba5' (2024-04-10)


Former-commit-id: 21ce99bfe8
2024-04-14 17:01:34 +02:00
Hadi d7a1249a3f flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/ff0dbd94265ac470dda06a657d5fe49de93b4599' (2024-04-06)
  → 'github:nixos/nixpkgs/4cba8b53da471aea2ab2b0c1f30a81e7c451f4b6' (2024-04-08)


Former-commit-id: 3aeedf0ed7
2024-04-10 18:25:46 +02:00
Hadi 290cfca8b3 flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/08b9151ed40350725eb40b1fe96b0b86304a654b' (2024-04-03)
  → 'github:nixos/nixpkgs/ff0dbd94265ac470dda06a657d5fe49de93b4599' (2024-04-06)


Former-commit-id: cd04bd89c0
2024-04-07 15:47:33 +02:00
Hadi 5717331eb6 flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/d8fe5e6c92d0d190646fb9f1056741a229980089' (2024-03-29)
  → 'github:nixos/nixpkgs/08b9151ed40350725eb40b1fe96b0b86304a654b' (2024-04-03)


Former-commit-id: 331fc331df
2024-04-04 11:35:03 +02:00
Hadi 0bf5355641 flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/20f77aa09916374aa3141cbc605c955626762c9a' (2024-03-21)
  → 'github:nixos/nixpkgs/d8fe5e6c92d0d190646fb9f1056741a229980089' (2024-03-29)


Former-commit-id: b9775975ea
2024-03-30 12:09:12 +01:00
Hadi b4c0b61815 flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/b06025f1533a1e07b6db3e75151caa155d1c7eb3' (2024-03-19)
  → 'github:nixos/nixpkgs/20f77aa09916374aa3141cbc605c955626762c9a' (2024-03-21)


Former-commit-id: 7a8ebb778a
2024-03-22 14:16:16 +01:00
Hadi 011c084203 I hate wl clipboard
Former-commit-id: 24a8438694
2024-03-20 23:26:53 +01:00
Hadi 10215a086f Woopsi
Former-commit-id: ce2e0c2fa8
2024-03-20 22:44:32 +01:00
Hadi 882c3f0c76 Nerdfont icons finder, folder arch..
Former-commit-id: e97e2705b5
2024-03-20 22:38:49 +01:00
Hadi c3151cc1f5 Up
Former-commit-id: cb98842775
2024-03-20 21:47:50 +01:00
Hadi cb1b2c04c7 Up
Former-commit-id: 95562dce0e
2024-03-20 20:04:09 +01:00
Hadi 8ab6e708f6 keybindings
Former-commit-id: bb47c6a943
2024-03-20 18:58:16 +01:00
Hadi 06805d8d27 Themes
Former-commit-id: 5ad31e7602
2024-03-20 18:31:59 +01:00
Hadi 557b1d375e oops
Former-commit-id: 35de81a46d
2024-03-20 18:05:24 +01:00
Hadi b9cf6573bd up
Former-commit-id: 0fee3682d0
2024-03-20 18:01:15 +01:00
Hadi 2cd17956fa Fix powermenu management
Former-commit-id: aa25061ad7
2024-03-18 22:48:11 +01:00
Hadi 435d82cfba Fix neofetch on floating window
Former-commit-id: 69bd97e1bd
2024-03-18 22:40:15 +01:00
Hadi c1b7e8d56c Fix windows name & padding
Former-commit-id: 1dd92201d0
2024-03-18 22:37:03 +01:00
Hadi 2956e1599a Up
Former-commit-id: ef3489075f
2024-03-18 22:26:32 +01:00
Hadi 4545f906ef License
Former-commit-id: 6a562ff64c
2024-03-17 17:35:11 +01:00
Hadi ae7d092e1a Details README
Former-commit-id: 441b45846e
2024-03-17 17:17:03 +01:00
Hadi 7252a96939 Up
Former-commit-id: 381b3228dc
2024-03-17 17:11:49 +01:00
Hadi b24abc3831 flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/d691274a972b3165335d261cc4671335f5c67de9' (2024-03-14)
  → 'github:nixos/nixpkgs/c75037bbf9093a2acb617804ee46320d6d1fea5a' (2024-03-16)


Former-commit-id: bb869d6897
2024-03-17 16:47:28 +01:00
Hadi 22395725a3 Up
Former-commit-id: a230692b90
2024-03-17 01:14:16 +01:00
Hadi 9beb7bc157 Up
Former-commit-id: f86a0271b6
2024-03-16 22:26:30 +01:00
Hadi f0d8a6b811 flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/0ad13a6833440b8e238947e47bea7f11071dc2b2' (2024-03-12)
  → 'github:nixos/nixpkgs/d691274a972b3165335d261cc4671335f5c67de9' (2024-03-14)


Former-commit-id: 3f2ba75a5e
2024-03-16 18:26:14 +01:00
Hadi 202ac3ca3b Secrets, scripts, clean..
Former-commit-id: 5e98256a82
2024-03-15 21:26:34 +01:00
Hadi 1f6075cae7 Up
Former-commit-id: 05fc3fbcd9
2024-03-14 18:42:15 +01:00
Hadi 0ab8844d04 Up
Former-commit-id: 77eba6e2c2
2024-03-14 01:30:17 +01:00
Hadi 1bb1112db2 Up
Former-commit-id: d5bd3270f7
2024-03-14 01:05:29 +01:00
Hadi 61804bcbe7 Add caffeine
Former-commit-id: 13ae5ad530
2024-03-14 00:10:13 +01:00
Hadi 31ace98f68 Up
Former-commit-id: 8bda501d16
2024-03-13 23:32:40 +01:00
Hadi e9480830d8 Up
Former-commit-id: 6ed623bd6f
2024-03-13 21:56:32 +01:00
Hadi 7490f1ef84 Up
Former-commit-id: 3fe2c8913f
2024-03-13 21:38:55 +01:00
Hadi f7e41e3653 Add wallpapers
Former-commit-id: a1f05792e4
2024-03-13 19:58:46 +01:00
192 changed files with 5955 additions and 10404 deletions
+39 -61
View File
@@ -1,5 +1,5 @@
<div align="center">
<img alt="nixy logo" src="./.github/assets/logo.png" width="120px" />
<img src="https://raw.githubusercontent.com/anotherhadi/nixy/main/.github/assets/logo.png" width="120px" />
</div>
<br>
@@ -23,89 +23,74 @@
</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** is a **Hyprland** NixOS configuration with **home-manager**, **secrets**, and **custom theming** all in one place.
It's a simple way to manage your system configuration and dotfiles.
**Features:**
I'm Hadi, a french developer, student in infosec, enthusiastic about nix, golang & blockchains.
This is my own, **keyboard-centric**, and **minimalistic** NixOS configuration.
I enable vim-like keybindings everywhere I can, and I use a lot of custom scripts to make my life easier.
- 💻 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.)
**Nixy key points:**
- Hypr-ecosystem first (hyprland, hyprlock, hyprpanel, hypridle, ...)
- Stylix/base16 themes
- Vim-like keybindings everywhere (hyprland, qutebrowser, nvim, ...)
## Table of Content
{md_table_of_content}
## Screenshots
## Gallery
![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)
![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)
## Architecture
### 🏠 /home (User-level configuration)
### 🏠 home
Contains **dotfiles and settings** that apply to your user environment.
Those are the dotfiles and configuration files for user-level configuration
**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
### 🐧 nixos
Those are the system-level configurations. (audio, bluetooth, gpu, bootloader,
...)
Those are the system-level configurations. (audio, bluetooth, gpu, bootloader, ...)
### 🎨 /themes
### 🎨 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)
Those are the themes used in the system configuration. The `stylix` folder contains the [stylix](https://github.com/danth/stylix) defined themes, the `var` folder contains the variables not handled by stylix.
See avaiable themes in [THEMES.md](docs/THEMES.md)
### 💻 /hosts
### 💻 hosts
This directory contains host-specific configurations. Each host includes:
- `configuration.nix` for system-wide settings
- `home.nix` for user-level configuration
- `variables.nix` for global variables
- `secrets/` for sensitive data
### 🖥️ /server-modules
This folder contains server-related nixos modules. (bitwarden, nextcloud, ...)
Those are the host-specific configurations.
Each host contains a `configuration.nix` for system-level configuration, a `home.nix` for user-level configuration, and a `variables.nix` for config wide variables.
## Installation
1. [Fork](https://github.com/anotherhadi/nixy/fork) this repo and clone it to
your system:
1. Clone the repo
```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.
4. Register your new host in `flake.nix` by adding it under nixosConfigurations.
2. Copy the `hosts/laptop` folder, rename it to your system name, and change the variables inside the `variables.nix` file
3. Add your `hardware-configuration.nix` to your new host's folder
4. Add your 'nixosConfigurations' inside `flake.nix`
> [!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
> ```
> [!Important]
> I added few `# CHANGEME` comments in the files to help you find what to change. Be sure to check them up.
> You can use `rg "CHANGEME"` to find them all with ripgrep.
> [!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
@@ -115,18 +100,11 @@ sudo nixos-rebuild switch --flake ~/.config/nixos#yourhostname
## Documentation
- [SERVER](docs/SERVER.md): Check out the server documentation
- [THEMES](docs/THEMES.md): How themes work and how to create your own
- [WALLPAPERS](https://github.com/anotherhadi/awesome-wallpapers): An awesome
collection of wallpapers
- [SCRIPTS](docs/SCRIPTS.md): Scripts that are available
- [KEYBINDINGS-HYPRLAND](docs/KEYBINDINGS-HYPRLAND.md): Keybindings available in Hyprland
- [WALLPAPERS](https://github.com/anotherhadi/nixy-wallpapers): A collection of wallpapers for Nixy.
- [TODO](docs/TODO.md): What's next (feel free to contribute)
- [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.

Before

Width:  |  Height:  |  Size: 412 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 643 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 301 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 404 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1001 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 160 KiB

+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\}/A89AD1}
readme_content=${readme_content//\{primarycolor\}/A594FD}
readme_content=${readme_content//\{backgroundcolor\}/0b0b0b}
readme_content=${readme_content//\{md_table_of_content\}/$table_of_content}
+26
View File
@@ -0,0 +1,26 @@
#!/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
+60
View File
@@ -0,0 +1,60 @@
#!/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
@@ -0,0 +1,24 @@
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
@@ -0,0 +1,24 @@
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
+1 -2
View File
@@ -1,3 +1,2 @@
todolist.md
.sops.yaml
.claude/
old/
+48 -71
View File
@@ -1,6 +1,6 @@
[//]: # (This file is autogenerated)
<div align="center">
<img alt="nixy logo" src="./.github/assets/logo.png" width="120px" />
<img src="https://raw.githubusercontent.com/anotherhadi/nixy/main/.github/assets/logo.png" width="120px" />
</div>
<br>
@@ -10,112 +10,96 @@
<br>
<div align="center">
<a href="https://github.com/anotherhadi/nixy/stargazers">
<img src="https://img.shields.io/github/stars/anotherhadi/nixy?color=A89AD1&labelColor=0b0b0b&style=for-the-badge&logo=starship&logoColor=A89AD1">
<img src="https://img.shields.io/github/stars/anotherhadi/nixy?color=A594FD&labelColor=0b0b0b&style=for-the-badge&logo=starship&logoColor=A594FD">
</a>
<a href="https://github.com/anotherhadi/nixy/">
<img src="https://img.shields.io/github/repo-size/anotherhadi/nixy?color=A89AD1&labelColor=0b0b0b&style=for-the-badge&logo=github&logoColor=A89AD1">
<img src="https://img.shields.io/github/repo-size/anotherhadi/nixy?color=A594FD&labelColor=0b0b0b&style=for-the-badge&logo=github&logoColor=A594FD">
</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=A89AD1&color=A89AD1">
<img src="https://img.shields.io/badge/NixOS-unstable-blue.svg?style=for-the-badge&labelColor=0b0b0b&logo=NixOS&logoColor=A594FD&color=A594FD">
</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=A89AD1&logo=unlicense&logoColor=A89AD1"/>
<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"/>
</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** is a **Hyprland** NixOS configuration with **home-manager**, **secrets**, and **custom theming** all in one place.
It's a simple way to manage your system configuration and dotfiles.
**Features:**
I'm Hadi, a french developer, student in infosec, enthusiastic about nix, golang & blockchains.
This is my own, **keyboard-centric**, and **minimalistic** NixOS configuration.
I enable vim-like keybindings everywhere I can, and I use a lot of custom scripts to make my life easier.
- 💻 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.)
**Nixy key points:**
- Hypr-ecosystem first (hyprland, hyprlock, hyprpanel, hypridle, ...)
- Stylix/base16 themes
- Vim-like keybindings everywhere (hyprland, qutebrowser, nvim, ...)
## Table of Content
- [Table of Content](#table-of-content)
- [Screenshots](#screenshots)
- [Gallery](#gallery)
- [Architecture](#architecture)
- [🏠 /home (User-level configuration)](#-home-user-level-configuration)
- [🐧 /nixos](#-nixos)
- [🎨 /themes](#-themes)
- [💻 /hosts](#-hosts)
- [🖥️ /server-modules](#-server-modules)
- [🏠 home](#-home)
- [🐧 nixos](#-nixos)
- [🎨 themes](#-themes)
- [💻 hosts](#-hosts)
- [Installation](#installation)
- [Documentation](#documentation)
## Screenshots
## Gallery
![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)
![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)
## Architecture
### 🏠 /home (User-level configuration)
### 🏠 home
Contains **dotfiles and settings** that apply to your user environment.
Those are the dotfiles and configuration files for user-level configuration
**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
### 🐧 nixos
Those are the system-level configurations. (audio, bluetooth, gpu, bootloader,
...)
Those are the system-level configurations. (audio, bluetooth, gpu, bootloader, ...)
### 🎨 /themes
### 🎨 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)
Those are the themes used in the system configuration. The `stylix` folder contains the [stylix](https://github.com/danth/stylix) defined themes, the `var` folder contains the variables not handled by stylix.
See avaiable themes in [THEMES.md](docs/THEMES.md)
### 💻 /hosts
### 💻 hosts
This directory contains host-specific configurations. Each host includes:
- `configuration.nix` for system-wide settings
- `home.nix` for user-level configuration
- `variables.nix` for global variables
- `secrets/` for sensitive data
### 🖥️ /server-modules
This folder contains server-related nixos modules. (bitwarden, nextcloud, ...)
Those are the host-specific configurations.
Each host contains a `configuration.nix` for system-level configuration, a `home.nix` for user-level configuration, and a `variables.nix` for config wide variables.
## Installation
1. [Fork](https://github.com/anotherhadi/nixy/fork) this repo and clone it to
your system:
1. Clone the repo
```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.
4. Register your new host in `flake.nix` by adding it under nixosConfigurations.
2. Copy the `hosts/laptop` folder, rename it to your system name, and change the variables inside the `variables.nix` file
3. Add your `hardware-configuration.nix` to your new host's folder
4. Add your 'nixosConfigurations' inside `flake.nix`
> [!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
> ```
> [!Important]
> I added few `# CHANGEME` comments in the files to help you find what to change. Be sure to check them up.
> You can use `rg "CHANGEME"` to find them all with ripgrep.
> [!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
@@ -125,18 +109,11 @@ sudo nixos-rebuild switch --flake ~/.config/nixos#yourhostname
## Documentation
- [SERVER](docs/SERVER.md): Check out the server documentation
- [THEMES](docs/THEMES.md): How themes work and how to create your own
- [WALLPAPERS](https://github.com/anotherhadi/awesome-wallpapers): An awesome
collection of wallpapers
- [SCRIPTS](docs/SCRIPTS.md): Scripts that are available
- [KEYBINDINGS-HYPRLAND](docs/KEYBINDINGS-HYPRLAND.md): Keybindings available in Hyprland
- [WALLPAPERS](https://github.com/anotherhadi/nixy-wallpapers): A collection of wallpapers for Nixy.
- [TODO](docs/TODO.md): What's next (feel free to contribute)
- [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
+3 -3
View File
@@ -1,16 +1,16 @@
# Contributing to Nixy
Everybody is invited and welcome to contribute to Nixy. There is a lot to do... Check the issues!
Everybody is invited and welcome to contribute to Nixy. There is a lot to do... Check the [TODO.md](./TODO.md) file!
The process is straight-forward.
- Read [How to get faster PR reviews](https://github.com/kubernetes/community/blob/master/contributors/guide/pull-requests.md#best-practices-for-faster-reviews) by Kubernetes (but skip step 0 and 1)
- Fork Nixy [git repository](https://github.com/anotherhadi/nixy).
- Write your changes (new theme, bug fixes, issues fix, ...).
- Write your changes (new theme, bug fixes, task in to-do, ...).
- Create a Pull Request against the main branch of Nixy.
> [!TIP]
> To update the README, change the `./.github/assets/README_template.md`
> To update the README, change the `./docs/src/README_template.md` and run `./docs/scripts/create_readme.sh`
> [!IMPORTANT]
> Don't push your host's folder
+51
View File
@@ -0,0 +1,51 @@
[//]: # (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 |
+98
View File
@@ -0,0 +1,98 @@
[//]: # (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)
- `lock` - Lock the screen. (hyprlock)
-29
View File
@@ -1,29 +0,0 @@
# SERVER
## Overview
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 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:
- **NGINX**: Reverse proxy for routing traffic to services via my domain name.
- **AdGuard Home**: A self-hosted DNS ad blocker for network-wide ad and tracker filtering.
- **Glance**: An awesome dashboard! (See the screenshot above)
- **Arr Stack (Radarr, Sonarr, etc.)**: Automated media management tools for handling movies and TV shows. (legaly ofc)
- **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
+10 -6
View File
@@ -1,17 +1,21 @@
# Themes
Themes are defined in `themes`. Those themes define the colors, fonts, icons, etc, used by Hyprland and the apps/programs installed.
You can change the selected theme by changing the import statement of your host's variables.nix file.
You can change the selected theme by changing the import statement of your host's configuration.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 [hadi's awesome-wallpapers](https://github.com/anotherhadi/awesome-wallpapers) repo.
Wallpapers are loaded from the [nixy-wallpapers](https://github.com/anotherhadi/nixy-wallpapers) repo.
## Gallery
### Rose-pine
### Nixy
![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)
![nixy1](../.github/assets/nixy/1.png)
![nixy2](../.github/assets/nixy/2.png)
![nixy3](../.github/assets/nixy/3.png)
![nixy4](../.github/assets/nixy/4.png)
+5
View File
@@ -0,0 +1,5 @@
# Todolist
feel free to contribute <3 ([CONTRIBUTING.md](CONTRIBUTING.md))
- [ ] <https://github.com/isabelroses/dotfiles/blob/main/home/comfy/system/xdg.nix>
Generated
+822 -1039
View File
File diff suppressed because it is too large Load Diff
+26 -49
View File
@@ -1,84 +1,61 @@
{
# https://github.com/anotherhadi/nixy
description = ''
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.
Nixy is a NixOS configuration with home-manager, secrets and custom theming all in one place.
It's a simple way to manage your system configuration and dotfiles.
'';
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
nixpkgs-stable.url = "github:nixos/nixpkgs/nixos-25.11";
nixos-hardware.url = "github:NixOS/nixos-hardware/master";
hyprland.url = "git+https://github.com/hyprwm/Hyprland?submodules=1";
stylix.url = "github:danth/stylix";
sops-nix.url = "github:Mic92/sops-nix";
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";
};
caelestia-shell = {
url = "github:caelestia-dots/shell";
inputs.nixpkgs.follows = "nixpkgs";
};
caelestia-cli = {
url = "github:caelestia-dots/cli";
nixvim = {
url = "github:nix-community/nixvim";
inputs.nixpkgs.follows = "nixpkgs";
};
spicetify-nix = {
url = "github:Gerg-L/spicetify-nix";
inputs.nixpkgs.follows = "nixpkgs";
};
# 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";
sops-nix = {
url = "github:Mic92/sops-nix";
inputs.nixpkgs.follows = "nixpkgs";
};
hyprspace = {
url = "github:KZDKM/Hyprspace";
inputs.hyprland.follows = "hyprland";
};
hyprland.url = "git+https://github.com/hyprwm/Hyprland?submodules=1";
hyprpolkitagent.url = "github:hyprwm/hyprpolkitagent";
hyprpanel.url = "github:Jas-SinghFSU/HyprPanel";
stylix.url = "github:danth/stylix";
apple-fonts.url = "github:Lyndeno/apple-fonts.nix";
nur.url = "github:nix-community/NUR";
zen-browser.url =
"git+https://git.sr.ht/~canasta/zen-browser-flake/"; # updated flake
};
outputs = inputs @ {nixpkgs, ...}: {
outputs = inputs@{ nixpkgs, ... }: {
nixosConfigurations = {
h-laptop =
# CHANGEME: This should match the 'hostname' in your variables.nix file
nixy = # CHANGEME: This should match the 'hostname' in your variables.nix file
nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules = [
{
nixpkgs.overlays = [];
_module.args = {
inherit inputs;
};
nixpkgs.overlays =
[ inputs.hyprpanel.overlay inputs.nur.overlays.default ];
_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
];
};
# Jack is my server
jack = nixpkgs.lib.nixosSystem {
modules = [
{_module.args = {inherit inputs;};}
inputs.home-manager.nixosModules.home-manager
inputs.stylix.nixosModules.stylix
inputs.sops-nix.nixosModules.sops
inputs.nixarr.nixosModules.default
# inputs.eleakxir.nixosModules.eleakxir
inputs.nix-index-database.nixosModules.default
inputs.default-creds.nixosModules.default
./hosts/server/configuration.nix
];
};
};
};
}
-78
View File
@@ -1,78 +0,0 @@
{
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"];
};
};
}
@@ -0,0 +1,44 @@
# 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
@@ -0,0 +1 @@
{ imports = [ ./neofetch ./nerdfetch ]; }
+147
View File
@@ -0,0 +1,147 @@
{ 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"
'';
}
+369
View File
@@ -0,0 +1,369 @@
{ 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
@@ -1,32 +0,0 @@
{
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"
];
};
};
}
+9 -9
View File
@@ -1,10 +1,12 @@
# 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"
@@ -17,14 +19,12 @@ in {
"result"
"result-*"
];
settings = {
user.name = username;
user.email = email;
extraConfig = {
init.defaultBranch = "main";
pull.rebase = "false";
push.autoSetupRemote = true;
color.ui = "1";
alias = {
};
aliases = {
essa = "push --force";
co = "checkout";
fuck = "commit --amend -m";
@@ -48,8 +48,8 @@ in {
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`";
};
edit-unmerged =
"!f() { git ls-files --unmerged | cut -f2 | sort -u ; }; hx `f`";
};
};
}
-35
View File
@@ -1,35 +0,0 @@
# Lazygit is a simple terminal UI for git commands.
{
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];
};
showListFooter = false;
showRandomTip = false;
showCommandLog = false;
showBottomLine = false;
nerdFontsVersion = "3";
};
};
};
}
-15
View File
@@ -1,15 +0,0 @@
# 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
@@ -1,21 +0,0 @@
{
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
];
}
-25
View File
@@ -1,25 +0,0 @@
{
pkgs-stable,
inputs,
...
}: {
home.packages = with pkgs-stable; [
wireshark
nmap
john
hashcat
# Web
caido
nuclei
gobuster
dirb
# Utils
inetutils
samba
openvpn
mariadb
redis
];
}
-24
View File
@@ -1,24 +0,0 @@
{
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
@@ -1,9 +0,0 @@
{pkgs-stable, ...}: {
home.packages = with pkgs-stable; [
peaclock
cbonsai
pipes
cmatrix
fastfetch
];
}
+28
View File
@@ -0,0 +1,28 @@
{
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";
cursor_shape = "Underline";
cursor_underline_thickness = 3;
window_padding_width = 10;
};
};
}
+22
View File
@@ -0,0 +1,22 @@
{ config, lib, ... }:
let
accent = "#${config.lib.stylix.colors.base0D}";
muted = "#${config.lib.stylix.colors.base03}";
in {
programs.lazygit = {
enable = true;
settings = lib.mkForce {
gui = {
theme = {
activeBorderColor = [ accent "bold" ];
inactiveBorderColor = [ muted ];
};
showListFooter = false;
showRandomTip = false;
showCommandLog = false;
showBottomLine = false;
nerdFontsVersion = "3";
};
};
};
}
+7
View File
@@ -0,0 +1,7 @@
# 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
@@ -1,19 +0,0 @@
{pkgs, ...}: let
nightshift-toggle =
pkgs.writeShellScriptBin "nightshift-toggle"
# bash
''
if pidof "hyprsunset"; then
pkill hyprsunset
${pkgs.libnotify}/bin/notify-send "Night Shift Disabled" "Returning to full spectrum light. Filter disabled."
else
${pkgs.hyprsunset}/bin/hyprsunset -t 4500 &
${pkgs.libnotify}/bin/notify-send "Night Shift Activated" "Welcome to the warm side. Blue light filtering is now active."
fi
'';
in {
home.packages = with pkgs; [
hyprsunset
nightshift-toggle
];
}
-5
View File
@@ -1,5 +0,0 @@
{inputs, ...}: {
imports = [inputs.nix-index-database.homeModules.default];
programs.nix-index.enable = true;
programs.nix-index-database.comma.enable = true;
}
-21
View File
@@ -1,21 +0,0 @@
# 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
@@ -1,229 +0,0 @@
{
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
@@ -1,130 +0,0 @@
{
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
@@ -1,13 +0,0 @@
{
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
@@ -1,53 +0,0 @@
{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;
};
};
}
-257
View File
@@ -1,257 +0,0 @@
{
programs.nvf.settings.vim = {
utility = {
oil-nvim.enable = true;
snacks-nvim = {
setupOpts = {
picker.enabled = true;
explorer.enabled = true;
};
};
};
keymaps = [
# Top Pickers & Explorer
{
key = "<leader> ";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.smart()<cr>";
desc = "Smart Find Files";
}
{
key = "<leader>,";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.buffers()<cr>";
desc = "Buffers";
}
{
key = "<leader>/";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.grep()<cr>";
desc = "Grep";
}
{
key = "<leader>:";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.command_history()<cr>";
desc = "Command History";
}
{
key = "<leader>e";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.explorer()<cr>";
desc = "File Explorer";
}
{
key = "-";
mode = "n";
silent = true;
action = "<cmd>Oil<cr>";
desc = "Oil";
}
# Find
{
key = "<leader>fb";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.buffers()<cr>";
desc = "Buffers";
}
{
key = "<leader>fc";
mode = "n";
silent = true;
action = ''
<cmd>lua Snacks.picker.files({ cwd = vim.fn.stdpath("config") })<cr>'';
desc = "Find Config File";
}
{
key = "<leader>ff";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.files()<cr>";
desc = "Find Files";
}
{
key = "<leader>fg";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.git_files()<cr>";
desc = "Find Git Files";
}
{
key = "<leader>fp";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.projects()<cr>";
desc = "Projects";
}
{
key = "<leader>fr";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.recent()<cr>";
desc = "Recent";
}
{
key = "<leader>fn";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.notifications()<cr>";
desc = "Notification History";
}
{
key = "<leader>fe";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.icons()<cr>";
desc = "Emoji";
}
# Git
{
key = "<leader>gb";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.git_branches()<cr>";
desc = "Git Branches";
}
{
key = "<leader>gL";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.git_log()<cr>";
desc = "Git Log Line";
}
{
key = "<leader>gs";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.git_status()<cr>";
desc = "Git Status";
}
{
key = "<leader>gS";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.git_stash()<cr>";
desc = "Git Stash";
}
{
key = "<leader>gd";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.git_diff()<cr>";
desc = "Git Diff (Hunks)";
}
{
key = "<leader>gf";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.git_log_file()<cr>";
desc = "Git Log File";
}
# Grep
{
key = "<leader>sb";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.lines()<cr>";
desc = "Buffer Lines";
}
{
key = "<leader>st";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.todo_comments()<cr>";
desc = "Todos";
}
{
key = "<leader>sB";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.grep_buffers()<cr>";
desc = "Grep Open Buffers";
}
{
key = "<leader>sg";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.grep()<cr>";
desc = "Grep";
}
{
key = "<leader>sw";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.grep_word()<cr>";
desc = "Visual selection or word";
}
{
key = "<leader>sr";
mode = "n";
silent = true;
action = "<cmd>nohlsearch<cr>";
desc = "Reset search";
}
# LSP
{
key = "gd";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.lsp_definitions()<cr>";
desc = "Goto Definition";
}
{
key = "gD";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.lsp_declarations()<cr>";
desc = "Goto Declaration";
}
{
key = "gr";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.lsp_references()<cr>";
desc = "References";
nowait = true;
}
{
key = "gI";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.lsp_implementations()<cr>";
desc = "Goto Implementation";
}
{
key = "gy";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.lsp_type_definitions()<cr>";
desc = "Goto Type Definition";
}
{
key = "<leader>ss";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.lsp_symbols()<cr>";
desc = "LSP Symbols";
}
{
key = "<leader>sS";
mode = "n";
silent = true;
action = "<cmd>lua Snacks.picker.lsp_workspace_symbols()<cr>";
desc = "LSP Workspace Symbols";
}
];
};
}
-26
View File
@@ -1,26 +0,0 @@
{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
@@ -1,52 +0,0 @@
{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;
};
};
};
}
+187
View File
@@ -0,0 +1,187 @@
{
programs.nixvim = {
autoGroups = {
auto_quit.clear = true;
autoview.clear = true;
bufferline.clear = true;
checktime.clear = true;
create_dir.clear = true;
editorconfig_filetype.clear = true;
file_user_events.clear = true;
highlighturl.clear = true;
highlightyank.clear = true;
large_buf_settings.clear = true;
q_close_windows.clear = true;
terminal_settings.clear = true;
unlist_quickfix.clear = true;
};
autoCmd = [
# auto_quit
# https://github.com/AstroNvim/AstroNvim/blob/v4.7.7/lua/astronvim/plugins/_astrocore_autocmds.lua#L18-L46
{
desc =
"Quit neovim if more than one window is open and only sidebar windows are list";
event = "BufEnter";
group = "auto_quit";
callback.__raw = ''
function()
local wins = vim.api.nvim_tabpage_list_wins(0)
-- Both neo-tree and aerial will auto-quit if there is only a single window left
if #wins <= 1 then return end
local sidebar_fts = { aerial = true, ["neo-tree"] = true }
for _, winid in ipairs(wins) do
if vim.api.nvim_win_is_valid(winid) then
local bufnr = vim.api.nvim_win_get_buf(winid)
local filetype = vim.bo[bufnr].filetype
-- If any visible windows are not sidebars, early return
if not sidebar_fts[filetype] then
return
-- If the visible window is a sidebar
else
-- only count filetypes once, so remove a found sidebar from the detection
sidebar_fts[filetype] = nil
end
end
end
if #vim.api.nvim_list_tabpages() > 1 then
vim.cmd.tabclose()
else
vim.cmd.qall()
end
end
'';
}
# autoview
# https://github.com/AstroNvim/AstroNvim/blob/v4.7.7/lua/astronvim/plugins/_astrocore_autocmds.lua#L49-L70
{
desc = "Save view with mkview for real files";
event = [ "BufWinLeave" "BufWritePost" "WinLeave" ];
group = "autoview";
callback.__raw = ''
function(event)
if vim.b[event.buf].view_activated then vim.cmd.mkview { mods = { emsg_silent = true } } end
end
'';
}
{
desc =
"Try to load file view if available and enable view saving for real files";
event = "BufWinEnter";
group = "autoview";
callback.__raw = ''
function(event)
if not vim.b[event.buf].view_activated then
local filetype = vim.bo[event.buf].filetype
local buftype = vim.bo[event.buf].buftype
local ignore_filetypes = { "gitcommit", "gitrebase", "svg", "hgcommit" }
if buftype == "" and filetype and filetype ~= "" and not vim.tbl_contains(ignore_filetypes, filetype) then
vim.b[event.buf].view_activated = true
vim.cmd.loadview { mods = { emsg_silent = true } }
end
end
end
'';
}
# checktime
# https://github.com/AstroNvim/AstroNvim/blob/v4.7.7/lua/astronvim/plugins/_astrocore_autocmds.lua#L118-L122
{
desc = "Check if buffers changed on editor focus";
event = [ "FocusGained" "TermClose" "TermLeave" ];
group = "checktime";
command = "checktime";
}
# editorconfig_filetype
# https://github.com/AstroNvim/AstroNvim/blob/v4.7.7/lua/astronvim/plugins/_astrocore_autocmds.lua#L135-L144
{
desc =
"Configure editorconfig after filetype detection to override `ftplugin`s";
event = "FileType";
group = "editorconfig_filetype";
callback.__raw = ''
function(args)
if vim.F.if_nil(vim.b.editorconfig, vim.g.editorconfig, true) then
local editorconfig_avail, editorconfig = pcall(require, "editorconfig")
if editorconfig_avail then editorconfig.config(args.buf) end
end
end
'';
}
# 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
'';
}
# terminal_settings
# https://github.com/AstroNvim/AstroNvim/blob/v4.7.7/lua/astronvim/plugins/_astrocore_autocmds.lua#L258-L266
{
desc = "Disable line number/fold column/sign column for terminals";
event = "TermOpen";
group = "terminal_settings";
callback.__raw = ''
function()
vim.opt_local.number = false
vim.opt_local.relativenumber = false
vim.opt_local.foldcolumn = "0"
vim.opt_local.signcolumn = "no"
end
'';
}
# unlist_quickfix
# https://github.com/AstroNvim/AstroNvim/blob/v4.7.7/lua/astronvim/plugins/_astrocore_autocmds.lua#L270-L275
{
desc = "Unlist quickfix buffers";
event = "FileType";
group = "unlist_quickfix";
pattern = "qf";
callback.__raw = ''
function()
vim.opt_local.buflisted = false
end
'';
}
];
};
}
+21
View File
@@ -0,0 +1,21 @@
# Nixvim is a NixOS module that installs and configures Neovim
{ inputs, ... }: {
imports = [
inputs.nixvim.homeManagerModules.nixvim
./plugins/lsp.nix
./plugins/tree.nix
./plugins/telescope.nix
./plugins/cmp.nix
./plugins/ui.nix
./plugins/lualine.nix
./plugins/utils.nix
./plugins/dashboard.nix
./plugins/markdown.nix
./options.nix
./keymaps.nix
./autocmds.nix
];
programs.nixvim.enable = true;
}
+310
View File
@@ -0,0 +1,310 @@
{
programs.nixvim = {
plugins.which-key = {
enable = true;
settings = {
delay = 600;
icons = {
breadcrumb = "»";
group = "+";
separator = ""; # ➜
mappings = false;
};
spec = [
# General Mappings
{
__unkeyed-1 = "<leader>c";
mode = [ "n" "v" ];
group = "+code";
}
{
__unkeyed-1 = "<leader>d";
mode = [ "n" "v" ];
group = "+debug";
}
{
__unkeyed-1 = "<leader>s";
mode = "n";
group = "+search";
}
{
__unkeyed-1 = "<leader>m";
mode = "n";
group = "+markdown";
}
{
__unkeyed-1 = "<leader>t";
mode = "n";
group = "+trouble";
}
{
__unkeyed-1 = "<leader>u";
mode = "n";
group = "+ui";
}
{
__unkeyed-1 = "<leader>w";
mode = "n";
group = "+windows";
}
{
__unkeyed-1 = "<leader>h";
mode = "n";
group = "+harpoon";
}
];
win = {
border = "rounded";
wo.winblend = 0;
};
};
};
keymaps = [
# General Mappings
{
key = "<leader>e";
action = "<cmd>Oil --float<cr>";
options.desc = "Oil";
}
{
key = "-";
action = "<cmd>Oil<cr>";
options.desc = "Oil";
}
{
key = "<leader>E";
action = "<cmd>Neotree toggle<cr>";
options.desc = "Neotree";
}
{
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-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>";
}
# UI
{
key = "<leader>uz";
action = "<cmd>ZenMode<cr>";
options.desc = "Toggle ZenMode";
}
{
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 spellcheck";
}
{
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";
}
# Search
{
key = "<leader> ";
action = "<cmd>lua require('telescope.builtin').find_files()<cr>";
options.desc = "Telescope";
}
{
key = "<leader>sg";
action = "<cmd>lua require('telescope.builtin').live_grep()<cr>";
options.desc = "Livegrep";
}
{
key = "<leader>sf";
action = "<cmd>lua require('telescope.builtin').find_files()<cr>";
options.desc = "Find Files";
}
{
key = "<leader>sb";
action = "<cmd>lua require('telescope.builtin').buffers()<cr>";
options.desc = "Buffers";
}
{
key = "<leader>sh";
action = "<cmd>lua require('telescope.builtin').help_tags()<cr>";
options.desc = "Help Tags";
}
{
key = "<leader>sc";
action = "<cmd>lua require('telescope.builtin').commands()<cr>";
options.desc = "Commands";
}
{
key = "<leader>sm";
action = "<cmd>lua require('telescope.builtin').marks()<cr>";
options.desc = "Marks";
}
{
key = "<leader>so";
action = "<cmd>lua require('telescope.builtin').oldfiles()<cr>";
options.desc = "Oldfiles";
}
{
key = "<leader>ss";
action = "<cmd>lua require('telescope.builtin').spell_suggest()<cr>";
options.desc = "Spell Suggest";
}
{
key = "<leader>sr";
action = "<cmd>:noh<return><esc>";
options.desc = "Reset search";
}
{
key = "<leader>st";
action = "<cmd>TodoTelescope<cr>";
options.desc = "Todos";
}
# Trouble
{
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)";
}
# 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";
}
# Code
{
key = "<leader>cd";
action = "<cmd>lua vim.lsp.buf.definition()<cr>";
options.desc = "LSP Definition";
}
{
key = "<leader>cr";
action = "<cmd>lua vim.lsp.buf.references()<cr>";
options.desc = "LSP References";
}
{
key = "<leader>ct";
action = "<cmd>lua vim.lsp.buf.type_definition()<cr>";
options.desc = "LSP Type Definition";
}
{
key = "<leader>ca";
action = "<cmd>lua vim.lsp.buf.code_action()<cr>";
options.desc = "LSP Code Action";
}
{
key = "<leader>cf";
action = "<cmd>lua vim.lsp.buf.formatting()<cr>";
options.desc = "LSP Formatting";
}
{
key = "<leader>cn";
action = "<cmd>lua vim.lsp.diagnostic.goto_next()<cr>";
options.desc = "LSP Next Diagnostic";
}
{
key = "<leader>cp";
action = "<cmd>lua vim.lsp.diagnostic.goto_prev()<cr>";
options.desc = "LSP Previous Diagnostic";
}
{
key = "<leader>cu";
action = "<cmd>lua require('dapui').toggle()<CR>";
options.desc = "Toggle Dapui";
}
{
key = "<leader>cb";
action = "<cmd>lua require('dap').toggle_breakpoint()<CR>";
options.desc = "Toggle breakpoint";
}
];
};
}
+151
View File
@@ -0,0 +1,151 @@
{
programs.nixvim = {
globals.mapleader = " ";
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;
# Enable linematch diff algorithm
diffopt.__raw = ''
vim.list_extend(vim.opt.diffopt:get(), { "algorithm:histogram", "linematch:60" })
'';
# 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 search count wrap and startup messages
shortmess.__raw = ''
vim.tbl_deep_extend("force", vim.opt.shortmess:get(), { s = true, I = true })
'';
# 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;
viewoptions.__raw = ''
vim.tbl_filter(function(val) return val ~= "curdir" end, vim.opt.viewoptions:get())
'';
# 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;
};
};
}
+116
View File
@@ -0,0 +1,116 @@
{
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 = "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 })";
};
};
};
};
}
+223
View File
@@ -0,0 +1,223 @@
{ config, ... }:
let
accent = "#${config.lib.stylix.colors.base0D}";
muted = "#${config.lib.stylix.colors.base03}";
foreground = "#${config.lib.stylix.colors.base05}";
configDir = config.var.configDirectory;
in {
programs.nixvim.highlight = {
AlphaHeaderColor.fg = accent;
AlphaTextColor.fg = foreground;
AlphaShortcutColor.fg = muted;
};
programs.nixvim.plugins.alpha = {
enable = true;
layout = [
{
type = "padding";
val = 4;
}
{
type = "text";
opts = {
position = "center";
hl = "AlphaHeaderColor";
};
val = [
" "
" "
" "
" "
" "
" "
" "
" "
" "
];
}
{
type = "padding";
val = 4;
}
{
type = "group";
val = [
{
type = "button";
val = "󰭎 Find file";
on_press.__raw = "function() vim.cmd[[Telescope find_files]] end";
opts = {
keymap = [
"n"
"nf"
":Telescope find_files <CR>"
{
noremap = true;
silent = true;
nowait = true;
}
];
shortcut = "nf";
position = "center";
cursor = 3;
width = 50;
align_shortcut = "right";
hl_shortcut = "AlphaShortcutColor";
hl = "AlphaTextColor";
};
}
{
type = "button";
val = " New file";
on_press.__raw = "function() vim.cmd[[ene]] end";
opts = {
keymap = [
"n"
"nn"
":ene <CR>"
{
noremap = true;
silent = true;
nowait = true;
}
];
shortcut = "nn";
position = "center";
cursor = 3;
width = 50;
align_shortcut = "right";
hl_shortcut = "AlphaShortcutColor";
hl = "AlphaTextColor";
};
}
{
type = "button";
val = " NixOs Config";
on_press.__raw = "function() vim.cmd[[Neotree ${configDir}]] end";
opts = {
keymap = [
"n"
"nc"
":Neotree ${configDir} <CR>"
{
noremap = true;
silent = true;
nowait = true;
}
];
shortcut = "nc";
position = "center";
cursor = 3;
width = 50;
align_shortcut = "right";
hl_shortcut = "AlphaShortcutColor";
hl = "AlphaTextColor";
};
}
{
type = "button";
val = " Keybindings";
on_press.__raw =
"function() vim.cmd[[e ${configDir}/docs/KEYBINDINGS.md]] end";
opts = {
shortcut = "nk";
keymap = [
"n"
"nk"
":e ${configDir}/docs/KEYBINDINGS-HYPRLAND.md <CR>"
{
noremap = true;
silent = true;
nowait = true;
}
];
position = "center";
cursor = 3;
width = 50;
align_shortcut = "right";
hl_shortcut = "AlphaShortcutColor";
hl = "AlphaTextColor";
};
}
{
type = "button";
val = " Recently used";
on_press.__raw = "function() vim.cmd[[Telescope oldfiles]] end";
opts = {
shortcut = "no";
keymap = [
"n"
"no"
":Telescope oldfiles <CR>"
{
noremap = true;
silent = true;
nowait = true;
}
];
position = "center";
cursor = 3;
width = 50;
align_shortcut = "right";
hl_shortcut = "AlphaShortcutColor";
hl = "AlphaTextColor";
};
}
{
type = "button";
val = "󰱽 Find text";
on_press.__raw = "function() vim.cmd[[Telescope live_grep]] end";
opts = {
shortcut = "ng";
keymap = [
"n"
"ng"
":Telescope live_grep <CR>"
{
noremap = true;
silent = true;
nowait = true;
}
];
position = "center";
cursor = 3;
width = 50;
align_shortcut = "right";
hl_shortcut = "AlphaShortcutColor";
hl = "AlphaTextColor";
};
}
{
type = "button";
val = "󰩈 Quit Neovim";
on_press.__raw = "function() vim.cmd[[qa]] end";
opts = {
shortcut = "nq";
keymap = [
"n"
"nq"
":qa <CR>"
{
noremap = true;
silent = true;
nowait = true;
}
];
position = "center";
cursor = 3;
width = 50;
align_shortcut = "right";
hl_shortcut = "AlphaShortcutColor";
hl = "AlphaTextColor";
};
}
];
}
];
};
}
+54
View File
@@ -0,0 +1,54 @@
{
programs.nixvim.plugins = {
lsp-format.enable = true;
lsp = {
enable = true;
servers = {
bashls.enable = true;
clangd.enable = true;
gopls.enable = true;
eslint.enable = true;
ts_ls.enable = true;
nixd = {
enable = true;
extraOptions = {
expr = "import <nixpkgs> {}";
# fix- encoding: https://github.com/nix-community/nixvim/issues/2390
offset_encoding = "utf-8";
};
};
tailwindcss.enable = true;
html.enable = true;
svelte.enable = true;
marksman.enable = true;
};
keymaps.lspBuf = {
"gd" = "definition";
"gD" = "references";
"gt" = "type_definition";
"gi" = "implementation";
"K" = "hover";
};
};
none-ls = {
enable = true;
sources = {
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;
};
};
};
};
}
+30
View File
@@ -0,0 +1,30 @@
{
programs.nixvim.plugins.lualine = {
enable = true;
settings = {
options.disabled_filetypes.statusline =
[ "dashboard" "alpha" "neo-tree" ];
alwaysDivideMiddle = true;
globalstatus = true;
ignoreFocus = [ "neo-tree" ];
extensions = [ "fzf" ];
componentSeparators = {
left = "|";
right = "|";
};
sectionSeparators = {
left = ""; # 
right = ""; # 
};
sections = {
lualine_a = [ "mode" ];
lualine_b = [ "branch" "diff" "diagnostics" ];
lualine_c = [ "filename" ];
lualine_x = [ "filetype" ];
lualine_y = [ "progress" ];
lualine_z = [ ''" " .. os.date("%R")'' ];
};
};
};
}
+243
View File
@@ -0,0 +1,243 @@
{ config, ... }:
let
accent = "#${config.lib.stylix.colors.base0D}";
muted = "#${config.lib.stylix.colors.base03}";
in {
programs.nixvim = {
# Markdown settings
extraFiles."after/ftplugin/markdown.lua".text = ''
vim.bo.tabstop = 2
vim.bo.shiftwidth = 2
vim.bo.expandtab = true
'';
# Highlight colors
highlight = {
Headline1 = {
bg = "#4B4266";
fg = accent;
};
Headline2 = {
bg = "#3B575E";
fg = "#9FFEFE";
};
Headline3 = {
bg = "#3B5742";
fg = "#9FFE9F";
};
Headline4 = {
bg = "#574842";
fg = "#FECB9F";
};
RenderMarkdownTodo.fg = "#f78c6c";
RenderMarkdownWarning.fg = "#ff5370";
RenderMarkdownDone.fg = muted;
};
# Plugins
plugins = {
# Paste images from clipboard
clipboard-image = {
enable = true;
settings = { default.img_dir = [ "%:p:h" "img" ]; };
};
# Zen mode
zen-mode = {
enable = true;
settings = {
on_close = ''
function()
end
'';
on_open = ''
function()
end
'';
plugins = {
gitsigns = { enabled = false; };
options = {
enabled = true;
ruler = false;
showcmd = false;
laststatus = "0";
kitty = {
enabled = true;
font = "+4";
};
};
};
window = {
backdrop = 0.95;
height = 1;
options = {
signcolumn = "no";
number = false;
relativenumber = false;
};
width = 0.8;
};
};
};
# Display images in markdown
image = {
enable = true;
integrations.markdown = {
clearInInsertMode = true;
onlyRenderImageAtCursor = true;
};
};
# This one takes care of the markdown titles
headlines = {
enable = true;
settings = {
markdown = {
headline_highlights =
[ "Headline1" "Headline2" "Headline3" "Headline4" ];
};
};
};
# MkdnFlow is a plugin that helps you navigate markdown files
mkdnflow = {
enable = true;
modules = { conceal = false; };
toDo.symbols = [ " " "-" "x" "!" "/" ];
mappings = {
MkdnCreateLink = false;
MkdnCreateLinkFromClipboard = {
key = "<leader>ml";
modes = [ "n" "v" ];
};
MkdnDecreaseHeading = {
key = "<leader>m-";
modes = "n";
};
MkdnDestroyLink = false;
MkdnEnter = {
key = "<CR>";
modes = [ "v" ];
};
MkdnExtendList = false;
MkdnFoldSection = {
key = "<leader>mf";
modes = "n";
};
MkdnUnfoldSection = {
key = "<leader>mF";
modes = "n";
};
MkdnFollowLink = {
key = "gd";
modes = "n";
};
MkdnGoBack = false;
MkdnGoForward = false;
MkdnIncreaseHeading = {
key = "<leader>m+";
modes = "n";
};
MkdnMoveSource = false;
MkdnNewListItem = false;
MkdnNewListItemAboveInsert = {
key = "O";
modes = "n";
};
MkdnNewListItemBelowInsert = {
key = "o";
modes = "n";
};
MkdnNextHeading = {
key = "<leader>m#";
modes = "n";
};
MkdnNextLink = false;
MkdnPrevLink = false;
MkdnPrevHeading = {
key = "<leader>m*";
modes = "n";
};
MkdnSTab = false;
MkdnTab = false;
MkdnTableNewColAfter = {
key = "<leader>mc";
modes = "n";
};
MkdnTableNewColBefore = {
key = "<leader>mC";
modes = "n";
};
MkdnTableNewRowAbove = {
key = "<leader>mR";
modes = "n";
};
MkdnTableNewRowBelow = {
key = "<leader>mr";
modes = "n";
};
MkdnTableNextCell = {
key = "<S-Tab>";
modes = "n";
};
MkdnTableNextRow = false;
MkdnTablePrevCell = {
key = "<S-Tab>";
modes = "n";
};
MkdnTablePrevRow = false;
MkdnToggleToDo = {
key = "<C-Space>";
modes = [ "n" "v" ];
};
MkdnUpdateNumbering = {
key = "<leader>mn";
modes = "n";
};
MkdnYankAnchorLink = {
key = "ya";
modes = "n";
};
MkdnYankFileAnchorLink = {
key = "yfa";
modes = "n";
};
};
};
# Render UI elements
render-markdown = {
enable = true;
settings = {
heading = { enabled = false; };
checkbox = {
unchecked = { highlight = "RenderMarkdownTodo"; };
checked = { highlight = "RenderMarkdownDone"; };
custom = {
pending = {
raw = "[-]";
rendered = " ";
highlight = "RenderMarkdownTodo";
};
important = {
raw = "[!]";
rendered = "󰰱 ";
highlight = "RenderMarkdownWarning";
};
cancel = {
raw = "[/]";
rendered = "󱋬 ";
highlight = "RenderMarkdownWarning";
};
};
};
};
};
};
};
}
+31
View File
@@ -0,0 +1,31 @@
{ config, ... }:
let
accent = "#${config.lib.stylix.colors.base0D}";
background = "#${config.lib.stylix.colors.base00}";
background-alt = "#${config.lib.stylix.colors.base01}";
in {
programs.nixvim = {
highlight = {
TelescopePromptPrefix.fg = accent;
TelescopeSelectionCaret = {
fg = accent;
bg = background-alt;
};
TelescopeSelection.bg = background-alt;
TelescopePromptTitle = {
bg = background;
fg = accent;
};
TelescopePromptNormal.bg = background;
TelescopePromptBorder = {
bg = background;
fg = accent;
};
};
plugins.telescope = {
enable = true;
extensions.fzf-native = { enable = true; };
settings.defaults = { selection_caret = " "; };
};
};
}
+49
View File
@@ -0,0 +1,49 @@
{
programs.nixvim = {
plugins = {
neo-tree.enable = true;
oil = {
enable = true;
settings = {
default_file_explorer = false;
skip_confirm_for_simple_edits = true;
view_options.is_hidden_file = ''
function(name, bufnr)
return vim.startswith(name, ".") or name == "img"
end
'';
win_options = {
concealcursor = "ncv";
conceallevel = 3;
cursorcolumn = false;
foldcolumn = "0";
list = false;
signcolumn = "no";
spell = false;
wrap = false;
};
float = { padding = 5; };
keymaps = {
"-" = "actions.parent";
"b" = "actions.parent";
"<C-c>" = "actions.close";
"<C-h>" = "actions.select_split";
"<C-l>" = "actions.refresh";
"<C-p>" = "actions.preview";
"<C-s>" = "actions.select_vsplit";
"<C-t>" = "actions.select_tab";
"<CR>" = "actions.select";
_ = "actions.open_cwd";
"`" = "actions.cd";
"g." = "actions.toggle_hidden";
"g?" = "actions.show_help";
"g\\" = "actions.toggle_trash";
gs = "actions.change_sort";
gx = "actions.open_external";
"~" = "actions.tcd";
};
};
};
};
};
}
+14
View File
@@ -0,0 +1,14 @@
{ pkgs, ... }: {
home.packages = with pkgs; [ ctags ];
programs.nixvim.plugins = {
web-devicons.enable = true;
noice.enable = true;
gitsigns = {
enable = true;
settings.current_line_blame = false;
};
trouble.enable = true;
bufferline.enable = true;
};
}
+25
View File
@@ -0,0 +1,25 @@
{ config, ... }: {
programs.nixvim = {
highlightOverride = {
FloatBorder.fg = "#${config.lib.stylix.colors.base0D}";
};
nixpkgs.config = { allowUnfree = true; };
plugins = {
copilot-vim.enable = true;
flash.enable = true;
tmux-navigator.enable = true;
comment.enable = true;
nvim-autopairs.enable = true;
todo-comments.enable = true;
treesitter = {
enable = true;
nixGrammars = true;
settings = {
ensure_installed = "all";
indent.enable = true;
highlight.enable = true;
};
};
};
};
}
-5
View File
@@ -1,5 +0,0 @@
{
wayland.windowManager.hyprland.settings.exec-once = [
"protonvpn-app --start-minimized &"
];
}
-35
View File
@@ -1,35 +0,0 @@
{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;
};
};
}
-466
View File
@@ -1,466 +0,0 @@
{
config,
lib,
pkgs,
...
}: let
bookmarkList = [
{
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 = "Tools";
bookmarks = [
{
name = "tldr";
url = "https://tldr.inbrowser.app/";
}
{
name = "Excalidraw";
url = "https://excalidraw.com";
}
{
name = "Cobalt (downloader)";
url = "https://cobalt.meowing.de";
}
{
name = "Mazanoke (image)";
url = "https://mazanoke.hadi.icu";
}
{
name = "Stirling PDF";
url = "https://pdf.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 = "Social";
bookmarks = [
{
name = "Bluesky";
url = "https://bsky.app";
}
{
name = "Reddit";
url = "https://reddit.com";
}
{
name = "Youtube";
url = "https://youtube.com";
}
{
name = "Instagram";
url = "https://instagram.com";
}
{
name = "Github";
url = "https://github.com";
}
{
name = "Discord";
url = "https://discord.com/channels/@me/";
}
];
}
{
name = "Other";
bookmarks = [
{
name = "Startpage Config";
url = "https://www.startpage.com/do/mypage.pl?prfe=45d331deb05471d659dba933e7400df51d952bb103da6f6125c0e769a6be1d65610456a479f495ceeee7e97311cf227d7c1bb198de0ceeb193d8cddf9c455c19a409cc35c3e3f542ee27bd7cecd3";
}
{
name = "Hyprland Wiki";
url = "https://wiki.hypr.land";
}
{
name = "MyNixOS";
url = "https://mynixos.com";
}
{
name = "Nixpkgs";
url = "https://github.com/NixOS/nixpkgs";
}
{
name = "Claude";
url = "https://claude.ai";
}
{
name = "Gemini";
url = "https://gemini.google.com";
}
{
name = "Medium";
url = "https://medium.com";
}
{
name = "Maps";
url = "https://maps.apple.com";
}
{
name = "Amazon";
url = "https://amazon.fr";
}
];
}
{
name = "Infosec";
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 = "Exploit-DB";
url = "https://exploit-db.com";
}
{
name = "Crack Station";
url = "https://crackstation.net";
}
{
name = "Osint Tracker";
url = "https://app.osintracker.com";
}
];
}
];
c = config.lib.stylix.colors;
stripProtocol = url:
lib.removePrefix "https://" (lib.removePrefix "http://" url);
mkCard = item: ''
<a href="${item.url}" class="card">
<div class="favicon-wrapper">
<span class="favicon-fallback">${builtins.substring 0 1 item.name}</span>
</div>
<div class="card-info">
<span class="card-name">${item.name}</span>
<span class="card-url">${stripProtocol item.url}</span>
</div>
</a>'';
# Group consecutive root items so they share the same .cards grid
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="folder-section">
<div class="cards">
${lib.concatMapStrings mkCard group.items}
</div>
</div>
''
else ''
<div class="folder-section">
<h2 class="folder-title">${group.item.name}</h2>
<div class="cards">
${lib.concatMapStrings mkCard group.item.bookmarks}
</div>
</div>
'';
publicBookmarks =
pkgs.writeText "qutebrowser-public-bookmarks"
(lib.concatMapStrings (
item:
if item ? url
then "${item.url} ${item.name}\n"
else lib.concatMapStrings (b: "${b.url} ${item.name}/${b.name}\n") item.bookmarks
)
bookmarkList);
inherit (config.qutebrowser) privateBookmarksPath;
in {
options.qutebrowser.privateBookmarksPath = lib.mkOption {
type = lib.types.nullOr lib.types.str;
default = null;
description = "Path to a file containing extra (private) bookmarks to append.";
};
config = {
# Fully static HTML — order is preserved, no dependency on qutebrowser's Jinja rendering
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>
<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}; }
.bookmarks-container {
max-width: 1100px;
margin: 0 auto;
display: flex;
flex-direction: column;
gap: 1.75rem;
}
.folder-title {
font-size: 0.72rem;
font-weight: 700;
letter-spacing: 0.12em;
text-transform: uppercase;
color: #${c.base03};
margin-bottom: 0.6rem;
padding-left: 0.2rem;
}
.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.base03};
}
.favicon-wrapper { position: relative; width: 18px; height: 18px; flex-shrink: 0; }
.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.base0A}; }
.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">
</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');
input.focus();
input.addEventListener('input', function () {
const query = this.value.toLowerCase().trim();
let anyVisible = false;
document.querySelectorAll('.folder-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 first = document.querySelector('.card:not([style*="none"])');
if (first) {
location.href = first.href;
} else {
const q = encodeURIComponent(this.value.trim());
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 ["setupSecrets" "writeBoundary"] ''
mkdir -p ${config.home.homeDirectory}/.config/qutebrowser/bookmarks
cat ${publicBookmarks} ${lib.optionalString (privateBookmarksPath != null) ''"${privateBookmarksPath}"''} \
> ${config.home.homeDirectory}/.config/qutebrowser/bookmarks/urls
'';
};
}
+247 -27
View File
@@ -1,37 +1,257 @@
{...}: {
imports = [
./bookmarks.nix
./search.nix
./keybindings.nix
./settings.nix
./userscripts.nix
];
# 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}";
home.sessionVariables = {
DEFAULT_BROWSER = "qutebrowser";
BROWSER = "qutebrowser";
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=";
};
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"];
# 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";
};
};
xdg.desktopEntries.qutebrowser-private = {
name = "Qutebrowser (Temp session)";
genericName = "Web Browser";
exec = "qutebrowser --temp-basedir %U";
icon = "qutebrowser";
categories = ["Network" "WebBrowser"];
};
in {
imports = [ ./duckduckgo-colorscheme.nix ];
programs.qutebrowser = {
enable = true;
loadAutoconfig = 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)
'';
};
}
@@ -0,0 +1,44 @@
# 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,826 +0,0 @@
// ==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;
}
}
@@ -1,984 +0,0 @@
// ==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();
}
})();
@@ -1,704 +0,0 @@
// ==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
@@ -1,18 +0,0 @@
// ==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 });
@@ -1,191 +0,0 @@
// ==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
@@ -1,17 +0,0 @@
{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
@@ -1,30 +0,0 @@
{
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;
};
}
-51
View File
@@ -1,51 +0,0 @@
{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}
'';
};
}
-27
View File
@@ -1,27 +0,0 @@
{
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 ./eza.nix];
imports =
[ ./fzf.nix ./zsh.nix ./starship.nix ./zoxide.nix ./tmux.nix ./eza.nix ];
}
+1
View File
@@ -7,6 +7,7 @@
extraOptions = [
"--group-directories-first"
"--no-quotes"
"--git-ignore"
"--icons=always"
];
};
+3 -6
View File
@@ -1,9 +1,6 @@
# 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;
@@ -22,7 +19,7 @@ in {
defaultOptions = [
"--margin=1"
"--layout=reverse"
"--border=none"
"--border=rounded"
"--info='hidden'"
"--header=''"
"--prompt='/ '"
+5 -15
View File
@@ -1,9 +1,6 @@
# 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 {
@@ -12,15 +9,13 @@ in {
settings = {
add_newline = true;
format = lib.concatStrings [
"$nix_shell"
"$hostname"
"$directory"
"$git_branch"
"$git_state"
"$git_status"
"$character"
];
directory = {style = accent;};
directory = { style = accent; };
character = {
success_symbol = "[](${accent})";
@@ -28,12 +23,6 @@ in {
vimcmd_symbol = "[](cyan)";
};
nix_shell = {
format = "[$symbol]($style) ";
symbol = "🐚";
style = "";
};
git_branch = {
symbol = "[](${background-alt}) ";
style = "fg:${accent} bg:${background-alt}";
@@ -41,7 +30,8 @@ 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
@@ -0,0 +1,58 @@
# 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 ];
}
+45 -146
View File
@@ -1,43 +1,66 @@
# My shell configuration
{
pkgs,
lib,
config,
...
}: let
fetch = config.theme.fetch; # neofetch, nerdfetch, pfetch
{ pkgs, lib, config, ... }:
let fetch = config.var.theme.fetch; # neofetch, nerdfetch, pfetch
in {
home.packages = with pkgs; [bat ripgrep tldr witr];
# Add go binaries to the PATH
home.sessionPath = ["$HOME/go/bin"];
home.packages = with pkgs; [ bat ripgrep tldr sesh ];
home.sessionVariables = {
COLORTERM = "truecolor";
};
home.sessionPath = [ "$HOME/go/bin" ];
programs.zsh = {
enable = true;
enableCompletion = true;
autosuggestion.enable = true;
syntaxHighlighting = {
enable = true;
highlighters = ["main" "brackets" "pattern" "regexp" "root" "line"];
};
syntaxHighlighting.enable = true;
historySubstringSearch.enable = true;
initExtraFirst = ''
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
}
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";
@@ -51,17 +74,14 @@ in {
tree = "eza --icons=always --tree --no-quotes";
sl = "ls";
open = "${pkgs.xdg-utils}/bin/xdg-open";
cat = "bat --theme=base16 --color=always --paging=never --tabs=2 --wrap=never --plain";
mkdir = "mkdir -p";
icat = "${pkgs.kitty}/bin/kitty +kitten icat";
ssh = "kitty +kitten ssh";
obsidian-no-gpu = "env ELECTRON_OZONE_PLATFORM_HINT=auto obsidian --ozone-platform=x11";
wireguard-import = "nmcli connection import type wireguard file";
notes = "nvim ~/notes/index.md --cmd 'cd ~/notes' -c ':lua Snacks.picker.smart()'";
notes =
"nvim ~/nextcloud/notes/index.md --cmd 'cd ~/nextcloud/notes' -c ':Telescope find_files'";
note = "notes";
tmp = "nvim /tmp/$(date | sed 's/ //g;s/\\.//g').md";
nix-shell = "nix-shell --command zsh";
# git
g = "lazygit";
@@ -81,126 +101,5 @@ in {
gaa = "git add .";
gcm = "git commit -m";
};
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 ""
}
function sesh-sessions() {
session=$(sesh list -t -c | fzf --height 70% --reverse)
[[ -z "$session" ]] && return
sesh connect $session
}
function chatgptfolder(){
echo "################################"
echo "### TREE ###"
echo "################################"
${pkgs.eza}/bin/eza --tree -aF --icons never
echo -e "\n\n"
echo "##############################"
echo "### CONTENT ###"
echo "##############################"
find . -type f -not -path '*/.git/*' -print0 | while IFS= read -r -d "" file; do
echo -e "\n--- DEBUT: $file ---\n"
cat "$file"
echo -e "\n--- FIN: $file ---\n"
done
}
function n4c() {
category=''${1:-all}
shift
args=''${*}
nix develop "github:nix4cyber/n4c#''${category}" ''${args} -c zsh
}
zle -N sesh-sessions
bindkey -M emacs '\es' sesh-sessions
bindkey -M vicmd '\es' sesh-sessions
bindkey -M viins '\es' sesh-sessions
# search history based on what's typed in the prompt
autoload -U history-search-end
zle -N history-beginning-search-backward-end history-search-end
zle -N history-beginning-search-forward-end history-search-end
bindkey "^[OA" history-beginning-search-backward-end
bindkey "^[OB" history-beginning-search-forward-end
# General completion behavior
zstyle ':completion:*' completer _extensions _complete _approximate
# Use cache
zstyle ':completion:*' use-cache on
zstyle ':completion:*' cache-path "$XDG_CACHE_HOME/zsh/.zcompcache"
# Complete the alias
zstyle ':completion:*' complete true
# Autocomplete options
zstyle ':completion:*' complete-options true
# Completion matching control
zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*'
zstyle ':completion:*' keep-prefix true
# Group matches and describe
zstyle ':completion:*' menu select
zstyle ':completion:*' list-grouped false
zstyle ':completion:*' list-separator '''
zstyle ':completion:*' group-name '''
zstyle ':completion:*' verbose yes
zstyle ':completion:*:matches' group 'yes'
zstyle ':completion:*:warnings' format '%F{red}%B-- No match for: %d --%b%f'
zstyle ':completion:*:messages' format '%d'
zstyle ':completion:*:corrections' format '%B%d (errors: %e)%b'
zstyle ':completion:*:descriptions' format '[%d]'
# Colors
zstyle ':completion:*' list-colors ''${(s.:.)LS_COLORS}
# case insensitive tab completion
zstyle ':completion:*:*:cd:*' tag-order local-directories directory-stack path-directories
zstyle ':completion:*:*:cd:*:directory-stack' menu yes select
zstyle ':completion:*:-tilde-:*' group-order 'named-directories' 'path-directories' 'users' 'expand'
zstyle ':completion:*:*:-command-:*:*' group-order aliases builtins functions commands
zstyle ':completion:*' special-dirs true
zstyle ':completion:*' squeeze-slashes true
# Sort
zstyle ':completion:*' sort false
zstyle ":completion:*:git-checkout:*" sort false
zstyle ':completion:*' file-sort modification
zstyle ':completion:*:eza' sort false
zstyle ':completion:complete:*:options' sort false
zstyle ':completion:files' sort false
${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\\"
}
'';
};
}
+7 -17
View File
@@ -1,24 +1,16 @@
# Spicetify is a spotify client customizer
{
pkgs,
pkgs-stable,
config,
lib,
inputs,
...
}: let
spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.stdenv.hostPlatform.system};
{ pkgs, config, lib, inputs, ... }:
let
spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.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;
theme = lib.mkForce spicePkgs.themes.text;
colorScheme = "custom";
@@ -26,18 +18,16 @@ in {
button = accent;
button-active = accent;
tab-active = accent;
player = background;
main = background;
sidebar = background;
};
enabledExtensions = with spicePkgs.extensions; [
playlistIcons
lastfm
historyShortcut
hidePodcasts
adblock
fullAppDisplay
keyboardShortcut
shuffle
];
};
}
+17 -148
View File
@@ -1,112 +1,35 @@
# Thunar is a file explorer
{
pkgs,
pkgs-stable,
config,
lib,
...
}: let
user = config.var.username;
in {
{ pkgs, ... }: {
# ctrl + m to toggle the menubar
home.packages =
(with pkgs-stable; [
xfce.thunar
xfce.xfconf
xfce.tumbler
xfce.thunar-archive-plugin
xfce.thunar-volman
xfce.thunar-media-tags-plugin
p7zip
xarchiver
])
++ (with pkgs; [
# Icon themes: keep on global pkgs to avoid conflicts with other modules
papirus-icon-theme
material-icons
material-design-icons
material-symbols
]);
gtk = {
enable = true;
iconTheme = {
name = "Papirus-Dark";
package = pkgs.papirus-icon-theme;
};
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"
home.packages = with pkgs.xfce; [
thunar
xfconf
tumbler
thunar-archive-plugin
thunar-volman
];
};
qt.enable = true;
home.sessionVariables = {
XDG_ICON_DIR = "${pkgs.papirus-icon-theme}/share/icons/Papirus";
QS_ICON_THEME = "Papirus";
QT_STYLE_OVERRIDE = lib.mkForce "Fusion";
};
home.file.".config/xarchiver/xarchiverrc".text = ''
[xarchiver]
preferred_format=0
prefer_unzip=true
confirm_deletion=true
sort_filename_content=false
advanced_isearch=true
auto_expand=true
store_output=false
icon_size=2
show_archive_comment=false
show_sidebar=true
show_location_bar=true
show_toolbar=true
preferred_custom_cmd=
preferred_temp_dir=/tmp
preferred_extract_dir=./
allow_sub_dir=0
ensure_directory=true
overwrite=false
full_path=2
touch=false
fresh=false
update=false
store_path=false
updadd=true
freshen=false
recurse=true
solid_archive=false
remove_files=false
'';
home.file.".config/xfce4/xfconf/xfce-perchannel-xml/thunar.xml" = {
text = ''
<?xml version="1.1" encoding="UTF-8"?>
home.file.".config/xfce4/xfconf/xfce-perchannel-xml/thunar.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="230"/>
<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="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="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">
@@ -117,62 +40,8 @@ in {
<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"/>
<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>
'';
force = true;
};
xdg.configFile."Thunar/uca.xml".text = ''
<?xml version="1.0" encoding="UTF-8"?>
<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>
'';
}
+86
View File
@@ -0,0 +1,86 @@
{ pkgs, config, inputs, ... }:
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}";
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";
};
};
in {
home.file.".config/homepage" = {
source = "${homepage}/build";
recursive = true;
};
home.packages = with pkgs;
[ inputs.zen-browser.packages."${system}".default ];
}
+40
View File
@@ -0,0 +1,40 @@
# - ## 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
@@ -0,0 +1,33 @@
# - ## 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
@@ -0,0 +1,16 @@
{
imports = [
./nixy
./sounds
./brightness
./caffeine
./hyprpanel
./hyprfocus
./night-shift
./screenshot
./nerdfont-fzf
./notification
./system
./openvpn
];
}
+47
View File
@@ -0,0 +1,47 @@
# - ## 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
@@ -0,0 +1,47 @@
# - ## 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 ];
}
+29
View File
@@ -0,0 +1,29 @@
# - ## Nerdfont FZF
#-
#- This module provides a script to search for Nerd Fonts icons using fzf.
#-
#- - `nerdfont-fzf` - Search for Nerd Fonts icons using fzf.
{ pkgs, config, ... }:
let
nerdfont-fzf = pkgs.writeShellScriptBin "nerdfont-fzf" ''
icons=$(${pkgs.jq}/bin/jq -r 'to_entries[] | "\(.key):\(.value.char)"' "/home/${config.var.username}/.config/nerdfont_glyphnames.json" | awk -F: '{print "\033[95m "$2" \033[0m "$1}')
fzf_result=$(echo "$icons" | ${pkgs.fzf}/bin/fzf --ansi --border none | awk '{print $1}')
if [ -z "$fzf_result" ]; then
echo "No icon selected"
exit 1
fi
echo "Copied to clipboard: $fzf_result"
${pkgs.wl-clipboard}/bin/wl-copy "$fzf_result"
'';
in {
home.packages = [ nerdfont-fzf ];
xdg.configFile."nerdfont_glyphnames.json" = {
source = pkgs.fetchurl {
url =
"https://raw.githubusercontent.com/ryanoasis/nerd-fonts/384b1825ea0037b0314f7f9c660a80c1ecdb219a/glyphnames.json";
hash = "sha256-Ps0dyFcMs51RMTthBOVSOf/lafPV/53JxuNSKlmZ7cc=";
};
};
}
+73
View File
@@ -0,0 +1,73 @@
# - ## 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)
{ pkgs, ... }:
let
value = "4500"; # Default value for night-shift temperature
night-shift-on = pkgs.writeShellScriptBin "night-shift-on"
# bash
''
${pkgs.hyprsunset}/bin/hyprsunset -t ${value} &
title="󰖔 Night-Shift Activated"
description="Night-Shift is now activated! Your screen will be warmer and easier on the eyes."
notif "night-shift" "$title" "$description"
'';
night-shift-off = pkgs.writeShellScriptBin "night-shift-off"
# bash
''
pkill hyprsunset
title="󰖕 Night-Shift Deactivated"
description="Night-Shift is now deactivated! Your screen will return to normal."
notif "night-shift" "$title" "$description"
'';
night-shift = pkgs.writeShellScriptBin "night-shift"
# bash
''
if pidof "hyprsunset"; then
night-shift-off
else
night-shift-on
fi
'';
night-shift-status = pkgs.writeShellScriptBin "night-shift-status"
# bash
''
if pidof "hyprsunset"; then
echo "1"
else
echo "0"
fi
'';
night-shift-status-icon = pkgs.writeShellScriptBin "night-shift-status-icon"
# bash
''
if pidof "hyprsunset"; then
echo "󰖔"
else
echo "󰖕"
fi
'';
in {
home.packages = [
pkgs.hyprsunset
night-shift-on
night-shift-off
night-shift
night-shift-status
night-shift-status-icon
];
}
@@ -1,23 +1,19 @@
# - ## 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, test, 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, 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.
{
pkgs,
config,
...
}: let
inherit (config.var) configDirectory;
{ pkgs, config, inputs, ... }:
let
nixy =
pkgs.writeShellScriptBin "nixy"
configDirectory = config.var.configDirectory;
hostname = config.var.hostname;
nixy = pkgs.writeShellScriptBin "nixy"
# bash
''
EXTRA_ARGS="''${@:2}"
function exec() {
$@
}
@@ -28,11 +24,12 @@
# "icon;name;command"[]
apps=(
"󰑓;Rebuild;nixy rebuild"
"󰐊;Test;nixy test"
"󰦗;Upgrade;nixy upgrade"
"󰚰;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:
@@ -47,35 +44,35 @@
command=$(echo "$line" | sed 's/^[^;]*;//;s/^[^;]*;//')
exec "$command"
exit $?
exit 0
}
[[ $1 == "" ]] && ui
if [[ $1 == "rebuild" ]];then
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
sudo nixos-rebuild switch --flake ${configDirectory}#${hostname}
elif [[ $1 == "upgrade" ]];then
sudo nixos-rebuild switch --upgrade --flake '${configDirectory}#${hostname}'
elif [[ $1 == "update" ]];then
cd ${configDirectory} && nix flake update $EXTRA_ARGS
cd ${configDirectory} && nix flake update
elif [[ $1 == "gc" ]];then
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."
cd ${configDirectory} && sudo nix-collect-garbage -d
elif [[ $1 == "cb" ]];then
sudo /run/current-system/bin/switch-to-configuration boot
elif [[ $1 == "listgen" ]];then
sudo nix-env -p /nix/var/nix/profiles/system --list-generations
elif [[ $1 == "remote" ]];then
cd ~/.config/nixos && git add . && git commit -m "update" && git push
ssh jack -S -C "cd /home/hadi/.config/nixos && git pull && sudo -S nixos-rebuild switch --flake ~/.config/nixos#jack"
elif [[ $1 == "loop" ]];then
while true; do
nixy
echo "Press enter to continue, e to exit"
read -n 1 REPLY
clear
[[ $REPLY == "e" ]] && exit 0
done
else
echo "Unknown argument"
fi
'';
in {home.packages = [nixy];}
in { home.packages = [ nixy ]; }
+26
View File
@@ -0,0 +1,26 @@
{ pkgs, ... }:
let
notif = pkgs.writeShellScriptBin "notif" # bash
''
# Shell script to send custom notifications
# Usage: notif "sender_id" "message" ["description"]
NOTIF_FOLDER="/tmp/notif"
sender_id=$1 # To overwrite existing notifications
title=$2
description=$3
[[ -d "$NOTIF_FOLDER" ]] || mkdir $NOTIF_FOLDER
[[ -f "$NOTIF_FOLDER/$sender_id" ]] || (echo "0" > "$NOTIF_FOLDER/$sender_id")
old_notification_id=$(cat "$NOTIF_FOLDER/$sender_id")
[[ -z "$old_notification_id" ]] && old_notification_id=0
${pkgs.libnotify}/bin/notify-send \
--replace-id="$old_notification_id" --print-id \
--app-name="$sender_id" \
"$title" \
"$description" \
> "$NOTIF_FOLDER/$sender_id"
'';
in { home.packages = [ pkgs.libnotify notif ]; }
+37
View File
@@ -0,0 +1,37 @@
# - ## 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
{ pkgs, ... }:
let
id = "home"; # ID of the connection
password-file = "/home/hadi/.config/vpn-password";
openvpn-up = pkgs.writeShellScriptBin "openvpn-up"
# bash
''
nmcli con up id ${id} passwd-file ${password-file}
notif "VPN" "VPN activated" "The OpenVPN connection to ${id} has been activated"
'';
openvpn-down = pkgs.writeShellScriptBin "openvpn-down"
# bash
''
nmcli con down id ${id}
notif "VPN" "VPN deactivated" "The OpenVPN connection to ${id} has been deactivated"
'';
openvpn-toggle = pkgs.writeShellScriptBin "openvpn-toggle"
# bash
''
if nmcli connection show --active | grep -q "${id}"; then
openvpn-down
else
openvpn-up
fi
'';
in { home.packages = [ openvpn-up openvpn-down openvpn-toggle ]; }
+34
View File
@@ -0,0 +1,34 @@
# - ## 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.
{ pkgs, ... }:
let
screenshot = pkgs.writeShellScriptBin "screenshot" ''
if [[ $2 == "swappy" ]];then
folder="/tmp"
else
folder="$HOME/Pictures"
fi
filename="$(date +%Y-%m-%d_%H:%M:%S).png"
if [[ $1 == "window" ]];then
mode="active"
elif [[ $1 == "region" ]];then
mode="area"
elif [[ $1 == "monitor" ]];then
mode="output"
fi
${pkgs.grimblast}/bin/grimblast --notify --freeze copysave $mode "$folder/$filename" || exit 1
if [[ $2 == "swappy" ]];then
${pkgs.swappy}/bin/swappy -f "$folder/$filename" -o "$HOME/Pictures/$filename"
exit 0
fi
'';
in {
home.packages =
[ pkgs.hyprshot screenshot pkgs.slurp pkgs.grim pkgs.grimblast ];
}
+38
View File
@@ -0,0 +1,38 @@
# - ## 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.
{ pkgs, ... }:
let
increments = "5";
sound-change = pkgs.writeShellScriptBin "sound-change" ''
[[ $1 == "mute" ]] && wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle
[[ $1 == "up" ]] && wpctl set-volume @DEFAULT_AUDIO_SINK@ ''${2-${increments}}%+
[[ $1 == "down" ]] && wpctl set-volume @DEFAULT_AUDIO_SINK@ ''${2-${increments}}%-
[[ $1 == "set" ]] && wpctl set-volume @DEFAULT_AUDIO_SINK@ ''${2-100}%
'';
sound-up = pkgs.writeShellScriptBin "sound-up" ''
sound-change up ${increments}
'';
sound-set = pkgs.writeShellScriptBin "sound-set" ''
sound-change set ''${1-100}
'';
sound-down = pkgs.writeShellScriptBin "sound-down" ''
sound-change down ${increments}
'';
sound-toggle = pkgs.writeShellScriptBin "sound-toggle" ''
sound-change mute
'';
in {
home.packages = [ sound-change sound-up sound-down sound-toggle sound-set ];
}
+112
View File
@@ -0,0 +1,112 @@
# - ## System
#-
#- Usefull quick scripts
#-
#- - `menu` - Open wofi with drun mode. (wofi)
#- - `powermenu` - Open power dropdown menu. (wofi)
#- - `lock` - Lock the screen. (hyprlock)
{ pkgs, ... }:
let
menu = pkgs.writeShellScriptBin "menu"
# bash
''
if pgrep wofi; then
pkill wofi
else
wofi -p " Apps" --show drun
fi
# if pgrep tofi; then
# pkill tofi
# else
# tofi-drun --drun-launch=true
# fi
'';
powermenu = pkgs.writeShellScriptBin "powermenu"
# bash
''
if pgrep wofi; then
pkill wofi
# if pgrep tofi; then
# pkill tofi
else
options=(
"󰌾 Lock"
"󰍃 Logout"
" Suspend"
"󰑐 Reboot"
"󰿅 Shutdown"
)
selected=$(printf '%s\n' "''${options[@]}" | wofi -p " Powermenu" --dmenu)
# selected=$(printf '%s\n' "''${options[@]}" | tofi --prompt-text "> ")
selected=''${selected:2}
case $selected in
"Lock")
${pkgs.hyprlock}/bin/hyprlock
;;
"Logout")
hyprctl dispatch exit
;;
"Suspend")
systemctl suspend
;;
"Reboot")
systemctl reboot
;;
"Shutdown")
systemctl poweroff
;;
esac
fi
'';
quickmenu = pkgs.writeShellScriptBin "quickmenu"
# bash
''
if pgrep wofi; then
pkill wofi
# if pgrep tofi; then
# pkill tofi
else
options=(
"󰅶 Caffeine"
"󰖔 Night-shift"
" Nixy"
"󰈊 Hyprpicker"
"󰖂 Toggle VPN"
)
selected=$(printf '%s\n' "''${options[@]}" | wofi -p " Quickmenu" --dmenu)
# selected=$(printf '%s\n' "''${options[@]}" | tofi --prompt-text "> ")
selected=''${selected:2}
case $selected in
"Caffeine")
caffeine
;;
"Night-shift")
night-shift
;;
"Nixy")
kitty zsh -c nixy
;;
"Hyprpicker")
sleep 0.2 && ${pkgs.hyprpicker}/bin/hyprpicker -a
;;
"Toggle VPN")
openvpn-toggle
;;
esac
fi
'';
lock = pkgs.writeShellScriptBin "lock"
# bash
''
${pkgs.hyprlock}/bin/hyprlock
'';
in { home.packages = [ menu powermenu lock quickmenu ]; }

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