Compare commits
64 Commits
302bb599db
...
final-befo
| Author | SHA1 | Date | |
|---|---|---|---|
|
e9a44f677d
|
|||
|
0c881602e9
|
|||
|
7f375e8574
|
|||
|
577b5eeb77
|
|||
|
91aba32afb
|
|||
|
29e71fb127
|
|||
|
ff94c3b027
|
|||
|
0b457b83d3
|
|||
|
c23240c529
|
|||
|
e40929018f
|
|||
|
5997c886f6
|
|||
|
72d37f57ac
|
|||
|
0718568bec
|
|||
|
982cc4aebc
|
|||
|
d2d25bbdfe
|
|||
|
76cdd535c8
|
|||
|
0be90ace43
|
|||
|
13f16fe775
|
|||
|
20df895312
|
|||
|
4542a5002c
|
|||
|
d0d8d5b9d2
|
|||
|
21658b7bc0
|
|||
|
56cda525cd
|
|||
|
194c66feb4
|
|||
|
7ab17f132e
|
|||
|
da1bfbb778
|
|||
|
ec42b906d6
|
|||
|
b050ecc5bf
|
|||
|
d2032e517b
|
|||
|
6254f98ca7
|
|||
|
09fdd39b00
|
|||
|
d722329803
|
|||
|
5529c66e5f
|
|||
|
95af71b0d8
|
|||
|
711b55a042
|
|||
|
928eb5ef0a
|
|||
|
502ae492a8
|
|||
|
d5bfbf83be
|
|||
|
abb762604d
|
|||
|
ca4e0d42b3
|
|||
|
c50e056e2a
|
|||
|
100f8d6328
|
|||
|
a13a7e8887
|
|||
|
0a7c24da4e
|
|||
|
27096b17be
|
|||
|
3627cb19c6
|
|||
|
0f0429b4b2
|
|||
|
8485f07c8d
|
|||
|
3cee862bd0
|
|||
|
325e2720ec
|
|||
|
841195425d
|
|||
|
269a0c4d27
|
|||
|
08486e25e6
|
|||
|
4c04e5b0a2
|
|||
|
7e571f4986
|
|||
|
4b73e237cb
|
|||
|
f96e99ff4d
|
|||
|
d7dd05e028
|
|||
| 5e9e6bcd40 | |||
| 3e35fea183 | |||
|
9a3ac53c50
|
|||
|
84bb728633
|
|||
|
3768e032ba
|
|||
|
07a808271d
|
@@ -1,10 +1,10 @@
|
|||||||
name: Build and Deploy Desktop
|
name: Build
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [main]
|
branches: [main]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
deploy:
|
build:
|
||||||
runs-on: nix
|
runs-on: nix
|
||||||
steps:
|
steps:
|
||||||
- uses: https://github.com/actions/checkout@v4
|
- uses: https://github.com/actions/checkout@v4
|
||||||
@@ -19,33 +19,20 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
nix build .#nixosConfigurations.yarn.config.system.build.toplevel -L
|
nix build .#nixosConfigurations.yarn.config.system.build.toplevel -L
|
||||||
|
|
||||||
- name: Deploy to desktop
|
- name: Record yarn store path for pull-update
|
||||||
|
continue-on-error: true
|
||||||
run: |
|
run: |
|
||||||
eval $(ssh-agent -s)
|
mkdir -p /var/lib/dotfiles-deploy
|
||||||
ssh-add /run/agenix/ci-deploy-key
|
readlink -f result > /var/lib/dotfiles-deploy/yarn
|
||||||
if ssh -i /run/agenix/ci-deploy-key -o StrictHostKeyChecking=no -o ConnectTimeout=10 root@desktop "echo reachable" 2>/dev/null; then
|
nix-store --add-root /var/lib/dotfiles-deploy/yarn-gcroot -r "$(readlink -f result)"
|
||||||
nix run github:serokell/deploy-rs -- .#yarn --ssh-opts="-o StrictHostKeyChecking=no"
|
|
||||||
echo "Deploy to desktop succeeded"
|
|
||||||
else
|
|
||||||
echo "Desktop unreachable - skipping deploy. Build succeeded."
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Notify success
|
- name: Build NixOS configuration (mreow)
|
||||||
if: success()
|
|
||||||
run: |
|
run: |
|
||||||
curl -sf -X POST \
|
nix build .#nixosConfigurations.mreow.config.system.build.toplevel -L
|
||||||
"https://ntfy.sigkill.computer/deployments" \
|
|
||||||
-H "Title: [yarn] Build succeeded" \
|
|
||||||
-H "Priority: default" \
|
|
||||||
-H "Tags: white_check_mark" \
|
|
||||||
-d "dotfiles built from commit ${GITHUB_SHA::8}"
|
|
||||||
|
|
||||||
- name: Notify failure
|
- name: Record mreow store path
|
||||||
if: failure()
|
continue-on-error: true
|
||||||
run: |
|
run: |
|
||||||
curl -sf -X POST \
|
mkdir -p /var/lib/dotfiles-deploy
|
||||||
"https://ntfy.sigkill.computer/deployments" \
|
readlink -f result > /var/lib/dotfiles-deploy/mreow
|
||||||
-H "Title: [yarn] Build FAILED" \
|
nix-store --add-root /var/lib/dotfiles-deploy/mreow-gcroot -r "$(readlink -f result)"
|
||||||
-H "Priority: urgent" \
|
|
||||||
-H "Tags: rotating_light" \
|
|
||||||
-d "dotfiles build failed at commit ${GITHUB_SHA::8}"
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
NixOS dotfiles for two hosts using Nix flakes + home-manager:
|
NixOS dotfiles for two hosts using Nix flakes + home-manager:
|
||||||
- **mreow** — Framework 13 AMD AI 300 laptop, niri WM, greetd, swaylock
|
- **mreow** — Framework 13 AMD AI 300 laptop, niri WM, greetd, swaylock
|
||||||
- **yarn** — Desktop, Jovian-NixOS (Steam deck mode), impermanence, sddm, deploy-rs target
|
- **yarn** — Desktop, Jovian-NixOS (Steam deck mode), impermanence, sddm, pull-based updates from CI
|
||||||
|
|
||||||
Secrets in `system/secrets/` and `home-manager/secrets/` are encrypted with git-crypt. **Never read or write files in those directories.**
|
Secrets in `system/secrets/` and `home-manager/secrets/` are encrypted with git-crypt. **Never read or write files in those directories.**
|
||||||
|
|
||||||
@@ -21,8 +21,10 @@ Secrets in `system/secrets/` and `home-manager/secrets/` are encrypted with git-
|
|||||||
nix build .#nixosConfigurations.mreow.config.system.build.toplevel -L
|
nix build .#nixosConfigurations.mreow.config.system.build.toplevel -L
|
||||||
nix build .#nixosConfigurations.yarn.config.system.build.toplevel -L
|
nix build .#nixosConfigurations.yarn.config.system.build.toplevel -L
|
||||||
|
|
||||||
# Remote deploy to yarn via deploy-rs
|
# yarn pulls updates automatically on boot from the binary cache.
|
||||||
deploy .#yarn
|
# CI builds the yarn closure, records the store path, and Harmonia serves it.
|
||||||
|
# To manually trigger the pull on yarn:
|
||||||
|
systemctl start pull-update
|
||||||
|
|
||||||
# Format all Nix files (uses nixfmt-tree, declared in flake.nix)
|
# Format all Nix files (uses nixfmt-tree, declared in flake.nix)
|
||||||
nix fmt
|
nix fmt
|
||||||
|
|||||||
@@ -18,5 +18,4 @@ There is more that I'm using, but those are the main ones! Read my configs to ge
|
|||||||
- Got my background from [here](https://old.reddit.com/r/celestegame/comments/11dtgwg/all_most_of_the_backgrounds_in_celeste_edited/) and used the command `magick input.png -filter Point -resize 2880x1920! output.png` to upscale it bilinearly
|
- Got my background from [here](https://old.reddit.com/r/celestegame/comments/11dtgwg/all_most_of_the_backgrounds_in_celeste_edited/) and used the command `magick input.png -filter Point -resize 2880x1920! output.png` to upscale it bilinearly
|
||||||
|
|
||||||
## TODO!
|
## TODO!
|
||||||
- [ ] further unify desktop and laptop configs
|
|
||||||
- [ ] Seperate out common shell utilities into a module or some sort (could be used on other machines)
|
- [ ] Seperate out common shell utilities into a module or some sort (could be used on other machines)
|
||||||
|
|||||||
372
flake.lock
generated
372
flake.lock
generated
@@ -12,11 +12,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1771437256,
|
"lastModified": 1776249299,
|
||||||
"narHash": "sha256-bLqwib+rtyBRRVBWhMuBXPCL/OThfokA+j6+uH7jDGU=",
|
"narHash": "sha256-Dt9t1TGRmJFc0xVYhttNBD6QsAgHOHCArqGa0AyjrJY=",
|
||||||
"owner": "numtide",
|
"owner": "numtide",
|
||||||
"repo": "blueprint",
|
"repo": "blueprint",
|
||||||
"rev": "06ee7190dc2620ea98af9eb225aa9627b68b0e33",
|
"rev": "56131e8628f173d24a27f6d27c0215eff57e40dd",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -46,35 +46,49 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1770895533,
|
"lastModified": 1776182890,
|
||||||
"narHash": "sha256-v3QaK9ugy9bN9RXDnjw0i2OifKmz2NnKM82agtqm/UY=",
|
"narHash": "sha256-+/VOe8XGq5klpU+I19D+3TcaR7o+Cwbq67KNF7mcFak=",
|
||||||
"owner": "nix-community",
|
"owner": "Mic92",
|
||||||
"repo": "bun2nix",
|
"repo": "bun2nix",
|
||||||
"rev": "c843f477b15f51151f8c6bcc886954699440a6e1",
|
"rev": "648d293c51e981aec9cb07ba4268bc19e7a8c575",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"owner": "nix-community",
|
"owner": "Mic92",
|
||||||
|
"ref": "catalog-support",
|
||||||
"repo": "bun2nix",
|
"repo": "bun2nix",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"claude-code": {
|
"cachyos-kernel": {
|
||||||
"inputs": {
|
"flake": false,
|
||||||
"flake-utils": "flake-utils",
|
|
||||||
"nixpkgs": "nixpkgs"
|
|
||||||
},
|
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1775007163,
|
"lastModified": 1776183001,
|
||||||
"narHash": "sha256-plS86OtgkWsAf/NtXc5iwxpBB+cOuyqjo5Xq2gEg8FQ=",
|
"narHash": "sha256-lvLKB5dTqjO1S/YonS9ZyWemEjO6QXtN4D76rYEYy4s=",
|
||||||
"owner": "sadjow",
|
"owner": "CachyOS",
|
||||||
"repo": "claude-code-nix",
|
"repo": "linux-cachyos",
|
||||||
"rev": "335c96551a1650e0306b756039f15c3364d2e0ac",
|
"rev": "4224303b6d7a50dd1cc3ffa78864050cc9536eec",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"owner": "sadjow",
|
"owner": "CachyOS",
|
||||||
"repo": "claude-code-nix",
|
"repo": "linux-cachyos",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"cachyos-kernel-patches": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1776355454,
|
||||||
|
"narHash": "sha256-b9Hc0sTxjEzDbphzS9yQqxVha/7bsPIs2cQQQvaG45E=",
|
||||||
|
"owner": "CachyOS",
|
||||||
|
"repo": "kernel-patches",
|
||||||
|
"rev": "b5e029226df5cc30c103651072d49a7af2878202",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "CachyOS",
|
||||||
|
"repo": "kernel-patches",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -93,28 +107,6 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"deploy-rs": {
|
|
||||||
"inputs": {
|
|
||||||
"flake-compat": "flake-compat",
|
|
||||||
"nixpkgs": [
|
|
||||||
"nixpkgs"
|
|
||||||
],
|
|
||||||
"utils": "utils"
|
|
||||||
},
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1770019181,
|
|
||||||
"narHash": "sha256-hwsYgDnby50JNVpTRYlF3UR/Rrpt01OrxVuryF40CFY=",
|
|
||||||
"owner": "serokell",
|
|
||||||
"repo": "deploy-rs",
|
|
||||||
"rev": "77c906c0ba56aabdbc72041bf9111b565cdd6171",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "serokell",
|
|
||||||
"repo": "deploy-rs",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"disko": {
|
"disko": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"nixpkgs": [
|
"nixpkgs": [
|
||||||
@@ -139,11 +131,11 @@
|
|||||||
"doomemacs": {
|
"doomemacs": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1774080407,
|
"lastModified": 1776400245,
|
||||||
"narHash": "sha256-FYbalilgDFjIVwK+D6DjDos1IMmMGA20lRf8k6Ykm1Y=",
|
"narHash": "sha256-RuQB1PxazI4DOw3O+rEVU2FPT0vP0Xb+Gp/M6Yqer20=",
|
||||||
"owner": "doomemacs",
|
"owner": "doomemacs",
|
||||||
"repo": "doomemacs",
|
"repo": "doomemacs",
|
||||||
"rev": "d8d75443d39d95f3c5256504eb838e0acc62ef44",
|
"rev": "860a91aaac235701f30b70fdc74259d438818968",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -162,11 +154,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1775062601,
|
"lastModified": 1776478519,
|
||||||
"narHash": "sha256-/5+NrxyE/JmHmnsSEve/zE7sTgXxrNSi+S+vAanmSSc=",
|
"narHash": "sha256-4TWCOVYe0iWEKuW7OH93nRI4Z7u68wNT6k9UJn0FZ5w=",
|
||||||
"owner": "nix-community",
|
"owner": "nix-community",
|
||||||
"repo": "emacs-overlay",
|
"repo": "emacs-overlay",
|
||||||
"rev": "120ce11560e7ce7c73b9977ca15fe9915b921e82",
|
"rev": "513e332b074507e1b46992952e7d83f329f2c22c",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -183,11 +175,11 @@
|
|||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"dir": "pkgs/firefox-addons",
|
"dir": "pkgs/firefox-addons",
|
||||||
"lastModified": 1774843378,
|
"lastModified": 1776398575,
|
||||||
"narHash": "sha256-8QLbY8F7UdxeQaW0KUVgr1/YPIupe+1lGjS5joR+ZCw=",
|
"narHash": "sha256-WArU6WOdWxzbzGqYk4w1Mucg+bw/SCl6MoSp+/cZMio=",
|
||||||
"owner": "rycee",
|
"owner": "rycee",
|
||||||
"repo": "nur-expressions",
|
"repo": "nur-expressions",
|
||||||
"rev": "0a31b668e3ebb599f95dc518076d709e8dddb57c",
|
"rev": "05815686caf4e3678f5aeb5fd36e567886ab0d30",
|
||||||
"type": "gitlab"
|
"type": "gitlab"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -200,15 +192,15 @@
|
|||||||
"flake-compat": {
|
"flake-compat": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1733328505,
|
"lastModified": 1767039857,
|
||||||
"narHash": "sha256-NeCCThCEP3eCl2l/+27kNNK7QrwZB1IJCrXfrbv5oqU=",
|
"narHash": "sha256-vNpUSpF5Nuw8xvDLj2KCwwksIbjua2LZCqhV1LNRDns=",
|
||||||
"owner": "edolstra",
|
"owner": "NixOS",
|
||||||
"repo": "flake-compat",
|
"repo": "flake-compat",
|
||||||
"rev": "ff81ac966bb2cae68946d5ed5fc4994f96d0ffec",
|
"rev": "5edf11c44bc78a0d334f6334cdaf7d60d732daab",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"owner": "edolstra",
|
"owner": "NixOS",
|
||||||
"repo": "flake-compat",
|
"repo": "flake-compat",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
@@ -237,11 +229,29 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1772408722,
|
"lastModified": 1775087534,
|
||||||
"narHash": "sha256-rHuJtdcOjK7rAHpHphUb1iCvgkU3GpfvicLMwwnfMT0=",
|
"narHash": "sha256-91qqW8lhL7TLwgQWijoGBbiD4t7/q75KTi8NxjVmSmA=",
|
||||||
"owner": "hercules-ci",
|
"owner": "hercules-ci",
|
||||||
"repo": "flake-parts",
|
"repo": "flake-parts",
|
||||||
"rev": "f20dc5d9b8027381c474144ecabc9034d6a839a3",
|
"rev": "3107b77cd68437b9a76194f0f7f9c55f2329ca5b",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "hercules-ci",
|
||||||
|
"repo": "flake-parts",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"flake-parts_2": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs-lib": "nixpkgs-lib"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1775087534,
|
||||||
|
"narHash": "sha256-91qqW8lhL7TLwgQWijoGBbiD4t7/q75KTi8NxjVmSmA=",
|
||||||
|
"owner": "hercules-ci",
|
||||||
|
"repo": "flake-parts",
|
||||||
|
"rev": "3107b77cd68437b9a76194f0f7f9c55f2329ca5b",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -254,24 +264,6 @@
|
|||||||
"inputs": {
|
"inputs": {
|
||||||
"systems": "systems"
|
"systems": "systems"
|
||||||
},
|
},
|
||||||
"locked": {
|
|
||||||
"lastModified": 1731533236,
|
|
||||||
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
|
|
||||||
"owner": "numtide",
|
|
||||||
"repo": "flake-utils",
|
|
||||||
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "numtide",
|
|
||||||
"repo": "flake-utils",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"flake-utils_2": {
|
|
||||||
"inputs": {
|
|
||||||
"systems": "systems_3"
|
|
||||||
},
|
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1710146030,
|
"lastModified": 1710146030,
|
||||||
"narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=",
|
"narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=",
|
||||||
@@ -315,11 +307,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1775047159,
|
"lastModified": 1776454077,
|
||||||
"narHash": "sha256-UWM4VZvfKaPwA9FMu7iZha5YAE8vsEtUazk+rFxmbTY=",
|
"narHash": "sha256-7zSUFWsU0+jlD7WB3YAxQ84Z/iJurA5hKPm8EfEyGJk=",
|
||||||
"owner": "nix-community",
|
"owner": "nix-community",
|
||||||
"repo": "home-manager",
|
"repo": "home-manager",
|
||||||
"rev": "1ce9e62690dfdd7e76bd266ccb9a887778410eb2",
|
"rev": "565e5349208fe7d0831ef959103c9bafbeac0681",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -374,11 +366,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1775024665,
|
"lastModified": 1776428236,
|
||||||
"narHash": "sha256-NKd88/dc+IZ7zYASBw1d0ofYvwRm/N546XGsYqi+oRc=",
|
"narHash": "sha256-+0SyQglnT2xUiyY07155G+O7aUWISELwqtTnfURufRU=",
|
||||||
"owner": "Jovian-Experiments",
|
"owner": "Jovian-Experiments",
|
||||||
"repo": "Jovian-NixOS",
|
"repo": "Jovian-NixOS",
|
||||||
"rev": "133e3ac905ee61a4366af18e7c1d34f1b7dd5f7a",
|
"rev": "eac78fc379ca47f7e21be8539c405e5fb489a857",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -389,7 +381,7 @@
|
|||||||
},
|
},
|
||||||
"json2steamshortcut": {
|
"json2steamshortcut": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"flake-utils": "flake-utils_2",
|
"flake-utils": "flake-utils",
|
||||||
"nixpkgs": [
|
"nixpkgs": [
|
||||||
"nixpkgs"
|
"nixpkgs"
|
||||||
]
|
]
|
||||||
@@ -420,11 +412,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1774858933,
|
"lastModified": 1776248416,
|
||||||
"narHash": "sha256-rgHUoE4QhOvK3Rcl9cbuIVdjPjFjfhcTm/uPs8Y7+2w=",
|
"narHash": "sha256-TC6yzbCAex1pDfqUZv9u8fVm8e17ft5fNrcZ0JRDOIQ=",
|
||||||
"owner": "nix-community",
|
"owner": "nix-community",
|
||||||
"repo": "lanzaboote",
|
"repo": "lanzaboote",
|
||||||
"rev": "45338aab3013924c75305f5cb3543b9cda993183",
|
"rev": "18e9e64bae15b828c092658335599122a6db939b",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -441,15 +433,15 @@
|
|||||||
"nixpkgs": [
|
"nixpkgs": [
|
||||||
"nixpkgs"
|
"nixpkgs"
|
||||||
],
|
],
|
||||||
"systems": "systems_4",
|
"systems": "systems_2",
|
||||||
"treefmt-nix": "treefmt-nix"
|
"treefmt-nix": "treefmt-nix"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1775055825,
|
"lastModified": 1776482297,
|
||||||
"narHash": "sha256-nsUa0Ey0K/POaJhouRThrw5WlBi2n8L8eCJtqzJa1vw=",
|
"narHash": "sha256-KmsWPwtbO8vrlH/R9stIun0LKZ4PFSCCEdqWDeLgbTE=",
|
||||||
"owner": "numtide",
|
"owner": "numtide",
|
||||||
"repo": "llm-agents.nix",
|
"repo": "llm-agents.nix",
|
||||||
"rev": "4e7f647bcd93b3bd95395c7c23e6a8474459f430",
|
"rev": "66c76393570f8fc4730caa2dc2d2c470fe33a3c9",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -472,11 +464,11 @@
|
|||||||
"xwayland-satellite-unstable": "xwayland-satellite-unstable"
|
"xwayland-satellite-unstable": "xwayland-satellite-unstable"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1775042939,
|
"lastModified": 1776435348,
|
||||||
"narHash": "sha256-qcCBdnnKj8g/TiYmfDl3LmTdLYVPxr08yht9JaTXW00=",
|
"narHash": "sha256-qsZnMThxTqxCJZ7DEKu3DD3KjIPcuUBvZ0C9a2uIvaQ=",
|
||||||
"owner": "sodiboo",
|
"owner": "sodiboo",
|
||||||
"repo": "niri-flake",
|
"repo": "niri-flake",
|
||||||
"rev": "0e4df2c05361ed0f5e8738335369b304a0962b02",
|
"rev": "55b5b1fc9481ab267603a1099e5d4b4ebc7394d7",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -505,11 +497,11 @@
|
|||||||
"niri-unstable": {
|
"niri-unstable": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1774616418,
|
"lastModified": 1776432730,
|
||||||
"narHash": "sha256-z+dLkAS4bqytIlOI4h2MnjBJrSP4d1Awx0n+IV5YA3Y=",
|
"narHash": "sha256-Pq1ZVvRGq/IFiFH6vkNwMfZEpWk23NjgGdX50COdj/c=",
|
||||||
"owner": "YaLTeR",
|
"owner": "YaLTeR",
|
||||||
"repo": "niri",
|
"repo": "niri",
|
||||||
"rev": "8f48f56fe19918b5cfa02e5d68a47ebaf7bf3dee",
|
"rev": "c814c656c53ea9d69f5afb45c88f4dc4d25338cd",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -518,6 +510,31 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"nix-cachyos-kernel": {
|
||||||
|
"inputs": {
|
||||||
|
"cachyos-kernel": "cachyos-kernel",
|
||||||
|
"cachyos-kernel-patches": "cachyos-kernel-patches",
|
||||||
|
"flake-compat": "flake-compat_2",
|
||||||
|
"flake-parts": "flake-parts_2",
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1776386586,
|
||||||
|
"narHash": "sha256-eVAUaL/6n8mnmBiPpEVW1NDNVSKLWhYVfycG+P0SvWU=",
|
||||||
|
"owner": "xddxdd",
|
||||||
|
"repo": "nix-cachyos-kernel",
|
||||||
|
"rev": "c65c3faf90ae07bae101c15ef502f0bcb06c5d74",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "xddxdd",
|
||||||
|
"ref": "release",
|
||||||
|
"repo": "nix-cachyos-kernel",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
"nix-doom-emacs-unstraightened": {
|
"nix-doom-emacs-unstraightened": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"doomemacs": "doomemacs",
|
"doomemacs": "doomemacs",
|
||||||
@@ -527,14 +544,14 @@
|
|||||||
"nixpkgs": [
|
"nixpkgs": [
|
||||||
"nixpkgs"
|
"nixpkgs"
|
||||||
],
|
],
|
||||||
"systems": "systems_5"
|
"systems": "systems_3"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1774962120,
|
"lastModified": 1776419397,
|
||||||
"narHash": "sha256-DMl2y+wfxnjPgjGjuH0i8+a33mhe9WCD4fR1WU68GM0=",
|
"narHash": "sha256-vmWJwNYtQFexLG6r/v8Dlou/5z8FbFCLo3QqZ/stLYQ=",
|
||||||
"owner": "marienz",
|
"owner": "marienz",
|
||||||
"repo": "nix-doom-emacs-unstraightened",
|
"repo": "nix-doom-emacs-unstraightened",
|
||||||
"rev": "7626225cbb0ef16baa88386ac59b123f6e2fb45b",
|
"rev": "7623dd4adbdf5f8a8464ecc5fd089e5c5cb5dada",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -582,11 +599,11 @@
|
|||||||
},
|
},
|
||||||
"nixos-hardware": {
|
"nixos-hardware": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1774933469,
|
"lastModified": 1775490113,
|
||||||
"narHash": "sha256-OrnCQeUO2bqaWUl0lkDWyGWjKsOhtCyd7JSfTedQNUE=",
|
"narHash": "sha256-2ZBhDNZZwYkRmefK5XLOusCJHnoeKkoN95hoSGgMxWM=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixos-hardware",
|
"repo": "nixos-hardware",
|
||||||
"rev": "f4c4c2c0c923d7811ac2a63ccc154767e4195337",
|
"rev": "c775c2772ba56e906cbeb4e0b2db19079ef11ff7",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -598,27 +615,11 @@
|
|||||||
},
|
},
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1774855581,
|
"lastModified": 1776169885,
|
||||||
"narHash": "sha256-YkreHeMgTCYvJ5fESV0YyqQK49bHGe2B51tH6claUh4=",
|
"narHash": "sha256-l/iNYDZ4bGOAFQY2q8y5OAfBBtrDAaPuRQqWaFHVRXM=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "15c6719d8c604779cf59e03c245ea61d3d7ab69b",
|
"rev": "4bd9165a9165d7b5e33ae57f3eecbcb28fb231c9",
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "NixOS",
|
|
||||||
"ref": "nixpkgs-unstable",
|
|
||||||
"repo": "nixpkgs",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"nixpkgs_2": {
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1774709303,
|
|
||||||
"narHash": "sha256-D3Q07BbIA2KnTcSXIqqu9P586uWxN74zNoCH3h2ESHg=",
|
|
||||||
"owner": "NixOS",
|
|
||||||
"repo": "nixpkgs",
|
|
||||||
"rev": "8110df5ad7abf5d4c0f6fb0f8f978390e77f9685",
|
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -628,6 +629,21 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"nixpkgs-lib": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1774748309,
|
||||||
|
"narHash": "sha256-+U7gF3qxzwD5TZuANzZPeJTZRHS29OFQgkQ2kiTJBIQ=",
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "nixpkgs.lib",
|
||||||
|
"rev": "333c4e0545a6da976206c74db8773a1645b5870a",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "nixpkgs.lib",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
"noctalia": {
|
"noctalia": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"nixpkgs": [
|
"nixpkgs": [
|
||||||
@@ -636,11 +652,11 @@
|
|||||||
"noctalia-qs": "noctalia-qs"
|
"noctalia-qs": "noctalia-qs"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1775039613,
|
"lastModified": 1776302695,
|
||||||
"narHash": "sha256-5VzBe0SOXamABAbtjNF5Y7jaMbSeVtGQRhbICoJ6izo=",
|
"narHash": "sha256-xZc9o1JLQpmWn2Dqui323+Tq2Ai4sSdtdvbFZCs4qLo=",
|
||||||
"owner": "noctalia-dev",
|
"owner": "noctalia-dev",
|
||||||
"repo": "noctalia-shell",
|
"repo": "noctalia-shell",
|
||||||
"rev": "7b29c11d7aaf476723af14865665cf04750f8d20",
|
"rev": "a7c724181fca5d1aff2d47b18fa733504cfdbda2",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -655,15 +671,15 @@
|
|||||||
"noctalia",
|
"noctalia",
|
||||||
"nixpkgs"
|
"nixpkgs"
|
||||||
],
|
],
|
||||||
"systems": "systems_6",
|
"systems": "systems_4",
|
||||||
"treefmt-nix": "treefmt-nix_2"
|
"treefmt-nix": "treefmt-nix_2"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1774994931,
|
"lastModified": 1775957204,
|
||||||
"narHash": "sha256-WmXA8kyqvDA226DRPrXyR6bLO9VsRr4SUAYCVH6H6Ns=",
|
"narHash": "sha256-d4CVRtAty2GzDYXx4xYQmR+nlOjjKovyprQfZhgLckU=",
|
||||||
"owner": "noctalia-dev",
|
"owner": "noctalia-dev",
|
||||||
"repo": "noctalia-qs",
|
"repo": "noctalia-qs",
|
||||||
"rev": "b053facf8421df220d0bf2496a543b23dee3ca85",
|
"rev": "68e82fe34c68ee839a9c37e3466820e266af0c86",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -672,25 +688,9 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"opencode-claude-bridge": {
|
|
||||||
"flake": false,
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1774537245,
|
|
||||||
"narHash": "sha256-G2/GOP6gUGM2NBfOeSsUDnSus/engduft5z3Y7GwtUE=",
|
|
||||||
"owner": "dotCipher",
|
|
||||||
"repo": "opencode-claude-bridge",
|
|
||||||
"rev": "568ca15b5d2b772ebbad14b0b545fa7670272e79",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "dotCipher",
|
|
||||||
"repo": "opencode-claude-bridge",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"pre-commit": {
|
"pre-commit": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"flake-compat": "flake-compat_2",
|
"flake-compat": "flake-compat",
|
||||||
"gitignore": "gitignore",
|
"gitignore": "gitignore",
|
||||||
"nixpkgs": [
|
"nixpkgs": [
|
||||||
"lanzaboote",
|
"lanzaboote",
|
||||||
@@ -713,8 +713,6 @@
|
|||||||
},
|
},
|
||||||
"root": {
|
"root": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"claude-code": "claude-code",
|
|
||||||
"deploy-rs": "deploy-rs",
|
|
||||||
"disko": "disko",
|
"disko": "disko",
|
||||||
"emacs-overlay": "emacs-overlay",
|
"emacs-overlay": "emacs-overlay",
|
||||||
"firefox-addons": "firefox-addons",
|
"firefox-addons": "firefox-addons",
|
||||||
@@ -725,12 +723,12 @@
|
|||||||
"lanzaboote": "lanzaboote",
|
"lanzaboote": "lanzaboote",
|
||||||
"llm-agents": "llm-agents",
|
"llm-agents": "llm-agents",
|
||||||
"niri": "niri",
|
"niri": "niri",
|
||||||
|
"nix-cachyos-kernel": "nix-cachyos-kernel",
|
||||||
"nix-doom-emacs-unstraightened": "nix-doom-emacs-unstraightened",
|
"nix-doom-emacs-unstraightened": "nix-doom-emacs-unstraightened",
|
||||||
"nix-flatpak": "nix-flatpak",
|
"nix-flatpak": "nix-flatpak",
|
||||||
"nixos-hardware": "nixos-hardware",
|
"nixos-hardware": "nixos-hardware",
|
||||||
"nixpkgs": "nixpkgs_2",
|
"nixpkgs": "nixpkgs",
|
||||||
"noctalia": "noctalia",
|
"noctalia": "noctalia",
|
||||||
"opencode-claude-bridge": "opencode-claude-bridge",
|
|
||||||
"rust-overlay": "rust-overlay",
|
"rust-overlay": "rust-overlay",
|
||||||
"zen-browser": "zen-browser"
|
"zen-browser": "zen-browser"
|
||||||
}
|
}
|
||||||
@@ -742,11 +740,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1775013181,
|
"lastModified": 1776481912,
|
||||||
"narHash": "sha256-zPrt6oNM1r/RO5bWYaZ3hthfG9vzkr6kQdoqDd5x4Qw=",
|
"narHash": "sha256-Xq7p+Ex3YHFAd+fFFLOYw2Wv67582X7SAmrEDtIDZQ4=",
|
||||||
"owner": "oxalica",
|
"owner": "oxalica",
|
||||||
"repo": "rust-overlay",
|
"repo": "rust-overlay",
|
||||||
"rev": "e8046c1d9ccadd497c2344d8fa49dab62f22f7be",
|
"rev": "e611106c527e8ab0adbb641183cda284411d575c",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -801,36 +799,6 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"systems_4": {
|
"systems_4": {
|
||||||
"locked": {
|
|
||||||
"lastModified": 1681028828,
|
|
||||||
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
|
||||||
"owner": "nix-systems",
|
|
||||||
"repo": "default",
|
|
||||||
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "nix-systems",
|
|
||||||
"repo": "default",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"systems_5": {
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1681028828,
|
|
||||||
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
|
||||||
"owner": "nix-systems",
|
|
||||||
"repo": "default",
|
|
||||||
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "nix-systems",
|
|
||||||
"repo": "default",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"systems_6": {
|
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1689347949,
|
"lastModified": 1689347949,
|
||||||
"narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=",
|
"narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=",
|
||||||
@@ -853,11 +821,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1773297127,
|
"lastModified": 1775636079,
|
||||||
"narHash": "sha256-6E/yhXP7Oy/NbXtf1ktzmU8SdVqJQ09HC/48ebEGBpk=",
|
"narHash": "sha256-pc20NRoMdiar8oPQceQT47UUZMBTiMdUuWrYu2obUP0=",
|
||||||
"owner": "numtide",
|
"owner": "numtide",
|
||||||
"repo": "treefmt-nix",
|
"repo": "treefmt-nix",
|
||||||
"rev": "71b125cd05fbfd78cab3e070b73544abe24c5016",
|
"rev": "790751ff7fd3801feeaf96d7dc416a8d581265ba",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -875,11 +843,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1773297127,
|
"lastModified": 1775636079,
|
||||||
"narHash": "sha256-6E/yhXP7Oy/NbXtf1ktzmU8SdVqJQ09HC/48ebEGBpk=",
|
"narHash": "sha256-pc20NRoMdiar8oPQceQT47UUZMBTiMdUuWrYu2obUP0=",
|
||||||
"owner": "numtide",
|
"owner": "numtide",
|
||||||
"repo": "treefmt-nix",
|
"repo": "treefmt-nix",
|
||||||
"rev": "71b125cd05fbfd78cab3e070b73544abe24c5016",
|
"rev": "790751ff7fd3801feeaf96d7dc416a8d581265ba",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -888,24 +856,6 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"utils": {
|
|
||||||
"inputs": {
|
|
||||||
"systems": "systems_2"
|
|
||||||
},
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1731533236,
|
|
||||||
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
|
|
||||||
"owner": "numtide",
|
|
||||||
"repo": "flake-utils",
|
|
||||||
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "numtide",
|
|
||||||
"repo": "flake-utils",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"xwayland-satellite-stable": {
|
"xwayland-satellite-stable": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
@@ -949,11 +899,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1775021133,
|
"lastModified": 1776403742,
|
||||||
"narHash": "sha256-JB0u0evfSlmNg9HdGDxtXjaCcdKUpFPdSAMGxvJo5Pw=",
|
"narHash": "sha256-ZmGY9XiOsuMS/THsSNkgp2fnc3asXQX/xRrQpWnY9nA=",
|
||||||
"owner": "0xc000022070",
|
"owner": "0xc000022070",
|
||||||
"repo": "zen-browser-flake",
|
"repo": "zen-browser-flake",
|
||||||
"rev": "4bf1a6837064486c4f573a9d500c4cf3c1c075c0",
|
"rev": "ca7077bea5c830470437ea878da2a1940773324c",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
|||||||
29
flake.nix
29
flake.nix
@@ -63,12 +63,6 @@
|
|||||||
inputs.nixpkgs.follows = "nixpkgs";
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
inputs.home-manager.follows = "home-manager";
|
inputs.home-manager.follows = "home-manager";
|
||||||
};
|
};
|
||||||
|
|
||||||
deploy-rs = {
|
|
||||||
url = "github:serokell/deploy-rs";
|
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
|
||||||
};
|
|
||||||
|
|
||||||
jovian-nixos = {
|
jovian-nixos = {
|
||||||
url = "github:Jovian-Experiments/Jovian-NixOS";
|
url = "github:Jovian-Experiments/Jovian-NixOS";
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
@@ -79,6 +73,10 @@
|
|||||||
inputs.nixpkgs.follows = "nixpkgs";
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
nix-cachyos-kernel = {
|
||||||
|
url = "github:xddxdd/nix-cachyos-kernel/release";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
};
|
||||||
llm-agents = {
|
llm-agents = {
|
||||||
url = "github:numtide/llm-agents.nix";
|
url = "github:numtide/llm-agents.nix";
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
@@ -88,15 +86,6 @@
|
|||||||
url = "github:ChrisOboe/json2steamshortcut";
|
url = "github:ChrisOboe/json2steamshortcut";
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
};
|
};
|
||||||
|
|
||||||
claude-code = {
|
|
||||||
url = "github:sadjow/claude-code-nix";
|
|
||||||
};
|
|
||||||
|
|
||||||
opencode-claude-bridge = {
|
|
||||||
url = "github:dotCipher/opencode-claude-bridge";
|
|
||||||
flake = false;
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
outputs =
|
outputs =
|
||||||
@@ -106,7 +95,6 @@
|
|||||||
lanzaboote,
|
lanzaboote,
|
||||||
nixos-hardware,
|
nixos-hardware,
|
||||||
home-manager,
|
home-manager,
|
||||||
deploy-rs,
|
|
||||||
jovian-nixos,
|
jovian-nixos,
|
||||||
...
|
...
|
||||||
}@inputs:
|
}@inputs:
|
||||||
@@ -163,14 +151,5 @@
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
) { } hostnames;
|
) { } hostnames;
|
||||||
|
|
||||||
# Deploy-rs configuration for yarn host only
|
|
||||||
deploy.nodes.yarn = {
|
|
||||||
hostname = "desktop";
|
|
||||||
profiles.system = {
|
|
||||||
sshUser = "root";
|
|
||||||
path = deploy-rs.lib.${system}.activate.nixos self.nixosConfigurations.yarn;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,9 +9,6 @@
|
|||||||
# niri wayland compositor
|
# niri wayland compositor
|
||||||
./progs/niri.nix
|
./progs/niri.nix
|
||||||
|
|
||||||
# statusbar
|
|
||||||
# ./progs/eww/eww.nix
|
|
||||||
|
|
||||||
# lockscreen
|
# lockscreen
|
||||||
./progs/swaylock.nix
|
./progs/swaylock.nix
|
||||||
|
|
||||||
@@ -29,5 +26,4 @@
|
|||||||
# used by /etc/nixos logic to launch niri
|
# used by /etc/nixos logic to launch niri
|
||||||
config.programs.niri.package
|
config.programs.niri.package
|
||||||
];
|
];
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -119,7 +119,7 @@ in
|
|||||||
imports = [
|
imports = [
|
||||||
./progs/fish.nix
|
./progs/fish.nix
|
||||||
./progs/helix.nix
|
./progs/helix.nix
|
||||||
./progs/opencode.nix
|
./progs/pi.nix
|
||||||
(
|
(
|
||||||
{ ... }:
|
{ ... }:
|
||||||
{
|
{
|
||||||
@@ -211,8 +211,6 @@ in
|
|||||||
# power stuff
|
# power stuff
|
||||||
powerstat
|
powerstat
|
||||||
|
|
||||||
nodePackages_latest.nodejs
|
|
||||||
|
|
||||||
yt-dlp
|
yt-dlp
|
||||||
]
|
]
|
||||||
rust_pkgs
|
rust_pkgs
|
||||||
|
|||||||
@@ -8,7 +8,6 @@
|
|||||||
location = {
|
location = {
|
||||||
sourceDirectories = (
|
sourceDirectories = (
|
||||||
map (f: "${homeDirectory}/${f}") [
|
map (f: "${homeDirectory}/${f}") [
|
||||||
".zen"
|
|
||||||
".local/share/fish"
|
".local/share/fish"
|
||||||
".ssh"
|
".ssh"
|
||||||
"Documents"
|
"Documents"
|
||||||
@@ -16,18 +15,6 @@
|
|||||||
"Pictures"
|
"Pictures"
|
||||||
"school"
|
"school"
|
||||||
]
|
]
|
||||||
++ (map (f: ".config/Signal/${f}") [
|
|
||||||
"stickers.noindex"
|
|
||||||
"attachments.noindex"
|
|
||||||
"downloads.noindex"
|
|
||||||
"drafts.noindex"
|
|
||||||
"sql"
|
|
||||||
"IndexedDB"
|
|
||||||
"Local Storage"
|
|
||||||
"SharedStorage"
|
|
||||||
"config.json"
|
|
||||||
"Preferences"
|
|
||||||
])
|
|
||||||
);
|
);
|
||||||
|
|
||||||
excludeHomeManagerSymlinks = true;
|
excludeHomeManagerSymlinks = true;
|
||||||
|
|||||||
@@ -1,109 +0,0 @@
|
|||||||
$background: #1e1e2e;
|
|
||||||
$pink: #f5c2e7;
|
|
||||||
$lavendar: #b4befe;
|
|
||||||
$red: #f38ba8;
|
|
||||||
$maroon: #eba0ac;
|
|
||||||
$peach: #fab387;
|
|
||||||
$yellow: #f9e2af;
|
|
||||||
$green: #a6e3a1;
|
|
||||||
$text: #cdd6f4;
|
|
||||||
$subtext: #a6adc8;
|
|
||||||
$surface: #585b70;
|
|
||||||
|
|
||||||
* {
|
|
||||||
color: $text;
|
|
||||||
font-family: CaskaydiaCove Nerd Font Mono;
|
|
||||||
font-weight: 600;
|
|
||||||
font-size: 10pt;
|
|
||||||
padding: 0 1px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.red {
|
|
||||||
color: $red;
|
|
||||||
}
|
|
||||||
|
|
||||||
.maroon {
|
|
||||||
color: $maroon;
|
|
||||||
}
|
|
||||||
|
|
||||||
.peach {
|
|
||||||
color: $peach;
|
|
||||||
}
|
|
||||||
|
|
||||||
.yellow {
|
|
||||||
color: $yellow;
|
|
||||||
}
|
|
||||||
|
|
||||||
.green {
|
|
||||||
color: $green;
|
|
||||||
}
|
|
||||||
|
|
||||||
.lavendar {
|
|
||||||
color: $lavendar;
|
|
||||||
}
|
|
||||||
|
|
||||||
.symbol {
|
|
||||||
color: $lavendar;
|
|
||||||
font-size: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.button {
|
|
||||||
* {
|
|
||||||
all: unset;
|
|
||||||
margin: 0 5px;
|
|
||||||
font-size: 14pt;
|
|
||||||
transition: color 0.2s ease-in-out;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:hover * {
|
|
||||||
color: $pink;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.bluetooth * {
|
|
||||||
font-size: 10pt;
|
|
||||||
padding: 0 0.3em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.padded>*:not(:last-child) {
|
|
||||||
padding: 0 10px;
|
|
||||||
border-right: 1px solid $surface;
|
|
||||||
}
|
|
||||||
|
|
||||||
.background {
|
|
||||||
border: 1px solid $pink;
|
|
||||||
background-color: $background;
|
|
||||||
border-radius: 12px;
|
|
||||||
opacity: 0.8;
|
|
||||||
}
|
|
||||||
|
|
||||||
scale trough {
|
|
||||||
margin: 0 10px;
|
|
||||||
border: none;
|
|
||||||
background-color: #FFF;
|
|
||||||
min-height: 3px;
|
|
||||||
min-width: 100px;
|
|
||||||
|
|
||||||
& slider {
|
|
||||||
box-shadow: none;
|
|
||||||
background-image: none;
|
|
||||||
border: none;
|
|
||||||
background-color: $pink;
|
|
||||||
min-width: 5pt;
|
|
||||||
min-height: 5pt;
|
|
||||||
margin: -5pt;
|
|
||||||
}
|
|
||||||
|
|
||||||
& highlight {
|
|
||||||
border: none;
|
|
||||||
background-color: $lavendar;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.clipboard {
|
|
||||||
color: $subtext;
|
|
||||||
}
|
|
||||||
|
|
||||||
.time {
|
|
||||||
padding-right: 10px;
|
|
||||||
}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
(include "./statusbar.yuck")
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
niri_data=$(niri msg --json focused-window)
|
|
||||||
|
|
||||||
if [[ "$niri_data" == "null" ]]; then
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
name=$(echo "$niri_data" | jq -r '.["app_id"], .["title"]' | tr '\n' ' ' | sed 's/.$//')
|
|
||||||
proc_name=$(echo "$name" | head -c 55)
|
|
||||||
|
|
||||||
|
|
||||||
# TODO! fix this logic, add a '...' at the end
|
|
||||||
if [[ "$name" != "$proc_name" ]]; then
|
|
||||||
proc_name="$proc_name..."
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "$proc_name"
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
#!/usr/bin/env fish
|
|
||||||
|
|
||||||
niri msg --json workspaces | jq -r '.[] | select(.is_focused == true) | .["id"]'
|
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
#!/usr/bin/env rust-script
|
|
||||||
|
|
||||||
use std::{fmt, fs::read_to_string, str::FromStr};
|
|
||||||
|
|
||||||
const BASE_PATH: &str = "/sys/class/power_supply/BAT1/";
|
|
||||||
const CURRENT_NOW_PATH: &str = "current_now";
|
|
||||||
const VOLTAGE_NOW_PATH: &str = "voltage_now";
|
|
||||||
const STATUS_PATH: &str = "status";
|
|
||||||
const FACTOR: f32 = 1e6_f32;
|
|
||||||
|
|
||||||
#[derive(Debug)]
|
|
||||||
enum Status {
|
|
||||||
Charging,
|
|
||||||
Discharging,
|
|
||||||
NotCharging,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl FromStr for Status {
|
|
||||||
type Err = &'static str;
|
|
||||||
|
|
||||||
fn from_str(input: &str) -> Result<Status, Self::Err> {
|
|
||||||
match input {
|
|
||||||
"Charging" => Ok(Status::Charging),
|
|
||||||
"Discharging" => Ok(Status::Discharging),
|
|
||||||
"Not charging" => Ok(Status::NotCharging),
|
|
||||||
_ => Err("unknown state"),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl fmt::Display for Status {
|
|
||||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
|
||||||
fmt::Debug::fmt(self, f)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn fetch_and_trim_into<T: FromStr<Err = impl fmt::Debug>>(path: &str) -> T {
|
|
||||||
let mut content = read_to_string(BASE_PATH.to_owned() + path).unwrap();
|
|
||||||
content.pop();
|
|
||||||
T::from_str(&content).unwrap()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn fetch_bat_info(path: &str) -> f32 {
|
|
||||||
let value: f32 = fetch_and_trim_into(path);
|
|
||||||
value / FACTOR
|
|
||||||
}
|
|
||||||
|
|
||||||
fn main() {
|
|
||||||
let current_now: f32 = fetch_bat_info(CURRENT_NOW_PATH);
|
|
||||||
let voltage_now: f32 = fetch_bat_info(VOLTAGE_NOW_PATH);
|
|
||||||
let watts: f32 = current_now * voltage_now;
|
|
||||||
let status: Status = fetch_and_trim_into(STATUS_PATH);
|
|
||||||
|
|
||||||
println!(
|
|
||||||
"voltage: {:.4}\ncurrent: {:.4}\nwatts: {:.4}\nstatus: {}",
|
|
||||||
voltage_now, current_now, watts, status
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
#!/usr/bin/env sh
|
|
||||||
wpctl inspect @DEFAULT_SINK@ | grep -E "^ +\* node\.description" | cut -d' ' -f6- | tr -d '"'
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
output=$(wpctl get-volume @DEFAULT_SINK@ | cut -d' ' -f2- | sed -E 's/\.//g' | sed 's/^0*//g')
|
|
||||||
count=$(echo "$output" | awk -F, '{print $1+0}')
|
|
||||||
muted=$(echo "$output" | cut -d'[' -f2 | cut -d ']' -f1)
|
|
||||||
|
|
||||||
# if not muted, set to empty string
|
|
||||||
if [ "$muted" == "$count" ]; then
|
|
||||||
muted=""
|
|
||||||
fi
|
|
||||||
|
|
||||||
color="green"
|
|
||||||
if ((count > 75)); then color="yellow"; fi
|
|
||||||
if ((count > 90)); then color="peach"; fi
|
|
||||||
if ((count > 100)); then color="maroon"; fi
|
|
||||||
if ((count > 110)); then color="red"; fi
|
|
||||||
|
|
||||||
output="${count}%"
|
|
||||||
if [ "$muted" != "" ]; then
|
|
||||||
output="${output} [${muted}]"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "{\"count\":\"${output}\", \"color\":\"${color}\"}"
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
#!/usr/bin/env zsh
|
|
||||||
export CHARSET=ASCII
|
|
||||||
case $1 in
|
|
||||||
name)
|
|
||||||
nmcli -f IN-USE,SSID d w | grep '*' | sed 's/[\* ]//g' | cat
|
|
||||||
exit 0;;
|
|
||||||
strength)
|
|
||||||
str=$(nmcli -f ACTIVE,BARS d w | grep 'yes' | tr -d ' yesno')
|
|
||||||
case ${str: 0:-1} in
|
|
||||||
'****')
|
|
||||||
icon=""; colour="green";;
|
|
||||||
'***')
|
|
||||||
icon=""; colour="yellow";;
|
|
||||||
'**')
|
|
||||||
icon=""; colour="peach";;
|
|
||||||
'*')
|
|
||||||
icon=""; colour="maroon";;
|
|
||||||
*)
|
|
||||||
icon=""; colour="red";;
|
|
||||||
esac
|
|
||||||
echo "{\"icon\":\"$icon\",\"colour\":\"$colour\"}"
|
|
||||||
exit 0;;
|
|
||||||
esac
|
|
||||||
@@ -1,130 +0,0 @@
|
|||||||
(defwindow statusbar
|
|
||||||
:monitor 0
|
|
||||||
:stacking "fg"
|
|
||||||
:exclusive true
|
|
||||||
:geometry (geometry
|
|
||||||
:y "0.5%"
|
|
||||||
:width "100%"
|
|
||||||
:height "24px"
|
|
||||||
:anchor "top center")
|
|
||||||
(statusbar))
|
|
||||||
|
|
||||||
(defwidget statusbar []
|
|
||||||
(centerbox
|
|
||||||
(box :space-evenly false :halign 'start' :class 'padded'
|
|
||||||
(window-title))
|
|
||||||
(time)
|
|
||||||
(box :space-evenly false :halign 'end' :class 'padded'
|
|
||||||
(brightness-ctl)
|
|
||||||
(brightness-ctl-opener)
|
|
||||||
(volume)
|
|
||||||
(battery)
|
|
||||||
(bluetooth)
|
|
||||||
(wifi))))
|
|
||||||
|
|
||||||
(defwidget cmd-slider [?symbol value command max color]
|
|
||||||
(box :space-evenly false
|
|
||||||
(label :text symbol :class "symbol")
|
|
||||||
(scale
|
|
||||||
:min 0 :max max
|
|
||||||
:value value
|
|
||||||
:round-digits 0
|
|
||||||
:timeout "200ms"
|
|
||||||
:onchange command)
|
|
||||||
(label :text "${value}%" :class color)))
|
|
||||||
|
|
||||||
(defpoll windowtitle :interval "1s" `scripts/currentWindow.sh`)
|
|
||||||
|
|
||||||
(defwidget window-title []
|
|
||||||
(label
|
|
||||||
:text {windowtitle == "" ? "" : "(${windowtitle})"}))
|
|
||||||
|
|
||||||
(defwidget brightness-ctl []
|
|
||||||
(box :visible brightnessctl-open
|
|
||||||
(cmd-slider :symbol "" :value brightness
|
|
||||||
:command `brightnessctl set {}%`
|
|
||||||
:max 101 :color {
|
|
||||||
brightness >= 80 ? "green" :
|
|
||||||
brightness >= 50 ? "yellow" :
|
|
||||||
brightness >= 30 ? "peach" :
|
|
||||||
brightness >= 10 ? "maroon" : "red"
|
|
||||||
})))
|
|
||||||
|
|
||||||
|
|
||||||
(defpoll brightness :interval "1s" :run-while brightnessctl-open `brightnessctl -m | awk -F, '{print $4+0}'`)
|
|
||||||
|
|
||||||
|
|
||||||
(defvar brightnessctl-open false)
|
|
||||||
(defwidget brightness-ctl-opener []
|
|
||||||
(eventbox :class "button"
|
|
||||||
(button
|
|
||||||
:onclick `${EWW_CMD} update brightnessctl-open=${!brightnessctl-open}`
|
|
||||||
"")))
|
|
||||||
|
|
||||||
(defwidget wifi []
|
|
||||||
(eventbox
|
|
||||||
:class "button ${wifi-strength.colour}"
|
|
||||||
(label
|
|
||||||
:text {wifi-strength.icon}
|
|
||||||
:tooltip "Connected To: ${wifi-name}")))
|
|
||||||
|
|
||||||
(defpoll wifi-strength :interval "10s" `scripts/wifiInfo.zsh strength`)
|
|
||||||
(defpoll wifi-name :interval "1m" `scripts/wifiInfo.zsh name`)
|
|
||||||
|
|
||||||
(defwidget bluetooth []
|
|
||||||
(eventbox
|
|
||||||
:class "bluetooth button ${ bluetooth-name != "" ? "green" : "lavendar" }"
|
|
||||||
:onclick `blueman-manager &`
|
|
||||||
(label
|
|
||||||
:text "${bluetooth-name} ")))
|
|
||||||
|
|
||||||
; `FNR == 1 + head -c 30` so the name doesn't explode the screen
|
|
||||||
(defpoll bluetooth-name :interval "10s" `bluetoothctl devices Connected | awk '$1 == "Device" {print $0}' | cut -d' ' -f3-`)
|
|
||||||
|
|
||||||
(defwidget time []
|
|
||||||
(box
|
|
||||||
:space-evenly false
|
|
||||||
:class "time"
|
|
||||||
:tooltip {time.long}
|
|
||||||
(label :class "yellow" :text {time.hour})
|
|
||||||
(label :text ":")
|
|
||||||
(label :class "yellow" :text {time.minute})))
|
|
||||||
|
|
||||||
(defpoll time :interval "1s" `date +'{"long":"%a %b %e %H:%M:%S %Z %Y","hour":"%H","minute":"%M"}'`)
|
|
||||||
|
|
||||||
(defpoll powerstats :interval "2s" `power_bat`)
|
|
||||||
|
|
||||||
(defwidget battery []
|
|
||||||
(box :space-evenly false
|
|
||||||
:tooltip powerstats
|
|
||||||
(label
|
|
||||||
:text {EWW_BATTERY.BAT1.status == "Charging" ? "" :
|
|
||||||
EWW_BATTERY.BAT1.capacity >= 90 ? "" :
|
|
||||||
EWW_BATTERY.BAT1.capacity >= 80 ? "" :
|
|
||||||
EWW_BATTERY.BAT1.capacity >= 70 ? "" :
|
|
||||||
EWW_BATTERY.BAT1.capacity >= 60 ? "" :
|
|
||||||
EWW_BATTERY.BAT1.capacity >= 50 ? "" :
|
|
||||||
EWW_BATTERY.BAT1.capacity >= 40 ? "" :
|
|
||||||
EWW_BATTERY.BAT1.capacity >= 30 ? "" :
|
|
||||||
EWW_BATTERY.BAT1.capacity >= 20 ? "" :
|
|
||||||
EWW_BATTERY.BAT1.capacity >= 10 ? "" : ""
|
|
||||||
}
|
|
||||||
:class {
|
|
||||||
EWW_BATTERY.BAT1.capacity >= 80 ? "green" :
|
|
||||||
EWW_BATTERY.BAT1.capacity >= 50 ? "yellow" :
|
|
||||||
EWW_BATTERY.BAT1.capacity >= 30 ? "peach" :
|
|
||||||
EWW_BATTERY.BAT1.capacity >= 10 ? "maroon" : "red"
|
|
||||||
})
|
|
||||||
(label :text "${EWW_BATTERY.BAT1.capacity}%" :class "yellow")))
|
|
||||||
|
|
||||||
|
|
||||||
(defpoll volumevalue :interval "1s" `scripts/sound/getVolume.sh`)
|
|
||||||
(defpoll volumesink :interval "1s" `scripts/sound/getSink.sh`)
|
|
||||||
|
|
||||||
(defwidget volume []
|
|
||||||
(eventbox :tooltip volumesink
|
|
||||||
:onclick `pwvucontrol &`
|
|
||||||
(label :text "${volumevalue.count}" :class {volumevalue.color})))
|
|
||||||
|
|
||||||
|
|
||||||
(defpoll currentworkspace :interval "1s" `scripts/currentWorkspace.sh`)
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
{
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
config,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
{
|
|
||||||
home.packages = with pkgs; [
|
|
||||||
zsh
|
|
||||||
bluez
|
|
||||||
brightnessctl
|
|
||||||
(callPackage ./power_bat.nix { })
|
|
||||||
];
|
|
||||||
|
|
||||||
programs.eww = {
|
|
||||||
enable = true;
|
|
||||||
configDir = ./config;
|
|
||||||
};
|
|
||||||
|
|
||||||
programs.niri.settings.spawn-at-startup = [
|
|
||||||
{
|
|
||||||
command = [
|
|
||||||
(lib.getExe config.programs.eww.package)
|
|
||||||
"-c"
|
|
||||||
"${config.programs.eww.configDir}"
|
|
||||||
"open"
|
|
||||||
"statusbar"
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
# swaybg works on more than just sway (sets a wallpaper)
|
|
||||||
{
|
|
||||||
command = [
|
|
||||||
(lib.getExe pkgs.swaybg)
|
|
||||||
"-i"
|
|
||||||
"${../wallpaper.png}"
|
|
||||||
];
|
|
||||||
}
|
|
||||||
];
|
|
||||||
}
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
{ pkgs, lib, ... }:
|
|
||||||
pkgs.writeShellScriptBin "power_bat" ''
|
|
||||||
exec ${lib.getExe pkgs.rust-script} ${./config/scripts/power_bat.rs} "$@"
|
|
||||||
''
|
|
||||||
@@ -1,240 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
lib,
|
|
||||||
pkgs,
|
|
||||||
inputs,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
let
|
|
||||||
# what model should be used in place of haiku?
|
|
||||||
haiku-model = "anthropic/claude-haiku-4-5";
|
|
||||||
|
|
||||||
opus-model = "anthropic/claude-opus-4-6";
|
|
||||||
|
|
||||||
opencode-claude-bridge = pkgs.buildNpmPackage {
|
|
||||||
pname = "opencode-claude-bridge";
|
|
||||||
version = "1.8.0";
|
|
||||||
src = inputs.opencode-claude-bridge;
|
|
||||||
npmDepsHash = "sha256-jH/UweuHqfeLxICxNRsBODWOBfVdE+ZgIinfW/ITSSc=";
|
|
||||||
buildPhase = ''
|
|
||||||
runHook preBuild
|
|
||||||
npx tsc
|
|
||||||
runHook postBuild
|
|
||||||
'';
|
|
||||||
# the plugin entry point is dist/index.js
|
|
||||||
installPhase = ''
|
|
||||||
runHook preInstall
|
|
||||||
mkdir -p $out/lib/opencode-claude-bridge
|
|
||||||
cp -r dist $out/lib/opencode-claude-bridge/
|
|
||||||
runHook postInstall
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
ohMyOpencodeConfig = {
|
|
||||||
"$schema" =
|
|
||||||
"https://raw.githubusercontent.com/code-yeongyu/oh-my-opencode/master/assets/oh-my-opencode.schema.json";
|
|
||||||
git_master = {
|
|
||||||
commit_footer = false;
|
|
||||||
include_co_authored_by = false;
|
|
||||||
};
|
|
||||||
agents = {
|
|
||||||
sisyphus.model = opus-model;
|
|
||||||
sisyphus-junior.model = opus-model;
|
|
||||||
oracle.model = opus-model;
|
|
||||||
librarian.model = haiku-model;
|
|
||||||
explore.model = haiku-model;
|
|
||||||
multimodal-looker.model = "anthropic/claude-opus-4-6";
|
|
||||||
|
|
||||||
prometheus.model = opus-model;
|
|
||||||
metis.model = opus-model;
|
|
||||||
momus.model = opus-model;
|
|
||||||
atlas.model = opus-model;
|
|
||||||
};
|
|
||||||
categories = {
|
|
||||||
visual-engineering.model = "openrouter/google/gemini-3-pro";
|
|
||||||
ultrabrain.model = opus-model;
|
|
||||||
artistry = {
|
|
||||||
model = "openrouter/google/gemini-3-pro";
|
|
||||||
variant = "max";
|
|
||||||
};
|
|
||||||
quick.model = haiku-model;
|
|
||||||
deep.model = opus-model;
|
|
||||||
writing.model = "openrouter/google/gemini-3-flash-preview";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
oh-my-opencode-pkg = inputs.llm-agents.packages.${pkgs.stdenv.hostPlatform.system}.oh-my-opencode;
|
|
||||||
in
|
|
||||||
{
|
|
||||||
home.packages = [
|
|
||||||
oh-my-opencode-pkg
|
|
||||||
pkgs.playwright-driver.browsers
|
|
||||||
inputs.claude-code.packages.${pkgs.stdenv.hostPlatform.system}.claude-code
|
|
||||||
];
|
|
||||||
|
|
||||||
home.sessionVariables = {
|
|
||||||
PLAYWRIGHT_BROWSERS_PATH = "${pkgs.playwright-driver.browsers}";
|
|
||||||
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD = "1";
|
|
||||||
};
|
|
||||||
|
|
||||||
xdg.configFile."opencode/oh-my-opencode.json".text = builtins.toJSON ohMyOpencodeConfig;
|
|
||||||
|
|
||||||
# Plugins are placed directly in the plugins directory so opencode
|
|
||||||
# auto-discovers them instead of downloading them from npm at runtime.
|
|
||||||
xdg.configFile."opencode/plugins/oh-my-opencode.js".source =
|
|
||||||
"${oh-my-opencode-pkg}/lib/oh-my-opencode/dist/index.js";
|
|
||||||
|
|
||||||
xdg.configFile."opencode/plugins/opencode-claude-bridge.js".source =
|
|
||||||
"${opencode-claude-bridge}/lib/opencode-claude-bridge/dist/index.js";
|
|
||||||
|
|
||||||
xdg.configFile."opencode/skills/android-ui.md".text = ''
|
|
||||||
---
|
|
||||||
name: android-ui
|
|
||||||
description: "Android UI automation via ADB - use for any Android device interaction, UI testing, screenshot analysis, element coordinate lookup, and gesture automation."
|
|
||||||
---
|
|
||||||
|
|
||||||
# Android UI Interaction Workflow
|
|
||||||
|
|
||||||
## 1. Taking Screenshots
|
|
||||||
```
|
|
||||||
adb exec-out screencap -p > /tmp/screen.png
|
|
||||||
```
|
|
||||||
Captures the current screen state as a PNG image.
|
|
||||||
|
|
||||||
## 2. Analyzing Screenshots
|
|
||||||
Delegate screenshot analysis to an explore agent rather than analyzing images directly:
|
|
||||||
```
|
|
||||||
mcp_task(subagent_type="explore", prompt="Analyze /tmp/screen.png. What screen is this? What elements are visible?")
|
|
||||||
```
|
|
||||||
The agent describes the UI, identifies elements, and estimates Y coordinates.
|
|
||||||
|
|
||||||
## 3. Getting Precise Element Coordinates
|
|
||||||
UI Automator dump - extracts the full UI hierarchy as XML:
|
|
||||||
```
|
|
||||||
adb shell uiautomator dump /sdcard/ui.xml && adb pull /sdcard/ui.xml /tmp/ui.xml
|
|
||||||
```
|
|
||||||
Then grep for specific elements:
|
|
||||||
```sh
|
|
||||||
# Find by text
|
|
||||||
grep -oP 'text="Login".*?bounds="[^"]*"' /tmp/ui.xml
|
|
||||||
# Find by class
|
|
||||||
grep -oP 'class="android.widget.EditText".*?bounds="[^"]*"' /tmp/ui.xml
|
|
||||||
```
|
|
||||||
Bounds format: `[left,top][right,bottom]` — tap center: `((left+right)/2, (top+bottom)/2)`
|
|
||||||
|
|
||||||
## 4. Tapping Elements
|
|
||||||
```
|
|
||||||
adb shell input tap X Y
|
|
||||||
```
|
|
||||||
Where X, Y are pixel coordinates from the bounds.
|
|
||||||
|
|
||||||
## 5. Text Input
|
|
||||||
```
|
|
||||||
adb shell input text "some_text"
|
|
||||||
```
|
|
||||||
Note: Special characters need escaping (`\!`, `\;`, etc.)
|
|
||||||
|
|
||||||
## 6. Other Gestures
|
|
||||||
```sh
|
|
||||||
# Swipe/scroll
|
|
||||||
adb shell input swipe startX startY endX endY duration_ms
|
|
||||||
# Key events
|
|
||||||
adb shell input keyevent KEYCODE_BACK
|
|
||||||
adb shell input keyevent KEYCODE_ENTER
|
|
||||||
```
|
|
||||||
|
|
||||||
## 7. WebView Limitation
|
|
||||||
- UI Automator can see WebView content if accessibility is enabled
|
|
||||||
- Touch events on iframe content (like Cloudflare Turnstile) often fail due to cross-origin isolation
|
|
||||||
- Form fields in WebViews work if you get exact bounds from the UI dump
|
|
||||||
|
|
||||||
## Typical Flow
|
|
||||||
1. Take screenshot → analyze with explore agent (get rough layout)
|
|
||||||
2. Dump UI hierarchy → grep for exact element bounds
|
|
||||||
- NEVER ASSUME COORDINATES. You must ALWAYS check first.
|
|
||||||
- Do this before ANY tap action as elements on the screen may have changed.
|
|
||||||
3. Calculate center coordinates from bounds
|
|
||||||
4. Tap/interact
|
|
||||||
5. Wait → screenshot → verify result
|
|
||||||
'';
|
|
||||||
|
|
||||||
xdg.configFile."opencode/skills/playwright.md".text =
|
|
||||||
let
|
|
||||||
browsers = pkgs.playwright-driver.browsers;
|
|
||||||
chromiumDir = builtins.head (
|
|
||||||
builtins.filter (n: builtins.match "chromium-[0-9]+" n != null) (
|
|
||||||
builtins.attrNames browsers.passthru.entries
|
|
||||||
)
|
|
||||||
);
|
|
||||||
chromiumPath = "${browsers}/${chromiumDir}/chrome-linux64/chrome";
|
|
||||||
in
|
|
||||||
''
|
|
||||||
---
|
|
||||||
name: playwright
|
|
||||||
description: "MUST USE for any browser-related tasks. Browser automation via Playwright MCP - verification, browsing, information gathering, web scraping, testing, screenshots, and all browser interactions."
|
|
||||||
mcp:
|
|
||||||
playwright:
|
|
||||||
command: npx
|
|
||||||
args:
|
|
||||||
- "@playwright/mcp@latest"
|
|
||||||
- "--executable-path"
|
|
||||||
- "${chromiumPath}"
|
|
||||||
- "--user-data-dir"
|
|
||||||
- "${config.home.homeDirectory}/.cache/playwright-mcp"
|
|
||||||
---
|
|
||||||
|
|
||||||
# Playwright Browser Automation
|
|
||||||
|
|
||||||
This skill provides browser automation capabilities via the Playwright MCP server.
|
|
||||||
'';
|
|
||||||
|
|
||||||
programs.opencode = {
|
|
||||||
package = inputs.llm-agents.packages.${pkgs.stdenv.targetPlatform.system}.opencode;
|
|
||||||
enable = true;
|
|
||||||
rules = ''
|
|
||||||
You are an intelligent and observant agent.
|
|
||||||
If instructed to commit, disable gpg signing.
|
|
||||||
You are on nixOS, if you don't have access to a tool, you can access it via the `nix-shell` command.
|
|
||||||
|
|
||||||
## Think deeply about everything.
|
|
||||||
When given a problem, break it down, abstract it out, understand the fundamentals, then solve it in the real world.
|
|
||||||
|
|
||||||
## Misc
|
|
||||||
For long-running commands, make sure you set the timeout of the Bash tool provided to a larger value.
|
|
||||||
Do NOT read secret files. Do not directly read files that are api keys or are contextually sensitive.
|
|
||||||
Do NOT run `skill_mcp [mcp_name=playwright, tool_name=browser_install]` as browsers are provided by NixOS via PLAYWRIGHT_BROWSERS_PATH.
|
|
||||||
|
|
||||||
## Behavior
|
|
||||||
Do not be sycophantic in your responses.
|
|
||||||
Do not use emojis unless explicitly asked to. This includes in code.
|
|
||||||
Use Test Driven Development methodology.
|
|
||||||
|
|
||||||
## Nix
|
|
||||||
For using `nix build` append `-L` to get better visibility into the logs.
|
|
||||||
If you get an error that a file can't be found, always try to `git add` the file before trying other troubleshooting steps.
|
|
||||||
'';
|
|
||||||
settings = {
|
|
||||||
theme = "opencode";
|
|
||||||
|
|
||||||
model = opus-model;
|
|
||||||
# small model used for titles
|
|
||||||
small_model = "openrouter/openai/gpt-oss-20b:free";
|
|
||||||
|
|
||||||
autoshare = false;
|
|
||||||
autoupdate = false;
|
|
||||||
agent = { };
|
|
||||||
plugin = [ ];
|
|
||||||
provider = {
|
|
||||||
openrouter = {
|
|
||||||
models = {
|
|
||||||
"openai/gpt-oss-20b:free" = { };
|
|
||||||
"qwen/qwen3-vl-30b-a3b-thinking" = { };
|
|
||||||
};
|
|
||||||
options = {
|
|
||||||
# TODO! use agenix here instead
|
|
||||||
apiKey = "{file:${../secrets/openrouter_api_key}}";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
179
home-manager/progs/pi.nix
Normal file
179
home-manager/progs/pi.nix
Normal file
@@ -0,0 +1,179 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
inputs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
# sisyphus/oracle/prometheus → default/slow/plan = opus
|
||||||
|
# librarian/explore/quick → smol/commit = haiku
|
||||||
|
ompSettings = {
|
||||||
|
modelRoles = {
|
||||||
|
default = "anthropic/claude-opus-4-7:high";
|
||||||
|
smol = "anthropic/claude-haiku-4-5:low";
|
||||||
|
slow = "anthropic/claude-opus-4-7:xhigh";
|
||||||
|
plan = "anthropic/claude-opus-4-7:high";
|
||||||
|
commit = "anthropic/claude-haiku-4-5:low";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# provider config — secrets read at eval time via builtins.readFile
|
||||||
|
# (omp treats apiKey as env-var-name-or-literal, not a shell command)
|
||||||
|
ompModels = {
|
||||||
|
providers = {
|
||||||
|
openrouter = {
|
||||||
|
apiKey = lib.strings.trim (builtins.readFile ../secrets/openrouter_api_key);
|
||||||
|
};
|
||||||
|
"llama.cpp" = {
|
||||||
|
baseUrl = "https://llm.sigkill.computer";
|
||||||
|
apiKey = lib.strings.trim (builtins.readFile ../secrets/llama_cpp_api_key);
|
||||||
|
api = "openai-responses";
|
||||||
|
authHeader = true;
|
||||||
|
discovery.type = "llama.cpp";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
home.packages = [
|
||||||
|
(inputs.llm-agents.packages.${pkgs.stdenv.hostPlatform.system}.omp.overrideAttrs (old: {
|
||||||
|
patches = (old.patches or [ ]) ++ [ ];
|
||||||
|
}))
|
||||||
|
];
|
||||||
|
|
||||||
|
# main settings: ~/.omp/agent/config.yml (JSON is valid YAML)
|
||||||
|
home.file.".omp/agent/config.yml".text = builtins.toJSON ompSettings;
|
||||||
|
|
||||||
|
# model/provider config: ~/.omp/agent/models.yml
|
||||||
|
home.file.".omp/agent/models.yml".text = builtins.toJSON ompModels;
|
||||||
|
|
||||||
|
# global instructions loaded at startup
|
||||||
|
home.file.".omp/agent/AGENTS.md".text = ''
|
||||||
|
You are an intelligent and observant agent.
|
||||||
|
If instructed to commit, disable gpg signing.
|
||||||
|
You are on nixOS, if you don't have access to a tool, you can access it via the `nix-shell` command.
|
||||||
|
|
||||||
|
## Think deeply about everything.
|
||||||
|
When given a problem, break it down, abstract it out, understand the fundamentals, then solve it in the real world.
|
||||||
|
|
||||||
|
## Misc
|
||||||
|
For long-running commands, make sure you set the timeout of the Bash tool provided to a larger value.
|
||||||
|
Do NOT read secret files. Do not directly read files that are api keys or are contextually sensitive.
|
||||||
|
|
||||||
|
## Behavior
|
||||||
|
Do not be sycophantic in your responses.
|
||||||
|
Do not use emojis unless explicitly asked to. This includes in code.
|
||||||
|
Use Test Driven Development methodology.
|
||||||
|
|
||||||
|
## Nix
|
||||||
|
For using `nix build` append `-L` to get better visibility into the logs.
|
||||||
|
If you get an error that a file can't be found, always try to `git add` the file before trying other troubleshooting steps.
|
||||||
|
'';
|
||||||
|
|
||||||
|
home.file.".omp/agent/skills/android-ui/SKILL.md".text = ''
|
||||||
|
---
|
||||||
|
name: android-ui
|
||||||
|
description: Android UI automation via ADB. Use for any Android device interaction, UI testing, screenshot analysis, element coordinate lookup, and gesture automation.
|
||||||
|
---
|
||||||
|
|
||||||
|
# Android UI
|
||||||
|
|
||||||
|
## 1. Taking Screenshots
|
||||||
|
```
|
||||||
|
adb exec-out screencap -p > /tmp/screen.png
|
||||||
|
```
|
||||||
|
Captures the current screen state as a PNG image.
|
||||||
|
|
||||||
|
## 2. Analyzing Screenshots
|
||||||
|
Read the screenshot file to understand the current screen state and identify UI elements.
|
||||||
|
|
||||||
|
## 3. Getting Precise Element Coordinates
|
||||||
|
UI Automator dump - extracts the full UI hierarchy as XML:
|
||||||
|
```
|
||||||
|
adb shell uiautomator dump /sdcard/ui.xml && adb pull /sdcard/ui.xml /tmp/ui.xml
|
||||||
|
```
|
||||||
|
Then grep for specific elements:
|
||||||
|
```sh
|
||||||
|
# Find by text
|
||||||
|
grep -oP 'text="Login".*?bounds="[^"]*"' /tmp/ui.xml
|
||||||
|
# Find by class
|
||||||
|
grep -oP 'class="android.widget.EditText".*?bounds="[^"]*"' /tmp/ui.xml
|
||||||
|
```
|
||||||
|
Bounds format: `[left,top][right,bottom]` — tap center: `((left+right)/2, (top+bottom)/2)`
|
||||||
|
|
||||||
|
## 4. Tapping Elements
|
||||||
|
```
|
||||||
|
adb shell input tap X Y
|
||||||
|
```
|
||||||
|
Where X, Y are pixel coordinates from the bounds.
|
||||||
|
|
||||||
|
## 5. Text Input
|
||||||
|
```
|
||||||
|
adb shell input text "some_text"
|
||||||
|
```
|
||||||
|
Note: Special characters need escaping (`\!`, `\;`, etc.)
|
||||||
|
|
||||||
|
## 6. Other Gestures
|
||||||
|
```sh
|
||||||
|
# Swipe/scroll
|
||||||
|
adb shell input swipe startX startY endX endY duration_ms
|
||||||
|
# Key events
|
||||||
|
adb shell input keyevent KEYCODE_BACK
|
||||||
|
adb shell input keyevent KEYCODE_ENTER
|
||||||
|
```
|
||||||
|
|
||||||
|
## 7. WebView Limitation
|
||||||
|
- UI Automator can see WebView content if accessibility is enabled
|
||||||
|
- Touch events on iframe content (like Cloudflare Turnstile) often fail due to cross-origin isolation
|
||||||
|
- Form fields in WebViews work if you get exact bounds from the UI dump
|
||||||
|
|
||||||
|
## Typical Flow
|
||||||
|
1. Take screenshot → analyze it (get rough layout)
|
||||||
|
2. Dump UI hierarchy → grep for exact element bounds
|
||||||
|
- NEVER ASSUME COORDINATES. You must ALWAYS check first.
|
||||||
|
- Do this before ANY tap action as elements on the screen may have changed.
|
||||||
|
3. Calculate center coordinates from bounds
|
||||||
|
4. Tap/interact
|
||||||
|
5. Wait → screenshot → verify result
|
||||||
|
'';
|
||||||
|
|
||||||
|
# omp has a built-in browser tool with NixOS auto-detection,
|
||||||
|
# but this skill provides playwright MCP as a supplementary option
|
||||||
|
home.file.".omp/agent/skills/playwright/SKILL.md".text =
|
||||||
|
let
|
||||||
|
browsers = pkgs.playwright-driver.browsers;
|
||||||
|
chromiumDir = builtins.head (
|
||||||
|
builtins.filter (n: builtins.match "chromium-[0-9]+" n != null) (
|
||||||
|
builtins.attrNames browsers.passthru.entries
|
||||||
|
)
|
||||||
|
);
|
||||||
|
chromiumPath = "${browsers}/${chromiumDir}/chrome-linux64/chrome";
|
||||||
|
in
|
||||||
|
''
|
||||||
|
---
|
||||||
|
name: playwright
|
||||||
|
description: Browser automation via Playwright MCP. Use as an alternative to the built-in browser tool for Playwright-specific workflows, testing, and web scraping. Chromium is provided by NixOS.
|
||||||
|
---
|
||||||
|
|
||||||
|
# Playwright
|
||||||
|
|
||||||
|
## Browser Setup
|
||||||
|
Chromium is provided by NixOS. Do NOT attempt to download browsers.
|
||||||
|
|
||||||
|
- Chromium path: `${chromiumPath}`
|
||||||
|
- Browsers path: `${browsers}`
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
Launch the Playwright MCP server for browser automation:
|
||||||
|
```bash
|
||||||
|
npx @playwright/mcp@latest --executable-path "${chromiumPath}" --user-data-dir "${config.home.homeDirectory}/.cache/playwright-mcp"
|
||||||
|
```
|
||||||
|
|
||||||
|
Set these environment variables if not already set:
|
||||||
|
```bash
|
||||||
|
export PLAYWRIGHT_BROWSERS_PATH="${browsers}"
|
||||||
|
export PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1
|
||||||
|
```
|
||||||
|
'';
|
||||||
|
}
|
||||||
@@ -24,6 +24,20 @@ let
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
consumer-rights-wiki = buildFirefoxXpiAddon {
|
||||||
|
pname = "consumer-rights-wiki";
|
||||||
|
version = "1.0.34";
|
||||||
|
addonId = "@crw-extension-firefox";
|
||||||
|
url = "https://addons.mozilla.org/firefox/downloads/file/4730448/consumer_rights_wiki-1.0.34.xpi";
|
||||||
|
sha256 = "732969ed4d5c7965b6254a1190a82ce4ab0ff44bda2295264eb8a22c452899ea";
|
||||||
|
meta = with lib; {
|
||||||
|
homepage = "https://github.com/FULU-Foundation/CRW-Extension";
|
||||||
|
description = "Shows a popup when the site you're viewing has an article on the Consumer Rights Wiki";
|
||||||
|
license = licenses.mit;
|
||||||
|
platforms = platforms.all;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
ublockSettings = import ./ublock.nix { inherit lib; };
|
ublockSettings = import ./ublock.nix { inherit lib; };
|
||||||
darkReaderSettings = import ./dark-reader.nix { inherit lib; };
|
darkReaderSettings = import ./dark-reader.nix { inherit lib; };
|
||||||
redirectorSettings = import ./redirector.nix { inherit lib; };
|
redirectorSettings = import ./redirector.nix { inherit lib; };
|
||||||
@@ -54,7 +68,10 @@ in
|
|||||||
steam-database
|
steam-database
|
||||||
ublock-origin
|
ublock-origin
|
||||||
])
|
])
|
||||||
++ [ hacker-smacker ];
|
++ [
|
||||||
|
hacker-smacker
|
||||||
|
consumer-rights-wiki
|
||||||
|
];
|
||||||
|
|
||||||
settings = {
|
settings = {
|
||||||
"uBlock0@raymondhill.net" = ublockSettings;
|
"uBlock0@raymondhill.net" = ublockSettings;
|
||||||
@@ -92,6 +109,9 @@ in
|
|||||||
# https://github.com/nix-community/home-manager/issues/6083
|
# https://github.com/nix-community/home-manager/issues/6083
|
||||||
"services.sync.engine.prefs" = false;
|
"services.sync.engine.prefs" = false;
|
||||||
"services.sync.engine.addons" = false;
|
"services.sync.engine.addons" = false;
|
||||||
|
# use a separate default search engine in private windows
|
||||||
|
"browser.search.separatePrivateDefault.ui.enabled" = true;
|
||||||
|
"browser.search.separatePrivateDefault" = true;
|
||||||
# disable built-in password manager — using bitwarden
|
# disable built-in password manager — using bitwarden
|
||||||
"signon.rememberSignons" = false;
|
"signon.rememberSignons" = false;
|
||||||
"signon.autofillForms" = false;
|
"signon.autofillForms" = false;
|
||||||
|
|||||||
BIN
home-manager/secrets/llama_cpp_api_key
Normal file
BIN
home-manager/secrets/llama_cpp_api_key
Normal file
Binary file not shown.
@@ -78,23 +78,208 @@
|
|||||||
options = "--delete-older-than 30d";
|
options = "--delete-older-than 30d";
|
||||||
};
|
};
|
||||||
|
|
||||||
# enable flakes!
|
settings = {
|
||||||
settings.experimental-features = [
|
# enable flakes!
|
||||||
"nix-command"
|
experimental-features = [
|
||||||
"flakes"
|
"nix-command"
|
||||||
];
|
"flakes"
|
||||||
|
];
|
||||||
|
|
||||||
|
# Use muffin server as a binary cache
|
||||||
|
substituters = [ "https://nix-cache.sigkill.computer" ];
|
||||||
|
trusted-public-keys = [
|
||||||
|
"nix-cache.sigkill.computer-1:ONtQC9gUjL+2yNgMWB68NudPySXhyzJ7I3ra56/NPgk="
|
||||||
|
];
|
||||||
|
netrc-file = "${./secrets/nix-cache-netrc}";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# cachyos kernel overlay
|
||||||
|
nixpkgs.overlays = [ inputs.nix-cachyos-kernel.overlays.default ];
|
||||||
|
|
||||||
# kernel options
|
# kernel options
|
||||||
boot = {
|
boot = {
|
||||||
kernelPackages = pkgs.linuxPackages_testing;
|
|
||||||
# kernelPackages = pkgs.linuxPackages_latest;
|
# cachyos kernel: bore scheduler, full lto, x86_64-v3 (common to zen 3 + zen 5)
|
||||||
|
kernelPackages =
|
||||||
|
let
|
||||||
|
helpers = pkgs.callPackage "${inputs.nix-cachyos-kernel}/helpers.nix" { };
|
||||||
|
kernel = pkgs.cachyosKernels.linux-cachyos-bore-lto.override {
|
||||||
|
lto = "full";
|
||||||
|
processorOpt = "x86_64-v3";
|
||||||
|
};
|
||||||
|
in
|
||||||
|
helpers.kernelModuleLLVMOverride (pkgs.linuxKernel.packagesFor kernel);
|
||||||
|
|
||||||
|
# disable legacy subsystems neither host will ever use
|
||||||
|
kernelPatches = [
|
||||||
|
{
|
||||||
|
name = "disable-legacy-subsystems";
|
||||||
|
patch = null;
|
||||||
|
structuredExtraConfig = with lib.kernel; {
|
||||||
|
# ancient bus/card standards
|
||||||
|
PCMCIA = lib.mkForce no;
|
||||||
|
PCCARD = lib.mkForce no;
|
||||||
|
PARPORT = lib.mkForce no;
|
||||||
|
GAMEPORT = lib.mkForce module;
|
||||||
|
FIREWIRE = lib.mkForce no;
|
||||||
|
AGP = lib.mkForce no;
|
||||||
|
|
||||||
|
# legacy networking
|
||||||
|
ATM = lib.mkForce no;
|
||||||
|
FDDI = lib.mkForce no;
|
||||||
|
ISDN = lib.mkForce no;
|
||||||
|
CAN = lib.mkForce no;
|
||||||
|
NFC = lib.mkForce no;
|
||||||
|
INFINIBAND = lib.mkForce no;
|
||||||
|
|
||||||
|
# amateur radio (HAMRADIO is the umbrella but these are separate symbols)
|
||||||
|
HAMRADIO = lib.mkForce no;
|
||||||
|
AX25 = lib.mkForce no;
|
||||||
|
NETROM = lib.mkForce no;
|
||||||
|
ROSE = lib.mkForce no;
|
||||||
|
|
||||||
|
# dead protocols
|
||||||
|
PHONET = lib.mkForce no;
|
||||||
|
IEEE802154 = lib.mkForce no;
|
||||||
|
"6LOWPAN" = lib.mkForce no;
|
||||||
|
NET_9P = lib.mkForce no;
|
||||||
|
BATMAN_ADV = lib.mkForce no;
|
||||||
|
|
||||||
|
# tv tuners / digital video broadcasting
|
||||||
|
MEDIA_ANALOG_TV_SUPPORT = lib.mkForce no;
|
||||||
|
MEDIA_DIGITAL_TV_SUPPORT = lib.mkForce no;
|
||||||
|
DVB_CORE = lib.mkForce no;
|
||||||
|
|
||||||
|
# hypervisor guest support (bare metal only)
|
||||||
|
HYPERV = lib.mkForce no;
|
||||||
|
XEN = lib.mkForce no;
|
||||||
|
VMWARE_VMCI = lib.mkForce no;
|
||||||
|
VMWARE_BALLOON = lib.mkForce no;
|
||||||
|
VMWARE_PVSCSI = lib.mkForce no;
|
||||||
|
VMWARE_VMCI_VSOCKETS = lib.mkForce no;
|
||||||
|
VMXNET3 = lib.mkForce no;
|
||||||
|
DRM_VMWGFX = lib.mkForce no;
|
||||||
|
VBOXGUEST = lib.mkForce no;
|
||||||
|
VBOXSF_FS = lib.mkForce no;
|
||||||
|
|
||||||
|
# staging drivers (experimental/unmaintained)
|
||||||
|
STAGING = lib.mkForce no;
|
||||||
|
# SND_PCI stays — SND_HDA_INTEL (AMD HDA audio) lives under it
|
||||||
|
ACCESSIBILITY = lib.mkForce no;
|
||||||
|
MTD = lib.mkForce no;
|
||||||
|
MEDIA_RC_SUPPORT = lib.mkForce no;
|
||||||
|
|
||||||
|
# legacy storage (AHCI for modern SATA is independent)
|
||||||
|
ATA_SFF = lib.mkForce no;
|
||||||
|
SCSI_LOWLEVEL = lib.mkForce no;
|
||||||
|
FUSION = lib.mkForce no;
|
||||||
|
|
||||||
|
# misc legacy
|
||||||
|
MOST = lib.mkForce no;
|
||||||
|
PPDEV = lib.mkForce no;
|
||||||
|
PHANTOM = lib.mkForce no;
|
||||||
|
X86_ANDROID_TABLETS = lib.mkForce no;
|
||||||
|
# CHROME_PLATFORMS stays — Framework laptops use CrOS EC
|
||||||
|
SURFACE_PLATFORMS = lib.mkForce no;
|
||||||
|
MCTP = lib.mkForce no;
|
||||||
|
GPIB = lib.mkForce no;
|
||||||
|
SIOX = lib.mkForce no;
|
||||||
|
SLIMBUS = lib.mkForce no;
|
||||||
|
WWAN = lib.mkForce no;
|
||||||
|
|
||||||
|
# nvidia gpu
|
||||||
|
DRM_NOUVEAU = lib.mkForce no;
|
||||||
|
|
||||||
|
# other gpus not present
|
||||||
|
DRM_RADEON = lib.mkForce no;
|
||||||
|
DRM_GMA500 = lib.mkForce no;
|
||||||
|
DRM_AST = lib.mkForce no;
|
||||||
|
DRM_MGAG200 = lib.mkForce no;
|
||||||
|
DRM_HISI_HIBMC = lib.mkForce no;
|
||||||
|
DRM_APPLETBDRM = lib.mkForce no;
|
||||||
|
|
||||||
|
# intel gpu
|
||||||
|
DRM_I915 = lib.mkForce no;
|
||||||
|
DRM_XE = lib.mkForce no;
|
||||||
|
|
||||||
|
# intel cpu / platform
|
||||||
|
INTEL_IOMMU = lib.mkForce no;
|
||||||
|
INTEL_IDLE = lib.mkForce no;
|
||||||
|
INTEL_HFI_THERMAL = lib.mkForce no;
|
||||||
|
INTEL_TCC_COOLING = lib.mkForce no;
|
||||||
|
INTEL_SOC_DTS_THERMAL = lib.mkForce no;
|
||||||
|
INTEL_PCH_THERMAL = lib.mkForce no;
|
||||||
|
INTEL_POWERCLAMP = lib.mkForce no;
|
||||||
|
X86_PKG_TEMP_THERMAL = lib.mkForce no;
|
||||||
|
X86_INTEL_LPSS = lib.mkForce no;
|
||||||
|
INTEL_MEI = lib.mkForce no;
|
||||||
|
INTEL_TH = lib.mkForce no;
|
||||||
|
INTEL_VSEC = lib.mkForce no;
|
||||||
|
INTEL_IDXD = lib.mkForce no;
|
||||||
|
INTEL_IOATDMA = lib.mkForce no;
|
||||||
|
EDAC_E752X = lib.mkForce no;
|
||||||
|
EDAC_I82975X = lib.mkForce no;
|
||||||
|
EDAC_I3000 = lib.mkForce no;
|
||||||
|
EDAC_I3200 = lib.mkForce no;
|
||||||
|
EDAC_IE31200 = lib.mkForce no;
|
||||||
|
EDAC_X38 = lib.mkForce no;
|
||||||
|
EDAC_I5400 = lib.mkForce no;
|
||||||
|
EDAC_I7CORE = lib.mkForce no;
|
||||||
|
EDAC_I5100 = lib.mkForce no;
|
||||||
|
EDAC_I7300 = lib.mkForce no;
|
||||||
|
EDAC_SBRIDGE = lib.mkForce no;
|
||||||
|
EDAC_SKX = lib.mkForce no;
|
||||||
|
EDAC_I10NM = lib.mkForce no;
|
||||||
|
EDAC_IMH = lib.mkForce no;
|
||||||
|
EDAC_PND2 = lib.mkForce no;
|
||||||
|
EDAC_IGEN6 = lib.mkForce no;
|
||||||
|
|
||||||
|
# intel audio
|
||||||
|
SND_SOC_SOF_INTEL_TOPLEVEL = lib.mkForce no;
|
||||||
|
SND_SOC_INTEL_SST_TOPLEVEL = lib.mkForce no;
|
||||||
|
|
||||||
|
# mellanox networking
|
||||||
|
MLX4_CORE = lib.mkForce no;
|
||||||
|
MLX5_CORE = lib.mkForce no;
|
||||||
|
MLXSW_CORE = lib.mkForce no;
|
||||||
|
MLX_PLATFORM = lib.mkForce no;
|
||||||
|
|
||||||
|
# fpga
|
||||||
|
FPGA = lib.mkForce no;
|
||||||
|
|
||||||
|
# old x86 cpufreq / platform (both systems are modern Zen)
|
||||||
|
AMD_NUMA = lib.mkForce no;
|
||||||
|
X86_POWERNOW_K8 = lib.mkForce no;
|
||||||
|
X86_P4_CLOCKMOD = lib.mkForce no;
|
||||||
|
X86_SPEEDSTEP_LIB = lib.mkForce no;
|
||||||
|
|
||||||
|
# cxl (datacenter memory expansion)
|
||||||
|
CXL_BUS = lib.mkForce no;
|
||||||
|
|
||||||
|
# embedded SoC peripherals (not present on desktop/laptop)
|
||||||
|
INPUT_TOUCHSCREEN = lib.mkForce no;
|
||||||
|
INPUT_TABLET = lib.mkForce no;
|
||||||
|
INPUT_JOYSTICK = lib.mkForce no;
|
||||||
|
MEDIA_PLATFORM_DRIVERS = lib.mkForce no;
|
||||||
|
MEDIA_TEST_SUPPORT = lib.mkForce no;
|
||||||
|
|
||||||
|
# deprecated userland compat
|
||||||
|
SGETMASK_SYSCALL = lib.mkForce no;
|
||||||
|
UID16 = lib.mkForce no;
|
||||||
|
X86_X32_ABI = lib.mkForce no;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
# aes_generic is built-in as of linux 7.0, no longer a loadable module
|
# aes_generic is built-in as of linux 7.0, no longer a loadable module
|
||||||
initrd.luks.cryptoModules = lib.mkForce (
|
initrd.luks.cryptoModules = lib.mkForce (
|
||||||
lib.filter (m: m != "aes_generic") options.boot.initrd.luks.cryptoModules.default
|
lib.filter (m: m != "aes_generic") options.boot.initrd.luks.cryptoModules.default
|
||||||
);
|
);
|
||||||
|
|
||||||
|
# some default initrd modules (ata_piix etc) don't exist with ATA_SFF=n
|
||||||
|
initrd.allowMissingModules = true;
|
||||||
|
|
||||||
lanzaboote = {
|
lanzaboote = {
|
||||||
enable = true;
|
enable = true;
|
||||||
# TODO: proper secrets management so this is not stored in nix store
|
# TODO: proper secrets management so this is not stored in nix store
|
||||||
@@ -226,8 +411,7 @@
|
|||||||
|
|
||||||
# Enable sound with pipewire.
|
# Enable sound with pipewire.
|
||||||
services.pulseaudio.enable = false; # pipewire >>>>>>> pulseaudio
|
services.pulseaudio.enable = false; # pipewire >>>>>>> pulseaudio
|
||||||
# BUG! disable rtkit in order to fix mumble: https://github.com/NixOS/nixpkgs/issues/392992#issuecomment-2799867278
|
security.rtkit.enable = true;
|
||||||
security.rtkit.enable = false;
|
|
||||||
services.pipewire = {
|
services.pipewire = {
|
||||||
enable = true;
|
enable = true;
|
||||||
alsa.enable = true;
|
alsa.enable = true;
|
||||||
|
|||||||
BIN
system/secrets/nix-cache-netrc
Normal file
BIN
system/secrets/nix-cache-netrc
Normal file
Binary file not shown.
@@ -24,6 +24,29 @@
|
|||||||
# if I move to another lock screen program, i will have to replace `swaylock`
|
# if I move to another lock screen program, i will have to replace `swaylock`
|
||||||
security.pam.services.swaylock = { };
|
security.pam.services.swaylock = { };
|
||||||
|
|
||||||
|
# Kernel-level power tuning. These are boot-time / module-load-time settings
|
||||||
|
# that power-profiles-daemon (in common.nix) does not manage. ppd handles
|
||||||
|
# governor and EPP at runtime; these cover everything else.
|
||||||
|
boot.kernelParams = [
|
||||||
|
# Disable NMI watchdog. Eliminates periodic perf-counter interrupts
|
||||||
|
# across all cores (~1 W). Kernel softlockup watchdog remains active.
|
||||||
|
"nmi_watchdog=0"
|
||||||
|
|
||||||
|
# Route kernel work items to already-busy CPUs rather than waking idle
|
||||||
|
# ones. Reduces C-state exit frequency -- significant on battery where
|
||||||
|
# cores idle often.
|
||||||
|
"workqueue.power_efficient=1"
|
||||||
|
];
|
||||||
|
|
||||||
|
boot.kernel.sysctl."kernel.nmi_watchdog" = 0;
|
||||||
|
|
||||||
|
# Power-gate the HDA codec between audio activity. 1-second inactivity
|
||||||
|
# timeout; controller powers down fully. Wakes transparently on next
|
||||||
|
# audio event -- no audible artifacts on Framework 13 AMD.
|
||||||
|
boot.extraModprobeConfig = ''
|
||||||
|
options snd_hda_intel power_save=1 power_save_controller=Y
|
||||||
|
'';
|
||||||
|
|
||||||
# Greetd display manager
|
# Greetd display manager
|
||||||
services.greetd = {
|
services.greetd = {
|
||||||
enable = true;
|
enable = true;
|
||||||
|
|||||||
@@ -75,12 +75,54 @@
|
|||||||
# LACT (Linux AMDGPU Configuration Tool): https://github.com/ilya-zlobintsev/LACT
|
# LACT (Linux AMDGPU Configuration Tool): https://github.com/ilya-zlobintsev/LACT
|
||||||
environment.systemPackages = with pkgs; [
|
environment.systemPackages = with pkgs; [
|
||||||
lact
|
lact
|
||||||
|
jovian-stubs
|
||||||
];
|
];
|
||||||
systemd.packages = with pkgs; [ lact ];
|
systemd.packages = with pkgs; [ lact ];
|
||||||
systemd.services.lactd.wantedBy = [ "multi-user.target" ];
|
systemd.services.lactd.wantedBy = [ "multi-user.target" ];
|
||||||
|
|
||||||
systemd.services.lactd.serviceConfig.ExecStartPre = "${lib.getExe pkgs.bash} -c \"sleep 3s\"";
|
systemd.services.lactd.serviceConfig.ExecStartPre = "${lib.getExe pkgs.bash} -c \"sleep 3s\"";
|
||||||
|
|
||||||
|
# root-level service that applies a pending update. Triggered by
|
||||||
|
# steamos-update (via systemctl start) when the user accepts an update.
|
||||||
|
# Runs as root so it can write the system profile and boot entry.
|
||||||
|
systemd.services.pull-update-apply = {
|
||||||
|
description = "Apply pending NixOS update pulled from binary cache";
|
||||||
|
serviceConfig = {
|
||||||
|
Type = "oneshot";
|
||||||
|
ExecStart = pkgs.writeShellScript "pull-update-apply" ''
|
||||||
|
set -uo pipefail
|
||||||
|
export PATH=${
|
||||||
|
pkgs.lib.makeBinPath [
|
||||||
|
pkgs.curl
|
||||||
|
pkgs.coreutils
|
||||||
|
pkgs.nix
|
||||||
|
]
|
||||||
|
}
|
||||||
|
STORE_PATH=$(curl -sf --max-time 30 "https://nix-cache.sigkill.computer/deploy/yarn" || true)
|
||||||
|
if [ -z "$STORE_PATH" ]; then
|
||||||
|
echo "server unreachable"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "applying $STORE_PATH"
|
||||||
|
nix-store -r "$STORE_PATH" || { echo "fetch failed"; exit 1; }
|
||||||
|
nix-env -p /nix/var/nix/profiles/system --set "$STORE_PATH" || { echo "profile set failed"; exit 1; }
|
||||||
|
"$STORE_PATH/bin/switch-to-configuration" boot || { echo "boot entry failed"; exit 1; }
|
||||||
|
echo "update applied; reboot required"
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# Allow primary user to start pull-update-apply.service without a password
|
||||||
|
security.polkit.extraConfig = ''
|
||||||
|
polkit.addRule(function(action, subject) {
|
||||||
|
if (action.id == "org.freedesktop.systemd1.manage-units" &&
|
||||||
|
action.lookup("unit") == "pull-update-apply.service" &&
|
||||||
|
subject.user == "${username}") {
|
||||||
|
return polkit.Result.YES;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
'';
|
||||||
|
|
||||||
nixpkgs.config.allowUnfreePredicate =
|
nixpkgs.config.allowUnfreePredicate =
|
||||||
pkg:
|
pkg:
|
||||||
builtins.elem (lib.getName pkg) [
|
builtins.elem (lib.getName pkg) [
|
||||||
@@ -96,65 +138,123 @@
|
|||||||
# This prevents Steam from requesting reboots for "system updates"
|
# This prevents Steam from requesting reboots for "system updates"
|
||||||
# Steam client updates will still work normally
|
# Steam client updates will still work normally
|
||||||
nixpkgs.overlays = [
|
nixpkgs.overlays = [
|
||||||
(final: prev: {
|
(
|
||||||
jovian-stubs = prev.stdenv.mkDerivation {
|
final: prev:
|
||||||
name = "jovian-stubs-no-update";
|
let
|
||||||
dontUnpack = true;
|
deploy-url = "https://nix-cache.sigkill.computer/deploy/yarn";
|
||||||
installPhase = ''
|
|
||||||
mkdir -p $out/bin
|
|
||||||
|
|
||||||
# steamos-update: always report "no update available" (exit 7)
|
steamos-update-script = final.writeShellScript "steamos-update" ''
|
||||||
# This disables the kernel mismatch check that triggers reboot prompts
|
export PATH=${
|
||||||
cat > $out/bin/steamos-update << 'STUB'
|
final.lib.makeBinPath [
|
||||||
#!/bin/sh
|
final.curl
|
||||||
>&2 echo "[JOVIAN] $0: stub called with: $* (system updates disabled)"
|
final.coreutils
|
||||||
exit 7
|
final.systemd
|
||||||
STUB
|
]
|
||||||
|
}
|
||||||
|
|
||||||
# steamos-reboot: reboot the system
|
STORE_PATH=$(curl -sf --max-time 30 "${deploy-url}" || true)
|
||||||
cat > $out/bin/steamos-reboot << 'STUB'
|
|
||||||
#!/bin/sh
|
|
||||||
>&2 echo "[JOVIAN] $0: stub called with: $*"
|
|
||||||
systemctl reboot
|
|
||||||
STUB
|
|
||||||
|
|
||||||
# steamos-select-branch: no-op stub
|
if [ -z "$STORE_PATH" ]; then
|
||||||
cat > $out/bin/steamos-select-branch << 'STUB'
|
>&2 echo "[steamos-update] server unreachable"
|
||||||
#!/bin/sh
|
exit 7
|
||||||
>&2 echo "[JOVIAN] $0: stub called with: $*"
|
fi
|
||||||
exit 0
|
|
||||||
STUB
|
|
||||||
|
|
||||||
# steamos-factory-reset-config: no-op stub
|
CURRENT=$(readlink -f /nix/var/nix/profiles/system)
|
||||||
cat > $out/bin/steamos-factory-reset-config << 'STUB'
|
if [ "$CURRENT" = "$STORE_PATH" ]; then
|
||||||
#!/bin/sh
|
>&2 echo "[steamos-update] no update available"
|
||||||
>&2 echo "[JOVIAN] $0: stub called with: $*"
|
exit 0
|
||||||
exit 0
|
fi
|
||||||
STUB
|
|
||||||
|
|
||||||
# steamos-firmware-update: no-op stub
|
# check-only mode: just report that an update exists
|
||||||
cat > $out/bin/steamos-firmware-update << 'STUB'
|
if [ "''${1:-}" = "check" ] || [ "''${1:-}" = "--check-only" ]; then
|
||||||
#!/bin/sh
|
>&2 echo "[steamos-update] update available"
|
||||||
>&2 echo "[JOVIAN] $0: stub called with: $*"
|
exit 0
|
||||||
exit 0
|
fi
|
||||||
STUB
|
|
||||||
|
|
||||||
# pkexec: pass through to real pkexec
|
# apply: trigger the root-running systemd service to install the update
|
||||||
cat > $out/bin/pkexec << 'STUB'
|
>&2 echo "[steamos-update] applying update..."
|
||||||
#!/bin/sh
|
if systemctl start --wait pull-update-apply.service; then
|
||||||
exec /run/wrappers/bin/pkexec "$@"
|
>&2 echo "[steamos-update] update installed, reboot to apply"
|
||||||
STUB
|
exit 0
|
||||||
|
else
|
||||||
# sudo: pass through to doas
|
>&2 echo "[steamos-update] apply failed; see 'journalctl -u pull-update-apply'"
|
||||||
cat > $out/bin/sudo << 'STUB'
|
exit 1
|
||||||
#!/bin/sh
|
fi
|
||||||
exec /run/wrappers/bin/doas "$@"
|
|
||||||
STUB
|
|
||||||
|
|
||||||
chmod 755 $out/bin/*
|
|
||||||
'';
|
'';
|
||||||
};
|
in
|
||||||
})
|
{
|
||||||
|
jovian-stubs = prev.stdenv.mkDerivation {
|
||||||
|
name = "jovian-stubs";
|
||||||
|
dontUnpack = true;
|
||||||
|
installPhase = ''
|
||||||
|
mkdir -p $out/bin
|
||||||
|
ln -s ${steamos-update-script} $out/bin/steamos-update
|
||||||
|
ln -s ${steamos-update-script} $out/bin/steamos-mandatory-update
|
||||||
|
|
||||||
|
# jupiter-initial-firmware-update: no-op (not a real steam deck)
|
||||||
|
cat > $out/bin/jupiter-initial-firmware-update << 'STUB'
|
||||||
|
#!/bin/sh
|
||||||
|
exit 0
|
||||||
|
STUB
|
||||||
|
|
||||||
|
# jupiter-biosupdate: no-op (not a real steam deck)
|
||||||
|
cat > $out/bin/jupiter-biosupdate << 'STUB'
|
||||||
|
#!/bin/sh
|
||||||
|
exit 0
|
||||||
|
STUB
|
||||||
|
|
||||||
|
# steamos-reboot: reboot the system
|
||||||
|
cat > $out/bin/steamos-reboot << 'STUB'
|
||||||
|
#!/bin/sh
|
||||||
|
>&2 echo "[JOVIAN] $0: stub called with: $*"
|
||||||
|
systemctl reboot
|
||||||
|
STUB
|
||||||
|
|
||||||
|
# steamos-select-branch: no-op stub
|
||||||
|
cat > $out/bin/steamos-select-branch << 'STUB'
|
||||||
|
#!/bin/sh
|
||||||
|
>&2 echo "[JOVIAN] $0: stub called with: $*"
|
||||||
|
exit 0
|
||||||
|
STUB
|
||||||
|
|
||||||
|
# steamos-factory-reset-config: no-op stub
|
||||||
|
cat > $out/bin/steamos-factory-reset-config << 'STUB'
|
||||||
|
#!/bin/sh
|
||||||
|
>&2 echo "[JOVIAN] $0: stub called with: $*"
|
||||||
|
exit 0
|
||||||
|
STUB
|
||||||
|
|
||||||
|
# steamos-firmware-update: no-op stub
|
||||||
|
cat > $out/bin/steamos-firmware-update << 'STUB'
|
||||||
|
#!/bin/sh
|
||||||
|
>&2 echo "[JOVIAN] $0: stub called with: $*"
|
||||||
|
exit 0
|
||||||
|
STUB
|
||||||
|
|
||||||
|
# pkexec: pass through to real pkexec
|
||||||
|
cat > $out/bin/pkexec << 'STUB'
|
||||||
|
#!/bin/sh
|
||||||
|
exec /run/wrappers/bin/pkexec "$@"
|
||||||
|
STUB
|
||||||
|
|
||||||
|
# sudo: strip flags and run the command directly (no escalation).
|
||||||
|
# privileged ops are delegated to root systemd services via systemctl.
|
||||||
|
cat > $out/bin/sudo << 'STUB'
|
||||||
|
#!/bin/sh
|
||||||
|
while [ $# -gt 0 ]; do
|
||||||
|
case "$1" in
|
||||||
|
-*) shift ;;
|
||||||
|
*) break ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
exec "$@"
|
||||||
|
STUB
|
||||||
|
|
||||||
|
find $out/bin -type f -exec chmod 755 {} +
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
||||||
|
)
|
||||||
];
|
];
|
||||||
|
|
||||||
jovian = {
|
jovian = {
|
||||||
|
|||||||
Reference in New Issue
Block a user