Compare commits

..

1 Commits

Author SHA1 Message Date
237a62ea8a feat: init quickshell 2025-07-13 22:17:13 +08:00
252 changed files with 19195 additions and 2675 deletions

View File

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

View File

@@ -1,38 +0,0 @@
vim.lsp.config("nixd", {
settings = {
nixd = {
nixpkgs = {
expr = "import <nixpkgs> { }",
},
options = {
nixos = {
expr = '(builtins.getFlake ("git+file://" + toString ./.)).nixosConfigurations.'
.. vim.uv.os_gethostname()
.. ".options",
},
},
},
},
})
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,11 +1,13 @@
keys: keys:
- &imxyy-nix ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOEFLUkyeaK8ZPPZdVNEmtx8zvoxi7xqS2Z6oxRBuUPO - &imxyy-nix age1jf5pg2x6ta8amj40xdy0stvcvrdlkwc2nrwtmkpymu0qclk0eg5qmm9kns
- &imxyy-nix-server ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB28jpN+h5euh3NtdN+A+EtqgIatC22e4i1TPTioKire - &imxyy-nix-server age1hpgg6psejh4y6jcdd34wxuml75fnweqpe0kh8376yqsctsfn9qxs037kk6
- &imxyy-nix-x16 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMb5G/ieEYBOng66YeyttBQLThyM6W//z2POsNyq4Rw/ - &imxyy-nix-x16 age1r0fv0tagxupfacv0aaxk5ss7sqvswv6kq8tk3x46ndqrj6f5afvqegahxq
- &imxyy-cloudwin age1tp7th3rrv3x0l6jl76n0hjqjp223w2y586pkgr0hcjwdm254jd5shkj6a8
creation_rules: creation_rules:
- path_regex: secrets/.*\..* - path_regex: secrets/.*\.(yaml|toml|json|env|dae|txt|conf)$
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

@@ -4,10 +4,6 @@ switch:
@echo "Rebuilding NixOS..." @echo "Rebuilding NixOS..."
@nh os switch . @nh os switch .
switch-offline:
@echo "Rebuilding NixOS without net..."
@nh os switch . --no-net
boot: boot:
@echo "Rebuilding NixOS..." @echo "Rebuilding NixOS..."
@nh os boot . @nh os boot .
@@ -24,8 +20,14 @@ update:
@echo "Updating flakes..." @echo "Updating flakes..."
@nix flake update @nix flake update
history:
@nix profile history --profile /nix/var/nix/profiles/system
replpkgs:
@nix repl -f flake:nixpkgs
repl: repl:
@nixos-rebuild repl --flake . @nh os repl .
cleandry: cleandry:
@echo "Listing all generations older than 15 days..." @echo "Listing all generations older than 15 days..."
@@ -44,4 +46,4 @@ fmt:
@echo "Formatting nix files..." @echo "Formatting nix files..."
@nix fmt @nix fmt
.PHONY: all switch switch-offline boot test vm update repl cleandry clean gc fmt .PHONY: os home news update history repl clean gc fmt

View File

@@ -25,17 +25,19 @@ As for Flakes, refer to
## Components ## Components
| | NixOS(Wayland) | | | NixOS(Wayland) |
| ----------------------------- | :------------------------------------------- | | ----------------------------- | :------------------------------------------------------ |
| **Window Manager** | Niri | | **Window Manager** | Niri |
| **Desktop Shell** | Noctalia Shell | | **Terminal Emulator** | Alacritty & Kitty & Foot & Ghostty |
| **Terminal Emulator** | Kitty | | **Bar** | Waybar |
| **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 | | **Filesystem** | btrfs subvolumes, clean '/' every boot for impermanence |
And more... And more...

Binary file not shown.

Before

Width:  |  Height:  |  Size: 77 KiB

View File

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 25 KiB

View File

