main
  1_: {
  2  ssh = {
  3    vincent = [
  4      # Yubikeys (PIV - legacy, keep during transition)
  5      "ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBFT5Rx+4Wuvd8lMBkcHxb4oHdRhm/OTg+p5tvPzoIN9enSmgRw5Inm/SlS8ZzV87G1NESTgzDRi6hREvqDlKvxs="
  6      "ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBGHMa4rHuBbQQYv+8jvlkFCD2VYRGA4+5fnZAhLx8iDirzfEPqHB60UJWcDeixnJCUlpJjzFbS4crNOXhfCTCTE="
  7      "ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBBFzxC16VqwTgWDQfw2YCiOw2JzpH3z9XgHtKoHhBdHi2i9m9XUc7fIUeEIIf7P8ARRNd8q5bjvl8JY7LtPkNCU="
  8      # FIDO2 resident keys (homelab)
  9      "sk-ssh-ed25519@openssh.com AAAAGnNrLXNzaC1lZDI1NTE5QG9wZW5zc2guY29tAAAAIODTc5Exm59skgJdu6/rA3CpX4k4P1CFBqCFtelWGGmEAAAAC3NzaDpob21lbGFi homelab-servers"
 10      "sk-ssh-ed25519@openssh.com AAAAGnNrLXNzaC1lZDI1NTE5QG9wZW5zc2guY29tAAAAIAGh5p44LvQrWjAMyC/5LjUnViqFl3ddVfiFnoiLgJb7AAAAEnNzaDpjcml0aWNhbC1pbmZyYQ== infra-touch-required"
 11      # FIDO2 resident keys (okinawa)
 12      "sk-ssh-ed25519@openssh.com AAAAGnNrLXNzaC1lZDI1NTE5QG9wZW5zc2guY29tAAAAIEefW7gStvkrO98v6UUawwa3yOu896Ei8USE/Sh2DjaUAAAABHNzaDo= vincent@okinawa"
 13      # Passage sync keys (non-SK, for automated git pull)
 14      "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBqhe3iS2058Ro8jN0b5Sr1tb+fEyqwgEmEC7vCM0za4 vincent@kyushu-passage"
 15      "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAII/CgISZ5XVyg8eYH7b56EWo4UGplOzzZKdtMKtkZqxc vincent@okinawa-passage"
 16      # Host keys (trusted machines)
 17      "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILJmTdMKYdgqpbQWBif58VBuwX+GqMGsMfB1ey1TKrM3 vincent@aomi"
 18      "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIE3iD9Eaf5xglTyP+kIO9t8qQpF2H42rQ2AuUibs2hn7 vincent@aion"
 19      "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGThdcaPfIaB7d+K5uODqEusLKGI5ZCye0aNOCaMoInO Kyushu's ssh key"
 20      # Boox (osaka) Termux
 21      "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICa0SyAspL7PBPudCjb7oCBG17WRmYnDQF7/BYkFwqDi oksaka-termux"
 22      # Light Phone (suzu) Termux
 23      "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIK0Q1oXzMMJG03n2VoxKKOGruyGBy8V8yanqgeeUYm+N suzu-termux"
 24    ];
 25  };
 26  syncthingFolders = {
 27    sync = {
 28      id = "7dshg-r8zr6";
 29      path = "/home/vincent/sync";
 30    };
 31    documents = {
 32      id = "oftdb-t5anv";
 33      path = "/home/vincent/desktop/documents";
 34    };
 35    org = {
 36      id = "sjpsr-xfwdu";
 37      path = "/home/vincent/desktop/org";
 38      versioning = {
 39        type = "staggered";
 40        params = {
 41          cleanInterval = "3600"; # cleanup every hour
 42          maxAge = "15768000"; # keep for ~6 months (182 days in seconds)
 43        };
 44      };
 45    };
 46    screenshots = {
 47      id = "prpsz-azlz9";
 48      path = "/home/vincent/desktop/pictures/screenshots";
 49    };
 50    wallpapers = {
 51      id = "wpiah-ydwwx";
 52      path = "/home/vincent/desktop/pictures/wallpapers";
 53    };
 54    claude-sync = {
 55      id = "claude-sync"; # new consolidated folder
 56      path = "/home/vincent/.local/share/claude-sync";
 57    };
 58    ai-sync = {
 59      id = "ai-sync"; # unified AI agent storage (sessions, plans, learnings, research)
 60      path = "/home/vincent/.local/share/ai-sync";
 61    };
 62    usage-metrics = {
 63      id = "usage-metrics";
 64      path = "/home/vincent/.local/share/usage-metrics";
 65    };
 66    paperless-media = {
 67      id = "paperless-media";
 68      path = "/neo/paperless/media";
 69      versioning = {
 70        type = "staggered";
 71        params = {
 72          cleanInterval = "3600"; # cleanup every hour
 73          maxAge = "15768000"; # keep for ~6 months (182 days in seconds)
 74        };
 75      };
 76    };
 77    paperless-inbox = {
 78      id = "paperless-inbox";
 79      path = "/neo/paperless/consume";
 80      # No versioning - temporary files get processed and deleted
 81    };
 82  };
 83  net = {
 84    dns = {
 85      cacheNetworks = [
 86        "192.168.1.0/24"
 87        "10.100.0.0/24"
 88      ];
 89    };
 90    vpn = {
 91      endpoint = "46.224.100.116";
 92    };
 93    nfs = {
 94      defaultHosts = {
 95        rhea = {
 96          server = "rhea.sbr.pm";
 97          folders = [
 98            "downloads"
 99            "pictures"
100            "videos"
101          ];
102        };
103        zion = {
104          server = "rhea.sbr.pm";
105          rootPath = "/zion";
106          folders = [
107            "audiobooks"
108            "documents"
109            "ebooks"
110            "music"
111          ];
112        };
113        aion = {
114          server = "aion.sbr.pm";
115          folders = [
116            "audiobooks"
117            "music"
118          ];
119        };
120      };
121    };
122  };
123  machines = {
124    athena = {
125      net = {
126        ips = [ "192.168.1.183" ];
127        vpn = {
128          pubkey = "RWqH7RdIXg+YE9U1nlsNiOC7jH8eWjWQmikqBVDGSXU=";
129          ips = [ "10.100.0.83" ];
130        };
131        names = [
132          "athena.home"
133          "athena.vpn"
134          "athena.sbr.pm"
135        ];
136      };
137      ssh = {
138        hostKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIM/4KRP1rzOwyA2zP1Nf1WlLRHqAGutLtOHYWfH732xh";
139        # root = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFQVlSrUKU0xlM9E+sJ8qgdgqCW6ePctEBD2Yf+OnyME root@aomiy";
140        # vincent = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILJmTdMKYdgqpbQWBif58VBuwX+GqMGsMfB1ey1TKrM3 vincent@aomi";
141      };
142      syncthing = {
143        id = "N3AMUVI-FM2BAOD-U3OMZDJ-UHMQE6J-ACMM5B7-S7BTK6P-PSM36NR-DVZHLQF";
144        folders = {
145          sync = {
146            type = "receiveonly";
147          };
148        };
149      };
150    };
151    demeter = {
152      net = {
153        ips = [ "192.168.1.182" ];
154        vpn = {
155          pubkey = "/bBh4gvDty/AA2qIiHc7K0OHoOXWmj2SFFXdDq8nsUU=";
156          ips = [ "10.100.0.82" ];
157        };
158        names = [
159          "demeter.home"
160          "demeter.vpn"
161          "demeter.sbr.pm"
162        ];
163      };
164      ssh = {
165        hostKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGqQfEyHyjIGglayB9FtCqL7bnYfNSQlBXks2IuyCPmd";
166      };
167      syncthing = {
168        id = "TXCV3TS-TUEOTH6-ETB3LBV-KCIHT4L-RCCOIE3-VPBCNJB-VHQEAYI-WOXK5A5";
169        folders = {
170          sync = {
171            type = "receiveonly";
172          };
173        };
174      };
175    };
176    nagoya = {
177      net = {
178        ips = [ "192.168.1.80" ];
179        vpn = {
180          pubkey = "NCj5pwShre/xyRCK800ybjso1zIYUZ08YvFA2qGzhAI=";
181          ips = [ "10.100.0.80" ];
182        };
183        names = [
184          "nagoya.home"
185          "nagoya.vpn"
186          "nagoya.sbr.pm"
187        ];
188      };
189      ssh = {
190        hostKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIfep1SkMsAPHggXFLfEJNzZb7eoihtkqDeQruG+TbhF";
191      };
192      # syncthing = {
193      #   id = "HZDLS5A-LKCEIYQ-DDMDYDF-DBTSRYH-HUNQSII-TVCDACT-DIYIO7V-G4K2EQV";
194      #   folders = {
195      #     sync = {
196      #       type = "receiveonly";
197      #     };
198      #   };
199      # };
200    };
201    aix = {
202      net = {
203        vpn = {
204          pubkey = "D1HoBqrqBchHOOi8mjKpVg5vZtt+iFy8wj4o3kGYwkc=";
205          ips = [ "10.100.0.89" ];
206        };
207        names = [
208          "aix.vpn"
209          "aix.sbr.pm"
210        ];
211      };
212      syncthing = {
213        id = "GHE6XF4-YCKEMZS-JEZYXA6-ETJI3SS-BQFFOCS-ZJAWN4D-Q33IQ46-OYL7BQM";
214        folders = {
215          sync = {
216            type = "receiveonly";
217          };
218        };
219      };
220      ssh = {
221        hostKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEoUicDySCGETPAgmI0P3UrgZEXXw3zNsyCIylUP0bML";
222      };
223    };
224    kyushu = {
225      net = {
226        ips = [
227          "192.168.1.36"
228          "192.168.1.68"
229        ];
230        vpn = {
231          pubkey = "KVRzoPUw8UTQblYtbs/NLYLIVmtQehrc4Hacbpf5Ugs=";
232          ips = [ "10.100.0.19" ];
233        };
234        names = [
235          "kyushu.home"
236          "kyushu.vpn"
237          "kyushu.sbr.pm"
238        ];
239      };
240      ssh = {
241        hostKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINd795m+P54GlGJdMaGci9pQ9N942VUz8ri2F14+LWxg";
242      };
243      syncthing = {
244        id = "SBLRZF4-NOMC7QO-S6UW7OH-VK7KHQS-LZCESY6-USBJ5Z5-RIVIRII-XS7DGQS";
245        folders = {
246          org = { };
247          documents = { };
248          sync = { };
249          screenshots = { };
250          wallpapers = { };
251          claude-sync = { };
252          ai-sync = { };
253          usage-metrics = { };
254          paperless-media = {
255            type = "receiveonly";
256            path = "/home/vincent/desktop/paperless-media";
257          };
258          paperless-inbox = {
259            path = "/home/vincent/desktop/paperless-inbox";
260          };
261          # TODO: implement paused or filter theses
262          # photos = {
263          #   type = "receiveonly";
264          #   paused = true; # TODO: implement this, start as paused
265          # };
266          # music = {
267          #   type = "receiveonly";
268          #   paused = true; # TODO: implement this, start as paused
269          # };
270        };
271      };
272    };
273    aomi = {
274      net = {
275        ips = [ "192.168.1.23" ];
276        vpn = {
277          pubkey = "XT4D9YLeVHwMb9R4mhBLSWHYF8iBO/UOT86MQL1jnA4=";
278          ips = [ "10.100.0.17" ];
279        };
280        names = [
281          "aomi.home"
282          "aomi.vpn"
283          "aomi.sbr.pm"
284        ];
285      };
286      ssh = {
287        hostKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFQVlSrUKU0xlM9E+sJ8qgdgqCW6ePctEBD2Yf+OnyME";
288      };
289      syncthing = {
290        id = "CN5P3MV-EJ65J4I-OHB7OBI-LD7JBWT-7SZCZD3-Z6NAASI-UCMKOAU-X2TNNAP";
291        folders = {
292          org = { };
293          documents = { };
294          sync = { };
295          screenshots = { };
296          wallpapers = { };
297          claude-sync = { };
298          ai-sync = { };
299          usage-metrics = { };
300          paperless-media = {
301            type = "receiveonly";
302            path = "/home/vincent/desktop/paperless-media";
303          };
304          paperless-inbox = {
305            path = "/home/vincent/desktop/paperless-inbox";
306          };
307          # photos = {
308          #   type = "receiveonly";
309          #   paused = true; # TODO: implement this, start as paused
310          # };
311        };
312      };
313    };
314    shikoku = {
315      net = {
316        ips = [ "192.168.1.24" ];
317        vpn = {
318          pubkey = "foUoAvJXGyFV4pfEE6ISwivAgXpmYmHwpGq6X+HN+yA=";
319          ips = [ "10.100.0.2" ];
320        };
321        names = [
322          "shikoku.home"
323          "shikoku.vpn"
324          "shikoku.sbr.pm"
325        ];
326      };
327      ssh = {
328        hostKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIH18c6kcorVbK2TwCgdewL6nQf29Cd5BVTeq8nRYUigm";
329        vincent = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGxstR3xEf87leVVDS3GVPx8Ap9+eP+OfkSvM26V54XP vincent@shikoku";
330      };
331    };
332    kerkouane = {
333      net = {
334        vpn = {
335          pubkey = "+H3fxErP9HoFUrPgU19ra9+GDLQw+VwvLWx3lMct7QI=";
336          ips = [ "10.100.0.1" ];
337        };
338        names = [
339          "kerkouane.vpn"
340          "kerkouane.sbr.pm"
341        ];
342      };
343      ssh = {
344        hostKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJguVoQYObRLyNxELFc3ai2yDJ25+naiM3tKrBGuxwwA";
345      };
346      syncthing = {
347        id = "QGD6ICB-EPSGCEN-IQWKN77-BCRWE67-56HX5IA-E4IDBCI-WE46DK3-EC63DQ7";
348        folders = {
349          sync = { };
350        };
351      };
352    };
353    # Hetzner Cloud VPS — replacement for kerkouane (DigitalOcean)
354    # TODO: Update pubkey, hostKey, and syncthing id after provisioning
355    carthage = {
356      net = {
357        vpn = {
358          pubkey = "PQD1dtxhy9NMbmfy2OQPeLiQg0Alcfa1Mo4HVN5WqgA=";
359          ips = [ "10.100.0.1" ]; # Takes over kerkouane's VPN server role
360        };
361        names = [
362          "carthage.vpn"
363          "carthage.sbr.pm"
364        ];
365      };
366      ssh = {
367        hostKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHDurbEy1PiidOirbiPXz84ySdv3rwosPTAlCqacc73a";
368      };
369      # syncthing = {
370      #   id = "PLACEHOLDER_UNTIL_INSTALL";
371      #   folders = {
372      #     sync = { };
373      #   };
374      # };
375    };
376    sakhalin = {
377      net = {
378        ips = [ "192.168.1.70" ];
379        vpn = {
380          pubkey = "OAjw1l0z56F8kj++tqoasNHEMIWBEwis6iaWNAh1jlk=";
381          ips = [ "10.100.0.16" ];
382        };
383        names = [
384          "sakhalin.home"
385          "sakhalin.vpn"
386          "sakhalin.sbr.pm"
387        ];
388      };
389      ssh = {
390        hostKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIN/PMBThi4DhgZR8VywbRDzzMVh2Qp3T6NJAcPubfXz6";
391      };
392      syncthing = {
393        id = "3L2KCXM-D75XCVU-5JLMV6V-FKQID2K-LJA6GFB-R2G77LD-5WXFHJT-BB4B7Q5";
394        folders = {
395          org = { };
396          documents = { };
397          sync = { };
398          screenshots = { };
399          wallpapers = { };
400          # photos = {
401          #   type = "receiveonly";
402          #   paused = true; # TODO: implement this, start as paused
403          # };
404        };
405      };
406    };
407    rhea = {
408      net = {
409        ips = [ "192.168.1.50" ];
410        vpn = {
411          pubkey = "QBGdlPgtaLIh+WDLbuIWPL+Nr08mtfIqs6RwgVDAGjA=";
412          ips = [ "10.100.0.50" ];
413        };
414        names = [
415          "rhea.home"
416          "rhea.vpn"
417          "rhea.sbr.pm"
418        ];
419      };
420      ssh = {
421        hostKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKFH3Lk4bRgNyFRK/Hzg1PvVbL/dpyI1SmLJFkb6VQDw";
422      };
423      syncthing = {
424        id = "73YP3XV-X3YLVBD-4KL77TS-DCFFXJ7-AYJDF3R-CJDRZNP-7YFPQNT-FKHJ7QW";
425        folders = {
426          org = { };
427          documents = { };
428          sync = { };
429          screenshots = {
430            path = "/neo/pictures/vincent/screenshots";
431          };
432          wallpapers = {
433            path = "/neo/pictures/vincent/wallpapers";
434          };
435          paperless-media = {
436            type = "receiveonly";
437            path = "/neo/paperless/media";
438          };
439          paperless-inbox = {
440            path = "/neo/paperless/consume";
441          };
442        };
443      };
444    };
445    aion = {
446      net = {
447        ips = [ "192.168.1.49" ];
448        vpn = {
449          pubkey = "Z145TsRbQTASEeAXsGkQR/PGvdI5rhHAXA5wllCKMGI=";
450          ips = [ "10.100.0.49" ];
451        };
452        names = [
453          "aion.home"
454          "aion.vpn"
455          "aion.sbr.pm"
456        ];
457      };
458      ssh = {
459        hostKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAXDNi2KtoRU83y/V5OWnMbFWmxwBknPmrNWV4RChE7R";
460      };
461      syncthing = {
462        id = "YBQ6U6T-TMCZVUG-JNHGLRH-CZNZMHG-GQICVTK-LUXJR3H-KR2SXS7-CTNQCAU";
463        folders = {
464          org = { };
465          sync = { };
466          paperless-media = {
467            path = "/neo/paperless/media";
468          };
469          paperless-inbox = {
470            path = "/neo/paperless/consume";
471          };
472        };
473      };
474    };
475    synodine = {
476      net = {
477        ips = [ "192.168.1.20" ];
478        names = [
479          "synodine.home"
480          "synodine.sbr.pm"
481        ];
482      };
483      ssh = {
484        hostKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDWdnPJg0Y4kd4lHPAGE4xgMAK2qvMg3oBxh0t+xO+7O";
485      };
486    };
487    wakasu = {
488      net = {
489        vpn = {
490          ips = [ "10.100.0.8" ];
491        };
492        names = [
493          "wakasu.vpn"
494          "wakasu.sbr.pm"
495        ];
496      };
497      # syncthing = {
498      #   id = "WM23THJ-ECXRLXA-HE5TIKO-VPLSMRY-Y2EWZI7-Q7JMLPX-5Q5UNEN-QMB7ZQJ";
499      #   folders = {
500      #     org = { };
501      #     documents = { };
502      #     sync = { };
503      #     screenshots = { };
504      #     wallpapers = { };
505      #   };
506      # };
507    };
508    # Home Assistant
509    hass = {
510      net = {
511        ips = [ "192.168.1.181" ];
512        vpn = {
513          ips = [ "10.100.0.81" ];
514        };
515        names = [
516          "hass.home"
517          "hass.vpn"
518          "hass.sbr.pm"
519        ];
520      };
521    };
522    okinawa = {
523      net = {
524        ips = [ "192.168.1.42" ];
525        vpn = {
526          pubkey = "SxH2pDYtAlK79s5K3YwplFm4hRn8lxnl4638IPRZnBk="; # From: sudo wg show wg0 public-key
527          ips = [ "10.100.0.14" ];
528        };
529        names = [
530          "okinawa.home"
531          "okinawa.vpn"
532          "okinawa.sbr.pm"
533        ];
534      };
535      ssh = {
536        hostKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIM8vCZ0h6geJZt6i5k6chEDZBggoyq91Z+oNSjvVeSfW root@okinawa"; # From: cat /etc/ssh/ssh_host_ed25519_key.pub
537      };
538      syncthing = {
539        id = "BTDYRYQ-IOUC6IE-2BRMDDG-4CX6OUU-XCEUMSG-QF5O463-YFTNHTS-3NGRUQX"; # From Syncthing UI (http://localhost:8384)
540        folders = {
541          sync = { };
542          org = { };
543          documents = { };
544          screenshots = { };
545          wallpapers = { };
546          claude-sync = { };
547          ai-sync = { };
548          usage-metrics = { };
549          paperless-media = {
550            type = "receiveonly";
551            path = "/home/vincent/desktop/paperless-media";
552          };
553          paperless-inbox = {
554            path = "/home/vincent/desktop/paperless-inbox";
555          };
556        };
557      };
558    };
559    # iPhone
560    hokkaido = {
561      net = {
562        ips = [ "192.168.1.115" ];
563        vpn = {
564          pubkey = "rN5ekYI/k3Ymd76vudCZtcaNNu6HmMLzB61uRXakV0M=";
565          ips = [ "10.100.0.5" ];
566        };
567        names = [
568          "hokkaido.home"
569          "hokkaido.vpn"
570          "hokkaido.sbr.pm"
571        ];
572      };
573      syncthing = {
574        id = "XD4XYNZ-DT3PJEY-UJYBHWX-6OQPPUI-HTW752L-FYTX3TW-GVHDTKW-PT336QV";
575        folders = {
576          documents = { };
577          sync = { };
578          org = { };
579        };
580      };
581    };
582    # Light Phone
583    suzu = {
584      net = {
585        vpn = {
586          ips = [ "10.100.0.65" ];
587          pubkey = "ufKLXzLkmYx1z7/VZJs9Ix6aXL3rYzP5B73QQP2WNx8=";
588        };
589        names = [
590          # "suzu.home"
591          "suzu.vpn"
592          "suzu.sbr.pm"
593        ];
594      };
595    };
596    # Boox tablet
597    osaka = {
598      net = {
599        vpn = {
600          ips = [ "10.100.0.64" ];
601          pubkey = "IJkiyMdHnhwxN9hFpDNVFKzByyqEQKIyIFBpYst65x8=";
602        };
603        names = [
604          # "oksaka.home"
605          "osaka.vpn"
606          "osaka.sbr.pm"
607        ];
608      };
609    };
610    # Houbeb's macbook pro 16
611    houbeb-makcbook-pro = {
612      net = {
613        vpn = {
614          ips = [ "10.100.0.71" ];
615          pubkey = "RANYR3ouf+3Bh+6kJVF1I0s5iglBGs7ucW6iRyv2cGc=";
616        };
617        names = [ ];
618      };
619    };
620  };
621  services = {
622    # Media services on rhea
623    immich = {
624      host = "rhea";
625      aliases = [ "photos" ];
626    };
627    jellyfin.host = "rhea";
628    jellyseerr.host = "rhea";
629    sonarr.host = "rhea";
630    radarr.host = "rhea";
631    lidarr.host = "rhea";
632    bazarr.host = "rhea";
633    prowlarr.host = "rhea";
634    transmission = {
635      host = "rhea";
636      aliases = [ "t" ];
637    };
638    transmission-music = {
639      host = "rhea";
640      aliases = [ "tm" ];
641    };
642    syncthing = {
643      host = "rhea";
644      aliases = [ "s" ];
645    };
646    homepage.host = "rhea";
647    # Linkwarden bookmark manager (runs on sakhalin, proxied via rhea/Traefik)
648    linkwarden = {
649      host = "rhea";
650      aliases = [ "links" ];
651    };
652    # Traefik dashboard
653    traefik.host = "rhea";
654    # Music streaming on aion (routed through rhea/traefik)
655    music.host = "rhea";
656    navidrome.host = "rhea";
657    # Podcast and audiobook management on aion (routed through rhea/traefik)
658    audiobookshelf.host = "rhea";
659    podcasts.host = "rhea";
660    # Ebook library management on rhea
661    calibre.host = "rhea";
662    books.host = "rhea";
663    # WebDAV on rhea
664    dav.host = "rhea";
665    # MQTT on demeter (routed through rhea/traefik)
666    mqtt.host = "rhea";
667    # Home Assistant on hass (routed through rhea/traefik)
668    home.host = "rhea";
669    # Services on sakhalin (routed through rhea/traefik)
670    kiwix.host = "rhea";
671    n8n.host = "rhea";
672    paperless.host = "rhea";
673    grafana.host = "rhea";
674    # OpenCode web interface on okinawa (routed through rhea/traefik)
675    opencode.host = "rhea";
676    # llama-server on okinawa (routed through rhea/traefik)
677    llm.host = "rhea";
678    # Readwise Reader triage report on okinawa (routed through rhea/traefik)
679    reading.host = "rhea";
680    # SearXNG metasearch engine on aomi (routed through rhea/traefik)
681    search = {
682      host = "rhea";
683      aliases = [ "searxng" ];
684    };
685    # XMPP messaging server on aion (VPN-only, direct access)
686    xmpp.host = "aion";
687  };
688}