Repository navigation
Expand file tree
/
Copy pathflake.nix
More file actions
1727 lines (1619 loc) · 91.2 KB
/
Copy pathflake.nix
File metadata and controls
1727 lines (1619 loc) · 91.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
{
description = "Lars nix-darwin + NixOS system flake - Modular Architecture with flake-parts";
nixConfig = {
extra-experimental-features = [
"nix-command"
"flakes"
"pipe-operators"
];
warn-dirty = false;
};
inputs = {
# FLOATING nixos-unstable (2026-11-06): the fe13242 rev-pin (2026-10-15,
# gen 939) was LIFTED by owner directive ("EVERYTHING on the latest
# version"). History: the pin rolled back the 2026-10-20 tip 02c087f3,
# which broke the toplevel in five places at once (aw-core peewee==3.*,
# the linux-7.3 r8125.ko.cer module path, signoz patch context, templ
# runtime drift, dms-shell 2.0.0 installPhase; ten stale FOD hashes
# downstream). The lift is proof-gated: every defect above must come
# back green under `nix build .#nixosConfigurations.evo-x2.config.system
# .build.toplevel --keep-going` (aw-core AND linux-7.3-modules
# realized) before the float commits; anything upstream still broken
# gets re-pinned per-input with a fresh LIFT observable, not a blanket
# rollback. The float also retires the nixpkgs-unstable follow input
# (five go-1.27.3-floor consumers collapsed back onto this root) and
# lifts the hermes-agent patchelf#672 blocker (unstable patchelf
# contains the fix its patchelfFixed patch targets).
# 2026-11-12 DURABLE PIN at f4a03c00 (the deploy-997 §f.16 design, now
# forced by evidence): unstable tip still ships patchelf 0.15.2
# (probed 2026-11-12) which mispairs hermes's patchelfFixed — neutralized
# for hermes via the dedicated nixpkgs-hermes input below — AND tip's
# newer stdenv broke the 2026-11-11 tool floats (cvagent/journal/
# discordsync/pma: proof4 red under tip, proof2 green under f4a03c00).
# f4a03c00 is the proof2-proven graph. LIFT: unstable ships patchelf
# >= 0.19 again AND the floated tools build green on the floated rev
# (keep-going toplevel proof).
nixpkgs.url = "github:NixOS/nixpkgs/f4a03c008967841f2a0b3cb7c436fc6fc31671f6";
# nixpkgs-unstable follow input REMOVED 2026-11-06: created 2026-10-25
# (inboxclean go-1.27.3 floor vs the pinned root's go_1_27 1.27.2),
# extended 2026-11-06 to file-and-image-renamer, go-taskqueue,
# vision-review-agent and dankMaterialShell; the root nixpkgs float to
# nixos-unstable made it redundant — all five follows collapsed back
# to "nixpkgs".
# REV-PINNED nixpkgs holding the llama.cpp 0.3.0 build (the last build
# proven serving on gfx1150 before the 0.4.0 mid-model-load CPU-spin
# regression, live 2026-09-14). Consumed ONLY by services/llama-rag.nix.
# Path-form rev pin is deliberate (a `?rev=` query is eval-guard-blocked
# and re-pins backward on lock churn): do NOT `nix flake lock
# --update-input nixpkgs-llama-rag` — drop this input entirely once the
# 0.4.0+ spin regression is fixed upstream and re-verified live.
nixpkgs-llama-rag.url = "github:NixOS/nixpkgs/0968519e14f7aa7d3e9b389682bd74d2b51c8ce8";
# 2026-11-12: hermes-agent's patchelfFixed patch targets 0.19-era
# patchelf source; unstable's default regressed to 0.15.2 (f4a03c00 and
# tip both ship it), so routing hermes's nested nixpkgs to the root
# mispairs the pair (4/6 hunks) and poisons the ffmpeg/node chain under
# it. This dedicated input hands hermes the gen-992/gen-997-proven
# graph (f9a75f41, patchelf 0.19.2) while the root serves everything
# else — the 2026-10-25 follower-toolchain-skew pattern (nixpkgs-llama-rag
# precedent). Drop when unstable's patchelf is >= 0.19 again.
nixpkgs-hermes.url = "github:NixOS/nixpkgs/f9a75f41be3a74eab55d3a7679d34ad6cc0da977";
nix-darwin = {
url = "github:LnL7/nix-darwin";
};
home-manager = {
url = "github:nix-community/home-manager";
};
# Add flake-parts for modular architecture
flake-parts = {
url = "github:hercules-ci/flake-parts";
};
# Single flake-utils source — all inputs follow this to avoid 10+ duplicate instances
flake-utils = {
url = "github:numtide/flake-utils";
};
# Single nix-systems source — flake-utils follows this
systems.url = "github:nix-systems/default";
# uv2nix ecosystem — builds Python apps from uv.lock hermetically.
# Consumed by pkgs/geometrikks.nix (services.geometrikks). Upstream org
# renamed pyproject.build-systems -> build-system-pkgs; all three follow
# our nixpkgs so the venv toolchain matches the host python313.
uv2nix = {
url = "github:pyproject-nix/uv2nix";
};
pyproject-nix = {
url = "github:pyproject-nix/pyproject.nix";
};
pyproject-build-systems = {
url = "github:pyproject-nix/build-system-pkgs";
};
# Single treefmt-nix source — dnsblockd, niri-session-manager follow this
treefmt-nix = {
url = "github:numtide/treefmt-nix";
};
# Add NUR (Nix User Repository) for other packages
nur = {
url = "github:nix-community/NUR";
};
# Helium Browser
helium = {
url = "github:schembriaiden/helium-browser-nix-flake";
};
# Add nix-homebrew for declarative Homebrew management
nix-homebrew.url = "github:zhaofengli-wip/nix-homebrew";
# Homebrew bundle for cask management
homebrew-bundle = {
url = "github:homebrew/homebrew-bundle";
flake = false;
};
# Homebrew cask for headlamp and other GUI apps
homebrew-cask = {
url = "github:homebrew/homebrew-cask";
flake = false;
};
# Niri scrollable-tiling Wayland compositor
niri = {
url = "github:sodiboo/niri-flake";
};
# OpenTelemetry TUI viewer
otel-tui = {
url = "github:ymtdzzz/otel-tui";
};
# Superfile terminal file manager (upstream flake — nixpkgs stuck at 1.3.3,
# upstream v1.6.0 ships bubbletea-v2 preview reliability + sidebar config)
superfile = {
url = "github:yorukot/superfile";
};
# AMD NPU (XDNA) driver for Ryzen AI Max+ Strix Halo
nix-amd-npu = {
url = "github:robcohen/nix-amd-npu";
};
# Secrets management via sops + age
sops-nix = {
url = "github:Mic92/sops-nix";
};
# SilentSDDM - customizable SDDM theme with Catppuccin support
silent-sddm = {
url = "github:uiriansan/SilentSDDM";
};
# Declarative disk partitioning — geometry-spec only for SystemNix:
# diskoConfigurations.samsung-tlc is an eval-checked reference of the
# live Samsung layout (NOT imported by nixosConfigurations — see
# disko/samsung-tlc.nix). No module consumers; input kept for the
# disko CLI (dry-run script rendering / rescue use).
disko = {
url = "github:nix-community/disko";
};
# SigNoz observability platform sources (flake = false, packaged in
# _signoz-packages.nix). Branch-ref governed per the 2026-09-16 pin
# policy: 2026-09-18 bump lifted the pre-09-13 INTERIM pins after the
# probe+build passed (sonic is STILL v1.14.1 upstream — the Go-1.26
# patches in modules/nixos/services/patches/ stay until SigNoz bumps
# sonic >= 1.15). Bump = migration-review class: pkg/sqlmigration
# (metadata DB) runs at signoz start, the collector's ClickHouse
# schema-migrator runs pre-start — review new migrations before
# deploying a moved rev.
# Pin LIFTED 2026-11-06 (owner directive "everything latest"; back on
# ?ref=main). The 2026-10-23 pin existed because main's go.mod moved the
# sonic version context so the Go-1.26 patches in
# modules/nixos/services/patches/ stopped applying (`signoz-…-patched`
# failed its hunks) and the pnpm deps hash re-staled. Re-proof duties on
# this float: `nix build .#signozPkg --no-link` (refresh the patches or
# drop them where sonic >= 1.15 landed) + the migration-review class for
# new pkg/sqlmigration / ClickHouse schema-migrator entries at the
# deployed rev.
signoz-src = {
url = "github:SigNoz/signoz?ref=main";
flake = false;
};
signoz-collector-src = {
url = "github:SigNoz/signoz-otel-collector?ref=main";
flake = false;
};
# paperless-gpt — AI metadata enrichment + custom-field extraction for
# Paperless-ngx (github:icereed/paperless-gpt, MIT). TAG-PINNED at the
# latest release (v0.31.0 as of the 2026-11-06 bump from v0.28.0) so the
# vendorHash + npmDepsHash in pkgs/paperless-gpt.nix stay reproducible;
# bump tag + both hashes together (a moving ref would re-break the FODs
# on every lock update — the vendorHash-shim churn class documented in
# lib/lars-packages.nix).
paperless-gpt-src = {
url = "github:icereed/paperless-gpt/v0.31.0";
flake = false;
};
nix-ssh-config = {
url = "github:LarsArtmann/nix-ssh-config";
};
# Crush AI Agent Configuration — global AI assistant settings
# This ensures AGENTS.md and all references are synced across machines
crush-config = {
url = "git+ssh://git@github.com/LarsArtmann/crush-config?ref=refs/heads/master";
};
# dnsblockd — DNS blocklist service with block pages and blocklist processing
dnsblockd = {
url = "git+ssh://git@github.com/LarsArtmann/dnsblockd?ref=refs/heads/master";
};
wallpapers-src = {
url = "git+ssh://git@github.com/LarsArtmann/wallpapers?ref=refs/heads/master";
flake = false;
};
# Hermes AI Agent — Discord/gateway agent platform.
# RE-VERIFY ON BUMP: the projects-access wiring depends on upstream env
# behavior — TERMINAL_CWD surviving as the terminal default unless
# config.yaml sets terminal.cwd (gateway/run.py resolve_placeholder_terminal_cwd,
# cwd_placeholder.py) and HERMES_WRITE_SAFE_ROOT confining write_file/patch.
# Both verified against the source 2026-08-21 @ 63c6d9a4 (v0.20.4) and
# re-verified 2026-09-04 @ d3630f85 (v0.21.0): symbols intact, env flow
# unchanged; upstream commit 31561e37 additionally BLESSES the
# env bridge (the deprecation warning now reads the .env FILE — env
# TERMINAL_CWD is "legitimate" per its docstring). A bump that changes
# either silently changes agent workspace/write semantics
# (tests/test-hermes.nix covers the env wiring, not the upstream Python
# behavior).
hermes-agent = {
# INTERIM-ROLLBACK (2026-10-02): the 09:31 auto lock update re-locked
# hermes-agent to 10c6188d, whose flake eval-forces the
# `hermes-python-source` FOD (IFD class) — `nix flake check --no-build`
# (the pre-commit gate) fails with "path …-hermes-python-source is not
# valid" while bafb42b4 evals clean (verified by lock swap 2026-10-02).
# The url above stays unpinned so a later
# `nix flake lock --update-input hermes-agent` can move forward;
# do NOT blanket-update back to a rev that breaks the eval gate. Drop
# this rollback once an upstream rev evals green under --no-build.
# ROLLBACK REPLAY (2026-10-07 19:00): the daemon's blanket lock updates
# advanced 0e21933 (via 489c1ac) whose WEB frontend fails TypeScript
# typecheck (TS1484 'SessionFilterCategory' type-only import under
# verbatimModuleSyntax, web-0.0.0 buildPhase) — deploy blocked until
# pinned back to e76fb95, the rev behind the proven 17:22 generation.
# Blanket `nix flake update` keeps re-introducing this class; move the
# input forward ONLY after `nix build
# .#nixosConfigurations.evo-x2.config.system.build.toplevel` passes.
# REV-PINNED 2026-10-25 at 0329638c (patchelf#672 patch context vs the
# root pin's patchelf 0.15.2); PIN LIFTED 2026-11-06 when the root
# nixpkgs floated to nixos-unstable (its patchelf contains #672, so
# upstream 5a5aa9a+'s patchelfFixed patch applies and pm-ripgrep/
# pm-node patchPhase must come back green in the toplevel proof — the
# proof is the gate for this re-float).
# RE-PINNED 2026-11-12 at 21ae0e12 (the gen-992/gen-997-proven rev,
# live in both deployed generations): upstream d1db1bc6's nested
# patchelfFixed packaging regressed AGAIN (their patchelf-0.15.2 +
# patch pair rejects 4/6 hunks, poisoning the ffmpeg/node/pnpm/
# hermes chain — the 2026-11-09 gen-992 arc, recurring). 21ae0e12's
# own nested lock is self-consistent (deployment-proven) and carries
# the env-bridge blessing (31561e37, 2026-08-20, is an ancestor).
# LIFT: upstream re-syncs their nested patchelf packaging/patch pair
# + keep-going toplevel proof with hermes-agent realized on the
# floated rev.
url = "github:NousResearch/hermes-agent/21ae0e1238fdf466fa52a85a6ebf75d6899e49da";
};
# monitor365 — Device monitoring agent (Rust)
monitor365 = {
# UNPINNED 2026-11-03: the wasm-bindgen 0.2.130 tarball-hash paste
# (lofzu1Ubn…) landed on origin/master (ebfa4056f, pasted in
# nix/tools.nix by the in-flight session); pin 10d25291 dropped and
# the input re-floated — toplevel proof green same day.
url = "git+ssh://git@github.com/LarsArtmann/monitor365?ref=refs/heads/master";
};
# domains — Terraform DNS management (Namecheap). Consumed ONLY for
# the `ci-watchdog` app program (services.ci-watchdog): the GitHub
# Actions canary watchdog that treats runner-health.yml's every-30-min
# scheduled run as the Actions-liveness canary. Forgejo-primary repo;
# github: points at the kept-current push mirror.
domains = {
url = "git+ssh://git@github.com/LarsArtmann/domains?ref=refs/heads/master";
};
# storage-collector — filesystem capacity tracking daemon (Rust).
# Private GitHub repo. Flake-input fetches happen outside the build
# sandbox with the user's git credentials, so `github:` works where
# in-build cargo git deps broke monitor365. NOTE: its nested
# `collector-utils` sub-input is pinned to a LOCAL git+file path
# (~/projects/collector-utils, ahead of origin) — builds need that
# sibling checkout until collector-utils is pushed and the sub-input
# moves to `github:`.
storage-collector = {
url = "git+ssh://git@github.com/LarsArtmann/storage-collector?ref=refs/heads/master";
};
# PapDashboard — event-sourced alert hub with NPU insight enricher (Go)
papdashboard = {
url = "git+ssh://git@github.com/LarsArtmann/PapDashboard?ref=refs/heads/master";
# nixpkgs deliberately NOT followed (bank-sync/qmd vendorHash doctrine):
# upstream derives its vendorHash against ITS pinned buildGoModule —
# following our nixpkgs invalidates it on every bump (2026-09-17: 4
# revs hunted in one evening, every one hash-mismatched under the
# b1b87598 buildGoModule).
};
# InboxClean — Gmail AI assistant: web dashboard + incremental sync (Go)
inboxclean = {
# Floats on upstream master (owner directive 2026-10-25: "inboxclean
# should never be pinned"). The go.mod 1.27.3 toolchain floor is met
# via the nixpkgs-unstable follow, not by holding this rev back.
# The 2026-11-06 templ-API hard pin (e553c510, go-cqrs-lite/catalog
# docserver vs templ 0.3.1100 JoinURLErrs removal) was LIFTED
# 2026-11-10: upstream master (5021c927) ships the regenerated catalog
# and `.#inboxclean` compiles at tip (pre-deploy-check green before
# the switch). Allowlist row removed per the pin-audit lift rule.
url = "git+ssh://git@github.com/LarsArtmann/InboxClean?ref=refs/heads/master";
};
# pim-sync — Google People ↔ Stalwart CardDAV contacts sync (Go):
# oneshot sync-contacts + jittered 5min timer; Stalwart is the single
# truth, Google a sync edge. Consumed as a NixOS module ONLY
# (inputs.pim-sync.nixosModules.default → services.pim-sync); the
# wrapper (modules/nixos/services/pim-sync.nix) layers the package
# pin, onFailure routing + registry/catalog entries. PRIVATE repo →
# git+ssh URL (cv/crm/monitor365 pattern); all its Go deps are PUBLIC
# (go proxy), so no GOPRIVATE plumbing. Flip-ready DISABLED (enable =
# false in configuration.nix) until the owner gates land — plan:
# docs/planning/2026-11-04_19-35_pim-sync-systemnix-integration-wave.md
pim-sync = {
url = "git+ssh://git@github.com/LarsArtmann/pim-sync?ref=refs/heads/master";
};
# NixOS hardware profiles (Raspberry Pi, etc.)
nixos-hardware = {
url = "github:NixOS/nixos-hardware";
};
# EMEET PIXY webcam auto-activation daemon
emeet-pixyd = {
url = "github:LarsArtmann/emeet-pixyd?ref=master";
};
# Niri session manager — automatic window save/restore
niri-session-manager = {
url = "github:LarsArtmann/niri-session-manager";
};
# offline-banner — yellow offline banner strip (Quickshell layer-shell)
# on every monitor while offline; consumed as a NixOS module ONLY
# (services.offline-banner). Extracted from this repo's
# modules/nixos/desktop/offline-banner.nix 2026-10-16 at v3 behavior
# (bar push-down, last-online caption, click-dismiss); the local wrapper
# module keeps the systemnix: layer namespace for live parity.
offline-banner = {
url = "github:LarsArtmann/offline-banner?ref=refs/heads/master";
};
# quotaboard — AI coding-plan quota dashboard (Z.ai GLM + Synthetic):
# web UI + JSON API + DankMaterialShell bar widget (dms-plugin/).
# Native-since-inception Forgejo-primary repo (2026-11-02, media-atlas
# precedent): created PRIVATE via SSH push-to-create on the local
# Forgejo (canonical), GitHub twin created PRIVATE for the push mirror.
# Consumed as a HOME module ONLY (quotaboard.homeModules.quotaboard):
# user systemd service (services.quotaboard) + DMS bar widget via
# programs.dank-material-shell — wired in desktop/quickshell.nix.
# PRIVATE repo → git+ssh URL (cv/crm pattern). All its Go deps are
# PUBLIC (go proxy), so its FODs need no private-repo plumbing; the
# nixpkgs follows keep the lock dedup honest.
quotaboard = {
# LOCK REVERTED 2026-11-06 (0161f384 → 61801b11, unproven-float
# rollback per the float doctrine): the peer-daemon float to
# 0161f384 ships a vendored tree inconsistent with its own go.mod
# (dozens of "explicitly required in go.mod, but not marked as
# explicit in vendor/modules.txt" — builder exit 1, first-hand
# float-proof-20261106-225127.log). 61801b11 is the last state the
# toplevel built through. Re-float ONLY when upstream lands a
# consistent `go mod vendor` and the toplevel proof goes green.
url = "git+ssh://git@github.com/LarsArtmann/quotaboard?ref=refs/heads/master";
};
# Treefmt formatter with auto-discovery for nix fmt
treefmt-full-flake = {
url = "github:LarsArtmann/treefmt-full-flake";
};
# templ — shared input for the templ compiler. ALWAYS LATEST (owner
# directive 2026-10-25, matching the pin policy: float unless upstream
# is BROKEN).
#
# The 2026-10-23 rev pin band-aided a CONSUMER parity rule, not a
# broken upstream: templ >= 0.3.1084 (a-h/templ c5e4cc74, #1454
# "tighten rules on mixed-case attribute names") makes the GENERATOR
# emit `templruntime.NewAttributeExpression`, which the consumer's
# go.mod runtime must also provide. overview and InboxClean both still
# declare github.com/a-h/templ v0.3.1070, so FORCING this CLI into
# their builds (the former `templ-cli.follows` / `templ.follows`
# lines) is what produced `undefined: NewAttributeExpression`.
# Both consumers now build with their OWN templ input (v0.3.1070 tag,
# the same version their go.mod declares), so this input floats with
# no effect on them; regenerate by hand only with the consumer's CLI.
#
# Build-tool binary, NOT a vendored Go module (*_templ.go files are
# committed), so following it carries no vendorHash/FOD exposure.
# nixpkgs deliberately NOT followed (templ's go-modules FOD is
# validated against its own pin) — see lib/lock-audit.nix.
templ = {
url = "github:a-h/templ?ref=main";
};
# todo-list-ai — AI-powered CLI tool for extracting TODOs from codebases
# Was INTERIM-pinned to f9f3b335 (2026-09-13: auto-commit left the frozen
# bun lockfile stale); master verified BUILDABLE at HEAD 2026-09-16
# (package build probe passed) — pin dropped per the pin policy.
todo-list-ai = {
url = "git+ssh://git@github.com/LarsArtmann/todo-list-ai?ref=refs/heads/master";
};
# library-policy — Banned/vulnerable library detector for Go projects
# ?ref=master since 2026-09-17: upstream ef02247 fixed the build chain
# (toolchain bumped to go_1_27 for the samber-do-auditlog go.mod floor,
# vendorHash refreshed; FOD + package verified). Bumps flow via
# `nix flake lock --update-input library-policy --refresh`.
library-policy = {
# UNPINNED 2026-11-03 (go-health-dashboard fix) and re-pinned
# 2026-11-06 for the templ-API-removal class; PIN LIFTED AGAIN
# 2026-11-11: upstream tip 088aaf2 regenerated at templ v0.3.1100 —
# lock-free probe builds the package green (its own lock carries the
# regenerated templ-components). Floats on ?ref=refs/heads/master;
# bumps flow via `nix flake lock --update-input library-policy
# --refresh`.
url = "git+ssh://git@github.com/LarsArtmann/library-policy?ref=refs/heads/master";
};
# file-and-image-renamer — AI-powered screenshot renaming tool
file-and-image-renamer = {
# Was INTERIM `git+file:///home/lars/projects/file-and-image-renamer` -
# a local-path pin that broke every CI eval (same class as art-dupl,
# 2026-09-15). Flip condition satisfied: commit 494c9b7 (the vendorHash
# refresh forced by the go-nix-helpers /vN fix) is origin/master HEAD
# (verified via branches-where-head, 2026-09-16). git+ssh fetches on CI
# via the NIX_DEPLOY_KEY_FILE_AND_IMAGE_RENAMER read-only deploy key.
# Branch-ref governed (pin policy 2026-09-16: ?ref=master as much as
# possible; the lock holds the exact rev until an explicit update).
# PIN LIFTED 2026-11-13 (was a TEMPORARY HARD PIN 2026-11-06 on the
# templ-API-removal class, then re-diagnosed 2026-11-11). The real
# blocker was NOT a stale committed vendor/ tree — vendor/ is
# GITIGNORED here (`.gitignore:102`), so the nix build re-vendors
# every time; what was stale were the repo's per-dep `*-src` flake
# pins lagging its own go.mod (templ-components v1.26.0 vs v1.27.0,
# cqrs-htmx rev-357cdfc vs v4.16.0, plus cmdguard/go-output/
# go-health/go-health-dashboard/go-datastar/go-sse). Upstream fix
# 2026-11-13 (cc4ed62a): every pin aligned to the go.mod requirement
# + vendorHash re-derived; clean-tree package build green, lock-free
# probe at that rev green. Floats on ?ref=refs/heads/master; bumps
# flow via `nix flake lock --update-input file-and-image-renamer
# --refresh`.
url = "git+ssh://git@github.com/LarsArtmann/file-and-image-renamer?ref=refs/heads/master";
};
# nsfw-classifier — Go/ONNX NSFW image classifier. Backend for the
# browser extension that helium auto-loads (platforms/common/packages/
# base.nix --load-extension): with default settings the extension
# auto-discovers nsfw.home.lan:<ports.nsfw> and pairs via the /readyz
# token that services.nsfw-classifier provides (--pair-token auto).
# nixpkgs FOLLOWS root since 2026-10-07: root (fe1324228 as of the
# 2026-10-19 go-1.27.2 wave) ships go_1_27 = 1.27.2 (direct-eval
# verified 2026-10-19; rev-cite toolchain facts, they rot) and the
# go-modules FOD rebuild on the flip verified the vendorHash holds. Deliberate
# entry dropped from lib/lock-audit.nix in the same change.
nsfw-classifier = {
# Remote master since 2026-10-10; deploy-key fetch. LIFTED 2026-11-03:
# the 2026-10-28 pin (58d398dc) guarded the F0.3 telemetry refactor that
# landed half-wired — upstream finished it (telemetry handler,
# Server.telemetryPath, writeErr all present; first-hand go build at
# b43a6da7 clean) and the pin row left lib/flake-input-pin-audit.nix.
url = "git+ssh://git@github.com/LarsArtmann/nsfw-classifier?ref=refs/heads/master";
};
# crush-daily — Daily AI-powered insights from Crush development databases
crush-daily = {
url = "git+ssh://git@github.com/LarsArtmann/crush-daily?ref=refs/heads/master";
};
# bank-sync — Wise/Qonto bank transaction sync into SQLite + dashboard
bank-sync = {
# PIN LIFTED 2026-10-16 (owner-ratified fresh-start cutover). The
# 2026-10-14 hard pin (67dd64526 ceiling) existed because the d15e0a48
# go-cqrs-lite key rendering crash-loops the daemon against the PROD
# journal (exit-65 journal_snapshot_divergence). Resolved by moving the
# prod dataDir aside ONCE (bank-sync-fresh-start oneshot in
# modules/nixos/services/bank-sync.nix; archive
# bank-sync-pre-keybump-20261016, nothing deleted) so the floated binary
# boots on an empty journal under the new key basis; history re-fetches
# from Wise via the full-history backfill after the SCA re-approval.
# Floating master per the pin policy. Re-pin ONLY with a fresh
# first-hand documented reason (the allowlist-traced class).
url = "git+ssh://git@github.com/LarsArtmann/bank-sync?ref=refs/heads/master";
};
# journal — the accounting kernel: chart of accounts, double-entry
# journal, bank reconciliation against invoices, period close, VAT
# (PRIVATE repo: github: URL + CI deploy key, cv/crm pattern). CLI over
# a local SQLite journal + the Hauptbuch web dashboard (journal-serve
# unit: loopback 127.0.0.1:8484, registry vHost journal.home.lan at
# layer 2 protected — owner g-2 answer 2026-10-26; upstream keeps the
# loopback-only bind until T16 passkey auth). Consumes bank-sync's
# transactions.v1 exports.
# NON-FOLLOWER class (own nixpkgs/go-nix-helpers lock, go.mod floor
# 1.27.2): upstream's baked vendorHash reproduces under its own
# validated build env (first-hand probe 2026-10-19 at ba60fe0d), so no
# follows overrides and no consumer-side shim. Its lock's only private
# dep node is go-cqrs-lite (CI key already exists).
journal = {
# PIN LIFTED 2026-11-11 (templ-API-removal class): upstream regenerated
# at templ v0.3.1100 (tip 0663476 lock-free probe builds the package
# green, incl. the regenerated templ-components deps). Floats on
# ?ref=refs/heads/master per the pin policy; bumps flow via
# `nix flake lock --update-input journal --refresh`.
url = "git+ssh://git@github.com/LarsArtmann/journal?ref=refs/heads/master";
};
# go-paperless — journal's own lock pins this dep to a LOCAL
# file:///home/lars/projects/go-paperless path, which only resolves on
# this machine and kills CI eval the moment journal's inputs are
# walked (2026-10-29 negative-tests controls). Root-follow pins the
# same rev via the github remote; narHash verified identical.
go-paperless = {
url = "github:LarsArtmann/go-paperless";
flake = false;
};
# timesheets — timesheet CLI + HTTP API server (PRIVATE repo: git+ssh
# + CI deploy key, journal pattern). Event-sourced timesheets
# (go-cqrs-lite v4, SQLite via --db); `timesheet serve` exposes the
# REST/SSE API + go-health probes (timesheets-serve unit: loopback
# 127.0.0.1:8109 behind the protected registry vHost
# timesheets.home.lan — billing data, no app auth until usermgmt
# ships). NON-FOLLOWER class: packages.default added upstream
# 0304e2a with the go-modules vendorHash probed under its own lock
# (go 1.27.2 source-tarball pin; first-hand probe 2026-11-10), so no
# follows and no consumer shim.
timesheets = {
url = "git+ssh://git@github.com/LarsArtmann/timesheets?ref=refs/heads/master";
};
# invoices — multi-client invoice & timesheet generator CLI
# (PRIVATE repo: git+ssh + CI deploy key). `invoices dashboard` is the
# read-model dashboard over the invoice SQLite DB (invoices-dashboard
# unit: loopback 127.0.0.1:8110 by upstream design — single-user CLI
# dashboard, never LAN-exposed — behind the protected registry vHost
# invoices.home.lan). NON-FOLLOWER class: upstream packages.default
# bakes a vendorHash that reproduces under its own lock (first-hand
# path: probe 2026-11-10); the dashboard REQUIRES config.yaml in the
# CWD (viper ".", no --config flag), so the unit's WorkingDirectory
# is the data dir ~/invoices holding the production config of record.
invoices = {
url = "git+ssh://git@github.com/LarsArtmann/invoices?ref=refs/heads/master";
};
# index — project documentation indexer; the docs-archive-stats
# home-manager timer records the dated-docs history TSV (which lives in
# the index repo and rides its auto-commit) daily at 06:15.
# go-nix-helpers deliberately NOT followed (bank-sync FOD-mismatch trap).
index = {
url = "git+ssh://git@github.com/LarsArtmann/index?ref=refs/heads/master";
};
# go-taskqueue — projects-aware task work queue + agent pool (tq CLI).
# 2026-09-17: interim git+file FLIPPED to github:?ref=master — the push
# backlog landed on origin (master = 1c48478, incl. the vendorHash fix
# from 1a4eb48). go-nix-helpers deliberately NOT followed (bank-sync
# FOD-mismatch trap): the vendorHash was validated with upstream's
# locked helper.
go-taskqueue = {
url = "github:LarsArtmann/go-taskqueue?ref=master";
};
# qmd — on-device hybrid search (BM25 + vector embeddings + LLM rerank)
# for markdown and code; global CLI + MCP server (stdio/HTTP) for Crush.
# nixpkgs is deliberately NOT followed: upstream's nodeModules FOD hash
# was validated with upstream's own nixpkgs bun — a different bun version
# can install a different node_modules tree and break the FOD hash.
# Update by bumping the tag (and re-verifying the CLI + `qmd mcp`).
qmd = {
url = "github:tobi/qmd/v2.8.3";
};
# Shared Go libraries — single source of truth for all Go tool repos.
# IMPORTANT: These are `flake = false` tarballs. They must NOT be
# `follows`-overridden into Go tool flakes — the override changes vendored
# Go module content, breaking vendorHash (fixed-output hash mismatch).
# Only build-infra inputs (nixpkgs, go-nix-helpers, flake-parts,
# treefmt-nix, systems) may be followed into Go tool flakes.
go-finding = {
url = "github:LarsArtmann/go-finding?ref=master";
flake = false;
};
go-output = {
url = "github:LarsArtmann/go-output?ref=master";
flake = false;
};
gogenfilter = {
url = "github:LarsArtmann/gogenfilter?ref=master";
flake = false;
};
go-branded-id = {
url = "github:LarsArtmann/go-branded-id?ref=master";
flake = false;
};
go-filewatcher = {
url = "github:LarsArtmann/go-filewatcher?ref=master";
flake = false;
};
go-error-family = {
url = "github:LarsArtmann/go-error-family?ref=master";
flake = false;
};
cmdguard = {
url = "github:LarsArtmann/cmdguard?ref=master";
flake = false;
};
# cvagent — git history → CV facts + CV-repo mesh export (Code-To-CV-Agent).
# Public repo; ?ref=master per the pin policy (locked rev held until an
# explicit update; probe-build before any lock move). Flakes its own
# packages.default (buildGoModule, go_1_27, own vendorHash) — no follows
# on purpose, vendorHash stability. Consumed by lars-packages (PATH CLI)
# and modules/nixos/services/cvagent.nix (scan+mesh timer).
cvagent = {
url = "git+ssh://git@github.com/LarsArtmann/Code-To-CV-Agent?ref=refs/heads/master";
};
go-nix-helpers = {
# Was INTERIM `git+file:///home/lars/worktrees/go-nix-helpers-vnfix` -
# the /vN pseudo-version normalization fix (8c87f26) now lives on the
# pushed branch `systemnix-vn-version-fix` (public repo, rev verified
# on GitHub 2026-09-16). Tarball fetch needs no auth (public repo,
# no deploy key); CI's insteadOf rewrite keeps covering the transitive
# git+ssh copies. Was pinned to 8c87f265 (systemnix-vn-version-fix
# branch) until the fix landed on master as c42fd778 ("preserve
# module-path major in pseudo-version normalization", verified
# 2026-09-16) — pin dropped per the pin policy; consumer goModules
# FODs re-verified after the lock move.
# project-meta consumes go-nix-helpers.flakeModules.go-standard, so this
# must remain a flake input even though Go libraries are the primary use.
url = "github:LarsArtmann/go-nix-helpers?ref=master";
};
# golangci-lint-auto-configure — auto-configure golangci-lint for Go projects
# ?ref=master since 2026-10-14 (owner master-tracking directive lifted the
# same-day rollback pin ddb54527): upstream moved 69 commits past the pin;
# the goModules vendorHash is probed per lock move and shimmed in
# lib/lars-packages.nix when stale under the followed nixpkgs graph.
golangci-lint-auto-configure = {
# PIN LIFTED 2026-11-11 (templ-API-removal class): upstream tip
# 41e6ed1 regenerated at templ v0.3.1100 — lock-free probe builds the
# package green. Floats on ?ref=master per the pin policy; the
# goModules vendorHash is probed per lock move and shimmed in
# lib/lars-packages.nix when stale under the followed nixpkgs graph.
url = "github:LarsArtmann/golangci-lint-auto-configure?ref=master";
};
# mr-sync — CLI to keep ~/.mrconfig in sync with GitHub repos
# NOTE: Go-module replace deps (go-output, go-branded-id, cmdguard) are NOT
# followed — overriding them changes vendored content and breaks vendorHash.
# Only build-infra inputs are followed.
mr-sync = {
url = "git+ssh://git@github.com/LarsArtmann/mr-sync?ref=refs/heads/master";
};
# go-health-dashboard — federated go-health hub (health.home.lan).
# Consumed for its packages.health-hub buildGoModule output (the flake
# owns the go_1_27 + GOEXPERIMENT=jsonv2 toolchain wiring).
go-health-dashboard = {
url = "github:LarsArtmann/go-health-dashboard?ref=master";
};
# io-surface: the I/O surface manifest gate for Go trees. Extracts every
# I/O call site and checks both directions against a CUE manifest (gate
# face) or runs manifestless detector rules (lint face). Public repo;
# ?ref=master per the pin policy. Flakes its own packages.default
# (go-standard, go_1_27, own baked vendorHash); nixpkgs and
# go-nix-helpers deliberately NOT followed (FOD stability, cvagent
# class). Consumed by lars-packages (PATH CLI via base.nix attrValues).
io-surface = {
url = "github:LarsArtmann/io-surface?ref=master";
};
# erraudit — Error handling pattern analyzer for Go projects
# (GitHub renamed the repo from hierarchical-errors; the input name and
# the mkLarsPackages attr follow the new name. 2026-09-17.)
# ?ref=refs/heads/master since 2026-10-14 (owner master-tracking directive
# lifted the same-day rollback pin d46cb98): root-nixpkgs FOLLOWER class —
# upstream's own hash never reproduces under our followed graph, so the
# goModules vendorHash is shimmed in lib/lars-packages.nix and re-measured
# on upstream source moves (nix-hash-fix evidence only, never by hand).
erraudit = {
url = "git+ssh://git@github.com/LarsArtmann/erraudit?ref=refs/heads/master";
};
# BuildFlow — Zero-configuration build automation for Go projects
buildflow = {
# Branch-ref governed (pin policy 2026-09-16). LOCK HOLD LIFTED
# (2026-09-23): the lock holds 5b3483a, where BOTH prior breakers are
# fixed and PUSHED — the vendorHash (upstream vendorHash.nix = the
# WIFsGV… "got" hash; `nix build .#buildflow` verified clean in
# ~/projects/BuildFlow) and the gvafix.* compile break (fixed in the
# commits after bc999b4). The lars-packages.nix vendorHash shim was
# dropped in the same change per the hold's own instruction. History:
# hold began 2026-09-22 at 7e1fbfe (bc999b4 mid-refactor broke COMPILE;
# root-nixpkgs move re-resolved the FOD graph), interim rollback
# 2026-09-23 after a lock wave jumped to 48d59fc. Standing discipline:
# after any `nix flake lock --update-input buildflow`, probe
# `nix build .#buildflow` before switching, and re-shim ONLY via
# nix-hash-fix evidence, never by hand.
url = "git+ssh://git@github.com/LarsArtmann/BuildFlow?ref=refs/heads/master";
};
# go-auto-upgrade — Automate Go library upgrades
# ?ref=master since 2026-09-17: upstream a6d1e65 refreshed the stale
# vendorHash (FOD + package verified). Bumps flow via
# `nix flake lock --update-input go-auto-upgrade --refresh`.
go-auto-upgrade = {
url = "git+ssh://git@github.com/LarsArtmann/go-auto-upgrade?ref=refs/heads/master";
};
# go-structure-linter — Go project structure validator
go-structure-linter = {
# INTERIM-ROLLBACK (2026-09-23): the wave re-locked to 721c62a0, whose
# go.mod floor (1.27.1) exceeds the followed nixpkgs go (1.26.7) — the
# go-modules FOD dies under GOTOOLCHAIN=local. The lock node was rolled
# back to 96b6a01f (gen-797-proven). Do NOT update-input until upstream
# wires go_1_27 (the library-policy three-wiring-points pattern).
url = "git+ssh://git@github.com/LarsArtmann/go-structure-linter?ref=refs/heads/master";
};
# samber-linter — static analyzer detecting health-washing in samber/do v2 containers
# No goPkgAttr upstream: go-standard auto-selects go_1_27 (go.mod floor
# 1.27.1, nixpkgs default go is 1.26). GOEXPERIMENT=jsonv2 rides the
# upstream extraBuildAttrs; vendorHash lives upstream.
samber-linter = {
url = "github:LarsArtmann/samber-linter?ref=master";
};
# go-cqrs-lite — CQRS/Event-Sourcing library (provides cqrs-lint CLI)
# Go dep inputs (go-finding, go-output, etc.) are NOT followed — overriding
# flake=false tarballs changes vendored content and breaks vendorHash.
go-cqrs-lite = {
# Was the `cqrs-lint-vendorhash-fix` branch pin (d84e4d6a) — a stale
# fork of master that CI could only fetch via deploy key. 2026-09-17:
# master itself carries a FRESHER cqrs-lint vendorHash refresh
# (0b5813f45, FOD + package verified) and 247 commits of the branch
# divergence are folded in, so the input rides master again
# (branch-ref governed per the 2026-09-16 pin policy). git+ssh kept
# (PRIVATE repo; CI fetches via NIX_DEPLOY_KEY_GO_CQRS_LITE).
url = "github:LarsArtmann/go-cqrs-lite/master";
};
# branching-flow — Error context preservation analyzer
branching-flow = {
# Was INTERIM `git+file:///home/lars/projects/branching-flow` - a local
# path that can never resolve on CI (2026-09-15). Flip condition
# satisfied: origin/master (7789334) carries 46000f38 (verified via
# `git merge-base --is-ancestor`). git+ssh fetches on CI via the
# NIX_DEPLOY_KEY_BRANCHING_FLOW deploy key. Branch-ref governed (pin
# policy 2026-09-16: ?ref=master as much as possible; the lock holds
# the exact rev until an explicit update).
url = "git+ssh://git@github.com/LarsArtmann/branching-flow?ref=refs/heads/master";
};
# brandid-lint — BD001/BD003 branded-ID linter CLI (from the PUBLIC
# go-branded-id repo's flake; named after the package, not the repo,
# because `go-branded-id` is already taken below by a non-flake source
# pin). Consumes only `packages.default` (= the CLI; exposed
# 2026-10-11, replacing CV's hand-built ~/go/bin binary). Branch-ref
# governed (pin policy 2026-09-16: ?ref=master; the lock holds the
# exact rev until an explicit update — owner decision 2026-10-11:
# master-tracking, no version pins).
brandid-lint = {
url = "github:LarsArtmann/go-branded-id?ref=master";
};
# docs-gates — the docs-health battery gates (freshness / annotate /
# routing / cadence / strike) as one stdlib-only multi-call binary,
# extracted from the pbx-artmann fleet 2026-11-03. PUBLIC repo
# (Artmann-Technologies org) — anonymous github: tarball fetch, no CI
# auth needed. packages.default = the binary + the five legacy-name
# wrappers (docs-freshness … docs-strike) that exec it. No FOD ever:
# upstream vendorHash = null by the stdlib-only contract, so the
# nixpkgs follow below is unconditionally safe (no toolchain-skew
# re-hash exposure). Branch-ref governed (pin policy 2026-09-16:
# ?ref=main; the lock holds the exact rev until an explicit update).
docs-gates = {
url = "github:Artmann-Technologies/docs-gates?ref=main";
};
# art-dupl — Code duplication detector
art-dupl = {
# Pinned to the fork-branch rev that carries the vendorHash refresh.
# Was INTERIM `git+file:///home/lars/projects/art-dupl` — a local-path
# input that made EVERY CI eval fail (`Git repository ... does not
# exist`: flake-check VM tests + go-deps-audit input evals, 2026-09-15).
# The flip condition (fork branch pushes 9c370324) is satisfied:
# origin/fork contains it. `git+https` with an explicit fork ref
# fetches in CI and stays lock-governed (pin policy 2026-09-16:
# branch refs over rev pins; the lock holds the exact rev until an
# explicit update). (A bare `github:<rev>` URL failed
# to lock: nix's tarball-to-git-tree import dies with a libgit2
# tree-builder error on this repo - the real git+https clone path
# handles it, and the locked narHash is byte-identical to the old
# local pin, so no consumer hash churn.)
url = "git+https://github.com/LarsArtmann/art-dupl?ref=refs/heads/fork";
};
# art-dupl raw source — consumed transitively by dnsblockd (follows this input)
art-dupl-src = {
url = "github:LarsArtmann/art-dupl";
flake = false;
};
# go-commit — Conventional commit helper (consumed by PMA via mkPreparedSource).
go-commit = {
url = "git+ssh://git@github.com/LarsArtmann/go-commit?ref=refs/heads/master";
flake = false;
};
# projects-management-automation — CLI for managing multiple projects with workflow automation
# nixpkgs / go-commit / go-nix-helpers deliberately NOT followed
# (DiscordSync + bank-sync + qmd precedents): PMA's vendorHash was
# validated against ITS own lock — a different mkPreparedSource (helper
# version), go-commit rev, or nixpkgs go changes the vendored module set
# and breaks the go-modules FOD hash (hit live 2026-08-27: go-commit
# master moved past PMA's own pin under the old follows wiring).
# PMA must consume its own locked build environment.
projects-management-automation = {
# ?ref=master since 2026-09-17: upstream 4b634211 refreshed the stale
# vendorHash (FOD + package verified, PMA's own lock). Bumps flow via
# `nix flake lock --update-input projects-management-automation --refresh`.
url = "git+ssh://git@github.com/LarsArtmann/projects-management-automation?ref=refs/heads/master";
};
# project-discovery-daemon — standalone discovery daemon owning
# /run/project-discovery/daemon.sock (flipped from PMA's co-located
# embedded daemon 2026-09-07). Must be at a rev that supports
# PROJECT_DISCOVERY_SEARCH_PATHS and PROJECT_DISCOVERY_SOCKET_MODE.
project-discovery-daemon = {
# UNPINNED 2026-11-03 night: the fix landed on origin/master (a6dd6a3,
# pushed) — pin synced to go-daemon v0.4.0 (0a5d806f), vendorHash
# re-baked, pdd's own FOD build green first-hand. History: the pin was
# restored 2026-11-03 after a corrected, source-verified diagnosis —
# the recorded cause ("symbol only in godmn's unpublished tree") was
# WRONG; ReadNotifyCounters is published in go-daemon v0.4.0 (tagged
# 2026-10-03). The real defect: pdd's OWN flake.nix pinned its
# go-daemon input at 138ce86e (v0.3.0-era, predates notify.go) while
# go.mod required v0.4.0 — mkPreparedSource's replace vendored the
# stale tree, so the FOD compiled against code without the symbol
# (the two-graphs trap).
url = "git+ssh://git@github.com/LarsArtmann/project-discovery-daemon?ref=refs/heads/master";
};
# project-dependency-graph — depgraph CLI: renders the LarsArtmann Go
# monorepo dependency graph (D2/HTML/JSON/…) and answers who-uses/why/
# update-plan/release-suggestions queries. PRIVATE repo → git+ssh
# (deploy-key recipe; see docs/agents/go-ecosystem.md). nixpkgs and
# go-nix-helpers deliberately NOT followed (discordsync/bank-sync
# precedent): the vendorHash is validated against upstream's OWN lock —
# following re-tools the FOD under SystemNix's nixpkgs and re-hashes it
# on every root-nixpkgs bump (the 2026-10-05 a7868a7 wave class).
project-dependency-graph = {
# PIN LIFTED 2026-11-11 (templ-API-removal class + cmdguard/v5 wiring):
# the daemon dep bump moved go.mod to cmdguard/v5 while the flake deps
# map still served v4 (private module without replace) — fixed upstream
# 6b80811f; the templ-1100 regen + vendorHash rode the same wave.
# Lock-free probe green at 05e5b1ae. Floats on ?ref=refs/heads/master;
# bumps flow via `nix flake lock --update-input project-dependency-graph
# --refresh`.
url = "git+ssh://git@github.com/LarsArtmann/project-dependency-graph?ref=refs/heads/master";
};
# project-meta — Per-project metadata management CLI
project-meta = {
url = "git+ssh://git@github.com/LarsArtmann/project-meta?ref=refs/heads/master";
};
# Overview — local project dashboard (discovers and browses git repos via web UI)
# ALWAYS LATEST (owner directive 2026-10-25). The 2026-10-23 rev pin
# was collateral: the `NewAttributeExpression` break came from the
# templ GENERATOR being forced in via `templ-cli.follows` above, while
# the 5 commits past that rev touched only CI config, docs, indirect
# go.mod bumps, module.nix and vendorHash.nix — no .templ source.
# overview now consumes its own templ-cli pin (v0.3.1070 tag).
overview = {
# PIN LIFTED 2026-11-11 (private-dep wiring gap + generator parity):
# the dedup/v4 indirect require is wired in publicDeps (635f832d), the
# Nix-side templ-cli generator bumped to the go.mod's v0.3.1100 (the
# nixpkgs generator emitted calls to the deleted ResolveAttributeValue
# APIs), stale app.css rebuilt, vendorHash re-probed — lock-free probe
# green at f90c9a73. Floats on ?ref=refs/heads/master; bumps flow via
# `nix flake lock --update-input overview --refresh`.
url = "git+ssh://git@github.com/LarsArtmann/overview?ref=refs/heads/master";
};
# DiscordSync — Continuous Discord backup with Turso cloud sync
# Branch-ref governed (pin policy 2026-09-16): flake.nix tracks
# ?ref=master, flake.lock holds the exact rev — df1a2bf0 (2026-09-17:
# first master-head lift since the c0604e46 pin era; upstream's
# vendorHashes were refreshed IN DiscordSync df1a2bf0 after the
# post-pin churn left BOTH goModules FODs stale, +131 commits incl. a
# new ADDITIVE nixos-module option tursoSyncMonthlyBudgetBytes,
# default 2.5 GB/month sync breaker). Bumps flow via
# `nix flake lock --update-input discordsync --refresh` — the
# --refresh is LOAD-BEARING after ref-ahead pushes: the nix daemon
# serves the stale ref→rev resolution from its in-memory fetch cache
# (a sudo daemon restart also clears it; --refresh is the no-sudo
# path, verified 2026-09-17). Known upstream gap: packages.cqrs-lint
# fails AFTER its FOD ("updates to go.mod needed" — go-cqrs-lite cmd
# module drift); SystemNix consumes only packages.default, green.
discordsync = {
# PIN LIFTED 2026-11-11 (templ-API-removal class, fixed UPSTREAM at tip):
# the disgo v0.20 CacheGuild seeding migration (2a3613e9), the
# templ-cli build generator pinned at go.mod's v0.3.1100 (nixpkgs'
# stale generator emitted calls to the deleted APIs), catalog bumped
# to the regenerated v4.14.0, templ-components deps map at the
# v1.27.0 tag rev, go-cqrs-lite tree at a master rev covering the
# post-restructure /v4 dirs — remote probe green at 79e622ab. Floats
# on ?ref=refs/heads/master; bumps flow via
# `nix flake lock --update-input discordsync --refresh` — the
# --refresh is LOAD-BEARING after ref-ahead pushes (daemon fetch
# cache; see 2026-09-17).
# RE-PINNED 2026-11-12 (LOCK-HELD pin, the media-atlas pattern — the
# URL stays branch-tracked and the LOCKED REV holds the pin): the
# 15:57-16:03-era graph proved c471b7ee green (proof2); the daemon's
# 16:20 re-lock floated to 0cff4484 whose checkPhase fails upstream's
# own config_view_wire_test in-sandbox (proof5-final.log builder
# failure, NOT a vendorHash class). This is the 2026-10-23
# rollback-set pattern: hold the last build-proven rev in the lock.
# LIFT: a deliberate re-lock (`nix flake lock --update-input
# discordsync --refresh`) once upstream 0cff4484+ passes its own
# checkPhase in the sandbox.
url = "git+ssh://git@github.com/LarsArtmann/DiscordSync?ref=refs/heads/master";
};
# media-atlas — the MediaAtlas federation hub (`atlas` binary, repo
# ~/projects/media-atlas): one semantic map over Immich + the DiscordSync
# archive (v0.1 plan). Forgejo-primary since 2026-10-28 — the GitHub twin
# is the push mirror the fleet fetches over (nsfw-classifier pattern).
# Branch-tracked with the PIN HELD BY THE LOCK (discordsync pattern):
# the repo's auto-commit daemon lands commits continuously, so ref-track
# + deliberate re-lock at deploy time beats a ?rev= pin (which the
# flake-input-pin-audit would require an allowlist row for). The locked
# rev rode the 2026-10-29 toplevel proof green (docs/status/
# 2026-10-29_18-56_lock-float-wave-unblock-*); the v0.1 deploy re-locks
# (to the tag). Committed vendor/ tree, so no GOPRIVATE fetch setup is
# needed in the sandbox.
media-atlas = {
url = "git+ssh://git@github.com/LarsArtmann/media-atlas?ref=refs/heads/master";
# Sole upstream dep (attr-form nixpkgs url) — eval-only here (the
# package builds from the committed vendor tree), always safe to
# follow the root pin (infra-follows lock-audit rule).
inputs.nixpkgs.follows = "nixpkgs";
};
# nix-email — Declarative mail stack (Stalwart + DMARC monitoring).
# Consumed via the upstream-flake pattern (like inboxclean/discordsync):
# flake.nixosModules.default wraps nixpkgs services.stalwart +
# services.parsedmarc; the consumer wrapper here layers sops secrets,
# onFailure routing, the integration-registry entry and backup
# freshness checks (modules/nixos/services/nix-email.nix).
#
# nixpkgs.follows is REQUIRED, not just convenient: the wrapper is
# eval-verified against OUR nixpkgs services.stalwart module by
# checks.nix-email-contract on every flake check — follows forces our
# pin even when upstream's own lock trails it, so the contract test
# (not a shared rev) is the compat doctrine now. Upstream master has
# its own CI + stalwart/relay/parsedmarc E2E suites since v0.3.0.
nix-email = {
url = "github:LarsArtmann/nix-email";
};
# vision-review-agent — visionreviewd, the event-sourced UI review daemon
# (returned 2026-09-22 after the 2026-09-15 dormant-integration removal;
# this time enabled on evo-x2, pointed at llama-vlm's captioner endpoint)
vision-review-agent = {
# UNPINNED 2026-11-03: upstream restored the go.mod floor to 1.27.2
# (59cc272), fitting our pinned nixpkgs toolchain (fe13242, go 1.27.2
# under GOTOOLCHAIN=local); pin 8cbb0ec9 dropped, probe build green,
# toplevel proof green same day.
url = "github:LarsArtmann/vision-review-agent";
};
# md-go-validator — Validate code blocks embedded in Markdown/MDX docs
# Was INTERIM-pinned to 5b72f894 (2026-09-13 vendorHash wave); master