Compare commits

..

1 Commits

Author SHA1 Message Date
b07b34b66a [traefik] Moves traefik config into the repo 2025-04-07 14:45:58 -07:00
162 changed files with 2065 additions and 5894 deletions

View File

@@ -1,17 +1,9 @@
keys:
- &drew_mcp age1yvdzvuvu5wqztcx6ll2xk6x547uuyqy735tjjdd7zftkz53jsf9qf5ahue
- &drew_vega age1dstsz5g4qthwt2sssu5wp787ku7rnfqm02mqaefsaueswhvqzpmsyft4p4
- &admin_drew age1yvdzvuvu5wqztcx6ll2xk6x547uuyqy735tjjdd7zftkz53jsf9qf5ahue
- &server_mcp age1jrk4h7x4qzhr6z5m4d099mlfyjc4n5n9s52r4gfsdz0slnqlqa9sss735v
- &server_sirius age17q5n3pngyf0dvcg23h7ph8fqcraw0phjzgsra5cynzq4mf7hw3wsarmepw
creation_rules:
- path_regex: secrets/mcp.yaml
- path_regex: secrets/[^/]+\.(yaml|json|env|ini)$
key_groups:
- age:
- *drew_vega
- *drew_mcp
- *server_mcp
- path_regex: secrets/sirius.yaml
key_groups:
- age:
- *drew_vega
- *server_mcp
- age:
- *admin_drew
- *server_mcp

439
flake.lock generated
View File

