Compare commits

..

139 Commits

Author SHA1 Message Date
4144c14868 chore: fmt 2025-11-22 17:35:42 +08:00
1417822aa6 feat: add garnix cache 2025-11-22 17:35:24 +08:00
3ea322dd0f chore: update flake.lock 2025-11-22 17:35:10 +08:00
86c85676ea chore: update secrets 2025-11-16 14:23:58 +08:00
b302abb724 feat(distrobox): add nvim 2025-11-15 19:49:28 +08:00
4817576834 chore: fmt 2025-11-15 19:49:13 +08:00
0683ced027 feat: upgrade noctalia-shell 2025-11-15 19:48:55 +08:00
cec8f7897a chore: update secrets 2025-11-15 19:48:22 +08:00
78a062432f chore: update secrets 2025-11-15 19:47:47 +08:00
4f77ac9385 chore: drop mpd 2025-11-15 15:43:43 +08:00
73e490f523 feat: upgrade go-musicfox 2025-11-15 15:42:54 +08:00
12c381da5f fmt: trailing LF 2025-11-15 15:08:20 +08:00
23a24820c5 chore: update secrets 2025-11-15 14:55:38 +08:00
d6e0b0ef96 feat(server/nextcloud): upgrade to 32 2025-11-15 14:55:38 +08:00
ef913abe9e feat: secure frp server address 2025-11-15 14:55:38 +08:00
4d0cd7b1e7 chore: update flake.lock; use treefmt 2025-11-15 14:54:08 +08:00
9482ba860f feat(imxyy-nix): use distrobox 2025-11-08 23:53:50 +08:00
44aca8ce69 feat(noctalia): update settings 2025-11-02 15:42:10 +08:00
792aaa20d5 fmt: LF at end of file 2025-11-02 15:41:15 +08:00
959956409d chore: update flake.lock; prepare for 25.11 migration 2025-11-01 21:05:31 +08:00
41969ab2e0 feat(noctalia): mm月dd日 -> mm/dd 2025-10-26 13:52:24 +08:00
e228fdc222 feat(style/gtk): use Adwaita Sans 2025-10-26 13:51:45 +08:00
6bc50deb6a refactor: font config 2025-10-26 13:44:36 +08:00
090677e101 feat(server): disable media related cli 2025-10-19 16:20:55 +08:00
8ae8e6f9b1 feat(server/nextcloud): drop nginx.recommendedHeaders 2025-10-19 16:20:15 +08:00
3acd90bbdd feat: update README.md 2025-10-18 22:16:59 +08:00
e9204bb2f5 feat(desktop): migrate to noctalia-shell, drop unused softwares 2025-10-18 22:16:33 +08:00
362d610f1d refactor(browser): set default browser 2025-10-18 22:15:39 +08:00
5a671c3ece feat(nvim): nvim-colorizer 2025-10-18 12:57:59 +08:00
f2111f7771 feat(noctalia): customize color theme 2025-10-18 12:57:07 +08:00
c71710867f feat(niri): use noctalia shell 2025-10-18 10:17:49 +08:00
465eb3c608 refactor(flake.nix): use nested flake input 2025-10-18 01:08:43 +08:00
9696d4f343 chore: update flake.lock 2025-10-18 01:04:48 +08:00
4218dbeb80 feat(langs/js): use pnpm 2025-10-17 19:52:40 +08:00
c167e3ac64 feat(cli): use fastfetch 2025-10-07 11:49:15 +08:00
f07598688f chore(nvim): tidy 2025-10-04 14:55:23 +08:00
e696472c5b feat(nvim): glance.nvim 2025-10-04 14:54:36 +08:00
dcfd134a4e feat(nvim): close nvim-tree when its the only window left 2025-10-04 14:53:46 +08:00
77d0a1c449 feat: add .lazy.lua to setup lazydev.nvim 2025-10-04 13:03:34 +08:00
7b1044214f feat: add .editorconfig 2025-10-04 13:03:24 +08:00
faba8a05e6 refactor: my.home -> my.hm for disambiguilty (e.g. my.home.home) 2025-10-03 22:17:36 +08:00
1eaee50e82 feat(nvim): enable exrc; drop unused file 2025-10-02 16:45:19 +08:00
763c55b68e chore: update secrets 2025-10-02 16:42:41 +08:00
95fc23da50 feat(server/minio): drop caddy reverse proxy 2025-10-02 16:42:10 +08:00
a6006d362d chore(server): drop headscale 2025-10-02 16:40:51 +08:00
57cc21a1cd feat(server/tuwunel): suppress_when_active 2025-10-02 16:40:24 +08:00
e78a3af90c feat(server): HF-plant 2025-10-02 16:28:07 +08:00
3652579508 chore: update flake.lock 2025-10-01 14:54:49 +08:00
1036d4ce0b feat: evince -> papers 2025-09-21 13:08:03 +08:00
354525129e chore: update flake.lock 2025-09-21 13:07:50 +08:00
7e9875ac38 fix: remove non-existent xmcl 2025-09-20 14:19:15 +08:00
a9089d81b1 fix(efl): tuwunel delegation 2025-09-20 14:16:05 +08:00
d61cd261e0 chore: update secrets 2025-09-14 11:11:46 +08:00
3f206e08c2 feat: init efl 😋 2025-09-14 11:11:27 +08:00
2677ed4594 fix(server/dns): loop 2025-09-14 11:10:11 +08:00
905274fe73 chore: update flake.lock 2025-09-14 11:09:26 +08:00
23b30d3a84 chore: update flake.lock 2025-09-05 19:40:00 +08:00
5bead3c20f chore: update secrets 2025-08-29 19:55:53 +08:00
dd2f880a3b feat: mautirx-telegram 2025-08-29 19:55:31 +08:00
1869ae86f1 refactor: custom packages 2025-08-29 13:01:46 +08:00
b7d6cd3dbf fix(waybar): incorrect mode config (dropping it has not effect) 2025-08-29 13:01:46 +08:00
900b66796b feat(niri): customize insert hint 2025-08-29 13:01:46 +08:00
44a479d6b4 fix(hmcl): wrap hmcl to fix config file persistence 2025-08-29 13:01:46 +08:00
b5dca35878 feat(server): drop unused web services 2025-08-29 13:01:46 +08:00
a1fa09008b feat(imxyy-nix): persist waydroid 2025-08-29 12:56:20 +08:00
375c9b59b9 feat(imxyy-nix): persist claude code 2025-08-29 12:55:58 +08:00
90f0b4aa63 fix(nvim): rust-analyzer config
It has been broken for thousands of years.
2025-08-26 21:52:08 +08:00
fba506e06d feat(imxyy-nix/keyd): use side button to replace right button
my mouse 😭
2025-08-24 21:50:28 +08:00
8b303fb0f0 feat(niri): prevent waybar black corners
ref: 05337ce855
2025-08-24 21:50:28 +08:00
49bbfe094a feat(niri): use gnome polkit agent 2025-08-24 21:50:28 +08:00
3c5c96d623 chore: update flake.lock; drop NUR 2025-08-24 21:50:28 +08:00
5a5fb9a426 feat: use nautilus instead of nemo 2025-08-24 21:50:28 +08:00
82ba9038ed feat(gtk/theme): use Adwaita 2025-08-24 21:50:28 +08:00
d22d597cf1 feat(nix): disable auto store optimisation to speed up input fetching 2025-08-24 21:50:28 +08:00
c61b1e8961 feat(nvim): prevent accidental <S-up> and <S-down> 2025-08-24 21:50:28 +08:00
475acb7fd1 feat: waydroid 2025-08-24 21:50:28 +08:00
3ef2f7da09 feat: fractal 2025-08-24 21:50:28 +08:00
fbc5a9ee8e feat(tuwunel): turn server 2025-08-17 00:35:00 +08:00
f46ad8a2f3 feat: revive minecraft server 😋 2025-08-17 00:02:32 +08:00
c14a3682ff fix(tuwunel): delegation 2025-08-17 00:02:01 +08:00
f4a0e2a862 fix: nextcloud mount 2025-08-16 23:13:23 +08:00
df589d6797 feat: update go-musicfox 2025-08-16 23:13:01 +08:00
1da80c49db fix(fcitx5/overlay): qq 2025-08-15 20:12:42 +08:00
8080d174ae chore: update flake.lock 2025-08-15 16:52:24 +08:00
0d39e2869b feat(wine): disable by default 2025-08-15 16:51:48 +08:00
953952f345 feat: disable minecraft server 😭 2025-08-15 16:51:23 +08:00
1f60272f14 feat: matrix-tuwunel 😋 2025-08-15 16:50:49 +08:00
e5474ffd29 feat(niri): maximize by default 2025-08-14 22:18:04 +08:00
dec6db7e8e feat: element-desktop 2025-08-14 21:19:47 +08:00
a966a7e81f feat(x16): moonlight 2025-08-14 21:19:34 +08:00
67b27c4079 chore: update flake.lock 2025-08-13 09:19:53 +08:00
e958163479 feat(nvim): move language servers to each language's .nix file 2025-08-13 09:18:49 +08:00
90cd4bdd84 feat(sddm): use cattpuccin 2025-08-12 12:50:46 +08:00
e1e3e96626 feat(niri): brightnessctl 2025-08-12 09:03:19 +08:00
16f11262ff feat(imxyy-nix-x16): persist gemini and claude 2025-08-12 09:02:50 +08:00
a2b63259ed feat(imxyy-nix-x16): power management 2025-08-12 09:02:03 +08:00
ab539b82ca fix(fcitx5/overlay): drop unecessary phases 2025-08-09 20:18:27 +08:00
05c2bc3627 fix(waybar): icon 2025-08-07 11:14:57 +08:00
464a162703 feat: rework fcitx5 overlay, avoid rebuild 2025-08-04 20:46:41 +08:00
8385671c4f chore: drop unused packages 2025-08-04 20:45:39 +08:00
433e26edaa feat: unfollow nixpkgs for niri, use binary cache; update flake.lock 2025-08-04 20:44:10 +08:00
c28d386c29 feat: persist gemini 2025-08-04 10:24:02 +08:00
a149d2a3df feat(cli): comma 2025-08-02 21:02:00 +08:00
ea02f5b023 chore: drop unused custom packages 2025-08-02 20:29:46 +08:00
bf904ec38a feat(fcitx5): update overlay 2025-08-02 18:25:02 +08:00
c419ac3a30 fix(nix): github token 2025-08-02 18:06:22 +08:00
244844242f feat(langs): java 2025-08-02 18:05:56 +08:00
f730d8d118 fix(zsh): use xdg.configHome in zdotdir 2025-08-02 18:05:09 +08:00
590343e5eb feat: update flake.lock; update sops-nix to use ssh key 2025-08-02 18:04:22 +08:00
5da17890cb feat(langs/rust): add ~/.cargo/bin to PATH 2025-07-30 22:34:51 +08:00
52692a4a47 feat(fcitx5): update overlay 2025-07-30 22:28:40 +08:00
f2cb379100 feat: prefer sjtug mirror over sjtu mirror due to stability 2025-07-30 22:28:23 +08:00
e6a2690baa feat: tidy 2025-07-27 22:11:59 +08:00
f642f9c9cc fix(server): qemu & virtio 2025-07-27 21:46:55 +08:00
7d08e1f5ef feat(audio): move to pipewire 2025-07-27 21:45:50 +08:00
3cb73506f1 chore: drop cava 2025-07-27 21:36:15 +08:00
4be7cd0c0f feat(btreset): use usbutils/usbreset 2025-07-27 20:51:58 +08:00
2d038b2ae2 feat(niri): disable auto scroll 2025-07-27 20:47:51 +08:00
dd8afc8954 refactor: overlay 2025-07-26 12:34:11 +08:00
e69600cc77 chore: update flake.lock 2025-07-26 12:33:07 +08:00
17ef457181 chore: drop unused softwares 2025-07-26 12:22:06 +08:00
a39b966a91 refactor: fcitx5 overlay 2025-07-26 12:19:59 +08:00
a0b044dbc9 feat(starship): speedup jj prompt 2025-07-24 21:48:43 +08:00
94764e7a5a feat: television (fuzzy finder) 2025-07-22 21:28:47 +08:00
fef786d317 feat(nix): github token 2025-07-22 21:28:27 +08:00
8ca0a6cc0f refactor: sops-nix 2025-07-22 21:21:41 +08:00
3263d72b59 feat(server): memos 2025-07-22 17:07:47 +08:00
1c7e5b9f05 feat(jj): set conflict-marker-style 2025-07-22 16:43:25 +08:00
1da34bf704 fix(headscale): RestartSec conflict 2025-07-22 16:43:25 +08:00
88107f9fe7 feat(server): authorize imxyy-nix-x16 2025-07-22 16:43:25 +08:00
5d1f622782 fix: immich 2025-07-22 16:42:43 +08:00
0ed99176ad chore: update flake.lock 2025-07-22 15:51:48 +08:00
4dddb0e803 chore(nvim): drop outdated config 2025-07-22 15:17:31 +08:00
4353f9da34 feat: qtct 2025-07-22 12:36:00 +08:00
66e772ce62 fix: imxyy-nix-x16 2025-07-18 23:57:21 +08:00
422259838b fix(imxyy-nix-server): NAS 2025-07-13 13:35:01 +08:00
390e75ce8e feat(imxyy-nix-x16/niri): scale 2025-07-13 13:34:44 +08:00
a3b627359b fix: systemd service restart 2025-07-13 13:31:48 +08:00
be75d12e9c chore(niri): update flake.lock 2025-07-13 13:17:18 +08:00
233 changed files with 2159 additions and 18681 deletions

13
.editorconfig Normal file
View File

@@ -0,0 +1,13 @@
root = true
[*]
indent_style = space
end_of_line = lf
charset = utf-8
insert_final_newline = false
[*.{nix,lua,yaml,css}]
indent_size = 2
[Makefile]
indent_size = 4

21
.lazy.lua Normal file
View File

@@ -0,0 +1,21 @@
return {
{
"folke/lazydev.nvim",
ft = "lua",
opts = {
library = {
{ path = "${3rd}/luv/library", words = { "vim%.uv" } },
},
},
},
{
"hrsh7th/nvim-cmp",
opts = function(_, opts)
opts.sources = opts.sources or {}
table.insert(opts.sources, {
name = "lazydev",
group_index = 0,
})
end,
},
}

View File

@@ -1,13 +1,11 @@
keys: keys:
- &imxyy-nix age1jf5pg2x6ta8amj40xdy0stvcvrdlkwc2nrwtmkpymu0qclk0eg5qmm9kns - &imxyy-nix ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOEFLUkyeaK8ZPPZdVNEmtx8zvoxi7xqS2Z6oxRBuUPO
- &imxyy-nix-server age1hpgg6psejh4y6jcdd34wxuml75fnweqpe0kh8376yqsctsfn9qxs037kk6 - &imxyy-nix-server ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB28jpN+h5euh3NtdN+A+EtqgIatC22e4i1TPTioKire
- &imxyy-nix-x16 age1r0fv0tagxupfacv0aaxk5ss7sqvswv6kq8tk3x46ndqrj6f5afvqegahxq - &imxyy-nix-x16 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMb5G/ieEYBOng66YeyttBQLThyM6W//z2POsNyq4Rw/
- &imxyy-cloudwin age1tp7th3rrv3x0l6jl76n0hjqjp223w2y586pkgr0hcjwdm254jd5shkj6a8
creation_rules: creation_rules:
- path_regex: secrets/.*\.(yaml|toml|json|env|dae|txt|conf)$ - path_regex: secrets/.*\..*
key_groups: key_groups:
- age: - age:
- *imxyy-nix - *imxyy-nix
- *imxyy-nix-server - *imxyy-nix-server
- *imxyy-nix-x16 - *imxyy-nix-x16
- *imxyy-cloudwin

View File

@@ -25,19 +25,17 @@ As for Flakes, refer to
## Components ## Components
| | NixOS(Wayland) | | | NixOS(Wayland) |
| ----------------------------- | :------------------------------------------------------ | | ----------------------------- | :------------------------------------------- |
| **Window Manager** | Niri | | **Window Manager** | Niri |
| **Terminal Emulator** | Alacritty & Kitty & Foot & Ghostty | | **Desktop Shell** | Noctalia Shell |
| **Bar** | Waybar | | **Terminal Emulator** | Kitty |
| **Application Launcher** | wofi |
| **Notification Daemon** | SwayNotificationCenter |
| **Input method framework** | Fcitx5 | | **Input method framework** | Fcitx5 |
| **Shell** | Zsh | | **Shell** | Zsh |
| **Netease Cloudmusic Player** | go-musicfox | | **Netease Cloudmusic Player** | go-musicfox |
| **Media Player** | mpv | | **Media Player** | mpv |
| **Text Editor** | Neovim | | **Text Editor** | Neovim |
| **Fonts** | Noto Sans CJK & Jetbrains Mono & Nerd Font | | **Fonts** | Noto Sans CJK & Jetbrains Mono & Nerd Font |
| **Filesystem** | btrfs subvolumes, clean '/' every boot for impermanence | | **Filesystem** | Btrfs |
And more... And more...

BIN
assets/avatar.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

View File

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 25 KiB

View File

@@ -1,4 +1,8 @@
{ config, hostname, ... }: {
config,
hostname,
...
}:
{ {
# I prefer this to the default issue text # I prefer this to the default issue text
# ported from ArchLinux IIRC # ported from ArchLinux IIRC
@@ -11,7 +15,7 @@
systemd.services."systemd-machine-id-commit".enable = !config.my.persist.enable; systemd.services."systemd-machine-id-commit".enable = !config.my.persist.enable;
my = { my = {
home = { hm = {
# nicely reload system units when changing configs # nicely reload system units when changing configs
systemd.user.startServices = "sd-switch"; systemd.user.startServices = "sd-switch";
home.stateVersion = "24.11"; home.stateVersion = "24.11";

View File

@@ -4,7 +4,7 @@
enable = true; enable = true;
host = "127.0.0.1"; host = "127.0.0.1";
port = 8089; port = 8089;
package = pkgs.stable.open-webui; package = pkgs.open-webui;
}; };
services.caddy.virtualHosts."ai.imxyy.top" = { services.caddy.virtualHosts."ai.imxyy.top" = {
extraConfig = '' extraConfig = ''

View File

@@ -1,13 +1,12 @@
{ {
config, config,
lib,
pkgs, pkgs,
sopsRoot, secrets,
... ...
}: }:
{ {
sops.secrets.et-imxyy-nix-server-nixremote = { sops.secrets.et-imxyy-nix-server-nixremote = {
sopsFile = sopsRoot + /et-imxyy-nix-server-nixremote.toml; sopsFile = secrets.et-imxyy-nix-server-nixremote;
format = "binary"; format = "binary";
}; };
environment.systemPackages = [ pkgs.easytier ]; environment.systemPackages = [ pkgs.easytier ];
@@ -15,10 +14,8 @@
enable = true; enable = true;
script = "${pkgs.easytier}/bin/easytier-core -c ${config.sops.secrets.et-imxyy-nix-server-nixremote.path}"; script = "${pkgs.easytier}/bin/easytier-core -c ${config.sops.secrets.et-imxyy-nix-server-nixremote.path}";
serviceConfig = { serviceConfig = {
Restart = lib.mkOverride 500 "always"; Restart = "always";
RestartMaxDelaySec = lib.mkOverride 500 "1m"; RestartSec = 30;
RestartSec = lib.mkOverride 500 "100ms";
RestartSteps = lib.mkOverride 500 9;
User = "root"; User = "root";
}; };
wantedBy = [ "multi-user.target" ]; wantedBy = [ "multi-user.target" ];
@@ -37,6 +34,7 @@
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBWOy0QmAyxENg/O5m3cus8U3c9jCLioivwcWsh5/a82 imxyy-hisense-pad" "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBWOy0QmAyxENg/O5m3cus8U3c9jCLioivwcWsh5/a82 imxyy-hisense-pad"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIK8pivvE8PMtsOxmccfNhH/4KehDKhBfUfJbQZxo/SZT imxyy-ace5" "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIK8pivvE8PMtsOxmccfNhH/4KehDKhBfUfJbQZxo/SZT imxyy-ace5"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKALTBn/QSGcSPgMg0ViSazFcaA0+nEF05EJpjbsI6dE imxyy_soope_@imxyy-cloudwin" "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKALTBn/QSGcSPgMg0ViSazFcaA0+nEF05EJpjbsI6dE imxyy_soope_@imxyy-cloudwin"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMb5G/ieEYBOng66YeyttBQLThyM6W//z2POsNyq4Rw/ imxyy@imxyy-nix-x16"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIENauvvhVMLsUwH9cPYsvnOg7VCL3a4yEiKm8I524TE efl@efl-nix" "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIENauvvhVMLsUwH9cPYsvnOg7VCL3a4yEiKm8I524TE efl@efl-nix"
]; ];

View File

@@ -7,9 +7,7 @@
} }
]; ];
services.postgresql.ensureDatabases = [ "coder" ]; services.postgresql.ensureDatabases = [ "coder" ];
virtualisation.oci-containers = { virtualisation.oci-containers.containers.coder = {
containers = {
coder = {
image = "ghcr.io/coder/coder:latest"; image = "ghcr.io/coder/coder:latest";
environment = { environment = {
CODER_ACCESS_URL = "https://coder.imxyy.top"; CODER_ACCESS_URL = "https://coder.imxyy.top";
@@ -26,8 +24,6 @@
]; ];
ports = [ "8086:8086" ]; ports = [ "8086:8086" ];
}; };
};
};
services.caddy.virtualHosts."coder.imxyy.top" = { services.caddy.virtualHosts."coder.imxyy.top" = {
extraConfig = '' extraConfig = ''
reverse_proxy :8086 { reverse_proxy :8086 {

View File

@@ -15,7 +15,6 @@
./vault.nix ./vault.nix
./homepage.nix ./homepage.nix
./code.nix ./code.nix
./yesplaymusic.nix
./ai.nix ./ai.nix
./grafana.nix ./grafana.nix
./note.nix ./note.nix
@@ -23,5 +22,8 @@
./minio.nix ./minio.nix
./build.nix ./build.nix
./immich.nix ./immich.nix
./efl.nix
./plant.nix
]; ];
} }

View File

@@ -5,5 +5,10 @@
enable = true; enable = true;
dockerCompat = true; dockerCompat = true;
dockerSocket.enable = true; dockerSocket.enable = true;
defaultNetwork.settings.dns_enabled = true;
};
# avoid collision with dnsmasq
virtualisation.containers = {
containersConf.settings.network.dns_bind_port = 5353;
}; };
} }

View File

@@ -0,0 +1,54 @@
{ config, secrets, ... }:
{
sops.secrets.efl-tuwunel-env = {
sopsFile = secrets.efl-tuwunel;
format = "dotenv";
};
virtualisation.oci-containers.containers = {
tuwunel = {
image = "jevolk/tuwunel:latest";
volumes = [
"tuwunel_db:/var/lib/tuwunel"
];
ports = [ "6167:6167" ];
networks = [ "podman" ];
environment = {
TUWUNEL_SERVER_NAME = "mtx.eflx.top";
TUWUNEL_PORT = "6167";
TUWUNEL_ADDRESS = "0.0.0.0";
TUWUNEL_WELL_KNOWN__SERVER = "mtx.eflx.top:443";
TUWUNEL_WELL_KNOWN__CLIENT = "https://mtx.eflx.top";
};
environmentFiles = [
config.sops.secrets.efl-tuwunel-env.path
];
};
mautrix-telegram = {
image = "dock.mau.dev/mautrix/telegram:latest";
ports = [ "8099:8099" ];
networks = [ "podman" ];
extraOptions = [ "--ip=10.88.0.254" ];
volumes = [ "/var/lib/efl-mautrix-telegram:/data" ];
};
send = {
image = "lanol/filecodebox:latest";
ports = [ "12345:12345" ];
volumes = [ "/var/lib/send:/app/data:rw" ];
};
};
services.caddy.virtualHosts."mtx.eflx.top" = {
extraConfig = ''
reverse_proxy :6167 {
header_up X-Real-IP {remote_host}
}
'';
};
services.caddy.virtualHosts."send.eflx.top" = {
extraConfig = ''
reverse_proxy :12345 {
header_up X-Real-IP {remote_host}
}
'';
};
}

View File

