Compare commits
51 Commits
19e190d514
..
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
12d2b3ff49
|
|||
|
02953206f7
|
|||
|
84485d9e8a
|
|||
|
7a84ae3b7a
|
|||
|
7dc99f00cc
|
|||
|
6149a5119d
|
|||
|
bd6643edaf
|
|||
|
577aec6587
|
|||
|
c79a19d5ee
|
|||
|
cfe29e07ac
|
|||
|
2b773af620
|
|||
|
ee9e812579
|
|||
|
00fd2e7ab9
|
|||
|
2f90d7f0d0
|
|||
|
be6c838f19
|
|||
|
8dc7a7b90a
|
|||
|
a3433735b7
|
|||
|
df37f04bdc
|
|||
|
67ceb5faab
|
|||
|
51a6bd3367
|
|||
|
3d2c6297a6
|
|||
|
2c9b2dc2b6
|
|||
|
6c216af91e
|
|||
|
8e6d52b6b5
|
|||
|
dbd97e0034
|
|||
|
39a9318f11
|
|||
|
9117816216
|
|||
|
0207a9cf3e
|
|||
|
f4b3db924f
|
|||
|
a1b5bee3e8
|
|||
|
e867539857
|
|||
|
a1142405bc
|
|||
|
91e1c07dcd
|
|||
|
ad7b2dd727
|
|||
|
7490e1b512
|
|||
|
43dcdfab27
|
|||
|
3a47cc56b7
|
|||
|
0cefd0799d
|
|||
|
850f014a08
|
|||
|
8c10af7f58
|
|||
|
12c56e2283
|
|||
|
de495a1195
|
|||
|
4cb4a6c48d
|
|||
|
54d6eb73c5
|
|||
|
d384ced6db
|
|||
|
3b6a2907da
|
|||
|
8417f5f889
|
|||
|
8d699f7b01
|
|||
|
542977b1ff
|
|||
| 93bb082106 | |||
| 63830a69b0 |
Generated
+367
-483
File diff suppressed because it is too large
Load Diff
@@ -20,6 +20,7 @@
|
||||
nixos-wsl = {
|
||||
url = "github:nix-community/NixOS-WSL";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
inputs.flake-compat.follows = "flake-compat";
|
||||
};
|
||||
|
||||
# Flake organization tools
|
||||
@@ -40,11 +41,11 @@
|
||||
|
||||
# Useful modules
|
||||
# keep-sorted start block=yes
|
||||
catppuccin = {
|
||||
url = "github:catppuccin/nix";
|
||||
impermanence = {
|
||||
url = "github:nix-community/impermanence";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
inputs.home-manager.follows = "home-manager";
|
||||
};
|
||||
impermanence.url = "github:nix-community/impermanence";
|
||||
# TODO: sops-nix: remove pr patch once merged
|
||||
# https://github.com/Mic92/sops-nix/pull/779
|
||||
sops-nix = {
|
||||
@@ -54,6 +55,8 @@
|
||||
stylix = {
|
||||
url = "github:danth/stylix";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
inputs.flake-parts.follows = "flake-parts";
|
||||
inputs.systems.follows = "systems";
|
||||
};
|
||||
system76-scheduler-niri = {
|
||||
url = "github:Kirottu/system76-scheduler-niri";
|
||||
@@ -66,6 +69,9 @@
|
||||
angrr = {
|
||||
url = "github:linyinfeng/angrr";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
inputs.flake-compat.follows = "flake-compat";
|
||||
inputs.flake-parts.follows = "flake-parts";
|
||||
inputs.treefmt-nix.follows = "treefmt";
|
||||
};
|
||||
darkly = {
|
||||
url = "github:Bali10050/Darkly";
|
||||
@@ -78,15 +84,35 @@
|
||||
go-musicfox = {
|
||||
url = "github:imxyy1soope1/go-musicfox";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
inputs.flake-parts.follows = "flake-parts";
|
||||
inputs.devenv.follows = "devenv";
|
||||
inputs.nix2container.inputs.flake-utils.follows = "flake-utils";
|
||||
};
|
||||
niri.url = "github:sodiboo/niri-flake";
|
||||
noctalia = {
|
||||
url = "github:noctalia-dev/noctalia-shell/v4.7.1";
|
||||
llm-agents = {
|
||||
url = "github:numtide/llm-agents.nix";
|
||||
# Not followed intentionally (binary cache)
|
||||
# inputs.nixpkgs.follows = "nixpkgs";
|
||||
inputs.flake-parts.follows = "flake-parts";
|
||||
inputs.systems.follows = "systems";
|
||||
inputs.treefmt-nix.follows = "treefmt";
|
||||
};
|
||||
niri = {
|
||||
url = "github:sodiboo/niri-flake";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
inputs.noctalia-qs.inputs.treefmt-nix.follows = "";
|
||||
inputs.nixpkgs-stable.follows = "nixpkgs-stable";
|
||||
};
|
||||
noctalia = {
|
||||
url = "github:noctalia-dev/noctalia-shell/v4.7.5";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
inputs.noctalia-qs.inputs.nixpkgs.follows = "nixpkgs";
|
||||
inputs.noctalia-qs.inputs.systems.follows = "systems";
|
||||
inputs.noctalia-qs.inputs.treefmt-nix.follows = "treefmt";
|
||||
};
|
||||
zen = {
|
||||
url = "github:0xc000022070/zen-browser-flake";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
inputs.home-manager.follows = "home-manager";
|
||||
};
|
||||
zen.inputs.nixpkgs.follows = "nixpkgs";
|
||||
zen.url = "github:0xc000022070/zen-browser-flake";
|
||||
# keep-sorted end
|
||||
|
||||
# Misc
|
||||
@@ -99,6 +125,20 @@
|
||||
flake = false;
|
||||
};
|
||||
my-templates.url = "git+https://git.imxyy.top/imxyy1soope1/flake-templates";
|
||||
|
||||
# Flattened indirect dependencies
|
||||
flake-compat.url = "github:edolstra/flake-compat";
|
||||
flake-utils = {
|
||||
url = "github:numtide/flake-utils";
|
||||
inputs.systems.follows = "systems";
|
||||
};
|
||||
systems.url = "github:nix-systems/default";
|
||||
devenv = {
|
||||
url = "github:cachix/devenv";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
inputs.flake-parts.follows = "flake-parts";
|
||||
inputs.flake-compat.follows = "flake-compat";
|
||||
};
|
||||
};
|
||||
|
||||
outputs =
|
||||
|
||||
@@ -126,7 +126,6 @@ in
|
||||
# Upstream modules
|
||||
# keep-sorted start
|
||||
inputs.angrr.nixosModules.angrr
|
||||
inputs.catppuccin.nixosModules.catppuccin
|
||||
inputs.home-manager.nixosModules.default
|
||||
inputs.impermanence.nixosModules.impermanence
|
||||
inputs.niri.nixosModules.niri
|
||||
|
||||
+1
-1
@@ -14,11 +14,11 @@
|
||||
inputs.fenix.overlays.default
|
||||
inputs.angrr.overlays.default
|
||||
(final: prev: {
|
||||
darkly-qt5 = inputs.darkly.packages.${final.stdenv.hostPlatform.system}.darkly-qt5;
|
||||
darkly-qt6 = inputs.darkly.packages.${final.stdenv.hostPlatform.system}.darkly-qt6;
|
||||
|
||||
noctalia-shell = inputs.noctalia.packages.${final.stdenv.hostPlatform.system}.default;
|
||||
})
|
||||
inputs.llm-agents.overlays.shared-nixpkgs
|
||||
];
|
||||
config.allowUnfree = true;
|
||||
flake.setNixPath = false;
|
||||
|
||||
@@ -31,13 +31,12 @@ in
|
||||
services.btrfs.autoScrub.enable = true;
|
||||
networking.hostId = "10ca95b4";
|
||||
|
||||
fileSystems."/" = {
|
||||
my.persist.btrfs = {
|
||||
device = btrfs;
|
||||
fsType = "btrfs";
|
||||
options = [
|
||||
"compress=zstd"
|
||||
"subvol=root"
|
||||
];
|
||||
mountPoint = "/nix/persist";
|
||||
persistSubvol = "persist";
|
||||
rootSubvol = "root";
|
||||
zstdCompress = true;
|
||||
};
|
||||
|
||||
fileSystems."/nix" = {
|
||||
@@ -49,42 +48,6 @@ in
|
||||
];
|
||||
};
|
||||
|
||||
my.persist.location = "/nix/persist";
|
||||
fileSystems."/nix/persist" = {
|
||||
device = btrfs;
|
||||
fsType = "btrfs";
|
||||
options = [
|
||||
"compress=zstd"
|
||||
"subvol=persist"
|
||||
];
|
||||
neededForBoot = true;
|
||||
};
|
||||
|
||||
boot.initrd.postDeviceCommands = lib.mkAfter ''
|
||||
mkdir /btrfs_tmp
|
||||
mount ${btrfs} /btrfs_tmp
|
||||
mkdir -p /btrfs_tmp/old_roots
|
||||
if [[ -e /btrfs_tmp/root ]]; then
|
||||
timestamp=$(date --date="@$(stat -c %Y /btrfs_tmp/root)" "+%Y-%m-%-d_%H:%M:%S")
|
||||
mv /btrfs_tmp/root "/btrfs_tmp/old_roots/$timestamp"
|
||||
fi
|
||||
|
||||
delete_subvolume_recursively() {
|
||||
IFS=$'\n'
|
||||
for i in $(btrfs subvolume list -o "$1" | cut -f 9- -d ' '); do
|
||||
delete_subvolume_recursively "/btrfs_tmp/$i"
|
||||
done
|
||||
btrfs subvolume delete "$1"
|
||||
}
|
||||
|
||||
for i in $(find /btrfs_tmp/old_roots/ -maxdepth 1 -mtime +14); do
|
||||
delete_subvolume_recursively "$i"
|
||||
done
|
||||
|
||||
btrfs subvolume create /btrfs_tmp/root
|
||||
umount /btrfs_tmp
|
||||
'';
|
||||
|
||||
fileSystems."/boot" = {
|
||||
device = "/dev/disk/by-uuid/32AA-2998";
|
||||
fsType = "vfat";
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
coding.langs.lua.enable = true;
|
||||
coding.langs.rust.enable = true;
|
||||
coding.langs.js.enable = true;
|
||||
coding.agents.enable = true;
|
||||
fonts.enable = lib.mkForce false;
|
||||
persist = {
|
||||
enable = true;
|
||||
|
||||
@@ -95,7 +95,12 @@
|
||||
displayname_template = "{displayname} (Telegram)";
|
||||
permissions = {
|
||||
"@imxyy_soope_:imxyy.top" = "admin";
|
||||
"*" = "relaybot";
|
||||
};
|
||||
relaybot = {
|
||||
whitelist = [ ];
|
||||
};
|
||||
relay_user_distinguishers = [ ];
|
||||
};
|
||||
telegram = {
|
||||
# borrowed from https://github.com/telegramdesktop/tdesktop/blob/9bdc19e2fd4d497c8f403891848383a88faadc25/snap/snapcraft.yaml#L134-L135
|
||||
@@ -104,4 +109,35 @@
|
||||
};
|
||||
};
|
||||
};
|
||||
sops.secrets.mautrix-signal = {
|
||||
sopsFile = secrets.mautrix-signal;
|
||||
restartUnits = [ "mautrix-signal.service" ];
|
||||
format = "dotenv";
|
||||
owner = "mautrix-signal";
|
||||
group = "mautrix-signal";
|
||||
};
|
||||
services.mautrix-signal = {
|
||||
enable = true;
|
||||
environmentFile = config.sops.secrets.mautrix-signal.path;
|
||||
settings = {
|
||||
homeserver = {
|
||||
address = "http://127.0.0.1:8094";
|
||||
domain = "imxyy.top";
|
||||
};
|
||||
appservice = {
|
||||
address = "http://127.0.0.1:8102";
|
||||
hostname = "127.0.0.1";
|
||||
port = 8102;
|
||||
bot_username = "signalbot";
|
||||
};
|
||||
bridge = {
|
||||
username_template = "signal_{userid}";
|
||||
alias_template = "signal_{groupname}";
|
||||
displayname_template = "{displayname} (Signal)";
|
||||
permissions = {
|
||||
"@imxyy_soope_:imxyy.top" = "admin";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
{ config, secrets, ... }:
|
||||
{
|
||||
sops.secrets.minio-env = {
|
||||
sopsFile = secrets.minio;
|
||||
restartUnits = [ "minio.service" ];
|
||||
format = "dotenv";
|
||||
};
|
||||
services.minio = {
|
||||
enable = true;
|
||||
listenAddress = ":9000";
|
||||
consoleAddress = ":9001";
|
||||
region = "cn-south-gz";
|
||||
|
||||
configDir = "/mnt/nas/minio/config";
|
||||
dataDir = [
|
||||
"/mnt/nas/minio/data"
|
||||
];
|
||||
rootCredentialsFile = config.sops.secrets.minio-env.path;
|
||||
};
|
||||
}
|
||||
@@ -17,9 +17,9 @@ in
|
||||
|
||||
services.nextcloud = {
|
||||
enable = true;
|
||||
package = pkgs.nextcloud32;
|
||||
package = pkgs.nextcloud33;
|
||||
extraApps = {
|
||||
inherit (pkgs.nextcloud32.packages.apps)
|
||||
inherit (pkgs.nextcloud33.packages.apps)
|
||||
bookmarks
|
||||
previewgenerator
|
||||
spreed
|
||||
@@ -73,6 +73,12 @@ in
|
||||
"pm.max_spare_servers" = "12";
|
||||
};
|
||||
};
|
||||
# Fixes `The following x-forwarded-for header was received by Nextcloud: "10.88.0.1"`
|
||||
systemd.services.nextcloud-notify_push = {
|
||||
environment = {
|
||||
NEXTCLOUD_URL = lib.mkForce "http://127.0.0.1:8084";
|
||||
};
|
||||
};
|
||||
services.nginx.virtualHosts."nextcloud.imxyy.top" = {
|
||||
listen = [
|
||||
{
|
||||
|
||||
@@ -30,13 +30,12 @@ in
|
||||
};
|
||||
};
|
||||
|
||||
fileSystems."/" = {
|
||||
my.persist.btrfs = {
|
||||
device = btrfs;
|
||||
fsType = "btrfs";
|
||||
options = [
|
||||
"compress=zstd"
|
||||
"subvol=root"
|
||||
];
|
||||
mountPoint = "/nix/persist";
|
||||
persistSubvol = "persist";
|
||||
rootSubvol = "root";
|
||||
zstdCompress = true;
|
||||
};
|
||||
|
||||
fileSystems."/nix" = {
|
||||
@@ -48,42 +47,6 @@ in
|
||||
];
|
||||
};
|
||||
|
||||
my.persist.location = "/nix/persist";
|
||||
fileSystems."/nix/persist" = {
|
||||
device = btrfs;
|
||||
fsType = "btrfs";
|
||||
options = [
|
||||
"compress=zstd"
|
||||
"subvol=persist"
|
||||
];
|
||||
neededForBoot = true;
|
||||
};
|
||||
|
||||
boot.initrd.postDeviceCommands = lib.mkAfter ''
|
||||
mkdir /btrfs_tmp
|
||||
mount ${btrfs} /btrfs_tmp
|
||||
mkdir -p /btrfs_tmp/old_roots
|
||||
if [[ -e /btrfs_tmp/root ]]; then
|
||||
timestamp=$(date --date="@$(stat -c %Y /btrfs_tmp/root)" "+%Y-%m-%-d_%H:%M:%S")
|
||||
mv /btrfs_tmp/root "/btrfs_tmp/old_roots/$timestamp"
|
||||
fi
|
||||
|
||||
delete_subvolume_recursively() {
|
||||
IFS=$'\n'
|
||||
for i in $(btrfs subvolume list -o "$1" | cut -f 9- -d ' '); do
|
||||
delete_subvolume_recursively "/btrfs_tmp/$i"
|
||||
done
|
||||
btrfs subvolume delete "$1"
|
||||
}
|
||||
|
||||
for i in $(find /btrfs_tmp/old_roots/ -maxdepth 1 -mtime +14); do
|
||||
delete_subvolume_recursively "$i"
|
||||
done
|
||||
|
||||
btrfs subvolume create /btrfs_tmp/root
|
||||
umount /btrfs_tmp
|
||||
'';
|
||||
|
||||
fileSystems."/boot" = {
|
||||
device = "/dev/disk/by-uuid/96D3-93B0";
|
||||
fsType = "vfat";
|
||||
|
||||
@@ -131,13 +131,6 @@
|
||||
".config/dconf"
|
||||
".config/pip"
|
||||
".config/sunshine"
|
||||
|
||||
".gemini"
|
||||
".claude"
|
||||
".claude-code-router"
|
||||
];
|
||||
homeFiles = [
|
||||
".claude.json"
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
@@ -37,13 +37,12 @@ in
|
||||
];
|
||||
};
|
||||
|
||||
fileSystems."/" = {
|
||||
my.persist.btrfs = {
|
||||
device = btrfs;
|
||||
fsType = "btrfs";
|
||||
options = [
|
||||
"compress=zstd"
|
||||
"subvol=root"
|
||||
];
|
||||
mountPoint = "/nix/persist";
|
||||
persistSubvol = "persistent";
|
||||
rootSubvol = "root";
|
||||
zstdCompress = true;
|
||||
};
|
||||
|
||||
fileSystems."/nix" = {
|
||||
@@ -52,17 +51,6 @@ in
|
||||
options = [ "compress=zstd" ];
|
||||
};
|
||||
|
||||
my.persist.location = "/nix/persist";
|
||||
fileSystems."/nix/persist" = {
|
||||
device = btrfs;
|
||||
fsType = "btrfs";
|
||||
options = [
|
||||
"compress=zstd"
|
||||
"subvol=persistent"
|
||||
];
|
||||
neededForBoot = true;
|
||||
};
|
||||
|
||||
fileSystems."/swap" = {
|
||||
device = btrfs;
|
||||
fsType = "btrfs";
|
||||
@@ -73,31 +61,6 @@ in
|
||||
neededForBoot = true;
|
||||
};
|
||||
|
||||
boot.initrd.postDeviceCommands = lib.mkAfter ''
|
||||
mkdir /btrfs_tmp
|
||||
mount ${btrfs} /btrfs_tmp
|
||||
mkdir -p /btrfs_tmp/old_roots
|
||||
if [[ -e /btrfs_tmp/root ]]; then
|
||||
timestamp=$(date --date="@$(stat -c %Y /btrfs_tmp/root)" "+%Y-%m-%-d_%H:%M:%S")
|
||||
mv /btrfs_tmp/root "/btrfs_tmp/old_roots/$timestamp"
|
||||
fi
|
||||
|
||||
delete_subvolume_recursively() {
|
||||
IFS=$'\n'
|
||||
for i in $(btrfs subvolume list -o "$1" | cut -f 9- -d ' '); do
|
||||
delete_subvolume_recursively "/btrfs_tmp/$i"
|
||||
done
|
||||
btrfs subvolume delete "$1"
|
||||
}
|
||||
|
||||
for i in $(find /btrfs_tmp/old_roots/ -maxdepth 1 -mtime +14); do
|
||||
delete_subvolume_recursively "$i"
|
||||
done
|
||||
|
||||
btrfs subvolume create /btrfs_tmp/root
|
||||
umount /btrfs_tmp
|
||||
'';
|
||||
|
||||
fileSystems."/boot" = {
|
||||
device = "/dev/disk/by-uuid/B7DC-E9AC";
|
||||
fsType = "vfat";
|
||||
|
||||
@@ -78,12 +78,6 @@
|
||||
};
|
||||
|
||||
my = {
|
||||
autologin = {
|
||||
enable = true;
|
||||
user = username;
|
||||
ttys = [ 6 ];
|
||||
};
|
||||
|
||||
gpg.enable = true;
|
||||
cli.all.enable = true;
|
||||
coding.all.enable = true;
|
||||
@@ -161,13 +155,6 @@
|
||||
".config/dconf"
|
||||
".config/pip"
|
||||
".config/sunshine"
|
||||
|
||||
".gemini"
|
||||
".claude"
|
||||
".claude-code-router"
|
||||
];
|
||||
homeFiles = [
|
||||
".claude.json"
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
@@ -67,7 +67,7 @@ in
|
||||
aria2
|
||||
bat
|
||||
comma
|
||||
fastfetch
|
||||
fastfetch.minimal
|
||||
fd
|
||||
fzf
|
||||
jq
|
||||
|
||||
@@ -12,6 +12,7 @@ in
|
||||
zsh.enable = true;
|
||||
fish.enable = true;
|
||||
starship.enable = true;
|
||||
carapace.enable = true;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
{ config, lib, ... }:
|
||||
let
|
||||
cfg = config.my.cli.shell.carapace;
|
||||
in
|
||||
{
|
||||
options.my.cli.shell.carapace = {
|
||||
enable = lib.mkEnableOption "carapace completer";
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
my.hm = {
|
||||
programs.carapace = {
|
||||
enable = true;
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -32,7 +32,7 @@ in
|
||||
shellAliases = {
|
||||
la = "lsd -lah";
|
||||
ls = "lsd";
|
||||
svim = "doasedit";
|
||||
svim = "sudoedit";
|
||||
nf = "fastfetch";
|
||||
};
|
||||
interactiveShellInit = lib.mkBefore ''
|
||||
|
||||
@@ -51,7 +51,7 @@ in
|
||||
};
|
||||
shellAliases = {
|
||||
ls = "lsd";
|
||||
svim = "doasedit";
|
||||
svim = "sudoedit";
|
||||
nf = "fastfetch";
|
||||
};
|
||||
};
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
let
|
||||
cfg = config.my.coding.agents;
|
||||
in
|
||||
{
|
||||
options.my.coding.agents = {
|
||||
enable = lib.mkEnableOption "LLM coding agents";
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
my.hm = {
|
||||
home.packages = with pkgs.llm-agents; [
|
||||
codex
|
||||
claude-code
|
||||
opencode
|
||||
];
|
||||
};
|
||||
my.persist = {
|
||||
homeDirs = [
|
||||
".claude"
|
||||
|
||||
".config/opencode"
|
||||
".local/share/opencode"
|
||||
|
||||
".codex"
|
||||
];
|
||||
homeFiles = [
|
||||
".claude.json"
|
||||
];
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -11,6 +11,7 @@ in
|
||||
my.coding = {
|
||||
editor.all.enable = true;
|
||||
langs.all.enable = true;
|
||||
agents.enable = true;
|
||||
misc.enable = true;
|
||||
};
|
||||
};
|
||||
|
||||
@@ -14,6 +14,8 @@ in
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
# workaround
|
||||
environment.sessionVariables.EDITOR = "nvim";
|
||||
my.hm = {
|
||||
xdg.configFile."nvim".source = impure.mkImpureLink ./nvim;
|
||||
programs.neovim = {
|
||||
@@ -22,15 +24,23 @@ in
|
||||
viAlias = true;
|
||||
vimAlias = true;
|
||||
vimdiffAlias = true;
|
||||
withPython3 = false;
|
||||
withRuby = false;
|
||||
sideloadInitLua = true;
|
||||
extraPackages = with pkgs; [
|
||||
gcc # treesitter
|
||||
# treesitter
|
||||
tree-sitter
|
||||
gnutar
|
||||
curl
|
||||
gcc
|
||||
|
||||
ripgrep # telescope
|
||||
|
||||
# language servers
|
||||
vscode-json-languageserver
|
||||
vscode-langservers-extracted
|
||||
taplo
|
||||
typos-lsp
|
||||
|
||||
# render-markdown.nvim
|
||||
python3Packages.pylatexenc
|
||||
];
|
||||
|
||||
@@ -1,44 +1,43 @@
|
||||
{
|
||||
"Comment.nvim": { "branch": "master", "commit": "e30b7f2008e52442154b66f7c519bfd2f1e32acb" },
|
||||
"LuaSnip": { "branch": "master", "commit": "dae4f5aaa3574bd0c2b9dd20fb9542a02c10471c" },
|
||||
"blink.cmp": { "branch": "main", "commit": "b4d379393882561f9055abe780342ee00f02c573" },
|
||||
"LuaSnip": { "branch": "master", "commit": "0abc8f390b278c3b4aabc4c004ac8a088b65cf24" },
|
||||
"blink.cmp": { "branch": "main", "commit": "3db7326f54b73df4789e0fd6274bedda33975fea" },
|
||||
"blink.lib": { "branch": "main", "commit": "b127d48bf8e9ac9cf41f6e0fbead317503f76558" },
|
||||
"bufferline.nvim": { "branch": "main", "commit": "655133c3b4c3e5e05ec549b9f8cc2894ac6f51b3" },
|
||||
"friendly-snippets": { "branch": "main", "commit": "6cd7280adead7f586db6fccbd15d2cac7e2188b9" },
|
||||
"gitsigns.nvim": { "branch": "main", "commit": "9f3c6dd7868bcc116e9c1c1929ce063b978fa519" },
|
||||
"gitsigns.nvim": { "branch": "main", "commit": "25050e4ed39e628282831d4cbecb1850454ce915" },
|
||||
"glance.nvim": { "branch": "master", "commit": "bf86d8b79dce808e65fdb6e9269d0b4ed6d2eefc" },
|
||||
"guess-indent.nvim": { "branch": "main", "commit": "84a4987ff36798c2fc1169cbaff67960aed9776f" },
|
||||
"indent-blankline.nvim": { "branch": "master", "commit": "d28a3f70721c79e3c5f6693057ae929f3d9c0a03" },
|
||||
"inlay-hints.nvim": { "branch": "master", "commit": "11be32be3761c6263df2311afb6baa0de0863967" },
|
||||
"inlay-hints.nvim": { "branch": "master", "commit": "297a65ab9543eb0850c1a55df4bb89e22cfec504" },
|
||||
"lazy.nvim": { "branch": "main", "commit": "306a05526ada86a7b30af95c5cc81ffba93fef97" },
|
||||
"lazydev.nvim": { "branch": "main", "commit": "5231c62aa83c2f8dc8e7ba957aa77098cda1257d" },
|
||||
"leap.nvim": { "branch": "main", "commit": "eda0138a408a5600c45e324c69fe73c9df30939c" },
|
||||
"lazydev.nvim": { "branch": "main", "commit": "ff2cbcba459b637ec3fd165a2be59b7bbaeedf0d" },
|
||||
"leap.nvim": { "branch": "main", "commit": "d3641f9aa86e7460b14d9f4479e7454f88cc6b2d" },
|
||||
"lspkind.nvim": { "branch": "master", "commit": "c7274c48137396526b59d86232eabcdc7fed8a32" },
|
||||
"lualine.nvim": { "branch": "master", "commit": "47f91c416daef12db467145e16bed5bbfe00add8" },
|
||||
"mini.nvim": { "branch": "main", "commit": "0a6fe4ec57377526e9056fffb4204dbdfe860ebc" },
|
||||
"neo-tree.nvim": { "branch": "main", "commit": "f3df514fff2bdd4318127c40470984137f87b62e" },
|
||||
"lualine.nvim": { "branch": "master", "commit": "221ce6b2d999187044529f49da6554a92f740a96" },
|
||||
"mini.nvim": { "branch": "main", "commit": "b2ac6522f7a54b475d9fad711b938eefc6d3d0a6" },
|
||||
"neo-tree.nvim": { "branch": "main", "commit": "83e7a2982fd12b9c3d35bc39dd5877cd91a02a61" },
|
||||
"noice.nvim": { "branch": "main", "commit": "7bfd942445fb63089b59f97ca487d605e715f155" },
|
||||
"nui.nvim": { "branch": "main", "commit": "de740991c12411b663994b2860f1a4fd0937c130" },
|
||||
"nvim-autopairs": { "branch": "master", "commit": "59bce2eef357189c3305e25bc6dd2d138c1683f5" },
|
||||
"nvim-autopairs": { "branch": "master", "commit": "7b9923abad60b903ece7c52940e1321d39eccc79" },
|
||||
"nvim-colorizer.lua": { "branch": "master", "commit": "a065833f35a3a7cc3ef137ac88b5381da2ba302e" },
|
||||
"nvim-lspconfig": { "branch": "master", "commit": "5a855bcfec7973767a1a472335684bbd71d2fa2b" },
|
||||
"nvim-lspconfig": { "branch": "master", "commit": "229b79051b380377664edc4cbd534930154921a1" },
|
||||
"nvim-notify": { "branch": "master", "commit": "8701bece920b38ea289b457f902e2ad184131a5d" },
|
||||
"nvim-osc52": { "branch": "main", "commit": "04cfaba1865ae5c53b6f887c3ca7304973824fb2" },
|
||||
"nvim-tmux-navigation": { "branch": "main", "commit": "4898c98702954439233fdaf764c39636681e2861" },
|
||||
"nvim-treesitter": { "branch": "master", "commit": "42fc28ba918343ebfd5565147a42a26580579482" },
|
||||
"nvim-treesitter-textobjects": { "branch": "master", "commit": "5ca4aaa6efdcc59be46b95a3e876300cfead05ef" },
|
||||
"nvim-web-devicons": { "branch": "master", "commit": "746ffbb17975ebd6c40142362eee1b0249969c5c" },
|
||||
"outline.nvim": { "branch": "main", "commit": "ead1820d49c8e79ce89cab1c2c318981b695c9d2" },
|
||||
"pest.vim": { "branch": "master", "commit": "7cfcb43f824e74d13dfe631359fff2ec23836a77" },
|
||||
"plenary.nvim": { "branch": "master", "commit": "b9fd5226c2f76c951fc8ed5923d85e4de065e509" },
|
||||
"rainbow-delimiters.nvim": { "branch": "master", "commit": "e2858c43caafec291f915ef25fbed27bbe78abbd" },
|
||||
"nvim-treesitter": { "branch": "main", "commit": "4916d6592ede8c07973490d9322f187e07dfefac" },
|
||||
"nvim-treesitter-textobjects": { "branch": "main", "commit": "851e865342e5a4cb1ae23d31caf6e991e1c99f1e" },
|
||||
"nvim-web-devicons": { "branch": "master", "commit": "dfbfaa967a6f7ec50789bead7ef87e336c1fa63c" },
|
||||
"outline.nvim": { "branch": "main", "commit": "2a132953b944561d45b52e4541ebfff71934a742" },
|
||||
"pest.vim": { "branch": "master", "commit": "60cae7ea1beb644ed40081a3ec213ea9061aba09" },
|
||||
"plenary.nvim": { "branch": "master", "commit": "74b06c6c75e4eeb3108ec01852001636d85a932b" },
|
||||
"rainbow-delimiters.nvim": { "branch": "master", "commit": "a798325b7f36acc62741d1029930a7b96d4dd4bf" },
|
||||
"registers": { "branch": "main", "commit": "c217f8f369e0886776cda6c94eab839b30a8940d" },
|
||||
"render-markdown.nvim": { "branch": "main", "commit": "48b4175dbca8439d30c1f52231cbe5a712c8f9d9" },
|
||||
"ripgrep": { "branch": "master", "commit": "cb66736f146f093497f4dc537b33d0826f9af33c" },
|
||||
"telescope.nvim": { "branch": "master", "commit": "5255aa27c422de944791318024167ad5d40aad20" },
|
||||
"render-markdown.nvim": { "branch": "main", "commit": "5adf0895310c1904e5abfaad40a2baad7fe44a07" },
|
||||
"ripgrep": { "branch": "master", "commit": "82313cf95849bfe425109ad9506a52154879b1b1" },
|
||||
"telescope.nvim": { "branch": "master", "commit": "7d324792b7943e4aa16ad007212e6acc6f9fe335" },
|
||||
"todo-comments.nvim": { "branch": "main", "commit": "31e3c38ce9b29781e4422fc0322eb0a21f4e8668" },
|
||||
"tokyonight.nvim": { "branch": "main", "commit": "5da1b76e64daf4c5d410f06bcb6b9cb640da7dfd" },
|
||||
"tree-sitter-nu": { "branch": "main", "commit": "bb3f533e5792260291945e1f329e1f0a779def6e" },
|
||||
"tokyonight.nvim": { "branch": "main", "commit": "cdc07ac78467a233fd62c493de29a17e0cf2b2b6" },
|
||||
"trouble.nvim": { "branch": "main", "commit": "bd67efe408d4816e25e8491cc5ad4088e708a69a" },
|
||||
"vim-floaterm": { "branch": "master", "commit": "0ab5eb8135dc884bc543a819ac7033c15e72a76b" },
|
||||
"vim-floaterm": { "branch": "master", "commit": "bb4ba7952e906408e1f83b215f55ffe57efcade6" },
|
||||
"vim-repeat": { "branch": "master", "commit": "65846025c15494983dafe5e3b46c8f88ab2e9635" }
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ opt.shiftwidth = 4
|
||||
opt.softtabstop = 4
|
||||
opt.expandtab = true
|
||||
opt.autoindent = true
|
||||
opt.smartindent = true
|
||||
|
||||
-- Linenumber setting
|
||||
opt.number = true
|
||||
|
||||
@@ -80,8 +80,9 @@ local servers = {
|
||||
html = {},
|
||||
java_language_server = {},
|
||||
jsonls = {},
|
||||
pyright = {},
|
||||
taplo = {},
|
||||
pyrefly = {},
|
||||
-- taplo = {},
|
||||
tombi = {},
|
||||
ts_ls = {},
|
||||
typos_lsp = {},
|
||||
-- keep-sorted end
|
||||
|
||||
@@ -81,25 +81,26 @@ local plugins = {
|
||||
},
|
||||
{
|
||||
"nvim-treesitter/nvim-treesitter",
|
||||
branch = "main",
|
||||
dependencies = {
|
||||
{
|
||||
branch = "main",
|
||||
"nvim-treesitter/nvim-treesitter-textobjects",
|
||||
"nushell/tree-sitter-nu",
|
||||
},
|
||||
},
|
||||
config = function()
|
||||
require("nvim-treesitter.configs").setup(require("plugins.treesitter"))
|
||||
require("nvim-treesitter").setup(require("plugins.treesitter"))
|
||||
end,
|
||||
build = ":TSUpdate",
|
||||
},
|
||||
{
|
||||
url = "https://gitlab.com/HiPhish/rainbow-delimiters.nvim",
|
||||
event = "VeryLazy",
|
||||
config = function()
|
||||
require("plugins.rainbow-delimiters")
|
||||
end,
|
||||
},
|
||||
{
|
||||
"lukas-reineke/indent-blankline.nvim",
|
||||
event = "VeryLazy",
|
||||
dependencies = { "https://gitlab.com/HiPhish/rainbow-delimiters.nvim" },
|
||||
config = function()
|
||||
require("ibl").setup(require("plugins.indent-blankline"))
|
||||
@@ -107,13 +108,11 @@ local plugins = {
|
||||
},
|
||||
{
|
||||
"norcalli/nvim-colorizer.lua",
|
||||
event = "VeryLazy",
|
||||
opt = {},
|
||||
},
|
||||
{
|
||||
"neovim/nvim-lspconfig",
|
||||
dependencies = { "saghen/blink.cmp" },
|
||||
event = "VeryLazy",
|
||||
config = function()
|
||||
require("plugins.lsp.lspconfig")
|
||||
require("plugins.lsp.others")
|
||||
@@ -175,7 +174,6 @@ local plugins = {
|
||||
},
|
||||
{
|
||||
"saghen/blink.cmp",
|
||||
event = "VeryLazy",
|
||||
dependencies = {
|
||||
{
|
||||
"L3MON4D3/LuaSnip",
|
||||
@@ -195,6 +193,7 @@ local plugins = {
|
||||
},
|
||||
},
|
||||
},
|
||||
"saghen/blink.lib",
|
||||
},
|
||||
config = function()
|
||||
require("blink.cmp").setup(require("plugins.cmp.cmp"))
|
||||
@@ -202,7 +201,6 @@ local plugins = {
|
||||
},
|
||||
{
|
||||
"numToStr/Comment.nvim",
|
||||
event = "VeryLazy",
|
||||
opts = {},
|
||||
},
|
||||
{
|
||||
@@ -218,7 +216,6 @@ local plugins = {
|
||||
},
|
||||
{
|
||||
"lewis6991/gitsigns.nvim",
|
||||
event = "VeryLazy",
|
||||
config = function()
|
||||
require("gitsigns").setup(require("plugins.gitsigns"))
|
||||
end,
|
||||
@@ -270,14 +267,16 @@ local plugins = {
|
||||
},
|
||||
{
|
||||
"alexghergh/nvim-tmux-navigation",
|
||||
event = "VeryLazy",
|
||||
config = function()
|
||||
require("nvim-tmux-navigation").setup(require("plugins.tmuxnav"))
|
||||
end,
|
||||
},
|
||||
{
|
||||
"MeanderingProgrammer/render-markdown.nvim",
|
||||
dependencies = { "nvim-treesitter/nvim-treesitter", "nvim-tree/nvim-web-devicons" },
|
||||
dependencies = {
|
||||
"nvim-treesitter/nvim-treesitter",
|
||||
"nvim-tree/nvim-web-devicons",
|
||||
},
|
||||
event = "BufEnter *.md",
|
||||
--- @type render.md.UserConfig
|
||||
opts = {
|
||||
@@ -293,7 +292,6 @@ local plugins = {
|
||||
},
|
||||
{
|
||||
"folke/noice.nvim",
|
||||
event = "VeryLazy",
|
||||
dependencies = {
|
||||
"MunifTanjim/nui.nvim",
|
||||
"rcarriga/nvim-notify",
|
||||
@@ -308,31 +306,14 @@ local plugins = {
|
||||
},
|
||||
{
|
||||
"voldikss/vim-floaterm",
|
||||
event = "VeryLazy",
|
||||
config = function()
|
||||
require("plugins.floaterm")
|
||||
end,
|
||||
},
|
||||
{
|
||||
"folke/todo-comments.nvim",
|
||||
event = "VeryLazy",
|
||||
opts = {},
|
||||
},
|
||||
{
|
||||
"ojroques/nvim-osc52",
|
||||
event = "VeryLazy",
|
||||
config = function()
|
||||
require("osc52").setup({
|
||||
tmux_passthrough = true,
|
||||
})
|
||||
local function copy()
|
||||
if vim.v.event.operator == "y" and vim.v.event.regname == "+" then
|
||||
require("osc52").copy_register("+")
|
||||
end
|
||||
end
|
||||
vim.api.nvim_create_autocmd("TextYankPost", { callback = copy })
|
||||
end,
|
||||
},
|
||||
{
|
||||
"pest-parser/pest.vim",
|
||||
ft = "pest",
|
||||
@@ -341,12 +322,11 @@ local plugins = {
|
||||
|
||||
{
|
||||
"nmac427/guess-indent.nvim",
|
||||
event = "VeryLazy",
|
||||
opts = {},
|
||||
},
|
||||
|
||||
{
|
||||
"tversteeg/registers.nvim",
|
||||
"https://codeberg.org/fosk/registers.nvim",
|
||||
cmd = "Registers",
|
||||
config = true,
|
||||
keys = {
|
||||
|
||||
@@ -1,21 +1,15 @@
|
||||
--- @type TSConfig
|
||||
M = {
|
||||
auto_install = true,
|
||||
parser_install_dir = "$HOME/.local/share/nvim/lazy/nvim-treesitter",
|
||||
sync_install = true,
|
||||
modules = {},
|
||||
ignore_install = {},
|
||||
ensure_installed = {},
|
||||
|
||||
highlight = { enable = true },
|
||||
indent = { enable = true },
|
||||
install_dir = vim.fn.stdpath("data") .. "/site",
|
||||
}
|
||||
|
||||
vim.filetype.add({
|
||||
pattern = {
|
||||
[".*/hypr/.*%.conf"] = "hyprlang",
|
||||
[".*%.hl"] = "hyprlang",
|
||||
},
|
||||
vim.api.nvim_create_autocmd("FileType", {
|
||||
callback = function()
|
||||
-- Enable treesitter highlighting and disable regex syntax
|
||||
pcall(vim.treesitter.start)
|
||||
-- Enable treesitter-based indentation
|
||||
vim.bo.indentexpr = "v:lua.require'nvim-treesitter'.indentexpr()"
|
||||
end,
|
||||
})
|
||||
|
||||
return M
|
||||
|
||||
@@ -14,10 +14,7 @@ in
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
my.hm = {
|
||||
programs.vscode = {
|
||||
enable = true;
|
||||
package = pkgs.vscodium-wayland;
|
||||
};
|
||||
programs.vscodium.enable = true;
|
||||
};
|
||||
my.persist.homeDirs = [
|
||||
".config/VSCodium"
|
||||
|
||||
@@ -18,6 +18,7 @@ in
|
||||
java.enable = true;
|
||||
qml.enable = true;
|
||||
typst.enable = true;
|
||||
toml.enable = true;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
@@ -16,7 +16,7 @@ in
|
||||
my.hm.home.packages = with pkgs; [
|
||||
go
|
||||
gotools
|
||||
gopls
|
||||
(lib.hiPrio gopls)
|
||||
];
|
||||
my.persist.homeDirs = [
|
||||
"go"
|
||||
|
||||
@@ -19,7 +19,7 @@ in
|
||||
pnpm
|
||||
typescript
|
||||
|
||||
nodePackages.typescript-language-server
|
||||
typescript-language-server
|
||||
vue-language-server
|
||||
|
||||
biome
|
||||
|
||||
@@ -16,7 +16,7 @@ in
|
||||
my.hm.home.packages = with pkgs; [
|
||||
python3
|
||||
uv
|
||||
pyright
|
||||
pyrefly
|
||||
];
|
||||
};
|
||||
}
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
let
|
||||
cfg = config.my.coding.langs.toml;
|
||||
in
|
||||
{
|
||||
options.my.coding.langs.toml = {
|
||||
enable = lib.mkEnableOption "TOML";
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
my.hm.home.packages = with pkgs; [
|
||||
tombi
|
||||
];
|
||||
};
|
||||
}
|
||||
@@ -21,6 +21,7 @@ in
|
||||
];
|
||||
programs.direnv = {
|
||||
enable = true;
|
||||
nix-direnv.enable = true;
|
||||
config = {
|
||||
global = {
|
||||
warn_timeout = 0;
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
/target
|
||||
Generated
+2105
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,13 @@
|
||||
[package]
|
||||
name = "nix-racer"
|
||||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
|
||||
[dependencies]
|
||||
axum = "0.8"
|
||||
reqwest = { version = "0.13", features = ["rustls"] }
|
||||
serde = { version = "1.0.228", features = ["derive"] }
|
||||
tokio = { version = "1.52", features = ["full"] }
|
||||
toml = "1.1"
|
||||
tracing = "0.1"
|
||||
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
|
||||
@@ -0,0 +1,29 @@
|
||||
{
|
||||
lib,
|
||||
rustPlatform,
|
||||
}:
|
||||
|
||||
rustPlatform.buildRustPackage {
|
||||
pname = "nix-racer";
|
||||
version = "0.1.0";
|
||||
|
||||
src = lib.fileset.toSource {
|
||||
root = ./.;
|
||||
fileset = lib.fileset.unions [
|
||||
./Cargo.toml
|
||||
./Cargo.lock
|
||||
./src
|
||||
];
|
||||
};
|
||||
|
||||
cargoLock = {
|
||||
lockFile = ./Cargo.lock;
|
||||
};
|
||||
|
||||
meta = {
|
||||
description = "Nix substituter proxy with parallel cache queries and latency-aware selection";
|
||||
mainProgram = "nix-racer";
|
||||
license = lib.licenses.mit;
|
||||
platforms = lib.platforms.unix;
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
use reqwest::Url;
|
||||
use serde::{Deserialize, Deserializer, de::Error};
|
||||
use std::net::{SocketAddr, SocketAddrV4};
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct AppConfig {
|
||||
#[serde(default = "default_listen")]
|
||||
pub listen: SocketAddr,
|
||||
pub substituters: Vec<Substituter>,
|
||||
}
|
||||
|
||||
impl Default for AppConfig {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
listen: default_listen(),
|
||||
substituters: vec![
|
||||
Substituter {
|
||||
url: "https://mirror.sjtu.edu.cn/nix-channels/store",
|
||||
penalty: 0,
|
||||
},
|
||||
Substituter {
|
||||
url: "https://mirrors.ustc.edu.cn/nix-channels/store",
|
||||
penalty: 0,
|
||||
},
|
||||
Substituter {
|
||||
url: "https://cache.nixos.org",
|
||||
penalty: 100,
|
||||
},
|
||||
],
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn default_listen() -> SocketAddr {
|
||||
SocketAddr::V4(SocketAddrV4::new([127, 0, 0, 1].into(), 2048))
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct Substituter {
|
||||
pub url: &'static str,
|
||||
pub penalty: u32,
|
||||
}
|
||||
|
||||
impl<'de> Deserialize<'de> for Substituter {
|
||||
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||
where
|
||||
D: Deserializer<'de>,
|
||||
{
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
struct ShadowSubstituter {
|
||||
url: String,
|
||||
#[serde(default)]
|
||||
penalty: u32,
|
||||
}
|
||||
let sub = <ShadowSubstituter as Deserialize>::deserialize(deserializer);
|
||||
sub.and_then(|ShadowSubstituter { url, penalty }| {
|
||||
let url = match Url::parse(&url) {
|
||||
Ok(url) => Ok(Box::leak(url.to_string().into_boxed_str())),
|
||||
Err(err) => Err(<D::Error as Error>::custom(err.to_string())),
|
||||
}?;
|
||||
Ok(Substituter { url, penalty })
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,212 @@
|
||||
use std::{
|
||||
collections::HashMap,
|
||||
sync::Arc,
|
||||
time::{Duration, Instant},
|
||||
};
|
||||
|
||||
use axum::{
|
||||
Router,
|
||||
extract::{Path, State},
|
||||
http::{StatusCode, header},
|
||||
response::{IntoResponse, Redirect},
|
||||
routing::get,
|
||||
};
|
||||
use reqwest::Client;
|
||||
use tokio::task::JoinSet;
|
||||
use tracing_subscriber::{EnvFilter, layer::SubscriberExt as _, util::SubscriberInitExt as _};
|
||||
|
||||
mod config;
|
||||
use config::*;
|
||||
|
||||
#[derive(Clone)]
|
||||
struct AppState {
|
||||
client: Client,
|
||||
config: Arc<AppConfig>,
|
||||
}
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() {
|
||||
tracing_subscriber::registry()
|
||||
.with(tracing_subscriber::fmt::layer())
|
||||
.with(
|
||||
EnvFilter::builder()
|
||||
.with_env_var("NIX_RACER_LOG")
|
||||
.with_default_directive("nix_racer=debug".parse().unwrap())
|
||||
.from_env()
|
||||
.unwrap(),
|
||||
)
|
||||
.init();
|
||||
|
||||
let config: Arc<AppConfig> = match std::fs::read_to_string("/etc/nix/nix-racer.toml") {
|
||||
Ok(file) => toml::from_str::<AppConfig>(&file).unwrap_or_else(|x| {
|
||||
tracing::warn!("Failed to parse config file ({x}), fallback to default configuration");
|
||||
AppConfig::default()
|
||||
}),
|
||||
Err(err) if err.kind() == std::io::ErrorKind::NotFound => {
|
||||
tracing::info!("Config file not found, fallback to default configuration");
|
||||
AppConfig::default()
|
||||
}
|
||||
Err(err) => {
|
||||
tracing::warn!("Failed to read config file ({err}), fallback to default configuration");
|
||||
AppConfig::default()
|
||||
}
|
||||
}
|
||||
.into();
|
||||
|
||||
if config.substituters.is_empty() {
|
||||
tracing::error!("No substituters found");
|
||||
std::process::exit(1);
|
||||
}
|
||||
|
||||
let listen = config.listen;
|
||||
|
||||
let client = Client::builder()
|
||||
.timeout(Duration::from_secs(5))
|
||||
.pool_idle_timeout(Duration::from_secs(90))
|
||||
.build()
|
||||
.unwrap();
|
||||
|
||||
let state = AppState { client, config };
|
||||
|
||||
let listener = tokio::net::TcpListener::bind(listen).await.unwrap();
|
||||
|
||||
let app = Router::new()
|
||||
.route("/nix-cache-info", get(nix_cache_info_handler))
|
||||
.route("/{*path}", get(proxy_handler))
|
||||
.with_state(state);
|
||||
|
||||
tracing::info!("Smart Nix Proxy listening on http://{listen}");
|
||||
axum::serve(listener, app).await.unwrap();
|
||||
}
|
||||
|
||||
async fn nix_cache_info_handler() -> impl IntoResponse {
|
||||
let info = "StoreDir: /nix/store\nWantMassQuery: 1\nPriority: 30\n";
|
||||
([(header::CONTENT_TYPE, "text/x-nix-cache-info")], info)
|
||||
}
|
||||
|
||||
async fn proxy_handler(
|
||||
Path(path): Path<String>,
|
||||
State(state): State<AppState>,
|
||||
) -> impl IntoResponse {
|
||||
if !path.ends_with(".narinfo") {
|
||||
let redirect_url = format!("{}/{}", state.config.substituters[0].url, path);
|
||||
return Redirect::temporary(&redirect_url).into_response();
|
||||
}
|
||||
|
||||
let start_time = Instant::now();
|
||||
let mut set = JoinSet::new();
|
||||
|
||||
let mut penalties = HashMap::new();
|
||||
|
||||
for upstream in state.config.substituters.iter() {
|
||||
let url = format!("{}/{}", upstream.url, path);
|
||||
let client = state.client.clone();
|
||||
let base_url = upstream.url;
|
||||
|
||||
let handle = set.spawn(async move {
|
||||
let max_retries = 2;
|
||||
let mut delay = Duration::from_millis(50);
|
||||
|
||||
for attempt in 0..=max_retries {
|
||||
match client.get(&url).send().await {
|
||||
Ok(resp) if resp.status().is_success() => {
|
||||
let bytes = resp.bytes().await.map_err(|_| "Body error")?;
|
||||
|
||||
let text = String::from_utf8_lossy(&bytes);
|
||||
let mut new_text = String::with_capacity(text.len() + 64);
|
||||
for line in text.lines() {
|
||||
if let Some(rel_url) = line.strip_prefix("URL: ") {
|
||||
if rel_url.starts_with("http://") || rel_url.starts_with("https://")
|
||||
{
|
||||
new_text.push_str(line);
|
||||
} else {
|
||||
new_text.push_str(&format!("URL: {}/{}", base_url, rel_url));
|
||||
}
|
||||
} else {
|
||||
new_text.push_str(line);
|
||||
}
|
||||
new_text.push('\n');
|
||||
}
|
||||
return Ok((new_text.into_bytes(), base_url));
|
||||
}
|
||||
Ok(resp) if resp.status() == StatusCode::NOT_FOUND => return Err("404"),
|
||||
Err(_) => {
|
||||
if attempt == max_retries {
|
||||
return Err("Max retries");
|
||||
}
|
||||
tokio::time::sleep(delay).await;
|
||||
delay *= 2;
|
||||
}
|
||||
_ => return Err("Other HTTP Error"),
|
||||
}
|
||||
}
|
||||
Err("Unreachable")
|
||||
});
|
||||
|
||||
penalties.insert(handle.id(), upstream.penalty);
|
||||
}
|
||||
|
||||
struct ProxyResult {
|
||||
score: Duration,
|
||||
body: Vec<u8>,
|
||||
url: &'static str,
|
||||
}
|
||||
let mut best_result: Option<ProxyResult> = None;
|
||||
|
||||
loop {
|
||||
let min_active_penalty = penalties.values().min().copied();
|
||||
|
||||
if let Some(ProxyResult { score, .. }) = best_result {
|
||||
if let Some(min_p) = min_active_penalty {
|
||||
if start_time.elapsed() + Duration::from_millis(u64::from(min_p)) >= score {
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
} else if min_active_penalty.is_none() {
|
||||
break;
|
||||
}
|
||||
|
||||
let timeout_dur = if let Some(ProxyResult { score, .. }) = best_result {
|
||||
score.saturating_sub(start_time.elapsed())
|
||||
} else {
|
||||
Duration::from_secs(86400)
|
||||
};
|
||||
|
||||
if timeout_dur.is_zero() && best_result.is_some() {
|
||||
break;
|
||||
}
|
||||
|
||||
let res = tokio::time::timeout(timeout_dur, set.join_next_with_id()).await;
|
||||
|
||||
match res {
|
||||
Ok(Some(Ok((task_id, task_res)))) => {
|
||||
let penalty = penalties.remove(&task_id).unwrap();
|
||||
if let Ok((body, url)) = task_res {
|
||||
let score = start_time.elapsed() + Duration::from_millis(u64::from(penalty));
|
||||
if best_result.as_ref().is_none_or(|best| score < best.score) {
|
||||
best_result = Some(ProxyResult { score, body, url })
|
||||
}
|
||||
}
|
||||
}
|
||||
Ok(Some(Err(join_err))) => {
|
||||
penalties.remove(&join_err.id());
|
||||
}
|
||||
Ok(None) => break,
|
||||
Err(_) => break,
|
||||
}
|
||||
}
|
||||
|
||||
if let Some(ProxyResult { score, body, url }) = best_result {
|
||||
tracing::debug!("Winner for {}: {} (Score: {:?})", path, url, score,);
|
||||
(
|
||||
StatusCode::OK,
|
||||
[(header::CONTENT_TYPE, "text/x-nix-narinfo")],
|
||||
body,
|
||||
)
|
||||
.into_response()
|
||||
} else {
|
||||
(StatusCode::NOT_FOUND, "Not Found").into_response()
|
||||
}
|
||||
}
|
||||
+115
-9
@@ -32,23 +32,103 @@ in
|
||||
nh
|
||||
];
|
||||
|
||||
environment.etc = lib.mapAttrs' (name: value: {
|
||||
environment.etc =
|
||||
(lib.mapAttrs' (name: value: {
|
||||
name = "nix/path/${name}";
|
||||
value.source = value.flake;
|
||||
}) config.nix.registry;
|
||||
}) config.nix.registry)
|
||||
// {
|
||||
"nix/nix-racer.toml".source = (pkgs.formats.toml { }).generate "nix-racer.toml" {
|
||||
listen = "127.0.0.1:2048";
|
||||
substituters = [
|
||||
# {
|
||||
# penalty = 0;
|
||||
# url = "https://mirror.sjtu.edu.cn/nix-channels/store";
|
||||
# }
|
||||
{
|
||||
penalty = 0;
|
||||
url = "https://mirrors.sjtug.sjtu.edu.cn/nix-channels/store";
|
||||
}
|
||||
{
|
||||
penalty = 50;
|
||||
url = "https://mirrors.ustc.edu.cn/nix-channels/store";
|
||||
}
|
||||
{
|
||||
penalty = 0;
|
||||
url = "https://nix-community.cachix.org";
|
||||
}
|
||||
{
|
||||
penalty = 0;
|
||||
url = "https://cache.numtide.com";
|
||||
}
|
||||
{
|
||||
penalty = 100;
|
||||
url = "https://cache.nixos.org";
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
systemd.services.nix-racer = {
|
||||
description = "Nix substituter proxy with parallel cache queries and latency-aware selection";
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
after = [ "network-online.target" ];
|
||||
wants = [ "network-online.target" ];
|
||||
|
||||
serviceConfig = {
|
||||
Type = "simple";
|
||||
ExecStart = "${lib.getExe (pkgs.callPackage ./nix-racer/_package.nix { })}";
|
||||
Restart = "on-failure";
|
||||
RestartSec = 5;
|
||||
|
||||
DynamicUser = true;
|
||||
CapabilityBoundingSet = [ "" ];
|
||||
DeviceAllow = "";
|
||||
LockPersonality = true;
|
||||
MemoryDenyWriteExecute = true;
|
||||
NoNewPrivileges = true;
|
||||
PrivateDevices = true;
|
||||
PrivateTmp = true;
|
||||
ProtectClock = true;
|
||||
ProtectControlGroups = true;
|
||||
ProtectHome = true;
|
||||
ProtectHostname = true;
|
||||
ProtectKernelLogs = true;
|
||||
ProtectKernelModules = true;
|
||||
ProtectKernelTunables = true;
|
||||
ProtectSystem = "strict";
|
||||
RestrictAddressFamilies = [
|
||||
"AF_INET"
|
||||
"AF_INET6"
|
||||
];
|
||||
RestrictNamespaces = true;
|
||||
RestrictRealtime = true;
|
||||
RestrictSUIDSGID = true;
|
||||
SystemCallArchitectures = "native";
|
||||
SystemCallFilter = [
|
||||
"@system-service"
|
||||
"~@resources"
|
||||
"~@privileged"
|
||||
];
|
||||
UMask = "0077";
|
||||
};
|
||||
};
|
||||
|
||||
nix.settings = {
|
||||
experimental-features = "nix-command flakes pipe-operators";
|
||||
substituters = [
|
||||
"https://mirror.sjtu.edu.cn/nix-channels/store"
|
||||
substituters = lib.mkForce [
|
||||
"http://127.0.0.1:2048"
|
||||
"https://mirrors.sjtug.sjtu.edu.cn/nix-channels/store"
|
||||
"https://mirrors.ustc.edu.cn/nix-channels/store"
|
||||
"https://nix-community.cachix.org"
|
||||
"https://cache.garnix.io"
|
||||
"https://cache.numtide.com"
|
||||
"https://cache.nixos.org"
|
||||
|
||||
# "https://mirrors.ustc.edu.cn/nix-channels/store"
|
||||
# "https://mirrors.sjtug.sjtu.edu.cn/nix-channels/store"
|
||||
# "https://nix-community.cachix.org"
|
||||
];
|
||||
trusted-public-keys = [
|
||||
"nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="
|
||||
"cache.garnix.io:CTFPyKSLcx5RMJKfLo5EEPUObbA78b0YQ2DTCJXqr9g="
|
||||
"niks3.numtide.com-1:DTx8wZduET09hRmMtKdQDxNNthLQETkc/yaX7M4qK0g="
|
||||
];
|
||||
download-buffer-size = 536870912; # 512 MiB
|
||||
warn-dirty = false;
|
||||
@@ -92,7 +172,33 @@ in
|
||||
services.angrr = {
|
||||
enable = true;
|
||||
settings = {
|
||||
period = "1month";
|
||||
temporary-root-policies = {
|
||||
direnv = {
|
||||
path-regex = "/\\.direnv/";
|
||||
period = "14d";
|
||||
};
|
||||
result = {
|
||||
path-regex = "/result[^/]*$";
|
||||
period = "3d";
|
||||
};
|
||||
};
|
||||
profile-policies = {
|
||||
system = {
|
||||
profile-paths = [ "/nix/var/nix/profiles/system" ];
|
||||
keep-since = "14d";
|
||||
keep-latest-n = 5;
|
||||
keep-booted-system = true;
|
||||
keep-current-system = true;
|
||||
};
|
||||
user = {
|
||||
profile-paths = [
|
||||
"~/.local/state/nix/profiles/profile"
|
||||
"/nix/var/nix/profiles/per-user/root/profile"
|
||||
];
|
||||
keep-since = "14d";
|
||||
keep-latest-n = 5;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@@ -10,15 +10,35 @@ in
|
||||
{
|
||||
options.my.persist = {
|
||||
enable = lib.mkEnableOption "persist";
|
||||
location = lib.mkOption {
|
||||
btrfs = lib.mkOption {
|
||||
type = lib.types.submodule (
|
||||
{ ... }:
|
||||
{
|
||||
options = {
|
||||
device = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
};
|
||||
zstdCompress = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = true;
|
||||
};
|
||||
persistSubvol = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
};
|
||||
rootSubvol = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
default = "root";
|
||||
};
|
||||
mountPoint = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
default = "/nix/persist";
|
||||
example = lib.literalExpression ''
|
||||
"/persistent"
|
||||
'';
|
||||
description = lib.mdDoc ''
|
||||
Persistent location
|
||||
'';
|
||||
};
|
||||
};
|
||||
}
|
||||
);
|
||||
};
|
||||
homeDirs = lib.mkOption {
|
||||
default = [ ];
|
||||
@@ -69,8 +89,65 @@ in
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
fileSystems.${cfg.btrfs.mountPoint} = {
|
||||
device = cfg.btrfs.device;
|
||||
fsType = "btrfs";
|
||||
options = [
|
||||
"subvol=${cfg.btrfs.persistSubvol}"
|
||||
]
|
||||
++ lib.optionals cfg.btrfs.zstdCompress [
|
||||
"compress=zstd"
|
||||
];
|
||||
neededForBoot = true;
|
||||
};
|
||||
fileSystems."/" = {
|
||||
device = cfg.btrfs.device;
|
||||
fsType = "btrfs";
|
||||
options = [
|
||||
"subvol=${cfg.btrfs.rootSubvol}"
|
||||
]
|
||||
++ lib.optionals cfg.btrfs.zstdCompress [
|
||||
"compress=zstd"
|
||||
];
|
||||
};
|
||||
|
||||
boot.initrd.systemd.services.wipe-root = {
|
||||
description = "Rollback BTRFS rootfs";
|
||||
wantedBy = [ "initrd.target" ];
|
||||
before = [ "sysroot.mount" ];
|
||||
after = [ "initrd-root-device.target" ];
|
||||
unitConfig.DefaultDependencies = "no";
|
||||
serviceConfig.Type = "oneshot";
|
||||
|
||||
script = ''
|
||||
mkdir -p /btrfs_tmp
|
||||
mount ${cfg.btrfs.device} /btrfs_tmp
|
||||
mkdir -p /btrfs_tmp/old_roots
|
||||
|
||||
if [ -e /btrfs_tmp/root ]; then
|
||||
timestamp=$(date -d "@$(stat -c %Y /btrfs_tmp/root)" "+%Y-%m-%d_%H:%M:%S" 2>/dev/null || date "+%Y-%m-%d_%H:%M:%S")
|
||||
mv /btrfs_tmp/root "/btrfs_tmp/old_roots/$timestamp"
|
||||
fi
|
||||
|
||||
delete_subvolume_recursively() {
|
||||
IFS=$(printf '\n')
|
||||
for i in $(btrfs subvolume list -o "$1" | cut -f 9- -d ' '); do
|
||||
delete_subvolume_recursively "/btrfs_tmp/$i"
|
||||
done
|
||||
btrfs subvolume delete "$1"
|
||||
}
|
||||
|
||||
for i in $(find /btrfs_tmp/old_roots/ -maxdepth 1 -mtime +14); do
|
||||
delete_subvolume_recursively "$i"
|
||||
done
|
||||
|
||||
btrfs subvolume create /btrfs_tmp/${cfg.btrfs.rootSubvol}
|
||||
umount /btrfs_tmp
|
||||
'';
|
||||
};
|
||||
|
||||
programs.fuse.userAllowOther = true;
|
||||
environment.persistence.${cfg.location} = {
|
||||
environment.persistence.${cfg.btrfs.mountPoint} = {
|
||||
hideMounts = true;
|
||||
directories = cfg.nixosDirs;
|
||||
files = cfg.nixosFiles;
|
||||
|
||||
+7
-55
@@ -2,6 +2,7 @@
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
hostname,
|
||||
username,
|
||||
userdesc,
|
||||
secrets,
|
||||
@@ -38,67 +39,18 @@ in
|
||||
};
|
||||
users.users.root.hashedPasswordFile = lib.mkDefault config.sops.secrets.imxyy-nix-hashed-password.path;
|
||||
|
||||
security.sudo.enable = false;
|
||||
security.doas = {
|
||||
security.sudo = {
|
||||
enable = true;
|
||||
extraRules = [
|
||||
{
|
||||
users = [ username ];
|
||||
noPass = true;
|
||||
keepEnv = true;
|
||||
users = [ "imxyy" ];
|
||||
commands = lib.singleton {
|
||||
command = "ALL";
|
||||
options = lib.optionals (hostname == "imxyy-nix") [ "NOPASSWD" ];
|
||||
};
|
||||
}
|
||||
];
|
||||
};
|
||||
environment.shellAliases = {
|
||||
sudoedit = "doasedit";
|
||||
};
|
||||
environment.systemPackages = [
|
||||
(pkgs.writeShellScriptBin "sudo" ''exec doas "$@"'')
|
||||
(pkgs.writeShellScriptBin "doasedit" ''
|
||||
if [ -n "''${2}" ]; then
|
||||
printf 'Expected only one argument\n'
|
||||
exit 1
|
||||
elif [ -z "''${1}" ]; then
|
||||
printf 'No file path provided\n'
|
||||
exit 1
|
||||
elif [ "$(id -u)" -eq 0 ]; then
|
||||
printf 'Cannot be run as root\n'
|
||||
exit 1
|
||||
fi
|
||||
|
||||
set -eu
|
||||
|
||||
tempdir="$(mktemp -d)"
|
||||
|
||||
trap 'rm -rf $tempdir' EXIT
|
||||
srcfile="$(doas realpath "$1")"
|
||||
|
||||
if doas [ -f "$srcfile" ]; then
|
||||
doas cp -a "$srcfile" "$tempdir"/file
|
||||
doas cp -a "$tempdir"/file "$tempdir"/edit
|
||||
|
||||
# make sure that the file is editable by user
|
||||
doas chown "$USER":"$USER" "$tempdir"/edit
|
||||
chmod 600 "$tempdir"/edit
|
||||
else
|
||||
# create file with "regular" system permissions (root:root 644)
|
||||
touch "$tempdir"/file
|
||||
doas chown root:root "$tempdir"/file
|
||||
fi
|
||||
|
||||
$EDITOR "$tempdir"/edit
|
||||
|
||||
doas tee "$tempdir"/file 1>/dev/null < "$tempdir"/edit
|
||||
|
||||
if doas cmp -s "$tempdir/file" "$srcfile"; then
|
||||
printf 'Skipping write; no changes.\n'
|
||||
exit 0
|
||||
else
|
||||
doas mv -f "$tempdir"/file "$srcfile"
|
||||
exit 0
|
||||
fi
|
||||
'')
|
||||
];
|
||||
|
||||
nix.settings.trusted-users = [
|
||||
"root"
|
||||
|
||||
@@ -8,9 +8,12 @@ in
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
my.hm.programs.firefox.enable = true;
|
||||
my.hm.programs.firefox = {
|
||||
enable = true;
|
||||
configPath = "${config.my.hm.xdg.configHome}/mozilla/firefox";
|
||||
};
|
||||
my.persist.homeDirs = [
|
||||
".mozilla"
|
||||
".config/mozilla"
|
||||
];
|
||||
};
|
||||
}
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
hostname,
|
||||
...
|
||||
}:
|
||||
let
|
||||
@@ -14,18 +13,9 @@ in
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
assertions = [
|
||||
{
|
||||
assertion = hostname == "imxyy-nix";
|
||||
message = "XDG migration not done! Check
|
||||
https://github.com/0xc000022070/zen-browser-flake?tab=readme-ov-file#missing-configuration-after-update
|
||||
for details";
|
||||
}
|
||||
];
|
||||
|
||||
my.hm.programs.zen-browser = {
|
||||
enable = true;
|
||||
nativeMessagingHosts = [ pkgs.firefoxpwa ];
|
||||
nativeMessagingHosts = [ pkgs.master.firefoxpwa ];
|
||||
policies = {
|
||||
# find more options here: https://mozilla.github.io/policy-templates/
|
||||
DisableAppUpdate = true;
|
||||
|
||||
@@ -13,7 +13,23 @@ in
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
my.hm.home.packages = [ pkgs.splayer ];
|
||||
nixpkgs.config.permittedInsecurePackages = (
|
||||
lib.warn
|
||||
''
|
||||
SPlayer still using pnpm 10.29.2. Check
|
||||
https://github.com/NixOS/nixpkgs/issues/535580#issuecomment-4809489104
|
||||
''
|
||||
[
|
||||
"pnpm-10.29.2"
|
||||
]
|
||||
);
|
||||
|
||||
my.hm.home.packages = [
|
||||
# (pkgs.master.splayer.override {
|
||||
# pnpm_10_29_2 = pkgs.pnpm_10;
|
||||
# })
|
||||
pkgs.splayer
|
||||
];
|
||||
my.persist.homeDirs = [
|
||||
".config/SPlayer"
|
||||
];
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
impure,
|
||||
...
|
||||
}:
|
||||
let
|
||||
@@ -13,19 +14,6 @@ in
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
catppuccin.sddm = {
|
||||
enable = true;
|
||||
font = "Jetbrains Mono";
|
||||
fontSize = "18";
|
||||
};
|
||||
services.displayManager.sddm = {
|
||||
package = pkgs.kdePackages.sddm;
|
||||
settings.Theme = {
|
||||
CursorTheme = "breeze-dark";
|
||||
CursorSize = 24;
|
||||
};
|
||||
};
|
||||
|
||||
my.hm = {
|
||||
stylix = {
|
||||
enable = true;
|
||||
@@ -81,20 +69,21 @@ in
|
||||
#QT
|
||||
qt = {
|
||||
enable = true;
|
||||
style.package = with pkgs; [
|
||||
darkly-qt5
|
||||
platformTheme.name = "kde";
|
||||
style = {
|
||||
package = with pkgs; [
|
||||
darkly-qt6
|
||||
];
|
||||
platformTheme.name = "qtct";
|
||||
name = "Darkly";
|
||||
};
|
||||
};
|
||||
|
||||
xdg.configFile = {
|
||||
"qt5ct/qt5ct.conf".source = pkgs.replaceVars ./qtct/qt5ct.conf {
|
||||
darker = pkgs.libsForQt5.qt5ct + /share/qt5ct/colors/darker.conf;
|
||||
};
|
||||
"qt6ct/qt6ct.conf".source = pkgs.replaceVars ./qtct/qt6ct.conf {
|
||||
darker = pkgs.qt6Packages.qt6ct + /share/qt6ct/colors/darker.conf;
|
||||
};
|
||||
kdeglobals.source = impure.mkImpureLink ./kdeglobals;
|
||||
plasmarc.text = ''
|
||||
[Theme]
|
||||
name=darkly
|
||||
'';
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@@ -0,0 +1,140 @@
|
||||
[ColorEffects:Disabled]
|
||||
ChangeSelectionColor=
|
||||
Color=36,36,36
|
||||
ColorAmount=0.5
|
||||
ColorEffect=3
|
||||
ContrastAmount=0.5
|
||||
ContrastEffect=0
|
||||
Enable=
|
||||
IntensityAmount=0
|
||||
IntensityEffect=0
|
||||
|
||||
[ColorEffects:Inactive]
|
||||
ChangeSelectionColor=true
|
||||
Color=51,51,51
|
||||
ColorAmount=0.4
|
||||
ColorEffect=3
|
||||
ContrastAmount=0.4
|
||||
ContrastEffect=0
|
||||
Enable=true
|
||||
IntensityAmount=-0.2
|
||||
IntensityEffect=0
|
||||
|
||||
[Colors:Button]
|
||||
BackgroundAlternate=77,77,77
|
||||
BackgroundNormal=50,50,50
|
||||
DecorationFocus=52,120,218
|
||||
DecorationHover=0,161,236
|
||||
ForegroundActive=61,174,233
|
||||
ForegroundInactive=199,199,199
|
||||
ForegroundLink=0,100,255
|
||||
ForegroundNegative=218,68,83
|
||||
ForegroundNeutral=246,116,0
|
||||
ForegroundNormal=241,241,241
|
||||
ForegroundPositive=36,173,89
|
||||
ForegroundVisited=115,115,158
|
||||
|
||||
[Colors:Complementary]
|
||||
BackgroundAlternate=59,64,69
|
||||
BackgroundNormal=49,54,59
|
||||
DecorationFocus=30,146,255
|
||||
DecorationHover=61,174,230
|
||||
ForegroundActive=246,116,0
|
||||
ForegroundInactive=175,176,179
|
||||
ForegroundLink=61,174,230
|
||||
ForegroundNegative=237,21,21
|
||||
ForegroundNeutral=201,206,59
|
||||
ForegroundNormal=239,240,241
|
||||
ForegroundPositive=17,209,22
|
||||
ForegroundVisited=61,174,230
|
||||
|
||||
[Colors:Selection]
|
||||
BackgroundAlternate=29,153,243
|
||||
BackgroundNormal=27,145,213
|
||||
DecorationFocus=52,120,218
|
||||
DecorationHover=0,161,236
|
||||
ForegroundActive=252,252,252
|
||||
ForegroundInactive=241,241,241
|
||||
ForegroundLink=0,100,255
|
||||
ForegroundNegative=218,68,83
|
||||
ForegroundNeutral=246,116,0
|
||||
ForegroundNormal=241,241,241
|
||||
ForegroundPositive=36,173,89
|
||||
ForegroundVisited=115,115,158
|
||||
|
||||
[Colors:Tooltip]
|
||||
BackgroundAlternate=77,77,77
|
||||
BackgroundNormal=59,59,59
|
||||
DecorationFocus=52,120,218
|
||||
DecorationHover=0,161,236
|
||||
ForegroundActive=61,174,233
|
||||
ForegroundInactive=199,199,199
|
||||
ForegroundLink=0,100,255
|
||||
ForegroundNegative=218,68,83
|
||||
ForegroundNeutral=246,116,0
|
||||
ForegroundNormal=239,240,241
|
||||
ForegroundPositive=36,173,89
|
||||
ForegroundVisited=115,115,158
|
||||
|
||||
[Colors:View]
|
||||
BackgroundAlternate=54,54,54
|
||||
BackgroundNormal=44,44,44
|
||||
DecorationFocus=52,120,218
|
||||
DecorationHover=0,161,236
|
||||
ForegroundActive=61,174,233
|
||||
ForegroundInactive=199,199,199
|
||||
ForegroundLink=0,100,255
|
||||
ForegroundNegative=218,68,83
|
||||
ForegroundNeutral=246,116,0
|
||||
ForegroundNormal=241,241,241
|
||||
ForegroundPositive=36,173,89
|
||||
ForegroundVisited=115,115,158
|
||||
|
||||
[Colors:Window]
|
||||
BackgroundAlternate=77,77,77
|
||||
BackgroundNormal=34,34,34
|
||||
DecorationFocus=52,120,218
|
||||
DecorationHover=0,161,236
|
||||
ForegroundActive=61,174,233
|
||||
ForegroundInactive=199,199,199
|
||||
ForegroundLink=0,100,255
|
||||
ForegroundNegative=218,68,83
|
||||
ForegroundNeutral=246,116,0
|
||||
ForegroundNormal=239,240,241
|
||||
ForegroundPositive=36,173,89
|
||||
ForegroundVisited=115,115,158
|
||||
|
||||
[General]
|
||||
ColorScheme=Darkly
|
||||
|
||||
[Icons]
|
||||
Theme=Papirus-Dark
|
||||
|
||||
[KDE]
|
||||
contrast=0
|
||||
frameContrast=0.2
|
||||
|
||||
[KFileDialog Settings]
|
||||
Allow Expansion=false
|
||||
Automatically select filename extension=true
|
||||
Breadcrumb Navigation=true
|
||||
Decoration position=2
|
||||
Show Full Path=false
|
||||
Show Inline Previews=true
|
||||
Show Preview=false
|
||||
Show Speedbar=true
|
||||
Show hidden files=false
|
||||
Sort by=Name
|
||||
Sort directories first=true
|
||||
Sort hidden files last=false
|
||||
Sort reversed=false
|
||||
Speedbar Width=154
|
||||
View Style=DetailTree
|
||||
|
||||
[WM]
|
||||
activeBackground=34,34,34
|
||||
activeBlend=255,255,255
|
||||
activeForeground=204,204,204
|
||||
inactiveBackground=44,44,44
|
||||
inactiveBlend=44,44,44
|
||||
inactiveForeground=144,144,144
|
||||
@@ -0,0 +1,41 @@
|
||||
include "generated-config.kdl"
|
||||
|
||||
layout {
|
||||
border {
|
||||
on
|
||||
}
|
||||
}
|
||||
|
||||
blur {
|
||||
passes 3
|
||||
offset 4
|
||||
noise 0.02
|
||||
saturation 1.5
|
||||
}
|
||||
|
||||
window-rule {
|
||||
draw-border-with-background false
|
||||
geometry-corner-radius 14.000000 14.000000 14.000000 14.000000
|
||||
clip-to-geometry true
|
||||
background-effect {
|
||||
xray true
|
||||
blur true
|
||||
}
|
||||
}
|
||||
|
||||
window-rule {
|
||||
match is-floating=true
|
||||
background-effect {
|
||||
xray false
|
||||
}
|
||||
}
|
||||
|
||||
window-rule {
|
||||
match app-id="kitty|foot|Alacritty|ghostty"
|
||||
opacity 0.8
|
||||
}
|
||||
|
||||
window-rule {
|
||||
match app-id="org.gnome.Nautilus"
|
||||
opacity 0.6
|
||||
}
|
||||
@@ -3,6 +3,7 @@
|
||||
lib,
|
||||
pkgs,
|
||||
assets,
|
||||
impure,
|
||||
...
|
||||
}:
|
||||
let
|
||||
@@ -10,7 +11,11 @@ let
|
||||
in
|
||||
{
|
||||
config = lib.mkIf config.my.desktop.wm.niri.enable {
|
||||
my.hm.programs.niri.settings = {
|
||||
my.hm = {
|
||||
xdg.configFile.niri-config.target = lib.mkForce "niri/generated-config.kdl";
|
||||
xdg.configFile."niri/config.kdl".source = impure.mkImpureLink ./config.kdl;
|
||||
|
||||
programs.niri.settings = {
|
||||
input = {
|
||||
focus-follows-mouse = {
|
||||
enable = true;
|
||||
@@ -76,34 +81,9 @@ in
|
||||
matches = [ { namespace = "^wallpaper$"; } ];
|
||||
place-within-backdrop = true;
|
||||
}
|
||||
{
|
||||
matches = [ { namespace = "^waybar$"; } ];
|
||||
opacity = 0.99;
|
||||
}
|
||||
];
|
||||
overview.workspace-shadow.enable = false;
|
||||
|
||||
window-rules = [
|
||||
{
|
||||
geometry-corner-radius = {
|
||||
bottom-left = 14.;
|
||||
bottom-right = 14.;
|
||||
top-left = 14.;
|
||||
top-right = 14.;
|
||||
};
|
||||
clip-to-geometry = true;
|
||||
draw-border-with-background = false;
|
||||
}
|
||||
{
|
||||
matches = [ { app-id = "kitty|foot|Alacritty|ghostty|wofi"; } ];
|
||||
opacity = 0.8;
|
||||
}
|
||||
{
|
||||
matches = [ { app-id = "org.gnome.Nautilus"; } ];
|
||||
opacity = 0.6;
|
||||
}
|
||||
];
|
||||
|
||||
environment.NIXOS_OZONE_WL = "1";
|
||||
|
||||
spawn-at-startup = lib.mkBefore (
|
||||
@@ -139,12 +119,8 @@ in
|
||||
"cliphist"
|
||||
"store"
|
||||
]
|
||||
# TODO: Is there a better way?
|
||||
[
|
||||
"systemctl"
|
||||
"restart"
|
||||
"--user"
|
||||
"noctalia-shell.service"
|
||||
"noctalia-shell"
|
||||
]
|
||||
]
|
||||
);
|
||||
@@ -358,5 +334,7 @@ in
|
||||
}) (lib.range 0 9)
|
||||
);
|
||||
};
|
||||
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
@@ -15,14 +15,19 @@ in
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
niri-flake.cache.enable = false;
|
||||
programs.niri = {
|
||||
enable = true;
|
||||
package = pkg;
|
||||
};
|
||||
services.displayManager = {
|
||||
sddm = {
|
||||
ly = {
|
||||
enable = true;
|
||||
wayland.enable = true;
|
||||
settings = {
|
||||
animation = "matrix";
|
||||
session_log = ".local/state/ly-session.log";
|
||||
shell = false;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@@ -77,7 +82,6 @@ in
|
||||
|
||||
programs.noctalia-shell = {
|
||||
enable = true;
|
||||
systemd.enable = true;
|
||||
# modified from official Tokyo-Night theme
|
||||
colors = {
|
||||
mError = "#f7768e";
|
||||
|
||||
@@ -1,77 +0,0 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
|
||||
with lib;
|
||||
|
||||
let
|
||||
cfg = config.my.autologin;
|
||||
gettycfg = config.services.getty;
|
||||
|
||||
baseArgs = [
|
||||
"--login-program"
|
||||
"${gettycfg.loginProgram}"
|
||||
]
|
||||
++ optionals (gettycfg.loginOptions != null) [
|
||||
"--login-options"
|
||||
gettycfg.loginOptions
|
||||
]
|
||||
++ gettycfg.extraArgs;
|
||||
|
||||
gettyCmd = args: "@${pkgs.util-linux}/sbin/agetty agetty ${escapeShellArgs baseArgs} ${args}";
|
||||
|
||||
forAllAutologinTTYs =
|
||||
config:
|
||||
attrsets.mergeAttrsList (map (ttynum: { "getty@tty${toString ttynum}" = config; }) cfg.ttys);
|
||||
|
||||
autologinModule = types.submodule {
|
||||
options = {
|
||||
enable = mkEnableOption "autologin";
|
||||
user = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
example = "foo";
|
||||
description = mdDoc ''
|
||||
Username of the account that will be automatically logged in at the console.
|
||||
'';
|
||||
};
|
||||
ttys = mkOption {
|
||||
type = types.listOf types.int;
|
||||
default = [ 6 ];
|
||||
description = mdDoc ''
|
||||
TTY numbers for autologin.user to login to.
|
||||
'';
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
###### interface
|
||||
|
||||
options = {
|
||||
|
||||
my.autologin = mkOption {
|
||||
type = autologinModule;
|
||||
default = { };
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
###### implementation
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
systemd.services = forAllAutologinTTYs {
|
||||
overrideStrategy = "asDropin"; # needed for templates to work
|
||||
serviceConfig.ExecStart = [
|
||||
""
|
||||
(gettyCmd "--noclear --keep-baud %I 115200,38400,9600 -a ${cfg.user} $TERM")
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
}
|
||||
+1
-1
@@ -17,7 +17,7 @@ in
|
||||
sshKeyFile = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
default = "${
|
||||
if config.my.persist.enable then config.my.persist.location else ""
|
||||
if config.my.persist.enable then config.my.persist.btrfs.mountPoint else ""
|
||||
}/home/${username}/.ssh/id_ed25519";
|
||||
};
|
||||
};
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
grub.enable = false;
|
||||
timeout = 0;
|
||||
};
|
||||
boot.kernel.sysctl = {
|
||||
"kernel.printk" = "3 4 1 3";
|
||||
};
|
||||
|
||||
security.pam.loginLimits = [
|
||||
{
|
||||
@@ -42,6 +45,5 @@
|
||||
# Desktop persistence
|
||||
my.persist = {
|
||||
enable = lib.mkDefault true;
|
||||
location = lib.mkDefault "/nix/persist";
|
||||
};
|
||||
}
|
||||
|
||||
@@ -21,6 +21,5 @@
|
||||
# Server persistence
|
||||
my.persist = {
|
||||
enable = lib.mkDefault true;
|
||||
location = lib.mkDefault "/nix/persist";
|
||||
};
|
||||
}
|
||||
|
||||
File diff suppressed because one or more lines are too long
+10
-10
File diff suppressed because one or more lines are too long
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"data": "ENC[AES256_GCM,data:woTNsrZnU3IclRXuh41H82YHeFa6U8aT+ILtjUQ9P80Rz7sUwGinh7z+5bNJkhdTub4BZ+ySl8Ov0XfDKWClT4AmbcRCuwwN8BfOJ59v+fyzsBSu8Y7wXSPciY+T/4rn60HlnVCyjX23dMNWwuN08bS/4iDw+/Ur80/3li2Azl5+37y/S2ZbFU0FP3OCy/G5+rGI0IFTCzRMfB/wpDhesxGzi1epKWvFx0q1Qnv0SiaZlo8mpG+G997mltBMlVkmAiNq57VAVs1ZBDAOf56q1UUHMtExAQt0zad5YWZeBgXQYWG8AFgOhSBiqjpFkUkfysv1mYqWnA7Ej/fD/H8e1uckC6KT9m4w1l71JmIkuUMW8PN/66cGYwZ/gMrZTAwlaVqiYPE1ppmnvrQxukQMgj40y27sWauMK+biPRNTrkU7egjH0IHCHHE49vq3VDFa48SAYXiBCHV+e/Gy9Em1ImRn2lCzAoKUtI5ilccg6MyUbug+1aDWx5NBkhpVw751HyLiSjNyphzVZewo9hGun2F+Fl9NdhM5xpq4tM9bbnsm0y44Vt8FJU0dmY6lfq1qqI3MjLg14iET/WLTorxH0i1iJUYy8Z6FJ7ArGUv6qw7ECNH0ZeUiNk0vICniyRlr+9JGFiHesX5oajXVxOp6vA6FnA4j1jeUvOLViiRc8DxLZziyA7ZdKDXwPJ4JKA==,iv:Df76Q6DoA6lI6xv7nnN6bjsaMPK7dnM/WvVd/O4h6qs=,tag:Yi/inQbd1wCY+PPbq0By9w==,type:str]",
|
||||
"data": "ENC[AES256_GCM,data:RZyNbgY+zGJWxLDUaEIYYLOMkNiFvkVTBTqjzyP6M/iiQFEQKYarUFxgBXU71aVl00/J8ykP5F6d9am9BqcmH/m/mlrLSlXk9Uh9KcnAJl/qzV0q64hyrA3rPO0HS8ipsaWPQqeUMc5U7cfwViviW0HASRbT07ihC3JzgwVa9ReDHcbxzY8m7PN8D5KpIkxItppGnCfe54kqdEg4Fn8vlMSnWbvpdV2XZ9r9klqu09ZRQ3QSaUTLNIAK+IG/AtgmeerZpUbFu9oKPB9ztqUYMZWlNV7g4h0uaz9UkM7T6HSn83m7JawKSabdTiTNL1ePu9/nuAx7+2vRgtnXBO4YTXu8ZRtcB5OmNCVOyM75gM/+gzYJwLfwPTx8GUi6TdoHV90myoE+TNr6jYao8N0yR/YgKEkT3YH7AmV1NKPkJjMOFG2AbpDgsX19WBo1ySVLKMurLUbTjLSIXkjCuVcw3pRVI3iXNlidogEoBSsyRN0qFnQ1V1LAAL55pM7a/Jelmm2ZNGomX/LXR24X1eM6t12rO8FgpUGTP7bdFAL02CEcydw0HsDRQd30ZKfPS/vTIYvxgx4TlM/L2E5E5s53xJZJ79LnPUgyKGdvKJcUIZm91OblRD44RmtQcZBlMRoZcc8UR81rV3/v+BsOw6xv8b7C+zDGHB5pTzEy7cc24jZwoF8JBeaJC0KK0tb3kQ==,iv:BPbyZwghZ4t7VTkXkPP80fg/7SFIbBTXLmH23yeWr9Q=,tag:XE8w5BN5coSaOGvN0J0m1A==,type:str]",
|
||||
"sops": {
|
||||
"age": [
|
||||
{
|
||||
@@ -15,9 +15,9 @@
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IFhGYmtrZyBSSEdH\nOGZDWDFhMzB2aVErTDU0Vk1WbnBSa0hmTGNMaXI3aTBuQWMvQkRJCnFpYkRFblZV\nRzF1eGdmTzFQcGhTWFZKdmhyNzRHdEFFSjh2Tnl1NXlpSkUKLS0tIHFLSVJiRkpw\nV2taUVdlS1h1V1Y4aE5JUWVmK1d5UjRleVY1Y0VvcmQrMnMKpD5nffC057mv+1wz\nXL8bOS3vBFoupi7IbKw56e0nGkRuMq+Hf2eCKZDRRlLbIi353xXFki7PKDk7ltu9\n2olKQQ==\n-----END AGE ENCRYPTED FILE-----\n"
|
||||
}
|
||||
],
|
||||
"lastmodified": "2026-01-30T13:42:20Z",
|
||||
"mac": "ENC[AES256_GCM,data:xZmGhEqVh5SIcIfaqOSs1YV23QHXachtBx40C+oyasFvUBhqcniuDHcuFQSmzteywC6jH3r91ilppPjWERz6ml5cfHzBdkbirpbWJg5Hqj+yLz3f98tGkAMmZyc/zc6XkM9BbWQI+R3R9bEaFZ95bnzNeno0EwneEM4aGW1ZsKI=,iv:oz197xm93q7aG3utudgMr3nVdS1IcmTxfnhy7Jc1N9o=,tag:Ar4s0Yjb/xApc0YgpikKtg==,type:str]",
|
||||
"lastmodified": "2026-04-11T11:27:59Z",
|
||||
"mac": "ENC[AES256_GCM,data:aDtrtC+ZD/XCaq9B0aW7btIdrHVthcJ68+MXIIAzejIbGXbqOkk/o7xOyYGsKsCHkiJP+ppjHKKt8ase5CSieCCsosdOUoPForLEaBhu0y7QTRKMBxKhD+xMlsCgR6djKx42Z4gs3/qjox836JJV8x72HllbtTu/WzwaCR9qt50=,iv:qy2JSu/dSZE2xWmxOtzvGBjcu0BjYNVDdOMm+UDV+CI=,tag:4CfF54eYLtQkeA8X5COyxA==,type:str]",
|
||||
"unencrypted_suffix": "_unencrypted",
|
||||
"version": "3.11.0"
|
||||
"version": "3.12.2"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"data": "ENC[AES256_GCM,data:TroErAaIJCpWgVkxmoCgxCekphwh5x9oiFXnENXoiXiAaWnUWSB9y2sNbuGTxq8ngWt9pnZ4ZWWCiLaMvk1b/rjJCZzF3mJh/SuzqUkrayspTPcSTbQVHOHlrH7TKVSBJDQCZmAw0k4E0unSxoujEOorymzTY8ZxJTuSu3ugOez7Z48bDTgv4xMG9CvJku/HKakg/DgrAGaTXgfwal4hSB/9inNd9e1uq4clrkDhsN+zg6uJ+EHre/MUkf2MaIG5EI3y904+jm5Zvm5gTynPCjbVvVyjjXenGOwzS3fkxSVJjDvZItn3QZpKC/OqyrrX+c0zEiQMK880E1Ru4f13QphgWoMkthtdNSRoJqKHuK8UJ5onlfOmLkfQjKQ5cIYWgyI7dq5Rfx2yGbNMNEwAQodN3AC5NaLHdcFbs9Yi2VSAKbv5aEifizHYy3HgjxYcSW0EM53/Sn/CL8G2HK7ei7qeYbTT9bFbpgbPYiUeBuaN2Jfx13Mh5yWs98NhhIltjWtrtvvtBrBf7tPo2nAGVW781MaGF5uS44WVjxMMrFPq6WHRB9pwop5AS475h6ihmUIx4Pg/3JFV1uLXtvEeNuiBOULrwdkt1MXRxz6uiYux3WdWpljq1AIvRCLN3Ehi8VYEWyvEbP3gMp9EeOeJYXZ07hFV5dJCJTF7V1sP8GOCWmj0Ro61CEH13OA8V97M8Vi6ZdQg/o+Q,iv:1/HTU2AHTRSPun59Xa28yjlg312bTdDkiicQzO8515E=,tag:T/wEKWpWbhri1ZttG1JRwg==,type:str]",
|
||||
"data": "ENC[AES256_GCM,data:EJjv/wFOznFk/cAv0CoOgHP0rT1ODGzDTF2X4m3rkoRuLMTnHioc6ne4FL2sbO0pVy796Yvi7CdILYo7yHFzw7Ea+1+Gqh4abbgMBDtgKturDEMotG+prYVq5pvx8POO8KDZ4E6EaZarGGTSLgzQnF3rxN4rSSxE/AbTdln6uITa8Q61UMOY9E8RCsWyO4wY+BwGI1FBPaEOKCqQmdq69h4db/m8pkAWdDczZwKht5GSLIQuEPmpONTPPRI6ny9y2I4lVIPaSoNYWSUKiOMRkSItSjk+Vo47iACFW40mSdeayXmilHQk1uBcUKaPqtbm9eSkZa9OAaTTaSzPiwbfiVmS4KN6oDO/3Vx14DBsaokfW8wl0uyq4hTgfyVUL8ArC5SPlAW4flHxgTt0HzK8+GBA4cGak9qf5vH9wloccV2UkX1e7YUkRj1p+rZl/HnvmVatfGlkgwcniORmSzYNcDmr8OneWVkTpUTwrT31ZLlkHftBpTuhP0NE5AIXGBDy1TIHrOkE9Q4BxDcKuTj2mM8AHKrkejl5nofHNw4NpKGRpvZjdN7A2H4tF7+e9x9VxX7kkPNrQ1MqaQjspOKztN5BL261nKPG/4jnxnyL5gB1xWMn/ifuUB4FM9meUDscN/xQQCnHU4uy5NEE5qO74vIywGmQiXDnAjLSi8nSGNHFhbg5B3vAqxpJH5m/Xa+phgP9aqkdYDP5,iv:4qLwVMpsCynVNJa4FeiIfwsGoBvCg0JgJl8oqoVA3U8=,tag:lIBZCdeR7LX/S0OyJ7KkYw==,type:str]",
|
||||
"sops": {
|
||||
"age": [
|
||||
{
|
||||
@@ -15,9 +15,9 @@
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IFhGYmtrZyBFZ1J2\nNk9yWUNaemVBOFRiVmdmWGdRWVN0UG5Hc1lZRTBiaHdnS0E2UlN3CitPUmdjdVdu\nS1FXbjVCRkxZUk5KdW0xRzNheWJ1TWVYcUJMK3k0TlRFSWsKLS0tIFJSTlN4a29x\nWG8zUlcvYmlZQkQwT3hlWFlOVUIwSkt3SE5RTzhQWVIxUkUKVSMJtNCEZ1KpcUgQ\nkuTFjaBHvizq980kkbNbD4FgeCAPZ3CwXA8/nKhN03iPeFqwX5AsO0n3+ge/qMnO\nkoRc/Q==\n-----END AGE ENCRYPTED FILE-----\n"
|
||||
}
|
||||
],
|
||||
"lastmodified": "2026-01-30T13:42:30Z",
|
||||
"mac": "ENC[AES256_GCM,data:KuB/Zdzy5gKDayUY0YhSNrKMnG1tdzRnxZvsTjj79lYoZzQ/9Tw1mAmn3vBjJx/aZtpXusxN12uxP1vzqFoAOpvbXGTDRv7fhCaq1CSayWSrhddwRlAIaQ6tUAOOu/fcoofTB6KWJNFhhDwn+o5lF48cgp1m7SL+op1NDkXBoK0=,iv:J0jUA9LfBoT1hBgoItqYdM6MmRhamTZCo9/TJKF18ck=,tag:SynvQk7+D83JAikLH4HNSg==,type:str]",
|
||||
"lastmodified": "2026-04-11T11:27:20Z",
|
||||
"mac": "ENC[AES256_GCM,data:ShLwbQvfJVDXyhu6Yf1m93BVQ8s39ATOAugtP3iO0dwqJSd1mR7njh+2emoFIIy3Bn7RkgJVcLuuj4oWWZ6v4nPemSrCwwj1hPSMU1EjqRFGjPaHGj8S7KmKldanHpUCXMuEKoCDT5B2ye9kmANAitn6X8GhoWb7NcCvkW4C7pw=,iv:tMv/P24PNioV9Ot8U1avbifGq1EJHkqIpyUX01Q+1uw=,tag:heOlnL+Abjbg8CGQmEmmsA==,type:str]",
|
||||
"unencrypted_suffix": "_unencrypted",
|
||||
"version": "3.11.0"
|
||||
"version": "3.12.2"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"data": "ENC[AES256_GCM,data:pOo8Rmhpw99QVkUKR/MHo1MoRfKzWgiqXxxX22g2ZzjvinCO9X/N6m63I1XlpiOMVmpEvzFtvQXfaZy7a4D4qLmpa48jsEgGLPm8QXbPFpXNCAVLKU10msKxw/m04dZbB6fJADvG5TM6wMFmsETLl0wMPXPffW2SI4CysSZsmSXUZKGAKjr4sPkUCDW9iiCKTo75r5eLVE3HH8j1OeIknzTDX4zJkoci70pVm7CnKi7bjt515cbq3V9aug7U34I79UlGOB0NWNEU10KodbjnZlY56+K0UBsz5ao+BwRIbxf40a5QUXd0bluqzHENpXlsUja0eSKG1kWFsB+ek5S48GA1SjRkXpStvZoHpUZ7YjeENdqvS1rjteUkrexSB0h3PntJmreERcZoO+MJYVsa5MpF8VkEz6oI9v+ECUA70YEZw7IszsHhq3NnR21aUTok/S23XpbEbxFuKdseQ+8VrBI6z+udIS8o579xcLBXSDhe9vvrdqjMw4enQI03/eKWMjUD8e5r6VbzSaNIQAeh+D9A0CR8EceyFcccY9/XfB2iPzVK1F/PaiAh6oMxWRnyj2wg3GWVoxNHsOKloWfPN68X30V5izvIWlmStRfjvC7yakEde8B6V3PabO8rQlezuasNCvqKIw==,iv:eKRT3L7YXMpJa+QGy7MuB73RsjVIZlaXbc2A2UKrZzw=,tag:7YZ2pqP0xUo9N2ByTEwW/g==,type:str]",
|
||||
"data": "ENC[AES256_GCM,data:SyqN/4fc7lm3Ef3b2jQ/na5g8bkHq8hwJGMBrJwD4LsZpF3NHWhOpgnsd2BmxVrMEtVidyDEkEGH/xkb5eOgCmqzlkocVwwCwNRutFJxnPePtOGIvnBoIiLgMRl4XLhBMyNeGfLSZCpq8F2U2KuAnsSNV7ZaF/uGyrcykXw21w30HigDQsAbrRKpaz4TMtEdBPjsGhif7/r/HXDD+c6KOikcvVbAtsUJzplHUtSzP0KkjN7BeEfrLkLiMJwWOSn2hc8ITtY/uyUkUDR/7+l/GGCMmucHrnJHrTWkjI3okToC/fSOd0oPV5tOkI1GoAdz2eZ6bR1dq7xcQceKepqf7cC2oXowAG3xQcSGWUvyrbdhZ8NtLhpzFVcFlazdG80e59CjkvfUWv5YyAnwbSRjBanAnm/TjaP+UnhXqd03mzcqrrglvwcIFRnshu2GQCWXg0If+q2pbyafdqjAi1yPleJZa+QZ8OQkjfG/HUeLyZe6QPIpzJ4wDyA98piI8VAJsPfBsQiFdsT1dtNeroDesy6fypbHtZgkm8kWlJEdutcUzSm+sFVTeLjyifrehiTrGQJfRzFrDjStd43hkVCRuDjmCd6JVxKk1Eqg5isF9GPrpyAgLwQt01RaRnLB/m70pytW6prUmw==,iv:c5sJKTvsBEvV4x+o6LUjJzDGb2JiM4cHkz+IoDSygc0=,tag:3tdJnCQawrawd5jVrls8Qw==,type:str]",
|
||||
"sops": {
|
||||
"age": [
|
||||
{
|
||||
@@ -15,9 +15,9 @@
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IFhGYmtrZyB5RjZU\nR0RVcTg3L3RQSmZnQnJhNm5vaW5URkNySUNORVJTRzVyWVVHdHdvCkd6Y2tvV1Av\nSjF6NkVNNjdKWnZyNi96bU9sY2VkalJNdWpxQUcyT2R3MFkKLS0tIEpkeFpWUE9t\nY0ROMS84QmM2U3M5aUN3ZkdQZi9JYnZCRzl4eDg4NzlrUW8KcuCDvvHFl/oyjVAo\nDlH1OOwPELWVWqckshUkX1MCMW+Qcv5R52jICVlyBVsyb+eiX4Bxgo4KM352KhWB\n5hPnIg==\n-----END AGE ENCRYPTED FILE-----\n"
|
||||
}
|
||||
],
|
||||
"lastmodified": "2026-01-30T13:42:54Z",
|
||||
"mac": "ENC[AES256_GCM,data:dRhW2TK8VoeAAgxieq13N9DOpDebn23pzSGVOUR1CREv7xBlQNbbG5oZ8wtOMmVPtYYITsbrP+83Bvc3hAgF+TJ5Q+bUIc79YrpKE4JQpIkF54XWuQS+xr6CQViRu9IkNSAINSDBGC/h7TQJbU+VynUbwTTJWdDwFOZRDCWxlXY=,iv:33D22OwdZ/0p5PTy6iPjoiOOHqMA12NTCYSWSUMTQ6U=,tag:Kal99S7ufV+JsTspWaX7OQ==,type:str]",
|
||||
"lastmodified": "2026-04-11T11:27:37Z",
|
||||
"mac": "ENC[AES256_GCM,data:b0n/SPZj06qfPOiHvNPw6bmkpka5oqYUL+Hs2X0tLZUsE5QkXvRFq7VxJDakc76EAMBkwjOyHXAAjKx/memZXBwXhUvCpGUNt4lwNxPect5kl3+HHSVAHrmqIH5hccImXNLayBcr4VlRGiXAZwWiS26td1PHq6EzkR1nNCz9nfE=,iv:YO0TqCST3ZkP/2NaBbkAPkHbFCD2kXPMu6ms0ySzAIE=,tag:0BO+AnbEzCUGP2lNW7/31w==,type:str]",
|
||||
"unencrypted_suffix": "_unencrypted",
|
||||
"version": "3.11.0"
|
||||
"version": "3.12.2"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"data": "ENC[AES256_GCM,data:bNSkFEL7BCq7LJYzK1X0Fn8To+So2+QTSFUN1DZDFlvekywoebj7txSM7jSQKYC3+Henond0MRRsriVOHu61i/k/i7fjOHPi93of4ny5wcS+t3NrFvN3RufNjQqe8CD+y4mDaUge8GGrFBWhtQV+1uw5hbXFOIq8l9JqkfJ8y6bhBi/fznCdO847zvZ0hAesjmrE/tflWn/T7pkNnfrVFOJR0FnXsVavlAVbSxtsrppaZPOgJFNwJ4ch6rP5PxHSyCpsbkak9H2nJOWJdXKGobKG3g01YCjgYMOX9rIfOnFcCBNyZWPGLx9ZT0h4XsHWM++L9lCNHjy4Z40wyl7YMq797HlKEcGEv2RM2KsfO/66836v3JzT6ZAO32otCbSa8e5vaYSKBZVZM/wrzNcE/XTNDRAQij3a3+bZtZDnxhZSQ3FJQVGm4agCbbO8Dqx7buWHGhgMmxnR6ClC3Ilgm9GHAWKXPBCDT3IEgc6S2g5MVKurKcR2Abffl/mN6KQjNocbIXKMu+dvInuW+30Mit5dp/dYBmWIrRqKO/hQtwDFp6jLHo4O+7h7/2YJDlh07W+ejT7vJy1+C0K4eAXSoGTahSgo61Y2F8LKHGBwAxl8N4ri0jKKOH7wB4pkyU+ryjQaeFhB6g==,iv:8f9JchFynDlOnYjrJiK/9ltkykaw5J8rWDwt+QFwzOc=,tag:owaHraC+WUQKn7hMXHcCaQ==,type:str]",
|
||||
"data": "ENC[AES256_GCM,data:xZFoibSkPakh2VMwyrj0+7Epgo3kcJ92TV5/xg8BE3k+cefghPQzXfkIJWsqwgWoDSaHBpb0L6R5TyzAtSrmPEmyM409jiI0I7TtzZDMi+tp4YgF7cC0kW8rU7GwfKwreRm5+B3B093EO0jVfL+Qd7uab8/DZY/Qw3Ys8Q5AFQI4vav8dHP4pLWqINEA9gpzzGWfuVBVX2v8GKr7o/2sYNhw76jDcpOrY0O91hPe85ybzG7Acn9Of5hGgSAz7J4NI0SZecTTDWec7GfdOYPlQnBJTSPRe0fT0aMpP8KfTmWmr1GttgK6HeqL/kPy1MiyfuMNfbse9oJZBIq8puM6UFj+cerG+86UbEFS09zO87p3/uCxmPaPYGEl53Y/LMtLNMy/m96hsQtvwiu7yJXLLco9K1i5sCRvQZ6gZ+YYEimCdJQBYu7E8sh2hNwyeV5O6O0fsVGmP0L1v1S5Ea+QrX+1OXG/hhP8pLgco5IVKo9nQ2SKVmHil6/ONz97KmYKbP247w9qWGCBRj1LQ6DTw5LlUcakHfG+M1BUCW7sl1kqIAvvUwDzQiQhxXTJQcBQoXI3aG41Plrn8RW0zjBdyFhpDuABtg1kmWiliNA3YXyu6sy42ARieYJ8I3L2FKgA91HMiWDK9g==,iv:gg3DqBfY/h6oGJy3BdG2AgwSx781daXRk8NADPUH1P4=,tag:6M49wP/dVh8fWoD+Ij9+5A==,type:str]",
|
||||
"sops": {
|
||||
"age": [
|
||||
{
|
||||
@@ -15,9 +15,9 @@
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IFhGYmtrZyA4RjNs\nWlYvc0tEN2hOUTA5SEV6MUhTeFViRTBqVWJLcGVDZ0JROCtONlQ0CnU0Z2FWQUlw\nakt0dk1nbVFHaVlyMjBqS3hCSDdHZEYwT0pXaXhOclFvSjgKLS0tIG9ZZUQ2dTI5\nWFVJanhac0QxVHM2b04wNE1jcHdHa3JJYzBlTE1iS1ZPTHcKZPvA9MwYT4JfG3/F\nqSI09TWeEv7TAWGeZr6OS++egtpdVoM3hF8s1B1TZb3bf/BMqo49NEkvD56pOKvo\no0jjHw==\n-----END AGE ENCRYPTED FILE-----\n"
|
||||
}
|
||||
],
|
||||
"lastmodified": "2026-01-30T13:42:41Z",
|
||||
"mac": "ENC[AES256_GCM,data:SRxuYiRBCgdYid5GlYDoPbhPWuNPq2A+ItvIuEg8H2RZPpovbdDaj1wO7Jkioy+s5bbf4d8eha3v7hXOmU8cMJ7VdTfQXbJlYMGvGoW14G3d13lT8pyb1goswatF4U9CkSBDVLyyCARloLQQD4jfrts7kvdif/Z8kikStpvsHw0=,iv:h7pf0aAVAEkw1b0W9aYIEYVdq43tByngFI0z1xw3lqE=,tag:/URMCOLxBWxLdXNDr5e0Ig==,type:str]",
|
||||
"lastmodified": "2026-04-11T11:27:08Z",
|
||||
"mac": "ENC[AES256_GCM,data:2wToD3ihDP4FMMcqZk/DPRaZMdscsUKHxcObDKyr+ZV7Dz4/EuLU3gAZEjlqNXqBOjqh7sMf5U3QWSimQ5ZdVE4XAl7GCCbi2UITcTiyot2ZraU264wcQAxhNck2J32zJcAUSOK/3w8s6gCkb/u9HqORMPn/N89eAsO1ZvZ2ikY=,iv:1yw3lTrKRat5J0p1kSjBE64atrUz9XvKzcpZD/ffW2I=,tag:1TWz+U2IhNm9q0IHhUeWQg==,type:str]",
|
||||
"unencrypted_suffix": "_unencrypted",
|
||||
"version": "3.11.0"
|
||||
"version": "3.12.2"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"data": "ENC[AES256_GCM,data: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,iv:9OV/jdLMu4tsJTRj6Zc/6ZBOzrHM5mi8hf/waddDqTs=,tag:Zl+ZuT7QAXrktWby6kuWUQ==,type:str]",
|
||||
"data": "ENC[AES256_GCM,data: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,iv:ave43tGCaJ+YZZ5oep3fMncNGGPI+DySnsIJwSNGgDI=,tag:LMyLH3+gWzlsupvOoMmGeA==,type:str]",
|
||||
"sops": {
|
||||
"age": [
|
||||
{
|
||||
@@ -15,9 +15,9 @@
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IFhGYmtrZyB4Tmcz\ncE5NNVJPMW5od1VRR1lMSXp5TDZKV2FnejRscFIrSG9UcVVJbFZRCnBWeGxoMExj\nYW9vQk9IS2I1enFkbFBGYStHN3FxV1o5dXNWODgyUnhQc28KLS0tIHlwdFp3Y2da\nV2N5T0IweS9zTyt6eVZiMXpLRzJDTGI0THQrK3RLWGZEeFEK6LFnlO0/opMCSn+n\ntBfc2IFgtk3lje0BVcfLxpU/DedhDqF0HpXYu1CKZhyP6NQ++AKoz//BGCDDiQ+Q\n9x5hFw==\n-----END AGE ENCRYPTED FILE-----\n"
|
||||
}
|
||||
],
|
||||
"lastmodified": "2025-11-16T02:29:44Z",
|
||||
"mac": "ENC[AES256_GCM,data:gWqTwS7NrwChAL1MfZ/AIQyMqfvZ08jiu0irb4L8bvs2ya0imWrK5ZoNfEPFgcnByKphNP8+njZWcIQ48uwQirPX+Nepofdba+GuNLR9S9sd5aW2JM4IyLbDivViKujEdWk1+m+IB4w03QiFQQMDBPSaMDfmJQO+8k+PoopFzWI=,iv:mHt6F5qyqZTRdmoHRgkL8WIWG4gsQWv8wBWtjz6fHmM=,tag:hLr8pIhOK2yIIAMZIHkT7Q==,type:str]",
|
||||
"lastmodified": "2026-03-28T07:34:37Z",
|
||||
"mac": "ENC[AES256_GCM,data:1nPYVk49OM0568l2/8/FiR9B2wy3y1HidpGeXulJwxFrT7DBMv34LP1je1ntsSKWvKdP9+JOPCKjXbSQnBq+RaX0RuU3WtNlQ2rMw/Uehf6hWEZCxzsRX1rA7nKKKzxe/QTf9ovUxe61j4flEjDQ2yT4PxHTehVIbhhiyfocDGg=,iv:FuSmFLs/ZhjhI/zfxjVUK6Nc7x8GHQcDRk8B9/7TQR0=,tag:VgTS38vfMcJjjJXRM0j0dA==,type:str]",
|
||||
"unencrypted_suffix": "_unencrypted",
|
||||
"version": "3.11.0"
|
||||
"version": "3.12.2"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
MAUTRIX_SIGNAL_BRIDGE_LOGIN_SHARED_SECRET=ENC[AES256_GCM,data:1ruOcaLzDndGuCed9yhlBJb6kxpkBvSDl8uPZNsIa7EHVN7xLrquo5hCW7pMneTmJbulvVM5wm321WAaeTOj0jx/gkkCnh0duja2,iv:IVtdYE67ArlQN94q/TlY3oFzoYHBQxuPLu8ClDu0798=,tag:zjnFtvBdryZSiL6Y3J4g1A==,type:str]
|
||||
sops_age__list_0__map_enc=-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IDltTWRrUSAyUGVr\neFhRVERqUy9pRkFNRUVvQ3NMNFlnZEtQVnNhaWZJbzJUUWN4cG1ZCkduU2NJYnIz\nWm9vWHpGS2hPL1ZNdlhHRWJDaGJYOVFucXA3QktLV1VOdDAKLS0tIDROd2dtMm4v\nN1ZETmxkemk5RFNsU3AzTEphYlVKMTVzajFQNytRRGNBUmMKEwwN7MnPNP0ze0XJ\nm7QTQJhnd9QihXpGVYWKneL2Ef2YU1FZGUPOez9syDRepY/tl8jSFo77+aCLJ2/H\nPzM/4Q==\n-----END AGE ENCRYPTED FILE-----\n
|
||||
sops_age__list_0__map_recipient=ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOEFLUkyeaK8ZPPZdVNEmtx8zvoxi7xqS2Z6oxRBuUPO
|
||||
sops_age__list_1__map_enc=-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IHJNY1d1ZyA0S0VJ\nTlVpOStxVU1rZ0E2MVVNWmI0d0VxMStSeFJ3dnpONTR3N044dWg0CnZBOFpDbkw3\nWjJ6ZHRQaDNaV2JDNHRYWkdSOVFBSDF5M0kvOExaSnBCeGcKLS0tIGJOSCtHRlNt\ncmpYTmN4dklYWEp1WjR0Uk16VkJjRFNqb2hQNEZHSkdSa1EKpO1hMZr1NTzrEbCr\nycIvP4J3U9X1iTAL2/R98lOhUVPWlu7QN1GWvQIyB3TInTIpKNVV1Q8nkrq8GSFG\n6QHTCA==\n-----END AGE ENCRYPTED FILE-----\n
|
||||
sops_age__list_1__map_recipient=ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB28jpN+h5euh3NtdN+A+EtqgIatC22e4i1TPTioKire
|
||||
sops_age__list_2__map_enc=-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IFhGYmtrZyBWbk1h\ndVhCL2kyczUvR09YY3lvYXlmeExjdHYvd1dNQktHcUFVeWdYeFQ4CmJQSTVjY1Bq\nLzh1ZnpEWVJvaUZCeU0rMk5UWXBmMmNDMi9xTERlSlIyd1kKLS0tIHJaYlpaQmtE\nd21nQThCTXBVU0RJRnV0OHFTcWZYeSt4eWlmQVVyUWNSdGsKaPXqoSWS87MOHETx\nl7dbIo4maAV+eXbAbEYF2dZzw+Fea5vTrfsg1QQ4YVNGib7o8nvG2vouMyqq6vI3\n37HGfg==\n-----END AGE ENCRYPTED FILE-----\n
|
||||
sops_age__list_2__map_recipient=ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMb5G/ieEYBOng66YeyttBQLThyM6W//z2POsNyq4Rw/
|
||||
sops_lastmodified=2026-04-15T09:41:45Z
|
||||
sops_mac=ENC[AES256_GCM,data:yh+dEf2fPHMBLppZ7/oMk7iBZnKJ3Jsiq7H6Kla5/r3/ERHZl1d1TPWwIOAwcc4yOiVKCAgXxN+mY/w9Nn0AbfpXUDYgQPoWMZPuAC97eXsCutzOM6GXdmxuIL3Glah4dAYP6Bj34nuKpp4+G6m08Eni65wQJUYRyY6JQHnc5Kc=,iv:Xmnm2VjIVxtIH5TSnWnHQUq22DbubdrZshWZzX+NeF0=,tag:LD8HBRa/vWERhrA3DzMzIg==,type:str]
|
||||
sops_unencrypted_suffix=_unencrypted
|
||||
sops_version=3.12.2
|
||||
@@ -1,13 +1,14 @@
|
||||
MAUTRIX_TELEGRAM_APPSERVICE_AS_TOKEN=ENC[AES256_GCM,data:B+gL1Ai045XiEcBkFcaEwByEdHgCrbc00Efd/WEb/s1l3rhIqdEmdyhnpqYJQojDQ8cQfYb1gMOW38sZ0GL4zA==,iv:F3Y92S3rM1qUrRN0cR5SFep+ExeP90l/oiWmrDk4yfc=,tag:CZrujwoVdGFiDKMxgM1tCg==,type:str]
|
||||
MAUTRIX_TELEGRAM_APPSERVICE_HS_TOKEN=ENC[AES256_GCM,data:LDNVwG4cOqgb7stZFCAbzBpqTvt+kcuItaVGrM6Zd1wpxTZJ+sHQTf7acCh1obxdw1S13j8Kw2FsmBk4ojkWtQ==,iv:WJrt9G6BhZTuCxxC9A2AlRvon/MlCa9Y5dGNZ2DO7Mw=,tag:H0SLY4E/G1eJ0Tua+/zxww==,type:str]
|
||||
MAUTRIX_TELEGRAM_BRIDGE_LOGIN_SHARED_SECRET_MAP=ENC[AES256_GCM,data:UcpnOqYwa3fFvU6/A+qUMfB784FuX/wBoilS3lZs3HHLazr9a12m9xivVs+9Kd7l+5xi5VqtQf9ZyF6EjGIeAFc4BFpADx2uvL7HP5kZ2WLGky/un1w=,iv:9ZtTU/iPhOX30uSbx7h3IMUcnCh127lE18Z3gkiydzo=,tag:DzHPBeKl9C28shR6c6t6mA==,type:str]
|
||||
MAUTRIX_TELEGRAM_TELEGRAM_BOT_TOKEN=ENC[AES256_GCM,data:Gurr78m30j5bhutgJxGCZL4EC5Il0dOCiKnqTG+JskULiwn+82ejo4W+iygvkA==,iv:0DmEq8HmS3S1pKHb47gsZ6/m2Gr2jP6dlw3ytDPfRhE=,tag:8QmMUgv6KigJT4jA4caLFQ==,type:str]
|
||||
sops_age__list_0__map_enc=-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IDltTWRrUSAyUGVr\neFhRVERqUy9pRkFNRUVvQ3NMNFlnZEtQVnNhaWZJbzJUUWN4cG1ZCkduU2NJYnIz\nWm9vWHpGS2hPL1ZNdlhHRWJDaGJYOVFucXA3QktLV1VOdDAKLS0tIDROd2dtMm4v\nN1ZETmxkemk5RFNsU3AzTEphYlVKMTVzajFQNytRRGNBUmMKEwwN7MnPNP0ze0XJ\nm7QTQJhnd9QihXpGVYWKneL2Ef2YU1FZGUPOez9syDRepY/tl8jSFo77+aCLJ2/H\nPzM/4Q==\n-----END AGE ENCRYPTED FILE-----\n
|
||||
sops_age__list_0__map_recipient=ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOEFLUkyeaK8ZPPZdVNEmtx8zvoxi7xqS2Z6oxRBuUPO
|
||||
sops_age__list_1__map_enc=-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IHJNY1d1ZyA0S0VJ\nTlVpOStxVU1rZ0E2MVVNWmI0d0VxMStSeFJ3dnpONTR3N044dWg0CnZBOFpDbkw3\nWjJ6ZHRQaDNaV2JDNHRYWkdSOVFBSDF5M0kvOExaSnBCeGcKLS0tIGJOSCtHRlNt\ncmpYTmN4dklYWEp1WjR0Uk16VkJjRFNqb2hQNEZHSkdSa1EKpO1hMZr1NTzrEbCr\nycIvP4J3U9X1iTAL2/R98lOhUVPWlu7QN1GWvQIyB3TInTIpKNVV1Q8nkrq8GSFG\n6QHTCA==\n-----END AGE ENCRYPTED FILE-----\n
|
||||
sops_age__list_1__map_recipient=ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB28jpN+h5euh3NtdN+A+EtqgIatC22e4i1TPTioKire
|
||||
sops_age__list_2__map_enc=-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IFhGYmtrZyBWbk1h\ndVhCL2kyczUvR09YY3lvYXlmeExjdHYvd1dNQktHcUFVeWdYeFQ4CmJQSTVjY1Bq\nLzh1ZnpEWVJvaUZCeU0rMk5UWXBmMmNDMi9xTERlSlIyd1kKLS0tIHJaYlpaQmtE\nd21nQThCTXBVU0RJRnV0OHFTcWZYeSt4eWlmQVVyUWNSdGsKaPXqoSWS87MOHETx\nl7dbIo4maAV+eXbAbEYF2dZzw+Fea5vTrfsg1QQ4YVNGib7o8nvG2vouMyqq6vI3\n37HGfg==\n-----END AGE ENCRYPTED FILE-----\n
|
||||
sops_age__list_2__map_recipient=ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMb5G/ieEYBOng66YeyttBQLThyM6W//z2POsNyq4Rw/
|
||||
sops_lastmodified=2025-08-22T02:52:07Z
|
||||
sops_mac=ENC[AES256_GCM,data:ahjIUwIKPUfqTSl704AekBIVTTe8n0YUbMyVKxFSZb5ZoaQ3KRVgWPWCAn9n/Qwpa1oHWvVcqqbTd+wrxqmkpOgFCfg72ZWdPsSbzg6RGcUVHlg5r2b9DE7Pq+qDtgNBVkmdmlCAY2+mQTepXv8fGbWltu6tzdqOvsOBwfSw694=,iv:OJ2M6X23k5LokCrx4Ekz2a5+hUGV66YNjlFBQZdrkSA=,tag:2xjX3CX45kkpYt+skEgKOw==,type:str]
|
||||
sops_lastmodified=2026-04-13T07:43:39Z
|
||||
sops_mac=ENC[AES256_GCM,data:xZVKnXOP27j7fiFaiTQbKDCYKg2ywPfzqY0TSJK6C28MAANXYqTBSvDKBmrw64bNQrf1hcUNV3nqqVGMjCPDg2NkY4bWYPYpGKMKZEQ0WmMeR5Dudlryi2+ga9f9fG9vs0u8YJGJvMnob2EvfpPKI5tPBiCLc8AC5vCVlxrRvTM=,iv:PqI752mqSn7oZV4vwS/t/whRTUG1GTnYwmLP2GOqHdg=,tag:C4cso3fEjmX9jqEFDWrDIQ==,type:str]
|
||||
sops_unencrypted_suffix=_unencrypted
|
||||
sops_version=3.10.2
|
||||
sops_version=3.12.2
|
||||
|
||||
+18
-9
@@ -9,6 +9,14 @@ external-controller-cors:
|
||||
allow-origins:
|
||||
- ENC[AES256_GCM,data:Ow==,iv:C2R4gooPGj4lranMXP6Uu+nCbGhVk1S37dBKbYgdsRU=,tag:onXhjT4c/qMoayForPKwEQ==,type:str]
|
||||
allow-private-network: ENC[AES256_GCM,data:mxDrog==,iv:L4hT2zLieK7nQnp5GvdHTsnSkeTz61v77nr281lAcag=,tag:jCQgs+0aDrl7BSZYxI7qUw==,type:bool]
|
||||
dns:
|
||||
enable: ENC[AES256_GCM,data:Rp3LZg==,iv:NHk64bGDFmimNmXDk9n9ZqLFVbO8cyWVqivRSDxUowk=,tag:Y5IhMI7n2JtcXfFnEY77PQ==,type:bool]
|
||||
default-nameserver:
|
||||
- ENC[AES256_GCM,data:eEwdzhx+ysGj,iv:FZ6vsFPP5dnfcImydU46J8vA9GYbejP3zEXHA6D+6J0=,tag:lmG+OzJwFtBKHraF4PsCjQ==,type:str]
|
||||
proxy-server-nameserver:
|
||||
- ENC[AES256_GCM,data:n3PMmscYUm2eXFe3/uNsKPF0rwyQBtGTsA==,iv:FMOP4qohNNqfLIo7U6mk5qxBm0eXVFCbI0KD7kfw1/Y=,tag:N6H/gESlK1Cr5J2T3Mxldg==,type:str]
|
||||
- ENC[AES256_GCM,data:G5eodgYoIwtWDMnuEg2srdwCJqQi+OAsyPtp4OvT,iv:5maumIhsmc/QE1ey4rufm6Y8G4OqG3qyY0Ybv/24LoI=,tag:heYvV2IVsIMRBEwQwlJlWg==,type:str]
|
||||
- ENC[AES256_GCM,data:3CbO5pelMlvJxgoawFkEmARs8Xwgw87eKg==,iv:A21aiwBT98NT0VQ2vaepx/F8AG8rWawNWdch+yVDYCM=,tag:OkTMbH5QnXbxf8NQyer8pA==,type:str]
|
||||
proxies:
|
||||
- type: ENC[AES256_GCM,data:82CKWRU=,iv:MmoXN4hqcC2BE93Tfex3swEj50XK6jmjLIWAyRs8WRI=,tag:faiVNIHjq0fRMLiiJoWamg==,type:str]
|
||||
name: ENC[AES256_GCM,data:mLelhl+5dSLY5TIjoTw=,iv:cJtCH/fMib1KapWVQGsRgy5yRCUC5EZq4RdahEb7NyQ=,tag:ree+OgPt6ixLigZVo06dwQ==,type:str]
|
||||
@@ -32,6 +40,7 @@ proxy-providers:
|
||||
url: ENC[AES256_GCM,data:aTVsXCfaCkdZes1CW8SJVQFiTZ/KbYky6ei0FKSmeCF8/TbaLIKKR46FX2yQ8682fdcLGcAB8ekblQ==,iv:7OQ69sjVWNyOrPVlA8DWTAbw/LIVzFFm5dK4FBcwvyk=,tag:gLVzTM5PypNLpaIOiPYc/Q==,type:str]
|
||||
proxy: ENC[AES256_GCM,data:BIEXrZQ=,iv:ZzEEJmLgbOhBTcZEgPfsL0AC72GpydlFTKhJ4+fgTec=,tag:v8URxwAU5wSHD5GPr/sTfw==,type:str]
|
||||
exclude-filter: ENC[AES256_GCM,data:Uc9L0zm7TWGAgIQq6thwK4evIuYoEJyRJ2M=,iv:CbJp7BcobOfkxyY7/fvaECif57yhPZ1/IuPjLwYUwUQ=,tag:xtGissYFtBX3OVinstWRug==,type:str]
|
||||
interval: ENC[AES256_GCM,data:fNfSoA==,iv:wYzKqRsdez6gUGQJOgRnqjOzKtNidMKHYNBBrYtPWfk=,tag:woWqs7uC2nSEkvnROTVFRA==,type:int]
|
||||
proxy-groups:
|
||||
- name: ENC[AES256_GCM,data:O6LAzFQ=,iv:a+dfdy14adLlYbJQ5wAQLsD5hxuEXKW8Y/erhBVAREE=,tag:79++dpg2E2Mtc8y63nRcHw==,type:str]
|
||||
type: ENC[AES256_GCM,data:JR3d3D1p,iv:n0u8vayA0PVDM7yvh2pk36S8EeqMnZRN8TZlwNnEC3U=,tag:ZmxXOralviL2xyd8+hN3ZA==,type:str]
|
||||
@@ -43,8 +52,7 @@ rules:
|
||||
- ENC[AES256_GCM,data:S6yGMmG4UUUWE04=,iv:FWz0kNu0hhQ+PyIMSxl6NPX/INluS7jAO9loX+E+jlE=,tag:tXK35hMiYDU8X0yl+0PRuQ==,type:str]
|
||||
sops:
|
||||
age:
|
||||
- recipient: ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOEFLUkyeaK8ZPPZdVNEmtx8zvoxi7xqS2Z6oxRBuUPO
|
||||
enc: |
|
||||
- enc: |
|
||||
-----BEGIN AGE ENCRYPTED FILE-----
|
||||
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IDltTWRrUSA2Zkxs
|
||||
SGh4Ulp1UklKeDU4M2xtcWZPRGxNUGt4eGVQQ29LcjB2YXJGRVVnClZLSmRra0Qx
|
||||
@@ -53,8 +61,8 @@ sops:
|
||||
sF/MYEjihktzyngzTLyuwHYYb1xqTbpmjFNzJfbW7+LJJSPQ9cu6W7DcZGIsSe0e
|
||||
VNycmg==
|
||||
-----END AGE ENCRYPTED FILE-----
|
||||
- recipient: ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB28jpN+h5euh3NtdN+A+EtqgIatC22e4i1TPTioKire
|
||||
enc: |
|
||||
recipient: ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOEFLUkyeaK8ZPPZdVNEmtx8zvoxi7xqS2Z6oxRBuUPO
|
||||
- enc: |
|
||||
-----BEGIN AGE ENCRYPTED FILE-----
|
||||
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IHJNY1d1ZyBXVDk0
|
||||
bjZhMnRabGVLSHorWmRhd0NjTVF2VTZQVzZSeEkzK3c5WDBoM0FVCjB3cTB6NTYy
|
||||
@@ -63,8 +71,8 @@ sops:
|
||||
dQxXWnexmkLryDtddH1sdCdQh8e9D1IJFjuOD8JzsyWToWFuo01Cw27VLWGAGnFD
|
||||
GZpp+A==
|
||||
-----END AGE ENCRYPTED FILE-----
|
||||
- recipient: ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMb5G/ieEYBOng66YeyttBQLThyM6W//z2POsNyq4Rw/
|
||||
enc: |
|
||||
recipient: ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB28jpN+h5euh3NtdN+A+EtqgIatC22e4i1TPTioKire
|
||||
- enc: |
|
||||
-----BEGIN AGE ENCRYPTED FILE-----
|
||||
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IFhGYmtrZyBzVFdr
|
||||
TTNiK1VIRUk4N2l6TDcyMmw5U3ZRMzR2QlMrcy9XL1RLOCtzNUdnCnkvRmdmZ2gz
|
||||
@@ -73,7 +81,8 @@ sops:
|
||||
FY9SvbPWXVTcJiLwjpcD8tSMdqcTHTJXcLAWSCjyFF91ihBUanQ7TcdXvZTGfdY0
|
||||
pOoJmg==
|
||||
-----END AGE ENCRYPTED FILE-----
|
||||
lastmodified: "2026-02-11T03:50:06Z"
|
||||
mac: ENC[AES256_GCM,data:SqQbTjyvC7ev2egnq9swpQcLjVW1yZ0Yiv6DzNTupUVkl8yP4L6pGJ9P0EiuX/JFPFhAv+x61uudGNUUEu2pPdgHO80glBriATM54o7KILVkrm5TYQVZbD9YsAQsmPw3etVeaMk1a6dgIExW8+DG+KLq/qI/fJk1K0mWv9RR940=,iv:fwqW6E9vVFcLVm4mdI/zZlNeq55yz2AyKKvvx9D1nFA=,tag:qoyhpooNb/taN64s926nRw==,type:str]
|
||||
recipient: ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMb5G/ieEYBOng66YeyttBQLThyM6W//z2POsNyq4Rw/
|
||||
lastmodified: "2026-06-13T04:02:11Z"
|
||||
mac: ENC[AES256_GCM,data:VWXa9HdGyPBkLQH5lgqioYbd3VxvL7PjuwiHrX353W+G4Lu/VaMHAz9AFN495cLyCm1dB4VwC773JmLNYKbCzHswQr4tpkp7AlIhvCbt+S0L5ZXLxOlVMd0vONGxQOQHhxQnRONXg9K2i7rTfTjGBdY1o/alswfsNrhaL7g/+OY=,iv:Z3MNOcTU9AQ8yEQgYxXKmv+09cXbF1RalrNXqJYTGUs=,tag:K1kps0EPAKYbQradY02yOQ==,type:str]
|
||||
unencrypted_suffix: _unencrypted
|
||||
version: 3.11.0
|
||||
version: 3.13.1
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
MINIO_ROOT_USER=ENC[AES256_GCM,data:sBnNpnA=,iv:Z2K8Cg/4DW+MxcKIFVMRWlFj2/qqFLCDnzJF6Uq8eLE=,tag:Y+A/FZm/3k35+bNgl89xPQ==,type:str]
|
||||
MINIO_ROOT_PASSWORD=ENC[AES256_GCM,data:sgYwUxp2Ao6nlUJ8RE7V9Bz1ZG4=,iv:LJJg62vCiguOp8aHCSYOTMtW3vjvXy+RnwghKJmaTR4=,tag:TnyxLzshfe53e2vav1QblQ==,type:str]
|
||||
sops_age__list_0__map_enc=-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IDltTWRrUSA3SWtI\nTHVINjFPbkRMa0ZhNkxYRjBHQm5xcERGUjRJT0NsRk1kSWViNEhjClk0UlhvL2N4\nTERoQXBMSENUTEF2U2ZBRzI0QnM2dnFuVlVaVWJZRVNGL0UKLS0tIGkwVW1xc2lF\nUHFCekRuMDEwNW1jWmFLT3BUeS8rQ2FLSnBoamRjc045UzQKfaFKjKVUX15FN6MO\nti9ZpA7+uJpt04cblGutAEdttXdLRbiJe67nJCOkCC8U7czP1X1G2Yi1IeVxqrx+\ngdBDaQ==\n-----END AGE ENCRYPTED FILE-----\n
|
||||
sops_age__list_0__map_recipient=ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOEFLUkyeaK8ZPPZdVNEmtx8zvoxi7xqS2Z6oxRBuUPO
|
||||
sops_age__list_1__map_enc=-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IHJNY1d1ZyB5RGM1\nWndtcTVNaHdqakw1NThLTFZFRjdkaERiNXVIVkdxRDdiWTZZcFVjCkd5QWFBUFVt\nOWJucThyWVlhZjNvZnVHTTYzYlRjMFRiMFBrTXp3ZjJXSkUKLS0tIE41RUFOZ0Vx\nMWpkcWc0Rk11bTlaKzlmdVBteTRaVHlkTkpiS2d1YzF6Z28KT/QaHJyhhd9g77vo\n7XwkaHN8CJq8IxwMId7rJuAKi56zTXOoDfBlIYwssVN4FRdCSF4HzIR8ztBJ/MgH\nJIafKA==\n-----END AGE ENCRYPTED FILE-----\n
|
||||
sops_age__list_1__map_recipient=ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB28jpN+h5euh3NtdN+A+EtqgIatC22e4i1TPTioKire
|
||||
sops_age__list_2__map_enc=-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IFhGYmtrZyBic292\naStPcmRoeko3ei81THdDay9iUUUycVpxbmUwNmJhNW55SG0rbkVrCngxS0YrSzNF\nMlhpcHU1OGJBOThiZHdYZWZ4YjhicGViL1pzZElUdnhWNXMKLS0tIHlVRnhsUEhy\nV3JoRjM0SGl2dGdaWkIxNGJLS29CVXhTcGd3bm45NDBpRlUKmp9EuXD/iU7yxkFs\nLDk/NN1VvLKSU3RqtuAxbXPIzizNCxaBs/1MQtLIxRkEQvOno+MNyN7JHLFmb+lQ\nmwqPBA==\n-----END AGE ENCRYPTED FILE-----\n
|
||||
sops_age__list_2__map_recipient=ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMb5G/ieEYBOng66YeyttBQLThyM6W//z2POsNyq4Rw/
|
||||
sops_lastmodified=2025-03-09T02:24:31Z
|
||||
sops_mac=ENC[AES256_GCM,data:ium37/C2+zybZDnSlhr6RmB3RiGmjVx4BbHXsfdZ6T+5/DFtkvduhuu0QxLReVBIZ/yYJgttTJq4wIqbUWMvsy2OafCB2piqISe0FAk2KfcM8kqfKFbLFghjkn6Nu1l331MKt/PMLy47ilS5i0Sh3QyD28/pe/tw4vpF3Vz8VjQ=,iv:vLoax3u4RCsisoSUIxy0EA+d2P/WfcPxfXM27QqmVpU=,tag:oCiXH1E9a9NBNbUikNvuBg==,type:str]
|
||||
sops_unencrypted_suffix=_unencrypted
|
||||
sops_version=3.9.4
|
||||
@@ -1,3 +1,5 @@
|
||||
#:schema https://raw.githubusercontent.com/crate-ci/typos/refs/heads/master/config.schema.json
|
||||
|
||||
[files]
|
||||
extend-exclude = [
|
||||
"secrets"
|
||||
|
||||
Reference in New Issue
Block a user