Commit Graph
100 Commits
Author SHA1 Message Date
ryan4yin | 二花 e5b95affa6 feat(nixos): default-deny host inbound, trust the LAN/tailnet (#325)
Hosts used to trust the router as the only boundary (servers ran with the
firewall off; service ports were opened globally), so any LAN device could
reach every host service. Move filtering to the hosts as defence in depth
behind the router, which keeps its firewall on and uses a port mapping for
the few ports we actually need.

- base: nftables backend; deny inbound by default; trust the home LAN by
  source and the tailnet by interface (restrict the tailnet with ACLs);
  suppress per-service `openFirewall` global ports; allow node_exporter only
  from the monitoring host. The local podman bridge, the tailnet and the pod
  CIDRs are accepted only after the node_exporter drop.
- servers: stop disabling the firewall; drop redundant global port opens
  (caddy 80/443, NFS 2049, Jellyfin, localsend/test ports); delete the
  redundant desktop firewall module; aarch64/riscv64 import the firewall
  explicitly (akane was missing it).
- k3s: Cilium pods (10.0.0.0/8, fd00::/8) may reach host services; drop the
  flannel-era cni0/flannel.1 trust.
- youko: postgres listens on localhost + the LAN with pg_hba limited to the
  LAN; the NFS export stays LAN-scoped; remove the unauthenticated v2ray
  proxy.
- tests: `security-firewall` asserts every host runs the shared firewall, has
  the LAN CIDR rule and no global ports.
2026-09-26 14:02:03 +08:00
ryan4yin | 二花 2314754655 fix(youko): run transmission in its own network namespace (#324) 2026-09-26 12:48:51 +08:00
ryan4yin | 二花 f326dcb139 docs(agents): Simplifies global rules so agents can understand and follow it easily (#323) 2026-09-26 09:51:42 +08:00
ryan4yin | 二花 9fe6166fd1 feat(homepage): add Jellyfin, alerting, files and k3s-test-1 services (#322) 2026-09-26 00:15:06 +08:00
ryan4yin | 二花 a111676ede feat(youko): add Jellyfin media server (#321)
* feat(youko): add Jellyfin media server

Jellyfin reads the existing Transmission download tree on the public HDD
(via the shared `fileshare` group) and transcodes with the AMD Barceló
iGPU through VA-API. Encoding settings are declared in Nix
(`forceEncodingConfig`), so the web UI cannot silently drift.

Replace the per-service public ACME certificates with a single
`*.writefor.fun` wildcard (plus the apex) shared by every public vhost,
so adding a service needs no new ACME entry; a wildcard also keeps
individual hostnames out of public CT logs.

Pin the jellyfin uid/gid to avoid the dynamic-id drift fixed for the
other services in #320.

* fix(youko): enable graphics for Jellyfin VA-API

VA-API needs Mesa's radeonsi VA driver under /run/opengl-driver, but
youko is headless so hardware.graphics was off. Without it Jellyfin's
ffmpeg fails with 'va_openDriver() returns -1'. Enable it so the iGPU
can be used for hardware transcoding.

* fix(youko): use VA-API hardware encoding for Jellyfin

Enabling hardware decoding alone left encoding on the CPU (libx264), which
pins ~3 cores per 720p stream. Set transcoding.enableHardwareEncoding so
the iGPU (Vega VCN) does the H.264 encode too.

* feat(youko): harden Jellyfin proxy trust, groups, and HEVC encode

Add jellyfin to the render/video groups for robust VA-API access (was
relying on the world-writable render node), enable HEVC hardware encoding
(Vega's VCN supports it; AV1 does not), and patch network.xml on start to
trust Caddy as KnownProxies and advertise the public URL.

* fix(youko): run Jellyfin network.xml patch every start; allow LAN discovery

The module's preStart exits early once encoding.xml matches, so the
mkAfter network.xml patch only ran when encoding settings changed. Run it
with mkBefore instead. Also allow Jellyfin app auto-discovery (UDP 7359 /
TCP 8096) from the home network only.
2026-09-25 23:22:04 +08:00
ryan4yin | 二花 9187e4d920 fix(youko): pin dynamically-allocated service uid/gid (#320)
Service users/groups get a dynamically allocated uid/gid, which shifts when the user set changes: adding `immich` moved gitea 993:985 -> 996:993 and rustfs 987:977 -> 988:983. Files on the persistent volumes keep the old numeric owner, so gitea and rustfs lost access to their data and failed to start after a restart. Pin every dynamically allocated service id on youko to its current value. The ids are host-specific, so this is a host file.
2026-09-25 20:55:02 +08:00
ryan4yin | 二花 5ee8b728b5 fix(restic): use the correct systemd timer option names (#319)
timerConfig was set with lowercase onCalendar/randomizedDelaySec, which systemd treats as unknown directives. The generated timer had no schedule, so `systemctl list-timers` showed NEXT=- and no backup ever ran. Use the real keys OnCalendar/RandomizedDelaySec.
2026-09-25 20:39:59 +08:00
ryan4yin | 二花 4bd463a784 chore(eval): resolve catppuccin and rust-overlay deprecation warnings (#318) 2026-09-25 20:36:26 +08:00
ryan4yin | 二花 793b636fa5 feat(youko): add Immich photo platform (#317)
Add Immich via the native nixpkgs services.immich module on youko, reusing the host PostgreSQL 16 (pgvector + vectorchord) and a shared Valkey instance for Redis-compatible caching and BullMQ queues (Dragonfly rejected BullMQ's dynamic Lua keys). Media lives on the encrypted HDD at /data/apps/immich; Caddy publishes immich.writefor.fun with a publicly-trusted Let's Encrypt cert (security.acme + Cloudflare DNS-01) so the mobile app connects. OTEL metrics are scraped by VictoriaMetrics, and /var/cache is now preserved on the tmpfs-root hosts so the ML model cache survives reboots.
2026-09-25 20:30:01 +08:00
ryan4yin | 二花 6a6950e7eb fix(youko): don't redirect rustfs console STS/S3 calls (#316)
The s3-console Caddy vhost redirected every request to / to /rustfs/console/. The RustFS console frontend signs its own S3/STS requests to / (POST / for STS, GET /?x-id=ListBuckets), so the 302 broke the console session and login failed server-side with SignatureDoesNotMatch ("missing signed header: content-type"). Restrict the redirect to unsigned browser GET /; signed requests now reach RustFS unchanged.
2026-09-25 16:21:12 +08:00
ryan4yin | 二花 7d8d6ec8ad chore(youko): drop redundant loki-gateway Caddy vhost (#315) 2026-09-25 16:09:44 +08:00
ryan4yin | 二花 069e081fec fix(k3s): bind control-plane metrics to node addresses (#311)
* fix(k3s): bind control-plane metrics to node addresses

* docs(microvm): document remote deployment workflow

* fix(microvm): deploy runner before guest switch

* docs(microvm): standardize on just deployment commands

* docs(k3s): explain control-plane metrics address

* docs(hosts): move generic build commands to host guide

* docs: simplify command operation guidance
2026-09-24 11:13:59 +08:00
ryan4yin | 二花 3b13291216 feat(computer-use): sync the X clipboard and document the input-level design (#308)
- run two autocutsel instances so the X PRIMARY/CLIPBOARD selections stay in
  sync, making copy/paste work in the session and through VNC
- drop --disable-blink-features=AutomationControlled: nothing drives the
  browser over CDP, so navigator.webdriver is already false and the flag only
  marked the setup as automated
- document why the driver stays on real X11/AT-SPI input and is never granted
  a CDP attach, and note the SSH-tunnel path for manual VNC access
- extend the computer-use eval test
2026-09-22 20:45:09 +08:00
ryan4yin | 二花 b19818ef44 feat(k8s): add the k3s-test-1 worker nodes (#307)
Add worker-1 (4 vCPU / 16 GiB) on shoryu, and worker-2 (4 vCPU / 16 GiB) plus worker-3 (2 vCPU / 8 GiB) on shushou, as microVMs. They come with a genK3sAgentModule and the per-host/output/home-manager wiring, and are labelled node-role.kubernetes.io/worker=true. The masters keep their control-plane:NoSchedule taint, so workloads land on the workers.
2026-09-21 23:09:13 +08:00
ryan4yin | 二花 ca00d26642 chore: drop the unused darwin proxy set script (#306)
The script pointed the macOS nix-daemon at the homelab v2ray HTTP proxy (192.168.5.101:7890), but that proxy was never running. Remove it together with the just darwin-set-proxy recipe and the README step that referenced it.
2026-09-21 22:33:33 +08:00
ryan4yin | 二花 242c607ce6 feat(k8s): reserve a VIP block and narrow the tailscale routes (#305)
Reserve 192.168.5.192/27 as a dedicated kube-vip block, outside the router's DHCP pool (.2-.99): one /29 per cluster, k3s-test-1 gets .192/29 with the API VIP at .193.

Advertise only youko itself (.183/32) and that block over Tailscale, instead of the whole /24. The /24 route shadowed hosts that are already reachable directly, e.g. idols-ai at 192.168.5.100.

Deploy prerequisites (not in this repo): approve the new Tailscale routes; point kube-vip at the new VIP; move the *.writefor.fun wildcard from .101 to .183 and update scripts/darwin_set_proxy.py, since .101 is no longer advertised.
2026-09-21 22:28:36 +08:00
ryan4yin | 二花 97c2d1325d docs: refresh stale docs after the VM and backup refactors 2026-09-21 22:03:21 +08:00
ryan4yin | 二花 ef00eb31e0 docs: warn that user-readable decrypted secrets must not be read (#303)
Only three secrets are readable as the login user (nix-access-tokens,
ssh-key-romantic and the nushell one); everything else is root-only and
the filesystem already keeps agents out.
2026-09-21 21:18:06 +08:00
ryan4yin | 二花 260da1ee20 chore: rename the nushell secret, and forbid reading decrypted secrets 2026-09-21 21:13:50 +08:00
ryan4yin | 二花 bc6748d021 feat(backup): notify on failure, and 404 unconfigured hostnames (#301)
* feat(backup): notify on failure, and 404 unconfigured hostnames

A failed backup was silent. Post to alertmanager (which routes above-info
to telegram), and have caddy answer 404 instead of its empty 200 for
*.writefor.fun names that are not services.

* docs(backup): say 'cloud copy' rather than 'offsite'

Clearer for a reader who does not live in backup jargon; the requirement
(not in the homelab, immutable) is spelled out in the text.

* docs(secrets): state the recipient invariant

A recipient set must answer two questions: who may read it, and how it is
recovered once those hosts are gone. Dropping recovery_key while narrowing
a secret is easy and silent.

* docs(secrets): state that every secret must be decryptable by the desktops

The desktops hold the trusted admin keys and are where secrets are edited and
rekeyed from; narrowing a set to the servers alone breaks agenix -r and drops
the offline recovery key.

* docs(secrets): desktops and recovery_key have identical access

recovery_key is a member of desktop_keys, so every group written as
desktop_keys ++ ... covers both.

* feat(monitoring): scrape the restic rest-server

Expose /metrics on the loopback-bound server, scrape it with
victoriametrics, and block /metrics on the public vhost.

* docs(backup): record what the metrics actually expose

rest-server only ships the go/promhttp defaults, so repository growth is
charted from node-exporter's filesystem metrics instead.
2026-09-21 21:01:18 +08:00
ryan4yin | 二花 e37042f61c feat(youko): restic backup of the service state to the HDD (part 1) (#299)
* feat(hosts): per-host restic backups to the SMB remote

Replace the disabled aggregate job (which rsynced every host's /persistent
into /tmp - a tmpfs - and silently produced incomplete backups) with one
restic repo per host, backing up its own data directly:

- shared module lib/genResticBackup.nix: secrets, rclone/SMB target
  (rclone:smb-downloads:/Downloads/homelab-backup/<host>), retention, and
  excludes for the regenerable/bulky paths (podman overlay layers, microvm
  and libvirt disk images, nfs golden images, logs, caches)
- youko additionally backs up the service state under /persistent/var/lib
  and dumps all postgres databases first (a consistent SQL artifact beside
  the crash-consistent data dir)
- shoryu/shushou back up /etc/agenix, /etc/ssh and the k3s token

Needs three agenix secrets before it can run: restic-password,
ssh-key-for-restic-backup and rclone-conf-for-restic-backup.

* refactor(hosts): only restic does off-host; btrbk stays local

btrbk works at the subvolume level, so a  would ship the whole
@persistent - including podman's overlay storage, the microVM/libvirt
images and the nfs golden images - which is exactly the regenerable bulk
we want out of the backups.

So: btrbk keeps making the cheap local CoW snapshots (quick rollbacks),
and restic owns the off-host copies with file-level excludes. Back up the
whole /persistent minus those excludes, so nothing is missed.

Update the btrbk module's comment to say so.

* fix(restic): never back up keys; drop the implicit /etc/agenix

restic's own password lives in /etc/agenix, so backing that up would store
the repository's password inside the repository. Exclude agenix, the ssh
host keys and the usual credential dirs (.ssh, .gnupg, .aws, gcloud).

* refactor(restic): make the backup a proper module

Replace lib/genResticBackup.nix with modules/nixos/base/restic-backup.nix,
which declares modules.restic-backup options (enable, repository, paths,
exclude, requiresMountsFor, postgresDump) like the btrbk module does.
youko just sets the options now.

* refactor(restic): exclude the whole podman storage, trim retention

Exclude /persistent/var/lib/containers wholesale: the image layers are
re-pullable and podman's storage DB is not consistent when copied from a
running podman. uptime-kuma's named volume lives there, but its data is
not wanted anyway.

Retention: daily 3, weekly 2, monthly 2 - no yearly.

* refactor(restic): back up a short-lived btrfs snapshot, drop pg_dump

A live copy of a running postgres data dir is only crash-consistent. Instead
of a daily pg_dumpall (which duplicates the data in the repository and gets
slower as the DB grows), take a short-lived read-only btrfs snapshot in
backupPrepareCommand, back that up, and delete it right after - a
consistency step, not a second backup. The excludes are relative now so they
work for both the snapshot and a direct path.

* feat(secrets): restic-password for modules.restic-backup

With the rekeyed secret in nix-secrets (storage group, alongside
hdd-luks-crypt-key), the module's passwordFile resolves.

* fix(restic): agenix's secret is under /run/agenix, not /etc/agenix

* fix(restic): take the password path from agenix, not a hardcoded one

config.age.secrets."restic-password".path follows agenix's secretsDir, so it
stays correct if that changes.
2026-09-21 19:00:35 +08:00
ryan4yin | 二花 bb33cca83a refactor(youko): let preservation own the service state dirs (#298)
* refactor(youko): let preservation own the service state dirs

The services' data now sits on the SSD, so the hand-written dataDir +
systemd.tmpfiles rules are unnecessary: /var/lib is already preserved by
preservation, and the upstream modules create and own their default
state dirs (StateDirectory). Use the defaults:

- gitea /var/lib/gitea, grafana, sftpgo, caddy, victoriametrics,
  postgresql (/var/lib/postgresql/<version>), uptime-kuma, homepage
- drop the per-service tmpfiles rules and victoriametrics' self-bind

Data was moved in place with mv (same filesystem): /persistent/apps/<svc>
(== /var/lib/<svc> via the preservation bind) so nothing was copied.

* refactor(youko): drop caddy's redundant tmpfiles rules

The activation script already creates the fileserver tree with mkdir -p and
the module creates caddy's dataDir, so the rules - and the unused vms
directory they created - are redundant.

* refactor(youko): use a podman named volume for uptime-kuma

podman creates the volume and takes the ownership from the image, so the
kuma user, the tmpfiles rule and the host directory are no longer needed;
the volume lives under /var/lib/containers, which preservation keeps.
2026-09-21 18:06:40 +08:00
ryan4yin | 二花 9ef2fefc25 Merge pull request #295 from ryan4yin/fix/homepage-allowed-hosts
fix(homepage): allow the home.writefor.fun host
2026-09-21 17:37:35 +08:00
ryan4yin | 二花 621da40081 Merge pull request #293 from ryan4yin/feat/genpass-nu-command
feat(shells): add genpass nu command to generate random passwords
2026-09-21 17:14:48 +08:00
ryan4yin | 二花 787b51df25 feat(vms): migrate the idol desktops from KubeVirt to libvirt (#287)
* wip(kubevirt-shoryu): enable libvirt/qemu

* feat(kubevirt-shoryu): enable libvirt/qemu with br0 + no NAT network

* chore: lock the microvm flake input

* feat(kubevirt-shoryu): define the libvirt domains declaratively

* fix(kubevirt-shoryu): pin the kana domain UUID

* feat(kubevirt-shoryu): migrate idols-ruby to libvirt
2026-09-21 15:12:37 +08:00
ryan4yin | 二花 3753396a01 docs(k8s): note the flaky USB bridge and the aquamarine microVM plan (#286) 2026-09-21 13:46:39 +08:00
ryan4yin | 二花 7cedea6161 feat(upload-vm): write the image into the VM's own disk (#285)
The VMs now declare their root disk as a DataVolume with `source: upload`, so
upload straight into `<vm>-disk` (CDI only accepts an upload into a DataVolume)
instead of a shared golden PVC. Takes the disk size as an argument.
2026-09-21 13:42:54 +08:00
ryan4yin | 二花 d40ed42f6c feat(k3s-test-1): add three worker nodes and taint the control plane (#283)
* feat(k3s-test-1): add three worker nodes and taint the control plane

- hosts/k8s/k3s-test-1-worker-{1,2,3} (k3s agents) + flake outputs
- vars/networking: .117/.118/.119 (the .111-.113 range is still held by the
  never-deployed k3s-prod-1 workers)
- k3s-test-1-master-{1,2,3}: nodeTaints=node-role.kubernetes.io/control-plane:NoSchedule
- Justfile: upload the worker images too

* chore(k3s-test-1): move the workers to .111-.113

The k3s-prod-1 entries that held those addresses are gone (nix-config#284).
2026-09-21 12:56:49 +08:00
ryan4yin | 二花 01c6b3290a chore: remove the never-deployed k3s-prod-1 cluster (#284)
It was never bootstrapped (no flux deploy key, VMs commented out since
2024-10) and only carried a stale duplicate of the test cluster's config.

- hosts/k8s/k3s-prod-1-{master,worker}-{1,2,3} + flake outputs + the home module
- the k3s-prod-1-token agenix entry (the .age file lives in the private secrets repo)
- the k3s-prod-1-* IPs, the offlineHosts entries, the Justfile recipes and the docs
2026-09-21 12:53:43 +08:00
ryan4yin | 二花 a4609501c4 feat(kubevirt-youko): serve VM golden images from a shared NFS store (#282)
* feat(kubevirt-youko): export a shared golden-image store over NFS

* feat(vm-images): upload golden images into the cluster

Replace the rsync-to-orangepi5 step with a CDI upload into the golden-image
PVCs (vms/golden-images in k8s-gitops), so VM images no longer depend on the
single-board file server.
2026-09-21 11:21:33 +08:00
ryan4yin | 二花 1c3b826c73 fix(kubevirt): use the correct earlyoom option name (#281)
services.earlyoom.freeMemThresholdPercent does not exist in this nixpkgs; the module exposes freeMemThreshold/freeSwapThreshold. Just enable earlyoom with its defaults (trigger at 10% free mem/swap).
2026-09-21 01:41:26 +08:00
ryan4yin | 二花 12505b415c refactor(kubevirt): memory tuning - drop static hugepages, add zram + earlyoom (#280)
* refactor(kubevirt): drop the static 1G hugetlb pool, use THP on demand

The hosts pre-reserved 48/48/15 GiB of 1G hugepages, but the VMs only used 32/16/11 GiB, so ~52 GiB was stranded (hugetlb is exclusive and cannot be overcommitted or shared with the host / non-hugepage VMs). It also blocked scheduling (a 16 GiB hugepage VM cannot fit on a host with fewer free pages, e.g. youko with 15/24 GiB) and made the full intended VM set (idols 3x8G + k3s-test 3x16G + k3s-prod 3x4G + 3x16G = 132 GiB vs 146 GiB physical) impossible to fit.

Use transparent huge pages on demand (madvise) instead, and let the VMs use ordinary memory (instancetypes updated in k8s-gitops). This frees the stranded memory, removes the scheduling rigidity, and makes overcommit/swap usable again.

* feat(kubevirt): add earlyoom; stop overriding swappiness (zram already enabled)

zram is already provided by modules/nixos/base/zram.nix (enabled by default: 50% RAM, zstd, prio 100 + swappiness/watermark tunings). But genKubeVirtHostModule hard-coded vm.swappiness = 0, which overrode the modules mkDefault 180 and disabled swapping entirely - so the zram device was never used (Swap used: 0B).

- Remove the hard-coded vm.swappiness (let the zram modules tuning apply); the disk swapfile from disko stays as the last resort.
- Add services.earlyoom to kill the greediest process before the host thrashes / OOMs.
2026-09-21 01:39:51 +08:00
ryan4yin | 二花 64a81f16ec fix(victoriametrics): enable dedup to accept duplicate samples (#279)
vmagent (and other senders) can deliver the same series+timestamp twice (retries/HA), which vmsingle rejected with "duplicate sample for timestamp; overrides not allowed". Set -dedup.minScrapeInterval=30s (>= the senders scrapeInterval) so duplicates collapse instead of being rejected.
2026-09-21 01:21:09 +08:00
ryan4yin | 二花 88697ce861 feat(kubevirt): use a Linux bridge + Cilium instead of OVS/flannel (#278)
- genKubeVirtHostModule: replace the Open vSwitch bridge (ovsbr1) with a Linux
  bridge br0 for the VMs secondary network; the bridge CNI plugin attaches the VM
  taps to br0 and the host keeps its address on br0. Drop the now-unused
  multus-cni host package.
- kubevirt hosts: stop forcing disableFlannel = false, so k3s disables flannel and
  Cilium provides the pod network.
2026-09-21 00:37:15 +08:00
ryan4yin | 二花 efb5c08696 Merge pull request #274 from ryan4yin/fix/nixpak-pulse-audio
fix(nixpak): repair sandboxed audio and deduplicate mounts
2026-09-20 09:43:21 +08:00
ryan4yin | 二花 34f2ef05f1 Merge pull request #273 from ryan4yin/feat/noctalia-v5
feat(noctalia): upgrade to the native v5 shell
2026-09-19 15:12:24 +08:00
ryan4yin | 二花 cd4253476c Merge pull request #272 from ryan4yin/fix/system-audit-bugs
fix: resolve audited system component bugs
2026-09-19 12:15:27 +08:00
ryan4yin | 二花 f8d12ada24 feat(btrbk): make snapshots explicit, guarded, and stored in @snapshots (#271)
* feat(btrbk): make snapshots explicit and guarded

Replace the always-on, hardcoded module with modules.btrbk options (enable/volume/subvolume/snapshotDir/target/onCalendar), and assert the btrfs top-level subvolume is mounted so a missing mount fails evaluation instead of silently failing at runtime.

Store snapshots in the @snapshots subvolume (snapshot_dir=@snapshots) rather than next to the live subvolume, make the off-host target explicit and off by default, and document that local snapshots are not off-host backups.

Enable the feature explicitly on idols-ai, shoukei and the three kubevirt hosts; qemu-guest now disables it through the option. Add eval tests for shoukei and ai.

* feat(monitoring): alert on btrbk snapshot failure

Add HostBtrbkSnapshotFailed on node_systemd_unit_state for btrbk-btrbk.service, so a broken snapshot schedule alerts instead of only surfacing in the journal.
2026-09-19 11:43:11 +08:00
ryan4yin | 二花 85af66801f docs(agents): add SRE change guardrails and refine global rules (#269)
* docs(agents): bind authorization to the change boundary

* docs(agents): require target identity confirmation

* docs(agents): classify operations by impact, not command form

* docs(agents): require reviewed previews for high-risk IaC

* docs(agents): verify production changes beyond exit codes

* docs(agents): sync new-script eval with current rules

* docs(agents): split global rules evals into smoke and extended

* docs(agents): refine change guardrails wording

- scope the guardrails to any environment, not only production
- preview high-risk changes with plan, diff, or dry-run
- trim redundant examples and simplify target identity confirmation
- confirm unclear targets with the user instead of stopping
2026-09-14 20:28:21 +08:00
ryan4yin | 二花 9db935bc87 fix(sunshine): use Intel rendering and recover remote Niri sessions (#268)
- render Niri on the Intel iGPU while retaining NVIDIA-connected physical outputs
- encode Sunshine streams with Intel VAAPI and wait for a Niri output before startup
- load VKMS persistently for headless sessions and configure `Virtual-1` at 2560x1600@60
- let Moonlight request the stream bitrate instead of enforcing a 20 Mbps host cap
- remove unsupported Dynamic Boost and global NVIDIA session overrides
- grant Sunshine access to virtual input devices
- add a Nushell recovery helper that starts a temporary greetd/Niri session from SSH
- identify and safely replace normal, standalone, or previous transient Niri sessions
- launch the transient service in the background and verify greetd, Niri, and Sunshine before returning
- ignore local `.worktrees` directories and keep eval regression coverage focused on structural behavior
2026-09-01 03:40:48 -06:00
ryan4yin | 二花 16e48e5740 fix(darwin): remove unused aerospace configuration (#267) 2026-08-29 17:32:24 +08:00
ryan4yin | 二花 21d64e7add security: hardening pass 1 (AppArmor, firewall default, loopback metrics, k3s perms, SSH X11) (#266)
* security: make firewall secure-by-default, disable explicitly on servers

Flip the base firewall default to ON so new hosts are protected by default. Servers keep the firewall off (trusted internal LAN, WAN protected at the router) via explicit overrides in modules/nixos/server/{server,server-aarch64}.nix. Behavior-preserving for all 18 current hosts; adds a security-firewall eval test guarding the per-host state.

* test: fix security-firewall eval test to scalar per-host values

* security: enable AppArmor (complain) on all Linux hosts

* security: bind aquamarine metrics exporters to loopback

* security: restrict k3s kubeconfig file mode to 600

* security: disable SSH X11 forwarding on servers, keep on desktops

* security: add conservative systemd hardening to aquamarine services

* docs(apparmor): correct FHS-alias comment (nixpkgs has no broad FHS layer)

nixpkgs only creates /run/current-system, /usr/bin/env and /bin/sh; it does not
provide a broad FHS->store alias tree, so FHS-oriented abstractions are incomplete
on NixOS. They are safe only because the profiles run in complain mode.

* fix(aquamarine): scrape same-host exporters over loopback

The v2ray/postgres/sftpgo exporters were bound to 127.0.0.1 but VictoriaMetrics
scraped them via the host's routable IP, so those scrapes refused connections.
Point the three same-host scrape targets at 127.0.0.1 (VM runs on the same host).
node-exporter keeps the host IP since it binds 0.0.0.0.

* Revert "security: add conservative systemd hardening to aquamarine services"

This reverts commit f9cf99dadb.
2026-08-27 00:13:01 +08:00
ryan4yin | 二花 6e0d44c50d feat(nixos): manage scattered trash dirs with trash-cli retention timer (#265)
* feat(nushell): add trash command using the home trash can

On a tmpfs root with persistent dirs bind-mounted in, `rm --trash`
scatters items into per-mount .Trash-$uid dirs that file managers never
show, and gio refuses to trash on those internal mounts.

Add a `trash` command implementing the freedesktop trash spec
'failsafe' mode: items are moved to ~/.local/share/Trash with
spec-compliant .trashinfo entries, so Thunar can list and restore them.

Also preserve ~/.local/share/Trash on idols-ai so the trash survives
reboots.

* feat(nixos): manage scattered trash dirs with trash-cli retention timer

Replace the hand-written nushell trash command with the established
trash-cli tooling. On a tmpfs root with persistent dirs bind-mounted
in, the trash crate (nushell rm --trash) scatters items into per-mount
.Trash-$uid dirs that file managers never show and nothing cleans up.

- add trash-cli to system packages: trash-list scans/trash-restore
  handles every mount point's trash dir
- daily systemd timer runs 'trash-empty 30 -f', purging items older
  than 30 days across the home trash and all mount points
- drop the hand-written trash.nu module
- note in preservation.nix: do NOT persist ~/.local/share/Trash; a
  bind-mounted trash dir breaks the trash crate's home-topdir match
  for files straight under $HOME (it would try /.Trash-$uid, EACCES)

* fix(nixos): order trash-empty after preservation.target

The scattered .Trash-$uid dirs live inside the preservation bind
mounts, which use DefaultDependencies=no and are therefore NOT ordered
after local-fs.target. Add preservation.target to After= so trash-empty
only runs once all those mounts are up.
2026-08-23 23:40:53 +08:00
Ryan Yin cfc192afc4 feat: replace vscode with zed-editor (#263)
* feat: replace vscode with zed-editor
* docs: helix
2026-06-04 23:20:59 +08:00
Ryan Yin fe4923f8cb fix: suppress nixvim nixpkgs.source and ssh matchBlocks deprecation warnings (#262)
Explicitly set programs.nixvim.nixpkgs.source to suppress the follows
    warning, and migrate all programs.ssh.matchBlocks to programs.ssh.settings
    using upstream PascalCase directive names.
2026-06-03 11:23:30 +08:00
Ryan Yin 662316c18a Nixos 26.05 (#261)
* flake.lock: Update

Flake lock file updates:

• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/7aaa00e7cc9be6c316cb5f6617bd740dd435c59d?narHash=sha256-WacE23EbHTsBKvr8cu%2B1DFNbP6Rh1brHUH5SDUI0NQI%3D' (2026-04-30)
  → 'github:NixOS/nixpkgs/e9a7635a57597d9754eccebdfc7045e6c8600e6b?narHash=sha256-u6WU/yd/o8iYQrHX3RAwO1hYa3LkoSL%2BWNQD0rJfJZQ%3D' (2026-05-29)

* feat: upgrade to nixos 26.05
2026-06-01 10:02:49 +08:00
Ryan Yin ce49423247 feat(neovim): migrate to nixvim with minimal plugins (#260)
Replace bare programs.neovim with programs.nixvim. Only 3 plugins:
neo-tree (file explorer), catppuccin (colorscheme), treesitter.

Add core editor opts matching helix defaults: clipboard, cursorline,
scrolloff, wrap, mouse, undofile, smart search, split direction.
Enable 5 LSP servers: nixd, rust-analyzer, gopls, pyright, bashls.

Signed-off-by: Ryan Yin <xiaoyin_c@qq.com>
2026-05-09 18:12:17 +08:00
Ryan Yin 74a9106917 security(home): drop all neovim plugins to shrink supply-chain exposure (#259)
* chore(home): drop AstroNvim bundle and centralize editors

Remove the bundled Neovim plugin tree to shrink supply-chain exposure; keep a
minimal programs.neovim backup. Daily editing stays Helix-first with Yazi and
Zellij.

- Add Helix/Neovim docs, glossary, and cheatsheets under core/editors/.
- Default EDITOR/VISUAL to hx; use SUDO_EDITOR nvim --clean for sudoedit and
  other sensitive edits; adjust Nushell buffer_editor accordingly.
- Apply Helix Home Manager settings (keys, editor UI) in core/editors/helix.
- Keep heavy language-server tooling only in home/base/tui/editors/packages.nix;
  wire it via an explicit default.nix import so core stays lightweight.
- Extend modules/base packages.nix where that profile sets global editor env.

* docs: link editors, VS Code, and agents from README

Document tui/editors versus core/editors; add root README pointers to GUI
vscode (Home Manager) and agents/. Cross-link heavy packages README from
core/editors.
2026-04-27 21:31:58 +08:00
Ryan Yin 306741c2a7 feat: idols-ai - use intel intel iGPU by default, choose Nvidia dGPU manullay - via prime (#258)
* feat: idols-ai - use intel intel iGPU by default, choose Nvidia dGPU manullay - via prime

* fix: niri - update output names for new motherboard

* fix: niri - DP-1 with prime offload mode - supports only 120HZ

* flake.lock: Update

Flake lock file updates:

• Updated input 'nixpkgs-master':
    'github:nixos/nixpkgs/3879e47ce293fb2932d656aa56551a8e80718533?narHash=sha256-siN4x7y/S0FOdjPC1W0Z/vrX4Rlu%2BVClkEGngmSd0vM%3D' (2026-03-24)
  → 'github:nixos/nixpkgs/03de9fe87cb2dcec8da9dbaa3ad1c71ea7fef223?narHash=sha256-B7GmxbRADkklyXzV1ahgY4QhCpbQ3crzPCCs2hf6bPM%3D' (2026-04-26)

* flake.lock: Update

Flake lock file updates:

• Updated input 'nixpkgs-stable':
    'github:nixos/nixpkgs/e9f278faa1d0c2fc835bd331d4666b59b505a410?narHash=sha256-Jms57zzlFf64ayKzzBWSE2SGvJmK%2BNGt8Gli71d9kmY%3D' (2026-03-14)
  → 'github:nixos/nixpkgs/a4bf06618f0b5ee50f14ed8f0da77d34ecc19160?narHash=sha256-AIiMJiqvGrN4HyLEbKAoCSRRYn0rnlW5VbKNIMIYqm4%3D' (2026-04-25)
2026-04-27 02:33:51 +08:00
Ryan Yin 4098b0282e fix: update interface name after replace montherboard (#257) 2026-04-27 00:47:07 +08:00
Ryan Yin 551020e0e8 feat: nixos - Screenshot Annotation via satty (#256)
Signed-off-by: Ryan Yin <xiaoyin_c@qq.com>
2026-04-09 10:24:43 +08:00
Ryan Yin 4fd5c4c374 Merge pull request #255 from ryan4yin/feat/tailscale-home-host-migration
Move Tailscale role and host Home Manager config layout
2026-03-23 12:40:09 +08:00
Ryan Yin b143a89443 feat(ai): add webdav mount (#253)
feat(aquamarine): add group for filesharing, protect /data on subvolume mount failures
2026-03-19 22:25:48 +08:00
Ryan Yin ce99c3e2d3 Update aqua (#252)
* fix: Grafana's secret key doesn't have a default value anymore

flake.lock: Update

Flake lock file updates:

• Updated input 'mysecrets':
    'git+ssh://git@github.com/ryan4yin/nix-secrets.git?ref=refs/heads/main&rev=cfe34c222cf7ee4290438c97e6cc734aa7792346&shallow=1' (2025-12-18)
  → 'git+ssh://git@github.com/ryan4yin/nix-secrets.git?ref=refs/heads/main&rev=86de5313787257806723f03dccabd52bb7501ff3&shallow=1' (2026-03-18)

* fix: gitea sendmail path

* fix: transmission_4
2026-03-19 01:02:42 +08:00
Ryan Yin f6aa45aa00 feat: idols-ai - add new data disk via disko (#250)
feat: luks automatic unlock via tpm2 chip for all physical hosts
feat: enable login manager
fix: Rename network interface config back following hardware change
2026-03-18 22:26:08 +08:00
Ryan Yin 3dbc94c3de feat: run ai agents on homelab (#251)
* feat: run ai agents on kana & ruby

* fix: upload vm
2026-03-17 10:31:18 +08:00
Ryan Yin 2a5a196591 fix: NVMe SSD Timeout / Freeze Fix for Linux (#249) 2026-03-16 11:10:01 +08:00
Ryan Yin a5295500f1 refactor: migrate idols-ai to new ssd (#247)
* refactor: migrate idols-ai to new ssd

* fix: github repo mi2ebi/tree-sitter-bovex 404
• Updated input 'helix':
    'github:mattwparas/helix/908d48c5dd9700ddff65bcfce8850eea74af0360?narHash=sha256-hXxc3JqZ%2BxF2VjTOczmYHVttRIWlxGh5RmYZ9OcMPD8%3D' (2026-02-15)
  → 'github:mattwparas/helix/bb5efb6ec09792a91dc6b4dec1a4d6534b7185dc?narHash=sha256-FfbsMeo8p0JUUCf4TnYu5G35vVkFSuqh%2BEHXHyV1/UI%3D' (2026-03-13)

* chore: disable helix

* fix: failed to mount swapfile
2026-03-16 10:07:08 +08:00
Ryan Yin 69f77fecca feat: new host - idols-akane, hardens VFAT /boot mounts (#245)
* feat: new host - idols-akane

* fix: missing efi files

* fix: efi partition - permission issue
2026-03-07 23:54:13 +08:00
Ryan Yin e83b7a867f refactor: auto start apps on login via xdg-autostart (#242)
Signed-off-by: Ryan Yin <xiaoyin_c@qq.com>
2026-01-03 11:03:14 -06:00
Ryan Yin 74c8912897 refactor: replace gammastep by noctalia-shell, update README (#241) 2026-01-03 10:06:22 -06:00
Ryan Yin fb7a0cd178 feat: replace waybar/mako/anyrun/wlogout/swaylock with noctolia-shell, remove hyprland (#240) 2026-01-03 09:36:54 -06:00
Ryan Yin 72d14c7c9b Merge pull request #239 from ryan4yin/update
feat: update inputs, remove asahi's mesa workaround
2025-12-25 13:17:21 +08:00
Ryan Yin a0fc2040a9 Keybindings and waybar (#238)
* feat: niri & hyprland - adjust keybindings
* feat: waybar - add micphone icon, use WirePlumber, etc
2025-12-19 01:52:39 -06:00
Ryan Yin 29760ddb27 refactor: update niri, write config in kdl, remove niri-flake (#237)
• Updated input 'nixpkgs':
  → 'github:NixOS/nixpkgs/0254eab410b90ef2420c1059f908ae777e3b02f9?narHash=sha256-/US2Ei9JHXHVBAxV4FX49Q7H5s4UNBrIiOA6Xjzgq44%3D' (2025-12-06)

• Updated input 'home-manager':
    'github:nix-community/home-manager/f4cb25928fafa9ae68660fe71f730fc820a59028?narHash=sha256-5xOuutXM7UPTUcn3uDAD8UlPQsXmqPrX81cXoDOAGcA%3D' (2025-11-26)
  → 'github:nix-community/home-manager/89c9508bbe9b40d36b3dc206c2483ef176f15173?narHash=sha256-rB45jv4uwC90vM9UZ70plfvY/2Kdygs%2BzlQ07dGQFk4%3D' (2025-12-17)

• Updated input 'nixpkgs-master':
    'github:nixos/nixpkgs/6812bcfd614abedbdb3f68d7b6554eda6ca3e014?narHash=sha256-sNF/PZcuzYBHKRBkerEiPf5mkZM15A3fWD%2BlqpwKc60%3D' (2025-12-15)
  → 'github:nixos/nixpkgs/e50ab9bb181f9fb3ce00e7a6007c70ddaa007203?narHash=sha256-acPMRCAPgPykzkwATwD1EfF7xgmbraAvIJyCeR6bKxc%3D' (2025-12-18)

Signed-off-by: Ryan Yin <xiaoyin_c@qq.com>
2025-12-18 19:56:46 -06:00
Ryan Yin 3bf1b986cf feat: upgrade nixpkgs stable to 25.11, update nixos-apple-silicon, gh… (#236)
* feat: upgrade nixpkgs stable to 25.11, update nixos-apple-silicon, ghostty, anyrun, etc
* fix: asahi-nixos - revert mesa to 25.2.6
* fix: disable gitui - it's broken on aarch64-darwin currently

---------

Signed-off-by: Ryan Yin <xiaoyin_c@qq.com>
2025-11-26 20:54:44 -06:00
Ryan Yin def33a486b fix: vscode - password-store (#235)
* feat: vscode + code-cursor, fix password-store, update

Signed-off-by: Ryan Yin <xiaoyin_c@qq.com>
2025-11-16 07:47:47 -06:00
Ryan Yin 62bac83db4 fix: README - badge 2025-11-12 07:23:28 -06:00
Ryan Yin e0d0ff9203 flake.lock: Update (#233)
* flake.lock: Update

Flake lock file updates:

• Updated input 'aagl':
    'github:ezKEa/aagl-gtk-on-nix/944f9903859ad16db762fbe573fb6f05f7367e16?narHash=sha256-SeDqOZQoARl/xxEMdej09IScCf77SEQfRAjED7lBgMY%3D' (2025-09-22)
  → 'github:ezKEa/aagl-gtk-on-nix/1172be1377bc65581004f4d5927b58c5c7d96639?narHash=sha256-OAXK4p7WIYUcp8xx9m0RZUpV6XUDEhkoM4efI8dzPiU%3D' (2025-11-03)
• Updated input 'aagl/flake-compat':
    'github:edolstra/flake-compat/9100a0f413b0c601e0533d1d94ffd501ce2e7885?narHash=sha256-CIVLLkVgvHYbgI2UpXvIIBJ12HWgX%2BfjA8Xf8PUmqCY%3D' (2025-05-12)
  → 'github:edolstra/flake-compat/f387cd2afec9419c8ee37694406ca490c3f34ee5?narHash=sha256-XKUZz9zewJNUj46b4AJdiRZJAvSZ0Dqj2BNfXvFlJC4%3D' (2025-10-27)
• Updated input 'aagl/rust-overlay':
    'github:oxalica/rust-overlay/d2bac276ac7e669a1f09c48614538a37e3eb6d0f?narHash=sha256-kx2uELmVnAbiekj/YFfWR26OXqXedImkhe2ocnbumTA%3D' (2025-09-22)
  → 'github:oxalica/rust-overlay/59c45eb69d9222a4362673141e00ff77842cd219?narHash=sha256-myRIDh%2BPxaREz%2Bz9LzbqBJF%2BSnTFJwkthKDX9zMyddY%3D' (2025-10-30)
• Updated input 'catppuccin':
    'github:catppuccin/nix/2e0aacdd6abbecd1b1c0511a2fcd1460a6bc6645?narHash=sha256-yqh6EEhlpVWRoKl85o1s%2BQZ72UHWTvornnc3C0Ls484%3D' (2025-09-19)
  → 'github:catppuccin/nix/728cb0a667ce37bb0c68557dba819c7fb54ff1c8?narHash=sha256-KGoSj8qMOOPaNE48RTtuNBbqOvKLTeklnRHWWvE/TXo%3D' (2025-11-07)
• Updated input 'ghostty':
    'github:ghostty-org/ghostty/f97518cc100599186846282457be520fda11f467?narHash=sha256-y0B40QQ//4fpTAUfhZjoDEiUejhb2hXl5LcpNenRpYM%3D' (2025-09-23)
  → 'github:ghostty-org/ghostty/bed219c132f1940a23eba50cdd7a40e4c2718149?narHash=sha256-sic0p21KmUz/u9KsdVTIfZRDDRg9brTWs2IDb4F%2By48%3D' (2025-11-10)
• Updated input 'ghostty/nixpkgs':
    'https://releases.nixos.org/nixos/25.05/nixos-25.05.802491.7c43f080a7f2/nixexprs.tar.xz?narHash=sha256-zRDR%2BEbbeObu4V2X5QCd2Bk5eltfDlCr5yvhBwUT6pY%3D' (2025-05-25)
  → 'https://releases.nixos.org/nixpkgs/nixpkgs-25.11pre877938.82c2e0d6dde5/nixexprs.tar.xz?narHash=sha256-sV6pJNzFkiPc6j9Bi9JuHBnWdVhtKB/mHgVmMPvDFlk%3D' (1980-01-01)
• Updated input 'ghostty/zig':
    'github:mitchellh/zig-overlay/aafb1b093fb838f7a02613b719e85ec912914221?narHash=sha256-3i0IL3s18hdDlbsf0/E%2B5kyPRkZwGPbSFngq5eToiAA%3D' (2025-05-26)
  → 'github:mitchellh/zig-overlay/365085b6652259753b598d43b723858184980bbe?narHash=sha256-/zj5GYO5PKhBWGzbHbqT%2BehY8EghuABdQ2WGfCwZpCQ%3D' (2025-10-14)
• Updated input 'home-manager':
    'github:nix-community/home-manager/676c0159ed51d10489a249ecdc61e115c2a90d03?narHash=sha256-XhSTUBFOtuumxAUVxTVD5k7nE/FgK11YUxAgzNQcmLU%3D' (2025-09-24)
  → 'github:nix-community/home-manager/37a3d97f2873e0f68711117c34d04b7c7ead8f4e?narHash=sha256-t2U/GLLXHa2%2BkJkwnFNRVc2fEJ/lUfyZXBE5iKzJdcs%3D' (2025-11-10)
• Updated input 'niri':
    'github:sodiboo/niri-flake/6e26dd2cece5430571b45ffe3d97213431b3e86f?narHash=sha256-/f1k6oL2UqpDxe0MasJyLpXJj80Az/TxBbEf4hinmgI%3D' (2025-09-23)
  → 'github:sodiboo/niri-flake/44c5a2c19b7b22d1b2375ef95f656291a0af3a1b?narHash=sha256-eu8Gkb/y/5pRS3Ml/sg3oeUtFFzlJMpDrJRgPgOXz38%3D' (2025-11-10)
• Updated input 'niri/niri-unstable':
    'github:YaLTeR/niri/3850739e445b95a73c2466a718ccaf3a9a406c06?narHash=sha256-EQecFZ5VZtNjN/yzDA/RV13fK3EdLPblcf9p5wVNACo%3D' (2025-09-23)
  → 'github:YaLTeR/niri/978c4e6c8afc0199e2cbd9037bdc7c41fbbab2a3?narHash=sha256-LCddK36/6u73jed1yuqbu6JKWIITsc42qoM883DgwJg%3D' (2025-11-10)
• Updated input 'niri/nixpkgs':
    'github:NixOS/nixpkgs/554be6495561ff07b6c724047bdd7e0716aa7b46?narHash=sha256-pHpxZ/IyCwoTQPtFIAG2QaxuSm8jWzrzBGjwQZIttJc%3D' (2025-09-21)
  → 'github:NixOS/nixpkgs/b6a8526db03f735b89dd5ff348f53f752e7ddc8e?narHash=sha256-rXXuz51Bq7DHBlfIjN7jO8Bu3du5TV%2B3DSADBX7/9YQ%3D' (2025-11-08)
• Updated input 'niri/nixpkgs-stable':
    'github:NixOS/nixpkgs/d1d883129b193f0b495d75c148c2c3a7d95789a0?narHash=sha256-zMTCFGe8aVGTEr2RqUi/QzC1nOIQ0N1HRsbqB4f646k%3D' (2025-09-23)
  → 'github:NixOS/nixpkgs/c2448301fb856e351aab33e64c33a3fc8bcf637d?narHash=sha256-HiRDeUOD1VLklHeOmaKDzf%2B8Hb7vSWPVFcWwaTrpm%2BU%3D' (2025-11-10)
• Updated input 'niri/xwayland-satellite-unstable':
    'github:Supreeeme/xwayland-satellite/03368548ba745e17a85bd631613a59cb2d8469a4?narHash=sha256-sB2GAOjhjoWnjU6A/uHNJiY6O3UeztV5pJAN2g1FkXU%3D' (2025-09-22)
  → 'github:Supreeeme/xwayland-satellite/6338574bc5c036487486acde264f38f39ea15fad?narHash=sha256-Z1TKiux8K09a93w4PFDFsj8HFugXNy3iCC3Z8MpR5Rk%3D' (2025-11-10)
• Updated input 'nix-darwin':
    'github:lnl7/nix-darwin/25381509d5c91bbf3c30e23abc6d8476d2143cd1?narHash=sha256-yGA6MV0E4JSEXqLTb4ZZkmdJZcoQ8HUzihRRX12Bvpg%3D' (2025-09-21)
  → 'github:lnl7/nix-darwin/5125a3cd414dc98bbe2c528227aa6b62ee61f733?narHash=sha256-/QLk1bzmbcqJt9sU43%2By/3tHtXhAy0l8Ck0MoO2%2BevQ%3D' (2025-11-08)
• Updated input 'nix-gaming':
    'github:fufexan/nix-gaming/6418c314274a8ce27078402ab1fbac7c06da7a36?narHash=sha256-Ff5IFCEABf3CStKvf8MqJe7jwrHk2J8swdYTrwOj9dk%3D' (2025-09-24)
  → 'github:fufexan/nix-gaming/eefca17cb40462878ee1c46ac6910b2ec21adaa8?narHash=sha256-M4rbwlO4peCHRvA%2BWNYCmg8je4YBF7kSY9tG%2Bp1kEKo%3D' (2025-11-11)
• Updated input 'nix-gaming/flake-parts':
    'github:hercules-ci/flake-parts/4524271976b625a4a605beefd893f270620fd751?narHash=sha256-%2BuWLQZccFHwqpGqr2Yt5VsW/PbeJVTn9Dk6SHWhNRPw%3D' (2025-09-01)
  → 'github:hercules-ci/flake-parts/26d05891e14c88eb4a5d5bee659c0db5afb609d8?narHash=sha256-xxdepIcb39UJ94%2BYydGP221rjnpkDZUlykKuF54PsqI%3D' (2025-11-06)
• Updated input 'nix-gaming/flake-parts/nixpkgs-lib':
    'github:nix-community/nixpkgs.lib/a73b9c743612e4244d865a2fdee11865283c04e6?narHash=sha256-x2rJ%2BOvzq0sCMpgfgGaaqgBSwY%2BLST%2BWbZ6TytnT9Rk%3D' (2025-08-10)
  → 'github:nix-community/nixpkgs.lib/719359f4562934ae99f5443f20aa06c2ffff91fc?narHash=sha256-b0yj6kfvO8ApcSE%2BQmA6mUfu8IYG6/uU28OFn4PaC8M%3D' (2025-10-29)
• Updated input 'nixpak':
    'github:nixpak/nixpak/17df00be4383dbf88c42ed1fa519cc6dd71df042?narHash=sha256-eGksZmv1ie834yfgJW0z85eZZo10A/JE%2B6dhHNWQajQ%3D' (2025-09-18)
  → 'github:nixpak/nixpak/e4bcce21a735a07c409b696b31c17f6640ca0aa2?narHash=sha256-riBOo30D8DhqQobcIYAC6sDl9PHBUq9ukjS4NjnjEM4%3D' (2025-11-06)
• Updated input 'nixpak/flake-parts':
    'github:hercules-ci/flake-parts/4524271976b625a4a605beefd893f270620fd751?narHash=sha256-%2BuWLQZccFHwqpGqr2Yt5VsW/PbeJVTn9Dk6SHWhNRPw%3D' (2025-09-01)
  → 'github:hercules-ci/flake-parts/0010412d62a25d959151790968765a70c436598b?narHash=sha256-z5PlZ47j50VNF3R%2BIMS9LmzI5fYRGY/Z5O5tol1c9I4%3D' (2025-11-01)
• Updated input 'nixpak/hercules-ci-effects':
    'github:hercules-ci/hercules-ci-effects/1a3667d33e247ad35ca250698d63f49a5453d824?narHash=sha256-ENUhCRWgSX4ni751HieNuQoq06dJvApV/Nm89kh%2B/A0%3D' (2025-09-16)
  → 'github:hercules-ci/hercules-ci-effects/7db2b867219a26781437d840ce457b75b7645154?narHash=sha256-pLE7U5gOtlA/2wbKCsVRYf5DqMQ5TWBCrCfZGytDDeo%3D' (2025-10-23)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/554be6495561ff07b6c724047bdd7e0716aa7b46?narHash=sha256-pHpxZ/IyCwoTQPtFIAG2QaxuSm8jWzrzBGjwQZIttJc%3D' (2025-09-21)
  → 'github:nixos/nixpkgs/b6a8526db03f735b89dd5ff348f53f752e7ddc8e?narHash=sha256-rXXuz51Bq7DHBlfIjN7jO8Bu3du5TV%2B3DSADBX7/9YQ%3D' (2025-11-08)
• Updated input 'nixpkgs-darwin':
    'github:nixos/nixpkgs/a1f79a1770d05af18111fbbe2a3ab2c42c0f6cd0?narHash=sha256-5rdAi7CTvM/kSs6fHe1bREIva5W3TbImsto%2BdxG4mBo%3D' (2025-09-21)
  → 'github:nixos/nixpkgs/e1ebeec86b771e9d387dd02d82ffdc77ac753abc?narHash=sha256-g/da4FzvckvbiZT075Sb1/YDNDr%2BtGQgh4N8i5ceYMg%3D' (2025-11-07)
• Updated input 'nixpkgs-master':
    'github:nixos/nixpkgs/2a8c7895537748fb6d8f0a14c08a482ffe549441?narHash=sha256-MFd2bpd3V/Nr2UhFE0uhF/21JNi5GrbCXqwCFCt4Mlg%3D' (2025-11-01)
  → 'github:nixos/nixpkgs/31fa703ba440e16d86d31598dc0601b117769b91?narHash=sha256-QiSTsHcXiu2O84iPhedQde/62TlUWwj%2BjqoYNpE%2BQ28%3D' (2025-11-11)
• Updated input 'nixpkgs-stable':
    'github:nixos/nixpkgs/d1d883129b193f0b495d75c148c2c3a7d95789a0?narHash=sha256-zMTCFGe8aVGTEr2RqUi/QzC1nOIQ0N1HRsbqB4f646k%3D' (2025-09-23)
  → 'github:nixos/nixpkgs/c2448301fb856e351aab33e64c33a3fc8bcf637d?narHash=sha256-HiRDeUOD1VLklHeOmaKDzf%2B8Hb7vSWPVFcWwaTrpm%2BU%3D' (2025-11-10)
• Updated input 'nu_scripts':
    'github:nushell/nu_scripts/0b97c5e1444b13db7c263bee646dea1e1ffe4ddb?narHash=sha256-tKMLaSNniylbo9f0wdUzUZm059RPqyFQlxMtiTPIkWQ%3D' (2025-10-15)
  → 'github:nushell/nu_scripts/449dd3d06598714c2ba0ee3fa3556e24d034c624?narHash=sha256-4ibgz7y1fsBn2aDuptqpdLd4Wdfx2sKGs7wVRJxCWW0%3D' (2025-11-02)
• Updated input 'pre-commit-hooks':
    'github:cachix/git-hooks.nix/54df955a695a84cd47d4a43e08e1feaf90b1fd9b?narHash=sha256-ytw7ROXaWZ7OfwHrQ9xvjpUWeGVm86pwnEd1QhzawIo%3D' (2025-09-17)
  → 'github:cachix/git-hooks.nix/8e7576e79b88c16d7ee3bbd112c8d90070832885?narHash=sha256-j%2BrNQ119ffYUkYt2YYS6rnd6Jh/crMZmbqpkGLXaEt0%3D' (2025-11-06)

* fix: adb and fastboot's udev rules are now integrated within systemd

* fix: programs.git - renamed options

* fix: package rename

* fix: comment out joplin-desktop - Electron version 36.9.5 is EOL

* fix: rust-overlay - aagl & lanzaboote

* fix: nu_scripts
2025-11-10 22:45:53 -06:00
Ryan Yin 34fdd92351 feat: comment out nixpkgs-unstable, we use unstable by default (#232)
* feat: comment out nixpkgs-unstable, we use unstable by default

Signed-off-by: Ryan Yin <xiaoyin_c@qq.com>

* fix: typo...

---------

Signed-off-by: Ryan Yin <xiaoyin_c@qq.com>
2025-11-01 07:21:57 -06:00
Ryan Yin 7fbd31a70a fix: fontconfig serif & sans (#230) 2025-10-19 09:28:09 +08:00
Ryan Yin aabe1c65fa fix: nixos-installer - use nixos-unstable (#228)
Signed-off-by: Ryan Yin <xiaoyin_c@qq.com>
2025-10-16 21:16:58 -06:00
Ryan Yin 0029bdc8c7 feat: gcloud aliases (#226) 2025-10-14 19:49:14 -06:00
Ryan Yin 5479ea26cd feat: add netbird for homelab, keep tailscale for work (#225) 2025-10-02 11:49:05 +08:00
Ryan Yin 5e727543c1 feat: Grafana Dashboards & VMAlert (#224)
* chore: grafana - remove useless dashboards
* fix: alertmanager - metrics
* fix: victoria-metrics - job filter
* feat: add recoding rules
* fix: grafana - add or update uid for all dashboards
* fix: vmalert - remoteWrite
2025-09-26 19:10:32 +08:00
Ryan Yin 070aeae8db feat: gaming (#223)
* refactor: configure gaming suite via options, use pkgs-x64
* fix: gaming on apple silicon (not work yet)
2025-09-17 13:54:27 +08:00
Ryan Yin 35f9816db9 Merge pull request #222 from ryan4yin/flake-update
chore: flake update, replace lix with dix
2025-09-17 13:41:18 +08:00
Ryan Yin 48a9d7c507 fix: idols-aquamarine - alert (#221)
* fix: idols-aquamarine - alert

* feat: add dashboards for victoriametrics

* fix: node_exporter - exclude docker/podman/kubelet mounts and /home/ryan bindmounts

* fix: alert - add coredns, comment out some useless alert rules
2025-09-14 10:48:38 +08:00
Ryan Yin e902a9bdb1 feat: update anyrun & use gtk4 css, revert nvidia to prod driver (#220)
fix: nvidia: revert to prod driver to fix GTK4 apps hang on close
2025-09-11 10:41:09 +08:00
Ryan Yin 4c04c8e3a3 Merge pull request #219 from ryan4yin/anyrun
polish: anyrun - update config & css style
2025-09-10 21:48:09 +08:00
Ryan Yin ac68092d88 chore: flake update & adjustment (#218)
* flake.lock: Update

Flake lock file updates:

• Updated input 'anyrun':
    'github:Kirottu/anyrun/0c3fa788227d29cf8b0184e553c83021bcebad7c' (2025-08-17)
  → 'github:Kirottu/anyrun/af1ffe4f17921825ff2a773995604dce2b2df3cd' (2025-08-19)
• Updated input 'anyrun/flake-parts':
    'github:hercules-ci/flake-parts/c621e8422220273271f52058f618c94e405bb0f5' (2025-04-01)
  → 'github:hercules-ci/flake-parts/af66ad14b28a127c5c0f3bbb298218fc63528a18' (2025-08-06)
• Updated input 'blender-bin':
    'github:edolstra/nix-warez/e8b2b3214f07970e45ec3fc98d957b0507a3564a?dir=blender' (2025-08-01)
  → 'github:edolstra/nix-warez/8ae661516ca53314cfad8a8d3ab41e2274fdc168?dir=blender' (2025-08-22)
• Updated input 'catppuccin':
    'github:catppuccin/nix/a2ef20ed6fb921073c2d1b1929447c3bd88f595e' (2025-08-16)
  → 'github:catppuccin/nix/842da43be0d00d7cf4c26faf279bc71a614c259b' (2025-08-28)
• Updated input 'ghostty':
    'github:ghostty-org/ghostty/11d56235f9e4a227b794a87a503785ef9f3349ed' (2025-08-15)
  → 'github:ghostty-org/ghostty/a51a956bdb15a3868abf688f5679da4ea897b845' (2025-08-31)
• Updated input 'ghostty/zon2nix':
    'github:jcollie/zon2nix/56c159be489cc6c0e73c3930bd908ddc6fe89613' (2025-03-16)
  → 'github:jcollie/zon2nix/d9dc9ef1ab9ae45b5c9d80c6a747cc9968ee0c60' (2025-08-24)
• Updated input 'ghostty/zon2nix/nixpkgs':
    follows 'ghostty/nixpkgs'
  → 'https://releases.nixos.org/nixos/unstable-small/nixos-25.11pre850642.73e96df7cff5/nixexprs.tar.xz?narHash=sha256-VYK7aDAv8H1enXn1ECRHmGbeY6RqLnNwUJkOwloIsko%3D' (2025-08-23)
• Updated input 'home-manager':
    'github:nix-community/home-manager/8b4ac149687e8520187a66f05e9d4eafebf96522' (2025-08-17)
  → 'github:nix-community/home-manager/99a69bdf8a3c6bf038c4121e9c4b6e99706a187a' (2025-08-30)
• Updated input 'niri':
    'github:sodiboo/niri-flake/9aa137af01f05386e5bb5050e983750017007a66' (2025-08-17)
  → 'github:sodiboo/niri-flake/01285d6ffb9214e6e524cfb7a4752a3c20be6b2b' (2025-08-30)
• Updated input 'niri/niri-stable':
    'github:YaLTeR/niri/8ba57fcf25d2fc9565131684a839d58703f1dae7' (2025-05-25)
  → 'github:YaLTeR/niri/01be0e65f4eb91a9cd624ac0b76aaeab765c7294' (2025-08-30)
• Updated input 'niri/niri-unstable':
    'github:YaLTeR/niri/a6febb86aa5af0df7bf2792ca027ef95a503d599' (2025-08-17)
  → 'github:YaLTeR/niri/01be0e65f4eb91a9cd624ac0b76aaeab765c7294' (2025-08-30)
• Updated input 'niri/nixpkgs':
    'github:NixOS/nixpkgs/fbcf476f790d8a217c3eab4e12033dc4a0f6d23c' (2025-08-14)
  → 'github:NixOS/nixpkgs/d7600c775f877cd87b4f5a831c28aa94137377aa' (2025-08-30)
• Updated input 'niri/nixpkgs-stable':
    'github:NixOS/nixpkgs/ad7196ae55c295f53a7d1ec39e4a06d922f3b899' (2025-08-15)
  → 'github:NixOS/nixpkgs/41d292bfc37309790f70f4c120b79280ce40af16' (2025-08-29)
• Updated input 'niri/xwayland-satellite-stable':
    'github:Supreeeme/xwayland-satellite/3ba30b149f9eb2bbf42cf4758d2158ca8cceef73' (2025-05-29)
  → 'github:Supreeeme/xwayland-satellite/388d291e82ffbc73be18169d39470f340707edaa' (2025-08-18)
• Updated input 'niri/xwayland-satellite-unstable':
    'github:Supreeeme/xwayland-satellite/5a184d435927c3423f0ad189ea2b490578450fb7' (2025-08-15)
  → 'github:Supreeeme/xwayland-satellite/1d156aa8d30b124ff770488e5e34289a08ff4207' (2025-08-30)
• Updated input 'nix-darwin':
    'github:lnl7/nix-darwin/7220b01d679e93ede8d7b25d6f392855b81dd475' (2025-08-15)
  → 'github:lnl7/nix-darwin/8df64f819698c1fee0c2969696f54a843b2231e8' (2025-08-22)
• Updated input 'nix-gaming':
    'github:fufexan/nix-gaming/f2bf778502254d8852402a83ae346fd803095ccc' (2025-08-17)
  → 'github:fufexan/nix-gaming/4c92760b8d12d0d36e8e189d890d1c01a7ae646e' (2025-08-31)
• Updated input 'nixos-apple-silicon/flake-compat':
    'github:nix-community/flake-compat/8bf105319d44f6b9f0d764efa4fdef9f1cc9ba1c' (2023-06-29)
  → 'github:nix-community/flake-compat/0f158086a2ecdbb138cd0429410e44994f1b7e4b' (2025-05-02)
• Updated input 'nixpak':
    'github:nixpak/nixpak/ae70d05017be7e0aa6c1cf5f267fe6953eb027e6' (2025-08-14)
  → 'github:nixpak/nixpak/d73116f6b9eb8cd5f1acc1a3dc9e9979ba5c3131' (2025-08-28)
• Updated input 'nixpak/hercules-ci-effects':
    'github:hercules-ci/hercules-ci-effects/5f2e09654b2e70ba643e41609d9f9b6640f22113' (2025-07-15)
  → 'github:hercules-ci/hercules-ci-effects/99e03e72e3f7e13506f80ef9ebaedccb929d84d0' (2025-08-15)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/fbcf476f790d8a217c3eab4e12033dc4a0f6d23c' (2025-08-14)
  → 'github:nixos/nixpkgs/d7600c775f877cd87b4f5a831c28aa94137377aa' (2025-08-30)
• Updated input 'nixpkgs-darwin':
    'github:nixos/nixpkgs/32f313e49e42f715491e1ea7b306a87c16fe0388' (2025-08-15)
  → 'github:nixos/nixpkgs/a918bb3594dd243c2f8534b3be01b3cb4ed35fd1' (2025-08-30)
• Updated input 'nixpkgs-ollama':
    'github:nixos/nixpkgs/fbcf476f790d8a217c3eab4e12033dc4a0f6d23c' (2025-08-14)
  → 'github:nixos/nixpkgs/d7600c775f877cd87b4f5a831c28aa94137377aa' (2025-08-30)
• Updated input 'nixpkgs-stable':
    'github:nixos/nixpkgs/ad7196ae55c295f53a7d1ec39e4a06d922f3b899' (2025-08-15)
  → 'github:nixos/nixpkgs/41d292bfc37309790f70f4c120b79280ce40af16' (2025-08-29)
• Updated input 'nixpkgs-unstable':
    'github:nixos/nixpkgs/fbcf476f790d8a217c3eab4e12033dc4a0f6d23c' (2025-08-14)
  → 'github:nixos/nixpkgs/d7600c775f877cd87b4f5a831c28aa94137377aa' (2025-08-30)
• Updated input 'pre-commit-hooks':
    'github:cachix/git-hooks.nix/9c52372878df6911f9afc1e2a1391f55e4dfc864' (2025-08-05)
  → 'github:cachix/git-hooks.nix/e891a93b193fcaf2fc8012d890dc7f0befe86ec2' (2025-08-23)

* chore: niri xwayland-satellite integration

* feat: ssh - `programs.ssh` default values will be removed in the future

* fix: comment out all fgpa tools - nextpnr failed to build
2025-08-31 13:23:13 +08:00
Ryan Yin 8e356dd6fc refactor: steam (#217) 2025-08-22 16:16:35 +08:00
Ryan Yin cb47adb6b3 feat: update docs via LLM (#216) 2025-08-21 15:32:50 +08:00
Ryan Yin 5c236517bc feat: refactor, update settings for sunshine (#215) 2025-08-20 22:12:43 +08:00
Ryan Yin b7f12a6ff2 fix: niri - settings per host (#214) 2025-08-20 14:55:08 +08:00
Ryan Yin f904a672d4 Merge pull request #213 from ryan4yin/niri-spawn-at-startup
feat: niri - more settings
2025-08-20 13:02:23 +08:00
Ryan Yin d517d74bf7 feat: shoukei - add Lid & PowerKey settings (#207) 2025-08-20 02:21:07 +08:00
Ryan Yin a9d08f15a2 Merge pull request #212 from ryan4yin/niri
feat: add new wayland compositor - niri
2025-08-20 02:00:31 +08:00
Ryan Yin 30d73dabf1 refactor: justfile - nixos-swtich/darwin-switch (#211) 2025-08-18 21:22:23 +08:00
Ryan Yin 863f124b08 Merge pull request #209 from ryan4yin/nixfmt
nixfmt
2025-07-30 12:20:52 +08:00
Ryan Yin 9bd5c5b727 fix: apple silicon (#205)
* fix: pavucontrol on apple-silicon

* fix: apple-silicon - touchbar
2025-07-25 22:37:50 +08:00
Ryan Yin 20685f8927 Merge pull request #195 from ryan4yin/apple-silicon
feat: remove x86_64-darwin, add new nixos host on macbook pro m2
2025-07-13 10:53:43 +08:00
Ryan Yin 0c7e43a21b feat: add sandboxed wechat (#196) 2025-07-12 16:49:45 +08:00
Ryan Yin f6a5d75f4f Merge pull request #203 from ryan4yin/catppuccin
refactor: theme - catppuccin-mocha
2025-07-12 15:31:17 +08:00
Ryan Yin ffee47a2de chore: replace impermanence with preservation (#201) 2025-06-29 15:08:12 +08:00
Ryan Yin 0004bccc9d feat: hosts/k8s - fix k3s cidr (#200) 2025-06-29 15:00:53 +08:00
Ryan Yin aaabb5ed76 feat: hosts/k8s - replace impermanence with preservation (#199) 2025-06-29 14:56:08 +08:00
Ryan Yin 8690978d7e feat: replace impermanence with preservation (#198)
* feat: replace impermanence with preservation

* fix: This module cannot be used with scripted initrd.

* fix: permission for /var/lib/private

* chore: boot.initrd.systemd.enable

* docs: boot.initrd.luks.devices.<name>.fallbackToPassword is implied by systemd stage 1

* fix: typo
2025-06-29 13:02:36 +08:00
Ryan Yin 763167ce0d feat: replace docker with podman, fix justfile for nixpkgs-review (#197) 2025-06-29 10:32:32 +08:00
Ryan Yin 4ec26c5e5f refactor: fonts (#194) 2025-06-22 20:13:50 +08:00