@@ -3,32 +3,28 @@
"aquamarine": {
"inputs": {
"hyprutils": [
"hyprsplit",
"hyprland",
"hyprutils"
],
"hyprwayland-scanner": [
"hyprsplit",
"hyprland",
"hyprwayland-scanner"
],
"nixpkgs": [
"hyprsplit",
"hyprland",
"nixpkgs"
],
"systems": [
"hyprsplit",
"hyprland",
"systems"
]
},
"locked": {
"lastModified": 1778620495,
"narHash": "sha256-Gu7UhWjwKCgSiVC3Qz/Rc7cYi9DNuDTBxYzg3kfLvfM=",
"lastModified": 1743265529,
"narHash": "sha256-QbjP15/2N+VJl0b5jxrrTc+VOt39aU4XrDvtP0Lz5ik=",
"owner": "hyprwm",
"repo": "aquamarine",
"rev": "be35f75ac305f430f5f9d89b5f5a4af59ca7567e",
"rev": "1d2dbd72c2bbaceab031c592d4810f744741d203",
"type": "github"
},
"original": {
@@ -40,15 +36,15 @@
"flake-compat": {
"flake": false,
"locked": {
"lastModified": 1767039857,
"narHash": "sha256-vNpUSpF5Nuw8xvDLj2KCwwksIbjua2LZCqhV1LNRDns=",
"owner": "NixOS",
"lastModified": 1696426674,
"narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=",
"owner": "edolstra",
"repo": "flake-compat",
"rev": "5edf11c44bc78a0d334f6334cdaf7d60d732daab",
"rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
"type": "github"
},
"original": {
"owner": "NixOS",
"owner": "edolstra",
"repo": "flake-compat",
"type": "github"
}
@@ -56,7 +52,6 @@
"gitignore": {
"inputs": {
"nixpkgs": [
"hyprsplit",
"hyprland",
"pre-commit-hooks",
"nixpkgs"
@@ -83,44 +78,61 @@
]
},
"locked": {
"lastModified": 1784350909,
"narHash": "sha256-ZWyzLbS1yKUTeFJLmdVuWNnHttL333/ldJbEE+KzCrM=",
"lastModified": 1743788974,
"narHash": "sha256-2LeVyQZI2wTkSzMLvnN/kJjXVWp4HCVUoq17Bv8TNTk=",
"owner": "nix-community",
"repo": "home-manager",
"rev": "4ce190229c73d44536caa7072f6308fb2d8feeb3",
"rev": "0f5908daf890c3d7e7052bef1d6deb0f2710aaa1",
"type": "github"
},
"original": {
"owner": "nix-community",
"ref": "release-26.05",
"ref": "master",
"repo": "home-manager",
"type": "github"
}
},
"hy3": {
"inputs": {
"hyprland": [
"hyprland"
]
},
"locked": {
"lastModified": 1743128724,
"narHash": "sha256-CUlxc2u1Y8gpeAl7NKrZxxpeZjyU2DBxOYb8b0haM2M=",
"owner": "outfoxxed",
"repo": "hy3",
"rev": "4014433d1c3d1bf36c6684cff14c23d538337070",
"type": "github"
},
"original": {
"owner": "outfoxxed",
"repo": "hy3",
"type": "github"
}
},
"hyprcursor": {
"inputs": {
"hyprlang": [
"hyprsplit",
"hyprland",
"hyprlang"
],
"nixpkgs": [
"hyprsplit",
"hyprland",
"nixpkgs"
],
"systems": [
"hyprsplit",
"hyprland",
"systems"
]
},
"locked": {
"lastModified": 1776511930,
"narHash": "sha256-fCpwFiTW0rT7oKJqr3cqHMnkwypSwQKpbtUEtxdkgrM=",
"lastModified": 1742215578,
"narHash": "sha256-zfs71PXVVPEe56WEyNi2TJQPs0wabU4WAlq0XV7GcdE=",
"owner": "hyprwm",
"repo": "hyprcursor",
"rev": "39435900785d0c560c6ae8777d29f28617d031ef",
"rev": "2fd36421c21aa87e2fe3bee11067540ae612f719",
"type": "github"
},
"original": {
@@ -132,27 +144,24 @@
"hyprgraphics": {
"inputs": {
"hyprutils": [
"hyprsplit",
"hyprland",
"hyprutils"
],
"nixpkgs": [
"hyprsplit",
"hyprland",
"nixpkgs"
],
"systems": [
"hyprsplit",
"hyprland",
"systems"
]
},
"locked": {
"lastModified": 1776426399,
"narHash": "sha256-RUESLKNikIeEq9ymGJ6nmcDXiSFQpUW1IhJ245nL3xM=",
"lastModified": 1739049071,
"narHash": "sha256-3+7TpXMrbsUXSwgr5VAKAnmkzMb6JO+Rvc9XRb5NMg4=",
"owner": "hyprwm",
"repo": "hyprgraphics",
"rev": "68d064434787cf1ed4a2fe257c03c5f52f33cf84",
"rev": "175c6b29b6ff82100539e7c4363a35a02c74dd73",
"type": "github"
},
"original": {
@@ -166,23 +175,24 @@
"aquamarine": "aquamarine",
"hyprcursor": "hyprcursor",
"hyprgraphics": "hyprgraphics",
"hyprland-guiutils": "hyprland-guiutils",
"hyprland-protocols": "hyprland-protocols",
"hyprland-qtutils": "hyprland-qtutils",
"hyprlang": "hyprlang",
"hyprutils": "hyprutils",
"hyprwayland-scanner": "hyprwayland-scanner",
"hyprwire": "hyprwire",
"nixpkgs": "nixpkgs",
"nixpkgs": [
"nixpkgs"
],
"pre-commit-hooks": "pre-commit-hooks",
"systems": "systems",
"xdph": "xdph"
},
"locked": {
"lastModified": 1779392427,
"narHash": "sha256-0SiD8JBx6cU0KL1XjLMsR/nSZB5XY3uhrNnvfxH0CtY=",
"lastModified": 1743809433,
"narHash": "sha256-tCOlE2zMXfd+KNG5ETr2VxhbniDMD7jBbD0JQhYBrlc=",
"owner": "hyprwm",
"repo": "Hyprland",
"rev": "8b7110cc68662a343b6839f292ac0f44a64c3364",
"rev": "8ba20fcae124591718bddadd94c5e8c381d02097",
"type": "github"
},
"original": {
@@ -191,78 +201,23 @@
"type": "github"
}
},
"hyprland-guiutils": {
"inputs": {
"aquamarine": [
"hyprsplit",
"hyprland",
"aquamarine"
],
"hyprgraphics": [
"hyprsplit",
"hyprland",
"hyprgraphics"
],
"hyprlang": [
"hyprsplit",
"hyprland",
"hyprlang"
],
"hyprtoolkit": "hyprtoolkit",
"hyprutils": [
"hyprsplit",
"hyprland",
"hyprutils"
],
"hyprwayland-scanner": [
"hyprsplit",
"hyprland",
"hyprwayland-scanner"
],
"nixpkgs": [
"hyprsplit",
"hyprland",
"nixpkgs"
],
"systems": [
"hyprsplit",
"hyprland",
"systems"
]
},
"locked": {
"lastModified": 1776426575,
"narHash": "sha256-KI6nIfVihn/DPaeB5Et46Xg3dkNHrrEtUd5LBBVomB0=",
"owner": "hyprwm",
"repo": "hyprland-guiutils",
"rev": "a968d211048e3ed538e47b84cb3649299578f19d",
"type": "github"
},
"original": {
"owner": "hyprwm",
"repo": "hyprland-guiutils",
"type": "github"
}
},
"hyprland-protocols": {
"inputs": {
"nixpkgs": [
"hyprsplit",
"hyprland",
"nixpkgs"
],
"systems": [
"hyprsplit",
"hyprland",
"systems"
]
},
"locked": {
"lastModified": 1772460177,
"narHash": "sha256-/6G/MsPvtn7bc4Y32pserBT/Z4SUUdBd4XYJpOEKVR4=",
"lastModified": 1743549251,
"narHash": "sha256-yf+AXt0RkAkCyF6iSnJt6EJAnNG/l6qv70CVzhRP6Bg=",
"owner": "hyprwm",
"repo": "hyprland-protocols",
"rev": "1cb6db5fd6bb8aee419f4457402fa18293ace917",
"rev": "4ab17ccac08456cb5e00e8bd323de2efd30612be",
"type": "github"
},
"original": {
@@ -271,30 +226,95 @@
"type": "github"
}
},
"hyprland-qt-support": {
"inputs": {
"hyprlang": [
"hyprland",
"hyprland-qtutils",
"hyprlang"
],
"nixpkgs": [
"hyprland",
"hyprland-qtutils",
"nixpkgs"
],
"systems": [
"hyprland",
"hyprland-qtutils",
"systems"
]
},
"locked": {
"lastModified": 1737634706,
"narHash": "sha256-nGCibkfsXz7ARx5R+SnisRtMq21IQIhazp6viBU8I/A=",
"owner": "hyprwm",
"repo": "hyprland-qt-support",
"rev": "8810df502cdee755993cb803eba7b23f189db795",
"type": "github"
},
"original": {
"owner": "hyprwm",
"repo": "hyprland-qt-support",
"type": "github"
}
},
"hyprland-qtutils": {
"inputs": {
"hyprland-qt-support": "hyprland-qt-support",
"hyprlang": [
"hyprland",
"hyprlang"
],
"hyprutils": [
"hyprland",
"hyprland-qtutils",
"hyprlang",
"hyprutils"
],
"nixpkgs": [
"hyprland",
"nixpkgs"
],
"systems": [
"hyprland",
"systems"
]
},
"locked": {
"lastModified": 1739048983,
"narHash": "sha256-REhTcXq4qs3B3cCDtLlYDz0GZvmsBSh947Ub6pQWGTQ=",
"owner": "hyprwm",
"repo": "hyprland-qtutils",
"rev": "3504a293c8f8db4127cb0f7cfc1a318ffb4316f8",
"type": "github"
},
"original": {
"owner": "hyprwm",
"repo": "hyprland-qtutils",
"type": "github"
}
},
"hyprlang": {
"inputs": {
"hyprutils": [
"hyprsplit",
"hyprland",
"hyprutils"
],
"nixpkgs": [
"hyprsplit",
"hyprland",
"nixpkgs"
],
"systems": [
"hyprsplit",
"hyprland",
"systems"
]
},
"locked": {
"lastModified": 1777320127,
"narHash": "sha256-Qu+Wf2Bp5qUjyn2YpZNq8a7JyzTGowhT1knrwE38a9U=",
"lastModified": 1741191527,
"narHash": "sha256-kM+11Nch47Xwfgtw2EpRitJuORy4miwoMuRi5tyMBDY=",
"owner": "hyprwm",
"repo": "hyprlang",
"rev": "090117506ddc3d7f26e650ff344d378c2ec329cc",
"rev": "72df3861f1197e41b078faa3e38eedd60e00018d",
"type": "github"
},
"original": {
@@ -303,105 +323,23 @@
"type": "github"
}
},
"hyprsplit": {
"inputs": {
"hyprland": "hyprland",
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1781205112,
"narHash": "sha256-PaoUtmk+qIP/ESdxkxnY7mUMpMHjix88qu22R5GLQqE=",
"owner": "shezdy",
"repo": "hyprsplit",
"rev": "6b00b677d8905fb38779c91e12d6294e0e586a44",
"type": "github"
},
"original": {
"owner": "shezdy",
"repo": "hyprsplit",
"type": "github"
}
},
"hyprtoolkit": {
"inputs": {
"aquamarine": [
"hyprsplit",
"hyprland",
"hyprland-guiutils",
"aquamarine"
],
"hyprgraphics": [
"hyprsplit",
"hyprland",
"hyprland-guiutils",
"hyprgraphics"
],
"hyprlang": [
"hyprsplit",
"hyprland",
"hyprland-guiutils",
"hyprlang"
],
"hyprutils": [
"hyprsplit",
"hyprland",
"hyprland-guiutils",
"hyprutils"
],
"hyprwayland-scanner": [
"hyprsplit",
"hyprland",
"hyprland-guiutils",
"hyprwayland-scanner"
],
"nixpkgs": [
"hyprsplit",
"hyprland",
"hyprland-guiutils",
"nixpkgs"
],
"systems": [
"hyprsplit",
"hyprland",
"hyprland-guiutils",
"systems"
]
},
"locked": {
"lastModified": 1772462885,
"narHash": "sha256-5pHXrQK9zasMnIo6yME6EOXmWGFMSnCITcfKshhKJ9I=",
"owner": "hyprwm",
"repo": "hyprtoolkit",
"rev": "9af245a69fa6b286b88ddfc340afd288e00a6998",
"type": "github"
},
"original": {
"owner": "hyprwm",
"repo": "hyprtoolkit",
"type": "github"
}
},
"hyprutils": {
"inputs": {
"nixpkgs": [
"hyprsplit",
"hyprland",
"nixpkgs"
],
"systems": [
"hyprsplit",
"hyprland",
"systems"
]
},
"locked": {
"lastModified": 1778234770,
"narHash": "sha256-jAcsogZwWMfXT9MfXxZzkwliAqIuZUV0p71h6Ba9ReE=",
"lastModified": 1742984269,
"narHash": "sha256-uz9FaCIbga/gQ5ZG1Hb4HVVjTWT1qjjCAFlCXiaefxg=",
"owner": "hyprwm",
"repo": "hyprutils",
"rev": "a2dbd8a4cc51f7cbe4224732668392bb1aa79df2",
"rev": "7248194a2ce0106ae647b70d0526a96dc9d6ad60",
"type": "github"
},
"original": {
@@ -413,22 +351,20 @@
"hyprwayland-scanner": {
"inputs": {
"nixpkgs": [
"hyprsplit",
"hyprland",
"nixpkgs"
],
"systems": [
"hyprsplit",
"hyprland",
"systems"
]
},
"locked": {
"lastModified": 1777159683,
"narHash": "sha256-Jxixw6wZphUp+nHYxOKUYSckL17QMBx2d5Zp0rJHr1g=",
"lastModified": 1739870480,
"narHash": "sha256-SiDN5BGxa/1hAsqhgJsS03C3t2QrLgBT8u+ENJ0Qzwc=",
"owner": "hyprwm",
"repo": "hyprwayland-scanner",
"rev": "b8632713a6beaf28b56f2a7b0ab2fb7088dbb404",
"rev": "206367a08dc5ac4ba7ad31bdca391d098082e64b",
"type": "github"
},
"original": {
@@ -437,86 +373,73 @@
"type": "github"
}
},
"hyprwire": {
"nix-darwin": {
"inputs": {
"hyprutils": [
"hyprsplit",
"hyprland",
"hyprutils"
],
"nixpkgs": [
"hyprsplit",
"hyprland",
"nixpkgs"
],
"systems": [
"hyprsplit",
"hyprland",
"systems"
]
},
"locked": {
"lastModified": 1778410714,
"narHash": "sha256-o6RzFj4nJXaPRY7EM01siuCQeT41RfwwmcmFQqwFJJg=",
"owner": "hyprwm",
"repo": "hyprwire",
"rev": "85148a8e612808cf5ddb25d0b3c5840f3498a7dc",
"lastModified": 1743496612,
"narHash": "sha256-emPWa5lmKbnyuj8c1mSJUkzJNT+iJoU9GMcXwjp2oVM=",
"owner": "LnL7",
"repo": "nix-darwin",
"rev": "73d59580d01e9b9f957ba749f336a272869c42dd",
"type": "github"
},
"original": {
"owner": "hyprwm",
"repo": "hyprwire",
"owner": "LnL7",
"ref": "master",
"repo": "nix-darwin",
"type": "github"
}
},
"nix-filter": {
"locked": {
"lastModified": 1693833173,
"narHash": "sha256-hlMABKrGbEiJD5dwUSfnw1CQ3bG7KKwDV+Nx3bEZd7U=",
"owner": "numtide",
"repo": "nix-filter",
"rev": "ac030bd9ba98e318e1f4c4328d60766ade8ebe8b",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "nix-filter",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1778443072,
"narHash": "sha256-zi7/fsqM/kFdNuED//4WOCUtezGtKKqRNORjMvfwjnA=",
"owner": "NixOS",
"lastModified": 1743583204,
"narHash": "sha256-F7n4+KOIfWrwoQjXrL2wD9RhFYLs2/GGe/MQY1sSdlE=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "da5ad661ba4e5ef59ba743f0d112cbc30e474f32",
"rev": "2c8d3f48d33929642c1c12cd243df4cc7d2ce434",
"type": "github"
},
"original": {
"owner": "NixOS",
"owner": "nixos",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_2": {
"locked": {
"lastModified": 1784707089,
"narHash": "sha256-2V/6imsUgB7mPZlHY54oeVBRDoZbPKnvzwkAHUSSufk=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "b3fe9581c9061c749abef42b6d4ee7b7c05c33fa",
"type": "github"
},
"original": {
"owner": "nixos",
"ref": "nixos-26.05",
"repo": "nixpkgs",
"type": "github"
}
},
"pre-commit-hooks": {
"inputs": {
"flake-compat": "flake-compat",
"gitignore": "gitignore",
"nixpkgs": [
"hyprsplit",
"hyprland",
"nixpkgs"
]
},
"locked": {
"lastModified": 1778507602,
"narHash": "sha256-kTwur1wV+01SdqskVMSo6JMEpg71ps3HpbFY2GsflKs=",
"lastModified": 1742649964,
"narHash": "sha256-DwOTp7nvfi8mRfuL1escHDXabVXFGT1VlPD1JHrtrco=",
"owner": "cachix",
"repo": "git-hooks.nix",
"rev": "61ab0e80d9c7ab14c256b5b453d8b3fb0189ba0a",
"rev": "dcf5072734cb576d2b0c59b2ac44f5050b5eac82",
"type": "github"
},
"original": {
@@ -528,9 +451,12 @@
"root": {
"inputs": {
"home-manager": "home-manager",
"hyprsplit": "hyprsplit",
"nixpkgs": "nixpkgs_2",
"sops-nix": "sops-nix"
"hy3": "hy3",
"hyprland": "hyprland",
"nix-darwin": "nix-darwin",
"nixpkgs": "nixpkgs",
"sops-nix": "sops-nix",
"split-monitor-workspaces": "split-monitor-workspaces"
}
},
"sops-nix": {
@@ -540,11 +466,11 @@
]
},
"locked": {
"lastModified": 1783174389,
"narHash": "sha256-aCWC8ngycU7OdJrU2+Je3qf+1a2ykuBvpPhZT/9tXMc=",
"lastModified": 1743756170,
"narHash": "sha256-2b11EYa08oqDmF3zEBLkG1AoNn9rB1k39ew/T/mSvbU=",
"owner": "Mic92",
"repo": "sops-nix",
"rev": "f1406619a3884cd5c47992a70b8b35c9c0fcb4c9",
"rev": "cff8437c5fe8c68fc3a840a21bf1f4dc801da40d",
"type": "github"
},
"original": {
@@ -553,6 +479,27 @@
"type": "github"
}
},
"split-monitor-workspaces": {
"inputs": {
"hyprland": [
"hyprland"
],
"nix-filter": "nix-filter"
},
"locked": {
"lastModified": 1743247927,
"narHash": "sha256-za6nKSilGOUpTDLho1LK8elyImLNNIUGixDLW/n6f84=",
"owner": "Duckonaut",
"repo": "split-monitor-workspaces",
"rev": "a8e39ff10dfb5ff451416a791a30388a8517e038",
"type": "github"
},
"original": {
"owner": "Duckonaut",
"repo": "split-monitor-workspaces",
"type": "github"
}
},
"systems": {
"locked": {
"lastModified": 1689347949,
@@ -571,42 +518,36 @@
"xdph": {
"inputs": {
"hyprland-protocols": [
"hyprsplit",
"hyprland",
"hyprland-protocols"
],
"hyprlang": [
"hyprsplit",
"hyprland",
"hyprlang"
],
"hyprutils": [
"hyprsplit",
"hyprland",
"hyprutils"
],
"hyprwayland-scanner": [
"hyprsplit",
"hyprland",
"hyprwayland-scanner"
],
"nixpkgs": [
"hyprsplit",
"hyprland",
"nixpkgs"
],
"systems": [
"hyprsplit",
"hyprland",
"systems"
]
},
"locked": {
"lastModified": 1778265244,
"narHash": "sha256-8jlPtGSsv/CQY6tVVyLF4Jjd0gnS+Zbn9yk/V13A9nM=",
"lastModified": 1741934139,
"narHash": "sha256-ZhTcTH9FoeAtbPfWGrhkH7RjLJZ7GeF18nygLAMR+WE=",
"owner": "hyprwm",
"repo": "xdg-desktop-portal-hyprland",
"rev": "813ea5ca9a1702a9a2d1f5836bc00172ef698968",
"rev": "150b0b6f52bb422a1b232a53698606fe0320dde0",
"type": "github"
},
"original": {

View File

@@ -2,73 +2,61 @@
description = "System Configuration";
inputs = {
nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-26.05";
nixpkgs = {
url = "github:nixos/nixpkgs?ref=nixos-unstable";
};
home-manager = {
url = "github:nix-community/home-manager?ref=release-26.05";
url = "github:nix-community/home-manager/master";
inputs.nixpkgs.follows = "nixpkgs";
};
hyprland = {
url = "github:hyprwm/Hyprland";
inputs.nixpkgs.follows = "nixpkgs";
};
hy3 = {
url = "github:outfoxxed/hy3";
inputs.hyprland.follows = "hyprland";
};
split-monitor-workspaces = {
url = "github:Duckonaut/split-monitor-workspaces";
inputs.hyprland.follows = "hyprland";
};
nix-darwin = {
url = "github:LnL7/nix-darwin/master";
inputs.nixpkgs.follows = "nixpkgs";
};
sops-nix = {
url = "github:Mic92/sops-nix";
inputs.nixpkgs.follows = "nixpkgs";
};
hyprsplit = {
url = "github:shezdy/hyprsplit";
inputs.nixpkgs.follows = "nixpkgs";
};
};
outputs =
{
self,
nixpkgs,
...
}@inputs:
let
local = import ./lib;
mkNixosConfig =
{
path,
system ? "x86_64-linux",
nixpkgs ? inputs.nixpkgs,
home-manager ? inputs.home-manager,
}:
nixpkgs.lib.nixosSystem {
inherit system;
modules = [
home-manager.nixosModules.home-manager
{
home-manager = {
useGlobalPkgs = true;
useUserPackages = true;
extraSpecialArgs = {
inherit inputs local;
};
};
}
path
];
specialArgs = {
inherit inputs local;
};
};
in
{ self, nixpkgs, ... }@inputs:
{
nixosConfigurations = {
altair = mkNixosConfig {
path = ./system/hosts/altair;
altair = (import ./system/hosts/altair) {
inherit inputs;
inherit self;
inherit nixpkgs;
};
vega = mkNixosConfig {
path = ./system/hosts/vega;
mcp = (import ./system/hosts/mcp) {
inherit inputs;
inherit self;
inherit nixpkgs;
};
mcp = mkNixosConfig {
path = ./system/hosts/mcp;
};
sirius-a = mkNixosConfig {
path = ./system/hosts/sirius-a;
vega = (import ./system/hosts/vega) {
inherit inputs;
inherit self;
inherit nixpkgs;
};
};
darwinConfigurations = {
# Removed. See 133a3f82073f03e62cb3e7902c85fb3fc6292fe2 for when the
# last one was removed.
};
features = {
development = import ./home-manager/features/development/development.nix;
development = (import ./home-manager/features/development/development.nix);
};
};
}

View File

@@ -1,14 +0,0 @@
{ pkgs, ... }:
{
home.packages = with pkgs; [
discord
];
xdg.desktopEntries = {
discord = {
name = "Discord";
# Custom options to reduce flickering under wayland.
exec = "env ELECTRON_OZONE_PLATFORM_HINT= discord --enable-features=UseOzonePlatform --ozone-platform=wayland --disable-gpu";
};
};
}

View File

@@ -1,64 +0,0 @@
{
pkgs,
...
}:
let
freecad-wrapped = pkgs.symlinkJoin {
name = "freecad-wrapped";
paths = [ pkgs.freecad ];
buildInputs = [ pkgs.makeWrapper ];
postBuild = ''
wrapProgram $out/bin/freecad \
--prefix MESA_LOADER_DRIVER_OVERRIDE : zink \
--prefix __EGL_VENDOR_LIBRARY_FILENAMES : ${pkgs.mesa}/share/glvnd/egl_vendor.d/50_mesa.json
'';
};
# bambu-studio-wrapped = pkgs.symlinkJoin {
# name = "bambu-studio-wrapped";
# paths = [ pkgs.bambu-studio ];
# buildInputs = [ pkgs.makeWrapper ];
# postBuild = ''
# wrapProgram $out/bin/bambu-studio \
# --prefix MESA_LOADER_DRIVER_OVERRIDE : zink \
# --prefix __EGL_VENDOR_LIBRARY_FILENAMES : ${pkgs.mesa}/share/glvnd/egl_vendor.d/50_mesa.json
# '';
# };
in
{
home.packages = with pkgs; [
# bambu-studio-wrapped
lycheeslicer
orca-slicer
blender
freecad-wrapped
openscad
];
xdg.desktopEntries.orynt3d =
let
orynt3d-appimage = pkgs.fetchurl {
name = "orynt3d-appimage";
url = "https://files.orynt3d.com/client/Orynt3D-0.15.3.AppImage";
sha256 = "0j10myj06ff4frsd4yv7z3lb3qgw3ha70hc5hdc9idbryica801y";
};
in
{
name = "Orynt3D";
exec = "env __EGL_VENDOR_LIBRARY_FILENAMES=/run/opengl-driver/share/glvnd/egl_vendor.d/10_nvidia.json ${pkgs.appimage-run}/bin/appimage-run ${orynt3d-appimage}";
terminal = false;
type = "Application";
# icon = "";
comment = "3D model viewer and organizer";
categories = [
"Science"
"Development"
];
};
# Options to get Bambu Studio to run:
# __GLX_VENDOR_LIBRARY_NAME=mesa __EGL_VENDOR_LIBRARY_FILENAMES=/nix/store/js9cfbjvlsls14nddk39fw74vyvlhz4l-mesa-25.0.7/share/glvnd/egl_vendor.d/50_mesa.json MESA_LOADER_DRIVER_OVERRIDE=zink GALLIUM_DRIVER=zink WEBKIT_DISABLE_DMABUF_RENDERER=1 bambu-studio
}

View File

@@ -1,8 +0,0 @@
{ pkgs, ... }:
{
home.packages = with pkgs; [
stellarium
kstars
celestia
];
}

View File

@@ -1,41 +1,7 @@
{ pkgs, ... }:
with pkgs;
let
# A script that runs as long as media is playing.
isMediaPlaying = writeShellApplication {
name = "isMediaPlaying";
runtimeInputs = [
playerctl
];
text = ''
set -e
while [ "$(playerctl status)" = "Playing" ]; do
echo -n "."
sleep 1
done
'';
};
# A script that prevents the system from going to sleep while media is playing
mediaCaffeine = writeShellApplication {
name = "media-caffeine";
runtimeInputs = [
isMediaPlaying
systemd
];
text = ''
set -e
systemd-inhibit --what=sleep --why="Media is playing" --mode=block isMediaPlaying
'';
};
in
{
home.packages = with pkgs; [
pulseaudio # for pactl and other tools
pavucontrol # GUI volume control with lots of options
mediaCaffeine
];
}

View File

@@ -1,11 +0,0 @@
{ pkgs, ... }:
{
imports = [
../apps/element.nix
../apps/discord.nix
];
home.packages = with pkgs; [
signal-desktop
];
}

View File

@@ -1,64 +1,7 @@
include "%L"
<Multi_key> <m> <u> : "μ"
<Multi_key> <p> <i> : "π"
<Multi_key> <minus> <comma> : "¬"
<Multi_key> <asciicircum> <asciicircum> : "∧"
<Multi_key> <v> <v> : ""
# GREEK CAPITAL LETTERS
<Multi_key> <G> <A> : "Α" U0391 # GREEK CAPITAL LETTER ALPHA
<Multi_key> <G> <B> : "Β" U0392 # GREEK CAPITAL LETTER BETA
<Multi_key> <G> <G> : "Γ" U0393 # GREEK CAPITAL LETTER GAMMA
<Multi_key> <G> <D> : "Δ" U0394 # GREEK CAPITAL LETTER DELTA
<Multi_key> <G> <E> : "Ε" U0395 # GREEK CAPITAL LETTER EPSILON
<Multi_key> <G> <Z> : "Ζ" U0396 # GREEK CAPITAL LETTER ZETA
<Multi_key> <G> <H> : "Η" U0397 # GREEK CAPITAL LETTER ETA
<Multi_key> <G> <I> : "Ι" U0399 # GREEK CAPITAL LETTER IOTA
<Multi_key> <G> <K> : "Κ" U039A # GREEK CAPITAL LETTER KAPPA
<Multi_key> <G> <L> : "Λ" U039B # GREEK CAPITAL LETTER LAMDA
<Multi_key> <G> <M> : "Μ" U039C # GREEK CAPITAL LETTER MU
<Multi_key> <G> <N> : "Ν" U039D # GREEK CAPITAL LETTER NU
<Multi_key> <G> <P> : "Π" U03A0 # GREEK CAPITAL LETTER PI
<Multi_key> <G> <R> : "Ρ" U03A1 # GREEK CAPITAL LETTER RHO
<Multi_key> <G> <S> : "Σ" U03A3 # GREEK CAPITAL LETTER SIGMA
<Multi_key> <G> <T> : "Τ" U03A4 # GREEK CAPITAL LETTER TAU
<Multi_key> <G> <U> : "Υ" U03A5 # GREEK CAPITAL LETTER UPSILON
<Multi_key> <G> <F> : "Φ" U03A6 # GREEK CAPITAL LETTER PHI
<Multi_key> <G> <X> : "Χ" U03A7 # GREEK CAPITAL LETTER CHI
<Multi_key> <G> <O> : "Ω" U03A9 # GREEK CAPITAL LETTER OMEGA
# DOUBLES (additional stroke <Q>)
<Multi_key> <G> <Q> <T> : "Θ" U0398 # GREEK CAPITAL LETTER THETA
<Multi_key> <G> <Q> <O> : "Ο" U039F # GREEK CAPITAL LETTER OMICRON
<Multi_key> <G> <Q> <X> : "Ξ" U039E # GREEK CAPITAL LETTER XI
<Multi_key> <G> <Q> <P> : "Ψ" U03A8 # GREEK CAPITAL LETTER PSI
# greek small letters
<Multi_key> <g> <a> : "α" U03B1 # GREEK SMALL LETTER ALPHA
<Multi_key> <g> <b> : "β" U03B2 # GREEK SMALL LETTER BETA
<Multi_key> <g> <g> : "γ" U03B3 # GREEK SMALL LETTER GAMMA
<Multi_key> <g> <d> : "δ" U03B4 # GREEK SMALL LETTER DELTA
<Multi_key> <g> <e> : "ε" U03B5 # GREEK SMALL LETTER EPSILON
<Multi_key> <g> <z> : "ζ" U03B6 # GREEK SMALL LETTER ZETA
<Multi_key> <g> <h> : "η" U03B7 # GREEK SMALL LETTER ETA
<Multi_key> <g> <i> : "ι" U03B9 # GREEK SMALL LETTER IOTA
<Multi_key> <g> <k> : "κ" U03BA # GREEK SMALL LETTER KAPPA
<Multi_key> <g> <l> : "λ" U03BB # GREEK SMALL LETTER LAMDA
<Multi_key> <g> <m> : "μ" U03BC # GREEK SMALL LETTER MU
<Multi_key> <g> <n> : "ν" U03BD # GREEK SMALL LETTER NU
<Multi_key> <g> <p> : "π" U03C0 # GREEK SMALL LETTER PI
<Multi_key> <g> <r> : "ρ" U03C1 # GREEK SMALL LETTER RHO
<Multi_key> <g> <s> : "σ" U03C3 # GREEK SMALL LETTER SIGMA
<Multi_key> <g> <t> : "τ" U03C4 # GREEK SMALL LETTER TAU
<Multi_key> <g> <u> : "υ" U03C5 # GREEK SMALL LETTER UPSILON
<Multi_key> <g> <f> : "φ" U03C6 # GREEK SMALL LETTER PHI
<Multi_key> <g> <x> : "χ" U03C7 # GREEK SMALL LETTER CHI
<Multi_key> <g> <o> : "ω" U03C9 # GREEK SMALL LETTER OMEGA
# doubles (additional stroke <q>)
<Multi_key> <g> <q> <t> : "θ" U03B8 # GREEK SMALL LETTER THETA
<Multi_key> <g> <q> <o> : "ο" U03BF # GREEK SMALL LETTER OMICRON
<Multi_key> <g> <q> <p> : "ψ" U03C8 # GREEK SMALL LETTER PSI
<Multi_key> <g> <q> <s> : "ς" U03C2 # GREEK SMALL LETTER FINAL SIGMA
<Multi_key> <g> <q> <x> : "ξ" U03BE # GREEK SMALL LETTER X

View File

@@ -1,14 +0,0 @@
_: {
programs.claude-code = {
enable = true;
settings = {
effortLevel = "medium";
skipAutoPermissionsPrompt = true;
includeCoAuthoredBy = false;
skills = ./claude/skills;
};
};
}

View File

@@ -1,291 +0,0 @@
---
name: better-documents
description: >
Apply communication best practices when generating or reviewing any document,
presentation, report, memo, slide deck, proposal, or email. Use this skill when
asked to write, create, draft, or generate a document or presentation — apply
the principles at generation time, not as an afterthought. Also use when asked
to "review my doc," "look at this deck," "does this make sense," "is this clear,"
"improve this proposal," "check this before I send it," "make this more effective,"
or any request to evaluate whether a document will land with its audience. Use
this skill even when the request seems minor — a "quick look" or a "short memo"
is exactly when these principles matter most.
---
# Document Review
Apply communication best practices when generating or reviewing any business
document — whether the right message reaches the right audience in the right order.
This skill applies the principles from Anil Dash's [Make better documents](https://www.anildash.com/2024/03/10/make-better-documents/).
## Scope
This skill covers **business documents**: presentations, slide decks, proposals,
reports, memos, briefs, one-pagers, and emails. It does not cover UI, web
components, or frontend applications — use the `frontend-design` skill for those.
The design principles here differ from frontend design in important ways:
- **Restraint over expression.** UI benefits from bold aesthetic commitment and
distinctive visual personality. Business documents benefit from getting out of
the way of the content. Most people reading a board deck or a client proposal
are not there to appreciate the typography.
- **The audience can't interact.** A web interface rewards exploration. A
document gets one read, often skimmed, often on a small screen or printed.
Every design choice that draws attention to itself is attention stolen from
the message.
- **Non-designers are both authors and audiences.** UI is built and consumed
with design context nearby. Business documents are built by operators, analysts,
executives, and founders — and read by the same. Complexity that a designer
handles intuitively becomes noise for everyone else.
## Modes
| Mode | When to use | What you do |
|---|---|---|
| **generate** | "write me a proposal," "create a deck," "draft a memo" | Apply all five principles while producing the document; no separate report needed |
| **full-review** | "review this doc," "look at this deck" | Run all five passes on an existing document, produce a structured report |
| **rewrite** | "fix this," "make this better" | Apply all passes and return a revised version |
| **targeted** | "is the ask clear," "check the formatting" | Run only the relevant pass(es) |
| **quick** | "quick look," "does this work" | Run passes 1 and 2 only, flag the top 3 issues |
Default to **generate** when producing a new document from scratch. Default to
**full-review** when given an existing document with no other instruction.
---
## The Five Passes
Apply these in order. Each targets a different failure mode.
### Pass 1 — Audience and Purpose
The most common reason documents fail: they were written for the author, not the reader.
Check for:
- **Missing context**: Does the document assume knowledge the audience may not have?
Flag any jargon, backstory, or acronyms that aren't explained.
- **Buried ask**: Is there a request, decision, or action needed? If so, is it
stated clearly in the first third of the document — not saved for the end?
- **Author-centered opening**: Does the document open with the author's anxieties,
backstory, or credentials rather than shared context? Flag and suggest reordering
to start from common ground.
- **Missing deadline or stakes**: If a decision or response is needed, is the
timeline stated? Is the reason for that timeline explained from the *audience's*
perspective, not just the author's?
Severity guide:
- **CRITICAL** — The core ask or decision is absent or appears only at the end
- **MAJOR** — The audience is unclear; the document would read differently to
different readers
- **MINOR** — Context gaps that could be filled with a sentence
---
### Pass 2 — Structure and Sequencing
Order signals importance. Audiences assume the first thing is the most important.
If it isn't, they'll be confused or dismissive before they reach the part that matters.
Check for:
- **Creation-order sequencing**: Is the document structured in the order it was
*written* (background → analysis → conclusion) rather than the order the
audience needs (conclusion → supporting logic → call to action)?
- **Murder mystery structure**: Does the document build to a reveal rather than
stating the point upfront? Flag any document where the key conclusion or request
appears in the second half.
- **Unannounced ordering**: If the document is ordered chronologically, by category,
or by any logic other than importance, is that explicitly stated? If not, the
audience will hunt for meaning in the sequence.
- **Key information in the wrong channel**: Is anything critical only in speaker
notes, appendices, or footnotes? Central points belong in the main body.
Severity guide:
- **CRITICAL** — The document's conclusion or core request is in the second half
- **MAJOR** — Ordering is non-obvious and unexplained
- **MINOR** — Supporting points could be reordered for better flow
---
### Pass 3 — Formatting Restraint
Over-formatting is the most visible symptom of unclear thinking. When everything
is emphasized, nothing is.
Check for:
- **Emphasis overload**: Are bold, italic, underline, and color being combined
on the same text? Flag any instance of two or more emphasis types on a single
element.
- **Underlines on non-links**: Flag every underline that isn't a hyperlink.
Underlines exist to signal clickability; using them decoratively confuses readers.
- **Color proliferation**: Count distinct colors in use (excluding images). More
than two is almost always a problem. More than three is always a problem.
- **Border clutter**: Flag tables and sections with heavy borders. White space
separates content more clearly than lines.
- **Filler visuals**: Flag images, icons, or clip art that aren't specific to
the content's message. A blank space is better than a stock photo.
- **Formatting inconsistency**: Do headings, titles, or labels vary in size,
weight, or color across the document without clear reason? Flag inconsistencies
that will read as meaningful to an audience even if they weren't intentional.
Severity guide:
- **CRITICAL** — Formatting inconsistencies that will be read as semantic signals
(e.g., random font changes mid-document)
- **MAJOR** — Overuse of emphasis that makes it impossible to identify what's
actually important
- **MINOR** — Minor decoration that adds noise without adding meaning
---
### Pass 4 — Wayfinding and Density
Audiences need to know where they are in the story, and how far they have to go.
Check for:
- **No orientation**: Is there any indication of structure — a brief outline,
section headers, or progress markers — for documents longer than one page or
five slides? If not, flag.
- **Unsummarized data**: Does any chart, table, or data display appear without
a title or caption that states what it shows? Readers shouldn't have to interpret
data cold. Flag every chart or table whose title doesn't answer "what does this show?"
- **Unanswerable questions**: Are there open-ended questions in the document
(as headers or prompts) that can't actually be answered with a choice? Flag
any question that could lead to a philosophical discussion instead of a decision.
Good: "Do we go with Option A or Option B?" Bad: "How do we improve?"
- **Dense, unbroken prose**: Are there paragraphs longer than ~6 lines where
bullet points would make the content more skimmable without losing meaning?
Severity guide:
- **CRITICAL** — Data presented without any interpretive framing
- **MAJOR** — Long documents with no structural signposts
- **MINOR** — Questions that could be made more answerable
---
### Pass 5 — Naming and Versioning
The title is information. Most document names throw it away.
Check for:
- **Generic or auto-generated title**: Does the document have a title like
"Untitled," "Draft," "Meeting Notes," or the name of the person it's addressed
to? Flag and suggest a title that includes: topic, date, and context/owner.
- **Recipient-first naming**: If the document is *for* someone at another
organization, is it named after *them* rather than the author or topic?
They'll search for it by *your* name, not theirs.
- **Version ambiguity**: Does the filename or title use `_v2`, `_final`,
`_final_final`, or sequential numbers without dates? Flag and suggest
date-based versioning.
- **Meeting invites named after participants**: If the document is tied to a
meeting, flag any invite titled "Meeting with [Name]" — it tells the recipient
nothing about what the conversation is for.
Severity guide:
- **CRITICAL** — Untitled or generic title on a document intended for external sharing
- **MAJOR** — Version ambiguity on any document with multiple drafts
- **MINOR** — Suboptimal naming that could make retrieval difficult later
---
## Output Format
### Generate mode
Produce the document applying all five principles as first-order constraints —
not as a post-hoc checklist. Specifically:
- State the conclusion or ask in the opening, not the closing
- Order content by importance to the audience, not by how it was assembled
- Use the minimum formatting necessary: one emphasis type at a time, no decorative
underlines, no more than two colors, white space over borders
- Include structural signposts if the document is longer than one page or five slides
- Give the document a title that includes topic, date, and relevant context
**Override default visual style.** Claude's default document aesthetic — warm
cream backgrounds, serif display type (Georgia, Fraunces, Playfair), terracotta
or amber accents, and a "small all-caps label over a body copy block" slide
layout — is recognizable as AI-generated and inappropriate for most professional
contexts. Do not apply it.
Instead, before generating any document with visual styling:
1. **Ask about brand or visual constraints first.** Does the user have brand
colors, a template, or a font they use? If so, follow those exactly.
2. **If no brand guidance is given**, default to neutral: black text on white,
one sans-serif typeface throughout, no decorative color. The content should
do the work, not the palette.
3. **If the user explicitly wants visual styling**, offer 23 distinct directions
in one sentence each (e.g. "neutral/minimal," "bold/high-contrast," "warm/
editorial") and let them choose before proceeding. Do not pick for them.
No review report is needed in generate mode. The principles are baked in.
---
### Full-review and targeted mode
```
## Document Review: [Title or description]
### Summary
[23 sentences: what the document is trying to do, how well it's set up to succeed,
the one or two changes that would most improve it]
### Pass 1 — Audience and Purpose [N issues]
[Each issue: location → what the problem is → suggested fix → severity]
### Pass 2 — Structure and Sequencing [N issues]
[Same format]
### Pass 3 — Formatting Restraint [N issues]
[Same format]
### Pass 4 — Wayfinding and Density [N issues]
[Same format]
### Pass 5 — Naming and Versioning [N issues]
[Same format]
### Top 3 Changes
[The three revisions that would most improve this document's effectiveness,
ranked by impact]
```
### Rewrite mode
Return the revised document with a brief note after explaining what was changed
in each pass and why. Do not explain every small edit — only the structural
decisions that changed meaning or order.
### Quick mode
Return only the top 3 issues found across passes 1 and 2, with a one-line
suggested fix for each. No full report.
---
## Constraints
- **Don't alter the author's voice.** In review and rewrite modes, improve
structure and clarity, not style. If a sentence is clear and effective, leave it.
- **Don't invent content.** If information is missing (a deadline, a decision
option, context for the audience), flag the gap — don't fill it in.
- **Ask before generating if the audience is unclear.** In generate mode, if the
request doesn't specify who will read the document or what decision it needs to
drive, ask before writing. A document built for the wrong audience fails
regardless of how well it's structured.
- **Be specific.** Every finding must reference the actual text or location.
Never say "consider clarifying" without showing where and how.
- **Respect intentional choices.** If the document is explicitly a narrative
or a mystery-format pitch, flag the structural convention as a risk rather
than a violation.
---
*Based on [Make better documents](https://www.anildash.com/2024/03/10/make-better-documents/) by Anil Dash.*

View File

@@ -1,57 +0,0 @@
---
name: elegance
description: Iteratively study and apply elegant coding patterns. Each iteration - understand the code, research what simple and elegant code looks like, apply learnings, verify with CI. Use as a standalone refactoring pass or when the user asks to make code more elegant, simple, or idiomatic.
source: https://github.com/srid/emanote/tree/master/.claude/skills/elegance
---
# Elegance
Iteratively study and apply elegant coding patterns. Each iteration: understand the code, research what simple & elegant code looks like, apply learnings, verify with CI.
Run for **3 iterations** (or as specified by the user — can be a number or a duration like `2h`).
## 0. Determine Scope
- Before starting, use the `AskUserQuestion` tool to ask: should this operate on the **whole codebase** or only on **changes in the current branch/PR**?
- If scoped to current branch/PR, use `git diff main...HEAD` (or the appropriate base branch) to identify changed files and limit all subsequent steps to those files only.
## For each iteration (1 to N)
### 1. Understand
- Read through the relevant source files.
- Note patterns, repetition, unnecessary complexity, non-idiomatic code.
### 2. Research
- Use WebSearch/WebFetch to research what simple, elegant (yet readable!) code looks like for the relevant technology.
- Look for idiomatic patterns, standard simplifications, and community best practices.
- Focus on: simplicity, readability, removing unnecessary abstraction, leveraging language features.
### 3. Apply
- Refactor based on what you learned.
- This can include: edits, code reorganization, or even rewrites where simplicity demands it.
- Prefer fewer lines, clearer intent, and idiomatic style.
- Don't add abstractions — remove them.
### 4. Verify
- Run tests/CI to check edits.
- If CI fails, fix the issues before proceeding to the next iteration.
### 5. Log Progress
- Briefly note what changed in this iteration and why.
## After all iterations
- Do **not** git commit. Leave all changes in the working directory for the user to review.
- Present a summary of what changed across all iterations.
## Principles
- **Simple over clever**: Elegant code is simple code.
- **Readable over terse**: Brevity is good, but not at the cost of clarity.
- **Idiomatic over generic**: Use the language's strengths. Write TypeScript like TypeScript, not like Java.
- **Each iteration builds on the last**: Don't undo previous improvements. Deepen them.

View File

@@ -10,20 +10,10 @@
# Base languages that should always be available
./nix.nix
./lua.nix
./sh.nix
# Claude Code
./claude.nix
];
home.packages = with pkgs; [
hyperfine # Benchmarking tool
# Dev helpers
direnv
];
programs.direnv = {
enable = true;
enableBashIntegration = true;
enableZshIntegration = true;
nix-direnv.enable = true;
};
}

View File

@@ -1,6 +0,0 @@
{ pkgs, ... }:
{
home.packages = with pkgs; [
docker-compose
];
}

View File

@@ -1,7 +0,0 @@
{ pkgs, ... }:
{
home.packages = with pkgs; [
markdownlint-cli2 # linter
marksman # language server
];
}

View File

@@ -4,9 +4,8 @@
# Useful for getting the import information from github info for flakes.
nix-prefetch-github
nixfmt # Formatter
nixfmt-rfc-style # Formatter
nil # Language Server
statix # Lints and suggestions for Nix
];
home.shellAliases = {
@@ -15,3 +14,4 @@
rebuild-boot = "sudo nixos-rebuild boot --flake ~/system-config --show-trace --print-build-logs --verbose";
};
}

View File

@@ -1,6 +0,0 @@
{ pkgs, ... }:
{
home.packages = with pkgs; [
shfmt # Formatter
];
}

View File

@@ -1,9 +0,0 @@
{ pkgs, ... }:
{
home.packages = with pkgs; [
vtsls # Language Server
eslint # Linter
prettier # Formatter
tailwindcss-language-server # Language server for tailwind CSS
];
}

View File

@@ -1,20 +0,0 @@
{ pkgs, ... }:
{
programs.vscode = {
enable = true;
profiles.default.extensions = with pkgs.vscode-extensions; [
asvetliakov.vscode-neovim # Use embedded neovim editor
enkia.tokyo-night # Color theme
eamodio.gitlens # Show git info inline
mechatroner.rainbow-csv # Make it easier to read CSV files
aaron-bond.better-comments # Provides some highlighting in comments
# Typescript
esbenp.prettier-vscode # Auto-formatting
# AI Agents
github.copilot
];
};
}

View File

@@ -1,23 +0,0 @@
_: {
# Proton Mail is fully encrypted on the servers so it doesn't support POP3 or
# IMAP. In order to connect we need to set up a bridge that will download
# the mail and decrypt it locally.
services.protonmail-bridge.enable = true;
programs.thunderbird = {
enable = true;
profiles.drew = {
isDefault = true;
accountsOrder = [ "proton" ];
};
};
accounts.email.accounts.proton = {
enable = true;
primary = true;
address = "drew@blazestar.net";
realName = "Drew Haven";
thunderbird.enable = true;
};
}

View File

@@ -33,16 +33,6 @@ $color-standout-dark: darker($color-standout);
font-family: 'Noto Sans Nerd Font', sans-serif;
}
window.vertical-statusbar {
background-color: $color-background;
// background-image: linear-gradient(160deg, rgba(255,00,00,0.5), $color-background);
color: $color-foreground;
padding: 16px;
font-size: 14px;
border-right: 3px solid $color-border;
font-family: 'Noto Sans Nerd Font', sans-serif;
}
.system-monitor {
padding-top: 8px;
padding-right: 8px;

View File

@@ -3,4 +3,5 @@
(include "./primary-statusbar.yuck")
(include "./secondary-statusbar.yuck")
(include "./system-monitor.yuck")
(include "./launcher.yuck")
(include "./vertical-statusbar.yuck")

View File

@@ -0,0 +1,82 @@
(defwindow launcher
:monitor '[ "<primary>", "DP-2", 0 ]'
:geometry (geometry
:x "100px"
:y "100px"
:anchor "top left"
)
:stacking "bottom"
:exclusive false
:focusable false
(box
:class "launcher-window stand-alone"
:orientation "v"
:spacing 4
:visible { arraylength(jq(workspaces-json-dp2, "map(select(.active and (.has_windows | not)))")) > 0 }
(box
:orientation "v"
:halign "start"
:spacing 4
:space-evenly false
(label
:text "Apps"
:halign "start"
)
(box
:orientation "h"
:halign "start"
:spacing 4
:space-evenly false
(button
:onclick "firefox"
(image
:class "launcher-icon"
:icon "firefox"
:icon-size "dialog"
)
)
)
)
(box
:orientation "v"
:halign "start"
:spacing 4
:space-evenly false
(label
:text "Games"
:halign "start"
)
(box
:orientation "h"
:halign "start"
:spacing 4
:space-evenly false
(button
;; :onclick "env LUTRIS_SKIP_INIT=1 lutris lutris:rungameid/1"
:onclick "/home/drew/.local/bin/wow.sh >/tmp/wow.log 2>&1"
(image
:class "launcher-icon"
:image-width 48
:path "/home/drew/.local/share/icons/hicolor/128x128/apps/lutris_battlenet.png"
)
)
(button
:onclick "steam steam://rungameid/1091500"
(image
:class "launcher-icon"
:icon "steam_icon_1091500"
:icon-size "dialog"
)
)
;; (button
;; :onclick "steam steam://rungameid/1145350"
;; (image
;; :class "launcher-icon"
;; :icon "steam_icon_1145350"
;; :icon-size "dialog"
;; )
;;)
)
)
)
)

View File

@@ -30,7 +30,7 @@
)
(defwindow primary-statusbar
:monitor '[ "<primary>", "DP-2", 1 ]'
:monitor '[ "<primary>", "DP-2", 0 ]'
:geometry (geometry
:x "0%"
:y "0%"

View File

@@ -5,7 +5,8 @@ set -e
handle_event() {
case $1 in
focusedmon* | workspace*) active_workspace;;
focusedmon*) active_workspace;;
workspace*) active_workspace;;
esac
}

View File

@@ -12,8 +12,8 @@ handle_event() {
}
list_workspaces() {
focused=$(hyprctl activeworkspace -j | jq '.id')
active=$(hyprctl monitors -j | jq 'map(select(.name == "'$monitor'")) | .[0].activeWorkspace.id')
focused=`hyprctl activeworkspace -j | jq '.id'`
active=`hyprctl monitors -j | jq 'map(select(.name == "'$monitor'")) | .[0].activeWorkspace.id'`
# Explanation
# 1. Select only workspaces on the current monitor.
# 2. Remove duplicates (might be a bug with split-monitor-workspaces

View File

@@ -47,7 +47,7 @@
)
(defwindow secondary-statusbar
:monitor '[ "<secondary>", "DP-1", "0" ]'
:monitor '[ "<secondary>", "DP-1" ]'
:geometry (geometry
:x "0px"
:y "0px"

View File

@@ -30,7 +30,7 @@
:spacing 8
(system-monitor-perf)
(system-monitor-disks)
(system-monitor-net :interface "wlo1")
(system-monitor-net)
)
(box
:orientation "h"
@@ -145,13 +145,13 @@
:name "Disks"
(system-monitor-gauge
:name "Root"
:text-value {EWW_DISK['/'].free / 1000000000}
:text-value {EWW_DISK['/'].free / powi(2, 30)}
:gauge-pct {EWW_DISK['/'].used_perc}
:units " GB"
)
(system-monitor-gauge
:name "Home"
:text-value {EWW_DISK['/home'].free / 1000000000}
:text-value {EWW_DISK['/home'].free / powi(2, 30)}
:gauge-pct {EWW_DISK['/home'].used_perc}
:units " GB"
)
@@ -164,7 +164,7 @@
`iwgetid -r`
)
(defwidget system-monitor-net [ interface ]
(defwidget system-monitor-net []
(system-monitor-group
:name "Network"
:orientation "v"
@@ -174,12 +174,12 @@
)
(system-monitor-sparkgraph
:name "Down"
:value {EWW_NET[interface]["NET_DOWN"] / 1000000}
:value {EWW_NET["wlo1"]["NET_DOWN"] / 1000000}
:units " MB/s"
)
(system-monitor-sparkgraph
:name "Up"
:value {EWW_NET[interface]["NET_UP"] / 1000000}
:value {EWW_NET["wlo1"]["NET_UP"] / 1000000}
:units " MB/s"
)
)

View File

@@ -8,35 +8,14 @@
)
)
(deflisten workspaces-json-hdmi-a-1
:initial "[]"
`~/.config/eww/scripts/workspaces.sh HDMI-A-1`
)
(defwidget workspaces-vega []
(workspaces :workspaces-json workspaces-json-hdmi-a-1)
)
(defwidget disks-vega []
(system-monitor-group
:name "Disks"
(system-monitor-gauge
:name "Root"
:text-value {EWW_DISK['/'].free / 1000000000}
:gauge-pct {EWW_DISK['/'].used_perc}
:units " GB"
)
)
)
(defwidget vertical-statusbar []
(box
:class "statusbar"
:orientation "v"
:halign "fill"
:halign "center"
:spacing 8
:space-evenly false
(clock-large)
(workspaces-vega)
(vertical-statusbar-systray)
(system-monitor-group
:name "Performance"
@@ -44,8 +23,8 @@
(system-monitor-perf-cpu)
(system-monitor-perf-gpu)
)
(disks-vega)
(system-monitor-net :interface "wlp5s0")
(system-monitor-disks)
(system-monitor-net)
(system-monitor-audio)
)
)

View File

@@ -1,50 +1,7 @@
{ ... }:
{
config,
pkgs,
lib,
...
}:
{
options = {
programs.eww.widgets = lib.mkOption {
type = lib.types.listOf lib.types.str;
default = [ ];
};
};
config = {
home = {
packages = with pkgs; [
# For Noto Sans NF
nerd-fonts.noto
];
file.".config/eww".source = ./config;
};
programs.eww = {
enable = true;
};
systemd.user.services.eww = lib.mkIf (config.programs.eww.widgets != [ ]) {
Unit = {
Description = "Eww widgets";
After = [ "hyprland-session.target" ]; # Start only after hyprland
PartOf = [ "hyprland-session.target" ]; # Force it to exit if hyprland does
};
Service = {
Type = "oneshot";
RemainAfterExit = true;
# Eww won't start right if Hyprland hasn't finished initializing.
ExecStartPre = "${pkgs.coreutils}/bin/sleep 2";
ExecStart = "${pkgs.eww}/bin/eww open-many ${lib.concatStringsSep " " config.programs.eww.widgets}";
ExecStop = "${pkgs.eww}/bin/eww kill";
};
Install = {
WantedBy = [ "hyprland-session.target" ];
};
};
programs.eww = {
enable = true;
configDir = ./config;
};
}

View File

@@ -1,45 +1,4 @@
{ pkgs, local, ... }:
let
# TODO: This is an attempt to patch the desktop file by actually using the old
# one so I don't have to put in all the options like below. This will generate
# the correct file, however, xdg.dataFile."applications/wowup-cf.desktop"
# doesn't seem to actually overrwite it, even with force = true.
# patched-desktop =
# pkgs.runCommand "patched-wowup-cf-desktop"
# {
# desktop = "${pkgs.wowup-cf}/share/applications/wowup-cf.desktop";
# }
# ''
# mkdir -p $out
# substitute "$desktop" "$out/wowup-cf.desktop" \
# --replace-fail 'Exec=wowup-cf' 'Exec=wowup-cf --enable-features=UseOzonePlatform --ozone-platform=wayland --disable-gpu'
# '';
warcraftLogsUploader = pkgs.fetchurl {
name = "warcraftlogs-client";
url = "https://github.com/RPGLogs/Uploaders-warcraftlogs/releases/download/v8.17.47/warcraftlogs-v8.17.47.AppImage";
sha256 = "1aypr3ffy6lq0qj64d48c7n54nfs72404xb2kpxsw5slqh66imw6";
};
warcraftLogsIcon = pkgs.fetchurl {
name = "warcraftlogs-icon";
url = "https://assets.rpglogs.com/img/warcraft/favicon.png";
sha256 = "0hil7rj7a0bmls0h4w3xmfzcp1gm5yfagbziv1967lmy70ri0bc9";
};
raiderioClient = pkgs.fetchurl {
name = "raiderio-client";
url = "https://raider.io/client/download/linux";
sha256 = "0wcw53bgr9dr02x1ci2jlnc5irpiqxqxgs2hpbrsnj67q50nvlm9";
};
raiderioIcon = pkgs.fetchurl {
name = "raiderio-icon";
url = "https://cdn.raiderio.net/images/brand/Mark_2ColorWhite.png";
sha256 = "13311vi04lv6bp7jvnhinbcfah4ghn9h85cl3wzysz3aaxs73988";
};
curseForgeClient = pkgs.fetchurl {
name = "curseforge-client";
url = "https://curseforge.overwolf.com/downloads/curseforge-latest-linux.AppImage";
sha256 = "0w4snj0f0lpdc2z0iq8r10add49jaa3z10xz2cpmfh1dmm57yvlf";
};
in
{ pkgs, ... }:
{
home.packages = with pkgs; [
# Gaming
@@ -51,82 +10,9 @@ in
];
})
protonup-ng
protonplus
protontricks
vulkan-tools # useful for debugging Vulkan issues
# WoW addon updater
wowup-cf
];
# xdg.dataFile."applications/wowup-cf.desktop" = {
# force = true;
# source = "${patched-desktop}/wowup-cf.desktop";
# };
# wowup needs options to work under wayland.
xdg.desktopEntries = {
wowup-cf = local.electronDesktopEntry {
name = "WowUp";
exec = "wowup-cf --no-sandbox";
terminal = false;
type = "Application";
icon = "wowup-cf";
comment = "World of Warcraft addon updater";
categories = [
"Game"
];
};
warcraftLogs = {
name = "WarcraftLogs";
exec = "${pkgs.appimage-run}/bin/appimage-run ${warcraftLogsUploader}";
terminal = false;
type = "Application";
icon = "${warcraftLogsIcon}";
comment = "WarcraftLogs uploader";
categories = [ "Game" ];
};
raiderio = {
name = "Raider.io";
exec = "${pkgs.appimage-run}/bin/appimage-run ${raiderioClient}";
terminal = false;
type = "Application";
icon = "${raiderioIcon}";
comment = "Raider.io Client";
categories = [ "Game" ];
};
curseforge = {
name = "Curseforge";
exec = "${pkgs.appimage-run}/bin/appimage-run ${curseForgeClient}";
terminal = false;
type = "Application";
comment = "Curseforge Client";
categories = [ "Game" ];
};
};
# TODO: Merge into config
# wayland.windowManager.hyprland.settings.windowrule = [
# # Set up full-screen games on monitor 1 (since window 0 is the vertical one.)
# # "match:class ^steam_app_\d+$, float"
# "match:class ^steam_app_\d+$, fullscreen 1, monitor 1"
# "match:class ^steam_app_\d+$, center on"
#
# # Make sure WoW spawns on the right monitor and that Battlenet floats so it renders correctly
# "match:title ^World of Warcraft$, monitor 1"
# "match:title ^World of Warcraft$, fullscreen on"
# "match:title ^Battle.net$, monitor 1"
# "match:title ^Battle.net$, float on"
#
# # Make Balatro into a regular window.
# "match:title ^Balatro$, monitor 1"
# "match:title ^Balatro$, tile on"
#
# # Load Cyberpunk 2077 on the right monitor.
# "match:class steam_app_1091500, monitor 1"
# "match:class steam_app_1091500, fullscreen on"
# ];
}

View File

@@ -2,29 +2,25 @@
{
programs.git = {
enable = true;
settings = {
alias = {
"co" = "checkout";
"s" = "status";
"b" = "branch";
"r" = "remote";
"amend" = "commit -a --amend --no-edit";
"c" = "commit -am";
"l" = "log --oneline";
aliases = {
"co" = "checkout";
"s" = "status";
"b" = "branch";
"r" = "remote";
"amend" = "commit -a --amend --no-edit";
"c" = "commit -am";
"l" = "log --oneline";
};
extraConfig = {
core = {
pager = "";
};
init = {
defaultBranch = "main";
pull = {
rebase = true;
};
extraConfig = {
pull = {
rebase = true;
};
log = {
date = "iso";
};
log = {
date = "iso";
};
# Enable the delta diff pager.
delta.enable = true;
};
};
}

View File

@@ -1,7 +0,0 @@
{
"workspace": {
"library": [
"/nix/store/ndq4688w4wjlip63msnlxld8zwcwr66l-hyprland-0.55.2/share/hypr/stubs"
]
}
}

View File

@@ -1,124 +0,0 @@
hl.curve("easeOutQuint", {
type = "bezier",
points = { { 0.23, 1.0 }, { 0.32, 1.0 } },
})
hl.curve("easeInOutCubic", {
type = "bezier",
points = { { 0.65, 0.05 }, { 0.36, 1.0 } },
})
hl.curve("linear", {
type = "bezier",
points = { { 0.0, 0.0 }, { 1.0, 1.0 } },
})
hl.curve("almostLinear", {
type = "bezier",
points = { { 0.5, 0.5 }, { 0.75, 1.0 } },
})
hl.curve("quick", {
type = "bezier",
points = { { 0.15, 0.0 }, { 0.1, 1.0 } },
})
hl.animation({
leaf = "global",
enabled = true,
speed = 10.0,
bezier = "default",
})
hl.animation({
leaf = "border",
enabled = true,
speed = 5.39,
bezier = "easeOutQuint",
})
hl.animation({
leaf = "windows",
enabled = true,
speed = 4.79,
bezier = "easeOutQuint",
})
hl.animation({
leaf = "windowsIn",
enabled = true,
speed = 4.1,
bezier = "easeOutQuint",
style = "popin 87%",
})
hl.animation({
leaf = "windowsOut",
enabled = true,
speed = 1.49,
bezier = "linear",
style = "popin 87%",
})
hl.animation({
leaf = "fadeIn",
enabled = true,
speed = 1.73,
bezier = "almostLinear",
})
hl.animation({
leaf = "fadeOut",
enabled = true,
speed = 1.46,
bezier = "almostLinear",
})
hl.animation({
leaf = "fade",
enabled = true,
speed = 3.03,
bezier = "quick",
})
hl.animation({
leaf = "layers",
enabled = true,
speed = 3.81,
bezier = "easeOutQuint",
})
hl.animation({
leaf = "layersIn",
enabled = true,
speed = 4.0,
bezier = "easeOutQuint",
style = "fade",
})
hl.animation({
leaf = "layersOut",
enabled = true,
speed = 1.5,
bezier = "linear",
style = "fade",
})
hl.animation({
leaf = "fadeLayersIn",
enabled = true,
speed = 1.79,
bezier = "almostLinear",
})
hl.animation({
leaf = "fadeLayersOut",
enabled = true,
speed = 1.39,
bezier = "almostLinear",
})
hl.animation({
leaf = "workspaces",
enabled = true,
speed = 1.94,
bezier = "almostLinear",
style = "fade",
})
hl.animation({
leaf = "workspacesIn",
enabled = true,
speed = 1.21,
bezier = "almostLinear",
style = "fade",
})
hl.animation({
leaf = "workspacesOut",
enabled = true,
speed = 1.94,
bezier = "almostLinear",
style = "fade",
})

View File

@@ -1,5 +0,0 @@
hl.on("hyprland.start", function()
hl.exec_cmd("nm-applet")
hl.exec_cmd("gsettings set org.gnome.desktop.interface color-scheme 'prefer-dark'")
hl.exec_cmd("gsettings set org.gnome.desktop.interface gtk-theme 'Adwaita-dark'")
end)

View File

@@ -1,99 +0,0 @@
local browser = "firefox --new-window"
local mainMod = "SUPER + ALT"
local menu = "rofi -show combi -combi-modes drun,ssh,run -theme ~/.config/rofi/launcher/style.rasi"
local terminal = "foot"
local split = require("hyprsplit")
hl.bind("SUPER + ALT + T", function()
hl.exec_cmd(terminal)
end)
hl.bind("SUPER + ALT + B", function()
hl.exec_cmd(browser)
end)
hl.bind("SUPER + ALT + D", function()
hl.exec_cmd(menu)
end)
hl.bind("SUPER + ALT + SHIFT + S", function()
hl.exec_cmd("hyprshot -m region --clipboard-only")
end)
hl.bind("SUPER + ALT + CTRL + SHIFT + S", function()
hl.exec_cmd("hyprshot -m region -o ~/Pictures")
end)
hl.bind("SUPER + ALT + C", function()
hl.exec_cmd("swaync-client -t")
end)
hl.bind("SUPER + ALT + CTRL + Q", function()
hl.exec_cmd("/home/drew/.config/rofi/powermenu/powermenu.sh")
end)
hl.bind("SUPER + ALT + X", function()
hl.exec_cmd("/home/drew/.config/rofi/powermenu/powermenu.sh")
end)
hl.bind("SUPER + ALT + F", hl.dsp.window.float({ action = "toggle" }))
hl.bind("SUPER + ALT + SHIFT + F", hl.dsp.window.fullscreen({ action = "toggle" }))
hl.bind("SUPER + ALT + CTRL + left", hl.dsp.window.resize({ x = -20, y = 0 }))
hl.bind("SUPER + ALT + CTRL + right", hl.dsp.window.resize({ x = 20, y = 0 }))
hl.bind("SUPER + ALT + CTRL + down", hl.dsp.window.resize({ x = 0, y = 20 }))
hl.bind("SUPER + ALT + CTRL + up", hl.dsp.window.resize({ x = 0, y = -20 }))
hl.bind("SUPER + ALT + R", hl.dsp.focus({ monitor = "next" }))
--
hl.bind("SUPER + ALT + r", hl.dsp.focus({ monitor = "l" }))
hl.bind("SUPER + ALT + s", hl.dsp.focus({ monitor = "r" }))
local hy3 = hl.plugin.hy3
hl.bind("SUPER + ALT + Q", hy3.kill_active())
hl.bind("SUPER + ALT + G", hy3.make_group("opposite"))
hl.bind("SUPER + ALT + W", hy3.make_group("tab", { toggle = true }))
hl.bind("SUPER + ALT + A", hy3.change_focus("raise"))
hl.bind("SUPER + ALT + Z", hy3.change_focus("lower"))
hl.bind("SUPER + ALT + O", hy3.change_group("opposite"))
hl.bind("SUPER + ALT + left", hy3.move_focus("left"))
hl.bind("SUPER + ALT + right", hy3.move_focus("right"))
hl.bind("SUPER + ALT + up", hy3.move_focus("up"))
hl.bind("SUPER + ALT + down", hy3.move_focus("down"))
hl.bind("SUPER + ALT + SHIFT + left", hy3.move_window("left"))
hl.bind("SUPER + ALT + SHIFT + right", hy3.move_window("right"))
hl.bind("SUPER + ALT + SHIFT + up", hy3.move_window("up"))
hl.bind("SUPER + ALT + SHIFT + down", hy3.move_window("down"))
-- Workspace binds
for i = 1, 10 do
hl.bind("SUPER + ALT + " .. (i % 10), split.dsp.focus({ workspace = tostring(i) }))
hl.bind("SUPER + ALT + SHIFT + " .. (i % 10), split.dsp.window.move({ workspace = tostring(i) }))
end
hl.bind("SUPER + ALT + SHIFT + r", hl.dsp.window.move({ monitor = "+1" }))
hl.bind(" + XF86AudioRaiseVolume", function()
hl.exec_cmd("swayosd-client --output-volume raise")
end, { locked = true })
hl.bind(" + XF86AudioLowerVolume", function()
hl.exec_cmd("swayosd-client --output-volume lower")
end, { locked = true })
hl.bind(" + XF86AudioMute", function()
hl.exec_cmd("swayosd-client --output-volume mute-toggle")
end, { locked = true })
hl.bind(" + XF86AudioMicMute", function()
hl.exec_cmd("swayosd-client --input-volume mute-toggle")
end, { locked = true })
hl.bind(" + XF86MonBrightnessUp", function()
hl.exec_cmd("brightnessctl s 10%+")
end, { locked = true })
hl.bind(" + XF86MonBrightnessDown", function()
hl.exec_cmd("brightnessctl s 10%-")
end, { locked = true })
hl.bind(" + XF86AudioNext", function()
hl.exec_cmd("playerctl next")
end, { locked = true })
hl.bind(" + XF86AudioPause", function()
hl.exec_cmd("playerctl play-pause")
end, { locked = true })
hl.bind(" + XF86AudioPlay", function()
hl.exec_cmd("playerctl play-pause")
end, { locked = true })
hl.bind(" + XF86AudioPrev", function()
hl.exec_cmd("playerctl previous")
end, { locked = true })
hl.bind("SUPER + mouse:272", hl.dsp.window.drag(), { mouse = true })
hl.bind("SUPER + mouse:273", hl.dsp.window.resize(), { mouse = true })
-- hl.bind(" + mouse:272", hl.dsp.hy3:focustab({ mouse })) --, { non_consuming = true }

View File

@@ -1,91 +0,0 @@
local split = require("hyprsplit")
split.config({
num_workspaces = 10,
persistent_workspaces = true,
})
hl.config({
general = {
allow_tearing = false,
border_size = 2,
col = {
active_border = {
colors = { "rgba(ff00ffee)", "rgba(ff9900ee)" },
angle = 45,
},
inactive_border = {
colors = { "rgba(00ffff99)", "rgba(0000cc99)" },
angle = 45,
},
},
gaps_in = 5,
gaps_out = 10,
layout = "hy3",
resize_on_border = true,
},
decoration = {
active_opacity = 1.0,
blur = {
enabled = true,
passes = 1,
size = 3,
vibrancy = 0.169600,
},
inactive_opacity = 1.0,
rounding = 5,
shadow = {
color = "rgba(1a1a1aee)",
enabled = true,
range = 5,
render_power = 3,
},
},
input = {
follow_mouse = 1,
kb_layout = "us",
kb_options = "compose:ralt",
sensitivity = 0,
touchpad = {
natural_scroll = false,
},
},
misc = {
disable_hyprland_logo = true,
force_default_wallpaper = 0,
vrr = 1,
},
debug = {
disable_logs = false,
},
cursor = {
no_hardware_cursors = true,
},
animations = {
enabled = true,
},
-- plugin = {
-- hy3 = {
-- group_inset = 10,
-- no_gaps_when_only = 0,
-- node_collapse_policy = 2,
-- tab_first_window = false,
-- tabs = {
-- height = 20,
-- rounding = 2,
-- text_height = 10,
-- },
-- },
-- },
})
hl.device({
name = "logitech-g502-1",
sensitivity = -0.2,
})
-- Additional configs
require("config.autostart")
require("config.binds")
require("config.animation")
require("config.windows")

View File

@@ -1,20 +0,0 @@
hl.window_rule({
match = {
class = "Rofi",
},
stay_focused = true,
})
-- Set border color to red if window is fullscreen
hl.window_rule({
match = { fullscreen = true },
border_color = "rgb(FF0000) rgb(880808)",
})
-- Suppress maximize events
hl.window_rule({
match = {
class = ".*",
},
suppress_event = "maximize",
})

View File

@@ -1,34 +0,0 @@
{ ... }:
{
services.hypridle = {
enable = true;
settings = {
general = {
lock_cmd = "pidof swaylock || ~/.config/swaylock/swaylock.sh"; # avoid starting multiple lock instances.
before_sleep_cmd = "loginctl lock-session"; # lock before suspend.
after_sleep_cmd = "hyprctl dispatch dpms on"; # to avoid having to press a key twice to turn on the display.
};
listener = [
{
timeout = 300; # 5min
on-timeout = "brightnessctl -s set 10"; # set monitor backlight to minimum, avoid 0 on OLED monitor.
on-resume = "brightnessctl -r"; # monitor backlight restore.
}
{
timeout = 330; # 5.5 min
on-timeout = "loginctl lock-session"; # lock screen when timeout has passed
}
{
timeout = 600; # 10 min
on-timeout = "hyprctl dispatch dpms off"; # screen off when timeout has passed
on-resume = "hyprctl dispatch dpms on && brightnessctl -r"; # screen on when activity is detected after timeout has fired.
}
{
timeout = 1800; # 30min
on-timeout = "systemctl suspend"; # suspend pc
}
];
};
};
}

View File

@@ -1,126 +0,0 @@
{
pkgs,
inputs,
config,
lib,
...
}:
{
imports = [
../swaylock.nix
./hypridle.nix
../../options/monitors.nix
];
xdg.configFile = {
"hypr/hyprsplit" = {
source = "${inputs.hyprsplit}";
recursive = true;
};
"hypr/config" = {
source = ./config;
recursive = true;
};
};
home.packages = with pkgs; [
swayosd # volume pop-up
swaynotificationcenter # notifications
hyprpolkitagent # Privilege managent
hyprshot # Screenshot utility
# For clipboard management. See below.
wl-clipboard
xclip
];
wayland.windowManager.hyprland = {
enable = true;
# TODO: Switch to the newer LUA config?
configType = "lua";
plugins = [
# https://github.com/outfoxxed/hy3
pkgs.hyprlandPlugins.hy3
];
extraConfig = ''
require("config.hyprland")
'';
# Disable systemd because it conflicts with UWSM
systemd.enable = false;
};
programs.hyprlock = {
enable = false;
settings = {
general = {
disable_loading_bar = true;
hide_cursor = true;
};
background = {
monitor = "";
color = "rgb(000000)";
};
# Time
label = {
monitor = "";
text = ''
cmd[update:1000] echo "$(date '+%F %T')"
'';
font_size = 96;
font_family = "NotoSans Nerd Font";
color = "rgb(990000)";
position = "0, 0";
halign = "center";
valign = "center";
};
input-field = {
monitor = "";
size = "300, 40";
fade_on_empty = true;
outline_thickness = 2;
outer_color = "rgb(cc2222) rgb(661111)";
inner_color = "rgb(221111)";
font_color = "rgb(cc2222)";
dots_size = 0.2;
dots_spacing = 0.1;
placeholder_text = "";
fail_color = "rgb(cc3333)";
capslock_color = "rgb(cccc33)";
halign = "center";
valign = "center";
position = "0, -300px";
};
};
};
# UWSM sessions should not use Hyprland's variables but instead use UWSM's variable management.
# See https://wiki.hyprland.org/Configuring/Environment-variables/
home.file.".config/uwsm/env".text = ''
export XCURSOR_SIZE="32"
export HYPRCURSOR_SIZE="32"
export HYPRCURSOR_THEME="phinger"
# Nvidia config
export LIBVA_DRIVER_NAME="nvidia"
export __GLX_VENDOR_LIBRARY_NAME="nvidia"
# For window theming
export QT_QPA_PLATFORMTHEME="qt6ct # for Qt apps"
export GTK_THEME="Adwaita-dark"
# Tell electron apps they should use OZone for Wayland
export ELECTRON_OZONE_PLATFORM_HINT="auto"
'';
}

View File

@@ -0,0 +1,418 @@
{ pkgs, inputs, ... }:
{
wayland.windowManager.hyprland = {
enable = true;
plugins = [
inputs.hy3.packages.${pkgs.system}.hy3
inputs.split-monitor-workspaces.packages.${pkgs.system}.split-monitor-workspaces
];
# Disable systemd because it conflicts with UWSM
systemd.enable = false;
settings = {
monitor = [
"DP-2, 3440x1440, 0x0, 1"
"DP-1, 2560x1440, -1440x-510, 1, transform, 1"
];
"$terminal" = "wezterm";
"$fileManager" = "dolphin";
"$menu" = "rofi -show combi -combi-modes drun,ssh,run -theme ~/.config/rofi/launcher/style.rasi";
"$browser" = "firefox";
exec-once = [
"nm-applet"
"sleep 2 && hyprpm reload -n"
"swayidle -w before-sleep hyprlock"
"swayosd-server"
"systemctl --user start hyprpolkitagent"
"gsettings set org.gnome.desktop.interface color-scheme \"prefer-dark\""
"gsettings set org.gnome.desktop.interface gtk-theme \"Adwaita-dark\""
];
env = [
"XCURSOR_SIZE,32"
"HYPRCURSOR_SIZE,32"
"HYPRCURSOR_THEME,phinger"
# Nvidia config
"LIBVA_DRIVER_NAME,nvidia"
"__GLX_VENDOR_LIBRARY_NAME,nvidia"
# For window theming
"QT_QPA_PLATFORMTHEME,qt6ct # for Qt apps"
"GTK_THEME,Adwaita-dark"
];
general = {
gaps_in = 5;
gaps_out = 10;
border_size = 2;
# https://wiki.hyprland.org/Configuring/Variables/#variable-types for info about colors
"col.active_border" = "rgba(eeeeffee) rgba(3366ffee) 45deg";
"col.inactive_border" = "rgba(595959aa)";
# Set to true enable resizing windows by clicking and dragging on borders and gaps
resize_on_border = false;
# Please see https://wiki.hyprland.org/Configuring/Tearing/ before you turn this on
allow_tearing = false;
layout = "hy3";
};
# https://wiki.hyprland.org/Configuring/Variables/#decoration
decoration = {
rounding = 5;
# Change transparency of focused and unfocused windows
active_opacity = 1.0;
inactive_opacity = 1.0;
shadow = {
enabled = true;
range = 5;
render_power = 3;
color = "rgba(1a1a1aee)";
};
# https://wiki.hyprland.org/Configuring/Variables/#blur
blur = {
enabled = true;
size = 3;
passes = 1;
vibrancy = 0.1696;
};
};
# https://wiki.hyprland.org/Configuring/Variables/#animations
animations = {
enabled = "yes";
# Default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more
bezier = [
"easeOutQuint,0.23,1,0.32,1"
"easeInOutCubic,0.65,0.05,0.36,1"
"linear,0,0,1,1"
"almostLinear,0.5,0.5,0.75,1.0"
"quick,0.15,0,0.1,1"
];
animation = [
"global, 1, 10, default"
"border, 1, 5.39, easeOutQuint"
"windows, 1, 4.79, easeOutQuint"
"windowsIn, 1, 4.1, easeOutQuint, popin 87%"
"windowsOut, 1, 1.49, linear, popin 87%"
"fadeIn, 1, 1.73, almostLinear"
"fadeOut, 1, 1.46, almostLinear"
"fade, 1, 3.03, quick"
"layers, 1, 3.81, easeOutQuint"
"layersIn, 1, 4, easeOutQuint, fade"
"layersOut, 1, 1.5, linear, fade"
"fadeLayersIn, 1, 1.79, almostLinear"
"fadeLayersOut, 1, 1.39, almostLinear"
"workspaces, 1, 1.94, almostLinear, fade"
"workspacesIn, 1, 1.21, almostLinear, fade"
"workspacesOut, 1, 1.94, almostLinear, fade"
];
};
# https://wiki.hyprland.org/Configuring/Variables/#misc
misc = {
force_default_wallpaper = 0; # Set to 0 or 1 to disable the anime mascot wallpapers
disable_hyprland_logo = true; # If true disables the random hyprland logo / anime girl background. :(
vrr = 1; # Enable variable refresh rate
};
cursor = {
no_hardware_cursors = true;
};
###############
### PLUGINS ###
###############
plugin = {
hy3 = {
# disable gaps when only one window is onscreen
# 0 - always show gaps
# 1 - hide gaps with a single window onscreen
# 2 - 1 but also show the window border
no_gaps_when_only = 0; # default: 0
# policy controlling what happens when a node is removed from a group,
# leaving only a group
# 0 = remove the nested group
# 1 = keep the nested group
# 2 = keep the nested group only if its parent is a tab group
node_collapse_policy = 2; # default: 2
# offset from group split direction when only one window is in a group
group_inset = 10; # default: 10
# if a tab group will automatically be created for the first window spawned in a workspace
tab_first_window = false;
# tab group settings
tabs = {
# height of the tab bar
height = 20; # default: 15
# padding between the tab bar and its focused node
# padding = <int> # default: 5
# the tab bar should animate in/out from the top instead of below the window
# from_top = <bool> # default: false
# rounding of tab bar corners
rounding = 2; # default: 3
# render the window title on the bar
# render_text = <bool> # default: true
# center the window title
# text_center = <bool> # default: false
# font to render the window title with
# text_font = <string> # default: Sans
# height of the window title
text_height = 10; # default: 8
# left padding of the window title
# text_padding = <int> # default: 3
# active tab bar segment color
# col.active = <color> # default: 0xff32b4ff
# urgent tab bar segment color
# col.urgent = <color> # default: 0xffff4f4f
# inactive tab bar segment color
# col.inactive = <color> # default: 0x80808080
# active tab bar text color
# col.text.active = <color> # default: 0xff000000
# urgent tab bar text color
# col.text.urgent = <color> # default: 0xff000000
# inactive tab bar text color
# col.text.inactive = <color> # default: 0xff000000
};
# autotiling settings
autotile = {
# enable autotile
# enable = <bool> # default: false
# make autotile-created groups ephemeral
# ephemeral_groups = <bool> # default: true
# if a window would be squished smaller than this width, a vertical split will be created
# -1 = never automatically split vertically
# 0 = always automatically split vertically
# <number> = pixel width to split at
# trigger_width = <int> # default: 0
# if a window would be squished smaller than this height, a horizontal split will be created
# -1 = never automatically split horizontally
# 0 = always automatically split horizontally
# <number> = pixel height to split at
# trigger_height = <int> # default: 0
# a space or comma separated list of workspace ids where autotile should be enabled
# it's possible to create an exception rule by prefixing the definition with "not:"
# workspaces = 1,2 # autotiling will only be enabled on workspaces 1 and 2
# workspaces = not:1,2 # autotiling will be enabled on all workspaces except 1 and 2
# workspaces = <string> # default: all
};
};
split-monitor-workspaces = {
# Keep the focus when reloading.
keep_focused = true;
# Allocate persistent workspaces. If this is off there are some bugs
# when trying to move to a new workspace if it doesn't already exist.
enable_persistent_workspaces = true;
};
};
#############
### INPUT ###
#############
# https://wiki.hyprland.org/Configuring/Variables/#input
input = {
kb_layout = "us";
# kb_variant =
# kb_model =
kb_options = "compose:ralt";
# kb_rules =
follow_mouse = 1;
sensitivity = 0; # -1.0 - 1.0, 0 means no modification.
touchpad = {
natural_scroll = false;
};
};
# Example per-device config
# See https://wiki.hyprland.org/Configuring/Keywords/#per-device-input-configs for more
device = {
name = "logitech-g502-1";
sensitivity = -0.2;
};
###################
### KEYBINDINGS ###
###################
# See https://wiki.hyprland.org/Configuring/Keywords/
"$mainMod" = "SUPER + ALT";
bind = [
"$mainMod, T, exec, $terminal"
"$mainMod, B, exec, $browser"
"$mainMod, D, exec, $menu"
"$mainMod, E, exec, $fileManager"
"$mainMod + SHIFT, S, exec, hyprshot -m region --clipboard-only"
"$mainMod, C, exec, swaync-client -t"
"$mainMod + L_CONTROL, Q, exec, /home/drew/.config/rofi/powermenu/powermenu.sh"
"$mainMod, X, exec, /home/drew/.config/rofi/powermenu/powermenu.sh"
# "$mainMod, X, exec, hyprlock"
# "$mainMod + SHIFT, X, exec, systemctl suspend"
"$mainMod, F, togglefloating,"
"$mainMod + SHIFT, F, fullscreen, 1"
# Monitors
"$mainMod, R, focusmonitor, next"
"$mainMod + CTRL, R, movecurrentworkspacetomonitor, l"
"$mainMod + CTRL, S, movecurrentworkspacetomonitor, r"
# Hy3 Stuff
"$mainMod, Q, hy3:killactive,"
"$mainMod, G, hy3:makegroup, opposite, ephemeral"
"$mainMod, W, hy3:makegroup, tab, ephemeral"
"$mainMod + SHIFT, W, hy3:changegroup, toggletab"
"$mainMod, O, hy3:changegroup, opposite"
"$mainMod, left, hy3:movefocus, l"
"$mainMod, right, hy3:movefocus, r"
"$mainMod, up, hy3:movefocus, u"
"$mainMod, down, hy3:movefocus, d"
"$mainMod, A, hy3:changefocus, raise"
"$mainMod, Z, hy3:changefocus, lower"
"$mainMod + SHIFT, left, hy3:movewindow, l"
"$mainMod + SHIFT, right, hy3:movewindow, r"
"$mainMod + SHIFT, up, hy3:movewindow, u"
"$mainMod + SHIFT, down, hy3:movewindow, d"
# Switch workspaces with mainMod + [0-9]
"$mainMod, 1, split-workspace, 1"
"$mainMod, 2, split-workspace, 2"
"$mainMod, 3, split-workspace, 3"
"$mainMod, 4, split-workspace, 4"
"$mainMod, 5, split-workspace, 5"
"$mainMod, 6, split-workspace, 6"
"$mainMod, 7, split-workspace, 7"
"$mainMod, 8, split-workspace, 8"
"$mainMod, 9, split-workspace, 9"
"$mainMod, 0, split-workspace, 10"
# Move active window to a workspace with mainMod + SHIFT + [0-9]
"$mainMod SHIFT, 1, split-movetoworkspace, 1, follow"
"$mainMod SHIFT, 2, split-movetoworkspace, 2, follow"
"$mainMod SHIFT, 3, split-movetoworkspace, 3, follow"
"$mainMod SHIFT, 4, split-movetoworkspace, 4, follow"
"$mainMod SHIFT, 5, split-movetoworkspace, 5, follow"
"$mainMod SHIFT, 6, split-movetoworkspace, 6, follow"
"$mainMod SHIFT, 7, split-movetoworkspace, 7, follow"
"$mainMod SHIFT, 8, split-movetoworkspace, 8, follow"
"$mainMod SHIFT, 9, split-movetoworkspace, 9, follow"
"$mainMod SHIFT, 0, split-movetoworkspace, 10, follow"
# These don't take monitor numbers, but rather differences. It's next/prev but
# it'll always just move it to the other monitor
"$mainMod SHIFT, r, split-changemonitor, prev"
];
# m = mouse bindings
# These use just SUPER so I can hit them with my left hand
bindm = [
"SUPER, mouse:272, movewindow"
"SUPER, mouse:273, resizewindow"
];
# n = non-consuming
bindn = [
", mouse:272, hy3:focustab, mouse"
];
# l = available when locked
bindl = [
# Laptop multimedia keys for volume and LCD brightness
",XF86AudioRaiseVolume, exec, swayosd-client --output-volume raise"
",XF86AudioLowerVolume, exec, swayosd-client --output-volume lower"
",XF86AudioMute, exec, swayosd-client --output-volume mute-toggle"
",XF86AudioMicMute, exec, swayosd-client --input-volume mute-toggle"
",XF86MonBrightnessUp, exec, brightnessctl s 10%+"
",XF86MonBrightnessDown, exec, brightnessctl s 10%-"
# Requires playerctl
", XF86AudioNext, exec, playerctl next"
", XF86AudioPause, exec, playerctl play-pause"
", XF86AudioPlay, exec, playerctl play-pause"
", XF86AudioPrev, exec, playerctl previous"
];
##############################
### WINDOWS AND WORKSPACES ###
##############################
# See https://wiki.hyprland.org/Configuring/Window-Rules/ for more
windowrulev2 = [
# Ignore maximize requests from apps. You'll probably like this.
"suppressevent maximize, class:.*"
# Fix some dragging issues with XWayland
"nofocus,class:^$,title:^$,xwayland:1,floating:1,fullscreen:0,pinned:0"
# Make right-click backgrounds not transparent. The menus have no class or title.
"opaque,class:(),title:()"
"noshadow,class:(),title:()"
"noblur,class:(),title:()"
# Set up full-screen games on monitor 1
"monitor 1,class:^steam_app_\d+$"
"float,class:^steam_app_\d+$"
"monitor 1,fullscreen:1"
"center,class:^steam_app_\d+$"
"monitor 1,title:^World of Warcraft$"
"monitor 1,title:^Battle.net$"
"float,title:^Battle.net$"
];
# See https://wiki.hyprland.org/Configuring/Workspace-Rules/ for workspace rules
workspace = [
"11, defaultName:1"
"12, defaultName:2"
"13, defaultName:3"
"14, defaultName:4"
"15, defaultName:5"
"16, defaultName:6"
"17, defaultName:7"
"18, defaultName:8"
"19, defaultName:9"
"20, defaultName:10"
];
};
};
}

View File

@@ -1,17 +0,0 @@
{ config, ... }:
{
services.hyprpaper = {
enable = true;
settings = {
splash = false; # Disable the little quotes they put on there
wallpaper = map (mon: {
monitor = mon;
# Each monitor gets a folder under wallpaper that containes the current images.
path = "~/Pictures/Wallpaper/${mon}";
timeout = 3600;
recursive = true;
fit_mode = "cover";
}) (builtins.attrNames config.hardware.monitors);
};
};
}

View File

@@ -1,7 +0,0 @@
{ pkgs, ... }:
{
home.packages = with pkgs; [
gimp3
inkscape
];
}

View File

@@ -1,71 +1,42 @@
{
config,
pkgs,
...
}:
let
browser = "firefox";
in
{ pkgs, ... }:
{
imports = [
./hyprland.nix
./audio.nix
./hypr/hyprland.nix
./nix.nix
./rofi/rofi.nix
./sway.nix
../apps/element.nix
../apps/discord.nix
./terminal.nix
../options/monitors.nix
];
home = {
packages = with pkgs; [
# Desktop Applications
gimp3
vlc
home.packages = with pkgs; [
feh
networkmanagerapplet # network control
hyprlock # lock screen
swayidle # lock on idle
swayosd # volume pop-up
swaynotificationcenter # notifications
hyprpolkitagent # Privilege managent
gnome-keyring # Secret management
glib # for Gnome/GTK settings
gsettings-desktop-schemas # So that we can access gnome settings
xdg-desktop-portal-hyprland
xdg-desktop-portal-gtk # GTK backend for XDG components like pickers
grim # Screenshot provider
hyprshot # Screenshot utility
nwg-look # GTK settings editor
playerctl # for universal play/pause etc
wirelesstools
waypaper # Wallpaper switcher
phinger-cursors # Mouse cursors
];
# Common utilities
feh
networkmanagerapplet # network control
gnome-keyring # Secret management
glib # for Gnome/GTK settings
gsettings-desktop-schemas # So that we can access gnome settings
xdg-desktop-portal-hyprland
xdg-desktop-portal-gtk # GTK backend for XDG components like pickers
grim # Screenshot provider
nwg-look # GTK settings editor
playerctl # for universal play/pause etc
wirelesstools
waypaper # Wallpaper switcher
# Hint for electron apps to use wayland
home.sessionVariables.NIXOS_OZONE_WL = "1";
];
pointerCursor = {
enable = true;
gtk.enable = true;
size = 16;
package = pkgs.bibata-cursors;
name = "Bibata-Modern-Classic";
# package = pkgs.phinger-cursors;
# name = "phinger-cursors";
};
# Hint for electron apps to use wayland
sessionVariables.NIXOS_OZONE_WL = "1";
# Miscelaneous config files
file = {
".XCompose".source = ./config/XCompose;
};
};
programs = {
# browsers
firefox = {
enable = true;
configPath = "${config.xdg.configHome}/mozilla/firefox";
};
chromium.enable = true;
# Micelaneious config files
home.file = {
".XCompose".source = ./config/XCompose;
};
# GTK settings
@@ -78,12 +49,8 @@ in
gtk3.extraConfig = {
gtk-application-prefer-dark-theme = true;
};
gtk4 = {
# Don't use GTK4 themes. See https://stopthemingmy.app/
theme = null;
extraConfig = {
gtk-application-prefer-dark-theme = true;
};
gtk4.extraConfig = {
gtk-application-prefer-dark-theme = true;
};
};
@@ -101,18 +68,4 @@ in
platformTheme.name = "adwaita";
style.name = "adwaita-dark";
};
# Default apps
xdg.mimeApps = {
enable = true;
defaultApplications = {
"text/html" = [ "${browser}.desktop" ];
"default-web-browser" = [ "${browser}.desktop" ];
"x-scheme-handler/http" = [ "${browser}.desktop" ];
"x-scheme-handler/https" = [ "${browser}.desktop" ];
"x-scheme-handler/about" = [ "${browser}.desktop" ];
"x-scheme-handler/unknown" = [ "${browser}.desktop" ];
};
};
home.sessionVariables.DEFAULT_BROWSER = "${pkgs."${browser}"}/bin/${browser}";
}

View File

@@ -1,50 +0,0 @@
{ pkgs, ... }:
{
home.packages = with pkgs; [ sshfs ];
systemd.user.services =
let
mountArchive = ''
${pkgs.sshfs}/bin/sshfs \
-f \
-o reconnect \
-o compression=yes \
-o ServerAliveInterval=15 \
-o ServerAliveCountMax=3 \
-o IdentityFile=%h/.ssh/id_ed25519 \
-o StrictHostKeyChecking=yes \
drew@mcp:/tank/archive/drew \
%h/archive
'';
# unmountArchive = "/run/wrappers/bin/fusermount -u %h/archive";
in
{
# Mounts the archive when the system is online.
mcp-archive = {
Unit = {
Description = "SSHFS mount for remote archive";
# Start only after the network is online
After = [ "network-online.target" ];
# Stop this service if the network stops
StopPropagatedFrom = [ "network-online.target" ];
};
Service = {
Type = "simple";
ExecStartPre = "/run/current-system/sw/bin/mkdir -p %h/archive";
ExecStart = mountArchive;
Restart = "on-failure";
RestartSec = "10s";
};
Install = {
# It doesn't like to disconnect on sleep, so not making it automount at all
# WantedBy = [ "default.target" ];
};
};
};
}

View File

@@ -1,19 +0,0 @@
{
"extras": [
"lazyvim.plugins.extras.coding.mini-comment",
"lazyvim.plugins.extras.coding.mini-surround",
"lazyvim.plugins.extras.editor.snacks_picker",
"lazyvim.plugins.extras.lang.astro",
"lazyvim.plugins.extras.lang.haskell",
"lazyvim.plugins.extras.lang.json",
"lazyvim.plugins.extras.lang.markdown",
"lazyvim.plugins.extras.lang.nix",
"lazyvim.plugins.extras.lang.rust",
"lazyvim.plugins.extras.lang.tailwind",
"lazyvim.plugins.extras.lang.toml",
"lazyvim.plugins.extras.lang.typescript",
"lazyvim.plugins.extras.ai.sidekick"
],
"install_version": 8,
"version": 8
}

View File

@@ -10,8 +10,8 @@
vim.api.nvim_create_autocmd("FileType", {
pattern = { "markdown" },
callback = function()
vim.o.shiftwidth = 2
vim.o.tabstop = 2
vim.o.softtabstop = 2
vim.bo.shiftwidth = 4
vim.bo.tabstop = 4
vim.bo.softtabstop = 4
end,
})

View File

@@ -2,6 +2,7 @@
-- Default keymaps that are always set: https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/config/keymaps.lua
-- Add any additional keymaps here
for _, map in ipairs({ { "<C-up>", "k" }, { "<C-down>", "j" }, { "<C-left>", "h" }, { "<C-right>", "l" } }) do
vim.keymap.set("n", map[1], "<C-w>" .. map[2], { noremap = true, silent = true })
end
vim.keymap.set("n", "<C-up>", "<C-w>k", { noremap = true, silent = true })
vim.keymap.set("n", "<C-down>", "<C-w>j", { noremap = true, silent = true })
vim.keymap.set("n", "<C-left>", "<C-w>h", { noremap = true, silent = true })
vim.keymap.set("n", "<C-right>", "<C-w>l", { noremap = true, silent = true })

View File

@@ -18,10 +18,6 @@ require("lazy").setup({
spec = {
-- add LazyVim and import its plugins
{ "LazyVim/LazyVim", import = "lazyvim.plugins" },
-- Integrate ESlint for fixes and prettier for formatting
-- See: https://www.lazyvim.org/configuration/recipes
{ import = "lazyvim.plugins.extras.linting.eslint" },
{ import = "lazyvim.plugins.extras.formatting.prettier" },
-- import/override with your plugins
{ import = "plugins" },
},

View File

@@ -4,6 +4,3 @@
-- Creates a shortcut for adding the directory of the current buffer when specifying a file
vim.cmd("cnoreabbrev %. %:h<Tab>")
-- Set snacks as the preferred picker.
vim.g.lazyvim_picker = "snacks"

View File

@@ -1,37 +0,0 @@
return {
"saghen/blink.cmp",
dependencies = {
"moyiz/blink-emoji.nvim",
},
opts = {
sources = {
default = { "lsp", "buffer", "snippets", "path", "emoji" },
providers = {
-- https://github.com/moyiz/blink-emoji.nvim
emoji = {
module = "blink-emoji",
name = "Emoji",
score_offset = 15, -- Tune by preference
opts = { insert = true }, -- Insert emoji (default) or complete its name
should_show_items = function()
return vim.tbl_contains(
-- Enable emoji completion only for git commits and markdown.
-- By default, enabled for all file-types.
{ "gitcommit", "markdown" },
vim.o.filetype
)
end,
},
},
},
keymap = {
preset = "default",
["<C-space>"] = {
function(cmp)
cmp.show()
end,
},
["<Tab>"] = { "select_and_accept", "snippet_forward", "fallback" },
},
},
}

View File

@@ -1,8 +0,0 @@
return {
"stevearc/conform.nvim",
opts = {
formatters_by_ft = {
nix = { "nixfmt" },
},
},
}

View File

@@ -0,0 +1,9 @@
return {
"zbirenbaum/copilot.lua",
opts = {
filetypes = {
markdown = false,
help = false,
},
},
}

View File

@@ -1,5 +1,5 @@
return {
-- Maeson installs it's own binaries that are incompatible with NixOS.
{ "mason-org/mason.nvim", enabled = false },
{ "mason-org/mason-lspconfig.nvim", enabled = false },
{ "williamboman/mason.nvim", enabled = false },
{ "williamboman/mason-lspconfig.nvim", enabled = false },
}

View File

@@ -0,0 +1,11 @@
return {
-- https://www.lazyvim.org/extras/editor/fzf
"ibhagwan/fzf-lua",
keys = {
{
"<leader><space>",
"<cmd>FzfLua buffers sort_mru=true sort_lastused=true<cr>",
desc = "Switch Buffer",
},
},
}

View File

@@ -3,26 +3,8 @@ return {
"neovim/nvim-lspconfig",
opts = {
servers = {
-- Lua
lua_ls = {
root_markers = {
".luarc.json",
".git",
},
},
-- Nix
lua_ls = {},
nil_ls = {},
-- Typescript
vtsls = {},
-- Haskell
hls = {},
-- Copilot
copilot = {
enabled = true,
},
},
codelens = {
enable = true,
},
},
},

View File

@@ -1,45 +0,0 @@
-- https://github.com/MeanderingProgrammer/render-markdown.nvim?tab=readme-ov-file#setup
return {
"MeanderingProgrammer/render-markdown.nvim",
opts = {
checkbox = {
enabled = true,
render_modes = true,
unchecked = {
icon = "󰄱 ",
highlight = "RenderMarkdownUnchecked",
scope_highlight = nil,
},
checked = {
-- Replaces '[x]' of 'task_list_marker_checked'.
icon = "󰱒 ",
-- Highlight for the checked icon.
highlight = "RenderMarkdownChecked",
-- Highlight for item associated with checked checkbox.
scope_highlight = nil,
},
-- Define custom checkbox states, more involved, not part of the markdown grammar.
-- As a result this requires neovim >= 0.10.0 since it relies on 'inline' extmarks.
-- The key is for healthcheck and to allow users to change its values, value type below.
-- | raw | matched against the raw text of a 'shortcut_link' |
-- | rendered | replaces the 'raw' value when rendering |
-- | highlight | highlight for the 'rendered' icon |
-- | scope_highlight | optional highlight for item associated with custom checkbox |
-- stylua: ignore
custom = {
partial = {
raw = '[/]',
rendered = '',
highlight = 'RenderMarkdownTodo',
scope_highlight = nil
},
deferred = {
raw = '[>]',
rendered = '',
highlight = 'RenderMarkdownWarn',
scope_highlight = nil
},
},
},
},
}

View File

@@ -1,38 +1,10 @@
return {
{
"nvim-mini/mini.surround",
"echasnovski/mini.surround",
enable = true,
keys = function(_, keys)
-- Populate the keys based on the user's options
local opts = LazyVim.opts("mini.surround")
local mappings = {
{ opts.mappings.add, desc = "Add Surrounding", mode = { "n", "v" } },
{ opts.mappings.delete, desc = "Delete Surrounding" },
{ opts.mappings.find, desc = "Find Right Surrounding" },
{ opts.mappings.find_left, desc = "Find Left Surrounding" },
{ opts.mappings.highlight, desc = "Highlight Surrounding" },
{ opts.mappings.replace, desc = "Replace Surrounding" },
{ opts.mappings.update_n_lines, desc = "Update `MiniSurround.config.n_lines`" },
}
mappings = vim.tbl_filter(function(m)
return m[1] and #m[1] > 0
end, mappings)
return vim.list_extend(mappings, keys)
end,
opts = {
mappings = {
add = "gsa", -- Add surrounding in Normal and Visual modes
delete = "gsd", -- Delete surrounding
find = "gsf", -- Find surrounding (to the right)
find_left = "gsF", -- Find surrounding (to the left)
highlight = "gsh", -- Highlight surrounding
replace = "gsr", -- Replace surrounding
update_n_lines = "gsn", -- Update `n_lines`
},
},
},
{
"nvim-mini/mini.comment",
"echasnovski/mini.comment",
enable = true,
},
}

View File

@@ -1,7 +1,20 @@
return {
"obsidian-nvim/obsidian.nvim",
"epwalsh/obsidian.nvim",
version = "*", -- recommended, use latest release instead of latest commit
lazy = true,
ft = "markdown",
-- Replace the above line with this if you only want to load obsidian.nvim for markdown files in your vault:
-- event = {
-- -- If you want to use the home shortcut '~' here you need to call 'vim.fn.expand'.
-- -- E.g. "BufReadPre " .. vim.fn.expand "~" .. "/my-vault/*.md"
-- -- refer to `:h file-pattern` for more examples
-- "BufReadPre path/to/my-vault/*.md",
-- "BufNewFile path/to/my-vault/*.md",
-- },
dependencies = {
-- Required.
"nvim-lua/plenary.nvim",
},
opts = {
workspaces = {
{
@@ -9,61 +22,18 @@ return {
path = "~/Documents/Notes",
},
},
-- Can I enable this somehow? I'm using blink.cmp but this is triggering
-- it to look for nvim-cmp directly.
-- completion = {
-- nvim_cmp = true,
-- min_chars = 2,
-- },
daily_notes = {
-- Optional, if you keep daily notes in a separate directory.
folder = "Daily Notes",
-- Optional, if you want to change the date format for the ID of daily notes.
date_format = "%Y-%m-%d",
-- Optional, if you want to automatically insert a template from your template directory like ''
template = "Daily Note",
template = nil,
},
templates = {
folder = "Templates",
date_format = "%Y-%m-%d",
time_format = "%H:%M",
},
checkbox = {
order = { " ", "x", "/", ">", "~", "!" },
},
ui = {
-- Disable the UI features and let render-markdown.nvim handle it.
enable = false,
},
link = {
style = "wiki",
},
-- Disable the legacy commands and silence the deprecation warning.
legacy_commands = false,
-- Customize how note IDs are generated given an optional title.
---@param title string|?
---@return string
note_id_func = function(title)
if title ~= nil then
-- If title is given, transform it into valid file name by removing most special characters
-- Note that parens are not supported because they interfere with markdown links.
return title:gsub("[^A-Za-z0-9-_]", ""):lower()
else
-- If title is nil, just put the date and four random characters
local suffix = ""
for _ = 1, 4 do
suffix = suffix .. string.char(math.random(65, 90))
end
return os.date("%Y-%m-%d") .. "-" .. suffix
end
end,
},
}

View File

@@ -1,13 +0,0 @@
return {
"salkin-mada/openscad.nvim",
config = function()
vim.g.openscad_load_snippets = true
vim.g.openscad_default_mappings = true
vim.g.openscad_fuzzy_finder = "snacks"
require("openscad")
end,
dependencies = {
-- Can fall back to Snacks instead.
-- "ibhagwan/fzf-lua",
},
}

View File

@@ -1,95 +0,0 @@
return {
-- https://github.com/folke/sidekick.nvim
"folke/sidekick.nvim",
opts = {
cli = {
mux = {
enabled = false, -- I haven't bothered to include tmux yet
backend = "tmux",
},
},
},
keys = {
{
"<tab>",
function()
-- if there is a next edit, jump to it, otherwise apply it if any
if not require("sidekick").nes_jump_or_apply() then
return "<Tab>" -- fallback to normal tab
end
end,
expr = true,
desc = "Goto/Apply Next Edit Suggestion",
},
{
"<c-.>",
function()
require("sidekick.cli").focus()
end,
desc = "Sidekick Focus",
mode = { "n", "t", "i", "x" },
},
{
"<leader>aa",
function()
require("sidekick.cli").toggle()
end,
desc = "Sidekick Toggle CLI",
},
{
"<leader>as",
function()
require("sidekick.cli").select()
end,
-- Or to select only installed tools:
-- require("sidekick.cli").select({ filter = { installed = true } })
desc = "Select CLI",
},
{
"<leader>ad",
function()
require("sidekick.cli").close()
end,
desc = "Detach a CLI Session",
},
{
"<leader>at",
function()
require("sidekick.cli").send({ msg = "{this}" })
end,
mode = { "x", "n" },
desc = "Send This",
},
{
"<leader>af",
function()
require("sidekick.cli").send({ msg = "{file}" })
end,
desc = "Send File",
},
{
"<leader>av",
function()
require("sidekick.cli").send({ msg = "{selection}" })
end,
mode = { "x" },
desc = "Send Visual Selection",
},
{
"<leader>ap",
function()
require("sidekick.cli").prompt()
end,
mode = { "n", "x" },
desc = "Sidekick Select Prompt",
},
-- Example of a keybinding to open Claude directly
-- {
-- "<leader>ac",
-- function()
-- require("sidekick.cli").toggle({ name = "claude", focus = true })
-- end,
-- desc = "Sidekick Toggle Claude",
-- },
},
}

View File

@@ -1,71 +0,0 @@
return {
"folke/snacks.nvim",
opts = function(_, opts)
opts = vim.tbl_deep_extend("force", opts, {
styles = {
notification = {
wo = { wrap = true }, -- wrap notifications
},
},
picker = {
smart = {
-- Remove the "recent" picker so we don't get things from other directories.
multi = { "buffers", "files" },
matcher = {
-- sort even when the search string is empty
sort_empty = true,
-- Enable frecensy for matchers. This puts more common files near the top
frecency = false,
-- Make sure files in the current directory are prioritized
cwd_bonus = true,
-- Give more weight to files that are more recent
history_bonus = true,
-- Give more weight to places where the filename is part of the match
filename_bonus = true,
},
},
sources = {
explorer = {
layout = { layout = { position = "right" } },
},
},
-- This only supports the Kitty graphics protocol.
-- See
-- https://github.com/folke/snacks.nvim/blob/main/docs/image.md
-- https://github.com/obsidian-nvim/obsidian.nvim/wiki/Images
-- image = {
-- resolve = function(path, src)
-- if require("obsidian.api").path_is_note(path) then
-- return require("obsidian.api").resolve_image_path(src)
-- end
-- end,
-- },
},
})
Snacks.toggle({
name = "Color Column",
get = function()
return vim.o.colorcolumn == "80"
end,
set = function(state)
if state then
vim.o.colorcolumn = "80"
vim.cmd([[highlight ColorColumn guibg=#202020]])
else
vim.o.colorcolumn = ""
vim.cmd([[highlight ColorColumn guibg=None]])
end
end,
}):map("<leader>ut", { desc = "Toggle Color Column" })
return opts
end,
keys = {
{
"<leader><space>",
function()
Snacks.picker.smart()
end,
desc = "Smart Find Files",
},
},
}

View File

@@ -0,0 +1,14 @@
return {
"nvim-telescope/telescope.nvim",
enabled = false,
keys = {
-- Switch the default keybind to switch buffers instead of find files
{
"<leader><space>",
"<cmd>Telescope buffers sort_mru=true sort_lastused=true<cr>",
desc = "Open Files",
},
-- Disable the <leader><comma> since it's so hard to type and redundant with the above.
{ "<leader><comma>", false },
},
}

View File

@@ -1,10 +0,0 @@
return {
"folke/tokyonight.nvim",
opts = {
transparent = true,
styles = {
sidebars = "transparent",
-- floats = "transparent",
},
},
}

View File

@@ -1,22 +0,0 @@
return {
"nvim-treesitter/nvim-treesitter",
opts = {
ensure_installed = {
"bash",
"html",
"css",
"javascript",
"json",
"lua",
"markdown",
"markdown_inline",
"python",
"query",
"regex",
"tsx",
"typescript",
"vim",
"yaml",
},
},
}

View File

@@ -6,12 +6,9 @@
vimAlias = true;
defaultEditor = true;
withNodeJs = true;
withRuby = false; # New default as of 26.05, needs explicit change since original config is old.
withPython3 = false; # New default as of 26.05, needs explicit change since original config is old.
extraPackages = with pkgs; [
gcc # For treesitter complation
tree-sitter # For treesitter binaries
ripgrep # Search support
wayclip # Clipboard support
fd # finder for telescope
@@ -20,8 +17,6 @@
wget # LazyVim dep?
sqlite # For Snacks
imagemagick # For image conversion/display
vscode-langservers-extracted # For language servers (it wants this version of eslint for some reason)
copilot-language-server # Enable the copilot language server
];
};

View File

@@ -0,0 +1,10 @@
{ pkgs, ... }:
{
# Enable flakes and nix-commnands.
nix.settings.experimental-features = ["flakes" "nix-command"];
# Allow unfree code
nixpkgs.config = {
allowUnfree = true;
};
}

View File

@@ -1,13 +1,5 @@
{ lib, pkgs, ... }:
{ lib, ... }:
{
home.packages = with pkgs; [
obsidian
];
home.shellAliases = {
"notes" = "(cd ~/Documents/Notes && nvim)";
};
services.syncthing = {
enable = true;
tray = {
@@ -25,7 +17,6 @@
"altair"
"mcp"
"vega"
"proxima"
];
};
};
@@ -57,14 +48,6 @@
];
compression = "always";
};
proxima = {
id = "NWZL6LY-ULJQMZE-EWY3MQU-XPDAFQB-LTIBZV7-GPKIABJ-WBJE36F-SK6LVAY";
name = "Proxima";
addresses = [
"relay://syncthing.blazestar.net:22067"
];
compression = "always";
};
};
options = {
localAnnounceEnabled = false;

View File

@@ -7,7 +7,7 @@
**/
* {
background: #15161ECC;
background: #15161EFF;
background-alt: #1A1B26FF;
foreground: #C0CAF5FF;
selected: #33467CFF;

View File

@@ -1,3 +1,3 @@
configuration {
ssh-command: "foot ssh {host}";
ssh-command: "wezterm ssh {host}";
}

View File

@@ -15,4 +15,4 @@
/* Import color-scheme from `colors` directory */
@import "~/.config/rofi/colors/tokyonight.rasi"
@import "~/.config/rofi/colors/onedark.rasi"

View File

@@ -10,8 +10,8 @@
/*****----- Configuration -----*****/
configuration {
modi: "drun";
show-icons: true;
display-drun: "";
show-icons: true;
display-drun: "";
drun-display-format: "{name}";
}
@@ -32,8 +32,8 @@ window {
enabled: true;
margin: 0px;
padding: 0px;
border: 2px solid;
border-radius: 5px;
border: 0px solid;
border-radius: 0px;
border-color: @selected;
background-color: @background;
cursor: "default";

View File

@@ -15,4 +15,4 @@
/* Import color-scheme from `colors` directory */
@import "~/.config/rofi/colors/tokyonight.rasi"
@import "~/.config/rofi/colors/onedark.rasi"

View File

@@ -11,7 +11,7 @@ dir="${HOME}/.config/rofi/powermenu"
# CMDs
uptime="$(uptime | awk -F ' ' '{print $2}' | sed -e 's/,//g')"
host=$(hostname)
host=`hostname`
# Options
shutdown='󰐥'
@@ -24,98 +24,89 @@ no=''
# Rofi CMD
rofi_cmd() {
rofi -dmenu \
-p "Uptime: $uptime" \
-mesg "Uptime: $uptime" \
-theme ${dir}/style.rasi
rofi -dmenu \
-p "Uptime: $uptime" \
-mesg "Uptime: $uptime" \
-theme ${dir}/style.rasi
}
# Confirmation CMD
confirm_cmd() {
rofi -theme-str 'window {location: center; anchor: center; fullscreen: false; width: 350px;}' \
-theme-str 'mainbox {children: [ "message", "listview" ];}' \
-theme-str 'listview {columns: 2; lines: 1;}' \
-theme-str 'element-text {horizontal-align: 0.5;}' \
-theme-str 'textbox {horizontal-align: 0.5;}' \
-dmenu \
-p 'Confirmation' \
-mesg 'Are you Sure?' \
-theme ${dir}/style.rasi
rofi -theme-str 'window {location: center; anchor: center; fullscreen: false; width: 350px;}' \
-theme-str 'mainbox {children: [ "message", "listview" ];}' \
-theme-str 'listview {columns: 2; lines: 1;}' \
-theme-str 'element-text {horizontal-align: 0.5;}' \
-theme-str 'textbox {horizontal-align: 0.5;}' \
-dmenu \
-p 'Confirmation' \
-mesg 'Are you Sure?' \
-theme ${dir}/style.rasi
}
# Ask for confirmation
confirm_exit() {
echo -e "$yes\n$no" | confirm_cmd
echo -e "$yes\n$no" | confirm_cmd
}
# Pass variables to rofi dmenu
run_rofi() {
echo -e "$lock\n$suspend\n$logout\n$reboot\n$shutdown" | rofi_cmd
echo -e "$lock\n$suspend\n$logout\n$reboot\n$shutdown" | rofi_cmd
}
# Execute Command
run_cmd() {
selected="$(confirm_exit)"
if [[ "$selected" == "$yes" ]]; then
if [[ $1 == '--shutdown' ]]; then
systemctl poweroff
elif [[ $1 == '--reboot' ]]; then
systemctl reboot
elif [[ $1 == '--suspend' ]]; then
mpc -q pause
amixer set Master mute
systemctl suspend
elif [[ $1 == '--logout' ]]; then
hyprctl dispatch 'hl.dsp.exec_cmd("uwsm stop")'
# DESKTOP_SESSION appears to be empty right now. I'm not going
# to bother setting it until I'm using more than one manager.
#
# if [[ "$DESKTOP_SESSION" == 'openbox' ]]; then
# openbox --exit
# elif [[ "$DESKTOP_SESSION" == 'bspwm' ]]; then
# bspc quit
# elif [[ "$DESKTOP_SESSION" == 'i3' ]]; then
# i3-msg exit
# elif [[ "$DESKTOP_SESSION" == 'plasma' ]]; then
# qdbus org.kde.ksmserver /KSMServer logout 0 0 0
# elif [[ "$DESKTOP_SESSION" == 'plasma' ]]; then
# qdbus org.kde.ksmserver /KSMServer logout 0 0 0
# elif [[ "$DESKTOP_SESSION" == 'hyprland-uwsm' ]]; then
# hyprctl dispatch 'exec, uwsm stop'
# elif [[ "$DESKTOP_SESSION" == 'hyprland' ]]; then
# hyprctl dispatch exit
# fi
fi
else
exit 0
fi
selected="$(confirm_exit)"
if [[ "$selected" == "$yes" ]]; then
if [[ $1 == '--shutdown' ]]; then
systemctl poweroff
elif [[ $1 == '--reboot' ]]; then
systemctl reboot
elif [[ $1 == '--suspend' ]]; then
mpc -q pause
amixer set Master mute
systemctl suspend
elif [[ $1 == '--logout' ]]; then
if [[ "$DESKTOP_SESSION" == 'openbox' ]]; then
openbox --exit
elif [[ "$DESKTOP_SESSION" == 'bspwm' ]]; then
bspc quit
elif [[ "$DESKTOP_SESSION" == 'i3' ]]; then
i3-msg exit
elif [[ "$DESKTOP_SESSION" == 'plasma' ]]; then
qdbus org.kde.ksmserver /KSMServer logout 0 0 0
elif [[ "$DESKTOP_SESSION" == 'plasma' ]]; then
qdbus org.kde.ksmserver /KSMServer logout 0 0 0
elif command -v hyprctl &>/dev/null; then
hyprctl dispatch exit
fi
fi
else
exit 0
fi
}
# Actions
chosen="$(run_rofi)"
case ${chosen} in
$shutdown)
run_cmd --shutdown
;;
$reboot)
run_cmd --reboot
;;
$lock)
loginctl lock-session
# if [[ -x '/usr/bin/betterlockscreen' ]]; then
# betterlockscreen -l
# elif [[ -x '/usr/bin/i3lock' ]]; then
# i3lock
# elif command -v hyprlock &>/dev/null; then
# hyprlock
# elif command -v swaylock &>/dev/null; then
# swaylock
# fi
;;
$suspend)
run_cmd --suspend
;;
$logout)
run_cmd --logout
;;
$shutdown)
run_cmd --shutdown
;;
$reboot)
run_cmd --reboot
;;
$lock)
if [[ -x '/usr/bin/betterlockscreen' ]]; then
betterlockscreen -l
elif [[ -x '/usr/bin/i3lock' ]]; then
i3lock
elif command -v hyprlock &>/dev/null; then
hyprlock
fi
;;
$suspend)
run_cmd --suspend
;;
$logout)
run_cmd --logout
;;
esac

View File

@@ -35,8 +35,8 @@ window {
enabled: true;
margin: 0px;
padding: 0px;
border: 2px solid;
border-radius: 5px;
border: 0px solid;
border-radius: 0px;
border-color: @selected;
cursor: "default";
background-color: @background;

View File

@@ -8,11 +8,4 @@
source = ./config;
recursive = true;
};
# TODO: Merge into lua config
# wayland.windowManager.hyprland.settings.windowrule = [
# # Forces the Rofi window to hold focus so that it gets input even if
# # something else opens or the mouse is outside the window.
# "stay_focused on, match:class Rofi"
# ];
}

View File

@@ -2,142 +2,102 @@
{ pkgs, ... }:
{
imports = [
./uutils.nix
];
# These are all the sort of shell commands that we want available whereever
# there is shell. These include just a lot of useful utilities for managing
# a system or working with other shell commands. Packages more specific to
# development can be in development configs.
home.packages = with pkgs; [
# Package management
comma # Runs commands without having to install them
# System
htop
btop
psmisc # fuser, killall, pstree
lsof
neofetch
killall
# Session management
tmux
# Archives
# Files
zip
xz
unzip
p7zip
unrar-wrapper
# File manipulation
file
tree
yazi # File manager
ranger
ueberzugpp # for image previews
w3m # terminal browser for image previews
dysk # better disk info
ripgrep # better grep
fd # Better find
bat # cat with wings
eza # Modern replacement for ls
dust # More intuitive du
dua # Interactive disk usage analyzer
# Networking
dnsutils
inetutils
net-tools
socat
xh
httpie
# devices
usbutils
# Other
jq
mprocs # Manage multiple long-running processes
];
home.shellAliases = {
"p?" = "ps ax | rg";
# Dysk is basically just better.
"df" = "echo 'Do you mean: dysk?'";
"grep" = "echo 'Do you mean: rg?'";
"find" = "echo 'Do you mean: fd'";
"cat" = "bat";
"ls" = "eza";
"http" = "echo 'Do you mean: xh'";
"du" = "echo 'Do you mean: dust or dua?'";
"ranger" = "echo 'Do you mean: yazi'";
"stay-awake" = ''
tmux new-session -d -A -s keep-awake 'systemd-inhibit --who="Drew" --why="Manual keep awake" --what=sleep sleep infinity'
'';
"allow-sleep" = "tmux kill-session -t keep-awake";
"p?" = "ps ax | grep";
};
programs = {
zoxide = {
# TODO: Learn all the capabilities of zoxide and use them.
enable = true;
enableZshIntegration = true;
programs.zsh = {
enable = true;
envExtra = ''
PATH=$PATH:$HOME/.local/bin
GITHUB_USERNAME=periodic
'';
initExtra = ''
# Make ^U work like it does in Bash
bindkey "^U" backward-kill-line
# This doesn't seem to be in the homemanager options
# Makes shells incrementally append history so that new shells have the history of open shells
setopt inc_append_history
'';
history = {
# Do not share history between sessions.
share = false;
};
starship = {
oh-my-zsh = {
enable = true;
settings = {
add_newline = true;
};
};
zsh = {
enable = true;
envExtra = ''
PATH=$PATH:$HOME/.local/bin
GITHUB_USERNAME=periodic
'';
initContent = ''
# Make ^U work like it does in Bash
bindkey "^U" backward-kill-line
# This doesn't seem to be in the homemanager options
# Makes shells incrementally append history so that new shells have the history of open shells
setopt inc_append_history
'';
history = {
# Do not share history between sessions.
share = false;
};
oh-my-zsh = {
enable = true;
plugins = [
"git"
"git-prompt"
"direnv"
"sudo"
];
};
plugins = [
{
name = "zsh-autosuggestions";
src = pkgs.fetchFromGitHub {
owner = "zsh-users";
repo = "zsh-autosuggestions";
rev = "0e810e5afa27acbd074398eefbe28d13005dbc15";
hash = "sha256-85aw9OM2pQPsWklXjuNOzp9El1MsNb+cIiZQVHUzBnk=";
};
}
{
name = "zsh-syntax-highlighting";
src = pkgs.fetchFromGitHub {
owner = "zsh-users";
repo = "zsh-syntax-highlighting";
rev = "5eb677bb0fa9a3e60f0eff031dc13926e093df92";
hash = "sha256-KRsQEDRsJdF7LGOMTZuqfbW6xdV5S38wlgdcCM98Y/Q=";
};
}
"git"
"git-prompt"
"direnv"
"sudo"
];
};
plugins = [
{
name = "zsh-autosuggestions";
src = pkgs.fetchFromGitHub {
owner = "zsh-users";
repo = "zsh-autosuggestions";
rev = "0e810e5afa27acbd074398eefbe28d13005dbc15";
hash = "sha256-85aw9OM2pQPsWklXjuNOzp9El1MsNb+cIiZQVHUzBnk=";
};
}
{
name = "zsh-syntax-highlighting";
src = pkgs.fetchFromGitHub {
owner = "zsh-users";
repo = "zsh-syntax-highlighting";
rev = "5eb677bb0fa9a3e60f0eff031dc13926e093df92";
hash = "sha256-KRsQEDRsJdF7LGOMTZuqfbW6xdV5S38wlgdcCM98Y/Q=";
};
}
];
};
programs.starship = {
enable = true;
settings = {
add_newline = true;
};
};
}

View File

@@ -3,13 +3,13 @@
programs.ssh = {
enable = true;
# Automatically add keys to agent when used
# Other options are "no" and "confirm"
addKeysToAgent = "yes";
matchBlocks = {
"mcp.haven" = {
user = "drew";
# Automatically add keys to agent when used
# Other options are "no" and "confirm"
addKeysToAgent = "yes";
};
};
};

View File

@@ -1,154 +0,0 @@
{
config,
lib,
...
}:
{
imports = [
./swaync.nix
./swaylock.nix
];
services.swayosd = {
enable = true;
topMargin = 0.7;
};
# Enable sway config generation for home.pointerCursor
home.pointerCursor.sway.enable = true;
wayland.windowManager.sway = {
enable = true;
extraOptions = [
# Required for NVIDIA GPUs
"--unsupported-gpu"
];
checkConfig = true;
systemd = {
enable = true;
xdgAutostart = true;
};
config = {
# Workspace assignments
# Example:
# {
# "1: web" = [{ class = "^Firefox$"; }];
# "0: extra" = [{ class = "^Firefox$"; window_role = "About"; }];
# }
assigns = { };
colors = {
background = "#333333";
focused = {
background = "#285577";
border = "#4c7899";
childBorder = "#285577";
indicator = "#2e9ef4";
text = "#ffffff";
};
focusedInactive = {
background = "#5f676a";
border = "#333333";
childBorder = "#5f676a";
indicator = "#484e50";
text = "#ffffff";
};
placeholder = {
background = "#0c0c0c";
border = "#000000";
childBorder = "#0c0c0c";
indicator = "#000000";
text = "#ffffff";
};
unfocused = {
background = "#222222";
border = "#333333";
childBorder = "#222222";
indicator = "#292d2e";
text = "#888888";
};
urgent = {
background = "#900000";
border = "#2f343a";
childBorder = "#900000";
indicator = "#900000";
text = "#ffffff";
};
};
modifier = "Mod4"; # Super key
keybindings =
let
modifier = config.wayland.windowManager.sway.config.modifier;
terminal = "foot";
browser = "firefox";
menu = "rofi -show drun";
in
lib.mkOptionDefault {
"${modifier}+t" = "exec ${terminal}";
"${modifier}+b" = "exec ${browser}";
"${modifier}+d" = "exec ${menu}";
"${modifier}+Shift+s" = "exec hyprshot -m region --clipboard-only";
"${modifier}+c" = "exec swaync-client -t";
"${modifier}+Control+q" = "exec /home/drew/.config/rofi/powermenu/powermenu.sh";
"${modifier}+x" = "exec /home/drew/.config/rofi/powermenu/powermenu.sh";
"${modifier}+f" = "floating toggle";
"${modifier}+Shift+f" = "fullscreen toggle";
"${modifier}+r" = "focus output right"; # sway does not have `focusmonitor next`
"${modifier}+Control+r" = "move workspace to output left";
"${modifier}+Control+s" = "move workspace to output right";
"${modifier}+q" = "kill";
"${modifier}+Left" = "focus left";
"${modifier}+Right" = "focus right";
"${modifier}+Up" = "focus up";
"${modifier}+Down" = "focus down";
"${modifier}+Shift+Left" = "move left";
"${modifier}+Shift+Right" = "move right";
"${modifier}+Shift+Up" = "move up";
"${modifier}+Shift+Down" = "move down";
# Workspace switching
"${modifier}+1" = "workspace number 1";
"${modifier}+2" = "workspace number 2";
"${modifier}+3" = "workspace number 3";
"${modifier}+4" = "workspace number 4";
"${modifier}+5" = "workspace number 5";
"${modifier}+6" = "workspace number 6";
"${modifier}+7" = "workspace number 7";
"${modifier}+8" = "workspace number 8";
"${modifier}+9" = "workspace number 9";
"${modifier}+0" = "workspace number 10";
"${modifier}+Shift+1" = "move container to workspace number 1; workspace number 1";
"${modifier}+Shift+2" = "move container to workspace number 2; workspace number 2";
"${modifier}+Shift+3" = "move container to workspace number 3; workspace number 3";
"${modifier}+Shift+4" = "move container to workspace number 4; workspace number 4";
"${modifier}+Shift+5" = "move container to workspace number 5; workspace number 5";
"${modifier}+Shift+6" = "move container to workspace number 6; workspace number 6";
"${modifier}+Shift+7" = "move container to workspace number 7; workspace number 7";
"${modifier}+Shift+8" = "move container to workspace number 8; workspace number 8";
"${modifier}+Shift+9" = "move container to workspace number 9; workspace number 9";
"${modifier}+Shift+0" = "move container to workspace number 10; workspace number 10";
"${modifier}+Shift+r" = "move container to output left"; # approximating hyprland\u2019s split-changemonitor
"${modifier}+button1" = "move";
"${modifier}+button2" = "resize";
"XF86AudioRaiseVolume" = "exec swayosd-client --output-volume raise";
"XF86AudioLowerVolume" = "exec swayosd-client --output-volume lower";
"XF86AudioMute" = "exec swayosd-client --output-volume mute-toggle";
"XF86AudioMicMute" = "exec swayosd-client --input-volume mute-toggle";
"XF86AudioNext" = "exec playerctl next";
"XF86AudioPause" = "exec playerctl play-pause";
"XF86AudioPlay" = "exec playerctl play-pause";
"XF86AudioPrev" = "exec playerctl previous";
};
};
};
}

View File

@@ -1,37 +0,0 @@
{ pkgs, ... }:
{
programs.swaylock = {
enable = true;
package = pkgs.swaylock-effects;
settings = {
clock = true;
indicator = true;
effect-pixelate = 20;
};
};
home.file.".config/swaylock/swaylock.sh" = {
executable = true;
# A script that will take the wallpaper folder for each monitor (see
# wallpaper.nix) and use a random image as the background on each monitor.
text = ''
#!/usr/bin/env sh
wallpaper_dir="$HOME/Pictures/Wallpaper"
cmd="swaylock"
for monitor in $(hyprctl monitors | awk '/^Monitor/ { print $2 }'); do
dir="$wallpaper_dir/$monitor"
if [ -d "$dir" ]; then
image=$(find "$dir" -type f | shuf -n 1)
if [ -n "$image" ]; then
cmd="$cmd --image \"$monitor:$image\""
fi
fi
done
# Eval to handle the quoted image paths correctly
eval $cmd
'';
};
}

View File

@@ -1,98 +0,0 @@
{ ... }:
{
services.swaync = {
enable = true;
settings = {
"positionX" = "right";
"positionY" = "top";
"layer" = "overlay";
"control-center-layer" = "top";
"layer-shell" = true;
"cssPriority" = "application";
"control-center-margin-top" = 0;
"control-center-margin-bottom" = 0;
"control-center-margin-right" = 0;
"control-center-margin-left" = 0;
"notification-2fa-action" = true;
"notification-inline-replies" = false;
"notification-icon-size" = 64;
"notification-body-image-height" = 100;
"notification-body-image-width" = 200;
"timeout" = 10;
"timeout-low" = 5;
"timeout-critical" = 0;
"fit-to-screen" = true;
"relative-timestamps" = true;
"control-center-width" = 500;
"control-center-height" = 600;
"notification-window-width" = 500;
"keyboard-shortcuts" = true;
"image-visibility" = "when-available";
"transition-time" = 200;
"hide-on-clear" = false;
"hide-on-action" = true;
"script-fail-notify" = true;
"scripts" = {
"example-script" = {
"exec" = "echo 'Do something...'";
"urgency" = "Normal";
};
"example-action-script" = {
"exec" = "echo 'Do something actionable!'";
"urgency" = "Normal";
"run-on" = "action";
};
};
"notification-visibility" = {
"example-name" = {
"state" = "muted";
"urgency" = "Low";
"app-name" = "Spotify";
};
};
"widgets" = [
"inhibitors"
"title"
"dnd"
"notifications"
];
"widget-config" = {
"inhibitors" = {
"text" = "Inhibitors";
"button-text" = "Clear All";
"clear-all-button" = true;
};
"title" = {
"text" = "Notifications";
"clear-all-button" = true;
"button-text" = "Clear All";
};
"dnd" = {
"text" = "Do Not Disturb";
};
"label" = {
"max-lines" = 5;
"text" = "Label Text";
};
"mpris" = {
"image-size" = 96;
"image-radius" = 12;
};
"buttons-grid" = {
"actions" = [
{
"label" = "";
"type" = "toggle";
"active" = true;
"command" =
"sh -c '[[ $SWAYNC_TOGGLE_STATE == true ]] && nmcli radio wifi on || nmcli radio wifi off'";
"update_command" = "sh -c '[[ $(nmcli radio wifi) == \"enabled\" ]] && echo true || echo false'";
}
];
};
};
};
};
}

View File

@@ -4,16 +4,9 @@
home.packages = with pkgs; [
# Font
# 24.11
# inconsolata-nerdfont
# fira-code-nerdfont
# 25.05
nerd-fonts.inconsolata
nerd-fonts.fira-code
nerd-fonts.jetbrains-mono
libsixel # For working with images in terminals
ueberzugpp # for image previews
];
# Allow Home Manager to set fonts.
@@ -44,45 +37,6 @@
};
home.shellAliases = {
"imgcat" = "img2sixel";
};
programs.foot = {
enable = true;
settings = {
main = {
font = "FiraCode Nerd Font:size=12";
selection-target = "primary";
pad = "8x8";
};
scrollback = {
lines = 5000;
};
colors-dark = {
alpha = 0.9;
# Tokionight Night theme
# From https://codeberg.org/dnkl/foot/src/branch/master/themes/tokyonight-night
background = "1a1b26";
foreground = "c0caf5";
regular0 = "15161E";
regular1 = "f7768e";
regular2 = "9ece6a";
regular3 = "e0af68";
regular4 = "7aa2f7";
regular5 = "bb9af7";
regular6 = "7dcfff";
regular7 = "a9b1d6";
bright0 = "414868";
bright1 = "f7768e";
bright2 = "9ece6a";
bright3 = "e0af68";
bright4 = "7aa2f7";
bright5 = "bb9af7";
bright6 = "7dcfff";
bright7 = "c0caf5";
};
};
"imgcat" = "wezterm imgcat";
};
}

View File

@@ -1,7 +0,0 @@
{ pkgs, lib, ... }:
{
home.packages = with pkgs; [
# Use uutils core-utils with no prefix so they override the GNU coreutils
(lib.hiPrio uutils-coreutils-noprefix)
];
}

View File

@@ -0,0 +1,15 @@
monitors:
{ ... }:
{
wayland.windowManager.hyprland.settings.exec-once = [
"wpaperd"
];
programs.wpaperd = {
enable = true;
settings = builtins.listToAttrs (map (mon: {
name = mon;
value = { path = "~/Pictures/Wallpaper/${mon}"; };
}) monitors);
};
}

View File

@@ -1,26 +0,0 @@
{ config }:
{
# NOTE: Wpaperd displays wallpaper upside-down on 90´ ccw rotated
# monitors as of 26.05
services.wpaperd = {
enable = true;
settings =
builtins.listToAttrs (
map (mon: {
name = mon;
value = {
# Each monitor gets a folder under wallpaper that
# containes the current images.
path = "~/Pictures/Wallpaper/${mon}";
};
}) (builtins.attrNames config.hardware.monitors)
)
// {
default = {
duration = "1h";
mode = "center";
sorting = "random";
};
};
};
}

View File

@@ -1,100 +0,0 @@
{ lib, config, ... }:
{
options =
with lib;
with types;
{
hardware.monitors = mkOption {
type = lazyAttrsOf (submodule {
options = {
mode = mkOption {
type = str;
default = "auto";
};
position = mkOption {
type = str;
default = "auto";
};
rotation = mkOption {
type = enum [
"none"
"90"
"180"
"270"
];
default = "none";
};
flipped = mkOption {
type = bool;
default = false;
};
};
});
default = { };
description = "Monitor configuration";
};
};
# config = {
# xdg.configFile."hypr/monitors.lua" = lib.mkIf config.wayland.windowManager.hyprland.enable {
# text =
# let
# workspaceSettings = (
# lib.imap0 (
# idx:
# { name, value }:
# let
# offset = idx * 10;
# in
# lib.concatMapStrings (
# i:
# let
# ws = offset + i;
# in
# ''
# hl.workspace_rule({ workspace = ${toString ws}, monitor = "${name}", default_name = "${toString i}" })
# ''
# ) (lib.range 1 10)
# ) (lib.attrsToList config.hardware.monitors)
# );
# transformMap = {
# "none" = {
# normal = 0;
# flipped = 4;
# };
# "90" = {
# normal = 1;
# flipped = 5;
# };
# "180" = {
# normal = 2;
# flipped = 6;
# };
# "270" = {
# normal = 3;
# flipped = 7;
# };
# };
#
# monitorTransform =
# m:
# let
# t = transformMap.${m.rotation};
# in
# if m.flipped then t.flipped else t.normal;
#
# monitorString = name: m: ''
# hl.monitor({
# output = "${name}",
# mode = "${m.mode}",
# position = "${m.position}",
# transform = ${toString (monitorTransform m)},
# })
# '';
#
# monitorSettings = lib.mapAttrsToList monitorString config.hardware.monitors;
# in
# lib.concatStringsSep "\n" (workspaceSettings ++ monitorSettings);
# };
# };
}

View File

@@ -1,3 +0,0 @@
{
inherit (import ./electron.nix) electronDesktopEntry;
}

View File

@@ -1,9 +0,0 @@
{
# Adds extra arguments to avoid flickering under wayland.
electronDesktopEntry =
desktop:
desktop
// {
exec = "${desktop.exec} --enable-features=UseOzonePlatform --ozone-platform=wayland --disable-gpu";
};
}

View File

@@ -1,64 +1,35 @@
gitea:
db_password: ENC[AES256_GCM,data:12FYMsc8HdTMdPegoPLCidaHMMU=,iv:Uat0g7Nvota1yvj6InIAo7Dzv3cBtVVzlRa1d09gx1s=,tag:sFavpAHW0k/Fv1uzPVuGcA==,type:str]
registration_token: ENC[AES256_GCM,data:zYfFATOuqACrGUyt6xPhiisz293uomKc6BLPKz8I+MFFBrBdzT9FqA==,iv:gyp2WsUHMMrNBmssWGPLSJmZqlAtopc6HeAtX9+oCXs=,tag:mLEPTapn7OM3bm5c9TKB0A==,type:str]
gitea_db_password: ENC[AES256_GCM,data:G2YqiDk0msBRjUJkoPxWmayQ9dI=,iv:FsojIJIi61K7rD2VULDgIx6uSYX3iDiA6W744HlgHl0=,tag:BlmsM7LZHnBCKtfuqlhoKA==,type:str]
bookstack_app_key: ENC[AES256_GCM,data:N79JVlQSoVCXOsIHCxd19HFm6LkrYyXQu/xWenEdUlQWqwZEi3PuHXG7fQgvzQY4KI7S,iv:cd2l2eOv+wAJ5sih3YhHgQTdy1qrvaIsoHcywOnHuYM=,tag:5QvCHlQX8wUz3tI2NXl+8A==,type:str]
bookstack_db: ENC[AES256_GCM,data:m8fGgAfmJu1rEaxmTVH4FfBhyiU=,iv:OnBT/6sp9zmcJ1+kBmdmvaE630hifxBpvKnu3XrVXcE=,tag:SSVQcYkAymlbFOnf0MB6KA==,type:str]
mariadb_root_password: ENC[AES256_GCM,data:p965ZhFQqqX+Ub1yhgklVYlBH6A=,iv:qC5WwTvZGvlbAkYiv35xHizMYAnP0V0Vw79EkvL32wQ=,tag:gOJQvHeOC9turFKOMQ9DNg==,type:str]
openproject:
secret-key-base: ENC[AES256_GCM,data:luTuUtxL/SGx6O10y9cRiAzJHw==,iv:8qVJm+obsHr9eV0h+jdpsreeFGxEM+UFZHHiIUUPs6w=,tag:+zpjhKoIiNNSSYxe1QkQ7Q==,type:str]
focalboard:
database: ENC[AES256_GCM,data:GDxYdkVV+tl3qHxWMMoetmMnLnY=,iv:JujgNPyUEHCmD/yW3UKCTj9GTk9a7EkvUiyFLF4sF8A=,tag:46YZ7AthpiiaX69aN9a3Bg==,type:str]
offen:
secret: ENC[AES256_GCM,data:sH2siPc/QH1O2M7ZlJwqhqlHRIeLIG9r,iv:eD29ALx2ji0rm1t9j6RulTZT3f6VLK7dxpPOze3qDKA=,tag:zqJTgT2UeA/ecBS4VremUw==,type:str]
smtp-token: ENC[AES256_GCM,data:ZTfe65g3JykPvG2l0AN8UQ==,iv:GTruGo/vcP+imfJyqB3NX9ic8dz5jvTEh6SF+OeqMDM=,tag:kgwd59pG/WUt8OAaVzi39Q==,type:str]
traefik:
oauth2-client-secret: ENC[AES256_GCM,data:p7/6OsN2ytBj8mQiK0YL7J6NYLtMHOXIIs/6+bIDpsU=,iv:k6jLZifJEFLYKSFMkyn/kA7iBE+EFB8O/3/3fyTh1SY=,tag:6s49O2+tdlZoXyAGEamuMQ==,type:str]
oauth2-plugin-secret: ENC[AES256_GCM,data:sArqwKHAdW35o5kD7DGfXSYCXFUXqvKQdoVnXutsNLw=,iv:qWf597QS3BqkVQkeAb99HbpDB0kUhdD+qKdpUPZEB0o=,tag:vXnb93npaklItWkMZ+/M9Q==,type:str]
protonvpn:
private_key: ENC[AES256_GCM,data:41pfbR1klj1F24v3HlCCA4ofW2sCEnyE5TH8iX4Ug8D+kmwstTaj5RG2Zz8=,iv:P6XyQnDVoOmdkP8ilBR9DyfqPZA6GsQ6VUwY/tSGhx4=,tag:Bzgdv29lbk/gYlADPZMGVA==,type:str]
deploy-key:
mcp: ENC[AES256_GCM,data:eQcX8xdz5qZ6nU8ISOvZo+ZtP4Z/ePd+/ZZReX1BKvTUqGQPPFxConbLMwFzvzpD6xAUbA1MLkcR/bT98QbNx6LJYlhbofuDUg2DI79RB0fcrAcj/wUV0YPhmgofUdYYDaimH5A2PSvtmKfB3CtKKuA5HNeLymoXeLEpFzbckkGhzPee/CHiUmxayogp6za6btsDJsiT8hdHbrzyD2S6fhMJrzX+PlRzT32M/6eaFuFWE8EUO1gbkRlNfKPXw/EM2GXWJfR4qXfN2YKIKigqrtlAAoxnrUbp5EBrn/hGHS2ZYZXeRUFr3avFjcI0bLX423PWRHAylfQCPxgYVEtbcRv11CAFmq4rfFl0ZdvnAKbTLNmWcrQNijBATZPaAdQzgKPDHs8pwPUFR9Tcg8pZNbzw0mK9kPolniAOL2PBKUHv6LP/uEkB1E6Pxc7yms0kGpeJyo7hrFVOiVAckCey+SI9dpbJMSB3md070I1xk6Ik7PywrWh2QDeUtOU1U28UkYgnJ/9MJelWsNlUX9SR,iv:oCNeanaV/7UZ3dhmq4ZmJUZ5hb61AnHpHCfskM2Jsm8=,tag:F2uJKN5beM/rfiBMSyUP7w==,type:str]
matrix:
syncv3:
db-password: ENC[AES256_GCM,data:N/IO0k/2BZpmaDTbKZmSgZNzmdk=,iv:p0jGjJ9mTCh5FPM/Oe1vxusYvlyg14UeggE5ynpDVL8=,tag:tZbddwxJf6wSH6L1QRUQVg==,type:str]
secret: ENC[AES256_GCM,data:KZjYxjUxGgkY1I5jGF7XMEhkHK+khDaQzxugoKxpLsROmVs722tFfbUAxhp71llam55gy9+eUWGxIPlmvOySlw==,iv:OoThGcT08Z11kpnAMQ7w59wj5JheNFGEk1jfFENsmy0=,tag:8EeKT7dh2/a52Amf6LsL1w==,type:str]
blazestar-registration-token: ENC[AES256_GCM,data:TB3bR+E4H4c2l9pRcEOAZr35+vBVaJUcuCs9K0Pjd0aW+M35x5LgZ8+F99Y=,iv:e28sie6LSI5UX41BPb+yN+3n+Yw9Ssfsqe4zppwbPkU=,tag:cQPgZcRFbYSiZnmPVtZxHg==,type:str]
tandoor:
secret_key: ENC[AES256_GCM,data:nl7S2fS1wENrT5k2iZfLEAGc99lCUktgwR5L5KklF69BNVKQkW1rUgb3aIv50VpXZa+3OxV/vdPmG9NhKMy96I5+Dno=,iv:FFyGQBARz0B5zrONZELzUMsOIn8TWrDNTKGsAHPlS7w=,tag:/c4MnDfLXQpBZDqVxZ0DTg==,type:str]
immich:
database: ENC[AES256_GCM,data:1fjOQsLZcq/T+r+AkzomWwCQWw==,iv:c4pn2rC+3xkxLJ7uAdhnTE6zVTRQkfuKK3tjUyDhfAw=,tag:kvk7DOv6X/+RDxfPxVak7w==,type:str]
searxng:
secret: ENC[AES256_GCM,data:Dg/6TAKY7fyhw8LJ6E4ZYN85zs/ItcetCYHETFbOMvHkGsflE3ngQNyIPVY=,iv:z3y2vXjJWCGhXYjfj963Nhiw6K0i/M8bVvwO/L3zgzk=,tag:yO9NtYMLjSazHQmToSR3fA==,type:str]
sops:
kms: []
gcp_kms: []
azure_kv: []
hc_vault: []
age:
- enc: |
- recipient: age1yvdzvuvu5wqztcx6ll2xk6x547uuyqy735tjjdd7zftkz53jsf9qf5ahue
enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBVZnYrVnR1MlBjdzFpQnVi
RXFUcEN2N0Zoc2ZUUnprdXc0aElFaXU5c1VBCkxxcGd4QUhOaTl4K0paOTZ3d2Ez
Vks4blZLUVZPaklhQlE3WWhVelRFUEkKLS0tIGs2dU44NFdOVm41QXVJbHNkQTVo
b2NVRnVFNmF6a2hjRE9OOUxVMGpjSWcKA6Do+oddwMjc2XNJUCeGXY985gJZ4f2v
Dyo0/Oyuwz1jFMrjLmnmnmtyn079mT9wsm28KlaEEvzDIxOBnLjx6A==
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBiL3FoUWN1NWlDQTAvRkFM
TkdCMWVXYThIYVZFSlVEVmxUb1JuQmpESWtrClFlTVlHdGhndFJjUWxUMVFybGtn
bEpJNkFSVnpueXlvR0NkbU90RkZoTzAKLS0tIHdTTnRteWRNbW9MVmdKSVJLeWxB
Zkpxc1lLNVFSUFA2NTJUS0UrOXJCWXMKOuZmbFBdjPIcIUUWHHfGl8TD+HIRa9Hj
Eykvc7Iv5zl61kuJRorE7DWWS1I2C586c+MZtNo6GPQxUasxWRRgJQ==
-----END AGE ENCRYPTED FILE-----
recipient: age1dstsz5g4qthwt2sssu5wp787ku7rnfqm02mqaefsaueswhvqzpmsyft4p4
- enc: |
- recipient: age1jrk4h7x4qzhr6z5m4d099mlfyjc4n5n9s52r4gfsdz0slnqlqa9sss735v
enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBKeGhvQWp6WWx6N1JDdm1J
UWlWZTV5ellMd2ZIRWpkRnJDT2s4UVZJMEM4Cll2MnVNTnFWYit2bHpCVzcwbysy
NkxtMUZFcDJnb3Z1TmlTWDJLNVJ4cnMKLS0tIHdqVXB1U2xVdEtlY3BsemFIcXlC
OHlxaytJTWlNSFRCd2dDaFVsUU1CbUkKp7J+mDnGFS9upV6QWi40ptG85+UZ5y1G
9ic/sQEMHQe9VeAutVz1GPYWbF3Vt5iawXmtVxN+zx/bLAYGglv5yg==
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBZck5tK3p6blhxZWp5YkNF
b3lnMWI1dHBnQzlDOG05c0YyZlZDTzA5V2pvCis3N1BhNXlmamRFci9wWTBuRWFv
cC9kdWV3RnpFWTFVRVEwaTVWQVdnZE0KLS0tIEhOTzExRzRLaGdKOTRwRmNXcW5P
by9aNFY4dXNxaWxnTXFTQS9reHhuQWMKh5rZ93nFtBV9EpFVRp+E+GXZ6xzVy2Jw
vFh4deGcAb60q4odSaeWfk1Dr7L9Ua69oK9omjbCNUt+P7Kwlfca7Q==
-----END AGE ENCRYPTED FILE-----
recipient: age1yvdzvuvu5wqztcx6ll2xk6x547uuyqy735tjjdd7zftkz53jsf9qf5ahue
- enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBkM0RRaFhGKytkSjNMU3cy
d1dlcms4TVMzU2xsSHBqcDJWQTdCU1dZcERJCktHRVZiWkZrbzk4QXRNSmpyY25X
ZUdOS2pSOVpITExpVVFyc1A3QTBDTGsKLS0tIDM4NFd1eWtZSnR4d0tLUnRFYmJW
QlE3cFYxUXNVam1aMlJEVTRGV2xsN1kKXMeSXiEdXyb6c+dcxX3G/Q+s78lfi90g
dvKJPDYvGb/8JXSkZNkLlWvHEVnsAJ1mJFb1idenYzeQvJlsX07rYA==
-----END AGE ENCRYPTED FILE-----
recipient: age1jrk4h7x4qzhr6z5m4d099mlfyjc4n5n9s52r4gfsdz0slnqlqa9sss735v
lastmodified: "2026-07-21T02:59:55Z"
mac: ENC[AES256_GCM,data:0v26ceptPmbVdee70AOMdZHOarPDRuxKi+QP3Ci+wyJQJdQVriKKUnN3Zv/MKjZ3Sg2M/C5XtsdhGwXJpPsfwdDhWIRip6UYWXIKkVyZcxOs6E2zlK3xCAk/eTKhAsmL7Y6yFV+hpYwlT/hFnzOHXt1xbxGVJiKnO98OH0+6hnk=,iv:f94wd227bM0SniUuY+CFg2deEfITzUGTGwDA/WQJhms=,tag:M0r4Vg480wWWYPH3PBB7qg==,type:str]
lastmodified: "2025-04-03T19:04:17Z"
mac: ENC[AES256_GCM,data:DEUuXrCl3OXJ9NbfLoxHIND5+m7enHNDbuLE2jS8nvZCpKm83YoXwp0RhIFA725wJnBej26HLkovCi7V/4s5NrrfT9sPHGNBMSHB0AAcwu3Dmo6G2PBKvAWZTxXmiIXGx8vSvWNbLrp3vTV8jjTpfbuMvOiuxayKfn6esKI9T2o=,iv:zUfbL753Uvzg6WW4kwI8swmpWHIQ/IpCyYSsLptVDG4=,tag:XZy8jNZYYcqspd6zptH3pQ==,type:str]
pgp: []
unencrypted_suffix: _unencrypted
version: 3.13.1
version: 3.9.4

View File

@@ -1,26 +0,0 @@
webhook:
deploy-key: ENC[AES256_GCM,data:Gd+cCNmWI/SCab8dnXnWxXFTT7EBAi9LTJVLVF/+ouCn7dI5LE0Ndwq8KVadNEbDPE3LFXAgylpzRIJawWd5saAXPAw5HtrcBgGZDN9ehebAPWNzrGpy4pVgwak6ByQ04Y13PaBK9vG8OR3wG8yQqcZLrdk5TWdYPZ8Q2mdcl3hgItEJMBuOeYMBFiMyBdvbYPQixi9dF21owBjHQr5oZjWzDAS3V+X46Qgq5LYLr74BSYpBQzs/yEOi9CV4H39hdYmFyyPzgSiJljnH2E56iahScQfuQuwqHHdtHGmLYz9CxnHnUGvdzqC8PCu8T8zUuq8qwtbF6+UVISYwhjWmNLq7zUTabLhFjafqQcqdd9PcMMoNhSNQsTVfM0vYrpdfiot3u5AD7HGrORY1WWE71i8CQ7ETO28gsfJB8fWX7s+/FNFNau6fcMw1TCkt+qhnon5zS/OwmFG4596vCTyQ0CVCnHeQDiaqdexJVrVS7w1gROrI266fBPLH0yaSri/ps72A,iv:itchCa14rgALz5Gurm9dh+nWvz0pGi0EFtUlF+Jh3pU=,tag:ucrpJbZmPf9z5x5bHUXnRQ==,type:str]
sops:
age:
- recipient: age1dstsz5g4qthwt2sssu5wp787ku7rnfqm02mqaefsaueswhvqzpmsyft4p4
enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB2ellCLzVCdmFtN0grU3FO
Y3BEOW53ejVZZjlYWFNmOG4yUHB5MUV2UUhzCnZ6UTQ2VXVXZFp4MzgzRE1xdGJk
Z0VrTytJeXdQYzFCbkFHUWFVSXA5ZjAKLS0tIEo4UjJvMGlxcjdEcFBhYXNlMEli
MysyWkdHZ09lV29mMnJoUnRTNVU4bXMKSkL3VBnBTqrLpG3fuiDTCPNZTFWZbJEW
VLwB6g/K3b573MgfXGCCPs9nwdDurqpz0zxB4pEBl0N6fU2CwqAxqQ==
-----END AGE ENCRYPTED FILE-----
- recipient: age1jrk4h7x4qzhr6z5m4d099mlfyjc4n5n9s52r4gfsdz0slnqlqa9sss735v
enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBwWDJZQ2ZESkltQjFHRHpI
cXU0WFo1aFJrT2VTNlFTY2s5T0gxSWRoa0F3Ck9tVnFtZ3c4T0tWQTNhYXRrU3Ri
dFRrcWp3VnRPRDc5Y3JZZ1U1SDNSbXMKLS0tIFFqMUdNU3VFODhMdmJZN0ZuZGgz
Z2JFS25iM3YvaVh0L3JkRk5DODZwZzgKg8C2kboc7EojVva+8KWW+pVhSbovwHp9
noZ68vZ8NxsBP3CNFBBN1xKT7gQduShUcmSQUQizZ6fxtxO+GLy4Pg==
-----END AGE ENCRYPTED FILE-----
lastmodified: "2026-05-18T22:16:11Z"
mac: ENC[AES256_GCM,data:+/cn2b06HsQ23UL4YyTa51eepBelypcfBCVrG9a6HWhuX0KMpi9bn55IuZ6VbyN2uGc5+yCJcQBtAPm4+Mdi9UdGAWoePYIvQwu6ct12xIOLBF4P7eDRwjlWykANF9/jWFoPfd/hu+LiM2Ow09RTZTnExgAjYiCrq7YJRTrjIfU=,iv:ODluo/RXmSu7PzzXS/ZnFNMzUOjcrCpkzHoAviCNDUU=,tag:2LW9hIP6dq23/coQbTLOww==,type:str]
unencrypted_suffix: _unencrypted
version: 3.12.1

View File

@@ -1,4 +0,0 @@
{ ... }:
{
users.users.drew.extraGroups = [ "adbusers" ];
}

View File

@@ -1,12 +0,0 @@
{ pkgs, ... }:
{
programs.appimage = {
enable = true;
binfmt = true;
package = pkgs.appimage-run.override {
extraPkgs = pkgs: [
pkgs.icu
];
};
};
}

View File

@@ -1,22 +0,0 @@
{ ... }:
{
# RealtimeKit hands out realtime scheduling priority to user processes on
# demand, e.g. audio
security.rtkit.enable = true;
# Enable sound with pipewire.
services.pulseaudio = {
enable = false;
daemon.config = {
exit-idle-time = -1;
};
};
services.pipewire = {
enable = true;
alsa.enable = true;
alsa.support32Bit = true;
pulse.enable = true;
# If you want to use JACK applications, uncomment this
#jack.enable = true;
};
}

View File

@@ -1,10 +0,0 @@
{ pkgs, ... }:
{
# Enable bluetooth.
hardware.bluetooth.enable = true;
# Install the management service and packages.
environment.systemPackages = with pkgs; [
bluez
];
}

View File

@@ -1,29 +0,0 @@
{ ... }:
{
virtualisation = {
docker = {
enable = true;
# rootless = {
# enable = true;
# setSocketVariable = true;
# };
};
# Do not use Podman in Wayland/Hyperland. It will crash the session. Very annoying.
# podman.enable = true;
};
hardware.nvidia-container-toolkit.enable = true;
home-manager.users.drew =
{ ... }:
{
# Add the path to the docker socket to the environment.
programs.zsh.envExtra = ''
export DOCKER_HOST=unix://$XDG_RUNTIME_DIR/docker.sock
'';
};
# add me to the docker group so I can access it.
users.users.drew.extraGroups = [ "docker" ];
}

View File

@@ -1,12 +0,0 @@
{ pkgs, ... }:
{
services.flatpak.enable = true;
systemd.services.flatpak-repo = {
wantedBy = [ "multi-user.target" ];
path = [ pkgs.flatpak ];
script = ''
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
'';
};
}

View File

@@ -1,9 +0,0 @@
_: {
# Automatic
nix.gc = {
automatic = true;
dates = "weekly";
persistent = true;
options = "--delete-older-than 30d";
};
}

View File

@@ -1,50 +0,0 @@
{ config, lib, ... }:
{
options =
with lib;
with types;
{
graphics = {
enable = mkEnableOption "graphics support";
driverChannel = mkOption {
type = str;
# Default to production because I often want new features, but I don't want bleeding edge.
default = "production";
description = "Driver channel to use (in order of oldest to newest): stable, beta, latest";
};
};
};
config = lib.mkIf config.graphics.enable {
# Graphics settings
hardware.graphics = {
enable = true;
enable32Bit = true;
};
services.xserver.videoDrivers = [ "nvidia" ];
hardware.nvidia = {
package = config.boot.kernelPackages.nvidiaPackages."${config.graphics.driverChannel}";
modesetting.enable = true;
# Nvidia power management. Experimental, and can cause sleep/suspend to fail.
# Enable this if you have graphical corruption issues or application crashes after waking
# up from sleep. This fixes it by saving the entire VRAM memory to /tmp/ instead
# of just the bare essentials.
powerManagement.enable = true;
# Fine-grained power management for PRIME. Turns off GPU when not in use.
# Experimental and only works on modern Nvidia GPUs (Turing or newer).
# Requires offload to be enabled.
# powerManagement.finegrained = false;
# Use the open-source driver?
open = false;
# Enable the nvidia-settings menu?
nvidiaSettings = true;
};
};
}

View File

@@ -1,46 +0,0 @@
{ ... }:
{
# Enable the X11 windowing system and a display manager
services.xserver = {
enable = true;
# displayManager.sddm = {
# enable = true;
# wayland.enable = true;
# };
# Configure keymap in X11
xkb = {
layout = "us";
variant = "";
};
};
# services.displayManager.gdm = {
# enable = true;
# };
services.displayManager.ly = {
enable = true;
# See https://github.com/S41G0N/ly/blob/master/res/config.ini
settings = {
animation = "matrix"; # matrix|doom|none
bigclock = "en";
clear_password = true; # erase the password on failure
clock = "%c"; # Show the clock
};
};
# Enable Hyprland so it shows up in the menu
programs.hyprland = {
enable = true;
withUWSM = true;
xwayland.enable = true;
};
programs.sway = {
enable = true;
xwayland.enable = true;
wrapperFeatures = {
gtk = true;
base = true;
};
};
}

View File

@@ -1,21 +0,0 @@
{ pkgs, ... }:
{
services.printing = {
enable = true;
drivers = [ pkgs.brlaser ];
};
hardware.printers = {
ensurePrinters = [
{
name = "Brother_HL-L2370DW_series";
location = "Home";
deviceUri = "dnssd://Brother%20HL-L2370DW%20series._ipp._tcp.local/?uuid=e3248000-80ce-11db-8000-3c2af4f28c38";
model = "drv:///brlaser.drv/brl2370d.ppd";
ppdOptions = {
PageSize = "Letter";
};
}
];
ensureDefaultPrinter = "Brother_HL-L2370DW_series";
};
}

Some files were not shown because too many files have changed in this diff Show More