Compare commits
16 Commits
873bec97fc
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| d8f2392f80 | |||
| be9f5bccf6 | |||
| 27c8db6b29 | |||
| a966a47714 | |||
| c2d2c62364 | |||
| 9eed9f81d4 | |||
| b471966e8a | |||
| 37d6977223 | |||
| 20963732a5 | |||
| e9ac72d162 | |||
| e68498cd42 | |||
| 2b9e446876 | |||
| 7313f718df | |||
| 233e463f87 | |||
| 727d6c3da9 | |||
| 1934cd036e |
+231
@@ -61,6 +61,7 @@ This guide documents methods for installing NixOS on a Proxmox virtual machine a
|
|||||||
- [[#rebuildsh---enhanced-nixos-rebuild-wrapper][rebuild.sh - Enhanced NixOS Rebuild Wrapper]]
|
- [[#rebuildsh---enhanced-nixos-rebuild-wrapper][rebuild.sh - Enhanced NixOS Rebuild Wrapper]]
|
||||||
- [[#backupsh---automated-backup-script][backup.sh - Automated Backup Script]]
|
- [[#backupsh---automated-backup-script][backup.sh - Automated Backup Script]]
|
||||||
- [[#hash-utilsh---file-hash-verification][hash-util.sh - File Hash Verification]]
|
- [[#hash-utilsh---file-hash-verification][hash-util.sh - File Hash Verification]]
|
||||||
|
- [[#pve-buildsh---disposable-lxc-builder-on-proxmox-ve][pve-build.sh - Disposable LXC Builder on Proxmox VE]]
|
||||||
- [[#optional-nixos-modules][Optional NixOS Modules]]
|
- [[#optional-nixos-modules][Optional NixOS Modules]]
|
||||||
- [[#reverse-proxies][Reverse Proxies]]
|
- [[#reverse-proxies][Reverse Proxies]]
|
||||||
- [[#file-servers][File Servers]]
|
- [[#file-servers][File Servers]]
|
||||||
@@ -335,6 +336,155 @@ Verifies file integrity using SHA256 checksums.
|
|||||||
./bin/hash-util.sh --path configuration.nix --hash $(sha256sum configuration.nix | cut -d' ' -f1)
|
./bin/hash-util.sh --path configuration.nix --hash $(sha256sum configuration.nix | cut -d' ' -f1)
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
** pve-build.sh - Disposable LXC Builder on Proxmox VE
|
||||||
|
Builds a NixOS configuration on a throwaway LXC container running on the Proxmox VE node, then activates the result on the requester (= the machine invoking the script, by default). Offloads the heavy compilation work from the requester to a disposable builder; the closure is shipped back over =nix copy= and activated locally.
|
||||||
|
|
||||||
|
The disposable is cloned from a NixOS LXC ostemplate (=nixos-lxc= flake output, =proxmox-lxc= format). The template is built locally and uploaded to PVE on first use, then reused.
|
||||||
|
|
||||||
|
*** Prerequisites
|
||||||
|
- An SSH alias =pve= in =~/.ssh/config= pointing at the PVE node (the script defers all connection details — HostName, User, Port, IdentityFile — to SSH config). Override with =PVE_HOST= or =--pve-host= if your alias differs.
|
||||||
|
- The operator's pubkey must be in the =adminKeys= list in =machines/builder/default.nix=. The disposable's =builder= user trusts whatever keys are listed there.
|
||||||
|
- The caller must resolve disposable hostnames (=nixos-builder-<VMID>=) — typically via dnsmasq or split-DNS that reads from PVE. The script never uses IPs for SSH.
|
||||||
|
- =jq= on the caller (to parse =pvesh= JSON output).
|
||||||
|
|
||||||
|
*** Flow
|
||||||
|
1. Ensure a NixOS LXC ostemplate exists on PVE; build =.#nixos-lxc= locally and =scp= it if missing.
|
||||||
|
2. Clone a fresh container under a free VMID (scanning downward from 9999), start it, wait for SSH on its hostname.
|
||||||
|
3. Build phase (runs as the calling user, no =sudo=):
|
||||||
|
#+begin_example
|
||||||
|
nixos-rebuild build --flake .#<requester> --build-host root@<ct-ip>
|
||||||
|
#+end_example
|
||||||
|
builds the closure on the disposable and copies it back to the local Nix store.
|
||||||
|
4. Activate phase (only for =test= / =switch= / =boot=; runs locally with =sudo=, no =--build-host=):
|
||||||
|
#+begin_example
|
||||||
|
sudo nixos-rebuild <cmd> --flake .#<requester>
|
||||||
|
#+end_example
|
||||||
|
the closure is already local, so this only activates.
|
||||||
|
5. Destroy the disposable (=pct destroy --purge --force=).
|
||||||
|
|
||||||
|
The build/activate split avoids needing the requester's root user to SSH to the disposable — only the calling user does.
|
||||||
|
|
||||||
|
*** Composite vs. step commands
|
||||||
|
Each stage can be invoked on its own, or chained via the composite commands:
|
||||||
|
|
||||||
|
| Composite | Stages chained | Disposable on success |
|
||||||
|
|-----------+-----------------------------------------------------------------+-----------------------|
|
||||||
|
| =build= | deploy-image + start-builder + build-on | left running |
|
||||||
|
| =test= | deploy-image + start-builder + build-on + activate(test) | left running |
|
||||||
|
| =switch= | deploy-image + start-builder + build-on + activate(switch) + destroy-builder | destroyed |
|
||||||
|
| =boot= | deploy-image + start-builder + build-on + activate(boot) + destroy-builder | destroyed |
|
||||||
|
|
||||||
|
| Step command | Stage | Effect |
|
||||||
|
|---------------------------+-------+-----------------------------------------------------------------------|
|
||||||
|
| =check-image= | 1 | Read-only: exit 0 if a NixOS LXC ostemplate is on PVE, 1 if not. |
|
||||||
|
| =deploy-image= | 1 | Idempotent: build =.#nixos-lxc= locally + scp to PVE if missing. |
|
||||||
|
| =update-image= | 1 | Force: rebuild =.#nixos-lxc= and replace the ostemplate on PVE. |
|
||||||
|
| =start-builder= | 2 | deploy-image + clone a fresh CT + start. |
|
||||||
|
| =build-on [VMID]= | 3 | Build closure on an existing disposable. |
|
||||||
|
| =activate <test\|switch\|boot>= | 4 | Activate LOCALLY (closure must already be in the local store). |
|
||||||
|
| =destroy-builder [VMID]= | 5 | =pct destroy --purge --force=. |
|
||||||
|
| =info [VMID]= | - | List disposables, or show detail for one. |
|
||||||
|
|
||||||
|
*** Stateless design
|
||||||
|
The script writes no state files. Each step discovers prior steps' artifacts dynamically from PVE:
|
||||||
|
|
||||||
|
- Disposables are identified by hostname pattern =nixos-builder-<VMID>= (override via =CT_HOSTNAME_PREFIX=). When a step needs a target VMID and none is passed explicitly, it queries =pvesh get /cluster/resources= for LXC containers matching the prefix.
|
||||||
|
- Exactly one match :: used automatically.
|
||||||
|
- Zero matches :: the step errors out and points at =create=.
|
||||||
|
- Multiple matches :: the step errors out, lists the matches, and asks for an explicit VMID.
|
||||||
|
- VMID allocation starts at =9999= and scans downward (configurable via =--vmid-start= / =--vmid-floor=) so disposables sit clearly above regular VM IDs.
|
||||||
|
- The built closure lives in the caller's local Nix store; =nixos-rebuild= finds it naturally during =activate=, so no IPC between =build-on= and =activate= is needed.
|
||||||
|
|
||||||
|
*** Hostname-based SSH
|
||||||
|
All SSH to disposables targets their hostname (=nixos-builder-<VMID>=), never their IP. The caller's resolver must be able to look up PVE container hostnames — typically via dnsmasq or split-DNS that reads from PVE. The script never resolves IPs for SSH; =get_ct_ip= is used only for =info= display and diagnostic logging.
|
||||||
|
|
||||||
|
This makes the script safe to re-run, interrupt, or split across shell sessions — there is no =latest-vmid= file to drift out of sync with reality.
|
||||||
|
|
||||||
|
*** Basic Usage
|
||||||
|
#+begin_src sh
|
||||||
|
# Full happy path — build + activate susano permanently, auto-destroy CT.
|
||||||
|
pve-build switch --machine susano
|
||||||
|
|
||||||
|
# Step-by-step (each step discovers the prior step's artifacts from PVE):
|
||||||
|
pve-build deploy-image # build + upload the LXC ostemplate (no-op if present)
|
||||||
|
pve-build start-builder # clones a fresh disposable CT
|
||||||
|
pve-build build-on # discovers the CT on PVE, builds on it
|
||||||
|
pve-build activate switch # activates locally (no SSH)
|
||||||
|
pve-build destroy-builder # discovers the CT on PVE, destroys it
|
||||||
|
|
||||||
|
# Rebuild the LXC image after editing machines/builder/default.nix.
|
||||||
|
pve-build update-image
|
||||||
|
|
||||||
|
# Read-only check (exit 0 if image is already on PVE, 1 otherwise).
|
||||||
|
pve-build check-image && echo ready || echo missing
|
||||||
|
|
||||||
|
# Operate on a specific CT (skips discovery — needed when multiple exist).
|
||||||
|
pve-build build-on 305
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
*** Advanced Examples
|
||||||
|
#+begin_src sh
|
||||||
|
# Build + activate temporarily without persisting to the bootloader.
|
||||||
|
pve-build test --machine fujin
|
||||||
|
|
||||||
|
# Use a non-default PVE node and a higher starting VMID.
|
||||||
|
pve-build switch --pve-host root@10.0.0.5 --vmid-start 9999
|
||||||
|
|
||||||
|
# Keep the disposable even after a successful switch (for inspection).
|
||||||
|
pve-build switch --keep
|
||||||
|
|
||||||
|
# List every disposable currently on PVE.
|
||||||
|
pve-build info
|
||||||
|
|
||||||
|
# Inspect a specific disposable in detail.
|
||||||
|
pve-build info 307
|
||||||
|
|
||||||
|
# Destroy a specific disposable by VMID.
|
||||||
|
pve-build destroy-builder 307
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
*** Command Reference
|
||||||
|
**** Composite commands
|
||||||
|
- =build= - deploy-image + start-builder + build-on.
|
||||||
|
- =test= - build + activate temporarily (reverts on reboot).
|
||||||
|
- =switch= - build + activate permanently. Disposable destroyed on success.
|
||||||
|
- =boot= - build + set as boot default. Disposable destroyed on success.
|
||||||
|
|
||||||
|
**** Step commands
|
||||||
|
- =check-image= - Read-only: exit 0 if ostemplate is on PVE, 1 if missing.
|
||||||
|
- =deploy-image= - Idempotent: build =.#nixos-lxc= locally + scp to PVE if missing.
|
||||||
|
- =update-image= - Force rebuild + replace the ostemplate on PVE.
|
||||||
|
- =start-builder= - deploy-image + clone a fresh CT + start.
|
||||||
|
- =build-on [VMID]= - Build closure on an existing disposable (default: discovered).
|
||||||
|
- =activate <test|switch|boot>= - Activate LOCALLY (closure must already be built).
|
||||||
|
- =destroy-builder [VMID]= - =pct destroy --purge --force= (default: discovered).
|
||||||
|
- =info [VMID]= - List disposables, or show detail for one.
|
||||||
|
|
||||||
|
**** Aliases
|
||||||
|
The old command names still work as aliases:
|
||||||
|
- =ensure-template= → =deploy-image=
|
||||||
|
- =create= → =start-builder=
|
||||||
|
|
||||||
|
**** Options
|
||||||
|
- =--machine NAME= - Requester machine name (default: current hostname).
|
||||||
|
- =--pve-host HOST= - PVE SSH alias or target (default: =pve=).
|
||||||
|
- =--pve-storage NAME= - Ostemplate storage (default: =local=).
|
||||||
|
- =--rootfs-storage NAME= - Rootfs storage (default: =local-lvm=).
|
||||||
|
- =--bridge NAME= - Network bridge (default: =vmbr0=).
|
||||||
|
- =--vmid-start N= - Highest VMID to consider (default: =9999=); scanned downward.
|
||||||
|
- =--vmid-floor N= - Lowest VMID to consider (default: =100=).
|
||||||
|
- =--rootfs-gib N= - Rootfs size in GiB (default: =20=).
|
||||||
|
- =--keep= - Keep the disposable even on successful =switch= / =boot=.
|
||||||
|
- =--show-trace= , =--verbose= - Passed through to =nixos-rebuild=.
|
||||||
|
|
||||||
|
**** Environment
|
||||||
|
= PVE_HOST= , = PVE_STORAGE= , = PVE_ROOTFS_STORAGE= , = PVE_BRIDGE= , = VMID_START= , = VMID_FLOOR= , = BUILD_SSH_USER= , = CT_BOOT_TIMEOUT= , = CT_ROOTFS_GIB= .
|
||||||
|
|
||||||
|
*** Notes
|
||||||
|
- Disposables are matched by hostname prefix (=nixos-builder-= by default). If you want a parallel run with multiple builders, pass explicit VMIDs to =build-on= / =destroy-builder= / =info=.
|
||||||
|
- =destroy-builder= calls =pct destroy <vmid> --purge --force=, so it stops and removes a running container in one step.
|
||||||
|
- To rebuild the LXC template after editing =machines/builder/default.nix=, remove the old tarball from =root@<pve>:/var/lib/vz/template/cache/= — the script always picks the alphabetically last =nixos-lxc-*.tar.xz= it finds.
|
||||||
|
|
||||||
* Optional NixOS Modules
|
* Optional NixOS Modules
|
||||||
** Reverse Proxies
|
** Reverse Proxies
|
||||||
The following modules can be enabled to provide a reverse proxy.
|
The following modules can be enabled to provide a reverse proxy.
|
||||||
@@ -405,6 +555,87 @@ dov = {
|
|||||||
};
|
};
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
** YubiKey
|
||||||
|
Provides PAM U2F authentication (touch YubiKey for login/sudo) and a seamless SSH agent backed by the YubiKey PIV applet.
|
||||||
|
|
||||||
|
#+begin_src nix
|
||||||
|
dov = {
|
||||||
|
yubikey.enable = true;
|
||||||
|
};
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
*** PAM U2F (login & sudo)
|
||||||
|
After enabling the module and rebuilding, enroll your YubiKey:
|
||||||
|
|
||||||
|
1. Create the YubiKey config directory:
|
||||||
|
#+begin_src sh
|
||||||
|
mkdir -p ~/.config/Yubico
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
2. Generate the U2F key mapping (touch YubiKey when prompted):
|
||||||
|
#+begin_src bash
|
||||||
|
nix-shell -p pam_u2f --run 'pamu2fcfg -u fujin' > ~/.config/Yubico/u2f_keys
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
*Nushell users:* use ~out>~ instead of ~>~:
|
||||||
|
#+begin_src
|
||||||
|
nix-shell -p pam_u2f --run 'pamu2fcfg -u fujin' out> ~/.config/Yubico/u2f_keys
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
3. Add a backup YubiKey (optional):
|
||||||
|
#+begin_src bash
|
||||||
|
nix-shell -p pam_u2f --run 'pamu2fcfg -u fujin -n' >> ~/.config/Yubico/u2f_keys
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
4. Rebuild and switch:
|
||||||
|
#+begin_src sh
|
||||||
|
sudo nixos-rebuild switch --flake .#fujin
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
5. Test:
|
||||||
|
#+begin_src sh
|
||||||
|
sudo true # should prompt to touch YubiKey
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
The default mode is =sufficient= (touch key *or* type password). If the key is absent or not enrolled, the normal password prompt follows — you cannot lock yourself out.
|
||||||
|
|
||||||
|
*** SSH with FIDO2-backed keys
|
||||||
|
The module enables the standard OpenSSH agent (not GPG agent's SSH emulation, which doesn't reliably support =-sk= keys). The YubiKey uses FIDO2 — the same interface that PAM U2F uses — so no PIV/pcscd setup is needed for SSH.
|
||||||
|
|
||||||
|
1. Generate a FIDO2-backed SSH key (one-time, touch YubiKey when prompted):
|
||||||
|
#+begin_src sh
|
||||||
|
ssh-keygen -t ed25519-sk -C "yubikey@fujin"
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
*Resident key* (recoverable on a new machine without the stub file):
|
||||||
|
#+begin_src sh
|
||||||
|
ssh-keygen -t ed25519-sk -O resident -C "yubikey@fujin"
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
2. Load the key into the agent (once per login session, enter passphrase):
|
||||||
|
#+begin_src sh
|
||||||
|
ssh-add ~/.ssh/id_ed25519_sk
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
*After a rebuild*, log out and back in so the shell picks up the new =SSH_AUTH_SOCK=. In an existing session:
|
||||||
|
#+begin_src sh
|
||||||
|
export SSH_AUTH_SOCK=/run/user/$(id -u)/ssh-agent
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
3. Copy the public key to remote hosts:
|
||||||
|
#+begin_src sh
|
||||||
|
ssh-copy-id -i ~/.ssh/id_ed25519_sk.pub susano
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
4. Test:
|
||||||
|
#+begin_src sh
|
||||||
|
ssh susano # touch YubiKey, no password
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
Each SSH authentication requires a physical YubiKey touch. The passphrase is only asked when loading the key into the agent (step 2), not per-connection.
|
||||||
|
|
||||||
|
*Note:* The key stub (~/.ssh/id_ed25519_sk) is tied to this specific generation — regenerating produces a different key. Back it up or use =-O resident=.
|
||||||
|
|
||||||
* Notes and Configuration Details
|
* Notes and Configuration Details
|
||||||
** Remote Build Configuration
|
** Remote Build Configuration
|
||||||
To leverage remote builds (e.g., building fujin configurations on izanagi), you need to set up SSH keys for the root user:
|
To leverage remote builds (e.g., building fujin configurations on izanagi), you need to set up SSH keys for the root user:
|
||||||
|
|||||||
+19
@@ -0,0 +1,19 @@
|
|||||||
|
# Backlog
|
||||||
|
|
||||||
|
<!-- SECTION: ENTRIES -->
|
||||||
|
|
||||||
|
<!-- SECTION: Nixos -->
|
||||||
|
|
||||||
|
- [ ] [P2] Add nushell completion for rebuild script *(priority: P2)*
|
||||||
|
|
||||||
|
<!-- SECTION: HISTORY -->
|
||||||
|
|
||||||
|
<!-- SECTION: Nixos -->
|
||||||
|
|
||||||
|
| Timestamp | Item ID | Action | Details |
|
||||||
|
|-----------|---------|--------|---------|
|
||||||
|
| 2026-07-26T11:58:28.175Z | n-dk597m | item_created | Add nushell completion for rebuild script |
|
||||||
|
|
||||||
|
<!-- SECTION: INTEGRITY -->
|
||||||
|
|
||||||
|
<!-- saved: 2026-07-26T11:58:28Z | checksum: sha256:1805e1b08cf2b01e73cdd1dd28269bd5ccf5ccdeaf584ff43d5a68edd3d17cfc | entries: 1 | history: 1 -->
|
||||||
Generated
+201
-238
@@ -20,11 +20,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1780756231,
|
"lastModified": 1788016784,
|
||||||
"narHash": "sha256-tXQxKdG5716uB9/LIkLQqQwHKf5mRSpHoZhz3lyI2Cg=",
|
"narHash": "sha256-RO90Fk+Rn2Yy+I8oL4ePTLLKLgOAr8hrTx7tlpwdLaA=",
|
||||||
"owner": "hyprwm",
|
"owner": "hyprwm",
|
||||||
"repo": "aquamarine",
|
"repo": "aquamarine",
|
||||||
"rev": "6ecde03f47172753fe5a2f334f9d3facfb7e6784",
|
"rev": "783bfd9ae441d1d0519b979ac68b73ddd6e81df0",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -40,17 +40,17 @@
|
|||||||
"nixpkgs": "nixpkgs_2"
|
"nixpkgs": "nixpkgs_2"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1779123398,
|
"lastModified": 1787939266,
|
||||||
"narHash": "sha256-8KYQSisso0bn8Z/S3+lunu3sFsMGhf2QXKu+yEWOP7k=",
|
"narHash": "sha256-daj/t7zeuD8XObNPyR1MAw5SziY8t031oenYC5lsyBY=",
|
||||||
"owner": "LichHunter",
|
"ref": "refs/heads/main",
|
||||||
"repo": "backlog",
|
"rev": "41d18d88aaba1146d09cbe1decd60dcadb8e192e",
|
||||||
"rev": "59507ca9f242950d45d2a6e4d3c10385869344ca",
|
"revCount": 33,
|
||||||
"type": "github"
|
"type": "git",
|
||||||
|
"url": "https://gitea.susano-homelab.duckdns.org/fujin/backlog.git"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"owner": "LichHunter",
|
"type": "git",
|
||||||
"repo": "backlog",
|
"url": "https://gitea.susano-homelab.duckdns.org/fujin/backlog.git"
|
||||||
"type": "github"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"base16": {
|
"base16": {
|
||||||
@@ -127,11 +127,11 @@
|
|||||||
"nixpkgs": "nixpkgs_3"
|
"nixpkgs": "nixpkgs_3"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1781648708,
|
"lastModified": 1787524125,
|
||||||
"narHash": "sha256-i9ggnF31Uq3tpdp6ZMe7YAOxjTfkB7S4WjSBfXV0uMk=",
|
"narHash": "sha256-P48TOQdIbB0PKMn4FTk6X0utbf0LemNlJ+bFcSbveGA=",
|
||||||
"owner": "9001",
|
"owner": "9001",
|
||||||
"repo": "copyparty",
|
"repo": "copyparty",
|
||||||
"rev": "d33d11321f823f58a9109298ef886044f63b02ce",
|
"rev": "9de090265f8d063056320f41d984830839017a2f",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -166,11 +166,11 @@
|
|||||||
"nixpkgs-stable": "nixpkgs-stable"
|
"nixpkgs-stable": "nixpkgs-stable"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1782301008,
|
"lastModified": 1788150896,
|
||||||
"narHash": "sha256-GxQhjwF6eNDhP43Yup1LPmjKS1lZaTRvmqgYPOwv3Zs=",
|
"narHash": "sha256-suPEqotkAM4UyRxFk6VjWg1E/yBRrpom2E9lr0vnT+8=",
|
||||||
"owner": "nix-community",
|
"owner": "nix-community",
|
||||||
"repo": "emacs-overlay",
|
"repo": "emacs-overlay",
|
||||||
"rev": "05d06425c4e17fdf1cbc5cdbf744e5d635993245",
|
"rev": "f6229276417aa356ae16dfd3b21b51525f55083f",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -183,11 +183,11 @@
|
|||||||
"firefox-gnome-theme": {
|
"firefox-gnome-theme": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1779670703,
|
"lastModified": 1783570805,
|
||||||
"narHash": "sha256-UdfMivNMwCCqQsYDg5pSz8X2IOaOrIZLIIy+Bg3CO2o=",
|
"narHash": "sha256-ptl5aRlCv9/uRSv2u8Hq8UFVFeZ6Q/bT049bpqNgc3w=",
|
||||||
"owner": "rafaelmardojai",
|
"owner": "rafaelmardojai",
|
||||||
"repo": "firefox-gnome-theme",
|
"repo": "firefox-gnome-theme",
|
||||||
"rev": "942159e73e40bf785816f7f1f5feed9ef3d7c8f9",
|
"rev": "5602ed62d638142c1ab31dccd01dfbfb28841225",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -233,11 +233,11 @@
|
|||||||
"nixpkgs-lib": "nixpkgs-lib"
|
"nixpkgs-lib": "nixpkgs-lib"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1777988971,
|
"lastModified": 1787559586,
|
||||||
"narHash": "sha256-qIoWPDs+0/8JecyYgE3gpKQxW/4bLW/gp45vow9ioCQ=",
|
"narHash": "sha256-onL0VLf9vPllmT0H/OlURIU5r5t5WIEl7t4tVNKT0Nw=",
|
||||||
"owner": "hercules-ci",
|
"owner": "hercules-ci",
|
||||||
"repo": "flake-parts",
|
"repo": "flake-parts",
|
||||||
"rev": "0678d8986be1661af6bb555f3489f2fdfc31f6ff",
|
"rev": "9d0d87172c374f89da73c1cfe6d81ae62feac1f1",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -254,11 +254,29 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1778716662,
|
"lastModified": 1782949081,
|
||||||
"narHash": "sha256-m1Yf0wZ8j1OHjTc2UwHwyQRSnNeSgLJOd7q5Y45hzi4=",
|
"narHash": "sha256-vp6Y/Grm98ESt6ceOkWiHWyZRDV3J1RID4w+6NWK9yA=",
|
||||||
"owner": "hercules-ci",
|
"owner": "hercules-ci",
|
||||||
"repo": "flake-parts",
|
"repo": "flake-parts",
|
||||||
"rev": "f7c1a2d347e4c52d5fb8d10cb4d94b5884e546fb",
|
"rev": "17c9d6cdfc60c64f4ee8d306f9bc0b4ccb51481e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "hercules-ci",
|
||||||
|
"repo": "flake-parts",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"flake-parts_3": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs-lib": "nixpkgs-lib_2"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1772408722,
|
||||||
|
"narHash": "sha256-rHuJtdcOjK7rAHpHphUb1iCvgkU3GpfvicLMwwnfMT0=",
|
||||||
|
"owner": "hercules-ci",
|
||||||
|
"repo": "flake-parts",
|
||||||
|
"rev": "f20dc5d9b8027381c474144ecabc9034d6a839a3",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -300,24 +318,6 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"flake-utils_3": {
|
|
||||||
"inputs": {
|
|
||||||
"systems": "systems_4"
|
|
||||||
},
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1681202837,
|
|
||||||
"narHash": "sha256-H+Rh19JDwRtpVPAWp64F+rlEtxUWBAQW28eAi3SRSzg=",
|
|
||||||
"owner": "numtide",
|
|
||||||
"repo": "flake-utils",
|
|
||||||
"rev": "cfacdce06f30d2b68473a46042957675eebb3401",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "numtide",
|
|
||||||
"repo": "flake-utils",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"fromYaml": {
|
"fromYaml": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
@@ -337,15 +337,14 @@
|
|||||||
"git-hooks": {
|
"git-hooks": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"flake-compat": "flake-compat",
|
"flake-compat": "flake-compat",
|
||||||
"gitignore": "gitignore",
|
|
||||||
"nixpkgs": "nixpkgs"
|
"nixpkgs": "nixpkgs"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1776796298,
|
"lastModified": 1787424939,
|
||||||
"narHash": "sha256-PcRvlWayisPSjd0UcRQbhG8Oqw78AcPE6x872cPRHN8=",
|
"narHash": "sha256-O2tBn84NNuHrnqNVxx/XqsXwfYvS1YwBh+7CBnbCYsk=",
|
||||||
"owner": "cachix",
|
"owner": "cachix",
|
||||||
"repo": "git-hooks.nix",
|
"repo": "git-hooks.nix",
|
||||||
"rev": "3cfd774b0a530725a077e17354fbdb87ea1c4aad",
|
"rev": "809414f0cdadf82cf11b06c2b29ba9b3168b3297",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -354,65 +353,23 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"gitignore": {
|
|
||||||
"inputs": {
|
|
||||||
"nixpkgs": [
|
|
||||||
"backlog",
|
|
||||||
"git-hooks",
|
|
||||||
"nixpkgs"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1709087332,
|
|
||||||
"narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=",
|
|
||||||
"owner": "hercules-ci",
|
|
||||||
"repo": "gitignore.nix",
|
|
||||||
"rev": "637db329424fd7e46cf4185293b9cc8c88c95394",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "hercules-ci",
|
|
||||||
"repo": "gitignore.nix",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"gitignore_2": {
|
|
||||||
"inputs": {
|
|
||||||
"nixpkgs": [
|
|
||||||
"hyprland",
|
|
||||||
"pre-commit-hooks",
|
|
||||||
"nixpkgs"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1709087332,
|
|
||||||
"narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=",
|
|
||||||
"owner": "hercules-ci",
|
|
||||||
"repo": "gitignore.nix",
|
|
||||||
"rev": "637db329424fd7e46cf4185293b9cc8c88c95394",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "hercules-ci",
|
|
||||||
"repo": "gitignore.nix",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"gnome-shell": {
|
"gnome-shell": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1767737596,
|
"host": "gitlab.gnome.org",
|
||||||
"narHash": "sha256-eFujfIUQDgWnSJBablOuG+32hCai192yRdrNHTv0a+s=",
|
"lastModified": 1776175984,
|
||||||
|
"narHash": "sha256-RJFlFW8GiMei6oqUGrMkGEvVqOH8U7Q8abc1yK4VKD8=",
|
||||||
"owner": "GNOME",
|
"owner": "GNOME",
|
||||||
"repo": "gnome-shell",
|
"repo": "gnome-shell",
|
||||||
"rev": "ef02db02bf0ff342734d525b5767814770d85b49",
|
"rev": "e0fdc4c13250e9a9b8ea9594c83925274f4a5dca",
|
||||||
"type": "github"
|
"type": "gitlab"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
"host": "gitlab.gnome.org",
|
||||||
"owner": "GNOME",
|
"owner": "GNOME",
|
||||||
|
"ref": "50.1",
|
||||||
"repo": "gnome-shell",
|
"repo": "gnome-shell",
|
||||||
"rev": "ef02db02bf0ff342734d525b5767814770d85b49",
|
"type": "gitlab"
|
||||||
"type": "github"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"home-manager": {
|
"home-manager": {
|
||||||
@@ -444,11 +401,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1781497404,
|
"lastModified": 1786719456,
|
||||||
"narHash": "sha256-9GAF8sSsnkyCVCWkomXR0T+zdSxyUlfPt6neQidimdg=",
|
"narHash": "sha256-B74DLQs/VjlqyhnnX3tguWwghqJHWSJX30TKZuAljIg=",
|
||||||
"owner": "nix-community",
|
"owner": "nix-community",
|
||||||
"repo": "home-manager",
|
"repo": "home-manager",
|
||||||
"rev": "1285cd3d6882a9847f2d56ed5541b3350c8a6162",
|
"rev": "83b7606dcf44abe3a94b86e8bb2b3355d22e8797",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -473,11 +430,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1776511930,
|
"lastModified": 1786464181,
|
||||||
"narHash": "sha256-fCpwFiTW0rT7oKJqr3cqHMnkwypSwQKpbtUEtxdkgrM=",
|
"narHash": "sha256-2alOMkLjXANh7unkZnYnCF2K2rApZaOLMoQ3o+VX2CY=",
|
||||||
"owner": "hyprwm",
|
"owner": "hyprwm",
|
||||||
"repo": "hyprcursor",
|
"repo": "hyprcursor",
|
||||||
"rev": "39435900785d0c560c6ae8777d29f28617d031ef",
|
"rev": "e4ed7c08123df5af460a0a70961380cbfb872f76",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -502,11 +459,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1776426399,
|
"lastModified": 1786464367,
|
||||||
"narHash": "sha256-RUESLKNikIeEq9ymGJ6nmcDXiSFQpUW1IhJ245nL3xM=",
|
"narHash": "sha256-k58p4wbzIXWyRWrW84pP8tD+iaZSSYiiM+fr0Auk4oU=",
|
||||||
"owner": "hyprwm",
|
"owner": "hyprwm",
|
||||||
"repo": "hyprgraphics",
|
"repo": "hyprgraphics",
|
||||||
"rev": "68d064434787cf1ed4a2fe257c03c5f52f33cf84",
|
"rev": "7c895c44e3ca6d28ed68ddd80ec02b02b925e7fc",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -532,11 +489,11 @@
|
|||||||
"xdph": "xdph"
|
"xdph": "xdph"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1782315209,
|
"lastModified": 1788100302,
|
||||||
"narHash": "sha256-xKpodJ++lnLqRpmcH5OSimuo874wmgm3rD85J3GDmUw=",
|
"narHash": "sha256-21MFGYEl3m5SjN9kZGKb+gELVLlMCF1DkbwHqHzSK1w=",
|
||||||
"ref": "refs/heads/main",
|
"ref": "refs/heads/main",
|
||||||
"rev": "87cd2a5f6697a5923c4f427e9b399d79a354a7b8",
|
"rev": "86c24e2e079aa62214421c76f01b603fc8178125",
|
||||||
"revCount": 7499,
|
"revCount": 7779,
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/hyprwm/Hyprland"
|
"url": "https://github.com/hyprwm/Hyprland"
|
||||||
},
|
},
|
||||||
@@ -578,11 +535,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1776426575,
|
"lastModified": 1786464504,
|
||||||
"narHash": "sha256-KI6nIfVihn/DPaeB5Et46Xg3dkNHrrEtUd5LBBVomB0=",
|
"narHash": "sha256-7sHwM86KILQyHDHDuE2SDBlQ2jvZ0EW3hY7sW009/cg=",
|
||||||
"owner": "hyprwm",
|
"owner": "hyprwm",
|
||||||
"repo": "hyprland-guiutils",
|
"repo": "hyprland-guiutils",
|
||||||
"rev": "a968d211048e3ed538e47b84cb3649299578f19d",
|
"rev": "4c30cf3097ea963c0e250749ee0c59f8b08816d6",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -608,11 +565,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1781442805,
|
"lastModified": 1788037253,
|
||||||
"narHash": "sha256-Kt56e6Bq2sfqN8yq1RHsS6z+8QKCZelmhaeQQRtZyqU=",
|
"narHash": "sha256-QSGOM0IFpp45DwmtIwcih8+kKuSgAoQal9QkVVSRNew=",
|
||||||
"owner": "hyprwm",
|
"owner": "hyprwm",
|
||||||
"repo": "hyprland-plugins",
|
"repo": "hyprland-plugins",
|
||||||
"rev": "1f90c674d51a1ef83c725cd6d02280b4c969fdf7",
|
"rev": "67c3a4c019f223c27b5bdc6bb656ce891a60861a",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -662,11 +619,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1777320127,
|
"lastModified": 1786464129,
|
||||||
"narHash": "sha256-Qu+Wf2Bp5qUjyn2YpZNq8a7JyzTGowhT1knrwE38a9U=",
|
"narHash": "sha256-339AkTlpMYSIvFuG0rnR+8Yg4/AZKeJalshJavlnKfg=",
|
||||||
"owner": "hyprwm",
|
"owner": "hyprwm",
|
||||||
"repo": "hyprlang",
|
"repo": "hyprlang",
|
||||||
"rev": "090117506ddc3d7f26e650ff344d378c2ec329cc",
|
"rev": "9508458be316a0d70d37ebed1ab725ccd10411ff",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -714,11 +671,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1772462885,
|
"lastModified": 1785930473,
|
||||||
"narHash": "sha256-5pHXrQK9zasMnIo6yME6EOXmWGFMSnCITcfKshhKJ9I=",
|
"narHash": "sha256-DitTu625BhEYpZjtjxtGpjrEJwPwW+X/+jJvhSZNSJM=",
|
||||||
"owner": "hyprwm",
|
"owner": "hyprwm",
|
||||||
"repo": "hyprtoolkit",
|
"repo": "hyprtoolkit",
|
||||||
"rev": "9af245a69fa6b286b88ddfc340afd288e00a6998",
|
"rev": "af515b69dfbe366dc7873aa1475cb2f4db3ebad7",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -739,11 +696,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1780251518,
|
"lastModified": 1786903207,
|
||||||
"narHash": "sha256-fG9xbb1SOAAJ+2kJRakp3ch+BmA/3dEg/K3PoAZTKkw=",
|
"narHash": "sha256-QTwMqLLONRhv9iz6CVeuX6BqQNQCIqI8hL/cPYlR/24=",
|
||||||
"owner": "hyprwm",
|
"owner": "hyprwm",
|
||||||
"repo": "hyprutils",
|
"repo": "hyprutils",
|
||||||
"rev": "40ede2e7bdec80ba5d4c443160d905e9f841ae5f",
|
"rev": "6cf50415e06dc6bd9f1252f1b745eac6b4a1cc39",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -764,11 +721,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1777159683,
|
"lastModified": 1786464033,
|
||||||
"narHash": "sha256-Jxixw6wZphUp+nHYxOKUYSckL17QMBx2d5Zp0rJHr1g=",
|
"narHash": "sha256-QM8Qe4/L8lpdVN4bgwahmi+jyyc4fisseDMe4afcDxA=",
|
||||||
"owner": "hyprwm",
|
"owner": "hyprwm",
|
||||||
"repo": "hyprwayland-scanner",
|
"repo": "hyprwayland-scanner",
|
||||||
"rev": "b8632713a6beaf28b56f2a7b0ab2fb7088dbb404",
|
"rev": "62e62c1ca23da17612c6890d4ad2064f575643db",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -793,11 +750,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1778410714,
|
"lastModified": 1786464294,
|
||||||
"narHash": "sha256-o6RzFj4nJXaPRY7EM01siuCQeT41RfwwmcmFQqwFJJg=",
|
"narHash": "sha256-ZQsZ2WvBdkboCIyh8LStDPdAIARmxzn0XMNxxoOhjPE=",
|
||||||
"owner": "hyprwm",
|
"owner": "hyprwm",
|
||||||
"repo": "hyprwire",
|
"repo": "hyprwire",
|
||||||
"rev": "85148a8e612808cf5ddb25d0b3c5840f3498a7dc",
|
"rev": "4ce7cd6b6128c1ac41caf23c58a30a26b327f9dd",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -811,11 +768,11 @@
|
|||||||
"nixpkgs": "nixpkgs_6"
|
"nixpkgs": "nixpkgs_6"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1775570192,
|
"lastModified": 1787822983,
|
||||||
"narHash": "sha256-wTLOBy3l/FaIGJWRGFTVYsITkou0lmDU3uAMxvOCCN8=",
|
"narHash": "sha256-wusELfq9vxbkbZy8cPprcOldqoqSbKltxt++EW9gQ9g=",
|
||||||
"owner": "Lxtharia",
|
"owner": "Lxtharia",
|
||||||
"repo": "minegrub-theme",
|
"repo": "minegrub-theme",
|
||||||
"rev": "8ba52f8402ed642abf0f6eee32c407412a3ceae6",
|
"rev": "89f9e24f44cbe06b11d69068e39f534666e4d3d3",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -846,11 +803,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1781513248,
|
"lastModified": 1788166029,
|
||||||
"narHash": "sha256-YLeEcfvlQiNXP9bVoIwyB+NMjMxJmkwv/y+AP/7RWYo=",
|
"narHash": "sha256-+hgpdq6rXpbBHhB5Pbu80kq7UTZhVpbZZtJXePs9ufE=",
|
||||||
"owner": "Mic92",
|
"owner": "Mic92",
|
||||||
"repo": "nix-ld",
|
"repo": "nix-ld",
|
||||||
"rev": "b320f5cb8b7f141c224c3631539cd0c45fcf7ee3",
|
"rev": "2cced31ac171b55dd6ab8cc04502cb1ad012d7cf",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -900,11 +857,11 @@
|
|||||||
"nixpkgs": "nixpkgs_7"
|
"nixpkgs": "nixpkgs_7"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1782166108,
|
"lastModified": 1788044418,
|
||||||
"narHash": "sha256-/EtnQBcKbsaCAGQ5VRcplrHRkR4ryqyLMpBfkVuG9Xw=",
|
"narHash": "sha256-cmOd3iGoE140M2GidgQMQbyxHZ4dT7C0QZq2+CrXQyA=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixos-hardware",
|
"repo": "nixos-hardware",
|
||||||
"rev": "875776f0252fcb8618bb948640a0d1f7a5b362be",
|
"rev": "dc3f0cfde2050172abf6c3cdb684f735c15a57c5",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -916,11 +873,11 @@
|
|||||||
},
|
},
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1770073757,
|
"lastModified": 1782918843,
|
||||||
"narHash": "sha256-Vy+G+F+3E/Tl+GMNgiHl9Pah2DgShmIUBJXmbiQPHbI=",
|
"narHash": "sha256-ETYnV9U7Sr+A45dohzZdfCZKOss4qrTkO+wgNZNvEc0=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "47472570b1e607482890801aeaf29bfb749884f6",
|
"rev": "e8273b29fe1390ec8d4603f2477357555291432e",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -932,11 +889,26 @@
|
|||||||
},
|
},
|
||||||
"nixpkgs-lib": {
|
"nixpkgs-lib": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1777168982,
|
"lastModified": 1785031560,
|
||||||
"narHash": "sha256-GOkGPcboWE9BmGCRMLX3worL4EMnsnG8MyKmXNeYuhQ=",
|
"narHash": "sha256-OmshNvn2vupOFpYinLUu+1Dnpu4n7Q5N3ggGVNHpkUI=",
|
||||||
"owner": "nix-community",
|
"owner": "nix-community",
|
||||||
"repo": "nixpkgs.lib",
|
"repo": "nixpkgs.lib",
|
||||||
"rev": "f5901329dade4a6ea039af1433fb087bd9c1fe14",
|
"rev": "0e79af5e3d4dcfcd676ab5ba3f95d2e3352e078c",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "nixpkgs.lib",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs-lib_2": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1772328832,
|
||||||
|
"narHash": "sha256-e+/T/pmEkLP6BHhYjx6GmwP5ivonQQn0bJdH9YrRB+Q=",
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "nixpkgs.lib",
|
||||||
|
"rev": "c185c7a5e5dd8f9add5b2f8ebeff00888b070742",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -947,11 +919,11 @@
|
|||||||
},
|
},
|
||||||
"nixpkgs-stable": {
|
"nixpkgs-stable": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1782116945,
|
"lastModified": 1787962033,
|
||||||
"narHash": "sha256-G3tw/IXmaH6IQ2upZvhuN9sG8CkuX+BLuJDpE8hz0Ds=",
|
"narHash": "sha256-u6z9VTZA4Kf3RkHQo9sQI7NI4Ei/uiU9vrMqOiwWP1Y=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "34268251cf5547d39063f2c5ea9a196246f7f3a6",
|
"rev": "c5c4a43b0e8056328ec4529f735cabdb8f1942bb",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -963,25 +935,11 @@
|
|||||||
},
|
},
|
||||||
"nixpkgs_10": {
|
"nixpkgs_10": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1682134069,
|
"lastModified": 1786599213,
|
||||||
"narHash": "sha256-TnI/ZXSmRxQDt2sjRYK/8j8iha4B4zP2cnQCZZ3vp7k=",
|
"narHash": "sha256-yNJd40f11EzXBjSByCB7IPpeFFAdeoSKKM67dGkfFoU=",
|
||||||
"owner": "NixOS",
|
|
||||||
"repo": "nixpkgs",
|
|
||||||
"rev": "fd901ef4bf93499374c5af385b2943f5801c0833",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"id": "nixpkgs",
|
|
||||||
"type": "indirect"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"nixpkgs_11": {
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1781074563,
|
|
||||||
"narHash": "sha256-md8WlXOlfnIeHeOScMTTHFyf2d6iaTwPl2apR5EQ3P4=",
|
|
||||||
"owner": "nixos",
|
"owner": "nixos",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "9ae611a455b90cf061d8f332b977e387bda8e1ca",
|
"rev": "0e251e24a4f24e036a084b6b4b2d2491af4167f4",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -993,11 +951,11 @@
|
|||||||
},
|
},
|
||||||
"nixpkgs_2": {
|
"nixpkgs_2": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1778093112,
|
"lastModified": 1787921194,
|
||||||
"narHash": "sha256-18rT4EfMrtYVMQX7AMAEsnv5KhCryLxGolmJ+v+vZdM=",
|
"narHash": "sha256-BgYCc3Gn0MuVOj8XpkisNIiTJ5XXFoQ3Ngs0SkVSiOg=",
|
||||||
"owner": "nixos",
|
"owner": "nixos",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "cf9db9282552bb3f2743fc9ed3852d239692089a",
|
"rev": "0525b37d4207b34aafae53206e7aac1fdf80dbac",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -1023,11 +981,11 @@
|
|||||||
},
|
},
|
||||||
"nixpkgs_4": {
|
"nixpkgs_4": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1781577229,
|
"lastModified": 1788039129,
|
||||||
"narHash": "sha256-lrp67w8AulE9Ks53n27I45ADSzbOCn4H+CNW1Ck8B+8=",
|
"narHash": "sha256-pa4Q0qErvCvzCaaUph7Sm37RhR4xvPrYI8Lgz6k85+A=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "567a49d1913ce81ac6e9582e3553dd90a955875f",
|
"rev": "d2f67949798825fe853f7c5d0492b8bf016d3f88",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -1039,11 +997,11 @@
|
|||||||
},
|
},
|
||||||
"nixpkgs_5": {
|
"nixpkgs_5": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1780749050,
|
"lastModified": 1787736819,
|
||||||
"narHash": "sha256-3av0pIjlOWQ6rDbNOmpUSvbNnJkGORQKKjb4LtCZsIY=",
|
"narHash": "sha256-cV5xEJJK3BvhU8rEd4mC9UsmDi5qscv/kzGPhBRC5WA=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "a799d3e3886da994fa307f817a6bc705ae538eeb",
|
"rev": "9fbb54b33e91ee4ca368e35a78e0613c720600b3",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -1114,6 +1072,26 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"noctalia": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"unstable"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1788154427,
|
||||||
|
"narHash": "sha256-nCzmnj3rk60iznPMoDBg09b3wsDzEoGAjQj81QlsUTo=",
|
||||||
|
"owner": "noctalia-dev",
|
||||||
|
"repo": "noctalia",
|
||||||
|
"rev": "bee126157205f9e686e4f3f98d2cc3be1c1bf252",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "noctalia-dev",
|
||||||
|
"repo": "noctalia",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
"nur": {
|
"nur": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"flake-parts": [
|
"flake-parts": [
|
||||||
@@ -1126,11 +1104,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1780281641,
|
"lastModified": 1785549842,
|
||||||
"narHash": "sha256-M/+hUKoKbHXpV0xGVfELbN1Ds1aoe3pL5p5/t46YhVo=",
|
"narHash": "sha256-DCwBZmGsySF7oKGTRgEv2HvpxVXkHT+38VhTM76k0B4=",
|
||||||
"owner": "nix-community",
|
"owner": "nix-community",
|
||||||
"repo": "NUR",
|
"repo": "NUR",
|
||||||
"rev": "30f9ae2f04174de63ba8bcf3580ca90843b28a01",
|
"rev": "a9f987b57594e845e3e5cdd423b9a70846d70308",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -1142,18 +1120,17 @@
|
|||||||
"pre-commit-hooks": {
|
"pre-commit-hooks": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"flake-compat": "flake-compat_2",
|
"flake-compat": "flake-compat_2",
|
||||||
"gitignore": "gitignore_2",
|
|
||||||
"nixpkgs": [
|
"nixpkgs": [
|
||||||
"hyprland",
|
"hyprland",
|
||||||
"nixpkgs"
|
"nixpkgs"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1778507602,
|
"lastModified": 1787424939,
|
||||||
"narHash": "sha256-kTwur1wV+01SdqskVMSo6JMEpg71ps3HpbFY2GsflKs=",
|
"narHash": "sha256-O2tBn84NNuHrnqNVxx/XqsXwfYvS1YwBh+7CBnbCYsk=",
|
||||||
"owner": "cachix",
|
"owner": "cachix",
|
||||||
"repo": "git-hooks.nix",
|
"repo": "git-hooks.nix",
|
||||||
"rev": "61ab0e80d9c7ab14c256b5b453d8b3fb0189ba0a",
|
"rev": "809414f0cdadf82cf11b06c2b29ba9b3168b3297",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -1226,6 +1203,7 @@
|
|||||||
"nixos-generators": "nixos-generators",
|
"nixos-generators": "nixos-generators",
|
||||||
"nixos-hardware": "nixos-hardware",
|
"nixos-hardware": "nixos-hardware",
|
||||||
"nixpkgs": "nixpkgs_8",
|
"nixpkgs": "nixpkgs_8",
|
||||||
|
"noctalia": "noctalia",
|
||||||
"sops-nix": "sops-nix",
|
"sops-nix": "sops-nix",
|
||||||
"split-monitor-workspaces": "split-monitor-workspaces",
|
"split-monitor-workspaces": "split-monitor-workspaces",
|
||||||
"stylix": "stylix",
|
"stylix": "stylix",
|
||||||
@@ -1243,11 +1221,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1782165805,
|
"lastModified": 1786629091,
|
||||||
"narHash": "sha256-478kKQBvK6SYTOdN2h9jhKJv94nbXRbFMfuL1WshErg=",
|
"narHash": "sha256-gkig4nPi1CWc4Z50GBsjE4ygSE7hMpl/TwID2an2Cck=",
|
||||||
"owner": "Mic92",
|
"owner": "Mic92",
|
||||||
"repo": "sops-nix",
|
"repo": "sops-nix",
|
||||||
"rev": "56b24064fdcaedca53553b1a6d607fd23b613a24",
|
"rev": "a8627b21b9107c5711c96b84f32a9a4b3d45295f",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -1264,11 +1242,11 @@
|
|||||||
"nix-filter": "nix-filter"
|
"nix-filter": "nix-filter"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1782237065,
|
"lastModified": 1787489216,
|
||||||
"narHash": "sha256-Oxtr8k+qu4Kd/7BJ5eo8Pfoje8PDIO1YK2+mhCkHRhQ=",
|
"narHash": "sha256-VE1o0B6GPHrwmYANfGIEm/hDz2u4IhG0Gdj+ZkEV2uY=",
|
||||||
"owner": "zjeffer",
|
"owner": "zjeffer",
|
||||||
"repo": "split-monitor-workspaces",
|
"repo": "split-monitor-workspaces",
|
||||||
"rev": "968a6a603cabf8ab8f5ce5a402e8ed3bfcae69ce",
|
"rev": "47b22971e3a21d228882ca1e2509fdac26f2d5b2",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -1297,11 +1275,11 @@
|
|||||||
"tinted-zed": "tinted-zed"
|
"tinted-zed": "tinted-zed"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1782310521,
|
"lastModified": 1787771653,
|
||||||
"narHash": "sha256-vsxcG0i8e4EPfdnhMTKMVzD1825H2vG1BBslzom9wxg=",
|
"narHash": "sha256-DkkJSBOXWV/mja5Vy8az5g1KpZlsbUwlmH0BsQhowaQ=",
|
||||||
"owner": "nix-community",
|
"owner": "nix-community",
|
||||||
"repo": "stylix",
|
"repo": "stylix",
|
||||||
"rev": "e084d011e7ee9302aceaaf6c1fc28a9ace09e16a",
|
"rev": "5e3809851f486e7fc7e84b40f174c74b60ecc784",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -1327,15 +1305,16 @@
|
|||||||
},
|
},
|
||||||
"systems_2": {
|
"systems_2": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1681028828,
|
"lastModified": 1774449309,
|
||||||
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
"narHash": "sha256-brhZ8DmuGtzkCYHJg4HEd602amKm89Y9ytsFZ5uWD1w=",
|
||||||
"owner": "nix-systems",
|
"owner": "nix-systems",
|
||||||
"repo": "default",
|
"repo": "default",
|
||||||
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
"rev": "c29398b59d2048c4ab79345812849c9bd15e9150",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"owner": "nix-systems",
|
"owner": "nix-systems",
|
||||||
|
"ref": "future-26.11",
|
||||||
"repo": "default",
|
"repo": "default",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
@@ -1355,21 +1334,6 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"systems_4": {
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1681028828,
|
|
||||||
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
|
||||||
"owner": "nix-systems",
|
|
||||||
"repo": "default",
|
|
||||||
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "nix-systems",
|
|
||||||
"repo": "default",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"thefuck": {
|
"thefuck": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"flake-utils": "flake-utils_2",
|
"flake-utils": "flake-utils_2",
|
||||||
@@ -1411,11 +1375,11 @@
|
|||||||
"tinted-schemes": {
|
"tinted-schemes": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1777806186,
|
"lastModified": 1785153830,
|
||||||
"narHash": "sha256-PDF0/wObw4nIsSBeXVYLsloXOiphXCgIdsrNcVXguKs=",
|
"narHash": "sha256-fNdfCTeCXU3tZG3TMincd+u68qBHQgCr2Ljr/M1mWP0=",
|
||||||
"owner": "tinted-theming",
|
"owner": "tinted-theming",
|
||||||
"repo": "schemes",
|
"repo": "schemes",
|
||||||
"rev": "0c94645546f4f3ddac77a1a5fce54eb95bf50795",
|
"rev": "9bd28ed313560db3c5b605c63bc4e309e78e3fc8",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -1427,11 +1391,11 @@
|
|||||||
"tinted-tmux": {
|
"tinted-tmux": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1778379944,
|
"lastModified": 1785031658,
|
||||||
"narHash": "sha256-wPDFzMGSlARlw0Sfsn48Q2+jPSfk6N0Ng6BC/d+7Q24=",
|
"narHash": "sha256-mZp9O2LjzdMzlqQF3l3fjqsuPBzXy+1qTfBEUGjTlpk=",
|
||||||
"owner": "tinted-theming",
|
"owner": "tinted-theming",
|
||||||
"repo": "tinted-tmux",
|
"repo": "tinted-tmux",
|
||||||
"rev": "fe0203a198690e71a5ff11e08812a4673de3678d",
|
"rev": "5d2c67f61ea7af36f16865ab6d541cdba41dc257",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -1443,11 +1407,11 @@
|
|||||||
"tinted-zed": {
|
"tinted-zed": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1778378178,
|
"lastModified": 1785030526,
|
||||||
"narHash": "sha256-OXPXRIQgGwV77HjYRryOHguh4ALX96jkg+tseLkGgHA=",
|
"narHash": "sha256-klZf8UviewRkxuu74Bhbq6tqy7oxebQC7UVRWbbtQxU=",
|
||||||
"owner": "tinted-theming",
|
"owner": "tinted-theming",
|
||||||
"repo": "base16-zed",
|
"repo": "base16-zed",
|
||||||
"rev": "9cd816033ff969415b190722cddf134e78a5665f",
|
"rev": "16f5a8adf4a6b1310d0a61ab172de963e8f76a02",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -1458,11 +1422,11 @@
|
|||||||
},
|
},
|
||||||
"unstable": {
|
"unstable": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1781577229,
|
"lastModified": 1788039129,
|
||||||
"narHash": "sha256-lrp67w8AulE9Ks53n27I45ADSzbOCn4H+CNW1Ck8B+8=",
|
"narHash": "sha256-pa4Q0qErvCvzCaaUph7Sm37RhR4xvPrYI8Lgz6k85+A=",
|
||||||
"owner": "nixos",
|
"owner": "nixos",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "567a49d1913ce81ac6e9582e3553dd90a955875f",
|
"rev": "d2f67949798825fe853f7c5d0492b8bf016d3f88",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -1479,11 +1443,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1782358560,
|
"lastModified": 1788146656,
|
||||||
"narHash": "sha256-vCcLh9pw3XO/+Lxk8r6xv6QnoCrTfGqiACcI7O637Wg=",
|
"narHash": "sha256-XmJmvk9rytTb7dCotO/aqR+YysB8HOqnprlOdv+LAF4=",
|
||||||
"owner": "nix-community",
|
"owner": "nix-community",
|
||||||
"repo": "home-manager",
|
"repo": "home-manager",
|
||||||
"rev": "3a70e333f2950c302e875c44cfcfaff3f80f36bc",
|
"rev": "82c265faf4e3161d6015db07c9b0f1ee36a9029b",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -1520,15 +1484,14 @@
|
|||||||
},
|
},
|
||||||
"vscode-server": {
|
"vscode-server": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"flake-utils": "flake-utils_3",
|
"flake-parts": "flake-parts_3"
|
||||||
"nixpkgs": "nixpkgs_10"
|
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1770124655,
|
"lastModified": 1784312229,
|
||||||
"narHash": "sha256-yHmd2B13EtBUPLJ+x0EaBwNkQr9LTne1arLVxT6hSnY=",
|
"narHash": "sha256-2uHCSUw341o3my1R0U0YCfbnMEazylxb58evWsjGL50=",
|
||||||
"owner": "nix-community",
|
"owner": "nix-community",
|
||||||
"repo": "nixos-vscode-server",
|
"repo": "nixos-vscode-server",
|
||||||
"rev": "92ce71c3ba5a94f854e02d57b14af4997ab54ef0",
|
"rev": "2f984dfbe7e5271b5c413d3e734374cc1306c921",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -1565,11 +1528,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1780133819,
|
"lastModified": 1786988229,
|
||||||
"narHash": "sha256-0YPKIY3dlnR7SPq7Z8ekFVvzFsfeiAtEj+QUI3KHrlI=",
|
"narHash": "sha256-frEFLVRj8xXvBBDs44IRiqHo6R2PxsRpluygL7abjjI=",
|
||||||
"owner": "hyprwm",
|
"owner": "hyprwm",
|
||||||
"repo": "xdg-desktop-portal-hyprland",
|
"repo": "xdg-desktop-portal-hyprland",
|
||||||
"rev": "4a170c0ba96fd37374f93d8f91c9ed91814828ac",
|
"rev": "59d429bf45aed4e2209043c0c36565ad8e2859a5",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -1581,14 +1544,14 @@
|
|||||||
"zen-browser": {
|
"zen-browser": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"home-manager": "home-manager_2",
|
"home-manager": "home-manager_2",
|
||||||
"nixpkgs": "nixpkgs_11"
|
"nixpkgs": "nixpkgs_10"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1782144240,
|
"lastModified": 1788149125,
|
||||||
"narHash": "sha256-RgCWSv7AJZCwPhCzz+J0lvwp1WBz9ouvCnnlmvu0xfw=",
|
"narHash": "sha256-GueAv4789rOV70hixnL9+uN4tiDKJm7s92DnTejdpuE=",
|
||||||
"owner": "0xc000022070",
|
"owner": "0xc000022070",
|
||||||
"repo": "zen-browser-flake",
|
"repo": "zen-browser-flake",
|
||||||
"rev": "d1693556428967f8b4eef128feb090421ddcaf15",
|
"rev": "5fe00f38d41ced9a5c0ba1cbf2127d7e8b3e3d56",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
description = "Susano NixOS Homelab";
|
description = "Alex's NixOS";
|
||||||
|
|
||||||
inputs = {
|
inputs = {
|
||||||
# Nixpkgs
|
# Nixpkgs
|
||||||
@@ -70,7 +70,12 @@
|
|||||||
|
|
||||||
thefuck.url = "github:LichHunter/thefuck";
|
thefuck.url = "github:LichHunter/thefuck";
|
||||||
|
|
||||||
backlog.url = "github:LichHunter/backlog";
|
backlog.url = "git+https://gitea.susano-homelab.duckdns.org/fujin/backlog.git";
|
||||||
|
|
||||||
|
noctalia = {
|
||||||
|
url = "github:noctalia-dev/noctalia";
|
||||||
|
inputs.nixpkgs.follows = "unstable";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
outputs = {
|
outputs = {
|
||||||
@@ -209,6 +214,19 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
packages.x86_64-linux = {
|
packages.x86_64-linux = {
|
||||||
|
nixos-lxc = (nixpkgs.lib.nixosSystem {
|
||||||
|
system = "x86_64-linux";
|
||||||
|
modules = [
|
||||||
|
./machines/builder
|
||||||
|
({ modulesPath, ... }: {
|
||||||
|
imports = [ (modulesPath + "/virtualisation/proxmox-lxc.nix") ];
|
||||||
|
})
|
||||||
|
];
|
||||||
|
specialArgs = {
|
||||||
|
inherit inputs;
|
||||||
|
};
|
||||||
|
}).config.system.build.image;
|
||||||
|
|
||||||
izanami-proxmox = nixos-generators.nixosGenerate {
|
izanami-proxmox = nixos-generators.nixosGenerate {
|
||||||
system = "x86_64-linux";
|
system = "x86_64-linux";
|
||||||
modules = [
|
modules = [
|
||||||
|
|||||||
@@ -3,5 +3,6 @@
|
|||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
./waybar
|
./waybar
|
||||||
|
./noctalia
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,143 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
inputs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
with lib;
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.dov.bar.noctalia;
|
||||||
|
c = config.lib.stylix.colors.withHashtag;
|
||||||
|
|
||||||
|
# Build a noctalia palette from the active stylix base16 scheme.
|
||||||
|
# Both dark/light keys carry the same values so the palette works
|
||||||
|
# regardless of which theme.mode noctalia picks.
|
||||||
|
mkPalette = variant: {
|
||||||
|
mPrimary = c.base0D;
|
||||||
|
mOnPrimary = c.base00;
|
||||||
|
mSecondary = c.base0E;
|
||||||
|
mOnSecondary = c.base00;
|
||||||
|
mTertiary = c.base0C;
|
||||||
|
mOnTertiary = c.base00;
|
||||||
|
mError = c.base08;
|
||||||
|
mOnError = c.base00;
|
||||||
|
mSurface = if variant == "dark" then c.base00 else c.base07;
|
||||||
|
mOnSurface = if variant == "dark" then c.base05 else c.base01;
|
||||||
|
mSurfaceVariant = if variant == "dark" then c.base01 else c.base06;
|
||||||
|
mOnSurfaceVariant = if variant == "dark" then c.base04 else c.base02;
|
||||||
|
mHover = if variant == "dark" then mkForce c.base02 else mkForce c.base06;
|
||||||
|
mOnHover = if variant == "dark" then mkForce c.base06 else mkForce c.base01;
|
||||||
|
mOutline = c.base03;
|
||||||
|
mShadow = c.base00;
|
||||||
|
terminal = {
|
||||||
|
background = if variant == "dark" then c.base00 else c.base07;
|
||||||
|
foreground = if variant == "dark" then c.base05 else c.base01;
|
||||||
|
cursor = if variant == "dark" then c.base05 else c.base01;
|
||||||
|
cursorText = if variant == "dark" then c.base00 else c.base07;
|
||||||
|
selectionBg = c.base02;
|
||||||
|
selectionFg = if variant == "dark" then c.base05 else c.base01;
|
||||||
|
normal = {
|
||||||
|
black = c.base00;
|
||||||
|
red = c.base08;
|
||||||
|
green = c.base0B;
|
||||||
|
yellow = c.base0A;
|
||||||
|
blue = c.base0D;
|
||||||
|
magenta = c.base0E;
|
||||||
|
cyan = c.base0C;
|
||||||
|
white = c.base05;
|
||||||
|
};
|
||||||
|
bright = {
|
||||||
|
black = c.base03;
|
||||||
|
red = c.base08;
|
||||||
|
green = c.base0B;
|
||||||
|
yellow = c.base0A;
|
||||||
|
blue = c.base0D;
|
||||||
|
magenta = c.base0E;
|
||||||
|
cyan = c.base0C;
|
||||||
|
white = c.base07;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
themeMode = if config.stylix.polarity == "dark" then "dark" else "light";
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.dov.bar.noctalia.enable = mkEnableOption "noctalia bar";
|
||||||
|
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
programs.noctalia = {
|
||||||
|
enable = true;
|
||||||
|
package = inputs.noctalia.packages.${pkgs.system}.default;
|
||||||
|
systemd.enable = true;
|
||||||
|
|
||||||
|
customPalettes.stylix = {
|
||||||
|
dark = mkPalette "dark";
|
||||||
|
light = mkPalette "light";
|
||||||
|
};
|
||||||
|
|
||||||
|
settings = {
|
||||||
|
theme = {
|
||||||
|
mode = themeMode;
|
||||||
|
source = "custom";
|
||||||
|
custom_palette = "stylix";
|
||||||
|
};
|
||||||
|
|
||||||
|
location.address = "Marseille, France";
|
||||||
|
|
||||||
|
bar.main = {
|
||||||
|
position = "top";
|
||||||
|
thickness = 34;
|
||||||
|
radius = 12;
|
||||||
|
margin_h = 0;
|
||||||
|
margin_v = 6;
|
||||||
|
padding = 14;
|
||||||
|
widget_spacing = 6;
|
||||||
|
capsule = true;
|
||||||
|
capsule_fill = "surface_variant";
|
||||||
|
capsule_radius = 20.0;
|
||||||
|
reserve_space = true;
|
||||||
|
|
||||||
|
start = [ "workspaces" "media" "active_window" ];
|
||||||
|
center = [ "clock" ];
|
||||||
|
end = [ "tray" "caffeine" "keyboard_layout" "cpu" "ram" "brightness" "volume" "mic" "network" "battery" "session" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
widget = {
|
||||||
|
clock = {
|
||||||
|
format = "{:%a %d %b, %H:%M}";
|
||||||
|
tooltip_format = "{:%A, %B %d, %Y}";
|
||||||
|
};
|
||||||
|
|
||||||
|
workspaces.display = "id";
|
||||||
|
|
||||||
|
# Named sysmon instances — type field overrides the widget id
|
||||||
|
cpu = {
|
||||||
|
type = "sysmon";
|
||||||
|
stat = "cpu_usage";
|
||||||
|
};
|
||||||
|
|
||||||
|
ram = {
|
||||||
|
type = "sysmon";
|
||||||
|
stat = "ram_pct";
|
||||||
|
};
|
||||||
|
|
||||||
|
# Microphone — named volume widget with input device
|
||||||
|
mic = {
|
||||||
|
type = "volume";
|
||||||
|
device = "input";
|
||||||
|
};
|
||||||
|
|
||||||
|
battery.warning_threshold = 30;
|
||||||
|
|
||||||
|
keyboard_layout = {
|
||||||
|
display = "short";
|
||||||
|
hide_when_single_layout = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -6,7 +6,8 @@ let
|
|||||||
cfg = config.dov.dynamic-theme;
|
cfg = config.dov.dynamic-theme;
|
||||||
schemes = "${pkgs.base16-schemes}/share/themes";
|
schemes = "${pkgs.base16-schemes}/share/themes";
|
||||||
|
|
||||||
# Single source of truth for builtin themes
|
# Curated defaults — covers the popular schemes without blowing up
|
||||||
|
# build memory. Users can add more via `dov.dynamic-theme.themes`.
|
||||||
builtinThemes = {
|
builtinThemes = {
|
||||||
gruvbox = {
|
gruvbox = {
|
||||||
dark = "${schemes}/gruvbox-dark-hard.yaml";
|
dark = "${schemes}/gruvbox-dark-hard.yaml";
|
||||||
@@ -16,9 +17,42 @@ let
|
|||||||
dark = "${schemes}/catppuccin-mocha.yaml";
|
dark = "${schemes}/catppuccin-mocha.yaml";
|
||||||
light = "${schemes}/catppuccin-latte.yaml";
|
light = "${schemes}/catppuccin-latte.yaml";
|
||||||
};
|
};
|
||||||
|
nord = {
|
||||||
|
dark = "${schemes}/nord.yaml";
|
||||||
|
light = "${schemes}/nord-light.yaml";
|
||||||
|
};
|
||||||
|
solarized = {
|
||||||
|
dark = "${schemes}/solarized-dark.yaml";
|
||||||
|
light = "${schemes}/solarized-light.yaml";
|
||||||
|
};
|
||||||
|
tokyo-night = {
|
||||||
|
dark = "${schemes}/tokyo-night-dark.yaml";
|
||||||
|
light = "${schemes}/tokyo-night-light.yaml";
|
||||||
|
};
|
||||||
|
rose-pine = {
|
||||||
|
dark = "${schemes}/rose-pine.yaml";
|
||||||
|
light = "${schemes}/rose-pine-dawn.yaml";
|
||||||
|
};
|
||||||
|
one = {
|
||||||
|
dark = "${schemes}/onedark.yaml";
|
||||||
|
light = "${schemes}/one-light.yaml";
|
||||||
|
};
|
||||||
|
material = {
|
||||||
|
dark = "${schemes}/material-darker.yaml";
|
||||||
|
light = "${schemes}/material-lighter.yaml";
|
||||||
|
};
|
||||||
|
google = {
|
||||||
|
dark = "${schemes}/google-dark.yaml";
|
||||||
|
light = "${schemes}/google-light.yaml";
|
||||||
|
};
|
||||||
|
github = {
|
||||||
|
dark = "${schemes}/github-dark.yaml";
|
||||||
|
light = "${schemes}/github.yaml";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
# Generate all theme-variant combinations
|
# Generate all theme-variant combinations from the configured themes.
|
||||||
|
# Each theme produces a "-dark" and "-light" variant.
|
||||||
themeVariants = concatMapAttrs (name: theme: {
|
themeVariants = concatMapAttrs (name: theme: {
|
||||||
"${name}-dark" = { scheme = theme.dark; polarity = "dark"; };
|
"${name}-dark" = { scheme = theme.dark; polarity = "dark"; };
|
||||||
"${name}-light" = { scheme = theme.light; polarity = "light"; };
|
"${name}-light" = { scheme = theme.light; polarity = "light"; };
|
||||||
@@ -112,28 +146,42 @@ in {
|
|||||||
};
|
};
|
||||||
});
|
});
|
||||||
default = builtinThemes;
|
default = builtinThemes;
|
||||||
description = "Available themes with dark and light variants";
|
description = ''
|
||||||
|
Available themes with dark and light variants. Each entry
|
||||||
|
generates two specialisations (`<name>-dark` and
|
||||||
|
`<name>-light`). Add more here to extend the defaults.
|
||||||
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
doomThemes = mkOption {
|
doomThemes = mkOption {
|
||||||
type = types.attrsOf types.str;
|
type = types.attrsOf types.str;
|
||||||
default = {
|
# Auto-generate sane defaults from the configured themes, then
|
||||||
gruvbox-dark = "doom-gruvbox";
|
# overlay specific overrides for schemes that ship a dedicated
|
||||||
gruvbox-light = "doom-one-light";
|
# doom-theme.
|
||||||
catppuccin-dark = "doom-one";
|
default =
|
||||||
catppuccin-light = "doom-one-light";
|
let
|
||||||
|
generated = concatMapAttrs (name: _: {
|
||||||
|
"${name}-dark" = "doom-one";
|
||||||
|
"${name}-light" = "doom-one-light";
|
||||||
|
}) cfg.themes;
|
||||||
|
in generated // {
|
||||||
|
"gruvbox-dark" = "doom-gruvbox";
|
||||||
|
"solarized-dark" = "doom-solarized-dark";
|
||||||
|
"solarized-light" = "doom-solarized-light";
|
||||||
|
"tokyo-night-dark" = "doom-tokyo-night";
|
||||||
|
"nord-dark" = "doom-nordic";
|
||||||
|
"material-dark" = "doom-material";
|
||||||
|
"rose-pine-dark" = "doom-rose-pine";
|
||||||
|
"catppuccin-dark" = "doom-catppuccin-mocha";
|
||||||
|
"catppuccin-light" = "doom-catppuccin-latte";
|
||||||
};
|
};
|
||||||
description = ''
|
description = ''
|
||||||
Mapping from theme variant name (e.g. "gruvbox-dark") to the Doom
|
Mapping from variant name (e.g. "gruvbox-dark") to the Doom
|
||||||
Emacs theme symbol (e.g. "doom-gruvbox") that theme-switch will
|
Emacs theme symbol. Defaults are auto-generated from the
|
||||||
live-load via emacsclient when switching to that variant. Variants
|
configured themes (dark → doom-one, light → doom-one-light)
|
||||||
absent from this map are left unchanged in Emacs.
|
with overrides for schemes that have a dedicated doom-theme.
|
||||||
|
Only themes installed in Doom will load; others are silently
|
||||||
Only themes actually installed in Doom will load; the defaults use
|
skipped.
|
||||||
themes bundled with doom-themes (so they work out of the box, though
|
|
||||||
catppuccin variants fall back to generic dark/light). For accurate
|
|
||||||
catppuccin colours, install the `catppuccin-theme` Emacs package and
|
|
||||||
map the variants to `catppuccin-mocha` / `catppuccin-latte`.
|
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -213,5 +261,21 @@ in {
|
|||||||
Install.WantedBy = [ "graphical-session.target" ];
|
Install.WantedBy = [ "graphical-session.target" ];
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Nushell tab-completion: declares `theme-switch`'s argument signature
|
||||||
|
# so nushell completes variant names natively (takes priority over
|
||||||
|
# carapace's generic fallback). `extraConfig` is `types.lines`, so it
|
||||||
|
# merges cleanly with the carapace completer from hm-modules/shell/nu.
|
||||||
|
(mkIf config.programs.nushell.enable {
|
||||||
|
programs.nushell.extraConfig = ''
|
||||||
|
def "nu-complete theme-variants" [] {
|
||||||
|
"${availableVariants}" | split row " "
|
||||||
|
}
|
||||||
|
|
||||||
|
extern theme-switch [
|
||||||
|
variant: string@"nu-complete theme-variants"
|
||||||
|
]
|
||||||
|
'';
|
||||||
|
})
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,152 @@
|
|||||||
|
# Minimal NixOS configuration for a disposable LXC builder on Proxmox VE.
|
||||||
|
#
|
||||||
|
# Built via the `nixos-lxc` flake output using nixos-generators with
|
||||||
|
# format = "proxmox-lxc". The resulting tarball is uploaded to PVE's
|
||||||
|
# /var/lib/vz/template/cache/ and cloned by pve-build each time a
|
||||||
|
# disposable builder is needed.
|
||||||
|
#
|
||||||
|
# Responsibilities of this image:
|
||||||
|
# * Run nix with flakes as the `builder` user so nixos-rebuild
|
||||||
|
# --build-host builder@<hostname> works against it.
|
||||||
|
# * Be a competent builder: all cores, hardlink dedup, keep-derivations
|
||||||
|
# and keep-outputs, keep-going on failure, idle CPU scheduling.
|
||||||
|
# * Accept SSH from the operator (`builder` user + admin keys shared
|
||||||
|
# across the rest of the homelab). Root SSH is disabled.
|
||||||
|
# * Stay tiny — no bootloader, no kernel, no home-manager. The proxmox-lxc
|
||||||
|
# format module from nixpkgs already sets boot.isContainer = true and
|
||||||
|
# handles the LXC-specific bits.
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
inputs,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
flakeInputs = lib.filterAttrs (_: lib.isType "flake") inputs;
|
||||||
|
|
||||||
|
# Operator keys — same ones baked into every other machine in this flake.
|
||||||
|
# Whoever runs pve-build must hold a matching private key. Add more
|
||||||
|
# keys here as needed; the authorized_keys list mirrors this exactly.
|
||||||
|
adminKeys = [
|
||||||
|
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBcGhVpjmWEw1GEw0y/ysJPa2v3+u/Rt/iES/Se2huH2 alexander0derevianko@gmail.com"
|
||||||
|
"sk-ssh-ed25519@openssh.com AAAAGnNrLXNzaC1lZDI1NTE5QG9wZW5zc2guY29tAAAAIGXvmStLAC4f+D9/b3/eKl6lb8xLQOfDqwu3Piocrr7ZAAAABHNzaDo= yubikey@fujin"
|
||||||
|
];
|
||||||
|
in {
|
||||||
|
nixpkgs = {
|
||||||
|
hostPlatform = "x86_64-linux";
|
||||||
|
config.allowUnfree = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
nix = {
|
||||||
|
settings = {
|
||||||
|
experimental-features = "nix-command flakes";
|
||||||
|
flake-registry = "";
|
||||||
|
nix-path = config.nix.nixPath;
|
||||||
|
|
||||||
|
# Parallelism — use every core the container can see.
|
||||||
|
cores = 0; # 0 = use all visible cores per build job
|
||||||
|
max-jobs = "auto"; # auto = one local build job per core
|
||||||
|
|
||||||
|
# Store hygiene — hardlink identical files so the store stays compact
|
||||||
|
# across many sequential builds.
|
||||||
|
auto-optimise-store = true;
|
||||||
|
|
||||||
|
# Cache reuse — keep derivation files and their outputs around even
|
||||||
|
# when no current generation references them. Massively speeds up
|
||||||
|
# repeated builds of the same flakes and lets you inspect what a
|
||||||
|
# prior build actually pulled in.
|
||||||
|
gc-keep-derivations = true;
|
||||||
|
gc-keep-outputs = true;
|
||||||
|
|
||||||
|
# Don't abort the whole build on the first failing derivation — let
|
||||||
|
# nix continue so the caller sees every failure in one pass.
|
||||||
|
keep-going = true;
|
||||||
|
|
||||||
|
# `builder` drives builds via nixos-rebuild --build-host. Trust it so
|
||||||
|
# `nix copy --to ssh://builder@<ct>` from the caller works without
|
||||||
|
# extra configuration.
|
||||||
|
trusted-users = [ "builder" ];
|
||||||
|
allowed-users = [ "builder" ];
|
||||||
|
|
||||||
|
# Keep the default cache so flake inputs and build outputs resolve
|
||||||
|
# without having to build them from source.
|
||||||
|
substituters = lib.mkForce [ "https://cache.nixos.org/" ];
|
||||||
|
trusted-public-keys = lib.mkForce [
|
||||||
|
"cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY="
|
||||||
|
];
|
||||||
|
};
|
||||||
|
channel.enable = false;
|
||||||
|
|
||||||
|
# Be polite to other tenants on the PVE node when no builds are running.
|
||||||
|
daemonCPUSchedPolicy = "idle";
|
||||||
|
|
||||||
|
registry = lib.mapAttrs (_: flake: { inherit flake; }) flakeInputs;
|
||||||
|
nixPath = lib.mapAttrsToList (n: _: "${n}=flake:${n}") flakeInputs;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Networking: PVE creates the veth pair and attaches it to the bridge, but
|
||||||
|
# because NixOS is not a recognised PVE ostype (no setup plugin exists),
|
||||||
|
# PVE cannot write the guest-side network config. We configure eth0 DHCP
|
||||||
|
# ourselves via systemd-networkd. The proxmox-lxc module already enables
|
||||||
|
# networking.useNetworkd; this block provides the matching .network file.
|
||||||
|
systemd.network = {
|
||||||
|
enable = true;
|
||||||
|
networks."10-eth0" = {
|
||||||
|
matchConfig.Name = "eth0";
|
||||||
|
networkConfig.DHCP = "yes";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
time.timeZone = "Europe/Warsaw";
|
||||||
|
i18n.defaultLocale = "en_US.UTF-8";
|
||||||
|
|
||||||
|
# `builder` is the only SSH-reachable account on this disposable. It is a
|
||||||
|
# normal user (no root login via SSH — see services.openssh.settings below)
|
||||||
|
# but has passwordless sudo for the rare case a build needs it. Build
|
||||||
|
# traffic itself goes through nix-daemon, which trusts `builder`.
|
||||||
|
users.users.builder = {
|
||||||
|
isNormalUser = true;
|
||||||
|
description = "Disposable LXC builder";
|
||||||
|
extraGroups = [ "wheel" ];
|
||||||
|
openssh.authorizedKeys.keys = adminKeys;
|
||||||
|
};
|
||||||
|
|
||||||
|
security.sudo = {
|
||||||
|
enable = true;
|
||||||
|
extraRules = [{
|
||||||
|
users = [ "builder" ];
|
||||||
|
commands = [{
|
||||||
|
command = "ALL";
|
||||||
|
options = [ "NOPASSWD" ];
|
||||||
|
}];
|
||||||
|
}];
|
||||||
|
};
|
||||||
|
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
vim
|
||||||
|
wget
|
||||||
|
curl
|
||||||
|
ripgrep
|
||||||
|
jq
|
||||||
|
git
|
||||||
|
tmux
|
||||||
|
htop
|
||||||
|
ncdu
|
||||||
|
file
|
||||||
|
iproute2
|
||||||
|
nix-output-monitor # `nom build` for friendlier nix build output
|
||||||
|
];
|
||||||
|
|
||||||
|
services.openssh = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
PermitRootLogin = "no"; # only `builder` may log in
|
||||||
|
PasswordAuthentication = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# This is a disposable image; do NOT change.
|
||||||
|
system.stateVersion = "25.05";
|
||||||
|
}
|
||||||
@@ -66,9 +66,11 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
networking = {
|
networking = {
|
||||||
|
# OPNsense (192.168.100.1) runs Unbound with the homelab.lan overrides;
|
||||||
|
# the old 192.168.1.x Pi-hole/router are gone and returned NXDOMAIN for
|
||||||
|
# the local zone. 1.1.1.1 stays as a fallback if the firewall is down.
|
||||||
nameservers = [
|
nameservers = [
|
||||||
"192.168.1.2" # PyHole
|
"192.168.100.1" # OPNsense Unbound
|
||||||
"192.168.1.1" # Router
|
|
||||||
"1.1.1.1"
|
"1.1.1.1"
|
||||||
];
|
];
|
||||||
dhcpcd.extraConfig = ''
|
dhcpcd.extraConfig = ''
|
||||||
@@ -112,6 +114,12 @@
|
|||||||
|
|
||||||
dov = {
|
dov = {
|
||||||
development.emacs.enable = true;
|
development.emacs.enable = true;
|
||||||
|
development.qoder = {
|
||||||
|
enable = false;
|
||||||
|
version = "1.19.2";
|
||||||
|
hash = "sha256-/P3UStsRHKKWC1xET9SL23E0CUPxQ5DkmWFco+dH37A="; # nix store prefetch-file --json https://download.qoder.com/release/latest/qoder_amd64.deb | jq -r .hash
|
||||||
|
};
|
||||||
|
development.android.enable = true;
|
||||||
|
|
||||||
virtualisation.docker.enable = true;
|
virtualisation.docker.enable = true;
|
||||||
virtualisation.incus.enable = true;
|
virtualisation.incus.enable = true;
|
||||||
@@ -121,6 +129,8 @@
|
|||||||
display-manager.ly.enable = true;
|
display-manager.ly.enable = true;
|
||||||
|
|
||||||
gaming.enable = true;
|
gaming.enable = true;
|
||||||
|
|
||||||
|
yubikey.enable = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
###
|
###
|
||||||
@@ -134,7 +144,9 @@
|
|||||||
# Stylix is handled entirely at the Home Manager level (see
|
# Stylix is handled entirely at the Home Manager level (see
|
||||||
# hm-modules/theme). Load the stylix HM module here so the `stylix`
|
# hm-modules/theme). Load the stylix HM module here so the `stylix`
|
||||||
# option exists for fujin's home configuration.
|
# option exists for fujin's home configuration.
|
||||||
sharedModules = [ inputs.stylix.homeModules.stylix ];
|
sharedModules = [
|
||||||
|
inputs.stylix.homeModules.stylix
|
||||||
|
];
|
||||||
|
|
||||||
users."${username}" = { imports = [ ./home.nix ] ++ extraHomeModules; };
|
users."${username}" = { imports = [ ./home.nix ] ++ extraHomeModules; };
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -42,6 +42,12 @@
|
|||||||
;; change `org-directory'. It must be set before org loads!
|
;; change `org-directory'. It must be set before org loads!
|
||||||
(setq org-directory "~/org/")
|
(setq org-directory "~/org/")
|
||||||
|
|
||||||
|
;; Use bash, not nu, for non-interactive subprocesses (compile, shell-command,
|
||||||
|
;; lsp-mode installers). Nu doesn't unescape Emacs's POSIX-style backslash
|
||||||
|
;; escaping, which corrupts args like -Djdt.download.url=...?...=... .
|
||||||
|
;; vterm keeps using nu (see vterm-shell below).
|
||||||
|
(setq shell-file-name "/run/current-system/sw/bin/bash")
|
||||||
|
|
||||||
|
|
||||||
;; Whenever you reconfigure a package, make sure to wrap your config in an
|
;; Whenever you reconfigure a package, make sure to wrap your config in an
|
||||||
;; `after!' block, otherwise Doom's defaults may override your settings. E.g.
|
;; `after!' block, otherwise Doom's defaults may override your settings. E.g.
|
||||||
|
|||||||
@@ -47,9 +47,10 @@
|
|||||||
|
|
||||||
browser.zen.enable = true;
|
browser.zen.enable = true;
|
||||||
|
|
||||||
#window-manager.hypr.enable = true;
|
bar = {
|
||||||
|
waybar.enable = false;
|
||||||
bar.waybar.enable = true;
|
noctalia.enable = true;
|
||||||
|
};
|
||||||
|
|
||||||
launcher.wofi.enable = true;
|
launcher.wofi.enable = true;
|
||||||
|
|
||||||
@@ -151,6 +152,7 @@
|
|||||||
wl-clipboard
|
wl-clipboard
|
||||||
#cloudflared
|
#cloudflared
|
||||||
kdePackages.okular #pdf tool
|
kdePackages.okular #pdf tool
|
||||||
|
kdePackages.gwenview # image viewer
|
||||||
#nextcloud-client
|
#nextcloud-client
|
||||||
|
|
||||||
#music
|
#music
|
||||||
|
|||||||
+3
-1
@@ -1,4 +1,4 @@
|
|||||||
{ config, lib, pkgs, ... }:
|
{ ... }:
|
||||||
|
|
||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
@@ -15,5 +15,7 @@
|
|||||||
./gitlab
|
./gitlab
|
||||||
./jenkins
|
./jenkins
|
||||||
./gaming
|
./gaming
|
||||||
|
./yubikey
|
||||||
|
./scripts
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
username,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.dov.development.android;
|
||||||
|
|
||||||
|
mtk-udev-rules = pkgs.writeTextFile {
|
||||||
|
name = "mtk-udev-rules";
|
||||||
|
destination = "/etc/udev/rules.d/60-mtk.rules";
|
||||||
|
text = ''
|
||||||
|
# MediaTek BROM (0003), Preloader VCOM (2000/2001), META (6000)
|
||||||
|
SUBSYSTEM=="usb", ATTR{idVendor}=="0e8d", MODE="0666", TAG+="uaccess"
|
||||||
|
# Oppo/Realme fastboot + adb
|
||||||
|
SUBSYSTEM=="usb", ATTR{idVendor}=="22d9", MODE="0666", TAG+="uaccess"
|
||||||
|
|
||||||
|
# keep ModemManager's hands off the preloader port
|
||||||
|
SUBSYSTEM=="usb", ATTR{idVendor}=="0e8d", ENV{ID_MM_DEVICE_IGNORE}="1"
|
||||||
|
SUBSYSTEM=="tty", ATTRS{idVendor}=="0e8d", ENV{ID_MM_DEVICE_IGNORE}="1"
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.dov.development.android = {
|
||||||
|
enable = lib.mkEnableOption "Android and MediaTek flashing tools";
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
android-tools
|
||||||
|
mtkclient
|
||||||
|
usbutils
|
||||||
|
];
|
||||||
|
|
||||||
|
users.users.${username}.extraGroups = [ "dialout" ];
|
||||||
|
|
||||||
|
services.udev.packages = [ mtk-udev-rules ];
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -4,5 +4,7 @@
|
|||||||
imports = [
|
imports = [
|
||||||
./nix-vscode-server
|
./nix-vscode-server
|
||||||
./emacs
|
./emacs
|
||||||
|
./qoder
|
||||||
|
./android
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ in {
|
|||||||
## Emacs itself
|
## Emacs itself
|
||||||
binutils # native-comp needs 'as', provided by this
|
binutils # native-comp needs 'as', provided by this
|
||||||
# 28.2 + native-comp
|
# 28.2 + native-comp
|
||||||
((emacsPackagesFor emacs30).emacsWithPackages (epkgs: [
|
((emacsPackagesFor emacs).emacsWithPackages (epkgs: [
|
||||||
epkgs.vterm
|
epkgs.vterm
|
||||||
epkgs.treesit-grammars.with-all-grammars
|
epkgs.treesit-grammars.with-all-grammars
|
||||||
epkgs.mu4e
|
epkgs.mu4e
|
||||||
|
|||||||
@@ -0,0 +1,92 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
with lib;
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.dov.development.qoder;
|
||||||
|
qoder = pkgs.callPackage ./package.nix {
|
||||||
|
inherit (cfg)
|
||||||
|
version
|
||||||
|
url
|
||||||
|
hash
|
||||||
|
extraFlags
|
||||||
|
;
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.dov.development.qoder = {
|
||||||
|
enable = mkEnableOption "Qoder IDE (unfree, repackaged from the upstream .deb)";
|
||||||
|
|
||||||
|
version = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "1.19.2";
|
||||||
|
description = ''
|
||||||
|
Label only — upstream publishes a rolling "latest" URL, so this is
|
||||||
|
just what the store path is called. Bump it together with `hash`.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
url = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "https://download.qoder.com/release/latest/qoder_amd64.deb";
|
||||||
|
description = "Upstream .deb to repackage.";
|
||||||
|
};
|
||||||
|
|
||||||
|
hash = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "";
|
||||||
|
example = "sha256-0000000000000000000000000000000000000000000=";
|
||||||
|
description = ''
|
||||||
|
SRI hash of the .deb. Refresh whenever upstream ships a new build:
|
||||||
|
nix store prefetch-file --json <url> | jq -r .hash
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
extraFlags = mkOption {
|
||||||
|
type = types.listOf types.str;
|
||||||
|
default = [ ];
|
||||||
|
example = [ "--disable-gpu-sandbox" ];
|
||||||
|
description = "Extra Electron/Chromium flags appended to the wrapper.";
|
||||||
|
};
|
||||||
|
|
||||||
|
keyring = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = true;
|
||||||
|
description = ''
|
||||||
|
Enable gnome-keyring. Qoder is wrapped with
|
||||||
|
--password-store=gnome-libsecret; without a running secret service
|
||||||
|
the sign-in token is lost on every restart.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf cfg.enable (mkMerge [
|
||||||
|
{
|
||||||
|
assertions = [
|
||||||
|
{
|
||||||
|
assertion = cfg.hash != "";
|
||||||
|
message = ''
|
||||||
|
dov.development.qoder.hash is empty. Prefetch the .deb first:
|
||||||
|
nix store prefetch-file --json ${cfg.url} | jq -r .hash
|
||||||
|
'';
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
environment.systemPackages = [ qoder ];
|
||||||
|
}
|
||||||
|
|
||||||
|
(mkIf cfg.keyring {
|
||||||
|
services.gnome.gnome-keyring.enable = true;
|
||||||
|
|
||||||
|
# gnome-keyring enables gcr-ssh-agent by default, which asserts against
|
||||||
|
# programs.ssh.startAgent from dov.yubikey. We only want the secret
|
||||||
|
# service here — SSH keys stay with the OpenSSH agent.
|
||||||
|
services.gnome.gcr-ssh-agent.enable = false;
|
||||||
|
})
|
||||||
|
]);
|
||||||
|
}
|
||||||
@@ -0,0 +1,204 @@
|
|||||||
|
{
|
||||||
|
lib,
|
||||||
|
stdenv,
|
||||||
|
fetchurl,
|
||||||
|
autoPatchelfHook,
|
||||||
|
makeWrapper,
|
||||||
|
wrapGAppsHook3,
|
||||||
|
zstd,
|
||||||
|
|
||||||
|
alsa-lib,
|
||||||
|
at-spi2-atk,
|
||||||
|
at-spi2-core,
|
||||||
|
atk,
|
||||||
|
cairo,
|
||||||
|
cups,
|
||||||
|
dbus,
|
||||||
|
expat,
|
||||||
|
fontconfig,
|
||||||
|
freetype,
|
||||||
|
gdk-pixbuf,
|
||||||
|
glib,
|
||||||
|
gtk3,
|
||||||
|
krb5,
|
||||||
|
libdrm,
|
||||||
|
libgbm,
|
||||||
|
libglvnd,
|
||||||
|
libnotify,
|
||||||
|
libsecret,
|
||||||
|
libuuid,
|
||||||
|
libxkbcommon,
|
||||||
|
nspr,
|
||||||
|
nss,
|
||||||
|
pango,
|
||||||
|
systemd,
|
||||||
|
zlib,
|
||||||
|
|
||||||
|
libx11,
|
||||||
|
libxcb,
|
||||||
|
libxcomposite,
|
||||||
|
libxcursor,
|
||||||
|
libxdamage,
|
||||||
|
libxext,
|
||||||
|
libxfixes,
|
||||||
|
libxi,
|
||||||
|
libxkbfile,
|
||||||
|
libxrandr,
|
||||||
|
libxrender,
|
||||||
|
libxscrnsaver,
|
||||||
|
libxshmfence,
|
||||||
|
libxtst,
|
||||||
|
|
||||||
|
version,
|
||||||
|
url,
|
||||||
|
hash,
|
||||||
|
passwordStore ? "gnome-libsecret",
|
||||||
|
extraFlags ? [ ],
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
runtimeLibs = [
|
||||||
|
alsa-lib
|
||||||
|
at-spi2-atk
|
||||||
|
at-spi2-core
|
||||||
|
atk
|
||||||
|
cairo
|
||||||
|
cups
|
||||||
|
dbus
|
||||||
|
expat
|
||||||
|
fontconfig
|
||||||
|
freetype
|
||||||
|
gdk-pixbuf
|
||||||
|
glib
|
||||||
|
gtk3
|
||||||
|
krb5
|
||||||
|
libdrm
|
||||||
|
libgbm
|
||||||
|
libglvnd
|
||||||
|
libnotify
|
||||||
|
libsecret
|
||||||
|
libuuid
|
||||||
|
libxkbcommon
|
||||||
|
nspr
|
||||||
|
nss
|
||||||
|
pango
|
||||||
|
zlib
|
||||||
|
(lib.getLib systemd)
|
||||||
|
|
||||||
|
libx11
|
||||||
|
libxcb
|
||||||
|
libxcomposite
|
||||||
|
libxcursor
|
||||||
|
libxdamage
|
||||||
|
libxext
|
||||||
|
libxfixes
|
||||||
|
libxi
|
||||||
|
libxkbfile
|
||||||
|
libxrandr
|
||||||
|
libxrender
|
||||||
|
libxscrnsaver
|
||||||
|
libxshmfence
|
||||||
|
libxtst
|
||||||
|
];
|
||||||
|
in
|
||||||
|
stdenv.mkDerivation (finalAttrs: {
|
||||||
|
pname = "qoder";
|
||||||
|
inherit version;
|
||||||
|
|
||||||
|
src = fetchurl {
|
||||||
|
inherit url hash;
|
||||||
|
name = "qoder-${version}_amd64.deb";
|
||||||
|
};
|
||||||
|
|
||||||
|
nativeBuildInputs = [
|
||||||
|
autoPatchelfHook
|
||||||
|
makeWrapper
|
||||||
|
wrapGAppsHook3
|
||||||
|
zstd
|
||||||
|
];
|
||||||
|
|
||||||
|
buildInputs = runtimeLibs;
|
||||||
|
|
||||||
|
# dlopen'ed at runtime, so autoPatchelf can't see them in the ELF headers
|
||||||
|
runtimeDependencies = [
|
||||||
|
(lib.getLib systemd)
|
||||||
|
libglvnd
|
||||||
|
libgbm
|
||||||
|
];
|
||||||
|
|
||||||
|
dontConfigure = true;
|
||||||
|
dontBuild = true;
|
||||||
|
dontWrapGApps = true; # wrapped by hand in preFixup
|
||||||
|
|
||||||
|
# `ar` comes from stdenv. --no-same-permissions keeps the setuid bit on
|
||||||
|
# chrome-sandbox from blowing up the build inside the nix sandbox.
|
||||||
|
unpackPhase = ''
|
||||||
|
runHook preUnpack
|
||||||
|
ar x $src
|
||||||
|
tar -xf data.tar.* --no-same-permissions --no-same-owner
|
||||||
|
runHook postUnpack
|
||||||
|
'';
|
||||||
|
|
||||||
|
installPhase = ''
|
||||||
|
runHook preInstall
|
||||||
|
mkdir -p $out/share/qoder $out/bin
|
||||||
|
|
||||||
|
if [ -d usr/share/qoder ]; then
|
||||||
|
cp -r usr/share/qoder/. $out/share/qoder/
|
||||||
|
elif [ -d opt/Qoder ]; then
|
||||||
|
cp -r opt/Qoder/. $out/share/qoder/
|
||||||
|
elif [ -d opt/qoder ]; then
|
||||||
|
cp -r opt/qoder/. $out/share/qoder/
|
||||||
|
else
|
||||||
|
echo "unexpected .deb layout:" >&2
|
||||||
|
find . -maxdepth 3 -type d >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
for d in applications icons pixmaps; do
|
||||||
|
if [ -d "usr/share/$d" ]; then
|
||||||
|
mkdir -p "$out/share/$d"
|
||||||
|
cp -r "usr/share/$d/." "$out/share/$d/"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Store paths can never be setuid — drop the helper, use --no-sandbox.
|
||||||
|
rm -f $out/share/qoder/chrome-sandbox
|
||||||
|
|
||||||
|
if [ ! -x $out/share/qoder/qoder ]; then
|
||||||
|
echo "main binary not where expected:" >&2
|
||||||
|
ls $out/share/qoder >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
for f in $out/share/applications/*.desktop; do
|
||||||
|
[ -e "$f" ] || continue
|
||||||
|
substituteInPlace "$f" \
|
||||||
|
--replace-quiet "/usr/share/qoder/qoder" "$out/bin/qoder" \
|
||||||
|
--replace-quiet "/opt/Qoder/qoder" "$out/bin/qoder" \
|
||||||
|
--replace-quiet "/opt/qoder/qoder" "$out/bin/qoder"
|
||||||
|
done
|
||||||
|
|
||||||
|
runHook postInstall
|
||||||
|
'';
|
||||||
|
|
||||||
|
# preFixup, not installPhase: gappsWrapperArgs is only populated by then.
|
||||||
|
preFixup = ''
|
||||||
|
makeWrapper $out/share/qoder/qoder $out/bin/qoder \
|
||||||
|
"''${gappsWrapperArgs[@]}" \
|
||||||
|
--prefix LD_LIBRARY_PATH : "${lib.makeLibraryPath runtimeLibs}" \
|
||||||
|
--set-default NIXOS_OZONE_WL 1 \
|
||||||
|
--add-flags "--no-sandbox" \
|
||||||
|
--add-flags "--password-store=${passwordStore}" \
|
||||||
|
${lib.optionalString (extraFlags != [ ]) ''--add-flags "${lib.escapeShellArgs extraFlags}"''}
|
||||||
|
'';
|
||||||
|
|
||||||
|
meta = {
|
||||||
|
description = "Qoder — agentic coding IDE, repackaged from the upstream .deb";
|
||||||
|
homepage = "https://qoder.com";
|
||||||
|
license = lib.licenses.unfree;
|
||||||
|
sourceProvenance = [ lib.sourceTypes.binaryNativeCode ];
|
||||||
|
platforms = [ "x86_64-linux" ];
|
||||||
|
mainProgram = "qoder";
|
||||||
|
};
|
||||||
|
})
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
username,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
{
|
||||||
|
environment.systemPackages = [
|
||||||
|
(pkgs.writeShellScriptBin "pve-build" ''
|
||||||
|
export PATH="${
|
||||||
|
lib.makeBinPath [
|
||||||
|
pkgs.jq
|
||||||
|
pkgs.openssh
|
||||||
|
]
|
||||||
|
}:$PATH"
|
||||||
|
${builtins.readFile ./pve-build.sh}
|
||||||
|
'')
|
||||||
|
];
|
||||||
|
|
||||||
|
home-manager.users.${username} = {
|
||||||
|
programs.nushell.extraConfig =
|
||||||
|
lib.mkIf config.home-manager.users.${username}.programs.nushell.enable
|
||||||
|
''
|
||||||
|
def "nu-complete pve-build-cmds" [] {
|
||||||
|
[build test switch boot check-image deploy-image update-image start-builder build-on activate destroy-builder info]
|
||||||
|
}
|
||||||
|
|
||||||
|
def "nu-complete pve-build-activate" [] {
|
||||||
|
[test switch boot]
|
||||||
|
}
|
||||||
|
|
||||||
|
extern pve-build [
|
||||||
|
command?: string@"nu-complete pve-build-cmds"
|
||||||
|
--machine: string
|
||||||
|
--pve-host: string
|
||||||
|
--pve-storage: string
|
||||||
|
--rootfs-storage: string
|
||||||
|
--bridge: string
|
||||||
|
--vmid-start: int
|
||||||
|
--vmid-floor: int
|
||||||
|
--rootfs-gib: int
|
||||||
|
--keep
|
||||||
|
--local-build
|
||||||
|
--show-trace
|
||||||
|
--verbose
|
||||||
|
--debug
|
||||||
|
--help(-h)
|
||||||
|
]
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
||||||
Executable
+1103
File diff suppressed because it is too large
Load Diff
@@ -243,6 +243,9 @@ in {
|
|||||||
hl.exec_cmd("waybar")
|
hl.exec_cmd("waybar")
|
||||||
hl.exec_cmd("mako")
|
hl.exec_cmd("mako")
|
||||||
''
|
''
|
||||||
|
+ lib.optionalString hm-cfg.bar.noctalia.enable ''
|
||||||
|
hl.exec_cmd("noctalia")
|
||||||
|
''
|
||||||
+ ''
|
+ ''
|
||||||
end)
|
end)
|
||||||
'';
|
'';
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ listener {
|
|||||||
|
|
||||||
listener {
|
listener {
|
||||||
timeout = 300 # 5min
|
timeout = 300 # 5min
|
||||||
on-timeout = loginctl lock-session # lock screen when timeout has passed
|
on-timeout = hyprlock # lock screen when timeout has passed
|
||||||
}
|
}
|
||||||
|
|
||||||
# listener {
|
# listener {
|
||||||
|
|||||||
@@ -0,0 +1,100 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
with lib;
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.dov.yubikey;
|
||||||
|
in {
|
||||||
|
options.dov.yubikey = {
|
||||||
|
enable = mkEnableOption "YubiKey integration (PAM U2F + SSH agent)";
|
||||||
|
|
||||||
|
pamControl = mkOption {
|
||||||
|
type = types.enum [ "sufficient" "required" ];
|
||||||
|
default = "sufficient";
|
||||||
|
description = ''
|
||||||
|
PAM control flag for U2F authentication.
|
||||||
|
- "sufficient": touch YubiKey OR type password (default).
|
||||||
|
Can't lock yourself out — if the key is missing or not
|
||||||
|
enrolled, the normal password prompt follows.
|
||||||
|
- "required": touch YubiKey AND type password (true 2FA).
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
pamServices = mkOption {
|
||||||
|
type = types.listOf types.str;
|
||||||
|
default = [ "login" "sudo" ];
|
||||||
|
description = ''
|
||||||
|
PAM services to enable U2F for. Scoped per-service rather
|
||||||
|
than globally so that e.g. sshd is not affected.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
authFile = mkOption {
|
||||||
|
type = types.nullOr types.path;
|
||||||
|
default = null;
|
||||||
|
description = ''
|
||||||
|
Central U2F authfile path. When null, uses the default
|
||||||
|
per-user location (~/.config/Yubico/u2f_keys). Set to a
|
||||||
|
nix-store path for a central, non-user-writable mapping.
|
||||||
|
|
||||||
|
Generate mappings with:
|
||||||
|
pamu2fcfg -u <username>
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf cfg.enable (mkMerge [
|
||||||
|
{
|
||||||
|
# --- Shared infrastructure: smart card daemon + device access ---
|
||||||
|
# hardware.gpgSmartcards installs the CCID udev rules that give
|
||||||
|
# pcscd permission to open the YubiKey's smart-card USB interface.
|
||||||
|
hardware.gpgSmartcards.enable = true;
|
||||||
|
services.pcscd.enable = true;
|
||||||
|
services.udev.packages = with pkgs; [
|
||||||
|
yubikey-personalization
|
||||||
|
libfido2
|
||||||
|
];
|
||||||
|
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
yubikey-manager # `ykman` CLI
|
||||||
|
pam_u2f # `pamu2fcfg` for key enrollment
|
||||||
|
libfido2 # `fido2-token` management
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
# --- PAM U2F: touch YubiKey for login / sudo ---
|
||||||
|
{
|
||||||
|
security.pam.u2f = {
|
||||||
|
enable = true;
|
||||||
|
control = cfg.pamControl;
|
||||||
|
settings = {
|
||||||
|
cue = true; # "Please touch the device."
|
||||||
|
interactive = true; # "Insert your U2F device, then press ENTER."
|
||||||
|
nouserok = true; # fall through to password if key not enrolled yet
|
||||||
|
} // optionalAttrs (cfg.authFile != null) {
|
||||||
|
inherit (cfg) authFile;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# Enable U2F per-service, not globally (avoids enabling for sshd).
|
||||||
|
security.pam.services = genAttrs cfg.pamServices (_: {
|
||||||
|
u2fAuth = true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
# --- SSH agent for FIDO2 (-sk) keys ---
|
||||||
|
# yubikey-agent is incompatible with YubiKey firmware 5.7.x (PIV
|
||||||
|
# management key auth changed). GPG agent's SSH emulation doesn't
|
||||||
|
# reliably handle -sk keys. Use the standard OpenSSH agent instead,
|
||||||
|
# which is the same software stack that created the key.
|
||||||
|
{
|
||||||
|
programs.gnupg.agent.enableSSHSupport = mkForce false;
|
||||||
|
programs.ssh.startAgent = true;
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user