+40
-40
_sources/generated.json
+40
-40
_sources/generated.json
···
22
22
},
23
23
"blog": {
24
24
"cargoLocks": null,
25
-
"date": "2025-12-15",
25
+
"date": "2025-12-26",
26
26
"extract": null,
27
27
"name": "blog",
28
28
"passthru": null,
···
32
32
"fetchSubmodules": false,
33
33
"leaveDotGit": false,
34
34
"name": null,
35
-
"rev": "79ec1f7c30198c7406271c92a3a522849a23c6ff",
36
-
"sha256": "sha256-uF2W+YaZmJOIXTclraoc69MmqRxNXcmBFBB41o8DTGE=",
35
+
"rev": "95c18d69c811a6483df1a2c6b727f696db39858e",
36
+
"sha256": "sha256-VeX7C0PQdhQu14xxeCftFUFWO7MhssvulC319s82Jt4=",
37
37
"sparseCheckout": [],
38
38
"type": "git",
39
39
"url": "https://tangled.org/@ptr.pet/endpoint"
40
40
},
41
-
"version": "79ec1f7c30198c7406271c92a3a522849a23c6ff"
41
+
"version": "95c18d69c811a6483df1a2c6b727f696db39858e"
42
42
},
43
43
"clickee": {
44
44
"cargoLocks": null,
···
103
103
},
104
104
"dysnomia": {
105
105
"cargoLocks": null,
106
-
"date": "2025-12-20",
106
+
"date": "2025-12-22",
107
107
"extract": null,
108
108
"name": "dysnomia",
109
109
"passthru": null,
···
113
113
"fetchSubmodules": false,
114
114
"leaveDotGit": false,
115
115
"name": null,
116
-
"rev": "d1855bfba2ef14c1d612cbe9611c1811e870384c",
117
-
"sha256": "sha256-0aPQH8tfSYdYlc8EKiHifWXW7iJlBg+tjdfFBxjjsSY=",
116
+
"rev": "1f371223d2ffe80385c63119b325d8da7a4c7e7e",
117
+
"sha256": "sha256-hUFMvmKEO65yw8Igkf4323t6uvKukaojQMNm+8tN4rc=",
118
118
"sparseCheckout": [],
119
119
"type": "git",
120
120
"url": "https://tangled.org/@ptr.pet/dysnomia"
121
121
},
122
-
"version": "d1855bfba2ef14c1d612cbe9611c1811e870384c"
122
+
"version": "1f371223d2ffe80385c63119b325d8da7a4c7e7e"
123
123
},
124
124
"facter": {
125
125
"cargoLocks": null,
126
-
"date": "2025-12-11",
126
+
"date": "2025-12-24",
127
127
"extract": null,
128
128
"name": "facter",
129
129
"passthru": null,
···
135
135
"name": null,
136
136
"owner": "nix-community",
137
137
"repo": "nixos-facter-modules",
138
-
"rev": "9dd775ee92de63f14edd021d59416e18ac2c00f1",
139
-
"sha256": "sha256-k3lYQ+A1F7aTz8HnlU++bd9t/x/NP2A4v9+x6opcVg0=",
138
+
"rev": "e796d536e3d83de74267069e179dc620a608ed7d",
139
+
"sha256": "sha256-Ud9v49ZPsoDBFuyJSQ2Mpw1ZgAH/aMwUwwzrVoetNus=",
140
140
"sparseCheckout": [],
141
141
"type": "github"
142
142
},
143
-
"version": "9dd775ee92de63f14edd021d59416e18ac2c00f1"
143
+
"version": "e796d536e3d83de74267069e179dc620a608ed7d"
144
144
},
145
145
"gomod2nix": {
146
146
"cargoLocks": null,
···
165
165
},
166
166
"home": {
167
167
"cargoLocks": null,
168
-
"date": "2025-12-19",
168
+
"date": "2025-12-27",
169
169
"extract": null,
170
170
"name": "home",
171
171
"passthru": null,
···
177
177
"name": null,
178
178
"owner": "nix-community",
179
179
"repo": "home-manager",
180
-
"rev": "bb35f07cc95a73aacbaf1f7f46bb8a3f40f265b5",
181
-
"sha256": "sha256-47Ee0bTidhF/3/sHuYnWRuxcCrrm0mBNDxBkOTd3wWQ=",
180
+
"rev": "4067ca1ffb6425b8597eafb63a84b171e0192d2b",
181
+
"sha256": "sha256-Ok0jocJ82JriaMDtYEytR8oWcxADlX5WcWXULrN4czA=",
182
182
"sparseCheckout": [],
183
183
"type": "github"
184
184
},
185
-
"version": "bb35f07cc95a73aacbaf1f7f46bb8a3f40f265b5"
185
+
"version": "4067ca1ffb6425b8597eafb63a84b171e0192d2b"
186
186
},
187
187
"limbusart": {
188
188
"cargoLocks": null,
···
247
247
},
248
248
"nixos-hardware": {
249
249
"cargoLocks": null,
250
-
"date": "2025-11-29",
250
+
"date": "2025-12-24",
251
251
"extract": null,
252
252
"name": "nixos-hardware",
253
253
"passthru": null,
···
259
259
"name": null,
260
260
"owner": "NixOS",
261
261
"repo": "nixos-hardware",
262
-
"rev": "9154f4569b6cdfd3c595851a6ba51bfaa472d9f3",
263
-
"sha256": "sha256-ZlJTNLUKQRANlLDomuRWLBCH5792x+6XUJ4YdFRjtO4=",
262
+
"rev": "c5db9569ac9cc70929c268ac461f4003e3e5ca80",
263
+
"sha256": "sha256-UXVtN77D7pzKmzOotFTStgZBqpOcf8cO95FcupWp4Zo=",
264
264
"sparseCheckout": [],
265
265
"type": "github"
266
266
},
267
-
"version": "9154f4569b6cdfd3c595851a6ba51bfaa472d9f3"
267
+
"version": "c5db9569ac9cc70929c268ac461f4003e3e5ca80"
268
268
},
269
269
"nixpkgs-xr": {
270
270
"cargoLocks": null,
271
-
"date": "2025-12-20",
271
+
"date": "2025-12-24",
272
272
"extract": null,
273
273
"name": "nixpkgs-xr",
274
274
"passthru": null,
···
280
280
"name": null,
281
281
"owner": "nix-community",
282
282
"repo": "nixpkgs-xr",
283
-
"rev": "22697a0c10b5c368ce55a84f99daa6aef57d4d15",
284
-
"sha256": "sha256-jiP171U1n5pfU4lhWz5TgyDsAqc2ksE5coHP3Hmk32w=",
283
+
"rev": "9e8efcd2c4ea906772dea99204a9819284a29b81",
284
+
"sha256": "sha256-biwvZsCGC4vCXS6rzs3tUkELqqEXPko0E3R9IhYKavE=",
285
285
"sparseCheckout": [],
286
286
"type": "github"
287
287
},
288
-
"version": "22697a0c10b5c368ce55a84f99daa6aef57d4d15"
288
+
"version": "9e8efcd2c4ea906772dea99204a9819284a29b81"
289
289
},
290
290
"nsid-tracker": {
291
291
"cargoLocks": null,
···
309
309
},
310
310
"nucleus": {
311
311
"cargoLocks": null,
312
-
"date": "2025-11-11",
312
+
"date": "2025-12-27",
313
313
"extract": null,
314
314
"name": "nucleus",
315
315
"passthru": null,
···
319
319
"fetchSubmodules": false,
320
320
"leaveDotGit": false,
321
321
"name": null,
322
-
"rev": "a4f73517c1a76ed20b55f21618148b8afe0fa838",
323
-
"sha256": "sha256-8WrGAr+aCIFCFuixtH1BSB5lMn+d/FqXsEFAmXY3HkU=",
322
+
"rev": "2ad7bd0b2710896cdf31638c32ceacc02a226726",
323
+
"sha256": "sha256-AXZhPcOvCCwFhntqLoZZtyaNTV6RQeS7I74RFzmFeiM=",
324
324
"sparseCheckout": [],
325
325
"type": "git",
326
326
"url": "https://tangled.org/@ptr.pet/nucleus"
327
327
},
328
-
"version": "a4f73517c1a76ed20b55f21618148b8afe0fa838"
328
+
"version": "2ad7bd0b2710896cdf31638c32ceacc02a226726"
329
329
},
330
330
"stylix": {
331
331
"cargoLocks": null,
332
-
"date": "2025-12-16",
332
+
"date": "2025-12-24",
333
333
"extract": null,
334
334
"name": "stylix",
335
335
"passthru": null,
···
341
341
"name": null,
342
342
"owner": "nix-community",
343
343
"repo": "stylix",
344
-
"rev": "e6829552d4bb659ebab00f08c61d8c62754763f3",
345
-
"sha256": "sha256-NgTRxiEC5y96zrhdBygnY+mSzk5FWMML39PcRGVJmxg=",
344
+
"rev": "551df12ee3ebac52c5712058bd97fd9faa4c3430",
345
+
"sha256": "sha256-J2DDdRqSU4w9NNgkMfmMeaLIof5PXtS9RG7y6ckDvQE=",
346
346
"sparseCheckout": [],
347
347
"type": "github"
348
348
},
349
-
"version": "e6829552d4bb659ebab00f08c61d8c62754763f3"
349
+
"version": "551df12ee3ebac52c5712058bd97fd9faa4c3430"
350
350
},
351
351
"tangled": {
352
352
"cargoLocks": null,
···
384
384
},
385
385
"trill": {
386
386
"cargoLocks": null,
387
-
"date": "2025-11-25",
387
+
"date": "2025-12-25",
388
388
"extract": null,
389
389
"name": "trill",
390
390
"passthru": null,
···
394
394
"fetchSubmodules": false,
395
395
"leaveDotGit": false,
396
396
"name": null,
397
-
"rev": "c9604685156e009cebd0ddc3b31672455f635387",
398
-
"sha256": "sha256-so9EHN0GQ7rFSmnLnpRap2RqRcklhe3C1HdyAKeR6No=",
397
+
"rev": "d395ba493b4735f82db9ce99c7e7e8b671b38225",
398
+
"sha256": "sha256-mxV02sfP7H2lv/xD9MkVHfp6F8dnYQly7rhTRpMEeiw=",
399
399
"sparseCheckout": [],
400
400
"type": "git",
401
401
"url": "https://tangled.org/@ptr.pet/trill"
402
402
},
403
-
"version": "c9604685156e009cebd0ddc3b31672455f635387"
403
+
"version": "d395ba493b4735f82db9ce99c7e7e8b671b38225"
404
404
},
405
405
"zen-browser": {
406
406
"cargoLocks": null,
407
-
"date": "2025-12-20",
407
+
"date": "2025-12-25",
408
408
"extract": null,
409
409
"name": "zen-browser",
410
410
"passthru": null,
···
416
416
"name": null,
417
417
"owner": "0xc000022070",
418
418
"repo": "zen-browser-flake",
419
-
"rev": "4563d0ffdf586368f1bec1a39cc20c9b12b73884",
420
-
"sha256": "sha256-NccmxYNOUHLLehsBLaeZ3QtVlDfIW1FDBe3W/kIDwa0=",
419
+
"rev": "98d8f48ba80a4b6e3b56addad850d57132301075",
420
+
"sha256": "sha256-mGZBEN67mxeOsBhplBRLm6L+y++8jU46EEUYgemG1aQ=",
421
421
"sparseCheckout": [],
422
422
"type": "github"
423
423
},
424
-
"version": "4563d0ffdf586368f1bec1a39cc20c9b12b73884"
424
+
"version": "98d8f48ba80a4b6e3b56addad850d57132301075"
425
425
}
426
426
}
+40
-40
_sources/generated.nix
+40
-40
_sources/generated.nix
···
15
15
};
16
16
blog = {
17
17
pname = "blog";
18
-
version = "79ec1f7c30198c7406271c92a3a522849a23c6ff";
18
+
version = "95c18d69c811a6483df1a2c6b727f696db39858e";
19
19
src = fetchgit {
20
20
url = "https://tangled.org/@ptr.pet/endpoint";
21
-
rev = "79ec1f7c30198c7406271c92a3a522849a23c6ff";
21
+
rev = "95c18d69c811a6483df1a2c6b727f696db39858e";
22
22
fetchSubmodules = false;
23
23
deepClone = false;
24
24
leaveDotGit = false;
25
25
sparseCheckout = [ ];
26
-
sha256 = "sha256-uF2W+YaZmJOIXTclraoc69MmqRxNXcmBFBB41o8DTGE=";
26
+
sha256 = "sha256-VeX7C0PQdhQu14xxeCftFUFWO7MhssvulC319s82Jt4=";
27
27
};
28
-
date = "2025-12-15";
28
+
date = "2025-12-26";
29
29
};
30
30
clickee = {
31
31
pname = "clickee";
···
69
69
};
70
70
dysnomia = {
71
71
pname = "dysnomia";
72
-
version = "d1855bfba2ef14c1d612cbe9611c1811e870384c";
72
+
version = "1f371223d2ffe80385c63119b325d8da7a4c7e7e";
73
73
src = fetchgit {
74
74
url = "https://tangled.org/@ptr.pet/dysnomia";
75
-
rev = "d1855bfba2ef14c1d612cbe9611c1811e870384c";
75
+
rev = "1f371223d2ffe80385c63119b325d8da7a4c7e7e";
76
76
fetchSubmodules = false;
77
77
deepClone = false;
78
78
leaveDotGit = false;
79
79
sparseCheckout = [ ];
80
-
sha256 = "sha256-0aPQH8tfSYdYlc8EKiHifWXW7iJlBg+tjdfFBxjjsSY=";
80
+
sha256 = "sha256-hUFMvmKEO65yw8Igkf4323t6uvKukaojQMNm+8tN4rc=";
81
81
};
82
-
date = "2025-12-20";
82
+
date = "2025-12-22";
83
83
};
84
84
facter = {
85
85
pname = "facter";
86
-
version = "9dd775ee92de63f14edd021d59416e18ac2c00f1";
86
+
version = "e796d536e3d83de74267069e179dc620a608ed7d";
87
87
src = fetchFromGitHub {
88
88
owner = "nix-community";
89
89
repo = "nixos-facter-modules";
90
-
rev = "9dd775ee92de63f14edd021d59416e18ac2c00f1";
90
+
rev = "e796d536e3d83de74267069e179dc620a608ed7d";
91
91
fetchSubmodules = false;
92
-
sha256 = "sha256-k3lYQ+A1F7aTz8HnlU++bd9t/x/NP2A4v9+x6opcVg0=";
92
+
sha256 = "sha256-Ud9v49ZPsoDBFuyJSQ2Mpw1ZgAH/aMwUwwzrVoetNus=";
93
93
};
94
-
date = "2025-12-11";
94
+
date = "2025-12-24";
95
95
};
96
96
gomod2nix = {
97
97
pname = "gomod2nix";
···
107
107
};
108
108
home = {
109
109
pname = "home";
110
-
version = "bb35f07cc95a73aacbaf1f7f46bb8a3f40f265b5";
110
+
version = "4067ca1ffb6425b8597eafb63a84b171e0192d2b";
111
111
src = fetchFromGitHub {
112
112
owner = "nix-community";
113
113
repo = "home-manager";
114
-
rev = "bb35f07cc95a73aacbaf1f7f46bb8a3f40f265b5";
114
+
rev = "4067ca1ffb6425b8597eafb63a84b171e0192d2b";
115
115
fetchSubmodules = false;
116
-
sha256 = "sha256-47Ee0bTidhF/3/sHuYnWRuxcCrrm0mBNDxBkOTd3wWQ=";
116
+
sha256 = "sha256-Ok0jocJ82JriaMDtYEytR8oWcxADlX5WcWXULrN4czA=";
117
117
};
118
-
date = "2025-12-19";
118
+
date = "2025-12-27";
119
119
};
120
120
limbusart = {
121
121
pname = "limbusart";
···
159
159
};
160
160
nixos-hardware = {
161
161
pname = "nixos-hardware";
162
-
version = "9154f4569b6cdfd3c595851a6ba51bfaa472d9f3";
162
+
version = "c5db9569ac9cc70929c268ac461f4003e3e5ca80";
163
163
src = fetchFromGitHub {
164
164
owner = "NixOS";
165
165
repo = "nixos-hardware";
166
-
rev = "9154f4569b6cdfd3c595851a6ba51bfaa472d9f3";
166
+
rev = "c5db9569ac9cc70929c268ac461f4003e3e5ca80";
167
167
fetchSubmodules = false;
168
-
sha256 = "sha256-ZlJTNLUKQRANlLDomuRWLBCH5792x+6XUJ4YdFRjtO4=";
168
+
sha256 = "sha256-UXVtN77D7pzKmzOotFTStgZBqpOcf8cO95FcupWp4Zo=";
169
169
};
170
-
date = "2025-11-29";
170
+
date = "2025-12-24";
171
171
};
172
172
nixpkgs-xr = {
173
173
pname = "nixpkgs-xr";
174
-
version = "22697a0c10b5c368ce55a84f99daa6aef57d4d15";
174
+
version = "9e8efcd2c4ea906772dea99204a9819284a29b81";
175
175
src = fetchFromGitHub {
176
176
owner = "nix-community";
177
177
repo = "nixpkgs-xr";
178
-
rev = "22697a0c10b5c368ce55a84f99daa6aef57d4d15";
178
+
rev = "9e8efcd2c4ea906772dea99204a9819284a29b81";
179
179
fetchSubmodules = false;
180
-
sha256 = "sha256-jiP171U1n5pfU4lhWz5TgyDsAqc2ksE5coHP3Hmk32w=";
180
+
sha256 = "sha256-biwvZsCGC4vCXS6rzs3tUkELqqEXPko0E3R9IhYKavE=";
181
181
};
182
-
date = "2025-12-20";
182
+
date = "2025-12-24";
183
183
};
184
184
nsid-tracker = {
185
185
pname = "nsid-tracker";
···
197
197
};
198
198
nucleus = {
199
199
pname = "nucleus";
200
-
version = "a4f73517c1a76ed20b55f21618148b8afe0fa838";
200
+
version = "2ad7bd0b2710896cdf31638c32ceacc02a226726";
201
201
src = fetchgit {
202
202
url = "https://tangled.org/@ptr.pet/nucleus";
203
-
rev = "a4f73517c1a76ed20b55f21618148b8afe0fa838";
203
+
rev = "2ad7bd0b2710896cdf31638c32ceacc02a226726";
204
204
fetchSubmodules = false;
205
205
deepClone = false;
206
206
leaveDotGit = false;
207
207
sparseCheckout = [ ];
208
-
sha256 = "sha256-8WrGAr+aCIFCFuixtH1BSB5lMn+d/FqXsEFAmXY3HkU=";
208
+
sha256 = "sha256-AXZhPcOvCCwFhntqLoZZtyaNTV6RQeS7I74RFzmFeiM=";
209
209
};
210
-
date = "2025-11-11";
210
+
date = "2025-12-27";
211
211
};
212
212
stylix = {
213
213
pname = "stylix";
214
-
version = "e6829552d4bb659ebab00f08c61d8c62754763f3";
214
+
version = "551df12ee3ebac52c5712058bd97fd9faa4c3430";
215
215
src = fetchFromGitHub {
216
216
owner = "nix-community";
217
217
repo = "stylix";
218
-
rev = "e6829552d4bb659ebab00f08c61d8c62754763f3";
218
+
rev = "551df12ee3ebac52c5712058bd97fd9faa4c3430";
219
219
fetchSubmodules = false;
220
-
sha256 = "sha256-NgTRxiEC5y96zrhdBygnY+mSzk5FWMML39PcRGVJmxg=";
220
+
sha256 = "sha256-J2DDdRqSU4w9NNgkMfmMeaLIof5PXtS9RG7y6ckDvQE=";
221
221
};
222
-
date = "2025-12-16";
222
+
date = "2025-12-24";
223
223
};
224
224
tangled = {
225
225
pname = "tangled";
···
245
245
};
246
246
trill = {
247
247
pname = "trill";
248
-
version = "c9604685156e009cebd0ddc3b31672455f635387";
248
+
version = "d395ba493b4735f82db9ce99c7e7e8b671b38225";
249
249
src = fetchgit {
250
250
url = "https://tangled.org/@ptr.pet/trill";
251
-
rev = "c9604685156e009cebd0ddc3b31672455f635387";
251
+
rev = "d395ba493b4735f82db9ce99c7e7e8b671b38225";
252
252
fetchSubmodules = false;
253
253
deepClone = false;
254
254
leaveDotGit = false;
255
255
sparseCheckout = [ ];
256
-
sha256 = "sha256-so9EHN0GQ7rFSmnLnpRap2RqRcklhe3C1HdyAKeR6No=";
256
+
sha256 = "sha256-mxV02sfP7H2lv/xD9MkVHfp6F8dnYQly7rhTRpMEeiw=";
257
257
};
258
-
date = "2025-11-25";
258
+
date = "2025-12-25";
259
259
};
260
260
zen-browser = {
261
261
pname = "zen-browser";
262
-
version = "4563d0ffdf586368f1bec1a39cc20c9b12b73884";
262
+
version = "98d8f48ba80a4b6e3b56addad850d57132301075";
263
263
src = fetchFromGitHub {
264
264
owner = "0xc000022070";
265
265
repo = "zen-browser-flake";
266
-
rev = "4563d0ffdf586368f1bec1a39cc20c9b12b73884";
266
+
rev = "98d8f48ba80a4b6e3b56addad850d57132301075";
267
267
fetchSubmodules = false;
268
-
sha256 = "sha256-NccmxYNOUHLLehsBLaeZ3QtVlDfIW1FDBe3W/kIDwa0=";
268
+
sha256 = "sha256-mGZBEN67mxeOsBhplBRLm6L+y++8jU46EEUYgemG1aQ=";
269
269
};
270
-
date = "2025-12-20";
270
+
date = "2025-12-25";
271
271
};
272
272
}
+1
-1
dns/dnsconfig.js
+1
-1
dns/dnsconfig.js
···
123
123
"ptr.pet",
124
124
REG_NONE,
125
125
DnsProvider(DSP_PRIMARY),
126
-
TRIMOUNTS("@", CF_PROXY_OFF),
126
+
TRIMOUNTS(["@", "tunes"], CF_PROXY_OFF),
127
127
DZWONEK(["nucleus", "trill", "dysnomia"], CF_PROXY_OFF),
128
128
// atproto
129
129
TXT("_atproto", "did=did:plc:dfl62fgb7wtjj3fcbb72naae"),
+4
-4
flake.lock
+4
-4
flake.lock
···
121
121
},
122
122
"nixpkgs_2": {
123
123
"locked": {
124
-
"lastModified": 1766070988,
125
-
"narHash": "sha256-fViPX/G/0T7zwCj2C19fuMmEiGvwhj7EYnRJZSjIIyk=",
126
-
"rev": "c6245e83d836d0433170a16eb185cefe0572f8b8",
124
+
"lastModified": 1766651565,
125
+
"narHash": "sha256-gtanTxYMENOVHWdS4QgxxKGPaSqvcNJVw0KBfaF5/Bo=",
126
+
"rev": "3e2499d5539c16d0d173ba53552a4ff8547f4539",
127
127
"type": "tarball",
128
-
"url": "https://releases.nixos.org/nixos/unstable/nixos-26.05pre913595.c6245e83d836/nixexprs.tar.xz?lastModified=1766070988&rev=c6245e83d836d0433170a16eb185cefe0572f8b8"
128
+
"url": "https://releases.nixos.org/nixos/unstable/nixos-26.05pre916364.3e2499d5539c/nixexprs.tar.xz?lastModified=1766651565&rev=3e2499d5539c16d0d173ba53552a4ff8547f4539"
129
129
},
130
130
"original": {
131
131
"type": "tarball",
+2
-2
hosts/dzwonek/modules/headscale.nix/default.nix
+2
-2
hosts/dzwonek/modules/headscale.nix/default.nix
···
25
25
};
26
26
hosts = {
27
27
chernobog = "100.64.0.8";
28
-
wolumonde = "100.64.0.2";
29
28
higashi = "100.64.0.5";
29
+
trimounts = "100.64.0.7";
30
30
};
31
31
rules = lib.mkBefore [
32
32
{
···
45
45
dst = [ "tag:private-infra:*" ];
46
46
}
47
47
{
48
-
src = [ "wolumonde" ];
48
+
src = [ "trimounts" ];
49
49
dst = [ "chernobog:*" ];
50
50
}
51
51
{
+10
hosts/trimounts/modules/transmission.nix
+10
hosts/trimounts/modules/transmission.nix
+10
pkgs-set/overlays/feishin.nix
+10
pkgs-set/overlays/feishin.nix
···
1
+
final: prev: let
2
+
nixpkgs = final.fetchFromGitHub {
3
+
owner = "nixos";
4
+
repo = "nixpkgs";
5
+
rev = "70adf772dca7804ba7b5701f5b20c01108b83401";
6
+
hash = "sha256-AJjEVxNQnmPucS/t9roICpfPsBDjuNoSeQ1YGP40/gM=";
7
+
};
8
+
in {
9
+
feishin = prev.callPackage "${nixpkgs}/pkgs/by-name/fe/feishin/package.nix" {};
10
+
}
+1
-1
pkgs-set/overlays/nixpkgs-xr.nix
+1
-1
pkgs-set/overlays/nixpkgs-xr.nix
+49
pkgs-set/pkgs/pds-upload.nix/default.nix
+49
pkgs-set/pkgs/pds-upload.nix/default.nix
···
1
+
{ lib
2
+
, stdenvNoCC
3
+
, makeWrapper
4
+
, nushell
5
+
, file
6
+
, secretsFile ? null
7
+
, ...
8
+
}:
9
+
10
+
stdenvNoCC.mkDerivation {
11
+
pname = "pds-upload";
12
+
version = "0.1.0";
13
+
14
+
src = ./pds-upload.nu;
15
+
16
+
nativeBuildInputs = [ makeWrapper ];
17
+
18
+
buildInputs = [ nushell ];
19
+
20
+
dontUnpack = true;
21
+
dontBuild = true;
22
+
23
+
installPhase = ''
24
+
runHook preInstall
25
+
26
+
mkdir -p $out/bin $out/libexec
27
+
28
+
install -Dm755 $src $out/libexec/pds-upload.nu
29
+
30
+
makeWrapper ${nushell}/bin/nu $out/bin/pds-upload \
31
+
--add-flags "$out/libexec/pds-upload.nu" \
32
+
--prefix PATH : ${lib.makeBinPath [ file ]} \
33
+
--run ${lib.escapeShellArg ''
34
+
# Optional: Set secrets file from argument override
35
+
${lib.optionalString (secretsFile != null) ''
36
+
export ATPROTO_SECRETS_FILE="${secretsFile}"
37
+
''}
38
+
39
+
# Load secrets if the file exists (to populate ATPROTO_DID/PASSWORD)
40
+
if [ -n "$ATPROTO_SECRETS_FILE" ] && [ -f "$ATPROTO_SECRETS_FILE" ]; then
41
+
set -a
42
+
source "$ATPROTO_SECRETS_FILE"
43
+
set +a
44
+
fi
45
+
''}
46
+
47
+
runHook postInstall
48
+
'';
49
+
}
+96
pkgs-set/pkgs/pds-upload.nix/pds-upload.nu
+96
pkgs-set/pkgs/pds-upload.nix/pds-upload.nu
···
1
+
#!/usr/bin/env nu
2
+
3
+
# A script to upload a blob and create a record in the AT Protocol (Bluesky).
4
+
# Usage: nu pds-upload.nu <path-to-image>
5
+
6
+
def main [
7
+
file_path: path # The path to the file you want to upload
8
+
] {
9
+
# --- 1. Setup & Configuration ---
10
+
let identifier = ($env.ATPROTO_DID? | default "")
11
+
let password = ($env.ATPROTO_PASSWORD? | default "")
12
+
13
+
# Default to the main network if not specified in env
14
+
let pds_host = ($env.ATPROTO_PDS_URL? | default "https://bsky.social")
15
+
16
+
# Validation
17
+
if ($identifier | is-empty) or ($password | is-empty) {
18
+
error make {
19
+
msg: "Missing Credentials",
20
+
label: {
21
+
text: "Please set ATPROTO_DID and ATPROTO_PASSWORD environment variables.",
22
+
span: (metadata $identifier).span
23
+
}
24
+
}
25
+
}
26
+
27
+
if not ($file_path | path exists) {
28
+
error make { msg: $"File not found: ($file_path)" }
29
+
}
30
+
31
+
# Detect mime-type
32
+
let mime_type = (try {
33
+
^file --mime-type -b $file_path | str trim
34
+
} catch {
35
+
"application/octet-stream"
36
+
})
37
+
38
+
# --- 2. Create Session (Authentication) ---
39
+
let session_res = (http post
40
+
--content-type "application/json"
41
+
$"($pds_host)/xrpc/com.atproto.server.createSession"
42
+
{ identifier: $identifier, password: $password }
43
+
)
44
+
45
+
let access_token = $session_res.accessJwt
46
+
let repo_did = $session_res.did
47
+
48
+
# --- 3. Upload Blob ---
49
+
let file_data = (open $file_path)
50
+
51
+
let blob_res = (http post
52
+
--content-type $mime_type
53
+
--headers { Authorization: $"Bearer ($access_token)" }
54
+
$"($pds_host)/xrpc/com.atproto.repo.uploadBlob"
55
+
$file_data
56
+
)
57
+
58
+
let blob_ref = $blob_res.blob
59
+
60
+
# --- 4. Create Record ---
61
+
let file_name = ($file_path | path basename)
62
+
let now = (date now | format date "%Y-%m-%dT%H:%M:%SZ")
63
+
64
+
let record_payload = {
65
+
repo: $repo_did
66
+
collection: "systems.gaze.file"
67
+
record: {
68
+
"$type": "systems.gaze.file"
69
+
createdAt: $now
70
+
file: $blob_ref
71
+
filename: $file_name
72
+
}
73
+
}
74
+
75
+
let record_res = (http post
76
+
--content-type "application/json"
77
+
--headers { Authorization: $"Bearer ($access_token)" }
78
+
$"($pds_host)/xrpc/com.atproto.repo.createRecord"
79
+
$record_payload
80
+
)
81
+
82
+
# --- 5. Construct Return Value ---
83
+
# We construct the public URL for the blob
84
+
# The '$link' key requires special handling to extract
85
+
let cid = ($blob_ref.ref | get '$link')
86
+
let blob_url = $"($pds_host)/xrpc/com.atproto.sync.getBlob?did=($repo_did)&cid=($cid)"
87
+
88
+
# Return a structured record with both the URI and the direct URL
89
+
let result = {
90
+
uri: $record_res.uri
91
+
cid: $record_res.cid
92
+
blob_url: $blob_url
93
+
} | to json
94
+
95
+
return $result
96
+
}
+17
secrets/atfileCfg.age
+17
secrets/atfileCfg.age
···
1
+
age-encryption.org/v1
2
+
-> ssh-rsa Abmvag
3
+
cslEDLMgbmTeCxKXG4isYQdts8ET2tb4NSRgoHpk9g3jB3bEOlYdY7LZtZ8YLxJ0
4
+
78YD6v81ssVQzCOoD0MQKveEkDIAie9JlYYDQS0pv/ACP+E1fqbIRo5pE7t9s26x
5
+
rBMZntIDx1vzGRM/+87Wz2NOPpNseP7P2CEIltMn3S5xbsl4N9WVx1mnH4NfsPCu
6
+
VRh3APe/Ee/Ph0/wBK2wQWRG97dd+p1bY7nzkRYE26DpODez1f9kTlTppIyivJDc
7
+
dIPMkykJOos/dwu6nR1XKS6l8f7Y+pQcYF24cqMe3PDQbhb19qwcpMiy0I11R2ik
8
+
/yb8pRziazd01gJsSKUWz/WVhKx7A4dj9TQloWO1FXoIB/mPaxZBghQfP55oV6b9
9
+
MGIxRcn/fekbCYNSxVo9WFyBsfg4vNzUcBlUInANrxU2mUS5YFpY7jf2iHGeGfRU
10
+
ZQsgB/ftScvtoSdKJ3dW4fW/2MZ2qyzjcrvFvikL50fucXhhOGa4ToDy2e04TLpm
11
+
fXlKHBgS+xYIgnjw/6P54SwMbgC1fGUq7mC7TVKZiA/AyDyZMxQvNIfx6MKlffDM
12
+
ItU2mHjV2i23g3Nk9V6EmSxy/RCivVNZMWktLJrR+XYKGjhqjqObF83kE9vlzl1g
13
+
6hU80Ys0H8q0iCBnceLL1UlODByXczzRhiqrFetkmlc
14
+
--- goQ5BSnSK0NTZ13BPhqmduMllp9tF8n4mNHEVvm1dA8
15
+
๏ฟฝ๏ฟฝ?eO๏ฟฝ๏ฟฝX ๏ฟฝ=/@๏ฟฝ๏ฟฝc๏ฟฝfg๏ฟฝ7
๏ฟฝciG๏ฟฝ๏ฟฝื`๏ฟฝ,q(HT๏ฟฝrPs'Z๏ฟฝ๏ฟฝl๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝL๏ฟฝw@2"๏ฟฝ?[๏ฟฝ:๏ฟฝ๏ฟฝ9๏ฟฝ๏ฟฝB๏ฟฝ] ๏ฟฝ{+๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ8%๏ฟฝ๏ฟฝ๏ฟฝ%๏ฟฝw_vR๏ฟฝ๏ฟฝ๏ฟฝ9๏ฟฝN
16
+
Q๏ฟฝG๏ฟฝ0
๏ฟฝZ๏ฟฝl๏ฟฝC๏ฟฝ๏ฟฝu
17
+
๏ฟฝy๏ฟฝ๏ฟฝ๏ฟฝ>J
+1
-5
secrets/secrets.nix
+1
-5
secrets/secrets.nix
···
2
2
yusdacra = builtins.readFile ./yusdacra.key.pub;
3
3
dzwonek = builtins.readFile ./dzwonek.key.pub;
4
4
trimounts = builtins.readFile ./trimounts.key.pub;
5
-
develMobi = builtins.readFile ./develMobi.key.pub;
6
5
in
7
6
{
8
7
"nixGithubAccessToken.age".publicKeys = [ yusdacra ];
···
26
25
yusdacra
27
26
dzwonek
28
27
];
29
-
"develMobiTailscaleAuthKey.age".publicKeys = [
30
-
yusdacra
31
-
develMobi
32
-
];
33
28
"cloudflareDnsEdit.age".publicKeys = [
34
29
yusdacra
35
30
dzwonek
···
40
35
dzwonek
41
36
trimounts
42
37
];
38
+
"atfileCfg.age".publicKeys = [yusdacra];
43
39
}
+16
-3
users/mayer/default.nix
+16
-3
users/mayer/default.nix
···
2
2
pkgs,
3
3
lib,
4
4
tlib,
5
-
config,
6
5
terra,
7
6
...
8
7
}@globalAttrs:
···
98
97
99
98
home-manager.users.mayer =
100
99
{
100
+
config,
101
101
pkgs,
102
102
inputs,
103
103
...
···
128
128
"zen"
129
129
# "discord"
130
130
"clickee"
131
+
"arrpc"
131
132
]
132
133
];
133
134
in
134
135
l.flatten [
135
136
(tlib.prefixStrings "${inputs.self}/users/modules/" modulesToEnable)
136
137
../modules/discord/service.nix
138
+
"${inputs.agenix}/modules/age-home.nix"
137
139
];
138
140
139
141
home = {
···
157
159
bs-manager
158
160
cemu
159
161
tor-browser
160
-
supersonic-wayland
161
-
]) ++ [terra.helium];
162
+
# supersonic-wayland
163
+
feishin
164
+
]) ++ [
165
+
terra.helium
166
+
(terra.pds-upload.override {
167
+
secretsFile = config.age.secrets.atfileCfg.path;
168
+
})
169
+
];
170
+
};
171
+
172
+
age.secrets.atfileCfg = {
173
+
file = ../../secrets/atfileCfg.age;
174
+
mode = "600";
162
175
};
163
176
164
177
fonts.fontconfig.enable = l.mkForce true;
+6
users/modules/clipman/default.nix
+6
users/modules/clipman/default.nix
+1
-1
users/modules/discord/service.nix
+1
-1
users/modules/discord/service.nix
+21
users/modules/niri/clipboard.nu
+21
users/modules/niri/clipboard.nu
···
1
+
#!/usr/bin/env nu
2
+
3
+
def main [] {
4
+
# Get clipboard history from clipman
5
+
let history = clipman show-history
6
+
7
+
if ($history | is-empty) {
8
+
notify-send "Clipman" "No clipboard history"
9
+
exit 1
10
+
}
11
+
12
+
# Show in tofi and get selection
13
+
let selection = ($history | lines | tofi --prompt-text "select clipboard item: " | str trim)
14
+
15
+
if ($selection | is-empty) {
16
+
exit 0
17
+
}
18
+
19
+
# Copy selection to clipboard
20
+
$selection | wl-copy
21
+
}
+3
users/modules/niri/config.kdl
+3
users/modules/niri/config.kdl
···
179
179
XF86MonBrightnessUp allow-when-locked=true { spawn "brightnessctl" "--class=backlight" "set" "+10%"; }
180
180
XF86MonBrightnessDown allow-when-locked=true { spawn "brightnessctl" "--class=backlight" "set" "10%-"; }
181
181
182
+
Ctrl+Shift+U { spawn-sh "nu %%clipboard-upload%%"; }
183
+
Ctrl+Shift+S { spawn-sh "nu %%clipboard-select%%"; }
184
+
182
185
Mod+O repeat=false { toggle-overview; }
183
186
Mod+Q cooldown-ms=50 { close-window; }
184
187
+4
-4
users/modules/niri/default.nix
+4
-4
users/modules/niri/default.nix
···
1
1
{
2
-
config,
3
-
nixosConfig,
4
2
pkgs,
5
3
lib,
6
-
tlib,
7
4
...
8
5
}:
9
6
let
···
15
12
../wlsunset
16
13
../mako
17
14
../tofi
15
+
../clipman
18
16
];
19
17
20
-
home.packages = with pkgs; [niri xwayland-satellite brightnessctl swaybg];
18
+
home.packages = with pkgs; [file libnotify clipman niri xwayland-satellite brightnessctl swaybg];
21
19
xdg.configFile."niri/config.kdl".text =
22
20
let
23
21
replace = {
24
22
wallpaper = toString ../../mayer/wallpaper.png;
23
+
clipboard-upload = toString ./uploader.nu;
24
+
clipboard-select = toString ./clipboard.nu;
25
25
};
26
26
in
27
27
l.replaceStrings
+70
users/modules/niri/uploader.nu
+70
users/modules/niri/uploader.nu
···
1
+
#!/usr/bin/env nu
2
+
3
+
def main [] {
4
+
# --- 1. Get Clipboard Content ---
5
+
let timestamp = (date now | format date '%Y%m%d_%H%M%S')
6
+
let temp_file = $"/tmp/clip_($timestamp)"
7
+
8
+
# Save clipboard to temp file
9
+
# We remove --no-newline to safely handle binary data if necessary,
10
+
# though wl-paste usually handles it.
11
+
try {
12
+
wl-paste | save -f $temp_file
13
+
} catch {
14
+
notify-send "Upload Failed" "Could not get content from clipboard"
15
+
exit 1
16
+
}
17
+
18
+
# Detect MIME type just for logging/notification
19
+
let mime_type = (try {
20
+
^file --mime-type -b $temp_file | str trim
21
+
} catch {
22
+
"application/octet-stream"
23
+
})
24
+
25
+
print $"๐ค Uploading ($mime_type)..."
26
+
notify-send "ATProto Upload" $"Uploading ($mime_type)..." -t 2000
27
+
28
+
try {
29
+
# --- 2. Call pds-upload ---
30
+
# pds-upload now returns: { uri, cid, blob_url }
31
+
let res = pds-upload $temp_file | from json
32
+
33
+
let record_uri = $res.uri
34
+
let blob_url = $res.blob_url
35
+
36
+
print $"๐ Blob URL: ($blob_url)"
37
+
print "โ๏ธ Shortening with is.gd..."
38
+
39
+
# --- 3. Shorten URL ---
40
+
# is.gd expects the URL to be passed as a query parameter 'url'
41
+
# We must URL-encode the blob_url
42
+
let encoded_target = ($blob_url | url encode)
43
+
let shorten_api = $"https://is.gd/create.php?format=simple&url=($encoded_target)"
44
+
45
+
# is.gd returns the short URL as the body text
46
+
let short_url = (http get $shorten_api)
47
+
48
+
# --- 4. Success & Clipboard ---
49
+
# Check if is.gd returned a URL (starts with http) or an error
50
+
if ($short_url | str starts-with "http") {
51
+
$short_url | wl-copy
52
+
notify-send "ATProto Upload" $"Shortened: ($short_url)"
53
+
print $"โ
Shortened: ($short_url)"
54
+
} else {
55
+
# Fallback to the long blob URL if shortening failed
56
+
$blob_url | wl-copy
57
+
notify-send "ATProto Upload" $"Uploaded (Shorten failed)"
58
+
print $"โ ๏ธ Shorten failed: ($short_url)"
59
+
}
60
+
61
+
} catch {|e|
62
+
# Parse error for notification
63
+
let err_msg = ($e | to text)
64
+
notify-send "ATProto Upload" $"Upload failed: ($err_msg)" -u critical
65
+
print $"โ Upload failed: ($err_msg)"
66
+
}
67
+
68
+
# Cleanup
69
+
rm -f $temp_file
70
+
}