@@ -1,8 +1,4 @@
{ { 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
@@ -15,7 +11,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 = {
hm = { home = {
# 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

@@ -0,0 +1,16 @@
{ pkgs, ... }:
{
services.open-webui = {
enable = true;
host = "127.0.0.1";
port = 8089;
package = pkgs.stable.open-webui;
};
services.caddy.virtualHosts."ai.imxyy.top" = {
extraConfig = ''
reverse_proxy :8089 {
header_up X-Real-IP {remote_host}
}
'';
};
}

View File

@@ -1,12 +1,13 @@
{ {
config, config,
lib,
pkgs, pkgs,
secrets, sopsRoot,
... ...
}: }:
{ {
sops.secrets.et-imxyy-nix-server-nixremote = { sops.secrets.et-imxyy-nix-server-nixremote = {
sopsFile = secrets.et-imxyy-nix-server-nixremote; sopsFile = sopsRoot + /et-imxyy-nix-server-nixremote.toml;
format = "binary"; format = "binary";
}; };
environment.systemPackages = [ pkgs.easytier ]; environment.systemPackages = [ pkgs.easytier ];
@@ -14,8 +15,10 @@
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 = "always"; Restart = lib.mkOverride 500 "always";
RestartSec = 30; RestartMaxDelaySec = lib.mkOverride 500 "1m";
RestartSec = lib.mkOverride 500 "100ms";
RestartSteps = lib.mkOverride 500 9;
User = "root"; User = "root";
}; };
wantedBy = [ "multi-user.target" ]; wantedBy = [ "multi-user.target" ];
@@ -34,7 +37,6 @@
"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

@@ -1,10 +1,33 @@
{ config, ... }:
{ {
services.coder = { services.postgresql.ensureUsers = [
enable = true; {
accessUrl = "https://coder.imxyy.top"; name = "coder";
listenAddress = "127.0.0.1:8086"; ensureDBOwnership = true;
}
];
services.postgresql.ensureDatabases = [ "coder" ];
virtualisation.oci-containers = {
containers = {
coder = {
image = "ghcr.io/coder/coder:latest";
environment = {
CODER_ACCESS_URL = "https://coder.imxyy.top";
CODER_HTTP_ADDRESS = "0.0.0.0:8086";
CODER_PG_CONNECTION_URL = "postgresql://coder:coderdatabase@127.0.0.1/coder?sslmode=disable";
};
extraOptions = [
"--network=host"
"--group-add=${toString config.users.groups.podman.gid}"
];
volumes = [
"/var/lib/coder:/home/coder/.config"
"/var/run/docker.sock:/var/run/docker.sock"
];
ports = [ "8086:8086" ];
};
};
}; };
users.users.coder.extraGroups = [ "podman" ];
services.caddy.virtualHosts."coder.imxyy.top" = { services.caddy.virtualHosts."coder.imxyy.top" = {
extraConfig = '' extraConfig = ''
reverse_proxy :8086 { reverse_proxy :8086 {

View File

@@ -0,0 +1,27 @@
{
imports = [
./nixos.nix
./hardware.nix
./home.nix
./virt.nix
./docker.nix
./minecraft.nix
./samba.nix
./net.nix
./caddy.nix
./nextcloud.nix
./mail.nix
./gitea.nix
./vault.nix
./homepage.nix
./code.nix
./yesplaymusic.nix
./ai.nix
./grafana.nix
./note.nix
./matrix.nix
./minio.nix
./build.nix
./immich.nix
];
}

View File

@@ -5,10 +5,5 @@
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

@@ -1,54 +0,0 @@
{ 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

@@ -18,17 +18,15 @@ in
]; ];
boot.initrd.kernelModules = [ "amdgpu" ]; boot.initrd.kernelModules = [ "amdgpu" ];
boot.kernelModules = [ "kvm-amd" ]; boot.kernelModules = [ "kvm-amd" ];
boot.kernelPackages = lib.mkForce pkgs.linuxPackages_xanmod_latest; boot.kernelPackages = lib.mkForce pkgs.linuxPackages_cachyos;
services.scx = { services.scx.enable = true;
enable = true;
scheduler = "scx_rusty";
};
boot.extraModulePackages = [ ]; boot.extraModulePackages = [ ];
boot.tmp.useTmpfs = true; boot.tmp.useTmpfs = true;
boot.supportedFilesystems = [ "zfs" ]; boot.supportedFilesystems = [ "zfs" ];
boot.zfs = { boot.zfs = {
extraPools = [ "data" ]; extraPools = [ "data" ];
forceImportRoot = false; forceImportRoot = false;
package = pkgs.zfs_cachyos;
}; };
services.zfs.autoScrub.enable = true; services.zfs.autoScrub.enable = true;
services.btrfs.autoScrub.enable = true; services.btrfs.autoScrub.enable = true;

View File

@@ -1,14 +1,11 @@
{ 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;
coding.langs.js.enable = true;
fonts.enable = lib.mkForce false;
persist = { persist = {
enable = true; enable = true;
homeDirs = [ homeDirs = [

View File

@@ -1,11 +1,15 @@
{ {
virtualisation.oci-containers.containers.sun-panel = { virtualisation.oci-containers = {
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,9 +1,5 @@
{ ... }: { ... }:
{ {
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,104 +1,46 @@
{ {
config, services.matrix-synapse = {
secrets,
...
}:
{
nixpkgs.config.permittedInsecurePackages = [
"olm-3.2.16"
];
sops.secrets.tuwunel-reg-token = {
sopsFile = secrets.tuwunel-reg-token;
format = "binary";
owner = config.services.matrix-tuwunel.user;
group = config.services.matrix-tuwunel.group;
};
sops.secrets.tuwunel-turn-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; enable = true;
settings.global = { settings = {
address = [ "127.0.0.1" ]; server_name = "matrix.imxyy.top";
port = [ 8094 ]; public_baseurl = "https://matrix.imxyy.top";
server_name = "imxyy.top"; listeners = [
well_known = { {
server = "matrix.imxyy.top:443"; port = 8094;
client = "https://matrix.imxyy.top"; bind_addresses = [ "127.0.0.1" ];
}; type = "http";
tls = false;
allow_registration = true; x_forwarded = true;
registration_token_file = config.sops.secrets.tuwunel-reg-token.path; resources = [
{
suppress_push_when_active = true; names = [
"client"
turn_uris = [ "federation"
"turn:hk.vkvm.imxyy.top?transport=udp"
"turn:hk.vkvm.imxyy.top?transport=tcp"
]; ];
turn_secret_file = config.sops.secrets.tuwunel-turn-secret.path; compress = true;
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
} }
''; ];
turn_uris = [ "turns:vkvm.imxyy.top:5349" ];
turn_shared_secret = "ac779a48c03bb451839569d295a29aa6ab8c264277bec2df9c9c7f5e22936288";
turn_user_lifetime = "1h";
database_type = "psycopg2";
database_args.database = "matrix-synapse";
};
extraConfigFiles = [
"/var/lib/matrix-synapse/secret"
];
}; };
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,10 +8,9 @@
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 = 120; RestartSec = "10s";
}; };
}; };
my.persist = { my.persist = {
nixosDirs = [ nixosDirs = [
"/opt/minecraft" "/opt/minecraft"

View File

@@ -1,7 +1,7 @@
{ config, secrets, ... }: { config, sopsRoot, ... }:
{ {
sops.secrets.minio-env = { sops.secrets.minio-env = {
sopsFile = secrets.minio; sopsFile = sopsRoot + /minio.env;
format = "dotenv"; format = "dotenv";
}; };
services.minio = { services.minio = {
@@ -16,4 +16,11 @@
]; ];
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,
secrets, sopsRoot,
... ...
}: }:
{ {
@@ -131,29 +131,26 @@
"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 AAAAC3NzaC1lZDI1NTE5AAAAIMb5G/ieEYBOng66YeyttBQLThyM6W//z2POsNyq4Rw/ imxyy@imxyy-nix-x16" "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKALTBn/QSGcSPgMg0ViSazFcaA0+nEF05EJpjbsI6dE imxyy_soope_@imxyy-cloudwin"
]; ];
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 AAAAC3NzaC1lZDI1NTE5AAAAIMb5G/ieEYBOng66YeyttBQLThyM6W//z2POsNyq4Rw/ imxyy@imxyy-nix-x16" "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKALTBn/QSGcSPgMg0ViSazFcaA0+nEF05EJpjbsI6dE imxyy_soope_@imxyy-cloudwin"
]; ];
sops.secrets.dae-imxyy-nix-server = { sops.secrets.dae-imxyy-nix-server = {
sopsFile = secrets.dae-imxyy-nix-server; sopsFile = sopsRoot + /dae-imxyy-nix-server.dae;
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 = { systemd.services.dae.after = [ "sops-nix.service" ];
after = [ "sops-nix.service" ];
serviceConfig.MemoryMax = "1G";
};
sops.secrets.mihomo = { sops.secrets.mihomo = {
sopsFile = secrets.mihomo; sopsFile = sopsRoot + /mihomo.yaml;
format = "yaml"; format = "yaml";
key = ""; key = "";
}; };
@@ -165,7 +162,7 @@
}; };
sops.secrets.frp-env = { sops.secrets.frp-env = {
sopsFile = secrets.frp; sopsFile = sopsRoot + /frp.env;
format = "dotenv"; format = "dotenv";
}; };
systemd.services.frp.serviceConfig.EnvironmentFile = [ systemd.services.frp.serviceConfig.EnvironmentFile = [
@@ -175,7 +172,7 @@
enable = true; enable = true;
role = "client"; role = "client";
settings = { settings = {
serverAddr = "{{ .Envs.FRP_SERVER_ADDR }}"; serverAddr = "hk.vkvm.imxyy.top";
serverPort = 7000; serverPort = 7000;
auth.token = "{{ .Envs.FRP_AUTH_TOKEN }}"; auth.token = "{{ .Envs.FRP_AUTH_TOKEN }}";
proxies = [ proxies = [
@@ -208,6 +205,20 @@
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";
@@ -291,6 +302,21 @@
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";
@@ -321,6 +347,21 @@
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";
@@ -336,20 +377,6 @@
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";
@@ -381,54 +408,63 @@
} }
{ {
name = "memo-http"; name = "minecraft";
type = "http"; type = "tcp";
localIP = "127.0.0.1"; localIP = "127.0.0.1";
localPort = 80; localPort = 25565;
customDomains = [ "memo.imxyy.top" ]; remotePort = 25565;
}
{
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 = secrets.et-imxyy-nix-server; sopsFile = sopsRoot + /et-imxyy-nix-server.toml;
format = "binary"; format = "binary";
}; };
environment.systemPackages = [ pkgs.easytier ]; environment.systemPackages = [ pkgs.easytier ];
@@ -436,8 +472,10 @@
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 = "always"; Restart = lib.mkOverride 500 "always";
RestartSec = 30; RestartMaxDelaySec = lib.mkOverride 500 "1m";
RestartSec = lib.mkOverride 500 "100ms";
RestartSteps = lib.mkOverride 500 9;
User = "root"; User = "root";
}; };
wantedBy = [ "multi-user.target" ]; wantedBy = [ "multi-user.target" ];
@@ -447,7 +485,9 @@
]; ];
}; };
virtualisation.oci-containers.containers.obligator = { virtualisation.oci-containers = {
containers = {
obligator = {
image = "anderspitman/obligator:latest"; image = "anderspitman/obligator:latest";
volumes = [ volumes = [
"/var/lib/obligator:/data" "/var/lib/obligator:/data"
@@ -465,6 +505,15 @@
"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 {
@@ -475,10 +524,9 @@
systemd.services.ddns-go = systemd.services.ddns-go =
let let
version = "6.6.7"; ddns-go = pkgs.buildGoModule rec {
ddns-go = pkgs.buildGoModule {
inherit version;
pname = "ddns-go"; pname = "ddns-go";
version = "6.6.7";
src = pkgs.fetchFromGitHub { src = pkgs.fetchFromGitHub {
owner = "jeessy2"; owner = "jeessy2";
repo = "ddns-go"; repo = "ddns-go";
@@ -513,6 +561,7 @@
"git" "git"
"vault" "vault"
"coder" "coder"
"headscale"
"grafana" "grafana"
"matrix" "matrix"
"note" "note"
@@ -521,22 +570,23 @@
"music" "music"
"ai" "ai"
"sy" "sy"
"immich" "minio"
]; ];
in in
{ {
enable = true; enable = true;
resolveLocalQueries = false; resolveLocalQueries = false;
settings = { settings = {
no-resolv = true; server = [
server = [ "192.168.3.1" ]; "120.53.53.53"
"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.nextcloud32; package = pkgs.nextcloud31;
extraApps = { extraApps = {
inherit (pkgs.nextcloud32.packages.apps) inherit (pkgs.nextcloud31.packages.apps)
bookmarks bookmarks
previewgenerator previewgenerator
spreed spreed
@@ -31,26 +31,20 @@ 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 = { settings.trusted_domains = [
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
@@ -59,7 +53,7 @@ in
phpOptions = { phpOptions = {
"opcache.enable" = 1; "opcache.enable" = 1;
"opcache.enable_cli" = 1; "opcache.enable_cli" = 1;
"opcache.interned_strings_buffer" = 23; "opcache.interned_strings_buffer" = 8;
"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;
@@ -100,12 +94,9 @@ in
*/ */
services.caddy.virtualHosts."nextcloud.imxyy.top" = { services.caddy.virtualHosts."nextcloud.imxyy.top" = {
extraConfig = '' extraConfig = ''
reverse_proxy http://127.0.0.1:8084 { reverse_proxy :8084 {
trusted_proxies 192.168.3.0/24 header_up X-Real-IP {remote_host}
} }
redir /.well-known/carddav /remote.php/dav/ 301
redir /.well-known/caldav /remote.php/dav/ 301
''; '';
}; };

View File

@@ -2,30 +2,28 @@
lib, lib,
config, config,
username, username,
secrets, sopsRoot,
... ...
}: }:
{ {
boot.loader = { boot.loader = {
efi.canTouchEfiVariables = true; efi.canTouchEfiVariables = true;
systemd-boot = { systemd-boot.enable = true;
enable = true;
configurationLimit = 10;
};
grub.enable = false; grub.enable = false;
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 = secrets.imxyy-nix-server-hashed-password; sopsFile = sopsRoot + /imxyy-nix-server-hashed-password.txt;
format = "binary"; format = "binary";
neededForUsers = true; neededForUsers = true;
}; };

View File

@@ -1,16 +1,31 @@
{ {
config, config,
secrets, sopsRoot,
... ...
}: }:
{ {
sops.secrets = { sops.secrets = {
flatnote-env = {
sopsFile = sopsRoot + /flatnote.env;
format = "dotenv";
};
siyuan-env = { siyuan-env = {
sopsFile = secrets.siyuan; sopsFile = sopsRoot + /siyuan.env;
format = "dotenv"; format = "dotenv";
}; };
}; };
virtualisation.oci-containers.containers = { virtualisation.oci-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 = [
@@ -29,24 +44,18 @@
]; ];
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

@@ -1,74 +0,0 @@
{
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,54 +0,0 @@
{ config, secrets, ... }:
let
redisUrl = config.services.redis.servers.rsshub.unixSocket;
in
{
sops.secrets.rsshub-env = {
sopsFile = secrets.rsshub;
format = "dotenv";
};
users.users.rsshub = {
home = "/var/empty";
group = "rsshub";
isSystemUser = true;
};
users.groups.rsshub.members = [ "rsshub" ];
services.redis.servers.rsshub = {
enable = true;
user = "rsshub";
};
virtualisation.oci-containers.containers.rsshub = {
image = "diygod/rsshub";
volumes = [
"${redisUrl}:${redisUrl}"
];
ports = [ "8100:1200" ];
networks = [ "podman" ];
environment = {
CACHE_TYPE = "redis";
REDIS_URL = "${redisUrl}";
};
environmentFiles = [ config.sops.secrets.rsshub-env.path ];
};
services.caddy.virtualHosts."rss.imxyy.top" = {
extraConfig = ''
reverse_proxy :8100
'';
};
services.frp.settings.proxies = [
{
name = "rsshub-http";
type = "http";
localIP = "127.0.0.1";
localPort = 80;
customDomains = [ "rss.imxyy.top" ];
}
{
name = "rsshub-https";
type = "https";
localIP = "127.0.0.1";
localPort = 443;
customDomains = [ "rss.imxyy.top" ];
}
];
}

View File

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

View File

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

View File

@@ -0,0 +1,23 @@
{
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

@@ -0,0 +1,6 @@
{
imports = [
./nixos.nix
./home.nix
];
}

View File

@@ -1,10 +1,10 @@
{ lib, username, ... }: { lib, username, ... }:
{ {
my.hm.programs.zsh.shellAliases = { my.home.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.sshKeyFile = "/home/${username}/.ssh/id_ed25519"; sops.sshKeyPath = "/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

@@ -0,0 +1,8 @@
{
imports = [
./nixos.nix
./hardware.nix
./home.nix
./net.nix
];
}

View File

@@ -2,6 +2,7 @@
config, config,
lib, lib,
pkgs, pkgs,
username,
... ...
}: }:
let let
@@ -21,7 +22,7 @@ in
verbose = false; verbose = false;
}; };
kernelPackages = lib.mkForce pkgs.linuxPackages_xanmod_latest; kernelPackages = lib.mkForce pkgs.linuxPackages_cachyos;
kernelModules = [ "kvm-amd" ]; kernelModules = [ "kvm-amd" ];
tmp.useTmpfs = true; tmp.useTmpfs = true;
@@ -29,10 +30,7 @@ in
"fs.file-max" = 9223372036854775807; "fs.file-max" = 9223372036854775807;
}; };
}; };
services.scx = { services.scx.enable = true;
enable = true;
scheduler = "scx_rusty";
};
fileSystems."/" = { fileSystems."/" = {
device = btrfs; device = btrfs;

View File

@@ -1,50 +1,43 @@
{ {
config, config,
lib,
pkgs, pkgs,
username, username,
... ...
}: }:
{ {
my.hm = { my.home = {
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
papers evince
anki anki
ayugram-desktop ayugram-desktop
telegram-desktop
signal-desktop signal-desktop
element-desktop discord
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 = {
@@ -52,7 +45,8 @@
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;
@@ -60,14 +54,14 @@
enable = true; enable = true;
defaultApplications = defaultApplications =
let let
browser = [ config.my.desktop.browser.default.desktop ]; browser = [ "zen-beta.desktop" ];
editor = [ "codium.desktop" ]; editor = [ "codium.desktop" ];
imageviewer = [ "org.gnome.Shotwell-Viewer.desktop" ]; imageviewer = [ "org.gnome.Shotwell-Viewer.desktop" ];
in in
{ {
"inode/directory" = [ "org.gnome.Nautilus.desktop" ]; "inode/directory" = [ "nemo.desktop" ];
"application/pdf" = [ "org.gnome.Papers.desktop" ]; "application/pdf" = [ "org.gnome.Evince.desktop" ];
"text/*" = editor; "text/*" = editor;
"application/json" = editor; "application/json" = editor;
@@ -98,6 +92,15 @@
"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;
@@ -115,26 +118,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/fractal" ".local/share/TelegramDesktop"
".config/Signal" ".config/Signal"
".config/Element" ".config/discord"
".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,7 +1,8 @@
{ {
config, config,
lib,
pkgs, pkgs,
secrets, sopsRoot,
... ...
}: }:
{ {
@@ -9,51 +10,10 @@
"biosdevname=0" "biosdevname=0"
"net.ifnames=0" "net.ifnames=0"
]; ];
networking = { networking.networkmanager.enable = true;
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 = secrets.dae-imxyy-nix-x16; sopsFile = sopsRoot + /dae-imxyy-nix-x16.dae;
format = "binary"; format = "binary";
}; };
services.dae = { services.dae = {
@@ -62,7 +22,7 @@
}; };
systemd.services.dae.after = [ "sops-nix.service" ]; systemd.services.dae.after = [ "sops-nix.service" ];
sops.secrets.mihomo = { sops.secrets.mihomo = {
sopsFile = secrets.mihomo; sopsFile = sopsRoot + /mihomo.yaml;
format = "yaml"; format = "yaml";
key = ""; key = "";
}; };
@@ -74,7 +34,7 @@
}; };
sops.secrets.et-imxyy-nix-x16 = { sops.secrets.et-imxyy-nix-x16 = {
sopsFile = secrets.et-imxyy-nix-x16; sopsFile = sopsRoot + /et-imxyy-nix-x16.toml;
format = "binary"; format = "binary";
}; };
environment.systemPackages = with pkgs; [ environment.systemPackages = with pkgs; [
@@ -84,8 +44,10 @@
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 = "always"; Restart = lib.mkOverride 500 "always";
RestartSec = 30; RestartMaxDelaySec = lib.mkOverride 500 "1m";
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,8 +1,9 @@
{ {
lib,
pkgs, pkgs,
config, config,
username, username,
secrets, sopsRoot,
... ...
}: }:
{ {
@@ -21,10 +22,7 @@
boot.loader = { boot.loader = {
efi.canTouchEfiVariables = true; efi.canTouchEfiVariables = true;
systemd-boot = { systemd-boot.enable = true;
enable = true;
configurationLimit = 10;
};
grub.enable = false; grub.enable = false;
timeout = 0; timeout = 0;
}; };
@@ -38,10 +36,71 @@
}; };
environment.variables.NIX_REMOTE = "daemon"; environment.variables.NIX_REMOTE = "daemon";
services.printing.enable = true; 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" ];
services.upower.enable = true; fonts = {
services.power-profiles-daemon.enable = true; 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.keyd = { services.keyd = {
enable = true; enable = true;
@@ -75,7 +134,7 @@
]; ];
sops.secrets.imxyy-nix-rclone = { sops.secrets.imxyy-nix-rclone = {
sopsFile = secrets.imxyy-nix-rclone; sopsFile = sopsRoot + /imxyy-nix-rclone.conf;
format = "binary"; format = "binary";
}; };
fileSystems = { fileSystems = {
@@ -95,6 +154,21 @@
"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,6 +5,5 @@
./home.nix ./home.nix
./virt.nix ./virt.nix
./net.nix ./net.nix
./podman.nix
]; ];
} }

View File

@@ -23,7 +23,7 @@ in
verbose = false; verbose = false;
}; };
kernelPackages = lib.mkForce pkgs.linuxPackages_xanmod_latest; kernelPackages = lib.mkForce pkgs.linuxPackages_cachyos;
kernelModules = [ "kvm-amd" ]; kernelModules = [ "kvm-amd" ];
tmp.useTmpfs = true; tmp.useTmpfs = true;
@@ -36,10 +36,7 @@ in
"resume_offset=6444127" "resume_offset=6444127"
]; ];
}; };
services.scx = { services.scx.enable = true;
enable = true;
scheduler = "scx_rusty";
};
fileSystems."/" = { fileSystems."/" = {
device = btrfs; device = btrfs;

View File

@@ -1,35 +1,43 @@
{ {
config, config,
lib,
pkgs, pkgs,
username, username,
... ...
}: }:
{ {
my.hm = { my.home = {
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
papers evince
anki anki
ayugram-desktop ayugram-desktop
telegram-desktop
signal-desktop signal-desktop
element-desktop discord
fractal
qq qq
wechat wechat
gnome-clocks gnome-clocks
wineWowPackages.waylandFull
pavucontrol
pamixer
]; ];
programs.zsh = { programs.zsh = {
shellAliases = { shellAliases = {
cageterm = "cage -m DP-1 -s -- alacritty -o font.size=20"; cageterm = "cage -m DP-2 -s -- alacritty -o font.size=20";
cagefoot = "cage -m DP-1 -s -- foot --font=monospace:size=20"; cagefoot = "cage -m DP-2 -s -- foot --font=monospace:size=20";
cagekitty = "cage -m DP-1 -s -- kitty -o font_size=20"; cagekitty = "cage -m DP-2 -s -- kitty -o font_size=20";
}; };
sessionVariables = { sessionVariables = {
no_proxy = "192.168.3.0/24"; no_proxy = "192.168.3.0/24";
@@ -45,7 +53,7 @@
programs.niri.settings = { programs.niri.settings = {
environment.STEAM_FORCE_DESKTOPUI_SCALING = "1.25"; environment.STEAM_FORCE_DESKTOPUI_SCALING = "1.25";
outputs = { outputs = {
DP-1 = { DP-2 = {
enable = true; enable = true;
mode = { mode = {
width = 2560; width = 2560;
@@ -58,7 +66,7 @@
y = 0; y = 0;
}; };
}; };
DP-2 = { DP-3 = {
enable = true; enable = true;
mode = { mode = {
width = 2560; width = 2560;
@@ -83,20 +91,22 @@
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 = [ config.my.desktop.browser.default.desktop ]; browser = [ "zen-beta.desktop" ];
editor = [ "codium.desktop" ]; editor = [ "codium.desktop" ];
imageviewer = [ "org.gnome.Shotwell-Viewer.desktop" ]; imageviewer = [ "org.gnome.Shotwell-Viewer.desktop" ];
in in
{ {
"inode/directory" = [ "org.gnome.Nautilus.desktop" ]; "inode/directory" = [ "nemo.desktop" ];
"application/pdf" = [ "org.gnome.Papers.desktop" ]; "application/pdf" = [ "org.gnome.Evince.desktop" ];
"text/*" = editor; "text/*" = editor;
"application/json" = editor; "application/json" = editor;
@@ -127,6 +137,16 @@
"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;
@@ -142,23 +162,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/fractal" ".local/share/TelegramDesktop"
".config/Signal" ".config/Signal"
".config/Element" ".config/discord"
".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,7 +2,8 @@
config, config,
lib, lib,
pkgs, pkgs,
secrets, sopsRoot,
username,
... ...
}: }:
{ {
@@ -69,7 +70,6 @@
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,9 +79,6 @@
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
} }
} }
''; '';
@@ -89,7 +86,7 @@
}; };
sops.secrets.dae-imxyy-nix = { sops.secrets.dae-imxyy-nix = {
sopsFile = secrets.dae-imxyy-nix; sopsFile = sopsRoot + /dae-imxyy-nix.dae;
format = "binary"; format = "binary";
}; };
services.dae = { services.dae = {
@@ -98,7 +95,7 @@
}; };
systemd.services.dae.after = [ "sops-nix.service" ]; systemd.services.dae.after = [ "sops-nix.service" ];
sops.secrets.mihomo = { sops.secrets.mihomo = {
sopsFile = secrets.mihomo; sopsFile = sopsRoot + /mihomo.yaml;
format = "yaml"; format = "yaml";
key = ""; key = "";
}; };
@@ -110,7 +107,7 @@
}; };
sops.secrets.et-imxyy-nix = { sops.secrets.et-imxyy-nix = {
sopsFile = secrets.et-imxyy-nix; sopsFile = sopsRoot + /et-imxyy-nix.toml;
format = "binary"; format = "binary";
}; };
environment.systemPackages = [ pkgs.easytier ]; environment.systemPackages = [ pkgs.easytier ];
@@ -118,8 +115,10 @@
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 = "always"; Restart = lib.mkOverride 500 "always";
RestartSec = 30; RestartMaxDelaySec = lib.mkOverride 500 "1m";
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,25 +3,76 @@
pkgs, pkgs,
config, config,
username, username,
secrets, sopsRoot,
... ...
}: }:
let let
btreset = pkgs.writeShellScriptBin "btreset" '' btreset = pkgs.writeScriptBin "btreset" ''
LOCKFILE="/tmp/.btreseted" #!${lib.getExe pkgs.python3}
import subprocess
import os
import sys
SYM = "BT" SYM = "BT"
if [ -f "$LOCKFILE" ] && [ "$1" != "-f" ]; then def action(line: str) -> bool:
exit 0 if line.find(SYM) == -1:
fi return False
temp = line.split(" ")
bus = temp[1]
device = temp[3][:-1]
subprocess.run(["${lib.getExe usbreset}", f"/dev/bus/usb/{bus}/{device}"])
return True
${lib.getExe' pkgs.usbutils "lsusb"} | grep "$SYM" | while read -r line; do if __name__ == "__main__":
bus=$(echo "$line" | awk '{print $2}') if os.path.exists("/tmp/.btreseted") and len(sys.argv) == 1 and "-f" not in sys.argv[1:]:
dev=$(echo "$line" | awk '{print $4}' | tr -d ':') exit(0)
${lib.getExe' pkgs.usbutils "usbreset"} "$bus/$dev" res_byte = subprocess.check_output("/run/current-system/sw/bin/lsusb")
res = res_byte.decode()
lst = res.split("\n")
touch "$LOCKFILE" if any(tuple(map(action, lst))):
done 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
{ {
@@ -46,10 +97,7 @@ in
boot.loader = { boot.loader = {
efi.canTouchEfiVariables = true; efi.canTouchEfiVariables = true;
systemd-boot = { systemd-boot.enable = true;
enable = true;
configurationLimit = 10;
};
grub.enable = false; grub.enable = false;
timeout = 0; timeout = 0;
}; };
@@ -63,12 +111,75 @@ 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 = { keyboards.default.settings = {
default.settings = {
main = { main = {
capslock = "overload(control, esc)"; capslock = "overload(control, esc)";
home = "end"; home = "end";
@@ -80,11 +191,6 @@ in
delete = "print"; delete = "print";
}; };
}; };
kone-pro-owl-eye = {
ids = [ "1e7d:2dcd" ];
settings.main.mouse2 = "rightmouse";
};
};
}; };
services.gvfs.enable = true; services.gvfs.enable = true;
@@ -93,9 +199,6 @@ 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;
@@ -122,7 +225,7 @@ in
]; ];
sops.secrets.imxyy-nix-rclone = { sops.secrets.imxyy-nix-rclone = {
sopsFile = secrets.imxyy-nix-rclone; sopsFile = sopsRoot + /imxyy-nix-rclone.conf;
format = "binary"; format = "binary";
}; };
fileSystems = { fileSystems = {

View File

@@ -1,36 +0,0 @@
{
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"
];
}

643
flake.lock generated

File diff suppressed because it is too large Load Diff

174
flake.nix
View File

@@ -3,96 +3,63 @@
inputs = { inputs = {
# Nixpkgs # Nixpkgs
nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable"; nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable-small";
nixpkgs-stable.url = "github:nixos/nixpkgs/release-25.11"; 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";
# TODO: sops-nix: remove pr patch once merged # Nyxpkgs
# https://github.com/Mic92/sops-nix/pull/779 chaotic.url = "github:chaotic-cx/nyx/nyxpkgs-unstable";
sops-nix = {
url = "github:Mic92/sops-nix/pull/779/merge"; # SOPS
inputs.nixpkgs.follows = "nixpkgs"; sops-nix.url = "github:Mic92/sops-nix";
}; sops-nix.inputs.nixpkgs.follows = "nixpkgs";
# Home manager # Home manager
home-manager = { home-manager.url = "github:nix-community/home-manager/master";
url = "github:nix-community/home-manager/master"; home-manager.inputs.nixpkgs.follows = "nixpkgs";
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";
darkly = { quickshell.url = "git+https://git.outfoxxed.me/outfoxxed/quickshell";
url = "github:Bali10050/Darkly"; quickshell.inputs.nixpkgs.follows = "nixpkgs";
inputs.nixpkgs.follows = "nixpkgs";
};
stylix = { darkly.url = "github:Bali10050/Darkly";
url = "github:danth/stylix"; darkly.inputs.nixpkgs.follows = "nixpkgs";
inputs.nixpkgs.follows = "nixpkgs";
}; stylix.url = "github:danth/stylix";
stylix.inputs.nixpkgs.follows = "nixpkgs";
# go-musicfox # go-musicfox
go-musicfox = { go-musicfox.url = "github:imxyy1soope1/go-musicfox/master";
url = "github:imxyy1soope1/go-musicfox"; go-musicfox.inputs.nixpkgs.follows = "nixpkgs";
inputs.nixpkgs.follows = "nixpkgs";
};
# NixOS-WSL # NixOS-WSL
nixos-wsl = { nixos-wsl.url = "github:nix-community/NixOS-WSL";
url = "github:nix-community/NixOS-WSL"; nixos-wsl.inputs.nixpkgs.follows = "nixpkgs";
inputs.nixpkgs.follows = "nixpkgs";
};
fenix = { fenix.url = "github:nix-community/fenix";
url = "github:nix-community/fenix"; fenix.inputs.nixpkgs.follows = "nixpkgs";
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";
noctalia = { infuse.url = "git+https://codeberg.org/amjoseph/infuse.nix";
url = "github:noctalia-dev/noctalia-shell/v3.5.0"; infuse.flake = false;
inputs.nixpkgs.follows = "nixpkgs";
};
angrr = { haumea.url = "github:nix-community/haumea/v0.2.2";
url = "github:linyinfeng/angrr"; haumea.inputs.nixpkgs.follows = "nixpkgs";
inputs.nixpkgs.follows = "nixpkgs";
};
plant = {
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";
my-templates.url = "git+https://git.imxyy.top/imxyy1soope1/flake-templates";
}; };
outputs = outputs =
@@ -104,10 +71,10 @@
let let
inherit (self) outputs; inherit (self) outputs;
vars = import ./vars.nix; vars = import ./vars.nix;
forAllSystems = lib.genAttrs lib.systems.flakeExposed; forAllSystems = nixpkgs.lib.genAttrs nixpkgs.lib.systems.flakeExposed;
forAllHosts = forAllHosts =
mkSystem: mkSystem:
lib.mergeAttrsList ( nixpkgs.lib.attrsets.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))
@@ -137,22 +104,23 @@
} }
); );
# 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
treefmtEval.config.build.wrapper pkgs.writeShellApplication {
); name = "nixfmt-wrapper";
check = forAllSystems (
system: runtimeInputs = with pkgs; [
let fd
pkgs = nixpkgs.legacyPackages.${system}; nixfmt-rfc-style
treefmtEval = inputs.treefmt.lib.evalModule pkgs ./treefmt.nix; ];
in
{ text = ''
formatting = treefmtEval.config.build.check self; fd "$@" -t f -e nix -x nixfmt '{}'
'';
} }
); );
@@ -168,10 +136,19 @@
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.stdenv.hostPlatform.system}.darkly-qt5; darkly-qt5 = inputs.darkly.packages.${final.system}.darkly-qt5;
darkly-qt6 = inputs.darkly.packages.${final.stdenv.hostPlatform.system}.darkly-qt6; darkly-qt6 = inputs.darkly.packages.${final.system}.darkly-qt6;
})
noctalia-shell = inputs.noctalia.packages.${final.stdenv.hostPlatform.system}.default; (final: prev: {
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;
@@ -183,7 +160,6 @@
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
( (
@@ -209,45 +185,27 @@
outputs outputs
hostname hostname
; ;
assets = sopsRoot = ./secrets;
with lib.haumea; flake = ./.;
load { } // vars;
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 ];
exclude = [ exclude = [
./modules/virt/types ./modules/virt/types
./modules/desktop/wm/niri/waybar
]; ];
recursive = true; recursive = true;
}) })
++ (lib.umport {
paths = [ ./config/hosts/${hostname} ];
recursive = true;
})
++ [ ++ [
(lib.mkAliasOptionModule [ "my" "hm" ] [ "home-manager" "users" vars.username ]) (lib.mkAliasOptionModule [ "my" "home" ] [ "home-manager" "users" vars.username ])
./config/base.nix ./config/base.nix
./config/hosts/${hostname}
inputs.chaotic.nixosModules.default
inputs.sops-nix.nixosModules.sops inputs.sops-nix.nixosModules.sops
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
inputs.angrr.nixosModules.angrr
home home
pkgsConf pkgsConf
]; ];

View File

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

View File

@@ -1,26 +0,0 @@
{
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 ];
};
}

View File

@@ -1,20 +0,0 @@
{ 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,7 +9,9 @@ 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

@@ -0,0 +1,167 @@
## 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

@@ -0,0 +1,167 @@
## 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

@@ -0,0 +1,79 @@
#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

@@ -0,0 +1,38 @@
#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

@@ -0,0 +1,34 @@
#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

@@ -0,0 +1,14 @@
#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

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

View File

@@ -0,0 +1,97 @@
# 启动页配置
[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

@@ -0,0 +1,28 @@
{
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

@@ -0,0 +1,30 @@
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

@@ -2,6 +2,9 @@
config, config,
lib, lib,
pkgs, pkgs,
username,
userfullname,
useremail,
... ...
}: }:
lib.my.makeSwitch { lib.my.makeSwitch {
@@ -39,22 +42,15 @@ lib.my.makeSwitch {
dnsutils dnsutils
killall killall
comma
]; ];
programs.dconf.enable = true; programs.dconf.enable = true;
my.persist.homeDirs = [ my.home = {
".local/share/zoxide"
".config/television/cable"
];
my.hm = {
home.packages = with pkgs; [ home.packages = with pkgs; [
lsd lsd
fd fd
neofetch neofetch
fastfetch
fzf fzf
bat bat
ripgrep ripgrep
@@ -84,125 +80,6 @@ lib.my.makeSwitch {
enableAutoUpdates = true; enableAutoUpdates = true;
settings.updates.auto_update = true; settings.updates.auto_update = true;
}; };
programs.television = {
enable = true;
enableZshIntegration = true;
enableFishIntegration = true;
};
programs.zoxide = {
enable = true;
enableZshIntegration = true;
enableFishIntegration = 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.hm.xdg.configFile."btop" = { my.home.xdg.configFile."btop" = {
source = ./config; source = ./config;
recursive = true; recursive = true;
}; };

View File

@@ -10,8 +10,6 @@ lib.my.makeSwitch {
config' = { config' = {
my.cli.shell = { my.cli.shell = {
zsh.enable = true; zsh.enable = true;
fish.enable = true;
starship.enable = true;
}; };
}; };
} }

View File

@@ -1,34 +0,0 @@
{
lib,
config,
username,
...
}:
let
cfg = config.my.cli.shell;
in
{
options.my.cli.shell.default = lib.mkOption {
type = lib.types.enum [
"fish"
"zsh"
];
default = "fish";
};
config = lib.mkMerge [
(lib.mkIf (cfg.default == "fish") {
my.cli.shell.fish.enable = true;
users.users.${username} = {
shell = config.my.hm.programs.fish.package;
# do not need `programs.fish.enable = true` since fish is managed by home-manager
ignoreShellProgramCheck = true;
};
})
(lib.mkIf (cfg.default == "zsh") {
my.cli.shell.zsh.enable = true;
users.users.${username}.shell = config.my.hm.programs.zsh.package;
})
];
}

View File

@@ -1,95 +0,0 @@
{
config,
lib,
pkgs,
...
}:
lib.my.makeSwitch {
inherit config;
default = true;
optionName = "default fish settings";
optionPath = [
"cli"
"shell"
"fish"
];
config' = {
my.persist.homeDirs = [
".local/share/fish"
];
my.hm = {
programs.fish = {
enable = true;
plugins = [
{
name = "extract";
src = pkgs.fetchFromGitHub {
owner = "hexclover";
repo = "fish-extract-ng";
tag = "v0.1";
hash = "sha256-yef5NX4HdZ3ab/2AzNrvvhi0CbeTvXYKZmyH76gIpyk=";
};
}
];
shellAliases = {
la = "lsd -lah";
ls = "lsd";
svim = "doasedit";
nf = "fastfetch";
tmux = "tmux -T RGB,focus,overline,mouse,clipboard,usstyle";
};
interactiveShellInit = ''
fish_vi_key_bindings
source ${
builtins.fetchurl {
url = "https://raw.githubusercontent.com/folke/tokyonight.nvim/refs/tags/v4.14.1/extras/fish/tokyonight_storm.fish";
sha256 = "0a2pg78k8cv0hx8p02lxnb7giblwn7z9hnb6i6mdx4w5lg4wfg40";
}
}
'';
functions = {
fish_greeting = "";
yank_to_clipboard = {
description = "Insert latest killring entry into the system clipboard";
body = ''printf "%s" "$fish_killring[1]" | fish_clipboard_copy'';
};
fish_user_key_bindings = ''
# make vi mode yanks copy to clipboard
bind yy kill-whole-line yank_to_clipboard yank
bind Y kill-whole-line yank_to_clipboard yank
bind y,\$ kill-line yank_to_clipboard yank
bind y,\^ backward-kill-line yank_to_clipboard yank
bind y,0 backward-kill-line yank_to_clipboard yank
bind y,w kill-word yank_to_clipboard yank
bind y,W kill-bigword yank_to_clipboard yank
bind y,i,w forward-single-char forward-single-char backward-word kill-word yank_to_clipboard yank
bind y,i,W forward-single-char forward-single-char backward-bigword kill-bigword yank_to_clipboard yank
bind y,a,w forward-single-char forward-single-char backward-word kill-word yank_to_clipboard yank
bind y,a,W forward-single-char forward-single-char backward-bigword kill-bigword yank_to_clipboard yank
bind y,e kill-word yank_to_clipboard yank
bind y,E kill-bigword yank_to_clipboard yank
bind y,b backward-kill-word yank_to_clipboard yank
bind y,B backward-kill-bigword yank_to_clipboard yank
bind y,g,e backward-kill-word yank_to_clipboard yank
bind y,g,E backward-kill-bigword yank_to_clipboard yank
bind y,f begin-selection forward-jump kill-selection yank_to_clipboard yank end-selection
bind y,t begin-selection forward-jump-till kill-selection yank_to_clipboard yank end-selection
bind y,F begin-selection backward-jump kill-selection yank_to_clipboard yank end-selection
bind y,T begin-selection backward-jump-till kill-selection yank_to_clipboard yank end-selection
bind y,h backward-char begin-selection kill-selection yank_to_clipboard yank end-selection
bind y,l begin-selection kill-selection yank_to_clipboard yank end-selection
bind y,i,b jump-till-matching-bracket and jump-till-matching-bracket and begin-selection jump-till-matching-bracket kill-selection yank_to_clipboard yank end-selection
bind y,a,b jump-to-matching-bracket and jump-to-matching-bracket and begin-selection jump-to-matching-bracket kill-selection yank_to_clipboard yank end-selection
bind y,i backward-jump-till and repeat-jump-reverse and begin-selection repeat-jump kill-selection yank_to_clipboard yank end-selection
bind y,a backward-jump and repeat-jump-reverse and begin-selection repeat-jump kill-selection yank_to_clipboard yank end-selection
bind -M visual -m default y kill-selection yank_to_clipboard yank end-selection repaint-mode
# use system clipboard for vi mode pastes
bind -s p 'set -g fish_cursor_end_mode exclusive' forward-char 'set -g fish_cursor_end_mode inclusive' fish_clipboard_paste
bind -s P fish_clipboard_paste
'';
};
};
};
};
}

View File

@@ -1,21 +0,0 @@
{ config, lib, ... }:
lib.my.makeSwitch {
inherit config;
optionName = "starship prompt";
optionPath = [
"cli"
"shell"
"starship"
];
config' = {
my.hm = {
programs.starship = {
enable = true;
settings = lib.recursiveUpdate (with builtins; fromTOML (readFile ./starship-preset.toml)) {
add_newline = false;
nix_shell.disabled = true;
};
};
};
};
}

View File

@@ -14,28 +14,94 @@ lib.my.makeSwitch {
"zsh" "zsh"
]; ];
config' = { config' = {
my.hm = { my.persist.homeDirs = [ ".local/share/zoxide" ];
my.home =
let
stateHome = config.my.home.xdg.stateHome;
zsh-syntax-highlighting = pkgs.fetchFromGitHub {
owner = "zsh-users";
repo = "zsh-syntax-highlighting";
rev = "0.8.0";
hash = "sha256-iJdWopZwHpSyYl5/FQXEW7gl/SrKaYDEtTH9cGP7iPo=";
};
fzf-tab = pkgs.fetchFromGitHub {
owner = "Aloxaf";
repo = "fzf-tab";
rev = "v1.2.0";
hash = "sha256-q26XVS/LcyZPRqDNwKKA9exgBByE0muyuNb0Bbar2lY=";
};
in
{
home.packages = with pkgs; [ home.packages = with pkgs; [
fzf fzf
zoxide
]; ];
programs.starship = {
enable = true;
settings = lib.recursiveUpdate (with builtins; fromTOML (readFile ./starship-preset.toml)) {
add_newline = false;
custom = {
jj = {
ignore_timeout = true;
description = "The current jj status";
when = "jj root";
symbol = " ";
command = ''
jj log --revisions @ --no-graph --ignore-working-copy --color always --limit 1 --template '
separate(" ",
change_id.shortest(4),
bookmarks,
"|",
concat(
if(conflict, "💥"),
if(divergent, "🚧"),
if(hidden, "👻"),
if(immutable, "🔒"),
),
raw_escape_sequence("\x1b[1;32m") ++ if(empty, "(empty)"),
raw_escape_sequence("\x1b[1;32m") ++ coalesce(
truncate_end(29, description.first_line(), ""),
"(no description set)",
) ++ raw_escape_sequence("\x1b[0m"),
)
'
'';
};
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_commit.disabled = true;
git_metrics.disabled = true;
git_branch.disabled = true;
git_status.disabled = true;
nix_shell.disabled = true;
};
};
programs.zsh = { programs.zsh = {
enable = true; enable = true;
dotDir = "${config.my.hm.xdg.configHome}/zsh"; dotDir = ".config/zsh";
history = { history = {
path = "${config.my.hm.xdg.stateHome}/zsh_history"; path = "${stateHome}/zsh_history";
ignorePatterns = [ ignorePatterns = [
"la" "la"
]; ];
}; };
autosuggestion.enable = true; initContent = lib.mkAfter ''
syntaxHighlighting.enable = true; source ${fzf-tab}/fzf-tab.plugin.zsh
plugins = [
{ eval "$(zoxide init zsh)"
name = "fzf-tab"; source ${zsh-syntax-highlighting}/zsh-syntax-highlighting.plugin.zsh
src = pkgs.zsh-fzf-tab; source ${pkgs.zsh-autosuggestions}/share/zsh-autosuggestions/zsh-autosuggestions.zsh
file = "share/fzf-tab/fzf-tab.plugin.zsh"; '';
}
];
oh-my-zsh = { oh-my-zsh = {
enable = true; enable = true;
theme = "gentoo"; theme = "gentoo";
@@ -44,14 +110,16 @@ lib.my.makeSwitch {
"git-extras" "git-extras"
"extract" "extract"
"sudo" "sudo"
"dotenv"
]; ];
}; };
shellAliases = { shellAliases = {
x = "extract"; x = "extract";
ls = "lsd"; ls = "lsd";
svim = "doasedit"; svim = "sudoedit";
nf = "fastfetch"; nf = "neofetch";
tmux = "tmux -T RGB,focus,overline,mouse,clipboard,usstyle"; tmux = "tmux -T RGB,focus,overline,mouse,clipboard,usstyle";
pastart = "pasuspender true";
}; };
}; };
}; };

View File

@@ -16,24 +16,22 @@ lib.my.makeHomeProgramConfig {
"git" "git"
]; ];
extraConfig = { extraConfig = {
my.hm = { my.home = {
programs.git = { programs.git = {
settings = { userName = "${userfullname}";
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.hm = { my.home = {
programs.jujutsu = { programs.jujutsu = {
settings = { settings = {
user = { user = {
@@ -26,7 +26,6 @@ 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";
@@ -41,43 +40,6 @@ lib.my.makeHomeProgramConfig {
}; };
}; };
home.packages = [ pkgs.lazyjj ]; home.packages = [ pkgs.lazyjj ];
programs.starship = {
settings = {
custom = {
jj = {
ignore_timeout = true;
description = "The current jj status";
when = true;
command = ''
jj log --revisions @ --no-graph --ignore-working-copy --color always --limit 1 --template '
separate(" ",
" ",
change_id.shortest(4),
bookmarks,
"|",
concat(
if(conflict, "💥"),
if(divergent, "🚧"),
if(hidden, "👻"),
if(immutable, "🔒"),
),
raw_escape_sequence("\x1b[1;32m") ++ if(empty, "(empty)"),
raw_escape_sequence("\x1b[1;32m") ++ coalesce(
truncate_end(29, description.first_line(), ""),
"(no description set)",
) ++ raw_escape_sequence("\x1b[0m"),
)
' || {starship module git_branch && starship module git_status}
'';
};
};
git_state.disabled = true;
git_commit.disabled = true;
git_metrics.disabled = true;
git_branch.disabled = true;
git_status.disabled = true;
};
};
}; };
}; };
} }

View File

@@ -13,7 +13,7 @@ lib.my.makeHomeProgramConfig {
"neovim" "neovim"
]; ];
extraConfig = { extraConfig = {
my.hm = { my.home = {
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,9 +26,31 @@ lib.my.makeHomeProgramConfig {
vimAlias = true; vimAlias = true;
vimdiffAlias = true; vimdiffAlias = true;
extraPackages = with pkgs; [ extraPackages = with pkgs; [
gcc # treesitter gcc
gnumake
ripgrep # telescope pyright
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,3 +4,5 @@ require("core.keymaps")
require("langs.langs-setup") require("langs.langs-setup")
require("plugins.plugins-setup") require("plugins.plugins-setup")
require("core.autostart")

View File

@@ -0,0 +1,7 @@
-- 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,21 +7,33 @@ 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>", string.rep("<up>", 9), opt) keymap.set("i", "<pageup>", "<up><up><up><up><up><up><up><up><up>", opt)
keymap.set("i", "<pagedown>", string.rep("<down>", 9), opt) keymap.set("i", "<pagedown>", "<down><down><down><down><down><down><down><down><down>", 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)
@@ -42,6 +54,15 @@ 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,8 +30,6 @@ 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

@@ -4,6 +4,9 @@ vim.api.nvim_create_autocmd("BufWritePre", {
desc = "auto format Go files", desc = "auto format Go files",
callback = function() callback = function()
vim.lsp.buf.format() vim.lsp.buf.format()
-- vim.fn.system("go fmt " .. vim.fn.expand("%:p"))
-- vim.fn.system("goimports -w " .. vim.fn.expand("%:p"))
-- vim.cmd("edit")
end, end,
group = "Go", group = "Go",
}) })

View File

@@ -1 +1,5 @@
require("langs.go") require("langs.go")
-- require("langs.rust")
require("langs.lualang")
require("langs.nix")
require("langs.markdown")

View File

@@ -0,0 +1,34 @@
vim.api.nvim_create_augroup("Lua", {})
local old = {}
vim.api.nvim_create_autocmd("BufEnter", {
pattern = { "*.lua" },
desc = "auto lua file indent",
callback = function()
local opt = vim.opt
-- Tab width setting
old.tabstop = opt.tabstop
old.shiftwidth = opt.shiftwidth
old.softtabstop = opt.softtabstop
old.expandtab = opt.expandtab
opt.tabstop = 2
opt.shiftwidth = 2
opt.softtabstop = 2
opt.expandtab = true
opt.autoindent = true
end,
group = "Lua",
})
vim.api.nvim_create_autocmd("BufLeave", {
pattern = { "*.lua" },
desc = "auto lua file indent",
callback = function()
local opt = vim.opt
-- Tab width setting
opt.tabstop = old.tabstop
opt.shiftwidth = old.shiftwidth
opt.softtabstop = old.softtabstop
opt.expandtab = old.expandtab
end,
group = "Lua",
})

View File

@@ -0,0 +1,34 @@
vim.api.nvim_create_augroup("Markdown", {})
local old = {}
vim.api.nvim_create_autocmd("BufEnter", {
pattern = { "*.md" },
desc = "auto md file indent",
callback = function()
local opt = vim.opt
-- Tab width setting
old.tabstop = opt.tabstop
old.shiftwidth = opt.shiftwidth
old.softtabstop = opt.softtabstop
old.expandtab = opt.expandtab
opt.tabstop = 2
opt.shiftwidth = 2
opt.softtabstop = 2
opt.expandtab = true
opt.autoindent = true
end,
group = "Markdown",
})
vim.api.nvim_create_autocmd("BufLeave", {
pattern = { "*.md" },
desc = "auto markdown file indent",
callback = function()
local opt = vim.opt
-- Tab width setting
opt.tabstop = old.tabstop
opt.shiftwidth = old.shiftwidth
opt.softtabstop = old.softtabstop
opt.expandtab = old.expandtab
end,
group = "Markdown",
})

View File

@@ -0,0 +1,34 @@
vim.api.nvim_create_augroup("Nix", {})
local old = {}
vim.api.nvim_create_autocmd("BufEnter", {
pattern = { "*.nix" },
desc = "auto nix file indent",
callback = function()
local opt = vim.opt
-- Tab width setting
old.tabstop = opt.tabstop
old.shiftwidth = opt.shiftwidth
old.softtabstop = opt.softtabstop
old.expandtab = opt.expandtab
opt.tabstop = 2
opt.shiftwidth = 2
opt.softtabstop = 2
opt.expandtab = true
opt.autoindent = true
end,
group = "Nix",
})
vim.api.nvim_create_autocmd("BufLeave", {
pattern = { "*.nix" },
desc = "auto nix file indent",
callback = function()
local opt = vim.opt
-- Tab width setting
opt.tabstop = old.tabstop
opt.shiftwidth = old.shiftwidth
opt.softtabstop = old.softtabstop
opt.expandtab = old.expandtab
end,
group = "Nix",
})

View File

@@ -0,0 +1,10 @@
vim.api.nvim_create_augroup("Rust", {})
vim.api.nvim_create_autocmd("BufWritePost", {
pattern = { "*.rs" },
desc = "auto format Rust files",
callback = function()
vim.fn.system("rustfmt " .. vim.fn.expand("%:p"))
vim.cmd("edit")
end,
group = "Rust",
})

View File

@@ -1,4 +1,17 @@
local servers = { local servers = {
"lua_ls",
"pyright",
"gopls",
"clangd",
"rust_analyzer",
"ts_ls",
"jsonls",
"cssls",
"nixd",
"html",
}
local extra_config = {
lua_ls = { lua_ls = {
settings = { settings = {
Lua = { Lua = {
@@ -22,7 +35,7 @@ local servers = {
}, },
rust_analyzer = { rust_analyzer = {
settings = { settings = {
["rust-analyzer"] = { rust_analyzer = {
check = { check = {
command = "clippy", command = "clippy",
}, },
@@ -38,30 +51,20 @@ local servers = {
nixd = { nixd = {
settings = { settings = {
nixd = { nixd = {
formatting = {
command = { "nixfmt" },
},
nixpkgs = { nixpkgs = {
expr = "import <nixpkgs> { }", expr = "import <nixpkgs> { }",
}, },
options = {
nixos = {
expr = '(builtins.getFlake ("git+file://" + toString ./.)).nixosConfigurations.imxyy-nix.options',
},
}, },
}, },
}, },
tinymist = {
cmd = { "tinymist" },
filetypes = { "typst" },
}, },
qmlls = { qmlls = {
cmd = { "qmlls", "-E" }, cmd = {"qmlls", "-E"}
}, }
pyright = {},
gopls = {},
clangd = {},
ts_ls = {},
jsonls = {},
cssls = {},
html = {},
java_language_server = {},
} }
local capabilities = require("cmp_nvim_lsp").default_capabilities() local capabilities = require("cmp_nvim_lsp").default_capabilities()
@@ -70,8 +73,14 @@ capabilities.textDocument.foldingRange = {
dynamicRegistration = false, dynamicRegistration = false,
lineFoldingOnly = true, lineFoldingOnly = true,
} }
for server, config in pairs(servers) do local lspconfig = require("lspconfig")
config["capabilities"] = capabilities for _, server in ipairs(servers) do
vim.lsp.config(server, config) local extra = extra_config[server] or {}
vim.lsp.enable(server) local config = {
capabilities = capabilities,
}
for k, v in pairs(extra) do
config[k] = v
end
lspconfig[server].setup(config)
end end

View File

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

View File

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

View File

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

View File

@@ -17,16 +17,4 @@ 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,11 +62,6 @@ 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" },
@@ -118,7 +113,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",
@@ -154,7 +149,7 @@ local plugins = {
{ {
"numToStr/Comment.nvim", "numToStr/Comment.nvim",
event = "VeryLazy", event = "VeryLazy",
opts = {}, opts = {}
}, },
{ {
"windwp/nvim-autopairs", "windwp/nvim-autopairs",
@@ -184,42 +179,22 @@ 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()
vim.keymap.set({ "n", "x", "o" }, "s", "<Plug>(leap)") require("leap").set_default_mappings()
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 (ch1:match("%s") or ch0:match("%a") and ch1:match("%a") and ch2:match("%a")) return not (
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",
@@ -281,12 +256,6 @@ local plugins = {
ft = "pest", ft = "pest",
opts = {}, opts = {},
}, },
{
"nmac427/guess-indent.nvim",
event = "VeryLazy",
opts = {},
},
} }
require("lazy").setup(plugins, {}) require("lazy").setup(plugins, {})

View File

@@ -35,6 +35,9 @@ 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.hm = { my.home = {
programs.vscode = { programs.vscode = {
package = pkgs.vscodium; package = pkgs.vscodium;
}; };

View File

@@ -15,9 +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;
typst.enable = true;
}; };
}; };
} }

View File

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

View File

@@ -14,10 +14,6 @@ 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

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

View File

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

View File

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

View File

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

View File

@@ -13,7 +13,7 @@ lib.my.makeSwitch {
"rust" "rust"
]; ];
config' = { config' = {
my.hm = { my.home = {
home.packages = with pkgs; [ home.packages = with pkgs; [
(fenix.stable.withComponents [ (fenix.stable.withComponents [
"cargo" "cargo"
@@ -21,11 +21,8 @@ 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]
@@ -37,9 +34,6 @@ 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

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

View File

@@ -12,20 +12,12 @@ lib.my.makeSwitch {
"misc" "misc"
]; ];
config' = { config' = {
my.hm = { my.home = {
home.packages = with pkgs; [ home.packages = with pkgs; [
gnumake gnumake
github-cli # gh github-cli # gh
]; ];
programs.direnv = { programs.direnv.enable = true;
enable = true;
config = {
global = {
warn_timeout = 0;
hide_env_diff = false;
};
};
};
}; };
my.persist.homeDirs = [ my.persist.homeDirs = [
".local/share/direnv" ".local/share/direnv"

View File

@@ -11,10 +11,12 @@ 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;
}; };
}; };

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