Compare commits
297 Commits
stylix
...
1731647367
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1731647367 | ||
|
|
9ad06425c8 | ||
| 525cc60739 | |||
|
|
3595428e02 | ||
| 4ed90347f8 | |||
| b92dda099b | |||
|
|
f61dbc7190 | ||
| a48fc8fffe | |||
|
|
4d107533ea | ||
|
|
2c3cc8ed18 | ||
|
|
334d69894e | ||
|
|
31a9957877 | ||
|
|
dc25f02010 | ||
|
|
ef8e52b93f | ||
|
|
bf48d8fcf0 | ||
|
|
a68c91264f | ||
|
|
75d7097e23 | ||
|
|
b738f38267 | ||
|
|
32b0e67a7a | ||
|
|
f352ef1c05 | ||
|
|
1ea8c8b6a9 | ||
|
|
eac9c4b67d | ||
|
|
ce4047b62f | ||
|
|
aff6fa9ec6 | ||
|
|
a9c1d71495 | ||
|
|
4d4808490b | ||
|
|
1f99318fcd | ||
|
|
87fb1c96e5 | ||
|
|
aa7fc9c228 | ||
|
|
f856076452 | ||
|
|
d9d7760e58 | ||
|
|
bd8d1e6485 | ||
|
|
8fa82bce90 | ||
|
|
187b478c5d | ||
|
|
25ef179d3a | ||
|
|
57d1a8d864 | ||
|
|
c83cfcf06b | ||
|
|
59268d1da3 | ||
|
|
bca4a13614 | ||
|
|
044bac7464 | ||
|
|
10fa5498ee | ||
|
|
1331e69b58 | ||
|
|
9c8733431d | ||
|
|
ad15679eb4 | ||
|
|
01ae622391 | ||
|
|
defbd725dd | ||
|
|
d2c1cbf987 | ||
|
|
14db694b90 | ||
|
|
10fc7820e1 | ||
|
|
176d0b7311 | ||
|
|
1fc2ce66cf | ||
|
|
f93d69a259 | ||
|
|
d7afac2fb9 | ||
|
|
3aa0407532 | ||
|
|
c29ff231f9 | ||
| c5481909a1 | |||
|
|
8b4489cf8f | ||
|
|
d1d68e154d | ||
|
|
3ff7bed41d | ||
|
|
19acd60ed7 | ||
|
|
6cfb31fdc9 | ||
|
|
e5dbeadbb6 | ||
|
|
302d7f5af5 | ||
|
|
148229f551 | ||
|
|
5a22ad0f88 | ||
|
|
5b96b59e60 | ||
|
|
bfd5e90613 | ||
|
|
fdaa34191c | ||
|
|
fde852b29b | ||
|
|
d4e0b93e4e | ||
|
|
1410f0fe25 | ||
|
|
5fed9a649f | ||
|
|
9b87aa9d3e | ||
|
|
e7a6fdb644 | ||
|
|
871f099dac | ||
|
|
a07f694806 | ||
|
|
45f40e45d8 | ||
|
|
7c7c1dc3f4 | ||
|
|
bd44913ccc | ||
|
|
a5b53e66e7 | ||
|
|
5d9613ee13 | ||
|
|
3dea6e0a9e | ||
|
|
9ab1c99914 | ||
|
|
62ff7b829a | ||
|
|
477b79bfb8 | ||
|
|
e2e2d814fe | ||
|
|
94c3d6d6ff | ||
|
|
a336b0cf60 | ||
|
|
a94e68514a | ||
|
|
fb68d25008 | ||
|
|
2b9908e760 | ||
|
|
7cc4e8c99e | ||
|
|
fbdbbdf328 | ||
|
|
d4799b6598 | ||
|
|
6a9ec8f933 | ||
|
|
fa236b7076 | ||
|
|
05bd3f1a60 | ||
|
|
a3ade57500 | ||
|
|
e40181ba04 | ||
|
|
cedd4051f7 | ||
|
|
5a992567b8 | ||
|
|
631bdd3c2c | ||
|
|
a968cb4b4f | ||
|
|
d76fdcbab6 | ||
|
|
e2dfca0245 | ||
|
|
59500f3e50 | ||
|
|
a74305a444 | ||
|
|
e39614a9c8 | ||
|
|
b5de056631 | ||
|
|
49680a9188 | ||
|
|
c3865f2742 | ||
|
|
341d522fd4 | ||
|
|
51f4b335b1 | ||
|
|
77dc15e0e1 | ||
|
|
a0c2753f37 | ||
|
|
7320b0ee87 | ||
|
|
10268e7677 | ||
|
|
f57617e268 | ||
|
|
b613f941a6 | ||
|
|
b3138d0fca | ||
|
|
9376005a21 | ||
|
|
549580395f | ||
|
|
3f5634317b | ||
|
|
26746873f3 | ||
|
|
a58a9da64e | ||
|
|
8e7a0343c2 | ||
|
|
d47b092a8c | ||
|
|
4de54dee30 | ||
|
|
455ea26cdc | ||
|
|
7306b08762 | ||
|
|
59b4729636 | ||
|
|
afe04b88b0 | ||
|
|
b1215da790 | ||
|
|
b1f2521260 | ||
|
|
57add82f95 | ||
|
|
49485c91a6 | ||
|
|
a7c25fe70d | ||
|
|
1dc075f405 | ||
|
|
2a17112d50 | ||
|
|
a59d5ce3b1 | ||
|
|
639ce36cb0 | ||
|
|
42e771ef1f | ||
|
|
37d472c7db | ||
|
|
382f059188 | ||
|
|
dfd8d9a1a8 | ||
|
|
fcddde0c06 | ||
|
|
ad16b47827 | ||
|
|
994fddba66 | ||
|
|
0483ea8a67 | ||
|
|
b6e5223d96 | ||
|
|
ed7656cf3e | ||
|
|
76b6255169 | ||
|
|
5f5972f10f | ||
|
|
82dffdf505 | ||
|
|
741ab5c7ec | ||
|
|
3d0d5c878c | ||
|
|
0bb71bbb4f | ||
|
|
741de00ef7 | ||
|
|
c7c5192c0c | ||
|
|
052f7a2838 | ||
|
|
ca17f0fe18 | ||
|
|
e76f74e63a | ||
|
|
88e81c9aaa | ||
|
|
8406714527 | ||
|
|
97e4060b52 | ||
|
|
59121cf43b | ||
|
|
e15d62d03a | ||
|
|
3268c28cc8 | ||
|
|
e4ac3b99cd | ||
|
|
dabd791fac | ||
|
|
98c627531c | ||
|
|
c8f41cf7d8 | ||
|
|
78f8d1a733 | ||
|
|
b05067a3e1 | ||
|
|
3b780d4d78 | ||
|
|
77c76e6483 | ||
|
|
cd03862e4b | ||
|
|
e6a69cc21f | ||
|
|
c6317cdd18 | ||
|
|
ca73743483 | ||
|
|
105ed3bcb8 | ||
|
|
4a6a68dad4 | ||
|
|
56154fe941 | ||
|
|
b7380317b9 | ||
|
|
579c83164e | ||
|
|
56fb195967 | ||
|
|
451f5aa726 | ||
|
|
5c359dca81 | ||
|
|
6b28a8df9c | ||
|
|
dfc2c8faa4 | ||
|
|
0f42ffeebd | ||
|
|
1d5b1cf5e0 | ||
|
|
8fc40f265b | ||
|
|
cdf388cf17 | ||
|
|
8088ea0933 | ||
|
|
9305483e09 | ||
|
|
687a3a6446 | ||
|
|
1e5ef59d56 | ||
|
|
a7389ac9b2 | ||
|
|
501329def1 | ||
|
|
3063d6b161 | ||
|
|
c4ea874ae7 | ||
|
|
68dbe98370 | ||
|
|
374bd4348f | ||
|
|
5ee4da5b08 | ||
|
|
bf31786735 | ||
|
|
b216fe5215 | ||
|
|
b36ae0914c | ||
|
|
edd6291176 | ||
|
|
b91afbc323 | ||
|
|
450dc1ad91 | ||
|
|
eed1d28bd8 | ||
|
|
ae8bcdf690 | ||
|
|
4ac6de479c | ||
|
|
14990b28e4 | ||
|
|
ede0bf5c10 | ||
|
|
ae95786d8e | ||
|
|
209e776640 | ||
|
|
82e062a7e8 | ||
|
|
67fb7d7323 | ||
|
|
462494277a | ||
|
|
8fbf8c54eb | ||
|
|
f549723a61 | ||
|
|
c8aebb9e4a | ||
|
|
afb60fc031 | ||
|
|
4604e24ee5 | ||
|
|
3233955690 | ||
|
|
c9f75a053c | ||
|
|
f7cb1cb217 | ||
|
|
d981fb20c2 | ||
|
|
8f08f24761 | ||
|
|
74e772582d | ||
|
|
15f186e3ce | ||
|
|
7d92e9b1cc | ||
|
|
53a2d01a83 | ||
|
|
abdeddf751 | ||
|
|
1280cf9939 | ||
|
|
76265f9b1b | ||
|
|
66fe87dd23 | ||
|
|
e8fcf96253 | ||
|
|
479ac18f20 | ||
|
|
ba446f408a | ||
|
|
05486efb75 | ||
|
|
e0b1e72431 | ||
|
|
63bd725d64 | ||
|
|
96ce0001c5 | ||
|
|
50345adeb5 | ||
|
|
e74ea5f13b | ||
|
|
367c3a16c5 | ||
|
|
4c784f5f33 | ||
|
|
fa0210e937 | ||
|
|
f803c37105 | ||
|
|
03b00c59b2 | ||
|
|
5c9a42fe71 | ||
|
|
3b95a97921 | ||
|
|
2d03954a9f | ||
|
|
3dc1055b54 | ||
|
|
fedba849a7 | ||
|
|
34539045e5 | ||
|
|
0012a019fc | ||
|
|
f09246dcba | ||
|
|
90daf80a88 | ||
|
|
3c85ea0515 | ||
|
|
06e26e3be2 | ||
|
|
d76eff6f68 | ||
|
|
ce39a330b1 | ||
|
|
41063a1ef7 | ||
|
|
35206c8ed5 | ||
|
|
201ba0b780 | ||
|
|
a273c701ab | ||
|
|
2e4b629805 | ||
|
|
3364ae8fda | ||
|
|
15e0b9563f | ||
|
|
64f34892b7 | ||
|
|
8d1a9312cb | ||
|
|
31202f8b0e | ||
|
|
82ecfba7db | ||
|
|
f86808d86e | ||
|
|
89c5d60be3 | ||
|
|
96c3a34449 | ||
|
|
a5eba8ec68 | ||
|
|
764ce12aea | ||
|
|
989e717e4e | ||
|
|
4b53a89030 | ||
|
|
70a54b208e | ||
|
|
0b4d63fd09 | ||
|
|
f54285bfe6 | ||
|
|
a94f5c20aa | ||
|
|
adf1cc7ca6 | ||
|
|
d32826dc36 | ||
|
|
3c1c5b6292 | ||
|
|
73a11e1ac8 | ||
|
|
88e29f74de | ||
|
|
59702e15cf | ||
|
|
6c8d306d38 | ||
| f172707b15 | |||
|
|
672221f471 |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -10,4 +10,5 @@ shell.nix
|
|||||||
.envrc
|
.envrc
|
||||||
.DS_Store
|
.DS_Store
|
||||||
*.qcow2
|
*.qcow2
|
||||||
keys
|
keys
|
||||||
|
iso-*
|
||||||
12
.sops.yaml
12
.sops.yaml
@@ -11,10 +11,12 @@ keys:
|
|||||||
- &pi5 age1t2d5scrukk0guva5sr97a8tge5j8kd865adezrcru7p269pzwvpsamkgje
|
- &pi5 age1t2d5scrukk0guva5sr97a8tge5j8kd865adezrcru7p269pzwvpsamkgje
|
||||||
- &deck age1c8qw59ffcq9l77gfmtyc3djtvt3md0u6dwhrjcgsm98ntyf72ufqugj7cg
|
- &deck age1c8qw59ffcq9l77gfmtyc3djtvt3md0u6dwhrjcgsm98ntyf72ufqugj7cg
|
||||||
- &steamdeck age1er5qucsc2mugrzrr7n3xhzv7kemkrqrw4m84r544fkk7nkg5g5eswxkqj0
|
- &steamdeck age1er5qucsc2mugrzrr7n3xhzv7kemkrqrw4m84r544fkk7nkg5g5eswxkqj0
|
||||||
- &matt_macbook-pro age19daqsncuzeh3j6cwk8uxp6yfj8h0qtz02jxlwwy4v8j0mfgznsvq30440g
|
- &matt_macbook-pro age12gu9hqhd56yl5x3t5yenkn9yg57du08h77vzjqsmnu5hdppne38qcur5a0
|
||||||
- &macbook-pro age19w4zafpwnq9yhzuf8r5te2yhq7xlqj76rcgzcz935hllyrz4yvws4jn6ca
|
- &macbook-pro age1t7378n8kmd3f32fkye2gw3jj6qswv3exjdx0dq8kl0xra3tmcdnsvddq3u
|
||||||
- &nuc age102el4snus37dj807rwvsmlvwu2sg2d8rw3vfmtntgczfkz04l9nshetcq0
|
- &nuc age102el4snus37dj807rwvsmlvwu2sg2d8rw3vfmtntgczfkz04l9nshetcq0
|
||||||
- &admin_nuc age102el4snus37dj807rwvsmlvwu2sg2d8rw3vfmtntgczfkz04l9nshetcq0
|
- &admin_nuc age1yn82e39pxt0d0pgny34ux4lkge4ff7wxvsye8ragvwngehemt4ps27phyw
|
||||||
|
- &matt_allyx age1n5frpwgvps7c2348ynu9g7g47kqar4srdplw5kkcyn4x80eqzetqw3ej2m
|
||||||
|
- &allyx age1lvks0rdf743cn9rvvx90mzu3mjldydlzslpmv9608wn4j0m8u3xsmu7yew
|
||||||
creation_rules:
|
creation_rules:
|
||||||
- path_regex: secrets/[^/]+\.(yaml|json|env|ini)$
|
- path_regex: secrets/[^/]+\.(yaml|json|env|ini)$
|
||||||
key_groups:
|
key_groups:
|
||||||
@@ -35,6 +37,8 @@ creation_rules:
|
|||||||
- *macbook-pro
|
- *macbook-pro
|
||||||
- *admin_nuc
|
- *admin_nuc
|
||||||
- *nuc
|
- *nuc
|
||||||
|
- *matt_allyx
|
||||||
|
- *allyx
|
||||||
- path_regex: nas-secrets/[^/]+\.(yaml|json|env|ini)$
|
- path_regex: nas-secrets/[^/]+\.(yaml|json|env|ini)$
|
||||||
key_groups:
|
key_groups:
|
||||||
- pgp:
|
- pgp:
|
||||||
@@ -64,6 +68,8 @@ creation_rules:
|
|||||||
- *steamdeck
|
- *steamdeck
|
||||||
- *admin
|
- *admin
|
||||||
- *jallen-nas
|
- *jallen-nas
|
||||||
|
- *matt_allyx
|
||||||
|
- *allyx
|
||||||
- path_regex: pi4-secrets/[^/]+\.(yaml|json|env|ini)$
|
- path_regex: pi4-secrets/[^/]+\.(yaml|json|env|ini)$
|
||||||
key_groups:
|
key_groups:
|
||||||
- pgp:
|
- pgp:
|
||||||
|
|||||||
73
checks/disksnstuff.sh
Normal file → Executable file
73
checks/disksnstuff.sh
Normal file → Executable file
@@ -1,15 +1,62 @@
|
|||||||
mount -t tmpfs -o mode=755 none /mnt
|
#!/usr/bin/env bash
|
||||||
mkdir -p /mnt/{boot,home,root,etc,nix,var/log}
|
|
||||||
mount /dev/sdb1 /mnt/boot
|
|
||||||
mount /dev/sdb3 -o compress=zstd,subvol=home /mnt/home
|
|
||||||
mount /dev/sdb3 -o compress=zstd,noatime,subvol=root /mnt/root
|
|
||||||
mount /dev/sdb3 -o compress=zstd,noatime,subvol=etc /mnt/etc
|
|
||||||
mount /dev/sdb3 -o compress=zstd,noatime,subvol=nix /mnt/nix
|
|
||||||
mount /dev/sdb3 -o compress=zstd,noatime,subvol=log /mnt/var/log
|
|
||||||
|
|
||||||
wpa_passphrase "Joey's Jungle 5G" "kR8v&3Qd" > 5g.conf
|
disk=/dev/mapper/nuc-nixos-cryptroot
|
||||||
wpa_supplicant -i wlp6s0 -c 5g.conf -B
|
|
||||||
dhcpcd
|
|
||||||
|
|
||||||
keyctl link @u @s
|
# sudo mkfs.vfat "$disk"1
|
||||||
clevis decrypt < "/etc/clevis/nas_pool.jwe" | bcachefs unlock /dev/disk/by-label/nas_pool
|
# sudo bcachefs format --label ssd.ssd1 --compression=zstd --discard "$disk"
|
||||||
|
|
||||||
|
sudo mount -t tmpfs -o mode=755 none /mnt
|
||||||
|
sudo mkdir -p /mnt/{boot,home,root,etc,nix,var/log,tmp,persist}
|
||||||
|
sudo mount /dev/disk/by-partlabel/disk-main-nuc-nixos-EFI /mnt/boot
|
||||||
|
# sudo mkdir -p /mnt/boot/firmware
|
||||||
|
# sudo mount "$disk"2 /mnt/boot/firmware
|
||||||
|
# sudo mount "$disk"2 -o compress=zstd,subvol=home /mnt/home
|
||||||
|
# sudo mount "$disk"2 -o compress=zstd,noatime,subvol=root /mnt/root
|
||||||
|
# sudo mount "$disk"2 -o compress=zstd,noatime,subvol=etc /mnt/etc
|
||||||
|
# sudo mount "$disk"2 -o compress=zstd,noatime,subvol=nix /mnt/nix
|
||||||
|
# sudo mount "$disk"2 -o compress=zstd,noatime,subvol=log /mnt/var/log
|
||||||
|
|
||||||
|
# bcachefs unlock -k session /dev/disk/by-partlabel/disk-main-nuc-nixos-bcachefs-root
|
||||||
|
sudo cryptsetup open /dev/disk/by-partlabel/disk-main-nuc-nixos-cryptroot nuc-nixos-cryptroot
|
||||||
|
# sudo bcachefs unlock -k session "$disk"2
|
||||||
|
# sudo mount "$disk" /mnt/tmp
|
||||||
|
# cd /mnt/tmp
|
||||||
|
# ls -alh
|
||||||
|
|
||||||
|
# sudo bcachefs subvolume create nix
|
||||||
|
# sudo bcachefs subvolume create etc
|
||||||
|
# sudo bcachefs subvolume create log
|
||||||
|
# sudo bcachefs subvolume create root
|
||||||
|
# sudo bcachefs subvolume create persist
|
||||||
|
# sudo bcachefs subvolume create home
|
||||||
|
|
||||||
|
# ls -alh
|
||||||
|
# cd /etc/nixos
|
||||||
|
# sudo umount /mnt/tmp
|
||||||
|
|
||||||
|
sudo mount -o noatime,X-mount.subdir=nix "$disk" /mnt/nix
|
||||||
|
sudo mount -o noatime,X-mount.subdir=etc "$disk" /mnt/etc
|
||||||
|
sudo mount -o noatime,X-mount.subdir=log "$disk" /mnt/var/log
|
||||||
|
sudo mount -o noatime,X-mount.subdir=root "$disk" /mnt/root
|
||||||
|
sudo mount -o noatime,X-mount.subdir=persist "$disk" /mnt/persist
|
||||||
|
sudo mount -o X-mount.subdir=home "$disk" /mnt/home
|
||||||
|
|
||||||
|
# tree /mnt
|
||||||
|
|
||||||
|
# sudo nixos-install --flake /etc/nixos#nuc-nixos
|
||||||
|
|
||||||
|
# sudo umount /mnt/boot
|
||||||
|
# sudo umount /mnt/var/log
|
||||||
|
# sudo umount /mnt/persist
|
||||||
|
# sudo umount /mnt/home
|
||||||
|
# sudo umount /mnt/root
|
||||||
|
# sudo umount /mnt/etc
|
||||||
|
# sudo umount /mnt/nix
|
||||||
|
# sudo umount /mnt
|
||||||
|
|
||||||
|
# wpa_passphrase "Joey's Jungle 5G" "kR8v&3Qd" > 5g.conf
|
||||||
|
# wpa_supplicant -i wlp6s0 -c 5g.conf -B
|
||||||
|
# dhcpcd
|
||||||
|
|
||||||
|
# keyctl link @u @s
|
||||||
|
# clevis decrypt < "/etc/clevis/nas_pool.jwe" | bcachefs unlock /dev/disk/by-label/nas_pool
|
||||||
|
|||||||
208
docs/version.schema.json
Normal file
208
docs/version.schema.json
Normal file
@@ -0,0 +1,208 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||||
|
"$id": "https://example.invalid/version.schema.json",
|
||||||
|
"title": "Unified Package Version Schema",
|
||||||
|
"description": "Schema for a unified version.json used by packages/",
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": [
|
||||||
|
"schemaVersion",
|
||||||
|
"sources"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"schemaVersion": {
|
||||||
|
"type": "integer",
|
||||||
|
"enum": [1],
|
||||||
|
"description": "Schema version. Start at 1; bump on breaking changes."
|
||||||
|
},
|
||||||
|
"variables": {
|
||||||
|
"type": "object",
|
||||||
|
"description": "Common variables available for template substitution in string fields.",
|
||||||
|
"additionalProperties": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"defaultVariant": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Optional default variant name for consumers."
|
||||||
|
},
|
||||||
|
"sources": {
|
||||||
|
"type": "object",
|
||||||
|
"description": "Base component sources keyed by component name.",
|
||||||
|
"minProperties": 1,
|
||||||
|
"additionalProperties": {
|
||||||
|
"$ref": "#/$defs/SourceSpec"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"variants": {
|
||||||
|
"type": "object",
|
||||||
|
"description": "Optional variants/channels/flavors; each overlays the base.",
|
||||||
|
"additionalProperties": {
|
||||||
|
"$ref": "#/$defs/VariantSpec"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notes": {
|
||||||
|
"type": "object",
|
||||||
|
"description": "Optional free-form human notes/documentation.",
|
||||||
|
"additionalProperties": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"$defs": {
|
||||||
|
"SourceSpecBase": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"fetcher": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": ["github", "git", "url", "pypi", "none"],
|
||||||
|
"description": "Fetcher type for this source."
|
||||||
|
},
|
||||||
|
"hash": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^sha[0-9]+-",
|
||||||
|
"description": "SRI hash for the fetched artifact. Required unless fetcher is 'none'."
|
||||||
|
},
|
||||||
|
"version": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Optional version string metadata for this component."
|
||||||
|
},
|
||||||
|
"extra": {
|
||||||
|
"type": "object",
|
||||||
|
"description": "Optional free-form metadata for consumer logic.",
|
||||||
|
"additionalProperties": true
|
||||||
|
},
|
||||||
|
|
||||||
|
"owner": { "type": "string", "description": "GitHub owner/org (github fetcher)." },
|
||||||
|
"repo": { "type": "string", "description": "GitHub repository (github fetcher)." },
|
||||||
|
"tag": { "type": "string", "description": "Git tag (github fetcher). Mutually exclusive with 'rev'." },
|
||||||
|
"rev": { "type": "string", "description": "Commit revision (github/git fetchers)." },
|
||||||
|
"submodules": { "type": "boolean", "description": "Whether to fetch submodules (github/git fetchers)." },
|
||||||
|
|
||||||
|
"url": { "type": "string", "description": "Final URL (url fetcher). May be templated." },
|
||||||
|
"urlTemplate": { "type": "string", "description": "Template for URL (url fetcher); supports ${var}." },
|
||||||
|
|
||||||
|
"name": { "type": "string", "description": "PyPI dist name (pypi fetcher)." }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"SourceSpec": {
|
||||||
|
"allOf": [
|
||||||
|
{ "$ref": "#/$defs/SourceSpecBase" },
|
||||||
|
{
|
||||||
|
"if": {
|
||||||
|
"properties": { "fetcher": { "const": "github" } },
|
||||||
|
"required": ["fetcher"]
|
||||||
|
},
|
||||||
|
"then": {
|
||||||
|
"required": ["owner", "repo"],
|
||||||
|
"oneOf": [
|
||||||
|
{ "required": ["tag"] },
|
||||||
|
{ "required": ["rev"] }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"if": {
|
||||||
|
"properties": { "fetcher": { "const": "git" } },
|
||||||
|
"required": ["fetcher"]
|
||||||
|
},
|
||||||
|
"then": {
|
||||||
|
"required": ["url", "rev"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"if": {
|
||||||
|
"properties": { "fetcher": { "const": "url" } },
|
||||||
|
"required": ["fetcher"]
|
||||||
|
},
|
||||||
|
"then": {
|
||||||
|
"oneOf": [
|
||||||
|
{ "required": ["url"] },
|
||||||
|
{ "required": ["urlTemplate"] }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"if": {
|
||||||
|
"properties": { "fetcher": { "const": "pypi" } },
|
||||||
|
"required": ["fetcher"]
|
||||||
|
},
|
||||||
|
"then": {
|
||||||
|
"required": ["name", "version"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"if": {
|
||||||
|
"properties": { "fetcher": { "enum": ["github", "git", "url", "pypi"] } },
|
||||||
|
"required": ["fetcher"]
|
||||||
|
},
|
||||||
|
"then": {
|
||||||
|
"required": ["hash"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
|
"SourceOverride": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"description": "Partial override of a source within a variant. All fields optional.",
|
||||||
|
"properties": {
|
||||||
|
"fetcher": { "type": "string", "enum": ["github", "git", "url", "pypi", "none"] },
|
||||||
|
"hash": { "type": "string", "pattern": "^sha[0-9]+-" },
|
||||||
|
"version": { "type": "string" },
|
||||||
|
"extra": { "type": "object", "additionalProperties": true },
|
||||||
|
|
||||||
|
"owner": { "type": "string" },
|
||||||
|
"repo": { "type": "string" },
|
||||||
|
"tag": { "type": "string" },
|
||||||
|
"rev": { "type": "string" },
|
||||||
|
"submodules": { "type": "boolean" },
|
||||||
|
|
||||||
|
"url": { "type": "string" },
|
||||||
|
"urlTemplate": { "type": "string" },
|
||||||
|
|
||||||
|
"name": { "type": "string" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"VariantSpec": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"inherits": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Optional base variant to inherit from."
|
||||||
|
},
|
||||||
|
"variables": {
|
||||||
|
"type": "object",
|
||||||
|
"description": "Variant-level variables that overlay top-level variables.",
|
||||||
|
"additionalProperties": { "type": "string" }
|
||||||
|
},
|
||||||
|
"sources": {
|
||||||
|
"type": "object",
|
||||||
|
"description": "Per-component overrides for this variant.",
|
||||||
|
"additionalProperties": { "$ref": "#/$defs/SourceOverride" }
|
||||||
|
},
|
||||||
|
"platforms": {
|
||||||
|
"type": "object",
|
||||||
|
"description": "Optional per-system overrides to support differing hashes/fields by platform.",
|
||||||
|
"additionalProperties": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"sources": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": { "$ref": "#/$defs/SourceOverride" }
|
||||||
|
},
|
||||||
|
"variables": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": { "type": "string" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
1
echo
1
echo
@@ -1 +0,0 @@
|
|||||||
{"text": "\ue312 49\u00b0F", "tooltip": " Overcast 49\u00b0\n<span foreground=\"#585858\" font-weight=\"bold\"> .--. </span>Feels like: 49\u00b0\n<span foreground=\"#585858\" font-weight=\"bold\"> .-( ). </span>Wind: 2mph \u2199\n<span foreground=\"#585858\" font-weight=\"bold\"> (___.__)__) </span>Humidity: 80%\n Moon phase: Waxing Crescent \ud83c\udf12\n\nToday, <b>Mon Nov 24 2025</b>\n\uf2c7 53\u00b0F \uf2ca 38\u00b0F\ue34c 07:23 AM \ue34d 04:36 PM\n03 PM \udb81\udd95 52\u00b0 Partly Cloudy , Overcast 33%, Sunshine 73%\n06 PM \ue313 44\u00b0 Mist, Overcast 83%, Sunshine 8%\n09 PM \ue313 43\u00b0 Fog, Overcast 93%, Sunshine 5%\nTomorrow, <b>Tue Nov 25 2025</b>\n\uf2c7 43\u00b0F \uf2ca 34\u00b0F\ue34c 07:24 AM \ue34d 04:36 PM\n12 AM \ue313 43\u00b0 Fog, Fog 6%, Overcast 81%, Sunshine 19%\n03 AM \ue313 42\u00b0 Fog, Overcast 89%, Sunshine 8%\n06 AM \ue313 41\u00b0 Fog, Fog 6%, Overcast 92%, Sunshine 11%\n09 AM \ue313 40\u00b0 Fog, Fog 6%, Overcast 88%, Sunshine 5%\n12 PM \ue317 39\u00b0 Moderate rain at times, Overcast 90%, Rain 100%\n03 PM \ue308 34\u00b0 Light rain, Overcast 93%, Rain 100%\n06 PM \ue318 31\u00b0 Moderate rain, Overcast 88%, Rain 100%\n09 PM \ue31a 24\u00b0 Moderate snow, Overcast 89%, Rain 100%, Snow 100%\n<b>Wed Nov 26 2025</b>\n\uf2c7 36\u00b0F \uf2ca 25\u00b0F\ue34c 07:26 AM \ue34d 04:35 PM\n12 AM \ue312 21\u00b0 Overcast , Overcast 87%, Sunshine 8%\n03 AM \ue312 14\u00b0 Overcast , Frost 25%, Overcast 94%, Sunshine 13%\n06 AM \ue312 11\u00b0 Overcast , Frost 80%, Overcast 89%, Sunshine 8%\n09 AM \ue312 13\u00b0 Overcast , Frost 79%, Overcast 80%, Sunshine 5%\n12 PM \ue33d 18\u00b0 Cloudy , Frost 77%, Overcast 89%, Sunshine 17%\n03 PM \ue30d 24\u00b0 Sunny, Frost 29%, Sunshine 90%\n06 PM \udb81\udd94 22\u00b0 Clear , Frost 78%, Sunshine 94%\n09 PM \udb83\udf31 15\u00b0 Partly Cloudy , Frost 85%, Overcast 39%, Sunshine 83%\n"}
|
|
||||||
1174
flake.lock
generated
1174
flake.lock
generated
File diff suppressed because it is too large
Load Diff
120
flake.nix
120
flake.nix
@@ -1,25 +1,38 @@
|
|||||||
{
|
{
|
||||||
inputs = {
|
inputs = rec {
|
||||||
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
nixpkgs-unstable.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||||||
nixpkgs-stable.url = "github:NixOS/nixpkgs/nixos-25.11";
|
nixpkgs-stable.url = "github:NixOS/nixpkgs/nixos-25.11";
|
||||||
|
|
||||||
|
nixpkgs-otbr.url = "github:mrene/nixpkgs/openthread-border-router";
|
||||||
|
|
||||||
|
home-manager-stable = {
|
||||||
|
url = "github:nix-community/home-manager/release-25.11";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs-stable";
|
||||||
|
};
|
||||||
|
|
||||||
|
home-manager-unstable = {
|
||||||
|
url = "github:nix-community/home-manager";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs-unstable";
|
||||||
|
};
|
||||||
|
|
||||||
|
nixpkgs = nixpkgs-unstable;
|
||||||
|
home-manager = home-manager-unstable;
|
||||||
|
|
||||||
# The name "snowfall-lib" is required due to how Snowfall Lib processes your
|
# The name "snowfall-lib" is required due to how Snowfall Lib processes your
|
||||||
# flake's inputs.
|
# flake's inputs.
|
||||||
snowfall-lib = {
|
snowfall-lib = {
|
||||||
url = "github:mjallen18/lib";
|
url = "github:mjallen18/snowfall-lib";
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
};
|
};
|
||||||
|
|
||||||
chaotic.url = "github:chaotic-cx/nyx/nyxpkgs-unstable";
|
# nixos-generators = {
|
||||||
|
# url = "github:nix-community/nixos-generators";
|
||||||
home-manager = {
|
# inputs.nixpkgs.follows = "nixpkgs";
|
||||||
url = "github:nix-community/home-manager";
|
# };
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
|
||||||
};
|
|
||||||
|
|
||||||
impermanence.url = "github:nix-community/impermanence";
|
impermanence.url = "github:nix-community/impermanence";
|
||||||
|
|
||||||
lanzaboote.url = "github:nix-community/lanzaboote/v0.4.3";
|
lanzaboote.url = "github:nix-community/lanzaboote/v1.0.0";
|
||||||
|
|
||||||
nixos-hardware.url = "github:NixOS/nixos-hardware/master";
|
nixos-hardware.url = "github:NixOS/nixos-hardware/master";
|
||||||
|
|
||||||
@@ -35,7 +48,10 @@
|
|||||||
|
|
||||||
nix-vscode-extensions.url = "github:nix-community/nix-vscode-extensions";
|
nix-vscode-extensions.url = "github:nix-community/nix-vscode-extensions";
|
||||||
|
|
||||||
authentik-nix.url = "github:nix-community/authentik-nix";
|
authentik-nix = {
|
||||||
|
url = "github:nix-community/authentik-nix";
|
||||||
|
# inputs.nixpkgs.follows = "nixpkgs-stable";
|
||||||
|
};
|
||||||
|
|
||||||
nixai.url = "github:olafkfreund/nix-ai-help";
|
nixai.url = "github:olafkfreund/nix-ai-help";
|
||||||
|
|
||||||
@@ -46,11 +62,7 @@
|
|||||||
inputs.nixpkgs.follows = "nixpkgs";
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
};
|
};
|
||||||
|
|
||||||
nixos-raspberrypi.url = "github:mjallen18/nixos-raspberrypi";
|
darwin.url = "github:nix-darwin/nix-darwin/master";
|
||||||
|
|
||||||
jovian.url = "github:Jovian-Experiments/Jovian-NixOS";
|
|
||||||
|
|
||||||
darwin.url = "github:LnL7/nix-darwin";
|
|
||||||
|
|
||||||
nix-homebrew.url = "github:zhaofengli/nix-homebrew";
|
nix-homebrew.url = "github:zhaofengli/nix-homebrew";
|
||||||
|
|
||||||
@@ -66,7 +78,10 @@
|
|||||||
|
|
||||||
nixos-apple-silicon.url = "github:nix-community/nixos-apple-silicon";
|
nixos-apple-silicon.url = "github:nix-community/nixos-apple-silicon";
|
||||||
|
|
||||||
pre-commit-hooks-nix.url = "github:cachix/pre-commit-hooks.nix";
|
pre-commit-hooks-nix = {
|
||||||
|
url = "github:cachix/pre-commit-hooks.nix";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
};
|
||||||
|
|
||||||
treefmt-nix = {
|
treefmt-nix = {
|
||||||
url = "github:numtide/treefmt-nix";
|
url = "github:numtide/treefmt-nix";
|
||||||
@@ -91,6 +106,21 @@
|
|||||||
url = "github:cpick/nix-rosetta-builder";
|
url = "github:cpick/nix-rosetta-builder";
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
stylix = {
|
||||||
|
url = "github:nix-community/stylix";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
};
|
||||||
|
|
||||||
|
end4-dotfiles = {
|
||||||
|
url = "git+https://github.com/end-4/dots-hyprland?submodules=1";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
illogical-flake = {
|
||||||
|
url = "github:soymou/illogical-flake";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
inputs.dotfiles.follows = "end4-dotfiles";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
# We will handle this in the next section.
|
# We will handle this in the next section.
|
||||||
@@ -110,13 +140,18 @@
|
|||||||
# common modules
|
# common modules
|
||||||
modules.nixos = with inputs; [
|
modules.nixos = with inputs; [
|
||||||
authentik-nix.nixosModules.default
|
authentik-nix.nixosModules.default
|
||||||
chaotic.nixosModules.default
|
|
||||||
disko.nixosModules.disko
|
disko.nixosModules.disko
|
||||||
impermanence.nixosModules.impermanence
|
impermanence.nixosModules.impermanence
|
||||||
lanzaboote.nixosModules.lanzaboote
|
lanzaboote.nixosModules.lanzaboote
|
||||||
sops-nix.nixosModules.sops
|
sops-nix.nixosModules.sops
|
||||||
home-manager.nixosModules.home-manager
|
home-manager.nixosModules.home-manager
|
||||||
nix-index-database.nixosModules.nix-index
|
nix-index-database.nixosModules.nix-index
|
||||||
|
stylix.nixosModules.stylix
|
||||||
|
];
|
||||||
|
|
||||||
|
modules.home = with inputs; [
|
||||||
|
nix-index-database.homeManagerModules.nix-index
|
||||||
|
illogical-flake.homeManagerModules.default
|
||||||
];
|
];
|
||||||
|
|
||||||
# common darwin modules
|
# common darwin modules
|
||||||
@@ -126,6 +161,7 @@
|
|||||||
nix-plist-manager.darwinModules.default
|
nix-plist-manager.darwinModules.default
|
||||||
nix-rosetta-builder.darwinModules.default
|
nix-rosetta-builder.darwinModules.default
|
||||||
nix-index-database.darwinModules.nix-index
|
nix-index-database.darwinModules.nix-index
|
||||||
|
stylix.darwinModules.stylix
|
||||||
];
|
];
|
||||||
|
|
||||||
# Host config
|
# Host config
|
||||||
@@ -137,7 +173,7 @@
|
|||||||
modules = with inputs; [
|
modules = with inputs; [
|
||||||
nixos-hardware.nixosModules.common-cpu-amd
|
nixos-hardware.nixosModules.common-cpu-amd
|
||||||
nixos-hardware.nixosModules.common-cpu-amd-pstate
|
nixos-hardware.nixosModules.common-cpu-amd-pstate
|
||||||
nixos-hardware.nixosModules.common-cpu-amd-zenpower
|
# nixos-hardware.nixosModules.common-cpu-amd-zenpower
|
||||||
nixos-hardware.nixosModules.common-gpu-amd
|
nixos-hardware.nixosModules.common-gpu-amd
|
||||||
nixos-hardware.nixosModules.common-hidpi
|
nixos-hardware.nixosModules.common-hidpi
|
||||||
nixos-hardware.nixosModules.common-pc
|
nixos-hardware.nixosModules.common-pc
|
||||||
@@ -153,29 +189,12 @@
|
|||||||
nixos-hardware.nixosModules.common-pc
|
nixos-hardware.nixosModules.common-pc
|
||||||
nixos-hardware.nixosModules.common-cpu-amd
|
nixos-hardware.nixosModules.common-cpu-amd
|
||||||
nixos-hardware.nixosModules.common-cpu-amd-pstate
|
nixos-hardware.nixosModules.common-cpu-amd-pstate
|
||||||
nixos-hardware.nixosModules.common-cpu-amd-zenpower
|
# nixos-hardware.nixosModules.common-cpu-amd-zenpower
|
||||||
nixos-hardware.nixosModules.common-hidpi
|
nixos-hardware.nixosModules.common-hidpi
|
||||||
home-manager.nixosModules.home-manager
|
home-manager.nixosModules.home-manager
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
# ######################################################
|
|
||||||
# Steamdeck #
|
|
||||||
# ######################################################
|
|
||||||
steamdeck = {
|
|
||||||
modules = with inputs; [
|
|
||||||
disko.nixosModules.disko
|
|
||||||
jovian.nixosModules.jovian
|
|
||||||
nixos-hardware.nixosModules.common-cpu-amd
|
|
||||||
nixos-hardware.nixosModules.common-cpu-amd-pstate
|
|
||||||
nixos-hardware.nixosModules.common-cpu-amd-zenpower
|
|
||||||
nixos-hardware.nixosModules.common-gpu-amd
|
|
||||||
nixos-hardware.nixosModules.common-hidpi
|
|
||||||
nixos-hardware.nixosModules.common-pc
|
|
||||||
lsfg-vk.nixosModules.default
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
# ######################################################
|
# ######################################################
|
||||||
# NUC #
|
# NUC #
|
||||||
# ######################################################
|
# ######################################################
|
||||||
@@ -184,7 +203,7 @@
|
|||||||
disko.nixosModules.disko
|
disko.nixosModules.disko
|
||||||
nixos-hardware.nixosModules.common-cpu-amd
|
nixos-hardware.nixosModules.common-cpu-amd
|
||||||
nixos-hardware.nixosModules.common-cpu-amd-pstate
|
nixos-hardware.nixosModules.common-cpu-amd-pstate
|
||||||
nixos-hardware.nixosModules.common-cpu-amd-zenpower
|
# nixos-hardware.nixosModules.common-cpu-amd-zenpower
|
||||||
nixos-hardware.nixosModules.common-gpu-amd
|
nixos-hardware.nixosModules.common-gpu-amd
|
||||||
nixos-hardware.nixosModules.common-hidpi
|
nixos-hardware.nixosModules.common-hidpi
|
||||||
nixos-hardware.nixosModules.common-pc
|
nixos-hardware.nixosModules.common-pc
|
||||||
@@ -195,17 +214,8 @@
|
|||||||
# Pi4 #
|
# Pi4 #
|
||||||
# ######################################################
|
# ######################################################
|
||||||
pi4 = {
|
pi4 = {
|
||||||
specialArgs = {
|
|
||||||
nixpkgs = inputs.nixpkgs-stable;
|
|
||||||
};
|
|
||||||
modules = with inputs; [
|
modules = with inputs; [
|
||||||
disko.nixosModules.disko
|
disko.nixosModules.disko
|
||||||
nixos-raspberrypi.nixosModules.raspberry-pi-4.base
|
|
||||||
nixos-raspberrypi.nixosModules.raspberry-pi-4.display-vc4
|
|
||||||
nixos-raspberrypi.nixosModules.nixpkgs-rpi
|
|
||||||
nixos-raspberrypi.nixosModules.trusted-nix-caches
|
|
||||||
nixos-raspberrypi.lib.inject-overlays
|
|
||||||
nixos-raspberrypi.lib.inject-overlays-global
|
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -213,19 +223,8 @@
|
|||||||
# Pi5 #
|
# Pi5 #
|
||||||
# ######################################################
|
# ######################################################
|
||||||
pi5 = {
|
pi5 = {
|
||||||
specialArgs = {
|
|
||||||
nixpkgs = inputs.nixpkgs-stable;
|
|
||||||
};
|
|
||||||
modules = with inputs; [
|
modules = with inputs; [
|
||||||
disko.nixosModules.disko
|
disko.nixosModules.disko
|
||||||
nixos-raspberrypi.nixosModules.raspberry-pi-5.base
|
|
||||||
nixos-raspberrypi.nixosModules.raspberry-pi-5.display-vc4
|
|
||||||
nixos-raspberrypi.nixosModules.raspberry-pi-5.bluetooth
|
|
||||||
nixos-raspberrypi.nixosModules.raspberry-pi-5.page-size-16k
|
|
||||||
nixos-raspberrypi.nixosModules.nixpkgs-rpi
|
|
||||||
nixos-raspberrypi.nixosModules.trusted-nix-caches
|
|
||||||
nixos-raspberrypi.lib.inject-overlays
|
|
||||||
nixos-raspberrypi.lib.inject-overlays-global
|
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -263,10 +262,11 @@
|
|||||||
|
|
||||||
channels-config = {
|
channels-config = {
|
||||||
allowUnfree = true;
|
allowUnfree = true;
|
||||||
|
allowUnsupportedSystem = true;
|
||||||
permittedInsecurePackages = [
|
permittedInsecurePackages = [
|
||||||
# ...
|
# ...
|
||||||
"libsoup-2.74.3"
|
# "libsoup-2.74.3"
|
||||||
"mbedtls-2.28.10"
|
# "mbedtls-2.28.10"
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,11 @@
|
|||||||
{
|
{
|
||||||
lib,
|
lib,
|
||||||
pkgs,
|
pkgs,
|
||||||
|
namespace,
|
||||||
...
|
...
|
||||||
}:
|
}:
|
||||||
let
|
let
|
||||||
|
inherit (lib.${namespace}) enabled disabled;
|
||||||
shellAliases = {
|
shellAliases = {
|
||||||
update-switch = "darwin-rebuild switch --flake ~/nix-config";
|
update-switch = "darwin-rebuild switch --flake ~/nix-config";
|
||||||
update-flake = "nix flake update ~/nix-config";
|
update-flake = "nix flake update ~/nix-config";
|
||||||
@@ -13,7 +15,7 @@ let
|
|||||||
age
|
age
|
||||||
cpufetch
|
cpufetch
|
||||||
deadnix
|
deadnix
|
||||||
nixfmt-rfc-style
|
nixfmt
|
||||||
nodePackages.nodejs
|
nodePackages.nodejs
|
||||||
uv
|
uv
|
||||||
sops
|
sops
|
||||||
@@ -39,226 +41,226 @@ in
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
programs.nix-plist-manager = {
|
# programs.nix-plist-manager = {
|
||||||
enable = true;
|
# enable = true;
|
||||||
options = {
|
# options = {
|
||||||
applications = {
|
# applications = {
|
||||||
finder = {
|
# finder = {
|
||||||
settings = {
|
# settings = {
|
||||||
general = {
|
# general = {
|
||||||
showTheseItemsOnTheDesktop = {
|
# showTheseItemsOnTheDesktop = {
|
||||||
hardDisks = false;
|
# hardDisks = false;
|
||||||
externalDisks = true;
|
# externalDisks = true;
|
||||||
cdsDvdsAndiPods = false;
|
# cdsDvdsAndiPods = false;
|
||||||
connectedServers = false;
|
# connectedServers = false;
|
||||||
};
|
# };
|
||||||
openFoldersInTabsInsteadOfNewWindows = true;
|
# openFoldersInTabsInsteadOfNewWindows = true;
|
||||||
};
|
# };
|
||||||
sidebar = {
|
# sidebar = {
|
||||||
recentTags = true;
|
# recentTags = true;
|
||||||
};
|
# };
|
||||||
advanced = {
|
# advanced = {
|
||||||
removeItemsFromTheTrashAfter30Days = true;
|
# removeItemsFromTheTrashAfter30Days = true;
|
||||||
showAllFilenameExtensions = true;
|
# showAllFilenameExtensions = true;
|
||||||
showWarningBeforeChangingAnExtension = true;
|
# showWarningBeforeChangingAnExtension = true;
|
||||||
showWarningBeforeRemovingFromiCloudDrive = true;
|
# showWarningBeforeRemovingFromiCloudDrive = true;
|
||||||
showWarningBeforeEmptyingTheTrash = true;
|
# showWarningBeforeEmptyingTheTrash = true;
|
||||||
keepFoldersOnTop = {
|
# keepFoldersOnTop = {
|
||||||
inWindowsWhenSortingByName = true;
|
# inWindowsWhenSortingByName = true;
|
||||||
onDesktop = true;
|
# onDesktop = true;
|
||||||
};
|
# };
|
||||||
whenPerformingASearch = "Search This Mac";
|
# whenPerformingASearch = "Search This Mac";
|
||||||
};
|
# };
|
||||||
};
|
# };
|
||||||
menuBar = {
|
# menuBar = {
|
||||||
view = {
|
# view = {
|
||||||
showTabBar = true;
|
# showTabBar = true;
|
||||||
showSidebar = true;
|
# showSidebar = true;
|
||||||
showPathBar = true;
|
# showPathBar = true;
|
||||||
showStatusBar = true;
|
# showStatusBar = true;
|
||||||
};
|
# };
|
||||||
};
|
# };
|
||||||
};
|
# };
|
||||||
systemSettings = {
|
# systemSettings = {
|
||||||
appearance = {
|
# appearance = {
|
||||||
appearance = "Dark";
|
# appearance = "Dark";
|
||||||
accentColor = "Multicolor";
|
# accentColor = "Multicolor";
|
||||||
# clickInTheScrollBarTo = "Jump to the next page";
|
# # clickInTheScrollBarTo = "Jump to the next page";
|
||||||
sidebarIconSize = "Medium";
|
# sidebarIconSize = "Medium";
|
||||||
showScrollBars = "When scrolling";
|
# showScrollBars = "When scrolling";
|
||||||
};
|
# };
|
||||||
controlCenter = {
|
# controlCenter = {
|
||||||
wifi = true;
|
# wifi = true;
|
||||||
bluetooth = true;
|
# bluetooth = true;
|
||||||
airdrop = true;
|
# airdrop = true;
|
||||||
stageManager = true;
|
# stageManager = true;
|
||||||
focusModes = "active";
|
# focusModes = "active";
|
||||||
screenMirroring = "active";
|
# screenMirroring = "active";
|
||||||
display = "never";
|
# display = "never";
|
||||||
sound = "always";
|
# sound = "always";
|
||||||
nowPlaying = "active";
|
# nowPlaying = "active";
|
||||||
accessibilityShortcuts = "unset";
|
# accessibilityShortcuts = "unset";
|
||||||
musicRecognition = {
|
# musicRecognition = {
|
||||||
showInMenuBar = false;
|
# showInMenuBar = false;
|
||||||
showInControlCenter = true;
|
# showInControlCenter = true;
|
||||||
};
|
# };
|
||||||
hearing = "unset";
|
# hearing = "unset";
|
||||||
fastUserSwitching = {
|
# fastUserSwitching = {
|
||||||
showInMenuBar = false;
|
# showInMenuBar = false;
|
||||||
showInControlCenter = true;
|
# showInControlCenter = true;
|
||||||
};
|
# };
|
||||||
keyboardBrightness = {
|
# keyboardBrightness = {
|
||||||
showInMenuBar = false;
|
# showInMenuBar = false;
|
||||||
showInControlCenter = true;
|
# showInControlCenter = true;
|
||||||
};
|
# };
|
||||||
battery = {
|
# battery = {
|
||||||
showInMenuBar = false;
|
# showInMenuBar = false;
|
||||||
showInControlCenter = false;
|
# showInControlCenter = false;
|
||||||
};
|
# };
|
||||||
batteryShowPercentage = true;
|
# batteryShowPercentage = true;
|
||||||
# menuBarOnly = {
|
# # menuBarOnly = {
|
||||||
# spotlight = false;
|
# # spotlight = false;
|
||||||
# siri = true;
|
# # siri = true;
|
||||||
# };
|
# # };
|
||||||
# automaticallyHideAndShowTheMenuBar = "In Full Screen Only";
|
# # automaticallyHideAndShowTheMenuBar = "In Full Screen Only";
|
||||||
};
|
# };
|
||||||
desktopAndDock = {
|
# desktopAndDock = {
|
||||||
desktopAndStageManager = {
|
# desktopAndStageManager = {
|
||||||
showItems = {
|
# showItems = {
|
||||||
onDesktop = true;
|
# onDesktop = true;
|
||||||
inStageManager = true;
|
# inStageManager = true;
|
||||||
};
|
# };
|
||||||
clickWallpaperToRevealDesktop = "Always";
|
# clickWallpaperToRevealDesktop = "Always";
|
||||||
stageManager = false;
|
# stageManager = false;
|
||||||
showRecentAppsInStageManager = true;
|
# showRecentAppsInStageManager = true;
|
||||||
showWindowsFromAnApplication = "All at Once";
|
# showWindowsFromAnApplication = "All at Once";
|
||||||
};
|
# };
|
||||||
dock = {
|
# dock = {
|
||||||
animateOpeningApplications = true;
|
# animateOpeningApplications = true;
|
||||||
automaticallyHideAndShowTheDock.enabled = false;
|
# automaticallyHideAndShowTheDock = enabled;
|
||||||
doubleClickAWindowsTitleBarTo = "Minimize";
|
# doubleClickAWindowsTitleBarTo = "Minimize";
|
||||||
magnification.enabled = false;
|
# magnification = disabled;
|
||||||
minimizeWindowsIntoApplicationIcon = true;
|
# minimizeWindowsIntoApplicationIcon = true;
|
||||||
minimizeWindowsUsing = "Genie Effect";
|
# minimizeWindowsUsing = "Genie Effect";
|
||||||
positionOnScreen = "Bottom";
|
# positionOnScreen = "Bottom";
|
||||||
showIndicatorsForOpenApplications = true;
|
# showIndicatorsForOpenApplications = true;
|
||||||
showSuggestedAndRecentAppsInDock = false;
|
# showSuggestedAndRecentAppsInDock = false;
|
||||||
size = 64; # 16 - 128
|
# size = 64; # 16 - 128
|
||||||
# persistentApps = [
|
# # persistentApps = [
|
||||||
# { app = "/Applications/Clock.app"; }
|
# # { app = "/Applications/Clock.app"; }
|
||||||
# { folder = "/Applications"; }
|
# # { folder = "/Applications"; }
|
||||||
# { app = "/Applications/Safari.app"; }
|
# # { app = "/Applications/Safari.app"; }
|
||||||
# { app = "/Applications/Firefox.app"; }
|
# # { app = "/Applications/Firefox.app"; }
|
||||||
# { app = "/Applications/Tabby.app"; }
|
# # { app = "/Applications/Tabby.app"; }
|
||||||
# { app = "/Applications/Termius.app"; }
|
# # { app = "/Applications/Termius.app"; }
|
||||||
# { app = "/Applications/Muic.app"; }
|
# # { app = "/Applications/Muic.app"; }
|
||||||
# { app = "/Applications/Vesktop.app"; }
|
# # { app = "/Applications/Vesktop.app"; }
|
||||||
# { app = "/Applications/Messages.app"; }
|
# # { app = "/Applications/Messages.app"; }
|
||||||
# { app = "/Applications/Calendar.app"; }
|
# # { app = "/Applications/Calendar.app"; }
|
||||||
# { app = "/Applications/Reminders.app"; }
|
# # { app = "/Applications/Reminders.app"; }
|
||||||
# { app = "/Applications/Notes.app"; }
|
# # { app = "/Applications/Notes.app"; }
|
||||||
# { app = "/Applications/Weather.app"; }
|
# # { app = "/Applications/Weather.app"; }
|
||||||
# { app = "/Applications/Maps.app"; }
|
# # { app = "/Applications/Maps.app"; }
|
||||||
# { app = "/Applications/App Store.app"; }
|
# # { app = "/Applications/App Store.app"; }
|
||||||
# { app = "/Applications/System Settings.app"; }
|
# # { app = "/Applications/System Settings.app"; }
|
||||||
# { app = "/Applications/ChatGPT.app"; }
|
# # { app = "/Applications/ChatGPT.app"; }
|
||||||
# { app = "/Applications/Nextcloud.app"; }
|
# # { app = "/Applications/Nextcloud.app"; }
|
||||||
# { app = "/Applications/VSCodium.app"; }
|
# # { app = "/Applications/VSCodium.app"; }
|
||||||
# { app = "/Applications/Omnissa Horizon Client.app"; }
|
# # { app = "/Applications/Omnissa Horizon Client.app"; }
|
||||||
# { app = "/Applications/Proton Pass.app"; }
|
# # { app = "/Applications/Proton Pass.app"; }
|
||||||
# { app = "/Applications/OrcaSlicer.app"; }
|
# # { app = "/Applications/OrcaSlicer.app"; }
|
||||||
# { app = "/Applications/AlDente.app"; }
|
# # { app = "/Applications/AlDente.app"; }
|
||||||
# ];
|
# # ];
|
||||||
# persistentOthers = [
|
# # persistentOthers = [
|
||||||
# "~/Downloads"
|
# # "~/Downloads"
|
||||||
# ];
|
# # ];
|
||||||
};
|
# };
|
||||||
hotCorners = {
|
# hotCorners = {
|
||||||
# ["-" "Mission Control" "Application Windows" "Desktop" "Start Screen Saver" "Disable Screen Saver" "Dashboard" "Put Display to Sleep" "Launchpad" "Notification Center" "Lock Screen" "Quick Note"]
|
# # ["-" "Mission Control" "Application Windows" "Desktop" "Start Screen Saver" "Disable Screen Saver" "Dashboard" "Put Display to Sleep" "Launchpad" "Notification Center" "Lock Screen" "Quick Note"]
|
||||||
topLeft = "-";
|
# topLeft = "-";
|
||||||
topRight = "-";
|
# topRight = "-";
|
||||||
bottomLeft = "-";
|
# bottomLeft = "-";
|
||||||
bottomRight = "-";
|
# bottomRight = "-";
|
||||||
};
|
# };
|
||||||
missionControl = {
|
# missionControl = {
|
||||||
automaticallyRearrangeSpacesBasedOnMostRecentUse = true;
|
# automaticallyRearrangeSpacesBasedOnMostRecentUse = true;
|
||||||
displaysHaveSeparateSpaces = true;
|
# displaysHaveSeparateSpaces = true;
|
||||||
dragWindowsToTopOfScreenToEnterMissionControl = true;
|
# dragWindowsToTopOfScreenToEnterMissionControl = true;
|
||||||
groupWindowsByApplication = true;
|
# groupWindowsByApplication = true;
|
||||||
whenSwitchingToAnApplicationSwitchToAspaceWithOpenWindowsForTheApplication = true;
|
# whenSwitchingToAnApplicationSwitchToAspaceWithOpenWindowsForTheApplication = true;
|
||||||
};
|
# };
|
||||||
widgets = {
|
# widgets = {
|
||||||
showWidgets = {
|
# showWidgets = {
|
||||||
onDesktop = true;
|
# onDesktop = true;
|
||||||
inStageManager = true;
|
# inStageManager = true;
|
||||||
};
|
# };
|
||||||
widgetStyle = "Automatic";
|
# widgetStyle = "Automatic";
|
||||||
useIphoneWidgets = true;
|
# useIphoneWidgets = true;
|
||||||
};
|
# };
|
||||||
windows = {
|
# windows = {
|
||||||
askToKeepChangesWhenClosingDocuments = true;
|
# askToKeepChangesWhenClosingDocuments = true;
|
||||||
closeWindowsWhenQuittingAnApplication = true;
|
# closeWindowsWhenQuittingAnApplication = true;
|
||||||
dragWindowsToScreenEdgesToTile = true;
|
# dragWindowsToScreenEdgesToTile = true;
|
||||||
dragWindowsToMenuBarToFillScreen = true;
|
# dragWindowsToMenuBarToFillScreen = true;
|
||||||
holdOptionKeyWhileDraggingWindowsToTile = true;
|
# holdOptionKeyWhileDraggingWindowsToTile = true;
|
||||||
preferTabsWhenOpeningDocuments = "In Full Screen";
|
# preferTabsWhenOpeningDocuments = "In Full Screen";
|
||||||
tiledWindowsHaveMargin = false;
|
# tiledWindowsHaveMargin = false;
|
||||||
};
|
# };
|
||||||
};
|
# };
|
||||||
focus = {
|
# focus = {
|
||||||
shareAcrossDevices = true;
|
# shareAcrossDevices = true;
|
||||||
};
|
# };
|
||||||
# general.dateAndTime."24HourTime" = false;
|
# # general.dateAndTime."24HourTime" = false;
|
||||||
notifications = {
|
# notifications = {
|
||||||
notificationCenter = {
|
# notificationCenter = {
|
||||||
showPreviews = "When Unlocked";
|
# showPreviews = "When Unlocked";
|
||||||
summarizeNotifications = true;
|
# summarizeNotifications = true;
|
||||||
};
|
# };
|
||||||
};
|
# };
|
||||||
sound = {
|
# sound = {
|
||||||
soundEffects = {
|
# soundEffects = {
|
||||||
alertSound = "Boop";
|
# alertSound = "Boop";
|
||||||
alertVolume = 0.7;
|
# alertVolume = 0.7;
|
||||||
playFeedbackWhenVolumeIsChanged = true;
|
# playFeedbackWhenVolumeIsChanged = true;
|
||||||
playUserInterfaceSoundEffects = true;
|
# playUserInterfaceSoundEffects = true;
|
||||||
};
|
# };
|
||||||
};
|
# };
|
||||||
spotlight = {
|
# spotlight = {
|
||||||
helpAppleImproveSearch = false;
|
# helpAppleImproveSearch = false;
|
||||||
# searchResults = {
|
# # searchResults = {
|
||||||
# applications = true;
|
# # applications = true;
|
||||||
# calculator = true;
|
# # calculator = true;
|
||||||
# contacts = true;
|
# # contacts = true;
|
||||||
# conversion = true;
|
# # conversion = true;
|
||||||
# definition = true;
|
# # definition = true;
|
||||||
# developer = true;
|
# # developer = true;
|
||||||
# documents = true;
|
# # documents = true;
|
||||||
# eventsAndReminders = true;
|
# # eventsAndReminders = true;
|
||||||
# folders = true;
|
# # folders = true;
|
||||||
# fonts = false;
|
# # fonts = false;
|
||||||
# images = true;
|
# # images = true;
|
||||||
# mailAndMessages = true;
|
# # mailAndMessages = true;
|
||||||
# movies = true;
|
# # movies = true;
|
||||||
# music = true;
|
# # music = true;
|
||||||
# other = false;
|
# # other = false;
|
||||||
# pdfDocuments = true;
|
# # pdfDocuments = true;
|
||||||
# presentations = true;
|
# # presentations = true;
|
||||||
# siriSuggestions = false;
|
# # siriSuggestions = false;
|
||||||
# systemSettings = true;
|
# # systemSettings = true;
|
||||||
# tips = false;
|
# # tips = false;
|
||||||
# websites = true;
|
# # websites = true;
|
||||||
};
|
# };
|
||||||
};
|
# };
|
||||||
};
|
# };
|
||||||
};
|
# };
|
||||||
};
|
# };
|
||||||
|
|
||||||
# Manage bug in compilations - who uses manpages in 2024 anyways? :P
|
# Manage bug in compilations - who uses manpages in 2024 anyways? :P
|
||||||
manual.manpages.enable = false;
|
manual.manpages = enabled;
|
||||||
|
|
||||||
# Override defaults that arent supported
|
# Override defaults that arent supported
|
||||||
programs = {
|
programs = {
|
||||||
mangohud.enable = lib.mkForce false;
|
mangohud = lib.mkForce disabled;
|
||||||
|
|
||||||
nh = {
|
nh = {
|
||||||
flake = lib.mkForce "/Users/mattjallen/nix-config";
|
flake = lib.mkForce "/Users/mattjallen/nix-config";
|
||||||
@@ -266,8 +268,8 @@ in
|
|||||||
};
|
};
|
||||||
|
|
||||||
services = {
|
services = {
|
||||||
pass-secret-service.enable = lib.mkForce false;
|
pass-secret-service = lib.mkForce disabled;
|
||||||
nextcloud-client.enable = lib.mkForce false;
|
nextcloud-client = lib.mkForce disabled;
|
||||||
kdeconnect = {
|
kdeconnect = {
|
||||||
enable = false;
|
enable = false;
|
||||||
indicator = false;
|
indicator = false;
|
||||||
|
|||||||
@@ -1,19 +1,11 @@
|
|||||||
{
|
{
|
||||||
|
lib,
|
||||||
pkgs,
|
pkgs,
|
||||||
namespace,
|
namespace,
|
||||||
config,
|
|
||||||
...
|
...
|
||||||
}:
|
}:
|
||||||
let
|
let
|
||||||
theme = config.mjallen.theme.palette;
|
inherit (lib.${namespace}) enabled disabled;
|
||||||
shellAliases = {
|
|
||||||
update-boot = "sudo nixos-rebuild boot --max-jobs 10 --build-host admin@10.0.1.3";
|
|
||||||
update-switch = "sudo nixos-rebuild switch --max-jobs 10 --build-host admin@10.0.1.3";
|
|
||||||
update-flake = "nix flake update mac-nixpkgs mac-nixos-apple-silicon mac-home-manager mac-impermanence mac-sops-nix --flake /etc/nixos";
|
|
||||||
update-nas = "nixos-rebuild switch --use-remote-sudo --target-host admin@10.0.1.3 --build-host admin@10.0.1.3 --flake ~/nix-config#jallen-nas";
|
|
||||||
};
|
|
||||||
fontName = "JetBrainsMono NFM";
|
|
||||||
fontPackage = pkgs.nerd-fonts.jetbrains-mono;
|
|
||||||
# Displays
|
# Displays
|
||||||
display = {
|
display = {
|
||||||
input = "eDP-1";
|
input = "eDP-1";
|
||||||
@@ -28,8 +20,9 @@ in
|
|||||||
home.stateVersion = "23.11";
|
home.stateVersion = "23.11";
|
||||||
|
|
||||||
${namespace} = {
|
${namespace} = {
|
||||||
|
desktop.gnome = enabled;
|
||||||
programs.hyprland = {
|
programs.hyprland = {
|
||||||
enable = true;
|
enable = false;
|
||||||
primaryDisplay = "eDP-1";
|
primaryDisplay = "eDP-1";
|
||||||
debug.disableScaleChecks = true;
|
debug.disableScaleChecks = true;
|
||||||
|
|
||||||
@@ -59,7 +52,7 @@ in
|
|||||||
];
|
];
|
||||||
|
|
||||||
windowRule = [
|
windowRule = [
|
||||||
"size 2160 3356, tag:horizonrdp"
|
# "size 2160 3356, tag:horizonrdp"
|
||||||
];
|
];
|
||||||
|
|
||||||
hyprpaper = {
|
hyprpaper = {
|
||||||
@@ -69,42 +62,35 @@ in
|
|||||||
keybinds = {
|
keybinds = {
|
||||||
bind = [
|
bind = [
|
||||||
"$mod, A, exec, chromium --app=\"https://music.apple.com\""
|
"$mod, A, exec, chromium --app=\"https://music.apple.com\""
|
||||||
|
|
||||||
|
"SHIFT, XF86MonBrightnessUp, exec, lightctl -D kbd_backlight up"
|
||||||
|
"SHIFT, XF86MonBrightnessDown, exec, lightctl -D kbd_backlight down"
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
defaultApps = {
|
defaultApps = {
|
||||||
browser = pkgs.firefox;
|
browser = pkgs.firefox;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
extraConfig = ''
|
||||||
|
exec-once = brightnessctl -d kbd_backlight s 50%
|
||||||
|
'';
|
||||||
};
|
};
|
||||||
programs = {
|
programs = {
|
||||||
btop.enable = true;
|
btop = enabled;
|
||||||
kitty = {
|
kitty = disabled;
|
||||||
enable = true;
|
mako = disabled;
|
||||||
font = {
|
nwg-dock = disabled;
|
||||||
name = fontName;
|
nwg-drawer = disabled;
|
||||||
package = fontPackage;
|
nwg-panel = disabled;
|
||||||
};
|
|
||||||
};
|
|
||||||
mako = {
|
|
||||||
enable = true;
|
|
||||||
fontName = fontName;
|
|
||||||
};
|
|
||||||
nwg-dock.enable = true;
|
|
||||||
nwg-drawer.enable = true;
|
|
||||||
nwg-panel = {
|
|
||||||
enable = true;
|
|
||||||
defaultApps = {
|
|
||||||
browser = pkgs.firefox;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
waybar = {
|
waybar = {
|
||||||
enable = true;
|
enable = false;
|
||||||
|
|
||||||
layer = "bottom";
|
layer = "bottom";
|
||||||
|
|
||||||
temperature = {
|
temperature = {
|
||||||
cpu.enable = true;
|
cpu = enabled;
|
||||||
gpu.enable = true;
|
gpu = enabled;
|
||||||
};
|
};
|
||||||
|
|
||||||
extraModules = {
|
extraModules = {
|
||||||
@@ -120,37 +106,44 @@ in
|
|||||||
|
|
||||||
extraModulesStyle = ''
|
extraModulesStyle = ''
|
||||||
#custom-lights {
|
#custom-lights {
|
||||||
color: ${theme.frost.nord8};
|
color: @base0C;
|
||||||
background-color: ${theme.polarNight.nord0};
|
opacity: 0.85;
|
||||||
${theme.defaultOpacity}
|
background-color: @base00;
|
||||||
${theme.borderLeft}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#custom-lights:hover {
|
#custom-lights:hover {
|
||||||
background: ${theme.polarNight.nord3};
|
background: @base03;
|
||||||
}
|
}
|
||||||
'';
|
'';
|
||||||
|
|
||||||
windowOffset = 75;
|
windowOffset = 75;
|
||||||
};
|
};
|
||||||
wlogout.enable = true;
|
wlogout = disabled;
|
||||||
wofi.enable = true;
|
wofi = disabled;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
home.packages = with pkgs; [
|
home.packages =
|
||||||
pkgs.${namespace}.bolt-launcher
|
with pkgs.${namespace};
|
||||||
pkgs.${namespace}.librepods
|
[
|
||||||
|
# librepods
|
||||||
|
]
|
||||||
|
++ (with pkgs; [
|
||||||
|
bolt-launcher
|
||||||
|
iw
|
||||||
|
iwd
|
||||||
|
orca-slicer
|
||||||
|
vscodium
|
||||||
|
]);
|
||||||
|
|
||||||
iw
|
services = {
|
||||||
iwd
|
kdeconnect = {
|
||||||
orca-slicer
|
enable = lib.mkForce true;
|
||||||
vscodium
|
indicator = lib.mkForce true;
|
||||||
];
|
};
|
||||||
|
};
|
||||||
|
|
||||||
programs = {
|
programs = {
|
||||||
password-store.enable = true;
|
password-store = enabled;
|
||||||
|
|
||||||
zsh.shellAliases = shellAliases;
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,22 +1,10 @@
|
|||||||
{ lib, namespace, ... }:
|
{ lib, namespace, ... }:
|
||||||
|
let
|
||||||
|
inherit (lib.${namespace}) enabled disabled;
|
||||||
|
in
|
||||||
{
|
{
|
||||||
home.username = "matt";
|
home.username = "matt";
|
||||||
|
|
||||||
${namespace} = {
|
|
||||||
shell-aliases = {
|
|
||||||
enable = true;
|
|
||||||
flakeInputs = [
|
|
||||||
"pi4-nixpkgs"
|
|
||||||
"pi4-home-manager"
|
|
||||||
"pi4-impermanence"
|
|
||||||
"pi4-sops-nix"
|
|
||||||
"pi4-nixos-hardware"
|
|
||||||
"pi4-nixos-raspberrypi"
|
|
||||||
"pi4-disko"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
sops = {
|
sops = {
|
||||||
age.keyFile = "/home/matt/.config/sops/age/keys.txt";
|
age.keyFile = "/home/matt/.config/sops/age/keys.txt";
|
||||||
defaultSopsFile = "/etc/nixos/secrets/secrets.yaml";
|
defaultSopsFile = "/etc/nixos/secrets/secrets.yaml";
|
||||||
@@ -53,11 +41,11 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
programs = {
|
programs = {
|
||||||
mangohud.enable = lib.mkForce true;
|
mangohud = lib.mkForce enabled;
|
||||||
};
|
};
|
||||||
|
|
||||||
services = {
|
services = {
|
||||||
nextcloud-client.enable = lib.mkForce false;
|
nextcloud-client = lib.mkForce disabled;
|
||||||
kdeconnect = {
|
kdeconnect = {
|
||||||
enable = false;
|
enable = false;
|
||||||
indicator = false;
|
indicator = false;
|
||||||
|
|||||||
@@ -1,15 +1,11 @@
|
|||||||
{
|
{
|
||||||
config,
|
config,
|
||||||
|
lib,
|
||||||
|
namespace,
|
||||||
...
|
...
|
||||||
}:
|
}:
|
||||||
let
|
let
|
||||||
shellAliases = {
|
inherit (lib.${namespace}) disabled;
|
||||||
update-boot = "sudo nixos-rebuild boot --max-jobs 10 --build-host admin@10.0.1.3";
|
|
||||||
update-switch = "sudo nixos-rebuild switch --max-jobs 10 --build-host admin@10.0.1.3";
|
|
||||||
update-flake = "nix flake update pi5-nixpkgs pi5-home-manager pi5-impermanence pi5-nixos-hardware pi5-sops-nix nixos-raspberrypi --flake /etc/nixos";
|
|
||||||
update-nas = "nixos-rebuild switch --use-remote-sudo --target-host admin@10.0.1.3 --build-host admin@10.0.1.3 --flake ~/nix-config#jallen-nas";
|
|
||||||
nas-ssh = "kitten ssh admin@10.0.1.3";
|
|
||||||
};
|
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -54,12 +50,8 @@ in
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
programs = {
|
|
||||||
zsh.shellAliases = shellAliases;
|
|
||||||
};
|
|
||||||
|
|
||||||
services = {
|
services = {
|
||||||
nextcloud-client.enable = false;
|
nextcloud-client = lib.mkForce disabled;
|
||||||
kdeconnect = {
|
kdeconnect = {
|
||||||
enable = false;
|
enable = false;
|
||||||
indicator = false;
|
indicator = false;
|
||||||
|
|||||||
18
homes/aarch64-linux/root@macbook-pro-nixos/default.nix
Normal file
18
homes/aarch64-linux/root@macbook-pro-nixos/default.nix
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
lib,
|
||||||
|
namespace,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
inherit (lib.${namespace}) disabled;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
home.username = "root";
|
||||||
|
services = {
|
||||||
|
nextcloud-client = lib.mkForce disabled;
|
||||||
|
kdeconnect = {
|
||||||
|
enable = false;
|
||||||
|
indicator = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
18
homes/aarch64-linux/root@pi4/default.nix
Normal file
18
homes/aarch64-linux/root@pi4/default.nix
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
lib,
|
||||||
|
namespace,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
inherit (lib.${namespace}) disabled;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
home.username = "root";
|
||||||
|
services = {
|
||||||
|
nextcloud-client = lib.mkForce disabled;
|
||||||
|
kdeconnect = {
|
||||||
|
enable = false;
|
||||||
|
indicator = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
18
homes/aarch64-linux/root@pi5/default.nix
Normal file
18
homes/aarch64-linux/root@pi5/default.nix
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
lib,
|
||||||
|
namespace,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
inherit (lib.${namespace}) disabled;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
home.username = "root";
|
||||||
|
services = {
|
||||||
|
nextcloud-client = lib.mkForce disabled;
|
||||||
|
kdeconnect = {
|
||||||
|
enable = false;
|
||||||
|
indicator = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -1,22 +1,19 @@
|
|||||||
{ pkgs, namespace, ... }:
|
{ pkgs, namespace, ... }:
|
||||||
{
|
{
|
||||||
home.username = "admin";
|
home = {
|
||||||
|
username = "admin";
|
||||||
|
packages =
|
||||||
|
with pkgs;
|
||||||
|
[
|
||||||
|
heroic
|
||||||
|
]
|
||||||
|
++ (with pkgs.${namespace}; [
|
||||||
|
moondeck-buddy
|
||||||
|
]);
|
||||||
|
};
|
||||||
|
|
||||||
${namespace} = {
|
${namespace} = {
|
||||||
shell-aliases = {
|
sops.enable = true;
|
||||||
enable = true;
|
|
||||||
buildHost = ""; # NAS builds locally
|
|
||||||
flakeInputs = [
|
|
||||||
"nas-nixpkgs"
|
|
||||||
"nas-authentik-nix"
|
|
||||||
"nas-cosmic"
|
|
||||||
"nas-home-manager"
|
|
||||||
"nas-impermanence"
|
|
||||||
"nas-lanzaboote"
|
|
||||||
"nas-nixos-hardware"
|
|
||||||
"nas-sops-nix"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
sops = {
|
sops = {
|
||||||
@@ -68,6 +65,23 @@
|
|||||||
}
|
}
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
};
|
steam-rom-manager = {
|
||||||
|
enable = true;
|
||||||
|
steamUsername = "mjallen18";
|
||||||
|
|
||||||
|
# Optional: override default paths if needed
|
||||||
|
environmentVariables = {
|
||||||
|
romsDirectory = "/home/admin/Emulation/roms";
|
||||||
|
steamDirectory = "/home/admin/.local/share/Steam";
|
||||||
|
};
|
||||||
|
|
||||||
|
emulators = {
|
||||||
|
"Non-SRM Shortcuts" = {
|
||||||
|
enable = true;
|
||||||
|
parserType = "Non-SRM Shortcuts";
|
||||||
|
extraArgs = "";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,18 +1,15 @@
|
|||||||
{ pkgs, ... }:
|
{
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
namespace,
|
||||||
|
...
|
||||||
|
}:
|
||||||
let
|
let
|
||||||
shellAliases = {
|
inherit (lib.${namespace}) disabled;
|
||||||
update-boot = "sudo nixos-rebuild boot --max-jobs 10";
|
|
||||||
update-switch = "sudo nixos-rebuild switch --max-jobs 10";
|
|
||||||
update-flake = "nix flake update nas-nixpkgs nas-authentik-nix nas-cosmic nas-crowdsec nas-home-manager nas-impermanence nas-lanzaboote nas-nixos-hardware nas-sops-nix --flake /etc/nixos";
|
|
||||||
};
|
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
home.username = "admin";
|
home.username = "admin";
|
||||||
|
|
||||||
programs = {
|
|
||||||
zsh.shellAliases = shellAliases;
|
|
||||||
};
|
|
||||||
|
|
||||||
# Configure systemd user service for protonmail-bridge
|
# Configure systemd user service for protonmail-bridge
|
||||||
systemd.user.services.protonmail-bridge = {
|
systemd.user.services.protonmail-bridge = {
|
||||||
Service = {
|
Service = {
|
||||||
@@ -24,9 +21,17 @@ in
|
|||||||
};
|
};
|
||||||
|
|
||||||
services = {
|
services = {
|
||||||
|
nextcloud-client = lib.mkForce disabled;
|
||||||
|
kdeconnect = {
|
||||||
|
enable = false;
|
||||||
|
indicator = false;
|
||||||
|
};
|
||||||
protonmail-bridge = {
|
protonmail-bridge = {
|
||||||
enable = true;
|
enable = true;
|
||||||
extraPackages = with pkgs; [ pass libsecret ];
|
extraPackages = with pkgs; [
|
||||||
|
pass
|
||||||
|
libsecret
|
||||||
|
];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,83 +0,0 @@
|
|||||||
{ pkgs, namespace, ... }:
|
|
||||||
let
|
|
||||||
shellAliases = {
|
|
||||||
update-boot = "sudo nixos-rebuild boot --max-jobs 10 --build-host admin@10.0.1.3";
|
|
||||||
update-switch = "sudo nixos-rebuild switch --max-jobs 10";
|
|
||||||
update-flake = "nix flake update steamdeck-nixpkgs steamdeck-chaotic steamdeck-home-manager steamdeck-impermanence steamdeck-jovian steamdeck-lanzaboote steamdeck-nixos-hardware steamdeck-sops-nix steamdeck-steam-rom-manager --flake /etc/nixos";
|
|
||||||
nas-ssh = "ssh admin@10.0.1.3";
|
|
||||||
};
|
|
||||||
in
|
|
||||||
{
|
|
||||||
home.username = "deck";
|
|
||||||
|
|
||||||
${namespace}.desktop.gnome.enable = true;
|
|
||||||
|
|
||||||
sops = {
|
|
||||||
age.keyFile = "/home/deck/.config/sops/age/keys.txt";
|
|
||||||
defaultSopsFile = "/etc/nixos/secrets/secrets.yaml";
|
|
||||||
validateSopsFiles = false;
|
|
||||||
secrets = {
|
|
||||||
"ssh-keys-public/deck" = {
|
|
||||||
path = "/home/deck/.ssh/id_ed25519.pub";
|
|
||||||
mode = "0644";
|
|
||||||
};
|
|
||||||
"ssh-keys-private/deck" = {
|
|
||||||
path = "/home/deck/.ssh/id_ed25519";
|
|
||||||
mode = "0600";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
programs = {
|
|
||||||
steam-rom-manager = {
|
|
||||||
enable = true;
|
|
||||||
steamUsername = "mjallen18";
|
|
||||||
|
|
||||||
# Optional: override default paths if needed
|
|
||||||
environmentVariables = {
|
|
||||||
romsDirectory = "/home/deck/Emulation/roms";
|
|
||||||
steamDirectory = "/home/deck/.local/share/Steam";
|
|
||||||
};
|
|
||||||
|
|
||||||
emulators = {
|
|
||||||
ryujinx.enable = true;
|
|
||||||
|
|
||||||
dolphin-gamecube = {
|
|
||||||
enable = true;
|
|
||||||
package = pkgs.dolphin-emu;
|
|
||||||
romFolder = "gc";
|
|
||||||
fileTypes = [
|
|
||||||
".iso"
|
|
||||||
".ISO"
|
|
||||||
".gcm"
|
|
||||||
".GCM"
|
|
||||||
".ciso"
|
|
||||||
".CISO"
|
|
||||||
"rvz"
|
|
||||||
];
|
|
||||||
extraArgs = "-b -e \"\${filePath}\"";
|
|
||||||
};
|
|
||||||
|
|
||||||
pcsx2.enable = true;
|
|
||||||
mgba.enable = true;
|
|
||||||
|
|
||||||
"Non-SRM Shortcuts" = {
|
|
||||||
enable = true;
|
|
||||||
parserType = "Non-SRM Shortcuts";
|
|
||||||
extraArgs = "";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
zsh.shellAliases = shellAliases;
|
|
||||||
};
|
|
||||||
|
|
||||||
home.packages = with pkgs; [
|
|
||||||
dolphin-emu
|
|
||||||
heroic
|
|
||||||
mgba
|
|
||||||
prismlauncher
|
|
||||||
ryubing
|
|
||||||
omnissa-horizon-client
|
|
||||||
];
|
|
||||||
}
|
|
||||||
88
homes/x86_64-linux/matt@allyx/default.nix
Executable file
88
homes/x86_64-linux/matt@allyx/default.nix
Executable file
@@ -0,0 +1,88 @@
|
|||||||
|
{
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
namespace,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
inherit (lib.${namespace}) enabled;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
home.username = "matt";
|
||||||
|
|
||||||
|
${namespace}.desktop.gnome = enabled;
|
||||||
|
|
||||||
|
sops = {
|
||||||
|
age.keyFile = "/home/matt/.config/sops/age/keys.txt";
|
||||||
|
defaultSopsFile = "/etc/nixos/secrets/secrets.yaml";
|
||||||
|
validateSopsFiles = false;
|
||||||
|
secrets = {
|
||||||
|
"ssh-keys-public/matt" = {
|
||||||
|
path = "/home/matt/.ssh/id_ed25519.pub";
|
||||||
|
mode = "0644";
|
||||||
|
};
|
||||||
|
"ssh-keys-private/matt" = {
|
||||||
|
path = "/home/matt/.ssh/id_ed25519";
|
||||||
|
mode = "0600";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
programs = {
|
||||||
|
steam-rom-manager = {
|
||||||
|
enable = true;
|
||||||
|
steamUsername = "mjallen18";
|
||||||
|
|
||||||
|
# Optional: override default paths if needed
|
||||||
|
environmentVariables = {
|
||||||
|
romsDirectory = "/home/matt/Emulation/roms";
|
||||||
|
steamDirectory = "/home/matt/.local/share/Steam";
|
||||||
|
};
|
||||||
|
|
||||||
|
emulators = {
|
||||||
|
ryujinx = enabled;
|
||||||
|
|
||||||
|
dolphin-gamecube = {
|
||||||
|
enable = true;
|
||||||
|
package = pkgs.dolphin-emu;
|
||||||
|
romFolder = "gc";
|
||||||
|
fileTypes = [
|
||||||
|
".iso"
|
||||||
|
".ISO"
|
||||||
|
".gcm"
|
||||||
|
".GCM"
|
||||||
|
".ciso"
|
||||||
|
".CISO"
|
||||||
|
"rvz"
|
||||||
|
];
|
||||||
|
extraArgs = "-b -e \"\${filePath}\"";
|
||||||
|
};
|
||||||
|
|
||||||
|
pcsx2 = enabled;
|
||||||
|
mgba = enabled;
|
||||||
|
|
||||||
|
"Non-SRM Shortcuts" = {
|
||||||
|
enable = true;
|
||||||
|
parserType = "Non-SRM Shortcuts";
|
||||||
|
extraArgs = "";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
home.packages =
|
||||||
|
with pkgs;
|
||||||
|
[
|
||||||
|
dolphin-emu
|
||||||
|
heroic
|
||||||
|
mgba
|
||||||
|
moonlight-qt
|
||||||
|
prismlauncher
|
||||||
|
ryubing
|
||||||
|
omnissa-horizon-client
|
||||||
|
]
|
||||||
|
++ (with pkgs.${namespace}; [
|
||||||
|
discord-krisp
|
||||||
|
librepods-beta
|
||||||
|
]);
|
||||||
|
}
|
||||||
@@ -2,7 +2,6 @@
|
|||||||
lib,
|
lib,
|
||||||
pkgs,
|
pkgs,
|
||||||
namespace,
|
namespace,
|
||||||
config,
|
|
||||||
...
|
...
|
||||||
}:
|
}:
|
||||||
let
|
let
|
||||||
@@ -10,14 +9,13 @@ let
|
|||||||
displayLeft = {
|
displayLeft = {
|
||||||
input = "DP-1";
|
input = "DP-1";
|
||||||
resolution = "3840x2160";
|
resolution = "3840x2160";
|
||||||
refreshRate = "240.00000";
|
refreshRate = "120.00000";
|
||||||
};
|
};
|
||||||
displayRight = {
|
displayRight = {
|
||||||
input = "DP-2";
|
input = "DP-2";
|
||||||
resolution = "3840x2160";
|
resolution = "3840x2160";
|
||||||
refreshRate = "240.00000";
|
refreshRate = "240.00000";
|
||||||
};
|
};
|
||||||
theme = config.mjallen.theme.palette;
|
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
home.username = "matt";
|
home.username = "matt";
|
||||||
@@ -42,14 +40,14 @@ in
|
|||||||
position = "0x0";
|
position = "0x0";
|
||||||
scale = 1.0;
|
scale = 1.0;
|
||||||
extra = [
|
extra = [
|
||||||
"bitdepth"
|
# "bitdepth"
|
||||||
"10"
|
# "10"
|
||||||
"cm"
|
# "cm"
|
||||||
"hdr"
|
# "hdredid"
|
||||||
"sdrbrightness"
|
# "sdrbrightness"
|
||||||
"1.2"
|
# "1.2"
|
||||||
"sdrsaturation"
|
# "sdrsaturation"
|
||||||
"0.98"
|
# "0.98"
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
@@ -58,14 +56,14 @@ in
|
|||||||
position = "3840x0";
|
position = "3840x0";
|
||||||
scale = 1.0;
|
scale = 1.0;
|
||||||
extra = [
|
extra = [
|
||||||
"bitdepth"
|
# "bitdepth"
|
||||||
"10"
|
# "10"
|
||||||
"cm"
|
# "cm"
|
||||||
"hdr"
|
# "hdredid"
|
||||||
"sdrbrightness"
|
# "sdrbrightness"
|
||||||
"1.5"
|
# "1.5"
|
||||||
"sdrsaturation"
|
# "sdrsaturation"
|
||||||
"0.98"
|
# "0.98"
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
@@ -77,7 +75,7 @@ in
|
|||||||
];
|
];
|
||||||
|
|
||||||
windowRule = [
|
windowRule = [
|
||||||
"size 2160 7680, tag:horizonrdp"
|
"match:tag horizonrdp, size 2160 7680"
|
||||||
];
|
];
|
||||||
|
|
||||||
autostartCommands = [
|
autostartCommands = [
|
||||||
@@ -104,17 +102,8 @@ in
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
btop = enabled;
|
btop = enabled;
|
||||||
kitty = {
|
kitty = enabled;
|
||||||
enable = true;
|
mako = enabled;
|
||||||
font = {
|
|
||||||
name = "JetBrainsMono NFM";
|
|
||||||
package = pkgs.nerd-fonts.jetbrains-mono;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
mako = {
|
|
||||||
enable = true;
|
|
||||||
fontName = "JetBrainsMono NFM";
|
|
||||||
};
|
|
||||||
nwg-dock = enabled;
|
nwg-dock = enabled;
|
||||||
nwg-drawer = enabled;
|
nwg-drawer = enabled;
|
||||||
nwg-panel = {
|
nwg-panel = {
|
||||||
@@ -130,8 +119,8 @@ in
|
|||||||
|
|
||||||
network.interface = "wlp9s0";
|
network.interface = "wlp9s0";
|
||||||
temperature = {
|
temperature = {
|
||||||
cpu.enable = true;
|
cpu = enabled;
|
||||||
gpu.enable = true;
|
gpu = enabled;
|
||||||
};
|
};
|
||||||
|
|
||||||
extraModules = {
|
extraModules = {
|
||||||
@@ -147,14 +136,14 @@ in
|
|||||||
|
|
||||||
extraModulesStyle = ''
|
extraModulesStyle = ''
|
||||||
#custom-lights {
|
#custom-lights {
|
||||||
color: ${theme.frost.nord8};
|
color: @base0C;
|
||||||
background-color: ${theme.polarNight.nord0};
|
background-color: @base00;
|
||||||
${theme.defaultOpacity}
|
opacity: 0.85;
|
||||||
border-left: 5px solid ${theme.frost.nord8};
|
border-left: 5px solid @base0C;
|
||||||
}
|
}
|
||||||
|
|
||||||
#custom-lights:hover {
|
#custom-lights:hover {
|
||||||
background: ${theme.polarNight.nord3};
|
background: @base03;
|
||||||
}
|
}
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
@@ -174,36 +163,66 @@ in
|
|||||||
password-store = enabled;
|
password-store = enabled;
|
||||||
};
|
};
|
||||||
|
|
||||||
home.packages = with pkgs; [
|
home.packages =
|
||||||
pkgs.${namespace}.bolt-launcher
|
with pkgs;
|
||||||
pkgs.${namespace}.librepods
|
[
|
||||||
|
bolt-launcher
|
||||||
bottles
|
clevis
|
||||||
compose2nix
|
compose2nix
|
||||||
discord
|
distrobox
|
||||||
distrobox
|
heroic
|
||||||
heroic
|
home-manager
|
||||||
omnissa-horizon-client
|
omnissa-horizon-client
|
||||||
jq
|
jq
|
||||||
lutris
|
lzip
|
||||||
lzip
|
morph
|
||||||
morph
|
orca-slicer
|
||||||
orca-slicer
|
piper
|
||||||
piper
|
prismlauncher
|
||||||
prismlauncher
|
protontricks
|
||||||
protontricks
|
protonvpn-gui
|
||||||
protonvpn-gui
|
runelite
|
||||||
python3
|
smile
|
||||||
runelite
|
via
|
||||||
smile
|
virt-manager
|
||||||
unigine-heaven
|
vorta
|
||||||
via
|
waydroid-helper
|
||||||
virt-manager
|
]
|
||||||
vorta
|
++ (with pkgs.${namespace}; [
|
||||||
waydroid-helper
|
discord-krisp
|
||||||
];
|
# librepods
|
||||||
|
]);
|
||||||
|
|
||||||
specialisation = {
|
specialisation = {
|
||||||
|
"end4".configuration = {
|
||||||
|
programs = {
|
||||||
|
illogical-impulse = {
|
||||||
|
enable = true;
|
||||||
|
|
||||||
|
dotfiles = {
|
||||||
|
fish = lib.mkForce disabled;
|
||||||
|
starship = lib.mkForce disabled;
|
||||||
|
};
|
||||||
|
|
||||||
|
hyprland.plugins = [
|
||||||
|
pkgs.hyprlandPlugins.hyprbars
|
||||||
|
pkgs.hyprlandPlugins.hyprexpo
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
stylix.targets.qt = lib.mkForce disabled;
|
||||||
|
${namespace} = {
|
||||||
|
programs = {
|
||||||
|
mako = lib.mkForce disabled;
|
||||||
|
nwg-dock = lib.mkForce disabled;
|
||||||
|
nwg-drawer = lib.mkForce disabled;
|
||||||
|
nwg-panel = lib.mkForce disabled;
|
||||||
|
waybar = lib.mkForce disabled;
|
||||||
|
wlogout = lib.mkForce disabled;
|
||||||
|
wofi = lib.mkForce disabled;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
"cosmic".configuration = {
|
"cosmic".configuration = {
|
||||||
${namespace} = {
|
${namespace} = {
|
||||||
programs = {
|
programs = {
|
||||||
|
|||||||
18
homes/x86_64-linux/nixos@iso-minimal/default.nix
Normal file
18
homes/x86_64-linux/nixos@iso-minimal/default.nix
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
lib,
|
||||||
|
namespace,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
inherit (lib.${namespace}) disabled;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
home.username = "root";
|
||||||
|
services = {
|
||||||
|
nextcloud-client = lib.mkForce disabled;
|
||||||
|
kdeconnect = {
|
||||||
|
enable = false;
|
||||||
|
indicator = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
18
homes/x86_64-linux/root@allyx/default.nix
Normal file
18
homes/x86_64-linux/root@allyx/default.nix
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
lib,
|
||||||
|
namespace,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
inherit (lib.${namespace}) disabled;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
home.username = "root";
|
||||||
|
services = {
|
||||||
|
nextcloud-client = lib.mkForce disabled;
|
||||||
|
kdeconnect = {
|
||||||
|
enable = false;
|
||||||
|
indicator = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
18
homes/x86_64-linux/root@iso-minimal/default.nix
Normal file
18
homes/x86_64-linux/root@iso-minimal/default.nix
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
lib,
|
||||||
|
namespace,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
inherit (lib.${namespace}) disabled;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
home.username = "root";
|
||||||
|
services = {
|
||||||
|
nextcloud-client = lib.mkForce disabled;
|
||||||
|
kdeconnect = {
|
||||||
|
enable = false;
|
||||||
|
indicator = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
18
homes/x86_64-linux/root@jallen-nas/default.nix
Normal file
18
homes/x86_64-linux/root@jallen-nas/default.nix
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
lib,
|
||||||
|
namespace,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
inherit (lib.${namespace}) disabled;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
home.username = "root";
|
||||||
|
services = {
|
||||||
|
nextcloud-client = lib.mkForce disabled;
|
||||||
|
kdeconnect = {
|
||||||
|
enable = false;
|
||||||
|
indicator = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
18
homes/x86_64-linux/root@matt-nixos/default.nix
Normal file
18
homes/x86_64-linux/root@matt-nixos/default.nix
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
lib,
|
||||||
|
namespace,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
inherit (lib.${namespace}) disabled;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
home.username = "root";
|
||||||
|
services = {
|
||||||
|
nextcloud-client = lib.mkForce disabled;
|
||||||
|
kdeconnect = {
|
||||||
|
enable = false;
|
||||||
|
indicator = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
18
homes/x86_64-linux/root@nuc-nixos/default.nix
Normal file
18
homes/x86_64-linux/root@nuc-nixos/default.nix
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
lib,
|
||||||
|
namespace,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
inherit (lib.${namespace}) disabled;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
home.username = "root";
|
||||||
|
services = {
|
||||||
|
nextcloud-client = lib.mkForce disabled;
|
||||||
|
kdeconnect = {
|
||||||
|
enable = false;
|
||||||
|
indicator = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -15,5 +15,11 @@
|
|||||||
|
|
||||||
# Import examples
|
# Import examples
|
||||||
examples = import ./examples { inherit inputs; };
|
examples = import ./examples { inherit inputs; };
|
||||||
|
|
||||||
|
# Import versioning utilities
|
||||||
|
versioning = import ./versioning {
|
||||||
|
lib = inputs.nixpkgs.lib;
|
||||||
|
inherit inputs;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{ lib, ... }:
|
{ lib, namespace, ... }:
|
||||||
let
|
let
|
||||||
inherit (lib.mjallen.file)
|
inherit (lib.${namespace}.file)
|
||||||
readFile
|
readFile
|
||||||
pathExists
|
pathExists
|
||||||
safeImport
|
safeImport
|
||||||
|
|||||||
@@ -2,10 +2,11 @@
|
|||||||
config,
|
config,
|
||||||
lib,
|
lib,
|
||||||
pkgs,
|
pkgs,
|
||||||
|
namespace,
|
||||||
...
|
...
|
||||||
}:
|
}:
|
||||||
let
|
let
|
||||||
inherit (lib.mjallen.module) mkModule mkOpt;
|
inherit (lib.${namespace}.module) mkModule mkOpt;
|
||||||
in
|
in
|
||||||
mkModule {
|
mkModule {
|
||||||
name = "sops";
|
name = "sops";
|
||||||
@@ -23,13 +24,16 @@ mkModule {
|
|||||||
];
|
];
|
||||||
|
|
||||||
sops = {
|
sops = {
|
||||||
inherit (config.mjallen.sops) defaultSopsFile;
|
inherit (config.${namespace}.sops) defaultSopsFile;
|
||||||
defaultSopsFormat = "yaml";
|
defaultSopsFormat = "yaml";
|
||||||
|
|
||||||
age = {
|
age = {
|
||||||
generateKey = true;
|
generateKey = true;
|
||||||
keyFile = "${config.home.homeDirectory}/.config/sops/age/keys.txt";
|
keyFile = "${config.home.homeDirectory}/.config/sops/age/keys.txt";
|
||||||
sshKeyPaths = [ "${config.home.homeDirectory}/.ssh/id_ed25519" ] ++ config.mjallen.sops.sshKeyPaths;
|
sshKeyPaths = [
|
||||||
|
"${config.home.homeDirectory}/.ssh/id_ed25519"
|
||||||
|
]
|
||||||
|
++ config.${namespace}.sops.sshKeyPaths;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# Example usage of the reverse proxy utilities
|
# Example usage of the reverse proxy utilities
|
||||||
{ lib, ... }:
|
{ lib, namespace, ... }:
|
||||||
let
|
let
|
||||||
inherit (lib.mjallen-lib.reverseproxy)
|
inherit (lib.${namespace} - lib.reverseproxy)
|
||||||
mkReverseProxy
|
mkReverseProxy
|
||||||
mkReverseProxies
|
mkReverseProxies
|
||||||
templates
|
templates
|
||||||
|
|||||||
@@ -1,6 +1,11 @@
|
|||||||
{ config, lib, ... }:
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
namespace,
|
||||||
|
...
|
||||||
|
}:
|
||||||
let
|
let
|
||||||
inherit (lib.mjallen.module) mkModule mkOpt mkBoolOpt;
|
inherit (lib.${namespace}.module) mkModule mkOpt mkBoolOpt;
|
||||||
in
|
in
|
||||||
mkModule {
|
mkModule {
|
||||||
name = "sops";
|
name = "sops";
|
||||||
@@ -22,18 +27,18 @@ mkModule {
|
|||||||
};
|
};
|
||||||
config = {
|
config = {
|
||||||
sops = {
|
sops = {
|
||||||
inherit (config.mjallen.sops) defaultSopsFile validateSopsFiles;
|
inherit (config.${namespace}.sops) defaultSopsFile validateSopsFiles;
|
||||||
|
|
||||||
age = {
|
age = {
|
||||||
inherit (config.mjallen.sops) generateAgeKey;
|
inherit (config.${namespace}.sops) generateAgeKey;
|
||||||
|
|
||||||
keyFile =
|
keyFile =
|
||||||
if config.mjallen.sops.ageKeyPath != null then
|
if config.${namespace}.sops.ageKeyPath != null then
|
||||||
config.mjallen.sops.ageKeyPath
|
config.${namespace}.sops.ageKeyPath
|
||||||
else
|
else
|
||||||
"${config.users.users.${config.mjallen.user.name}.home}/.config/sops/age/keys.txt";
|
"${config.users.users.${config.${namespace}.user.name}.home}/.config/sops/age/keys.txt";
|
||||||
|
|
||||||
sshKeyPaths = config.mjallen.sops.sshKeyPaths;
|
sshKeyPaths = config.${namespace}.sops.sshKeyPaths;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{ inputs, ... }:
|
{ inputs, namespace, ... }:
|
||||||
let
|
let
|
||||||
inherit (inputs.self.mjallen-lib.system.common)
|
inherit (inputs.self.${namespace} - lib.system.common)
|
||||||
mkExtendedLib
|
mkExtendedLib
|
||||||
mkNixpkgsConfig
|
mkNixpkgsConfig
|
||||||
mkHomeConfigs
|
mkHomeConfigs
|
||||||
@@ -13,10 +13,10 @@ in
|
|||||||
nixosConfigurations =
|
nixosConfigurations =
|
||||||
let
|
let
|
||||||
# Get all systems
|
# Get all systems
|
||||||
allSystems = inputs.self.mjallen-lib.file.scanSystems ../systems;
|
allSystems = inputs.self.${namespace} - lib.file.scanSystems ../systems;
|
||||||
|
|
||||||
# Filter for NixOS systems
|
# Filter for NixOS systems
|
||||||
nixosSystems = inputs.self.mjallen-lib.file.filterNixOSSystems allSystems;
|
nixosSystems = inputs.self.${namespace} - lib.file.filterNixOSSystems allSystems;
|
||||||
in
|
in
|
||||||
inputs.nixpkgs.lib.mapAttrs' (
|
inputs.nixpkgs.lib.mapAttrs' (
|
||||||
_name:
|
_name:
|
||||||
@@ -74,7 +74,7 @@ in
|
|||||||
# Import all nixos modules recursively
|
# Import all nixos modules recursively
|
||||||
../${system}/${hostname}
|
../${system}/${hostname}
|
||||||
]
|
]
|
||||||
++ (extendedLib.mjallen.file.importModulesRecursive ../modules/nixos);
|
++ (extendedLib.${namespace}.file.importModulesRecursive ../modules/nixos);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
) nixosSystems;
|
) nixosSystems;
|
||||||
@@ -83,7 +83,7 @@ in
|
|||||||
homeConfigurations =
|
homeConfigurations =
|
||||||
let
|
let
|
||||||
# Get all homes
|
# Get all homes
|
||||||
allHomes = inputs.self.mjallen-lib.file.scanHomes ../homes;
|
allHomes = inputs.self.${namespace} - lib.file.scanHomes ../homes;
|
||||||
in
|
in
|
||||||
inputs.nixpkgs.lib.mapAttrs' (
|
inputs.nixpkgs.lib.mapAttrs' (
|
||||||
_name:
|
_name:
|
||||||
@@ -125,7 +125,7 @@ in
|
|||||||
# Import the home configuration
|
# Import the home configuration
|
||||||
path
|
path
|
||||||
]
|
]
|
||||||
++ (extendedLib.mjallen.file.importModulesRecursive ../modules/home);
|
++ (extendedLib.${namespace}.file.importModulesRecursive ../modules/home);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
) allHomes;
|
) allHomes;
|
||||||
|
|||||||
@@ -1,4 +1,8 @@
|
|||||||
{ inputs }:
|
{
|
||||||
|
inputs,
|
||||||
|
lib,
|
||||||
|
namespace,
|
||||||
|
}:
|
||||||
let
|
let
|
||||||
inherit (inputs.nixpkgs.lib)
|
inherit (inputs.nixpkgs.lib)
|
||||||
mapAttrs
|
mapAttrs
|
||||||
@@ -28,28 +32,144 @@ rec {
|
|||||||
name,
|
name,
|
||||||
description ? "",
|
description ? "",
|
||||||
options ? { },
|
options ? { },
|
||||||
config ? { },
|
moduleConfig ? { },
|
||||||
|
domain ? "services",
|
||||||
|
config,
|
||||||
|
serviceName ? name,
|
||||||
}:
|
}:
|
||||||
|
let
|
||||||
|
cfg = config.${namespace}.${domain}.${name};
|
||||||
|
|
||||||
|
# Create reverse proxy configuration using mkReverseProxy
|
||||||
|
reverseProxyConfig = lib.${namespace}.mkReverseProxy {
|
||||||
|
inherit name;
|
||||||
|
subdomain = cfg.reverseProxy.subdomain;
|
||||||
|
url = "http://${config.${namespace}.network.ipv4.address}:${toString cfg.port}";
|
||||||
|
middlewares = cfg.reverseProxy.middlewares;
|
||||||
|
};
|
||||||
|
|
||||||
|
defaultConfig = {
|
||||||
|
${namespace}.services.traefik = lib.mkIf cfg.reverseProxy.enable {
|
||||||
|
reverseProxies = [ reverseProxyConfig ];
|
||||||
|
};
|
||||||
|
|
||||||
|
# Open firewall
|
||||||
|
networking.firewall = lib.mkIf cfg.openFirewall {
|
||||||
|
allowedTCPPorts = [ cfg.port ];
|
||||||
|
allowedUDPPorts = [ cfg.port ];
|
||||||
|
};
|
||||||
|
|
||||||
|
users = lib.mkIf cfg.createUser {
|
||||||
|
users.${name} = {
|
||||||
|
isSystemUser = true;
|
||||||
|
group = name;
|
||||||
|
home = cfg.configDir;
|
||||||
|
};
|
||||||
|
groups.${name} = { };
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.services.${serviceName} = {
|
||||||
|
requires = [
|
||||||
|
"media-nas-main.mount"
|
||||||
|
# "openvpn-us.protonvpn.udp.service"
|
||||||
|
];
|
||||||
|
after = lib.mkForce [
|
||||||
|
"media-nas-main.mount"
|
||||||
|
# "openvpn-us.protonvpn.udp.service"
|
||||||
|
];
|
||||||
|
# serviceConfig = {
|
||||||
|
# NetworkNamespacePath = lib.mkIf cfg.enableVpn "/run/netns/vpn";
|
||||||
|
# # Consider also setting DNS *inside* the netns (see note below).
|
||||||
|
# };
|
||||||
|
};
|
||||||
|
|
||||||
|
services = {
|
||||||
|
postgresql = lib.mkIf cfg.configureDb {
|
||||||
|
enable = true;
|
||||||
|
ensureDatabases = [ name ];
|
||||||
|
ensureUsers = [
|
||||||
|
{
|
||||||
|
name = name;
|
||||||
|
ensureDBOwnership = true;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
redis.servers.${name} = lib.mkIf cfg.redis.enable {
|
||||||
|
enable = true;
|
||||||
|
port = cfg.redis.port;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# systemd.tmpfiles.rules = [
|
||||||
|
# "d ${cfg.configDir} 0700 ${name} ${name} - -"
|
||||||
|
# # "d ${cfg.configDir}/server-files 0775 ${name} ${name} - -"
|
||||||
|
# # "d ${cfg.configDir}/user-files 0775 ${name} ${name} - -"
|
||||||
|
# ];
|
||||||
|
}
|
||||||
|
// moduleConfig;
|
||||||
|
in
|
||||||
{ lib, ... }:
|
{ lib, ... }:
|
||||||
{
|
{
|
||||||
options.mjallen.${name} = lib.mkOption {
|
options.${namespace}.${domain}.${name} = lib.mkOption {
|
||||||
type = lib.types.submodule {
|
type = lib.types.submodule {
|
||||||
options = {
|
options = {
|
||||||
enable = lib.mkEnableOption description;
|
enable = lib.mkEnableOption description;
|
||||||
|
|
||||||
|
port = mkOpt types.int 80 "Port for ${name} to be hosted on";
|
||||||
|
|
||||||
|
configDir = mkOpt types.str "/media/nas/main/appdata" "Path to the config dir";
|
||||||
|
|
||||||
|
dataDir = mkOpt types.str "/media/nas/main" "Path to the data dir";
|
||||||
|
|
||||||
|
createUser = mkBoolOpt false "create a user for this module/service";
|
||||||
|
|
||||||
|
configureDb = mkBoolOpt false "Manage db for this service";
|
||||||
|
|
||||||
|
environmentFile = mkOpt types.str "" "Environment File";
|
||||||
|
|
||||||
|
puid = mkOpt types.str "911" "default user id";
|
||||||
|
|
||||||
|
pgid = mkOpt types.str "1000" "default group id";
|
||||||
|
|
||||||
|
timeZone = mkOpt types.str "America/Chicago" "default timezone";
|
||||||
|
|
||||||
|
listenAddress = mkOpt types.str "0.0.0.0" "Environment File";
|
||||||
|
|
||||||
|
openFirewall = mkBoolOpt true "Open the firewall";
|
||||||
|
|
||||||
|
enableVpn = mkBoolOpt true "Enable routing through VPN";
|
||||||
|
|
||||||
|
redis = {
|
||||||
|
enable = lib.mkEnableOption "enable redis";
|
||||||
|
|
||||||
|
port = mkOpt types.int 80 "Port for ${name} redis to be hosted on";
|
||||||
|
};
|
||||||
|
|
||||||
|
hashedPassword =
|
||||||
|
mkOpt (types.nullOr types.str)
|
||||||
|
"$y$j9T$EkPXmsmIMFFZ.WRrBYCxS1$P0kwo6e4.WM5DsqUcEqWC3MrZp5KfCjxffraMFZWu06"
|
||||||
|
"Hashed password for code-server authentication";
|
||||||
|
|
||||||
|
extraEnvironment =
|
||||||
|
mkOpt (types.attrsOf types.str) { }
|
||||||
|
"Extra environment variables for code-server";
|
||||||
|
|
||||||
|
reverseProxy = mkReverseProxyOpt name;
|
||||||
}
|
}
|
||||||
// options;
|
// options;
|
||||||
};
|
};
|
||||||
default = { };
|
default = { };
|
||||||
};
|
};
|
||||||
|
|
||||||
config = lib.mkIf config.mjallen.${name}.enable config;
|
config = lib.mkIf cfg.enable defaultConfig;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# container
|
||||||
mkContainer =
|
mkContainer =
|
||||||
{
|
{
|
||||||
name,
|
name,
|
||||||
localAddress ? "127.0.0.1",
|
localAddress ? "127.0.0.1",
|
||||||
ports ? [ "80" ],
|
ports ? [ 80 ],
|
||||||
bindMounts ? { },
|
bindMounts ? { },
|
||||||
config ? { },
|
config ? { },
|
||||||
}:
|
}:
|
||||||
@@ -101,12 +221,15 @@ rec {
|
|||||||
|
|
||||||
mkBoolOpt' = mkOpt' types.bool;
|
mkBoolOpt' = mkOpt' types.bool;
|
||||||
|
|
||||||
mkReverseProxyOpt = {
|
mkReverseProxyOpt = name: {
|
||||||
enable = mkBoolOpt false "Enable reverse proxy support";
|
enable = mkBoolOpt false "Enable reverse proxy support";
|
||||||
|
|
||||||
subdomain = mkOpt types.str "" "subdomain of the service";
|
subdomain = mkOpt types.str name "subdomain of the service";
|
||||||
|
|
||||||
middlewares = mkOpt (types.listOf types.str) [ ] "List of middlewares to use";
|
middlewares = mkOpt (types.listOf types.str) [
|
||||||
|
"crowdsec"
|
||||||
|
"whitelist-geoblock"
|
||||||
|
] "List of middlewares to use";
|
||||||
};
|
};
|
||||||
|
|
||||||
# Standard enable/disable patterns
|
# Standard enable/disable patterns
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
{ inputs }:
|
{ inputs, namespace }:
|
||||||
let
|
let
|
||||||
inherit (inputs.nixpkgs.lib) filterAttrs mapAttrs';
|
inherit (inputs.nixpkgs.lib) filterAttrs mapAttrs';
|
||||||
in
|
in
|
||||||
@@ -7,7 +7,7 @@ in
|
|||||||
flake: nixpkgs:
|
flake: nixpkgs:
|
||||||
nixpkgs.lib.extend (
|
nixpkgs.lib.extend (
|
||||||
_final: _prev: {
|
_final: _prev: {
|
||||||
mjallen = flake.mjallen-lib;
|
mjallen = flake.${namespace} - lib;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -30,7 +30,7 @@ in
|
|||||||
hostname,
|
hostname,
|
||||||
}:
|
}:
|
||||||
let
|
let
|
||||||
inherit (flake.mjallen-lib.file) scanHomes;
|
inherit (flake.${namespace} - lib.file) scanHomes;
|
||||||
homesPath = ../../homes;
|
homesPath = ../../homes;
|
||||||
allHomes = scanHomes homesPath;
|
allHomes = scanHomes homesPath;
|
||||||
in
|
in
|
||||||
@@ -59,7 +59,7 @@ in
|
|||||||
sharedModules = [
|
sharedModules = [
|
||||||
{ _module.args.lib = extendedLib; }
|
{ _module.args.lib = extendedLib; }
|
||||||
]
|
]
|
||||||
++ (extendedLib.mjallen.file.importModulesRecursive ../../modules/home);
|
++ (extendedLib.${namespace}.file.importModulesRecursive ../../modules/home);
|
||||||
users = mapAttrs' (_name: homeConfig: {
|
users = mapAttrs' (_name: homeConfig: {
|
||||||
name = homeConfig.username;
|
name = homeConfig.username;
|
||||||
value = {
|
value = {
|
||||||
|
|||||||
212
lib/versioning/default.nix
Normal file
212
lib/versioning/default.nix
Normal file
@@ -0,0 +1,212 @@
|
|||||||
|
{
|
||||||
|
lib,
|
||||||
|
inputs,
|
||||||
|
system ? "aarch64-linux",
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
pkgs = inputs.nixpkgs.legacyPackages.${system};
|
||||||
|
in
|
||||||
|
let
|
||||||
|
inherit (builtins)
|
||||||
|
isAttrs
|
||||||
|
isList
|
||||||
|
isString
|
||||||
|
hasAttr
|
||||||
|
getAttr
|
||||||
|
attrNames
|
||||||
|
toString
|
||||||
|
replaceStrings
|
||||||
|
;
|
||||||
|
|
||||||
|
mapAttrs = lib.mapAttrs;
|
||||||
|
recursiveUpdate = lib.recursiveUpdate;
|
||||||
|
|
||||||
|
# Deep-merge attrsets (right-biased).
|
||||||
|
deepMerge = a: b: recursiveUpdate a b;
|
||||||
|
|
||||||
|
# Merge component sources: base.sources overlaid by overrides (component-wise deep merge).
|
||||||
|
mergeSources =
|
||||||
|
baseSources: overrides:
|
||||||
|
baseSources
|
||||||
|
// mapAttrs (
|
||||||
|
name: ov: if hasAttr name baseSources then deepMerge (getAttr name baseSources) ov else ov
|
||||||
|
) overrides;
|
||||||
|
|
||||||
|
# Apply a single variant overlay (variables + sources).
|
||||||
|
applyVariantOnce =
|
||||||
|
selected: variant:
|
||||||
|
let
|
||||||
|
vVars = if variant ? variables then variant.variables else { };
|
||||||
|
vSrcs = if variant ? sources then variant.sources else { };
|
||||||
|
in
|
||||||
|
{
|
||||||
|
variables = selected.variables // vVars;
|
||||||
|
sources = mergeSources selected.sources vSrcs;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Apply platform-specific overrides if present for the given system.
|
||||||
|
applyPlatforms =
|
||||||
|
selected: variant: system:
|
||||||
|
if system == null || !(variant ? platforms) || !(hasAttr system variant.platforms) then
|
||||||
|
selected
|
||||||
|
else
|
||||||
|
let
|
||||||
|
p = variant.platforms.${system};
|
||||||
|
pVars = if p ? variables then p.variables else { };
|
||||||
|
pSrcs = if p ? sources then p.sources else { };
|
||||||
|
in
|
||||||
|
{
|
||||||
|
variables = selected.variables // pVars;
|
||||||
|
sources = mergeSources selected.sources pSrcs;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Resolve variant chain via inherits (ancestor first), then apply platforms.
|
||||||
|
resolveVariant =
|
||||||
|
spec: baseSelected: variantName: system:
|
||||||
|
if variantName == null || !(spec ? variants) || !(hasAttr variantName spec.variants) then
|
||||||
|
baseSelected
|
||||||
|
else
|
||||||
|
let
|
||||||
|
v = spec.variants.${variantName};
|
||||||
|
parentSelected =
|
||||||
|
if v ? inherits then resolveVariant spec baseSelected v.inherits system else baseSelected;
|
||||||
|
withVariant = applyVariantOnce parentSelected v;
|
||||||
|
in
|
||||||
|
applyPlatforms withVariant v system;
|
||||||
|
|
||||||
|
# Render ${var} substitutions in any string within attrs/lists.
|
||||||
|
renderValue =
|
||||||
|
value: vars:
|
||||||
|
if isString value then
|
||||||
|
let
|
||||||
|
keys = attrNames vars;
|
||||||
|
patterns = map (k: "\${" + k + "}") keys;
|
||||||
|
replacements = map (k: toString (getAttr k vars)) keys;
|
||||||
|
in
|
||||||
|
replaceStrings patterns replacements value
|
||||||
|
else if isAttrs value then
|
||||||
|
mapAttrs (_: v: renderValue v vars) value
|
||||||
|
else if isList value then
|
||||||
|
map (v: renderValue v vars) value
|
||||||
|
else
|
||||||
|
value;
|
||||||
|
|
||||||
|
# Decide fetcher for URL type based on optional extra.unpack hint.
|
||||||
|
useFetchZip = comp: comp ? extra && comp.extra ? unpack && comp.extra.unpack == "zip";
|
||||||
|
|
||||||
|
# Build a single src from a rendered component spec.
|
||||||
|
mkSrcFromRendered =
|
||||||
|
comp:
|
||||||
|
let
|
||||||
|
fetcher = if comp ? fetcher then comp.fetcher else "none";
|
||||||
|
in
|
||||||
|
if fetcher == "github" then
|
||||||
|
pkgs.fetchFromGitHub (
|
||||||
|
{
|
||||||
|
owner = comp.owner;
|
||||||
|
repo = comp.repo;
|
||||||
|
# Allow tag as rev (ignore null/empty tag)
|
||||||
|
rev = if comp ? tag && comp.tag != null && comp.tag != "" then comp.tag else comp.rev;
|
||||||
|
fetchSubmodules = if comp ? submodules then comp.submodules else false;
|
||||||
|
hash = comp.hash;
|
||||||
|
}
|
||||||
|
// lib.optionalAttrs (comp ? name) { name = comp.name; }
|
||||||
|
)
|
||||||
|
else if fetcher == "git" then
|
||||||
|
pkgs.fetchgit {
|
||||||
|
url = comp.url;
|
||||||
|
rev = comp.rev;
|
||||||
|
fetchSubmodules = if comp ? submodules then comp.submodules else false;
|
||||||
|
hash = comp.hash;
|
||||||
|
}
|
||||||
|
else if fetcher == "url" then
|
||||||
|
let
|
||||||
|
url = if comp ? url then comp.url else comp.urlTemplate;
|
||||||
|
in
|
||||||
|
if useFetchZip comp then
|
||||||
|
pkgs.fetchzip (
|
||||||
|
{
|
||||||
|
inherit url;
|
||||||
|
hash = comp.hash;
|
||||||
|
}
|
||||||
|
// lib.optionalAttrs (comp ? extra && comp.extra ? stripRoot) { stripRoot = comp.extra.stripRoot; }
|
||||||
|
)
|
||||||
|
else
|
||||||
|
pkgs.fetchurl {
|
||||||
|
inherit url;
|
||||||
|
hash = comp.hash;
|
||||||
|
}
|
||||||
|
else if fetcher == "pypi" then
|
||||||
|
pkgs.python3Packages.fetchPypi {
|
||||||
|
pname = comp.name;
|
||||||
|
version = comp.version;
|
||||||
|
hash = comp.hash;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
# fetcher == "none": pass-through (e.g., linux version/hash consumed by custom logic)
|
||||||
|
comp;
|
||||||
|
|
||||||
|
in
|
||||||
|
rec {
|
||||||
|
/*
|
||||||
|
Select a variant from a loaded version.json specification.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
let selected = versioning.selectVariant spec variantName system;
|
||||||
|
- spec: attrset from lib.importJSON ./version.json
|
||||||
|
- variantName: string or null (when null, uses spec.defaultVariant if present)
|
||||||
|
- system: string like "x86_64-linux" or null (to apply platforms overrides)
|
||||||
|
*/
|
||||||
|
selectVariant =
|
||||||
|
spec: variantName: system:
|
||||||
|
let
|
||||||
|
chosen =
|
||||||
|
if variantName != null then
|
||||||
|
variantName
|
||||||
|
else
|
||||||
|
(if spec ? defaultVariant then spec.defaultVariant else null);
|
||||||
|
baseSelected = {
|
||||||
|
variables = if spec ? variables then spec.variables else { };
|
||||||
|
sources = if spec ? sources then spec.sources else { };
|
||||||
|
};
|
||||||
|
in
|
||||||
|
resolveVariant spec baseSelected chosen system;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Render ${var} template substitutions across any value using provided variables.
|
||||||
|
Strings, attrsets, and lists are traversed.
|
||||||
|
*/
|
||||||
|
render = value: variables: renderValue value variables;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Render a component with variables and then build its src (or pass-through for fetcher "none").
|
||||||
|
Prefer using mkAllSources, which handles rendering for all components.
|
||||||
|
*/
|
||||||
|
mkSrc =
|
||||||
|
comp: variables:
|
||||||
|
let
|
||||||
|
rendered = renderValue comp variables;
|
||||||
|
in
|
||||||
|
mkSrcFromRendered rendered;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Produce an attrset of all sources for a selected spec:
|
||||||
|
mkAllSources selected
|
||||||
|
Where:
|
||||||
|
selected = selectVariant spec variantName system
|
||||||
|
Returns:
|
||||||
|
{ componentName = src | renderedComp (for "none"); ... }
|
||||||
|
*/
|
||||||
|
mkAllSources =
|
||||||
|
selected:
|
||||||
|
mapAttrs (
|
||||||
|
_name: comp:
|
||||||
|
if comp ? fetcher && comp.fetcher == "none" then
|
||||||
|
renderValue comp selected.variables
|
||||||
|
else
|
||||||
|
mkSrc (renderValue comp selected.variables) selected.variables
|
||||||
|
) selected.sources;
|
||||||
|
|
||||||
|
# Expose deepMerge for convenience (right-biased).
|
||||||
|
inherit deepMerge;
|
||||||
|
}
|
||||||
@@ -35,9 +35,9 @@
|
|||||||
# Pass inputs so external modules can access them
|
# Pass inputs so external modules can access them
|
||||||
extraSpecialArgs = {
|
extraSpecialArgs = {
|
||||||
inherit inputs namespace;
|
inherit inputs namespace;
|
||||||
overlays = with inputs; [
|
# overlays = with inputs; [
|
||||||
nix-vscode-extensions.overlays.default
|
# nix-vscode-extensions.overlays.default
|
||||||
];
|
# ];
|
||||||
};
|
};
|
||||||
|
|
||||||
# Make ALL external HM modules available globally
|
# Make ALL external HM modules available globally
|
||||||
@@ -45,6 +45,7 @@
|
|||||||
sops-nix.homeManagerModules.sops
|
sops-nix.homeManagerModules.sops
|
||||||
nix-plist-manager.homeManagerModules.default
|
nix-plist-manager.homeManagerModules.default
|
||||||
nix-index-database.homeModules.nix-index
|
nix-index-database.homeModules.nix-index
|
||||||
|
stylix.homeModules.stylix
|
||||||
# Add any other external HM modules here
|
# Add any other external HM modules here
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
@@ -2,10 +2,11 @@
|
|||||||
config,
|
config,
|
||||||
lib,
|
lib,
|
||||||
pkgs,
|
pkgs,
|
||||||
|
namespace,
|
||||||
...
|
...
|
||||||
}:
|
}:
|
||||||
let
|
let
|
||||||
cfg = config.mjallen.desktop.gnome;
|
cfg = config.${namespace}.desktop.gnome;
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
imports = [ ./options.nix ];
|
imports = [ ./options.nix ];
|
||||||
@@ -22,7 +23,9 @@ in
|
|||||||
gnomeExtensions.bing-wallpaper-changer
|
gnomeExtensions.bing-wallpaper-changer
|
||||||
gnomeExtensions.dash-to-dock
|
gnomeExtensions.dash-to-dock
|
||||||
gnomeExtensions.dash-to-panel
|
gnomeExtensions.dash-to-panel
|
||||||
|
gnomeExtensions.caffeine
|
||||||
gnomeExtensions.gsconnect
|
gnomeExtensions.gsconnect
|
||||||
|
gnomeExtensions.nasa-apod
|
||||||
gnomeExtensions.random-wallpaper
|
gnomeExtensions.random-wallpaper
|
||||||
gnomeExtensions.tiling-assistant
|
gnomeExtensions.tiling-assistant
|
||||||
gnomeExtensions.user-themes
|
gnomeExtensions.user-themes
|
||||||
@@ -53,20 +56,25 @@ in
|
|||||||
"org/gnome/shell".enabled-extensions = [
|
"org/gnome/shell".enabled-extensions = [
|
||||||
"allowlockedremotedesktop@kamens.us"
|
"allowlockedremotedesktop@kamens.us"
|
||||||
"appindicatorsupport@rgcjonas.gmail.com"
|
"appindicatorsupport@rgcjonas.gmail.com"
|
||||||
"user-theme@gnome-shell-extensions.gcampax.github.com"
|
"caffeine@patapon.info"
|
||||||
|
# "user-theme@gnome-shell-extensions.gcampax.github.com"
|
||||||
"tiling-assistant@leleat-on-github"
|
"tiling-assistant@leleat-on-github"
|
||||||
"dash-to-dock@micxgx.gmail.com"
|
"dash-to-dock@micxgx.gmail.com"
|
||||||
"BingWallpaper@ineffable-gmail.com"
|
"BingWallpaper@ineffable-gmail.com"
|
||||||
"gsconnect@andyholmes.github.io"
|
"gsconnect@andyholmes.github.io"
|
||||||
];
|
];
|
||||||
"org/gnome/shell/extensions/bingwallpaper".override-lockscreen-blur = true;
|
"org/gnome/shell/extensions/bingwallpaper".override-lockscreen-blur = true;
|
||||||
"org/gnome/shell/extensions/bingwallpaper".random-mode-enabled = true;
|
"org/gnome/shell/extensions/bingwallpaper".random-mode-enabled = false;
|
||||||
|
"org/gnome/shell/extensions/bingwallpaper".selected-image = "current";
|
||||||
"org/gnome/shell/extensions/bingwallpaper".revert-to-current-image = false;
|
"org/gnome/shell/extensions/bingwallpaper".revert-to-current-image = false;
|
||||||
|
"org/gnome/shell/extensions/caffeine".enable-fullscreen = true;
|
||||||
|
"org/gnome/shell/extensions/caffeine".enable-mpris = true;
|
||||||
"org/gnome/shell/extensions/dash-to-panel".primary-monitor = 1;
|
"org/gnome/shell/extensions/dash-to-panel".primary-monitor = 1;
|
||||||
"org/gnome/shell/extensions/dash-to-panel".multi-monitors = false;
|
"org/gnome/shell/extensions/dash-to-panel".multi-monitors = false;
|
||||||
"org/gnome/shell/extensions/gsconnect".id = "4db35bd2-0dcd-42a3-9f77-ef3e8bb83182";
|
"org/gnome/shell/extensions/gsconnect".id = "4db35bd2-0dcd-42a3-9f77-ef3e8bb83182";
|
||||||
"org/gnome/shell/extensions/gsconnect".name = "matt-nixos";
|
"org/gnome/shell/extensions/gsconnect".name = "matt-nixos";
|
||||||
"org/gnome/shell/extensions/user-theme".name = lib.mkDefault "Colloid-Dark";
|
"org/gnome/shell/extensions/user-theme".name = lib.mkDefault "Colloid-Dark";
|
||||||
|
"org/gnome/system/location".enabled = true;
|
||||||
"org/gtk/settings/file-chooser".clock-format = "12h";
|
"org/gtk/settings/file-chooser".clock-format = "12h";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{ lib, ... }:
|
{ lib, namespace, ... }:
|
||||||
with lib;
|
with lib;
|
||||||
{
|
{
|
||||||
options.mjallen.desktop.gnome = {
|
options.${namespace}.desktop.gnome = {
|
||||||
enable = mkEnableOption "enable gnome settings";
|
enable = mkEnableOption "enable gnome settings";
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,191 +0,0 @@
|
|||||||
{ config, lib, ... }:
|
|
||||||
with lib;
|
|
||||||
let
|
|
||||||
cfg = config.mjallen.theme;
|
|
||||||
|
|
||||||
mkPalettePath = name: lib.snowfall.fs.get-file "modules/home/desktop/theme/palettes/${name}.nix";
|
|
||||||
|
|
||||||
cap =
|
|
||||||
s:
|
|
||||||
let
|
|
||||||
len = builtins.stringLength s;
|
|
||||||
in
|
|
||||||
(lib.toUpper (builtins.substring 0 1 s)) + (builtins.substring 1 (len - 1) s);
|
|
||||||
in
|
|
||||||
{
|
|
||||||
options.mjallen.theme = {
|
|
||||||
name = mkOption {
|
|
||||||
type = types.enum [
|
|
||||||
"nord"
|
|
||||||
"dracula"
|
|
||||||
"everforest"
|
|
||||||
];
|
|
||||||
default = "nord";
|
|
||||||
description = "Global theme palette name.";
|
|
||||||
};
|
|
||||||
|
|
||||||
# This is the palette file other modules should import.
|
|
||||||
# It exports a normalized schema with colors, tokens, and compat maps.
|
|
||||||
paletteFile = mkOption {
|
|
||||||
type = types.path;
|
|
||||||
default = mkPalettePath "nord";
|
|
||||||
description = "Path to a palette nix file exporting a normalized schema (and compat maps).";
|
|
||||||
};
|
|
||||||
|
|
||||||
# Exposed tokens (derived from paletteFile)
|
|
||||||
tokens = mkOption {
|
|
||||||
type = types.attrs;
|
|
||||||
default = { };
|
|
||||||
description = "Derived tokens from the selected palette (set automatically).";
|
|
||||||
};
|
|
||||||
|
|
||||||
# Expose the imported palette (actual colors + compat groups)
|
|
||||||
palette = mkOption {
|
|
||||||
type = types.attrs;
|
|
||||||
default = { };
|
|
||||||
description = "Imported palette attrset from the selected paletteFile (set automatically).";
|
|
||||||
};
|
|
||||||
|
|
||||||
gtk = {
|
|
||||||
enable = mkOption {
|
|
||||||
type = types.bool;
|
|
||||||
default = true;
|
|
||||||
description = "Manage GTK theme using global theme settings.";
|
|
||||||
};
|
|
||||||
|
|
||||||
# e.g. Colloid-Dark-Compact-*
|
|
||||||
color = mkOption {
|
|
||||||
type = types.enum [
|
|
||||||
"dark"
|
|
||||||
"light"
|
|
||||||
];
|
|
||||||
default = "dark";
|
|
||||||
description = "GTK color variant.";
|
|
||||||
};
|
|
||||||
|
|
||||||
size = mkOption {
|
|
||||||
type = types.enum [
|
|
||||||
"standard"
|
|
||||||
"compact"
|
|
||||||
];
|
|
||||||
default = "compact";
|
|
||||||
description = "GTK size variant.";
|
|
||||||
};
|
|
||||||
|
|
||||||
accent = mkOption {
|
|
||||||
type = types.enum [
|
|
||||||
"default"
|
|
||||||
"purple"
|
|
||||||
"pink"
|
|
||||||
"red"
|
|
||||||
"orange"
|
|
||||||
"yellow"
|
|
||||||
"green"
|
|
||||||
"teal"
|
|
||||||
"grey"
|
|
||||||
"all"
|
|
||||||
];
|
|
||||||
default = "all";
|
|
||||||
description = "GTK accent (Colloid themeVariants).";
|
|
||||||
};
|
|
||||||
|
|
||||||
tweak = mkOption {
|
|
||||||
type = types.enum [
|
|
||||||
"normal"
|
|
||||||
"rimless"
|
|
||||||
"float"
|
|
||||||
"black"
|
|
||||||
];
|
|
||||||
default = "normal";
|
|
||||||
description = "GTK tweak (Colloid tweaks).";
|
|
||||||
};
|
|
||||||
|
|
||||||
themeName = mkOption {
|
|
||||||
type = types.nullOr types.str;
|
|
||||||
default = null;
|
|
||||||
description = "Explicit GTK theme name override. If null, computed from color/size/accent.";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
icons = {
|
|
||||||
# Colloid icon scheme usually supports several named schemes. Default follows palette name.
|
|
||||||
scheme = mkOption {
|
|
||||||
type = types.enum [
|
|
||||||
"default"
|
|
||||||
"nord"
|
|
||||||
"dracula"
|
|
||||||
"gruvbox"
|
|
||||||
"everforest"
|
|
||||||
"catppuccin"
|
|
||||||
];
|
|
||||||
default = cfg.name;
|
|
||||||
description = "Icon scheme to use (Colloid schemeVariants).";
|
|
||||||
};
|
|
||||||
|
|
||||||
variant = mkOption {
|
|
||||||
type = types.enum [
|
|
||||||
"default"
|
|
||||||
"purple"
|
|
||||||
"pink"
|
|
||||||
"red"
|
|
||||||
"orange"
|
|
||||||
"yellow"
|
|
||||||
"green"
|
|
||||||
"teal"
|
|
||||||
"grey"
|
|
||||||
"all"
|
|
||||||
];
|
|
||||||
default = "all";
|
|
||||||
description = "Icon variant (Colloid colorVariants).";
|
|
||||||
};
|
|
||||||
|
|
||||||
themeName = mkOption {
|
|
||||||
type = types.nullOr types.str;
|
|
||||||
default = null;
|
|
||||||
description = "Explicit icon theme name override. If null, computed from scheme/variant.";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
# Wire derived defaults that depend on other options.
|
|
||||||
config = {
|
|
||||||
# Keep paletteFile following the chosen name unless user overrides it explicitly.
|
|
||||||
mjallen.theme.paletteFile = mkDefault (mkPalettePath cfg.name);
|
|
||||||
|
|
||||||
# Pull tokens directly from the palette file for convenience
|
|
||||||
mjallen.theme.tokens = mkDefault (
|
|
||||||
let
|
|
||||||
pal = import cfg.paletteFile;
|
|
||||||
in
|
|
||||||
pal.tokens or { }
|
|
||||||
);
|
|
||||||
|
|
||||||
# Expose the imported palette for convenience
|
|
||||||
mjallen.theme.palette = mkDefault (import cfg.paletteFile);
|
|
||||||
|
|
||||||
# Default per-program palette path (can still be overridden per program)
|
|
||||||
mjallen.programs.waybar.theme.file = mkDefault cfg.paletteFile;
|
|
||||||
mjallen.programs.kitty.theme.file = mkDefault cfg.paletteFile;
|
|
||||||
mjallen.programs.mako.theme.file = mkDefault cfg.paletteFile;
|
|
||||||
mjallen.programs.wofi.theme.file = mkDefault cfg.paletteFile;
|
|
||||||
mjallen.programs.btop.theme.file = mkDefault cfg.paletteFile;
|
|
||||||
mjallen.programs.nwg-dock.theme.file = mkDefault cfg.paletteFile;
|
|
||||||
mjallen.programs.nwg-drawer.theme.file = mkDefault cfg.paletteFile;
|
|
||||||
mjallen.programs.wlogout.theme.file = mkDefault cfg.paletteFile;
|
|
||||||
|
|
||||||
# Computed GTK/Icon theme names if not overridden
|
|
||||||
_module.args.mjallenThemeComputed = {
|
|
||||||
gtkTheme =
|
|
||||||
if cfg.gtk.themeName != null then
|
|
||||||
cfg.gtk.themeName
|
|
||||||
else
|
|
||||||
"Colloid-${cap cfg.gtk.color}-${cap cfg.gtk.size}";
|
|
||||||
|
|
||||||
iconTheme =
|
|
||||||
if cfg.icons.themeName != null then
|
|
||||||
cfg.icons.themeName
|
|
||||||
else
|
|
||||||
"Colloid-${cap cfg.icons.scheme}-${cap cfg.gtk.color}";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,62 +0,0 @@
|
|||||||
{
|
|
||||||
# Nord colors
|
|
||||||
# Opacity Hex alpha
|
|
||||||
# 100% FF
|
|
||||||
# 75% BF
|
|
||||||
# 50% 80
|
|
||||||
# 25% 40
|
|
||||||
# 10% 1A
|
|
||||||
# 0% 00
|
|
||||||
polarNight = {
|
|
||||||
nord0 = "#2e3440";
|
|
||||||
nord1 = "#3b4252";
|
|
||||||
nord2 = "#434c5e";
|
|
||||||
nord3 = "#4c566a";
|
|
||||||
};
|
|
||||||
snowStorm = {
|
|
||||||
nord4 = "#d8dee9";
|
|
||||||
nord5 = "#e5e9f0";
|
|
||||||
nord6 = "#eceff4";
|
|
||||||
};
|
|
||||||
frost = {
|
|
||||||
nord7 = "#8fbcbb";
|
|
||||||
nord8 = "#88c0d0";
|
|
||||||
nord9 = "#81a1c1";
|
|
||||||
nord10 = "#5e81ac";
|
|
||||||
};
|
|
||||||
aurora = {
|
|
||||||
nord11 = "#bf616a";
|
|
||||||
nord12 = "#d08770";
|
|
||||||
nord13 = "#ebcb8b";
|
|
||||||
nord14 = "#a3be8c";
|
|
||||||
nord15 = "#b48ead";
|
|
||||||
};
|
|
||||||
|
|
||||||
defaultOpacity = "opacity: 0.85;";
|
|
||||||
defaultBorderRadius = "border-radius: 1rem;";
|
|
||||||
defaultCenterOptions = ''
|
|
||||||
padding-top: 0.2rem;
|
|
||||||
padding-bottom: 0.2rem;
|
|
||||||
padding-left: 0.5rem;
|
|
||||||
padding-right: 0.5rem;
|
|
||||||
margin: 3px 0;
|
|
||||||
'';
|
|
||||||
borderRight = ''
|
|
||||||
padding-top: 0.2rem;
|
|
||||||
padding-bottom: 0.2rem;
|
|
||||||
padding-left: 0.5rem;
|
|
||||||
padding-right: 0.5rem;
|
|
||||||
margin: 3px 0;
|
|
||||||
border-radius: 0rem 1rem 1rem 0rem;
|
|
||||||
margin-right: 0.5rem;
|
|
||||||
'';
|
|
||||||
borderLeft = ''
|
|
||||||
padding-top: 0.2rem;
|
|
||||||
padding-bottom: 0.2rem;
|
|
||||||
padding-left: 0.5rem;
|
|
||||||
padding-right: 0.5rem;
|
|
||||||
margin: 3px 0;
|
|
||||||
border-radius: 1rem 0rem 0rem 1rem;
|
|
||||||
margin-left: 0.5rem;
|
|
||||||
'';
|
|
||||||
}
|
|
||||||
@@ -1,90 +0,0 @@
|
|||||||
rec {
|
|
||||||
# Normalized semantic colors (theme-agnostic) - Dracula
|
|
||||||
colors = {
|
|
||||||
bg = "#282a36";
|
|
||||||
bgAlt = "#343746";
|
|
||||||
surface = "#343746";
|
|
||||||
surfaceAlt = "#44475a";
|
|
||||||
border = "#44475a";
|
|
||||||
|
|
||||||
text = "#f8f8f2";
|
|
||||||
textMuted = "#e2e2dc";
|
|
||||||
|
|
||||||
primary = "#6272a4"; # dark blue
|
|
||||||
info = "#8be9fd"; # cyan
|
|
||||||
accent = "#bd93f9"; # purple
|
|
||||||
success = "#50fa7b"; # green
|
|
||||||
warning = "#f1fa8c"; # yellow
|
|
||||||
danger = "#ff5555"; # red
|
|
||||||
};
|
|
||||||
|
|
||||||
# Shared styling tokens for CSS consumers
|
|
||||||
tokens = {
|
|
||||||
opacity = "opacity: 0.90;";
|
|
||||||
borderRadius = "border-radius: 0.8rem;";
|
|
||||||
|
|
||||||
centerOptions = ''
|
|
||||||
padding-top: 0.25rem;
|
|
||||||
padding-bottom: 0.25rem;
|
|
||||||
padding-left: 0.5rem;
|
|
||||||
padding-right: 0.5rem;
|
|
||||||
margin: 3px 0;
|
|
||||||
'';
|
|
||||||
|
|
||||||
borderRight = ''
|
|
||||||
padding-top: 0.25rem;
|
|
||||||
padding-bottom: 0.25rem;
|
|
||||||
padding-left: 0.5rem;
|
|
||||||
padding-right: 0.5rem;
|
|
||||||
margin: 3px 0;
|
|
||||||
border-radius: 0rem 0.8rem 0.8rem 0rem;
|
|
||||||
margin-right: 0.5rem;
|
|
||||||
'';
|
|
||||||
|
|
||||||
borderLeft = ''
|
|
||||||
padding-top: 0.25rem;
|
|
||||||
padding-bottom: 0.25rem;
|
|
||||||
padding-left: 0.5rem;
|
|
||||||
padding-right: 0.5rem;
|
|
||||||
margin: 3px 0;
|
|
||||||
border-radius: 0.8rem 0rem 0rem 0.8rem;
|
|
||||||
margin-left: 0.5rem;
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
# Legacy token aliases for back-compat
|
|
||||||
defaultOpacity = tokens.opacity;
|
|
||||||
defaultBorderRadius = tokens.borderRadius;
|
|
||||||
defaultCenterOptions = tokens.centerOptions;
|
|
||||||
borderRight = tokens.borderRight;
|
|
||||||
borderLeft = tokens.borderLeft;
|
|
||||||
|
|
||||||
# Back-compat: Nord-shaped groups for existing modules (approximate mappings)
|
|
||||||
polarNight = {
|
|
||||||
nord0 = "#282a36";
|
|
||||||
nord1 = "#343746";
|
|
||||||
nord2 = "#3b3e4a";
|
|
||||||
nord3 = "#44475a";
|
|
||||||
};
|
|
||||||
|
|
||||||
snowStorm = {
|
|
||||||
nord4 = "#e2e2dc";
|
|
||||||
nord5 = "#f1f1ea";
|
|
||||||
nord6 = "#f8f8f2";
|
|
||||||
};
|
|
||||||
|
|
||||||
frost = {
|
|
||||||
nord7 = "#50fa7b"; # using green as one of the frost group
|
|
||||||
nord8 = "#8be9fd"; # cyan
|
|
||||||
nord9 = "#6272a4"; # blue
|
|
||||||
nord10 = "#bd93f9"; # purple (as highlight)
|
|
||||||
};
|
|
||||||
|
|
||||||
aurora = {
|
|
||||||
nord11 = "#ff5555"; # red
|
|
||||||
nord12 = "#ffb86c"; # orange
|
|
||||||
nord13 = "#f1fa8c"; # yellow
|
|
||||||
nord14 = "#50fa7b"; # green
|
|
||||||
nord15 = "#bd93f9"; # magenta/purple
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,90 +0,0 @@
|
|||||||
rec {
|
|
||||||
# Normalized semantic colors (Everforest - Dark)
|
|
||||||
colors = {
|
|
||||||
bg = "#2b3339";
|
|
||||||
bgAlt = "#323c41";
|
|
||||||
surface = "#323c41";
|
|
||||||
surfaceAlt = "#3a444a";
|
|
||||||
border = "#414b51";
|
|
||||||
|
|
||||||
text = "#d3c6aa";
|
|
||||||
textMuted = "#9da9a0";
|
|
||||||
|
|
||||||
primary = "#7fbbb3"; # blue/aqua
|
|
||||||
info = "#83c092"; # teal
|
|
||||||
accent = "#d699b6"; # magenta
|
|
||||||
success = "#a7c080"; # green
|
|
||||||
warning = "#dbbc7f"; # yellow
|
|
||||||
danger = "#e67e80"; # red
|
|
||||||
};
|
|
||||||
|
|
||||||
# Shared styling tokens for CSS consumers
|
|
||||||
tokens = {
|
|
||||||
opacity = "opacity: 0.85;";
|
|
||||||
borderRadius = "border-radius: 1rem;";
|
|
||||||
|
|
||||||
centerOptions = ''
|
|
||||||
padding-top: 0.2rem;
|
|
||||||
padding-bottom: 0.2rem;
|
|
||||||
padding-left: 0.5rem;
|
|
||||||
padding-right: 0.5rem;
|
|
||||||
margin: 3px 0;
|
|
||||||
'';
|
|
||||||
|
|
||||||
borderRight = ''
|
|
||||||
padding-top: 0.2rem;
|
|
||||||
padding-bottom: 0.2rem;
|
|
||||||
padding-left: 0.5rem;
|
|
||||||
padding-right: 0.5rem;
|
|
||||||
margin: 3px 0;
|
|
||||||
border-radius: 0rem 1rem 1rem 0rem;
|
|
||||||
margin-right: 0.5rem;
|
|
||||||
'';
|
|
||||||
|
|
||||||
borderLeft = ''
|
|
||||||
padding-top: 0.2rem;
|
|
||||||
padding-bottom: 0.2rem;
|
|
||||||
padding-left: 0.5rem;
|
|
||||||
padding-right: 0.5rem;
|
|
||||||
margin: 3px 0;
|
|
||||||
border-radius: 1rem 0rem 0rem 1rem;
|
|
||||||
margin-left: 0.5rem;
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
# Legacy token aliases for back-compat
|
|
||||||
defaultOpacity = tokens.opacity;
|
|
||||||
defaultBorderRadius = tokens.borderRadius;
|
|
||||||
defaultCenterOptions = tokens.centerOptions;
|
|
||||||
borderRight = tokens.borderRight;
|
|
||||||
borderLeft = tokens.borderLeft;
|
|
||||||
|
|
||||||
# Back-compat: Nord-shaped groups for existing modules (approximate mappings)
|
|
||||||
polarNight = {
|
|
||||||
nord0 = "#2b3339";
|
|
||||||
nord1 = "#323c41";
|
|
||||||
nord2 = "#3a444a";
|
|
||||||
nord3 = "#414b51";
|
|
||||||
};
|
|
||||||
|
|
||||||
snowStorm = {
|
|
||||||
nord4 = "#c6d0b5";
|
|
||||||
nord5 = "#e0dcc7";
|
|
||||||
nord6 = "#d3c6aa";
|
|
||||||
};
|
|
||||||
|
|
||||||
frost = {
|
|
||||||
nord7 = "#a7c080"; # green
|
|
||||||
nord8 = "#83c092"; # teal
|
|
||||||
nord9 = "#7fbbb3"; # aqua/blue
|
|
||||||
nord10 = "#7fbbb3"; # reuse
|
|
||||||
};
|
|
||||||
|
|
||||||
aurora = {
|
|
||||||
nord11 = "#e67e80"; # red
|
|
||||||
nord12 = "#e69875"; # orange
|
|
||||||
nord13 = "#dbbc7f"; # yellow
|
|
||||||
nord14 = "#a7c080"; # green
|
|
||||||
nord15 = "#d699b6"; # magenta
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,90 +0,0 @@
|
|||||||
rec {
|
|
||||||
# Normalized semantic colors (theme-agnostic)
|
|
||||||
colors = {
|
|
||||||
bg = "#2e3440";
|
|
||||||
bgAlt = "#3b4252";
|
|
||||||
surface = "#3b4252";
|
|
||||||
surfaceAlt = "#434c5e";
|
|
||||||
border = "#4c566a";
|
|
||||||
|
|
||||||
text = "#eceff4";
|
|
||||||
textMuted = "#e5e9f0";
|
|
||||||
|
|
||||||
primary = "#5e81ac"; # blue
|
|
||||||
info = "#88c0d0"; # cyan/teal
|
|
||||||
accent = "#b48ead"; # purple
|
|
||||||
success = "#a3be8c"; # green
|
|
||||||
warning = "#ebcb8b"; # yellow
|
|
||||||
danger = "#bf616a"; # red
|
|
||||||
};
|
|
||||||
|
|
||||||
# Shared styling tokens for CSS consumers
|
|
||||||
tokens = {
|
|
||||||
opacity = "opacity: 0.85;";
|
|
||||||
borderRadius = "border-radius: 1rem;";
|
|
||||||
|
|
||||||
centerOptions = ''
|
|
||||||
padding-top: 0.2rem;
|
|
||||||
padding-bottom: 0.2rem;
|
|
||||||
padding-left: 0.5rem;
|
|
||||||
padding-right: 0.5rem;
|
|
||||||
margin: 3px 0;
|
|
||||||
'';
|
|
||||||
|
|
||||||
borderRight = ''
|
|
||||||
padding-top: 0.2rem;
|
|
||||||
padding-bottom: 0.2rem;
|
|
||||||
padding-left: 0.5rem;
|
|
||||||
padding-right: 0.5rem;
|
|
||||||
margin: 3px 0;
|
|
||||||
border-radius: 0rem 1rem 1rem 0rem;
|
|
||||||
margin-right: 0.5rem;
|
|
||||||
'';
|
|
||||||
|
|
||||||
borderLeft = ''
|
|
||||||
padding-top: 0.2rem;
|
|
||||||
padding-bottom: 0.2rem;
|
|
||||||
padding-left: 0.5rem;
|
|
||||||
padding-right: 0.5rem;
|
|
||||||
margin: 3px 0;
|
|
||||||
border-radius: 1rem 0rem 0rem 1rem;
|
|
||||||
margin-left: 0.5rem;
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
# Legacy token aliases for back-compat
|
|
||||||
defaultOpacity = tokens.opacity;
|
|
||||||
defaultBorderRadius = tokens.borderRadius;
|
|
||||||
defaultCenterOptions = tokens.centerOptions;
|
|
||||||
borderRight = tokens.borderRight;
|
|
||||||
borderLeft = tokens.borderLeft;
|
|
||||||
|
|
||||||
# Back-compat: Nord-shaped groups for existing modules
|
|
||||||
polarNight = {
|
|
||||||
nord0 = "#2e3440";
|
|
||||||
nord1 = "#3b4252";
|
|
||||||
nord2 = "#434c5e";
|
|
||||||
nord3 = "#4c566a";
|
|
||||||
};
|
|
||||||
|
|
||||||
snowStorm = {
|
|
||||||
nord4 = "#d8dee9";
|
|
||||||
nord5 = "#e5e9f0";
|
|
||||||
nord6 = "#eceff4";
|
|
||||||
};
|
|
||||||
|
|
||||||
frost = {
|
|
||||||
nord7 = "#8fbcbb";
|
|
||||||
nord8 = "#88c0d0";
|
|
||||||
nord9 = "#81a1c1";
|
|
||||||
nord10 = "#5e81ac";
|
|
||||||
};
|
|
||||||
|
|
||||||
aurora = {
|
|
||||||
nord11 = "#bf616a";
|
|
||||||
nord12 = "#d08770";
|
|
||||||
nord13 = "#ebcb8b";
|
|
||||||
nord14 = "#a3be8c";
|
|
||||||
nord15 = "#b48ead";
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -2,9 +2,13 @@
|
|||||||
config,
|
config,
|
||||||
lib,
|
lib,
|
||||||
pkgs,
|
pkgs,
|
||||||
|
namespace,
|
||||||
hasDestopEnvironment ? true,
|
hasDestopEnvironment ? true,
|
||||||
...
|
...
|
||||||
}:
|
}:
|
||||||
|
let
|
||||||
|
inherit (lib.${namespace}) enabled;
|
||||||
|
in
|
||||||
{
|
{
|
||||||
home = {
|
home = {
|
||||||
enableNixpkgsReleaseCheck = lib.mkDefault false;
|
enableNixpkgsReleaseCheck = lib.mkDefault false;
|
||||||
@@ -15,10 +19,12 @@
|
|||||||
age
|
age
|
||||||
clinfo
|
clinfo
|
||||||
cpufetch
|
cpufetch
|
||||||
|
dbus
|
||||||
deadnix
|
deadnix
|
||||||
lm_sensors
|
lm_sensors
|
||||||
nano
|
nano
|
||||||
nixfmt-rfc-style
|
nix-prefetch-scripts
|
||||||
|
nixfmt
|
||||||
pciutils
|
pciutils
|
||||||
protonup-ng
|
protonup-ng
|
||||||
rsync
|
rsync
|
||||||
@@ -34,14 +40,17 @@
|
|||||||
++ (
|
++ (
|
||||||
if hasDestopEnvironment then
|
if hasDestopEnvironment then
|
||||||
[
|
[
|
||||||
chromium
|
boxbuddy
|
||||||
|
stable.chromium
|
||||||
firefox
|
firefox
|
||||||
gamescope
|
gamescope
|
||||||
gamescope-wsi
|
gamescope-wsi
|
||||||
gparted
|
gparted
|
||||||
goverlay
|
pkgs.unstable.goverlay
|
||||||
mission-center
|
mission-center
|
||||||
|
parted
|
||||||
vesktop
|
vesktop
|
||||||
|
# winboat
|
||||||
]
|
]
|
||||||
else
|
else
|
||||||
[ ]
|
[ ]
|
||||||
@@ -51,15 +60,18 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
programs = {
|
programs = {
|
||||||
nix-index-database.comma.enable = true;
|
nix-index-database.comma = enabled;
|
||||||
btop.enable = lib.mkDefault true;
|
btop = {
|
||||||
fastfetch.enable = lib.mkDefault true;
|
enable = lib.mkDefault true;
|
||||||
home-manager.enable = lib.mkDefault true;
|
package = pkgs.unstable.btop;
|
||||||
|
};
|
||||||
|
fastfetch = lib.mkDefault enabled;
|
||||||
|
home-manager = lib.mkDefault enabled;
|
||||||
java = {
|
java = {
|
||||||
enable = lib.mkDefault true;
|
enable = lib.mkDefault true;
|
||||||
};
|
};
|
||||||
mangohud.enable = lib.mkDefault hasDestopEnvironment;
|
mangohud.enable = lib.mkDefault hasDestopEnvironment;
|
||||||
password-store.enable = true;
|
password-store = enabled;
|
||||||
nh = {
|
nh = {
|
||||||
enable = true;
|
enable = true;
|
||||||
flake = "/etc/nixos";
|
flake = "/etc/nixos";
|
||||||
@@ -121,11 +133,12 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
services = {
|
services = {
|
||||||
nextcloud-client.enable = lib.mkDefault hasDestopEnvironment;
|
nextcloud-client.enable = false; # lib.mkDefault hasDestopEnvironment;
|
||||||
pass-secret-service.enable = lib.mkDefault true;
|
pass-secret-service = lib.mkDefault enabled;
|
||||||
kdeconnect = {
|
kdeconnect = {
|
||||||
enable = lib.mkDefault hasDestopEnvironment;
|
enable = lib.mkDefault hasDestopEnvironment;
|
||||||
indicator = lib.mkDefault true;
|
indicator = lib.mkDefault hasDestopEnvironment;
|
||||||
|
package = pkgs.kdePackages.kdeconnect-kde;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,12 @@
|
|||||||
{ config, lib, ... }:
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
namespace,
|
||||||
|
...
|
||||||
|
}:
|
||||||
with lib;
|
with lib;
|
||||||
let
|
let
|
||||||
cfg = config.mjallen.programs.btop;
|
cfg = config.${namespace}.programs.btop;
|
||||||
palette = import cfg.theme.file;
|
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
imports = [ ./options.nix ];
|
imports = [ ./options.nix ];
|
||||||
@@ -10,8 +14,6 @@ in
|
|||||||
programs.btop = {
|
programs.btop = {
|
||||||
enable = true;
|
enable = true;
|
||||||
settings = {
|
settings = {
|
||||||
color_theme = "global";
|
|
||||||
theme_background = true;
|
|
||||||
truecolor = true;
|
truecolor = true;
|
||||||
force_tty = false;
|
force_tty = false;
|
||||||
presets = "cpu:1:default,proc:0:default cpu:0:default,mem:0:default,net:0:default cpu:0:block,net:0:tty";
|
presets = "cpu:1:default,proc:0:default cpu:0:default,mem:0:default,net:0:default cpu:0:block,net:0:tty";
|
||||||
@@ -75,52 +77,6 @@ in
|
|||||||
selected_battery = "Auto";
|
selected_battery = "Auto";
|
||||||
log_level = "WARNING";
|
log_level = "WARNING";
|
||||||
};
|
};
|
||||||
themes = {
|
|
||||||
global = ''
|
|
||||||
theme[main_bg]="${palette.colors.bg}"
|
|
||||||
theme[main_fg]="${palette.colors.text}"
|
|
||||||
theme[title]="${palette.colors.text}"
|
|
||||||
theme[hi_fg]="${palette.colors.info}"
|
|
||||||
theme[selected_bg]="${palette.colors.bgAlt}"
|
|
||||||
theme[selected_fg]="${palette.colors.info}"
|
|
||||||
theme[inactive_fg]="${palette.colors.surfaceAlt}"
|
|
||||||
theme[graph_text]="${palette.colors.text}"
|
|
||||||
theme[meter_bg]="${palette.colors.bgAlt}"
|
|
||||||
theme[proc_misc]="${palette.colors.text}"
|
|
||||||
theme[cpu_box]="${palette.colors.accent}"
|
|
||||||
theme[mem_box]="${palette.colors.success}"
|
|
||||||
theme[net_box]="${palette.colors.warning}"
|
|
||||||
theme[proc_box]="${palette.colors.danger}"
|
|
||||||
theme[div_line]="${palette.colors.bgAlt}"
|
|
||||||
theme[temp_start]="${palette.colors.success}"
|
|
||||||
theme[temp_mid]="${palette.colors.warning}"
|
|
||||||
theme[temp_end]="${palette.colors.danger}"
|
|
||||||
theme[cpu_start]="${palette.colors.accent}"
|
|
||||||
theme[cpu_mid]="${palette.colors.warning}"
|
|
||||||
theme[cpu_end]="${palette.colors.danger}"
|
|
||||||
theme[free_start]="${palette.colors.success}"
|
|
||||||
theme[free_mid]="${palette.colors.warning}"
|
|
||||||
theme[free_end]="${palette.colors.warning}"
|
|
||||||
theme[cached_start]="${palette.colors.success}"
|
|
||||||
theme[cached_mid]="${palette.colors.warning}"
|
|
||||||
theme[cached_end]="${palette.colors.warning}"
|
|
||||||
theme[available_start]="${palette.colors.text}"
|
|
||||||
theme[available_mid]="${palette.colors.danger}"
|
|
||||||
theme[available_end]="${palette.colors.danger}"
|
|
||||||
theme[used_start]="${palette.colors.success}"
|
|
||||||
theme[used_mid]="${palette.colors.warning}"
|
|
||||||
theme[used_end]="${palette.colors.danger}"
|
|
||||||
theme[download_start]="${palette.colors.info}"
|
|
||||||
theme[download_mid]="${palette.colors.info}"
|
|
||||||
theme[download_end]="${palette.colors.warning}"
|
|
||||||
theme[upload_start]="${palette.colors.info}"
|
|
||||||
theme[upload_mid]="${palette.colors.info}"
|
|
||||||
theme[upload_end]="${palette.colors.warning}"
|
|
||||||
theme[process_start]="${palette.colors.accent}"
|
|
||||||
theme[process_mid]="${palette.colors.warning}"
|
|
||||||
theme[process_end]="${palette.colors.danger}"
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,21 +1,7 @@
|
|||||||
{ lib, ... }:
|
{ lib, namespace, ... }:
|
||||||
with lib;
|
with lib;
|
||||||
{
|
{
|
||||||
options.mjallen.programs.btop = {
|
options.${namespace}.programs.btop = {
|
||||||
enable = mkEnableOption "enable btop";
|
enable = mkEnableOption "enable btop";
|
||||||
|
|
||||||
theme = mkOption {
|
|
||||||
type = types.submodule {
|
|
||||||
options = {
|
|
||||||
file = mkOption {
|
|
||||||
type = types.path;
|
|
||||||
default = lib.snowfall.fs.get-file "modules/home/desktop/theme/palettes/nord.nix";
|
|
||||||
description = "Nix file exporting a palette attrset.";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
default = { };
|
|
||||||
description = "btop theme palette configuration.";
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -154,8 +154,8 @@ in
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
direnv = {
|
direnv = {
|
||||||
enable = false;
|
enable = true;
|
||||||
nix-direnv.enable = false;
|
nix-direnv.enable = true;
|
||||||
enableZshIntegration = true;
|
enableZshIntegration = true;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
25
modules/home/programs/hyprland/avizo.nix
Normal file
25
modules/home/programs/hyprland/avizo.nix
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
namespace,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
cfg = config.${namespace}.programs.hyprland;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
services.avizo = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
default = {
|
||||||
|
time = 1.0;
|
||||||
|
y-offset = 0.5;
|
||||||
|
fade-in = 0.1;
|
||||||
|
fade-out = 0.2;
|
||||||
|
padding = 10;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -2,17 +2,18 @@
|
|||||||
config,
|
config,
|
||||||
lib,
|
lib,
|
||||||
pkgs,
|
pkgs,
|
||||||
|
namespace,
|
||||||
...
|
...
|
||||||
}:
|
}:
|
||||||
with lib;
|
with lib;
|
||||||
let
|
let
|
||||||
cfg = config.mjallen.programs.hyprland;
|
cfg = config.${namespace}.programs.hyprland;
|
||||||
drawer = "nwg-drawer -fm nautilus -term kitty -mb 10 -mt 10 -ml 10 -mr 10 -pbuseicontheme -i ${config.gtk.iconTheme.name}";
|
drawer = "nwg-drawer -fm nautilus -term kitty -mb 10 -mt 10 -ml 10 -mr 10 -pbuseicontheme -i ${config.stylix.icons.dark}";
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
|
./avizo.nix
|
||||||
./options.nix
|
./options.nix
|
||||||
./theme.nix
|
|
||||||
];
|
];
|
||||||
|
|
||||||
config = mkIf cfg.enable {
|
config = mkIf cfg.enable {
|
||||||
@@ -63,14 +64,13 @@ in
|
|||||||
wl-clipboard
|
wl-clipboard
|
||||||
wlogout
|
wlogout
|
||||||
wlroots
|
wlroots
|
||||||
xorg.xhost
|
xhost
|
||||||
xsettingsd
|
xsettingsd
|
||||||
xwayland
|
xwayland
|
||||||
|
|
||||||
pkgs.mjallen.pipewire-python
|
|
||||||
]
|
]
|
||||||
++ (if cfg.notificationDaemon == "mako" then [ mako ] else [ dunst ])
|
++ (if cfg.notificationDaemon == "mako" then [ mako ] else [ dunst ])
|
||||||
++ (if cfg.launcher == "wofi" then [ wofi ] else [ rofi ])
|
++ (if cfg.launcher == "wofi" then [ wofi ] else [ rofi ])
|
||||||
|
++ (with pkgs.${namespace}; [ pipewire-python ])
|
||||||
);
|
);
|
||||||
|
|
||||||
# Session variables
|
# Session variables
|
||||||
@@ -83,20 +83,20 @@ in
|
|||||||
GTK_CSD = "0";
|
GTK_CSD = "0";
|
||||||
GTK_THEME = config.gtk.theme.name;
|
GTK_THEME = config.gtk.theme.name;
|
||||||
GTK_USE_PORTAL = "1";
|
GTK_USE_PORTAL = "1";
|
||||||
HYPRCURSOR_THEME = config.home.pointerCursor.name;
|
HYPRCURSOR_THEME = config.stylix.cursor.name;
|
||||||
HYPRCURSOR_SIZE = config.home.pointerCursor.size;
|
HYPRCURSOR_SIZE = config.stylix.cursor.size;
|
||||||
MOZ_ENABLE_WAYLAND = "1";
|
MOZ_ENABLE_WAYLAND = "1";
|
||||||
NIXOS_OZONE_WL = "1";
|
NIXOS_OZONE_WL = "1";
|
||||||
NIXOS_XDG_OPEN_USE_PORTAL = "1";
|
NIXOS_XDG_OPEN_USE_PORTAL = "1";
|
||||||
QT_AUTO_SCREEN_SCALE_FACTOR = "1";
|
QT_AUTO_SCREEN_SCALE_FACTOR = "1";
|
||||||
QT_QPA_PLATFORM = "wayland-egl";
|
QT_QPA_PLATFORM = "wayland-egl";
|
||||||
QT_QPA_PLATFORMTHEME = "gtk3";
|
QT_QPA_PLATFORMTHEME = lib.mkDefault "gtk3";
|
||||||
QT_SCALE_FACTOR = "1";
|
QT_SCALE_FACTOR = "1";
|
||||||
QT_WAYLAND_DISABLE_WINDOWDECORATION = "1";
|
QT_WAYLAND_DISABLE_WINDOWDECORATION = "1";
|
||||||
SDL_VIDEODRIVER = "wayland";
|
SDL_VIDEODRIVER = "wayland";
|
||||||
TERMINAL = "${cfg.defaultApps.terminal.pname}";
|
TERMINAL = "${cfg.defaultApps.terminal.pname}";
|
||||||
XCURSOR_THEME = config.home.pointerCursor.name;
|
XCURSOR_THEME = config.stylix.cursor.name;
|
||||||
XCURSOR_SIZE = config.home.pointerCursor.size;
|
XCURSOR_SIZE = config.stylix.cursor.size;
|
||||||
XDG_CACHE_HOME = "\${HOME}/.cache";
|
XDG_CACHE_HOME = "\${HOME}/.cache";
|
||||||
XDG_CONFIG_HOME = "\${HOME}/.config";
|
XDG_CONFIG_HOME = "\${HOME}/.config";
|
||||||
XDG_CURRENT_DESKTOP = "Hyprland";
|
XDG_CURRENT_DESKTOP = "Hyprland";
|
||||||
@@ -112,22 +112,12 @@ in
|
|||||||
enable = true;
|
enable = true;
|
||||||
settings = {
|
settings = {
|
||||||
preload = [ cfg.hyprpaper.wallpaperPath ];
|
preload = [ cfg.hyprpaper.wallpaperPath ];
|
||||||
wallpaper =
|
wallpaper = [
|
||||||
let
|
{
|
||||||
useMonitorV2 = (lib.versionAtLeast pkgs.hyprland.version "0.40.0") && (cfg.monitorv2 != [ ]);
|
monitor = "";
|
||||||
names =
|
path = cfg.hyprpaper.wallpaperPath;
|
||||||
if useMonitorV2 then
|
}
|
||||||
map (m: m.name) cfg.monitorv2
|
];
|
||||||
else
|
|
||||||
[
|
|
||||||
cfg.display1.input
|
|
||||||
cfg.display2.input
|
|
||||||
];
|
|
||||||
in
|
|
||||||
if cfg.hyprpaper.usePerMonitor then
|
|
||||||
map (n: "${n}, ${cfg.hyprpaper.wallpaperPath}") names
|
|
||||||
else
|
|
||||||
[ ", ${cfg.hyprpaper.wallpaperPath}" ];
|
|
||||||
splash = false;
|
splash = false;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@@ -172,18 +162,18 @@ in
|
|||||||
hyprlock = {
|
hyprlock = {
|
||||||
enable = true;
|
enable = true;
|
||||||
settings = {
|
settings = {
|
||||||
background = [
|
background = mkForce [
|
||||||
{
|
{
|
||||||
monitor = "";
|
monitor = "";
|
||||||
path = "/run/wallpaper.jpg"; # supports png, jpg, webp (no animations, though)
|
path = "/run/wallpaper.jpg"; # supports png, jpg, webp (no animations, though)
|
||||||
color = "rgba(25, 20, 20, 1.0)";
|
color = mkDefault "rgba(25, 20, 20, 1.0";
|
||||||
|
|
||||||
# all these options are taken from hyprland, see https://wiki.hyprland.org/Configuring/Variables/#blur for explanations
|
# all these options are taken from hyprland, see https://wiki.hyprland.org/Configuring/Variables/#blur for explanations
|
||||||
blur_passes = "3"; # 0 disables blurring
|
blur_passes = mkDefault "3"; # 0 disables blurring
|
||||||
blur_size = "7";
|
blur_size = mkDefault "7";
|
||||||
noise = "0.0117";
|
noise = "0.0117";
|
||||||
contrast = "0.8916";
|
contrast = "0.8916";
|
||||||
brightness = "0.8172";
|
brightness = mkDefault "0.8172";
|
||||||
vibrancy = "0.1696";
|
vibrancy = "0.1696";
|
||||||
vibrancy_darkness = "0.0";
|
vibrancy_darkness = "0.0";
|
||||||
}
|
}
|
||||||
@@ -193,9 +183,9 @@ in
|
|||||||
{
|
{
|
||||||
monitor = cfg.primaryDisplay;
|
monitor = cfg.primaryDisplay;
|
||||||
text = "cmd[update:1000] echo -e \"$(LC_TIME=en_US.UTF-8 date +\"%A, %B %d\")\"";
|
text = "cmd[update:1000] echo -e \"$(LC_TIME=en_US.UTF-8 date +\"%A, %B %d\")\"";
|
||||||
color = "#eceff4";
|
color = config.lib.stylix.colors.base06;
|
||||||
font_size = "25";
|
font_size = "25";
|
||||||
font_family = "JetBrainsMono NFM";
|
font_family = lib.mkDefault config.stylix.fonts.monospace.name;
|
||||||
position = "0, 350";
|
position = "0, 350";
|
||||||
halign = "center";
|
halign = "center";
|
||||||
valign = "center";
|
valign = "center";
|
||||||
@@ -204,9 +194,9 @@ in
|
|||||||
{
|
{
|
||||||
monitor = cfg.primaryDisplay;
|
monitor = cfg.primaryDisplay;
|
||||||
text = "cmd[update:1000] echo \"<span>$(date +\"%I:%M\")</span>\"";
|
text = "cmd[update:1000] echo \"<span>$(date +\"%I:%M\")</span>\"";
|
||||||
color = "#eceff4";
|
color = config.lib.stylix.colors.base06;
|
||||||
font_size = "120";
|
font_size = "120";
|
||||||
font_family = "JetBrainsMono NFM Bold";
|
font_family = lib.mkDefault "${config.stylix.fonts.monospace.name} Bold";
|
||||||
position = "0, 230";
|
position = "0, 230";
|
||||||
halign = "center";
|
halign = "center";
|
||||||
valign = "center";
|
valign = "center";
|
||||||
@@ -214,35 +204,35 @@ in
|
|||||||
{
|
{
|
||||||
monitor = cfg.primaryDisplay;
|
monitor = cfg.primaryDisplay;
|
||||||
text = "$USER";
|
text = "$USER";
|
||||||
color = "#eceff4";
|
color = config.lib.stylix.colors.base06;
|
||||||
outline_thickness = 2;
|
outline_thickness = 2;
|
||||||
dots_size = 0.2;
|
dots_size = 0.2;
|
||||||
dots_spacing = 0.2;
|
dots_spacing = 0.2;
|
||||||
dots_center = true;
|
dots_center = true;
|
||||||
font_size = 18;
|
font_size = 18;
|
||||||
font_family = "JetBrainsMono NFM Bold";
|
font_family = lib.mkDefault "${config.stylix.fonts.monospace.name} Bold";
|
||||||
position = "0, 0";
|
position = "0, 0";
|
||||||
halign = "center";
|
halign = "center";
|
||||||
valign = "center";
|
valign = "center";
|
||||||
}
|
}
|
||||||
# weather
|
# weather
|
||||||
{
|
{
|
||||||
monitor = cfg.primaryDisplay;
|
monitor = cfg.primaryDisplay;
|
||||||
text = "cmd[update:30000] waybar-weather --hyprlock";
|
text = "cmd[update:30000] waybar-weather --hyprlock";
|
||||||
color = "#eceff4";
|
color = config.lib.stylix.colors.base06;
|
||||||
font_size = "25";
|
font_size = "25";
|
||||||
font_family = "JetBrainsMono NFM";
|
font_family = lib.mkDefault config.stylix.fonts.monospace.name;
|
||||||
position = "-100, 100";
|
position = "-100, 100";
|
||||||
halign = "right";
|
halign = "right";
|
||||||
valign = "bottom";
|
valign = "bottom";
|
||||||
}
|
}
|
||||||
# media
|
# media
|
||||||
{
|
{
|
||||||
monitor = cfg.primaryDisplay;
|
monitor = cfg.primaryDisplay;
|
||||||
text = "cmd[update:1000] waybar-media";
|
text = "cmd[update:1000] waybar-media";
|
||||||
color = "#eceff4";
|
color = config.lib.stylix.colors.base06;
|
||||||
font_size = "15";
|
font_size = "15";
|
||||||
font_family = "JetBrainsMono NFM";
|
font_family = lib.mkDefault config.stylix.fonts.monospace.name;
|
||||||
position = "100, 100";
|
position = "100, 100";
|
||||||
halign = "left";
|
halign = "left";
|
||||||
valign = "bottom";
|
valign = "bottom";
|
||||||
@@ -251,9 +241,9 @@ in
|
|||||||
# user box
|
# user box
|
||||||
shape = [
|
shape = [
|
||||||
{
|
{
|
||||||
monitor = "";
|
monitor = cfg.primaryDisplay;
|
||||||
size = "200, 50";
|
size = "200, 50";
|
||||||
color = "rgba(46, 52, 64, .25)";
|
color = "rgba(46, 52, 64, .25";
|
||||||
rounding = -1;
|
rounding = -1;
|
||||||
border_size = "0";
|
border_size = "0";
|
||||||
position = "0, 0";
|
position = "0, 0";
|
||||||
@@ -265,16 +255,16 @@ in
|
|||||||
{
|
{
|
||||||
size = "200, 50";
|
size = "200, 50";
|
||||||
position = "0, -80";
|
position = "0, -80";
|
||||||
font_family = "JetBrainsMono NFM";
|
font_family = lib.mkDefault config.stylix.fonts.monospace.name;
|
||||||
monitor = cfg.primaryDisplay;
|
monitor = cfg.primaryDisplay;
|
||||||
dots_center = true;
|
dots_center = true;
|
||||||
fade_on_empty = true;
|
fade_on_empty = true;
|
||||||
font_color = "#eceff4";
|
font_color = config.lib.stylix.colors.base06;
|
||||||
inner_color = "#4c566a";
|
inner_color = config.lib.stylix.colors.base03;
|
||||||
outer_color = "#2e3440";
|
outer_color = config.lib.stylix.colors.base00;
|
||||||
bothlock_color = -1;
|
bothlock_color = -1;
|
||||||
outline_thickness = 5;
|
outline_thickness = 5;
|
||||||
placeholder_text = ''<span foreground="##2e3440">Password...</span>'';
|
placeholder_text = ''<span foreground="#${config.lib.stylix.colors.base00}">Password...</span>'';
|
||||||
shadow_passes = 2;
|
shadow_passes = 2;
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
@@ -420,23 +410,20 @@ in
|
|||||||
++ cfg.keybinds.bindm;
|
++ cfg.keybinds.bindm;
|
||||||
|
|
||||||
bindel = [
|
bindel = [
|
||||||
", XF86AudioRaiseVolume, exec, wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 5%+"
|
", XF86AudioRaiseVolume, exec, volumectl -u up"
|
||||||
", XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-"
|
", XF86AudioLowerVolume, exec, volumectl -u down"
|
||||||
]
|
]
|
||||||
++ cfg.keybinds.bindel;
|
++ cfg.keybinds.bindel;
|
||||||
|
|
||||||
bindl = [
|
bindl = [
|
||||||
", XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"
|
", XF86AudioMute, exec, volumectl toggle-mute"
|
||||||
", XF86AudioPlay, exec, playerctl play-pause"
|
", XF86AudioPlay, exec, playerctl play-pause"
|
||||||
", XF86AudioPrev, exec, playerctl previous"
|
", XF86AudioPrev, exec, playerctl previous"
|
||||||
", XF86AudioNext, exec, playerctl next"
|
", XF86AudioNext, exec, playerctl next"
|
||||||
", XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"
|
", XF86AudioMicMute, exec, volumectl -m toggle-mute"
|
||||||
|
|
||||||
", XF86MonBrightnessUp, exec, brightnessctl set +5%"
|
", XF86MonBrightnessUp, exec, lightctl up"
|
||||||
", XF86MonBrightnessDown, exec, brightnessctl set 5%-"
|
", XF86MonBrightnessDown, exec, lightctl down"
|
||||||
|
|
||||||
"$mod, XF86MonBrightnessUp, exec, brightnessctl -d kbd_backlight set +10%"
|
|
||||||
"$mod, XF86MonBrightnessDown, exec, brightnessctl -d kbd_backlight set 10%-"
|
|
||||||
]
|
]
|
||||||
++ cfg.keybinds.bindl;
|
++ cfg.keybinds.bindl;
|
||||||
|
|
||||||
@@ -486,8 +473,8 @@ in
|
|||||||
gaps_in = 5;
|
gaps_in = 5;
|
||||||
gaps_out = 10;
|
gaps_out = 10;
|
||||||
border_size = 1;
|
border_size = 1;
|
||||||
"col.active_border" = "rgb(8aadf4) rgb(24273A) rgb(24273A) rgb(8aadf4) 45deg";
|
# "col.active_border" = "rgb(8aadf4) rgb(24273A) rgb(24273A) rgb(8aadf4) 45deg";
|
||||||
"col.inactive_border" = "rgb(24273A) rgb(24273A) rgb(24273A) rgb(24273A) 45deg";
|
# "col.inactive_border" = "rgb(24273A) rgb(24273A) rgb(24273A) rgb(24273A) 45deg";
|
||||||
layout = "dwindle";
|
layout = "dwindle";
|
||||||
allow_tearing = cfg.allowTearing;
|
allow_tearing = cfg.allowTearing;
|
||||||
};
|
};
|
||||||
@@ -529,80 +516,78 @@ in
|
|||||||
workspace = cfg.workspace;
|
workspace = cfg.workspace;
|
||||||
|
|
||||||
windowrule = [
|
windowrule = [
|
||||||
"float, title:(file_progress)"
|
"match:title file_progress, float 1"
|
||||||
"float, title:(.*[Cc]onfirm.*)"
|
"match:title .*[Cc]onfirm.*, float 1"
|
||||||
"float, title:(.*[Dd]ialog.*)"
|
"match:title .*[Dd]ialog.*, float 1"
|
||||||
"float, title:(.*[Dd]ownload.*)"
|
"match:title .*[Dd]ownload.*, float 1"
|
||||||
"float, title:(.*[Nn]otification.*)"
|
"match:title .*[Nn]otification.*, float 1"
|
||||||
"float, title:(.*[Ee]rror.*)"
|
"match:title .*[Ee]rror.*, float 1"
|
||||||
"float, title:(.*[Ss]plash.*)"
|
"match:title .*[Ss]plash.*, float 1"
|
||||||
"float, title:(.*[Cc]onfirmreset.*)"
|
"match:title .*[Cc]onfirmreset.*, float 1"
|
||||||
"float, title:(.*[Ss]ign [Ii]n - .*)"
|
"match:title .*[Ss]ign [Ii]n - .*, float 1"
|
||||||
"float, title:(.*[Oo]pen [Ff]ile.*)"
|
"match:title .*[Oo]pen [Ff]ile.*, float 1"
|
||||||
"float, title:(.*branchdialog.*)"
|
"match:title .*branchdialog.*, float 1"
|
||||||
"float, class:(.*pavucontrol.*)"
|
"match:class .*pavucontrol.*, float 1"
|
||||||
"move onscreen cursor 0% 0%, class:(.*pavucontrol.*)"
|
"match:class .*pavucontrol.*, move onscreen cursor 0% 0%"
|
||||||
"float, class:(.*[Oo]verskride.*)"
|
"match:class .*[Oo]verskride.*, float 1"
|
||||||
"float, class:(.*FileRoller.*)"
|
"match:class .*FileRoller.*, float 1"
|
||||||
"float, class:(.*wlogout.*)"
|
"match:class .*wlogout.*, float 1"
|
||||||
"idleinhibit stayfocused, title:(.*mpv.*)"
|
"match:title .*mpv.*, idle_inhibit stayfocused"
|
||||||
|
|
||||||
"float, class:(.*nm-connection-editor.*)"
|
"match:class .*nm-connection-editor.*, float 1"
|
||||||
"move onscreen cursor 0% 0%, class:(.*nm-connection-editor.*)"
|
"match:class .*nm-connection-editor.*, move onscreen cursor 0% 0%"
|
||||||
|
|
||||||
"float, title:(Media viewer)"
|
"match:title Media viewer, float 1"
|
||||||
"float, class:(it.mijorus.smile),title:(Smile)"
|
"match:class it.mijorus.smile),match:title Smile, float 1"
|
||||||
"float, class:(.blueman-manager-wrapped)$,title:(Bluetooth Devices)"
|
"match:class .blueman-manager-wrapped)$,match:title Bluetooth Devices, float 1"
|
||||||
# Picture in picture windows
|
# Picture in picture windows
|
||||||
"float, title:(.*Picture-in-Picture.*)"
|
"match:title .*Picture-in-Picture.*, float 1"
|
||||||
"pin, title::(.*Picture-in-Picture.*)"
|
"match:title .*Picture-in-Picture.*, pin 1"
|
||||||
|
|
||||||
# discord/vesktop
|
# discord/vesktop
|
||||||
# "workspace: name:discord, class:(.*vesktop)"
|
# "workspace: name:discord, match:class .*vesktop"
|
||||||
# "float, class:(.*vesktop),title:(.*Discord Popout.*)"
|
# "match:class .*vesktop),match:title .*Discord Popout.*, float 1"
|
||||||
# "pin, class:(.*vesktop),title:(.*Discord Popout.*)"
|
# "pin, match:class .*vesktop),match:title .*Discord Popout.*"
|
||||||
|
|
||||||
# Music
|
# Music
|
||||||
# "workspace: name:discord, class:(Apple Music.*)"
|
# "workspace: name:discord, match:class Apple Music.*"
|
||||||
|
|
||||||
# Steam
|
# Steam
|
||||||
"float, class:(.*[Ss]team), title:(.*[Ss]team.*)$"
|
"match:class .*[Ss]team, match:title .*[Ss]team.*, float 1"
|
||||||
"workspace name:steam silent, class:(.*[Ss]team), title:(.*[Ss]team.*)$"
|
"match:class .*[Ss]team, match:title .*[Ss]team.*, workspace name:steam silent"
|
||||||
"tile, class:(.*[Ss]team), title:(.*[Ss]team.*)$"
|
"match:class .*[Ss]team, match:title .*[Ss]team.*, tile 1"
|
||||||
"float, class:(.*steam),title:(.*Friends List.*)"
|
"match:class .*steam,match:title .*Friends List.*, float 1"
|
||||||
|
|
||||||
# Code
|
# Code
|
||||||
"pin, class:(.*codium.*),title:(Save As)"
|
"match:class .*codium.*, match:title Save As, pin 1"
|
||||||
"float, class:(.*codium.*),title:(Save As)"
|
"match:class .*codium.*, match:title Save As, float 1"
|
||||||
"float, class:(xdg-desktop-portal-gtk),title:(Open Workspace from File)"
|
"match:class xdg-desktop-portal-gtk, match:title Open Workspace from File, float 1"
|
||||||
|
|
||||||
# Game Tearing??? https://wiki.hypr.land/Configuring/Tearing/
|
# Game Tearing??? https://wiki.hypr.land/Configuring/Tearing/
|
||||||
"immediate, class:(.*gamescope)"
|
"match:class .*gamescope.*, idle_inhibit fullscreen, content game, immediate 1"
|
||||||
|
"match:xdg_tag proton-game, idle_inhibit fullscreen, content game, immediate 1"
|
||||||
|
"match:class steam_app_.*, idle_inhibit fullscreen, content game, immediate 1"
|
||||||
|
|
||||||
# vmware
|
# vmware
|
||||||
# this tag will set the below options to the vdi window
|
# this tag will set the below options to the vdi window
|
||||||
# this will have it auto open as a 2160x7680 window
|
# this will have it auto open as a 2160x7680 window
|
||||||
# and makes multi-monitor work
|
# and makes multi-monitor work
|
||||||
"tag +horizonrdp, class:(.*[Hh]orizon-client),title:(USPS Next VDI)"
|
"match:class .*[Hh]orizon-client, match:title USPS Next VDI, tag +horizonrdp"
|
||||||
|
|
||||||
"noanim, tag:horizonrdp"
|
"match:tag horizonrdp, no_anim 1"
|
||||||
"noblur, tag:horizonrdp"
|
"match:tag horizonrdp, no_blur 1"
|
||||||
"norounding, tag:horizonrdp"
|
"match:tag horizonrdp, rounding 0"
|
||||||
"noshadow, tag:horizonrdp"
|
"match:tag horizonrdp, no_shadow 1"
|
||||||
"immediate, tag:horizonrdp"
|
"match:tag horizonrdp, immediate 1"
|
||||||
"allowsinput, tag:horizonrdp"
|
"match:tag horizonrdp, allows_input 1"
|
||||||
"noborder, tag:horizonrdp"
|
"match:tag horizonrdp, border_size 0"
|
||||||
"nodim, tag:horizonrdp"
|
"match:tag horizonrdp, max_size 2160 7680"
|
||||||
"nomaxsize, tag:horizonrdp"
|
"match:tag horizonrdp, min_size 1920 1080"
|
||||||
"renderunfocused, tag:horizonrdp"
|
"match:tag horizonrdp, render_unfocused 1"
|
||||||
"idleinhibit, tag:horizonrdp"
|
"match:tag horizonrdp, idle_inhibit 1"
|
||||||
"float, tag:horizonrdp"
|
"match:tag horizonrdp, float 1"
|
||||||
# float the vmware window cause its annoying to use in fullscreen
|
# float the vmware window cause its annoying to use in fullscreen
|
||||||
"float, class:(.*[Hh]orizon-client),title:([Oo]mnissa [Hh]orizon [Cc]lient)"
|
"match:class .*[Hh]orizon-client),match:title [Oo]mnissa [Hh]orizon [Cc]lient, float 1"
|
||||||
|
|
||||||
"tag +waydroid, class:([Ww]aydroid.*)"
|
|
||||||
"float, tag:waydroid"
|
|
||||||
"pin, tag:waydroid"
|
|
||||||
]
|
]
|
||||||
++ cfg.windowRule;
|
++ cfg.windowRule;
|
||||||
|
|
||||||
@@ -697,12 +682,12 @@ in
|
|||||||
sensitivity = 0; # -1.0 - 1.0, 0 means no modification.
|
sensitivity = 0; # -1.0 - 1.0, 0 means no modification.
|
||||||
};
|
};
|
||||||
|
|
||||||
experimental = {
|
# experimental = {
|
||||||
xx_color_management_v4 = true;
|
# xx_color_management_v4 = true;
|
||||||
};
|
# };
|
||||||
|
|
||||||
debug = {
|
debug = {
|
||||||
full_cm_proto = cfg.debug.fullCmProto;
|
# full_cm_proto = cfg.debug.fullCmProto;
|
||||||
disable_logs = cfg.debug.disableLogs;
|
disable_logs = cfg.debug.disableLogs;
|
||||||
disable_scale_checks = cfg.debug.disableScaleChecks;
|
disable_scale_checks = cfg.debug.disableScaleChecks;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,7 +1,12 @@
|
|||||||
{ lib, pkgs, ... }:
|
{
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
namespace,
|
||||||
|
...
|
||||||
|
}:
|
||||||
with lib;
|
with lib;
|
||||||
{
|
{
|
||||||
options.mjallen.programs.hyprland = {
|
options.${namespace}.programs.hyprland = {
|
||||||
enable = mkEnableOption "enable hyprland";
|
enable = mkEnableOption "enable hyprland";
|
||||||
|
|
||||||
primaryDisplay = mkOption {
|
primaryDisplay = mkOption {
|
||||||
@@ -148,22 +153,10 @@ with lib;
|
|||||||
|
|
||||||
extraConfig = mkOption {
|
extraConfig = mkOption {
|
||||||
type = with types; str;
|
type = with types; str;
|
||||||
default = '''';
|
default = "";
|
||||||
description = "Any extra configuration options";
|
description = "Any extra configuration options";
|
||||||
};
|
};
|
||||||
|
|
||||||
iconThemeName = mkOption {
|
|
||||||
type = types.str;
|
|
||||||
default = "Colloid-Dark";
|
|
||||||
description = "Icon theme name";
|
|
||||||
};
|
|
||||||
|
|
||||||
gtkThemeName = mkOption {
|
|
||||||
type = types.str;
|
|
||||||
default = "Colloid-Dark";
|
|
||||||
description = "GTK theme name";
|
|
||||||
};
|
|
||||||
|
|
||||||
defaultApps = mkOption {
|
defaultApps = mkOption {
|
||||||
type = types.submodule {
|
type = types.submodule {
|
||||||
options = {
|
options = {
|
||||||
@@ -216,7 +209,7 @@ with lib;
|
|||||||
type = with types; listOf str;
|
type = with types; listOf str;
|
||||||
default = [
|
default = [
|
||||||
"nwg-look -a"
|
"nwg-look -a"
|
||||||
"nwg-dock-hyprland -d"
|
"nwg-dock-hyprland -x"
|
||||||
];
|
];
|
||||||
description = "Commands to run via Hyprland exec-once";
|
description = "Commands to run via Hyprland exec-once";
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,100 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
lib,
|
|
||||||
pkgs,
|
|
||||||
mjallenThemeComputed,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
with lib;
|
|
||||||
let
|
|
||||||
cfg = config.mjallen.programs.hyprland;
|
|
||||||
|
|
||||||
# Pull from global theme options
|
|
||||||
themeSize = config.mjallen.theme.gtk.size; # "standard" | "compact"
|
|
||||||
themeAccent = config.mjallen.theme.gtk.accent; # "default" | ... | "all"
|
|
||||||
themeTweak = config.mjallen.theme.gtk.tweak; # "normal" | "rimless" | "float" | "black"
|
|
||||||
themeColor = config.mjallen.theme.gtk.color; # "light" | "dark"
|
|
||||||
iconThemeVariant = config.mjallen.theme.icons.variant; # "default" | ... | "all"
|
|
||||||
iconScheme = config.mjallen.theme.icons.scheme; # "default" | "nord" | "dracula" | ...
|
|
||||||
|
|
||||||
# Cursor
|
|
||||||
cursorTheme = "macOS";
|
|
||||||
cursorThemePkg = pkgs.apple-cursor;
|
|
||||||
cursorSize = 24;
|
|
||||||
|
|
||||||
# GTK
|
|
||||||
gtkTheme = mjallenThemeComputed.gtkTheme;
|
|
||||||
gtkThemePkg = pkgs.colloid-gtk-theme.override {
|
|
||||||
sizeVariants = [ themeSize ];
|
|
||||||
colorVariants = [ themeColor ];
|
|
||||||
themeVariants = [ themeAccent ];
|
|
||||||
tweaks = [ themeTweak ];
|
|
||||||
};
|
|
||||||
|
|
||||||
# Icons
|
|
||||||
iconTheme = mjallenThemeComputed.iconTheme;
|
|
||||||
iconThemePkg = pkgs.colloid-icon-theme.override {
|
|
||||||
schemeVariants = [ iconScheme ];
|
|
||||||
colorVariants = [ iconThemeVariant ];
|
|
||||||
};
|
|
||||||
|
|
||||||
# Fonts
|
|
||||||
fontName = "JetBrainsMono NFM";
|
|
||||||
fontPackage = pkgs.nerd-fonts.jetbrains-mono;
|
|
||||||
fontSize = 12;
|
|
||||||
in
|
|
||||||
{
|
|
||||||
config = mkIf cfg.enable {
|
|
||||||
home = {
|
|
||||||
pointerCursor = {
|
|
||||||
gtk.enable = true;
|
|
||||||
package = cursorThemePkg;
|
|
||||||
name = cursorTheme;
|
|
||||||
size = cursorSize;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
dconf = {
|
|
||||||
enable = true;
|
|
||||||
settings = {
|
|
||||||
"org/gnome/desktop/interface".color-scheme = "prefer-dark";
|
|
||||||
"org/gnome/desktop/interface".cursor-theme = cursorTheme;
|
|
||||||
"org/gnome/desktop/interface".gtk-theme = gtkTheme;
|
|
||||||
"org/gnome/desktop/interface".icon-theme = iconTheme;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
gtk = {
|
|
||||||
enable = true;
|
|
||||||
|
|
||||||
cursorTheme = {
|
|
||||||
name = cursorTheme;
|
|
||||||
package = cursorThemePkg;
|
|
||||||
};
|
|
||||||
|
|
||||||
theme = {
|
|
||||||
name = gtkTheme;
|
|
||||||
package = gtkThemePkg;
|
|
||||||
};
|
|
||||||
|
|
||||||
iconTheme = {
|
|
||||||
name = iconTheme;
|
|
||||||
package = iconThemePkg;
|
|
||||||
};
|
|
||||||
|
|
||||||
gtk3.extraConfig = {
|
|
||||||
gtk-application-prefer-dark-theme = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
gtk4.extraConfig = {
|
|
||||||
gtk-application-prefer-dark-theme = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
font = {
|
|
||||||
name = fontName;
|
|
||||||
package = fontPackage;
|
|
||||||
size = fontSize;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,8 +1,12 @@
|
|||||||
{ lib, config, ... }:
|
{
|
||||||
|
lib,
|
||||||
|
config,
|
||||||
|
namespace,
|
||||||
|
...
|
||||||
|
}:
|
||||||
with lib;
|
with lib;
|
||||||
let
|
let
|
||||||
cfg = config.mjallen.programs.kitty;
|
cfg = config.${namespace}.programs.kitty;
|
||||||
palette = import cfg.theme.file;
|
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
imports = [ ./options.nix ];
|
imports = [ ./options.nix ];
|
||||||
@@ -12,12 +16,6 @@ in
|
|||||||
enable = true;
|
enable = true;
|
||||||
shellIntegration.enableZshIntegration = true;
|
shellIntegration.enableZshIntegration = true;
|
||||||
|
|
||||||
font = {
|
|
||||||
name = cfg.font.name;
|
|
||||||
package = cfg.font.package;
|
|
||||||
size = cfg.font.size;
|
|
||||||
};
|
|
||||||
|
|
||||||
settings = {
|
settings = {
|
||||||
bold_font = "auto";
|
bold_font = "auto";
|
||||||
italic_font = "auto";
|
italic_font = "auto";
|
||||||
@@ -26,80 +24,6 @@ in
|
|||||||
cursor_shape = "block";
|
cursor_shape = "block";
|
||||||
url_style = "dotted";
|
url_style = "dotted";
|
||||||
confirm_os_window_close = "0";
|
confirm_os_window_close = "0";
|
||||||
background_opacity = "0.85";
|
|
||||||
|
|
||||||
# The basic colors
|
|
||||||
foreground = palette.colors.text;
|
|
||||||
background = palette.colors.bg;
|
|
||||||
selection_foreground = palette.colors.bg;
|
|
||||||
selection_background = palette.colors.accent;
|
|
||||||
|
|
||||||
# Cursor colors
|
|
||||||
cursor = palette.colors.accent;
|
|
||||||
cursor_text_color = palette.colors.bg;
|
|
||||||
|
|
||||||
# URL underline color when hovering with mouse
|
|
||||||
url_color = palette.colors.accent;
|
|
||||||
|
|
||||||
# Kitty window border colors
|
|
||||||
active_border_color = palette.colors.primary;
|
|
||||||
inactive_border_color = palette.colors.bgAlt;
|
|
||||||
bell_border_color = palette.colors.warning;
|
|
||||||
|
|
||||||
# OS Window titlebar colors
|
|
||||||
wayland_titlebar_color = palette.colors.bg;
|
|
||||||
macos_titlebar_color = palette.colors.bg;
|
|
||||||
|
|
||||||
# Tab bar colors
|
|
||||||
active_tab_foreground = palette.colors.border;
|
|
||||||
active_tab_background = palette.colors.accent;
|
|
||||||
inactive_tab_foreground = palette.colors.text;
|
|
||||||
inactive_tab_background = palette.colors.bgAlt;
|
|
||||||
tab_bar_background = palette.colors.border;
|
|
||||||
|
|
||||||
# Colors for marks (marked text in the terminal)
|
|
||||||
mark1_foreground = palette.colors.bg;
|
|
||||||
mark1_background = palette.colors.primary;
|
|
||||||
mark2_foreground = palette.colors.bg;
|
|
||||||
mark2_background = palette.colors.accent;
|
|
||||||
mark3_foreground = palette.colors.bg;
|
|
||||||
mark3_background = palette.colors.info;
|
|
||||||
|
|
||||||
# The 16 terminal colors
|
|
||||||
|
|
||||||
# black
|
|
||||||
color0 = palette.colors.bg;
|
|
||||||
|
|
||||||
# Autosuggestion
|
|
||||||
color8 = palette.colors.primary;
|
|
||||||
|
|
||||||
# red
|
|
||||||
color1 = palette.colors.danger;
|
|
||||||
color9 = palette.colors.danger;
|
|
||||||
|
|
||||||
# green
|
|
||||||
color2 = palette.colors.success;
|
|
||||||
color10 = palette.colors.success;
|
|
||||||
|
|
||||||
# yellow
|
|
||||||
color3 = palette.colors.warning;
|
|
||||||
color11 = palette.colors.warning;
|
|
||||||
|
|
||||||
# blue
|
|
||||||
color4 = palette.colors.primary;
|
|
||||||
color12 = palette.colors.primary;
|
|
||||||
|
|
||||||
# magenta
|
|
||||||
color5 = palette.colors.accent;
|
|
||||||
color13 = palette.colors.accent;
|
|
||||||
|
|
||||||
# cyan
|
|
||||||
color6 = palette.colors.info;
|
|
||||||
color14 = palette.colors.info;
|
|
||||||
|
|
||||||
# white
|
|
||||||
color7 = palette.colors.textMuted;
|
|
||||||
color15 = palette.colors.text;
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,39 +1,7 @@
|
|||||||
{ lib, namespace, ... }:
|
{ lib, namespace, ... }:
|
||||||
with lib;
|
with lib;
|
||||||
let
|
|
||||||
inherit (lib.${namespace}) mkOpt;
|
|
||||||
in
|
|
||||||
{
|
{
|
||||||
options.mjallen.programs.kitty = {
|
options.${namespace}.programs.kitty = {
|
||||||
enable = mkEnableOption "enable kitty terminal";
|
enable = mkEnableOption "enable kitty terminal";
|
||||||
|
|
||||||
font = {
|
|
||||||
name = mkOption {
|
|
||||||
type = types.str;
|
|
||||||
default = "DejaVu Sans";
|
|
||||||
};
|
|
||||||
|
|
||||||
package = mkOpt types.package pkgs.dejavu_fonts "Default font package";
|
|
||||||
|
|
||||||
size = mkOption {
|
|
||||||
type = with types; int;
|
|
||||||
default = 12;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
theme = mkOption {
|
|
||||||
type = types.submodule {
|
|
||||||
options = {
|
|
||||||
file = mkOption {
|
|
||||||
type = types.path;
|
|
||||||
# Fallback default; global theme module sets this via mkDefault
|
|
||||||
default = lib.snowfall.fs.get-file "modules/home/desktop/theme/palettes/nord.nix";
|
|
||||||
description = "Nix file exporting a palette attrset.";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
default = { };
|
|
||||||
description = "Kitty theme palette configuration.";
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,12 @@
|
|||||||
{ config, lib, ... }:
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
namespace,
|
||||||
|
...
|
||||||
|
}:
|
||||||
with lib;
|
with lib;
|
||||||
let
|
let
|
||||||
cfg = config.mjallen.programs.mako;
|
cfg = config.${namespace}.programs.mako;
|
||||||
palette = import cfg.theme.file;
|
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
imports = [ ./options.nix ];
|
imports = [ ./options.nix ];
|
||||||
@@ -10,7 +14,7 @@ in
|
|||||||
services.mako = {
|
services.mako = {
|
||||||
enable = true;
|
enable = true;
|
||||||
settings = {
|
settings = {
|
||||||
font = cfg.fontName;
|
font = mkDefault cfg.fontName;
|
||||||
icons = true;
|
icons = true;
|
||||||
ignore-timeout = true;
|
ignore-timeout = true;
|
||||||
sort = "-time";
|
sort = "-time";
|
||||||
@@ -22,10 +26,10 @@ in
|
|||||||
max-icon-size = 64;
|
max-icon-size = 64;
|
||||||
default-timeout = 5000;
|
default-timeout = 5000;
|
||||||
|
|
||||||
background-color = palette.colors.bg;
|
# background-color = mkDefault config.lib.stylix.colors.base00;
|
||||||
text-color = palette.colors.text;
|
# text-color = mkDefault config.lib.stylix.colors.base06;
|
||||||
border-color = palette.colors.primary;
|
# border-color = mkDefault config.lib.stylix.colors.base0F;
|
||||||
progress-color = "over ${palette.colors.info}";
|
# progress-color = mkDefault "over ${config.lib.stylix.colors.base0C}";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,26 +1,12 @@
|
|||||||
{ lib, ... }:
|
{ lib, namespace, ... }:
|
||||||
with lib;
|
with lib;
|
||||||
{
|
{
|
||||||
options.mjallen.programs.mako = {
|
options.${namespace}.programs.mako = {
|
||||||
enable = mkEnableOption "enable mako";
|
enable = mkEnableOption "enable mako";
|
||||||
|
|
||||||
fontName = mkOption {
|
fontName = mkOption {
|
||||||
type = types.str;
|
type = types.str;
|
||||||
default = "DejaVu Sans";
|
default = "DejaVu Sans";
|
||||||
};
|
};
|
||||||
|
|
||||||
theme = mkOption {
|
|
||||||
type = types.submodule {
|
|
||||||
options = {
|
|
||||||
file = mkOption {
|
|
||||||
type = types.path;
|
|
||||||
default = lib.snowfall.fs.get-file "modules/home/desktop/theme/palettes/nord.nix";
|
|
||||||
description = "Nix file exporting a palette attrset.";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
default = { };
|
|
||||||
description = "Mako theme palette configuration.";
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,12 +2,12 @@
|
|||||||
config,
|
config,
|
||||||
lib,
|
lib,
|
||||||
pkgs,
|
pkgs,
|
||||||
|
namespace,
|
||||||
...
|
...
|
||||||
}:
|
}:
|
||||||
with lib;
|
with lib;
|
||||||
let
|
let
|
||||||
cfg = config.mjallen.programs.nwg-dock;
|
cfg = config.${namespace}.programs.nwg-dock;
|
||||||
palette = import cfg.theme.file;
|
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
imports = [ ./options.nix ];
|
imports = [ ./options.nix ];
|
||||||
@@ -16,13 +16,41 @@ in
|
|||||||
home.packages = with pkgs; [ nwg-dock-hyprland ];
|
home.packages = with pkgs; [ nwg-dock-hyprland ];
|
||||||
|
|
||||||
home.file = {
|
home.file = {
|
||||||
".config/nwg-dock-hyprland/drawer.css".text = ''
|
".config/nwg-dock-hyprland/config.json".text = ''
|
||||||
|
{
|
||||||
|
"position": "bottom",
|
||||||
|
"anchor": "center",
|
||||||
|
"margin": 12,
|
||||||
|
"icon_size": 48,
|
||||||
|
"icon_size_hover": 64,
|
||||||
|
"spacing": 6,
|
||||||
|
"padding": 8,
|
||||||
|
"autohide": false,
|
||||||
|
"autohide_timeout": 0.3,
|
||||||
|
"exclusive": true,
|
||||||
|
"layer": "top",
|
||||||
|
"height": 72,
|
||||||
|
"background_alpha": 0.55,
|
||||||
|
"rounded_corners": 16,
|
||||||
|
"show_labels": false,
|
||||||
|
"show_running": true,
|
||||||
|
"show_pinned": true,
|
||||||
|
"pinned": [
|
||||||
|
"firefox.desktop",
|
||||||
|
"org.wezfurlong.wezterm.desktop",
|
||||||
|
"codium.desktop",
|
||||||
|
"org.gnome.Nautilus.desktop"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
|
||||||
|
".config/nwg-dock-hyprland/style.css".text = ''
|
||||||
window {
|
window {
|
||||||
background: ${palette.colors.bg};
|
background: #36364f;
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
border-style: none;
|
border-style: none;
|
||||||
border-width: 1px;
|
border-width: 1px;
|
||||||
border-color: ${palette.colors.accent}b0
|
border-color: rgba(156, 142, 122, 0.7)
|
||||||
}
|
}
|
||||||
|
|
||||||
#box {
|
#box {
|
||||||
@@ -30,17 +58,17 @@ in
|
|||||||
padding: 10px
|
padding: 10px
|
||||||
}
|
}
|
||||||
|
|
||||||
active {
|
#active {
|
||||||
/* This is to underline the button representing the currently active window */
|
/* This is to underline the button representing the currently active window */
|
||||||
border-bottom: solid 1px;
|
border-bottom: solid 1px;
|
||||||
border-color: ${palette.colors.success}1a
|
border-color: rgba(255, 255, 255, 0.3)
|
||||||
}
|
}
|
||||||
|
|
||||||
button, image {
|
button, image {
|
||||||
background: none;
|
background: none;
|
||||||
border-style: none;
|
border-style: none;
|
||||||
box-shadow: none;
|
box-shadow: none;
|
||||||
color: ${palette.colors.primary}
|
color: #999
|
||||||
}
|
}
|
||||||
|
|
||||||
button {
|
button {
|
||||||
@@ -52,7 +80,52 @@ in
|
|||||||
}
|
}
|
||||||
|
|
||||||
button:hover {
|
button:hover {
|
||||||
background-color: ${palette.colors.bg}1a;
|
background-color: rgba(255, 255, 255, 0.15);
|
||||||
|
border-radius: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
button:focus {
|
||||||
|
box-shadow: none
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
|
||||||
|
".config/nwg-dock-hyprland/drawer.css".text = ''
|
||||||
|
window {
|
||||||
|
background: ${config.lib.stylix.colors.base00};
|
||||||
|
border-radius: 10px;
|
||||||
|
border-style: none;
|
||||||
|
border-width: 1px;
|
||||||
|
border-color: ${config.lib.stylix.colors.base0E}b0
|
||||||
|
}
|
||||||
|
|
||||||
|
#box {
|
||||||
|
/* Define attributes of the box surrounding icons here */
|
||||||
|
padding: 10px
|
||||||
|
}
|
||||||
|
|
||||||
|
active {
|
||||||
|
/* This is to underline the button representing the currently active window */
|
||||||
|
border-bottom: solid 1px;
|
||||||
|
border-color: ${config.lib.stylix.colors.base0B}1a
|
||||||
|
}
|
||||||
|
|
||||||
|
button, image {
|
||||||
|
background: none;
|
||||||
|
border-style: none;
|
||||||
|
box-shadow: none;
|
||||||
|
color: ${config.lib.stylix.colors.base0F}
|
||||||
|
}
|
||||||
|
|
||||||
|
button {
|
||||||
|
padding: 4px;
|
||||||
|
margin-left: 4px;
|
||||||
|
margin-right: 4px;
|
||||||
|
color: #eee;
|
||||||
|
font-size: 12px
|
||||||
|
}
|
||||||
|
|
||||||
|
button:hover {
|
||||||
|
background-color: ${config.lib.stylix.colors.base00}1a;
|
||||||
border-radius: 2px;
|
border-radius: 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,21 +1,7 @@
|
|||||||
{ lib, ... }:
|
{ lib, namespace, ... }:
|
||||||
with lib;
|
with lib;
|
||||||
{
|
{
|
||||||
options.mjallen.programs.nwg-dock = {
|
options.${namespace}.programs.nwg-dock = {
|
||||||
enable = mkEnableOption "enable nwg-dock";
|
enable = mkEnableOption "enable nwg-dock";
|
||||||
|
|
||||||
theme = mkOption {
|
|
||||||
type = types.submodule {
|
|
||||||
options = {
|
|
||||||
file = mkOption {
|
|
||||||
type = types.path;
|
|
||||||
default = lib.snowfall.fs.get-file "modules/home/desktop/theme/palettes/nord.nix";
|
|
||||||
description = "Nix file exporting a palette attrset.";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
default = { };
|
|
||||||
description = "nwg-dock theme palette configuration.";
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,12 +2,12 @@
|
|||||||
config,
|
config,
|
||||||
lib,
|
lib,
|
||||||
pkgs,
|
pkgs,
|
||||||
|
namespace,
|
||||||
...
|
...
|
||||||
}:
|
}:
|
||||||
with lib;
|
with lib;
|
||||||
let
|
let
|
||||||
cfg = config.mjallen.programs.nwg-drawer;
|
cfg = config.${namespace}.programs.nwg-drawer;
|
||||||
palette = import cfg.theme.file;
|
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
imports = [ ./options.nix ];
|
imports = [ ./options.nix ];
|
||||||
@@ -18,13 +18,13 @@ in
|
|||||||
home.file = {
|
home.file = {
|
||||||
".config/nwg-drawer/drawer.css".text = ''
|
".config/nwg-drawer/drawer.css".text = ''
|
||||||
window {
|
window {
|
||||||
background-color: ${palette.colors.bg}bf;
|
background-color: ${config.lib.stylix.colors.base00}bf;
|
||||||
color: ${palette.colors.textMuted}00
|
color: ${config.lib.stylix.colors.base05}00
|
||||||
}
|
}
|
||||||
|
|
||||||
/* search entry */
|
/* search entry */
|
||||||
entry {
|
entry {
|
||||||
background-color: ${palette.colors.bgAlt}0f
|
background-color: ${config.lib.stylix.colors.base01}0f
|
||||||
}
|
}
|
||||||
|
|
||||||
button, image {
|
button, image {
|
||||||
@@ -33,7 +33,7 @@ in
|
|||||||
}
|
}
|
||||||
|
|
||||||
button:hover {
|
button:hover {
|
||||||
background-color: ${palette.colors.primary}1a
|
background-color: ${config.lib.stylix.colors.base0F}1a
|
||||||
}
|
}
|
||||||
|
|
||||||
/* in case you wanted to give category buttons a different look */
|
/* in case you wanted to give category buttons a different look */
|
||||||
@@ -43,12 +43,12 @@ in
|
|||||||
|
|
||||||
#pinned-box {
|
#pinned-box {
|
||||||
padding-bottom: 5px;
|
padding-bottom: 5px;
|
||||||
border-bottom: 1px dotted ${palette.colors.border}
|
border-bottom: 1px dotted ${config.lib.stylix.colors.base03}
|
||||||
}
|
}
|
||||||
|
|
||||||
#files-box {
|
#files-box {
|
||||||
padding: 5px;
|
padding: 5px;
|
||||||
border: 1px dotted ${palette.colors.border};
|
border: 1px dotted ${config.lib.stylix.colors.base03};
|
||||||
border-radius: 15px
|
border-radius: 15px
|
||||||
}
|
}
|
||||||
'';
|
'';
|
||||||
|
|||||||
@@ -1,21 +1,7 @@
|
|||||||
{ lib, ... }:
|
{ lib, namespace, ... }:
|
||||||
with lib;
|
with lib;
|
||||||
{
|
{
|
||||||
options.mjallen.programs.nwg-drawer = {
|
options.${namespace}.programs.nwg-drawer = {
|
||||||
enable = mkEnableOption "enable nwg-drawer";
|
enable = mkEnableOption "enable nwg-drawer";
|
||||||
|
|
||||||
theme = mkOption {
|
|
||||||
type = types.submodule {
|
|
||||||
options = {
|
|
||||||
file = mkOption {
|
|
||||||
type = types.path;
|
|
||||||
default = lib.snowfall.fs.get-file "modules/home/desktop/theme/palettes/nord.nix";
|
|
||||||
description = "Nix file exporting a palette attrset.";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
default = { };
|
|
||||||
description = "nwg-drawer theme palette configuration.";
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,12 @@
|
|||||||
{ config, lib, ... }:
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
namespace,
|
||||||
|
...
|
||||||
|
}:
|
||||||
with lib;
|
with lib;
|
||||||
let
|
let
|
||||||
cfg = config.mjallen.programs.nwg-panel;
|
cfg = config.${namespace}.programs.nwg-panel;
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
imports = [ ./options.nix ];
|
imports = [ ./options.nix ];
|
||||||
|
|||||||
@@ -1,7 +1,12 @@
|
|||||||
{ lib, pkgs, ... }:
|
{
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
namespace,
|
||||||
|
...
|
||||||
|
}:
|
||||||
with lib;
|
with lib;
|
||||||
{
|
{
|
||||||
options.mjallen.programs.nwg-panel = {
|
options.${namespace}.programs.nwg-panel = {
|
||||||
enable = mkEnableOption "enable nwg-panel";
|
enable = mkEnableOption "enable nwg-panel";
|
||||||
|
|
||||||
defaultApps = mkOption {
|
defaultApps = mkOption {
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
...
|
...
|
||||||
}:
|
}:
|
||||||
let
|
let
|
||||||
isArm = builtins.match "aarch64*" system != null;
|
isArm = "aarch64-linux" == system;
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
programs.onlyoffice = {
|
programs.onlyoffice = {
|
||||||
|
|||||||
290
modules/home/programs/update-checker/default.nix
Normal file
290
modules/home/programs/update-checker/default.nix
Normal file
@@ -0,0 +1,290 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
namespace,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
git-token = config.sops.secrets."github-token".path;
|
||||||
|
|
||||||
|
update-checker = pkgs.writeScriptBin "update-checker" ''
|
||||||
|
#!/usr/bin/env nix-shell
|
||||||
|
#! nix-shell -i python3 --pure
|
||||||
|
#! nix-shell -p python3 python3Packages.pygithub python3Packages.feedparser python3Packages.requests nix-prefetch-scripts nix
|
||||||
|
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
import subprocess
|
||||||
|
from github import Github
|
||||||
|
from github import Auth
|
||||||
|
import feedparser
|
||||||
|
import requests
|
||||||
|
|
||||||
|
token = None
|
||||||
|
|
||||||
|
with open('${git-token}', 'r') as token_file:
|
||||||
|
token = token_file.readline()
|
||||||
|
|
||||||
|
auth = Auth.Token(token)
|
||||||
|
|
||||||
|
def check_github(owner, repo, version):
|
||||||
|
try:
|
||||||
|
release = None
|
||||||
|
result = None
|
||||||
|
prefetch = None
|
||||||
|
ghub = Github(auth=auth)
|
||||||
|
print(' getting repo ' + owner + '/' + repo)
|
||||||
|
repo = ghub.get_repo(owner + '/' + repo)
|
||||||
|
if '-b' in version:
|
||||||
|
release = repo.get_releases()[0]
|
||||||
|
latest_version = release.name
|
||||||
|
else:
|
||||||
|
try:
|
||||||
|
release = repo.get_latest_release()
|
||||||
|
latest_version = release.tag_name
|
||||||
|
except:
|
||||||
|
tags = repo.get_tags()
|
||||||
|
try:
|
||||||
|
if tags is not None:
|
||||||
|
latest_version = tags[0].name
|
||||||
|
except:
|
||||||
|
commits = repo.get_commits()
|
||||||
|
latest_version = commits[0].sha
|
||||||
|
|
||||||
|
if latest_version is not None:
|
||||||
|
|
||||||
|
if latest_version.replace('v',''\'') != version.replace('v',''\''):
|
||||||
|
print(' update found')
|
||||||
|
print(' Current version: ' + version)
|
||||||
|
print(' Latest version: ' + latest_version)
|
||||||
|
result = subprocess.check_output(['nix-prefetch-git', '--quiet', repo.clone_url, '--rev', latest_version])
|
||||||
|
prefetch = json.loads(result)
|
||||||
|
print(' New hash: ' + prefetch.get('hash'))
|
||||||
|
else:
|
||||||
|
print(' no update')
|
||||||
|
ghub.close()
|
||||||
|
except Exception as e:
|
||||||
|
print(e)
|
||||||
|
|
||||||
|
def check_codeberg(owner, repo, version):
|
||||||
|
feed = feedparser.parse('https://codeberg.org/{0}/{1}/releases.rss'.format(owner, repo))
|
||||||
|
if feed.status == 200:
|
||||||
|
entry = feed.entries[0]
|
||||||
|
if entry.title.replace('v',''\'') != version.replace('v',''\''):
|
||||||
|
print(' update found')
|
||||||
|
print(' Current version: ' + version)
|
||||||
|
print(' Latest version: ' + entry.title)
|
||||||
|
sha256 = subprocess.check_output(['nix-prefetch-url', url.replace(''\'''\${version}', entry.title.replace('v', ''\''))])
|
||||||
|
prefetch = subprocess.check_output(['nix', 'hash', 'convert', '--hash-algo', 'sha256', str(sha256.decode('utf-8').strip())])
|
||||||
|
print(' New hash: ' + prefetch.decode('utf-8').strip())
|
||||||
|
else:
|
||||||
|
print(' no update')
|
||||||
|
|
||||||
|
def check_open_vsx(publisher, name, version):
|
||||||
|
open_vsx = requests.get('https://open-vsx.org/api/' + publisher + '/' + name)
|
||||||
|
if open_vsx.status_code == 200:
|
||||||
|
extension = open_vsx.json()
|
||||||
|
latest_version = extension.get('version')
|
||||||
|
url = extension.get('files').get('download')
|
||||||
|
if latest_version.replace('v',''\'') != version.replace('v',''\''):
|
||||||
|
print(' update found')
|
||||||
|
print(' Current version: ' + version)
|
||||||
|
print(' Latest version: ' + latest_version)
|
||||||
|
sha256 = subprocess.check_output(['nix-prefetch-url', url])
|
||||||
|
prefetch = subprocess.check_output(['nix', 'hash', 'convert', '--hash-algo', 'sha256', str(sha256.decode('utf-8').strip())])
|
||||||
|
print(' New hash: ' + prefetch.decode('utf-8').strip())
|
||||||
|
else:
|
||||||
|
print(' no update')
|
||||||
|
|
||||||
|
def parse_nix(package_spec):
|
||||||
|
version = None
|
||||||
|
url = None
|
||||||
|
current_hash = None
|
||||||
|
owner = None
|
||||||
|
repo = None
|
||||||
|
pname = None
|
||||||
|
name = None
|
||||||
|
publisher = None
|
||||||
|
for line in package_spec.readlines():
|
||||||
|
if 'owner = "' in line and owner is None:
|
||||||
|
owner = line.split(' = ')[-1].replace('"', ''\'').replace(';\n', ''\'')
|
||||||
|
if 'repo = "' in line and repo is None:
|
||||||
|
repo = line.split(' = ')[-1].replace('"', ''\'').replace(';\n', ''\'')
|
||||||
|
if 'version = "' in line and version is None:
|
||||||
|
version = line.split(' = ')[-1].replace('"', ''\'').replace(';\n', ''\'')
|
||||||
|
if 'rev = "' in line and ''\'''\${version}' not in line:
|
||||||
|
version = line.split(' = ')[-1].replace('"', ''\'').replace(';\n', ''\'')
|
||||||
|
if 'url = "' in line and url is None:
|
||||||
|
url = line.split(' = ')[-1].replace('"', ''\'').replace(';\n', ''\'')
|
||||||
|
if 'sha256 = "' in line or ' hash = "' in line and current_hash is None:
|
||||||
|
current_hash = line.split(' = ')[-1].replace('"', ''\'').replace(';\n', ''\'')
|
||||||
|
if 'pname = "' in line and pname is None:
|
||||||
|
pname = line.split(' = ')[-1].replace('"', ''\'').replace(';\n', ''\'')
|
||||||
|
if ' name = "' in line and name is None:
|
||||||
|
name = line.split(' = ')[-1].replace('"', ''\'').replace(';\n', ''\'')
|
||||||
|
if 'publisher = "' in line and publisher is None:
|
||||||
|
publisher = line.split(' = ')[-1].replace('"', ''\'').replace(';\n', ''\'')
|
||||||
|
|
||||||
|
if url is None and repo is not None:
|
||||||
|
if 'pname' in repo:
|
||||||
|
repo = repo.replace(''\'''\${pname}', pname)
|
||||||
|
url = 'https://github.com/{0}/{1}/releases/tag/{2}'.format(owner, repo, version)
|
||||||
|
|
||||||
|
if url is not None and repo is None and 'github' in url:
|
||||||
|
owner = url.split('github.com/')[-1].split('/')[0]
|
||||||
|
repo = url.split('github.com/')[-1].split('/')[1]
|
||||||
|
|
||||||
|
if url is not None and repo is None and 'codeberg' in url:
|
||||||
|
owner = url.split('codeberg.org/')[-1].split('/')[0]
|
||||||
|
repo = url.split('codeberg.org/')[-1].split('/')[1]
|
||||||
|
|
||||||
|
if url is not None and version is None:
|
||||||
|
version = url.split('/')[-1].replace('.tar.gz', ''\'')
|
||||||
|
|
||||||
|
if url is not None and publisher is not None:
|
||||||
|
url = url.replace(''\'''\${publisher}', publisher).replace(''\'''\${name}', name)
|
||||||
|
|
||||||
|
return url, current_hash, owner, repo, pname, name, publisher, version
|
||||||
|
|
||||||
|
def parse_json(json_versions, flavor=''\''):
|
||||||
|
versions = json.load(json_versions)
|
||||||
|
linux_versions = versions.get('linux')
|
||||||
|
config_versions = versions.get('config')
|
||||||
|
patch_versions = versions.get('patches')
|
||||||
|
zfs_versions = versions.get('zfs')
|
||||||
|
|
||||||
|
check_kernel(linux_versions, flavor)
|
||||||
|
check_cachy_config(config_versions, flavor)
|
||||||
|
check_patch_versions(patch_versions, flavor)
|
||||||
|
check_zfs_versions(zfs_versions, flavor)
|
||||||
|
|
||||||
|
def check_kernel(linux_versions, flavor=''\''):
|
||||||
|
srcinfo = requests.get('https://raw.githubusercontent.com/CachyOS/linux-cachyos/master/linux-cachyos' + flavor + '/.SRCINFO')
|
||||||
|
for line in srcinfo.text.split('\n'):
|
||||||
|
if 'pkgver = ' in line:
|
||||||
|
kernel_version = line.split('=')[-1].strip()
|
||||||
|
if kernel_version[-2:] == '.0':
|
||||||
|
kernel_version = kernel_version[:-2]
|
||||||
|
if flavor in [''\'', '-lts', '-server', '-gcc', '-hardened']:
|
||||||
|
release_src = 'https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-' + kernel_version + '.tar.xz'
|
||||||
|
if flavor == '-rc':
|
||||||
|
release_src = 'https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/snapshot/linux-' + kernel_version.replace('.rc', '-rc') + '.tar.gz'
|
||||||
|
sha256 = subprocess.check_output(['nix-prefetch-url', release_src])
|
||||||
|
prefetch = subprocess.check_output(['nix', 'hash', 'convert', '--hash-algo', 'sha256', str(sha256.decode('utf-8').strip())])
|
||||||
|
current_version = linux_versions.get('version')
|
||||||
|
current_hash = linux_versions.get('hash')
|
||||||
|
latest_hash = prefetch.decode('utf-8').strip()
|
||||||
|
print(' Checking linux versions...')
|
||||||
|
if current_hash != latest_hash:
|
||||||
|
print(' Current rev: ' + current_version)
|
||||||
|
print(' Current hash: ' + current_hash)
|
||||||
|
print(' New rev: ' + kernel_version)
|
||||||
|
print(' New hash: ' + latest_hash)
|
||||||
|
else:
|
||||||
|
print(' no update')
|
||||||
|
|
||||||
|
def check_cachy_config(config_versions, flavor=''\''):
|
||||||
|
result = subprocess.check_output(['nix-prefetch-git', '--quiet', 'https://github.com/CachyOS/linux-cachyos.git'])
|
||||||
|
prefetch = json.loads(result)
|
||||||
|
current_version = config_versions.get('rev')
|
||||||
|
latest_version = prefetch.get('rev')
|
||||||
|
print(' Checking config versions...')
|
||||||
|
if current_version != latest_version:
|
||||||
|
print(' Current rev: ' + current_version)
|
||||||
|
print(' New rev: ' + latest_version)
|
||||||
|
print(' New hash: ' + prefetch.get('hash'))
|
||||||
|
else:
|
||||||
|
print(' no update')
|
||||||
|
|
||||||
|
def check_patch_versions(patch_versions, flavor=''\''):
|
||||||
|
result = subprocess.check_output(['nix-prefetch-git', '--quiet', 'https://github.com/CachyOS/kernel-patches.git'])
|
||||||
|
prefetch = json.loads(result)
|
||||||
|
current_version = patch_versions.get('rev')
|
||||||
|
latest_version = prefetch.get('rev')
|
||||||
|
print(' Checking patch versions...')
|
||||||
|
if current_version != latest_version:
|
||||||
|
print(' Current rev: ' + current_version)
|
||||||
|
print(' New rev: ' + latest_version)
|
||||||
|
print(' New hash: ' + prefetch.get('hash'))
|
||||||
|
else:
|
||||||
|
print(' no update')
|
||||||
|
|
||||||
|
def kconfig_to_nix(flavor=''\''):
|
||||||
|
kconfig_result = subprocess.check_output(['nix', 'build', '.#nixosConfigurations.jallen-nas.pkgs.linuxPackages_cachyos' + flavor + '.kernel.kconfigToNix', '--no-link', '--print-out-paths'])
|
||||||
|
config_file = kconfig_result.decode('utf-8').strip()
|
||||||
|
if flavor == ''\'':
|
||||||
|
cachy_flavor = '-gcc'
|
||||||
|
result = subprocess.check_output(['cat', config_file])
|
||||||
|
with open('/etc/nixos/packages/linux-cachyos/config-nix/cachyos' + cachy_flavor + '.x86_64-linux.nix', 'w') as config:
|
||||||
|
config.write(result.decode('utf-8').strip())
|
||||||
|
|
||||||
|
def check_zfs_versions(zfs_versions, flavor=''\''):
|
||||||
|
result = requests.get('https://raw.githubusercontent.com/CachyOS/linux-cachyos/master/linux-cachyos' + flavor + '/PKGBUILD')
|
||||||
|
for line in result.text.split('\n'):
|
||||||
|
if 'git+https://github.com/cachyos/zfs.git#commit=' in line:
|
||||||
|
zfs_rev = line.split('zfs.git#commit=')[-1].replace('")', ''\'')
|
||||||
|
result = subprocess.check_output(['nix-prefetch-git', '--quiet', 'https://github.com/CachyOS/zfs.git', '--rev', zfs_rev])
|
||||||
|
prefetch = json.loads(result)
|
||||||
|
current_version = zfs_versions.get('rev')
|
||||||
|
latest_version = prefetch.get('rev')
|
||||||
|
print(' Checking zfs versions...')
|
||||||
|
if current_version != latest_version:
|
||||||
|
print(' Current rev: ' + current_version)
|
||||||
|
print(' New rev: ' + latest_version)
|
||||||
|
print(' New hash: ' + prefetch.get('hash'))
|
||||||
|
else:
|
||||||
|
print(' no update')
|
||||||
|
|
||||||
|
for (root,dirs,files) in os.walk('/etc/nixos/packages',topdown=True):
|
||||||
|
if 'default.nix' in files and 'versions.json' not in files:
|
||||||
|
print(root.split('/')[-1])
|
||||||
|
with open(root + '/default.nix', 'r') as package_spec:
|
||||||
|
url, current_hash, owner, repo, pname, name, publisher, version = parse_nix(package_spec)
|
||||||
|
|
||||||
|
if owner is not None and repo is not None and 'codeberg' in url:
|
||||||
|
check_codeberg(owner, repo, version)
|
||||||
|
|
||||||
|
elif owner is not None and repo is not None and 'github' in url:
|
||||||
|
check_github(owner, repo, version)
|
||||||
|
|
||||||
|
elif publisher is not None and 'open-vsx' in url:
|
||||||
|
check_open_vsx(publisher, name, version)
|
||||||
|
|
||||||
|
else:
|
||||||
|
if url is not None:
|
||||||
|
print(url)
|
||||||
|
|
||||||
|
if 'default.nix' in files and 'versions.json' in files:
|
||||||
|
with open(root + '/versions.json', 'r') as json_versions:
|
||||||
|
print('Checking Linux CachyOS')
|
||||||
|
parse_json(json_versions)
|
||||||
|
with open(root + '/versions-rc.json', 'r') as json_versions:
|
||||||
|
print('Checking Linux CachyOS RC')
|
||||||
|
parse_json(json_versions, '-rc')
|
||||||
|
with open(root + '/versions-lts.json', 'r') as json_versions:
|
||||||
|
print('Checking Linux CachyOS LTS')
|
||||||
|
parse_json(json_versions, '-lts')
|
||||||
|
with open(root + '/versions-hardened.json', 'r') as json_versions:
|
||||||
|
print('Checking Linux CachyOS Hardened')
|
||||||
|
parse_json(json_versions, '-hardened')
|
||||||
|
'';
|
||||||
|
in
|
||||||
|
{
|
||||||
|
config = {
|
||||||
|
|
||||||
|
sops = {
|
||||||
|
age.keyFile = "/home/${config.${namespace}.user.name}/.config/sops/age/keys.txt";
|
||||||
|
defaultSopsFile = "/etc/nixos/secrets/secrets.yaml";
|
||||||
|
validateSopsFiles = false;
|
||||||
|
secrets = {
|
||||||
|
"github-token" = { };
|
||||||
|
};
|
||||||
|
templates = {
|
||||||
|
".env".content = ''
|
||||||
|
GITHUB_TOKEN = "${config.sops.placeholder.github-token}"
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
home.packages = [ update-checker ];
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -1,325 +1,239 @@
|
|||||||
{ config, lib, ... }:
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
namespace,
|
||||||
|
...
|
||||||
|
}:
|
||||||
with lib;
|
with lib;
|
||||||
let
|
let
|
||||||
cfg = config.mjallen.programs.waybar;
|
cfg = config.${namespace}.programs.waybar;
|
||||||
palette = import cfg.theme.file;
|
|
||||||
|
|
||||||
defaultOpacity = palette.tokens.opacity or "opacity: 0.85;";
|
|
||||||
defaultBorderRadius = palette.tokens.borderRadius or "border-radius: 1rem;";
|
|
||||||
defaultCenterOptions =
|
|
||||||
palette.tokens.centerOptions or ''
|
|
||||||
padding-top: 0.2rem;
|
|
||||||
padding-bottom: 0.2rem;
|
|
||||||
padding-left: 0.5rem;
|
|
||||||
padding-right: 0.5rem;
|
|
||||||
margin: 3px 0;
|
|
||||||
'';
|
|
||||||
borderRight =
|
|
||||||
palette.tokens.borderRight or ''
|
|
||||||
padding-top: 0.2rem;
|
|
||||||
padding-bottom: 0.2rem;
|
|
||||||
padding-left: 0.5rem;
|
|
||||||
padding-right: 0.5rem;
|
|
||||||
margin: 3px 0;
|
|
||||||
border-radius: 0rem 1rem 1rem 0rem;
|
|
||||||
margin-right: 0.5rem;
|
|
||||||
'';
|
|
||||||
borderLeft = ''
|
|
||||||
padding-top: 0.2rem;
|
|
||||||
padding-bottom: 0.2rem;
|
|
||||||
padding-left: 0.5rem;
|
|
||||||
padding-right: 0.5rem;
|
|
||||||
margin: 3px 0;
|
|
||||||
border-radius: 1rem 0rem 0rem 1rem;
|
|
||||||
margin-left: 0.5rem;
|
|
||||||
'';
|
|
||||||
|
|
||||||
baseStyle =
|
baseStyle =
|
||||||
if cfg.style.file != null then
|
if cfg.style.file != null then
|
||||||
builtins.readFile cfg.style.file
|
builtins.readFile cfg.style.file
|
||||||
else
|
else
|
||||||
''
|
''
|
||||||
.blink_me {
|
/* =============================================================================
|
||||||
animation: blinker 1s linear infinite;
|
ANIMATIONS & GLOBAL OVERRIDES
|
||||||
}
|
============================================================================= */
|
||||||
|
|
||||||
@keyframes blinker {
|
@keyframes blinker {
|
||||||
50% {
|
50% { color: @base08; }
|
||||||
color: ${palette.colors.danger};
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Override Stylix font settings */
|
||||||
* {
|
* {
|
||||||
font-family:
|
font-family: "Jetbrains Mono Nerd Font", monospace;
|
||||||
Jetbrains Mono Nerd Font,
|
|
||||||
monospace;
|
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
min-height: 0;
|
min-height: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* =============================================================================
|
||||||
|
MAIN BAR & TOOLTIPS
|
||||||
|
============================================================================= */
|
||||||
|
window#waybar {
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
#waybar {
|
#waybar {
|
||||||
background: transparent;
|
background: transparent;
|
||||||
color: ${palette.colors.text};
|
color: @base06;
|
||||||
margin: 5px 5px;
|
margin: 5px 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
#workspaces {
|
|
||||||
background-color: ${palette.colors.bg};
|
|
||||||
${defaultBorderRadius}
|
|
||||||
${defaultOpacity}
|
|
||||||
${defaultCenterOptions}
|
|
||||||
margin-left: 0.6rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
#workspaces button {
|
|
||||||
color: ${palette.colors.primary};
|
|
||||||
${defaultBorderRadius}
|
|
||||||
padding: 0.4rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
#workspaces button.active {
|
|
||||||
color: ${palette.colors.info};
|
|
||||||
${defaultBorderRadius}
|
|
||||||
}
|
|
||||||
|
|
||||||
#workspaces button:hover {
|
|
||||||
color: ${palette.colors.info};
|
|
||||||
${defaultBorderRadius}
|
|
||||||
}
|
|
||||||
|
|
||||||
#workspaces button.focused {
|
|
||||||
color: ${palette.colors.text};
|
|
||||||
background: ${palette.colors.warning};
|
|
||||||
${defaultBorderRadius}
|
|
||||||
}
|
|
||||||
|
|
||||||
#workspaces button.urgent {
|
|
||||||
color: ${palette.colors.bg};
|
|
||||||
background: ${palette.colors.text};
|
|
||||||
${defaultBorderRadius}
|
|
||||||
}
|
|
||||||
|
|
||||||
#tooltip {
|
#tooltip {
|
||||||
background: ${palette.colors.bg};
|
background: @base00;
|
||||||
border-color: ${palette.colors.bg};
|
border-color: @base00;
|
||||||
${defaultBorderRadius}
|
border-radius: 1rem;
|
||||||
border-width: 1rem;
|
border-width: 2px; /* Reduced from 1rem which is usually too thick */
|
||||||
border-style: solid;
|
border-style: solid;
|
||||||
}
|
}
|
||||||
|
|
||||||
#window {
|
/* Right-click menu styling */
|
||||||
color: ${palette.colors.accent};
|
|
||||||
background-color: ${palette.colors.bg};
|
|
||||||
${defaultOpacity}
|
|
||||||
${defaultBorderRadius}
|
|
||||||
${defaultCenterOptions}
|
|
||||||
margin-left: 4rem;
|
|
||||||
margin-right: ${toString cfg.windowOffset}rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* make window module transparent when no windows present */
|
|
||||||
#window.empty {
|
|
||||||
background-color: transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
#custom-power {
|
|
||||||
color: ${palette.colors.primary};
|
|
||||||
background-color: ${palette.colors.bg};
|
|
||||||
${defaultOpacity}
|
|
||||||
${defaultCenterOptions}
|
|
||||||
border-radius: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
menu {
|
menu {
|
||||||
border-radius: 15px;
|
border-radius: 15px;
|
||||||
background: ${palette.colors.bg};
|
background: @base00;
|
||||||
color: ${palette.colors.text};
|
color: @base06;
|
||||||
}
|
}
|
||||||
menuitem {
|
menuitem {
|
||||||
border-radius: 15px;
|
border-radius: 15px;
|
||||||
}
|
}
|
||||||
|
|
||||||
#custom-weather {
|
/* =============================================================================
|
||||||
color: ${palette.colors.primary};
|
WORKSPACES
|
||||||
background-color: ${palette.colors.bg};
|
============================================================================= */
|
||||||
${defaultOpacity}
|
#workspaces {
|
||||||
${defaultCenterOptions}
|
background-color: @base00;
|
||||||
border-radius: 0;
|
border-radius: 1rem;
|
||||||
|
opacity: 0.85;
|
||||||
|
padding: 0.2rem 0.5rem;
|
||||||
|
margin: 3px 0 3px 0.6rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
#custom-notifications {
|
#workspaces button {
|
||||||
color: ${palette.colors.primary};
|
color: @base0F;
|
||||||
background-color: ${palette.colors.bg};
|
border-radius: 1rem;
|
||||||
${defaultOpacity}
|
padding: 0.4rem;
|
||||||
${defaultCenterOptions}
|
/* Border handled by stylix, but we add specific colors below */
|
||||||
border-radius: 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#custom-notifications.notify {
|
#workspaces button.active,
|
||||||
color: ${palette.colors.danger};
|
#workspaces button:hover {
|
||||||
|
color: @base0C;
|
||||||
|
border-radius: 1rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#workspaces button.focused {
|
||||||
|
color: @base06;
|
||||||
|
background: @base0A;
|
||||||
|
border-radius: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
#workspaces button.urgent {
|
||||||
|
color: @base00;
|
||||||
|
background: @base06;
|
||||||
|
border-radius: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* =============================================================================
|
||||||
|
WINDOW TITLE
|
||||||
|
============================================================================= */
|
||||||
|
#window {
|
||||||
|
color: @base0E;
|
||||||
|
background-color: @base00;
|
||||||
|
opacity: 0.85;
|
||||||
|
border-radius: 1rem;
|
||||||
|
padding: 0.2rem 0.5rem;
|
||||||
|
margin: 3px 0;
|
||||||
|
|
||||||
|
margin-left: 4rem;
|
||||||
|
margin-right: 75rem; /* This is very large, likely a centering hack */
|
||||||
|
}
|
||||||
|
|
||||||
|
#window.empty {
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* =============================================================================
|
||||||
|
SHARED MODULE STYLES
|
||||||
|
============================================================================= */
|
||||||
|
/* This block applies the standard "Nord Background" style to all modules
|
||||||
|
to avoid repeating code for every single ID. */
|
||||||
|
#custom-power,
|
||||||
|
#custom-weather,
|
||||||
|
#custom-notifications,
|
||||||
|
#battery,
|
||||||
|
#clock,
|
||||||
|
#idle_inhibitor,
|
||||||
|
#network,
|
||||||
|
#bluetooth,
|
||||||
|
#wireplumber,
|
||||||
|
#keyboard-state,
|
||||||
|
#temperature,
|
||||||
|
#custom-left-end,
|
||||||
|
#custom-right-end,
|
||||||
|
#custom-lights,
|
||||||
|
#tray {
|
||||||
|
background-color: @base00;
|
||||||
|
opacity: 0.85;
|
||||||
|
padding: 0.2rem 0.5rem;
|
||||||
|
margin: 3px 0;
|
||||||
|
border-radius: 0; /* Default to square, rounded manually below */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Common Hover Effect */
|
||||||
|
#idle_inhibitor:hover,
|
||||||
|
#network:hover,
|
||||||
|
#bluetooth:hover,
|
||||||
|
#wireplumber:hover,
|
||||||
|
#temperature:hover,
|
||||||
|
#custom-lights:hover {
|
||||||
|
background: @base02;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* =============================================================================
|
||||||
|
MODULE SPECIFIC COLORS
|
||||||
|
============================================================================= */
|
||||||
|
|
||||||
|
#custom-power,
|
||||||
|
#custom-weather,
|
||||||
|
#custom-notifications {
|
||||||
|
color: @base0F;
|
||||||
|
}
|
||||||
|
|
||||||
|
#custom-notifications.notify { color: @base08; }
|
||||||
#custom-notifications.alert {
|
#custom-notifications.alert {
|
||||||
animation-name: blinker;
|
animation: blinker 3s linear infinite;
|
||||||
animation-duration: 3s;
|
|
||||||
animation-timing-function: linear;
|
|
||||||
animation-iteration-count: infinite;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#battery {
|
#battery {
|
||||||
color: ${palette.colors.accent};
|
color: @base0E;
|
||||||
background-color: ${palette.colors.bg};
|
|
||||||
${defaultOpacity}
|
|
||||||
${defaultCenterOptions}
|
|
||||||
border-radius: 0;
|
|
||||||
min-width: 3rem;
|
min-width: 3rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
#clock {
|
#clock { color: @base0F; }
|
||||||
color: ${palette.colors.primary};
|
|
||||||
background-color: ${palette.colors.bg};
|
|
||||||
${defaultOpacity}
|
|
||||||
${defaultCenterOptions}
|
|
||||||
border-radius: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ------------- */
|
|
||||||
|
|
||||||
#idle_inhibitor {
|
#idle_inhibitor {
|
||||||
color: ${palette.colors.primary};
|
color: @base0F;
|
||||||
background-color: ${palette.colors.bg};
|
|
||||||
${defaultOpacity}
|
|
||||||
${defaultCenterOptions}
|
|
||||||
border-radius: 0;
|
|
||||||
padding-right: 1rem;
|
padding-right: 1rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
#idle_inhibitor:hover {
|
|
||||||
background: ${palette.colors.surfaceAlt};
|
|
||||||
}
|
|
||||||
|
|
||||||
#network {
|
#network {
|
||||||
color: ${palette.colors.accent};
|
color: @base0E;
|
||||||
background-color: ${palette.colors.bg};
|
|
||||||
${defaultOpacity}
|
|
||||||
${defaultCenterOptions}
|
|
||||||
border-radius: 0;
|
|
||||||
padding-right: 15px;
|
padding-right: 15px;
|
||||||
}
|
}
|
||||||
|
|
||||||
#network:hover {
|
#bluetooth { color: @base0F; }
|
||||||
background: ${palette.colors.surfaceAlt};
|
|
||||||
}
|
|
||||||
|
|
||||||
#bluetooth {
|
/* --- Audio source/sink --- */
|
||||||
color: ${palette.colors.primary};
|
#wireplumber.source,
|
||||||
background-color: ${palette.colors.bg};
|
#wireplumber.sink {
|
||||||
${defaultOpacity}
|
color: @base0C;
|
||||||
${defaultCenterOptions}
|
|
||||||
border-radius: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#bluetooth:hover {
|
|
||||||
background: ${palette.colors.surfaceAlt};
|
|
||||||
}
|
|
||||||
|
|
||||||
#wireplumber.source {
|
|
||||||
color: ${palette.colors.info};
|
|
||||||
background-color: ${palette.colors.bg};
|
|
||||||
${defaultOpacity}
|
|
||||||
${defaultCenterOptions}
|
|
||||||
border-radius: 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#wireplumber.source.muted {
|
#wireplumber.source.muted {
|
||||||
animation-name: blinker;
|
animation: blinker 2s linear infinite;
|
||||||
animation-duration: 2s;
|
|
||||||
animation-timing-function: linear;
|
|
||||||
animation-iteration-count: infinite;
|
|
||||||
padding-right: 1rem;
|
padding-right: 1rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
#wireplumber.source:hover {
|
|
||||||
background: ${palette.colors.surfaceAlt};
|
|
||||||
}
|
|
||||||
|
|
||||||
#wireplumber.sink {
|
|
||||||
color: ${palette.colors.info};
|
|
||||||
background-color: ${palette.colors.bg};
|
|
||||||
${defaultOpacity}
|
|
||||||
${defaultCenterOptions}
|
|
||||||
border-radius: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#wireplumber.sink.muted {
|
#wireplumber.sink.muted {
|
||||||
animation-name: blinker;
|
animation: blinker 5s linear infinite;
|
||||||
animation-duration: 5s;
|
|
||||||
animation-timing-function: linear;
|
|
||||||
animation-iteration-count: infinite;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#wireplumber.sink:hover {
|
/* --- Keyboard --- */
|
||||||
background: ${palette.colors.surfaceAlt};
|
#keyboard-state.numlock { color: @base0C; }
|
||||||
}
|
#keyboard-state.capslock { color: @base0F; }
|
||||||
|
|
||||||
#keyboard-state.numlock {
|
|
||||||
color: ${palette.colors.info};
|
|
||||||
background-color: ${palette.colors.bg};
|
|
||||||
${defaultOpacity}
|
|
||||||
${defaultCenterOptions}
|
|
||||||
border-radius: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#keyboard-state.capslock {
|
|
||||||
color: ${palette.colors.primary};
|
|
||||||
background-color: ${palette.colors.bg};
|
|
||||||
${defaultOpacity}
|
|
||||||
${defaultCenterOptions}
|
|
||||||
border-radius: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
/* --- Temperature --- */
|
||||||
|
#temperature,
|
||||||
#temperature.gpu {
|
#temperature.gpu {
|
||||||
color: ${palette.colors.primary};
|
color: @base0F;
|
||||||
background-color: ${palette.colors.bg};
|
|
||||||
${defaultOpacity}
|
|
||||||
${defaultCenterOptions}
|
|
||||||
border-radius: 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#temperature.gpu:hover {
|
/* --- Tray --- */
|
||||||
background: ${palette.colors.surfaceAlt};
|
|
||||||
}
|
|
||||||
|
|
||||||
#temperature {
|
|
||||||
color: ${palette.colors.primary};
|
|
||||||
background-color: ${palette.colors.bg};
|
|
||||||
${defaultOpacity}
|
|
||||||
${defaultCenterOptions}
|
|
||||||
border-radius: 0
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ------------- */
|
|
||||||
|
|
||||||
#tray {
|
#tray {
|
||||||
background-color: ${palette.colors.bg};
|
border-radius: 1rem;
|
||||||
${defaultOpacity}
|
|
||||||
${defaultCenterOptions}
|
|
||||||
${defaultBorderRadius}
|
|
||||||
margin-right: 0.6rem;
|
margin-right: 0.6rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ------------- */
|
/* =============================================================================
|
||||||
|
DECORATIVE END CAPS & EXTRAS
|
||||||
|
============================================================================= */
|
||||||
#custom-left-end {
|
#custom-left-end {
|
||||||
background-color: ${palette.colors.bg};
|
border-radius: 1rem 0 0 1rem;
|
||||||
${defaultOpacity}
|
margin-left: 0.5rem;
|
||||||
${borderLeft}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#custom-right-end {
|
#custom-right-end {
|
||||||
background-color: ${palette.colors.bg};
|
border-radius: 0 1rem 1rem 0;
|
||||||
${defaultOpacity}
|
margin-right: 0.5rem;
|
||||||
${borderRight}
|
}
|
||||||
|
|
||||||
|
#custom-lights {
|
||||||
|
color: @base0C;
|
||||||
|
/* Re-declaring background here to ensure specific override logic if needed */
|
||||||
|
background-color: @base00;
|
||||||
|
border-radius: 1rem 0 0 1rem;
|
||||||
|
margin-left: 0.5rem;
|
||||||
}
|
}
|
||||||
'';
|
'';
|
||||||
in
|
in
|
||||||
@@ -474,15 +388,15 @@ in
|
|||||||
|
|
||||||
"custom/power" = {
|
"custom/power" = {
|
||||||
format = "⏻ ";
|
format = "⏻ ";
|
||||||
tooltip = false;
|
tooltip = false;
|
||||||
menu = "on-click";
|
menu = "on-click";
|
||||||
menu-file = "~/.config/waybar/power_menu.xml";
|
menu-file = "~/.config/waybar/power_menu.xml";
|
||||||
menu-actions = {
|
menu-actions = {
|
||||||
shutdown = "shutdown";
|
shutdown = "shutdown";
|
||||||
reboot = "reboot";
|
reboot = "reboot";
|
||||||
suspend = "systemctl suspend";
|
suspend = "systemctl suspend";
|
||||||
hibernate = "systemctl hibernate";
|
hibernate = "systemctl hibernate";
|
||||||
lock = "pidof hyprlock || hyprlock";
|
lock = "pidof hyprlock || hyprlock";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -596,10 +510,10 @@ in
|
|||||||
calendar = {
|
calendar = {
|
||||||
mode = "month";
|
mode = "month";
|
||||||
format = {
|
format = {
|
||||||
months = "<span color='${palette.colors.primary}'><b>{}</b></span>";
|
months = "<span color='@base0F'><b>{}</b></span>";
|
||||||
days = "<span color='${palette.colors.primary}'><b>{}</b></span>";
|
days = "<span color='@base0F'><b>{}</b></span>";
|
||||||
weekdays = "<span color='${palette.colors.info}'><b>{}</b></span>";
|
weekdays = "<span color='@base0C'><b>{}</b></span>";
|
||||||
today = "<span color='${palette.colors.success}'><b><u>{}</u></b></span>";
|
today = "<span color='${config.lib.stylix.colors.base0B}'><b><u>{}</u></b></span>";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
{ lib, ... }:
|
{ lib, namespace, ... }:
|
||||||
with lib;
|
with lib;
|
||||||
let
|
let
|
||||||
inherit (types)
|
inherit (types)
|
||||||
@@ -13,7 +13,7 @@ let
|
|||||||
;
|
;
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
options.mjallen.programs.waybar = {
|
options.${namespace}.programs.waybar = {
|
||||||
enable = mkEnableOption "Waybar status bar";
|
enable = mkEnableOption "Waybar status bar";
|
||||||
|
|
||||||
# Legacy/compat options (kept for backwards compatibility)
|
# Legacy/compat options (kept for backwards compatibility)
|
||||||
@@ -41,21 +41,6 @@ in
|
|||||||
description = "Right margin offset for the hyprland/window module (in rem).";
|
description = "Right margin offset for the hyprland/window module (in rem).";
|
||||||
};
|
};
|
||||||
|
|
||||||
# Theme
|
|
||||||
theme = mkOption {
|
|
||||||
type = submodule {
|
|
||||||
options = {
|
|
||||||
file = mkOption {
|
|
||||||
type = path;
|
|
||||||
default = lib.snowfall.fs.get-file "modules/home/desktop/theme/palettes/nord.nix";
|
|
||||||
description = "Nix file exporting a palette attrset (e.g., Nord).";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
default = { };
|
|
||||||
description = "Theme configuration.";
|
|
||||||
};
|
|
||||||
|
|
||||||
# Layout
|
# Layout
|
||||||
layout = mkOption {
|
layout = mkOption {
|
||||||
type = submodule {
|
type = submodule {
|
||||||
|
|||||||
@@ -6,11 +6,13 @@
|
|||||||
...
|
...
|
||||||
}:
|
}:
|
||||||
let
|
let
|
||||||
cfg = config.mjallen.programs.waybar;
|
cfg = config.${namespace}.programs.waybar;
|
||||||
|
|
||||||
pythonEnv = pkgs.python3.withPackages (_ps: [
|
pythonEnv = pkgs.python3.withPackages (
|
||||||
pkgs.${namespace}.homeassistant-api
|
_ps: with pkgs.${namespace}; [
|
||||||
]);
|
homeassistant-api
|
||||||
|
]
|
||||||
|
);
|
||||||
|
|
||||||
waybar-hass = pkgs.writeScriptBin "waybar-hass" ''
|
waybar-hass = pkgs.writeScriptBin "waybar-hass" ''
|
||||||
#!${pythonEnv}/bin/python
|
#!${pythonEnv}/bin/python
|
||||||
|
|||||||
@@ -2,10 +2,11 @@
|
|||||||
config,
|
config,
|
||||||
lib,
|
lib,
|
||||||
pkgs,
|
pkgs,
|
||||||
|
namespace,
|
||||||
...
|
...
|
||||||
}:
|
}:
|
||||||
let
|
let
|
||||||
cfg = config.mjallen.programs.waybar;
|
cfg = config.${namespace}.programs.waybar;
|
||||||
|
|
||||||
waybar-weather = pkgs.writeScriptBin "waybar-weather" ''
|
waybar-weather = pkgs.writeScriptBin "waybar-weather" ''
|
||||||
#!/usr/bin/env nix-shell
|
#!/usr/bin/env nix-shell
|
||||||
|
|||||||
@@ -1,8 +1,12 @@
|
|||||||
{ config, lib, ... }:
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
namespace,
|
||||||
|
...
|
||||||
|
}:
|
||||||
with lib;
|
with lib;
|
||||||
let
|
let
|
||||||
cfg = config.mjallen.programs.wlogout;
|
cfg = config.${namespace}.programs.wlogout;
|
||||||
palette = import cfg.theme.file;
|
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
imports = [ ./options.nix ];
|
imports = [ ./options.nix ];
|
||||||
@@ -53,13 +57,13 @@ in
|
|||||||
}
|
}
|
||||||
|
|
||||||
window {
|
window {
|
||||||
background-color: ${palette.colors.bg}f0
|
background-color: ${config.lib.stylix.colors.base00}f0
|
||||||
}
|
}
|
||||||
|
|
||||||
button {
|
button {
|
||||||
margin: 8px;
|
margin: 8px;
|
||||||
color: ${palette.colors.info};
|
color: ${config.lib.stylix.colors.base0C};
|
||||||
background-color: ${palette.colors.bgAlt};
|
background-color: ${config.lib.stylix.colors.base01};
|
||||||
border-style: solid;
|
border-style: solid;
|
||||||
border-width: 2px;
|
border-width: 2px;
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
@@ -70,8 +74,8 @@ in
|
|||||||
button:active,
|
button:active,
|
||||||
button:focus,
|
button:focus,
|
||||||
button:hover {
|
button:hover {
|
||||||
color: ${palette.colors.info};
|
color: ${config.lib.stylix.colors.base0C};
|
||||||
background-color: ${palette.colors.surfaceAlt};
|
background-color: ${config.lib.stylix.colors.base02Alt};
|
||||||
outline-style: none;
|
outline-style: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,26 +1,7 @@
|
|||||||
{ lib, ... }:
|
{ lib, namespace, ... }:
|
||||||
with lib;
|
with lib;
|
||||||
{
|
{
|
||||||
options.mjallen.programs.wlogout = {
|
options.${namespace}.programs.wlogout = {
|
||||||
enable = mkEnableOption "enable wlogout";
|
enable = mkEnableOption "enable wlogout";
|
||||||
|
|
||||||
fontName = mkOption {
|
|
||||||
type = types.str;
|
|
||||||
default = "Deja Vu Sans";
|
|
||||||
};
|
|
||||||
|
|
||||||
theme = mkOption {
|
|
||||||
type = types.submodule {
|
|
||||||
options = {
|
|
||||||
file = mkOption {
|
|
||||||
type = types.path;
|
|
||||||
default = lib.snowfall.fs.get-file "modules/home/desktop/theme/palettes/nord.nix";
|
|
||||||
description = "Nix file exporting a palette attrset.";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
default = { };
|
|
||||||
description = "wlogout theme palette configuration.";
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,12 @@
|
|||||||
{ config, lib, ... }:
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
namespace,
|
||||||
|
...
|
||||||
|
}:
|
||||||
with lib;
|
with lib;
|
||||||
let
|
let
|
||||||
cfg = config.mjallen.programs.wofi;
|
cfg = config.${namespace}.programs.wofi;
|
||||||
palette = import cfg.theme.file;
|
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
imports = [ ./options.nix ];
|
imports = [ ./options.nix ];
|
||||||
@@ -20,9 +24,9 @@ in
|
|||||||
window {
|
window {
|
||||||
margin: 0px;
|
margin: 0px;
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
border: 0.16em solid ${palette.colors.accent};
|
border: 0.16em solid ${config.lib.stylix.colors.base0E};
|
||||||
border-radius: 0.1em;
|
border-radius: 0.1em;
|
||||||
background-color: ${palette.colors.bg};
|
background-color: ${config.lib.stylix.colors.base00};
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Inner Box */
|
/* Inner Box */
|
||||||
@@ -30,7 +34,7 @@ in
|
|||||||
margin: 5px;
|
margin: 5px;
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
border: none;
|
border: none;
|
||||||
background-color: ${palette.colors.bg};
|
background-color: ${config.lib.stylix.colors.base00};
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Outer Box */
|
/* Outer Box */
|
||||||
@@ -38,7 +42,7 @@ in
|
|||||||
margin: 5px;
|
margin: 5px;
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
border: none;
|
border: none;
|
||||||
background-color: ${palette.colors.bg};
|
background-color: ${config.lib.stylix.colors.base00};
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Scroll */
|
/* Scroll */
|
||||||
@@ -46,7 +50,7 @@ in
|
|||||||
margin: 0px;
|
margin: 0px;
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
border: none;
|
border: none;
|
||||||
background-color: ${palette.colors.bg};
|
background-color: ${config.lib.stylix.colors.base00};
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Input */
|
/* Input */
|
||||||
@@ -55,46 +59,46 @@ in
|
|||||||
padding: 10px;
|
padding: 10px;
|
||||||
border: none;
|
border: none;
|
||||||
border-radius: 0.1em;
|
border-radius: 0.1em;
|
||||||
color: ${palette.colors.text};
|
color: ${config.lib.stylix.colors.base06};
|
||||||
background-color: ${palette.colors.bg};
|
background-color: ${config.lib.stylix.colors.base00};
|
||||||
}
|
}
|
||||||
|
|
||||||
#input image {
|
#input image {
|
||||||
border: none;
|
border: none;
|
||||||
color: ${palette.colors.danger};
|
color: ${config.lib.stylix.colors.base08};
|
||||||
}
|
}
|
||||||
|
|
||||||
#input * {
|
#input * {
|
||||||
outline: 4px solid ${palette.colors.danger}!important;
|
outline: 4px solid ${config.lib.stylix.colors.base08}!important;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Text */
|
/* Text */
|
||||||
#text {
|
#text {
|
||||||
margin: 5px;
|
margin: 5px;
|
||||||
border: none;
|
border: none;
|
||||||
color: ${palette.colors.text};
|
color: ${config.lib.stylix.colors.base06};
|
||||||
}
|
}
|
||||||
|
|
||||||
#entry {
|
#entry {
|
||||||
background-color: ${palette.colors.bg};
|
background-color: ${config.lib.stylix.colors.base00};
|
||||||
}
|
}
|
||||||
|
|
||||||
#entry arrow {
|
#entry arrow {
|
||||||
border: none;
|
border: none;
|
||||||
color: ${palette.colors.accent};
|
color: ${config.lib.stylix.colors.base0E};
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Selected Entry */
|
/* Selected Entry */
|
||||||
#entry:selected {
|
#entry:selected {
|
||||||
border: 0.11em solid ${palette.colors.accent};
|
border: 0.11em solid ${config.lib.stylix.colors.base0E};
|
||||||
}
|
}
|
||||||
|
|
||||||
#entry:selected #text {
|
#entry:selected #text {
|
||||||
color: ${palette.colors.info};
|
color: ${config.lib.stylix.colors.base0C};
|
||||||
}
|
}
|
||||||
|
|
||||||
#entry:drop(active) {
|
#entry:drop(active) {
|
||||||
background-color: ${palette.colors.accent}!important;
|
background-color: ${config.lib.stylix.colors.base0E}!important;
|
||||||
}
|
}
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,26 +1,12 @@
|
|||||||
{ lib, ... }:
|
{ lib, namespace, ... }:
|
||||||
with lib;
|
with lib;
|
||||||
{
|
{
|
||||||
options.mjallen.programs.wofi = {
|
options.${namespace}.programs.wofi = {
|
||||||
enable = mkEnableOption "enable wofi";
|
enable = mkEnableOption "enable wofi";
|
||||||
|
|
||||||
fontName = mkOption {
|
fontName = mkOption {
|
||||||
type = types.str;
|
type = types.str;
|
||||||
default = "Deja Vu Sans";
|
default = "Deja Vu Sans";
|
||||||
};
|
};
|
||||||
|
|
||||||
theme = mkOption {
|
|
||||||
type = types.submodule {
|
|
||||||
options = {
|
|
||||||
file = mkOption {
|
|
||||||
type = types.path;
|
|
||||||
default = lib.snowfall.fs.get-file "modules/home/desktop/theme/palettes/nord.nix";
|
|
||||||
description = "Nix file exporting a palette attrset.";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
default = { };
|
|
||||||
description = "Wofi theme palette configuration.";
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,4 @@
|
|||||||
{
|
{
|
||||||
config,
|
|
||||||
lib,
|
|
||||||
pkgs,
|
|
||||||
namespace,
|
|
||||||
...
|
...
|
||||||
}:
|
}:
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,13 +1,14 @@
|
|||||||
{
|
{
|
||||||
config,
|
config,
|
||||||
lib,
|
lib,
|
||||||
|
namespace,
|
||||||
...
|
...
|
||||||
}:
|
}:
|
||||||
let
|
let
|
||||||
cfg = config.mjallen.shell-aliases;
|
cfg = config.${namespace}.shell-aliases;
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
options.mjallen.shell-aliases = {
|
options.${namespace}.shell-aliases = {
|
||||||
enable = lib.mkEnableOption "Common shell aliases";
|
enable = lib.mkEnableOption "Common shell aliases";
|
||||||
|
|
||||||
buildHost = lib.mkOption {
|
buildHost = lib.mkOption {
|
||||||
|
|||||||
@@ -1,29 +1,28 @@
|
|||||||
{
|
{
|
||||||
config,
|
config,
|
||||||
lib,
|
lib,
|
||||||
|
namespace,
|
||||||
...
|
...
|
||||||
}:
|
}:
|
||||||
let
|
let
|
||||||
cfg = config.mjallen.sops;
|
cfg = config.${namespace}.sops;
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
imports = [ ./options.nix ];
|
imports = [ ./options.nix ];
|
||||||
|
|
||||||
config = lib.mkIf cfg.enable {
|
config = lib.mkIf cfg.enable {
|
||||||
# sops = {
|
sops = {
|
||||||
# age.keyFile = "/home/${user}/.config/sops/age/keys.txt";
|
age.keyFile = "/home/${config.${namespace}.user.name}/.config/sops/age/keys.txt";
|
||||||
# defaultSopsFile = "/etc/nixos/secrets/secrets.yaml";
|
defaultSopsFile = "/etc/nixos/secrets/secrets.yaml";
|
||||||
# validateSopsFiles = false;
|
validateSopsFiles = false;
|
||||||
# secrets = {
|
# secrets = {
|
||||||
# "ssh-keys-public/desktop-nixos" = {
|
# "github-token" = { };
|
||||||
# path = "/home/${user}/.ssh/id_ed25519.pub";
|
# };
|
||||||
# mode = "0644";
|
# templates = {
|
||||||
# };
|
# ".env".content = ''
|
||||||
# "ssh-keys-private/desktop-nixos" = {
|
# GITHUB_TOKEN = "${config.sops.placeholder.github-token}"
|
||||||
# path = "/home/${user}/.ssh/id_ed25519";
|
# '';
|
||||||
# mode = "0600";
|
# };
|
||||||
# };
|
};
|
||||||
# };
|
|
||||||
# };
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{ lib, ... }:
|
{ lib, namespace, ... }:
|
||||||
with lib;
|
with lib;
|
||||||
{
|
{
|
||||||
options.mjallen.sops = {
|
options.${namespace}.sops = {
|
||||||
enable = mkEnableOption "enable sops";
|
enable = mkEnableOption "enable sops";
|
||||||
|
|
||||||
defaultSopsFile = mkOption {
|
defaultSopsFile = mkOption {
|
||||||
|
|||||||
105
modules/home/stylix/default.nix
Normal file
105
modules/home/stylix/default.nix
Normal file
@@ -0,0 +1,105 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
system,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
# # Pull from global theme options
|
||||||
|
# themeSize = "standard"; # "standard" | "compact"
|
||||||
|
# themeAccent = "default"; # "default" | ... | "all"
|
||||||
|
# themeTweak = "normal"; # "normal" | "rimless" | "float" | "black"
|
||||||
|
# themeColor = "dark"; # "light" | "dark"
|
||||||
|
# iconThemeVariant = "default"; # "default" | ... | "all"
|
||||||
|
# iconScheme = "nord"; # "default" | "nord" | "dracula" | ...
|
||||||
|
|
||||||
|
# # GTK
|
||||||
|
# gtkTheme = "Colloid-dark-standard";
|
||||||
|
# gtkThemePkg = pkgs.colloid-gtk-theme.override {
|
||||||
|
# sizeVariants = [ themeSize ];
|
||||||
|
# colorVariants = [ themeColor ];
|
||||||
|
# themeVariants = [ themeAccent ];
|
||||||
|
# tweaks = [ themeTweak ];
|
||||||
|
# };
|
||||||
|
|
||||||
|
# # Icons
|
||||||
|
# iconTheme = "Colloid-nord-dark";
|
||||||
|
# iconThemePkg = pkgs.colloid-icon-theme.override {
|
||||||
|
# schemeVariants = [ iconScheme ];
|
||||||
|
# colorVariants = [ iconThemeVariant ];
|
||||||
|
# };
|
||||||
|
isDarwin = system == "aarch64-darwin";
|
||||||
|
in
|
||||||
|
{
|
||||||
|
stylix = {
|
||||||
|
enable = true;
|
||||||
|
overlays.enable = false;
|
||||||
|
enableReleaseChecks = false;
|
||||||
|
base16Scheme = "${pkgs.base16-schemes}/share/themes/nord.yaml";
|
||||||
|
polarity = "dark";
|
||||||
|
|
||||||
|
cursor = {
|
||||||
|
name = "macOS";
|
||||||
|
size = 24;
|
||||||
|
package = pkgs.apple-cursor;
|
||||||
|
};
|
||||||
|
|
||||||
|
fonts = {
|
||||||
|
serif = {
|
||||||
|
package = pkgs.dejavu_fonts;
|
||||||
|
name = "DejaVu Serif";
|
||||||
|
};
|
||||||
|
|
||||||
|
sansSerif = {
|
||||||
|
package = pkgs.dejavu_fonts;
|
||||||
|
name = "DejaVu Sans";
|
||||||
|
};
|
||||||
|
|
||||||
|
monospace = {
|
||||||
|
package = pkgs.nerd-fonts.jetbrains-mono;
|
||||||
|
name = "JetBrainsMono NFM";
|
||||||
|
};
|
||||||
|
|
||||||
|
emoji = {
|
||||||
|
package = pkgs.noto-fonts-color-emoji;
|
||||||
|
name = "Noto Color Emoji";
|
||||||
|
};
|
||||||
|
|
||||||
|
sizes = {
|
||||||
|
applications = if isDarwin then 10 else 12;
|
||||||
|
desktop = if isDarwin then 12 else 14;
|
||||||
|
popups = config.stylix.fonts.sizes.desktop;
|
||||||
|
terminal = config.stylix.fonts.sizes.applications;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
icons = {
|
||||||
|
enable = true;
|
||||||
|
package = pkgs.colloid-icon-theme.override {
|
||||||
|
schemeVariants = [ "nord" ];
|
||||||
|
colorVariants = [ "default" ];
|
||||||
|
};
|
||||||
|
dark = "Colloid-Nord-Dark";
|
||||||
|
light = "Colloid-Nord-Light";
|
||||||
|
};
|
||||||
|
|
||||||
|
opacity = {
|
||||||
|
terminal = 0.85;
|
||||||
|
};
|
||||||
|
|
||||||
|
targets = {
|
||||||
|
hyprlock = {
|
||||||
|
enable = false;
|
||||||
|
useWallpaper = false;
|
||||||
|
};
|
||||||
|
kde.enable = false;
|
||||||
|
firefox = {
|
||||||
|
enable = false;
|
||||||
|
profileNames = [
|
||||||
|
"default"
|
||||||
|
"954lxlok.default"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -115,8 +115,8 @@ in
|
|||||||
tarnow = "${getExe pkgs.gnutar} -acf ";
|
tarnow = "${getExe pkgs.gnutar} -acf ";
|
||||||
untar = "${getExe pkgs.gnutar} -zxvf ";
|
untar = "${getExe pkgs.gnutar} -zxvf ";
|
||||||
wget = "${getExe pkgs.wget} -c ";
|
wget = "${getExe pkgs.wget} -c ";
|
||||||
remove-empty = ''${getExe' pkgs.findutils "find"} . -type d --empty --delete'';
|
remove-empty = "${getExe' pkgs.findutils "find"} . -type d --empty --delete";
|
||||||
print-empty = ''${getExe' pkgs.findutils "find"} . -type d --empty --print'';
|
print-empty = "${getExe' pkgs.findutils "find"} . -type d --empty --print";
|
||||||
dfh = "${getExe' pkgs.coreutils "df"} -h";
|
dfh = "${getExe' pkgs.coreutils "df"} -h";
|
||||||
duh = "${getExe' pkgs.coreutils "du"} -h";
|
duh = "${getExe' pkgs.coreutils "du"} -h";
|
||||||
usage = "${getExe' pkgs.coreutils "du"} -ah -d1 | sort -rn 2>/dev/null";
|
usage = "${getExe' pkgs.coreutils "du"} -ah -d1 | sort -rn 2>/dev/null";
|
||||||
|
|||||||
@@ -24,6 +24,13 @@ in
|
|||||||
config = mkIf cfg.enable {
|
config = mkIf cfg.enable {
|
||||||
boot = {
|
boot = {
|
||||||
|
|
||||||
|
kernelModules = [ "kvm" ];
|
||||||
|
kernelParams = lib.mkDefault [
|
||||||
|
"quiet"
|
||||||
|
"splash"
|
||||||
|
"udev.log_level=3"
|
||||||
|
];
|
||||||
|
|
||||||
binfmt = lib.mkIf isArm {
|
binfmt = lib.mkIf isArm {
|
||||||
registrations."x86_64-linux" = {
|
registrations."x86_64-linux" = {
|
||||||
magicOrExtension = ''\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x3e\x00'';
|
magicOrExtension = ''\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x3e\x00'';
|
||||||
@@ -36,12 +43,28 @@ in
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
supportedFilesystems = [ "bcachefs" ];
|
supportedFilesystems = {
|
||||||
|
bcachefs = lib.mkOverride 90 true;
|
||||||
|
btrfs = lib.mkOverride 90 true;
|
||||||
|
};
|
||||||
|
|
||||||
consoleLogLevel = lib.mkForce 3;
|
consoleLogLevel = lib.mkDefault 0;
|
||||||
bootspec.enable = (!isArm);
|
bootspec.enable = (!isArm);
|
||||||
|
|
||||||
initrd = {
|
initrd = {
|
||||||
|
verbose = lib.mkDefault false;
|
||||||
|
# availableKernelModules = {
|
||||||
|
# bcachefs = lib.mkOverride 90 true;
|
||||||
|
# btrfs = lib.mkOverride 90 true;
|
||||||
|
# };
|
||||||
|
# kernelModules = {
|
||||||
|
# bcachefs = lib.mkOverride 90 true;
|
||||||
|
# btrfs = lib.mkOverride 90 true;
|
||||||
|
# };
|
||||||
|
# systemd.storePaths = with pkgs; [
|
||||||
|
# bcachefs-tools
|
||||||
|
# ];
|
||||||
|
|
||||||
luks = mkIf cfg.yubikeyEncryption {
|
luks = mkIf cfg.yubikeyEncryption {
|
||||||
devices = {
|
devices = {
|
||||||
"${config.disko.devices.disk.main.content.partitions.root.name}" = {
|
"${config.disko.devices.disk.main.content.partitions.root.name}" = {
|
||||||
|
|||||||
@@ -58,6 +58,8 @@ in
|
|||||||
};
|
};
|
||||||
|
|
||||||
gnome.gnome-keyring.enable = true;
|
gnome.gnome-keyring.enable = true;
|
||||||
|
geoclue2.enable = true;
|
||||||
|
upower.enable = true;
|
||||||
|
|
||||||
dbus.enable = true;
|
dbus.enable = true;
|
||||||
ddccontrol.enable = false;
|
ddccontrol.enable = false;
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ let
|
|||||||
'';
|
'';
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
options.mjallen.desktop.hyprland = {
|
options.${namespace}.desktop.hyprland = {
|
||||||
enable = mkEnableOption "enable hyprland desktop environment";
|
enable = mkEnableOption "enable hyprland desktop environment";
|
||||||
|
|
||||||
wallpaperSource = mkOpt (types.enum [
|
wallpaperSource = mkOpt (types.enum [
|
||||||
|
|||||||
@@ -155,7 +155,7 @@ in
|
|||||||
];
|
];
|
||||||
script = ''
|
script = ''
|
||||||
${wallpaper-command}
|
${wallpaper-command}
|
||||||
${lib.getExe' pkgs.hyprland "hyprctl"} hyprpaper reload ,${cfg.wallpaper}
|
${lib.getExe' pkgs.hyprland "hyprctl"} hyprpaper wallpaper ,${cfg.wallpaper},
|
||||||
'';
|
'';
|
||||||
serviceConfig = {
|
serviceConfig = {
|
||||||
Type = "oneshot";
|
Type = "oneshot";
|
||||||
|
|||||||
@@ -37,14 +37,14 @@ let
|
|||||||
size = "100%";
|
size = "100%";
|
||||||
content = {
|
content = {
|
||||||
type = cfg.filesystem;
|
type = cfg.filesystem;
|
||||||
# Subvolumes must set a mountpoint in order to be mounted,
|
|
||||||
# unless their parent is mounted
|
|
||||||
subvolumes = subvolumes;
|
|
||||||
}
|
}
|
||||||
// (
|
// (
|
||||||
if cfg.filesystem == "btrfs" then
|
if cfg.filesystem == "btrfs" then
|
||||||
{
|
{
|
||||||
extraArgs = [ "-f" ]; # Override existing partition
|
extraArgs = [ "-f" ]; # Override existing partition
|
||||||
|
# Subvolumes must set a mountpoint in order to be mounted,
|
||||||
|
# unless their parent is mounted
|
||||||
|
subvolumes = subvolumes;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -64,7 +64,7 @@ let
|
|||||||
size = "100%";
|
size = "100%";
|
||||||
content = {
|
content = {
|
||||||
type = "luks";
|
type = "luks";
|
||||||
name = "cryptroot";
|
name = "${config.${namespace}.network.hostName}-cryptroot";
|
||||||
extraOpenArgs = [
|
extraOpenArgs = [
|
||||||
"--allow-discards"
|
"--allow-discards"
|
||||||
"--perf-no_read_workqueue"
|
"--perf-no_read_workqueue"
|
||||||
@@ -72,20 +72,21 @@ let
|
|||||||
];
|
];
|
||||||
settings = {
|
settings = {
|
||||||
crypttabExtraOpts = [
|
crypttabExtraOpts = [
|
||||||
|
"tpm2-device=auto"
|
||||||
"fido2-device=auto"
|
"fido2-device=auto"
|
||||||
"token-timeout=10"
|
"token-timeout=10"
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
content = {
|
content = {
|
||||||
type = cfg.filesystem;
|
type = cfg.filesystem;
|
||||||
# Subvolumes must set a mountpoint in order to be mounted,
|
|
||||||
# unless their parent is mounted
|
|
||||||
subvolumes = subvolumes;
|
|
||||||
}
|
}
|
||||||
// (
|
// (
|
||||||
if cfg.filesystem == "btrfs" then
|
if cfg.filesystem == "btrfs" then
|
||||||
{
|
{
|
||||||
extraArgs = [ "-f" ]; # Override existing partition
|
extraArgs = [ "-f" ]; # Override existing partition
|
||||||
|
# Subvolumes must set a mountpoint in order to be mounted,
|
||||||
|
# unless their parent is mounted
|
||||||
|
subvolumes = subvolumes;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -121,12 +122,12 @@ in
|
|||||||
content = {
|
content = {
|
||||||
type = "gpt";
|
type = "gpt";
|
||||||
partitions = {
|
partitions = {
|
||||||
FIRMWARE = lib.mkIf cfg.enableFirmware {
|
firmware = lib.mkIf cfg.firmware.enableFirmware {
|
||||||
priority = 1;
|
priority = 1;
|
||||||
name = "FIRMWARE";
|
type = "0700";
|
||||||
|
name = "${config.${namespace}.network.hostName}-FIRMWARE";
|
||||||
start = "1M";
|
start = "1M";
|
||||||
end = "1G";
|
end = "1G";
|
||||||
type = "0700";
|
|
||||||
content = {
|
content = {
|
||||||
type = "filesystem";
|
type = "filesystem";
|
||||||
format = "vfat";
|
format = "vfat";
|
||||||
@@ -135,9 +136,10 @@ in
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
ESP = {
|
ESP = {
|
||||||
priority = if cfg.enableFirmware then 2 else 1;
|
priority = if cfg.firmware.enableFirmware then 2 else 1;
|
||||||
type = "EF00";
|
type = "EF00";
|
||||||
size = "500M";
|
size = "500M";
|
||||||
|
name = "${config.${namespace}.network.hostName}-EFI";
|
||||||
content = {
|
content = {
|
||||||
type = "filesystem";
|
type = "filesystem";
|
||||||
format = "vfat";
|
format = "vfat";
|
||||||
@@ -155,13 +157,35 @@ in
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
# firmware = lib.mkIf cfg.firmware.enableFirmware {
|
||||||
|
# device = cfg.firmware.firmwareDisk;
|
||||||
|
# type = "disk";
|
||||||
|
# imageSize = "1G";
|
||||||
|
# content = {
|
||||||
|
# type = "table";
|
||||||
|
# format = "msdos";
|
||||||
|
# partitions = [
|
||||||
|
# {
|
||||||
|
# name = "${config.${namespace}.network.hostName}-FIRMWARE";
|
||||||
|
# start = "1M";
|
||||||
|
# end = "1G";
|
||||||
|
# content = {
|
||||||
|
# type = "filesystem";
|
||||||
|
# format = "vfat";
|
||||||
|
# mountpoint = "/boot/firmware";
|
||||||
|
# mountOptions = [ "umask=0077" ];
|
||||||
|
# };
|
||||||
|
# }
|
||||||
|
# ];
|
||||||
|
# };
|
||||||
|
# };
|
||||||
};
|
};
|
||||||
|
|
||||||
# configure Bcachefs
|
# configure Bcachefs
|
||||||
bcachefs_filesystems = lib.mkIf (cfg.filesystem == "bcachefs") {
|
bcachefs_filesystems = lib.mkIf (cfg.filesystem == "bcachefs") {
|
||||||
mounted_subvolumes_in_multi = {
|
mounted_subvolumes_in_multi = {
|
||||||
type = "bcachefs_filesystem";
|
type = "bcachefs_filesystem";
|
||||||
# passwordFile = "/etc/nixos/pool.jwe";
|
# passwordFile = "/etc/nixos/test.key";
|
||||||
extraFormatArgs = [
|
extraFormatArgs = [
|
||||||
"--compression=${cfg.compression}"
|
"--compression=${cfg.compression}"
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -19,7 +19,10 @@ in
|
|||||||
|
|
||||||
enableLuks = mkBoolOpt false "Enable Luks";
|
enableLuks = mkBoolOpt false "Enable Luks";
|
||||||
|
|
||||||
enableFirmware = mkBoolOpt false "Enable rpi firmware part";
|
firmware = {
|
||||||
|
enableFirmware = mkBoolOpt false "Enable rpi firmware part";
|
||||||
|
firmwareDisk = mkOpt types.str "/dev/mmcblk0" "UEFI firmware disk";
|
||||||
|
};
|
||||||
|
|
||||||
swapSize = mkOpt types.str "16G" "size of swap part";
|
swapSize = mkOpt types.str "16G" "size of swap part";
|
||||||
|
|
||||||
|
|||||||
@@ -2,10 +2,12 @@
|
|||||||
{
|
{
|
||||||
fonts.packages = with pkgs; [
|
fonts.packages = with pkgs; [
|
||||||
font-awesome
|
font-awesome
|
||||||
|
pkgs.nerd-fonts.ubuntu
|
||||||
noto-fonts
|
noto-fonts
|
||||||
noto-fonts-color-emoji
|
noto-fonts-color-emoji
|
||||||
meslo-lgs-nf
|
meslo-lgs-nf
|
||||||
pkgs.nerd-fonts.jetbrains-mono
|
pkgs.nerd-fonts.jetbrains-mono
|
||||||
|
rubik
|
||||||
];
|
];
|
||||||
# ++ builtins.filter lib.attrsets.isDerivation (builtins.attrValues pkgs.nerd-fonts); # ALL fonts
|
# ++ builtins.filter lib.attrsets.isDerivation (builtins.attrValues pkgs.nerd-fonts); # ALL fonts
|
||||||
|
|
||||||
|
|||||||
@@ -18,11 +18,36 @@ in
|
|||||||
# Configure programs
|
# Configure programs
|
||||||
programs.steam = {
|
programs.steam = {
|
||||||
enable = true;
|
enable = true;
|
||||||
|
package = pkgs.steam.override {
|
||||||
|
extraPkgs =
|
||||||
|
_pkgs: with pkgs; [
|
||||||
|
libXcursor
|
||||||
|
libXi
|
||||||
|
libXinerama
|
||||||
|
libXScrnSaver
|
||||||
|
libpng
|
||||||
|
libpulseaudio
|
||||||
|
libvorbis
|
||||||
|
stdenv.cc.cc.lib
|
||||||
|
libkrb5
|
||||||
|
keyutils
|
||||||
|
];
|
||||||
|
};
|
||||||
# Open ports in the firewall for Steam Remote Play
|
# Open ports in the firewall for Steam Remote Play
|
||||||
remotePlay.openFirewall = true;
|
remotePlay.openFirewall = true;
|
||||||
# Open ports in the firewall for Source Dedicated Server
|
# Open ports in the firewall for Source Dedicated Server
|
||||||
dedicatedServer.openFirewall = true;
|
dedicatedServer.openFirewall = true;
|
||||||
extraCompatPackages = with pkgs; [ proton-ge-bin ];
|
extraCompatPackages =
|
||||||
|
with pkgs.unstable;
|
||||||
|
[
|
||||||
|
proton-ge-bin
|
||||||
|
]
|
||||||
|
++ (with pkgs.${namespace}; [
|
||||||
|
proton-cachyos
|
||||||
|
proton-cachyos-v3
|
||||||
|
proton-cachyos-v2
|
||||||
|
proton-cachyos-v1
|
||||||
|
]);
|
||||||
gamescopeSession = {
|
gamescopeSession = {
|
||||||
enable = true;
|
enable = true;
|
||||||
args = [
|
args = [
|
||||||
@@ -61,28 +86,11 @@ in
|
|||||||
};
|
};
|
||||||
|
|
||||||
environment = {
|
environment = {
|
||||||
|
systemPackages = with pkgs.${namespace}; [
|
||||||
|
];
|
||||||
variables = {
|
variables = {
|
||||||
STEAM_FORCE_DESKTOPUI_SCALING = "1.0";
|
STEAM_FORCE_DESKTOPUI_SCALING = "1.0";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
# Configure nixpkgs
|
|
||||||
nixpkgs.config.packageOverrides = pkgs: {
|
|
||||||
steam = pkgs.steam.override {
|
|
||||||
extraPkgs =
|
|
||||||
_pkgs: with pkgs; [
|
|
||||||
xorg.libXcursor
|
|
||||||
xorg.libXi
|
|
||||||
xorg.libXinerama
|
|
||||||
xorg.libXScrnSaver
|
|
||||||
libpng
|
|
||||||
libpulseaudio
|
|
||||||
libvorbis
|
|
||||||
stdenv.cc.cc.lib
|
|
||||||
libkrb5
|
|
||||||
keyutils
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,12 @@
|
|||||||
{ lib, ... }:
|
{
|
||||||
|
lib,
|
||||||
|
config,
|
||||||
|
namespace,
|
||||||
|
...
|
||||||
|
}:
|
||||||
{
|
{
|
||||||
services.btrfs = {
|
services.btrfs = {
|
||||||
autoScrub.enable = lib.mkDefault true;
|
autoScrub.enable = lib.mkDefault (config.${namespace}.hardware.disko.filesystem == "btrfs");
|
||||||
autoScrub.fileSystems = lib.mkDefault [
|
autoScrub.fileSystems = lib.mkDefault [
|
||||||
"/nix"
|
"/nix"
|
||||||
"/root"
|
"/root"
|
||||||
|
|||||||
19
modules/nixos/hardware/openrgb/default.nix
Normal file
19
modules/nixos/hardware/openrgb/default.nix
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
namespace,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
hasDestopEnvironment =
|
||||||
|
config.${namespace}.desktop.cosmic.enable
|
||||||
|
|| config.${namespace}.desktop.gnome.enable
|
||||||
|
|| config.${namespace}.desktop.hyprland.enable;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
config = lib.mkIf hasDestopEnvironment {
|
||||||
|
services.hardware.openrgb = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,67 @@
|
|||||||
|
# modification of nixpkgs deviceTree.applyOverlays to resolve https://github.com/NixOS/nixpkgs/issues/125354
|
||||||
|
# derived from https://github.com/NixOS/nixpkgs/blob/916ca8f2b0c208def051f8ea9760c534a40309db/pkgs/os-specific/linux/device-tree/default.nix
|
||||||
|
{
|
||||||
|
lib,
|
||||||
|
stdenvNoCC,
|
||||||
|
dtc,
|
||||||
|
libraspberrypi,
|
||||||
|
}:
|
||||||
|
|
||||||
|
with lib;
|
||||||
|
(
|
||||||
|
base: overlays':
|
||||||
|
stdenvNoCC.mkDerivation {
|
||||||
|
name = "device-tree-overlays";
|
||||||
|
nativeBuildInputs = [
|
||||||
|
dtc
|
||||||
|
libraspberrypi
|
||||||
|
];
|
||||||
|
buildCommand =
|
||||||
|
let
|
||||||
|
overlays = toList overlays';
|
||||||
|
in
|
||||||
|
''
|
||||||
|
mkdir -p $out
|
||||||
|
cd "${base}"
|
||||||
|
find . -type f -name '*.dtb' -print0 \
|
||||||
|
| xargs -0 cp -v --no-preserve=mode --target-directory "$out" --parents
|
||||||
|
|
||||||
|
for dtb in $(find "$out" -type f -name '*.dtb'); do
|
||||||
|
dtbCompat=$(fdtget -t s "$dtb" / compatible 2>/dev/null || true)
|
||||||
|
# skip files without `compatible` string
|
||||||
|
test -z "$dtbCompat" && continue
|
||||||
|
|
||||||
|
${flip (concatMapStringsSep "\n") overlays (o: ''
|
||||||
|
overlayCompat="$(fdtget -t s "${o.dtboFile}" / compatible)"
|
||||||
|
|
||||||
|
# skip incompatible and non-matching overlays
|
||||||
|
if [[ ! "$dtbCompat" =~ "$overlayCompat" ]]; then
|
||||||
|
echo "Skipping overlay ${o.name}: incompatible with $(basename "$dtb")"
|
||||||
|
elif ${
|
||||||
|
if ((o.filter or null) == null) then
|
||||||
|
"false"
|
||||||
|
else
|
||||||
|
''
|
||||||
|
[[ "''${dtb//${o.filter}/}" == "$dtb" ]]
|
||||||
|
''
|
||||||
|
}
|
||||||
|
then
|
||||||
|
echo "Skipping overlay ${o.name}: filter does not match $(basename "$dtb")"
|
||||||
|
else
|
||||||
|
echo -n "Applying overlay ${o.name} to $(basename "$dtb")... "
|
||||||
|
mv "$dtb"{,.in}
|
||||||
|
|
||||||
|
# dtmerge requires a .dtbo ext for dtbo files, otherwise it adds it to the given file implicitly
|
||||||
|
dtboWithExt="$TMPDIR/$(basename "${o.dtboFile}").dtbo"
|
||||||
|
cp -r ${o.dtboFile} "$dtboWithExt"
|
||||||
|
|
||||||
|
dtmerge "$dtb.in" "$dtb" "$dtboWithExt"
|
||||||
|
|
||||||
|
echo "ok"
|
||||||
|
rm "$dtb.in" "$dtboWithExt"
|
||||||
|
fi
|
||||||
|
'')}
|
||||||
|
|
||||||
|
done'';
|
||||||
|
}
|
||||||
|
)
|
||||||
42
modules/nixos/hardware/raspberry-pi/audio.nix
Normal file
42
modules/nixos/hardware/raspberry-pi/audio.nix
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
namespace,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
cfg = config.${namespace}.hardware.raspberry-pi.audio;
|
||||||
|
variant = config.${namespace}.hardware.raspberry-pi.variant;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.${namespace}.hardware.raspberry-pi.audio = {
|
||||||
|
enable = lib.mkEnableOption "enable audio dt overlays";
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
hardware.deviceTree = {
|
||||||
|
overlays =
|
||||||
|
[ ]
|
||||||
|
++ (
|
||||||
|
with pkgs.${namespace};
|
||||||
|
(
|
||||||
|
if (variant == "5") then
|
||||||
|
[
|
||||||
|
{
|
||||||
|
name = "pisound-pi5-overlay";
|
||||||
|
dtsFile = "${raspberrypi-overlays}/dtbs/raspberrypi-overlays/pisound-pi5-overlay.dts";
|
||||||
|
}
|
||||||
|
]
|
||||||
|
else
|
||||||
|
[
|
||||||
|
{
|
||||||
|
name = "pisound-overlay";
|
||||||
|
dtsFile = "${raspberrypi-overlays}/dtbs/raspberrypi-overlays/pisound-overlay.dts";
|
||||||
|
}
|
||||||
|
]
|
||||||
|
)
|
||||||
|
);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
43
modules/nixos/hardware/raspberry-pi/bluetooth.nix
Normal file
43
modules/nixos/hardware/raspberry-pi/bluetooth.nix
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
namespace,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
cfg = config.${namespace}.hardware.raspberry-pi.disable-bluetooth;
|
||||||
|
variant = config.${namespace}.hardware.raspberry-pi.variant;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.${namespace}.hardware.raspberry-pi.disable-bluetooth = {
|
||||||
|
enable = lib.mkEnableOption "enable disablewifi dt overlays";
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
hardware.deviceTree = {
|
||||||
|
overlays =
|
||||||
|
[ ]
|
||||||
|
++ (
|
||||||
|
if (variant == "5") then
|
||||||
|
[
|
||||||
|
{
|
||||||
|
name = "disable-bt-pi5-overlay";
|
||||||
|
dtsFile = "${
|
||||||
|
pkgs.${namespace}.raspberrypi-overlays
|
||||||
|
}/dtbs/raspberrypi-overlays/disable-bt-pi5-overlay.dts";
|
||||||
|
}
|
||||||
|
]
|
||||||
|
else
|
||||||
|
[
|
||||||
|
{
|
||||||
|
name = "disable-bt-overlay";
|
||||||
|
dtsFile = "${
|
||||||
|
pkgs.${namespace}.raspberrypi-overlays
|
||||||
|
}/dtbs/raspberrypi-overlays/disable-bt-overlay.dts";
|
||||||
|
}
|
||||||
|
]
|
||||||
|
);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
222
modules/nixos/hardware/raspberry-pi/config.nix
Normal file
222
modules/nixos/hardware/raspberry-pi/config.nix
Normal file
@@ -0,0 +1,222 @@
|
|||||||
|
# This file is a modified version of config.txt generator
|
||||||
|
# Licensed under the terms of MIT License
|
||||||
|
# https://raw.githubusercontent.com/nix-community/raspberry-pi-nix/refs/heads/master/rpi/config.nix
|
||||||
|
# with modifications
|
||||||
|
# https://raw.githubusercontent.com/nvmd/raspberry-pi-nix/refs/heads/master/rpi/config.nix
|
||||||
|
|
||||||
|
{
|
||||||
|
lib,
|
||||||
|
config,
|
||||||
|
namespace,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
cfg = config.${namespace}.hardware.raspberry-pi;
|
||||||
|
|
||||||
|
render-raspberrypi-config =
|
||||||
|
let
|
||||||
|
|
||||||
|
render-kvs =
|
||||||
|
kvs:
|
||||||
|
let
|
||||||
|
render-kv = k: v: if isNull v.value then k else "${k}=${toString v.value}";
|
||||||
|
in
|
||||||
|
lib.attrsets.mapAttrsToList render-kv (lib.filterAttrs (_k: v: v.enable) kvs);
|
||||||
|
|
||||||
|
render-dt-param = x: "dtparam=" + x;
|
||||||
|
render-dt-params = params: lib.strings.concatMapStringsSep "\n" render-dt-param (render-kvs params);
|
||||||
|
|
||||||
|
render-dt-overlay =
|
||||||
|
{ overlay, params }:
|
||||||
|
lib.concatStringsSep "\n" (
|
||||||
|
lib.filter (x: x != "") [
|
||||||
|
("dtoverlay=" + overlay)
|
||||||
|
(render-dt-params params)
|
||||||
|
"dtoverlay="
|
||||||
|
]
|
||||||
|
);
|
||||||
|
|
||||||
|
render-options = opts: lib.strings.concatStringsSep "\n" (render-kvs opts);
|
||||||
|
|
||||||
|
render-base-dt-params = render-dt-params;
|
||||||
|
|
||||||
|
render-dt-overlays =
|
||||||
|
overlays:
|
||||||
|
lib.strings.concatMapStringsSep "\n" render-dt-overlay (
|
||||||
|
lib.attrsets.mapAttrsToList (overlay: params: {
|
||||||
|
inherit overlay;
|
||||||
|
inherit (params) params;
|
||||||
|
}) (lib.filterAttrs (_k: v: v.enable) overlays)
|
||||||
|
);
|
||||||
|
|
||||||
|
render-config-section =
|
||||||
|
conditionalFilter:
|
||||||
|
{
|
||||||
|
options,
|
||||||
|
base-dt-params,
|
||||||
|
dt-overlays,
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
all-config = lib.concatStringsSep "\n" (
|
||||||
|
lib.filter (x: x != "") [
|
||||||
|
(render-options options)
|
||||||
|
(render-base-dt-params base-dt-params)
|
||||||
|
(render-dt-overlays dt-overlays)
|
||||||
|
]
|
||||||
|
);
|
||||||
|
in
|
||||||
|
''
|
||||||
|
[${conditionalFilter}]
|
||||||
|
${all-config}
|
||||||
|
'';
|
||||||
|
in
|
||||||
|
conf:
|
||||||
|
lib.strings.concatStringsSep "\n" (
|
||||||
|
(lib.attrsets.mapAttrsToList render-config-section conf) ++ [ cfg.extra-config ]
|
||||||
|
);
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.${namespace}.hardware.raspberry-pi = {
|
||||||
|
config =
|
||||||
|
let
|
||||||
|
rpi-config-param = {
|
||||||
|
options = {
|
||||||
|
enable = lib.mkEnableOption "attr";
|
||||||
|
value = lib.mkOption {
|
||||||
|
type =
|
||||||
|
with lib.types;
|
||||||
|
oneOf [
|
||||||
|
int
|
||||||
|
str
|
||||||
|
bool
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
dt-param = {
|
||||||
|
options = {
|
||||||
|
enable = lib.mkEnableOption "attr";
|
||||||
|
value = lib.mkOption {
|
||||||
|
type =
|
||||||
|
with lib.types;
|
||||||
|
nullOr (oneOf [
|
||||||
|
int
|
||||||
|
str
|
||||||
|
bool
|
||||||
|
]);
|
||||||
|
default = null;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
dt-overlay = {
|
||||||
|
options = {
|
||||||
|
enable = lib.mkEnableOption "overlay";
|
||||||
|
params = lib.mkOption {
|
||||||
|
type = with lib.types; attrsOf (submodule dt-param);
|
||||||
|
default = { };
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
raspberry-pi-config-options = {
|
||||||
|
options = {
|
||||||
|
options = lib.mkOption {
|
||||||
|
type = with lib.types; attrsOf (submodule rpi-config-param);
|
||||||
|
default = { };
|
||||||
|
description = ''
|
||||||
|
Common hardware configuration options, translates to
|
||||||
|
`<option>=<value>` in the `config.txt`.
|
||||||
|
<https://www.raspberrypi.com/documentation/computers/config_txt.html#common-hardware-configuration-options>
|
||||||
|
'';
|
||||||
|
example = {
|
||||||
|
arm_boost = {
|
||||||
|
# arm_boost=1
|
||||||
|
enable = true;
|
||||||
|
value = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
base-dt-params = lib.mkOption {
|
||||||
|
type = with lib.types; attrsOf (submodule dt-param);
|
||||||
|
default = { };
|
||||||
|
description = ''
|
||||||
|
Parameters to pass to the base DTB, translates to
|
||||||
|
`dtparam=<param>=<value>` in the `config.txt`.
|
||||||
|
<https://www.raspberrypi.com/documentation/computers/configuration.html#part3.2>
|
||||||
|
'';
|
||||||
|
example = {
|
||||||
|
i2c = {
|
||||||
|
# dtparam=i2c=on
|
||||||
|
enable = true;
|
||||||
|
value = "on";
|
||||||
|
};
|
||||||
|
ant2 = {
|
||||||
|
# dtparam=ant2
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
dt-overlays = lib.mkOption {
|
||||||
|
type = with lib.types; attrsOf (submodule dt-overlay);
|
||||||
|
default = { };
|
||||||
|
description = ''
|
||||||
|
DTB overlays to enable and configure with parameters, translates to
|
||||||
|
```
|
||||||
|
dtoverlay=<overlay>
|
||||||
|
dtparam=<param>=<value>
|
||||||
|
dtoverlay=
|
||||||
|
```, which is an equivalent to a more popular format of
|
||||||
|
`dtoverlay=<overlay>,<param>=<value>`.
|
||||||
|
<https://www.raspberrypi.com/documentation/computers/configuration.html#part3.1>
|
||||||
|
'';
|
||||||
|
example = {
|
||||||
|
vc4-kms-v3d = {
|
||||||
|
# dtoverlay=vc4-kms-v3d,cma-256
|
||||||
|
enable = true;
|
||||||
|
params = {
|
||||||
|
cma-256 = {
|
||||||
|
enable = true;
|
||||||
|
# value = "";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
disable-bt = {
|
||||||
|
# dtoverlay=disable-bt
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
in
|
||||||
|
lib.mkOption {
|
||||||
|
type = with lib.types; attrsOf (submodule raspberry-pi-config-options);
|
||||||
|
description = ''
|
||||||
|
Configures `config.txt` file for Raspberry Pi devices.
|
||||||
|
The file is located on a firmware partition, usually mounted at
|
||||||
|
`/boot/firmware`.
|
||||||
|
<https://www.raspberrypi.com/documentation/computers/config_txt.html>
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
extra-config = lib.mkOption {
|
||||||
|
type = lib.types.lines;
|
||||||
|
default = "";
|
||||||
|
description = ''
|
||||||
|
Extra options that will be appended to `/boot/firmware/config.txt` file.
|
||||||
|
For possible values, see: https://www.raspberrypi.com/documentation/computers/config_txt.html
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
config-generated = lib.mkOption {
|
||||||
|
type = lib.types.str;
|
||||||
|
description = ''
|
||||||
|
The config file text generated by hardware.raspberry-pi.config
|
||||||
|
'';
|
||||||
|
readOnly = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = {
|
||||||
|
${namespace}.hardware.raspberry-pi.config-generated = render-raspberrypi-config cfg.config;
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -7,6 +7,196 @@
|
|||||||
}:
|
}:
|
||||||
let
|
let
|
||||||
cfg = config.${namespace}.hardware.raspberry-pi;
|
cfg = config.${namespace}.hardware.raspberry-pi;
|
||||||
|
dt_ao_overlay = _final: prev: {
|
||||||
|
deviceTree = prev.deviceTree // {
|
||||||
|
applyOverlays = _final.callPackage ./apply-overlays-dtmerge.nix { };
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# installs raspberry's firmware independent of the nixos generations
|
||||||
|
# sometimes referred to as "boot code"
|
||||||
|
raspberryPiFirmware = (
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
firmware,
|
||||||
|
configTxt,
|
||||||
|
}:
|
||||||
|
pkgs.replaceVarsWith {
|
||||||
|
src = ./generational/install-firmware.sh;
|
||||||
|
isExecutable = true;
|
||||||
|
|
||||||
|
replacements = {
|
||||||
|
inherit (pkgs) bash;
|
||||||
|
path = pkgs.lib.makeBinPath [
|
||||||
|
pkgs.coreutils
|
||||||
|
];
|
||||||
|
|
||||||
|
inherit firmware configTxt;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
kernelbootGenBuilder = (
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
deviceTreeInstaller,
|
||||||
|
}:
|
||||||
|
pkgs.replaceVarsWith {
|
||||||
|
src = ./generational/kernelboot-gen-builder.sh;
|
||||||
|
isExecutable = true;
|
||||||
|
|
||||||
|
replacements = {
|
||||||
|
inherit (pkgs) bash;
|
||||||
|
path = pkgs.lib.makeBinPath [
|
||||||
|
pkgs.coreutils
|
||||||
|
];
|
||||||
|
|
||||||
|
installDeviceTree = deviceTreeInstaller;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
deviceTree = (
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
firmware,
|
||||||
|
}:
|
||||||
|
pkgs.replaceVarsWith {
|
||||||
|
src = ./generational/install-device-tree.sh;
|
||||||
|
isExecutable = true;
|
||||||
|
|
||||||
|
replacements = {
|
||||||
|
inherit (pkgs) bash;
|
||||||
|
path = pkgs.lib.makeBinPath [
|
||||||
|
pkgs.coreutils
|
||||||
|
];
|
||||||
|
|
||||||
|
inherit firmware;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
mkBootloader =
|
||||||
|
pkgs:
|
||||||
|
bootloader {
|
||||||
|
inherit pkgs;
|
||||||
|
inherit (cfg) nixosGenerationsDir;
|
||||||
|
|
||||||
|
firmwareInstaller = "${raspberryPiFirmware {
|
||||||
|
inherit pkgs;
|
||||||
|
firmware = pkgs.${namespace}.raspberrypifw;
|
||||||
|
configTxt = pkgs.writeTextFile {
|
||||||
|
name = "config.txt";
|
||||||
|
text = ''
|
||||||
|
# Do not edit!
|
||||||
|
# This configuration file is generated from NixOS configuration
|
||||||
|
# options `hardware.raspberry-pi.config`.
|
||||||
|
# Any manual changes will be overwritten on the next configuration
|
||||||
|
# switch.
|
||||||
|
${config.${namespace}.hardware.raspberry-pi.config-generated}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}}";
|
||||||
|
|
||||||
|
nixosGenBuilder = "${kernelbootGenBuilder {
|
||||||
|
inherit pkgs;
|
||||||
|
deviceTreeInstaller =
|
||||||
|
let
|
||||||
|
cmd = deviceTree {
|
||||||
|
inherit pkgs;
|
||||||
|
firmware = cfg.firmwarePackage;
|
||||||
|
};
|
||||||
|
args = lib.optionalString (!cfg.useGenerationDeviceTree) " -r";
|
||||||
|
in
|
||||||
|
"${cmd} ${args}";
|
||||||
|
}}";
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
bootloader = (
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
nixosGenerationsDir,
|
||||||
|
firmwareInstaller,
|
||||||
|
nixosGenBuilder,
|
||||||
|
}:
|
||||||
|
pkgs.replaceVarsWith {
|
||||||
|
src = ./generational/nixos-generations-builder.sh;
|
||||||
|
isExecutable = true;
|
||||||
|
|
||||||
|
replacements = {
|
||||||
|
inherit (pkgs) bash;
|
||||||
|
path = pkgs.lib.makeBinPath [
|
||||||
|
pkgs.coreutils
|
||||||
|
pkgs.gnused
|
||||||
|
];
|
||||||
|
|
||||||
|
# NixOS-generations -independent
|
||||||
|
installFirmwareBuilder = firmwareInstaller;
|
||||||
|
# NixOS-generations -dependent
|
||||||
|
inherit nixosGenerationsDir nixosGenBuilder;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
# Builders used to write during system activation
|
||||||
|
|
||||||
|
ubootBuilder = import ./uboot-builder.nix {
|
||||||
|
inherit pkgs;
|
||||||
|
ubootPackage = (
|
||||||
|
if (cfg.variant == "5") then pkgs.${namespace}.uboot-pi5 else pkgs.${namespace}.uboot-pi4
|
||||||
|
);
|
||||||
|
firmwareBuilder = firmwarePopulateCmd;
|
||||||
|
extlinuxConfBuilder = config.boot.loader.generic-extlinux-compatible.populateCmd;
|
||||||
|
};
|
||||||
|
|
||||||
|
uefiBuilder = import ./uefi-builder.nix {
|
||||||
|
inherit pkgs;
|
||||||
|
uefiPackage = (
|
||||||
|
if (cfg.variant == "5") then
|
||||||
|
pkgs.${namespace}.uefi-rpi5
|
||||||
|
else
|
||||||
|
pkgs.${namespace}.edk2.override { MODEL = "4"; }
|
||||||
|
);
|
||||||
|
firmwareBuilder = firmwarePopulateCmd;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Builders exposed via populateCmd, which run on the build architecture
|
||||||
|
populateFirmwareBuilder = import ./firmware-builder.nix {
|
||||||
|
pkgs = pkgs.buildPackages;
|
||||||
|
configTxt = pkgs.writeTextFile {
|
||||||
|
name = "config.txt";
|
||||||
|
text = ''
|
||||||
|
# Do not edit!
|
||||||
|
# This configuration file is generated from NixOS configuration
|
||||||
|
# options `hardware.raspberry-pi.config`.
|
||||||
|
# Any manual changes will be overwritten on the next configuration
|
||||||
|
# switch.
|
||||||
|
${config.${namespace}.hardware.raspberry-pi.config-generated}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
firmware = pkgs.${namespace}.raspberrypifw;
|
||||||
|
};
|
||||||
|
|
||||||
|
firmwarePopulateCmd = "${populateFirmwareBuilder} ${firmwareBuilderArgs}";
|
||||||
|
firmwareBuilderArgs = lib.optionalString (!true) " -r";
|
||||||
|
|
||||||
|
# these will receive the top-level path as an argument when invoked as
|
||||||
|
# system.build.installBootloader
|
||||||
|
builder = {
|
||||||
|
# system.build.installBootLoader
|
||||||
|
uboot = "${ubootBuilder} -f /boot/firmware -b /boot -c";
|
||||||
|
uefi = "${uefiBuilder} -f /boot/firmware -b /boot -c";
|
||||||
|
kernel = builtins.concatStringsSep " " [
|
||||||
|
"${mkBootloader pkgs}"
|
||||||
|
"-g ${toString 10}"
|
||||||
|
"-f /boot/firmware"
|
||||||
|
"-c"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
# firmware: caller must provide `-c <nixos configuration>` and `-f <firmware target path>`
|
||||||
|
# boot: caller must provide `-c <nixos configuration>` and `-b <boot-dir>`
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
options.${namespace}.hardware.raspberry-pi = {
|
options.${namespace}.hardware.raspberry-pi = {
|
||||||
@@ -19,15 +209,82 @@ in
|
|||||||
];
|
];
|
||||||
description = "Raspberry Pi variant (4 or 5)";
|
description = "Raspberry Pi variant (4 or 5)";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
bootType = lib.mkOption {
|
||||||
|
type = lib.types.enum [
|
||||||
|
"uefi"
|
||||||
|
"uboot"
|
||||||
|
"kernel"
|
||||||
|
];
|
||||||
|
default = "uefi";
|
||||||
|
};
|
||||||
|
|
||||||
|
apply-overlays-dtmerge = {
|
||||||
|
enable = lib.mkEnableOption "" // {
|
||||||
|
description = ''
|
||||||
|
Whether replace deviceTree.applyOverlays implementation to use dtmerge from libraspberrypi.
|
||||||
|
This can resolve issues with applying dtbs for the pi.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
imports = [
|
||||||
|
./audio.nix
|
||||||
|
./bluetooth.nix
|
||||||
|
./config.nix
|
||||||
|
./i2c.nix
|
||||||
|
./leds.nix
|
||||||
|
./modesetting.nix
|
||||||
|
./pwm.nix
|
||||||
|
./wifi.nix
|
||||||
|
];
|
||||||
|
|
||||||
config = lib.mkIf cfg.enable {
|
config = lib.mkIf cfg.enable {
|
||||||
|
|
||||||
|
boot = {
|
||||||
|
initrd.availableKernelModules = [
|
||||||
|
"usbhid"
|
||||||
|
"usb-storage"
|
||||||
|
]
|
||||||
|
++ (
|
||||||
|
if (cfg.variant == "5") then
|
||||||
|
[
|
||||||
|
"nvme"
|
||||||
|
]
|
||||||
|
else
|
||||||
|
[
|
||||||
|
"vc4"
|
||||||
|
"pcie-brcmstb" # required for the pcie bus to work
|
||||||
|
"reset-raspberrypi" # required for vl805 firmware to load
|
||||||
|
]
|
||||||
|
);
|
||||||
|
loader = {
|
||||||
|
# kernelFile = pkgs.stdenv.hostPlatform.linux-kernel.target;
|
||||||
|
generic-extlinux-compatible = {
|
||||||
|
enable = lib.mkDefault (if cfg.bootType == "uefi" then false else true);
|
||||||
|
useGenerationDeviceTree = lib.mkOverride 60 (if cfg.bootType == "uefi" then false else true);
|
||||||
|
};
|
||||||
|
systemd-boot.enable = (if cfg.bootType == "uefi" then true else false);
|
||||||
|
systemd-boot.extraInstallCommands =
|
||||||
|
let
|
||||||
|
bootloaderInstaller = (builder."${cfg.bootType}");
|
||||||
|
in
|
||||||
|
''
|
||||||
|
${bootloaderInstaller} -f /boot/firmware -b /boot -c
|
||||||
|
'';
|
||||||
|
grub.enable = lib.mkForce false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
# Common Raspberry Pi packages
|
# Common Raspberry Pi packages
|
||||||
environment.systemPackages = with pkgs; [
|
environment.systemPackages = with pkgs; [
|
||||||
|
dconf
|
||||||
i2c-tools
|
i2c-tools
|
||||||
raspberrypi-eeprom
|
raspberrypi-eeprom
|
||||||
raspberrypifw
|
pkgs.${namespace}.raspberrypi-utils
|
||||||
raspberrypiWirelessFirmware
|
pkgs.${namespace}.raspberrypifw
|
||||||
|
pkgs.${namespace}.raspberryPiWirelessFirmware
|
||||||
raspberrypi-armstubs
|
raspberrypi-armstubs
|
||||||
erofs-utils
|
erofs-utils
|
||||||
fex
|
fex
|
||||||
@@ -36,37 +293,172 @@ in
|
|||||||
];
|
];
|
||||||
|
|
||||||
# Common Bluetooth configuration
|
# Common Bluetooth configuration
|
||||||
systemd.services.btattach = {
|
systemd = {
|
||||||
before = [ "bluetooth.service" ];
|
services.btattach = {
|
||||||
after = [ "dev-ttyAMA0.device" ];
|
before = [ "bluetooth.service" ];
|
||||||
wantedBy = [ "multi-user.target" ];
|
after = [ "dev-ttyAMA0.device" ];
|
||||||
serviceConfig = {
|
wantedBy = [ "multi-user.target" ];
|
||||||
ExecStart = "${lib.getExe' pkgs.bluez "btattach"} -B /dev/ttyAMA0 -P bcm -S 3000000";
|
serviceConfig = {
|
||||||
|
ExecStart = "${lib.getExe' pkgs.bluez "btattach"} -B /dev/ttyAMA0 -P bcm -S 3000000";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
tmpfiles.packages = [
|
||||||
|
pkgs.${namespace}.udev-rules
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
${namespace}.hardware.raspberry-pi = {
|
||||||
|
config = {
|
||||||
|
all = {
|
||||||
|
options = {
|
||||||
|
os_prefix = lib.mkIf (cfg.bootType == "kernel") {
|
||||||
|
enable = true;
|
||||||
|
value = "${cfg.nixosGenerationsDir}/default/"; # "nixos/<generation-name>/"
|
||||||
|
};
|
||||||
|
kernel = lib.mkIf (cfg.bootType == "kernel" || cfg.bootType == "uboot") {
|
||||||
|
enable = true;
|
||||||
|
value = (
|
||||||
|
if cfg.bootType == "uboot" then
|
||||||
|
"u-boot.bin"
|
||||||
|
else if cfg.bootType == "kernel" then
|
||||||
|
"kernel.img"
|
||||||
|
else
|
||||||
|
""
|
||||||
|
);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
extra-config =
|
||||||
|
let
|
||||||
|
# https://www.raspberrypi.com/documentation/computers/config_txt.html#initramfs
|
||||||
|
ramfsfile = "initrd";
|
||||||
|
ramfsaddr = "followkernel"; # same as 0 = "after the kernel image"
|
||||||
|
in
|
||||||
|
''
|
||||||
|
[all]
|
||||||
|
initramfs ${ramfsfile} ${ramfsaddr}
|
||||||
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
# Common hardware settings
|
# Common hardware settings
|
||||||
hardware.i2c.enable = lib.mkDefault true;
|
hardware = {
|
||||||
|
deviceTree = {
|
||||||
|
filter = lib.mkDefault (if (cfg.variant == "5") then "bcm2712*.dtb" else "bcm2711*.dtb");
|
||||||
|
package = lib.mkOverride 80 config.boot.kernelPackages.kernel;
|
||||||
|
overlays = (
|
||||||
|
if (cfg.variant == "4") then
|
||||||
|
[
|
||||||
|
{
|
||||||
|
name = "rpi4-cpu-revision";
|
||||||
|
dtsText = ''
|
||||||
|
/dts-v1/;
|
||||||
|
/plugin/;
|
||||||
|
|
||||||
# Pi specific settings
|
/ {
|
||||||
hardware.graphics.enable32Bit = lib.mkForce false;
|
compatible = "brcm,bcm2711";
|
||||||
|
|
||||||
# Pi specific system tags
|
fragment@0 {
|
||||||
system.nixos.tags = (
|
target-path = "/";
|
||||||
let
|
__overlay__ {
|
||||||
bootCfg = config.boot.loader.raspberry-pi;
|
system {
|
||||||
in
|
linux,revision = <0x00d03114>;
|
||||||
[
|
};
|
||||||
"raspberry-pi-${bootCfg.variant}"
|
};
|
||||||
bootCfg.bootloader
|
};
|
||||||
|
};
|
||||||
|
'';
|
||||||
|
}
|
||||||
|
]
|
||||||
|
else
|
||||||
|
[
|
||||||
|
# {
|
||||||
|
# name = "bcm2712d0-overlay";
|
||||||
|
# dtsFile = "${pkgs.${namespace}.raspberrypi-overlays}/dtbs/raspberrypi-overlays/bcm2712d0-overlay.dts";
|
||||||
|
# }
|
||||||
|
]
|
||||||
|
);
|
||||||
|
};
|
||||||
|
firmware = [ pkgs.${namespace}.raspberryPiWirelessFirmware ];
|
||||||
|
graphics.enable32Bit = lib.mkForce false;
|
||||||
|
i2c.enable = lib.mkDefault true;
|
||||||
|
};
|
||||||
|
|
||||||
|
system = {
|
||||||
|
#build.installBootLoader = lib.mkOverride 60 (if cfg.bootType == "uefi" then (builder."uefi") else (builder."uboot")); # todo
|
||||||
|
#boot = {
|
||||||
|
# loader = {
|
||||||
|
# id = lib.mkOverride 60 (if cfg.bootType == "uefi" then "raspberrypi-uefi" else "raspberrypi-uboot"); # todo
|
||||||
|
# kernelFile = pkgs.stdenv.hostPlatform.linux-kernel.target;
|
||||||
|
# };
|
||||||
|
#};
|
||||||
|
# Pi specific system tags
|
||||||
|
nixos.tags = [
|
||||||
|
"raspberry-pi-${cfg.variant}"
|
||||||
|
# config.boot.loader.raspberry-pi.bootloader
|
||||||
config.boot.kernelPackages.kernel.version
|
config.boot.kernelPackages.kernel.version
|
||||||
]
|
];
|
||||||
);
|
};
|
||||||
|
|
||||||
# Common programs
|
# Common programs
|
||||||
programs.kdeconnect.enable = lib.mkDefault false;
|
programs.kdeconnect.enable = lib.mkDefault false;
|
||||||
|
|
||||||
# Root user shell configuration
|
# Root user shell configuration
|
||||||
users.users.root.shell = pkgs.zsh;
|
users = {
|
||||||
|
users.root.shell = pkgs.zsh;
|
||||||
|
extraGroups = {
|
||||||
|
gpio = { };
|
||||||
|
i2c = { };
|
||||||
|
input = { };
|
||||||
|
plugdev = { };
|
||||||
|
spi = { };
|
||||||
|
video = { };
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
services = {
|
||||||
|
udev.packages = [
|
||||||
|
pkgs.${namespace}.udev-rules
|
||||||
|
];
|
||||||
|
xserver.extraConfig =
|
||||||
|
let
|
||||||
|
identifier = "rp1";
|
||||||
|
driver = "rp1-vec|rp1-dsi|rp1-dpi";
|
||||||
|
in
|
||||||
|
''
|
||||||
|
Section "OutputClass"
|
||||||
|
Identifier "${identifier}"
|
||||||
|
MatchDriver "${driver}"
|
||||||
|
Driver "modesetting"
|
||||||
|
Option "PrimaryGPU" "true"
|
||||||
|
EndSection
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
nixpkgs.overlays =
|
||||||
|
[ ]
|
||||||
|
++ (
|
||||||
|
if cfg.variant == "5" then
|
||||||
|
[
|
||||||
|
(_final: prev: {
|
||||||
|
# https://github.com/nvmd/nixos-raspberrypi/issues/64
|
||||||
|
# credit for the initial version of this snippet goes to @micahcc
|
||||||
|
jemalloc = prev.jemalloc.overrideAttrs (old: {
|
||||||
|
# --with-lg-page=(log2 page_size)
|
||||||
|
# RPi5 (bcm2712): since our page size is 16384 (2**14), we need 14
|
||||||
|
configureFlags =
|
||||||
|
let
|
||||||
|
pageSizeFlag = "--with-lg-page";
|
||||||
|
in
|
||||||
|
(prev.lib.filter (flag: prev.lib.hasPrefix pageSizeFlag flag == false) old.configureFlags)
|
||||||
|
++ [ "${pageSizeFlag}=14" ];
|
||||||
|
});
|
||||||
|
})
|
||||||
|
]
|
||||||
|
else
|
||||||
|
[ ]
|
||||||
|
)
|
||||||
|
++ (if cfg.apply-overlays-dtmerge.enable then [ dt_ao_overlay ] else [ ]);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
19
modules/nixos/hardware/raspberry-pi/firmware-builder.nix
Normal file
19
modules/nixos/hardware/raspberry-pi/firmware-builder.nix
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
configTxt,
|
||||||
|
firmware ? pkgs.raspberrypifw,
|
||||||
|
}:
|
||||||
|
|
||||||
|
pkgs.replaceVarsWith {
|
||||||
|
src = ./firmware-builder.sh;
|
||||||
|
isExecutable = true;
|
||||||
|
|
||||||
|
replacements = {
|
||||||
|
inherit (pkgs) bash;
|
||||||
|
path = pkgs.lib.makeBinPath [
|
||||||
|
pkgs.coreutils
|
||||||
|
];
|
||||||
|
|
||||||
|
inherit firmware configTxt;
|
||||||
|
};
|
||||||
|
}
|
||||||
93
modules/nixos/hardware/raspberry-pi/firmware-builder.sh
Normal file
93
modules/nixos/hardware/raspberry-pi/firmware-builder.sh
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
#! @bash@/bin/sh -e
|
||||||
|
|
||||||
|
shopt -s nullglob
|
||||||
|
|
||||||
|
export PATH=/empty:@path@
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
echo "usage: $0 -c <path-to-default-configuration> [-d <firmware-dir>] [-r]" >&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
default= # Default configuration
|
||||||
|
target=/boot/firmware # Firmware target directory
|
||||||
|
|
||||||
|
while getopts "c:d:r" opt; do
|
||||||
|
case "$opt" in
|
||||||
|
c) default="$OPTARG" ;;
|
||||||
|
d) target="$OPTARG" ;;
|
||||||
|
r) useVendorDeviceTree=1 ;;
|
||||||
|
\?) usage ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
# Copy a file from the Nix store to $target.
|
||||||
|
declare -A filesCopied
|
||||||
|
|
||||||
|
copyForced() {
|
||||||
|
local src="$1"
|
||||||
|
local dst="$2"
|
||||||
|
cp $src $dst.tmp
|
||||||
|
mv $dst.tmp $dst
|
||||||
|
}
|
||||||
|
|
||||||
|
# Add the firmware files
|
||||||
|
# fwdir=@firmware@/share/raspberrypi/boot/
|
||||||
|
SRC_FIRMWARE_DIR=@firmware@/share/raspberrypi/boot
|
||||||
|
dtb_path=$SRC_FIRMWARE_DIR
|
||||||
|
|
||||||
|
echo "copying firmware..."
|
||||||
|
|
||||||
|
# Device Tree
|
||||||
|
useVendorDeviceTree=1
|
||||||
|
if [ -n "$useVendorDeviceTree" ]; then
|
||||||
|
echo -n "using vendor firmware from "
|
||||||
|
dtb_path=$SRC_FIRMWARE_DIR
|
||||||
|
else
|
||||||
|
echo -n "using default generation's kernel device tree binaries: "
|
||||||
|
dtb_path=$(readlink -f $default/dtbs)
|
||||||
|
fi
|
||||||
|
echo $dtb_path
|
||||||
|
|
||||||
|
DTBS=("$dtb_path"/*.dtb)
|
||||||
|
echo "dtbs all: $DTBS"
|
||||||
|
for dtb in "${DTBS[@]}"; do
|
||||||
|
# for dtb in $dtb_path/broadcom/*.dtb; do
|
||||||
|
dst="$target/$(basename $dtb)"
|
||||||
|
copyForced $dtb "$dst"
|
||||||
|
filesCopied[$dst]=1
|
||||||
|
done
|
||||||
|
|
||||||
|
SRC_OVERLAYS_DIR="$dtb_path/overlays"
|
||||||
|
SRC_OVERLAYS=("$SRC_OVERLAYS_DIR"/*)
|
||||||
|
mkdir -p $target/overlays
|
||||||
|
for ovr in "${SRC_OVERLAYS[@]}"; do
|
||||||
|
# for ovr in $dtb_path/overlays/*; do
|
||||||
|
dst="$target/overlays/$(basename $ovr)"
|
||||||
|
copyForced $ovr "$dst"
|
||||||
|
filesCopied[$dst]=1
|
||||||
|
done
|
||||||
|
|
||||||
|
# remove obsolete device tree files
|
||||||
|
for fn in $target/*.dtb $target/overlays/*; do
|
||||||
|
if ! test "${filesCopied[$fn]}" = 1; then
|
||||||
|
rm -vf -- "$fn"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
|
||||||
|
# Boot code
|
||||||
|
|
||||||
|
STARTFILES=("$SRC_FIRMWARE_DIR"/start*.elf)
|
||||||
|
BOOTCODE="$SRC_FIRMWARE_DIR/bootcode.bin"
|
||||||
|
FIXUPS=("$SRC_FIRMWARE_DIR"/fixup*.dat)
|
||||||
|
for SRC in "${STARTFILES[@]}" "$BOOTCODE" "${FIXUPS[@]}"; do
|
||||||
|
dst="$target/$(basename $SRC)"
|
||||||
|
copyForced "$SRC" "$dst"
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "copying config.txt..."
|
||||||
|
# Add the config.txt
|
||||||
|
copyForced @configTxt@ $target/config.txt
|
||||||
|
|
||||||
|
echo "raspberry pi firmware installed"
|
||||||
@@ -0,0 +1,77 @@
|
|||||||
|
#! @bash@/bin/sh -e
|
||||||
|
|
||||||
|
# shellcheck disable=SC3030,SC3043,SC3044,SC3054
|
||||||
|
|
||||||
|
shopt -s nullglob
|
||||||
|
|
||||||
|
export PATH=/empty:@path@
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
echo "usage: $0 -c <path-to-configuration> [-d <destination-dir>] [-r]" >&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
generationPath= # Path to nixos configuration/generation
|
||||||
|
target=/boot/firmware # Device tree files target directory
|
||||||
|
|
||||||
|
while getopts "c:d:r" opt; do
|
||||||
|
case "$opt" in
|
||||||
|
c) generationPath="$OPTARG" ;;
|
||||||
|
d) target="$OPTARG" ;;
|
||||||
|
r) useVendorDeviceTree=1 ;;
|
||||||
|
\?) usage ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
# Copy a file from the Nix store to $target.
|
||||||
|
declare -A filesCopied
|
||||||
|
|
||||||
|
copyForced() {
|
||||||
|
local src="$1"
|
||||||
|
local dst="$2"
|
||||||
|
|
||||||
|
local dstTmp="$dst.tmp.$$"
|
||||||
|
|
||||||
|
cp "$src" "$dstTmp"
|
||||||
|
mv "$dstTmp" "$dst"
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "$0: $@"
|
||||||
|
echo -n "installing device tree files: "
|
||||||
|
|
||||||
|
# Device Tree
|
||||||
|
|
||||||
|
if [ -n "$useVendorDeviceTree" ]; then
|
||||||
|
echo -n "vendor firmware "
|
||||||
|
dtb_path=@firmware@/share/raspberrypi/boot
|
||||||
|
else
|
||||||
|
echo -n "generation's kernel's "
|
||||||
|
dtb_path=$(readlink -f "$generationPath/dtbs")
|
||||||
|
fi
|
||||||
|
echo "$dtb_path"
|
||||||
|
|
||||||
|
# firmware package has dtbs in its root,
|
||||||
|
# dtbs built with kernel are in broadcom/
|
||||||
|
DTBS=("$dtb_path"/*.dtb "$dtb_path"/broadcom/*.dtb)
|
||||||
|
echo "all dtbs: $DTBS"
|
||||||
|
for dtb in "${DTBS[@]}"; do
|
||||||
|
dst="$target/$(basename "$dtb")"
|
||||||
|
echo "$dtb"
|
||||||
|
copyForced "$dtb" "$dst"
|
||||||
|
filesCopied[$dst]=1
|
||||||
|
done
|
||||||
|
|
||||||
|
SRC_OVERLAYS=("$dtb_path/overlays"/*)
|
||||||
|
mkdir -p "$target/overlays"
|
||||||
|
for ovr in "${SRC_OVERLAYS[@]}"; do
|
||||||
|
dst="$target/overlays/$(basename "$ovr")"
|
||||||
|
copyForced "$ovr" "$dst"
|
||||||
|
filesCopied[$dst]=1
|
||||||
|
done
|
||||||
|
|
||||||
|
# remove obsolete device tree files
|
||||||
|
for fn in $target/*.dtb $target/overlays/*; do
|
||||||
|
if ! test "${filesCopied[$fn]}" = 1; then
|
||||||
|
rm -vf -- "$fn"
|
||||||
|
fi
|
||||||
|
done
|
||||||
@@ -0,0 +1,66 @@
|
|||||||
|
#! @bash@/bin/sh -e
|
||||||
|
|
||||||
|
# shellcheck disable=SC3030,SC3043,SC3044,SC3054
|
||||||
|
|
||||||
|
shopt -s nullglob
|
||||||
|
|
||||||
|
export PATH=/empty:@path@
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
echo "usage: $0 -c <path-to-configuration> [-d <firmware-dir>]" >&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
generationPath= # Path to nixos configuration/generation
|
||||||
|
target=/boot/firmware # Firmware target directory
|
||||||
|
|
||||||
|
while getopts "c:d:" opt; do
|
||||||
|
case "$opt" in
|
||||||
|
c) generationPath="$OPTARG" ;;
|
||||||
|
d) target="$OPTARG" ;;
|
||||||
|
\?) usage ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
# Copy a file from the Nix store to $target.
|
||||||
|
declare -A filesCopied
|
||||||
|
|
||||||
|
copyForced() {
|
||||||
|
local src="$1"
|
||||||
|
local dst="$2"
|
||||||
|
|
||||||
|
local dstTmp="$dst.tmp.$$"
|
||||||
|
|
||||||
|
cp "$src" "$dstTmp"
|
||||||
|
mv "$dstTmp" "$dst"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Add the firmware files
|
||||||
|
# fwdir=@firmware@/share/raspberrypi/boot/
|
||||||
|
SRC_FIRMWARE_DIR=@firmware@/share/raspberrypi/boot
|
||||||
|
|
||||||
|
echo "copying raspberry pi firmware..."
|
||||||
|
|
||||||
|
# Boot code
|
||||||
|
|
||||||
|
STARTFILES=("$SRC_FIRMWARE_DIR"/start*.elf)
|
||||||
|
BOOTCODE="$SRC_FIRMWARE_DIR/bootcode.bin"
|
||||||
|
FIXUPS=("$SRC_FIRMWARE_DIR"/fixup*.dat)
|
||||||
|
for SRC in "${STARTFILES[@]}" "$BOOTCODE" "${FIXUPS[@]}"; do
|
||||||
|
dst="$target/$(basename "$SRC")"
|
||||||
|
copyForced "$SRC" "$dst"
|
||||||
|
filesCopied[$dst]=1
|
||||||
|
done
|
||||||
|
|
||||||
|
# remove obsolete firmware files
|
||||||
|
for fn in $target/start*.elf $target/fixup*.dat; do
|
||||||
|
if ! test "${filesCopied[$fn]}" = 1; then
|
||||||
|
rm -vf -- "$fn"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "copying config.txt..."
|
||||||
|
# Add the config.txt
|
||||||
|
copyForced @configTxt@ "$target/config.txt"
|
||||||
|
|
||||||
|
echo "raspberry pi firmware installed"
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
#! @bash@/bin/sh -e
|
||||||
|
|
||||||
|
# shellcheck disable=SC3037,SC3043,SC3044
|
||||||
|
|
||||||
|
shopt -s nullglob
|
||||||
|
|
||||||
|
export PATH=/empty:@path@
|
||||||
|
|
||||||
|
copyForced() {
|
||||||
|
local src="$1"
|
||||||
|
local dst="$2"
|
||||||
|
|
||||||
|
local dstTmp="$dst.tmp.$$"
|
||||||
|
|
||||||
|
cp "$src" "$dstTmp"
|
||||||
|
mv "$dstTmp" "$dst"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Copy generation's kernel, initrd, cmdline to `genDir`.
|
||||||
|
addEntry() {
|
||||||
|
local generationPath="$1"
|
||||||
|
local generationName="$2"
|
||||||
|
local genDir="$3"
|
||||||
|
|
||||||
|
if ! { [ -e "$generationPath/kernel" ] && [ -e "$generationPath/initrd" ]; }; then
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -n "kernel..."
|
||||||
|
|
||||||
|
local kernel="$(readlink -f "$generationPath/kernel")"
|
||||||
|
local initrd="$(readlink -f "$generationPath/initrd")"
|
||||||
|
|
||||||
|
readlink -f "$generationPath" > "$genDir/system-link"
|
||||||
|
echo "$kernel" > "$genDir/kernel-link"
|
||||||
|
|
||||||
|
copyForced "$kernel" "$genDir/kernel.img"
|
||||||
|
copyForced "$initrd" "$genDir/initrd"
|
||||||
|
echo "$(cat "$generationPath/kernel-params") init=$generationPath/init" > "$genDir/cmdline.txt"
|
||||||
|
|
||||||
|
echo -n "device tree..."
|
||||||
|
|
||||||
|
@installDeviceTree@ -c "$generationPath" -d "$genDir"
|
||||||
|
|
||||||
|
echo
|
||||||
|
}
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
echo "usage: $0 -c <path-to-configuration> -n <configuration-name> -d <installation-directory>" >&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
generationPath= # Path to nixos configuration/generation
|
||||||
|
generationName= # Name of the generation
|
||||||
|
target=/boot/firmware # Target directory
|
||||||
|
|
||||||
|
echo "$0: $@"
|
||||||
|
while getopts "c:n:d:" opt; do
|
||||||
|
case "$opt" in
|
||||||
|
c) generationPath="$OPTARG" ;;
|
||||||
|
n) generationName="$OPTARG" ;;
|
||||||
|
d) target="$OPTARG" ;;
|
||||||
|
\?) usage ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
addEntry "$generationPath" "$generationName" "$target"
|
||||||
|
echo "kernel boot files installed for nixos generation '$generationName'"
|
||||||
@@ -0,0 +1,146 @@
|
|||||||
|
#! @bash@/bin/sh -e
|
||||||
|
|
||||||
|
# shellcheck disable=SC3043,SC3044,SC3054
|
||||||
|
|
||||||
|
shopt -s nullglob
|
||||||
|
|
||||||
|
export PATH=/empty:@path@
|
||||||
|
|
||||||
|
# used to track copied generations to decide which are obsolete
|
||||||
|
# and need to be removed
|
||||||
|
declare -A activeGenerations
|
||||||
|
|
||||||
|
moveWBackup() {
|
||||||
|
local src="$1"
|
||||||
|
local dst="$2"
|
||||||
|
|
||||||
|
# Backup $dst if already exists
|
||||||
|
local dstBkp="$dst.bkp.$$"
|
||||||
|
if [ -e "$dst" ]; then
|
||||||
|
mv "$dst" "$dstBkp"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Move $src as "new" $dst
|
||||||
|
mv "$src" "$dst"
|
||||||
|
|
||||||
|
# Remove backup directory of the previous $dst
|
||||||
|
rm -rf "$dstBkp"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Copy generation's kernel, initrd, cmdline to `gensDir/generationName`.
|
||||||
|
addEntry() {
|
||||||
|
local generationPath="$1"
|
||||||
|
local generationName="$2"
|
||||||
|
local gensDir="$3"
|
||||||
|
|
||||||
|
local dst="$gensDir/$generationName"
|
||||||
|
|
||||||
|
echo "* nixos generation '$generationName' -> $dst"
|
||||||
|
# Don't copy the files if $dst already exists, unless it's the default
|
||||||
|
# configuration.
|
||||||
|
# This means that we have to create $dst atomically to prevent partially
|
||||||
|
# copied generations if this script is ever interrupted.
|
||||||
|
#
|
||||||
|
# For "default" generation: make backup and then replace with the new
|
||||||
|
# "default", minimizing the time when where isn't any "default" generation
|
||||||
|
# directory
|
||||||
|
if ! [ -e $dst ] || [ "$generationName" = "default" ]; then
|
||||||
|
local dstTmp="$dst.tmp.$$"
|
||||||
|
mkdir -p "$dstTmp" || true
|
||||||
|
|
||||||
|
@nixosGenBuilder@ -c "$generationPath" -n "$generationName" -d "$dstTmp"
|
||||||
|
|
||||||
|
# Move new generation on its place, backing up the previous version
|
||||||
|
# if it exists
|
||||||
|
# This may only happen when "$generationName" = "default"
|
||||||
|
moveWBackup "$dstTmp" "$dst"
|
||||||
|
fi
|
||||||
|
|
||||||
|
activeGenerations["$generationName"]=1
|
||||||
|
}
|
||||||
|
|
||||||
|
removeObsoleteGenerations() {
|
||||||
|
local path="$1"
|
||||||
|
|
||||||
|
echo "removing obsolete generations in $path..."
|
||||||
|
for gen in $path/*; do
|
||||||
|
if ! [ "${activeGenerations["$(basename "$gen")"]}" = 1 ]; then
|
||||||
|
echo "* $gen is obsolete"
|
||||||
|
rm -vrf "$gen"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
addAllEntries() {
|
||||||
|
local defaultGenerationPath="$1"
|
||||||
|
local outdir="$2"
|
||||||
|
local numGenerations="$3"
|
||||||
|
|
||||||
|
local gensDir="$outdir/@nixosGenerationsDir@"
|
||||||
|
mkdir -p "$gensDir" || true
|
||||||
|
|
||||||
|
# Add default generation
|
||||||
|
addEntry "$defaultGenerationPath" default "$gensDir"
|
||||||
|
|
||||||
|
if [ "$numGenerations" -gt 0 ]; then
|
||||||
|
# Add up to $numGenerations generations of the system profile, in reverse
|
||||||
|
# (most recent to least recent) order.
|
||||||
|
for generation in $(
|
||||||
|
(cd /nix/var/nix/profiles && ls -d system-*-link) \
|
||||||
|
| sed 's/system-\([0-9]\+\)-link/\1/' \
|
||||||
|
| sort -n -r \
|
||||||
|
| head -n "$numGenerations"); do
|
||||||
|
link=/nix/var/nix/profiles/system-$generation-link
|
||||||
|
addEntry "$link" "${generation}-default" "$gensDir"
|
||||||
|
for specialisation in $(
|
||||||
|
ls /nix/var/nix/profiles/system-$generation-link/specialisation \
|
||||||
|
| sort -n -r); do
|
||||||
|
link=/nix/var/nix/profiles/system-$generation-link/specialisation/$specialisation
|
||||||
|
addEntry "$link" "${generation}-${specialisation}" "$gensDir"
|
||||||
|
done
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
removeObsoleteGenerations "$gensDir"
|
||||||
|
}
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
echo "usage: $0 -c <path-to-default-configuration> [-b <boot-dir>] [-g <num-generations>]" >&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
default= # Default configuration
|
||||||
|
numGenerations=0 # Number of other generations to keep (kernel, initrd, DTBs, overlays)
|
||||||
|
|
||||||
|
echo "$0: $@"
|
||||||
|
while getopts "c:b:g:f:" opt; do
|
||||||
|
case "$opt" in
|
||||||
|
c) default="$OPTARG" ;;
|
||||||
|
b) boottarget="$OPTARG" ;;
|
||||||
|
g) numGenerations="$OPTARG" ;;
|
||||||
|
f) fwtarget="$OPTARG" ;;
|
||||||
|
\?) usage ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ -z "$boottarget" ] && [ -z "$fwtarget" ]; then
|
||||||
|
echo "Error: at least one of \`-b <boot-dir>\` and \`-f <firmware-dir>\` must be set"
|
||||||
|
usage
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$fwtarget" ]; then
|
||||||
|
echo "installing nixos-generation-independent firmware..."
|
||||||
|
@installFirmwareBuilder@ -c "$default" -d "$fwtarget"
|
||||||
|
|
||||||
|
echo "installing nixos generations..."
|
||||||
|
addAllEntries "$default" "$fwtarget" "$numGenerations"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$boottarget" ]; then
|
||||||
|
echo "'-b $boottarget' isn't used when loading the kernel directly with \`kernel\`: "\
|
||||||
|
"kernels are copied directly to <firmware-dir>"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "generational bootloader installed"
|
||||||
77
modules/nixos/hardware/raspberry-pi/i2c.nix
Normal file
77
modules/nixos/hardware/raspberry-pi/i2c.nix
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
namespace,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
cfg = config.${namespace}.hardware.raspberry-pi.i2c;
|
||||||
|
variant = config.${namespace}.hardware.raspberry-pi.variant;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.${namespace}.hardware.raspberry-pi.i2c = {
|
||||||
|
enable = lib.mkEnableOption "enable i2c dt overlays";
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
hardware.deviceTree = {
|
||||||
|
overlays = (
|
||||||
|
if (variant == "5") then
|
||||||
|
[
|
||||||
|
{
|
||||||
|
name = "i2c0-pi5-overlay";
|
||||||
|
dtsFile = "${
|
||||||
|
pkgs.${namespace}.raspberrypi-overlays
|
||||||
|
}/dtbs/raspberrypi-overlays/i2c0-pi5-overlay.dts";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "i2c1-pi5-overlay";
|
||||||
|
dtsFile = "${
|
||||||
|
pkgs.${namespace}.raspberrypi-overlays
|
||||||
|
}/dtbs/raspberrypi-overlays/i2c1-pi5-overlay.dts";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "i2c2-pi5-overlay";
|
||||||
|
dtsFile = "${
|
||||||
|
pkgs.${namespace}.raspberrypi-overlays
|
||||||
|
}/dtbs/raspberrypi-overlays/i2c2-pi5-overlay.dts";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "i2c3-pi5-overlay";
|
||||||
|
dtsFile = "${
|
||||||
|
pkgs.${namespace}.raspberrypi-overlays
|
||||||
|
}/dtbs/raspberrypi-overlays/i2c3-pi5-overlay.dts";
|
||||||
|
}
|
||||||
|
]
|
||||||
|
else
|
||||||
|
[
|
||||||
|
{
|
||||||
|
name = "i2c0-overlay";
|
||||||
|
dtsFile = "${pkgs.${namespace}.raspberrypi-overlays}/dtbs/raspberrypi-overlays/i2c0-overlay.dts";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "i2c1-overlay";
|
||||||
|
dtsFile = "${pkgs.${namespace}.raspberrypi-overlays}/dtbs/raspberrypi-overlays/i2c1-overlay.dts";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "i2c3-overlay";
|
||||||
|
dtsFile = "${pkgs.${namespace}.raspberrypi-overlays}/dtbs/raspberrypi-overlays/i2c3-overlay.dts";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "i2c4-overlay";
|
||||||
|
dtsFile = "${pkgs.${namespace}.raspberrypi-overlays}/dtbs/raspberrypi-overlays/i2c4-overlay.dts";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "i2c5-overlay";
|
||||||
|
dtsFile = "${pkgs.${namespace}.raspberrypi-overlays}/dtbs/raspberrypi-overlays/i2c5-overlay.dts";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "i2c6-overlay";
|
||||||
|
dtsFile = "${pkgs.${namespace}.raspberrypi-overlays}/dtbs/raspberrypi-overlays/i2c6-overlay.dts";
|
||||||
|
}
|
||||||
|
]
|
||||||
|
);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
20
modules/nixos/hardware/raspberry-pi/kernelboot-builder.nix
Normal file
20
modules/nixos/hardware/raspberry-pi/kernelboot-builder.nix
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
firmwareBuilder,
|
||||||
|
}:
|
||||||
|
|
||||||
|
pkgs.replaceVarsWith {
|
||||||
|
src = ./kernelboot-builder.sh;
|
||||||
|
isExecutable = true;
|
||||||
|
|
||||||
|
replacements = {
|
||||||
|
inherit (pkgs) bash;
|
||||||
|
path = pkgs.lib.makeBinPath [
|
||||||
|
pkgs.coreutils
|
||||||
|
pkgs.gnused
|
||||||
|
];
|
||||||
|
|
||||||
|
inherit firmwareBuilder;
|
||||||
|
copyKernels = true;
|
||||||
|
};
|
||||||
|
}
|
||||||
147
modules/nixos/hardware/raspberry-pi/kernelboot-builder.sh
Normal file
147
modules/nixos/hardware/raspberry-pi/kernelboot-builder.sh
Normal file
@@ -0,0 +1,147 @@
|
|||||||
|
#! @bash@/bin/sh -e
|
||||||
|
|
||||||
|
shopt -s nullglob
|
||||||
|
|
||||||
|
export PATH=/empty:@path@
|
||||||
|
|
||||||
|
# used to track copied files to decide which are obsolete
|
||||||
|
# and need to be removed
|
||||||
|
declare -A filesCopied
|
||||||
|
|
||||||
|
# Convert a path to a file in the Nix store such as
|
||||||
|
# /nix/store/<hash>-<name>/file to <hash>-<name>-<file>.
|
||||||
|
cleanName() {
|
||||||
|
local path="$1"
|
||||||
|
echo "$path" | sed 's|^/nix/store/||' | sed 's|/|-|g'
|
||||||
|
}
|
||||||
|
|
||||||
|
# Copy a file from the Nix store to `kernelsDir`.
|
||||||
|
copyToKernelsDir() {
|
||||||
|
local src="$1"
|
||||||
|
local kernelsDir="$2"
|
||||||
|
|
||||||
|
local dst="$kernelsDir/$(cleanName $src)"
|
||||||
|
# Don't copy the file if $dst already exists. This means that we
|
||||||
|
# have to create $dst atomically to prevent partially copied
|
||||||
|
# kernels or initrd if this script is ever interrupted.
|
||||||
|
if ! test -e $dst; then
|
||||||
|
local dstTmp=$dst.tmp.$$
|
||||||
|
cp $src $dstTmp
|
||||||
|
mv $dstTmp $dst
|
||||||
|
fi
|
||||||
|
filesCopied[$dst]=1
|
||||||
|
result=$dst
|
||||||
|
}
|
||||||
|
|
||||||
|
copyForced() {
|
||||||
|
local src="$1"
|
||||||
|
local dst="$2"
|
||||||
|
cp $src $dst.tmp
|
||||||
|
mv $dst.tmp $dst
|
||||||
|
}
|
||||||
|
|
||||||
|
# Copy generation's kernel and initrd to `kernelsDir`.
|
||||||
|
# Default generation's are also copied to `outdir`
|
||||||
|
addEntry() {
|
||||||
|
local generationPath="$1"
|
||||||
|
local generationName="$2"
|
||||||
|
local outdir="$3"
|
||||||
|
local kernelsDir="$4"
|
||||||
|
|
||||||
|
if ! test -e $generationPath/kernel -a -e $generationPath/initrd; then
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
local kernel=$(readlink -f $generationPath/kernel)
|
||||||
|
local initrd=$(readlink -f $generationPath/initrd)
|
||||||
|
|
||||||
|
if test "1" = "@copyKernels@"; then
|
||||||
|
copyToKernelsDir $kernel $kernelsDir; kernel=$result
|
||||||
|
copyToKernelsDir $initrd $kernelsDir; initrd=$result
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo $(readlink -f $generationPath) > $kernelsDir/$generationName-system
|
||||||
|
echo $(readlink -f $generationPath/init) > $kernelsDir/$generationName-init
|
||||||
|
cp $generationPath/kernel-params $kernelsDir/$generationName-cmdline.txt
|
||||||
|
echo $initrd > $kernelsDir/$generationName-initrd
|
||||||
|
echo $kernel > $kernelsDir/$generationName-kernel
|
||||||
|
|
||||||
|
if test "$generationName" = "default"; then
|
||||||
|
copyForced $kernel $outdir/kernel.img
|
||||||
|
copyForced $initrd $outdir/initrd
|
||||||
|
|
||||||
|
cp "$(readlink -f "$generationPath/init")" $outdir/nixos-init
|
||||||
|
echo "`cat $generationPath/kernel-params` init=$generationPath/init" >$outdir/cmdline.txt
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
removeObsolete() {
|
||||||
|
local path="$1"
|
||||||
|
|
||||||
|
# Remove obsolete files from $path and $path/old.
|
||||||
|
for fn in $path/*linux* $path/*initrd-initrd*; do
|
||||||
|
if ! test "${filesCopied[$fn]}" = 1; then
|
||||||
|
rm -vf -- "$fn"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
addAllEntries() {
|
||||||
|
local defaultGenerationPath="$1"
|
||||||
|
local outdir="$2"
|
||||||
|
|
||||||
|
local kernelsDir="$outdir/nixos-kernels"
|
||||||
|
mkdir -p $kernelsDir || true
|
||||||
|
|
||||||
|
# Add default generation
|
||||||
|
addEntry $defaultGenerationPath default $outdir $kernelsDir
|
||||||
|
|
||||||
|
# Add all generations of the system profile to the menu, in reverse
|
||||||
|
# (most recent to least recent) order.
|
||||||
|
for generation in $(
|
||||||
|
(cd /nix/var/nix/profiles && ls -d system-*-link) \
|
||||||
|
| sed 's/system-\([0-9]\+\)-link/\1/' \
|
||||||
|
| sort -n -r); do
|
||||||
|
link=/nix/var/nix/profiles/system-$generation-link
|
||||||
|
addEntry $link $generation $outdir $kernelsDir
|
||||||
|
done
|
||||||
|
|
||||||
|
removeObsolete $kernelsDir
|
||||||
|
}
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
echo "usage: $0 -c <path-to-default-configuration> [-d <boot-dir>]" >&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
default= # Default configuration
|
||||||
|
|
||||||
|
echo "kernelboot-builder: $@"
|
||||||
|
while getopts "c:b:f:" opt; do
|
||||||
|
case "$opt" in
|
||||||
|
c) default="$OPTARG" ;;
|
||||||
|
b) boottarget="$OPTARG" ;;
|
||||||
|
f) fwtarget="$OPTARG" ;;
|
||||||
|
\?) usage ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ -z "$boottarget" ] && [ -z "$fwtarget" ]; then
|
||||||
|
echo "Error: at least one of \`-b <boot-dir>\` and \`-f <firmware-dir>\` must be set"
|
||||||
|
usage
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$fwtarget" ]; then
|
||||||
|
@firmwareBuilder@ -c $default -d $fwtarget
|
||||||
|
|
||||||
|
echo "updating the boot generations directory..."
|
||||||
|
addAllEntries $default $fwtarget
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$boottarget" ]; then
|
||||||
|
echo "'-b $boottarget' isn't used when loading the kernel directly with kernelboot: \
|
||||||
|
kernels are copied directly to <firmware-dir>"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "kernelboot bootloader installed"
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user