@@ -1,11 +1,13 @@
{ ... }: { lib, ... }:
{ {
my = { my = {
cli.all.enable = true; cli.all.enable = true;
cli.media.all.enable = lib.mkForce false;
coding.editor.neovim.enable = true; coding.editor.neovim.enable = true;
coding.misc.enable = true; coding.misc.enable = true;
coding.langs.lua.enable = true; coding.langs.lua.enable = true;
coding.langs.rust.enable = true; coding.langs.rust.enable = true;
fonts.enable = lib.mkForce false;
persist = { persist = {
enable = true; enable = true;
homeDirs = [ homeDirs = [

View File

@@ -1,15 +1,11 @@
{ {
virtualisation.oci-containers = { virtualisation.oci-containers.containers.sun-panel = {
containers = {
sun-panel = {
image = "hslr/sun-panel:latest"; image = "hslr/sun-panel:latest";
volumes = [ volumes = [
"/var/lib/sun-panel:/app/conf" "/var/lib/sun-panel:/app/conf"
]; ];
ports = [ "8085:3002" ]; ports = [ "8085:3002" ];
}; };
};
};
services.caddy.virtualHosts."home.imxyy.top" = { services.caddy.virtualHosts."home.imxyy.top" = {
extraConfig = '' extraConfig = ''
reverse_proxy :8085 reverse_proxy :8085

View File

@@ -1,5 +1,9 @@
{ ... }: { ... }:
{ {
users.users.immich = {
home = "/mnt/nas/immich";
createHome = true;
};
services.immich = { services.immich = {
enable = true; enable = true;
host = "127.0.0.1"; host = "127.0.0.1";

View File

@@ -1,46 +1,104 @@
{ {
services.matrix-synapse = { config,
enable = true; secrets,
settings = { ...
server_name = "matrix.imxyy.top"; }:
public_baseurl = "https://matrix.imxyy.top";
listeners = [
{ {
port = 8094; nixpkgs.config.permittedInsecurePackages = [
bind_addresses = [ "127.0.0.1" ]; "olm-3.2.16"
type = "http";
tls = false;
x_forwarded = true;
resources = [
{
names = [
"client"
"federation"
]; ];
compress = true; sops.secrets.tuwunel-reg-token = {
} sopsFile = secrets.tuwunel-reg-token;
]; format = "binary";
} owner = config.services.matrix-tuwunel.user;
]; group = config.services.matrix-tuwunel.group;
turn_uris = [ "turns:vkvm.imxyy.top:5349" ];
turn_shared_secret = "ac779a48c03bb451839569d295a29aa6ab8c264277bec2df9c9c7f5e22936288";
turn_user_lifetime = "1h";
database_type = "psycopg2";
database_args.database = "matrix-synapse";
}; };
extraConfigFiles = [ sops.secrets.tuwunel-turn-secret = {
"/var/lib/matrix-synapse/secret" sopsFile = secrets.tuwunel-turn-secret;
format = "binary";
owner = config.services.matrix-tuwunel.user;
group = config.services.matrix-tuwunel.group;
};
services.matrix-tuwunel = {
enable = true;
settings.global = {
address = [ "127.0.0.1" ];
port = [ 8094 ];
server_name = "imxyy.top";
well_known = {
server = "matrix.imxyy.top:443";
client = "https://matrix.imxyy.top";
};
allow_registration = true;
registration_token_file = config.sops.secrets.tuwunel-reg-token.path;
suppress_push_when_active = true;
turn_uris = [
"turn:hk.vkvm.imxyy.top?transport=udp"
"turn:hk.vkvm.imxyy.top?transport=tcp"
]; ];
turn_secret_file = config.sops.secrets.tuwunel-turn-secret.path;
new_user_displayname_suffix = "";
};
};
services.caddy.virtualHosts."imxyy.top" = {
extraConfig = ''
handle /.well-known/matrix/server {
header Content-Type application/json
header "Access-Control-Allow-Origin" "*"
respond `{"m.server": "matrix.imxyy.top:443"}` 200
}
handle /.well-known/matrix/client {
header Content-Type application/json
header "Access-Control-Allow-Origin" "*"
respond `{"m.homeserver": {"base_url": "https://matrix.imxyy.top/"}}` 200
}
'';
}; };
services.caddy.virtualHosts."matrix.imxyy.top" = { services.caddy.virtualHosts."matrix.imxyy.top" = {
extraConfig = '' extraConfig = ''
reverse_proxy :8094 reverse_proxy :8094
handle_path /_matrix {
reverse_proxy :8094
}
handle_path /_synapse/client {
reverse_proxy :8094
}
''; '';
}; };
sops.secrets.mautrix-telegram = {
sopsFile = secrets.mautrix-telegram;
format = "dotenv";
owner = "mautrix-telegram";
group = "mautrix-telegram";
};
services.mautrix-telegram = {
enable = true;
environmentFile = config.sops.secrets.mautrix-telegram.path;
settings = {
homeserver = {
address = "http://127.0.0.1:8094";
domain = "imxyy.top";
};
appservice = {
address = "http://127.0.0.1:8098";
hostname = "127.0.0.1";
port = "8098";
bot_username = "telegrambot";
};
bridge = {
username_template = "telegram_{userid}";
alias_template = "telegram_{groupname}";
displayname_template = "{displayname} (Telegram)";
permissions = {
"@imxyy_soope_:imxyy.top" = "admin";
};
};
telegram = {
# borrowed from https://github.com/telegramdesktop/tdesktop/blob/9bdc19e2fd4d497c8f403891848383a88faadc25/snap/snapcraft.yaml#L134-L135
api_id = "611335";
api_hash = "d524b414d21f4d37f08684c1df41ac9c";
};
};
};
} }

View File

@@ -8,9 +8,10 @@
WorkingDirectory = "/opt/minecraft/fabric1.20.6"; WorkingDirectory = "/opt/minecraft/fabric1.20.6";
ExecStart = "${lib.getExe' pkgs.openjdk21 "java"} -Xms1G -Xmx5G -jar fabric-server-mc.1.20.6-loader.0.15.11-launcher.1.0.1.jar"; ExecStart = "${lib.getExe' pkgs.openjdk21 "java"} -Xms1G -Xmx5G -jar fabric-server-mc.1.20.6-loader.0.15.11-launcher.1.0.1.jar";
Restart = "always"; Restart = "always";
RestartSec = "10s"; RestartSec = 120;
}; };
}; };
my.persist = { my.persist = {
nixosDirs = [ nixosDirs = [
"/opt/minecraft" "/opt/minecraft"

View File

@@ -1,7 +1,7 @@
{ config, sopsRoot, ... }: { config, secrets, ... }:
{ {
sops.secrets.minio-env = { sops.secrets.minio-env = {
sopsFile = sopsRoot + /minio.env; sopsFile = secrets.minio;
format = "dotenv"; format = "dotenv";
}; };
services.minio = { services.minio = {
@@ -16,11 +16,4 @@
]; ];
rootCredentialsFile = config.sops.secrets.minio-env.path; rootCredentialsFile = config.sops.secrets.minio-env.path;
}; };
services.caddy.virtualHosts."minio.imxyy.top" = {
extraConfig = ''
handle_path /* {
reverse_proxy :9000
}
'';
};
} }

View File

@@ -3,7 +3,7 @@
lib, lib,
pkgs, pkgs,
username, username,
sopsRoot, secrets,
... ...
}: }:
{ {
@@ -131,26 +131,29 @@
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOEFLUkyeaK8ZPPZdVNEmtx8zvoxi7xqS2Z6oxRBuUPO imxyy@imxyy-nix" "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOEFLUkyeaK8ZPPZdVNEmtx8zvoxi7xqS2Z6oxRBuUPO imxyy@imxyy-nix"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBWOy0QmAyxENg/O5m3cus8U3c9jCLioivwcWsh5/a82 imxyy-hisense-pad" "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBWOy0QmAyxENg/O5m3cus8U3c9jCLioivwcWsh5/a82 imxyy-hisense-pad"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIK8pivvE8PMtsOxmccfNhH/4KehDKhBfUfJbQZxo/SZT imxyy-ace5" "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIK8pivvE8PMtsOxmccfNhH/4KehDKhBfUfJbQZxo/SZT imxyy-ace5"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKALTBn/QSGcSPgMg0ViSazFcaA0+nEF05EJpjbsI6dE imxyy_soope_@imxyy-cloudwin" "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMb5G/ieEYBOng66YeyttBQLThyM6W//z2POsNyq4Rw/ imxyy@imxyy-nix-x16"
]; ];
users.users.${username}.openssh.authorizedKeys.keys = [ users.users.${username}.openssh.authorizedKeys.keys = [
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOEFLUkyeaK8ZPPZdVNEmtx8zvoxi7xqS2Z6oxRBuUPO imxyy@imxyy-nix" "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOEFLUkyeaK8ZPPZdVNEmtx8zvoxi7xqS2Z6oxRBuUPO imxyy@imxyy-nix"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBWOy0QmAyxENg/O5m3cus8U3c9jCLioivwcWsh5/a82 imxyy-hisense-pad" "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBWOy0QmAyxENg/O5m3cus8U3c9jCLioivwcWsh5/a82 imxyy-hisense-pad"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIK8pivvE8PMtsOxmccfNhH/4KehDKhBfUfJbQZxo/SZT imxyy-ace5" "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIK8pivvE8PMtsOxmccfNhH/4KehDKhBfUfJbQZxo/SZT imxyy-ace5"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKALTBn/QSGcSPgMg0ViSazFcaA0+nEF05EJpjbsI6dE imxyy_soope_@imxyy-cloudwin" "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMb5G/ieEYBOng66YeyttBQLThyM6W//z2POsNyq4Rw/ imxyy@imxyy-nix-x16"
]; ];
sops.secrets.dae-imxyy-nix-server = { sops.secrets.dae-imxyy-nix-server = {
sopsFile = sopsRoot + /dae-imxyy-nix-server.dae; sopsFile = secrets.dae-imxyy-nix-server;
format = "binary"; format = "binary";
}; };
services.dae = { services.dae = {
enable = true; enable = true;
configFile = config.sops.secrets.dae-imxyy-nix-server.path; configFile = config.sops.secrets.dae-imxyy-nix-server.path;
}; };
systemd.services.dae.after = [ "sops-nix.service" ]; systemd.services.dae = {
after = [ "sops-nix.service" ];
serviceConfig.MemoryMax = "1G";
};
sops.secrets.mihomo = { sops.secrets.mihomo = {
sopsFile = sopsRoot + /mihomo.yaml; sopsFile = secrets.mihomo;
format = "yaml"; format = "yaml";
key = ""; key = "";
}; };
@@ -162,7 +165,7 @@
}; };
sops.secrets.frp-env = { sops.secrets.frp-env = {
sopsFile = sopsRoot + /frp.env; sopsFile = secrets.frp;
format = "dotenv"; format = "dotenv";
}; };
systemd.services.frp.serviceConfig.EnvironmentFile = [ systemd.services.frp.serviceConfig.EnvironmentFile = [
@@ -172,7 +175,7 @@
enable = true; enable = true;
role = "client"; role = "client";
settings = { settings = {
serverAddr = "hk.vkvm.imxyy.top"; serverAddr = "{{ .Envs.FRP_SERVER_ADDR }}";
serverPort = 7000; serverPort = 7000;
auth.token = "{{ .Envs.FRP_AUTH_TOKEN }}"; auth.token = "{{ .Envs.FRP_AUTH_TOKEN }}";
proxies = [ proxies = [
@@ -205,20 +208,6 @@
localPort = 443; localPort = 443;
customDomains = [ "oidc.imxyy.top" ]; customDomains = [ "oidc.imxyy.top" ];
} }
{
name = "headscale-http";
type = "http";
localIP = "127.0.0.1";
localPort = 80;
customDomains = [ "headscale.imxyy.top" ];
}
{
name = "headscale-https";
type = "https";
localIP = "127.0.0.1";
localPort = 443;
customDomains = [ "headscale.imxyy.top" ];
}
{ {
name = "mail-http"; name = "mail-http";
@@ -302,21 +291,6 @@
customDomains = [ "coder.imxyy.top" ]; customDomains = [ "coder.imxyy.top" ];
} }
{
name = "music-http";
type = "http";
localIP = "127.0.0.1";
localPort = 80;
customDomains = [ "music.imxyy.top" ];
}
{
name = "music-https";
type = "https";
localIP = "127.0.0.1";
localPort = 443;
customDomains = [ "music.imxyy.top" ];
}
{ {
name = "ai-http"; name = "ai-http";
type = "http"; type = "http";
@@ -347,21 +321,6 @@
customDomains = [ "grafana.imxyy.top" ]; customDomains = [ "grafana.imxyy.top" ];
} }
{
name = "note-http";
type = "http";
localIP = "127.0.0.1";
localPort = 80;
customDomains = [ "note.imxyy.top" ];
}
{
name = "note-https";
type = "https";
localIP = "127.0.0.1";
localPort = 443;
customDomains = [ "note.imxyy.top" ];
}
{ {
name = "siyuan-http"; name = "siyuan-http";
type = "http"; type = "http";
@@ -377,6 +336,20 @@
customDomains = [ "sy.imxyy.top" ]; customDomains = [ "sy.imxyy.top" ];
} }
{
name = "matrix-root-http";
type = "http";
localIP = "127.0.0.1";
localPort = 80;
customDomains = [ "imxyy.top" ];
}
{
name = "matrix-root-https";
type = "https";
localIP = "127.0.0.1";
localPort = 443;
customDomains = [ "imxyy.top" ];
}
{ {
name = "matrix-http"; name = "matrix-http";
type = "http"; type = "http";
@@ -408,63 +381,54 @@
} }
{ {
name = "minecraft"; name = "memo-http";
type = "tcp"; type = "http";
localIP = "127.0.0.1"; localIP = "127.0.0.1";
localPort = 25565; localPort = 80;
remotePort = 25565; customDomains = [ "memo.imxyy.top" ];
}
{
name = "memo-https";
type = "https";
localIP = "127.0.0.1";
localPort = 443;
customDomains = [ "memo.imxyy.top" ];
}
{
name = "efl-matrix-http";
type = "http";
localIP = "127.0.0.1";
localPort = 80;
customDomains = [ "mtx.eflx.top" ];
}
{
name = "efl-matrix-https";
type = "https";
localIP = "127.0.0.1";
localPort = 443;
customDomains = [ "mtx.eflx.top" ];
}
{
name = "efl-send-http";
type = "http";
localIP = "127.0.0.1";
localPort = 80;
customDomains = [ "send.eflx.top" ];
}
{
name = "efl-send-https";
type = "https";
localIP = "127.0.0.1";
localPort = 443;
customDomains = [ "send.eflx.top" ];
} }
]; ];
}; };
}; };
services.tailscale = {
enable = true;
useRoutingFeatures = "both";
extraSetFlags = [ "--accept-dns=false" ];
};
services.headscale = {
enable = true;
address = "0.0.0.0";
port = 8080;
settings = {
logtail.enabled = false;
server_url = "https://headscale.imxyy.top";
dns.magic_dns = false;
dns.override_local_dns = false;
ip_prefixes = "100.64.0.0/10";
oidc = {
only_start_if_oidc_is_available = true;
issuer = "https://oidc.imxyy.top";
client_id = "https://headscale.imxyy.top";
allowed_domains = [
"imxyy.top"
"*.imxyy.top"
];
client_secret = "";
expiry = 0;
extra_params.domain_hint = "imxyy.top";
};
};
};
systemd.services."headscale" = {
serviceConfig = {
Restart = lib.mkOverride 500 "always";
RestartMaxDelaySec = lib.mkOverride 500 "1m";
RestartSec = lib.mkOverride 500 "100ms";
RestartSteps = lib.mkOverride 500 9;
};
after = [
"podman-obligator.service"
];
requires = [
"podman-obligator.service"
];
};
sops.secrets.et-imxyy-nix-server = { sops.secrets.et-imxyy-nix-server = {
sopsFile = sopsRoot + /et-imxyy-nix-server.toml; sopsFile = secrets.et-imxyy-nix-server;
format = "binary"; format = "binary";
}; };
environment.systemPackages = [ pkgs.easytier ]; environment.systemPackages = [ pkgs.easytier ];
@@ -472,10 +436,8 @@
enable = true; enable = true;
script = "${pkgs.easytier}/bin/easytier-core -c ${config.sops.secrets.et-imxyy-nix-server.path}"; script = "${pkgs.easytier}/bin/easytier-core -c ${config.sops.secrets.et-imxyy-nix-server.path}";
serviceConfig = { serviceConfig = {
Restart = lib.mkOverride 500 "always"; Restart = "always";
RestartMaxDelaySec = lib.mkOverride 500 "1m"; RestartSec = 30;
RestartSec = lib.mkOverride 500 "100ms";
RestartSteps = lib.mkOverride 500 9;
User = "root"; User = "root";
}; };
wantedBy = [ "multi-user.target" ]; wantedBy = [ "multi-user.target" ];
@@ -485,9 +447,7 @@
]; ];
}; };
virtualisation.oci-containers = { virtualisation.oci-containers.containers.obligator = {
containers = {
obligator = {
image = "anderspitman/obligator:latest"; image = "anderspitman/obligator:latest";
volumes = [ volumes = [
"/var/lib/obligator:/data" "/var/lib/obligator:/data"
@@ -505,15 +465,6 @@
"1616" "1616"
]; ];
}; };
};
};
services.caddy.virtualHosts."headscale.imxyy.top" = {
extraConfig = ''
reverse_proxy :8080 {
header_up X-Real-IP {remote_host}
}
'';
};
services.caddy.virtualHosts."oidc.imxyy.top" = { services.caddy.virtualHosts."oidc.imxyy.top" = {
extraConfig = '' extraConfig = ''
reverse_proxy :8081 { reverse_proxy :8081 {
@@ -524,9 +475,10 @@
systemd.services.ddns-go = systemd.services.ddns-go =
let let
ddns-go = pkgs.buildGoModule rec {
pname = "ddns-go";
version = "6.6.7"; version = "6.6.7";
ddns-go = pkgs.buildGoModule {
inherit version;
pname = "ddns-go";
src = pkgs.fetchFromGitHub { src = pkgs.fetchFromGitHub {
owner = "jeessy2"; owner = "jeessy2";
repo = "ddns-go"; repo = "ddns-go";
@@ -561,7 +513,6 @@
"git" "git"
"vault" "vault"
"coder" "coder"
"headscale"
"grafana" "grafana"
"matrix" "matrix"
"note" "note"
@@ -570,23 +521,22 @@
"music" "music"
"ai" "ai"
"sy" "sy"
"minio" "immich"
]; ];
in in
{ {
enable = true; enable = true;
resolveLocalQueries = false; resolveLocalQueries = false;
settings = { settings = {
server = [ no-resolv = true;
"120.53.53.53" server = [ "192.168.3.1" ];
"223.5.5.5"
];
address = map (sub: "/${sub}.imxyy.top/192.168.3.2") subDomains ++ [ address = map (sub: "/${sub}.imxyy.top/192.168.3.2") subDomains ++ [
"/imxyy-nix-server/192.168.3.2" "/imxyy-nix-server/192.168.3.2"
"/imxyy-cloudwin/192.168.3.4" "/imxyy-cloudwin/192.168.3.4"
"/printer.home/192.168.3.53" "/printer.home/192.168.3.53"
]; ];
cache-size = 0; cache-size = 0;
log-queries = "extra";
}; };
}; };
} }

View File

@@ -17,9 +17,9 @@ in
services.nextcloud = { services.nextcloud = {
enable = true; enable = true;
package = pkgs.nextcloud31; package = pkgs.nextcloud32;
extraApps = { extraApps = {
inherit (pkgs.nextcloud31.packages.apps) inherit (pkgs.nextcloud32.packages.apps)
bookmarks bookmarks
previewgenerator previewgenerator
spreed spreed
@@ -31,20 +31,26 @@ in
hostName = nextcloud; hostName = nextcloud;
home = "/mnt/nas/nextcloud"; home = "/mnt/nas/nextcloud";
https = true; https = true;
nginx.recommendedHttpHeaders = true;
caching.redis = true; caching.redis = true;
configureRedis = true; configureRedis = true;
database.createLocally = true; database.createLocally = true;
notify_push.enable = true;
config = { config = {
dbtype = "pgsql"; dbtype = "pgsql";
adminpassFile = toString (pkgs.writeText "nextcloud-pass" "admin12345!"); adminpassFile = toString (pkgs.writeText "nextcloud-pass" "admin12345!");
adminuser = "admin"; adminuser = "admin";
}; };
settings.trusted_domains = [ settings = {
trusted_domains = [
hostname hostname
"192.168.3.2" "192.168.3.2"
"10.0.0.1" "10.0.0.1"
]; ];
trusted_proxies = [
"127.0.0.1"
"192.168.3.0/24"
];
};
phpExtraExtensions = phpExtraExtensions =
all: with all; [ all: with all; [
pdlib pdlib
@@ -53,7 +59,7 @@ in
phpOptions = { phpOptions = {
"opcache.enable" = 1; "opcache.enable" = 1;
"opcache.enable_cli" = 1; "opcache.enable_cli" = 1;
"opcache.interned_strings_buffer" = 8; "opcache.interned_strings_buffer" = 23;
"opcache.max_accelerated_files" = 10000; "opcache.max_accelerated_files" = 10000;
"opcache.memory_consumption" = 128; "opcache.memory_consumption" = 128;
"opcache.save_comments" = 1; "opcache.save_comments" = 1;
@@ -94,9 +100,12 @@ in
*/ */
services.caddy.virtualHosts."nextcloud.imxyy.top" = { services.caddy.virtualHosts."nextcloud.imxyy.top" = {
extraConfig = '' extraConfig = ''
reverse_proxy :8084 { reverse_proxy http://127.0.0.1:8084 {
header_up X-Real-IP {remote_host} trusted_proxies 192.168.3.0/24
} }
redir /.well-known/carddav /remote.php/dav/ 301
redir /.well-known/caldav /remote.php/dav/ 301
''; '';
}; };

View File

@@ -2,7 +2,7 @@
lib, lib,
config, config,
username, username,
sopsRoot, secrets,
... ...
}: }:
{ {
@@ -13,17 +13,16 @@
timeout = 0; timeout = 0;
}; };
hardware.bluetooth.enable = true;
hardware.bluetooth.powerOnBoot = true;
systemd.services.nix-daemon = { systemd.services.nix-daemon = {
environment.TMPDIR = "/var/cache/nix"; environment.TMPDIR = "/var/cache/nix";
serviceConfig.CacheDirectory = "nix"; serviceConfig.CacheDirectory = "nix";
}; };
environment.variables.NIX_REMOTE = "daemon"; environment.variables.NIX_REMOTE = "daemon";
my.audio.enable = false;
sops.secrets.imxyy-nix-server-hashed-password = { sops.secrets.imxyy-nix-server-hashed-password = {
sopsFile = sopsRoot + /imxyy-nix-server-hashed-password.txt; sopsFile = secrets.imxyy-nix-server-hashed-password;
format = "binary"; format = "binary";
neededForUsers = true; neededForUsers = true;
}; };

View File

@@ -1,31 +1,16 @@
{ {
config, config,
sopsRoot, secrets,
... ...
}: }:
{ {
sops.secrets = { sops.secrets = {
flatnote-env = {
sopsFile = sopsRoot + /flatnote.env;
format = "dotenv";
};
siyuan-env = { siyuan-env = {
sopsFile = sopsRoot + /siyuan.env; sopsFile = secrets.siyuan;
format = "dotenv"; format = "dotenv";
}; };
}; };
virtualisation.oci-containers = { virtualisation.oci-containers.containers = {
containers = {
flatnotes = {
image = "dullage/flatnotes:latest";
volumes = [
"/mnt/nas/flatnotes/data:/data"
];
environmentFiles = [
"${config.sops.secrets.flatnote-env.path}"
];
ports = [ "8093:8080" ];
};
siyuan = { siyuan = {
image = "apkdv/siyuan-unlock:v3.1.30"; image = "apkdv/siyuan-unlock:v3.1.30";
volumes = [ volumes = [
@@ -44,18 +29,24 @@
]; ];
ports = [ "8095:6806" ]; ports = [ "8095:6806" ];
}; };
memos = {
image = "neosmemo/memos:stable";
volumes = [
"/mnt/nas/memos:/var/opt/memos"
];
ports = [ "8097:5230" ];
}; };
}; };
services.caddy.virtualHosts = { services.caddy.virtualHosts = {
"note.imxyy.top" = {
extraConfig = ''
reverse_proxy :8093
'';
};
"sy.imxyy.top" = { "sy.imxyy.top" = {
extraConfig = '' extraConfig = ''
reverse_proxy :8095 reverse_proxy :8095
''; '';
}; };
"memo.imxyy.top" = {
extraConfig = ''
reverse_proxy :8097
'';
};
}; };
} }

View File

@@ -0,0 +1,74 @@
{
inputs,
pkgs,
lib,
...
}:
let
app = pkgs.buildNpmPackage (finalAttrs: {
pname = "HF-plant";
version = "unstable-2025-09-21";
src = inputs.plant;
buildPhase = ''
runHook preBuild
npm run build
npm run build:proxy
runHook postBuild
'';
installPhase = ''
runHook preInstall
mkdir $out
mv dist $out
cp .env proxy-server-bundled.js $out
runHook postInstall
'';
npmDepsHash = "sha256-ret4BtjrEt8L1nlvJmFiejAKmbz89Z7NSiKs+qlB51w=";
});
in
{
systemd.services.HF-plant-proxy = {
after = [ "network.target" ];
wantedBy = [ "multi-user.target" ];
serviceConfig = {
ExecStart = "${lib.getExe pkgs.bash} -c 'source ${app}/.env; export FEISHU_APP_ID FEISHU_APP_SECRET AMAP_JSCODE; ${lib.getExe pkgs.nodejs} ${app}/proxy-server-bundled.js'";
Restart = "always";
RestartSec = 120;
};
};
services.caddy.virtualHosts."plant.imxyy.top" = {
extraConfig = ''
handle /api/* {
reverse_proxy localhost:3001
}
handle /* {
root * ${app}/dist
try_files {path} /index.html
file_server
}
'';
};
services.frp.settings.proxies = [
{
name = "plant-http";
type = "http";
localIP = "127.0.0.1";
localPort = 80;
customDomains = [ "plant.imxyy.top" ];
}
{
name = "plant-https";
type = "https";
localIP = "127.0.0.1";
localPort = 443;
customDomains = [ "plant.imxyy.top" ];
}
];
}

View File

@@ -1,7 +1,7 @@
{ config, sopsRoot, ... }: { config, secrets, ... }:
{ {
sops.secrets.vaultwarden-env = { sops.secrets.vaultwarden-env = {
sopsFile = sopsRoot + /vaultwarden.env; sopsFile = secrets.vaultwarden;
format = "dotenv"; format = "dotenv";
}; };
services.postgresql.ensureUsers = [ services.postgresql.ensureUsers = [

View File

@@ -13,7 +13,7 @@ let
in in
{ {
boot = { boot = {
initrd.kernelModules = [ initrd.kernelModules = lib.mkBefore [
"vfio_pci" "vfio_pci"
"vfio" "vfio"
"vfio_iommu_type1" "vfio_iommu_type1"

View File

@@ -1,23 +0,0 @@
{
virtualisation.oci-containers.containers."YesPlayMusic" = {
image = "git.imxyy.top/imxyy1soope1/yesplaymusic:latest";
environment = {
"NODE_TLS_REJECT_UNAUTHORIZED" = "0";
};
volumes = [
"/etc/localtime:/etc/localtime:ro"
];
ports = [
"8088:80/tcp"
];
log-driver = "journald";
};
services.caddy.virtualHosts."music.imxyy.top" = {
extraConfig = ''
reverse_proxy :8088 {
header_up X-Real-IP {remote_host}
}
'';
};
}

View File

@@ -1,10 +1,10 @@
{ lib, username, ... }: { lib, username, ... }:
{ {
my.home.programs.zsh.shellAliases = { my.hm.programs.zsh.shellAliases = {
localproxy_on = "export http_proxy=http://192.168.128.1:7890 https_proxy=http://192.168.128.1:7890 all_proxy=socks://192.168.128.1:7890"; localproxy_on = "export http_proxy=http://192.168.128.1:7890 https_proxy=http://192.168.128.1:7890 all_proxy=socks://192.168.128.1:7890";
}; };
my = { my = {
sops.sshKeyPath = "/home/${username}/.ssh/id_ed25519"; sops.sshKeyFile = "/home/${username}/.ssh/id_ed25519";
coding.all.enable = true; coding.all.enable = true;
coding.editor.vscode.enable = lib.mkForce false; coding.editor.vscode.enable = lib.mkForce false;
cli.misc.enable = true; cli.misc.enable = true;

View File

@@ -1,43 +1,50 @@
{ {
config, config,
lib,
pkgs, pkgs,
username, username,
... ...
}: }:
{ {
my.home = { my.hm = {
home.packages = with pkgs; [ home.packages = with pkgs; [
localsend localsend
rclone
wpsoffice-cn wpsoffice-cn
wps-office-fonts wps-office-fonts
ttf-wps-fonts ttf-wps-fonts
evince papers
anki anki
ayugram-desktop ayugram-desktop
telegram-desktop
signal-desktop signal-desktop
discord element-desktop
fractal
qq qq
wechat wechat
gnome-clocks gnome-clocks
wineWowPackages.waylandFull
pavucontrol
pamixer
]; ];
programs.zsh = { programs.zsh = {
sessionVariables = { sessionVariables = {
PATH = "/home/${username}/bin:$PATH"; PATH = "/home/${username}/bin:$PATH";
}; };
}; };
programs.niri.settings = {
environment.STEAM_FORCE_DESKTOPUI_SCALING = "1.25";
outputs = {
eDP-1 = {
enable = true;
mode = {
width = 1920;
height = 1200;
refresh = 60.002;
};
scale = 1.25;
};
};
};
}; };
my = { my = {
@@ -45,8 +52,7 @@
cli.all.enable = true; cli.all.enable = true;
coding.all.enable = true; coding.all.enable = true;
desktop.all.enable = true; desktop.all.enable = true;
virt.moonlight.enable = true;
desktop.browser.librewolf.enable = lib.mkForce false;
i18n.fcitx5.enable = true; i18n.fcitx5.enable = true;
@@ -54,14 +60,14 @@
enable = true; enable = true;
defaultApplications = defaultApplications =
let let
browser = [ "zen-beta.desktop" ]; browser = [ config.my.desktop.browser.default.desktop ];
editor = [ "codium.desktop" ]; editor = [ "codium.desktop" ];
imageviewer = [ "org.gnome.Shotwell-Viewer.desktop" ]; imageviewer = [ "org.gnome.Shotwell-Viewer.desktop" ];
in in
{ {
"inode/directory" = [ "nemo.desktop" ]; "inode/directory" = [ "org.gnome.Nautilus.desktop" ];
"application/pdf" = [ "org.gnome.Evince.desktop" ]; "application/pdf" = [ "org.gnome.Papers.desktop" ];
"text/*" = editor; "text/*" = editor;
"application/json" = editor; "application/json" = editor;
@@ -92,15 +98,6 @@
"image/png" = imageviewer; "image/png" = imageviewer;
"image/webp" = imageviewer; "image/webp" = imageviewer;
}; };
extraBookmarks =
let
homedir = config.my.home.home.homeDirectory;
in
[
"file://${homedir}/NAS NAS"
"file://${homedir}/NAS/imxyy_soope_ NAS imxyy_soope_"
"file://${homedir}/NAS/imxyy_soope_/OS NAS OS"
];
}; };
persist = { persist = {
enable = true; enable = true;
@@ -118,23 +115,26 @@
".local/state" ".local/state"
".local/share/Anki2" ".local/share/Anki2"
".local/share/shotwell" ".local/share/shotwell"
".local/share/cheat.sh"
".local/share/Kingsoft" ".local/share/Kingsoft"
".local/share/AyuGramDesktop" ".local/share/AyuGramDesktop"
".local/share/TelegramDesktop" ".local/share/fractal"
".config/Signal" ".config/Signal"
".config/discord" ".config/Element"
".config/QQ" ".config/QQ"
".xwechat" ".xwechat"
".config/Kingsoft" ".config/Kingsoft"
".config/dconf" ".config/dconf"
".config/gh"
".config/pulse"
".config/pip" ".config/pip"
".config/libreoffice"
".config/sunshine" ".config/sunshine"
".gemini"
".claude"
".claude-code-router"
];
homeFiles = [
".claude.json"
]; ];
}; };
}; };

View File

@@ -1,8 +1,7 @@
{ {
config, config,
lib,
pkgs, pkgs,
sopsRoot, secrets,
... ...
}: }:
{ {
@@ -10,10 +9,51 @@
"biosdevname=0" "biosdevname=0"
"net.ifnames=0" "net.ifnames=0"
]; ];
networking.networkmanager.enable = true; networking = {
networkmanager.enable = true;
firewall.enable = false;
nftables = {
enable = true;
flushRuleset = true;
ruleset = ''
table inet firewall {
set LANv4 {
type ipv4_addr
flags interval
elements = { 10.0.0.0/8, 100.64.0.0/10, 172.16.0.0/12, 192.168.0.0/16, 169.254.0.0/16 }
}
set LANv6 {
type ipv6_addr
flags interval
elements = { fd00::/8, fe80::/10 }
}
chain output {
type filter hook output priority 100; policy accept;
}
chain input {
type filter hook input priority 0; policy drop;
iif lo accept
ct state invalid drop
ct state established,related accept
ip saddr @LANv4 accept
ip6 saddr @LANv6 accept
}
chain forward {
type filter hook forward priority 0; policy drop;
}
}
'';
};
};
sops.secrets.dae-imxyy-nix-x16 = { sops.secrets.dae-imxyy-nix-x16 = {
sopsFile = sopsRoot + /dae-imxyy-nix-x16.dae; sopsFile = secrets.dae-imxyy-nix-x16;
format = "binary"; format = "binary";
}; };
services.dae = { services.dae = {
@@ -22,7 +62,7 @@
}; };
systemd.services.dae.after = [ "sops-nix.service" ]; systemd.services.dae.after = [ "sops-nix.service" ];
sops.secrets.mihomo = { sops.secrets.mihomo = {
sopsFile = sopsRoot + /mihomo.yaml; sopsFile = secrets.mihomo;
format = "yaml"; format = "yaml";
key = ""; key = "";
}; };
@@ -34,7 +74,7 @@
}; };
sops.secrets.et-imxyy-nix-x16 = { sops.secrets.et-imxyy-nix-x16 = {
sopsFile = sopsRoot + /et-imxyy-nix-x16.toml; sopsFile = secrets.et-imxyy-nix-x16;
format = "binary"; format = "binary";
}; };
environment.systemPackages = with pkgs; [ environment.systemPackages = with pkgs; [
@@ -44,10 +84,8 @@
enable = true; enable = true;
script = "${pkgs.easytier}/bin/easytier-core -c ${config.sops.secrets.et-imxyy-nix-x16.path}"; script = "${pkgs.easytier}/bin/easytier-core -c ${config.sops.secrets.et-imxyy-nix-x16.path}";
serviceConfig = { serviceConfig = {
Restart = lib.mkOverride 500 "always"; Restart = "always";
RestartMaxDelaySec = lib.mkOverride 500 "1m"; RestartSec = 30;
RestartSec = lib.mkOverride 500 "100ms";
RestartSteps = lib.mkOverride 500 9;
User = "root"; User = "root";
}; };
wantedBy = [ "multi-user.target" ]; wantedBy = [ "multi-user.target" ];

View File

@@ -1,9 +1,8 @@
{ {
lib,
pkgs, pkgs,
config, config,
username, username,
sopsRoot, secrets,
... ...
}: }:
{ {
@@ -36,72 +35,11 @@
}; };
environment.variables.NIX_REMOTE = "daemon"; environment.variables.NIX_REMOTE = "daemon";
security.rtkit.enable = true;
services.pipewire = {
enable = true;
alsa.enable = false;
alsa.support32Bit = false;
pulse.enable = false;
audio.enable = false;
};
services.pulseaudio = {
enable = true;
support32Bit = true;
package = pkgs.pulseaudioFull;
extraConfig = ''
load-module module-switch-on-connect
unload-module module-suspend-on-idle
'';
};
hardware.bluetooth = {
enable = true;
powerOnBoot = true;
settings = {
General = {
Enable = "Source,Sink,Media,Socket";
Disable = "HeadSet";
MultiProfile = "multiple";
};
};
};
users.extraUsers.${username}.extraGroups = [ "audio" ];
fonts = {
enableDefaultPackages = false;
fontDir.enable = true;
packages = with pkgs; [
noto-fonts
noto-fonts-cjk-sans
noto-fonts-emoji
jetbrains-mono
nerd-fonts.symbols-only
];
fontconfig.defaultFonts = {
serif = [
"Noto Serif CJK SC"
"Noto Serif"
"Symbols Nerd Font"
];
sansSerif = [
"Noto Sans CJK SC"
"Noto Sans"
"Symbols Nerd Font"
];
monospace = [
"JetBrains Mono"
"Noto Sans Mono CJK SC"
"Symbols Nerd Font Mono"
];
emoji = [ "Noto Color Emoji" ];
};
};
services.printing.enable = true; services.printing.enable = true;
services.upower.enable = true;
services.power-profiles-daemon.enable = true;
services.keyd = { services.keyd = {
enable = true; enable = true;
keyboards.default.settings = { keyboards.default.settings = {
@@ -134,7 +72,7 @@
]; ];
sops.secrets.imxyy-nix-rclone = { sops.secrets.imxyy-nix-rclone = {
sopsFile = sopsRoot + /imxyy-nix-rclone.conf; sopsFile = secrets.imxyy-nix-rclone;
format = "binary"; format = "binary";
}; };
fileSystems = { fileSystems = {
@@ -154,21 +92,6 @@
"vfs-cache-mode=full" "vfs-cache-mode=full"
]; ];
}; };
"/home/${username}/NAS" = {
device = "//10.0.0.1/share";
fsType = "cifs";
options = [
"username=nas"
"password=nasshare"
"x-systemd.automount,noauto,x-systemd.idle-timeout=60,x-systemd.device-timeout=5s,x-systemd.mount-timeout=5s"
"nodev"
"nofail"
"uid=1000"
"gid=100"
"vers=3"
"rw"
];
};
}; };
my.persist.nixosDirs = [ "/etc/NetworkManager/system-connections" ]; my.persist.nixosDirs = [ "/etc/NetworkManager/system-connections" ];

View File

@@ -5,5 +5,6 @@
./home.nix ./home.nix
./virt.nix ./virt.nix
./net.nix ./net.nix
./podman.nix
]; ];
} }

View File

@@ -1,37 +1,29 @@
{ {
config, config,
lib,
pkgs, pkgs,
username, username,
... ...
}: }:
{ {
my.home = { my.hm = {
home.packages = with pkgs; [ home.packages = with pkgs; [
localsend localsend
rclone
wpsoffice-cn wpsoffice-cn
wps-office-fonts wps-office-fonts
ttf-wps-fonts ttf-wps-fonts
evince papers
anki anki
ayugram-desktop working.ayugram-desktop
telegram-desktop
signal-desktop signal-desktop
discord element-desktop
fractal
qq qq
wechat wechat
gnome-clocks gnome-clocks
wineWowPackages.waylandFull
pavucontrol
pamixer
]; ];
programs.zsh = { programs.zsh = {
shellAliases = { shellAliases = {
@@ -91,22 +83,20 @@
coding.all.enable = true; coding.all.enable = true;
desktop.all.enable = true; desktop.all.enable = true;
desktop.browser.librewolf.enable = lib.mkForce false;
i18n.fcitx5.enable = true; i18n.fcitx5.enable = true;
xdg = { xdg = {
enable = true; enable = true;
defaultApplications = defaultApplications =
let let
browser = [ "zen-beta.desktop" ]; browser = [ config.my.desktop.browser.default.desktop ];
editor = [ "codium.desktop" ]; editor = [ "codium.desktop" ];
imageviewer = [ "org.gnome.Shotwell-Viewer.desktop" ]; imageviewer = [ "org.gnome.Shotwell-Viewer.desktop" ];
in in
{ {
"inode/directory" = [ "nemo.desktop" ]; "inode/directory" = [ "org.gnome.Nautilus.desktop" ];
"application/pdf" = [ "org.gnome.Evince.desktop" ]; "application/pdf" = [ "org.gnome.Papers.desktop" ];
"text/*" = editor; "text/*" = editor;
"application/json" = editor; "application/json" = editor;
@@ -137,16 +127,6 @@
"image/png" = imageviewer; "image/png" = imageviewer;
"image/webp" = imageviewer; "image/webp" = imageviewer;
}; };
extraBookmarks =
let
homedir = config.my.home.home.homeDirectory;
in
[
"file://${homedir}/Documents/%E7%8F%AD%E7%BA%A7%E4%BA%8B%E5%8A%A1 "
"file://${homedir}/NAS NAS"
"file://${homedir}/NAS/imxyy_soope_ NAS imxyy_soope_"
"file://${homedir}/NAS/imxyy_soope_/OS NAS OS"
];
}; };
persist = { persist = {
enable = true; enable = true;
@@ -162,23 +142,23 @@
".local/state" ".local/state"
".local/share/Anki2" ".local/share/Anki2"
".local/share/shotwell" ".local/share/shotwell"
".local/share/cheat.sh"
".local/share/Kingsoft" ".local/share/Kingsoft"
".local/share/AyuGramDesktop" ".local/share/AyuGramDesktop"
".local/share/TelegramDesktop" ".local/share/fractal"
".config/Signal" ".config/Signal"
".config/discord" ".config/Element"
".config/QQ" ".config/QQ"
".xwechat" ".xwechat"
".config/Kingsoft" ".config/Kingsoft"
".config/dconf" ".config/dconf"
".config/gh"
".config/pulse"
".config/pip" ".config/pip"
".config/libreoffice"
".config/sunshine" ".config/sunshine"
".gemini"
".claude"
".claude-code-router"
]; ];
}; };
}; };

View File

@@ -2,8 +2,7 @@
config, config,
lib, lib,
pkgs, pkgs,
sopsRoot, secrets,
username,
... ...
}: }:
{ {
@@ -70,6 +69,7 @@
chain input { chain input {
type filter hook input priority 0; policy drop; type filter hook input priority 0; policy drop;
iif lo accept iif lo accept
iifname waydroid0 accept
ct state invalid drop ct state invalid drop
ct state established,related accept ct state established,related accept
@@ -79,6 +79,9 @@
chain forward { chain forward {
type filter hook forward priority 0; policy drop; type filter hook forward priority 0; policy drop;
iifname waydroid0 accept
oifname waydroid0 accept
} }
} }
''; '';
@@ -86,7 +89,7 @@
}; };
sops.secrets.dae-imxyy-nix = { sops.secrets.dae-imxyy-nix = {
sopsFile = sopsRoot + /dae-imxyy-nix.dae; sopsFile = secrets.dae-imxyy-nix;
format = "binary"; format = "binary";
}; };
services.dae = { services.dae = {
@@ -95,7 +98,7 @@
}; };
systemd.services.dae.after = [ "sops-nix.service" ]; systemd.services.dae.after = [ "sops-nix.service" ];
sops.secrets.mihomo = { sops.secrets.mihomo = {
sopsFile = sopsRoot + /mihomo.yaml; sopsFile = secrets.mihomo;
format = "yaml"; format = "yaml";
key = ""; key = "";
}; };
@@ -107,7 +110,7 @@
}; };
sops.secrets.et-imxyy-nix = { sops.secrets.et-imxyy-nix = {
sopsFile = sopsRoot + /et-imxyy-nix.toml; sopsFile = secrets.et-imxyy-nix;
format = "binary"; format = "binary";
}; };
environment.systemPackages = [ pkgs.easytier ]; environment.systemPackages = [ pkgs.easytier ];
@@ -115,10 +118,8 @@
enable = true; enable = true;
script = "${pkgs.easytier}/bin/easytier-core -c ${config.sops.secrets.et-imxyy-nix.path}"; script = "${pkgs.easytier}/bin/easytier-core -c ${config.sops.secrets.et-imxyy-nix.path}";
serviceConfig = { serviceConfig = {
Restart = lib.mkOverride 500 "always"; Restart = "always";
RestartMaxDelaySec = lib.mkOverride 500 "1m"; RestartSec = 30;
RestartSec = lib.mkOverride 500 "100ms";
RestartSteps = lib.mkOverride 500 9;
User = "root"; User = "root";
}; };
wantedBy = [ "multi-user.target" ]; wantedBy = [ "multi-user.target" ];

View File

@@ -3,7 +3,7 @@
pkgs, pkgs,
config, config,
username, username,
sopsRoot, secrets,
... ...
}: }:
let let
@@ -22,7 +22,7 @@ let
temp = line.split(" ") temp = line.split(" ")
bus = temp[1] bus = temp[1]
device = temp[3][:-1] device = temp[3][:-1]
subprocess.run(["${lib.getExe usbreset}", f"/dev/bus/usb/{bus}/{device}"]) subprocess.run(["${lib.getExe' pkgs.usbutils "usbreset"}", f"{bus}/{device}"])
return True return True
if __name__ == "__main__": if __name__ == "__main__":
@@ -36,44 +36,6 @@ let
with open("/tmp/.btreseted", "w"): with open("/tmp/.btreseted", "w"):
... ...
''; '';
usbreset = pkgs.writeCBin "usbreset" ''
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/usbdevice_fs.h>
int main(int argc, char **argv)
{
const char *filename;
int fd;
int rc;
if (argc != 2) {
fprintf(stderr, "Usage: usbreset device-filename\n");
return 1;
}
filename = argv[1];
fd = open(filename, O_WRONLY);
if (fd < 0) {
perror("Error opening output file");
return 1;
}
printf("Resetting USB device %s\n", filename);
rc = ioctl(fd, USBDEVFS_RESET, 0);
if (rc < 0) {
perror("Error in ioctl");
return 1;
}
printf("Reset successful\n");
close(fd);
return 0;
}
'';
in in
{ {
security.pam.loginLimits = [ security.pam.loginLimits = [
@@ -111,75 +73,12 @@ in
}; };
environment.variables.NIX_REMOTE = "daemon"; environment.variables.NIX_REMOTE = "daemon";
security.rtkit.enable = true;
services.pipewire = {
enable = true;
alsa.enable = false;
alsa.support32Bit = false;
pulse.enable = false;
audio.enable = false;
};
services.pulseaudio = {
enable = true;
support32Bit = true;
package = pkgs.pulseaudioFull;
extraConfig = ''
load-module module-switch-on-connect
unload-module module-suspend-on-idle
'';
};
hardware.bluetooth = {
enable = true;
powerOnBoot = true;
settings = {
General = {
Enable = "Source,Sink,Media,Socket";
Disable = "HeadSet";
MultiProfile = "multiple";
};
};
};
users.extraUsers.${username}.extraGroups = [ "audio" ];
fonts = {
enableDefaultPackages = false;
fontDir.enable = true;
packages = with pkgs; [
noto-fonts
noto-fonts-cjk-sans
noto-fonts-emoji
jetbrains-mono
nerd-fonts.symbols-only
];
fontconfig.defaultFonts = {
serif = [
"Noto Serif CJK SC"
"Noto Serif"
"Symbols Nerd Font"
];
sansSerif = [
"Noto Sans CJK SC"
"Noto Sans"
"Symbols Nerd Font"
];
monospace = [
"JetBrains Mono"
"Noto Sans Mono CJK SC"
"Symbols Nerd Font Mono"
];
emoji = [ "Noto Color Emoji" ];
};
};
services.printing.enable = true; services.printing.enable = true;
services.keyd = { services.keyd = {
enable = true; enable = true;
keyboards.default.settings = { keyboards = {
default.settings = {
main = { main = {
capslock = "overload(control, esc)"; capslock = "overload(control, esc)";
home = "end"; home = "end";
@@ -191,6 +90,11 @@ in
delete = "print"; delete = "print";
}; };
}; };
kone-pro-owl-eye = {
ids = [ "1e7d:2dcd" ];
settings.main.mouse2 = "rightmouse";
};
};
}; };
services.gvfs.enable = true; services.gvfs.enable = true;
@@ -199,6 +103,9 @@ in
programs.wireshark.package = pkgs.wireshark; programs.wireshark.package = pkgs.wireshark;
users.users.${username}.extraGroups = [ "wireshark" ]; users.users.${username}.extraGroups = [ "wireshark" ];
virtualisation.waydroid.enable = true;
my.persist.homeDirs = [ ".local/share/waydroid" ];
services.sunshine = { services.sunshine = {
enable = true; enable = true;
autoStart = true; autoStart = true;
@@ -225,7 +132,7 @@ in
]; ];
sops.secrets.imxyy-nix-rclone = { sops.secrets.imxyy-nix-rclone = {
sopsFile = sopsRoot + /imxyy-nix-rclone.conf; sopsFile = secrets.imxyy-nix-rclone;
format = "binary"; format = "binary";
}; };
fileSystems = { fileSystems = {

View File

@@ -0,0 +1,36 @@
{
lib,
pkgs,
username,
...
}:
{
virtualisation.podman = {
enable = true;
dockerCompat = true;
dockerSocket.enable = true;
};
users.users.${username}.extraGroups = [ "podman" ];
environment.systemPackages = [ pkgs.distrobox ];
my.hm.programs.distrobox = {
enable = true;
settings = {
container_image_default = "docker.io/archlinux:latest";
};
containers = {
archlinux = {
image = "archlinux:latest";
additional_packages = "nvim";
};
};
};
my.hm.programs.zsh.initContent = lib.mkBefore ''
if [ -n "''${CONTAINER_ID+1}" ]; then
export ZSH_DISABLE_COMPFIX=true
fi
'';
my.persist.homeDirs = [
".config/containers"
".local/share/containers"
];
}

426
flake.lock generated
View File

@@ -5,11 +5,11 @@
"fromYaml": "fromYaml" "fromYaml": "fromYaml"
}, },
"locked": { "locked": {
"lastModified": 1746562888, "lastModified": 1755819240,
"narHash": "sha256-YgNJQyB5dQiwavdDFBMNKk1wyS77AtdgDk/VtU6wEaI=", "narHash": "sha256-qcMhnL7aGAuFuutH4rq9fvAhCpJWVHLcHVZLtPctPlo=",
"owner": "SenchoPens", "owner": "SenchoPens",
"repo": "base16.nix", "repo": "base16.nix",
"rev": "806a1777a5db2a1ef9d5d6f493ef2381047f2b89", "rev": "75ed5e5e3fce37df22e49125181fa37899c3ccd6",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -21,27 +21,28 @@
"base16-fish": { "base16-fish": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1622559957, "lastModified": 1754405784,
"narHash": "sha256-PebymhVYbL8trDVVXxCvZgc0S5VxI7I1Hv4RMSquTpA=", "narHash": "sha256-l9xHIy+85FN+bEo6yquq2IjD1rSg9fjfjpyGP1W8YXo=",
"owner": "tomyun", "owner": "tomyun",
"repo": "base16-fish", "repo": "base16-fish",
"rev": "2f6dd973a9075dabccd26f1cded09508180bf5fe", "rev": "23ae20a0093dca0d7b39d76ba2401af0ccf9c561",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "tomyun", "owner": "tomyun",
"repo": "base16-fish", "repo": "base16-fish",
"rev": "23ae20a0093dca0d7b39d76ba2401af0ccf9c561",
"type": "github" "type": "github"
} }
}, },
"base16-helix": { "base16-helix": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1748408240, "lastModified": 1752979451,
"narHash": "sha256-9M2b1rMyMzJK0eusea0x3lyh3mu5nMeEDSc4RZkGm+g=", "narHash": "sha256-0CQM+FkYy0fOO/sMGhOoNL80ftsAzYCg9VhIrodqusM=",
"owner": "tinted-theming", "owner": "tinted-theming",
"repo": "base16-helix", "repo": "base16-helix",
"rev": "6c711ab1a9db6f51e2f6887cc3345530b33e152e", "rev": "27cf1e66e50abc622fb76a3019012dc07c678fac",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -98,6 +99,26 @@
"type": "github" "type": "github"
} }
}, },
"catppuccin": {
"inputs": {
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1763724081,
"narHash": "sha256-hCgZsbaw21R9uL3iJwG8WT3VCMXVa7xjmxGRf0nwvL4=",
"owner": "catppuccin",
"repo": "nix",
"rev": "e4676e1fd9b09131feadd3df556fd1d3f31fdd2d",
"type": "github"
},
"original": {
"owner": "catppuccin",
"repo": "nix",
"type": "github"
}
},
"chaotic": { "chaotic": {
"inputs": { "inputs": {
"flake-schemas": "flake-schemas", "flake-schemas": "flake-schemas",
@@ -107,11 +128,11 @@
"rust-overlay": "rust-overlay" "rust-overlay": "rust-overlay"
}, },
"locked": { "locked": {
"lastModified": 1752141190, "lastModified": 1763732117,
"narHash": "sha256-RHNq77Z84BtLTwyRtrBffm5V9006Dqw4vh3vrvULlxM=", "narHash": "sha256-/zBu6slgHtkuFZFJ4ReKS3NO6rdwEv4KcaYADkz6KyA=",
"owner": "chaotic-cx", "owner": "chaotic-cx",
"repo": "nyx", "repo": "nyx",
"rev": "ef0794b8e94eea166407141f7e92da75f6df925a", "rev": "a34640558e83eb3ba0d52c52cb5ffd0465786e4b",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -128,11 +149,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1750940343, "lastModified": 1763015923,
"narHash": "sha256-qmc/jreM09MOwQ8dOa/+yyh99rU7TowSqo8L33VHfto=", "narHash": "sha256-IJGWKVxztJT/NsonaRjWm5OaW07Rg+kBr6NMhfQiJzM=",
"owner": "Bali10050", "owner": "Bali10050",
"repo": "Darkly", "repo": "Darkly",
"rev": "77770c8d3c35f7ad39da2c57122c360096df0aac", "rev": "5a323b775695f889b495d9f499eceb38ed538b42",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -171,11 +192,11 @@
"rust-analyzer-src": "rust-analyzer-src" "rust-analyzer-src": "rust-analyzer-src"
}, },
"locked": { "locked": {
"lastModified": 1752129689, "lastModified": 1763793715,
"narHash": "sha256-0Xq5tZbvgZvxbbxv6kRHFuZE4Tq2za016NXh32nX0+Q=", "narHash": "sha256-wyYhBaCo+m76TegkIG0qBK4dPo0McWtWTjcaf2vwzvI=",
"owner": "nix-community", "owner": "nix-community",
"repo": "fenix", "repo": "fenix",
"rev": "70bb04a7de606a75ba0a2ee9d47b99802780b35d", "rev": "ad1e51a518dc3f1e4e52890b8f11bd434de6008f",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -187,11 +208,11 @@
"firefox-gnome-theme": { "firefox-gnome-theme": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1748383148, "lastModified": 1758112371,
"narHash": "sha256-pGvD/RGuuPf/4oogsfeRaeMm6ipUIznI2QSILKjKzeA=", "narHash": "sha256-lizRM2pj6PHrR25yimjyFn04OS4wcdbc38DCdBVa2rk=",
"owner": "rafaelmardojai", "owner": "rafaelmardojai",
"repo": "firefox-gnome-theme", "repo": "firefox-gnome-theme",
"rev": "4eb2714fbed2b80e234312611a947d6cb7d70caf", "rev": "0909cfe4a2af8d358ad13b20246a350e14c2473d",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -219,11 +240,11 @@
"flake-compat_2": { "flake-compat_2": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1747046372, "lastModified": 1761588595,
"narHash": "sha256-CIVLLkVgvHYbgI2UpXvIIBJ12HWgX+fjA8Xf8PUmqCY=", "narHash": "sha256-XKUZz9zewJNUj46b4AJdiRZJAvSZ0Dqj2BNfXvFlJC4=",
"owner": "edolstra", "owner": "edolstra",
"repo": "flake-compat", "repo": "flake-compat",
"rev": "9100a0f413b0c601e0533d1d94ffd501ce2e7885", "rev": "f387cd2afec9419c8ee37694406ca490c3f34ee5",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -273,27 +294,6 @@
} }
}, },
"flake-parts_3": { "flake-parts_3": {
"inputs": {
"nixpkgs-lib": [
"nur",
"nixpkgs"
]
},
"locked": {
"lastModified": 1733312601,
"narHash": "sha256-4pDvzqnegAfRkPwO3wmwBhVi/Sye1mzps0zHWYnP88c=",
"owner": "hercules-ci",
"repo": "flake-parts",
"rev": "205b12d8b7cd4802fbcb8e8ef6a0f1408781a4f9",
"type": "github"
},
"original": {
"owner": "hercules-ci",
"repo": "flake-parts",
"type": "github"
}
},
"flake-parts_4": {
"inputs": { "inputs": {
"nixpkgs-lib": [ "nixpkgs-lib": [
"stylix", "stylix",
@@ -301,11 +301,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1751413152, "lastModified": 1756770412,
"narHash": "sha256-Tyw1RjYEsp5scoigs1384gIg6e0GoBVjms4aXFfRssQ=", "narHash": "sha256-+uWLQZccFHwqpGqr2Yt5VsW/PbeJVTn9Dk6SHWhNRPw=",
"owner": "hercules-ci", "owner": "hercules-ci",
"repo": "flake-parts", "repo": "flake-parts",
"rev": "77826244401ea9de6e3bac47c2db46005e1f30b5", "rev": "4524271976b625a4a605beefd893f270620fd751",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -430,18 +430,20 @@
"gnome-shell": { "gnome-shell": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1748186689, "host": "gitlab.gnome.org",
"narHash": "sha256-UaD7Y9f8iuLBMGHXeJlRu6U1Ggw5B9JnkFs3enZlap0=", "lastModified": 1762869044,
"narHash": "sha256-nwm/GJ2Syigf7VccLAZ66mFC8mZJFqpJmIxSGKl7+Ds=",
"owner": "GNOME", "owner": "GNOME",
"repo": "gnome-shell", "repo": "gnome-shell",
"rev": "8c88f917db0f1f0d80fa55206c863d3746fa18d0", "rev": "680e3d195a92203f28d4bf8c6e8bb537cc3ed4ad",
"type": "github" "type": "gitlab"
}, },
"original": { "original": {
"host": "gitlab.gnome.org",
"owner": "GNOME", "owner": "GNOME",
"ref": "48.2", "ref": "gnome-49",
"repo": "gnome-shell", "repo": "gnome-shell",
"type": "github" "type": "gitlab"
} }
}, },
"go-musicfox": { "go-musicfox": {
@@ -457,16 +459,15 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1748528448, "lastModified": 1762961141,
"narHash": "sha256-Tyn+PgBm78Ibq28/WbEz8+pYJZMdbJKsyXMCpT6TjrM=", "narHash": "sha256-q6B/qUbz2JvCLg3ZQKf24xsIICJz5Lh77Ki+fInfllU=",
"owner": "imxyy1soope1", "owner": "imxyy1soope1",
"repo": "go-musicfox", "repo": "go-musicfox",
"rev": "1870fd3501631577ad4daef1489b03885abcb037", "rev": "266ae5f6a791e16a7afdc3d08b6294ceff0ec4d8",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "imxyy1soope1", "owner": "imxyy1soope1",
"ref": "master",
"repo": "go-musicfox", "repo": "go-musicfox",
"type": "github" "type": "github"
} }
@@ -500,11 +501,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1751824240, "lastModified": 1763416652,
"narHash": "sha256-aDDC0CHTlL7QDKWWhdbEgVPK6KwWt+ca0QkmHYZxMzI=", "narHash": "sha256-8EBEEvtzQ11LCxpQHMNEBQAGtQiCu/pqP9zSovDSbNM=",
"owner": "nix-community", "owner": "nix-community",
"repo": "home-manager", "repo": "home-manager",
"rev": "fd9e55f5fac45a26f6169310afca64d56b681935", "rev": "ea164b7c9ccdc2321379c2ff78fd4317b4c41312",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -520,11 +521,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1752202894, "lastModified": 1763748372,
"narHash": "sha256-knafgng4gCjZIUMyAEWjxxdols6n/swkYnbWr+oF+1w=", "narHash": "sha256-AUc78Qv3sWir0hvbmfXoZ7Jzq9VVL97l+sP9Jgms+JU=",
"owner": "nix-community", "owner": "nix-community",
"repo": "home-manager", "repo": "home-manager",
"rev": "fab659b346c0d4252208434c3c4b3983a4b38fec", "rev": "d10a9b16b2a3ee28433f3d1c603f4e9f1fecb8e1",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -542,11 +543,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1743604125, "lastModified": 1762964643,
"narHash": "sha256-ZD61DNbsBt1mQbinAaaEqKaJk2RFo9R/j+eYWeGMx7A=", "narHash": "sha256-RYHN8O/Aja59XDji6WSJZPkJpYVUfpSkyH+PEupBJqM=",
"owner": "nix-community", "owner": "nix-community",
"repo": "home-manager", "repo": "home-manager",
"rev": "180fd43eea296e62ae68e079fcf56aba268b9a1a", "rev": "827f2a23373a774a8805f84ca5344654c31f354b",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -595,11 +596,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1751529406, "lastModified": 1763453666,
"narHash": "sha256-jwKDHyUycp678zDYa5Hyfq3msO73YMXdZPxp96dU7po=", "narHash": "sha256-Hu8lDUlbMFvcYX30LBXX7Gq5FbU35bERH0pSX5qHf/Q=",
"owner": "Jovian-Experiments", "owner": "Jovian-Experiments",
"repo": "Jovian-NixOS", "repo": "Jovian-NixOS",
"rev": "b2e5ce654e4f5bf8905c2e07a96dcf4966e6277d", "rev": "b843b551415c7aecc97c8b3ab3fff26fd0cd8bbf",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -658,21 +659,17 @@
"inputs": { "inputs": {
"niri-stable": "niri-stable", "niri-stable": "niri-stable",
"niri-unstable": "niri-unstable", "niri-unstable": "niri-unstable",
"nixpkgs": [ "nixpkgs": "nixpkgs_5",
"nixpkgs" "nixpkgs-stable": "nixpkgs-stable",
],
"nixpkgs-stable": [
"nixpkgs-stable"
],
"xwayland-satellite-stable": "xwayland-satellite-stable", "xwayland-satellite-stable": "xwayland-satellite-stable",
"xwayland-satellite-unstable": "xwayland-satellite-unstable" "xwayland-satellite-unstable": "xwayland-satellite-unstable"
}, },
"locked": { "locked": {
"lastModified": 1752078530, "lastModified": 1763739228,
"narHash": "sha256-TrRmlYdhWcadWvBpDjB9Xlry4uT4ZUIO46d+o5tjtCQ=", "narHash": "sha256-taQ7h8kkyigrdiAHilUXOZiqdT/cCYcpxQentuH+Krc=",
"owner": "sodiboo", "owner": "sodiboo",
"repo": "niri-flake", "repo": "niri-flake",
"rev": "d231d92313192d4d0c78d6ef04167fed9dee87cf", "rev": "4708ce5f7d7c7aec103e22c87c11a711eeafd1fa",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -684,16 +681,16 @@
"niri-stable": { "niri-stable": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1748151941, "lastModified": 1756556321,
"narHash": "sha256-z4viQZLgC2bIJ3VrzQnR+q2F3gAOEQpU1H5xHtX/2fs=", "narHash": "sha256-RLD89dfjN0RVO86C/Mot0T7aduCygPGaYbog566F0Qo=",
"owner": "YaLTeR", "owner": "YaLTeR",
"repo": "niri", "repo": "niri",
"rev": "8ba57fcf25d2fc9565131684a839d58703f1dae7", "rev": "01be0e65f4eb91a9cd624ac0b76aaeab765c7294",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "YaLTeR", "owner": "YaLTeR",
"ref": "v25.05.1", "ref": "v25.08",
"repo": "niri", "repo": "niri",
"type": "github" "type": "github"
} }
@@ -701,11 +698,11 @@
"niri-unstable": { "niri-unstable": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1750791124, "lastModified": 1763729389,
"narHash": "sha256-F5iVU/hjoSHSSe0gllxm0PcAaseEtGNanYK5Ha3k2Tg=", "narHash": "sha256-VcToDv3/lw3q3sVIqQsMUhSGKEVdQM4h6rnr/XhPBwM=",
"owner": "YaLTeR", "owner": "YaLTeR",
"repo": "niri", "repo": "niri",
"rev": "37458d94b288945f6cfbd3c5c233f634d59f246c", "rev": "012700dd549a79c501bcab92839e5dcc46c372b5",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -804,11 +801,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1752199438, "lastModified": 1763738061,
"narHash": "sha256-xSBMmGtq8K4Qv80TMqREmESCAsRLJRHAbFH2T/2Bf1Y=", "narHash": "sha256-VpNRcInaj1MOya8NmcqhFmdO7KGO7SSZelJQmPl6HoQ=",
"owner": "nix-community", "owner": "nix-community",
"repo": "NixOS-WSL", "repo": "NixOS-WSL",
"rev": "d34d9412556d3a896e294534ccd25f53b6822e80", "rev": "3bcc267c4e0efa023b98b9c5cfbe11b88ec2dc8f",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -819,11 +816,11 @@
}, },
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1751984180, "lastModified": 1763421233,
"narHash": "sha256-LwWRsENAZJKUdD3SpLluwDmdXY9F45ZEgCb0X+xgOL0=", "narHash": "sha256-Stk9ZYRkGrnnpyJ4eqt9eQtdFWRRIvMxpNRf4sIegnw=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "9807714d6944a957c2e036f84b0ff8caf9930bc0", "rev": "89c2b2330e733d6cdb5eae7b899326930c2c0648",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -847,11 +844,11 @@
}, },
"nixpkgs-master": { "nixpkgs-master": {
"locked": { "locked": {
"lastModified": 1752206449, "lastModified": 1763795936,
"narHash": "sha256-NVAbC/s4CupABWGXF8M9mDiVw/n0YCftxwc1KatVjDk=", "narHash": "sha256-5L4HBJHKYKzoXx67ktYxpJ9EvtgeSPxvJeWn24COLKU=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "1bd4d0d4a678d48b63eb18f457d74df2fcee6c69", "rev": "2f56cd905aeb2a053165d362aff07718ad041164",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -863,11 +860,27 @@
}, },
"nixpkgs-stable": { "nixpkgs-stable": {
"locked": { "locked": {
"lastModified": 1752203688, "lastModified": 1763622513,
"narHash": "sha256-uJ054F5PVGPu5SvLPMevhdY/EfK0X5DUyRtXhQYNUyo=", "narHash": "sha256-1jQnuyu82FpiSxowrF/iFK6Toh9BYprfDqfs4BB+19M=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "c58bc7f5459328e4afac201c5c4feb7c818d604b",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-25.05",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs-stable_2": {
"locked": {
"lastModified": 1763792315,
"narHash": "sha256-CtNsEyRHZKISb8cMAtOzoN6hMz7ZmHhf/Nzz4GFRmWw=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "a70a12c75e13aa546c20ce0fe515de634d52c39e", "rev": "ecdf4cc7d88602b44aab1f04a877db63687674b7",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -879,20 +892,36 @@
}, },
"nixpkgs-unstable": { "nixpkgs-unstable": {
"locked": { "locked": {
"lastModified": 1752124863, "lastModified": 1763421233,
"narHash": "sha256-5rWuf6RAlMDp/CAEuyYEz7ryxzgjxOCgUDhWEef864c=", "narHash": "sha256-Stk9ZYRkGrnnpyJ4eqt9eQtdFWRRIvMxpNRf4sIegnw=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "40de82b434526744da778ed53c742c1282d9e75e", "rev": "89c2b2330e733d6cdb5eae7b899326930c2c0648",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "nixos", "owner": "nixos",
"ref": "nixos-unstable-small", "ref": "nixos-unstable",
"repo": "nixpkgs", "repo": "nixpkgs",
"type": "github" "type": "github"
} }
}, },
"nixpkgs-working": {
"locked": {
"lastModified": 1762844143,
"narHash": "sha256-SlybxLZ1/e4T2lb1czEtWVzDCVSTvk9WLwGhmxFmBxI=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "9da7f1cf7f8a6e2a7cb3001b048546c92a8258b4",
"type": "github"
},
"original": {
"owner": "nixos",
"repo": "nixpkgs",
"rev": "9da7f1cf7f8a6e2a7cb3001b048546c92a8258b4",
"type": "github"
}
},
"nixpkgs_2": { "nixpkgs_2": {
"locked": { "locked": {
"lastModified": 1730531603, "lastModified": 1730531603,
@@ -943,40 +972,59 @@
}, },
"nixpkgs_5": { "nixpkgs_5": {
"locked": { "locked": {
"lastModified": 1751984180, "lastModified": 1763421233,
"narHash": "sha256-LwWRsENAZJKUdD3SpLluwDmdXY9F45ZEgCb0X+xgOL0=", "narHash": "sha256-Stk9ZYRkGrnnpyJ4eqt9eQtdFWRRIvMxpNRf4sIegnw=",
"owner": "nixos", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "9807714d6944a957c2e036f84b0ff8caf9930bc0", "rev": "89c2b2330e733d6cdb5eae7b899326930c2c0648",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "nixos", "owner": "NixOS",
"ref": "nixos-unstable", "ref": "nixos-unstable",
"repo": "nixpkgs", "repo": "nixpkgs",
"type": "github" "type": "github"
} }
}, },
"nur": { "nixpkgs_6": {
"inputs": {
"flake-parts": "flake-parts_3",
"nixpkgs": "nixpkgs_5"
},
"locked": { "locked": {
"lastModified": 1752207112, "lastModified": 1761236834,
"narHash": "sha256-dnVoQSGQqEGJQzS6iHAG95c0oFrezzBinwu1bDLj9J4=", "narHash": "sha256-+pthv6hrL5VLW2UqPdISGuLiUZ6SnAXdd2DdUE+fV2Q=",
"owner": "nix-community", "owner": "nixos",
"repo": "NUR", "repo": "nixpkgs",
"rev": "f166dc14862dfec043f9545e8291cc4402f8b866", "rev": "d5faa84122bc0a1fd5d378492efce4e289f8eac1",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "nix-community", "owner": "nixos",
"repo": "NUR", "ref": "nixpkgs-unstable",
"repo": "nixpkgs",
"type": "github" "type": "github"
} }
}, },
"nur_2": { "noctalia": {
"inputs": {
"nixpkgs": [
"nixpkgs"
],
"systems": "systems_2"
},
"locked": {
"lastModified": 1763650592,
"narHash": "sha256-+GdNB847SdkWyOwk/QH7/x+TTjA6RrJRgsJnA9Xt8sQ=",
"owner": "noctalia-dev",
"repo": "noctalia-shell",
"rev": "c50776eeee89273a93a288cc1ea8914e263e3bb2",
"type": "github"
},
"original": {
"owner": "noctalia-dev",
"ref": "v3.2.0",
"repo": "noctalia-shell",
"type": "github"
}
},
"nur": {
"inputs": { "inputs": {
"flake-parts": [ "flake-parts": [
"stylix", "stylix",
@@ -988,11 +1036,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1751906969, "lastModified": 1758998580,
"narHash": "sha256-BSQAOdPnzdpOuCdAGSJmefSDlqmStFNScEnrWzSqKPw=", "narHash": "sha256-VLx0z396gDCGSiowLMFz5XRO/XuNV+4EnDYjdJhHvUk=",
"owner": "nix-community", "owner": "nix-community",
"repo": "NUR", "repo": "NUR",
"rev": "ddb679f4131e819efe3bbc6457ba19d7ad116f25", "rev": "ba8d9c98f5f4630bcb0e815ab456afd90c930728",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -1001,28 +1049,26 @@
"type": "github" "type": "github"
} }
}, },
"quickshell": { "plant": {
"inputs": { "flake": false,
"nixpkgs": [
"nixpkgs"
]
},
"locked": { "locked": {
"lastModified": 1752146885, "lastModified": 1758423341,
"narHash": "sha256-ZJK989GL+bTCQSxbG8v8/7tHMCEl/FPovkeDBNyClQE=", "narHash": "sha256-dHcKh7T8I70bKPwgqO5MxZ9bWHINwzRPhFp5waQy2r8=",
"ref": "refs/heads/master", "ref": "refs/heads/master",
"rev": "d7079b75241c6e2b67f2429996fa7679ffc052e2", "rev": "08dc0b3889797eb3618c7475c3c367ec0e5fdf40",
"revCount": 616, "revCount": 6,
"type": "git", "type": "git",
"url": "https://git.outfoxxed.me/outfoxxed/quickshell" "url": "ssh://git@git.imxyy.top:2222/imxyy1soope1/HF-plant.git"
}, },
"original": { "original": {
"rev": "08dc0b3889797eb3618c7475c3c367ec0e5fdf40",
"type": "git", "type": "git",
"url": "https://git.outfoxxed.me/outfoxxed/quickshell" "url": "ssh://git@git.imxyy.top:2222/imxyy1soope1/HF-plant.git"
} }
}, },
"root": { "root": {
"inputs": { "inputs": {
"catppuccin": "catppuccin",
"chaotic": "chaotic", "chaotic": "chaotic",
"darkly": "darkly", "darkly": "darkly",
"fenix": "fenix", "fenix": "fenix",
@@ -1037,23 +1083,25 @@
"nixpkgs-unstable" "nixpkgs-unstable"
], ],
"nixpkgs-master": "nixpkgs-master", "nixpkgs-master": "nixpkgs-master",
"nixpkgs-stable": "nixpkgs-stable", "nixpkgs-stable": "nixpkgs-stable_2",
"nixpkgs-unstable": "nixpkgs-unstable", "nixpkgs-unstable": "nixpkgs-unstable",
"nur": "nur", "nixpkgs-working": "nixpkgs-working",
"quickshell": "quickshell", "noctalia": "noctalia",
"plant": "plant",
"sops-nix": "sops-nix", "sops-nix": "sops-nix",
"stylix": "stylix", "stylix": "stylix",
"treefmt": "treefmt",
"zen": "zen" "zen": "zen"
} }
}, },
"rust-analyzer-src": { "rust-analyzer-src": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1752086493, "lastModified": 1763747089,
"narHash": "sha256-USpVUdiWXDfPoh+agbvoBQaBhg3ZdKZgHXo/HikMfVo=", "narHash": "sha256-uJH6dz5/lRhoTtQf3NS2zmW3lat/yVdLvCd8O6q07Dg=",
"owner": "rust-lang", "owner": "rust-lang",
"repo": "rust-analyzer", "repo": "rust-analyzer",
"rev": "6e3abe164b9036048dce1a3aa65a7e7e5200c0d3", "rev": "35c06615104e5951be6faed57b8a0cac41051baf",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -1071,11 +1119,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1751856221, "lastModified": 1763433504,
"narHash": "sha256-/QE1eV0ckFvgRMcKjZqgdJDoXFNwSMepwRoBjaw2MCk=", "narHash": "sha256-cVid5UNpk88sPYHkLAA5aZEHOFQXSB/2L1vl18Aq7IM=",
"owner": "oxalica", "owner": "oxalica",
"repo": "rust-overlay", "repo": "rust-overlay",
"rev": "34cae4b56929c5b340e1c5b10d9a98a425b2a51e", "rev": "42ce16c6d8318a654d53f047c9400b7d902d6e61",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -1091,15 +1139,16 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1751606940, "lastModified": 1763683664,
"narHash": "sha256-KrDPXobG7DFKTOteqdSVeL1bMVitDcy7otpVZWDE6MA=", "narHash": "sha256-udat2iCtxeFWSChUEjHzDV8wvRNNtAGrMmeA3d1b7UQ=",
"owner": "Mic92", "owner": "Mic92",
"repo": "sops-nix", "repo": "sops-nix",
"rev": "3633fc4acf03f43b260244d94c71e9e14a2f6e0d", "rev": "4240ffd16aba2d51bac68e3200f1cf7d0325e6e7",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "Mic92", "owner": "Mic92",
"ref": "pull/779/merge",
"repo": "sops-nix", "repo": "sops-nix",
"type": "github" "type": "github"
} }
@@ -1111,13 +1160,13 @@
"base16-helix": "base16-helix", "base16-helix": "base16-helix",
"base16-vim": "base16-vim", "base16-vim": "base16-vim",
"firefox-gnome-theme": "firefox-gnome-theme", "firefox-gnome-theme": "firefox-gnome-theme",
"flake-parts": "flake-parts_4", "flake-parts": "flake-parts_3",
"gnome-shell": "gnome-shell", "gnome-shell": "gnome-shell",
"nixpkgs": [ "nixpkgs": [
"nixpkgs" "nixpkgs"
], ],
"nur": "nur_2", "nur": "nur",
"systems": "systems_2", "systems": "systems_3",
"tinted-foot": "tinted-foot", "tinted-foot": "tinted-foot",
"tinted-kitty": "tinted-kitty", "tinted-kitty": "tinted-kitty",
"tinted-schemes": "tinted-schemes", "tinted-schemes": "tinted-schemes",
@@ -1125,11 +1174,11 @@
"tinted-zed": "tinted-zed" "tinted-zed": "tinted-zed"
}, },
"locked": { "locked": {
"lastModified": 1752201883, "lastModified": 1763767967,
"narHash": "sha256-SZVbQ4YThvYU50cJ4W4GNMy7/rVOJI8qmXqbEcRNsug=", "narHash": "sha256-BMiqCHUxp2zoAjWCpvj5Scf0J+yTiXpkBlFuRo2nFIg=",
"owner": "danth", "owner": "danth",
"repo": "stylix", "repo": "stylix",
"rev": "d395780b9c5c36f191b990b2021c71af180a1982", "rev": "cd11c057b054609b8463c20e6065de424b30b89d",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -1168,6 +1217,21 @@
"type": "github" "type": "github"
} }
}, },
"systems_3": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
},
"tinted-foot": { "tinted-foot": {
"flake": false, "flake": false,
"locked": { "locked": {
@@ -1204,11 +1268,11 @@
"tinted-schemes": { "tinted-schemes": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1750770351, "lastModified": 1757716333,
"narHash": "sha256-LI+BnRoFNRa2ffbe3dcuIRYAUcGklBx0+EcFxlHj0SY=", "narHash": "sha256-d4km8W7w2zCUEmPAPUoLk1NlYrGODuVa3P7St+UrqkM=",
"owner": "tinted-theming", "owner": "tinted-theming",
"repo": "schemes", "repo": "schemes",
"rev": "5a775c6ffd6e6125947b393872cde95867d85a2a", "rev": "317a5e10c35825a6c905d912e480dfe8e71c7559",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -1220,11 +1284,11 @@
"tinted-tmux": { "tinted-tmux": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1751159871, "lastModified": 1757811970,
"narHash": "sha256-UOHBN1fgHIEzvPmdNMHaDvdRMgLmEJh2hNmDrp3d3LE=", "narHash": "sha256-n5ZJgmzGZXOD9pZdAl1OnBu3PIqD+X3vEBUGbTi4JiI=",
"owner": "tinted-theming", "owner": "tinted-theming",
"repo": "tinted-tmux", "repo": "tinted-tmux",
"rev": "bded5e24407cec9d01bd47a317d15b9223a1546c", "rev": "d217ba31c846006e9e0ae70775b0ee0f00aa6b1e",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -1236,11 +1300,11 @@
"tinted-zed": { "tinted-zed": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1751158968, "lastModified": 1757811247,
"narHash": "sha256-ksOyv7D3SRRtebpXxgpG4TK8gZSKFc4TIZpR+C98jX8=", "narHash": "sha256-4EFOUyLj85NRL3OacHoLGEo0wjiRJzfsXtR4CZWAn6w=",
"owner": "tinted-theming", "owner": "tinted-theming",
"repo": "base16-zed", "repo": "base16-zed",
"rev": "86a470d94204f7652b906ab0d378e4231a5b3384", "rev": "824fe0aacf82b3c26690d14e8d2cedd56e18404e",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -1249,19 +1313,37 @@
"type": "github" "type": "github"
} }
}, },
"treefmt": {
"inputs": {
"nixpkgs": "nixpkgs_6"
},
"locked": {
"lastModified": 1762938485,
"narHash": "sha256-AlEObg0syDl+Spi4LsZIBrjw+snSVU4T8MOeuZJUJjM=",
"owner": "numtide",
"repo": "treefmt-nix",
"rev": "5b4ee75aeefd1e2d5a1cc43cf6ba65eba75e83e4",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "treefmt-nix",
"type": "github"
}
},
"xwayland-satellite-stable": { "xwayland-satellite-stable": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1748488455, "lastModified": 1755491097,
"narHash": "sha256-IiLr1alzKFIy5tGGpDlabQbe6LV1c9ABvkH6T5WmyRI=", "narHash": "sha256-m+9tUfsmBeF2Gn4HWa6vSITZ4Gz1eA1F5Kh62B0N4oE=",
"owner": "Supreeeme", "owner": "Supreeeme",
"repo": "xwayland-satellite", "repo": "xwayland-satellite",
"rev": "3ba30b149f9eb2bbf42cf4758d2158ca8cceef73", "rev": "388d291e82ffbc73be18169d39470f340707edaa",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "Supreeeme", "owner": "Supreeeme",
"ref": "v0.6", "ref": "v0.7",
"repo": "xwayland-satellite", "repo": "xwayland-satellite",
"type": "github" "type": "github"
} }
@@ -1269,11 +1351,11 @@
"xwayland-satellite-unstable": { "xwayland-satellite-unstable": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1751228685, "lastModified": 1763704521,
"narHash": "sha256-MENtauGBhJ+kDeFaawvWGXaFG3Il6qQzjaP0RmtfM0k=", "narHash": "sha256-ceYEV6PnvUN8Zixao4gpPuN+VT3B0SlAXKuPNHZhqUY=",
"owner": "Supreeeme", "owner": "Supreeeme",
"repo": "xwayland-satellite", "repo": "xwayland-satellite",
"rev": "557ebeb616e03d5e4a8049862bbbd1f02c6f020b", "rev": "f379ff5722a821212eb59ada9cf8e51cb3654aad",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -1290,11 +1372,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1752164817, "lastModified": 1763780714,
"narHash": "sha256-LJFIx27IOUowLsJn5wci9mHZ4CesJsiAivQWDjnZPCc=", "narHash": "sha256-n2T7r5HkxofkT3mIbb2bNkzacBdhP/bVeph/yGNnBek=",
"owner": "0xc000022070", "owner": "0xc000022070",
"repo": "zen-browser-flake", "repo": "zen-browser-flake",
"rev": "9193992c4c2c4349b4280ec2b49648cae208fe63", "rev": "ef951ed2d976bcd1f57a09f358fdda9fa9425018",
"type": "github" "type": "github"
}, },
"original": { "original": {

154
flake.nix
View File

@@ -3,9 +3,10 @@
inputs = { inputs = {
# Nixpkgs # Nixpkgs
nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable-small"; nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable";
nixpkgs-stable.url = "github:nixos/nixpkgs/release-25.05"; nixpkgs-stable.url = "github:nixos/nixpkgs/release-25.05";
nixpkgs-master.url = "github:nixos/nixpkgs/master"; nixpkgs-master.url = "github:nixos/nixpkgs/master";
nixpkgs-working.url = "github:nixos/nixpkgs/9da7f1cf7f8a6e2a7cb3001b048546c92a8258b4";
# nixpkgs.follows = "nixpkgs-stable"; # nixpkgs.follows = "nixpkgs-stable";
nixpkgs.follows = "nixpkgs-unstable"; nixpkgs.follows = "nixpkgs-unstable";
# nixpkgs.follows = "nixpkgs-master"; # nixpkgs.follows = "nixpkgs-master";
@@ -13,53 +14,81 @@
# Nyxpkgs # Nyxpkgs
chaotic.url = "github:chaotic-cx/nyx/nyxpkgs-unstable"; chaotic.url = "github:chaotic-cx/nyx/nyxpkgs-unstable";
# SOPS # TODO: sops-nix: remove pr patch once merged
sops-nix.url = "github:Mic92/sops-nix"; # https://github.com/Mic92/sops-nix/pull/779
sops-nix.inputs.nixpkgs.follows = "nixpkgs"; sops-nix = {
url = "github:Mic92/sops-nix/pull/779/merge";
inputs.nixpkgs.follows = "nixpkgs";
};
# Home manager # Home manager
home-manager.url = "github:nix-community/home-manager/master"; home-manager = {
home-manager.inputs.nixpkgs.follows = "nixpkgs"; url = "github:nix-community/home-manager/master";
inputs.nixpkgs.follows = "nixpkgs";
};
# Impermanence # Impermanence
impermanence.url = "github:nix-community/impermanence"; impermanence.url = "github:nix-community/impermanence";
# NUR
nur.url = "github:nix-community/NUR";
# Niri # Niri
niri.url = "github:sodiboo/niri-flake"; niri.url = "github:sodiboo/niri-flake";
niri.inputs.nixpkgs.follows = "nixpkgs";
niri.inputs.nixpkgs-stable.follows = "nixpkgs-stable";
quickshell.url = "git+https://git.outfoxxed.me/outfoxxed/quickshell"; darkly = {
quickshell.inputs.nixpkgs.follows = "nixpkgs"; url = "github:Bali10050/Darkly";
inputs.nixpkgs.follows = "nixpkgs";
};
darkly.url = "github:Bali10050/Darkly"; stylix = {
darkly.inputs.nixpkgs.follows = "nixpkgs"; url = "github:danth/stylix";
inputs.nixpkgs.follows = "nixpkgs";
stylix.url = "github:danth/stylix"; };
stylix.inputs.nixpkgs.follows = "nixpkgs";
# go-musicfox # go-musicfox
go-musicfox.url = "github:imxyy1soope1/go-musicfox/master"; go-musicfox = {
go-musicfox.inputs.nixpkgs.follows = "nixpkgs"; url = "github:imxyy1soope1/go-musicfox";
inputs.nixpkgs.follows = "nixpkgs";
};
# NixOS-WSL # NixOS-WSL
nixos-wsl.url = "github:nix-community/NixOS-WSL"; nixos-wsl = {
nixos-wsl.inputs.nixpkgs.follows = "nixpkgs"; url = "github:nix-community/NixOS-WSL";
inputs.nixpkgs.follows = "nixpkgs";
};
fenix.url = "github:nix-community/fenix"; fenix = {
fenix.inputs.nixpkgs.follows = "nixpkgs"; url = "github:nix-community/fenix";
inputs.nixpkgs.follows = "nixpkgs";
};
zen.url = "github:0xc000022070/zen-browser-flake"; zen.url = "github:0xc000022070/zen-browser-flake";
zen.inputs.nixpkgs.follows = "nixpkgs"; zen.inputs.nixpkgs.follows = "nixpkgs";
infuse.url = "git+https://codeberg.org/amjoseph/infuse.nix"; noctalia = {
infuse.flake = false; url = "github:noctalia-dev/noctalia-shell/v3.2.0";
inputs.nixpkgs.follows = "nixpkgs";
};
haumea.url = "github:nix-community/haumea/v0.2.2"; plant = {
haumea.inputs.nixpkgs.follows = "nixpkgs"; url = "git+ssh://git@git.imxyy.top:2222/imxyy1soope1/HF-plant.git?rev=08dc0b3889797eb3618c7475c3c367ec0e5fdf40";
flake = false;
};
catppuccin = {
url = "github:catppuccin/nix";
inputs.nixpkgs.follows = "nixpkgs";
};
infuse = {
url = "git+https://codeberg.org/amjoseph/infuse.nix";
flake = false;
};
haumea = {
url = "github:nix-community/haumea/v0.2.2";
inputs.nixpkgs.follows = "nixpkgs";
};
treefmt.url = "github:numtide/treefmt-nix";
}; };
outputs = outputs =
@@ -71,10 +100,10 @@
let let
inherit (self) outputs; inherit (self) outputs;
vars = import ./vars.nix; vars = import ./vars.nix;
forAllSystems = nixpkgs.lib.genAttrs nixpkgs.lib.systems.flakeExposed; forAllSystems = lib.genAttrs lib.systems.flakeExposed;
forAllHosts = forAllHosts =
mkSystem: mkSystem:
nixpkgs.lib.attrsets.mergeAttrsList ( lib.mergeAttrsList (
builtins.map (hostname: { builtins.map (hostname: {
${hostname} = mkSystem hostname; ${hostname} = mkSystem hostname;
}) (builtins.attrNames (builtins.readDir ./config/hosts)) }) (builtins.attrNames (builtins.readDir ./config/hosts))
@@ -104,23 +133,22 @@
} }
); );
# workaround for "treefmt warning"
formatter = forAllSystems ( formatter = forAllSystems (
system: system:
let let
pkgs = nixpkgs.legacyPackages.${system}; pkgs = nixpkgs.legacyPackages.${system};
treefmtEval = inputs.treefmt.lib.evalModule pkgs ./treefmt.nix;
in in
pkgs.writeShellApplication { treefmtEval.config.build.wrapper
name = "nixfmt-wrapper"; );
check = forAllSystems (
runtimeInputs = with pkgs; [ system:
fd let
nixfmt-rfc-style pkgs = nixpkgs.legacyPackages.${system};
]; treefmtEval = inputs.treefmt.lib.evalModule pkgs ./treefmt.nix;
in
text = '' {
fd "$@" -t f -e nix -x nixfmt '{}' formatting = treefmtEval.config.build.check self;
'';
} }
); );
@@ -136,19 +164,10 @@
inputs.niri.overlays.niri inputs.niri.overlays.niri
inputs.fenix.overlays.default inputs.fenix.overlays.default
(final: prev: { (final: prev: {
darkly-qt5 = inputs.darkly.packages.${final.system}.darkly-qt5; darkly-qt5 = inputs.darkly.packages.${final.stdenv.hostPlatform.system}.darkly-qt5;
darkly-qt6 = inputs.darkly.packages.${final.system}.darkly-qt6; darkly-qt6 = inputs.darkly.packages.${final.stdenv.hostPlatform.system}.darkly-qt6;
})
(final: prev: { noctalia-shell = inputs.noctalia.packages.${final.stdenv.hostPlatform.system}.default;
quickshell = inputs.quickshell.packages.${final.system}.default.override {
withJemalloc = true;
withQtSvg = true;
withWayland = true;
withPipewire = true;
withPam = false;
withX11 = false;
withHyprland = false;
};
}) })
(final: prev: { (final: prev: {
inherit lib; inherit lib;
@@ -160,6 +179,7 @@
inputs.sops-nix.homeManagerModules.sops inputs.sops-nix.homeManagerModules.sops
inputs.impermanence.nixosModules.home-manager.impermanence inputs.impermanence.nixosModules.home-manager.impermanence
inputs.stylix.homeModules.stylix inputs.stylix.homeModules.stylix
inputs.noctalia.homeModules.default
inputs.zen.homeModules.beta inputs.zen.homeModules.beta
# workaround for annoying stylix # workaround for annoying stylix
( (
@@ -185,9 +205,24 @@
outputs outputs
hostname hostname
; ;
sopsRoot = ./secrets; assets =
flake = ./.; with lib.haumea;
} // vars; load {
src = ./assets;
loader = [
(matchers.always loaders.path)
];
};
secrets =
with lib.haumea;
load {
src = ./secrets;
loader = [
(matchers.always loaders.path)
];
};
}
// vars;
modules = modules =
(lib.umport { (lib.umport {
paths = [ ./modules ]; paths = [ ./modules ];
@@ -198,7 +233,7 @@
recursive = true; recursive = true;
}) })
++ [ ++ [
(lib.mkAliasOptionModule [ "my" "home" ] [ "home-manager" "users" vars.username ]) (lib.mkAliasOptionModule [ "my" "hm" ] [ "home-manager" "users" vars.username ])
./config/base.nix ./config/base.nix
./config/hosts/${hostname} ./config/hosts/${hostname}
inputs.chaotic.nixosModules.default inputs.chaotic.nixosModules.default
@@ -206,6 +241,7 @@
inputs.impermanence.nixosModules.impermanence inputs.impermanence.nixosModules.impermanence
inputs.home-manager.nixosModules.default inputs.home-manager.nixosModules.default
inputs.niri.nixosModules.niri inputs.niri.nixosModules.niri
inputs.catppuccin.nixosModules.catppuccin
home home
pkgsConf pkgsConf
]; ];

View File

@@ -36,7 +36,7 @@
optionName = packageName; optionName = packageName;
config' = lib.mkMerge [ config' = lib.mkMerge [
{ {
my.home.home.packages = [ (lib.getAttrFromPath packagePath pkgs) ]; my.hm.home.packages = [ (lib.getAttrFromPath packagePath pkgs) ];
} }
extraConfig extraConfig
]; ];
@@ -55,7 +55,7 @@
config' = lib.mkMerge [ config' = lib.mkMerge [
{ {
my.home.programs = lib.setAttrByPath [ programName "enable" ] true; my.hm.programs = lib.setAttrByPath [ programName "enable" ] true;
} }
extraConfig extraConfig
]; ];

26
modules/audio.nix Normal file
View File

@@ -0,0 +1,26 @@
{
config,
lib,
pkgs,
username,
...
}:
lib.my.makeSwitch {
inherit config;
default = true;
optionName = "default audio settings";
optionPath = [ "audio" ];
config' = {
security.rtkit.enable = true;
services.pipewire = {
enable = true;
alsa.enable = true;
alsa.support32Bit = true;
pulse.enable = true;
audio.enable = true;
};
users.extraUsers.${username}.extraGroups = [ "audio" ];
my.persist.homeDirs = [ ".local/state/wireplumber" ];
my.hm.home.packages = [ pkgs.pwvucontrol ];
};
}

20
modules/bluetooth.nix Normal file
View File

@@ -0,0 +1,20 @@
{ config, lib, ... }:
lib.my.makeSwitch {
inherit config;
default = true;
optionName = "default bluetooth settings";
optionPath = [ "bluetooth" ];
config' = {
hardware.bluetooth = {
enable = true;
powerOnBoot = true;
settings = {
General = {
Enable = "Source,Sink,Media,Socket";
Disable = "HeadSet";
MultiProfile = "multiple";
};
};
};
};
}

View File

@@ -9,9 +9,7 @@ lib.my.makeSwitch {
]; ];
config' = { config' = {
my.cli.media = { my.cli.media = {
cava.enable = true;
go-musicfox.enable = true; go-musicfox.enable = true;
mpd.enable = true;
ffmpeg.enable = true; ffmpeg.enable = true;
}; };
}; };

View File

@@ -1,167 +0,0 @@
## Configuration file for CAVA. Default values are commented out. Use either ';' or '#' for commenting.
[general]
# Smoothing mode. Can be 'normal', 'scientific' or 'waves'.
mode = normal
# Accepts only non-negative values.
framerate = 60
# 'autosens' will attempt to decrease sensitivity if the bars peak. 1 = on, 0 = off
# 'overshoot' allows bars to overshoot (in % of terminal height) without initiating autosens.
; autosens = 1
; overshoot = 20
# Manual sensitivity in %. Autosens must be turned off for this to take effect.
# 200 means double height. Accepts only non-negative values.
; sensitivity = 100
# The number of bars (0-200). 0 sets it to auto (fill up console).
# Bars' width and space between bars in number of characters.
bars = 0
bar_width = 5
bar_spacing = 1
# Lower and higher cutoff frequencies for lowest and highest bars
# the bandwidth of the visualizer.
# Note: there is a minimum total bandwidth of 43Mhz x number of bars.
# Cava will automatically increase the higher cutoff if a too low band is specified.
; lower_cutoff_freq = 50
; higher_cutoff_freq = 10000
[input]
# Audio capturing method. Possible methods are: 'pulse', 'alsa' or 'fifo'.
# Defaults to 'pulse', 'alsa' or 'fifo', in that order, dependent on what support cava was built with.
#
# All input methods uses the same config variable 'source'
# to define where it should get the audio.
#
# For pulseaudio 'source' will be the source. Default: 'auto', which uses the monitor source of the default sink
# (all pulseaudio sinks(outputs) have 'monitor' sources(inputs) associated with them).
#
# For alsa 'source' will be the capture device.
# For fifo 'source' will be the path to fifo-file.
method = pulse
source = auto
; method = alsa
; source = hw:Loopback,1
; method = fifo
; source = /tmp/mpd.fifo
[output]
# Ouput method. Can be 'ncurses', 'noncurses' or 'raw'.
# 'noncurses' is for systems that does not suport ncurses.
# 'raw' is a 16 bit data stream of the bar heights that can be used to send to other applications.
# 'raw' defaults to 200 bars, which can be adjusted in the 'bars' option above.
method = ncurses
# Visual styles. Can be 'stereo' or 'mono'.
# 'stereo' mirrors both channels with low frequencies in center.
# 'mono' averages both channels and outputs left to right lowest to highest frequencies.
style = mono
# Raw output target. A fifo will be created if target does not exist.
; raw_target = /dev/stdout
# Raw data format. Can be 'binary' or 'ascii'.
; data_format = binary
# Binary bit format, can be '8bit' (0-255) or '16bit' (0-65530).
; bit_format = 16bit
# Ascii max value. In 'ascii' mode range will run from 0 to value specified here
; ascii_max_range = 1000
# Ascii delimiters. In ascii format each bar and frame is separated by a delimiters.
# Use decimal value in ascii table (i.e. 59 = ';' and 10 = '\n' (line feed)).
; bar_delimiter = 59
; frame_delimiter = 10
# [color]
# # Colors can be one of seven predefined: black, blue, cyan, green, magenta, red, white, yellow.
# # Or defined by hex code '#xxxxxx' (hex code must be within ''). User defined colors requires a
# # terminal that can change color definitions such as Gnome-terminal or rxvt.
# ; background = black
# ; foreground = cyan
# # Gradient mode, only hex defined colors are supported, background must also be defined in hex
# # or remain commented out. 1 = on, 0 = off. Warning: for certain terminal emulators cava will
# # not able to restore color definitions on exit, simply restart your terminal to restore colors.
# gradient = 1
# gradient_color_1 = '#0099ff'
# gradient_color_2 = '#ff3399'
[smoothing]
# Multiplier for the integral smoothing calculations. Takes values from 0-0.99.
# Higher values means smoother, but less precise. Set to 0 to disable.
; integral = 0.7
# Disables or enables the so-called "Monstercat smoothing". Set to 0 to disable.
; monstercat = 1
; waves = 1
# Set gravity multiplier for "drop off". Higher values means bars will drop faster.
# Accepts only non-negative values. 0.5 means half gravity, 2 means double. Set to 0 to disable "drop off".
; gravity = 2
# In bar height, bars that would have been lower that this will not be drawn.
; ignore = 0
[eq]
# This one is tricky. You can have as much keys as you want.
# Remember to uncomment more then one key! More keys = more precision.
# Look at readme.md on github for further explanations and examples.
#; 1 = 1 # bass
#; 2 = 1
#; 3 = 1 # midtone
#; 4 = 1
#; 5 = 1 # treble
1=1
2=1
3=2
4=1
5=1
[color]
#background = '#191724'
gradient = 1
gradient_count = 6
gradient_color_1 = '#31748f'
gradient_color_2 = '#9ccfd8'
gradient_color_3 = '#c4a7e7'
gradient_color_4 = '#ebbcba'
gradient_color_5 = '#f6c177'
gradient_color_6 = '#eb6f92'
[color]
gradient = 1
gradient_color_1 = '#94e2d5'
gradient_color_2 = '#89dceb'
gradient_color_3 = '#74c7ec'
gradient_color_4 = '#89b4fa'
gradient_color_5 = '#cba6f7'
gradient_color_6 = '#f5c2e7'
gradient_color_7 = '#eba0ac'
gradient_color_8 = '#f38ba8'

View File

@@ -1,167 +0,0 @@
## Configuration file for CAVA. Default values are commented out. Use either ';' or '#' for commenting.
[general]
# Smoothing mode. Can be 'normal', 'scientific' or 'waves'.
mode = normal
# Accepts only non-negative values.
framerate = 60
# 'autosens' will attempt to decrease sensitivity if the bars peak. 1 = on, 0 = off
# 'overshoot' allows bars to overshoot (in % of terminal height) without initiating autosens.
; autosens = 1
; overshoot = 20
# Manual sensitivity in %. Autosens must be turned off for this to take effect.
# 200 means double height. Accepts only non-negative values.
; sensitivity = 100
# The number of bars (0-200). 0 sets it to auto (fill up console).
# Bars' width and space between bars in number of characters.
bars = 0
bar_width = 2
bar_spacing = 1
# Lower and higher cutoff frequencies for lowest and highest bars
# the bandwidth of the visualizer.
# Note: there is a minimum total bandwidth of 43Mhz x number of bars.
# Cava will automatically increase the higher cutoff if a too low band is specified.
; lower_cutoff_freq = 50
; higher_cutoff_freq = 10000
[input]
# Audio capturing method. Possible methods are: 'pulse', 'alsa' or 'fifo'.
# Defaults to 'pulse', 'alsa' or 'fifo', in that order, dependent on what support cava was built with.
#
# All input methods uses the same config variable 'source'
# to define where it should get the audio.
#
# For pulseaudio 'source' will be the source. Default: 'auto', which uses the monitor source of the default sink
# (all pulseaudio sinks(outputs) have 'monitor' sources(inputs) associated with them).
#
# For alsa 'source' will be the capture device.
# For fifo 'source' will be the path to fifo-file.
method = pulse
source = auto
; method = alsa
; source = hw:Loopback,1
; method = fifo
; source = /tmp/mpd.fifo
[output]
# Ouput method. Can be 'ncurses', 'noncurses' or 'raw'.
# 'noncurses' is for systems that does not suport ncurses.
# 'raw' is a 16 bit data stream of the bar heights that can be used to send to other applications.
# 'raw' defaults to 200 bars, which can be adjusted in the 'bars' option above.
method = ncurses
# Visual styles. Can be 'stereo' or 'mono'.
# 'stereo' mirrors both channels with low frequencies in center.
# 'mono' averages both channels and outputs left to right lowest to highest frequencies.
style = mono
# Raw output target. A fifo will be created if target does not exist.
; raw_target = /dev/stdout
# Raw data format. Can be 'binary' or 'ascii'.
; data_format = binary
# Binary bit format, can be '8bit' (0-255) or '16bit' (0-65530).
; bit_format = 16bit
# Ascii max value. In 'ascii' mode range will run from 0 to value specified here
; ascii_max_range = 1000
# Ascii delimiters. In ascii format each bar and frame is separated by a delimiters.
# Use decimal value in ascii table (i.e. 59 = ';' and 10 = '\n' (line feed)).
; bar_delimiter = 59
; frame_delimiter = 10
# [color]
# # Colors can be one of seven predefined: black, blue, cyan, green, magenta, red, white, yellow.
# # Or defined by hex code '#xxxxxx' (hex code must be within ''). User defined colors requires a
# # terminal that can change color definitions such as Gnome-terminal or rxvt.
# ; background = black
# ; foreground = cyan
# # Gradient mode, only hex defined colors are supported, background must also be defined in hex
# # or remain commented out. 1 = on, 0 = off. Warning: for certain terminal emulators cava will
# # not able to restore color definitions on exit, simply restart your terminal to restore colors.
# gradient = 1
# gradient_color_1 = '#0099ff'
# gradient_color_2 = '#ff3399'
[smoothing]
# Multiplier for the integral smoothing calculations. Takes values from 0-0.99.
# Higher values means smoother, but less precise. Set to 0 to disable.
; integral = 0.7
# Disables or enables the so-called "Monstercat smoothing". Set to 0 to disable.
; monstercat = 1
; waves = 1
# Set gravity multiplier for "drop off". Higher values means bars will drop faster.
# Accepts only non-negative values. 0.5 means half gravity, 2 means double. Set to 0 to disable "drop off".
; gravity = 1
# In bar height, bars that would have been lower that this will not be drawn.
; ignore = 0
[eq]
# This one is tricky. You can have as much keys as you want.
# Remember to uncomment more then one key! More keys = more precision.
# Look at readme.md on github for further explanations and examples.
#; 1 = 1 # bass
#; 2 = 1
#; 3 = 1 # midtone
#; 4 = 1
#; 5 = 1 # treble
1=1
2=1
3=2
4=1
5=1
[color]
#background = '#191724'
gradient = 1
gradient_count = 6
gradient_color_1 = '#31748f'
gradient_color_2 = '#9ccfd8'
gradient_color_3 = '#c4a7e7'
gradient_color_4 = '#ebbcba'
gradient_color_5 = '#f6c177'
gradient_color_6 = '#eb6f92'
[color]
gradient = 1
gradient_color_1 = '#94e2d5'
gradient_color_2 = '#89dceb'
gradient_color_3 = '#74c7ec'
gradient_color_4 = '#89b4fa'
gradient_color_5 = '#cba6f7'
gradient_color_6 = '#f5c2e7'
gradient_color_7 = '#eba0ac'
gradient_color_8 = '#f38ba8'

View File

@@ -1,79 +0,0 @@
#version 330
in vec2 fragCoord;
out vec4 fragColor;
// bar values. defaults to left channels first (low to high), then right (high to low).
uniform float bars[512];
uniform int bars_count; // number of bars (left + right) (configurable)
uniform int bar_width; // bar width (configurable), not used here
uniform int bar_spacing; // space bewteen bars (configurable)
uniform vec3 u_resolution; // window resolution
//colors, configurable in cava config file (r,g,b) (0.0 - 1.0)
uniform vec3 bg_color; // background color
uniform vec3 fg_color; // foreground color
uniform int gradient_count;
uniform vec3 gradient_colors[8]; // gradient colors
vec3 normalize_C(float y,vec3 col_1, vec3 col_2, float y_min, float y_max)
{
//create color based on fraction of this color and next color
float yr = (y - y_min) / (y_max - y_min);
return col_1 * (1.0 - yr) + col_2 * yr;
}
void main()
{
// find which bar to use based on where we are on the x axis
float x = u_resolution.x * fragCoord.x;
int bar = int(bars_count * fragCoord.x);
//calculate a bar size
float bar_size = u_resolution.x / bars_count;
//the y coordinate and bar values are the same
float y = bars[bar];
// make sure there is a thin line at bottom
if (y * u_resolution.y < 1.0)
{
y = 1.0 / u_resolution.y;
}
//draw the bar up to current height
if (y > fragCoord.y)
{
//make some space between bars basen on settings
if (x > (bar + 1) * (bar_size) - bar_spacing)
{
fragColor = vec4(bg_color,1.0);
}
else
{
if (gradient_count == 0)
{
fragColor = vec4(fg_color,1.0);
}
else
{
//find which color in the configured gradient we are at
int color = int((gradient_count - 1) * fragCoord.y);
//find where on y this and next color is supposed to be
float y_min = color / (gradient_count - 1.0);
float y_max = (color + 1.0) / (gradient_count - 1.0);
//make color
fragColor = vec4(normalize_C(fragCoord.y, gradient_colors[color], gradient_colors[color + 1], y_min, y_max), 1.0);
}
}
}
else
{
fragColor = vec4(bg_color,1.0);
}
}

View File

@@ -1,38 +0,0 @@
#version 330
in vec2 fragCoord;
out vec4 fragColor;
// bar values. defaults to left channels first (low to high), then right (high to low).
uniform float bars[512];
uniform int bars_count; // number of bars (left + right) (configurable)
uniform vec3 u_resolution; // window resolution, not used here
//colors, configurable in cava config file
uniform vec3 bg_color; // background color(r,g,b) (0.0 - 1.0), not used here
uniform vec3 fg_color; // foreground color, not used here
float normalize_C(float x, float x_min, float x_max, float r_min, float r_max )
{
float xr;
xr = (r_max-r_min) * (x - x_min) / (x_max - x_min) + r_min;
return xr;
}
void main()
{
// find which bar to use based on where we are on the x axis
int bar = int(bars_count * fragCoord.x);
// create a normal along the y axis based on the bar height
float x = normalize_C(fragCoord.y, 1.0, 0.0, 0.0, bars[bar]);
// set color
fragColor.r=fg_color.x*x;
fragColor.g=fg_color.y*x;
fragColor.b=fg_color.z*x;
fragColor.a=1.0;
}

View File

@@ -1,34 +0,0 @@
#version 330
in vec2 fragCoord;
out vec4 fragColor;
// bar values. defaults to left channels first (low to high), then right (high to low).
uniform float bars[512];
uniform int bars_count; // number of bars (left + right) (configurable)
uniform vec3 u_resolution; // window resolution, not used here
//colors, configurable in cava config file
uniform vec3 bg_color; // background color(r,g,b) (0.0 - 1.0), not used here
uniform vec3 fg_color; // foreground color, not used here
void main()
{
// find which bar to use based on where we are on the x axis
int bar = int(bars_count * fragCoord.x);
float bar_y = 1.0 - abs((fragCoord.y - 0.5)) * 2.0;
float y = (bars[bar]) * bar_y;
float bar_x = (fragCoord.x - float(bar) / float(bars_count)) * bars_count;
float bar_r = 1.0 - abs((bar_x - 0.5)) * 2;
bar_r = bar_r * bar_r * 2;
// set color
fragColor.r = fg_color.x * y * bar_r;
fragColor.g = fg_color.y * y * bar_r;
fragColor.b = fg_color.z * y * bar_r;
}

View File

@@ -1,14 +0,0 @@
#version 330
// Input vertex data, different for all executions of this shader.
layout(location = 0) in vec3 vertexPosition_modelspace;
// Output data ; will be interpolated for each fragment.
out vec2 fragCoord;
void main()
{
gl_Position = vec4(vertexPosition_modelspace,1);
fragCoord = (vertexPosition_modelspace.xy+vec2(1,1))/2.0;
}

View File

@@ -1,22 +0,0 @@
{
config,
lib,
pkgs,
...
}:
lib.my.makeHomePackageConfig {
inherit config pkgs;
packageName = "cava";
packagePath = [ "cava" ];
optionPath = [
"cli"
"media"
"cava"
];
extraConfig = {
my.home.xdg.configFile."cava" = {
source = ./config;
recursive = true;
};
};
}

View File

@@ -2,6 +2,7 @@
config, config,
lib, lib,
pkgs, pkgs,
secrets,
... ...
}: }:
lib.my.makeSwitch { lib.my.makeSwitch {
@@ -14,21 +15,25 @@ lib.my.makeSwitch {
]; ];
config' = { config' = {
my = { my = {
home = { hm = {
home.packages = with pkgs; [ home.packages = with pkgs; [
playerctl playerctl
go-musicfox go-musicfox
]; ];
xdg.configFile."go-musicfox/go-musicfox.ini".source = ./go-musicfox.ini; sops.secrets.go-musicfox = {
sopsFile = secrets.go-musicfox;
format = "binary";
path = "${config.my.hm.xdg.configHome}/go-musicfox/config.toml";
};
}; };
cli.media.mpd.enable = true; desktop.media.mpv.enable = lib.mkForce true;
persist.homeDirs = [ persist.homeDirs = [
".config/go-musicfox/db" ".local/share/go-musicfox/db"
]; ];
persist.homeFiles = [ persist.homeFiles = [
".config/go-musicfox/cookie" ".local/share/go-musicfox/cookie"
]; ];
}; };
}; };

View File

@@ -1,97 +0,0 @@
# 启动页配置
[startup]
# 是否显示启动页
show=false
# 启动页进度条是否有回弹效果
progressOutBounce=true
# 启动页时长
loadingSeconds=2
# 启动页欢迎语
welcome=musicfox
# 启动时自动签到
signin=false
# 进度条配置
[progress]
# 进度条已加载字符
fullChar=#
# 进度条未加载字符
emptyChar=
# 主页面配置
[main]
# 是否显示标题
showTitle=true
# 加载中提示
loadingText=[加载中...]
# 歌曲音质可选项standard, exhigh, lossless, hires, jyeffect(高清环绕声), sky(沉浸环绕声), jymaster(超清母带) 进行音质判断
songLevel=hires
# 主题颜色
# 随机
# primaryColor=random
# 经典网易云音乐红
#primaryColor="#ea403f"
primaryColor="#6186D9"
# 是否显示歌词
showLyric=true
# 歌词偏移 ms
lyricOffset=0
# 显示歌词翻译
showLyricTrans=true
# 是否显示通知信息
showNotify=false
# 开启pprof, --pprof时会开启
pprofPort=9876
# altScreen显示模式
altScreen=true
# 双列显示,开启务必使用等宽字体
doubleColumn=true
# 下载目录,默认为$HOME/.go-musicfox/download
downloadDir=/home/imxyy/Music/go-musicfox
# 缓存目录,默认为${MUSICFOX_ROOT}/cache
cacheDir=/home/imxyy/Music/go-musicfox/.cache
# 缓存大小以MB为单位0为不使用缓存-1为不限制默认为0
cacheLimit=-1
# 是否显示歌单下所有歌曲默认不开启仅获取歌单前1000首开启后可能会占用更多内存大量歌曲数据和带宽会同时发送多个请求获取歌单下歌曲数据
showAllSongsOfPlaylist=false
# 动态显示menu行数
dynamicMenuRows=true
enableMouseEvent = false
[autoplay]
# 是否开启自动播放,默认不开启
autoPlay=true
# 自动播放歌单dailyReco,like,no保持上次退出时的设置无视offset,name:歌单名默认dailyReco
autoPlayList="no"
# 播放偏移0为第一首-1为最后一首默认为0
offset=0
# 播放模式listLoop, order, singleLoop, random, intelligent心动, last上次退出时的模式,default默认为last
playMode=singleLoop
[player]
# 播放引擎 beep / mpd(需要安装配置mpd) / osx(Mac才可用)
# 不填Mac默认使用osx其他系统默认使用beep推荐的配置
engine=mpd
# beep使用的mp3解码器可选go-mp3, minimp3 (minimp3更少的CPU占用但是稳定性不如go-mp3)
#beepMp3Decoder=go-mp3
# mpd配置
mpdBin=mpd
# !!!注意!!! 一定要在配置文件中设置pid_file否则在退出时不会kill掉mpd进程
mpdConfigFile=/home/imxyy/.config/mpd/mpd.conf
mpdNetwork=tcp
mpdAddr=127.0.0.1:6600
[unm]
# UNM开关
switch=true
# UNM源: kuwo,kugou,migu,qq
sources=kuwo,kugou
# UNM搜索其他平台限制 0-3
searchLimit=0
# 解除会员限制
enableLocalVip=true
# 解除音质限制
unlockSoundEffects=true
# QQ音乐cookie文件
qqCookieFile=

View File

@@ -1,28 +0,0 @@
{
config,
lib,
pkgs,
...
}:
lib.my.makeSwitch {
inherit config;
optionName = "mpd";
optionPath = [
"cli"
"media"
"mpd"
];
config' = {
my.home = {
home.packages = with pkgs.stable; [
mpd
mpc-cli
];
services.mpris-proxy.enable = true;
xdg.configFile."mpd/mpd.conf".source = ./mpd.conf;
};
my.persist.homeFiles = [
".config/mpd/mpd.db"
];
};
}

View File

@@ -1,30 +0,0 @@
bind_to_address "127.0.0.1"
port "6600"
music_directory "/home/imxyy/Music/go-musicfox/.cache"
pid_file "/home/imxyy/.config/mpd/mpd.pid"
db_file "/home/imxyy/.config/mpd/mpd.db"
input {
plugin "file"
enabled "yes"
}
input {
plugin "curl"
enabled "yes"
}
decoder {
plugin "ffmpeg"
enabled "yes"
}
audio_output {
type "pipewire"
name "pipewire"
}
audio_output {
type "pulse"
name "pulseaudio"
}

View File

@@ -42,15 +42,18 @@ lib.my.makeSwitch {
dnsutils dnsutils
killall killall
comma
]; ];
programs.dconf.enable = true; programs.dconf.enable = true;
my.home = { my.hm = {
home.packages = with pkgs; [ home.packages = with pkgs; [
lsd lsd
fd fd
neofetch neofetch
fastfetch
fzf fzf
bat bat
ripgrep ripgrep
@@ -80,6 +83,119 @@ lib.my.makeSwitch {
enableAutoUpdates = true; enableAutoUpdates = true;
settings.updates.auto_update = true; settings.updates.auto_update = true;
}; };
programs.television = {
enable = true;
enableZshIntegration = true;
};
xdg.configFile."fastfetch/config.jsonc".text = ''
{
"$schema": "https://github.com/fastfetch-cli/fastfetch/raw/dev/doc/json_schema.json",
"display": {
"separator": " "
},
"modules": [
// Title
{
"type": "title",
"format": "{user-name-colored}{#}@{host-name-colored}"
},
{
"type": "custom",
"format": "---------------"
},
// System Information
{
"type": "custom",
"format": "{#}System Information"
},
{
"type": "os",
"key": "{#keys}󰍹 OS"
},
{
"type": "kernel",
"key": "{#keys}󰒋 Kernel"
},
{
"type": "uptime",
"key": "{#keys}󰅐 Uptime"
},
{
"type": "packages",
"key": "{#keys}󰏖 Packages",
"format": "{all}"
},
{
"type": "custom",
"format": ""
},
// Desktop Environment
{
"type": "custom",
"format": "{#}Desktop Environment"
},
{
"type": "de",
"key": "{#keys}󰧨 DE"
},
{
"type": "wm",
"key": "{#keys}󱂬 WM"
},
{
"type": "wmtheme",
"key": "{#keys}󰉼 Theme"
},
{
"type": "display",
"key": "{#keys}󰹑 Resolution"
},
{
"type": "shell",
"key": "{#keys}󰞷 Shell"
},
{
"type": "terminalfont",
"key": "{#keys}󰛖 Font"
},
{
"type": "custom",
"format": ""
},
// Hardware Information
{
"type": "custom",
"format": "{#}Hardware Information"
},
{
"type": "cpu",
"key": "{#keys}󰻠 CPU"
},
{
"type": "gpu",
"key": "{#keys}󰢮 GPU"
},
{
"type": "memory",
"key": "{#keys}󰍛 Memory"
},
{
"type": "disk",
"key": "{#keys}󰋊 Disk (/)",
"folders": "/"
},
{
"type": "custom",
"format": ""
},
// Colors
{
"type": "colors",
"symbol": "circle"
},
]
}
'';
}; };
}; };
} }

View File

@@ -14,7 +14,7 @@ lib.my.makeHomePackageConfig {
"btop" "btop"
]; ];
extraConfig = { extraConfig = {
my.home.xdg.configFile."btop" = { my.hm.xdg.configFile."btop" = {
source = ./config; source = ./config;
recursive = true; recursive = true;
}; };

View File

@@ -15,9 +15,9 @@ lib.my.makeSwitch {
]; ];
config' = { config' = {
my.persist.homeDirs = [ ".local/share/zoxide" ]; my.persist.homeDirs = [ ".local/share/zoxide" ];
my.home = my.hm =
let let
stateHome = config.my.home.xdg.stateHome; stateHome = config.my.hm.xdg.stateHome;
zsh-syntax-highlighting = pkgs.fetchFromGitHub { zsh-syntax-highlighting = pkgs.fetchFromGitHub {
owner = "zsh-users"; owner = "zsh-users";
repo = "zsh-syntax-highlighting"; repo = "zsh-syntax-highlighting";
@@ -44,11 +44,11 @@ lib.my.makeSwitch {
jj = { jj = {
ignore_timeout = true; ignore_timeout = true;
description = "The current jj status"; description = "The current jj status";
when = "jj root"; when = true;
symbol = " ";
command = '' command = ''
jj log --revisions @ --no-graph --ignore-working-copy --color always --limit 1 --template ' jj log --revisions @ --no-graph --ignore-working-copy --color always --limit 1 --template '
separate(" ", separate(" ",
" ",
change_id.shortest(4), change_id.shortest(4),
bookmarks, bookmarks,
"|", "|",
@@ -64,19 +64,9 @@ lib.my.makeSwitch {
"(no description set)", "(no description set)",
) ++ raw_escape_sequence("\x1b[0m"), ) ++ raw_escape_sequence("\x1b[0m"),
) )
' ' || (starship module git_branch && starship module git_status)
''; '';
}; };
git_branch = {
when = true;
command = "jj root >/dev/null 2>&1 || starship module git_branch";
description = "Only show git_branch if we're not in a jj repo";
};
git_status = {
when = true;
command = "jj root >/dev/null 2>&1 || starship module git_status";
description = "Only show git_status if we're not in a jj repo";
};
}; };
git_state.disabled = true; git_state.disabled = true;
git_commit.disabled = true; git_commit.disabled = true;
@@ -88,7 +78,7 @@ lib.my.makeSwitch {
}; };
programs.zsh = { programs.zsh = {
enable = true; enable = true;
dotDir = ".config/zsh"; dotDir = "${config.my.hm.xdg.configHome}/zsh";
history = { history = {
path = "${stateHome}/zsh_history"; path = "${stateHome}/zsh_history";
ignorePatterns = [ ignorePatterns = [
@@ -117,7 +107,7 @@ lib.my.makeSwitch {
x = "extract"; x = "extract";
ls = "lsd"; ls = "lsd";
svim = "sudoedit"; svim = "sudoedit";
nf = "neofetch"; nf = "fastfetch";
tmux = "tmux -T RGB,focus,overline,mouse,clipboard,usstyle"; tmux = "tmux -T RGB,focus,overline,mouse,clipboard,usstyle";
pastart = "pasuspender true"; pastart = "pasuspender true";
}; };

View File

@@ -16,22 +16,24 @@ lib.my.makeHomeProgramConfig {
"git" "git"
]; ];
extraConfig = { extraConfig = {
my.home = { my.hm = {
programs.git = { programs.git = {
userName = "${userfullname}"; settings = {
userEmail = "${useremail}";
signing = {
format = "ssh";
signByDefault = true;
key = "/home/${username}/.ssh/id_ed25519";
};
extraConfig = {
push.autoSetupRemote = true;
gpg.ssh.allowedSignersFile = gpg.ssh.allowedSignersFile =
(pkgs.writeText "allowed_signers" '' (pkgs.writeText "allowed_signers" ''
imxyy1soope1@gmail.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOEFLUkyeaK8ZPPZdVNEmtx8zvoxi7xqS2Z6oxRBuUPO imxyy@imxyy-nix imxyy1soope1@gmail.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOEFLUkyeaK8ZPPZdVNEmtx8zvoxi7xqS2Z6oxRBuUPO imxyy@imxyy-nix
imxyy@imxyy.top ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOEFLUkyeaK8ZPPZdVNEmtx8zvoxi7xqS2Z6oxRBuUPO imxyy@imxyy-nix imxyy@imxyy.top ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOEFLUkyeaK8ZPPZdVNEmtx8zvoxi7xqS2Z6oxRBuUPO imxyy@imxyy-nix
'').outPath; '').outPath;
push.autoSetupRemote = true;
user = {
name = userfullname;
email = useremail;
};
};
signing = {
format = "ssh";
signByDefault = true;
key = "/home/${username}/.ssh/id_ed25519";
}; };
}; };
programs.lazygit = { programs.lazygit = {

View File

@@ -16,7 +16,7 @@ lib.my.makeHomeProgramConfig {
"jj" "jj"
]; ];
extraConfig = { extraConfig = {
my.home = { my.hm = {
programs.jujutsu = { programs.jujutsu = {
settings = { settings = {
user = { user = {
@@ -26,6 +26,7 @@ lib.my.makeHomeProgramConfig {
ui = { ui = {
graph.style = "square"; graph.style = "square";
default-command = "status"; default-command = "status";
conflict-marker-style = "snapshot";
}; };
signing = { signing = {
backend = "ssh"; backend = "ssh";

View File

@@ -13,7 +13,7 @@ lib.my.makeHomeProgramConfig {
"neovim" "neovim"
]; ];
extraConfig = { extraConfig = {
my.home = { my.hm = {
xdg.configFile."nvim/init.lua".source = ./nvim/init.lua; xdg.configFile."nvim/init.lua".source = ./nvim/init.lua;
xdg.configFile."nvim/lua" = { xdg.configFile."nvim/lua" = {
source = ./nvim/lua; source = ./nvim/lua;
@@ -26,31 +26,9 @@ lib.my.makeHomeProgramConfig {
vimAlias = true; vimAlias = true;
vimdiffAlias = true; vimdiffAlias = true;
extraPackages = with pkgs; [ extraPackages = with pkgs; [
gcc gcc # treesitter
gnumake
pyright ripgrep # telescope
clang-tools
rust-analyzer
pest-ide-tools
nixd
gotools
gopls
stylua
lua-language-server
nodePackages.vscode-langservers-extracted
nodePackages.typescript-language-server
vue-language-server
typescript
nodejs
ripgrep
]; ];
}; };
}; };

View File

@@ -4,5 +4,3 @@ require("core.keymaps")
require("langs.langs-setup") require("langs.langs-setup")
require("plugins.plugins-setup") require("plugins.plugins-setup")
require("core.autostart")

View File

@@ -1,7 +0,0 @@
-- Open tree when in config dir
local configdir = vim.fn.system("echo $HOME/.config")
configdir = string.sub(configdir, 1, string.len(configdir) - 1)
if string.find(vim.fn.system("pwd"), configdir) ~= nil then
vim.cmd("NvimTreeOpen")
vim.cmd("NvimTmuxNavigateRight")
end

View File

@@ -7,33 +7,21 @@ local buf_kill = globals.buf_kill
keymap.set("v", "<S-pageup>", ":m '<-2<CR>gv=gv", opt) keymap.set("v", "<S-pageup>", ":m '<-2<CR>gv=gv", opt)
keymap.set("v", "<S-pagedown>", ":m '>+1<CR>gv=gv", opt) keymap.set("v", "<S-pagedown>", ":m '>+1<CR>gv=gv", opt)
keymap.set({ "i", "n", "v" }, "<S-up>", "<up>", opt)
keymap.set({ "i", "n", "v" }, "<S-down>", "<down>", opt)
keymap.set("n", "<leader>nh", ":nohl<CR>", opt) keymap.set("n", "<leader>nh", ":nohl<CR>", opt)
keymap.set("n", "<leader>sv", "<C-w>v", opt) keymap.set("n", "<leader>sv", "<C-w>v", opt)
keymap.set("n", "<leader>sh", "<C-w>s", opt) keymap.set("n", "<leader>sh", "<C-w>s", opt)
keymap.set("i", "<S-up>", "<ESC>v<up>", opt)
keymap.set("i", "<S-down>", "<ESC>v<down>", opt)
keymap.set("n", "<S-up>", "v<up>", opt)
keymap.set("n", "<S-down>", "v<down>", opt)
keymap.set("v", "<S-up>", "<up>", opt)
keymap.set("v", "<S-down>", "<down>", opt)
keymap.set("i", "<S-left>", "<ESC>v<left>", opt)
keymap.set("i", "<S-right>", "<ESC>v<right>", opt)
keymap.set("n", "<S-left>", "v<left>", opt)
keymap.set("n", "<S-right>", "v<right>", opt)
keymap.set("v", "<S-left>", "<left>", opt)
keymap.set("v", "<S-right>", "<right>", opt)
keymap.set("v", ".", ">gv", opt) keymap.set("v", ".", ">gv", opt)
keymap.set("v", ",", "<gv", opt) keymap.set("v", ",", "<gv", opt)
keymap.set({ "n", "v" }, "<pageup>", "9k", opt) keymap.set({ "n", "v" }, "<pageup>", "9k", opt)
keymap.set({ "n", "v" }, "<pagedown>", "9j", opt) keymap.set({ "n", "v" }, "<pagedown>", "9j", opt)
keymap.set("i", "<pageup>", "<up><up><up><up><up><up><up><up><up>", opt) keymap.set("i", "<pageup>", string.rep("<up>", 9), opt)
keymap.set("i", "<pagedown>", "<down><down><down><down><down><down><down><down><down>", opt) keymap.set("i", "<pagedown>", string.rep("<down>", 9), opt)
keymap.set("n", "<leader>ww", ":w<CR>", opt) keymap.set("n", "<leader>ww", ":w<CR>", opt)
keymap.set("n", "<leader>so", ":so<CR>", opt) keymap.set("n", "<leader>so", ":so<CR>", opt)
@@ -54,15 +42,6 @@ keymap.set("n", "L", ":BufferLineCycleNext<CR>", opt)
keymap.set("n", "<A-h>", ":BufferLineMovePrev<CR>", opt) keymap.set("n", "<A-h>", ":BufferLineMovePrev<CR>", opt)
keymap.set("n", "<A-l>", ":BufferLineMoveNext<CR>", opt) keymap.set("n", "<A-l>", ":BufferLineMoveNext<CR>", opt)
-- reload config
keymap.set("n", "<leader>rc", ":so ~/.config/nvim/init.lua<CR>", opt)
keymap.set("n", "<leader>rp", ":so ~/.config/nvim/lua/plugins/plugins-setup.lua<CR>", opt)
-- Workspaces
keymap.set("n", "<leader>wo", ":Telescope workspaces<CR>", opt)
keymap.set("n", "<leader>wa", ":WorkspacesAdd<CR>", opt)
keymap.set("n", "<leader>wr", ":WorkspacesRemove<CR>", opt)
-- Neovide config -- Neovide config
if vim.g.neovide then if vim.g.neovide then
keymap.set("v", "<C-C>", '"+y', opt) keymap.set("v", "<C-C>", '"+y', opt)

View File

@@ -30,6 +30,8 @@ opt.timeoutlen = 500
opt.completeopt = "" opt.completeopt = ""
opt.exrc = true
opt.autoread = true opt.autoread = true
vim.g.autoread = true vim.g.autoread = true

View File

@@ -9,6 +9,7 @@ local servers = {
"cssls", "cssls",
"nixd", "nixd",
"html", "html",
"java_language_server",
} }
local extra_config = { local extra_config = {
@@ -35,7 +36,7 @@ local extra_config = {
}, },
rust_analyzer = { rust_analyzer = {
settings = { settings = {
rust_analyzer = { ["rust-analyzer"] = {
check = { check = {
command = "clippy", command = "clippy",
}, },
@@ -63,8 +64,8 @@ local extra_config = {
}, },
}, },
qmlls = { qmlls = {
cmd = {"qmlls", "-E"} cmd = { "qmlls", "-E" },
} },
} }
local capabilities = require("cmp_nvim_lsp").default_capabilities() local capabilities = require("cmp_nvim_lsp").default_capabilities()
@@ -73,7 +74,6 @@ capabilities.textDocument.foldingRange = {
dynamicRegistration = false, dynamicRegistration = false,
lineFoldingOnly = true, lineFoldingOnly = true,
} }
local lspconfig = require("lspconfig")
for _, server in ipairs(servers) do for _, server in ipairs(servers) do
local extra = extra_config[server] or {} local extra = extra_config[server] or {}
local config = { local config = {
@@ -82,5 +82,6 @@ for _, server in ipairs(servers) do
for k, v in pairs(extra) do for k, v in pairs(extra) do
config[k] = v config[k] = v
end end
lspconfig[server].setup(config) vim.lsp.config(server, config)
vim.lsp.enable(server)
end end

View File

@@ -1,6 +0,0 @@
M = {
-- ensure_installed = require("plugins.lsp.servers")
ensure_installed = {},
}
return M

View File

@@ -1,11 +0,0 @@
M = {
ui = {
icons = {
package_installed = "",
package_pending = "",
package_uninstalled = "",
},
},
}
return M

View File

@@ -1,14 +0,0 @@
M = {
"lua_ls",
"pyright",
"gopls",
"clangd",
"rust_analyzer",
"ts_ls",
"jsonls",
"cssls",
"nil_ls",
"html",
}
return M

View File

@@ -17,4 +17,16 @@ local opt = require("core.globals").keymap_opt
vim.keymap.set("n", "<leader>e", ":NvimTreeToggle<CR>", opt) vim.keymap.set("n", "<leader>e", ":NvimTreeToggle<CR>", opt)
vim.keymap.set("n", "<leader>te", ":NvimTreeFocus<CR>", opt) vim.keymap.set("n", "<leader>te", ":NvimTreeFocus<CR>", opt)
vim.api.nvim_create_autocmd("BufEnter", {
group = vim.api.nvim_create_augroup("NvimTreeCloseOnLast", { clear = true }),
pattern = "NvimTree*",
callback = function()
if vim.api.nvim_call_function("winlayout", {})[1] == "leaf" and vim.bo.filetype == "NvimTree" then
vim.defer_fn(function()
vim.cmd("NvimTreeClose")
end, 10)
end
end,
})
return M return M

View File

@@ -62,6 +62,11 @@ local plugins = {
require("ibl").setup(require("plugins.indent-blankline")) require("ibl").setup(require("plugins.indent-blankline"))
end, end,
}, },
{
"norcalli/nvim-colorizer.lua",
event = "VeryLazy",
opt = {},
},
{ {
"neovim/nvim-lspconfig", "neovim/nvim-lspconfig",
dependencies = { "hrsh7th/cmp-nvim-lsp" }, dependencies = { "hrsh7th/cmp-nvim-lsp" },
@@ -113,7 +118,7 @@ local plugins = {
"MysticalDevil/inlay-hints.nvim", "MysticalDevil/inlay-hints.nvim",
event = "LspAttach", event = "LspAttach",
dependencies = { "neovim/nvim-lspconfig" }, dependencies = { "neovim/nvim-lspconfig" },
opts = {} opts = {},
}, },
{ {
"hedyhli/outline.nvim", "hedyhli/outline.nvim",
@@ -149,7 +154,7 @@ local plugins = {
{ {
"numToStr/Comment.nvim", "numToStr/Comment.nvim",
event = "VeryLazy", event = "VeryLazy",
opts = {} opts = {},
}, },
{ {
"windwp/nvim-autopairs", "windwp/nvim-autopairs",
@@ -179,22 +184,42 @@ local plugins = {
require("telescope").setup(require("plugins.telescope")) require("telescope").setup(require("plugins.telescope"))
end, end,
}, },
{
"dnlhc/glance.nvim",
cmd = "Glance",
keys = {
{
"<leader>lr",
"<cmd>Glance references<cr>",
},
{
"<leader>ld",
"<cmd>Glance definitions<cr>",
},
{
"<leader>lD",
"<cmd>Glance type_definitions<cr>",
},
{
"<leader>li",
"<cmd>Glance implementations<cr>",
},
},
},
{ {
"ggandor/leap.nvim", "ggandor/leap.nvim",
dependencies = { "tpope/vim-repeat" }, dependencies = { "tpope/vim-repeat" },
config = function() config = function()
require("leap").set_default_mappings() vim.keymap.set({ "n", "x", "o" }, "s", "<Plug>(leap)")
vim.keymap.set("n", "S", "<Plug>(leap-from-window)")
-- Exclude whitespace and the middle of alphabetic words from preview: -- Exclude whitespace and the middle of alphabetic words from preview:
-- foobar[baaz] = quux -- foobar[baaz] = quux
-- ^----^^^--^^-^-^--^ -- ^----^^^--^^-^-^--^
require('leap').opts.preview_filter = function(ch0, ch1, ch2) require("leap").opts.preview_filter = function(ch0, ch1, ch2)
return not ( return not (ch1:match("%s") or ch0:match("%a") and ch1:match("%a") and ch2:match("%a"))
ch1:match('%s') or
ch0:match('%a') and ch1:match('%a') and ch2:match('%a')
)
end
require('leap.user').set_repeat_keys('<enter>', '<backspace>')
end end
require("leap.user").set_repeat_keys("<enter>", "<backspace>")
end,
}, },
{ {
"alexghergh/nvim-tmux-navigation", "alexghergh/nvim-tmux-navigation",

View File

@@ -35,9 +35,6 @@ keymap.set("n", "<leader>gf", builtin.git_files, opt)
keymap.set("n", "<leader>fg", builtin.live_grep, opt) keymap.set("n", "<leader>fg", builtin.live_grep, opt)
keymap.set("n", "<leader>fb", builtin.buffers, opt) keymap.set("n", "<leader>fb", builtin.buffers, opt)
keymap.set("n", "<leader>fh", builtin.help_tags, opt) keymap.set("n", "<leader>fh", builtin.help_tags, opt)
-- keymap.set('n', '<leader>lD', builtin.diagnostics, opt)
keymap.set("n", "<leader>ld", builtin.lsp_definitions, opt)
keymap.set("n", "<leader>lr", builtin.lsp_references, opt)
keymap.set("n", "<leader>ls", builtin.lsp_document_symbols, opt) keymap.set("n", "<leader>ls", builtin.lsp_document_symbols, opt)
keymap.set("n", "<leader>/", builtin.current_buffer_fuzzy_find, opt) keymap.set("n", "<leader>/", builtin.current_buffer_fuzzy_find, opt)

View File

@@ -13,7 +13,7 @@ lib.my.makeHomeProgramConfig {
"vscode" "vscode"
]; ];
extraConfig = { extraConfig = {
my.home = { my.hm = {
programs.vscode = { programs.vscode = {
package = pkgs.vscodium; package = pkgs.vscodium;
}; };

View File

@@ -15,6 +15,7 @@ lib.my.makeSwitch {
python.enable = true; python.enable = true;
rust.enable = true; rust.enable = true;
lua.enable = true; lua.enable = true;
java.enable = true;
qml.enable = true; qml.enable = true;
}; };
}; };

View File

@@ -13,7 +13,7 @@ lib.my.makeSwitch {
"c" "c"
]; ];
config' = { config' = {
my.home.home.packages = with pkgs; [ my.hm.home.packages = with pkgs; [
gcc gcc
clang-tools clang-tools
cmake cmake

View File

@@ -14,6 +14,10 @@ lib.my.makeHomePackageConfig {
"go" "go"
]; ];
extraConfig = { extraConfig = {
my.hm.home.packages = with pkgs; [
gotools
gopls
];
my.persist.homeDirs = [ my.persist.homeDirs = [
"go" "go"
]; ];

View File

@@ -0,0 +1,21 @@
{
config,
lib,
pkgs,
...
}:
lib.my.makeSwitch {
inherit config;
optionName = "java";
optionPath = [
"coding"
"langs"
"java"
];
config' = {
my.hm.home.packages = with pkgs; [
openjdk25
java-language-server
];
};
}

View File

@@ -13,12 +13,14 @@ lib.my.makeSwitch {
"js" "js"
]; ];
config' = { config' = {
my.home = { my.hm = {
home.packages = with pkgs; [ home.packages = with pkgs; [
nodejs nodejs
nodePackages.npm pnpm
typescript typescript
nodePackages.typescript-language-server
vue-language-server
]; ];
home.file.".npmrc".text = '' home.file.".npmrc".text = ''
prefix = ''${HOME}/.npm-global prefix = ''${HOME}/.npm-global
@@ -31,6 +33,7 @@ lib.my.makeSwitch {
my.persist.homeDirs = [ my.persist.homeDirs = [
".npm" ".npm"
".npm-global" ".npm-global"
".local/share/pnpm"
]; ];
}; };
} }

View File

@@ -13,8 +13,10 @@ lib.my.makeSwitch {
"lua" "lua"
]; ];
config' = { config' = {
my.home.home.packages = with pkgs; [ my.hm.home.packages = with pkgs; [
luajit luajit
stylua
lua-language-server
]; ];
}; };
} }

View File

@@ -14,8 +14,9 @@ lib.my.makeHomePackageConfig {
"python" "python"
]; ];
extraConfig = { extraConfig = {
my.home.home.packages = with pkgs; [ my.hm.home.packages = with pkgs; [
uv uv
pyright
]; ];
}; };
} }

View File

@@ -13,7 +13,7 @@ lib.my.makeSwitch {
"qml" "qml"
]; ];
config' = { config' = {
my.home.home.packages = with pkgs; [ my.hm.home.packages = with pkgs; [
kdePackages.qtdeclarative kdePackages.qtdeclarative
]; ];
}; };

View File

@@ -13,7 +13,7 @@ lib.my.makeSwitch {
"rust" "rust"
]; ];
config' = { config' = {
my.home = { my.hm = {
home.packages = with pkgs; [ home.packages = with pkgs; [
(fenix.stable.withComponents [ (fenix.stable.withComponents [
"cargo" "cargo"
@@ -21,8 +21,11 @@ lib.my.makeSwitch {
"rust-src" "rust-src"
"rustc" "rustc"
"rustfmt" "rustfmt"
"rust-analyzer"
]) ])
evcxr # rust repl evcxr # rust repl
pest-ide-tools
]; ];
home.file.".cargo/config.toml".text = '' home.file.".cargo/config.toml".text = ''
[source.crates-io] [source.crates-io]
@@ -34,6 +37,9 @@ lib.my.makeSwitch {
[net] [net]
git-fetch-with-cli = true git-fetch-with-cli = true
''; '';
programs.zsh.initContent = lib.mkAfter ''
export PATH=$PATH:$HOME/.cargo/bin
'';
}; };
my.persist.homeDirs = [ my.persist.homeDirs = [
".cargo" ".cargo"

View File

@@ -12,7 +12,7 @@ lib.my.makeSwitch {
"misc" "misc"
]; ];
config' = { config' = {
my.home = { my.hm = {
home.packages = with pkgs; [ home.packages = with pkgs; [
gnumake gnumake
github-cli # gh github-cli # gh

View File

@@ -11,12 +11,10 @@ lib.my.makeSwitch {
browser.all.enable = true; browser.all.enable = true;
gaming.all.enable = true; gaming.all.enable = true;
media.all.enable = true; media.all.enable = true;
notify.all.enable = true;
screencast.all.enable = true; screencast.all.enable = true;
terminal.all.enable = true; terminal.all.enable = true;
wm.all.enable = true; wm.all.enable = true;
style.enable = true; style.enable = true;
quickshell.enable = true;
wine.enable = true; wine.enable = true;
}; };
}; };

View File

@@ -10,7 +10,6 @@ lib.my.makeSwitch {
config' = { config' = {
my.desktop.browser = { my.desktop.browser = {
firefox.enable = true; firefox.enable = true;
librewolf.enable = true;
chromium.enable = true; chromium.enable = true;
zen.enable = true; zen.enable = true;
}; };

View File

@@ -13,7 +13,7 @@ lib.my.makeHomeProgramConfig {
"chromium" "chromium"
]; ];
extraConfig = { extraConfig = {
my.home.programs.chromium = { my.hm.programs.chromium = {
package = pkgs.ungoogled-chromium; package = pkgs.ungoogled-chromium;
extensions = [ extensions = [
{ {

View File

@@ -0,0 +1,13 @@
{ lib, ... }:
{
options.my.desktop.browser.default = {
command = lib.mkOption {
type = lib.types.str;
default = "chromium";
};
desktop = lib.mkOption {
type = lib.types.str;
default = "chromium-browser.desktop";
};
};
}

View File

@@ -1,15 +0,0 @@
{ config, lib, ... }:
lib.my.makeHomeProgramConfig {
inherit config;
programName = "librewolf";
optionPath = [
"desktop"
"browser"
"librewolf"
];
extraConfig = {
my.persist.homeDirs = [
".librewolf"
];
};
}

View File

@@ -13,7 +13,7 @@ lib.my.makeHomeProgramConfig {
"zen" "zen"
]; ];
extraConfig = { extraConfig = {
my.home.programs.zen-browser = { my.hm.programs.zen-browser = {
enable = true; enable = true;
nativeMessagingHosts = [ pkgs.firefoxpwa ]; nativeMessagingHosts = [ pkgs.firefoxpwa ];
policies = { policies = {

View File

@@ -13,18 +13,17 @@ lib.my.makeSwitch {
"minecraft" "minecraft"
]; ];
config' = { config' = {
my.home.home.packages = with pkgs; [ my.hm.home.packages = [
hmcl (pkgs.hmcl.overrideAttrs {
postFixup = ''
openjdk21 substituteInPlace $out/share/applications/HMCL.desktop --replace-fail 'Exec=hmcl' 'Exec=sh -c "cd ~/.local/share/hmcl; hmcl"'
'';
})
]; ];
my.persist.homeDirs = [ my.persist.homeDirs = [
".minecraft" ".minecraft"
".local/share/hmcl" ".local/share/hmcl"
]; ];
my.persist.homeFiles = [
".hmcl.json"
];
}; };
} }

View File

@@ -1,16 +0,0 @@
{ config, lib, ... }:
lib.my.makeSwitch {
inherit config;
optionName = "all desktop notify tools";
optionPath = [
"desktop"
"notify"
"all"
];
config' = {
my.desktop.notify = {
dunst.enable = true;
swaync.enable = true;
};
};
}

View File

@@ -1,19 +0,0 @@
{
config,
lib,
pkgs,
...
}:
lib.my.makeHomePackageConfig {
inherit config pkgs;
packageName = "dunst";
packagePath = [ "dunst" ];
optionPath = [
"desktop"
"notify"
"dunst"
];
extraConfig = {
my.home.xdg.configFile."dunst/dunstrc".source = ./dunstrc;
};
}

View File

@@ -1,459 +0,0 @@
# See dunst(5) for all configuration options
[global]
### Display ###
# Which monitor should the notifications be displayed on.
monitor = 0
# Display notification on focused monitor. Possible modes are:
# mouse: follow mouse pointer
# keyboard: follow window with keyboard focus
# none: don't follow anything
#
# "keyboard" needs a window manager that exports the
# _NET_ACTIVE_WINDOW property.
# This should be the case for almost all modern window managers.
#
# If this option is set to mouse or keyboard, the monitor option
# will be ignored.
follow = mouse
### Geometry ###
# dynamic width from 0 to 300
# width = (0, 300)
# constant width of 300
width = 300
# The maximum height of a single notification, excluding the frame.
height = 300
# Position the notification in the top right corner
origin = top-right
# Offset from the origin
offset = 5x15
# Scale factor. It is auto-detected if value is 0.
scale = 0
# Maximum number of notification (0 means no limit)
notification_limit = 20
### Progress bar ###
# Turn on the progess bar. It appears when a progress hint is passed with
# for example dunstify -h int:value:12
progress_bar = true
# Set the progress bar height. This includes the frame, so make sure
# it's at least twice as big as the frame width.
progress_bar_height = 10
# Set the frame width of the progress bar
progress_bar_frame_width = 1
# Set the minimum width for the progress bar
progress_bar_min_width = 150
# Set the maximum width for the progress bar
progress_bar_max_width = 300
# Corner radius for the progress bar. 0 disables rounded corners.
progress_bar_corner_radius = 2
# Corner radius for the icon image.
icon_corner_radius = 0
# Show how many messages are currently hidden (because of
# notification_limit).
indicate_hidden = yes
# The transparency of the window. Range: [0; 100].
# This option will only work if a compositing window manager is
# present (e.g. xcompmgr, compiz, etc.). (X11 only)
transparency = 0
# Draw a line of "separator_height" pixel height between two
# notifications.
# Set to 0 to disable.
# If gap_size is greater than 0, this setting will be ignored.
separator_height = 2
# Padding between text and separator.
padding = 8
# Horizontal padding.
horizontal_padding = 8
# Padding between text and icon.
text_icon_padding = 0
# Defines width in pixels of frame around the notification window.
# Set to 0 to disable.
frame_width = 3
# Defines color of the frame around the notification window.
frame_color = "#2A2C36"
# Size of gap to display between notifications - requires a compositor.
# If value is greater than 0, separator_height will be ignored and a border
# of size frame_width will be drawn around each notification instead.
# Click events on gaps do not currently propagate to applications below.
gap_size = 4
# Define a color for the separator.
# possible values are:
# * auto: dunst tries to find a color fitting to the background;
# * foreground: use the same color as the foreground;
# * frame: use the same color as the frame;
# * anything else will be interpreted as a X color.
separator_color = frame
# Sort messages by urgency.
sort = yes
# Don't remove messages, if the user is idle (no mouse or keyboard input)
# for longer than idle_threshold seconds.
# Set to 0 to disable.
# A client can set the 'transient' hint to bypass this. See the rules
# section for how to disable this if necessary
# idle_threshold = 120
### Text ###
font = JetBrains Mono 11
# The spacing between lines. If the height is smaller than the
# font height, it will get raised to the font height.
line_height = 0
# Possible values are:
# full: Allow a small subset of html markup in notifications:
# <b>bold</b>
# <i>italic</i>
# <s>strikethrough</s>
# <u>underline</u>
#
# For a complete reference see
# <https://docs.gtk.org/Pango/pango_markup.html>.
#
# strip: This setting is provided for compatibility with some broken
# clients that send markup even though it's not enabled on the
# server. Dunst will try to strip the markup but the parsing is
# simplistic so using this option outside of matching rules for
# specific applications *IS GREATLY DISCOURAGED*.
#
# no: Disable markup parsing, incoming notifications will be treated as
# plain text. Dunst will not advertise that it has the body-markup
# capability if this is set as a global setting.
#
# It's important to note that markup inside the format option will be parsed
# regardless of what this is set to.
markup = full
# The format of the message. Possible variables are:
# %a appname
# %s summary
# %b body
# %i iconname (including its path)
# %I iconname (without its path)
# %p progress value if set ([ 0%] to [100%]) or nothing
# %n progress value if set without any extra characters
# %% Literal %
# Markup is allowed
format = "<b>%s</b>\n%b"
# Alignment of message text.
# Possible values are "left", "center" and "right".
alignment = left
# Vertical alignment of message text and icon.
# Possible values are "top", "center" and "bottom".
vertical_alignment = center
# Show age of message if message is older than show_age_threshold
# seconds.
# Set to -1 to disable.
show_age_threshold = 60
# Specify where to make an ellipsis in long lines.
# Possible values are "start", "middle" and "end".
ellipsize = middle
# Ignore newlines '\n' in notifications.
ignore_newline = no
# Stack together notifications with the same content
stack_duplicates = true
# Hide the count of stacked notifications with the same content
hide_duplicate_count = false
# Display indicators for URLs (U) and actions (A).
show_indicators = false
### Icons ###
# Recursive icon lookup. You can set a single theme, instead of having to
# define all lookup paths.
enable_recursive_icon_lookup = true
# Set icon theme (only used for recursive icon lookup)
icon_theme = Win11, breeze
# You can also set multiple icon themes, with the leftmost one being used first.
# icon_theme = "Adwaita, breeze"
# Align icons left/right/top/off
icon_position = left
# Scale small icons up to this size, set to 0 to disable. Helpful
# for e.g. small files or high-dpi screens. In case of conflict,
# max_icon_size takes precedence over this.
min_icon_size = 32
# Scale larger icons down to this size, set to 0 to disable
max_icon_size = 32
# Paths to default icons (only neccesary when not using recursive icon lookup)
icon_path = /usr/share/icons/gnome/16x16/status/:/usr/share/icons/gnome/16x16/devices/
### History ###
# Should a notification popped up from history be sticky or timeout
# as if it would normally do.
sticky_history = yes
# Maximum amount of notifications kept in history
history_length = 20
### Misc/Advanced ###
# dmenu path.
dmenu = /usr/bin/dmenu -p dunst:
# Browser for opening urls in context menu.
browser = /usr/bin/microsoft-edge-stable
# Always run rule-defined scripts, even if the notification is suppressed
always_run_script = true
# Define the title of the windows spawned by dunst
title = Dunst
# Define the class of the windows spawned by dunst
class = Dunst
# Define the corner radius of the notification window
# in pixel size. If the radius is 0, you have no rounded
# corners.
# The radius will be automatically lowered if it exceeds half of the
# notification height to avoid clipping text and/or icons.
corner_radius = 10
# Ignore the dbus closeNotification message.
# Useful to enforce the timeout set by dunst configuration. Without this
# parameter, an application may close the notification sent before the
# user defined timeout.
ignore_dbusclose = false
### Wayland ###
# These settings are Wayland-specific. They have no effect when using X11
# Uncomment this if you want to let notications appear under fullscreen
# applications (default: overlay)
layer = top
# Set this to true to use X11 output on Wayland.
force_xwayland = false
### Legacy
# Use the Xinerama extension instead of RandR for multi-monitor support.
# This setting is provided for compatibility with older nVidia drivers that
# do not support RandR and using it on systems that support RandR is highly
# discouraged.
#
# By enabling this setting dunst will not be able to detect when a monitor
# is connected or disconnected which might break follow mode if the screen
# layout changes.
force_xinerama = false
### mouse
# Defines list of actions for each mouse event
# Possible values are:
# * none: Don't do anything.
# * do_action: Invoke the action determined by the action_name rule. If there is no
# such action, open the context menu.
# * open_url: If the notification has exactly one url, open it. If there are multiple
# ones, open the context menu.
# * close_current: Close current notification.
# * close_all: Close all notifications.
# * context: Open context menu for the notification.
# * context_all: Open context menu for all notifications.
# These values can be strung together for each mouse event, and
# will be executed in sequence.
mouse_left_click = do_action, close_current
mouse_middle_click = close_all
mouse_right_click = close_current
# Experimental features that may or may not work correctly. Do not expect them
# to have a consistent behaviour across releases.
[experimental]
# Calculate the dpi to use on a per-monitor basis.
# If this setting is enabled the Xft.dpi value will be ignored and instead
# dunst will attempt to calculate an appropriate dpi value for each monitor
# using the resolution and physical size. This might be useful in setups
# where there are multiple screens with very different dpi values.
per_monitor_dpi = false
[urgency_low]
# IMPORTANT: colors have to be defined in quotation marks.
# Otherwise the "#" and following would be interpreted as a comment.
background = "#1E1E2E"
foreground = "#888888"
timeout = 10
# Icon for notifications with low urgency, uncomment to enable
#default_icon = /path/to/icon
[urgency_normal]
background = "#1E1E2E"
foreground = "#ffffff"
timeout = 10
# Icon for notifications with normal urgency, uncomment to enable
default_icon = /home/imxyy/Pictures/icon/notice.png
[urgency_critical]
background = "#1E1E2E"
foreground = "#CB2027"
#frame_color = "#94393E"
timeout = 0
# Icon for notifications with critical urgency, uncomment to enable
default_icon = /home/imxyy/Pictures/icon/critical.png
# Every section that isn't one of the above is interpreted as a rules to
# override settings for certain messages.
#
# Messages can be matched by
# appname (discouraged, see desktop_entry)
# body
# category
# desktop_entry
# icon
# match_transient
# msg_urgency
# stack_tag
# summary
#
# and you can override the
# background
# foreground
# format
# frame_color
# fullscreen
# new_icon
# set_stack_tag
# set_transient
# set_category
# timeout
# urgency
# icon_position
# skip_display
# history_ignore
# action_name
# word_wrap
# ellipsize
# alignment
# hide_text
#
# Shell-like globbing will get expanded.
#
# Instead of the appname filter, it's recommended to use the desktop_entry filter.
# GLib based applications export their desktop-entry name. In comparison to the appname,
# the desktop-entry won't get localized.
#
# SCRIPTING
# You can specify a script that gets run when the rule matches by
# setting the "script" option.
# The script will be called as follows:
# script appname summary body icon urgency
# where urgency can be "LOW", "NORMAL" or "CRITICAL".
#
# NOTE: It might be helpful to run dunst -print in a terminal in order
# to find fitting options for rules.
# Disable the transient hint so that idle_threshold cannot be bypassed from the
# client
#[transient_disable]
# match_transient = yes
# set_transient = no
#
# Make the handling of transient notifications more strict by making them not
# be placed in history.
#[transient_history_ignore]
# match_transient = yes
# history_ignore = yes
# fullscreen values
# show: show the notifications, regardless if there is a fullscreen window opened
# delay: displays the new notification, if there is no fullscreen window active
# If the notification is already drawn, it won't get undrawn.
# pushback: same as delay, but when switching into fullscreen, the notification will get
# withdrawn from screen again and will get delayed like a new notification
#[fullscreen_delay_everything]
# fullscreen = delay
#[fullscreen_show_critical]
# msg_urgency = critical
# fullscreen = show
#[espeak]
# summary = "*"
# script = dunst_espeak.sh
#[script-test]
# summary = "*script*"
# script = dunst_test.sh
#[ignore]
# # This notification will not be displayed
# summary = "foobar"
# skip_display = true
#[history-ignore]
# # This notification will not be saved in history
# summary = "foobar"
# history_ignore = yes
#[skip-display]
# # This notification will not be displayed, but will be included in the history
# summary = "foobar"
# skip_display = yes
#[signed_on]
# appname = Pidgin
# summary = "*signed on*"
# urgency = low
#
#[signed_off]
# appname = Pidgin
# summary = *signed off*
# urgency = low
#
#[says]
# appname = Pidgin
# summary = *says*
# urgency = critical
#
#[twitter]
# appname = Pidgin
# summary = *twitter.com*
# urgency = normal
#
#[stack-volumes]
# appname = "some_volume_notifiers"
# set_stack_tag = "volume"
#
# vim: ft=cfg

View File

@@ -1,62 +0,0 @@
{
"$schema": "/etc/xdg/swaync/configSchema.json",
"positionX": "right",
"positionY": "top",
"control-center-positionX": "none",
"control-center-positionY": "none",
"control-center-margin-top": 8,
"control-center-margin-bottom": 8,
"control-center-margin-right": 8,
"control-center-margin-left": 8,
"control-center-height": 600,
"control-center-width": 400,
"fit-to-screen": false,
"layer": "top",
"control-center-layer": "top",
"cssPriority": "user",
"notification-icon-size": 40,
"notification-body-image-height": 100,
"notification-body-image-width": 200,
"notification-inline-replies": true,
"notification-2fa-action": false,
"timeout": 10,
"timeout-low": 5,
"timeout-critical": 0,
"notification-window-width": 317,
"keyboard-shortcuts": true,
"image-visibility": "when-available",
"transition-time": 200,
"hide-on-clear": false,
"hide-on-action": false,
"script-fail-notify": true,
"widgets": [
"inhibitors",
"title",
"dnd",
"mpris",
"notifications"
],
"widget-config": {
"inhibitors": {
"text": "Inhibitors",
"button-text": "Clear All",
"clear-all-button": true
},
"title": {
"text": "Notifications",
"clear-all-button": true,
"button-text": "Clear All"
},
"dnd": {
"text": "Do Not Disturb"
},
"label": {
"max-lines": 5,
"text": "Label Text"
},
"mpris": {
"image-size": 96,
"image-radius": 12
}
}
}

View File

@@ -1,410 +0,0 @@
/*
* vim: ft=less
*/
@define-color cc-bg rgba(42, 44, 54, 0.5);
@define-color noti-border-color rgba(255, 255, 255, 0.15);
@define-color noti-bg rgba(42, 44, 54, 0.6);
@define-color noti-bg-hover rgba(52, 54, 64, 0.6);
@define-color noti-bg-focus rgba(55, 57, 67, 0.4);
@define-color noti-close-bg rgba(255, 255, 255, 0.1);
@define-color noti-close-bg-hover rgba(255, 255, 255, 0.15);
@define-color text-color rgba(255, 255, 255, 0.6);
@define-color text-color-low rgba(136, 136, 136, 0.6);
@define-color mpris-album-art-overlay rgba(52, 54, 64, 0.6);
@define-color mpris-button-hover rgba(55, 57, 67, 0.4);
@define-color bg-selected rgb(0, 128, 255);
* {
font-family: monospace;
}
.low {
color: @text-color-low;
}
.normal {
color: @text-color;
}
.critical {
color: red;
}
.testing {
background-color: red;
}
.notification-row {
all: unset;
font-size: 11px;
transition: all 200ms ease;
outline: none;
margin-bottom: 4px;
border-radius: 12px;
}
.notification-row:hover {
background: transparent;
}
.control-center .notification-row:focus,
.control-center .notification-row:hover {
opacity: 1;
background: transparent;
}
.notification-row:focus .notification,
.notification-row:hover .notification {
/* box-shadow: 0 1px 3px 1px rgba(0, 0, 0, 0.5); */
/* box-shadow: 0px 0px 0px 3px @bg-selected; */
box-shadow: none;
}
.control-center .notification {
box-shadow: none;
}
.control-center .notification-row {
opacity: 0.5;
}
.notification {
background: @noti-bg;
transition: all 200ms ease;
border-radius: 12px;
margin: 6px 6px;
box-shadow: none;
padding: 0;
}
.notification-content {
background: transparent;
padding: 6px;
border-radius: 12px;
}
.close-button {
background: @noti-close-bg;
color: @text-color;
text-shadow: none;
padding: 0;
border-radius: 100%;
margin-top: 10px;
margin-right: 10px;
box-shadow: none;
border: none;
min-width: 24px;
min-height: 24px;
}
.close-button:hover {
box-shadow: none;
background: @noti-close-bg-hover;
transition: all 0.15s ease-in-out;
border: none;
}
.notification-default-action,
.notification-action {
padding: 4px;
margin: 0;
box-shadow: none;
background: @noti-bg;
border: 0px;
color: white;
transition: all 200ms ease;
}
.notification-default-action:hover,
.notification-action:hover {
-gtk-icon-effect: none;
background: @noti-bg-hover;
}
.notification-default-action {
border-radius: 12px;
}
/* When alternative actions are visible */
.notification-default-action:not(:only-child) {
border-bottom-left-radius: 0px;
border-bottom-right-radius: 0px;
}
.notification-action {
border-radius: 0px;
border-top: none;
border-right: none;
}
/* add bottom border radius to eliminate clipping */
.notification-action:first-child {
border-bottom-left-radius: 12px;
}
.notification-action:last-child {
border-bottom-right-radius: 12px;
border-right: 1px solid @noti-border-color;
}
.image {}
.body-image {
margin-top: 6px;
background-color: white;
border-radius: 12px;
}
.summary {
font-size: 16px;
font-weight: bold;
background: transparent;
color: @text-color;
text-shadow: none;
}
.time {
font-size: 16px;
font-weight: bold;
background: transparent;
color: @text-color;
text-shadow: none;
margin-right: 18px;
}
.body {
font-size: 15px;
font-weight: normal;
background: transparent;
color: @text-color;
text-shadow: none;
}
.control-center {
background: @cc-bg;
border-radius: 12px;
background-clip: border-box;
padding: 4px;
box-shadow: none;
}
.control-center-list {
background: transparent;
}
.control-center-list-placeholder {
opacity: 0.5;
}
.floating-notifications {
background: transparent;
}
/* Window behind control center and on all other monitors */
.blank-window {
background: transparent;
}
/*** Widgets ***/
/* Title widget */
.widget-title {
margin: 8px;
font-size: 1.5rem;
font-weight: bold;
color: @text-color;
}
.widget-title>button {
font-size: initial;
color: @text-color;
text-shadow: none;
background: @noti-bg;
border: 0px;
box-shadow: none;
border-radius: 12px;
}
.widget-title>button:hover {
background: @noti-bg-hover;
}
/* DND widget */
.widget-dnd {
margin: 8px;
font-size: 1.1rem;
color: @text-color;
}
.widget-dnd>switch {
font-size: initial;
border-radius: 12px;
background: @noti-bg;
border: 0px;
box-shadow: none;
}
.widget-dnd>switch:checked {
background: @text-color-low;
}
.widget-dnd>switch slider {
background: @noti-bg-hover;
border-radius: 12px;
}
/* Label widget */
.widget-label {
margin: 8px;
}
.widget-label>label {
font-size: 1.1rem;
}
/* Mpris widget */
.widget-mpris {
color: @text-color
}
.widget-mpris-player {
padding: 16px;
margin: 16px;
background-color: @mpris-album-art-overlay;
border-radius: 12px;
box-shadow: none;
}
.widget-mpris-album-art {
border-radius: 12px;
box-shadow: none;
}
.widget-mpris-player button {
/* The media player buttons (play, pause, next, etc...) */
color: @text-color;
/*background-color: @mpris-button-hover;*/
}
.widget-mpris-player button:disabled {
/* The media player buttons (play, pause, next, etc...) */
color: @text-color-low;
/*background-color: @mpris-button-hover;*/
}
.widget-mpris-player button:hover {
/* The media player buttons (play, pause, next, etc...) */
background-color: @mpris-button-hover;
/*background-color: @mpris-button-hover;*/
}
.widget-mpris>box>button {
color: @text-color;
}
.widget-mpris>box>button:disabled {
color: @text-color-low;
}
.widget-mpris-title {
font-weight: bold;
font-size: 1.25rem;
}
.widget-mpris-subtitle {
font-size: 1.1rem;
}
/* Buttons widget */
.widget-buttons-grid {
padding: 8px;
margin: 8px;
border-radius: 12px;
border: 0px;
background-color: @noti-bg;
}
.widget-buttons-grid>flowbox>flowboxchild>button {
color: @text-color;
background: @noti-bg;
border: 0px;
border-radius: 12px;
}
.widget-buttons-grid>flowbox>flowboxchild>button:hover {
background: @noti-bg-hover;
}
/* Menubar widget */
.widget-menubar>box>.menu-button-bar>button {
border: none;
background: transparent;
background: red;
}
/* .AnyName { Name defined in config after #
* background-color: @noti-bg;
* padding: 8px;
* margin: 8px;
* border-radius: 12px;
* }
*
* .AnyName>button {
* background: transparent;
* border: none;
* }
*
* .AnyName>button:hover {
* background-color: @noti-bg-hover;
* }
*/
.topbar-buttons>button {
/* Name defined in config after # */
border: none;
background: transparent;
background: blue;
}
/* Volume widget */
.widget-volume {
background-color: @noti-bg;
padding: 8px;
margin: 8px;
border-radius: 12px;
}
/* Backlight widget */
.widget-backlight {
background-color: @noti-bg;
padding: 8px;
margin: 8px;
border-radius: 12px;
}
/* Title widget */
.widget-inhibitors {
margin: 8px;
font-size: 1.5rem;
}
.widget-inhibitors>button {
font-size: initial;
color: white;
text-shadow: none;
background: @noti-bg;
border: 1px solid @noti-border-color;
box-shadow: none;
border-radius: 12px;
}
.widget-inhibitors>button:hover {
background: @noti-bg-hover;
}

View File

@@ -1,29 +0,0 @@
{
config,
lib,
pkgs,
...
}:
lib.my.makeHomePackageConfig {
inherit config pkgs;
packageName = "swaync";
packagePath = [ "swaynotificationcenter" ];
optionPath = [
"desktop"
"notify"
"swaync"
];
extraConfig = {
my.home = {
programs.niri.settings.binds."Mod+End".action.spawn = [
"swaync-client"
"-t"
"-sw"
];
xdg.configFile."swaync" = {
source = ./config;
recursive = true;
};
};
};
}

View File

@@ -1,43 +0,0 @@
{
config,
lib,
pkgs,
...
}:
let
# FIXME: symlink
homeDir = config.my.home.home.homeDirectory;
quickshellDir = "${homeDir}/workspace/nixos-dotfiles/modules/desktop/quickshell/qml";
quickshellTarget = "${homeDir}/.config/quickshell";
in
lib.my.makeSwitch {
inherit config;
default = false;
optionName = "quickshell";
optionPath = [
"desktop"
"quickshell"
];
config' = {
my.home.home = {
packages = with pkgs; [
quickshell
qt6Packages.qt5compat
libsForQt5.qt5.qtgraphicaleffects
kdePackages.qtbase
kdePackages.qtdeclarative
material-symbols
material-icons
];
sessionVariables.QML2_IMPORT_PATH = lib.concatStringsSep ":" [
"${pkgs.quickshell}/lib/qt-6/qml"
"${pkgs.kdePackages.qtdeclarative}/lib/qt-6/qml"
"${pkgs.kdePackages.kirigami.unwrapped}/lib/qt-6/qml"
];
activation.symlinkQuickshellAndFaceIcon = lib.hm.dag.entryAfter [ "writeBoundary" ] ''
ln -sfn "${quickshellDir}" "${quickshellTarget}"
'';
};
};
}

View File

@@ -1,2 +0,0 @@
/debug.log
/quickshell.log

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

View File

@@ -1,84 +0,0 @@
import QtQuick
import QtQuick.Shapes
import "root:/Data" as Settings
// Concave corner shape component for rounded panel edges
Shape {
id: root
property string position: "topleft" // Corner position: topleft/topright/bottomleft/bottomright
property real size: 1.0 // Scale multiplier for entire corner
property int concaveWidth: 100 * size
property int concaveHeight: 60 * size
property int offsetX: -20
property int offsetY: -20
property color fillColor: Settings.Colors.bgColor
property int arcRadius: 20 * size
// Position flags derived from position string
property bool _isTop: position.includes("top")
property bool _isLeft: position.includes("left")
property bool _isRight: position.includes("right")
property bool _isBottom: position.includes("bottom")
// Base coordinates for left corner shape
property real _baseStartX: 30 * size
property real _baseStartY: _isTop ? 20 * size : 0
property real _baseLineX: 30 * size
property real _baseLineY: _isTop ? 0 : 20 * size
property real _baseArcX: 50 * size
property real _baseArcY: _isTop ? 20 * size : 0
// Mirror coordinates for right corners
property real _startX: _isRight ? (concaveWidth - _baseStartX) : _baseStartX
property real _startY: _baseStartY
property real _lineX: _isRight ? (concaveWidth - _baseLineX) : _baseLineX
property real _lineY: _baseLineY
property real _arcX: _isRight ? (concaveWidth - _baseArcX) : _baseArcX
property real _arcY: _baseArcY
// Arc direction varies by corner to maintain proper concave shape
property int _arcDirection: {
if (_isTop && _isLeft)
return PathArc.Counterclockwise;
if (_isTop && _isRight)
return PathArc.Clockwise;
if (_isBottom && _isLeft)
return PathArc.Clockwise;
if (_isBottom && _isRight)
return PathArc.Counterclockwise;
return PathArc.Counterclockwise;
}
width: concaveWidth
height: concaveHeight
// Position relative to parent based on corner type
x: _isLeft ? offsetX : (parent ? parent.width - width + offsetX : 0)
y: _isTop ? offsetY : (parent ? parent.height - height + offsetY : 0)
preferredRendererType: Shape.CurveRenderer
layer.enabled: true
layer.samples: 4
ShapePath {
strokeWidth: 0
fillColor: root.fillColor
strokeColor: root.fillColor // Use same color as fill to eliminate artifacts
startX: root._startX
startY: root._startY
PathLine {
x: root._lineX
y: root._lineY
}
PathArc {
x: root._arcX
y: root._arcY
radiusX: root.arcRadius
radiusY: root.arcRadius
useLargeArc: false
direction: root._arcDirection
}
}
}

View File

@@ -1,48 +0,0 @@
import QtQuick
QtObject {
id: root
// Keep track of loaded components
property var activeLoaders: ({})
// Dynamically load a QML component
function load(componentUrl, parent, properties) {
if (!activeLoaders[componentUrl]) {
var loader = Qt.createQmlObject(`
import QtQuick
Loader {
active: false
asynchronous: true
visible: false
}
`, parent);
loader.source = componentUrl;
loader.active = true;
if (properties) {
for (var prop in properties) {
loader[prop] = properties[prop];
}
}
activeLoaders[componentUrl] = loader;
}
return activeLoaders[componentUrl];
}
// Destroy and remove a loaded component
function unload(componentUrl) {
if (activeLoaders[componentUrl]) {
activeLoaders[componentUrl].active = false;
activeLoaders[componentUrl].destroy();
delete activeLoaders[componentUrl];
}
}
// Check if a component is loaded
function isLoaded(componentUrl) {
return !!activeLoaders[componentUrl];
}
}

View File

@@ -1,189 +0,0 @@
pragma Singleton
import QtQuick
import Quickshell.Io
// System process and resource monitoring
QtObject {
id: root
// System resource metrics
property real cpuUsage: 0
property real ramUsage: 0
property real totalRam: 0
property real usedRam: 0
// System control processes
property Process shutdownProcess: Process {
command: ["shutdown", "-h", "now"]
}
property Process rebootProcess: Process {
command: ["reboot"]
}
property Process lockProcess: Process {
command: ["hyprlock"]
}
property Process logoutProcess: Process {
command: ["loginctl", "terminate-user", "$USER"]
}
property Process pavucontrolProcess: Process {
command: ["pavucontrol"]
}
// Resource monitoring processes
property Process cpuProcess: Process {
command: ["sh", "-c", "grep '^cpu ' /proc/stat | awk '{usage=($2+$3+$4)*100/($2+$3+$4+$5)} END {print usage}'"]
stdout: SplitParser {
onRead: data => {
root.cpuUsage = parseFloat(data);
}
}
}
property Process ramProcess: Process {
command: ["sh", "-c", "free -b | awk '/Mem:/ {print $2\" \"$3\" \"$3/$2*100}'"]
stdout: SplitParser {
onRead: data => {
var parts = data.trim().split(/\s+/);
if (parts.length >= 3) {
root.totalRam = parseFloat(parts[0]) / (1024 * 1024 * 1024);
root.usedRam = parseFloat(parts[1]) / (1024 * 1024 * 1024);
root.ramUsage = parseFloat(parts[2]);
}
}
}
}
// Monitoring timers (start manually when needed)
property Timer cpuTimer: Timer {
interval: 30000
running: false
repeat: true
onTriggered: {
cpuProcess.running = false;
cpuProcess.running = true;
}
}
property Timer ramTimer: Timer {
interval: 30000
running: false
repeat: true
onTriggered: {
ramProcess.running = false;
ramProcess.running = true;
}
}
// System control functions
function shutdown() {
console.log("Executing shutdown command");
shutdownProcess.running = true;
}
function reboot() {
console.log("Executing reboot command");
rebootProcess.running = true;
}
function lock() {
console.log("Executing lock command");
lockProcess.running = true;
}
function logout() {
console.log("Executing logout command");
logoutProcess.running = true;
}
function openPavuControl() {
console.log("Opening PavuControl");
pavucontrolProcess.running = true;
}
// Performance monitoring control
function startMonitoring() {
console.log("Starting system monitoring");
cpuTimer.running = true;
ramTimer.running = true;
}
function stopMonitoring() {
console.log("Stopping system monitoring");
cpuTimer.running = false;
ramTimer.running = false;
}
function setMonitoringInterval(intervalMs) {
console.log("Setting monitoring interval to", intervalMs, "ms");
cpuTimer.interval = intervalMs;
ramTimer.interval = intervalMs;
}
function refreshSystemStats() {
console.log("Manually refreshing system stats");
cpuProcess.running = false;
cpuProcess.running = true;
ramProcess.running = false;
ramProcess.running = true;
}
// Process state queries
function isShutdownRunning() {
return shutdownProcess.running;
}
function isRebootRunning() {
return rebootProcess.running;
}
function isLogoutRunning() {
return logoutProcess.running;
}
function isPavuControlRunning() {
return pavucontrolProcess.running;
}
function isMonitoringActive() {
return cpuTimer.running && ramTimer.running;
}
function stopPavuControl() {
pavucontrolProcess.running = false;
}
// Formatted output helpers
function getCpuUsageFormatted() {
return Math.round(cpuUsage) + "%";
}
function getRamUsageFormatted() {
return Math.round(ramUsage) + "% (" + usedRam.toFixed(1) + "GB/" + totalRam.toFixed(1) + "GB)";
}
function getRamUsageSimple() {
return Math.round(ramUsage) + "%";
}
Component.onDestruction: {
// Stop all timers
cpuTimer.running = false;
ramTimer.running = false;
// Stop monitoring processes
cpuProcess.running = false;
ramProcess.running = false;
// Stop control processes if running
if (shutdownProcess.running)
shutdownProcess.running = false;
if (rebootProcess.running)
rebootProcess.running = false;
if (lockProcess.running)
lockProcess.running = false;
if (logoutProcess.running)
logoutProcess.running = false;
if (pavucontrolProcess.running)
pavucontrolProcess.running = false;
}
}

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