From 0015313795a473d13743d90bce35d5c2892ef4ac Mon Sep 17 00:00:00 2001 From: satr14washere <90962949+satr14washere@users.noreply.github.com> Date: Sat, 21 Mar 2026 19:13:53 +0700 Subject: [PATCH 1/8] base flake.nix and example --- .gitignore | 3 +- docs/example.nix | 78 ++++++++++++++++++++++++++++++++++++++++++++++ domains/satr14.nix | 5 +++ flake.nix | 26 ++++++++++++---- 4 files changed, 105 insertions(+), 7 deletions(-) create mode 100644 docs/example.nix create mode 100644 domains/satr14.nix diff --git a/.gitignore b/.gitignore index 6d32cd8..0ff973d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ creds.json -types-dnscontrol.d.ts \ No newline at end of file +types-dnscontrol.d.ts +result \ No newline at end of file diff --git a/docs/example.nix b/docs/example.nix new file mode 100644 index 0000000..5a58fe9 --- /dev/null +++ b/docs/example.nix @@ -0,0 +1,78 @@ +{ dns, ... }: let + owner = { + username = "satr14washere"; + email = "admin@satr14.my.id"; + }; + proxy = false; +in with dns.lib.combinators; { + A = [ + { address = "203.0.113.1"; ttl = 60 * 60; } + "203.0.113.2" + (ttl (60 * 60) (a "203.0.113.3")) + ]; + + AAAA = [ + "4321:0:1:2:3:4:567:89ab" + ]; + + MX = mx.google; + + TXT = [ + (with spf; strict [ "a:mail.example.com" google ]) + ]; + + DMARC = [ (dmarc.postmarkapp "mailto:re+abcdefghijk@dmarc.postmarkapp.com") ]; + + CAA = letsEncrypt "admin@example.com"; + + SRV = [ + { + service = "sip"; + proto = "tcp"; + port = 5060; + target = "sip.example.com"; + } + ]; + + SSHFP = [ + { + algorithm = "ed25519"; + fingerprintType = "sha256"; + fingerprint = "899EB4AC9285578AFDA3CCBE152EE78D8618B8F3862FEF2703E1FC7011E9B8AA"; + } + ]; + OPENPGPKEY = [ + "very long base64 text" + ]; + HTTPS = [ + { + svcPriority = 1; + targetName = "."; + alpn = [ "http/1.1" "h2" "h3" ]; + ipv4hint = [ "203.0.113.1" "203.0.113.2" "203.0.113.3" ]; + ipv6hint = [ "4321:0:1:2:3:4:567:89ab" ]; + } + ]; + TLSA = [ + { + certUsage = "dane-ee"; + selector = "spki"; + matchingType = "sha256"; + certificate = "899EB4AC9285578AFDA3CCBE152EE78D8618B8F3862FEF2703E1FC7011E9B8AA"; + } + ]; + + subdomains = rec { + www.A = [ "203.0.113.4" ]; + www2 = host "203.0.113.5" "4321:0:1:2:3:4:567:89bb"; + www3 = host "203.0.113.6" null; + www4 = www3; + + staging = delegateTo [ + "ns1.another.com." + "ns2.another.com." + ]; + + foo.subdomains.www.CNAME = [ "foo.test.com." ]; + }; +} diff --git a/domains/satr14.nix b/domains/satr14.nix new file mode 100644 index 0000000..e9b421c --- /dev/null +++ b/domains/satr14.nix @@ -0,0 +1,5 @@ +{ ... }: let + owner.username = "satr14washere"; +in { + CNAME = "5th-site.pages.dev"; +} \ No newline at end of file diff --git a/flake.nix b/flake.nix index b35d8b3..5bbc857 100644 --- a/flake.nix +++ b/flake.nix @@ -1,5 +1,5 @@ { - description = "Zone File Generator For part-of.my.id"; + description = "Zone File Generator"; inputs.dns.url = "github:nix-community/dns.nix"; outputs = { dns, ... }: let @@ -11,6 +11,20 @@ "fattouche.ns.cloudflare.com" ]; }; + + domainFiles = let + dir = ./domains; + entries = builtins.readDir ./domains; + nixFiles = builtins.filter (name: builtins.match ".*\\.nix$" name != null) (builtins.attrNames entries); + in map (name: { + subdomain = builtins.replaceStrings [ ".nix" ] [ "" ] name; + config = import (dir + "/${name}") { inherit dns; }; + }) nixFiles; + + subdomainsFromFiles = builtins.listToAttrs (map (entry: { + name = entry.subdomain; + value = entry.config; + }) domainFiles); in { packages.x86_64-linux = builtins.mapAttrs (_: domain: dns.util.x86_64-linux.writeZone domain.domain ( @@ -21,12 +35,12 @@ serial = builtins.currentTime; }; NS = domain.nameservers; - - # note: Cloudflare ignores SOA and NS records uploaded via Zone File, they are just so that dns.nix builds a valid zone file. - - A = [ "1.1.1.1" ]; + + # note: Cloudflare ignores SOA and NS records uploaded via Zone File, they are included just so that dns.nix builds a valid zone file. + + subdomains = subdomainsFromFiles; } ) ) domains; }; -} +} \ No newline at end of file From e7d62df069ed9ae7d3d595e6bab6b92b05a1fd5e Mon Sep 17 00:00:00 2001 From: satr14washere <90962949+satr14washere@users.noreply.github.com> Date: Sat, 21 Mar 2026 19:15:20 +0700 Subject: [PATCH 2/8] todo implementation --- flake.nix | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/flake.nix b/flake.nix index 5bbc857..9dd8906 100644 --- a/flake.nix +++ b/flake.nix @@ -11,20 +11,6 @@ "fattouche.ns.cloudflare.com" ]; }; - - domainFiles = let - dir = ./domains; - entries = builtins.readDir ./domains; - nixFiles = builtins.filter (name: builtins.match ".*\\.nix$" name != null) (builtins.attrNames entries); - in map (name: { - subdomain = builtins.replaceStrings [ ".nix" ] [ "" ] name; - config = import (dir + "/${name}") { inherit dns; }; - }) nixFiles; - - subdomainsFromFiles = builtins.listToAttrs (map (entry: { - name = entry.subdomain; - value = entry.config; - }) domainFiles); in { packages.x86_64-linux = builtins.mapAttrs (_: domain: dns.util.x86_64-linux.writeZone domain.domain ( @@ -38,7 +24,8 @@ # note: Cloudflare ignores SOA and NS records uploaded via Zone File, they are included just so that dns.nix builds a valid zone file. - subdomains = subdomainsFromFiles; + #subdomains = ; + # ^^ todo: implement file imports from ./domains } ) ) domains; From 71102fabc8c16e13be5762fae46aad2ec7e4b555 Mon Sep 17 00:00:00 2001 From: satr14washere <90962949+satr14washere@users.noreply.github.com> Date: Sat, 21 Mar 2026 19:33:49 +0700 Subject: [PATCH 3/8] remove apex, managed seperately --- domains/@.json | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 domains/@.json diff --git a/domains/@.json b/domains/@.json deleted file mode 100644 index 9c9947c..0000000 --- a/domains/@.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "description": "dashboard and main website", - "owner": { - "username": "partofmyid" - }, - "record": { - "ALIAS": "website-e7n.pages.dev" - } -} From a97ad1b804202c2d60bd0dcb18e737282273cb09 Mon Sep 17 00:00:00 2001 From: satr14washere <90962949+satr14washere@users.noreply.github.com> Date: Sat, 21 Mar 2026 20:13:05 +0700 Subject: [PATCH 4/8] migrated nix files --- domains/_discord.colin.nix | 9 + domains/_discord.cutedog5695.nix | 10 ++ domains/_discord.justdeveloper.nix | 10 ++ domains/_discord.nix | 8 + domains/_discord.roki.nix | 8 + domains/batman.nix | 8 + domains/c.nix | 9 + domains/colin.nix | 9 + domains/cutedog5695.nix | 10 ++ domains/elkaff.nix | 7 + domains/j.nix | 10 ++ domains/jacob.nix | 8 + domains/jd.nix | 10 ++ domains/job.nix | 8 + domains/joel.nix | 16 ++ domains/js.nix | 10 ++ domains/just.nix | 10 ++ domains/justdev.nix | 10 ++ domains/justdeveloper.nix | 10 ++ domains/juststudio.nix | 10 ++ domains/katz.nix | 8 + domains/no-one-is.nix | 9 + domains/pxl.nix | 8 + domains/rchessauth.nix | 8 + domains/roki.nix | 9 + domains/satr14.nix | 12 +- domains/stef.nix | 9 + domains/ukriu.nix | 10 ++ domains/you-are.nix | 9 + scripts/migrate-json-to-nix.py | 279 +++++++++++++++++++++++++++++ 30 files changed, 546 insertions(+), 5 deletions(-) create mode 100644 domains/_discord.colin.nix create mode 100644 domains/_discord.cutedog5695.nix create mode 100644 domains/_discord.justdeveloper.nix create mode 100644 domains/_discord.nix create mode 100644 domains/_discord.roki.nix create mode 100644 domains/batman.nix create mode 100644 domains/c.nix create mode 100644 domains/colin.nix create mode 100644 domains/cutedog5695.nix create mode 100644 domains/elkaff.nix create mode 100644 domains/j.nix create mode 100644 domains/jacob.nix create mode 100644 domains/jd.nix create mode 100644 domains/job.nix create mode 100644 domains/joel.nix create mode 100644 domains/js.nix create mode 100644 domains/just.nix create mode 100644 domains/justdev.nix create mode 100644 domains/justdeveloper.nix create mode 100644 domains/juststudio.nix create mode 100644 domains/katz.nix create mode 100644 domains/no-one-is.nix create mode 100644 domains/pxl.nix create mode 100644 domains/rchessauth.nix create mode 100644 domains/roki.nix create mode 100644 domains/stef.nix create mode 100644 domains/ukriu.nix create mode 100644 domains/you-are.nix create mode 100755 scripts/migrate-json-to-nix.py diff --git a/domains/_discord.colin.nix b/domains/_discord.colin.nix new file mode 100644 index 0000000..e107e70 --- /dev/null +++ b/domains/_discord.colin.nix @@ -0,0 +1,9 @@ +{ dns, ... }: let + owner = { + username = "ColinLeDev"; + }; + description = "Discord verification"; + proxy = false; +in with dns.lib.combinators; { + TXT = [ "dh=279643a6f8677dedb1c5c63d007fc4516149679c" ]; +} diff --git a/domains/_discord.cutedog5695.nix b/domains/_discord.cutedog5695.nix new file mode 100644 index 0000000..8b6e78e --- /dev/null +++ b/domains/_discord.cutedog5695.nix @@ -0,0 +1,10 @@ +{ dns, ... }: let + owner = { + username = "CuteDog5695"; + email = "cutedog5695@gmail.com"; + repo = "https://github.com/CuteDog5695/cutedog5695.github.io"; + }; + proxy = false; +in with dns.lib.combinators; { + TXT = [ "dh=a7c19efb0f6bc38b97a33760f6c1ee84df4151b1" ]; +} diff --git a/domains/_discord.justdeveloper.nix b/domains/_discord.justdeveloper.nix new file mode 100644 index 0000000..c1025bb --- /dev/null +++ b/domains/_discord.justdeveloper.nix @@ -0,0 +1,10 @@ +{ dns, ... }: let + owner = { + username = "JustDeveloper1"; + email = "justdeveloper@juststudio.is-a.dev"; + repo = "https://github.com/JustDeveloper1/Website"; + }; + proxy = false; +in with dns.lib.combinators; { + TXT = [ "dh=6024027bc233825451e290ac37a4b4a1f838ee70" ]; +} diff --git a/domains/_discord.nix b/domains/_discord.nix new file mode 100644 index 0000000..ee3009d --- /dev/null +++ b/domains/_discord.nix @@ -0,0 +1,8 @@ +{ dns, ... }: let + owner = { + username = "satr14washere"; + }; + proxy = false; +in with dns.lib.combinators; { + TXT = [ "dh=d509fc9014e196311ed887c2e410cdefa833436e" ]; +} diff --git a/domains/_discord.roki.nix b/domains/_discord.roki.nix new file mode 100644 index 0000000..5b1d452 --- /dev/null +++ b/domains/_discord.roki.nix @@ -0,0 +1,8 @@ +{ dns, ... }: let + owner = { + username = "Roki100"; + discord = "289479495444987904"; + }; +in with dns.lib.combinators; { + TXT = [ "dh=5633078cd5bfd347a896ddb0f0de017c5423aa06" ]; +} diff --git a/domains/batman.nix b/domains/batman.nix new file mode 100644 index 0000000..0ad04bd --- /dev/null +++ b/domains/batman.nix @@ -0,0 +1,8 @@ +{ dns, ... }: let + owner = { + username = "shadowe1ite"; + }; + proxy = true; +in with dns.lib.combinators; { + CNAME = [ "shadowe1ite.github.io." ]; +} diff --git a/domains/c.nix b/domains/c.nix new file mode 100644 index 0000000..bed0b01 --- /dev/null +++ b/domains/c.nix @@ -0,0 +1,9 @@ +{ dns, ... }: let + owner = { + username = "orangci"; + email = "c@orangc.xyz"; + }; + proxy = false; +in with dns.lib.combinators; { + CNAME = [ "edge.redirect.pizza." ]; +} diff --git a/domains/colin.nix b/domains/colin.nix new file mode 100644 index 0000000..277aba7 --- /dev/null +++ b/domains/colin.nix @@ -0,0 +1,9 @@ +{ dns, ... }: let + owner = { + username = "ColinLeDev"; + }; + description = "My personal portfolio hosted on my server"; + proxy = false; +in with dns.lib.combinators; { + CNAME = [ "proxy.col1n.fr." ]; +} diff --git a/domains/cutedog5695.nix b/domains/cutedog5695.nix new file mode 100644 index 0000000..f20329f --- /dev/null +++ b/domains/cutedog5695.nix @@ -0,0 +1,10 @@ +{ dns, ... }: let + owner = { + username = "CuteDog5695"; + email = "cutedog5695@gmail.com"; + repo = "https://github.com/CuteDog5695/cutedog5695.github.io"; + }; + proxy = false; +in with dns.lib.combinators; { + CNAME = [ "edge.redirect.pizza." ]; +} diff --git a/domains/elkaff.nix b/domains/elkaff.nix new file mode 100644 index 0000000..9ead547 --- /dev/null +++ b/domains/elkaff.nix @@ -0,0 +1,7 @@ +{ dns, ... }: let + owner = { + username = "elkhaff"; + }; +in with dns.lib.combinators; { + CNAME = [ "portofolio-pixel.pages.dev." ]; +} diff --git a/domains/j.nix b/domains/j.nix new file mode 100644 index 0000000..8cd38c6 --- /dev/null +++ b/domains/j.nix @@ -0,0 +1,10 @@ +{ dns, ... }: let + owner = { + username = "JustDeveloper1"; + email = "support@juststudio.is-a.dev"; + repo = "https://github.com/JustStudio7/Website"; + }; + proxy = false; +in with dns.lib.combinators; { + CNAME = [ "edge.redirect.pizza." ]; +} diff --git a/domains/jacob.nix b/domains/jacob.nix new file mode 100644 index 0000000..46839f9 --- /dev/null +++ b/domains/jacob.nix @@ -0,0 +1,8 @@ +{ dns, ... }: let + owner = { + username = "jacobrdale"; + }; + proxy = false; +in with dns.lib.combinators; { + CNAME = [ "hexon404.onrender.com." ]; +} diff --git a/domains/jd.nix b/domains/jd.nix new file mode 100644 index 0000000..4555867 --- /dev/null +++ b/domains/jd.nix @@ -0,0 +1,10 @@ +{ dns, ... }: let + owner = { + username = "JustDeveloper1"; + email = "justdeveloper@juststudio.is-a.dev"; + repo = "https://github.com/JustDeveloper1/Website"; + }; + proxy = false; +in with dns.lib.combinators; { + CNAME = [ "edge.redirect.pizza." ]; +} diff --git a/domains/job.nix b/domains/job.nix new file mode 100644 index 0000000..c2623ab --- /dev/null +++ b/domains/job.nix @@ -0,0 +1,8 @@ +{ dns, ... }: let + owner = { + username = "FWEEaaaa1"; + }; + proxy = false; +in with dns.lib.combinators; { + A = [ "128.204.223.115" ]; +} diff --git a/domains/joel.nix b/domains/joel.nix new file mode 100644 index 0000000..f1ad335 --- /dev/null +++ b/domains/joel.nix @@ -0,0 +1,16 @@ +{ dns, ... }: let + owner = { + username = "joestr"; + email = "strasser999@gmail.com"; + }; + proxy = false; +in with dns.lib.combinators; { + A = [ "142.132.173.34" ]; + AAAA = [ "2a01:4f8:1c0c:6cc0::1" ]; + MX = [ + { + exchange = "achlys.infra.joestr.at."; + preference = 10; + } + ]; +} diff --git a/domains/js.nix b/domains/js.nix new file mode 100644 index 0000000..8cd38c6 --- /dev/null +++ b/domains/js.nix @@ -0,0 +1,10 @@ +{ dns, ... }: let + owner = { + username = "JustDeveloper1"; + email = "support@juststudio.is-a.dev"; + repo = "https://github.com/JustStudio7/Website"; + }; + proxy = false; +in with dns.lib.combinators; { + CNAME = [ "edge.redirect.pizza." ]; +} diff --git a/domains/just.nix b/domains/just.nix new file mode 100644 index 0000000..4555867 --- /dev/null +++ b/domains/just.nix @@ -0,0 +1,10 @@ +{ dns, ... }: let + owner = { + username = "JustDeveloper1"; + email = "justdeveloper@juststudio.is-a.dev"; + repo = "https://github.com/JustDeveloper1/Website"; + }; + proxy = false; +in with dns.lib.combinators; { + CNAME = [ "edge.redirect.pizza." ]; +} diff --git a/domains/justdev.nix b/domains/justdev.nix new file mode 100644 index 0000000..4555867 --- /dev/null +++ b/domains/justdev.nix @@ -0,0 +1,10 @@ +{ dns, ... }: let + owner = { + username = "JustDeveloper1"; + email = "justdeveloper@juststudio.is-a.dev"; + repo = "https://github.com/JustDeveloper1/Website"; + }; + proxy = false; +in with dns.lib.combinators; { + CNAME = [ "edge.redirect.pizza." ]; +} diff --git a/domains/justdeveloper.nix b/domains/justdeveloper.nix new file mode 100644 index 0000000..4555867 --- /dev/null +++ b/domains/justdeveloper.nix @@ -0,0 +1,10 @@ +{ dns, ... }: let + owner = { + username = "JustDeveloper1"; + email = "justdeveloper@juststudio.is-a.dev"; + repo = "https://github.com/JustDeveloper1/Website"; + }; + proxy = false; +in with dns.lib.combinators; { + CNAME = [ "edge.redirect.pizza." ]; +} diff --git a/domains/juststudio.nix b/domains/juststudio.nix new file mode 100644 index 0000000..8cd38c6 --- /dev/null +++ b/domains/juststudio.nix @@ -0,0 +1,10 @@ +{ dns, ... }: let + owner = { + username = "JustDeveloper1"; + email = "support@juststudio.is-a.dev"; + repo = "https://github.com/JustStudio7/Website"; + }; + proxy = false; +in with dns.lib.combinators; { + CNAME = [ "edge.redirect.pizza." ]; +} diff --git a/domains/katz.nix b/domains/katz.nix new file mode 100644 index 0000000..c369c96 --- /dev/null +++ b/domains/katz.nix @@ -0,0 +1,8 @@ +{ dns, ... }: let + owner = { + username = "Bananalolok"; + }; + proxy = false; +in with dns.lib.combinators; { + A = [ "69.197.135.205" ]; +} diff --git a/domains/no-one-is.nix b/domains/no-one-is.nix new file mode 100644 index 0000000..8fcb680 --- /dev/null +++ b/domains/no-one-is.nix @@ -0,0 +1,9 @@ +{ dns, ... }: let + owner = { + username = "EducatedSuddenBucket"; + email = "me@esb.is-a.dev"; + }; + proxy = false; +in with dns.lib.combinators; { + CNAME = [ "educatedsuddenbucket-github-io.onrender.com." ]; +} diff --git a/domains/pxl.nix b/domains/pxl.nix new file mode 100644 index 0000000..2b3bce0 --- /dev/null +++ b/domains/pxl.nix @@ -0,0 +1,8 @@ +{ dns, ... }: let + owner = { + username = "heypxl"; + }; + proxy = false; +in with dns.lib.combinators; { + CNAME = [ "heypxl.github.io." ]; +} diff --git a/domains/rchessauth.nix b/domains/rchessauth.nix new file mode 100644 index 0000000..6ddd4c4 --- /dev/null +++ b/domains/rchessauth.nix @@ -0,0 +1,8 @@ +{ dns, ... }: let + owner = { + username = "vortexprime24"; + }; + proxy = false; +in with dns.lib.combinators; { + CNAME = [ "fire.hackclub.app." ]; +} diff --git a/domains/roki.nix b/domains/roki.nix new file mode 100644 index 0000000..43d30e6 --- /dev/null +++ b/domains/roki.nix @@ -0,0 +1,9 @@ +{ dns, ... }: let + owner = { + username = "Roki100"; + discord = "289479495444987904"; + }; + proxy = false; +in with dns.lib.combinators; { + CNAME = [ "edge.redirect.pizza." ]; +} diff --git a/domains/satr14.nix b/domains/satr14.nix index e9b421c..fa6e690 100644 --- a/domains/satr14.nix +++ b/domains/satr14.nix @@ -1,5 +1,7 @@ -{ ... }: let - owner.username = "satr14washere"; -in { - CNAME = "5th-site.pages.dev"; -} \ No newline at end of file +{ dns, ... }: let + owner = { + username = "satr14washere"; + }; +in with dns.lib.combinators; { + CNAME = [ "5th-site.pages.dev." ]; +} diff --git a/domains/stef.nix b/domains/stef.nix new file mode 100644 index 0000000..88e3870 --- /dev/null +++ b/domains/stef.nix @@ -0,0 +1,9 @@ +{ dns, ... }: let + owner = { + username = "Stef-00012"; + email = "admin@stefdp.lol"; + }; + proxy = false; +in with dns.lib.combinators; { + CNAME = [ "proxy.stefdp.lol." ]; +} diff --git a/domains/ukriu.nix b/domains/ukriu.nix new file mode 100644 index 0000000..bab016a --- /dev/null +++ b/domains/ukriu.nix @@ -0,0 +1,10 @@ +{ dns, ... }: let + owner = { + username = "ukriu"; + email = "partofmyid@ukriu.com"; + }; + description = "my website"; + proxy = false; +in with dns.lib.combinators; { + CNAME = [ "ukriu.pages.dev." ]; +} diff --git a/domains/you-are.nix b/domains/you-are.nix new file mode 100644 index 0000000..3cad0e8 --- /dev/null +++ b/domains/you-are.nix @@ -0,0 +1,9 @@ +{ dns, ... }: let + owner = { + username = "Stef-00012"; + email = "admin@stefdp.com"; + }; + proxy = false; +in with dns.lib.combinators; { + CNAME = [ "proxy.stefdp.com." ]; +} diff --git a/scripts/migrate-json-to-nix.py b/scripts/migrate-json-to-nix.py new file mode 100755 index 0000000..b85649f --- /dev/null +++ b/scripts/migrate-json-to-nix.py @@ -0,0 +1,279 @@ +#!/usr/bin/env python3 +""" +Migration script to convert domains/*.json to domains/*.nix + +Reads each JSON domain config and generates a corresponding .nix file +following the format from docs/example.nix. + +Usage: + python3 scripts/migrate-json-to-nix.py [--dry-run] [--delete-json] + +Options: + --dry-run Print generated .nix content to stdout without writing files + --delete-json Delete the original .json files after successful conversion +""" + +import json +import sys +import os +from pathlib import Path + +DOMAINS_DIR = Path(__file__).resolve().parent.parent / "domains" + + +def json_to_nix(data: dict) -> str: + """Convert a single domain JSON config to a .nix file string.""" + owner = data.get("owner", {}) + description = data.get("description") + record = data.get("record", {}) + # Some files use "proxy", others use "proxied" + proxy = data.get("proxied", data.get("proxy")) + + lines = [] + + # Header + lines.append("{ dns, ... }: let") + + # Owner block + owner_lines = [] + if owner.get("username"): + owner_lines.append(f' username = "{owner["username"]}";') + if owner.get("email"): + owner_lines.append(f' email = "{owner["email"]}";') + if owner.get("discord"): + owner_lines.append(f' discord = "{owner["discord"]}";') + if owner.get("repo"): + owner_lines.append(f' repo = "{owner["repo"]}";') + + lines.append(" owner = {") + for ol in owner_lines: + lines.append(ol) + lines.append(" };") + + if description is not None: + lines.append(f' description = "{escape_nix_string(description)}";') + + if proxy is not None: + lines.append(f" proxy = {'true' if proxy else 'false'};") + + lines.append("in with dns.lib.combinators; {") + + # Records + record_lines = build_record_lines(record) + for rl in record_lines: + lines.append(rl) + + lines.append("}") + lines.append("") + + return "\n".join(lines) + + +def escape_nix_string(s: str) -> str: + """Escape special characters for a Nix double-quoted string.""" + s = s.replace("\\", "\\\\") + s = s.replace('"', '\\"') + s = s.replace("${", "\\${") + return s + + +def build_record_lines(record: dict) -> list[str]: + """Build the Nix record lines from the JSON record dict.""" + lines = [] + + if "A" in record: + values = record["A"] + if isinstance(values, list): + if len(values) == 1: + lines.append(f' A = [ "{values[0]}" ];') + else: + lines.append(" A = [") + for v in values: + lines.append(f' "{v}"') + lines.append(" ];") + else: + lines.append(f' A = [ "{values}" ];') + + if "AAAA" in record: + values = record["AAAA"] + if isinstance(values, list): + if len(values) == 1: + lines.append(f' AAAA = [ "{values[0]}" ];') + else: + lines.append(" AAAA = [") + for v in values: + lines.append(f' "{v}"') + lines.append(" ];") + else: + lines.append(f' AAAA = [ "{values}" ];') + + if "CNAME" in record: + value = record["CNAME"] + if isinstance(value, list): + value = value[0] + lines.append(f' CNAME = [ "{value}." ];') + + if "ALIAS" in record: + value = record["ALIAS"] + if isinstance(value, list): + value = value[0] + # ALIAS is typically handled as CNAME in dns.nix + lines.append(f' CNAME = [ "{value}." ];') + + if "MX" in record: + values = record["MX"] + if isinstance(values, list): + lines.append(" MX = [") + for i, v in enumerate(values): + # MX records need priority; default to (i+1)*10 + priority = (i + 1) * 10 + lines.append(" {") + lines.append(f' exchange = "{ensure_fqdn(v)}";') + lines.append(f" preference = {priority};") + lines.append(" }") + lines.append(" ];") + else: + lines.append(" MX = [") + lines.append(" {") + lines.append(f' exchange = "{ensure_fqdn(values)}";') + lines.append(" preference = 10;") + lines.append(" }") + lines.append(" ];") + + if "TXT" in record: + values = record["TXT"] + if isinstance(values, list): + if len(values) == 1: + lines.append(f' TXT = [ "{escape_nix_string(values[0])}" ];') + else: + lines.append(" TXT = [") + for v in values: + lines.append(f' "{escape_nix_string(v)}"') + lines.append(" ];") + else: + lines.append(f' TXT = [ "{escape_nix_string(values)}" ];') + + if "NS" in record: + values = record["NS"] + if isinstance(values, list): + if len(values) == 1: + lines.append(f' NS = [ "{ensure_fqdn(values[0])}" ];') + else: + lines.append(" NS = [") + for v in values: + lines.append(f' "{ensure_fqdn(v)}"') + lines.append(" ];") + else: + lines.append(f' NS = [ "{ensure_fqdn(values)}" ];') + + if "SRV" in record: + values = record["SRV"] + if isinstance(values, list): + lines.append(" SRV = [") + for srv in values: + lines.append(" {") + if "service" in srv: + lines.append(f' service = "{srv["service"]}";') + if "proto" in srv: + lines.append(f' proto = "{srv["proto"]}";') + if "port" in srv: + lines.append(f" port = {srv['port']};") + if "priority" in srv: + lines.append(f" priority = {srv['priority']};") + if "weight" in srv: + lines.append(f" weight = {srv['weight']};") + if "target" in srv: + lines.append(f' target = "{ensure_fqdn(srv["target"])}";') + lines.append(" }") + lines.append(" ];") + + if "CAA" in record: + values = record["CAA"] + if isinstance(values, list): + lines.append(" CAA = [") + for caa in values: + lines.append(" {") + if "flags" in caa: + lines.append(f" flags = {caa['flags']};") + if "tag" in caa: + lines.append(f' tag = "{caa["tag"]}";') + if "value" in caa: + lines.append(f' value = "{escape_nix_string(caa["value"])}";') + lines.append(" }") + lines.append(" ];") + + return lines + + +def ensure_fqdn(domain: str) -> str: + """Ensure a domain name ends with a dot (FQDN).""" + if not domain.endswith("."): + return domain + "." + return domain + + +def migrate_file(json_path: Path, dry_run: bool = False, delete_json: bool = False) -> bool: + """Migrate a single JSON file to .nix. Returns True on success.""" + try: + with open(json_path, "r") as f: + data = json.load(f) + except json.JSONDecodeError as e: + print(f" ERROR: Failed to parse {json_path.name}: {e}", file=sys.stderr) + return False + + nix_content = json_to_nix(data) + nix_filename = json_path.stem + ".nix" + nix_path = json_path.parent / nix_filename + + if dry_run: + print(f"--- {nix_filename} ---") + print(nix_content) + return True + + with open(nix_path, "w") as f: + f.write(nix_content) + + print(f" Created {nix_path.name}") + + if delete_json: + json_path.unlink() + print(f" Deleted {json_path.name}") + + return True + + +def main(): + dry_run = "--dry-run" in sys.argv + delete_json = "--delete-json" in sys.argv + + if not DOMAINS_DIR.exists(): + print(f"Error: domains directory not found at {DOMAINS_DIR}", file=sys.stderr) + sys.exit(1) + + json_files = sorted(DOMAINS_DIR.glob("*.json")) + + if not json_files: + print("No JSON files found in domains/") + sys.exit(0) + + print(f"Found {len(json_files)} JSON file(s) to migrate") + if dry_run: + print("(dry run — no files will be written)\n") + + success = 0 + failed = 0 + + for json_path in json_files: + print(f"Migrating {json_path.name}...") + if migrate_file(json_path, dry_run=dry_run, delete_json=delete_json): + success += 1 + else: + failed += 1 + + print(f"\nDone: {success} succeeded, {failed} failed") + if failed > 0: + sys.exit(1) + + +if __name__ == "__main__": + main() \ No newline at end of file From 08350def49fdaed61148fd40c83aafb6e1df6372 Mon Sep 17 00:00:00 2001 From: orangc Date: Sat, 21 Mar 2026 16:32:42 +0300 Subject: [PATCH 5/8] style: formatting with nixfmt --- docs/example.nix | 35 +++++++++++------ domains/_discord.colin.nix | 10 ++--- domains/_discord.cutedog5695.nix | 11 ++---- domains/_discord.justdeveloper.nix | 11 ++---- domains/_discord.nix | 9 ++--- domains/_discord.roki.nix | 9 ++--- domains/batman.nix | 9 ++--- domains/c.nix | 10 ++--- domains/colin.nix | 10 ++--- domains/cutedog5695.nix | 11 ++---- domains/elkaff.nix | 8 ++-- domains/j.nix | 11 ++---- domains/jacob.nix | 9 ++--- domains/jd.nix | 11 ++---- domains/job.nix | 9 ++--- domains/joel.nix | 10 ++--- domains/js.nix | 11 ++---- domains/just.nix | 11 ++---- domains/justdev.nix | 11 ++---- domains/justdeveloper.nix | 11 ++---- domains/juststudio.nix | 11 ++---- domains/katz.nix | 9 ++--- domains/no-one-is.nix | 10 ++--- domains/pxl.nix | 9 ++--- domains/rchessauth.nix | 9 ++--- domains/roki.nix | 10 ++--- domains/satr14.nix | 8 ++-- domains/stef.nix | 10 ++--- domains/ukriu.nix | 11 ++---- domains/you-are.nix | 10 ++--- flake.nix | 61 ++++++++++++++++-------------- 31 files changed, 144 insertions(+), 241 deletions(-) diff --git a/docs/example.nix b/docs/example.nix index 5a58fe9..bd700f3 100644 --- a/docs/example.nix +++ b/docs/example.nix @@ -1,12 +1,11 @@ -{ dns, ... }: let - owner = { - username = "satr14washere"; - email = "admin@satr14.my.id"; - }; - proxy = false; -in with dns.lib.combinators; { +{ dns, ... }: +with dns.lib.combinators; +{ A = [ - { address = "203.0.113.1"; ttl = 60 * 60; } + { + address = "203.0.113.1"; + ttl = 60 * 60; + } "203.0.113.2" (ttl (60 * 60) (a "203.0.113.3")) ]; @@ -18,7 +17,13 @@ in with dns.lib.combinators; { MX = mx.google; TXT = [ - (with spf; strict [ "a:mail.example.com" google ]) + ( + with spf; + strict [ + "a:mail.example.com" + google + ] + ) ]; DMARC = [ (dmarc.postmarkapp "mailto:re+abcdefghijk@dmarc.postmarkapp.com") ]; @@ -48,8 +53,16 @@ in with dns.lib.combinators; { { svcPriority = 1; targetName = "."; - alpn = [ "http/1.1" "h2" "h3" ]; - ipv4hint = [ "203.0.113.1" "203.0.113.2" "203.0.113.3" ]; + alpn = [ + "http/1.1" + "h2" + "h3" + ]; + ipv4hint = [ + "203.0.113.1" + "203.0.113.2" + "203.0.113.3" + ]; ipv6hint = [ "4321:0:1:2:3:4:567:89ab" ]; } ]; diff --git a/domains/_discord.colin.nix b/domains/_discord.colin.nix index e107e70..aff9a5d 100644 --- a/domains/_discord.colin.nix +++ b/domains/_discord.colin.nix @@ -1,9 +1,5 @@ -{ dns, ... }: let - owner = { - username = "ColinLeDev"; - }; - description = "Discord verification"; - proxy = false; -in with dns.lib.combinators; { +{ dns, ... }: +with dns.lib.combinators; +{ TXT = [ "dh=279643a6f8677dedb1c5c63d007fc4516149679c" ]; } diff --git a/domains/_discord.cutedog5695.nix b/domains/_discord.cutedog5695.nix index 8b6e78e..597ab61 100644 --- a/domains/_discord.cutedog5695.nix +++ b/domains/_discord.cutedog5695.nix @@ -1,10 +1,5 @@ -{ dns, ... }: let - owner = { - username = "CuteDog5695"; - email = "cutedog5695@gmail.com"; - repo = "https://github.com/CuteDog5695/cutedog5695.github.io"; - }; - proxy = false; -in with dns.lib.combinators; { +{ dns, ... }: +with dns.lib.combinators; +{ TXT = [ "dh=a7c19efb0f6bc38b97a33760f6c1ee84df4151b1" ]; } diff --git a/domains/_discord.justdeveloper.nix b/domains/_discord.justdeveloper.nix index c1025bb..a7ac99e 100644 --- a/domains/_discord.justdeveloper.nix +++ b/domains/_discord.justdeveloper.nix @@ -1,10 +1,5 @@ -{ dns, ... }: let - owner = { - username = "JustDeveloper1"; - email = "justdeveloper@juststudio.is-a.dev"; - repo = "https://github.com/JustDeveloper1/Website"; - }; - proxy = false; -in with dns.lib.combinators; { +{ dns, ... }: +with dns.lib.combinators; +{ TXT = [ "dh=6024027bc233825451e290ac37a4b4a1f838ee70" ]; } diff --git a/domains/_discord.nix b/domains/_discord.nix index ee3009d..95090d8 100644 --- a/domains/_discord.nix +++ b/domains/_discord.nix @@ -1,8 +1,5 @@ -{ dns, ... }: let - owner = { - username = "satr14washere"; - }; - proxy = false; -in with dns.lib.combinators; { +{ dns, ... }: +with dns.lib.combinators; +{ TXT = [ "dh=d509fc9014e196311ed887c2e410cdefa833436e" ]; } diff --git a/domains/_discord.roki.nix b/domains/_discord.roki.nix index 5b1d452..48e6a52 100644 --- a/domains/_discord.roki.nix +++ b/domains/_discord.roki.nix @@ -1,8 +1,5 @@ -{ dns, ... }: let - owner = { - username = "Roki100"; - discord = "289479495444987904"; - }; -in with dns.lib.combinators; { +{ dns, ... }: +with dns.lib.combinators; +{ TXT = [ "dh=5633078cd5bfd347a896ddb0f0de017c5423aa06" ]; } diff --git a/domains/batman.nix b/domains/batman.nix index 0ad04bd..3b6202d 100644 --- a/domains/batman.nix +++ b/domains/batman.nix @@ -1,8 +1,5 @@ -{ dns, ... }: let - owner = { - username = "shadowe1ite"; - }; - proxy = true; -in with dns.lib.combinators; { +{ dns, ... }: +with dns.lib.combinators; +{ CNAME = [ "shadowe1ite.github.io." ]; } diff --git a/domains/c.nix b/domains/c.nix index bed0b01..9ecb30a 100644 --- a/domains/c.nix +++ b/domains/c.nix @@ -1,9 +1,5 @@ -{ dns, ... }: let - owner = { - username = "orangci"; - email = "c@orangc.xyz"; - }; - proxy = false; -in with dns.lib.combinators; { +{ dns, ... }: +with dns.lib.combinators; +{ CNAME = [ "edge.redirect.pizza." ]; } diff --git a/domains/colin.nix b/domains/colin.nix index 277aba7..4fe7a4a 100644 --- a/domains/colin.nix +++ b/domains/colin.nix @@ -1,9 +1,5 @@ -{ dns, ... }: let - owner = { - username = "ColinLeDev"; - }; - description = "My personal portfolio hosted on my server"; - proxy = false; -in with dns.lib.combinators; { +{ dns, ... }: +with dns.lib.combinators; +{ CNAME = [ "proxy.col1n.fr." ]; } diff --git a/domains/cutedog5695.nix b/domains/cutedog5695.nix index f20329f..9ecb30a 100644 --- a/domains/cutedog5695.nix +++ b/domains/cutedog5695.nix @@ -1,10 +1,5 @@ -{ dns, ... }: let - owner = { - username = "CuteDog5695"; - email = "cutedog5695@gmail.com"; - repo = "https://github.com/CuteDog5695/cutedog5695.github.io"; - }; - proxy = false; -in with dns.lib.combinators; { +{ dns, ... }: +with dns.lib.combinators; +{ CNAME = [ "edge.redirect.pizza." ]; } diff --git a/domains/elkaff.nix b/domains/elkaff.nix index 9ead547..109e65c 100644 --- a/domains/elkaff.nix +++ b/domains/elkaff.nix @@ -1,7 +1,5 @@ -{ dns, ... }: let - owner = { - username = "elkhaff"; - }; -in with dns.lib.combinators; { +{ dns, ... }: +with dns.lib.combinators; +{ CNAME = [ "portofolio-pixel.pages.dev." ]; } diff --git a/domains/j.nix b/domains/j.nix index 8cd38c6..9ecb30a 100644 --- a/domains/j.nix +++ b/domains/j.nix @@ -1,10 +1,5 @@ -{ dns, ... }: let - owner = { - username = "JustDeveloper1"; - email = "support@juststudio.is-a.dev"; - repo = "https://github.com/JustStudio7/Website"; - }; - proxy = false; -in with dns.lib.combinators; { +{ dns, ... }: +with dns.lib.combinators; +{ CNAME = [ "edge.redirect.pizza." ]; } diff --git a/domains/jacob.nix b/domains/jacob.nix index 46839f9..34c1508 100644 --- a/domains/jacob.nix +++ b/domains/jacob.nix @@ -1,8 +1,5 @@ -{ dns, ... }: let - owner = { - username = "jacobrdale"; - }; - proxy = false; -in with dns.lib.combinators; { +{ dns, ... }: +with dns.lib.combinators; +{ CNAME = [ "hexon404.onrender.com." ]; } diff --git a/domains/jd.nix b/domains/jd.nix index 4555867..9ecb30a 100644 --- a/domains/jd.nix +++ b/domains/jd.nix @@ -1,10 +1,5 @@ -{ dns, ... }: let - owner = { - username = "JustDeveloper1"; - email = "justdeveloper@juststudio.is-a.dev"; - repo = "https://github.com/JustDeveloper1/Website"; - }; - proxy = false; -in with dns.lib.combinators; { +{ dns, ... }: +with dns.lib.combinators; +{ CNAME = [ "edge.redirect.pizza." ]; } diff --git a/domains/job.nix b/domains/job.nix index c2623ab..df2d227 100644 --- a/domains/job.nix +++ b/domains/job.nix @@ -1,8 +1,5 @@ -{ dns, ... }: let - owner = { - username = "FWEEaaaa1"; - }; - proxy = false; -in with dns.lib.combinators; { +{ dns, ... }: +with dns.lib.combinators; +{ A = [ "128.204.223.115" ]; } diff --git a/domains/joel.nix b/domains/joel.nix index f1ad335..c5af765 100644 --- a/domains/joel.nix +++ b/domains/joel.nix @@ -1,10 +1,6 @@ -{ dns, ... }: let - owner = { - username = "joestr"; - email = "strasser999@gmail.com"; - }; - proxy = false; -in with dns.lib.combinators; { +{ dns, ... }: +with dns.lib.combinators; +{ A = [ "142.132.173.34" ]; AAAA = [ "2a01:4f8:1c0c:6cc0::1" ]; MX = [ diff --git a/domains/js.nix b/domains/js.nix index 8cd38c6..9ecb30a 100644 --- a/domains/js.nix +++ b/domains/js.nix @@ -1,10 +1,5 @@ -{ dns, ... }: let - owner = { - username = "JustDeveloper1"; - email = "support@juststudio.is-a.dev"; - repo = "https://github.com/JustStudio7/Website"; - }; - proxy = false; -in with dns.lib.combinators; { +{ dns, ... }: +with dns.lib.combinators; +{ CNAME = [ "edge.redirect.pizza." ]; } diff --git a/domains/just.nix b/domains/just.nix index 4555867..9ecb30a 100644 --- a/domains/just.nix +++ b/domains/just.nix @@ -1,10 +1,5 @@ -{ dns, ... }: let - owner = { - username = "JustDeveloper1"; - email = "justdeveloper@juststudio.is-a.dev"; - repo = "https://github.com/JustDeveloper1/Website"; - }; - proxy = false; -in with dns.lib.combinators; { +{ dns, ... }: +with dns.lib.combinators; +{ CNAME = [ "edge.redirect.pizza." ]; } diff --git a/domains/justdev.nix b/domains/justdev.nix index 4555867..9ecb30a 100644 --- a/domains/justdev.nix +++ b/domains/justdev.nix @@ -1,10 +1,5 @@ -{ dns, ... }: let - owner = { - username = "JustDeveloper1"; - email = "justdeveloper@juststudio.is-a.dev"; - repo = "https://github.com/JustDeveloper1/Website"; - }; - proxy = false; -in with dns.lib.combinators; { +{ dns, ... }: +with dns.lib.combinators; +{ CNAME = [ "edge.redirect.pizza." ]; } diff --git a/domains/justdeveloper.nix b/domains/justdeveloper.nix index 4555867..9ecb30a 100644 --- a/domains/justdeveloper.nix +++ b/domains/justdeveloper.nix @@ -1,10 +1,5 @@ -{ dns, ... }: let - owner = { - username = "JustDeveloper1"; - email = "justdeveloper@juststudio.is-a.dev"; - repo = "https://github.com/JustDeveloper1/Website"; - }; - proxy = false; -in with dns.lib.combinators; { +{ dns, ... }: +with dns.lib.combinators; +{ CNAME = [ "edge.redirect.pizza." ]; } diff --git a/domains/juststudio.nix b/domains/juststudio.nix index 8cd38c6..9ecb30a 100644 --- a/domains/juststudio.nix +++ b/domains/juststudio.nix @@ -1,10 +1,5 @@ -{ dns, ... }: let - owner = { - username = "JustDeveloper1"; - email = "support@juststudio.is-a.dev"; - repo = "https://github.com/JustStudio7/Website"; - }; - proxy = false; -in with dns.lib.combinators; { +{ dns, ... }: +with dns.lib.combinators; +{ CNAME = [ "edge.redirect.pizza." ]; } diff --git a/domains/katz.nix b/domains/katz.nix index c369c96..0751913 100644 --- a/domains/katz.nix +++ b/domains/katz.nix @@ -1,8 +1,5 @@ -{ dns, ... }: let - owner = { - username = "Bananalolok"; - }; - proxy = false; -in with dns.lib.combinators; { +{ dns, ... }: +with dns.lib.combinators; +{ A = [ "69.197.135.205" ]; } diff --git a/domains/no-one-is.nix b/domains/no-one-is.nix index 8fcb680..391d7e6 100644 --- a/domains/no-one-is.nix +++ b/domains/no-one-is.nix @@ -1,9 +1,5 @@ -{ dns, ... }: let - owner = { - username = "EducatedSuddenBucket"; - email = "me@esb.is-a.dev"; - }; - proxy = false; -in with dns.lib.combinators; { +{ dns, ... }: +with dns.lib.combinators; +{ CNAME = [ "educatedsuddenbucket-github-io.onrender.com." ]; } diff --git a/domains/pxl.nix b/domains/pxl.nix index 2b3bce0..0076d71 100644 --- a/domains/pxl.nix +++ b/domains/pxl.nix @@ -1,8 +1,5 @@ -{ dns, ... }: let - owner = { - username = "heypxl"; - }; - proxy = false; -in with dns.lib.combinators; { +{ dns, ... }: +with dns.lib.combinators; +{ CNAME = [ "heypxl.github.io." ]; } diff --git a/domains/rchessauth.nix b/domains/rchessauth.nix index 6ddd4c4..9b7f17f 100644 --- a/domains/rchessauth.nix +++ b/domains/rchessauth.nix @@ -1,8 +1,5 @@ -{ dns, ... }: let - owner = { - username = "vortexprime24"; - }; - proxy = false; -in with dns.lib.combinators; { +{ dns, ... }: +with dns.lib.combinators; +{ CNAME = [ "fire.hackclub.app." ]; } diff --git a/domains/roki.nix b/domains/roki.nix index 43d30e6..9ecb30a 100644 --- a/domains/roki.nix +++ b/domains/roki.nix @@ -1,9 +1,5 @@ -{ dns, ... }: let - owner = { - username = "Roki100"; - discord = "289479495444987904"; - }; - proxy = false; -in with dns.lib.combinators; { +{ dns, ... }: +with dns.lib.combinators; +{ CNAME = [ "edge.redirect.pizza." ]; } diff --git a/domains/satr14.nix b/domains/satr14.nix index fa6e690..cfc5b01 100644 --- a/domains/satr14.nix +++ b/domains/satr14.nix @@ -1,7 +1,5 @@ -{ dns, ... }: let - owner = { - username = "satr14washere"; - }; -in with dns.lib.combinators; { +{ dns, ... }: +with dns.lib.combinators; +{ CNAME = [ "5th-site.pages.dev." ]; } diff --git a/domains/stef.nix b/domains/stef.nix index 88e3870..47f7470 100644 --- a/domains/stef.nix +++ b/domains/stef.nix @@ -1,9 +1,5 @@ -{ dns, ... }: let - owner = { - username = "Stef-00012"; - email = "admin@stefdp.lol"; - }; - proxy = false; -in with dns.lib.combinators; { +{ dns, ... }: +with dns.lib.combinators; +{ CNAME = [ "proxy.stefdp.lol." ]; } diff --git a/domains/ukriu.nix b/domains/ukriu.nix index bab016a..48bb496 100644 --- a/domains/ukriu.nix +++ b/domains/ukriu.nix @@ -1,10 +1,5 @@ -{ dns, ... }: let - owner = { - username = "ukriu"; - email = "partofmyid@ukriu.com"; - }; - description = "my website"; - proxy = false; -in with dns.lib.combinators; { +{ dns, ... }: +with dns.lib.combinators; +{ CNAME = [ "ukriu.pages.dev." ]; } diff --git a/domains/you-are.nix b/domains/you-are.nix index 3cad0e8..914193f 100644 --- a/domains/you-are.nix +++ b/domains/you-are.nix @@ -1,9 +1,5 @@ -{ dns, ... }: let - owner = { - username = "Stef-00012"; - email = "admin@stefdp.com"; - }; - proxy = false; -in with dns.lib.combinators; { +{ dns, ... }: +with dns.lib.combinators; +{ CNAME = [ "proxy.stefdp.com." ]; } diff --git a/flake.nix b/flake.nix index 9dd8906..e5b61ba 100644 --- a/flake.nix +++ b/flake.nix @@ -2,32 +2,37 @@ description = "Zone File Generator"; inputs.dns.url = "github:nix-community/dns.nix"; - outputs = { dns, ... }: let - email = "admin@satr14.my.id"; - domains."0" = { - domain = "part-of.my.id"; - nameservers = [ - "adele.ns.cloudflare.com" - "fattouche.ns.cloudflare.com" - ]; + outputs = + { dns, ... }: + let + email = "admin@satr14.my.id"; + domains."0" = { + domain = "part-of.my.id"; + nameservers = [ + "adele.ns.cloudflare.com" + "fattouche.ns.cloudflare.com" + ]; + }; + in + { + packages.x86_64-linux = builtins.mapAttrs ( + _: domain: + dns.util.x86_64-linux.writeZone domain.domain ( + with dns.lib.combinators; + { + SOA = { + adminEmail = email; + nameServer = builtins.head domain.nameservers; + serial = builtins.currentTime; + }; + NS = domain.nameservers; + + # note: Cloudflare ignores SOA and NS records uploaded via Zone File, they are included just so that dns.nix builds a valid zone file. + + #subdomains = ; + # ^^ todo: implement file imports from ./domains + } + ) + ) domains; }; - in { - packages.x86_64-linux = builtins.mapAttrs (_: domain: - dns.util.x86_64-linux.writeZone domain.domain ( - with dns.lib.combinators; { - SOA = { - adminEmail = email; - nameServer = builtins.head domain.nameservers; - serial = builtins.currentTime; - }; - NS = domain.nameservers; - - # note: Cloudflare ignores SOA and NS records uploaded via Zone File, they are included just so that dns.nix builds a valid zone file. - - #subdomains = ; - # ^^ todo: implement file imports from ./domains - } - ) - ) domains; - }; -} \ No newline at end of file +} From 291bc39a7affb0782a309c2b78a40880381d141f Mon Sep 17 00:00:00 2001 From: orangc Date: Sat, 21 Mar 2026 16:52:05 +0300 Subject: [PATCH 6/8] feat(nix): recursively import domain files via mapping --- flake.nix | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/flake.nix b/flake.nix index e5b61ba..c35e986 100644 --- a/flake.nix +++ b/flake.nix @@ -13,6 +13,21 @@ "fattouche.ns.cloudflare.com" ]; }; + + domains = builtins.readDir ./domains; + domainFiles = builtins.filterAttrs ( + name: type: type == "regular" && builtins.match ".*\\.nix" name != null + ) domains; + subdomains = builtins.mapAttrs' ( + name: _: + let + key = builtins.replaceStrings [ ".nix" ] [ "" ] name; + in + { + name = key; + value = import (./domains + "/${name}") { inherit dns; }; + } + ) domainFiles; in { packages.x86_64-linux = builtins.mapAttrs ( @@ -29,8 +44,7 @@ # note: Cloudflare ignores SOA and NS records uploaded via Zone File, they are included just so that dns.nix builds a valid zone file. - #subdomains = ; - # ^^ todo: implement file imports from ./domains + inherit subdomains; } ) ) domains; From 20ebb7da08220d167425d4d3e91f33d3ba70efaa Mon Sep 17 00:00:00 2001 From: orangc Date: Sat, 21 Mar 2026 17:05:14 +0300 Subject: [PATCH 7/8] fix(nix): importing thing was brokeb --- flake.nix | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/flake.nix b/flake.nix index c35e986..b442857 100644 --- a/flake.nix +++ b/flake.nix @@ -14,11 +14,13 @@ ]; }; - domains = builtins.readDir ./domains; - domainFiles = builtins.filterAttrs ( + inherit (import { }) lib; + + domainsFolder = builtins.readDir ./domains; + domainFiles = lib.filterAttrs ( name: type: type == "regular" && builtins.match ".*\\.nix" name != null - ) domains; - subdomains = builtins.mapAttrs' ( + ) domainsFolder; + subdomains = lib.mapAttrs' ( name: _: let key = builtins.replaceStrings [ ".nix" ] [ "" ] name; From 3fac80dcfc7d30e00f992a317b9afa5e3df11914 Mon Sep 17 00:00:00 2001 From: orangci Date: Sat, 21 Mar 2026 17:09:29 +0300 Subject: [PATCH 8/8] Revert "Nix" --- docs/example.nix | 35 +++++--------- domains/_discord.colin.nix | 10 ++-- domains/_discord.cutedog5695.nix | 11 +++-- domains/_discord.justdeveloper.nix | 11 +++-- domains/_discord.nix | 9 ++-- domains/_discord.roki.nix | 9 ++-- domains/batman.nix | 9 ++-- domains/c.nix | 10 ++-- domains/colin.nix | 10 ++-- domains/cutedog5695.nix | 11 +++-- domains/elkaff.nix | 8 ++-- domains/j.nix | 11 +++-- domains/jacob.nix | 9 ++-- domains/jd.nix | 11 +++-- domains/job.nix | 9 ++-- domains/joel.nix | 10 ++-- domains/js.nix | 11 +++-- domains/just.nix | 11 +++-- domains/justdev.nix | 11 +++-- domains/justdeveloper.nix | 11 +++-- domains/juststudio.nix | 11 +++-- domains/katz.nix | 9 ++-- domains/no-one-is.nix | 10 ++-- domains/pxl.nix | 9 ++-- domains/rchessauth.nix | 9 ++-- domains/roki.nix | 10 ++-- domains/satr14.nix | 8 ++-- domains/stef.nix | 10 ++-- domains/ukriu.nix | 11 +++-- domains/you-are.nix | 10 ++-- flake.nix | 77 +++++++++++------------------- 31 files changed, 241 insertions(+), 160 deletions(-) diff --git a/docs/example.nix b/docs/example.nix index bd700f3..5a58fe9 100644 --- a/docs/example.nix +++ b/docs/example.nix @@ -1,11 +1,12 @@ -{ dns, ... }: -with dns.lib.combinators; -{ +{ dns, ... }: let + owner = { + username = "satr14washere"; + email = "admin@satr14.my.id"; + }; + proxy = false; +in with dns.lib.combinators; { A = [ - { - address = "203.0.113.1"; - ttl = 60 * 60; - } + { address = "203.0.113.1"; ttl = 60 * 60; } "203.0.113.2" (ttl (60 * 60) (a "203.0.113.3")) ]; @@ -17,13 +18,7 @@ with dns.lib.combinators; MX = mx.google; TXT = [ - ( - with spf; - strict [ - "a:mail.example.com" - google - ] - ) + (with spf; strict [ "a:mail.example.com" google ]) ]; DMARC = [ (dmarc.postmarkapp "mailto:re+abcdefghijk@dmarc.postmarkapp.com") ]; @@ -53,16 +48,8 @@ with dns.lib.combinators; { svcPriority = 1; targetName = "."; - alpn = [ - "http/1.1" - "h2" - "h3" - ]; - ipv4hint = [ - "203.0.113.1" - "203.0.113.2" - "203.0.113.3" - ]; + alpn = [ "http/1.1" "h2" "h3" ]; + ipv4hint = [ "203.0.113.1" "203.0.113.2" "203.0.113.3" ]; ipv6hint = [ "4321:0:1:2:3:4:567:89ab" ]; } ]; diff --git a/domains/_discord.colin.nix b/domains/_discord.colin.nix index aff9a5d..e107e70 100644 --- a/domains/_discord.colin.nix +++ b/domains/_discord.colin.nix @@ -1,5 +1,9 @@ -{ dns, ... }: -with dns.lib.combinators; -{ +{ dns, ... }: let + owner = { + username = "ColinLeDev"; + }; + description = "Discord verification"; + proxy = false; +in with dns.lib.combinators; { TXT = [ "dh=279643a6f8677dedb1c5c63d007fc4516149679c" ]; } diff --git a/domains/_discord.cutedog5695.nix b/domains/_discord.cutedog5695.nix index 597ab61..8b6e78e 100644 --- a/domains/_discord.cutedog5695.nix +++ b/domains/_discord.cutedog5695.nix @@ -1,5 +1,10 @@ -{ dns, ... }: -with dns.lib.combinators; -{ +{ dns, ... }: let + owner = { + username = "CuteDog5695"; + email = "cutedog5695@gmail.com"; + repo = "https://github.com/CuteDog5695/cutedog5695.github.io"; + }; + proxy = false; +in with dns.lib.combinators; { TXT = [ "dh=a7c19efb0f6bc38b97a33760f6c1ee84df4151b1" ]; } diff --git a/domains/_discord.justdeveloper.nix b/domains/_discord.justdeveloper.nix index a7ac99e..c1025bb 100644 --- a/domains/_discord.justdeveloper.nix +++ b/domains/_discord.justdeveloper.nix @@ -1,5 +1,10 @@ -{ dns, ... }: -with dns.lib.combinators; -{ +{ dns, ... }: let + owner = { + username = "JustDeveloper1"; + email = "justdeveloper@juststudio.is-a.dev"; + repo = "https://github.com/JustDeveloper1/Website"; + }; + proxy = false; +in with dns.lib.combinators; { TXT = [ "dh=6024027bc233825451e290ac37a4b4a1f838ee70" ]; } diff --git a/domains/_discord.nix b/domains/_discord.nix index 95090d8..ee3009d 100644 --- a/domains/_discord.nix +++ b/domains/_discord.nix @@ -1,5 +1,8 @@ -{ dns, ... }: -with dns.lib.combinators; -{ +{ dns, ... }: let + owner = { + username = "satr14washere"; + }; + proxy = false; +in with dns.lib.combinators; { TXT = [ "dh=d509fc9014e196311ed887c2e410cdefa833436e" ]; } diff --git a/domains/_discord.roki.nix b/domains/_discord.roki.nix index 48e6a52..5b1d452 100644 --- a/domains/_discord.roki.nix +++ b/domains/_discord.roki.nix @@ -1,5 +1,8 @@ -{ dns, ... }: -with dns.lib.combinators; -{ +{ dns, ... }: let + owner = { + username = "Roki100"; + discord = "289479495444987904"; + }; +in with dns.lib.combinators; { TXT = [ "dh=5633078cd5bfd347a896ddb0f0de017c5423aa06" ]; } diff --git a/domains/batman.nix b/domains/batman.nix index 3b6202d..0ad04bd 100644 --- a/domains/batman.nix +++ b/domains/batman.nix @@ -1,5 +1,8 @@ -{ dns, ... }: -with dns.lib.combinators; -{ +{ dns, ... }: let + owner = { + username = "shadowe1ite"; + }; + proxy = true; +in with dns.lib.combinators; { CNAME = [ "shadowe1ite.github.io." ]; } diff --git a/domains/c.nix b/domains/c.nix index 9ecb30a..bed0b01 100644 --- a/domains/c.nix +++ b/domains/c.nix @@ -1,5 +1,9 @@ -{ dns, ... }: -with dns.lib.combinators; -{ +{ dns, ... }: let + owner = { + username = "orangci"; + email = "c@orangc.xyz"; + }; + proxy = false; +in with dns.lib.combinators; { CNAME = [ "edge.redirect.pizza." ]; } diff --git a/domains/colin.nix b/domains/colin.nix index 4fe7a4a..277aba7 100644 --- a/domains/colin.nix +++ b/domains/colin.nix @@ -1,5 +1,9 @@ -{ dns, ... }: -with dns.lib.combinators; -{ +{ dns, ... }: let + owner = { + username = "ColinLeDev"; + }; + description = "My personal portfolio hosted on my server"; + proxy = false; +in with dns.lib.combinators; { CNAME = [ "proxy.col1n.fr." ]; } diff --git a/domains/cutedog5695.nix b/domains/cutedog5695.nix index 9ecb30a..f20329f 100644 --- a/domains/cutedog5695.nix +++ b/domains/cutedog5695.nix @@ -1,5 +1,10 @@ -{ dns, ... }: -with dns.lib.combinators; -{ +{ dns, ... }: let + owner = { + username = "CuteDog5695"; + email = "cutedog5695@gmail.com"; + repo = "https://github.com/CuteDog5695/cutedog5695.github.io"; + }; + proxy = false; +in with dns.lib.combinators; { CNAME = [ "edge.redirect.pizza." ]; } diff --git a/domains/elkaff.nix b/domains/elkaff.nix index 109e65c..9ead547 100644 --- a/domains/elkaff.nix +++ b/domains/elkaff.nix @@ -1,5 +1,7 @@ -{ dns, ... }: -with dns.lib.combinators; -{ +{ dns, ... }: let + owner = { + username = "elkhaff"; + }; +in with dns.lib.combinators; { CNAME = [ "portofolio-pixel.pages.dev." ]; } diff --git a/domains/j.nix b/domains/j.nix index 9ecb30a..8cd38c6 100644 --- a/domains/j.nix +++ b/domains/j.nix @@ -1,5 +1,10 @@ -{ dns, ... }: -with dns.lib.combinators; -{ +{ dns, ... }: let + owner = { + username = "JustDeveloper1"; + email = "support@juststudio.is-a.dev"; + repo = "https://github.com/JustStudio7/Website"; + }; + proxy = false; +in with dns.lib.combinators; { CNAME = [ "edge.redirect.pizza." ]; } diff --git a/domains/jacob.nix b/domains/jacob.nix index 34c1508..46839f9 100644 --- a/domains/jacob.nix +++ b/domains/jacob.nix @@ -1,5 +1,8 @@ -{ dns, ... }: -with dns.lib.combinators; -{ +{ dns, ... }: let + owner = { + username = "jacobrdale"; + }; + proxy = false; +in with dns.lib.combinators; { CNAME = [ "hexon404.onrender.com." ]; } diff --git a/domains/jd.nix b/domains/jd.nix index 9ecb30a..4555867 100644 --- a/domains/jd.nix +++ b/domains/jd.nix @@ -1,5 +1,10 @@ -{ dns, ... }: -with dns.lib.combinators; -{ +{ dns, ... }: let + owner = { + username = "JustDeveloper1"; + email = "justdeveloper@juststudio.is-a.dev"; + repo = "https://github.com/JustDeveloper1/Website"; + }; + proxy = false; +in with dns.lib.combinators; { CNAME = [ "edge.redirect.pizza." ]; } diff --git a/domains/job.nix b/domains/job.nix index df2d227..c2623ab 100644 --- a/domains/job.nix +++ b/domains/job.nix @@ -1,5 +1,8 @@ -{ dns, ... }: -with dns.lib.combinators; -{ +{ dns, ... }: let + owner = { + username = "FWEEaaaa1"; + }; + proxy = false; +in with dns.lib.combinators; { A = [ "128.204.223.115" ]; } diff --git a/domains/joel.nix b/domains/joel.nix index c5af765..f1ad335 100644 --- a/domains/joel.nix +++ b/domains/joel.nix @@ -1,6 +1,10 @@ -{ dns, ... }: -with dns.lib.combinators; -{ +{ dns, ... }: let + owner = { + username = "joestr"; + email = "strasser999@gmail.com"; + }; + proxy = false; +in with dns.lib.combinators; { A = [ "142.132.173.34" ]; AAAA = [ "2a01:4f8:1c0c:6cc0::1" ]; MX = [ diff --git a/domains/js.nix b/domains/js.nix index 9ecb30a..8cd38c6 100644 --- a/domains/js.nix +++ b/domains/js.nix @@ -1,5 +1,10 @@ -{ dns, ... }: -with dns.lib.combinators; -{ +{ dns, ... }: let + owner = { + username = "JustDeveloper1"; + email = "support@juststudio.is-a.dev"; + repo = "https://github.com/JustStudio7/Website"; + }; + proxy = false; +in with dns.lib.combinators; { CNAME = [ "edge.redirect.pizza." ]; } diff --git a/domains/just.nix b/domains/just.nix index 9ecb30a..4555867 100644 --- a/domains/just.nix +++ b/domains/just.nix @@ -1,5 +1,10 @@ -{ dns, ... }: -with dns.lib.combinators; -{ +{ dns, ... }: let + owner = { + username = "JustDeveloper1"; + email = "justdeveloper@juststudio.is-a.dev"; + repo = "https://github.com/JustDeveloper1/Website"; + }; + proxy = false; +in with dns.lib.combinators; { CNAME = [ "edge.redirect.pizza." ]; } diff --git a/domains/justdev.nix b/domains/justdev.nix index 9ecb30a..4555867 100644 --- a/domains/justdev.nix +++ b/domains/justdev.nix @@ -1,5 +1,10 @@ -{ dns, ... }: -with dns.lib.combinators; -{ +{ dns, ... }: let + owner = { + username = "JustDeveloper1"; + email = "justdeveloper@juststudio.is-a.dev"; + repo = "https://github.com/JustDeveloper1/Website"; + }; + proxy = false; +in with dns.lib.combinators; { CNAME = [ "edge.redirect.pizza." ]; } diff --git a/domains/justdeveloper.nix b/domains/justdeveloper.nix index 9ecb30a..4555867 100644 --- a/domains/justdeveloper.nix +++ b/domains/justdeveloper.nix @@ -1,5 +1,10 @@ -{ dns, ... }: -with dns.lib.combinators; -{ +{ dns, ... }: let + owner = { + username = "JustDeveloper1"; + email = "justdeveloper@juststudio.is-a.dev"; + repo = "https://github.com/JustDeveloper1/Website"; + }; + proxy = false; +in with dns.lib.combinators; { CNAME = [ "edge.redirect.pizza." ]; } diff --git a/domains/juststudio.nix b/domains/juststudio.nix index 9ecb30a..8cd38c6 100644 --- a/domains/juststudio.nix +++ b/domains/juststudio.nix @@ -1,5 +1,10 @@ -{ dns, ... }: -with dns.lib.combinators; -{ +{ dns, ... }: let + owner = { + username = "JustDeveloper1"; + email = "support@juststudio.is-a.dev"; + repo = "https://github.com/JustStudio7/Website"; + }; + proxy = false; +in with dns.lib.combinators; { CNAME = [ "edge.redirect.pizza." ]; } diff --git a/domains/katz.nix b/domains/katz.nix index 0751913..c369c96 100644 --- a/domains/katz.nix +++ b/domains/katz.nix @@ -1,5 +1,8 @@ -{ dns, ... }: -with dns.lib.combinators; -{ +{ dns, ... }: let + owner = { + username = "Bananalolok"; + }; + proxy = false; +in with dns.lib.combinators; { A = [ "69.197.135.205" ]; } diff --git a/domains/no-one-is.nix b/domains/no-one-is.nix index 391d7e6..8fcb680 100644 --- a/domains/no-one-is.nix +++ b/domains/no-one-is.nix @@ -1,5 +1,9 @@ -{ dns, ... }: -with dns.lib.combinators; -{ +{ dns, ... }: let + owner = { + username = "EducatedSuddenBucket"; + email = "me@esb.is-a.dev"; + }; + proxy = false; +in with dns.lib.combinators; { CNAME = [ "educatedsuddenbucket-github-io.onrender.com." ]; } diff --git a/domains/pxl.nix b/domains/pxl.nix index 0076d71..2b3bce0 100644 --- a/domains/pxl.nix +++ b/domains/pxl.nix @@ -1,5 +1,8 @@ -{ dns, ... }: -with dns.lib.combinators; -{ +{ dns, ... }: let + owner = { + username = "heypxl"; + }; + proxy = false; +in with dns.lib.combinators; { CNAME = [ "heypxl.github.io." ]; } diff --git a/domains/rchessauth.nix b/domains/rchessauth.nix index 9b7f17f..6ddd4c4 100644 --- a/domains/rchessauth.nix +++ b/domains/rchessauth.nix @@ -1,5 +1,8 @@ -{ dns, ... }: -with dns.lib.combinators; -{ +{ dns, ... }: let + owner = { + username = "vortexprime24"; + }; + proxy = false; +in with dns.lib.combinators; { CNAME = [ "fire.hackclub.app." ]; } diff --git a/domains/roki.nix b/domains/roki.nix index 9ecb30a..43d30e6 100644 --- a/domains/roki.nix +++ b/domains/roki.nix @@ -1,5 +1,9 @@ -{ dns, ... }: -with dns.lib.combinators; -{ +{ dns, ... }: let + owner = { + username = "Roki100"; + discord = "289479495444987904"; + }; + proxy = false; +in with dns.lib.combinators; { CNAME = [ "edge.redirect.pizza." ]; } diff --git a/domains/satr14.nix b/domains/satr14.nix index cfc5b01..fa6e690 100644 --- a/domains/satr14.nix +++ b/domains/satr14.nix @@ -1,5 +1,7 @@ -{ dns, ... }: -with dns.lib.combinators; -{ +{ dns, ... }: let + owner = { + username = "satr14washere"; + }; +in with dns.lib.combinators; { CNAME = [ "5th-site.pages.dev." ]; } diff --git a/domains/stef.nix b/domains/stef.nix index 47f7470..88e3870 100644 --- a/domains/stef.nix +++ b/domains/stef.nix @@ -1,5 +1,9 @@ -{ dns, ... }: -with dns.lib.combinators; -{ +{ dns, ... }: let + owner = { + username = "Stef-00012"; + email = "admin@stefdp.lol"; + }; + proxy = false; +in with dns.lib.combinators; { CNAME = [ "proxy.stefdp.lol." ]; } diff --git a/domains/ukriu.nix b/domains/ukriu.nix index 48bb496..bab016a 100644 --- a/domains/ukriu.nix +++ b/domains/ukriu.nix @@ -1,5 +1,10 @@ -{ dns, ... }: -with dns.lib.combinators; -{ +{ dns, ... }: let + owner = { + username = "ukriu"; + email = "partofmyid@ukriu.com"; + }; + description = "my website"; + proxy = false; +in with dns.lib.combinators; { CNAME = [ "ukriu.pages.dev." ]; } diff --git a/domains/you-are.nix b/domains/you-are.nix index 914193f..3cad0e8 100644 --- a/domains/you-are.nix +++ b/domains/you-are.nix @@ -1,5 +1,9 @@ -{ dns, ... }: -with dns.lib.combinators; -{ +{ dns, ... }: let + owner = { + username = "Stef-00012"; + email = "admin@stefdp.com"; + }; + proxy = false; +in with dns.lib.combinators; { CNAME = [ "proxy.stefdp.com." ]; } diff --git a/flake.nix b/flake.nix index b442857..9dd8906 100644 --- a/flake.nix +++ b/flake.nix @@ -2,53 +2,32 @@ description = "Zone File Generator"; inputs.dns.url = "github:nix-community/dns.nix"; - outputs = - { dns, ... }: - let - email = "admin@satr14.my.id"; - domains."0" = { - domain = "part-of.my.id"; - nameservers = [ - "adele.ns.cloudflare.com" - "fattouche.ns.cloudflare.com" - ]; - }; - - inherit (import { }) lib; - - domainsFolder = builtins.readDir ./domains; - domainFiles = lib.filterAttrs ( - name: type: type == "regular" && builtins.match ".*\\.nix" name != null - ) domainsFolder; - subdomains = lib.mapAttrs' ( - name: _: - let - key = builtins.replaceStrings [ ".nix" ] [ "" ] name; - in - { - name = key; - value = import (./domains + "/${name}") { inherit dns; }; - } - ) domainFiles; - in - { - packages.x86_64-linux = builtins.mapAttrs ( - _: domain: - dns.util.x86_64-linux.writeZone domain.domain ( - with dns.lib.combinators; - { - SOA = { - adminEmail = email; - nameServer = builtins.head domain.nameservers; - serial = builtins.currentTime; - }; - NS = domain.nameservers; - - # note: Cloudflare ignores SOA and NS records uploaded via Zone File, they are included just so that dns.nix builds a valid zone file. - - inherit subdomains; - } - ) - ) domains; + outputs = { dns, ... }: let + email = "admin@satr14.my.id"; + domains."0" = { + domain = "part-of.my.id"; + nameservers = [ + "adele.ns.cloudflare.com" + "fattouche.ns.cloudflare.com" + ]; }; -} + in { + packages.x86_64-linux = builtins.mapAttrs (_: domain: + dns.util.x86_64-linux.writeZone domain.domain ( + with dns.lib.combinators; { + SOA = { + adminEmail = email; + nameServer = builtins.head domain.nameservers; + serial = builtins.currentTime; + }; + NS = domain.nameservers; + + # note: Cloudflare ignores SOA and NS records uploaded via Zone File, they are included just so that dns.nix builds a valid zone file. + + #subdomains = ; + # ^^ todo: implement file imports from ./domains + } + ) + ) domains; + }; +} \ No newline at end of file