nix machine / user configurations

Compare changes

Choose any two refs to compare.

+4 -4
_sources/generated.json
···
},
"blog": {
"cargoLocks": null,
-
"date": "2025-12-01",
+
"date": "2025-12-07",
"extract": null,
"name": "blog",
"passthru": null,
···
"fetchSubmodules": false,
"leaveDotGit": false,
"name": null,
-
"rev": "b42a0251ec0648d7f9dc0b3033811a5fa4168d39",
-
"sha256": "sha256-uPNpQxAYAwXHrWCo2VncbjT6OJbAX80jFdcslu8q7dQ=",
+
"rev": "ab573fb4fa69204bf3f891abb49205e6bf5b4c8f",
+
"sha256": "sha256-Ee2NczojZbFfimKF51W6T0wCv3sNmdliPAKFetOJZ4I=",
"sparseCheckout": [],
"type": "git",
"url": "https://tangled.org/@ptr.pet/endpoint"
},
-
"version": "b42a0251ec0648d7f9dc0b3033811a5fa4168d39"
+
"version": "ab573fb4fa69204bf3f891abb49205e6bf5b4c8f"
},
"clickee-proxy": {
"cargoLocks": null,
+4 -4
_sources/generated.nix
···
};
blog = {
pname = "blog";
-
version = "b42a0251ec0648d7f9dc0b3033811a5fa4168d39";
+
version = "ab573fb4fa69204bf3f891abb49205e6bf5b4c8f";
src = fetchgit {
url = "https://tangled.org/@ptr.pet/endpoint";
-
rev = "b42a0251ec0648d7f9dc0b3033811a5fa4168d39";
+
rev = "ab573fb4fa69204bf3f891abb49205e6bf5b4c8f";
fetchSubmodules = false;
deepClone = false;
leaveDotGit = false;
sparseCheckout = [ ];
-
sha256 = "sha256-uPNpQxAYAwXHrWCo2VncbjT6OJbAX80jFdcslu8q7dQ=";
+
sha256 = "sha256-Ee2NczojZbFfimKF51W6T0wCv3sNmdliPAKFetOJZ4I=";
};
-
date = "2025-12-01";
+
date = "2025-12-07";
};
clickee-proxy = {
pname = "clickee-proxy";
+71 -39
dns/dnsconfig.js
···
var DSP_CLOUDFLARE = NewDnsProvider("cloudflare");
+
var DSP_BUNNY = NewDnsProvider("bunny_dns");
var REG_NONE = NewRegistrar("none");
-
var WOLUMONDE_IP = "23.88.101.188";
-
var DZWONEK_IP = "94.237.26.47";
-
var TRIMOUNTS_IP = "159.195.58.28";
+
var DZWONEK_IP4 = "94.237.26.47";
+
var DZWONEK_IP6 = "2a04:3542:1000:910:6898:1dff:fea1:4b4b";
+
var DZWONEK_IPS = [DZWONEK_IP4, DZWONEK_IP6];
+
var TRIMOUNTS_IP4 = "159.195.58.28";
+
var TRIMOUNTS_IP6 = "2a0a:4cc0:c1:e83d::b00b";
+
var TRIMOUNTS_IPS = [TRIMOUNTS_IP4, TRIMOUNTS_IP6];
+
+
function host(name, ips, opts) {
+
if (opts)
+
return [
+
A(name, ips[0], opts),
+
AAAA(name, ips[1], opts),
+
];
+
else
+
return [
+
A(name, ips[0]),
+
AAAA(name, ips[1]),
+
];
+
}
+
+
function hosts(_names, ips, opts) {
+
var names = [];
+
if (typeof _names === "string")
+
names.push(_names);
+
else
+
names = _names;
+
+
var records = [];
+
_.each(names, function (name) {
+
_.each(host(name, ips, opts), function (r) {
+
records.push(r);
+
});
+
});
+
return records;
+
}
+
+
function TRIMOUNTS(names, opts) {
+
return hosts(names, TRIMOUNTS_IPS, opts);
+
}
+
function DZWONEK(names, opts) {
+
return hosts(names, DZWONEK_IPS, opts);
+
}
+
+
function IGNORE_ACME() {
+
return IGNORE_NAME("_acme-challenge");
+
}
D(
"gaze.systems",
REG_NONE,
-
DnsProvider(DSP_CLOUDFLARE),
+
DnsProvider(DSP_BUNNY),
DefaultTTL(1),
-
A("@", TRIMOUNTS_IP, CF_PROXY_OFF, TTL(60)),
-
A("doc", TRIMOUNTS_IP, CF_PROXY_OFF),
-
A("pmart", TRIMOUNTS_IP, CF_PROXY_OFF),
-
// A("webhook", WOLUMONDE_IP, CF_PROXY_OFF),
-
A("dash", TRIMOUNTS_IP, CF_PROXY_OFF), // perses
-
A("knot", TRIMOUNTS_IP, CF_PROXY_OFF, TTL(60)),
-
A("spindle", TRIMOUNTS_IP, CF_PROXY_OFF, TTL(60)),
-
A("id", TRIMOUNTS_IP, CF_PROXY_OFF),
-
// atp
-
A("guestbook", TRIMOUNTS_IP, CF_PROXY_OFF),
-
// dzwonek
-
A("vpn", DZWONEK_IP, CF_PROXY_OFF),
-
// A("meow", WOLUMONDE_IP, CF_PROXY_OFF),
-
// thing
-
// TXT("id", "a data endpoint for entity with serial id /90008/."),
-
// TXT("id", "entity linked here uses it/they pronouns. it can be referred to as /dusk/ or /dawn/."),
-
// TXT("id", "this one is not a human, try to refer to it in third person. use /this one/, /this thing/, etc."),
-
// TXT("id", "try connecting to https://gaze.systems/about for more information."),
+
TRIMOUNTS(
+
[
+
"@", "doc", "pmart", "dash", "id",
+
"knot", "spindle",
+
"guestbook",
+
],
+
CF_PROXY_OFF,
+
),
+
DZWONEK("vpn", CF_PROXY_OFF),
// github pages
CNAME("dev", "90-008.github.io."),
// fastmail
···
MX("@", 10, "in1-smtp.messagingengine.com."),
MX("@", 20, "in2-smtp.messagingengine.com."),
TXT("@", "v=spf1 include:spf.messagingengine.com ?all"),
-
TXT("_dmarc", "v=DMARC1; p=none;"),
+
TXT("_dmarc", "v=DMARC1; p=reject;"),
// resend
MX("send.poke", 10, "feedback-smtp.us-east-1.amazonses.com."),
TXT(
···
// atproto
TXT("_atproto.eris", "did=did:plc:bxjnsrfzozl365rsdo5yvuz5", TTL(60)),
TXT("_atproto.drew", "did=did:plc:vo6ie3kd6xvpjlof4pnb2zzp", TTL(60)),
+
IGNORE_ACME(),
);
D(
···
REG_NONE,
DnsProvider(DSP_CLOUDFLARE),
DefaultTTL(1),
-
A("@", TRIMOUNTS_IP, CF_PROXY_ON),
+
TRIMOUNTS("@", CF_PROXY_ON),
TXT("@", "a data endpoint for entity with serial id /90008/."),
TXT(
"@",
-
"entity linked here uses it/they pronouns. it can be referred to as /dusk/ or /dawn/.",
+
"entity linked here uses it/that pronouns. it can also be referred to as /dawn/.",
),
TXT(
"@",
···
"@",
"try connecting to https://gaze.systems/about for more information.",
),
-
// atproto
-
// TXT("_atproto", "did=did:plc:dfl62fgb7wtjj3fcbb72naae"),
-
IGNORE_NAME("_acme-challenge"),
+
IGNORE_ACME(),
);
D(
"poor.dog",
REG_NONE,
-
DnsProvider(DSP_CLOUDFLARE),
+
DnsProvider(DSP_BUNNY),
DefaultTTL(1),
-
A("@", TRIMOUNTS_IP, CF_PROXY_OFF),
+
TRIMOUNTS("@", CF_PROXY_OFF),
TXT("@", "v=spf1 -all"),
TXT("_dmarc", "v=DMARC1; p=reject;"),
TXT("_atproto", "did=did:plc:dfl62fgb7wtjj3fcbb72naae", TTL(60)),
-
IGNORE_NAME("_acme-challenge"),
+
IGNORE_ACME(),
);
var EMAIL_TTL = 86400;
···
D(
"ptr.pet",
REG_NONE,
-
DnsProvider(DSP_CLOUDFLARE),
+
DnsProvider(DSP_BUNNY),
DefaultTTL(1),
-
A("@", TRIMOUNTS_IP, CF_PROXY_OFF),
-
A("nucleus", DZWONEK_IP, CF_PROXY_OFF),
-
A("trill", DZWONEK_IP, CF_PROXY_OFF),
+
TRIMOUNTS("@", CF_PROXY_OFF),
+
DZWONEK(["nucleus", "trill"], CF_PROXY_OFF),
// atproto
TXT("_atproto", "did=did:plc:dfl62fgb7wtjj3fcbb72naae"),
TXT("_atproto.nil", "did=did:plc:dumbmutt4po52ept2tczimje"),
···
),
// mta-sts
-
A("mta-sts", TRIMOUNTS_IP, CF_PROXY_OFF),
+
TRIMOUNTS("mta-sts", CF_PROXY_OFF),
TXT("_mta-sts", "v=STSv1; id=20250930T1945", TTL(EMAIL_TTL)),
// autoconfig
-
A("autoconfig", TRIMOUNTS_IP, CF_PROXY_OFF),
-
A("autodiscover", TRIMOUNTS_IP, CF_PROXY_OFF),
+
TRIMOUNTS(["autoconfig", "autodiscover"], CF_PROXY_OFF),
// autodiscovery
SRV(
···
SRV("_imaps._tcp", 0, 1, 993, "imap.migadu.com.", TTL(EMAIL_TTL)),
SRV("_pop3s._tcp", 0, 1, 995, "pop.migadu.com.", TTL(EMAIL_TTL)),
-
IGNORE_NAME("_acme-challenge"),
+
IGNORE_ACME(),
);
-2
hosts/trimounts/default.nix
···
pkgs.gitMinimal
];
-
networking.firewall.enable = true;
-
system.stateVersion = "25.11";
}
+1 -1
hosts/trimounts/modules/arpa.nix
···
connection to https://gaze.systems/about for more data.
/discord 90.008/
-
/bsky @poor.dog/
+
/bsky @ptr.pet/
/email 90008@gaze.systems/
/dig +short TXT 9.0.0.0.8.e.f.1.5.0.7.4.0.1.0.0.2.ip6.arpa/
+15
hosts/trimounts/modules/networking.nix
···
+
{
+
networking.enableIPv6 = true;
+
networking.interfaces.ens3 = {
+
ipv6.addresses = [{
+
address = "2a0a:4cc0:c1:e83d::b00b";
+
prefixLength = 64;
+
}];
+
};
+
networking.defaultGateway6 = {
+
address = "fe80::1";
+
interface = "ens3";
+
};
+
+
networking.firewall.enable = true;
+
}
+3 -3
hosts/trimounts/modules/nginx.nix
···
users.users.nginx.extraGroups = [ "acme" ];
-
age.secrets.cfDnsEditToken.file = ../../../secrets/cloudflareDnsEdit.age;
+
age.secrets.bunnyApiKey.file = ../../../secrets/bunnyApiKey.age;
security.acme = {
acceptTerms = true;
defaults = {
group = "nginx";
email = (import "${inputs.self}/personal.nix").emails.primary;
-
dnsProvider = "cloudflare";
+
dnsProvider = "bunny";
credentialFiles = {
-
CF_DNS_API_TOKEN_FILE = config.age.secrets.cfDnsEditToken.path;
+
BUNNY_API_KEY_FILE = config.age.secrets.bunnyApiKey.path;
};
};
certs."poor.dog" = { };
+65
hosts/trimounts/modules/nsid-tracker.disabled
···
+
{
+
pkgs,
+
terra,
+
inputs,
+
...
+
}:
+
let
+
client-modules = pkgs.callPackage "${inputs.nsid-tracker}/nix/client-modules.nix" { };
+
client = pkgs.callPackage "${inputs.nsid-tracker}/nix/client.nix" {
+
PUBLIC_API_URL = "gaze.systems/nsid-tracker/api";
+
inherit client-modules;
+
};
+
# server = terra.nsid-tracker-server;
+
port = 3713;
+
in
+
{
+
systemd.services.nsid-tracker-client = {
+
description = "nsid-tracker-client";
+
wantedBy = [ "multi-user.target" ];
+
after = [ "network.target" ];
+
environment = {
+
# ORIGIN = "https://gaze.systems";
+
PORT = toString port;
+
};
+
serviceConfig = {
+
DynamicUser = true;
+
ExecStart = "${client}/bin/website";
+
Restart = "on-failure";
+
RestartSec = 5;
+
WorkingDirectory = "/var/lib/nsid-tracker";
+
};
+
};
+
+
systemd.services.nsid-tracker-keep-alive = {
+
description = "keeps nsid-tracker peer connection alive";
+
wantedBy = [ "multi-user.target" ];
+
after = [ "network.target" ];
+
serviceConfig = {
+
Type = "oneshot";
+
ExecStart = "${pkgs.curl}/bin/curl http://dusk-devel-mobi:${toString port}/events";
+
};
+
};
+
systemd.timers.nsid-tracker-keep-alive.timerConfig = {
+
OnBootSec = "5 min";
+
OnUnitActiveSec = "5 min";
+
Unit = "nsid-tracker-keep-alive.service";
+
};
+
+
services.nginx.virtualHosts."gaze.systems" = {
+
locations."/nsid-tracker/api" = {
+
proxyPass = "http://100.64.0.6:${toString port}/";
+
proxyWebsockets = true;
+
extraConfig = ''
+
rewrite ^/nsid-tracker/api/(.*) /$1 break;
+
'';
+
};
+
locations."/nsid-tracker".return = "301 /nsid-tracker/";
+
locations."/nsid-tracker/" = {
+
proxyPass = "http://localhost:${toString port}/";
+
extraConfig = ''
+
rewrite ^/nsid-tracker/(.*)$ /$1 break;
+
'';
+
};
+
};
+
}
-65
hosts/trimounts/modules/nsid-tracker.nix
···
-
{
-
pkgs,
-
terra,
-
inputs,
-
...
-
}:
-
let
-
client-modules = pkgs.callPackage "${inputs.nsid-tracker}/nix/client-modules.nix" { };
-
client = pkgs.callPackage "${inputs.nsid-tracker}/nix/client.nix" {
-
PUBLIC_API_URL = "gaze.systems/nsid-tracker/api";
-
inherit client-modules;
-
};
-
# server = terra.nsid-tracker-server;
-
port = 3713;
-
in
-
{
-
systemd.services.nsid-tracker-client = {
-
description = "nsid-tracker-client";
-
wantedBy = [ "multi-user.target" ];
-
after = [ "network.target" ];
-
environment = {
-
# ORIGIN = "https://gaze.systems";
-
PORT = toString port;
-
};
-
serviceConfig = {
-
DynamicUser = true;
-
ExecStart = "${client}/bin/website";
-
Restart = "on-failure";
-
RestartSec = 5;
-
WorkingDirectory = "/var/lib/nsid-tracker";
-
};
-
};
-
-
systemd.services.nsid-tracker-keep-alive = {
-
description = "keeps nsid-tracker peer connection alive";
-
wantedBy = [ "multi-user.target" ];
-
after = [ "network.target" ];
-
serviceConfig = {
-
Type = "oneshot";
-
ExecStart = "${pkgs.curl}/bin/curl http://dusk-devel-mobi:${toString port}/events";
-
};
-
};
-
systemd.timers.nsid-tracker-keep-alive.timerConfig = {
-
OnBootSec = "5 min";
-
OnUnitActiveSec = "5 min";
-
Unit = "nsid-tracker-keep-alive.service";
-
};
-
-
services.nginx.virtualHosts."gaze.systems" = {
-
locations."/nsid-tracker/api" = {
-
proxyPass = "http://100.64.0.6:${toString port}/";
-
proxyWebsockets = true;
-
extraConfig = ''
-
rewrite ^/nsid-tracker/api/(.*) /$1 break;
-
'';
-
};
-
locations."/nsid-tracker".return = "301 /nsid-tracker/";
-
locations."/nsid-tracker/" = {
-
proxyPass = "http://localhost:${toString port}/";
-
extraConfig = ''
-
rewrite ^/nsid-tracker/(.*)$ /$1 break;
-
'';
-
};
-
};
-
}
+6
pkgs-set/overlays/navidrome.nix/default.nix
···
+
final: prev: {
+
navidrome = prev.navidrome.overrideAttrs (old: {
+
patches = (old.patches or []) ++ [./origin_url.patch];
+
doCheck = false;
+
});
+
}
+85
pkgs-set/overlays/navidrome.nix/origin_url.patch
···
+
diff --git a/core/agents/listenbrainz/agent.go b/core/agents/listenbrainz/agent.go
+
index 769b0f5..758eb85 100644
+
--- a/core/agents/listenbrainz/agent.go
+
+++ b/core/agents/listenbrainz/agent.go
+
@@ -3,6 +3,7 @@ package listenbrainz
+
import (
+
"context"
+
"errors"
+
+ "fmt"
+
"net/http"
+
+
"github.com/navidrome/navidrome/conf"
+
@@ -52,6 +53,10 @@ func (l *listenBrainzAgent) formatListen(track *model.MediaFile) listenInfo {
+
artistNames := slice.Map(track.Participants[model.RoleArtist], func(p model.Participant) string {
+
return p.Name
+
})
+
+ var originURL string
+
+ if v := track.Tags.Values(model.TagSource); len(v) > 0 {
+
+ originURL = v[0]
+
+ }
+
li := listenInfo{
+
TrackMetadata: trackMetadata{
+
ArtistName: track.Artist,
+
@@ -67,9 +72,12 @@ func (l *listenBrainzAgent) formatListen(track *model.MediaFile) listenInfo {
+
ReleaseMBID: track.MbzAlbumID,
+
ReleaseGroupMBID: track.MbzReleaseGroupID,
+
DurationMs: int(track.Duration * 1000),
+
+ OriginURL: originURL,
+
},
+
},
+
}
+
+ fmt.Printf("listen info: %+v\n", li)
+
+ fmt.Printf("track tags: %+v\n", track.Tags)
+
return li
+
}
+
+
diff --git a/core/agents/listenbrainz/agent_test.go b/core/agents/listenbrainz/agent_test.go
+
index e99b442..11e7b3c 100644
+
--- a/core/agents/listenbrainz/agent_test.go
+
+++ b/core/agents/listenbrainz/agent_test.go
+
@@ -69,6 +69,7 @@ var _ = Describe("listenBrainzAgent", func() {
+
"ArtistNames": ConsistOf("Artist 1", "Artist 2"),
+
"ArtistMBIDs": ConsistOf("mbz-111", "mbz-222"),
+
"DurationMs": Equal(142200),
+
+ "OriginURL": Ignore(),
+
}),
+
}),
+
}))
+
diff --git a/core/agents/listenbrainz/client.go b/core/agents/listenbrainz/client.go
+
index 168aad5..807bdef 100644
+
--- a/core/agents/listenbrainz/client.go
+
+++ b/core/agents/listenbrainz/client.go
+
@@ -82,6 +82,7 @@ type additionalInfo struct {
+
ReleaseMBID string `json:"release_mbid,omitempty"`
+
ReleaseGroupMBID string `json:"release_group_mbid,omitempty"`
+
DurationMs int `json:"duration_ms,omitempty"`
+
+ OriginURL string `json:"origin_url,omitempty"`
+
}
+
+
func (c *client) validateToken(ctx context.Context, apiKey string) (*listenBrainzResponse, error) {
+
diff --git a/model/tag.go b/model/tag.go
+
index 674f688..ecd1a12 100644
+
--- a/model/tag.go
+
+++ b/model/tag.go
+
@@ -194,6 +194,7 @@ const (
+
TagISRC TagName = "isrc"
+
TagBPM TagName = "bpm"
+
TagExplicitStatus TagName = "explicitstatus"
+
+ TagSource TagName = "source"
+
+
// Dates and years
+
+
diff --git a/resources/mappings.yaml b/resources/mappings.yaml
+
index d1da5c6..905ad01 100644
+
--- a/resources/mappings.yaml
+
+++ b/resources/mappings.yaml
+
@@ -251,6 +251,8 @@ additional:
+
aliases: [ txxx:script, script, ----:com.apple.itunes:script, wm/script ]
+
subtitle:
+
aliases: [ tit3, subtitle, ----:com.apple.itunes:subtitle, wm/subtitle ]
+
+ source:
+
+ aliases: [ source, woas, audio source, txxx:source, ----:com.apple.itunes:source ]
+
website:
+
aliases: [ woar, website, weblink, wm/authorurl ]
+
work:
+21
secrets/bunnyApiKey.age
···
+
age-encryption.org/v1
+
-> ssh-rsa Abmvag
+
XNh6H/W0srZXbGmkLGQ/YpXfamisyK/duLeSftkcrXU67b5s8x40HUv1NaKr/QQt
+
7ZBvKfm+8YsKcmmXaIINOHl6/LQ6GTpWprN91VDxTGOGzpO/GmD8MOUk8zfJYh+D
+
3soDoZuuk1gr8Q7+f8AIrfT+x3QwHA2h3hCm3un3MqhmAicTTip2C3NFQhlsEwHi
+
DhgOJ1Wy9/lSXwIzhg62s8KDOQ4cBETA8PRvspWh8GsV1oLU/brk2itwUaj0P8xA
+
uQrQzo71rbUttXeGnW4yBZjzzGMJe5iHY3H4aQxjklC1yGpInDf3HGaO6X/yaZBx
+
vRx2YxwCH4AdhgVpllbZo2++uGX8mye6fu5Lap04+dXU+ubglEvDQ1uRDrbXML9/
+
PpRszgmu5z7k9u+qWI/aBywUChvVSy4TDWKcj2JAqvCuU7QYiEi6SKhIiDLNd/BQ
+
7aa/GHSUpUu6TnpRwuBF4l2g5+jO27hsNWb3nAm/SV5YHEVCn+Tr5PiRPxBK8Fa0
+
ngJjBK5r4ra+uGulwGn1uoM0jYVCl6EtjtKgLeP5cvbdLylKWRXRYxyL7XTxqmHb
+
oLJsVvxuF1pFiaUkAmMBctaYdMw9EVwV8vTp4/eebVe6pU0Lmxv5B0u5nDiWar5o
+
RQzfwfGhtOaE0PUQNqVz7VfdoIzCcUjqnJMwInh+XwU
+
-> ssh-ed25519 y5W/qA rZ2rTM2n2bPULAefeeUvEFwskCNIEh5KdkC7uEnBcXM
+
P75OaqdeAt3BVa/xprDvJ/bLoGLkU6qdteVvwD9fO8M
+
-> ssh-ed25519 LaQclg Bnt8Z3Cve0gG6ItbJq+1+fUT/ykFsngstap8ymEr1m4
+
filHMr3njOkRpbu4UwutvqxVLf8joTBvqs3JT1gu7kk
+
--- pkIfClG050A3Kp8c+HUQJDwlxM1BbFaCRx8Vp0++xbI
+
4๏ฟฝdc๏ฟฝ๏ฟฝ๏ฟฝ/\๏ฟฝฺฆ ๏ฟฝ@:e๏ฟฝ๏ฟฝ:e๏ฟฝo;๏ฟฝ
+
๏ฟฝE๏ฟฝd\W๏ฟฝ#m
+
๏ฟฝ๏ฟฝWA๏ฟฝ๏ฟฝ#๏ฟฝuaJ๏ฟฝ๏ฟฝT๏ฟฝ<๏ฟฝ๏ฟฝ๏ฟฝX๏ฟฝR๏ฟฝ๏ฟฝ๏ฟฝX๏ฟฝX"9 ๏ฟฝ๏ฟฝ๏ฟฝ)๏ฟฝ'U:7๏ฟฝ๏ฟฝ+๏ฟฝ,๏ฟฝhNฯ๏ฟฝUl\๏ฟฝ FSP8c
+5 -6
secrets/secrets.nix
···
let
yusdacra = builtins.readFile ./yusdacra.key.pub;
-
wolumonde = builtins.readFile ./wolumonde.key.pub;
dzwonek = builtins.readFile ./dzwonek.key.pub;
trimounts = builtins.readFile ./trimounts.key.pub;
develMobi = builtins.readFile ./develMobi.key.pub;
···
"nixGithubAccessToken.age".publicKeys = [ yusdacra ];
"websiteConfig.age".publicKeys = [
yusdacra
-
wolumonde
trimounts
];
"pdsConfig.age".publicKeys = [
yusdacra
-
wolumonde
trimounts
];
"clickeeProxyConfig.age".publicKeys = [
yusdacra
-
wolumonde
trimounts
];
"persesSecret.age".publicKeys = [
yusdacra
-
wolumonde
trimounts
];
"headscaleOidcSecret.age".publicKeys = [
···
"cloudflareDnsEdit.age".publicKeys = [
yusdacra
dzwonek
-
wolumonde
+
trimounts
+
];
+
"bunnyApiKey.age".publicKeys = [
+
yusdacra
+
dzwonek
trimounts
];
}